diff --git a/module/group/lang/resource.php b/module/group/lang/resource.php index e0480fe097..a7139c214b 100644 --- a/module/group/lang/resource.php +++ b/module/group/lang/resource.php @@ -674,7 +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->import = 'import'; +$lang->resource->kanban->batchCreateCard = 'batchCreateCard'; $lang->kanban->methodOrder[5] = 'space'; $lang->kanban->methodOrder[10] = 'createSpace'; @@ -720,6 +720,7 @@ $lang->kanban->methodorder[200] = 'viewArchivedCard'; $lang->kanban->methodorder[205] = 'archiveColumn'; $lang->kanban->methodorder[210] = 'restoreCard'; $lang->kanban->methodorder[215] = 'setLaneHeight'; +$lang->kanban->methodOrder[220] = 'batchCreateCard'; $lang->kanban->methodorder[220] = 'import'; /* Execution. */ diff --git a/module/kanban/config.php b/module/kanban/config.php index 8ce2018009..8c8339cdae 100644 --- a/module/kanban/config.php +++ b/module/kanban/config.php @@ -102,3 +102,5 @@ $config->kanban->taskColumnStatusList['closed'] = 'closed'; $config->kanban->laneColorList = array('#7ec5ff', '#333', '#2b529c', '#e48600', '#d2323d', '#229f24', '#777', '#d2691e', '#008b8b', '#2e8b57', '#4169e1', '#4b0082', '#fa8072', '#ba55d3', '#6b8e23'); $config->kanban->columnColorList = array('#333', '#2b519c', '#e48610', '#d2313d', '#2a9f23', '#777', '#d2691e', '#2e8b8b', '#2f8b58', '#4168e0', '#4b0082', '#f58072', '#ba55d3', '#6a8e22'); $config->kanban->cardColorList = array('#fff', '#b10b0b', '#cfa227', '#2a5f29'); + +$config->kanban->batchCreate = 10; diff --git a/module/kanban/control.php b/module/kanban/control.php index 2ad001cfd7..a4b786ba31 100644 --- a/module/kanban/control.php +++ b/module/kanban/control.php @@ -709,6 +709,34 @@ class kanban extends control $this->display(); } + /** + * Batch create cards. + * + * @param int $kanbanID + * @param int $regionID + * @param int $groupID + * @param int $laneID + * @param int $columnID + * @access public + * @return void + */ + public function batchCreateCard($kanbanID = 0, $regionID = 0, $groupID = 0, $laneID = 0, $columnID = 0) + { + $backLink = $this->createLink('kanban', 'view', "kanbanID=$kanbanID"); + + if($_POST) + { + $this->kanban->batchCreateCard($kanbanID, $regionID, $groupID, $columnID); + if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError())); + return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => $backLink)); + } + + $this->view->users = $this->loadModel('user')->getPairs('noclosed|nodeleted'); + $this->view->lanePairs = $this->kanban->getLanePairsByGroup($groupID); + + $this->display(); + } + /** * Edit a card. * diff --git a/module/kanban/js/view.js b/module/kanban/js/view.js index 246d4696c6..891fe151b9 100644 --- a/module/kanban/js/view.js +++ b/module/kanban/js/view.js @@ -142,15 +142,14 @@ function renderHeaderCol($column, column, $header, kanbanData) if(!$column.children('.actions').length) $column.append('
'); var $actions = $column.children('.actions'); - - if(columnPrivs.includes('createCard') && column.parent != -1) + if(column.parent != -1) { - var cardUrl = createLink('kanban', 'createCard', 'kanbanID=' + kanbanID + '®ionID=' + regionID + '&groupID=' + groupID + '&columnID=' + columnID); - addItemBtn = ['', '', ''].join(''); + addItemBtn = ['', '', ''].join(''); } var moreAction = ' '; $actions.html(addItemBtn + moreAction); + } } @@ -768,6 +767,28 @@ function createColumnMenu(options) return items; } +/** + * Create create menu for column. + * + * @param object $options + * @access public + * @return object + */ +function createColumnCreateMenu(options) +{ + var col = options.$trigger.closest('.kanban-col').data('col'); + var privs = col.actions; + var items = []; + var regionID = col.region; + var groupID = col.group; + 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 + '&laneID=' + laneID + '&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%'}}); + return items; +} + /** Calculate column height */ function calcColHeight(col, lane, colCards, colHeight, kanban) { @@ -787,7 +808,8 @@ window.menuCreators = { card: createCardMenu, lane: createLaneMenu, - column: createColumnMenu + column: createColumnMenu, + columnCreate: createColumnCreateMenu }; /** diff --git a/module/kanban/lang/en.php b/module/kanban/lang/en.php index 34b8a9b2fc..6d276eb8df 100644 --- a/module/kanban/lang/en.php +++ b/module/kanban/lang/en.php @@ -57,6 +57,7 @@ $lang->kanban->restoreColumn = 'Restore Column'; $lang->kanban->restoreCard = 'Restore Card'; $lang->kanban->restore = 'Restore'; $lang->kanban->child = 'Child'; +$lang->kanban->batchCreateCard = 'Batchcreate Card'; $lang->kanban->import = 'Import'; $lang->kanban->showClosed = 'Closed'; diff --git a/module/kanban/lang/zh-cn.php b/module/kanban/lang/zh-cn.php index bb5128da88..d7c27514db 100644 --- a/module/kanban/lang/zh-cn.php +++ b/module/kanban/lang/zh-cn.php @@ -57,6 +57,7 @@ $lang->kanban->restoreColumn = '还原看板列'; $lang->kanban->restoreCard = '还原卡片'; $lang->kanban->restore = '还原'; $lang->kanban->child = '子'; +$lang->kanban->batchCreateCard = '批量创建卡片'; $lang->kanban->import = '导入功能'; $lang->kanban->showClosed = '显示已关闭'; diff --git a/module/kanban/model.php b/module/kanban/model.php index 37b386a1e2..a7c5a237a6 100644 --- a/module/kanban/model.php +++ b/module/kanban/model.php @@ -468,6 +468,78 @@ class kanbanModel extends model return false; } + /** + * Batch create kanban cards. + * + * @param int $kanbanID + * @param int $regionID + * @param int $groupID + * @param int $columnID + * @access public + * @return void + */ + public function batchCreateCard($kanbanID, $regionID, $groupID, $columnID) + { + foreach($_POST['name'] as $index => $value) + { + if($_POST['name'][$index] and isset($_POST['assignedTo'][$index])) $_POST['assignedTo'][$index] = implode(',', $_POST['assignedTo'][$index]); + } + $cards = fixer::input('post')->get(); + + $now = helper::now(); + $data = array(); + $lanes = array(); + + foreach($cards->name as $i => $name) + { + if(empty($cards->name[$i])) continue; + $data[$i] = new stdclass(); + $data[$i]->name = trim($cards->name[$i]); + $data[$i]->begin = $cards->begin[$i]; + $data[$i]->end = $cards->end[$i]; + $data[$i]->assignedTo = $cards->assignedTo[$i]; + $data[$i]->desc = nl2br($cards->desc[$i]); + $data[$i]->pri = $cards->pri[$i]; + $data[$i]->kanban = $kanbanID; + $data[$i]->region = $regionID; + $data[$i]->group = $groupID; + $data[$i]->createdBy = $this->app->user->account; + $data[$i]->createdDate = $now; + $data[$i]->assignedDate = $now; + $data[$i]->color = '#fff'; + $data[$i]->estimate = is_numeric($cards->estimate[$i]) ? (float)$cards->estimate[$i] : $cards->estimate[$i]; + + $lanes[$i] = $cards->lane[$i]; + } + + foreach($data as $i => $card) + { + $this->dao->insert(TABLE_KANBANCARD)->data($card)->autoCheck() + ->checkIF($card->estimate != '', 'estimate', 'float') + ->batchCheck($this->config->kanban->createcard->requiredFields, 'notempty') + ->exec(); + + if($card->estimate < 0) + { + dao::$errors[] = $this->lang->kanbancard->error->recordMinus; + return false; + } + if($card->end && $card->begin > $card->end) + { + dao::$errors[] = $this->lang->kanbancard->error->endSmall; + return false; + } + + if(!dao::isError()) + { + $cardID = $this->dao->lastInsertID(); + $lane = $lanes[$i]; + $this->addKanbanCell($kanbanID, $lane, $columnID, 'common', $cardID); + $this->loadModel('action')->create('kanbancard', $cardID, 'created'); + } + } + } + /** * Get kanban by id. * @@ -807,7 +879,7 @@ class kanbanModel extends model ->orderBy($order) ->fetchGroup('group'); - $actions = array('createColumn', 'setColumn', 'setWIP', 'archiveColumn', 'restoreColumn', 'deleteColumn', 'createCard', 'splitColumn'); + $actions = array('createColumn', 'setColumn', 'setWIP', 'archiveColumn', 'restoreColumn', 'deleteColumn', 'createCard', 'batchCreateCard', 'splitColumn'); /* Group by parent. */ $parentColumnGroup = array(); diff --git a/module/kanban/view/batchcreatecard.html.php b/module/kanban/view/batchcreatecard.html.php new file mode 100644 index 0000000000..ad3a37393a --- /dev/null +++ b/module/kanban/view/batchcreatecard.html.php @@ -0,0 +1,68 @@ + + * @package kanban + * @version $Id$ + * @link http://www.zentao.net + */ +?> + +