From dde34eb36f61e6dc93b7958b5a7dac778c5d9971 Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Thu, 20 Jan 2022 18:03:28 +0800 Subject: [PATCH 01/28] * Code for task#47995. --- module/group/lang/resource.php | 2 + module/kanban/control.php | 60 +++++++++++++++++++ module/kanban/js/importcard.js | 23 ++++++++ module/kanban/js/view.js | 2 +- module/kanban/lang/zh-cn.php | 5 ++ module/kanban/model.php | 50 ++++++++++++++++ module/kanban/view/importcard.html.php | 79 ++++++++++++++++++++++++++ 7 files changed, 220 insertions(+), 1 deletion(-) create mode 100644 module/kanban/js/importcard.js create mode 100644 module/kanban/view/importcard.html.php diff --git a/module/group/lang/resource.php b/module/group/lang/resource.php index 0a0706d26a..e24b627ec7 100644 --- a/module/group/lang/resource.php +++ b/module/group/lang/resource.php @@ -674,6 +674,7 @@ $lang->resource->kanban->viewArchivedColumn = 'viewArchivedColumn'; $lang->resource->kanban->viewArchivedCard = 'viewArchivedCard'; $lang->resource->kanban->restoreCard = 'restoreCard'; $lang->resource->kanban->setLaneHeight = 'setLaneHeight'; +$lang->resource->kanban->importCard = 'importCard'; $lang->kanban->methodOrder[5] = 'space'; $lang->kanban->methodOrder[10] = 'createSpace'; @@ -718,6 +719,7 @@ $lang->kanban->methodorder[195] = 'viewArchivedCard'; $lang->kanban->methodorder[200] = 'archiveColumn'; $lang->kanban->methodorder[205] = 'restoreCard'; $lang->kanban->methodorder[210] = 'setLaneHeight'; +$lang->kanban->methodorder[215] = 'importCard'; /* Execution. */ $lang->resource->execution = new stdclass(); diff --git a/module/kanban/control.php b/module/kanban/control.php index 0e2ce2cccd..5c09090039 100644 --- a/module/kanban/control.php +++ b/module/kanban/control.php @@ -777,6 +777,66 @@ class kanban extends control die(json_encode($kanbanGroup)); } + /** + * Import cards. + * + * @param int $kanbanID + * @param int $regionID + * @param int $groupID + * @param int $columnID + * @param int $recTotal + * @param int $recPerPage + * @param int $pageID + * @access public + * @return void + */ + public function importCard($kanbanID = 0, $regionID = 0, $groupID = 0, $columnID = 0, $selectedKanbanID = 0, $recTotal = 0, $recPerPage = 30, $pageID = 1) + { + if($_POST) + { + $this->kanban->importCard($kanbanID, $regionID, $groupID, $columnID); + if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError())); + + return print(js::locate($this->createLink('kanban', 'view', "kanbanID=$kanbanID"), 'parent.parent')); + } + + $cards2Imported = array(); + if($selectedKanbanID) + { + $cards2Imported = $this->kanban->getCardsByObject('kanban', $selectedKanbanID); + } + else + { + $allKanbanCards = $this->kanban->getCardsByObject(); + foreach($allKanbanCards as $card) + { + if($card->kanban != $kanbanID) $cards2Imported[$card->id] = $card; + } + } + + /* Pager. */ + $this->app->loadClass('pager', $static = true); + $recTotal = count($cards2Imported); + $pager = new pager($recTotal, $recPerPage, $pageID); + $cards2Imported = array_chunk($cards2Imported, $pager->recPerPage); + + $kanbanPairs = $this->kanban->getKanbanPairs(); + unset($kanbanPairs[$kanbanID]); + + $this->view->cards2Imported = empty($cards2Imported) ? $cards2Imported : $cards2Imported[$pageID - 1]; + $this->view->kanbanPairs = array(0 => $this->lang->kanban->all) + $kanbanPairs; + $this->view->lanePairs = $this->kanban->getLanePairsByGroup($groupID); + $this->view->users = $this->loadModel('user')->getPairs('noletter|nodeleted'); + $this->view->pager = $pager; + $this->view->selectedKanbanID = $selectedKanbanID; + $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/importcard.js b/module/kanban/js/importcard.js new file mode 100644 index 0000000000..e4acd67ed0 --- /dev/null +++ b/module/kanban/js/importcard.js @@ -0,0 +1,23 @@ +/** + * Reload card list. + * + * @param int $kanbanID + * @access public + * @return void + */ +function reloadCardList(targetID) +{ + location.href = createLink('kanban','importcard','kanbanID=' + kanbanID + '®ionID=' + regionID + '&groupID=' + groupID + '&columnID=' + columnID + '&targetKanbanID=' + targetID); +} + +/** + * Set target lane ID. + * + * @param int $targetLaneID + * @access public + * @return void + */ +function setTargetLane(targetLaneID) +{ + $('#targetLane').val(targetLaneID); +} diff --git a/module/kanban/js/view.js b/module/kanban/js/view.js index 246d4696c6..e247d766d8 100644 --- a/module/kanban/js/view.js +++ b/module/kanban/js/view.js @@ -145,7 +145,7 @@ function renderHeaderCol($column, column, $header, kanbanData) if(columnPrivs.includes('createCard') && column.parent != -1) { - var cardUrl = createLink('kanban', 'createCard', 'kanbanID=' + kanbanID + '®ionID=' + regionID + '&groupID=' + groupID + '&columnID=' + columnID); + var cardUrl = createLink('kanban', 'importCard', 'kanbanID=' + kanbanID + '®ionID=' + regionID + '&groupID=' + groupID + '&columnID=' + columnID); addItemBtn = ['', '', ''].join(''); } diff --git a/module/kanban/lang/zh-cn.php b/module/kanban/lang/zh-cn.php index 048e6a91fb..0d9575a8e1 100644 --- a/module/kanban/lang/zh-cn.php +++ b/module/kanban/lang/zh-cn.php @@ -58,6 +58,8 @@ $lang->kanban->restoreCard = '还原卡片'; $lang->kanban->restore = '还原'; $lang->kanban->child = '子'; $lang->kanban->showClosed = '显示已关闭'; +$lang->kanban->importCard = '转入卡片'; +$lang->kanban->all = '所有看板'; /* Fields. */ $lang->kanban->space = '所属空间'; @@ -87,6 +89,9 @@ $lang->kanban->accessDenied = '您无权访问该看板'; $lang->kanban->confirmDelete = '您确认删除吗?'; $lang->kanban->cardCountTip = '请输入卡片数量'; +$lang->kanban->selectedKanban = '请选择看板'; +$lang->kanban->selectedLane = '请选择泳道'; + $lang->kanban->aclGroup['open'] = '公开'; $lang->kanban->aclGroup['private'] = '私有'; $lang->kanban->aclGroup['extend'] = '继承空间'; diff --git a/module/kanban/model.php b/module/kanban/model.php index b24674dfb9..b0c428638d 100644 --- a/module/kanban/model.php +++ b/module/kanban/model.php @@ -468,6 +468,39 @@ class kanbanModel extends model return false; } + /** + * Import card. + * + * @param int $kanbanID + * @param int $regionID + * @param int $groupID + * @param int $columnID + * @access public + * @return bool + */ + public function importCard($kanbanID, $regionID, $groupID, $columnID) + { + $data = fixer::input('post')->get(); + $importIDList = $data->cards; + $targetLaneID = $data->targetLane; + + $updateData = new stdClass(); + $updateData->kanban = $kanbanID; + $updateData->region = $regionID; + $updateData->group = $groupID; + $this->dao->update(TABLE_KANBANCARD)->data($updateData)->where('id')->in($importIDList)->exec(); + + if(!dao::isError()) + { + $cards = implode(',', $importIDList); + $this->addKanbanCell($kanbanID, $targetLaneID, $columnID, 'common', $cards); + + return true; + } + + return false; + } + /** * Get kanban by id. * @@ -1388,6 +1421,23 @@ class kanbanModel extends model ->fetchPairs('id'); } + /** + * Get Kanban pairs. + * + * @access public + * @return void + */ + public function getKanbanPairs() + { + $kanbanIdList = $this->getCanViewObjects('kanban'); + + return $this->dao->select('id,name')->from(TABLE_KANBAN) + ->where('deleted')->eq(0) + ->beginIF(!$this->app->user->admin)->andWhere('id')->in($kanbanIdList)->fi() + ->orderBy('id_desc') + ->fetchPairs('id'); + } + /** * Get can view objects. * diff --git a/module/kanban/view/importcard.html.php b/module/kanban/view/importcard.html.php new file mode 100644 index 0000000000..5549f27880 --- /dev/null +++ b/module/kanban/view/importcard.html.php @@ -0,0 +1,79 @@ + + * @package kanban + * @version $Id: importcard.html.php 5090 2022-01-19 14:19:24Z xieqiyu@cnezsoft.com $ + * @link https://www.zentao.net + */ +?> + + + + + + +
+
+
+

kanban->importCard;?>

+
+
+
+

kanban->selectedKanban;?>

+
+
+
+

