diff --git a/module/group/lang/resource.php b/module/group/lang/resource.php index e72e4e7126..c28fbfb220 100644 --- a/module/group/lang/resource.php +++ b/module/group/lang/resource.php @@ -670,7 +670,6 @@ $lang->resource->kanban->deleteCard = 'deleteCard'; $lang->resource->kanban->moveCard = 'moveCard'; $lang->resource->kanban->setCardColor = 'setCardColor'; $lang->resource->kanban->laneMove = 'laneMove'; -$lang->resource->kanban->cardsSort = 'cardsSort'; $lang->resource->kanban->viewArchivedColumn = 'viewArchivedColumn'; $lang->resource->kanban->viewArchivedCard = 'viewArchivedCard'; $lang->resource->kanban->restoreCard = 'restoreCard'; @@ -714,12 +713,11 @@ $lang->kanban->methodOrder[170] = 'assigntoCard'; $lang->kanban->methodOrder[175] = 'moveCard'; $lang->kanban->methodOrder[180] = 'setCardColor'; $lang->kanban->methodOrder[185] = 'laneMove'; -$lang->kanban->methodorder[190] = 'cardsSort'; -$lang->kanban->methodOrder[195] = 'viewArchivedColumn'; -$lang->kanban->methodorder[200] = 'viewArchivedCard'; -$lang->kanban->methodorder[205] = 'archiveColumn'; -$lang->kanban->methodorder[210] = 'restoreCard'; -$lang->kanban->methodorder[215] = 'setLaneHeight'; +$lang->kanban->methodOrder[190] = 'viewArchivedColumn'; +$lang->kanban->methodorder[195] = 'viewArchivedCard'; +$lang->kanban->methodorder[200] = 'archiveColumn'; +$lang->kanban->methodorder[205] = 'restoreCard'; +$lang->kanban->methodorder[210] = 'setLaneHeight'; /* Execution. */ $lang->resource->execution = new stdclass(); diff --git a/module/kanban/control.php b/module/kanban/control.php index 89bb9f9c97..fc6f3c8072 100644 --- a/module/kanban/control.php +++ b/module/kanban/control.php @@ -669,12 +669,11 @@ class kanban extends control * @param int $kanbanID * @param int $regionID * @param int $groupID - * @param int $laneID * @param int $columnID * @access public * @return void */ - public function createCard($kanbanID = 0, $regionID = 0, $groupID = 0, $laneID = 0, $columnID = 0) + public function createCard($kanbanID = 0, $regionID = 0, $groupID = 0, $columnID = 0) { if($_POST) { @@ -782,6 +781,26 @@ class kanban extends control die(json_encode($kanbanGroup)); } + /** + * Sort cards. + * + * @param int $kanbanID + * @param int $laneID + * @param int $columnID + * @param string $cards + * @access public + * @return void + */ + public function sortCard($kanbanID, $laneID, $columnID, $cards = '') + { + if(empty($cards)) return; + + $this->dao->update(TABLE_KANBANCELL)->set('cards')->eq(",$cards,")->where('kanban')->eq($kanbanID)->andWhere('lane')->eq($laneID)->andWhere('`column`')->eq($columnID)->exec(); + + if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError())); + return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess)); + } + /** * Archive a card. * diff --git a/module/kanban/js/view.js b/module/kanban/js/view.js index f5d6bf9f11..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', 'createCard', 'kanbanID=' + kanbanID + '®ionID=' + regionID + '&groupID=' + groupID + '&laneID=' + laneID + '&columnID=' + columnID); + var cardUrl = createLink('kanban', 'createCard', 'kanbanID=' + kanbanID + '®ionID=' + regionID + '&groupID=' + groupID + '&columnID=' + columnID); addItemBtn = ['', '', ''].join(''); } @@ -258,6 +258,8 @@ 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(privs.includes('viewCard')) $title = $('').appendTo($item).attr('href', createLink('kanban', 'viewCard', 'cardID=' + item.id, '', true)); @@ -489,7 +491,7 @@ function openAddTaskForm($element) var laneID = $element.closest('.kanban-lane').data('id'); var columnID = $element.closest('.kanban-col').data('id'); var status = $element.closest('.kanban-col').data('type'); - var modalUrl = createLink('kanban', 'createCard', 'kanbanID=' + kanbanID + '®ionID=' + regionID + '&groupID=' + groupID + '&laneID=' + laneID + '&columnID=' + columnID); + var modalUrl = createLink('kanban', 'createCard', 'kanbanID=' + kanbanID + '®ionID=' + regionID + '&groupID=' + groupID + '&columnID=' + columnID); $.zui.modalTrigger.show( { url: modalUrl, @@ -930,29 +932,29 @@ $(function() var $cards = null; $('#kanban').sortable( { - selector: '.region, .kanban-board, .kanban-lane', - trigger: '.region.sort > .region-header, .kanban-board.sort > .kanban-header > .kanban-group-header, .kanban-lane.sort > .kanban-lane-name', + 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', container: function($ele) { return $ele.parent(); }, targetSelector: function($ele) { - /* Sort regions */ + /* Sort regions. */ if($ele.hasClass('region')) { sortType = 'region'; return $ele.parent().children('.region'); } - /* Sort boards */ + /* Sort boards. */ if($ele.hasClass('kanban-board')) { sortType = 'board'; return $ele.parent().children('.kanban-board'); } - /* Sort lanes */ + /* Sort lanes. */ if($ele.hasClass('kanban-lane')) { sortType = 'lane'; @@ -961,10 +963,10 @@ $(function() return $ele.parent().children('.kanban-lane'); } - /* Sort lanes */ + /* Sort cards. */ if($ele.hasClass('kanban-item')) { - sortType = 'item'; + sortType = 'card'; return $ele.parent().children('.kanban-item'); } }, @@ -1015,9 +1017,11 @@ $(function() var region = e.element.parent().parent().data('id'); url = createLink('kanban', 'sortLane', 'region=' + region + '&lanes=' + orders.join(',')); } - if(sortType == 'item') + if(sortType == 'card') { - url = createLink('task', 'sort', 'kanbanID=' + kanbanID + '&tasks=' + orders.join(',')); + var laneID = e.element.closest('.kanban-lane').data('id'); + var columnID = e.element.closest('.kanban-col').data('id'); + url = createLink('kanban', 'sortCard', 'kanbanID=' + kanbanID + '&laneID=' + laneID + '&columnID=' + columnID + '&cards=' + orders.join(',')); } if(!url) return true; diff --git a/module/kanban/model.php b/module/kanban/model.php index aeee70f5ec..92af56ceb0 100644 --- a/module/kanban/model.php +++ b/module/kanban/model.php @@ -460,7 +460,7 @@ class kanbanModel extends model $cardID = $this->dao->lastInsertID(); $this->file->saveUpload('kanbancard', $cardID); $this->file->updateObjectID($this->post->uid, $cardID, 'kanbancard'); - $this->addKanbanCell($kanbanID, $this->post->lane, $columnID, 'common', $cardID); + $this->addKanbanCell($kanbanID, (int)$this->post->lane, $columnID, 'common', $cardID); return $cardID; } @@ -858,27 +858,38 @@ class kanbanModel extends model */ public function getCardGroupByKanban($kanbanID) { - $cards = $this->dao->select('t1.*,t2.kanban,t2.lane,t2.column')->from(TABLE_KANBANCARD)->alias('t1') - ->leftJoin(TABLE_KANBANCELL)->alias('t2')->on('t1.kanban=t2.kanban') + /* Get card data.*/ + $cards = $this->dao->select('*')->from(TABLE_KANBANCARD)->alias('t1') ->where('deleted')->eq(0) - ->andWhere("INSTR(t2.cards, CONCAT(',',t1.id,','))")->gt(0) + ->andWhere('kanban')->eq($kanbanID) ->andWhere('archived')->eq(0) - ->andWhere('t2.kanban')->eq($kanbanID) - ->andWhere('t2.type')->eq('common') - //->orderBy('`order` asc') ->fetchAll('id'); - $actions = array('editCard', 'archiveCard', 'deleteCard', 'moveCard', 'setCardColor', 'viewCard'); - $cardGroup = array(); - foreach($cards as $card) - { - $card->actions = array(); - foreach($actions as $action) - { - if(common::hasPriv('kanban', $action)) $card->actions[] = $action; - } + $cellList = $this->dao->select('*')->from(TABLE_KANBANCELL) + ->where('kanban')->eq($kanbanID) + ->andWhere('type')->eq('common') + ->fetchAll(); - $cardGroup[$card->lane]['column' . $card->column][] = $card; + $actions = array('editCard', 'archiveCard', 'deleteCard', 'moveCard', 'setCardColor', 'viewCard', 'sortCard'); + $cardGroup = array(); + foreach($cellList as $cell) + { + $cardIdList = array_filter(explode(',', $cell->cards)); + + if(empty($cardIdList)) continue; + foreach($cardIdList as $cardID) + { + if(!isset($cards[$cardID])) continue; + + $card = zget($cards, $cardID); + $card->actions = array(); + foreach($actions as $action) + { + if(common::hasPriv('kanban', $action)) $card->actions[] = $action; + } + + $cardGroup[$cell->lane]['column' . $cell->column][] = $card; + } } return $cardGroup;