* Add code for task #71837.

This commit is contained in:
mayue
2022-10-13 18:00:22 +08:00
parent f9f49755c1
commit 25626c1ec7
9 changed files with 163 additions and 4 deletions
+1
View File
@@ -215,6 +215,7 @@ $lang->action->desc->importedproductplan = '$date, 由 <strong>$actor</strong>
$lang->action->desc->importedrelease = '$date, 由 <strong>$actor</strong> 从产品发布 <strong>$extra</strong> 导入。' . "\n";
$lang->action->desc->importedexecution = '$date, 由 <strong>$actor</strong> 从项目执行 <strong>$extra</strong> 导入。' . "\n";
$lang->action->desc->importedbuild = '$date, 由 <strong>$actor</strong> 从项目版本 <strong>$extra</strong> 导入。' . "\n";
$lang->action->desc->importedticket = '$date, 由 <strong>$actor</strong> 从反馈工单 <strong>$extra</strong> 导入。' . "\n";
$lang->action->desc->fromsonarqube = '$date, 由 <strong>$actor</strong> 从<strong>SonarQube问题</strong>转化而来。' . "\n";
$lang->action->desc->tolib = '$date, 由 <strong>$actor</strong> 导入。' . "\n";
$lang->action->desc->updatetolib = '$date, 由 <strong>$actor</strong> 从' . $lang->testcase->common . '更新。' . "\n";
+2 -1
View File
@@ -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();
+50
View File
@@ -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.
*
+100 -1
View File
@@ -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 = $(
[
'<div class="header">',
'</div>'
].join('')).appendTo($item);
var $titleBox = $header.children('.ticketTitle');
if(!$titleBox.length) $titleBox = $(
[
'<div class="ticketTitle">',
'</div>'
].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 = $('<a class="title"><i class="icon icon-' + icon + '"></i>' + name + '</a>').appendTo($titleBox).attr('href', createLink('ticket', 'view', 'ticketID=' + item.fromID));
if(!privs.includes('viewTicket') || item.deleted == '1') $title = $('<div class="title"><i class="icon icon-' + icon + '"></i>' + name + '</div>').appendTo($titleBox);
}
//if(!$title.children('i').length)
//{
// $title.append('<i class="icon icon-run"></i>' + item.title);
//}
$title.attr('title', name);
if(item.delay)
{
$delayed = $titleBox.children('.delayed');
if(!$delayed.length)
{
$('<span class="delayed label label-danger label-badge">' + executionLang.delayed + '</span>').appendTo($titleBox);
}
}
$item.data('card', item);
var $info = $item.children('.execInfo');
if(!$info.length) $info = $(
[
'<div class="execInfo">',
'</div>'
].join('')).appendTo($item);
var $statusBox = $info.children('.execStatus');
if(!$statusBox.length)
{
if(item.deleted == '0')
{
$statusBox = $('<span class="execStatus label label-' + item.objectStatus + '">' + executionLang.statusList[item.objectStatus] + '</span>').appendTo($info);
}
else
{
$statusBox = $('<span class="execStatus label label-deleted">' + executionLang.deleted + '</span>').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 = $('<span class="date label label-' + labelType + '"></span>').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 = $('<div class="user"></div>').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 ? "<li><a class='iframe' data-toggle='modal'' href='" + createLink('kanban', 'importRelease', 'kanbanID=' + kanban.id + '&regionID=' + regionID + '&groupID=' + groupID + '&columnID=' + columnID) + "'>" + kanbanLang.importRelease + '</a></li>' : '';
var importExecutionLink = kanban.object.indexOf('executions') != -1 ? "<li><a class='iframe' data-toggle='modal' href='" + createLink('kanban', 'importExecution', 'kanbanID=' + kanban.id + '&regionID=' + regionID + '&groupID=' + groupID + '&columnID=' + columnID) + "'>" + kanbanLang.importExecution + '</a></li>' : '';
var importBuildLink = kanban.object.indexOf('builds') != -1 ? "<li><a class='iframe' data-toggle='modal' href='" + createLink('kanban', 'importBuild', 'kanbanID=' + kanban.id + '&regionID=' + regionID + '&groupID=' + groupID + '&columnID=' + columnID) + "'>" + kanbanLang.importBuild + '</a></li>' : '';
var importSubmenu = '<ul class="dropdown-menu">' + importPlanLink + importReleaseLink + importExecutionLink + importBuildLink +'</ul>';
var importTicketLink = kanban.object.indexOf('tickets') != -1 ? "<li><a class='iframe' data-toggle='modal' href='" + createLink('kanban', 'importTicket', 'kanbanID=' + kanban.id + '&regionID=' + regionID + '&groupID=' + groupID + '&columnID=' + columnID) + "'>" + kanbanLang.importTicket + '</a></li>' : '';
var importSubmenu = '<ul class="dropdown-menu">' + importPlanLink + importReleaseLink + importExecutionLink + importBuildLink + importTicketLink + '</ul>';
$('.import').parent().append(importSubmenu);
});
+2
View File
@@ -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';
+2
View File
@@ -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';
+2
View File
@@ -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';
+2
View File
@@ -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] = '显示';
+2 -2
View File
@@ -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')
{