* Add code for task #71837.
This commit is contained in:
@@ -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";
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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
@@ -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 + '®ionID=' + 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 + '®ionID=' + 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 + '®ionID=' + 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 + '®ionID=' + 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);
|
||||
|
||||
});
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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] = '显示';
|
||||
|
||||
@@ -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')
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user