diff --git a/module/group/lang/resource.php b/module/group/lang/resource.php index a4a188e929..23ef7835c1 100644 --- a/module/group/lang/resource.php +++ b/module/group/lang/resource.php @@ -321,6 +321,8 @@ $lang->resource->project->kanban = 'kanban'; $lang->resource->project->printKanban = 'printKanban'; $lang->resource->project->tree = 'tree'; $lang->resource->project->all = 'all'; +$lang->resource->project->kanbanHideCols = 'kanbanHideCols'; +$lang->resource->project->kanbanColsColor = 'kanbanColsColor'; $lang->project->methodOrder[0] = 'index'; $lang->project->methodOrder[5] = 'view'; @@ -360,6 +362,8 @@ $lang->project->methodOrder[175] = 'kanban'; $lang->project->methodOrder[180] = 'printKanban'; $lang->project->methodOrder[185] = 'tree'; $lang->project->methodOrder[190] = 'all'; +$lang->project->methodOrder[195] = 'kanbanHideCols'; +$lang->project->methodOrder[200] = 'kanbanColsColor'; /* Task. */ $lang->resource->task = new stdclass(); diff --git a/module/project/config.php b/module/project/config.php index ddd4c26299..471dc898f3 100644 --- a/module/project/config.php +++ b/module/project/config.php @@ -99,3 +99,11 @@ $config->printKanban->col['wait'] = 2; $config->printKanban->col['doing'] = 3; $config->printKanban->col['done'] = 4; $config->printKanban->col['closed'] = 5; + +$config->project->kanbanSetting = new stdclass(); +$config->project->kanbanSetting->colorList['wait'] = '#2b529c'; +$config->project->kanbanSetting->colorList['doing'] = '#d2323d'; +$config->project->kanbanSetting->colorList['pause'] = '#e48600'; +$config->project->kanbanSetting->colorList['done'] = '#229f24'; +$config->project->kanbanSetting->colorList['cancel'] = '#333'; +$config->project->kanbanSetting->colorList['closed'] = '#777'; diff --git a/module/project/control.php b/module/project/control.php index 32f1389fab..f4eb10402b 100644 --- a/module/project/control.php +++ b/module/project/control.php @@ -1273,6 +1273,13 @@ class project extends control $this->view->orderBy = $orderBy; $this->view->projectID = $projectID; $this->view->project = $project; + + $kanbanSetting = $this->project->getKanbanSetting($projectID); + + $this->view->allCols = $kanbanSetting->allCols; + $this->view->showOption = $kanbanSetting->showOption; + $this->view->colorList = $kanbanSetting->colorList; + $this->display(); } @@ -1992,4 +1999,75 @@ class project extends control { $this->locate($this->createLink('doc', 'objectLibs', "type=project&objectID=$projectID&from=project")); } + + /** + * Kanban setting. + * + * @param int $projectID + * @access public + * @return void + */ + public function ajaxKanbanSetting($projectID) + { + if($_POST) + { + $this->loadModel('setting'); + $data = fixer::input('post')->get(); + if(common::hasPriv('project', 'kanbanHideCols')) + { + $allCols = array(); + if(isset($this->config->project->kanbanSetting->allCols)) + { + $allCols = json_decode($this->config->project->kanbanSetting->allCols, true); + } + $allCols[$projectID] = $data->allCols; + $this->setting->setItem("system.project.kanbanSetting.allCols", json_encode($allCols)); + } + + $account = $this->app->user->account; + $this->setting->setItem("{$account}.project.kanbanSetting.showOption", $data->showOption); + + if(common::hasPriv('project', 'kanbanColsColor')) $this->setting->setItem("system.project.kanbanSetting.colorList", json_encode($data->colorList)); + + die(js::reload('parent.parent')); + } + + $this->app->loadLang('task'); + $kanbanSetting = $this->project->getKanbanSetting($projectID); + + $this->view->allCols = $kanbanSetting->allCols; + $this->view->showOption = $kanbanSetting->showOption; + $this->view->colorList = $kanbanSetting->colorList; + $this->view->projectID = $projectID; + $this->display(); + } + + /** + * Ajax reset kanban setting + * + * @param int $projectID + * @param string $confirm + * @access public + * @return void + */ + public function ajaxResetKanban($projectID, $confirm = 'no') + { + if($confirm != 'yes')die(js::confirm($this->lang->kanbanSetting->noticeReset, inlink('ajaxResetKanban', "projectID=$projectID&confirm=yes"))); + + $this->loadModel('setting'); + + if(common::hasPriv('project', 'kanbanHideCols') and isset($this->config->project->kanbanSetting->allCols)) + { + $allCols = json_decode($this->config->project->kanbanSetting->allCols, true); + unset($allCols[$projectID]); + $this->setting->setItem("system.project.kanbanSetting.allCols", json_encode($allCols)); + } + + $account = $this->app->user->account; + $this->setting->deleteItems("owner={$account}&module=project§ion=kanbanSetting&key=showOption"); + + if(common::hasPriv('project', 'kanbanColsColor')) $this->setting->deleteItems("owner=system&module=project§ion=kanbanSetting&key=colorList"); + + die(js::reload('parent.parent')); + } } diff --git a/module/project/css/kanban.css b/module/project/css/kanban.css index 2e20477f54..cae429cd04 100644 --- a/module/project/css/kanban.css +++ b/module/project/css/kanban.css @@ -1,8 +1,8 @@ -table th.col-closed {width:12%} +table th.col-closed {width:14%} #kanbanHeader th{border: 1px solid #ddd; padding:8px;} -#kanbanHeader .dropdown {display: inline-block; margin-left: 10px;} +#kanbanHeader .dropdown {display: inline-block;} #kanbanHeader .dropdown > a {color: #036} -#kanbanHeader th.col-closed {position: relative} +#kanbanHeader th{position: relative} #kanbanHeader .actions {position: absolute; right: 0; top: 0; padding: 0px; background: #f1f1f1; border-left: 1px solid #ccc} #kanbanHeader .actions .btn {display: block; border-radius: 0; width: 34px; height: 36px; position: relative; text-align: center; padding: 5px 0; color: #036} #kanbanHeader .actions .btn-text {display: none} @@ -39,7 +39,8 @@ table th.col-closed {width:12%} .board .dropdown-menu > a {display: block; padding: 3px 15px; color: #333; font-size: 12px} .board .dropdown-menu > a:hover {background: #f1f1f1; color: #1a53ff; text-decoration: none} .board .dropdown-menu > a.disabled, .board .dropdown-menu > a.disabled:hover, .board .dropdown-menu > a.active {color: #aaa; background: none} -.board .board-footer {display: none; opacity: 0.9} +.board .board-footer {display: none; opacity: 0.6} +.board.inverse .board-footer {display: none; opacity: 0.9} .board.show-info .board-footer {display: block; margin: 0 -6px -3px -6px; padding: 5px; background: rgba(0,0,0,0.07);} .board-footer .board-id {display: inline-block; border: 1px solid #aaa; font-weight: normal; padding: 0px 4px; text-align: center; min-width: 20px; line-height: 16px; height: 17px; margin-right: 10px; font-size: 12px;} .board-bug-closed .board-footer .bug-pri, .board-task-closed .board-footer .task-pri {border-color: #666} @@ -60,13 +61,21 @@ table th.col-closed {width:12%} .story-pri.pri-3 {background-color:#b56a00;} .story-pri.pri-4 {background-color:#795523;} -.board {background: #ddd; color: #444; outline: 1px solid rgba(0,0,0,.1); outline-offset: -1px;} -.board-bug-wait,.board-task-wait {color: #2b529c; background-color: #E8EAF6} -.board-bug-doing,.board-task-doing {color: #D2322D; background-color: #FFEBEE;} -.board-task-pause {color: #fff; background-color: #E48600;} -.board-bug-done,.board-task-done {color: #229F24; background-color: #E8F5E9;} -.board-bug-closed,.board-task-closed {color: #666; background-color: #ccc;} -.board:hover {outline: 1px solid rgba(0,0,0,.3);} +.board {background: #333; color: #f1f1f1; outline: 1px solid rgba(0,0,0,.1); outline-offset: -1px;} +.board:hover {outline: 1px solid rgba(0,0,0,.3); color:#fff} +.board-bug-cancel, .board-task-cancel {background: #333; opacity: 0.7;} +.board-bug-wait, .board-task-wait {background: #2b529c;opacity: 0.7;} +.board-task-pause {background: #E48600;opacity: 0.7;} +.board-bug-doing, .board-task-doing {background: #D2322D;opacity: 0.7;} +.board-bug-done, .board-task-done {background: #229F24;opacity: 0.7;} +.board-bug-closed, .board-task-closed {background: #777; opacity: 0.7;} + +.board-bug-cancel.inverse, .board-task-cancel.inverse {opacity: 1;} +.board-bug-wait.inverse, .board-task-wait.inverse {opacity: 1} +.board-task-pause.inverse {opacity: 1} +.board-bug-doing.inverse, .board-task-doing.inverse {opacity: 1} +.board-bug-done.inverse, .board-task-done.inverse {opacity: 1} +.board-bug-closed.inverse, .board-task-closed.inverse {opacity: 1} .board-story {color: #dd7503; background-color: #FFF3E0;} .board-story.stage-projected {color:#777;} @@ -76,15 +85,6 @@ table th.col-closed {width:12%} .board-story.stage-tested {color:#827717; background-color: #F9FBE7} .board-story.stage-released {color:#9C27B0; background-color: #F3E5F5} -.board.inverse {background: #333; color: #f1f1f1;} -.board.inverse:hover {color: #fff;} -.board-bug-cancel.inverse, .board-task-cancel.inverse {background: #333;} -.board-bug-wait.inverse, .board-task-wait.inverse {background: #2b529c} -.board-task-pause.inverse {background: #E48600} -.board-bug-doing.inverse, .board-task-doing.inverse {background: #D2322D} -.board-bug-done.inverse, .board-task-done.inverse {background: #229F24} -.board-bug-closed.inverse, .board-task-closed.inverse {background: #777;} - .board-story.inverse {background: #dd7503} .board-story.stage-projected.inverse {background-color:#777;} .board-story.stage-developing.inverse {background-color:#D2322D;} diff --git a/module/project/lang/en.php b/module/project/lang/en.php index 449372822c..415eb80747 100644 --- a/module/project/lang/en.php +++ b/module/project/lang/en.php @@ -242,9 +242,20 @@ $lang->project->orderList['id_desc'] = "ID Desc"; $lang->project->orderList['stage_asc'] = "Stage Asc"; $lang->project->orderList['stage_desc'] = "Stage Desc"; -$lang->project->kanban = "Kanban"; -$lang->project->printKanban = "Print Kanban"; -$lang->project->bugList = "Bugs"; +$lang->project->kanban = "Kanban"; +$lang->project->kanbanSetting = "Kanban Setting"; +$lang->project->resetKanban = "Reset Setting"; +$lang->project->printKanban = "Print Kanban"; +$lang->project->bugList = "Bugs"; + +$lang->project->kanbanHideCols = 'Kanban hidden has been closed and canceled columns'; +$lang->project->kanbanShowOption = 'Display folding information'; +$lang->project->kanbanColsColor = 'Custom color for Kanban column'; + +$lang->kanbanSetting = new stdclass(); +$lang->kanbanSetting->noticeReset = 'Do you want to restore the Kanban default settings?'; +$lang->kanbanSetting->optionList['0'] = 'Hidden'; +$lang->kanbanSetting->optionList['1'] = 'Show'; $lang->printKanban = new stdclass(); $lang->printKanban->common = 'Print Kanban'; diff --git a/module/project/lang/zh-cn.php b/module/project/lang/zh-cn.php index 832032b3a9..f35ba6f90a 100644 --- a/module/project/lang/zh-cn.php +++ b/module/project/lang/zh-cn.php @@ -242,9 +242,20 @@ $lang->project->orderList['id_desc'] = "需求ID倒序"; $lang->project->orderList['stage_asc'] = "需求阶段正序"; $lang->project->orderList['stage_desc'] = "需求阶段倒序"; -$lang->project->kanban = "看板"; -$lang->project->printKanban = "打印看板"; -$lang->project->bugList = "Bug列表"; +$lang->project->kanban = "看板"; +$lang->project->kanbanSetting = "看板设置"; +$lang->project->resetKanban = "恢复默认"; +$lang->project->printKanban = "打印看板"; +$lang->project->bugList = "Bug列表"; + +$lang->project->kanbanHideCols = '看板隐藏已关闭、已取消列'; +$lang->project->kanbanShowOption = '显示折叠信息'; +$lang->project->kanbanColsColor = '看板列自定义颜色'; + +$lang->kanbanSetting = new stdclass(); +$lang->kanbanSetting->noticeReset = '是否恢复看板默认设置?'; +$lang->kanbanSetting->optionList['0'] = '隐藏'; +$lang->kanbanSetting->optionList['1'] = '显示'; $lang->printKanban = new stdclass(); $lang->printKanban->common = '看板打印'; diff --git a/module/project/model.php b/module/project/model.php index 9bdb76f892..fe0ffdee9b 100644 --- a/module/project/model.php +++ b/module/project/model.php @@ -2124,6 +2124,39 @@ class projectModel extends model return json_decode($prevKanbans, true); } + /** + * Get kanban setting. + * + * @param int $projectID + * @access public + * @return object + */ + public function getKanbanSetting($projectID) + { + $allCols = '1'; + $showOption = '0'; + if(isset($this->config->project->kanbanSetting->allCols)) + { + $allColPairs = json_decode($this->config->project->kanbanSetting->allCols, true); + if(isset($allColPairs[$projectID])) $allCols = $allColPairs[$projectID]; + } + + if(isset($this->config->project->kanbanSetting->showOption)) + { + $showOption = $this->config->project->kanbanSetting->showOption; + } + + $colorList = $this->config->project->kanbanSetting->colorList; + if(!is_array($colorList)) $colorList = json_decode($colorList, true); + + $kanbanSetting = new stdclass(); + $kanbanSetting->allCols = $allCols; + $kanbanSetting->showOption = $showOption; + $kanbanSetting->colorList = $colorList; + + return $kanbanSetting; + } + /** * Build burn data. * diff --git a/module/project/view/ajaxkanbansetting.html.php b/module/project/view/ajaxkanbansetting.html.php new file mode 100644 index 0000000000..00d64aa0d9 --- /dev/null +++ b/module/project/view/ajaxkanbansetting.html.php @@ -0,0 +1,62 @@ + + * @package project + * @version $Id$ + * @link http://www.zentao.net + */ +?> + +
| task->statusList[$endCol];?>
- " . $lang->project->printKanban . '', "id='printKanban' title='" . $lang->project->printKanban . "'", 'btn btn-sm btn-link');?>
+
+
+
+
|
@@ -58,7 +75,7 @@
id)):?>
- ' data-id='id?>'>
+ assignedTo == $account) echo ' inverse';?>' data-id='id?>'>
createLink('story', 'view', "storyID=$story->id", '', true), $story->title, '', 'class="kanbanFrame" title="' . $story->title . '"');?>
@@ -67,7 +84,7 @@
- |
|---|