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 + */ +?> + + + + + + +