kanban->selectedLane;?>

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ idAB;?> +
kanban->name;?>priAB;?>kanbancard->name;?>kanbancard->assignedTo;?>kanbancard->end;?>
+
+ + +
+ id);?> +
kanban);?>pri?>' title='kanbancard->priList, $card->pri, $card->pri);?>'>kanbancard->priList, $card->pri, $card->pri);?>id", $card->name, '', "class='preview'", true, true);?>assignedTo);?>end;?>
+ + + +
+
+ From 2bfd25b61054394b543ab1d99d2255bdf0a9c7bb Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Fri, 21 Jan 2022 11:15:54 +0800 Subject: [PATCH 02/28] * Add function of removeKanbanCell. --- module/kanban/model.php | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/module/kanban/model.php b/module/kanban/model.php index b0c428638d..b09e9abdbc 100644 --- a/module/kanban/model.php +++ b/module/kanban/model.php @@ -492,6 +492,8 @@ class kanbanModel extends model if(!dao::isError()) { + $this->removeKanbanCell('common', $importIDList); + $cards = implode(',', $importIDList); $this->addKanbanCell($kanbanID, $targetLaneID, $columnID, 'common', $cards); @@ -1999,6 +2001,30 @@ class kanbanModel extends model } } + /** + * Remove kanban cell. + * + * @param int|array $removeCardID + * @access public + * @return void + */ + public function removeKanbanCell($type, $removeCardID = 0) + { + if(is_array($removeCardID)) + { + foreach($removeCardID as $cardID) + { + $this->dbh->query("UPDATE " . TABLE_KANBANCELL. " SET cards = REPLACE(cards, ',{$cardID},', ',') WHERE type = '$type'"); + } + } + else + { + $this->dbh->query("UPDATE " . TABLE_KANBANCELL. " SET cards = REPLACE(cards, ',{$removeCardID},', ',') WHERE type = '$type'"); + } + + $this->dao->update(TABLE_KANBANCELL)->set('cards')->eq('')->where('cards')->eq(',')->andWhere('type')->eq($type)->exec(); + } + /** * Create a default RD kanban. * From fdaf47943ee35a713a2b9c5bb07d2ccb193680b5 Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Fri, 21 Jan 2022 13:17:56 +0800 Subject: [PATCH 03/28] * Code for task#47995. --- module/kanban/control.php | 4 +++- module/kanban/lang/en.php | 5 +++++ module/kanban/lang/zh-cn.php | 2 +- module/kanban/model.php | 2 +- 4 files changed, 10 insertions(+), 3 deletions(-) diff --git a/module/kanban/control.php b/module/kanban/control.php index 5c09090039..b577c2c9ce 100644 --- a/module/kanban/control.php +++ b/module/kanban/control.php @@ -800,6 +800,7 @@ class kanban extends control return print(js::locate($this->createLink('kanban', 'view', "kanbanID=$kanbanID"), 'parent.parent')); } + /* Get cards to imported. */ $cards2Imported = array(); if($selectedKanbanID) { @@ -820,11 +821,12 @@ class kanban extends control $pager = new pager($recTotal, $recPerPage, $pageID); $cards2Imported = array_chunk($cards2Imported, $pager->recPerPage); + /* Find Kanban other than this kanban. */ $kanbanPairs = $this->kanban->getKanbanPairs(); unset($kanbanPairs[$kanbanID]); $this->view->cards2Imported = empty($cards2Imported) ? $cards2Imported : $cards2Imported[$pageID - 1]; - $this->view->kanbanPairs = array(0 => $this->lang->kanban->all) + $kanbanPairs; + $this->view->kanbanPairs = array($this->lang->kanban->all) + $kanbanPairs; $this->view->lanePairs = $this->kanban->getLanePairsByGroup($groupID); $this->view->users = $this->loadModel('user')->getPairs('noletter|nodeleted'); $this->view->pager = $pager; diff --git a/module/kanban/lang/en.php b/module/kanban/lang/en.php index 8570d1359f..eb9623b016 100644 --- a/module/kanban/lang/en.php +++ b/module/kanban/lang/en.php @@ -58,6 +58,8 @@ $lang->kanban->restoreCard = 'Restore Card'; $lang->kanban->restore = 'Restore'; $lang->kanban->child = 'Child'; $lang->kanban->showClosed = 'Closed'; +$lang->kanban->importCard = 'Import Card'; +$lang->kanban->all = 'All Kanban'; /* Fields. */ $lang->kanban->space = 'Space'; @@ -87,6 +89,9 @@ $lang->kanban->accessDenied = "You have no access to the kanban."; $lang->kanban->confirmDelete = 'Do you want to delete this?'; $lang->kanban->cardCountTip = 'Please enter the number of cards'; +$lang->kanban->selectedKanban = 'Please select Kanban'; +$lang->kanban->selectedLane = 'Target Lane'; + $lang->kanban->aclGroup['open'] = 'Open'; $lang->kanban->aclGroup['private'] = 'Private'; $lang->kanban->aclGroup['extend'] = 'Extend'; diff --git a/module/kanban/lang/zh-cn.php b/module/kanban/lang/zh-cn.php index 0d9575a8e1..38b8408190 100644 --- a/module/kanban/lang/zh-cn.php +++ b/module/kanban/lang/zh-cn.php @@ -90,7 +90,7 @@ $lang->kanban->confirmDelete = '您确认删除吗?'; $lang->kanban->cardCountTip = '请输入卡片数量'; $lang->kanban->selectedKanban = '请选择看板'; -$lang->kanban->selectedLane = '请选择泳道'; +$lang->kanban->selectedLane = '目标泳道'; $lang->kanban->aclGroup['open'] = '公开'; $lang->kanban->aclGroup['private'] = '私有'; diff --git a/module/kanban/model.php b/module/kanban/model.php index b09e9abdbc..ac712006fc 100644 --- a/module/kanban/model.php +++ b/module/kanban/model.php @@ -3008,7 +3008,7 @@ class kanbanModel extends model * @access public * @return array */ - public function getCardsByObject($objectType = '', $objectID = 0, $archived = 0, $deleted = '0') + public function getCardsByObject($objectType = '', $objectID = 0, $archived = '0', $deleted = '0') { return $this->dao->select('*')->from(TABLE_KANBANCARD) ->where(true) From 0ffb6f3f8d45e20cbed972b3438f192e3539d18a Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Fri, 21 Jan 2022 14:24:54 +0800 Subject: [PATCH 04/28] * Code for task#47995. --- module/action/lang/en.php | 2 ++ module/action/lang/zh-cn.php | 2 ++ module/kanban/control.php | 7 ++++++- module/kanban/js/view.js | 2 +- module/kanban/model.php | 2 +- module/kanban/view/importcard.html.php | 6 +++++- 6 files changed, 17 insertions(+), 4 deletions(-) diff --git a/module/action/lang/en.php b/module/action/lang/en.php index bde1c19b3d..3223822140 100755 --- a/module/action/lang/en.php +++ b/module/action/lang/en.php @@ -193,6 +193,7 @@ $lang->action->desc->syncexecution = '$date, starting the task sets the e $lang->action->desc->importfromgitlab = '$date, Issue associate created from gitlab by $actor.' . "\n"; $lang->action->desc->archived = '$date, archived by $actor.' . "\n"; $lang->action->desc->restore = '$date, restore by $actor.' . "\n"; +$lang->action->desc->imported = '$date, imported by $actor .' . "\n"; /* Used to describe the history of operations related to parent-child tasks. */ $lang->action->desc->createchildren = '$date, $actor created a child task $extra。' . "\n"; @@ -332,6 +333,7 @@ $lang->action->label->closedbychild = 'closed'; $lang->action->label->activatedbychild = 'activated'; $lang->action->label->createchild = 'activated'; $lang->action->label->executed = 'executed'; +$lang->action->label->imported = 'imported'; /* Dynamic information is grouped by object. */ $lang->action->dynamicAction = new stdclass; diff --git a/module/action/lang/zh-cn.php b/module/action/lang/zh-cn.php index 98679d3045..819b0b99a2 100755 --- a/module/action/lang/zh-cn.php +++ b/module/action/lang/zh-cn.php @@ -193,6 +193,7 @@ $lang->action->desc->syncexecution = '$date, 系统判断由于任务开 $lang->action->desc->importfromgitlab = '$date, 由 $actor 从Gitlab的Issue关联创建。' . "\n"; $lang->action->desc->archived = '$date, 由 $actor 归档。' . "\n"; $lang->action->desc->restore = '$date, 由 $actor 还原。' . "\n"; +$lang->action->desc->imported = '$date, 由 $actor 导入。' . "\n"; /* 用来描述和父子任务相关的操作历史记录。*/ $lang->action->desc->createchildren = '$date, 由 $actor 创建子任务 $extra。' . "\n"; @@ -332,6 +333,7 @@ $lang->action->label->closedbychild = '关闭了'; $lang->action->label->activatedbychild = '激活了'; $lang->action->label->createchild = '激活了'; $lang->action->label->executed = '执行了'; +$lang->action->label->imported = '导入了'; /* 动态信息按照对象分组 */ $lang->action->dynamicAction = new stdclass(); diff --git a/module/kanban/control.php b/module/kanban/control.php index b577c2c9ce..141eb657f3 100644 --- a/module/kanban/control.php +++ b/module/kanban/control.php @@ -794,9 +794,14 @@ class kanban extends control { if($_POST) { - $this->kanban->importCard($kanbanID, $regionID, $groupID, $columnID); + $importedIDList = $this->kanban->importCard($kanbanID, $regionID, $groupID, $columnID); if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError())); + foreach($importedIDList as $cardID) + { + $this->loadModel('action')->create('kanbancard', $cardID, 'imported'); + } + return print(js::locate($this->createLink('kanban', 'view', "kanbanID=$kanbanID"), 'parent.parent')); } diff --git a/module/kanban/js/view.js b/module/kanban/js/view.js index e247d766d8..246d4696c6 100644 --- a/module/kanban/js/view.js +++ b/module/kanban/js/view.js @@ -145,7 +145,7 @@ function renderHeaderCol($column, column, $header, kanbanData) if(columnPrivs.includes('createCard') && column.parent != -1) { - var cardUrl = createLink('kanban', 'importCard', 'kanbanID=' + kanbanID + '®ionID=' + regionID + '&groupID=' + groupID + '&columnID=' + columnID); + var cardUrl = createLink('kanban', 'createCard', 'kanbanID=' + kanbanID + '®ionID=' + regionID + '&groupID=' + groupID + '&columnID=' + columnID); addItemBtn = ['', '', ''].join(''); } diff --git a/module/kanban/model.php b/module/kanban/model.php index ac712006fc..50763fbb5f 100644 --- a/module/kanban/model.php +++ b/module/kanban/model.php @@ -497,7 +497,7 @@ class kanbanModel extends model $cards = implode(',', $importIDList); $this->addKanbanCell($kanbanID, $targetLaneID, $columnID, 'common', $cards); - return true; + return $importIDList; } return false; diff --git a/module/kanban/view/importcard.html.php b/module/kanban/view/importcard.html.php index 5549f27880..c2ab1d5198 100644 --- a/module/kanban/view/importcard.html.php +++ b/module/kanban/view/importcard.html.php @@ -59,7 +59,11 @@ kanban);?> pri?>' title='kanbancard->priList, $card->pri, $card->pri);?>'>kanbancard->priList, $card->pri, $card->pri);?> - id", $card->name, '', "class='preview'", true, true);?> + + id", $card->name, '', "class='iframe'", true, true);?> + + name;?> + assignedTo);?> end;?> From 9d6cd1f50d2a0e1b785506b7a1de285465aa3f61 Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Fri, 21 Jan 2022 14:27:37 +0800 Subject: [PATCH 05/28] * Modify return type. --- module/kanban/model.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/module/kanban/model.php b/module/kanban/model.php index 50763fbb5f..2b743f3869 100644 --- a/module/kanban/model.php +++ b/module/kanban/model.php @@ -476,7 +476,7 @@ class kanbanModel extends model * @param int $groupID * @param int $columnID * @access public - * @return bool + * @return bool|array */ public function importCard($kanbanID, $regionID, $groupID, $columnID) { @@ -523,7 +523,7 @@ class kanbanModel extends model * * @param int $kanbanID * @access public - * @return void + * @return array */ public function getKanbanData($kanbanID) { From 1f79e9e7dd40437dde8654edc30b16cb2e86380c Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Sat, 22 Jan 2022 22:24:49 +0800 Subject: [PATCH 06/28] * Code for task#47995. --- module/action/lang/en.php | 4 +-- module/action/lang/zh-cn.php | 4 +-- module/action/model.php | 5 ++++ module/kanban/control.php | 31 ++++++----------------- module/kanban/model.php | 49 +++++++++++++++++++++++++++--------- 5 files changed, 54 insertions(+), 39 deletions(-) diff --git a/module/action/lang/en.php b/module/action/lang/en.php index 3223822140..bfceb68ea2 100755 --- a/module/action/lang/en.php +++ b/module/action/lang/en.php @@ -193,7 +193,7 @@ $lang->action->desc->syncexecution = '$date, starting the task sets the e $lang->action->desc->importfromgitlab = '$date, Issue associate created from gitlab by $actor.' . "\n"; $lang->action->desc->archived = '$date, archived by $actor.' . "\n"; $lang->action->desc->restore = '$date, restore by $actor.' . "\n"; -$lang->action->desc->imported = '$date, imported by $actor .' . "\n"; +$lang->action->desc->importedcard = '$date, imported to $extra by $actor.' . "\n"; /* Used to describe the history of operations related to parent-child tasks. */ $lang->action->desc->createchildren = '$date, $actor created a child task $extra。' . "\n"; @@ -333,7 +333,7 @@ $lang->action->label->closedbychild = 'closed'; $lang->action->label->activatedbychild = 'activated'; $lang->action->label->createchild = 'activated'; $lang->action->label->executed = 'executed'; -$lang->action->label->imported = 'imported'; +$lang->action->label->importedcard = 'imported'; /* Dynamic information is grouped by object. */ $lang->action->dynamicAction = new stdclass; diff --git a/module/action/lang/zh-cn.php b/module/action/lang/zh-cn.php index 819b0b99a2..292ebca4b3 100755 --- a/module/action/lang/zh-cn.php +++ b/module/action/lang/zh-cn.php @@ -193,7 +193,7 @@ $lang->action->desc->syncexecution = '$date, 系统判断由于任务开 $lang->action->desc->importfromgitlab = '$date, 由 $actor 从Gitlab的Issue关联创建。' . "\n"; $lang->action->desc->archived = '$date, 由 $actor 归档。' . "\n"; $lang->action->desc->restore = '$date, 由 $actor 还原。' . "\n"; -$lang->action->desc->imported = '$date, 由 $actor 导入。' . "\n"; +$lang->action->desc->importedcard = '$date, 由 $actor 从看板 $extra 导入。' . "\n"; /* 用来描述和父子任务相关的操作历史记录。*/ $lang->action->desc->createchildren = '$date, 由 $actor 创建子任务 $extra。' . "\n"; @@ -333,7 +333,7 @@ $lang->action->label->closedbychild = '关闭了'; $lang->action->label->activatedbychild = '激活了'; $lang->action->label->createchild = '激活了'; $lang->action->label->executed = '执行了'; -$lang->action->label->imported = '导入了'; +$lang->action->label->importedcard = '导入了'; /* 动态信息按照对象分组 */ $lang->action->dynamicAction = new stdclass(); diff --git a/module/action/model.php b/module/action/model.php index 5aaabd6619..a03924531c 100755 --- a/module/action/model.php +++ b/module/action/model.php @@ -435,6 +435,11 @@ class actionModel extends model $title = $this->dao->select('title')->from(TABLE_STORY)->where('id')->eq($action->extra)->fetch('title'); if($title) $action->extra = common::hasPriv('story', 'view') ? html::a(helper::createLink('story', 'view', "storyID=$action->extra"), "#$action->extra " . $title) : "#$action->extra " . $title; } + elseif($actionName == 'importedcard') + { + $title = $this->dao->select('name')->from(TABLE_KANBAN)->where('id')->eq($action->extra)->fetch('name'); + if($title) $action->extra = common::hasPriv('kanban', 'view') ? html::a(helper::createLink('kanban', 'view', "kanbanID=$action->extra"), "#$action->extra " . $title) : "#$action->extra " . $title; + } elseif($actionName == 'createchildren') { $names = $this->dao->select('id,name')->from(TABLE_TASK)->where('id')->in($action->extra)->fetchPairs('id', 'name'); diff --git a/module/kanban/control.php b/module/kanban/control.php index 141eb657f3..6011c72983 100644 --- a/module/kanban/control.php +++ b/module/kanban/control.php @@ -792,6 +792,12 @@ class kanban extends control */ public function importCard($kanbanID = 0, $regionID = 0, $groupID = 0, $columnID = 0, $selectedKanbanID = 0, $recTotal = 0, $recPerPage = 30, $pageID = 1) { + /* Load pager. */ + $this->app->loadClass('pager', $static = true); + $pager = new pager($recTotal, $recPerPage, $pageID); + + $cards2Imported = $this->kanban->getImportedCards($selectedKanbanID, $kanbanID, $pager); + if($_POST) { $importedIDList = $this->kanban->importCard($kanbanID, $regionID, $groupID, $columnID); @@ -799,38 +805,17 @@ class kanban extends control foreach($importedIDList as $cardID) { - $this->loadModel('action')->create('kanbancard', $cardID, 'imported'); + $this->loadModel('action')->create('kanbancard', $cardID, 'importedcard', '', $cards2Imported[$cardID]->kanban); } return print(js::locate($this->createLink('kanban', 'view', "kanbanID=$kanbanID"), 'parent.parent')); } - /* Get cards to imported. */ - $cards2Imported = array(); - if($selectedKanbanID) - { - $cards2Imported = $this->kanban->getCardsByObject('kanban', $selectedKanbanID); - } - else - { - $allKanbanCards = $this->kanban->getCardsByObject(); - foreach($allKanbanCards as $card) - { - if($card->kanban != $kanbanID) $cards2Imported[$card->id] = $card; - } - } - - /* Pager. */ - $this->app->loadClass('pager', $static = true); - $recTotal = count($cards2Imported); - $pager = new pager($recTotal, $recPerPage, $pageID); - $cards2Imported = array_chunk($cards2Imported, $pager->recPerPage); - /* Find Kanban other than this kanban. */ $kanbanPairs = $this->kanban->getKanbanPairs(); unset($kanbanPairs[$kanbanID]); - $this->view->cards2Imported = empty($cards2Imported) ? $cards2Imported : $cards2Imported[$pageID - 1]; + $this->view->cards2Imported = $cards2Imported; $this->view->kanbanPairs = array($this->lang->kanban->all) + $kanbanPairs; $this->view->lanePairs = $this->kanban->getLanePairsByGroup($groupID); $this->view->users = $this->loadModel('user')->getPairs('noletter|nodeleted'); diff --git a/module/kanban/model.php b/module/kanban/model.php index 2b743f3869..d5f1714419 100644 --- a/module/kanban/model.php +++ b/module/kanban/model.php @@ -484,6 +484,8 @@ class kanbanModel extends model $importIDList = $data->cards; $targetLaneID = $data->targetLane; + $oldCardsKanban = $this->dao->select('id,kanban')->from(TABLE_KANBANCARD)->where('id')->in($importIDList)->fetchPairs(); + $updateData = new stdClass(); $updateData->kanban = $kanbanID; $updateData->region = $regionID; @@ -492,7 +494,7 @@ class kanbanModel extends model if(!dao::isError()) { - $this->removeKanbanCell('common', $importIDList); + $this->removeKanbanCell('common', $importIDList, $oldCardsKanban); $cards = implode(',', $importIDList); $this->addKanbanCell($kanbanID, $targetLaneID, $columnID, 'common', $cards); @@ -2004,25 +2006,27 @@ class kanbanModel extends model /** * Remove kanban cell. * + * @param string $type * @param int|array $removeCardID + * @param array $cardsKanban * @access public * @return void */ - public function removeKanbanCell($type, $removeCardID = 0) + public function removeKanbanCell($type, $removeCardID, $cardsKanban) { - if(is_array($removeCardID)) + $removeIDList = is_array($removeCardID) ? $removeCardID : array($removeCardID); + foreach($removeIDList as $cardID) { - foreach($removeCardID as $cardID) - { - $this->dbh->query("UPDATE " . TABLE_KANBANCELL. " SET cards = REPLACE(cards, ',{$cardID},', ',') WHERE type = '$type'"); - } - } - else - { - $this->dbh->query("UPDATE " . TABLE_KANBANCELL. " SET cards = REPLACE(cards, ',{$removeCardID},', ',') WHERE type = '$type'"); + if(empty($cardID)) continue; + + $this->dbh->query("UPDATE " . TABLE_KANBANCELL. " SET `cards` = REPLACE(cards, ',$cardID,', ',') WHERE `type` = '$type' AND `kanban` = {$cardsKanban[$cardID]}"); } - $this->dao->update(TABLE_KANBANCELL)->set('cards')->eq('')->where('cards')->eq(',')->andWhere('type')->eq($type)->exec(); + $this->dao->update(TABLE_KANBANCELL) + ->set('cards')->eq('') + ->where('cards')->eq(',') + ->andWhere('type')->eq($type) + ->exec(); } /** @@ -3019,6 +3023,27 @@ class kanbanModel extends model ->fetchAll('id'); } + /** + * Get imported cards. + * + * @param int $objectID + * @param int $excluded + * @param obj $pager + * @access public + * @return array + */ + public function getImportedCards($kanbanID = 0, $excluded = 0, $pager = null) + { + return $this->dao->select('*')->from(TABLE_KANBANCARD) + ->where('deleted')->eq(0) + ->andWhere('archived')->eq(0) + ->beginIF($kanbanID)->andWhere('kanban')->eq($kanbanID)->fi() + ->beginIF($excluded)->andWhere('kanban')->ne($excluded)->fi() + ->orderBy('order') + ->page($pager) + ->fetchAll('id'); + } + /** * Get Kanban cards menus by execution id. * From 71b287e1fad77efb6006c14120324c0cd7c51701 Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Sun, 23 Jan 2022 19:37:44 +0800 Subject: [PATCH 07/28] * Code for task#47987. --- module/action/lang/en.php | 2 + module/action/lang/zh-cn.php | 2 + module/kanban/control.php | 54 +++++++++++++++- module/kanban/js/importplan.js | 23 +++++++ module/kanban/lang/en.php | 9 ++- module/kanban/lang/zh-cn.php | 9 ++- module/kanban/model.php | 43 +++++++++++++ module/kanban/view/importcard.html.php | 2 +- module/kanban/view/importplan.html.php | 87 ++++++++++++++++++++++++++ 9 files changed, 223 insertions(+), 8 deletions(-) create mode 100644 module/kanban/js/importplan.js create mode 100644 module/kanban/view/importplan.html.php diff --git a/module/action/lang/en.php b/module/action/lang/en.php index bfceb68ea2..411c91370e 100755 --- a/module/action/lang/en.php +++ b/module/action/lang/en.php @@ -194,6 +194,7 @@ $lang->action->desc->importfromgitlab = '$date, Issue associate created from $lang->action->desc->archived = '$date, archived by $actor.' . "\n"; $lang->action->desc->restore = '$date, restore by $actor.' . "\n"; $lang->action->desc->importedcard = '$date, imported to $extra by $actor.' . "\n"; +$lang->action->desc->importedplan = '$date, imported to $extra by $actor.' . "\n"; /* Used to describe the history of operations related to parent-child tasks. */ $lang->action->desc->createchildren = '$date, $actor created a child task $extra。' . "\n"; @@ -334,6 +335,7 @@ $lang->action->label->activatedbychild = 'activated'; $lang->action->label->createchild = 'activated'; $lang->action->label->executed = 'executed'; $lang->action->label->importedcard = 'imported'; +$lang->action->label->importedplan = 'imported'; /* Dynamic information is grouped by object. */ $lang->action->dynamicAction = new stdclass; diff --git a/module/action/lang/zh-cn.php b/module/action/lang/zh-cn.php index 292ebca4b3..504ab3a2f9 100755 --- a/module/action/lang/zh-cn.php +++ b/module/action/lang/zh-cn.php @@ -194,6 +194,7 @@ $lang->action->desc->importfromgitlab = '$date, 由 $actor $lang->action->desc->archived = '$date, 由 $actor 归档。' . "\n"; $lang->action->desc->restore = '$date, 由 $actor 还原。' . "\n"; $lang->action->desc->importedcard = '$date, 由 $actor 从看板 $extra 导入。' . "\n"; +$lang->action->desc->importedplan = '$date, 由 $actor 从产品计划 $extra 导入。' . "\n"; /* 用来描述和父子任务相关的操作历史记录。*/ $lang->action->desc->createchildren = '$date, 由 $actor 创建子任务 $extra。' . "\n"; @@ -334,6 +335,7 @@ $lang->action->label->activatedbychild = '激活了'; $lang->action->label->createchild = '激活了'; $lang->action->label->executed = '执行了'; $lang->action->label->importedcard = '导入了'; +$lang->action->label->importedplan = '导入了'; /* 动态信息按照对象分组 */ $lang->action->dynamicAction = new stdclass(); diff --git a/module/kanban/control.php b/module/kanban/control.php index 6011c72983..fa9bd04fda 100644 --- a/module/kanban/control.php +++ b/module/kanban/control.php @@ -816,7 +816,7 @@ class kanban extends control unset($kanbanPairs[$kanbanID]); $this->view->cards2Imported = $cards2Imported; - $this->view->kanbanPairs = array($this->lang->kanban->all) + $kanbanPairs; + $this->view->kanbanPairs = array($this->lang->kanban->allKanban) + $kanbanPairs; $this->view->lanePairs = $this->kanban->getLanePairsByGroup($groupID); $this->view->users = $this->loadModel('user')->getPairs('noletter|nodeleted'); $this->view->pager = $pager; @@ -829,6 +829,58 @@ class kanban extends control $this->display(); } + /** + * Import plan. + * + * @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 importPlan($kanbanID = 0, $regionID = 0, $groupID = 0, $columnID = 0, $selectedProductID = 0, $recTotal = 0, $recPerPage = 30, $pageID = 1) + { + $this->loadModel('product'); + $this->loadModel('productplan'); + + /* Load pager. */ + $this->app->loadClass('pager', $static = true); + $pager = new pager($recTotal, $recPerPage, $pageID); + + $productPairs = $this->product->getPairs(); + $selectedProductID = empty($selectedProductID) ? key($productPairs) : $selectedProductID; + + if($_POST) + { + $importedIDList = $this->kanban->importObject($kanbanID, $regionID, $groupID, $columnID, 'productplan'); + if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError())); + + foreach($importedIDList as $cardID => $planID) + { + $this->loadModel('action')->create('kanbancard', $cardID, 'importedPlan', '', $planID); + } + + return print(js::locate($this->createLink('kanban', 'view', "kanbanID=$kanbanID"), 'parent.parent')); + } + + $this->view->products = $productPairs; + $this->view->selectedProductID = $selectedProductID; + $this->view->lanePairs = $this->kanban->getLanePairsByGroup($groupID); + $this->view->plans2Imported = $this->productplan->getList($selectedProductID, 0, 'all'); + $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/importplan.js b/module/kanban/js/importplan.js new file mode 100644 index 0000000000..51a7022b5e --- /dev/null +++ b/module/kanban/js/importplan.js @@ -0,0 +1,23 @@ +/** + * Reload card list. + * + * @param int $kanbanID + * @access public + * @return void + */ +function reloadPlanList(targetID) +{ + location.href = createLink('kanban','importPlan','kanbanID=' + kanbanID + '®ionID=' + regionID + '&groupID=' + groupID + '&columnID=' + columnID + '&targetProductID=' + targetID); +} + +/** + * Set target lane ID. + * + * @param int $targetLaneID + * @access public + * @return void + */ +function setTargetLane(targetLaneID) +{ + $('#targetLane').val(targetLaneID); +} diff --git a/module/kanban/lang/en.php b/module/kanban/lang/en.php index eb9623b016..0325a0dde3 100644 --- a/module/kanban/lang/en.php +++ b/module/kanban/lang/en.php @@ -59,7 +59,9 @@ $lang->kanban->restore = 'Restore'; $lang->kanban->child = 'Child'; $lang->kanban->showClosed = 'Closed'; $lang->kanban->importCard = 'Import Card'; -$lang->kanban->all = 'All Kanban'; +$lang->kanban->allKanban = 'All Kanban'; +$lang->kanban->importPlan = 'Import Plan'; +$lang->kanban->allProducts = 'All Products'; /* Fields. */ $lang->kanban->space = 'Space'; @@ -89,8 +91,9 @@ $lang->kanban->accessDenied = "You have no access to the kanban."; $lang->kanban->confirmDelete = 'Do you want to delete this?'; $lang->kanban->cardCountTip = 'Please enter the number of cards'; -$lang->kanban->selectedKanban = 'Please select Kanban'; -$lang->kanban->selectedLane = 'Target Lane'; +$lang->kanban->selectedKanban = 'Please select Kanban'; +$lang->kanban->selectedProduct = 'Please select Product'; +$lang->kanban->selectedLane = 'Target Lane'; $lang->kanban->aclGroup['open'] = 'Open'; $lang->kanban->aclGroup['private'] = 'Private'; diff --git a/module/kanban/lang/zh-cn.php b/module/kanban/lang/zh-cn.php index 38b8408190..9a6e9cdc79 100644 --- a/module/kanban/lang/zh-cn.php +++ b/module/kanban/lang/zh-cn.php @@ -59,7 +59,9 @@ $lang->kanban->restore = '还原'; $lang->kanban->child = '子'; $lang->kanban->showClosed = '显示已关闭'; $lang->kanban->importCard = '转入卡片'; -$lang->kanban->all = '所有看板'; +$lang->kanban->allKanban = '所有看板'; +$lang->kanban->importPlan = '导入产品计划'; +$lang->kanban->allProducts = '所有产品'; /* Fields. */ $lang->kanban->space = '所属空间'; @@ -89,8 +91,9 @@ $lang->kanban->accessDenied = '您无权访问该看板'; $lang->kanban->confirmDelete = '您确认删除吗?'; $lang->kanban->cardCountTip = '请输入卡片数量'; -$lang->kanban->selectedKanban = '请选择看板'; -$lang->kanban->selectedLane = '目标泳道'; +$lang->kanban->selectedKanban = '请选择看板'; +$lang->kanban->selectedProduct = '请选择产品'; +$lang->kanban->selectedLane = '目标泳道'; $lang->kanban->aclGroup['open'] = '公开'; $lang->kanban->aclGroup['private'] = '私有'; diff --git a/module/kanban/model.php b/module/kanban/model.php index d5f1714419..3aac516f4c 100644 --- a/module/kanban/model.php +++ b/module/kanban/model.php @@ -505,6 +505,49 @@ class kanbanModel extends model return false; } + /** + * Import object. + * + * @param int $kanbanID + * @param int $regionID + * @param int $groupID + * @param int $columnID + * @param string $objectType + * @access public + * @return array + */ + public function importObject($kanbanID, $regionID, $groupID, $columnID, $objectType) + { + $data = fixer::input('post')->get(); + $objectIDList = $data->{$objectType . 's'}; + $targetLaneID = $data->targetLane; + + $objectCards = array(); + foreach($objectIDList as $objectID) + { + $cardData = new stdClass(); + $cardData->kanban = $kanbanID; + $cardData->region = $regionID; + $cardData->group = $groupID; + $cardData->fromID = $objectID; + $cardData->fromType = $objectType; + $this->dao->insert(TABLE_KANBANCARD)->data($cardData)->exec(); + + $cardID = $this->dao->lastInsertID(); + $objectCards[$cardID] = $objectID; + } + + if(!dao::isError()) + { + $cards = implode(',', array_keys($objectCards)); + $this->addKanbanCell($kanbanID, $targetLaneID, $columnID, 'common', $cards); + + return $objectCards; + } + + return false; + } + /** * Get kanban by id. * diff --git a/module/kanban/view/importcard.html.php b/module/kanban/view/importcard.html.php index c2ab1d5198..b07c298ebf 100644 --- a/module/kanban/view/importcard.html.php +++ b/module/kanban/view/importcard.html.php @@ -74,7 +74,7 @@ diff --git a/module/kanban/view/importplan.html.php b/module/kanban/view/importplan.html.php new file mode 100644 index 0000000000..ac0cab4109 --- /dev/null +++ b/module/kanban/view/importplan.html.php @@ -0,0 +1,87 @@ + + * @package kanban + * @version $Id: importplan.html.php 5090 2022-01-19 14:19:24Z xieqiyu@cnezsoft.com $ + * @link https://www.zentao.net + */ +?> + + + + + + +
+
+
+

kanban->importPlan;?>

+
+
+
+

kanban->selectedProduct;?>

+
+
+
+

kanban->selectedLane;?>

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ idAB;?> +
productplan->title;?>productplan->begin;?>productplan->end;?>productplan->stories;?>productplan->bugs;?>productplan->hour;?>productplan->desc;?>
+
+ + +
+ id);?> +
id", $plan->title, '', "class='iframe'", true, true);?>title;?>begin;?>end;?>stories;?>bugs;?>hour;?>desc;?>
+ + + +
+
+ From 6e5e5f96f62c533c8c058356839fdf267657c41a Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Sun, 23 Jan 2022 20:34:31 +0800 Subject: [PATCH 08/28] * Code for task#47993. --- module/action/lang/en.php | 2 + module/action/lang/zh-cn.php | 2 + module/kanban/control.php | 85 ++++++++++++++++---- module/kanban/js/importexecution.js | 23 ++++++ module/kanban/js/view.js | 2 +- module/kanban/lang/en.php | 3 + module/kanban/lang/zh-cn.php | 3 + module/kanban/view/importexecution.html.php | 87 +++++++++++++++++++++ 8 files changed, 189 insertions(+), 18 deletions(-) create mode 100644 module/kanban/js/importexecution.js create mode 100644 module/kanban/view/importexecution.html.php diff --git a/module/action/lang/en.php b/module/action/lang/en.php index 411c91370e..315e8d7c9c 100755 --- a/module/action/lang/en.php +++ b/module/action/lang/en.php @@ -195,6 +195,7 @@ $lang->action->desc->archived = '$date, archived by $actoraction->desc->restore = '$date, restore by $actor.' . "\n"; $lang->action->desc->importedcard = '$date, imported to $extra by $actor.' . "\n"; $lang->action->desc->importedplan = '$date, imported to $extra by $actor.' . "\n"; +$lang->action->desc->importedexecution = '$date, imported to $extra by $actor.' . "\n"; /* Used to describe the history of operations related to parent-child tasks. */ $lang->action->desc->createchildren = '$date, $actor created a child task $extra。' . "\n"; @@ -336,6 +337,7 @@ $lang->action->label->createchild = 'activated'; $lang->action->label->executed = 'executed'; $lang->action->label->importedcard = 'imported'; $lang->action->label->importedplan = 'imported'; +$lang->action->label->importedexecution = 'imported'; /* Dynamic information is grouped by object. */ $lang->action->dynamicAction = new stdclass; diff --git a/module/action/lang/zh-cn.php b/module/action/lang/zh-cn.php index 504ab3a2f9..6fa46aed7a 100755 --- a/module/action/lang/zh-cn.php +++ b/module/action/lang/zh-cn.php @@ -195,6 +195,7 @@ $lang->action->desc->archived = '$date, 由 $actor $lang->action->desc->restore = '$date, 由 $actor 还原。' . "\n"; $lang->action->desc->importedcard = '$date, 由 $actor 从看板 $extra 导入。' . "\n"; $lang->action->desc->importedplan = '$date, 由 $actor 从产品计划 $extra 导入。' . "\n"; +$lang->action->desc->importedexecution = '$date, 由 $actor 从项目执行 $extra 导入。' . "\n"; /* 用来描述和父子任务相关的操作历史记录。*/ $lang->action->desc->createchildren = '$date, 由 $actor 创建子任务 $extra。' . "\n"; @@ -336,6 +337,7 @@ $lang->action->label->createchild = '激活了'; $lang->action->label->executed = '执行了'; $lang->action->label->importedcard = '导入了'; $lang->action->label->importedplan = '导入了'; +$lang->action->label->importedexecution = '导入了'; /* 动态信息按照对象分组 */ $lang->action->dynamicAction = new stdclass(); diff --git a/module/kanban/control.php b/module/kanban/control.php index fa9bd04fda..a03f95c46c 100644 --- a/module/kanban/control.php +++ b/module/kanban/control.php @@ -778,15 +778,16 @@ class kanban extends control } /** - * Import cards. + * Import card. * - * @param int $kanbanID - * @param int $regionID - * @param int $groupID - * @param int $columnID - * @param int $recTotal - * @param int $recPerPage - * @param int $pageID + * @param int $kanbanID + * @param int $regionID + * @param int $groupID + * @param int $columnID + * @param int $selectedKanbanID + * @param int $recTotal + * @param int $recPerPage + * @param int $pageID * @access public * @return void */ @@ -832,14 +833,14 @@ class kanban extends control /** * Import plan. * - * @param int $kanbanID - * @param int $regionID - * @param int $groupID - * @param int $columnID - * @param int $selectedProductID - * @param int $recTotal - * @param int $recPerPage - * @param int $pageID + * @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 */ @@ -871,7 +872,7 @@ class kanban extends control $this->view->products = $productPairs; $this->view->selectedProductID = $selectedProductID; $this->view->lanePairs = $this->kanban->getLanePairsByGroup($groupID); - $this->view->plans2Imported = $this->productplan->getList($selectedProductID, 0, 'all'); + $this->view->plans2Imported = $this->productplan->getList($selectedProductID, 0, 'all', $pager); $this->view->pager = $pager; $this->view->kanbanID = $kanbanID; $this->view->regionID = $regionID; @@ -881,6 +882,56 @@ class kanban extends control $this->display(); } + /** + * Import execution. + * + * @param int $kanbanID + * @param int $regionID + * @param int $groupID + * @param int $columnID + * @param int $selectedProjectID + * @param int $recTotal + * @param int $recPerPage + * @param int $pageID + * @access public + * @return void + */ + public function importExecution($kanbanID = 0, $regionID = 0, $groupID = 0, $columnID = 0, $selectedProjectID = 0, $recTotal = 0, $recPerPage = 30, $pageID = 1) + { + $this->loadModel('project'); + $this->loadModel('execution'); + + /* Load pager. */ + $this->app->loadClass('pager', $static = true); + $pager = new pager($recTotal, $recPerPage, $pageID); + + if($_POST) + { + $importedIDList = $this->kanban->importObject($kanbanID, $regionID, $groupID, $columnID, 'execution'); + if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError())); + + foreach($importedIDList as $cardID => $executionID) + { + $this->loadModel('action')->create('kanbancard', $cardID, 'importedExecution', '', $executionID); + } + + return print(js::locate($this->createLink('kanban', 'view', "kanbanID=$kanbanID"), 'parent.parent')); + } + + $this->view->projects = $this->project->getPairsByProgram(); + $this->view->selectedProjectID = $selectedProjectID; + $this->view->lanePairs = $this->kanban->getLanePairsByGroup($groupID); + $this->view->executions2Imported = $this->project->getStats($selectedProjectID, 'undone', 0, 0, 30, 'id_asc', $pager); + $this->view->users = $this->loadModel('user')->getPairs('noletter|nodeleted'); + $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/importexecution.js b/module/kanban/js/importexecution.js new file mode 100644 index 0000000000..ef1a68892c --- /dev/null +++ b/module/kanban/js/importexecution.js @@ -0,0 +1,23 @@ +/** + * Reload card list. + * + * @param int $kanbanID + * @access public + * @return void + */ +function reloadExecutionList(targetID) +{ + location.href = createLink('kanban', 'importExecution','kanbanID=' + kanbanID + '®ionID=' + regionID + '&groupID=' + groupID + '&columnID=' + columnID + '&targetProductID=' + targetID); +} + +/** + * Set target lane ID. + * + * @param int $targetLaneID + * @access public + * @return void + */ +function setTargetLane(targetLaneID) +{ + $('#targetLane').val(targetLaneID); +} diff --git a/module/kanban/js/view.js b/module/kanban/js/view.js index 246d4696c6..e672f3bfb4 100644 --- a/module/kanban/js/view.js +++ b/module/kanban/js/view.js @@ -145,7 +145,7 @@ function renderHeaderCol($column, column, $header, kanbanData) if(columnPrivs.includes('createCard') && column.parent != -1) { - var cardUrl = createLink('kanban', 'createCard', 'kanbanID=' + kanbanID + '®ionID=' + regionID + '&groupID=' + groupID + '&columnID=' + columnID); + var cardUrl = createLink('kanban', 'importExecution', 'kanbanID=' + kanbanID + '®ionID=' + regionID + '&groupID=' + groupID + '&columnID=' + columnID); addItemBtn = ['', '', ''].join(''); } diff --git a/module/kanban/lang/en.php b/module/kanban/lang/en.php index 0325a0dde3..6ba8be6423 100644 --- a/module/kanban/lang/en.php +++ b/module/kanban/lang/en.php @@ -62,6 +62,8 @@ $lang->kanban->importCard = 'Import Card'; $lang->kanban->allKanban = 'All Kanban'; $lang->kanban->importPlan = 'Import Plan'; $lang->kanban->allProducts = 'All Products'; +$lang->kanban->importExecution = 'Import Execution'; +$lang->kanban->allProjects = 'All Projects'; /* Fields. */ $lang->kanban->space = 'Space'; @@ -93,6 +95,7 @@ $lang->kanban->cardCountTip = 'Please enter the number of cards'; $lang->kanban->selectedKanban = 'Please select Kanban'; $lang->kanban->selectedProduct = 'Please select Product'; +$lang->kanban->selectedProject = 'Please select Project'; $lang->kanban->selectedLane = 'Target Lane'; $lang->kanban->aclGroup['open'] = 'Open'; diff --git a/module/kanban/lang/zh-cn.php b/module/kanban/lang/zh-cn.php index 9a6e9cdc79..1ec9ea6990 100644 --- a/module/kanban/lang/zh-cn.php +++ b/module/kanban/lang/zh-cn.php @@ -62,6 +62,8 @@ $lang->kanban->importCard = '转入卡片'; $lang->kanban->allKanban = '所有看板'; $lang->kanban->importPlan = '导入产品计划'; $lang->kanban->allProducts = '所有产品'; +$lang->kanban->importExecution = '导入项目执行'; +$lang->kanban->allProjects = '所有项目'; /* Fields. */ $lang->kanban->space = '所属空间'; @@ -93,6 +95,7 @@ $lang->kanban->cardCountTip = '请输入卡片数量'; $lang->kanban->selectedKanban = '请选择看板'; $lang->kanban->selectedProduct = '请选择产品'; +$lang->kanban->selectedProject = '请选择项目'; $lang->kanban->selectedLane = '目标泳道'; $lang->kanban->aclGroup['open'] = '公开'; diff --git a/module/kanban/view/importexecution.html.php b/module/kanban/view/importexecution.html.php new file mode 100644 index 0000000000..450ffb8fb4 --- /dev/null +++ b/module/kanban/view/importexecution.html.php @@ -0,0 +1,87 @@ + + * @package kanban + * @version $Id: importexecution.html.php 5090 2022-01-19 14:19:24Z xieqiyu@cnezsoft.com $ + * @link https://www.zentao.net + */ +?> + + + + + + +
+
+
+

kanban->importExecution;?>

+
+
+
+

kanban->selectedProject;?>

+
+
+
+

kanban->selectedLane;?>

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ idAB;?> +
execution->name;?>execution->status;?>execution->owner;?>execution->end;?>execution->totalEstimate;?>execution->totalConsumed;?>execution->totalLeft;?>
+
+ + +
+ id);?> +
id", $execution->name, '', "class='iframe'", true, true);?>name;?>execution->statusList, $execution->status);?>PM);?>end;?>hours->totalEstimate;?>hours->totalConsumed;?>hours->totalLeft;?>
+ + + +
+
+ From c582ffed5ba1c8b55f07b2609dbfdc9fdd2e1ce8 Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Mon, 24 Jan 2022 09:20:26 +0800 Subject: [PATCH 09/28] * Code for task#47989. --- module/action/lang/en.php | 2 + module/action/lang/zh-cn.php | 2 + module/kanban/control.php | 52 +++++++++++++++ module/kanban/js/importrelease.js | 23 +++++++ module/kanban/lang/en.php | 3 +- module/kanban/lang/zh-cn.php | 3 +- module/kanban/view/importrelease.html.php | 81 +++++++++++++++++++++++ module/release/model.php | 16 +++-- 8 files changed, 173 insertions(+), 9 deletions(-) create mode 100644 module/kanban/js/importrelease.js create mode 100644 module/kanban/view/importrelease.html.php diff --git a/module/action/lang/en.php b/module/action/lang/en.php index 315e8d7c9c..c8b89a4bdc 100755 --- a/module/action/lang/en.php +++ b/module/action/lang/en.php @@ -195,6 +195,7 @@ $lang->action->desc->archived = '$date, archived by $actoraction->desc->restore = '$date, restore by $actor.' . "\n"; $lang->action->desc->importedcard = '$date, imported to $extra by $actor.' . "\n"; $lang->action->desc->importedplan = '$date, imported to $extra by $actor.' . "\n"; +$lang->action->desc->importedrelease = '$date, imported to $extra by $actor.' . "\n"; $lang->action->desc->importedexecution = '$date, imported to $extra by $actor.' . "\n"; /* Used to describe the history of operations related to parent-child tasks. */ @@ -337,6 +338,7 @@ $lang->action->label->createchild = 'activated'; $lang->action->label->executed = 'executed'; $lang->action->label->importedcard = 'imported'; $lang->action->label->importedplan = 'imported'; +$lang->action->label->importedrelease = 'imported'; $lang->action->label->importedexecution = 'imported'; /* Dynamic information is grouped by object. */ diff --git a/module/action/lang/zh-cn.php b/module/action/lang/zh-cn.php index 6fa46aed7a..885b23efe8 100755 --- a/module/action/lang/zh-cn.php +++ b/module/action/lang/zh-cn.php @@ -195,6 +195,7 @@ $lang->action->desc->archived = '$date, 由 $actor $lang->action->desc->restore = '$date, 由 $actor 还原。' . "\n"; $lang->action->desc->importedcard = '$date, 由 $actor 从看板 $extra 导入。' . "\n"; $lang->action->desc->importedplan = '$date, 由 $actor 从产品计划 $extra 导入。' . "\n"; +$lang->action->desc->importedrelease = '$date, 由 $actor 从产品发布 $extra 导入。' . "\n"; $lang->action->desc->importedexecution = '$date, 由 $actor 从项目执行 $extra 导入。' . "\n"; /* 用来描述和父子任务相关的操作历史记录。*/ @@ -337,6 +338,7 @@ $lang->action->label->createchild = '激活了'; $lang->action->label->executed = '执行了'; $lang->action->label->importedcard = '导入了'; $lang->action->label->importedplan = '导入了'; +$lang->action->label->importedrelease = '导入了'; $lang->action->label->importedexecution = '导入了'; /* 动态信息按照对象分组 */ diff --git a/module/kanban/control.php b/module/kanban/control.php index a03f95c46c..1d8d1e7015 100644 --- a/module/kanban/control.php +++ b/module/kanban/control.php @@ -882,6 +882,58 @@ class kanban extends control $this->display(); } + /** + * Import release. + * + * @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 importRelease($kanbanID = 0, $regionID = 0, $groupID = 0, $columnID = 0, $selectedProductID = 0, $recTotal = 0, $recPerPage = 30, $pageID = 1) + { + $this->loadModel('product'); + $this->loadModel('release'); + + /* Load pager. */ + $this->app->loadClass('pager', $static = true); + $pager = new pager($recTotal, $recPerPage, $pageID); + + $productPairs = $this->product->getPairs(); + $selectedProductID = empty($selectedProductID) ? key($productPairs) : $selectedProductID; + + if($_POST) + { + $importedIDList = $this->kanban->importObject($kanbanID, $regionID, $groupID, $columnID, 'release'); + if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError())); + + foreach($importedIDList as $cardID => $releaseID) + { + $this->loadModel('action')->create('kanbancard', $cardID, 'importedRelease', '', $releaseID); + } + + return print(js::locate($this->createLink('kanban', 'view', "kanbanID=$kanbanID"), 'parent.parent')); + } + + $this->view->products = $productPairs; + $this->view->selectedProductID = $selectedProductID; + $this->view->lanePairs = $this->kanban->getLanePairsByGroup($groupID); + $this->view->releases2Imported = $this->release->getList($selectedProductID, 'all', 'all', 't1.date_desc', $pager); + $this->view->pager = $pager; + $this->view->kanbanID = $kanbanID; + $this->view->regionID = $regionID; + $this->view->groupID = $groupID; + $this->view->columnID = $columnID; + + $this->display(); + } + /** * Import execution. * diff --git a/module/kanban/js/importrelease.js b/module/kanban/js/importrelease.js new file mode 100644 index 0000000000..c9341c4c02 --- /dev/null +++ b/module/kanban/js/importrelease.js @@ -0,0 +1,23 @@ +/** + * Reload card list. + * + * @param int $kanbanID + * @access public + * @return void + */ +function reloadReleaseList(targetID) +{ + location.href = createLink('kanban','importRelease','kanbanID=' + kanbanID + '®ionID=' + regionID + '&groupID=' + groupID + '&columnID=' + columnID + '&targetProductID=' + targetID); +} + +/** + * Set target lane ID. + * + * @param int $targetLaneID + * @access public + * @return void + */ +function setTargetLane(targetLaneID) +{ + $('#targetLane').val(targetLaneID); +} diff --git a/module/kanban/lang/en.php b/module/kanban/lang/en.php index 6ba8be6423..170f5528b1 100644 --- a/module/kanban/lang/en.php +++ b/module/kanban/lang/en.php @@ -61,9 +61,10 @@ $lang->kanban->showClosed = 'Closed'; $lang->kanban->importCard = 'Import Card'; $lang->kanban->allKanban = 'All Kanban'; $lang->kanban->importPlan = 'Import Plan'; -$lang->kanban->allProducts = 'All Products'; $lang->kanban->importExecution = 'Import Execution'; +$lang->kanban->importRelease = 'Import Release'; $lang->kanban->allProjects = 'All Projects'; +$lang->kanban->allProducts = 'All Products'; /* Fields. */ $lang->kanban->space = 'Space'; diff --git a/module/kanban/lang/zh-cn.php b/module/kanban/lang/zh-cn.php index 1ec9ea6990..3bc546c309 100644 --- a/module/kanban/lang/zh-cn.php +++ b/module/kanban/lang/zh-cn.php @@ -61,9 +61,10 @@ $lang->kanban->showClosed = '显示已关闭'; $lang->kanban->importCard = '转入卡片'; $lang->kanban->allKanban = '所有看板'; $lang->kanban->importPlan = '导入产品计划'; -$lang->kanban->allProducts = '所有产品'; $lang->kanban->importExecution = '导入项目执行'; +$lang->kanban->importRelease = '导入产品发布'; $lang->kanban->allProjects = '所有项目'; +$lang->kanban->allProducts = '所有产品'; /* Fields. */ $lang->kanban->space = '所属空间'; diff --git a/module/kanban/view/importrelease.html.php b/module/kanban/view/importrelease.html.php new file mode 100644 index 0000000000..da77f58e3c --- /dev/null +++ b/module/kanban/view/importrelease.html.php @@ -0,0 +1,81 @@ + + * @package kanban + * @version $Id: importrelease.html.php 5090 2022-01-19 14:19:24Z xieqiyu@cnezsoft.com $ + * @link https://www.zentao.net + */ +?> + + + + + + +
+
+
+

