diff --git a/module/kanban/control.php b/module/kanban/control.php index 0fbe9aa3b8..2e5c19f9ab 100644 --- a/module/kanban/control.php +++ b/module/kanban/control.php @@ -597,6 +597,9 @@ class kanban extends control } else { + $column = $this->kanban->getColumnById($columnID); + if($column->parent) $this->kanban->processCards($column); + $this->kanban->archiveColumn($columnID); if(dao::isError()) die(js::error(dao::getError())); @@ -678,9 +681,9 @@ class kanban extends control else { $column = $this->kanban->getColumnById($columnID); - $this->kanban->delete(TABLE_KANBANCOLUMN, $columnID); + if($column->parent) $this->kanban->processCards($column); - if($column->parent) $this->kanban->processParentColumn($column); + $this->dao->delete()->from(TABLE_KANBANCOLUMN)->where('id')->eq($columnID)->exec(); die(js::reload('parent')); } diff --git a/module/kanban/js/view.js b/module/kanban/js/view.js index ca041f600f..3960a23e13 100644 --- a/module/kanban/js/view.js +++ b/module/kanban/js/view.js @@ -819,8 +819,8 @@ function createColumnMenu(options) items.push({label: kanbanLang.createColumnOnRight, icon: 'col-add-right', url: createLink('kanban', 'createColumn', 'columnID=' + column.id + '&position=right'), className: 'iframe', attrs: {'data-toggle': 'modal'}}); } if(privs.includes('copyColumn')) items.push({label: kanbanLang.copyColumn, icon: 'copy', url: createLink('kanban', 'copyColumn', 'columnID=' + column.id), className: 'iframe', attrs: {'data-toggle': 'modal'}}); - if(privs.includes('archiveColumn') && kanban.archived == '1' && column.$kanbanData.columns.length > 1) items.push({label: kanbanLang.archiveColumn, icon: 'card-archive', url: createLink('kanban', 'archiveColumn', 'columnID=' + column.id), attrs: {'target': 'hiddenwin'}}); - if(privs.includes('deleteColumn') && column.$kanbanData.columns.length > 1) items.push({label: kanbanLang.deleteColumn, icon: 'trash', url: createLink('kanban', 'deleteColumn', 'columnID=' + column.id), attrs: {'target': 'hiddenwin'}}); + if(privs.includes('archiveColumn') && kanban.archived == '1') items.push({label: kanbanLang.archiveColumn, icon: 'card-archive', url: createLink('kanban', 'archiveColumn', 'columnID=' + column.id), attrs: {'target': 'hiddenwin'}}); + if(privs.includes('deleteColumn')) items.push({label: kanbanLang.deleteColumn, icon: 'trash', url: createLink('kanban', 'deleteColumn', 'columnID=' + column.id), attrs: {'target': 'hiddenwin'}}); var bounds = options.$trigger[0].getBoundingClientRect(); items.$options = {x: bounds.right, y: bounds.top}; @@ -844,7 +844,7 @@ function createColumnCreateMenu(options) 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('createCard')) items.push({label: kanbanLang.createCard, url: $.createLink('kanban', 'createCard', 'kanbanID=' + kanbanID + '®ionID=' + regionID + '&groupID=' + groupID + '&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; } diff --git a/module/kanban/lang/zh-cn.php b/module/kanban/lang/zh-cn.php index 4e33e6404e..45563d972d 100644 --- a/module/kanban/lang/zh-cn.php +++ b/module/kanban/lang/zh-cn.php @@ -260,9 +260,9 @@ $lang->kanbancolumn->childName = '子列名称'; $lang->kanbancolumn->childColor = '子状态颜色'; $lang->kanbancolumn->empty = '暂时没有看板列'; -$lang->kanbancolumn->confirmArchive = '您确认归档该列吗?归档列后,该列和列中所有卡片将被隐藏,您可以在区域-已归档中查看已归档的列。'; -$lang->kanbancolumn->confirmDelete = '您确认删除该列吗?删除列后,该列中所有卡片也会被删除。'; -$lang->kanbancolumn->confirmRestore = '您确定要还原该看板列吗?还原看板列后,该看板列和看板列中所有的任务将同时还原到之前的位置。'; +$lang->kanbancolumn->confirmArchive = '您确认归档该列吗?归档列后,该列将被隐藏,列中所有卡片移动到兄弟列或父列,您可以在区域-已归档中查看已归档的列。'; +$lang->kanbancolumn->confirmDelete = '您确认删除该列吗?删除列后,该列中所有卡片会被移动到兄弟列或父列。'; +$lang->kanbancolumn->confirmRestore = '您确定要还原该看板列吗?还原后,该看板列将回到之前的位置。'; $lang->kanbanlane = new stdclass(); $lang->kanbanlane->name = $lang->kanban->laneName; diff --git a/module/kanban/model.php b/module/kanban/model.php index 02a267fadf..a473ee6ac2 100644 --- a/module/kanban/model.php +++ b/module/kanban/model.php @@ -2789,6 +2789,39 @@ class kanbanModel extends model */ public function restoreColumn($columnID) { + $column = $this->getColumnByID($columnID); + + if($column->parent) + { + $parent = $this->getColumnByID($column->parent); + + /* If the parent column is normal now, put its card into child column. */ + if($parent->parent != -1) + { + $parentCells = $this->dao->select('*')->from(TABLE_KANBANCELL) + ->where('`column`')->eq($column->parent) + ->andWhere('type')->eq('common') + ->fetchAll('id'); + + foreach($parentCells as $cell) + { + $this->dao->update(TABLE_KANBANCELL)->set('cards')->eq($cell->cards) + ->where('lane')->eq($cell->lane) + ->andWhere('`column`')->eq($columnID) + ->andWhere('type')->eq('common') + ->exec(); + + $this->dao->update(TABLE_KANBANCELL)->set('cards')->eq('') + ->where('lane')->eq($cell->lane) + ->andWhere('`column`')->eq($cell->column) + ->andWhere('type')->eq('common') + ->exec(); + } + + $this->dao->update(TABLE_KANBANCOLUMN)->set('parent')->eq(-1)->where('id')->eq($column->parent)->exec(); + } + } + $this->dao->update(TABLE_KANBANCOLUMN) ->set('archived')->eq(0) ->where('id')->eq($columnID) @@ -2841,22 +2874,50 @@ class kanbanModel extends model if(!dao::isError()) return common::createChanges($oldCard, $card); } - public function processParentColumn($column) + /** + * Process cards when delete a column. + * + * @param object $column + * @access public + * @return void + */ + public function processCards($column) { $firstColumnID = $this->dao->select('id')->from(TABLE_KANBANCOLUMN) ->where('parent')->eq($column->parent) + ->andWhere('id')->ne($column->id) ->andWhere('deleted')->eq('0') ->andWhere('archived')->eq('0') + ->orderBy('`order` asc') ->fetch('id'); - $extendID = $firstColumnID ? $firstColumnID : $column->parent; + $extendID = $firstColumnID; + if(!$firstColumnID) + { + $extendID = $column->parent; + $this->dao->update(TABLE_KANBANCOLUMN)->set('parent')->eq(0)->where('id')->eq($column->parent)->exec(); + } $cells = $this->dao->select('*')->from(TABLE_KANBANCELL) ->where('`column`')->eq($column->id) + ->andWhere('type')->eq('common') ->fetchAll('id'); foreach($cells as $cell) { + $extendCards = $this->dao->select('cards')->from(TABLE_KANBANCELL) + ->where('lane')->eq($cell->lane) + ->andWhere('`column`')->eq($extendID) + ->andWhere('type')->eq('common') + ->fetch('cards'); + + $extendCards = $extendCards ? $extendCards . ltrim($cell->cards, ',') : $cell->cards; + + $this->dao->update(TABLE_KANBANCELL)->set('cards')->eq($extendCards) + ->where('lane')->eq($cell->lane) + ->andWhere('`column`')->eq($extendID) + ->andWhere('type')->eq('common') + ->exec(); } } @@ -3165,18 +3226,6 @@ class kanbanModel extends model case 'deletecolumn' : if($object->deleted != '0') return false; - if($object->parent > 0) - { - $childrenCount = $this->dao->select('COUNT(id) AS count')->from(TABLE_KANBANCOLUMN) - ->where('parent')->eq($object->parent) - ->andWhere('deleted')->eq('0') - ->andWhere('archived')->eq('0') - ->fetch('count'); - - return $childrenCount > 2; - } - - $count = $this->dao->select('COUNT(id) AS count')->from(TABLE_KANBANCOLUMN) ->where('region')->eq($object->region) ->andWhere('parent')->in('0,-1')