diff --git a/module/execution/control.php b/module/execution/control.php index dd82569951..2c228fe1ba 100644 --- a/module/execution/control.php +++ b/module/execution/control.php @@ -2115,8 +2115,10 @@ class execution extends control $this->loadModel('story'); if(empty($groupBy)) $groupBy = 'default'; + /* Set Session. */ $this->session->set('execLaneType', $browseType); + $this->session->set('execGroupBy', $groupBy); $this->session->set('storyList', $this->app->getURI(true), 'execution'); $this->lang->execution->menu = new stdclass(); @@ -2853,8 +2855,10 @@ class execution extends control { if($this->app->tab == 'execution' and $object->type == 'kanban') { - $kanbanData = $this->loadModel('kanban')->getRDKanban($objectID, $this->session->execLaneType ? $this->session->execLaneType : 'all'); - $kanbanData = json_encode($kanbanData); + $execLaneType = $this->session->execLaneType ? $this->session->execLaneType : 'all'; + $execGroupBy = $this->session->execGroupBy ? $this->session->execGroupBy : 'default'; + $kanbanData = $this->loadModel('kanban')->getRDKanban($objectID, $execLaneType, 'id_desc', 0, $execGroupBy); + $kanbanData = json_encode($kanbanData); return print(js::closeModal('parent', '', "parent.updateKanban($kanbanData)")); } @@ -3656,10 +3660,11 @@ class execution extends control * @param int $productID * @param string $fromMethod * @param string $extra + * @param string $param * @access public * @return void */ - public function importPlanStories($executionID, $planID, $productID = 0, $fromMethod = 'story', $extra = '') + public function importPlanStories($executionID, $planID, $productID = 0, $fromMethod = 'story', $extra = '', $param = '') { $planStories = $planProducts = array(); $planStory = $this->loadModel('story')->getPlanStories($planID); @@ -3687,7 +3692,8 @@ class execution extends control } $moduleName = 'execution'; - $param = "executionID=$executionID"; + if(empty($param)) $param = "executionID=$executionID"; + if(!empty($param)) $param = str_replace(array(',', ' '), array('&', ''), $param); if($execution->type == 'project') { $moduleName = 'projectstory'; @@ -3700,7 +3706,8 @@ class execution extends control $lang->executionCommon = $lang->execution->kanban; include $this->app->getModulePath('', 'execution') . 'lang/' . $this->app->getClientLang() . '.php'; } - if($count != 0) echo js::alert(sprintf($this->lang->execution->haveDraft, $count)) . js::locate($this->createLink($moduleName, in_array($execution->type, array('sprint','project')) ? 'story' : 'kanban', $param)); + + if($count != 0) echo js::alert(sprintf($this->lang->execution->haveDraft, $count)) . js::locate($this->createLink($moduleName, $fromMethod, $param)); return print(js::locate(helper::createLink($moduleName, $fromMethod, $param))); } diff --git a/module/execution/js/kanban.js b/module/execution/js/kanban.js index d15df83a39..f3cf82656a 100644 --- a/module/execution/js/kanban.js +++ b/module/execution/js/kanban.js @@ -180,7 +180,7 @@ function changeKanbanScaleSize(newScaleSize) } else { - var kanban = $('#kanban').data('zui.kanban'); + var kanban = $('#kanban' + executionID).data('zui.kanban'); if(!kanban) return; kanban.setOptions({cardsPerRow: newScaleSize, cardHeight: getCardHeight()}); } @@ -272,7 +272,7 @@ function createColumnCreateMenu(options) var col = $col.data('col'); var items = []; var laneID = col.$kanbanData.lanes[0].id ? col.$kanbanData.lanes[0].id : 0; - var regionID = col.$kanbanData.region; + var regionID = col.$kanbanData.region == undefined ? 0 : col.$kanbanData.region; if(col.type == 'backlog') { @@ -690,8 +690,6 @@ function renderCount($count, count, column) */ function renderHeaderCol($column, column, $header, kanbanData) { - if(groupBy != 'default') return; - /* Render group header. */ var privs = kanbanData.actions; var columnPrivs = kanbanData.columns[0].actions; @@ -703,7 +701,7 @@ function renderHeaderCol($column, column, $header, kanbanData) $actions = $column.children('.actions'); } - if(privs.includes('sortGroup')) + if(groupBy == 'default' && privs.includes('sortGroup')) { var groups = regions[column.region].groups; if($header.closest('.kanban').data('zui.kanban')) @@ -784,7 +782,8 @@ function updateRegion(regionID, regionData = []) if(!$region.length) return false; if(!regionData) regionData = regions[regionID]; - $region.data('zui.kanban').render(regionData.groups); + var data = groupBy == 'default' ? regionData.groups : regionData; + $region.data('zui.kanban').render(data); resetRegionHeight('open'); return true; } @@ -1053,7 +1052,7 @@ function updateKanban(kanbanData, regionID = 0) setTimeout(function() { $.zui.closeModal(); - if(regionID) + if(regionID && groupBy == 'default') { updateRegion(regionID, kanbanData[regionID]); } @@ -1062,7 +1061,8 @@ function updateKanban(kanbanData, regionID = 0) $('#kanban').children('.region').children("div[id^='kanban']").each(function() { var regionID = $(this).attr('data-id'); - updateRegion(regionID, kanbanData[regionID]); + var data = groupBy == 'default' ? kanbanData[regionID] : kanbanData[groupBy] + updateRegion(regionID, data); }); } }, 200); @@ -1317,8 +1317,9 @@ $(function() var planID = $('#plan').val(); if(planID) { - var vars = $('.linkStoryByPlanButton').data('lane') != null ? '&extra=laneID='+ $('.linkStoryByPlanButton').data('lane') + ',columnID=' + $('.linkStoryByPlanButton').data('col') : ''; - location.href = createLink('execution', 'importPlanStories', 'executionID=' + executionID + '&planID=' + planID + '&productID=0&fromMethod=kanban' + vars); + var vars = $('.linkStoryByPlanButton').data('lane') != null ? '&extra=laneID='+ $('.linkStoryByPlanButton').data('lane') + ',columnID=' + $('.linkStoryByPlanButton').data('col') : ''; + var param = "¶m=executionID=" + executionID + ",browseType=" + browseType + ",orderBy=id_asc,groupBy=" + groupBy; + location.href = createLink('execution', 'importPlanStories', 'executionID=' + executionID + '&planID=' + planID + '&productID=0&fromMethod=kanban' + vars + param); $.closeModal(); } }); diff --git a/module/execution/js/taskkanban.js b/module/execution/js/taskkanban.js index e952b470f0..5d8211a1a6 100644 --- a/module/execution/js/taskkanban.js +++ b/module/execution/js/taskkanban.js @@ -1141,7 +1141,8 @@ $(function() var planID = $('#plan').val(); if(planID) { - location.href = createLink('execution', 'importPlanStories', 'executionID=' + executionID + '&planID=' + planID + '&productID=0&fromMethod=kanban'); + var param = "¶m=executionID=" + executionID + ",browseType=" + browseType + ",orderBy=id_asc,groupBy=" + groupBy; + location.href = createLink('execution', 'importPlanStories', 'executionID=' + executionID + '&planID=' + planID + '&productID=0&fromMethod=taskKanban&extra=' + param); } }); diff --git a/module/execution/view/kanban.html.php b/module/execution/view/kanban.html.php index ec45f38420..dc1becccfa 100644 --- a/module/execution/view/kanban.html.php +++ b/module/execution/view/kanban.html.php @@ -232,8 +232,12 @@ js::set('hasTaskButton', $hasTaskButton);
-
-
+
+
+
+
+
+
diff --git a/module/kanban/control.php b/module/kanban/control.php index 782af7f301..da91c5fb76 100644 --- a/module/kanban/control.php +++ b/module/kanban/control.php @@ -1508,9 +1508,11 @@ class kanban extends control if($from == 'RDKanban') { if(dao::isError()) return $this->sendError(dao::getError()); - $regionID = $column->region; - $kanbanData = $this->loadModel('kanban')->getRDKanban($executionID, $this->session->execLaneType ? $this->session->execLaneType : 'all', 'id_desc', $regionID); - $kanbanData = json_encode($kanbanData); + $regionID = $column->region; + $execLaneType = $this->session->execLaneType ? $this->session->execLaneType : 'all'; + $execGroupBy = $this->session->execGroupBy ? $this->session->execGroupBy : 'default'; + $kanbanData = $this->loadModel('kanban')->getRDKanban($executionID, $execLaneType, 'id_desc', $regionID, $execGroupBy); + $kanbanData = json_encode($kanbanData); return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'closeModal' => true, 'callback' => "parent.updateKanban($kanbanData, $regionID)")); } @@ -1589,9 +1591,11 @@ class kanban extends control if($from == 'RDKanban') { if(dao::isError()) return $this->sendError(dao::getError()); - $regionID = $column->region; - $kanbanData = $this->loadModel('kanban')->getRDKanban($executionID, $this->session->execLaneType ? $this->session->execLaneType : 'all', 'id_desc', $regionID); - $kanbanData = json_encode($kanbanData); + $regionID = $column->region; + $execLaneType = $this->session->execLaneType ? $this->session->execLaneType : 'all'; + $execGroupBy = $this->session->execGroupBy ? $this->session->execGroupBy : 'default'; + $kanbanData = $this->loadModel('kanban')->getRDKanban($executionID, $execLaneType, 'id_desc', $regionID, $execGroupBy); + $kanbanData = json_encode($kanbanData); return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'closeModal' => true, 'callback' => "parent.updateKanban($kanbanData, $regionID)")); } diff --git a/module/kanban/model.php b/module/kanban/model.php index 6ab2b71c5c..e28cbb4dfc 100644 --- a/module/kanban/model.php +++ b/module/kanban/model.php @@ -1454,13 +1454,21 @@ class kanbanModel extends model $lanes = $this->getLanes4Group($executionID, $browseType, $groupBy, $cardList); if(empty($lanes)) return array(); - $columns = $this->dao->select('t1.*, t2.`type` as columnType, t2.limit, t2.name as columnName, t2.color')->from(TABLE_KANBANCELL)->alias('t1') + $columns = $this->dao->select('t1.*, GROUP_CONCAT(t1.cards) as cards, t2.`type` as columnType, t2.limit, t2.name as columnName, t2.color')->from(TABLE_KANBANCELL)->alias('t1') ->leftJoin(TABLE_KANBANCOLUMN)->alias('t2')->on('t1.`column` = t2.id') + ->leftJoin(TABLE_KANBANLANE)->alias('t3')->on('t2.group = t3.group') + ->leftJoin(TABLE_KANBANREGION)->alias('t4')->on('t1.kanban = t4.kanban') ->where('t1.kanban')->eq($executionID) ->andWhere('t1.`type`')->eq($browseType) + ->andWhere('t3.deleted')->eq(0) + ->andWhere('t4.deleted')->eq(0) + ->groupBy('columnType') + ->orderBy('column_asc') ->fetchAll('columnType'); $cardGroup = array(); + $actions = array('setColumn', 'setWIP'); + foreach($columns as $column) { if(empty($column->cards)) continue; @@ -1492,6 +1500,14 @@ class kanbanModel extends model if(in_array($column->columnType, array('testing', 'tested'))) $parentColumn = 'test'; if(in_array($column->columnType, array('fixing', 'fixed'))) $parentColumn = 'resolving'; + /* Judge column action priv. */ + $column->actions = array(); + foreach($actions as $action) + { + if($this->isClickable($column, $action)) $column->actions[] = $action; + } + + $columnData[$column->column]['id'] = $column->column; $columnData[$column->column]['type'] = $column->columnType; $columnData[$column->column]['name'] = $column->columnName; @@ -1500,6 +1516,7 @@ class kanbanModel extends model $columnData[$column->column]['laneType'] = $browseType; $columnData[$column->column]['asParent'] = in_array($column->columnType, array('develop', 'test', 'resolving')) ? true : false; $columnData[$column->column]['parentType'] = $parentColumn; + $columnData[$column->column]['actions'] = $column->actions; $cardOrder = 1; $objects = zget($cardGroup, $column->columnType, array()); diff --git a/module/story/control.php b/module/story/control.php index a191e64875..bb5c1ceac5 100644 --- a/module/story/control.php +++ b/module/story/control.php @@ -80,7 +80,7 @@ class story extends control { $this->loadModel('kanban'); $regionPairs = $this->kanban->getRegionPairs($execution->id, 0, 'execution'); - $regionID = isset($output['regionID']) ? $output['regionID'] : key($regionPairs); + $regionID = !empty($output['regionID']) ? $output['regionID'] : key($regionPairs); $lanePairs = $this->kanban->getLanePairsByRegion($regionID, 'story'); $laneID = isset($output['laneID']) ? $output['laneID'] : key($lanePairs); @@ -680,9 +680,9 @@ class story extends control if(isonlybody()) { $execution = $this->execution->getByID($this->session->execution); - if($this->app->tab == 'execution' and $execution->type == 'kanban' and $kanbanGroup == 'default') + if($this->app->tab == 'execution' and $execution->type == 'kanban') { - $kanbanData = $this->loadModel('kanban')->getRDKanban($this->session->execution, $this->session->execLaneType ? $this->session->execLaneType : 'all'); + $kanbanData = $this->loadModel('kanban')->getRDKanban($this->session->execution, $this->session->execLaneType ? $this->session->execLaneType : 'all', 'id_desc', 0, $kanbanGroup); $kanbanData = json_encode($kanbanData); return print(js::closeModal('parent.parent', '', "parent.parent.updateKanban($kanbanData)")); @@ -1052,10 +1052,12 @@ class story extends control if(isonlybody()) { $execution = $this->execution->getByID($this->session->execution); - if($this->app->tab == 'execution' and $execution->type == 'kanban' and $this->app->tab == 'execution') + if($this->app->tab == 'execution' and $execution->type == 'kanban') { - $kanbanData = $this->loadModel('kanban')->getRDKanban($this->session->execution, $this->session->execLaneType ? $this->session->execLaneType : 'all'); - $kanbanData = json_encode($kanbanData); + $execLaneType = $this->session->execLaneType ? $this->session->execLaneType : 'all'; + $execGroupBy = $this->session->execGroupBy ? $this->session->execGroupBy : 'default'; + $kanbanData = $this->loadModel('kanban')->getRDKanban($this->session->execution, $execLaneType, 'id_desc', 0, $execGroupBy); + $kanbanData = json_encode($kanbanData); return print(js::closeModal('parent.parent', '', "parent.parent.updateKanban($kanbanData)")); } @@ -1358,8 +1360,10 @@ class story extends control if($this->app->tab == 'execution' and $execution->type == 'kanban') { $this->loadModel('kanban')->updateLane($this->session->execution, 'story', $storyID); - $kanbanData = $this->kanban->getRDKanban($this->session->execution, $this->session->execLaneType ? $this->session->execLaneType : 'all'); - $kanbanData = json_encode($kanbanData); + $execLaneType = $this->session->execLaneType ? $this->session->execLaneType : 'all'; + $execGroupBy = $this->session->execGroupBy ? $this->session->execGroupBy : 'default'; + $kanbanData = $this->loadModel('kanban')->getRDKanban($this->session->execution, $execLaneType, 'id_desc', 0, $execGroupBy); + $kanbanData = json_encode($kanbanData); return print(js::closeModal('parent.parent', '', "parent.parent.updateKanban($kanbanData)")); } @@ -1707,10 +1711,11 @@ class story extends control if(isonlybody()) { $execution = $this->execution->getByID($this->session->execution); - if($this->app->tab == 'execution' and $execution->type == 'kanban' and $kanbanGroup == 'default') + if($this->app->tab == 'execution' and $execution->type == 'kanban') { - $kanbanData = $this->loadModel('kanban')->getRDKanban($this->session->execution, $this->session->execLaneType ? $this->session->execLaneType : 'all'); - $kanbanData = json_encode($kanbanData); + $execLaneType = $this->session->execLaneType ? $this->session->execLaneType : 'all'; + $kanbanData = $this->loadModel('kanban')->getRDKanban($this->session->execution, $execLaneType, 'id_desc', 0, $kanbanGroup); + $kanbanData = json_encode($kanbanData); return print(js::closeModal('parent.parent', '', "parent.parent.updateKanban($kanbanData)")); }