kanban->importRelease;?>

+
+
+
+

kanban->selectedProduct;?>

+
+
+
+

kanban->selectedLane;?>

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ idAB;?> +
release->name;?>release->project;?>release->build;?>release->date;?>
+
+ + +
+ id);?> +
id", $release->name, '', "class='iframe'", true, true);?>name;?>project;?>build;?>date;?>
+ + + +
+
+ diff --git a/module/release/model.php b/module/release/model.php index 95870538ea..110c43c63a 100644 --- a/module/release/model.php +++ b/module/release/model.php @@ -47,10 +47,11 @@ class releaseModel extends model * @param int $branch * @param string $type * @param string $orderBy + * @param object $pager * @access public * @return array */ - public function getList($productID, $branch = 'all', $type = 'all', $orderBy = 't1.date_desc') + public function getList($productID, $branch = 'all', $type = 'all', $orderBy = 't1.date_desc', $pager = null) { return $this->dao->select('t1.*, t2.name as productName, t3.id as buildID, t3.name as buildName, t3.project, t4.name as projectName') ->from(TABLE_RELEASE)->alias('t1') @@ -62,6 +63,7 @@ class releaseModel extends model ->beginIF($type != 'all')->andWhere('t1.status')->eq($type)->fi() ->andWhere('t1.deleted')->eq(0) ->orderBy($orderBy) + ->page($pager) ->fetchAll(); } @@ -480,13 +482,13 @@ class releaseModel extends model } /** - * Judge btn is clickable or not. - * - * @param int $release - * @param string $action + * Judge btn is clickable or not. + * + * @param int $release + * @param string $action * @static * @access public - * @return bool + * @return bool */ public static function isClickable($release, $action) { @@ -498,7 +500,7 @@ class releaseModel extends model /** * Send mail to release related users. - * + * * @param int $releaseID * @access public * @return void From 895d34577568c04c99068a03f74ee94e31676ae5 Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Mon, 24 Jan 2022 09:59:49 +0800 Subject: [PATCH 10/28] * Code for task#47991. --- module/action/lang/en.php | 2 + module/action/lang/zh-cn.php | 2 + module/build/model.php | 6 +- module/kanban/control.php | 53 +++++++++++++++ module/kanban/js/importbuild.js | 23 +++++++ module/kanban/js/view.js | 2 +- module/kanban/lang/en.php | 5 +- module/kanban/lang/zh-cn.php | 5 +- module/kanban/view/importbuild.html.php | 83 +++++++++++++++++++++++ module/kanban/view/importrelease.html.php | 6 +- 10 files changed, 177 insertions(+), 10 deletions(-) create mode 100644 module/kanban/js/importbuild.js create mode 100644 module/kanban/view/importbuild.html.php diff --git a/module/action/lang/en.php b/module/action/lang/en.php index c8b89a4bdc..2f29a16128 100755 --- a/module/action/lang/en.php +++ b/module/action/lang/en.php @@ -197,6 +197,7 @@ $lang->action->desc->importedcard = '$date, imported to $extraaction->desc->importedplan = '$date, imported to $extra by $actor.' . "\n"; $lang->action->desc->importedrelease = '$date, imported to $extra by $actor.' . "\n"; $lang->action->desc->importedexecution = '$date, imported to $extra by $actor.' . "\n"; +$lang->action->desc->importedbuild = '$date, imported to $extra by $actor.' . "\n"; /* Used to describe the history of operations related to parent-child tasks. */ $lang->action->desc->createchildren = '$date, $actor created a child task $extra。' . "\n"; @@ -340,6 +341,7 @@ $lang->action->label->importedcard = 'imported'; $lang->action->label->importedplan = 'imported'; $lang->action->label->importedrelease = 'imported'; $lang->action->label->importedexecution = 'imported'; +$lang->action->label->importedbuild = 'imported'; /* Dynamic information is grouped by object. */ $lang->action->dynamicAction = new stdclass; diff --git a/module/action/lang/zh-cn.php b/module/action/lang/zh-cn.php index 885b23efe8..81b9633088 100755 --- a/module/action/lang/zh-cn.php +++ b/module/action/lang/zh-cn.php @@ -197,6 +197,7 @@ $lang->action->desc->importedcard = '$date, 由 $actor $lang->action->desc->importedplan = '$date, 由 $actor 从产品计划 $extra 导入。' . "\n"; $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->createchildren = '$date, 由 $actor 创建子任务 $extra。' . "\n"; @@ -340,6 +341,7 @@ $lang->action->label->importedcard = '导入了'; $lang->action->label->importedplan = '导入了'; $lang->action->label->importedrelease = '导入了'; $lang->action->label->importedexecution = '导入了'; +$lang->action->label->importedbuild = '导入了'; /* 动态信息按照对象分组 */ $lang->action->dynamicAction = new stdclass(); diff --git a/module/build/model.php b/module/build/model.php index c6e9424310..525a6772dc 100644 --- a/module/build/model.php +++ b/module/build/model.php @@ -56,10 +56,11 @@ class buildModel extends model * @param string $type * @param int $param * @param string $orderBy + * @param object $pager * @access public * @return array */ - public function getProjectBuilds($projectID = 0, $type = 'all', $param = 0, $orderBy = 't1.date_desc,t1.id_desc') + public function getProjectBuilds($projectID = 0, $type = 'all', $param = 0, $orderBy = 't1.date_desc,t1.id_desc', $pager = null) { return $this->dao->select('t1.*, t2.name as executionName, t2.id as executionID, t3.name as productName, t4.name as branchName') ->from(TABLE_BUILD)->alias('t1') @@ -72,6 +73,7 @@ class buildModel extends model ->beginIF($type == 'product' and $param)->andWhere('t1.product')->eq($param)->fi() ->beginIF($type == 'bysearch')->andWhere($param)->fi() ->orderBy($orderBy) + ->page($pager) ->fetchAll('id'); } @@ -243,7 +245,7 @@ class buildModel extends model $branchName = $allBuilds[$buildID]->branchName ? $allBuilds[$buildID]->branchName : $this->lang->branch->main; $builds[$buildID] = (strpos($params, 'withbranch') !== false ? $branchName . '/' : '') . $releaseName; } - } + } return $sysBuilds + $builds + $selectedBuilds; } diff --git a/module/kanban/control.php b/module/kanban/control.php index 1d8d1e7015..7e639f9cc8 100644 --- a/module/kanban/control.php +++ b/module/kanban/control.php @@ -934,6 +934,59 @@ class kanban extends control $this->display(); } + /** + * Import build. + * + * @param int $kanbanID + * @param int $regionID + * @param int $groupID + * @param int $columnID + * @param int $selectedProjectID + * @param int $recTotal + * @param int $recPerPage + * @param int $pageID + * @access public + * @return void + */ + public function importBuild($kanbanID = 0, $regionID = 0, $groupID = 0, $columnID = 0, $selectedProjectID = 0, $recTotal = 0, $recPerPage = 30, $pageID = 1) + { + if($_POST) + { + $importedIDList = $this->kanban->importObject($kanbanID, $regionID, $groupID, $columnID, 'build'); + if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError())); + + foreach($importedIDList as $cardID => $buildID) + { + $this->loadModel('action')->create('kanbancard', $cardID, 'importedBuild', '', $buildID); + } + + return print(js::locate($this->createLink('kanban', 'view', "kanbanID=$kanbanID"), 'parent.parent')); + } + + $this->loadModel('project'); + $this->loadModel('build'); + + /* Load pager. */ + $this->app->loadClass('pager', $static = true); + $pager = new pager($recTotal, $recPerPage, $pageID); + + $projectPairs = $this->project->getPairsByProgram(); + $selectedProjectID = empty($selectedProjectID) ? key($projectPairs) : $selectedProjectID; + + $this->view->projects = $projectPairs; + $this->view->selectedProjectID = $selectedProjectID; + $this->view->lanePairs = $this->kanban->getLanePairsByGroup($groupID); + $this->view->builds2Imported = $this->build->getProjectBuilds($selectedProjectID, 'all', 0, 't1.date_desc,t1.id_desc', $pager);; + $this->view->users = $this->loadModel('user')->getPairs('noletter|nodeleted'); + $this->view->pager = $pager; + $this->view->kanbanID = $kanbanID; + $this->view->regionID = $regionID; + $this->view->groupID = $groupID; + $this->view->columnID = $columnID; + + $this->display(); + } + /** * Import execution. * diff --git a/module/kanban/js/importbuild.js b/module/kanban/js/importbuild.js new file mode 100644 index 0000000000..d3ba2f1356 --- /dev/null +++ b/module/kanban/js/importbuild.js @@ -0,0 +1,23 @@ +/** + * Reload card list. + * + * @param int $kanbanID + * @access public + * @return void + */ +function reloadBuildList(targetID) +{ + location.href = createLink('kanban', 'importBuild','kanbanID=' + kanbanID + '®ionID=' + regionID + '&groupID=' + groupID + '&columnID=' + columnID + '&targetProductID=' + targetID); +} + +/** + * Set target lane ID. + * + * @param int $targetLaneID + * @access public + * @return void + */ +function setTargetLane(targetLaneID) +{ + $('#targetLane').val(targetLaneID); +} diff --git a/module/kanban/js/view.js b/module/kanban/js/view.js index e672f3bfb4..c94a4041b8 100644 --- a/module/kanban/js/view.js +++ b/module/kanban/js/view.js @@ -145,7 +145,7 @@ function renderHeaderCol($column, column, $header, kanbanData) if(columnPrivs.includes('createCard') && column.parent != -1) { - var cardUrl = createLink('kanban', 'importExecution', 'kanbanID=' + kanbanID + '®ionID=' + regionID + '&groupID=' + groupID + '&columnID=' + columnID); + var cardUrl = createLink('kanban', 'importBuild', 'kanbanID=' + kanbanID + '®ionID=' + regionID + '&groupID=' + groupID + '&columnID=' + columnID); addItemBtn = ['', '', ''].join(''); } diff --git a/module/kanban/lang/en.php b/module/kanban/lang/en.php index 170f5528b1..d3760d26de 100644 --- a/module/kanban/lang/en.php +++ b/module/kanban/lang/en.php @@ -59,10 +59,11 @@ $lang->kanban->restore = 'Restore'; $lang->kanban->child = 'Child'; $lang->kanban->showClosed = 'Closed'; $lang->kanban->importCard = 'Import Card'; -$lang->kanban->allKanban = 'All Kanban'; $lang->kanban->importPlan = 'Import Plan'; -$lang->kanban->importExecution = 'Import Execution'; $lang->kanban->importRelease = 'Import Release'; +$lang->kanban->importExecution = 'Import Execution'; +$lang->kanban->importBuild = 'Import Build'; +$lang->kanban->allKanban = 'All Kanban'; $lang->kanban->allProjects = 'All Projects'; $lang->kanban->allProducts = 'All Products'; diff --git a/module/kanban/lang/zh-cn.php b/module/kanban/lang/zh-cn.php index 3bc546c309..87b8155d84 100644 --- a/module/kanban/lang/zh-cn.php +++ b/module/kanban/lang/zh-cn.php @@ -59,10 +59,11 @@ $lang->kanban->restore = '还原'; $lang->kanban->child = '子'; $lang->kanban->showClosed = '显示已关闭'; $lang->kanban->importCard = '转入卡片'; -$lang->kanban->allKanban = '所有看板'; $lang->kanban->importPlan = '导入产品计划'; -$lang->kanban->importExecution = '导入项目执行'; $lang->kanban->importRelease = '导入产品发布'; +$lang->kanban->importExecution = '导入项目执行'; +$lang->kanban->importBuild = '导入项目版本'; +$lang->kanban->allKanban = '所有看板'; $lang->kanban->allProjects = '所有项目'; $lang->kanban->allProducts = '所有产品'; diff --git a/module/kanban/view/importbuild.html.php b/module/kanban/view/importbuild.html.php new file mode 100644 index 0000000000..e1da49c3e9 --- /dev/null +++ b/module/kanban/view/importbuild.html.php @@ -0,0 +1,83 @@ + + * @package kanban + * @version $Id: importbuild.html.php 5090 2022-01-19 14:19:24Z xieqiyu@cnezsoft.com $ + * @link https://www.zentao.net + */ +?> + + + + + + +
+
+
+

kanban->importBuild;?>

+
+
+
+

kanban->selectedProject;?>

+
+
+
+

kanban->selectedLane;?>

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ idAB;?> +
build->product;?>build->name;?>executionCommon;?>build->date;?>build->builder;?>
+
+ + +
+ id);?> +
productName;?>project", $build->name, '', "class='iframe'", true, true);?>name;?>executionName;?>date;?>builder);?>
+ + + +
+
+ diff --git a/module/kanban/view/importrelease.html.php b/module/kanban/view/importrelease.html.php index da77f58e3c..32221c073a 100644 --- a/module/kanban/view/importrelease.html.php +++ b/module/kanban/view/importrelease.html.php @@ -42,7 +42,7 @@ release->name;?> release->project;?> - release->build;?> + release->build;?> release->date;?> @@ -61,8 +61,8 @@ name;?> - project;?> - build;?> + projectName;?> + buildName;?> date;?> From 8959feba2a0b310a9078959bef6b79556ead5cf8 Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Mon, 24 Jan 2022 12:07:16 +0800 Subject: [PATCH 11/28] * Optimize the code. --- module/action/lang/en.php | 4 ++-- module/action/lang/zh-cn.php | 4 ++-- module/action/model.php | 7 +++++++ module/kanban/control.php | 2 +- module/kanban/js/common.js | 23 +++++++++++++++++++++ module/kanban/js/importbuild.js | 23 --------------------- module/kanban/js/importcard.js | 23 --------------------- module/kanban/js/importexecution.js | 23 --------------------- module/kanban/js/importplan.js | 23 --------------------- module/kanban/js/importrelease.js | 23 --------------------- module/kanban/js/view.js | 2 +- module/kanban/lang/en.php | 2 +- module/kanban/lang/zh-cn.php | 2 +- module/kanban/view/importbuild.html.php | 7 ++++--- module/kanban/view/importcard.html.php | 3 ++- module/kanban/view/importexecution.html.php | 3 ++- module/kanban/view/importplan.html.php | 3 ++- module/kanban/view/importrelease.html.php | 3 ++- 18 files changed, 50 insertions(+), 130 deletions(-) delete mode 100644 module/kanban/js/importbuild.js delete mode 100644 module/kanban/js/importcard.js delete mode 100644 module/kanban/js/importexecution.js delete mode 100644 module/kanban/js/importplan.js delete mode 100644 module/kanban/js/importrelease.js diff --git a/module/action/lang/en.php b/module/action/lang/en.php index 2f29a16128..7c755ebe50 100755 --- a/module/action/lang/en.php +++ b/module/action/lang/en.php @@ -194,7 +194,7 @@ $lang->action->desc->importfromgitlab = '$date, Issue associate created from $lang->action->desc->archived = '$date, archived by $actor.' . "\n"; $lang->action->desc->restore = '$date, restore by $actor.' . "\n"; $lang->action->desc->importedcard = '$date, imported to $extra by $actor.' . "\n"; -$lang->action->desc->importedplan = '$date, imported to $extra by $actor.' . "\n"; +$lang->action->desc->importedproductplan = '$date, imported to $extra by $actor.' . "\n"; $lang->action->desc->importedrelease = '$date, imported to $extra by $actor.' . "\n"; $lang->action->desc->importedexecution = '$date, imported to $extra by $actor.' . "\n"; $lang->action->desc->importedbuild = '$date, imported to $extra by $actor.' . "\n"; @@ -338,7 +338,7 @@ $lang->action->label->activatedbychild = 'activated'; $lang->action->label->createchild = 'activated'; $lang->action->label->executed = 'executed'; $lang->action->label->importedcard = 'imported'; -$lang->action->label->importedplan = 'imported'; +$lang->action->label->importedproductplan = 'imported'; $lang->action->label->importedrelease = 'imported'; $lang->action->label->importedexecution = 'imported'; $lang->action->label->importedbuild = 'imported'; diff --git a/module/action/lang/zh-cn.php b/module/action/lang/zh-cn.php index 81b9633088..de29283f07 100755 --- a/module/action/lang/zh-cn.php +++ b/module/action/lang/zh-cn.php @@ -194,7 +194,7 @@ $lang->action->desc->importfromgitlab = '$date, 由 $actor $lang->action->desc->archived = '$date, 由 $actor 归档。' . "\n"; $lang->action->desc->restore = '$date, 由 $actor 还原。' . "\n"; $lang->action->desc->importedcard = '$date, 由 $actor 从看板 $extra 导入。' . "\n"; -$lang->action->desc->importedplan = '$date, 由 $actor 从产品计划 $extra 导入。' . "\n"; +$lang->action->desc->importedproductplan = '$date, 由 $actor 从产品计划 $extra 导入。' . "\n"; $lang->action->desc->importedrelease = '$date, 由 $actor 从产品发布 $extra 导入。' . "\n"; $lang->action->desc->importedexecution = '$date, 由 $actor 从项目执行 $extra 导入。' . "\n"; $lang->action->desc->importedbuild = '$date, 由 $actor 从项目版本 $extra 导入。' . "\n"; @@ -338,7 +338,7 @@ $lang->action->label->activatedbychild = '激活了'; $lang->action->label->createchild = '激活了'; $lang->action->label->executed = '执行了'; $lang->action->label->importedcard = '导入了'; -$lang->action->label->importedplan = '导入了'; +$lang->action->label->importedproductplan = '导入了'; $lang->action->label->importedrelease = '导入了'; $lang->action->label->importedexecution = '导入了'; $lang->action->label->importedbuild = '导入了'; diff --git a/module/action/model.php b/module/action/model.php index a03924531c..67ca809d04 100755 --- a/module/action/model.php +++ b/module/action/model.php @@ -1053,6 +1053,13 @@ class actionModel extends model $user = $this->dao->select('id,realname')->from(TABLE_USER)->where('id')->eq($action->objectID)->fetch(); if($user) $action->objectName = $user->realname; } + elseif($action->objectType == 'kanbancard' and strpos($action->action, 'imported') !== false and $action->action != 'importedcard') + { + $objectType = str_replace('imported', '', $action->action); + $objectTable = zget($this->config->objectTables, $objectType); + $objectName = $objectType == 'productplan' ? 'title' : 'name'; + $action->objectName = $this->dao->select($objectName)->from($objectTable)->where('id')->eq($action->extra)->fetch($objectName); + } $projectID = isset($relatedProjects[$action->objectType][$action->objectID]) ? $relatedProjects[$action->objectType][$action->objectID] : 0; diff --git a/module/kanban/control.php b/module/kanban/control.php index 7e639f9cc8..6e7bd98a9f 100644 --- a/module/kanban/control.php +++ b/module/kanban/control.php @@ -863,7 +863,7 @@ class kanban extends control foreach($importedIDList as $cardID => $planID) { - $this->loadModel('action')->create('kanbancard', $cardID, 'importedPlan', '', $planID); + $this->loadModel('action')->create('kanbancard', $cardID, 'importedProductplan', '', $planID); } return print(js::locate($this->createLink('kanban', 'view', "kanbanID=$kanbanID"), 'parent.parent')); diff --git a/module/kanban/js/common.js b/module/kanban/js/common.js index fc66b36f5b..c9177e6d58 100644 --- a/module/kanban/js/common.js +++ b/module/kanban/js/common.js @@ -45,3 +45,26 @@ function initColorPicker() }) } +/** + * Reload object list. + * + * @param int $targetID + * @access public + * @return void + */ +function reloadObjectList(targetID) +{ + location.href = createLink('kanban', methodName, 'kanbanID=' + kanbanID + '®ionID=' + regionID + '&groupID=' + groupID + '&columnID=' + columnID + '&targetID=' + targetID); +} + +/** + * Set target lane ID. + * + * @param int $targetLaneID + * @access public + * @return void + */ +function setTargetLane(targetLaneID) +{ + $('#targetLane').val(targetLaneID); +} diff --git a/module/kanban/js/importbuild.js b/module/kanban/js/importbuild.js deleted file mode 100644 index d3ba2f1356..0000000000 --- a/module/kanban/js/importbuild.js +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Reload card list. - * - * @param int $kanbanID - * @access public - * @return void - */ -function reloadBuildList(targetID) -{ - location.href = createLink('kanban', 'importBuild','kanbanID=' + kanbanID + '®ionID=' + regionID + '&groupID=' + groupID + '&columnID=' + columnID + '&targetProductID=' + targetID); -} - -/** - * Set target lane ID. - * - * @param int $targetLaneID - * @access public - * @return void - */ -function setTargetLane(targetLaneID) -{ - $('#targetLane').val(targetLaneID); -} diff --git a/module/kanban/js/importcard.js b/module/kanban/js/importcard.js deleted file mode 100644 index e4acd67ed0..0000000000 --- a/module/kanban/js/importcard.js +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Reload card list. - * - * @param int $kanbanID - * @access public - * @return void - */ -function reloadCardList(targetID) -{ - location.href = createLink('kanban','importcard','kanbanID=' + kanbanID + '®ionID=' + regionID + '&groupID=' + groupID + '&columnID=' + columnID + '&targetKanbanID=' + targetID); -} - -/** - * Set target lane ID. - * - * @param int $targetLaneID - * @access public - * @return void - */ -function setTargetLane(targetLaneID) -{ - $('#targetLane').val(targetLaneID); -} diff --git a/module/kanban/js/importexecution.js b/module/kanban/js/importexecution.js deleted file mode 100644 index ef1a68892c..0000000000 --- a/module/kanban/js/importexecution.js +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Reload card list. - * - * @param int $kanbanID - * @access public - * @return void - */ -function reloadExecutionList(targetID) -{ - location.href = createLink('kanban', 'importExecution','kanbanID=' + kanbanID + '®ionID=' + regionID + '&groupID=' + groupID + '&columnID=' + columnID + '&targetProductID=' + targetID); -} - -/** - * Set target lane ID. - * - * @param int $targetLaneID - * @access public - * @return void - */ -function setTargetLane(targetLaneID) -{ - $('#targetLane').val(targetLaneID); -} diff --git a/module/kanban/js/importplan.js b/module/kanban/js/importplan.js deleted file mode 100644 index 51a7022b5e..0000000000 --- a/module/kanban/js/importplan.js +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Reload card list. - * - * @param int $kanbanID - * @access public - * @return void - */ -function reloadPlanList(targetID) -{ - location.href = createLink('kanban','importPlan','kanbanID=' + kanbanID + '®ionID=' + regionID + '&groupID=' + groupID + '&columnID=' + columnID + '&targetProductID=' + targetID); -} - -/** - * Set target lane ID. - * - * @param int $targetLaneID - * @access public - * @return void - */ -function setTargetLane(targetLaneID) -{ - $('#targetLane').val(targetLaneID); -} diff --git a/module/kanban/js/importrelease.js b/module/kanban/js/importrelease.js deleted file mode 100644 index c9341c4c02..0000000000 --- a/module/kanban/js/importrelease.js +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Reload card list. - * - * @param int $kanbanID - * @access public - * @return void - */ -function reloadReleaseList(targetID) -{ - location.href = createLink('kanban','importRelease','kanbanID=' + kanbanID + '®ionID=' + regionID + '&groupID=' + groupID + '&columnID=' + columnID + '&targetProductID=' + targetID); -} - -/** - * Set target lane ID. - * - * @param int $targetLaneID - * @access public - * @return void - */ -function setTargetLane(targetLaneID) -{ - $('#targetLane').val(targetLaneID); -} diff --git a/module/kanban/js/view.js b/module/kanban/js/view.js index c94a4041b8..ea53cd8b1b 100644 --- a/module/kanban/js/view.js +++ b/module/kanban/js/view.js @@ -145,7 +145,7 @@ function renderHeaderCol($column, column, $header, kanbanData) if(columnPrivs.includes('createCard') && column.parent != -1) { - var cardUrl = createLink('kanban', 'importBuild', 'kanbanID=' + kanbanID + '®ionID=' + regionID + '&groupID=' + groupID + '&columnID=' + columnID); + var cardUrl = createLink('kanban', 'importplan', 'kanbanID=' + kanbanID + '®ionID=' + regionID + '&groupID=' + groupID + '&columnID=' + columnID); addItemBtn = ['', '', ''].join(''); } diff --git a/module/kanban/lang/en.php b/module/kanban/lang/en.php index d3760d26de..ab7c709649 100644 --- a/module/kanban/lang/en.php +++ b/module/kanban/lang/en.php @@ -61,7 +61,7 @@ $lang->kanban->showClosed = 'Closed'; $lang->kanban->importCard = 'Import Card'; $lang->kanban->importPlan = 'Import Plan'; $lang->kanban->importRelease = 'Import Release'; -$lang->kanban->importExecution = 'Import Execution'; +$lang->kanban->importExecution = 'Import ' . $lang->execution->common; $lang->kanban->importBuild = 'Import Build'; $lang->kanban->allKanban = 'All Kanban'; $lang->kanban->allProjects = 'All Projects'; diff --git a/module/kanban/lang/zh-cn.php b/module/kanban/lang/zh-cn.php index 87b8155d84..9c13c56213 100644 --- a/module/kanban/lang/zh-cn.php +++ b/module/kanban/lang/zh-cn.php @@ -61,7 +61,7 @@ $lang->kanban->showClosed = '显示已关闭'; $lang->kanban->importCard = '转入卡片'; $lang->kanban->importPlan = '导入产品计划'; $lang->kanban->importRelease = '导入产品发布'; -$lang->kanban->importExecution = '导入项目执行'; +$lang->kanban->importExecution = '导入项目' . $lang->execution->common; $lang->kanban->importBuild = '导入项目版本'; $lang->kanban->allKanban = '所有看板'; $lang->kanban->allProjects = '所有项目'; diff --git a/module/kanban/view/importbuild.html.php b/module/kanban/view/importbuild.html.php index e1da49c3e9..92a4c0237c 100644 --- a/module/kanban/view/importbuild.html.php +++ b/module/kanban/view/importbuild.html.php @@ -16,6 +16,7 @@ +app->rawMethod);?>
@@ -24,7 +25,7 @@

