From bc9f51c63de83ecf183ad36f683ad4ed9eefba23 Mon Sep 17 00:00:00 2001 From: liumengyi Date: Mon, 24 Jan 2022 10:36:33 +0800 Subject: [PATCH] * Finish task #47973. --- module/kanban/control.php | 25 +++++++++++++++++++++- module/kanban/js/view.js | 45 +++++++++++++++++++++++++++++++-------- module/kanban/model.php | 4 +++- 3 files changed, 63 insertions(+), 11 deletions(-) diff --git a/module/kanban/control.php b/module/kanban/control.php index e2f7b7c668..b7476c5c1d 100644 --- a/module/kanban/control.php +++ b/module/kanban/control.php @@ -466,7 +466,7 @@ class kanban extends control * @param int $regionID * @param string $lanes * @access public - * @return void + * @return array */ public function sortLane($regionID, $lanes = '') { @@ -483,6 +483,29 @@ class kanban extends control return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess)); } + /** + * Sort columns. + * + * @param int $regionID + * @param int $kanbanID + * @param string $columns + * @access public + * @return array|string + */ + public function sortColumn($regionID, $kanbanID, $columns = '') + { + if(empty($columns)) return; + $columns = explode(',', trim($columns, ',')); + + $order = 1; + foreach($columns as $columnID) $this->dao->update(TABLE_KANBANCOLUMN)->set('`order`')->eq($order++)->where('id')->eq($columnID)->andWhere('region')->eq($regionID)->exec(); + + $kanbanGroup = $this->kanban->getKanbanData($kanbanID); + + if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError())); + return print(json_encode($kanbanGroup)); + } + /** * Set lane height. * diff --git a/module/kanban/js/view.js b/module/kanban/js/view.js index 11d1949bf1..e8ed43b20a 100644 --- a/module/kanban/js/view.js +++ b/module/kanban/js/view.js @@ -111,7 +111,7 @@ function renderHeaderCol($column, column, $header, kanbanData) { /* Render group header. */ var privs = kanbanData.actions; - var columnPrivs = kanbanData.columns[0].actions; + var columnPrivs = $column.data().col.actions; if(privs.includes('sortGroup')) { @@ -151,6 +151,16 @@ function renderHeaderCol($column, column, $header, kanbanData) $actions.html(addItemBtn + moreAction); } + if(columnPrivs.includes('sortColumn')){ + if($column.hasClass('kanban-header-parent-col')) + { + $column.children('.kanban-header-col').addClass('sort'); + } + else + { + $column.addClass('sort'); + } + } } /** @@ -1017,8 +1027,8 @@ $(function() var $cards = null; $('#kanban').sortable( { - selector: '.region, .kanban-board, .kanban-lane, .kanban-item.sort', - trigger: '.region.sort > .region-header, .kanban-board.sort > .kanban-header > .kanban-group-header, .kanban-lane.sort > .kanban-lane-name, .kanban-item.sort', + selector: '.region, .kanban-board, .kanban-lane, .kanban-item.sort, .kanban-col', + trigger: '.region.sort > .region-header, .kanban-board.sort > .kanban-header > .kanban-group-header, .kanban-lane.sort > .kanban-lane-name, .kanban-item.sort, .kanban-col.sort', container: function($ele) { return $ele.parent(); @@ -1048,6 +1058,13 @@ $(function() return $ele.parent().children('.kanban-lane'); } + /* Sort columns. */ + if($ele.hasClass('kanban-col')) + { + sortType = 'column'; + return $ele.parent().children('.kanban-col'); + } + /* Sort cards. */ if($ele.hasClass('kanban-item')) { @@ -1078,8 +1095,9 @@ $(function() }, finish: function(e) { - var url = ''; - var orders = []; + var url = ''; + var orders = []; + var regionID = ''; e.list.each(function(index, data) { orders.push(data.item.data('id')); @@ -1100,13 +1118,18 @@ $(function() } if(sortType == 'board') { - var region = e.element.parent().data('id'); - url = createLink('kanban', 'sortGroup', 'region=' + region + '&groups=' + orders.join(',')); + regionID = e.element.closest('.region').data('id'); + url = createLink('kanban', 'sortGroup', 'region=' + regionID + '&groups=' + orders.join(',')); } if(sortType == 'lane') { - var region = e.element.parent().parent().data('id'); - url = createLink('kanban', 'sortLane', 'region=' + region + '&lanes=' + orders.join(',')); + regionID = e.element.closest('.region').data('id'); + url = createLink('kanban', 'sortLane', 'region=' + regionID + '&lanes=' + orders.join(',')); + } + if(sortType == 'column') + { + regionID = e.element.closest('.region').data('id'); + url = createLink('kanban', 'sortColumn', 'region=' + regionID + '&kanbanID=' + kanban.id + '&columns=' + orders.join(',')); } if(sortType == 'card') { @@ -1123,6 +1146,10 @@ $(function() bootbox.alert(response.message); setTimeout(function(){return location.reload()}, 3000); } + else if (sortType == 'column') + { + updateRegion(regionID, response[regionID]); + } }); }, always: function(e) diff --git a/module/kanban/model.php b/module/kanban/model.php index 2a042c1969..7c45c1c966 100644 --- a/module/kanban/model.php +++ b/module/kanban/model.php @@ -879,7 +879,7 @@ class kanbanModel extends model ->orderBy($order) ->fetchGroup('group'); - $actions = array('createColumn', 'setColumn', 'setWIP', 'archiveColumn', 'restoreColumn', 'deleteColumn', 'createCard', 'batchCreateCard', 'splitColumn'); + $actions = array('createColumn', 'setColumn', 'setWIP', 'archiveColumn', 'restoreColumn', 'deleteColumn', 'createCard', 'batchCreateCard', 'splitColumn', 'sortColumn'); /* Group by parent. */ $parentColumnGroup = array(); @@ -3168,6 +3168,8 @@ class kanbanModel extends model ->fetch('count'); return $count > 1; + case 'sortColumn' : + if($object->deleted != '0') return false; } return true;