From 25626c1ec752d48137423600d09536c9c62afbca Mon Sep 17 00:00:00 2001 From: mayue Date: Thu, 13 Oct 2022 18:00:22 +0800 Subject: [PATCH] * Add code for task #71837. --- module/action/lang/zh-cn.php | 1 + module/kanban/config.php | 3 +- module/kanban/control.php | 50 +++++++++++++++++ module/kanban/js/view.js | 101 ++++++++++++++++++++++++++++++++++- module/kanban/lang/de.php | 2 + module/kanban/lang/en.php | 2 + module/kanban/lang/fr.php | 2 + module/kanban/lang/zh-cn.php | 2 + module/kanban/model.php | 4 +- 9 files changed, 163 insertions(+), 4 deletions(-) diff --git a/module/action/lang/zh-cn.php b/module/action/lang/zh-cn.php index 39f11e328c..c3132b5258 100755 --- a/module/action/lang/zh-cn.php +++ b/module/action/lang/zh-cn.php @@ -215,6 +215,7 @@ $lang->action->desc->importedproductplan = '$date, 由 $actor $lang->action->desc->importedrelease = '$date, 由 $actor 从产品发布 $extra 导入。' . "\n"; $lang->action->desc->importedexecution = '$date, 由 $actor 从项目执行 $extra 导入。' . "\n"; $lang->action->desc->importedbuild = '$date, 由 $actor 从项目版本 $extra 导入。' . "\n"; +$lang->action->desc->importedticket = '$date, 由 $actor 从反馈工单 $extra 导入。' . "\n"; $lang->action->desc->fromsonarqube = '$date, 由 $actor 从SonarQube问题转化而来。' . "\n"; $lang->action->desc->tolib = '$date, 由 $actor 导入。' . "\n"; $lang->action->desc->updatetolib = '$date, 由 $actor 从' . $lang->testcase->common . '更新。' . "\n"; diff --git a/module/kanban/config.php b/module/kanban/config.php index a7aa8de832..5428cee3c6 100644 --- a/module/kanban/config.php +++ b/module/kanban/config.php @@ -47,11 +47,12 @@ $config->kanban->editor->editcard = array('id' => 'desc', 'tools' => 'simpl $config->kanban->editor->viewcard = array('id' => 'comment,lastComment', 'tools' => 'simpleTools'); $config->kanban->editor->activatecard = array('id' => 'comment', 'tools' => 'simpleTools'); -$config->kanban->fromType = array('execution', 'productplan', 'release', 'build'); +$config->kanban->fromType = array('execution', 'productplan', 'release', 'build', 'ticket'); $config->kanban->executionField = array('name', 'status', 'end', 'PM', 'type', 'deleted'); $config->kanban->productplanField = array('title', 'status', 'begin', 'end', 'deleted'); $config->kanban->releaseField = array('name', 'status', 'date', 'deleted'); $config->kanban->buildField = array('name', 'date', 'builder', 'deleted'); +$config->kanban->ticketField = array('title', 'deleted'); $config->kanban->default = new stdclass(); $config->kanban->default->story = new stdclass(); diff --git a/module/kanban/control.php b/module/kanban/control.php index ceefd81560..fe4e38dd9c 100644 --- a/module/kanban/control.php +++ b/module/kanban/control.php @@ -1372,6 +1372,56 @@ class kanban extends control $this->display(); } + /** + * Import ticket. + * + * @param int $kanbanID + * @param int $regionID + * @param int $groupID + * @param int $columnID + * @param int $selectedProductID + * @param int $recTotal + * @param int $recPerPage + * @param int $pageID + * @access public + * @return void + */ + public function importTicket($kanbanID = 0, $regionID = 0, $groupID = 0, $columnID = 0, $selectedProductID = 0, $recTotal = 0, $recPerPage = 20, $pageID = 1) + { + if($_POST) + { + $importedIDList = $this->kanban->importObject($kanbanID, $regionID, $groupID, $columnID, 'ticket'); + if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError())); + + foreach($importedIDList as $cardID => $ticketID) + { + $this->loadModel('action')->create('kanbancard', $cardID, 'importedTicket', '', $ticketID); + } + + return print(js::locate($this->createLink('kanban', 'view', "kanbanID=$kanbanID"), 'parent.parent')); + } + + $this->loadModel('product'); + $this->loadModel('ticket'); + + /* Load pager. */ + $this->app->loadClass('pager', $static = true); + $pager = new pager($recTotal, $recPerPage, $pageID); + + $this->view->products = array($this->lang->kanban->allProducts) + $this->product->getPairs(); + $this->view->selectedProductID = $selectedProductID; + $this->view->lanePairs = $this->kanban->getLanePairsByGroup($groupID); + $this->view->tickets2Imported = $this->ticket->getTicketByProduct($selectedProductID, '', 'id_desc', $pager); + $this->view->pager = $pager; + $this->view->kanbanID = $kanbanID; + $this->view->regionID = $regionID; + $this->view->groupID = $groupID; + $this->view->columnID = $columnID; + + $this->display(); + } + + /** * Set a card's color. * diff --git a/module/kanban/js/view.js b/module/kanban/js/view.js index 14fbb1196e..9657bc6068 100644 --- a/module/kanban/js/view.js +++ b/module/kanban/js/view.js @@ -343,6 +343,10 @@ function renderKanbanItem(item, $item) { renderProductplanItem(item, $item); } + else if(item.fromType == 'ticket') + { + renderTicketItem(item, $item); + } else { if(!$title.length) @@ -746,6 +750,100 @@ function renderBuildItem(item, $item) } } +/** + * Render execution item. + * + * @param object item + * @param object $item + * @access public + * @return void + */ +function renderTicketItem(item, $item) +{ + /* Output header information. */ + var privs = item.actions; + if(privs.includes('sortCard')) $item.parent().addClass('sort'); + + var $header = $item.children('.header'); + if(!$header.length) $header = $( + [ + '
', + '
' + ].join('')).appendTo($item); + + var $titleBox = $header.children('.ticketTitle'); + if(!$titleBox.length) $titleBox = $( + [ + '
', + '
' + ].join('')).appendTo($header); + + /* Print execution name. */ + var $title = $titleBox.children('.title'); + var name = item.title ? item.title : item.name; + if(!$title.length) + { + var icon = 'file-text-o'; + var viewMethod = item.execType == 'kanban' ? 'kanban' : 'view'; + if(privs.includes('viewTicket') && item.deleted == '0') $title = $('' + name + '').appendTo($titleBox).attr('href', createLink('ticket', 'view', 'ticketID=' + item.fromID)); + if(!privs.includes('viewTicket') || item.deleted == '1') $title = $('
' + name + '
').appendTo($titleBox); + } + //if(!$title.children('i').length) + //{ + // $title.append('' + item.title); + //} + $title.attr('title', name); + + if(item.delay) + { + $delayed = $titleBox.children('.delayed'); + if(!$delayed.length) + { + $('' + executionLang.delayed + '').appendTo($titleBox); + } + } + + $item.data('card', item); + + var $info = $item.children('.execInfo'); + if(!$info.length) $info = $( + [ + '
', + '
' + ].join('')).appendTo($item); + + var $statusBox = $info.children('.execStatus'); + if(!$statusBox.length) + { + if(item.deleted == '0') + { + $statusBox = $('' + executionLang.statusList[item.objectStatus] + '').appendTo($info); + } + else + { + $statusBox = $('' + executionLang.deleted + '').appendTo($info); + } + } + + /* Display deadline of execution. */ + var $date = $info.children('.date'); + var end = $.zui.createDate(item.end); + var today = new Date(); + var labelType = end.toLocaleDateString() == today.toLocaleDateString() ? 'danger' : 'wait'; + if(!$date.length) $date = $('').appendTo($info); + + $date.text($.zui.formatDate(end, 'MM-dd') + ' ' + kanbancardLang.deadlineAB).attr('title', $.zui.formatDate(end, 'yyyy-MM-dd') + ' ' + kanbancardLang.deadlineAB).show(); + + /* Display avatars of PM. */ + var $user = $info.children('.user'); + var user = [item.PM]; + if(users[item.PM]) + { + if(!$user.length) $user = $('
').appendTo($info); + $user.html(renderUsersAvatar(user, item.id)).attr('title', users[item.PM]); + } +} + /** * Show error message * @param {string|object} message Message @@ -1498,7 +1596,8 @@ $(function() var importReleaseLink = kanban.object.indexOf('releases') != -1 ? "
  • " + kanbanLang.importRelease + '
  • ' : ''; var importExecutionLink = kanban.object.indexOf('executions') != -1 ? "
  • " + kanbanLang.importExecution + '
  • ' : ''; var importBuildLink = kanban.object.indexOf('builds') != -1 ? "
  • " + kanbanLang.importBuild + '
  • ' : ''; - var importSubmenu = ''; + var importTicketLink = kanban.object.indexOf('tickets') != -1 ? "
  • " + kanbanLang.importTicket + '
  • ' : ''; + var importSubmenu = ''; $('.import').parent().append(importSubmenu); }); diff --git a/module/kanban/lang/de.php b/module/kanban/lang/de.php index 55016fdf0b..b3b950624c 100644 --- a/module/kanban/lang/de.php +++ b/module/kanban/lang/de.php @@ -83,6 +83,7 @@ $lang->kanban->importPlan = 'Plan'; $lang->kanban->importRelease = 'Release'; $lang->kanban->importExecution = $lang->execution->common; $lang->kanban->importBuild = 'Build'; +$lang->kanban->importTicket = 'Ticket'; $lang->kanban->allKanban = 'All Kanban'; $lang->kanban->allProjects = 'All ' . ($this->config->systemMode == 'classic' ? $lang->executionCommon : 'Projects'); $lang->kanban->allProducts = 'All Products'; @@ -233,6 +234,7 @@ $lang->kanban->importObjectList['plans'] = 'Product Plan'; $lang->kanban->importObjectList['releases'] = 'Release'; $lang->kanban->importObjectList['builds'] = 'Build'; $lang->kanban->importObjectList['executions'] = 'Execution'; +$lang->kanban->importObjectList['tickets'] = 'Ticket'; $lang->kanban->importObjectList['cards'] = 'Other Kanban Cards'; $lang->kanban->showWIPList[1] = 'Show'; diff --git a/module/kanban/lang/en.php b/module/kanban/lang/en.php index de64542c0f..056c74d11d 100644 --- a/module/kanban/lang/en.php +++ b/module/kanban/lang/en.php @@ -83,6 +83,7 @@ $lang->kanban->importPlan = 'Plan'; $lang->kanban->importRelease = 'Release'; $lang->kanban->importExecution = $lang->execution->common; $lang->kanban->importBuild = 'Build'; +$lang->kanban->importTicket = 'Ticket'; $lang->kanban->allKanban = 'All Kanban'; $lang->kanban->allProjects = 'All ' . ($this->config->systemMode == 'classic' ? $lang->executionCommon : 'Projects'); $lang->kanban->allProducts = 'All Products'; @@ -233,6 +234,7 @@ $lang->kanban->importObjectList['plans'] = 'Product Plan'; $lang->kanban->importObjectList['releases'] = 'Release'; $lang->kanban->importObjectList['builds'] = 'Build'; $lang->kanban->importObjectList['executions'] = 'Execution'; +$lang->kanban->importObjectList['tickets'] = 'Ticket'; $lang->kanban->importObjectList['cards'] = 'Other Kanban Cards'; $lang->kanban->showWIPList[1] = 'Show'; diff --git a/module/kanban/lang/fr.php b/module/kanban/lang/fr.php index 03ac3373b4..eb15105790 100644 --- a/module/kanban/lang/fr.php +++ b/module/kanban/lang/fr.php @@ -83,6 +83,7 @@ $lang->kanban->importPlan = 'Plan'; $lang->kanban->importRelease = 'Release'; $lang->kanban->importExecution = $lang->execution->common; $lang->kanban->importBuild = 'Build'; +$lang->kanban->importTicket = 'Ticket'; $lang->kanban->allKanban = 'All Kanban'; $lang->kanban->allProjects = 'All ' . ($this->config->systemMode == 'classic' ? $lang->executionCommon : 'Projects'); $lang->kanban->allProducts = 'All Products'; @@ -233,6 +234,7 @@ $lang->kanban->importObjectList['plans'] = 'Product Plan'; $lang->kanban->importObjectList['releases'] = 'Release'; $lang->kanban->importObjectList['builds'] = 'Build'; $lang->kanban->importObjectList['executions'] = 'Execution'; +$lang->kanban->importObjectList['tickets'] = 'Ticket'; $lang->kanban->importObjectList['cards'] = 'Other Kanban Cards'; $lang->kanban->showWIPList[1] = 'Show'; diff --git a/module/kanban/lang/zh-cn.php b/module/kanban/lang/zh-cn.php index 89d62c0633..cc351c78ce 100644 --- a/module/kanban/lang/zh-cn.php +++ b/module/kanban/lang/zh-cn.php @@ -83,6 +83,7 @@ $lang->kanban->importPlan = '计划'; $lang->kanban->importRelease = '发布'; $lang->kanban->importExecution = $lang->execution->common; $lang->kanban->importBuild = '版本'; +$lang->kanban->importTicket = '工单'; $lang->kanban->allKanban = '所有看板'; $lang->kanban->allProjects = '所有' . ($this->config->systemMode == 'classic' ? $lang->executionCommon : '项目'); $lang->kanban->allProducts = '所有产品'; @@ -233,6 +234,7 @@ $lang->kanban->importObjectList['plans'] = '计划'; $lang->kanban->importObjectList['releases'] = '发布'; $lang->kanban->importObjectList['builds'] = '版本'; $lang->kanban->importObjectList['executions'] = $lang->execution->common; +$lang->kanban->importObjectList['tickets'] = '工单'; $lang->kanban->importObjectList['cards'] = '其他看板卡片'; $lang->kanban->showWIPList[1] = '显示'; diff --git a/module/kanban/model.php b/module/kanban/model.php index 511694c98a..8aa4d2cb76 100755 --- a/module/kanban/model.php +++ b/module/kanban/model.php @@ -1127,7 +1127,7 @@ class kanbanModel extends model ->andWhere('type')->eq('common') ->fetchAll(); - $actions = array('editCard', 'archiveCard', 'deleteCard', 'moveCard', 'setCardColor', 'viewCard', 'sortCard', 'viewExecution', 'viewPlan', 'viewRelease', 'viewBuild'); + $actions = array('editCard', 'archiveCard', 'deleteCard', 'moveCard', 'setCardColor', 'viewCard', 'sortCard', 'viewExecution', 'viewPlan', 'viewRelease', 'viewBuild', 'viewTicket'); $cardGroup = array(); foreach($cellList as $cell) { @@ -1146,7 +1146,7 @@ class kanbanModel extends model $card->actions = array(); foreach($actions as $action) { - if(in_array($action, array('viewExecution', 'viewPlan', 'viewRelease', 'viewBuild'))) + if(in_array($action, array('viewExecution', 'viewPlan', 'viewRelease', 'viewBuild', 'viewTicket'))) { if($card->fromType == 'execution') {