kanban->selectedProject;?>

-
+

kanban->selectedLane;?>

@@ -58,8 +59,8 @@ id);?> productName;?> - - project", $build->name, '', "class='iframe'", true, true);?> + + id", $build->name, '', "class='iframe'", true, true);?> name;?> diff --git a/module/kanban/view/importcard.html.php b/module/kanban/view/importcard.html.php index b07c298ebf..ebb099cc2b 100644 --- a/module/kanban/view/importcard.html.php +++ b/module/kanban/view/importcard.html.php @@ -16,6 +16,7 @@ +app->rawMethod);?>
@@ -24,7 +25,7 @@

kanban->selectedKanban;?>

-
+

kanban->selectedLane;?>

diff --git a/module/kanban/view/importexecution.html.php b/module/kanban/view/importexecution.html.php index 450ffb8fb4..519928107b 100644 --- a/module/kanban/view/importexecution.html.php +++ b/module/kanban/view/importexecution.html.php @@ -16,6 +16,7 @@ +app->rawMethod);?>
@@ -24,7 +25,7 @@

kanban->selectedProject;?>

-
+

kanban->selectedLane;?>

diff --git a/module/kanban/view/importplan.html.php b/module/kanban/view/importplan.html.php index ac0cab4109..b6ef413fa7 100644 --- a/module/kanban/view/importplan.html.php +++ b/module/kanban/view/importplan.html.php @@ -16,6 +16,7 @@ +app->rawMethod);?>
@@ -24,7 +25,7 @@

