From 8f0073050f6e2e26236c2a6e7fb803ce58d4d876 Mon Sep 17 00:00:00 2001 From: liumengyi Date: Wed, 22 Jun 2022 15:23:38 +0800 Subject: [PATCH] * Finish task #58288. --- module/group/lang/resource.php | 15 ++---- module/kanban/control.php | 6 +++ module/kanban/css/create.css | 5 ++ module/kanban/css/edit.css | 5 ++ module/kanban/js/create.js | 35 +++++++++++++- module/kanban/js/edit.js | 48 +++++++++++++++++++ module/kanban/js/view.js | 10 ++-- module/kanban/lang/zh-cn.php | 2 +- module/kanban/model.php | 76 ++++++++++++++++++------------ module/kanban/view/create.html.php | 27 +++++++++++ module/kanban/view/edit.html.php | 33 +++++++++++++ 11 files changed, 212 insertions(+), 50 deletions(-) create mode 100644 module/kanban/js/edit.js diff --git a/module/group/lang/resource.php b/module/group/lang/resource.php index 7c00e40205..cc438dad5f 100644 --- a/module/group/lang/resource.php +++ b/module/group/lang/resource.php @@ -628,7 +628,6 @@ $lang->resource->kanban->close = 'close'; $lang->resource->kanban->delete = 'delete'; $lang->resource->kanban->createRegion = 'createRegion'; $lang->resource->kanban->editRegion = 'editRegion'; -$lang->resource->kanban->performable = 'performable'; $lang->resource->kanban->sortRegion = 'sortRegion'; $lang->resource->kanban->sortGroup = 'sortGroup'; $lang->resource->kanban->deleteRegion = 'deleteRegion'; @@ -659,11 +658,7 @@ $lang->resource->kanban->laneMove = 'laneMove'; $lang->resource->kanban->viewArchivedColumn = 'viewArchivedColumn'; $lang->resource->kanban->viewArchivedCard = 'viewArchivedCard'; $lang->resource->kanban->restoreCard = 'restoreCard'; -$lang->resource->kanban->setLaneHeight = 'setLaneHeight'; -$lang->resource->kanban->setColumnWidth = 'setColumnWidth'; $lang->resource->kanban->batchCreateCard = 'batchCreateCard'; -$lang->resource->kanban->import = 'import'; -$lang->resource->kanban->enableArchived = 'enableArchived'; $lang->kanban->methodOrder[5] = 'space'; $lang->kanban->methodOrder[10] = 'createSpace'; @@ -708,13 +703,9 @@ $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[220] = 'setColumnWidth'; -$lang->kanban->methodOrder[225] = 'batchCreateCard'; -$lang->kanban->methodorder[230] = 'import'; -$lang->kanban->methodorder[235] = 'enableArchived'; -$lang->kanban->methodorder[240] = 'activate'; -$lang->kanban->methodorder[245] = 'activateSpace'; +$lang->kanban->methodOrder[215] = 'batchCreateCard'; +$lang->kanban->methodorder[220] = 'activate'; +$lang->kanban->methodorder[225] = 'activateSpace'; /* Execution. */ $lang->resource->execution = new stdclass(); diff --git a/module/kanban/control.php b/module/kanban/control.php index 838dd0141d..53a1306728 100644 --- a/module/kanban/control.php +++ b/module/kanban/control.php @@ -269,6 +269,12 @@ class kanban extends control $this->view->kanban = $kanban; $this->view->type = $space->type; + $this->view->laneCount = $this->kanban->getLaneCount($kanbanID); + $this->view->heightType = $kanban->displayCards > 2 ? 'custom' : 'auto'; + $this->view->displayCards = $kanban->displayCards ? $kanban->displayCards : ''; + $this->view->enableImport = empty($kanban->object) ? 'off' : 'on'; + $this->view->importObjects = empty($kanban->object) ? array() : explode(',', $kanban->object); + $this->display(); } diff --git a/module/kanban/css/create.css b/module/kanban/css/create.css index ac6894793f..8274439982 100644 --- a/module/kanban/css/create.css +++ b/module/kanban/css/create.css @@ -1 +1,6 @@ #mainContent {padding-left: 0px;} +#mainContent .laneHeightBox, #mainContent .importBox {display: grid;} +#mainContent .laneHeightBox .radio-inline+.radio-inline, #mainContent .importBox .radio-inline+.radio-inline {margin-left: 0px; padding-top: 5px;} +#mainContent .objectBox {padding-top: 2px;} +#mainContent .objectBox .checkbox-primary {display: inline-block;} +#mainContent .objectBox .checkbox-primary:not(:first-child) {margin-left: 10px;} diff --git a/module/kanban/css/edit.css b/module/kanban/css/edit.css index ac6894793f..8274439982 100644 --- a/module/kanban/css/edit.css +++ b/module/kanban/css/edit.css @@ -1 +1,6 @@ #mainContent {padding-left: 0px;} +#mainContent .laneHeightBox, #mainContent .importBox {display: grid;} +#mainContent .laneHeightBox .radio-inline+.radio-inline, #mainContent .importBox .radio-inline+.radio-inline {margin-left: 0px; padding-top: 5px;} +#mainContent .objectBox {padding-top: 2px;} +#mainContent .objectBox .checkbox-primary {display: inline-block;} +#mainContent .objectBox .checkbox-primary:not(:first-child) {margin-left: 10px;} diff --git a/module/kanban/js/create.js b/module/kanban/js/create.js index 8e5da7a5da..2f82c79d30 100644 --- a/module/kanban/js/create.js +++ b/module/kanban/js/create.js @@ -1,3 +1,37 @@ +$(function() +{ + if(enableImport == 'off') $("input[name^='importObjectList']").attr('disabled', 'disabled'); + + $("input[name='import']").change(function() + { + if($(this).val() == 'off') + { + $("input[name^='importObjectList']").attr('disabled', 'disabled'); + } + else + { + $("input[name^='importObjectList']").removeAttr('disabled'); + } + }) + + $("input[name^='importObjectList']").change(function() + { + if($("input:checked[name^=importObjectList]").length != 0 && !$('#emptyTip').is('.hidden')) $('#emptyTip').addClass('hidden'); + }) + + $('#submit').click(function() + { + var enableImport = $("input:checked[name='import']").val(); + var objectListLength = $("input:checked[name^=importObjectList]").length; + + if(enableImport == 'on' && objectListLength == 0 && vision != 'lite') + { + $('#emptyTip').removeClass('hidden'); + return false; + } + }) +}) + /** * When space type or space value change. * @@ -11,4 +45,3 @@ function changeValue(spaceID, type) if(typeof type === 'undefined') type = spaceType; location.href = createLink('kanban', 'create', 'spaceID=' + spaceID + '&type=' + type); } - diff --git a/module/kanban/js/edit.js b/module/kanban/js/edit.js new file mode 100644 index 0000000000..0d11945872 --- /dev/null +++ b/module/kanban/js/edit.js @@ -0,0 +1,48 @@ +$(function() +{ + var heightType = $("[name='heightType']:checked").val(); + setCardCount(heightType); + + if(enableImport == 'off') $("input[name^='importObjectList']").attr('disabled', 'disabled'); + + $("input[name='import']").change(function() + { + if($(this).val() == 'off') + { + $("input[name^='importObjectList']").attr('disabled', 'disabled'); + } + else + { + $("input[name^='importObjectList']").removeAttr('disabled'); + } + }) + + $("input[name^='importObjectList']").change(function() + { + if($("input:checked[name^=importObjectList]").length != 0 && !$('#emptyTip').is('.hidden')) $('#emptyTip').addClass('hidden'); + }) + + $('#submit').click(function() + { + var enableImport = $("input:checked[name='import']").val(); + var objectListLength = $("input:checked[name^=importObjectList]").length; + + if(enableImport == 'on' && objectListLength == 0 && vision != 'lite') + { + $('#emptyTip').removeClass('hidden'); + return false; + } + }) +}) + +/** + * Set card count. + * + * @param string $heightType + * @access public + * @return void + */ +function setCardCount(heightType) +{ + heightType != 'custom' ? $('#cardBox').addClass('hidden') : $('#cardBox').removeClass('hidden'); +} diff --git a/module/kanban/js/view.js b/module/kanban/js/view.js index 4707cb8abb..46d0b01edc 100644 --- a/module/kanban/js/view.js +++ b/module/kanban/js/view.js @@ -1128,7 +1128,7 @@ function createCardMenu(options) var items = []; if(privs.includes('editCard') && card.fromType == '') items.push({label: kanbanLang.editCard, icon: 'edit', url: createLink('kanban', 'editCard', 'cardID=' + card.id, '', 'true'), className: 'iframe', attrs: {'data-toggle': 'modal', 'data-width': '80%'}}); if(privs.includes('deleteCard')) items.push({label: card.fromType == '' ? kanbanLang.deleteCard : kanbanLang.removeCard, icon: card.fromType == '' ? 'trash' : 'unlink', url: createLink('kanban', 'deleteCard', 'cardID=' + card.id), attrs: {'target': 'hiddenwin'}}); - if(privs.includes('performable') && kanban.performable == 1) + if(kanban.performable == 1) { if(card.status == 'done') { @@ -1145,7 +1145,7 @@ function createCardMenu(options) var deleteCardAction = privs.includes('deleteCard'); var archiveCardAction = (privs.includes('archiveCard') && kanban.archived == '1') ? true : false; - var performable = (privs.includes('performable') && kanban.performable == 1) ? true : false; + var performable = kanban.performable == 1 ? true : false; var moveCardAction = privs.includes('moveCard'); var setCardColorAction = privs.includes('setCardColor'); @@ -1257,9 +1257,9 @@ function createColumnCreateMenu(options) if(privs.includes('createCard')) items.push({label: kanbanLang.createCard, url: $.createLink('kanban', 'createCard', 'kanbanID=' + kanbanID + '®ionID=' + regionID + '&groupID=' + groupID + '&columnID=' + columnID, '', true), className: 'iframe', attrs: {'data-toggle': 'modal'}}); 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%'}}); - if(privs.includes('import') && kanban.object.indexOf('cards') != -1) items.push({label: kanbanLang.importCard, url: $.createLink('kanban', 'importCard', 'kanbanID=' + kanbanID + '®ionID=' + regionID + '&groupID=' + groupID + '&columnID=' + columnID), className: 'iframe', attrs: {'data-toggle': 'modal'}}); - if(privs.includes('import') && kanban.object && kanban.object != 'cards' && vision != 'lite') items.push({className: 'parentDivider'}); - if(privs.includes('import') && kanban.object && kanban.object != 'cards' && vision != 'lite') items.push({label: kanbanLang.importAB, className: 'import'}); + if(kanban.object.indexOf('cards') != -1) items.push({label: kanbanLang.importCard, url: $.createLink('kanban', 'importCard', 'kanbanID=' + kanbanID + '®ionID=' + regionID + '&groupID=' + groupID + '&columnID=' + columnID), className: 'iframe', attrs: {'data-toggle': 'modal'}}); + if(kanban.object && kanban.object != 'cards' && vision != 'lite') items.push({className: 'parentDivider'}); + if(kanban.object && kanban.object != 'cards' && vision != 'lite') items.push({label: kanbanLang.importAB, className: 'import'}); return items; } diff --git a/module/kanban/lang/zh-cn.php b/module/kanban/lang/zh-cn.php index 42e5bf807e..1600d75b85 100644 --- a/module/kanban/lang/zh-cn.php +++ b/module/kanban/lang/zh-cn.php @@ -8,7 +8,7 @@ $lang->kanban->closeSpace = '关闭空间'; $lang->kanban->deleteSpace = '删除空间'; $lang->kanban->activateSpace = '激活空间'; $lang->kanban->sortSpace = '空间排序'; -$lang->kanban->edit = '设置看板'; +$lang->kanban->edit = '编辑看板'; $lang->kanban->view = '查看看板'; $lang->kanban->activate = '激活看板'; $lang->kanban->close = '关闭看板'; diff --git a/module/kanban/model.php b/module/kanban/model.php index fee93f143d..5cf84833c6 100644 --- a/module/kanban/model.php +++ b/module/kanban/model.php @@ -1008,7 +1008,7 @@ class kanbanModel extends model ->orderBy($order) ->fetchGroup('group'); - $actions = array('createColumn', 'setColumn', 'setWIP', 'archiveColumn', 'restoreColumn', 'deleteColumn', 'createCard', 'batchCreateCard', 'splitColumn', 'import', 'sortColumn'); + $actions = array('createColumn', 'setColumn', 'setWIP', 'archiveColumn', 'restoreColumn', 'deleteColumn', 'createCard', 'batchCreateCard', 'splitColumn', 'sortColumn'); /* Group by parent. */ $parentColumnGroup = array(); @@ -1081,7 +1081,7 @@ class kanbanModel extends model ->andWhere('type')->eq('common') ->fetchAll(); - $actions = array('editCard', 'performable', 'archiveCard', 'deleteCard', 'moveCard', 'setCardColor', 'viewCard', 'sortCard', 'viewExecution', 'viewPlan', 'viewRelease', 'viewBuild'); + $actions = array('editCard', 'archiveCard', 'deleteCard', 'moveCard', 'setCardColor', 'viewCard', 'sortCard', 'viewExecution', 'viewPlan', 'viewRelease', 'viewBuild'); $cardGroup = array(); foreach($cellList as $cell) { @@ -2064,15 +2064,19 @@ class kanbanModel extends model $kanban = fixer::input('post') ->setDefault('createdBy', $account) ->setDefault('createdDate', helper::now()) - ->setdefault('owner', '') - ->setdefault('team', '') - ->setdefault('whitelist', '') + ->setDefault('owner', '') + ->setDefault('team', '') + ->setDefault('whitelist', '') + ->setDefault('displayCards', 0) + ->setIF($this->post->import == 'off', 'object', '') ->join('whitelist', ',') ->join('team', ',') ->trim('name') - ->remove('uid,contactListMenu,type') + ->remove('uid,contactListMenu,type,import,importObjectList') ->get(); + if($this->post->import == 'on') $kanban->object = implode(',', $this->post->importObjectList); + if(strpos(",{$kanban->team},", ",$account,") === false) $kanban->team .= ",$account"; if(strpos(",{$kanban->team},", ",$kanban->owner,") === false) $kanban->team .= ",$kanban->owner"; @@ -2121,12 +2125,25 @@ class kanbanModel extends model $kanban = fixer::input('post') ->setDefault('lastEditedBy', $account) ->setDefault('lastEditedDate', helper::now()) + ->setDefault('displayCards', 0) + ->setIF($this->post->import == 'off', 'object', '') ->join('whitelist', ',') ->join('team', ',') ->trim('name') - ->remove('uid,contactListMenu') + ->remove('uid,contactListMenu,import,importObjectList,heightType') ->get(); + if($this->post->import == 'on') $kanban->object = implode(',', $this->post->importObjectList); + + if(isset($_POST['heightType']) and $this->post->heightType == 'custom') + { + if(!preg_match("/^-?\d+$/", $kanban->displayCards) or $kanban->displayCards < 3) + { + dao::$errors['displayCards'] = $this->lang->kanbanlane->error->mustBeInt; + return false; + } + } + $this->dao->update(TABLE_KANBAN)->data($kanban) ->autoCheck() ->batchCheck($this->config->kanban->edit->requiredFields, 'notempty') @@ -3053,26 +3070,12 @@ class kanbanModel extends model $btnColor = ''; if($this->app->cookie->theme == 'blue') $btnColor = 'style="color:#000000"'; - $printSetHeightBtn = false; - if(common::hasPriv('kanban', 'setLaneHeight')) - { - $laneCount = $this->dao->select('COUNT(t2.id) as count')->from(TABLE_KANBANREGION)->alias('t1') - ->leftJoin(TABLE_KANBANLANE)->alias('t2')->on('t1.id=t2.region') - ->where('t1.kanban')->eq($kanban->id) - ->andWhere('t1.deleted')->eq(0) - ->andWhere('t2.deleted')->eq(0) - ->andWhere('t2.type')->eq('common') - ->fetch('count'); - - if($laneCount > 1) $printSetHeightBtn = true; - } - $actions = ''; $actions .= "
"; $actions .= " {$this->lang->kanban->fullScreen}"; $CRKanban = !(isset($this->config->CRKanban) and $this->config->CRKanban == '0' and $kanban->status == 'closed'); - $printRegionBtn = ($CRKanban and (common::hasPriv('kanban', 'createRegion') or $printSetHeightBtn or common::hasPriv('kanban', 'performable') or common::hasPriv('kanban', 'enableArchived') or common::hasPriv('kanban', 'import') or common::hasPriv('kanban', 'setColumnWidth'))); + $printRegionBtn = ($CRKanban and (common::hasPriv('kanban', 'createRegion'))); $printKanbanBtn = (common::hasPriv('kanban', 'edit') or ($kanban->status == 'active' and common::hasPriv('kanban', 'close')) or common::hasPriv('kanban', 'delete') or ($kanban->status == 'closed' and common::hasPriv('kanban', 'activate'))); if($printRegionBtn or $printKanbanBtn) @@ -3081,20 +3084,11 @@ class kanbanModel extends model $actions .= "