kanban->selectedProduct;?>

-
+

kanban->selectedLane;?>

diff --git a/module/kanban/view/importrelease.html.php b/module/kanban/view/importrelease.html.php index 32221c073a..e2c51ccc71 100644 --- a/module/kanban/view/importrelease.html.php +++ b/module/kanban/view/importrelease.html.php @@ -16,6 +16,7 @@ +app->rawMethod);?>
@@ -24,7 +25,7 @@

kanban->selectedProduct;?>

-
+

kanban->selectedLane;?>

From 0b8535a885b0ff97a99d46721901b556c77f1ae4 Mon Sep 17 00:00:00 2001 From: tianshujie Date: Mon, 24 Jan 2022 12:30:30 +0800 Subject: [PATCH 12/28] * Finish task #47994. --- module/kanban/css/view.css | 16 ++- module/kanban/js/view.js | 253 +++++++++++++++++++++++++---------- module/kanban/lang/en.php | 6 + module/kanban/lang/zh-cn.php | 6 + module/kanban/model.php | 47 ++++++- 5 files changed, 251 insertions(+), 77 deletions(-) diff --git a/module/kanban/css/view.css b/module/kanban/css/view.css index 1a4c04e8e6..db3016aa6c 100644 --- a/module/kanban/css/view.css +++ b/module/kanban/css/view.css @@ -98,5 +98,19 @@ .kanban-col[data-type=ADD] {display: none;} .kanban-col[data-type=EMPTY] {display: none;} -.kanban-item:hover .title {padding-right: 10px;} +.kanban-item .title {padding-right: 10px;} .gray .actions {display:none;} + +.kanban-card .header .executionName {display: flex; width: 100%; float: left; white-space: nowrap; overflow: hidden;} +.kanban-card .header .executionName .title {padding-right: 0px; margin-right: 5px; white-space: nowrap; overflow: hidden;} +.kanban-card .header .executionName .title .icon {padding-right: 5px;} +.kanban-card .header .executionName > span {flex: none;} +.execInfo {margin-top: 23px;} +.execInfo .execStatus{margin-right: 20px;} +.execInfo .label-wait {background: #EFEFEF !important; color: #838A9D;} +.execInfo .label-doing {background: #f8d2d2 !important; color: #e64b4c;} +.execInfo .label-suspended {background: #fff3d9 !important; color: #ff9800;} +.execInfo .label-closed {background: #e5e5e5 !important; color: #b8b8b8;} +.execInfo .label-deleted {background: #ff5d5d !important; color: #fff;} +.region .kanban-item > .kanban-card > .execInfo > .user {position: absolute; right: 10px; bottom: -2px} +.region .kanban-item > .kanban-card > .execInfo > .user > .avatar {display: inline-block; width: 24px; height: 24px; line-height: 24px; margin-right: 0px; margin-left: 2px} diff --git a/module/kanban/js/view.js b/module/kanban/js/view.js index e672f3bfb4..b68ede560a 100644 --- a/module/kanban/js/view.js +++ b/module/kanban/js/view.js @@ -187,6 +187,17 @@ function renderCount($count, count, column) } } +/** + * Render lane name. + * + * @param object $lane + * @param object lane + * @param object $kanban + * @param object columns + * @param object kanban + * @access public + * @return void + */ function renderLaneName($lane, lane, $kanban, columns, kanban) { var canSet = lane.actions.includes('setLane'); @@ -255,90 +266,184 @@ function renderUsersAvatar(users, itemID, size) */ function renderKanbanItem(item, $item) { - var $title = $item.children('.title'); - var privs = item.actions; - var printMoreBtn = (privs.includes('editCard') || privs.includes('archiveCard') || privs.includes('copyCard') || privs.includes('deleteCard') || privs.includes('moveCard') || privs.includes('setCardColor')); - - if(privs.includes('sortCard')) $item.parent().addClass('sort'); - if(!$title.length) + if(item.fromType == 'execution') { - if(privs.includes('viewCard')) $title = $('').appendTo($item).attr('href', createLink('kanban', 'viewCard', 'cardID=' + item.id, '', true)); - if(!privs.includes('viewCard')) $title = $('

').appendTo($item); - } - - $title.text(item.name).attr('title', item.name); - - if(printMoreBtn) - { - $( - [ - '
', - '', - '', - '', - '
' - ].join('')).appendTo($item); - } - - var $info = $item.children('.info'); - if(!$info.length) $info = $( - [ - '
', - '', - '', - '', - '
', - '
' - ].join('')).appendTo($item); - - $item.data('card', item); - - $info.children('.estimate').text(item.estimate + kanbancardLang.lblHour); - if(item.estimate == 0) $info.children('.estimate').hide(); - - $info.children('.pri') - .attr('class', 'pri label-pri label-pri-' + item.pri) - .text(item.pri); - - $item.css('background-color', item.color); - $item.toggleClass('has-color', item.color != '#fff' && item.color != ''); - $item.find('.info > .label-light').css('background-color', item.color); - - var $time = $info.children('.time'); - if(item.end == '0000-00-00' && item.begin == '0000-00-00') - { - $time.hide(); + renderExecutionItem(item, $item); } else { - var today = new Date(); - var begin = $.zui.createDate(item.begin); - var end = $.zui.createDate(item.end); - var needRemind = (begin.toLocaleDateString() == today.toLocaleDateString() || end.toLocaleDateString() == today.toLocaleDateString()); - if(item.end == '0000-00-00' && item.begin != '0000-00-00') + var $title = $item.children('.title'); + var privs = item.actions; + var printMoreBtn = (privs.includes('editCard') || privs.includes('archiveCard') || privs.includes('copyCard') || privs.includes('deleteCard') || privs.includes('moveCard') || privs.includes('setCardColor')); + + if(privs.includes('sortCard')) $item.parent().addClass('sort'); + if(!$title.length) { - $time.text($.zui.formatDate(begin, 'MM/dd') + ' ' + kanbancardLang.beginAB).attr('title', $.zui.formatDate(begin, 'yyyy/MM/dd') + ' ' +kanbancardLang.beginAB).show(); - } - else if(item.begin == '0000-00-00' && item.end != '0000-00-00') - { - $time.text($.zui.formatDate(end, 'MM/dd') + ' ' + kanbancardLang.deadlineAB).attr('title', $.zui.formatDate(end, 'yyyy/MM/dd') + ' ' + kanbancardLang.deadlineAB).show(); - } - else if(item.begin != '0000-00-00' && item.end != '0000-00-00') - { - $time.text($.zui.formatDate(begin, 'MM/dd') + ' ' + kanbancardLang.to + ' ' + $.zui.formatDate(end, 'MM/dd')).attr('title', $.zui.formatDate(begin, 'yyyy/MM/dd') + kanbancardLang.to + $.zui.formatDate(end, 'yyyy/MM/dd')).show(); + if(privs.includes('viewCard')) $title = $('').appendTo($item).attr('href', createLink('kanban', 'viewCard', 'cardID=' + item.id, '', true)); + if(!privs.includes('viewCard')) $title = $('

').appendTo($item); } - if(!$item.hasClass('has-color') && needRemind) $time.css('background-color', 'rgba(210, 50, 61, 0.3)'); - if($item.hasClass('has-color') && needRemind) $time.css('background-color', 'rgba(255, 255, 255, 0.3)'); - if(!needRemind) $time.css('background-color', 'rgba(0, 0, 0, 0.15)'); + $title.text(item.name).attr('title', item.name); + + if(printMoreBtn) + { + $( + [ + '
', + '', + '', + '', + '
' + ].join('')).appendTo($item); + } + + var $info = $item.children('.info'); + if(!$info.length) $info = $( + [ + '
', + '', + '', + '', + '
', + '
' + ].join('')).appendTo($item); + + $item.data('card', item); + + $info.children('.estimate').text(item.estimate + kanbancardLang.lblHour); + if(item.estimate == 0) $info.children('.estimate').hide(); + + $info.children('.pri') + .attr('class', 'pri label-pri label-pri-' + item.pri) + .text(item.pri); + + $item.css('background-color', item.color); + $item.toggleClass('has-color', item.color != '#fff' && item.color != ''); + $item.find('.info > .label-light').css('background-color', item.color); + + var $time = $info.children('.time'); + if(item.end == '0000-00-00' && item.begin == '0000-00-00') + { + $time.hide(); + } + else + { + var today = new Date(); + var begin = $.zui.createDate(item.begin); + var end = $.zui.createDate(item.end); + var needRemind = (begin.toLocaleDateString() == today.toLocaleDateString() || end.toLocaleDateString() == today.toLocaleDateString()); + if(item.end == '0000-00-00' && item.begin != '0000-00-00') + { + $time.text($.zui.formatDate(begin, 'MM/dd') + ' ' + kanbancardLang.beginAB).attr('title', $.zui.formatDate(begin, 'yyyy/MM/dd') + ' ' +kanbancardLang.beginAB).show(); + } + else if(item.begin == '0000-00-00' && item.end != '0000-00-00') + { + $time.text($.zui.formatDate(end, 'MM/dd') + ' ' + kanbancardLang.deadlineAB).attr('title', $.zui.formatDate(end, 'yyyy/MM/dd') + ' ' + kanbancardLang.deadlineAB).show(); + } + else if(item.begin != '0000-00-00' && item.end != '0000-00-00') + { + $time.text($.zui.formatDate(begin, 'MM/dd') + ' ' + kanbancardLang.to + ' ' + $.zui.formatDate(end, 'MM/dd')).attr('title', $.zui.formatDate(begin, 'yyyy/MM/dd') + kanbancardLang.to + $.zui.formatDate(end, 'yyyy/MM/dd')).show(); + } + + if(!$item.hasClass('has-color') && needRemind) $time.css('background-color', 'rgba(210, 50, 61, 0.3)'); + if($item.hasClass('has-color') && needRemind) $time.css('background-color', 'rgba(255, 255, 255, 0.3)'); + if(!needRemind) $time.css('background-color', 'rgba(0, 0, 0, 0.15)'); + } + + /* Display avatars of assignedTo. */ + var assignedTo = item.assignedTo.split(','); + var $user = $info.children('.user'); + var title = []; + for(i = 0; i < assignedTo.length; i++) title.push(users[assignedTo[i]]); + $user.html(renderUsersAvatar(assignedTo, item.id)).attr('title', title); + } +} + +/** + * Render execution item. + * + * @param object item + * @param object $item + * @access public + * @return void + */ +function renderExecutionItem(item, $item) +{ + /* Output header information. */ + var privs = item.actions; + var $header = $item.children('.header'); + if(!$header.length) $header = $( + [ + '
', + '
' + ].join('')).appendTo($item); + + var $titleBox = $item.children('.executionName'); + if(!$titleBox.length) $titleBox = $( + [ + '
', + '
' + ].join('')).appendTo($header); + + /* Print execution name. */ + var $title = $titleBox.children('.title'); + if(!$title.length) + { + var viewMethod = item.execType == 'kanban' ? 'kanban' : 'task'; + if(privs.includes('viewExecution') && item.deleted == '0') $title = $('' + item.name + '').appendTo($titleBox).attr('href', createLink('execution', viewMethod, 'executionID=' + item.fromID)); + if(!privs.includes('viewExecution') || item.deleted == '1') $title = $('' + item.name + '').appendTo($titleBox); + } + $title.attr('title', item.name); + + if(item.delay) + { + $delayed = $titleBox.children('.delayed'); + if(!$delayed.length) + { + $('' + kanbanLang.delayed + '').appendTo($titleBox); + } } - /* Display avatars of assignedTo. */ - var assignedTo = item.assignedTo.split(','); + $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') + { + if(item.status == 'wait') $statusBox = $('' + kanbanLang.wait + '').appendTo($info); + if(item.status == 'doing') $statusBox = $('' + kanbanLang.doing + '').appendTo($info); + if(item.status == 'suspended') $statusBox = $('' + kanbanLang.suspended + '').appendTo($info); + if(item.status == 'closed') $statusBox = $('' + kanbanLang.closed + '').appendTo($info); + } + else + { + $statusBox = $('' + kanbanLang.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 title = []; - for(i = 0; i < assignedTo.length; i++) title.push(users[assignedTo[i]]); - $user.html(renderUsersAvatar(assignedTo, item.id)).attr('title', title); + var user = [item.PM]; + if(!$user.length) $user = $('
').appendTo($info); + + $user.html(renderUsersAvatar(user, item.id)).attr('title', item.PM); } /** diff --git a/module/kanban/lang/en.php b/module/kanban/lang/en.php index 6ba8be6423..6fadfb6e30 100644 --- a/module/kanban/lang/en.php +++ b/module/kanban/lang/en.php @@ -85,6 +85,12 @@ $lang->kanban->closedDate = 'Closed Date'; $lang->kanban->empty = 'No Kanban'; $lang->kanban->teamSumCount = '%s people in total'; $lang->kanban->cardCount = 'Card Count'; +$lang->kanban->delayed = 'Delayed'; +$lang->kanban->wait = 'Wait'; +$lang->kanban->doing = 'Doing'; +$lang->kanban->suspended = 'Suspended'; +$lang->kanban->closed = 'Closed'; +$lang->kanban->deleted = 'Deleted'; $lang->kanban->createColumnOnLeft = 'Create Column On Left'; $lang->kanban->createColumnOnRight = 'Create Column On Right'; diff --git a/module/kanban/lang/zh-cn.php b/module/kanban/lang/zh-cn.php index 1ec9ea6990..83d11834df 100644 --- a/module/kanban/lang/zh-cn.php +++ b/module/kanban/lang/zh-cn.php @@ -85,6 +85,12 @@ $lang->kanban->closedDate = '关闭日期'; $lang->kanban->empty = '暂时没有看板'; $lang->kanban->teamSumCount = '共%s人'; $lang->kanban->cardCount = '卡片数量'; +$lang->kanban->delayed = '已延期'; +$lang->kanban->wait = '未开始'; +$lang->kanban->doing = '进行中'; +$lang->kanban->suspended = '已挂起'; +$lang->kanban->closed = '已关闭'; +$lang->kanban->deleted = '已删除'; $lang->kanban->createColumnOnLeft = '在左侧添加看板列'; $lang->kanban->createColumnOnRight = '在右侧添加看板列'; diff --git a/module/kanban/model.php b/module/kanban/model.php index 3aac516f4c..480f355aeb 100644 --- a/module/kanban/model.php +++ b/module/kanban/model.php @@ -941,18 +941,52 @@ class kanbanModel extends model public function getCardGroupByKanban($kanbanID) { /* Get card data.*/ - $cards = $this->dao->select('*')->from(TABLE_KANBANCARD)->alias('t1') + $cards = $this->dao->select('*')->from(TABLE_KANBANCARD) ->where('deleted')->eq(0) ->andWhere('kanban')->eq($kanbanID) ->andWhere('archived')->eq(0) + ->andWhere('fromID')->eq(0) ->fetchAll('id'); + $executionCards = $this->dao->select('*')->from(TABLE_KANBANCARD) + ->where('deleted')->eq(0) + ->andWhere('kanban')->eq($kanbanID) + ->andWhere('archived')->eq(0) + ->andWhere('fromType')->eq('execution') + ->fetchAll('fromID'); + + if(!empty($executionCards)) + { + $executions = $this->dao->select('*')->from(TABLE_PROJECT) + ->where('id')->in(array_keys($executionCards)) + ->fetchAll('id'); + foreach($executionCards as $executionCard) + { + $execution = $executions[$executionCard->fromID]; + + $executionCard->name = $execution->name; + $executionCard->status = $execution->status; + $executionCard->end = $execution->end; + $executionCard->PM = $execution->PM; + $executionCard->execType = $execution->type; + $executionCard->deleted = $execution->deleted; + + if($execution->status != 'done' and $execution->status != 'closed' and $execution->status != 'suspended') + { + $delay = helper::diffDate(helper::today(), $execution->end); + if($delay > 0) $executionCard->delay = $delay; + } + + $cards[$executionCard->id] = $executionCard; + } + } + $cellList = $this->dao->select('*')->from(TABLE_KANBANCELL) ->where('kanban')->eq($kanbanID) ->andWhere('type')->eq('common') ->fetchAll(); - $actions = array('editCard', 'archiveCard', 'deleteCard', 'moveCard', 'setCardColor', 'viewCard', 'sortCard'); + $actions = array('editCard', 'archiveCard', 'deleteCard', 'moveCard', 'setCardColor', 'viewCard', 'sortCard', 'viewExecution'); $cardGroup = array(); foreach($cellList as $cell) { @@ -967,6 +1001,15 @@ class kanbanModel extends model $card->actions = array(); foreach($actions as $action) { + if($action == 'viewExecution') + { + if($card->fromType == 'execution') + { + if($card->execType == 'kanban' and common::hasPriv('execution', 'kanban')) $card->actions[] = $action; + if($card->execType != 'kanban' and common::hasPriv('execution', 'task')) $card->actions[] = $action; + } + continue; + } if(common::hasPriv('kanban', $action)) $card->actions[] = $action; } From f8062df4dc0d3f69b6a2152f8e4321455f695a99 Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Mon, 24 Jan 2022 13:07:30 +0800 Subject: [PATCH 13/28] * Adjust the code structure. --- module/kanban/control.php | 54 +++++++++++++++++++-------------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/module/kanban/control.php b/module/kanban/control.php index 6e7bd98a9f..91d20c6ac3 100644 --- a/module/kanban/control.php +++ b/module/kanban/control.php @@ -846,16 +846,6 @@ class kanban extends control */ public function importPlan($kanbanID = 0, $regionID = 0, $groupID = 0, $columnID = 0, $selectedProductID = 0, $recTotal = 0, $recPerPage = 30, $pageID = 1) { - $this->loadModel('product'); - $this->loadModel('productplan'); - - /* Load pager. */ - $this->app->loadClass('pager', $static = true); - $pager = new pager($recTotal, $recPerPage, $pageID); - - $productPairs = $this->product->getPairs(); - $selectedProductID = empty($selectedProductID) ? key($productPairs) : $selectedProductID; - if($_POST) { $importedIDList = $this->kanban->importObject($kanbanID, $regionID, $groupID, $columnID, 'productplan'); @@ -869,6 +859,16 @@ class kanban extends control return print(js::locate($this->createLink('kanban', 'view', "kanbanID=$kanbanID"), 'parent.parent')); } + $this->loadModel('product'); + $this->loadModel('productplan'); + + /* Load pager. */ + $this->app->loadClass('pager', $static = true); + $pager = new pager($recTotal, $recPerPage, $pageID); + + $productPairs = $this->product->getPairs(); + $selectedProductID = empty($selectedProductID) ? key($productPairs) : $selectedProductID; + $this->view->products = $productPairs; $this->view->selectedProductID = $selectedProductID; $this->view->lanePairs = $this->kanban->getLanePairsByGroup($groupID); @@ -898,16 +898,6 @@ class kanban extends control */ public function importRelease($kanbanID = 0, $regionID = 0, $groupID = 0, $columnID = 0, $selectedProductID = 0, $recTotal = 0, $recPerPage = 30, $pageID = 1) { - $this->loadModel('product'); - $this->loadModel('release'); - - /* Load pager. */ - $this->app->loadClass('pager', $static = true); - $pager = new pager($recTotal, $recPerPage, $pageID); - - $productPairs = $this->product->getPairs(); - $selectedProductID = empty($selectedProductID) ? key($productPairs) : $selectedProductID; - if($_POST) { $importedIDList = $this->kanban->importObject($kanbanID, $regionID, $groupID, $columnID, 'release'); @@ -921,6 +911,16 @@ class kanban extends control return print(js::locate($this->createLink('kanban', 'view', "kanbanID=$kanbanID"), 'parent.parent')); } + $this->loadModel('product'); + $this->loadModel('release'); + + /* Load pager. */ + $this->app->loadClass('pager', $static = true); + $pager = new pager($recTotal, $recPerPage, $pageID); + + $productPairs = $this->product->getPairs(); + $selectedProductID = empty($selectedProductID) ? key($productPairs) : $selectedProductID; + $this->view->products = $productPairs; $this->view->selectedProductID = $selectedProductID; $this->view->lanePairs = $this->kanban->getLanePairsByGroup($groupID); @@ -1003,13 +1003,6 @@ class kanban extends control */ public function importExecution($kanbanID = 0, $regionID = 0, $groupID = 0, $columnID = 0, $selectedProjectID = 0, $recTotal = 0, $recPerPage = 30, $pageID = 1) { - $this->loadModel('project'); - $this->loadModel('execution'); - - /* Load pager. */ - $this->app->loadClass('pager', $static = true); - $pager = new pager($recTotal, $recPerPage, $pageID); - if($_POST) { $importedIDList = $this->kanban->importObject($kanbanID, $regionID, $groupID, $columnID, 'execution'); @@ -1023,6 +1016,13 @@ class kanban extends control return print(js::locate($this->createLink('kanban', 'view', "kanbanID=$kanbanID"), 'parent.parent')); } + $this->loadModel('project'); + $this->loadModel('execution'); + + /* Load pager. */ + $this->app->loadClass('pager', $static = true); + $pager = new pager($recTotal, $recPerPage, $pageID); + $this->view->projects = $this->project->getPairsByProgram(); $this->view->selectedProjectID = $selectedProjectID; $this->view->lanePairs = $this->kanban->getLanePairsByGroup($groupID); From 2fe1b4b7441524524299fb46e67bdc498174d161 Mon Sep 17 00:00:00 2001 From: tianshujie Date: Mon, 24 Jan 2022 13:22:25 +0800 Subject: [PATCH 14/28] * Encapsulate the method for obtaining card data. --- module/kanban/config.php | 3 ++ module/kanban/model.php | 80 +++++++++++++++++++++++++--------------- 2 files changed, 53 insertions(+), 30 deletions(-) diff --git a/module/kanban/config.php b/module/kanban/config.php index 8ce2018009..c965974382 100644 --- a/module/kanban/config.php +++ b/module/kanban/config.php @@ -44,6 +44,9 @@ $config->kanban->editor->close = array('id' => 'comment', 'tools' => 'simp $config->kanban->editor->editcard = array('id' => 'desc', 'tools' => 'simpleTools'); $config->kanban->editor->viewcard = array('id' => 'comment', 'tools' => 'simpleTools'); +$config->kanban->fromType = array('execution', 'productplan', 'release', 'build'); +$config->kanban->executionField = array('name', 'status', 'end', 'PM', 'type', 'deleted'); + $config->kanban->default = new stdclass(); $config->kanban->default->story = new stdclass(); $config->kanban->default->story->name = $lang->SRCommon; diff --git a/module/kanban/model.php b/module/kanban/model.php index 480f355aeb..cd190fcf9d 100644 --- a/module/kanban/model.php +++ b/module/kanban/model.php @@ -948,37 +948,9 @@ class kanbanModel extends model ->andWhere('fromID')->eq(0) ->fetchAll('id'); - $executionCards = $this->dao->select('*')->from(TABLE_KANBANCARD) - ->where('deleted')->eq(0) - ->andWhere('kanban')->eq($kanbanID) - ->andWhere('archived')->eq(0) - ->andWhere('fromType')->eq('execution') - ->fetchAll('fromID'); - - if(!empty($executionCards)) + foreach($this->config->kanban->fromType as $fromType) { - $executions = $this->dao->select('*')->from(TABLE_PROJECT) - ->where('id')->in(array_keys($executionCards)) - ->fetchAll('id'); - foreach($executionCards as $executionCard) - { - $execution = $executions[$executionCard->fromID]; - - $executionCard->name = $execution->name; - $executionCard->status = $execution->status; - $executionCard->end = $execution->end; - $executionCard->PM = $execution->PM; - $executionCard->execType = $execution->type; - $executionCard->deleted = $execution->deleted; - - if($execution->status != 'done' and $execution->status != 'closed' and $execution->status != 'suspended') - { - $delay = helper::diffDate(helper::today(), $execution->end); - if($delay > 0) $executionCard->delay = $delay; - } - - $cards[$executionCard->id] = $executionCard; - } + $cards = $this->getImportCards($kanbanID, $cards, $fromType); } $cellList = $this->dao->select('*')->from(TABLE_KANBANCELL) @@ -1020,6 +992,54 @@ class kanbanModel extends model return $cardGroup; } + /** + * Get import cards. + * + * @param int $kanbanID + * @param object $cards + * @param string $fromType + * @access public + * @return void + */ + public function getImportCards($kanbanID, $cards, $fromType) + { + $objectCards = $this->dao->select('*')->from(TABLE_KANBANCARD) + ->where('deleted')->eq(0) + ->andWhere('kanban')->eq($kanbanID) + ->andWhere('archived')->eq(0) + ->andWhere('fromType')->eq($fromType) + ->fetchAll('fromID'); + + if(!empty($objectCards)) + { + $table = $this->config->objectTables[$fromType]; + $objects = $this->dao->select('*')->from($table) + ->where('id')->in(array_keys($objectCards)) + ->fetchAll('id'); + + foreach($objectCards as $objectCard) + { + $object = $objects[$objectCard->fromID]; + $fieldType = $fromType . 'Field'; + + foreach($this->config->kanban->$fieldType as $field) $objectCard->$field = $object->$field; + + if($fromType =='execution') + { + if($object->status != 'done' and $object->status != 'closed' and $object->status != 'suspended') + { + $delay = helper::diffDate(helper::today(), $object->end); + if($delay > 0) $objectCard->delay = $delay; + } + $objectCard->execType = $object->type; + } + + $cards[$objectCard->id] = $objectCard; + } + } + return $cards; + } + /** * Get RD column group by regions. * From 780d82971f6678e2aaab743b7e99028ccfbf6078 Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Mon, 24 Jan 2022 13:23:38 +0800 Subject: [PATCH 15/28] * Add sql. --- db/update16.2.sql | 8 +++++++- db/zentao.sql | 2 ++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/db/update16.2.sql b/db/update16.2.sql index 75c4536ef7..19f0199beb 100644 --- a/db/update16.2.sql +++ b/db/update16.2.sql @@ -1,6 +1,12 @@ ALTER TABLE `zt_kanbanspace` ADD `type` varchar(50) NOT NULL AFTER `name`; UPDATE `zt_kanbanspace` SET `type` = 'cooperation'; + +ALTER TABLE `zt_kanban` ADD `importObject` varchar(255) NOT NULL AFTER `displayCards`; ALTER TABLE `zt_kanban` ADD `performable` enum ('0', '1') NOT NULL DEFAULT '0' AFTER `archived`; +ALTER TABLE `zt_kanbancard` ADD `status` varchar(30) NOT NULL AFTER `name`; + +ALTER TABLE `zt_kanbancard` ADD `fromID` mediumint(8) unsigned NOT NULL AFTER `group`; +ALTER TABLE `zt_kanbancard` ADD `fromType` varchar(30) NOT NULL AFTER `fromID`; ALTER TABLE `zt_job` ADD `sonarqubeServer` mediumint(8) unsigned NOT NULL AFTER `triggerType`; -ALTER TABLE `zt_job` ADD `projectKey` varchar(255) NOT NULL AFTER `sonarqubeServer`; \ No newline at end of file +ALTER TABLE `zt_job` ADD `projectKey` varchar(255) NOT NULL AFTER `sonarqubeServer`; diff --git a/db/zentao.sql b/db/zentao.sql index 96d30fa663..5e35e0e364 100644 --- a/db/zentao.sql +++ b/db/zentao.sql @@ -708,6 +708,8 @@ CREATE TABLE `zt_kanbancard` ( `kanban` mediumint(8) unsigned NOT NULL, `region` mediumint(8) unsigned NOT NULL, `group` mediumint(8) unsigned NOT NULL, + `fromID` mediumint(8) undigned NOT NULL, + `fromType` varchar(30) NOT NULL, `name` varchar(255) NOT NULL, `pri` mediumint(8) unsigned NOT NULL, `assignedTo` text NOT NULL, From 8e4b8477c43bb086da8dc507406d36e22163a943 Mon Sep 17 00:00:00 2001 From: zhouxin Date: Mon, 24 Jan 2022 05:27:30 +0000 Subject: [PATCH 16/28] Fix bug #18840. --- module/kanban/js/view.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/kanban/js/view.js b/module/kanban/js/view.js index 11d1949bf1..52baf349fb 100644 --- a/module/kanban/js/view.js +++ b/module/kanban/js/view.js @@ -845,7 +845,7 @@ function createColumnCreateMenu(options) var laneID = col.$kanbanData.lanes[0].id ? col.$kanbanData.lanes[0].id : 0; var columnID = col.id; - if(privs.includes('createCard')) items.push({label: kanbanLang.createCard, url: $.createLink('kanban', 'createCard', 'kanbanID=' + kanbanID + '®ionID=' + regionID + '&groupID=' + groupID + '&columnID=' + columnID), className: 'iframe', attrs: {'data-toggle': 'modal', 'data-width': '80%'}}); + if(privs.includes('createCard')) items.push({label: kanbanLang.createCard, url: $.createLink('kanban', 'createCard', 'kanbanID=' + kanbanID + '®ionID=' + regionID + '&groupID=' + groupID + '&columnID=' + columnID), className: 'iframe', attrs: {'data-toggle': 'modal'}}); if(privs.includes('batchCreateCard')) items.push({label: kanbanLang.batchCreateCard, url: $.createLink('kanban', 'batchCreateCard', 'kanbanID=' + kanbanID + '®ionID=' + regionID + '&groupID=' + groupID + '&laneID=' + laneID + '&columnID=' + columnID), attrs: {'data-width': '80%'}}); return items; } From 51a69f3af9e39493757790a41dc29b2290ec9bb3 Mon Sep 17 00:00:00 2001 From: tianshujie Date: Mon, 24 Jan 2022 13:30:09 +0800 Subject: [PATCH 17/28] * Fix drag style issue. --- module/kanban/js/view.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/module/kanban/js/view.js b/module/kanban/js/view.js index e0c3de2947..0cc69d3d7e 100644 --- a/module/kanban/js/view.js +++ b/module/kanban/js/view.js @@ -378,7 +378,7 @@ function renderExecutionItem(item, $item) '
' ].join('')).appendTo($item); - var $titleBox = $item.children('.executionName'); + var $titleBox = $header.children('.executionName'); if(!$titleBox.length) $titleBox = $( [ '
', @@ -434,7 +434,7 @@ function renderExecutionItem(item, $item) var end = $.zui.createDate(item.end); var today = new Date(); var labelType = end.toLocaleDateString() == today.toLocaleDateString() ? 'danger' : 'wait'; - if(!$date.length) $date = $('').appendTo($info); + 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(); From 7633710cfa651f8b3107bf98686e6ccb090f4727 Mon Sep 17 00:00:00 2001 From: liumengyi Date: Mon, 24 Jan 2022 13:31:12 +0800 Subject: [PATCH 18/28] * Fix bug#18841, #18865, #18876, #18877, #18879 and #18891. --- db/update16.2.sql | 2 +- module/kanban/css/closespace.css | 1 + module/kanban/css/space.css | 1 + module/kanban/view/closespace.html.php | 6 +++--- module/kanban/view/create.html.php | 1 - module/kanban/view/edit.html.php | 1 - module/kanban/view/space.html.php | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) create mode 100644 module/kanban/css/closespace.css diff --git a/db/update16.2.sql b/db/update16.2.sql index 1939846fa6..d9e8556078 100644 --- a/db/update16.2.sql +++ b/db/update16.2.sql @@ -1,5 +1,5 @@ ALTER TABLE `zt_kanbanspace` ADD `type` varchar(50) NOT NULL AFTER `name`; -UPDATE `zt_kanbanspace` SET `type` = 'cooperation'; +UPDATE `zt_kanbanspace` SET `type` = 'cooperation', `whitelist` = ''; ALTER TABLE `zt_kanban` ADD `importObject` varchar(255) NOT NULL AFTER `displayCards`; ALTER TABLE `zt_kanban` ADD `performable` enum ('0', '1') NOT NULL DEFAULT '0' AFTER `archived`; diff --git a/module/kanban/css/closespace.css b/module/kanban/css/closespace.css new file mode 100644 index 0000000000..9235410476 --- /dev/null +++ b/module/kanban/css/closespace.css @@ -0,0 +1 @@ +#mainContent .c-comment {width: 50px} diff --git a/module/kanban/css/space.css b/module/kanban/css/space.css index 43f6d7d70e..ef41c8d6b4 100644 --- a/module/kanban/css/space.css +++ b/module/kanban/css/space.css @@ -7,6 +7,7 @@ #spaceList .spaceActions > a{margin-left: 10px;} .space .menu {margin-left: 5px; margin-right:5px;} .space .table-empty-tip {padding: 40px 10px;} +.space .spaceTitle.pull-left {overflow: hidden; white-space: nowrap; max-width: calc(100% - 255px)} .kanbans > .col {width: 25% !important;} @media screen and (max-width: 1500px) {.kanbans > .col {width: 25%;}} diff --git a/module/kanban/view/closespace.html.php b/module/kanban/view/closespace.html.php index aaeba69cb5..f8910f48eb 100644 --- a/module/kanban/view/closespace.html.php +++ b/module/kanban/view/closespace.html.php @@ -23,11 +23,11 @@
- - + + - diff --git a/module/kanban/view/create.html.php b/module/kanban/view/create.html.php index f1f8d4a00e..00c8574f48 100644 --- a/module/kanban/view/create.html.php +++ b/module/kanban/view/create.html.php @@ -43,7 +43,6 @@ diff --git a/module/kanban/view/edit.html.php b/module/kanban/view/edit.html.php index 585028f9af..f0e59e839c 100644 --- a/module/kanban/view/edit.html.php +++ b/module/kanban/view/edit.html.php @@ -36,7 +36,6 @@ diff --git a/module/kanban/view/space.html.php b/module/kanban/view/space.html.php index f941486817..5b4f0d29a6 100644 --- a/module/kanban/view/space.html.php +++ b/module/kanban/view/space.html.php @@ -50,7 +50,7 @@
status == 'closed' ? 'disabled' : '';?> - status != 'closed' and $browseType != 'involved') common::printLink('kanban', 'create', "spaceID={$space->id}&type={$space->type}", ' ' . $lang->kanban->create, '', "class='iframe' data-width='75%'", '', true);?> + status != 'closed' and $browseType != 'involved' and !empty($unclosedSpace)) common::printLink('kanban', 'create', "spaceID={$space->id}&type={$space->type}", ' ' . $lang->kanban->create, '', "class='iframe' data-width='75%'", '', true);?> id}", ' ' . $lang->kanban->setting, '', "class='iframe' data-width='75%'", '', true);?> id}", ' ' . $lang->close, '', "class='iframe {$class}'", '', true);?> id}", ' ' . $lang->delete, 'hiddenwin', '', '', true);?> From 565be797cdb101217e28348f7b7c5e94c3b2c262 Mon Sep 17 00:00:00 2001 From: liumengyi Date: Mon, 24 Jan 2022 13:47:02 +0800 Subject: [PATCH 19/28] * When sorting columns, the card is hidden. --- module/kanban/js/view.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/module/kanban/js/view.js b/module/kanban/js/view.js index 384c34e87d..0c23548992 100644 --- a/module/kanban/js/view.js +++ b/module/kanban/js/view.js @@ -1088,6 +1088,11 @@ $(function() hideKanbanAction(); } + if(sortType == 'column') + { + $('.kanban-item').addClass('hidden'); + } + if(sortType == 'card') { oldLaneID = e.element.closest('.kanban-lane').data('id'); @@ -1151,6 +1156,7 @@ $(function() { updateRegion(regionID, response[regionID]); } + $('.kanban-item').removeClass('hidden'); }); }, always: function(e) From 7cd0246265fb018d1631eeea871719249ee2be98 Mon Sep 17 00:00:00 2001 From: hufangzhou Date: Mon, 24 Jan 2022 13:52:49 +0800 Subject: [PATCH 20/28] * Code for task #47991. --- module/kanban/js/view.js | 20 ++++++++++++++++++++ module/kanban/lang/en.php | 1 + module/kanban/lang/zh-cn.php | 1 + module/kanban/model.php | 2 +- module/todo/model.php | 2 +- 5 files changed, 24 insertions(+), 2 deletions(-) diff --git a/module/kanban/js/view.js b/module/kanban/js/view.js index 5aa4017a8b..a4f57403a2 100644 --- a/module/kanban/js/view.js +++ b/module/kanban/js/view.js @@ -867,6 +867,10 @@ function createColumnCreateMenu(options) if(privs.includes('createCard')) items.push({label: kanbanLang.createCard, url: $.createLink('kanban', 'createCard', 'kanbanID=' + kanbanID + '®ionID=' + regionID + '&groupID=' + groupID + '&columnID=' + columnID), className: 'iframe', attrs: {'data-toggle': 'modal', 'data-width': '80%'}}); if(privs.includes('batchCreateCard')) items.push({label: kanbanLang.batchCreateCard, url: $.createLink('kanban', 'batchCreateCard', 'kanbanID=' + kanbanID + '®ionID=' + regionID + '&groupID=' + groupID + '&laneID=' + laneID + '&columnID=' + columnID), attrs: {'data-width': '80%'}}); + if(privs.includes('import') && kanban.importObject.indexOf('cards') != -1) items.push({label: kanbanLang.importCard, url: $.createLink('kanban', 'importCard', 'kanbanID=' + kanbanID + '®ionID=' + regionID + '&groupID=' + groupID + '&laneID=' + laneID + '&columnID=' + columnID), attrs: {'data-width': '80%'}}); + if(privs.includes('import') && kanban.importObject) items.push({className: 'parentDivider'}); + if(privs.includes('import') && kanban.importObject) items.push({label: kanbanLang.importAB, className: 'import'}); + return items; } @@ -984,6 +988,22 @@ $(function() if(!items || !items.length) return; $.zui.ContextMenu.show(items, items.$options || {event: event}); + + $('.parentDivider').parent().addClass('divider'); + $('.import').parent().addClass('dropdown-submenu top'); + + /* The submenu of import. */ + var importPlanLink = createLink('kanban', 'importPlan'); + var importReleaseLink = createLink('kanban', 'importRelease'); + var importExecutionLink = createLink('kanban', 'importExecution'); + var importBuildLink = createLink('kanban', 'importBuild'); + var importPlanLink = kanban.importObject.indexOf('plan') != -1 ? '
  • ' + kanbanLang.importPlan + '
  • ' : ''; + var importReleaseLink = kanban.importObject.indexOf('release') != -1 ? '
  • ' + kanbanLang.importRelease + '
  • ' : ''; + var importExecutionLink = kanban.importObject.indexOf('execution') != -1 ? '
  • ' + kanbanLang.importExecution + '
  • ' : ''; + var importBuildLink = kanban.importObject.indexOf('build') != -1 ? '
  • ' + kanbanLang.importBuild + '
  • ' : ''; + var importSubmenu = ''; + $('.import').parent().append(importSubmenu); + }); /* Adjust the add button position on window resize */ diff --git a/module/kanban/lang/en.php b/module/kanban/lang/en.php index 05fd40ec65..2c437638b1 100644 --- a/module/kanban/lang/en.php +++ b/module/kanban/lang/en.php @@ -63,6 +63,7 @@ $lang->kanban->restore = 'Restore'; $lang->kanban->child = 'Child'; $lang->kanban->batchCreateCard = 'Batchcreate Card'; $lang->kanban->import = 'Import'; +$lang->kanban->importAB = 'Import'; $lang->kanban->showClosed = 'Closed'; /* Fields. */ diff --git a/module/kanban/lang/zh-cn.php b/module/kanban/lang/zh-cn.php index 5a013d06a8..cf134f06dd 100644 --- a/module/kanban/lang/zh-cn.php +++ b/module/kanban/lang/zh-cn.php @@ -63,6 +63,7 @@ $lang->kanban->restore = '还原'; $lang->kanban->child = '子'; $lang->kanban->batchCreateCard = '批量创建卡片'; $lang->kanban->import = '导入功能'; +$lang->kanban->importAB = '导入'; $lang->kanban->showClosed = '显示已关闭'; /* Fields. */ diff --git a/module/kanban/model.php b/module/kanban/model.php index aa0a7c581f..eba6660470 100644 --- a/module/kanban/model.php +++ b/module/kanban/model.php @@ -886,7 +886,7 @@ class kanbanModel extends model ->orderBy($order) ->fetchGroup('group'); - $actions = array('createColumn', 'setColumn', 'setWIP', 'archiveColumn', 'restoreColumn', 'deleteColumn', 'createCard', 'batchCreateCard', 'splitColumn', 'sortColumn'); + $actions = array('createColumn', 'setColumn', 'setWIP', 'archiveColumn', 'restoreColumn', 'deleteColumn', 'createCard', 'batchCreateCard', 'splitColumn', 'import', 'sortColumn'); /* Group by parent. */ $parentColumnGroup = array(); diff --git a/module/todo/model.php b/module/todo/model.php index 5473018c90..f565eb985b 100644 --- a/module/todo/model.php +++ b/module/todo/model.php @@ -51,7 +51,7 @@ class todoModel extends model if($todo->pri == 'low') $todo->pri = 3; } - if($todo->type != 'custom') + if($todo->type != 'custom' and $todo->idvalue) { $type = $todo->type; $object = $this->loadModel($type)->getByID($this->post->$type); From b9ab4c5326584d7277cd891f1b4ed703a75e465d Mon Sep 17 00:00:00 2001 From: hufangzhou Date: Mon, 24 Jan 2022 14:03:02 +0800 Subject: [PATCH 21/28] * Delete the unused code. --- module/kanban/js/view.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/module/kanban/js/view.js b/module/kanban/js/view.js index a4f57403a2..161a50aa9d 100644 --- a/module/kanban/js/view.js +++ b/module/kanban/js/view.js @@ -993,10 +993,6 @@ $(function() $('.import').parent().addClass('dropdown-submenu top'); /* The submenu of import. */ - var importPlanLink = createLink('kanban', 'importPlan'); - var importReleaseLink = createLink('kanban', 'importRelease'); - var importExecutionLink = createLink('kanban', 'importExecution'); - var importBuildLink = createLink('kanban', 'importBuild'); var importPlanLink = kanban.importObject.indexOf('plan') != -1 ? '
  • ' + kanbanLang.importPlan + '
  • ' : ''; var importReleaseLink = kanban.importObject.indexOf('release') != -1 ? '
  • ' + kanbanLang.importRelease + '
  • ' : ''; var importExecutionLink = kanban.importObject.indexOf('execution') != -1 ? '
  • ' + kanbanLang.importExecution + '
  • ' : ''; From 0530d95aac3b433a04df0fd91f2a451dcc4c554d Mon Sep 17 00:00:00 2001 From: hufangzhou Date: Mon, 24 Jan 2022 14:11:52 +0800 Subject: [PATCH 22/28] * Rename the importObject to object. --- db/update16.2.sql | 2 +- db/zentao.sql | 2 +- module/kanban/control.php | 4 ++-- module/kanban/js/view.js | 14 +++++++------- module/kanban/model.php | 2 +- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/db/update16.2.sql b/db/update16.2.sql index 1939846fa6..b99e1dba7d 100644 --- a/db/update16.2.sql +++ b/db/update16.2.sql @@ -1,7 +1,7 @@ ALTER TABLE `zt_kanbanspace` ADD `type` varchar(50) NOT NULL AFTER `name`; UPDATE `zt_kanbanspace` SET `type` = 'cooperation'; -ALTER TABLE `zt_kanban` ADD `importObject` varchar(255) NOT NULL AFTER `displayCards`; +ALTER TABLE `zt_kanban` ADD `object` varchar(255) NOT NULL AFTER `displayCards`; ALTER TABLE `zt_kanban` ADD `performable` enum ('0', '1') NOT NULL DEFAULT '0' AFTER `archived`; ALTER TABLE `zt_kanbancard` ADD `status` varchar(30) NOT NULL AFTER `name`; diff --git a/db/zentao.sql b/db/zentao.sql index 0726ec6bd9..aeb04dd46e 100644 --- a/db/zentao.sql +++ b/db/zentao.sql @@ -679,7 +679,7 @@ CREATE TABLE `zt_kanban` ( `status` enum('active','closed') NOT NULL default 'active', `order` mediumint(8) NOT NULL DEFAULT '0', `displayCards` smallint(6) NOT NULL default '0', - `importObject` varchar(255) NOT NULL, + `object` varchar(255) NOT NULL, `createdBy` char(30) NOT NULL, `createdDate` datetime NOT NULL, `lastEditedBy` char(30) NOT NULL, diff --git a/module/kanban/control.php b/module/kanban/control.php index 5f1a031eda..40dd1fbb20 100644 --- a/module/kanban/control.php +++ b/module/kanban/control.php @@ -1381,8 +1381,8 @@ class kanban extends control $kanban = $this->kanban->getByID($kanbanID); - $this->view->enableImport = empty($kanban->importObject) ? 'off' : 'on'; - $this->view->importObjects = empty($kanban->importObject) ? array() : explode(',', $kanban->importObject); + $this->view->enableImport = empty($kanban->object) ? 'off' : 'on'; + $this->view->importObjects = empty($kanban->object) ? array() : explode(',', $kanban->object); $this->display(); } diff --git a/module/kanban/js/view.js b/module/kanban/js/view.js index 161a50aa9d..f9961e7632 100644 --- a/module/kanban/js/view.js +++ b/module/kanban/js/view.js @@ -867,9 +867,9 @@ function createColumnCreateMenu(options) if(privs.includes('createCard')) items.push({label: kanbanLang.createCard, url: $.createLink('kanban', 'createCard', 'kanbanID=' + kanbanID + '®ionID=' + regionID + '&groupID=' + groupID + '&columnID=' + columnID), className: 'iframe', attrs: {'data-toggle': 'modal', 'data-width': '80%'}}); if(privs.includes('batchCreateCard')) items.push({label: kanbanLang.batchCreateCard, url: $.createLink('kanban', 'batchCreateCard', 'kanbanID=' + kanbanID + '®ionID=' + regionID + '&groupID=' + groupID + '&laneID=' + laneID + '&columnID=' + columnID), attrs: {'data-width': '80%'}}); - if(privs.includes('import') && kanban.importObject.indexOf('cards') != -1) items.push({label: kanbanLang.importCard, url: $.createLink('kanban', 'importCard', 'kanbanID=' + kanbanID + '®ionID=' + regionID + '&groupID=' + groupID + '&laneID=' + laneID + '&columnID=' + columnID), attrs: {'data-width': '80%'}}); - if(privs.includes('import') && kanban.importObject) items.push({className: 'parentDivider'}); - if(privs.includes('import') && kanban.importObject) items.push({label: kanbanLang.importAB, className: 'import'}); + if(privs.includes('import') && kanban.object.indexOf('cards') != -1) items.push({label: kanbanLang.importCard, url: $.createLink('kanban', 'importCard', 'kanbanID=' + kanbanID + '®ionID=' + regionID + '&groupID=' + groupID + '&laneID=' + laneID + '&columnID=' + columnID), attrs: {'data-width': '80%'}}); + if(privs.includes('import') && kanban.object) items.push({className: 'parentDivider'}); + if(privs.includes('import') && kanban.object) items.push({label: kanbanLang.importAB, className: 'import'}); return items; } @@ -993,10 +993,10 @@ $(function() $('.import').parent().addClass('dropdown-submenu top'); /* The submenu of import. */ - var importPlanLink = kanban.importObject.indexOf('plan') != -1 ? '
  • ' + kanbanLang.importPlan + '
  • ' : ''; - var importReleaseLink = kanban.importObject.indexOf('release') != -1 ? '
  • ' + kanbanLang.importRelease + '
  • ' : ''; - var importExecutionLink = kanban.importObject.indexOf('execution') != -1 ? '
  • ' + kanbanLang.importExecution + '
  • ' : ''; - var importBuildLink = kanban.importObject.indexOf('build') != -1 ? '
  • ' + kanbanLang.importBuild + '
  • ' : ''; + var importPlanLink = kanban.object.indexOf('plan') != -1 ? '
  • ' + kanbanLang.importPlan + '
  • ' : ''; + var importReleaseLink = kanban.object.indexOf('release') != -1 ? '
  • ' + kanbanLang.importRelease + '
  • ' : ''; + var importExecutionLink = kanban.object.indexOf('execution') != -1 ? '
  • ' + kanbanLang.importExecution + '
  • ' : ''; + var importBuildLink = kanban.object.indexOf('build') != -1 ? '
  • ' + kanbanLang.importBuild + '
  • ' : ''; var importSubmenu = ''; $('.import').parent().append(importSubmenu); diff --git a/module/kanban/model.php b/module/kanban/model.php index eba6660470..efb98cb6ba 100644 --- a/module/kanban/model.php +++ b/module/kanban/model.php @@ -3263,6 +3263,6 @@ class kanbanModel extends model $importObjects = $_POST['import'] == 'off' ? array() : $_POST['importObjectList']; $importObjectList = implode(',', $importObjects); - $this->dao->update(TABLE_KANBAN)->set('importObject')->eq($importObjectList)->where('id')->eq($kanbanID)->exec(); + $this->dao->update(TABLE_KANBAN)->set('object')->eq($importObjectList)->where('id')->eq($kanbanID)->exec(); } } From cc299e0b452d7244497b2df7d6a6ea4e79c582ea Mon Sep 17 00:00:00 2001 From: zhengrunyu Date: Mon, 24 Jan 2022 14:24:19 +0800 Subject: [PATCH 23/28] Fix bug 18885. --- db/update16.2.sql | 2 +- module/group/lang/resource.php | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/db/update16.2.sql b/db/update16.2.sql index 1939846fa6..aad6a4869d 100644 --- a/db/update16.2.sql +++ b/db/update16.2.sql @@ -3,7 +3,7 @@ UPDATE `zt_kanbanspace` SET `type` = 'cooperation'; ALTER TABLE `zt_kanban` ADD `importObject` varchar(255) NOT NULL AFTER `displayCards`; ALTER TABLE `zt_kanban` ADD `performable` enum ('0', '1') NOT NULL DEFAULT '0' AFTER `archived`; -ALTER TABLE `zt_kanbancard` ADD `status` varchar(30) NOT NULL AFTER `name`; +ALTER TABLE `zt_kanbancard` ADD `status` varchar(30) NOT NULL DEFAULT 'doing' AFTER `name`; ALTER TABLE `zt_kanbancard` ADD `fromID` int(8) NOT NULL AFTER `group`; ALTER TABLE `zt_kanbancard` ADD `fromType` varchar(50) NOT NULL AFTER `fromID`; diff --git a/module/group/lang/resource.php b/module/group/lang/resource.php index 5c33bb7baa..47faf1c6e1 100644 --- a/module/group/lang/resource.php +++ b/module/group/lang/resource.php @@ -679,6 +679,7 @@ $lang->resource->kanban->restoreCard = 'restoreCard'; $lang->resource->kanban->setLaneHeight = 'setLaneHeight'; $lang->resource->kanban->batchCreateCard = 'batchCreateCard'; $lang->resource->kanban->import = 'import'; +$lang->resource->kanban->enableArchived = 'enableArchived'; $lang->kanban->methodOrder[5] = 'space'; $lang->kanban->methodOrder[10] = 'createSpace'; @@ -726,6 +727,7 @@ $lang->kanban->methodorder[210] = 'restoreCard'; $lang->kanban->methodorder[215] = 'setLaneHeight'; $lang->kanban->methodOrder[220] = 'batchCreateCard'; $lang->kanban->methodorder[225] = 'import'; +$lang->kanban->methodorder[230] = 'enableArchived'; /* Execution. */ $lang->resource->execution = new stdclass(); From f86c3f5b8c8b0fff9c5b1510d2da3b8e3acb7883 Mon Sep 17 00:00:00 2001 From: tianshujie Date: Mon, 24 Jan 2022 14:28:24 +0800 Subject: [PATCH 24/28] * Modify the code. --- module/kanban/js/view.js | 11 ++++------- module/kanban/lang/en.php | 6 ------ module/kanban/lang/zh-cn.php | 6 ------ module/kanban/model.php | 8 ++++---- module/kanban/view/view.html.php | 2 ++ 5 files changed, 10 insertions(+), 23 deletions(-) diff --git a/module/kanban/js/view.js b/module/kanban/js/view.js index 0cc69d3d7e..d9d6a4b307 100644 --- a/module/kanban/js/view.js +++ b/module/kanban/js/view.js @@ -400,7 +400,7 @@ function renderExecutionItem(item, $item) $delayed = $titleBox.children('.delayed'); if(!$delayed.length) { - $('' + kanbanLang.delayed + '').appendTo($titleBox); + $('' + executionLang.delayed + '').appendTo($titleBox); } } @@ -418,14 +418,11 @@ function renderExecutionItem(item, $item) { if(item.deleted == '0') { - if(item.status == 'wait') $statusBox = $('' + kanbanLang.wait + '').appendTo($info); - if(item.status == 'doing') $statusBox = $('' + kanbanLang.doing + '').appendTo($info); - if(item.status == 'suspended') $statusBox = $('' + kanbanLang.suspended + '').appendTo($info); - if(item.status == 'closed') $statusBox = $('' + kanbanLang.closed + '').appendTo($info); + $statusBox = $('' + executionLang.statusList[item.status] + '').appendTo($info); } else { - $statusBox = $('' + kanbanLang.deleted + '').appendTo($info); + $statusBox = $('' + executionLang.deleted + '').appendTo($info); } } @@ -436,7 +433,7 @@ function renderExecutionItem(item, $item) 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(); + $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'); diff --git a/module/kanban/lang/en.php b/module/kanban/lang/en.php index 7e4501ba2e..ab7c709649 100644 --- a/module/kanban/lang/en.php +++ b/module/kanban/lang/en.php @@ -87,12 +87,6 @@ $lang->kanban->closedDate = 'Closed Date'; $lang->kanban->empty = 'No Kanban'; $lang->kanban->teamSumCount = '%s people in total'; $lang->kanban->cardCount = 'Card Count'; -$lang->kanban->delayed = 'Delayed'; -$lang->kanban->wait = 'Wait'; -$lang->kanban->doing = 'Doing'; -$lang->kanban->suspended = 'Suspended'; -$lang->kanban->closed = 'Closed'; -$lang->kanban->deleted = 'Deleted'; $lang->kanban->createColumnOnLeft = 'Create Column On Left'; $lang->kanban->createColumnOnRight = 'Create Column On Right'; diff --git a/module/kanban/lang/zh-cn.php b/module/kanban/lang/zh-cn.php index fea6dbb289..9c13c56213 100644 --- a/module/kanban/lang/zh-cn.php +++ b/module/kanban/lang/zh-cn.php @@ -87,12 +87,6 @@ $lang->kanban->closedDate = '关闭日期'; $lang->kanban->empty = '暂时没有看板'; $lang->kanban->teamSumCount = '共%s人'; $lang->kanban->cardCount = '卡片数量'; -$lang->kanban->delayed = '已延期'; -$lang->kanban->wait = '未开始'; -$lang->kanban->doing = '进行中'; -$lang->kanban->suspended = '已挂起'; -$lang->kanban->closed = '已关闭'; -$lang->kanban->deleted = '已删除'; $lang->kanban->createColumnOnLeft = '在左侧添加看板列'; $lang->kanban->createColumnOnRight = '在右侧添加看板列'; diff --git a/module/kanban/model.php b/module/kanban/model.php index cd190fcf9d..da177125ed 100644 --- a/module/kanban/model.php +++ b/module/kanban/model.php @@ -950,7 +950,7 @@ class kanbanModel extends model foreach($this->config->kanban->fromType as $fromType) { - $cards = $this->getImportCards($kanbanID, $cards, $fromType); + $cards = $this->getImportedCards($kanbanID, $cards, $fromType); } $cellList = $this->dao->select('*')->from(TABLE_KANBANCELL) @@ -993,15 +993,15 @@ class kanbanModel extends model } /** - * Get import cards. + * Get imported cards. * * @param int $kanbanID * @param object $cards * @param string $fromType * @access public - * @return void + * @return array */ - public function getImportCards($kanbanID, $cards, $fromType) + public function getImportedCards($kanbanID, $cards, $fromType) { $objectCards = $this->dao->select('*')->from(TABLE_KANBANCARD) ->where('deleted')->eq(0) diff --git a/module/kanban/view/view.html.php b/module/kanban/view/view.html.php index c7ed469b92..a63744238e 100644 --- a/module/kanban/view/view.html.php +++ b/module/kanban/view/view.html.php @@ -14,6 +14,7 @@ loadLang('execution'); $laneCount = 0; foreach($regions as $region) $laneCount += $region->laneCount; @@ -23,6 +24,7 @@ js::set('kanbanLang', $lang->kanban); js::set('kanbanlaneLang', $lang->kanbanlane); js::set('kanbancolumnLang', $lang->kanbancolumn); js::set('kanbancardLang', $lang->kanbancard); +js::set('executionLang', $lang->execution); js::set('kanbanID', $kanban->id); js::set('laneCount', $laneCount); js::set('userList', $userList); From 7570801b1d0cc8e8f086b5b9dd8ce982539a55c1 Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Mon, 24 Jan 2022 14:34:05 +0800 Subject: [PATCH 25/28] * Modify the review code. --- module/kanban/config.php | 7 +++++-- module/kanban/css/common.css | 1 + module/kanban/js/view.js | 4 ++-- module/kanban/model.php | 16 +++++++++------- module/kanban/view/importbuild.html.php | 5 ++--- module/kanban/view/importcard.html.php | 5 ++--- module/kanban/view/importexecution.html.php | 5 ++--- module/kanban/view/importplan.html.php | 5 ++--- module/kanban/view/importrelease.html.php | 5 ++--- 9 files changed, 27 insertions(+), 26 deletions(-) diff --git a/module/kanban/config.php b/module/kanban/config.php index c965974382..ec8794819b 100644 --- a/module/kanban/config.php +++ b/module/kanban/config.php @@ -44,8 +44,11 @@ $config->kanban->editor->close = array('id' => 'comment', 'tools' => 'simp $config->kanban->editor->editcard = array('id' => 'desc', 'tools' => 'simpleTools'); $config->kanban->editor->viewcard = array('id' => 'comment', 'tools' => 'simpleTools'); -$config->kanban->fromType = array('execution', 'productplan', 'release', 'build'); -$config->kanban->executionField = array('name', 'status', 'end', 'PM', 'type', 'deleted'); +$config->kanban->fromType = array('execution', 'productplan', 'release', 'build'); +$config->kanban->executionField = array('name', 'status', 'end', 'PM', 'type', 'deleted'); +$config->kanban->productplanField = array(); +$config->kanban->releaseField = array(); +$config->kanban->buildField = array(); $config->kanban->default = new stdclass(); $config->kanban->default->story = new stdclass(); diff --git a/module/kanban/css/common.css b/module/kanban/css/common.css index b957733002..0196d3fe8e 100644 --- a/module/kanban/css/common.css +++ b/module/kanban/css/common.css @@ -1,3 +1,4 @@ .color-picker-item {width: 20px; height: 20px; margin-right: 10px; border-radius: 50% 50%; float: left; cursor: pointer; text-align: center; line-height: 20px;} .color-picker-item > .icon {color: #fff; display: none} .checked > .icon {display: inline-block;} +.p-10px {padding: 10px} diff --git a/module/kanban/js/view.js b/module/kanban/js/view.js index d9d6a4b307..a51e3c54c3 100644 --- a/module/kanban/js/view.js +++ b/module/kanban/js/view.js @@ -145,7 +145,7 @@ function renderHeaderCol($column, column, $header, kanbanData) if(columnPrivs.includes('createCard') && column.parent != -1) { - var cardUrl = createLink('kanban', 'importplan', 'kanbanID=' + kanbanID + '®ionID=' + regionID + '&groupID=' + groupID + '&columnID=' + columnID); + var cardUrl = createLink('kanban', 'importcard', 'kanbanID=' + kanbanID + '®ionID=' + regionID + '&groupID=' + groupID + '&columnID=' + columnID); addItemBtn = ['', '', ''].join(''); } @@ -437,7 +437,7 @@ function renderExecutionItem(item, $item) /* Display avatars of PM. */ var $user = $info.children('.user'); - var user = [item.PM]; + var user = [item.PM]; if(!$user.length) $user = $('
    ').appendTo($info); $user.html(renderUsersAvatar(user, item.id)).attr('title', item.PM); diff --git a/module/kanban/model.php b/module/kanban/model.php index da177125ed..890287199e 100644 --- a/module/kanban/model.php +++ b/module/kanban/model.php @@ -2114,24 +2114,25 @@ class kanbanModel extends model * * @param string $type * @param int|array $removeCardID - * @param array $cardsKanban + * @param array $kanbanList * @access public * @return void */ - public function removeKanbanCell($type, $removeCardID, $cardsKanban) + public function removeKanbanCell($type, $removeCardID, $kanbanList) { $removeIDList = is_array($removeCardID) ? $removeCardID : array($removeCardID); foreach($removeIDList as $cardID) { if(empty($cardID)) continue; - $this->dbh->query("UPDATE " . TABLE_KANBANCELL. " SET `cards` = REPLACE(cards, ',$cardID,', ',') WHERE `type` = '$type' AND `kanban` = {$cardsKanban[$cardID]}"); + $this->dbh->query("UPDATE " . TABLE_KANBANCELL. " SET `cards` = REPLACE(cards, ',$cardID,', ',') WHERE `type` = '$type' AND `kanban` = {$kanbanList[$cardID]}"); } $this->dao->update(TABLE_KANBANCELL) ->set('cards')->eq('') ->where('cards')->eq(',') ->andWhere('type')->eq($type) + ->andWhere('kanban')->in($kanbanList) ->exec(); } @@ -3132,19 +3133,20 @@ class kanbanModel extends model /** * Get imported cards. * - * @param int $objectID - * @param int $excluded + * @param int $kanbanID + * @param int $excludedID * @param obj $pager * @access public * @return array */ - public function getImportedCards($kanbanID = 0, $excluded = 0, $pager = null) + public function getImportedCards($kanbanID = 0, $excludedID = 0, $pager = null) { return $this->dao->select('*')->from(TABLE_KANBANCARD) ->where('deleted')->eq(0) ->andWhere('archived')->eq(0) + ->andWhere('fromID')->eq(0) ->beginIF($kanbanID)->andWhere('kanban')->eq($kanbanID)->fi() - ->beginIF($excluded)->andWhere('kanban')->ne($excluded)->fi() + ->beginIF($excludedID)->andWhere('kanban')->ne($excludedID)->fi() ->orderBy('order') ->page($pager) ->fetchAll('id'); diff --git a/module/kanban/view/importbuild.html.php b/module/kanban/view/importbuild.html.php index 92a4c0237c..e7b87553e5 100644 --- a/module/kanban/view/importbuild.html.php +++ b/module/kanban/view/importbuild.html.php @@ -11,7 +11,6 @@ */ ?> - @@ -23,11 +22,11 @@

    kanban->importBuild;?>

    -
    +

    kanban->selectedProject;?>

    -
    +

    kanban->selectedLane;?>

    diff --git a/module/kanban/view/importcard.html.php b/module/kanban/view/importcard.html.php index ebb099cc2b..a03b318ed2 100644 --- a/module/kanban/view/importcard.html.php +++ b/module/kanban/view/importcard.html.php @@ -11,7 +11,6 @@ */ ?> - @@ -23,11 +22,11 @@

    kanban->importCard;?>

    -
    +

    kanban->selectedKanban;?>

    -
    +

    kanban->selectedLane;?>

    diff --git a/module/kanban/view/importexecution.html.php b/module/kanban/view/importexecution.html.php index 519928107b..2f91218aca 100644 --- a/module/kanban/view/importexecution.html.php +++ b/module/kanban/view/importexecution.html.php @@ -11,7 +11,6 @@ */ ?> - @@ -23,11 +22,11 @@

    kanban->importExecution;?>

    -
    +

    kanban->selectedProject;?>

    -
    +

    kanban->selectedLane;?>

    diff --git a/module/kanban/view/importplan.html.php b/module/kanban/view/importplan.html.php index b6ef413fa7..3953c8d375 100644 --- a/module/kanban/view/importplan.html.php +++ b/module/kanban/view/importplan.html.php @@ -11,7 +11,6 @@ */ ?> - @@ -23,11 +22,11 @@

    kanban->importPlan;?>

    -
    +

    kanban->selectedProduct;?>

    -
    +

    kanban->selectedLane;?>

    diff --git a/module/kanban/view/importrelease.html.php b/module/kanban/view/importrelease.html.php index e2c51ccc71..3de12c8aaa 100644 --- a/module/kanban/view/importrelease.html.php +++ b/module/kanban/view/importrelease.html.php @@ -11,7 +11,6 @@ */ ?> - @@ -23,11 +22,11 @@

    kanban->importRelease;?>

    -
    +

    kanban->selectedProduct;?>

    -
    +

    kanban->selectedLane;?>

    From 41d4d5a13225b1c0648e663bb6770a570b0f0877 Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Mon, 24 Jan 2022 14:38:52 +0800 Subject: [PATCH 26/28] * Modify the duplicate name function. --- module/kanban/control.php | 2 +- module/kanban/model.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/module/kanban/control.php b/module/kanban/control.php index 91d20c6ac3..c181fd3758 100644 --- a/module/kanban/control.php +++ b/module/kanban/control.php @@ -797,7 +797,7 @@ class kanban extends control $this->app->loadClass('pager', $static = true); $pager = new pager($recTotal, $recPerPage, $pageID); - $cards2Imported = $this->kanban->getImportedCards($selectedKanbanID, $kanbanID, $pager); + $cards2Imported = $this->kanban->getCards2Import($selectedKanbanID, $kanbanID, $pager); if($_POST) { diff --git a/module/kanban/model.php b/module/kanban/model.php index 890287199e..36df928d44 100644 --- a/module/kanban/model.php +++ b/module/kanban/model.php @@ -3131,7 +3131,7 @@ class kanbanModel extends model } /** - * Get imported cards. + * Get cards to import. * * @param int $kanbanID * @param int $excludedID @@ -3139,7 +3139,7 @@ class kanbanModel extends model * @access public * @return array */ - public function getImportedCards($kanbanID = 0, $excludedID = 0, $pager = null) + public function getCards2Import($kanbanID = 0, $excludedID = 0, $pager = null) { return $this->dao->select('*')->from(TABLE_KANBANCARD) ->where('deleted')->eq(0) From 78427e12c6c52311a78b9b76343d13b63f657ffb Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Mon, 24 Jan 2022 14:41:36 +0800 Subject: [PATCH 27/28] * Modify date. --- module/kanban/view/importbuild.html.php | 2 +- module/kanban/view/importcard.html.php | 2 +- module/kanban/view/importexecution.html.php | 2 +- module/kanban/view/importplan.html.php | 2 +- module/kanban/view/importrelease.html.php | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/module/kanban/view/importbuild.html.php b/module/kanban/view/importbuild.html.php index e7b87553e5..e148aa7f65 100644 --- a/module/kanban/view/importbuild.html.php +++ b/module/kanban/view/importbuild.html.php @@ -2,7 +2,7 @@ /** * The import build view of kanban module of ZenTaoPMS. * - * @copyright Copyright 2009-2021 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com) + * @copyright Copyright 2009-2022 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com) * @license ZPL (http://zpl.pub/page/zplv12.html) * @author Qiyu Xie * @package kanban diff --git a/module/kanban/view/importcard.html.php b/module/kanban/view/importcard.html.php index a03b318ed2..7b6e79662c 100644 --- a/module/kanban/view/importcard.html.php +++ b/module/kanban/view/importcard.html.php @@ -2,7 +2,7 @@ /** * The import card view of kanban module of ZenTaoPMS. * - * @copyright Copyright 2009-2021 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com) + * @copyright Copyright 2009-2022 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com) * @license ZPL (http://zpl.pub/page/zplv12.html) * @author Qiyu Xie * @package kanban diff --git a/module/kanban/view/importexecution.html.php b/module/kanban/view/importexecution.html.php index 2f91218aca..ca22858247 100644 --- a/module/kanban/view/importexecution.html.php +++ b/module/kanban/view/importexecution.html.php @@ -2,7 +2,7 @@ /** * The import execution view of kanban module of ZenTaoPMS. * - * @copyright Copyright 2009-2021 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com) + * @copyright Copyright 2009-2022 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com) * @license ZPL (http://zpl.pub/page/zplv12.html) * @author Qiyu Xie * @package kanban diff --git a/module/kanban/view/importplan.html.php b/module/kanban/view/importplan.html.php index 3953c8d375..813f86fe58 100644 --- a/module/kanban/view/importplan.html.php +++ b/module/kanban/view/importplan.html.php @@ -2,7 +2,7 @@ /** * The import plan view of kanban module of ZenTaoPMS. * - * @copyright Copyright 2009-2021 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com) + * @copyright Copyright 2009-2022 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com) * @license ZPL (http://zpl.pub/page/zplv12.html) * @author Qiyu Xie * @package kanban diff --git a/module/kanban/view/importrelease.html.php b/module/kanban/view/importrelease.html.php index 3de12c8aaa..e9bf78dfac 100644 --- a/module/kanban/view/importrelease.html.php +++ b/module/kanban/view/importrelease.html.php @@ -2,7 +2,7 @@ /** * The import release view of kanban module of ZenTaoPMS. * - * @copyright Copyright 2009-2021 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com) + * @copyright Copyright 2009-2022 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com) * @license ZPL (http://zpl.pub/page/zplv12.html) * @author Qiyu Xie * @package kanban From dfa075beb73e434f9b80252fb4ee66176c92e1a0 Mon Sep 17 00:00:00 2001 From: tianshujie Date: Mon, 24 Jan 2022 15:16:29 +0800 Subject: [PATCH 28/28] * Edit view link. --- module/kanban/js/view.js | 2 +- module/kanban/model.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/module/kanban/js/view.js b/module/kanban/js/view.js index a51e3c54c3..e896f196f9 100644 --- a/module/kanban/js/view.js +++ b/module/kanban/js/view.js @@ -389,7 +389,7 @@ function renderExecutionItem(item, $item) var $title = $titleBox.children('.title'); if(!$title.length) { - var viewMethod = item.execType == 'kanban' ? 'kanban' : 'task'; + var viewMethod = item.execType == 'kanban' ? 'kanban' : 'view'; if(privs.includes('viewExecution') && item.deleted == '0') $title = $('' + item.name + '').appendTo($titleBox).attr('href', createLink('execution', viewMethod, 'executionID=' + item.fromID)); if(!privs.includes('viewExecution') || item.deleted == '1') $title = $('' + item.name + '').appendTo($titleBox); } diff --git a/module/kanban/model.php b/module/kanban/model.php index 36df928d44..f2f91bed17 100644 --- a/module/kanban/model.php +++ b/module/kanban/model.php @@ -978,7 +978,7 @@ class kanbanModel extends model if($card->fromType == 'execution') { if($card->execType == 'kanban' and common::hasPriv('execution', 'kanban')) $card->actions[] = $action; - if($card->execType != 'kanban' and common::hasPriv('execution', 'task')) $card->actions[] = $action; + if($card->execType != 'kanban' and common::hasPriv('execution', 'view')) $card->actions[] = $action; } continue; }
    comment;?>comment;?>
    + kanban->closeSpace);?>
    - fetch('my', 'buildContactLists');?>
    team, "class='form-control chosen' multiple data-drop_direction='down'");?> - fetch('my', 'buildContactLists');?>