From dce39752a3eefe4f2180a351db587d4cdd2ed058 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=8D=8E=E4=BC=9F?= Date: Fri, 6 May 2022 15:28:41 +0800 Subject: [PATCH 001/166] *Test getByAccounts. --- test/model/group/getbyaccounts.php | 32 ++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/test/model/group/getbyaccounts.php b/test/model/group/getbyaccounts.php index 9311db5ef6..18358ad20c 100644 --- a/test/model/group/getbyaccounts.php +++ b/test/model/group/getbyaccounts.php @@ -10,8 +10,36 @@ title=测试 groupModel->getByAccounts(); cid=1 pid=1 +测试获取用户 outside3 的权限分组信息 >> outside3 +测试获取用户 top2 的权限分组信息 >> top2 +测试获取用户 pd2 的权限分组信息 >> pd2 +测试获取用户 td1 的权限分组信息 >> td1 +测试获取用户 pm1 的权限分组信息 >> pm1 +测试获取用户 po48 的权限分组信息 >> po48 +测试获取用户 dev100 的权限分组信息 >> dev100 +测试获取用户 test2 的权限分组信息 >> test2 + */ -$group = new groupTest(); +$accountList = array + ( + array('outside3', 'top2'), + array('td1', 'pd2'), + array('po48', 'pm1'), + array('dev100', 'test2') + ); -r($group->getByAccountsTest()) && p() && e(); \ No newline at end of file +$group = new groupTest(); +$groups0 = $group->getByAccountsTest($accountList[0]); +$groups1 = $group->getByAccountsTest($accountList[1]); +$groups2 = $group->getByAccountsTest($accountList[2]); +$groups3 = $group->getByAccountsTest($accountList[3]); + +r($groups0['outside3']) && p('0:account') && e('outside3'); //测试获取用户 outside3 的权限分组信息 +r($groups0['top2']) && p('0:account') && e('top2'); //测试获取用户 top2 的权限分组信息 +r($groups1['pd2']) && p('0:account') && e('pd2'); //测试获取用户 pd2 的权限分组信息 +r($groups1['td1']) && p('0:account') && e('td1'); //测试获取用户 td1 的权限分组信息 +r($groups2['pm1']) && p('0:account') && e('pm1'); //测试获取用户 pm1 的权限分组信息 +r($groups2['po48']) && p('0:account') && e('po48'); //测试获取用户 po48 的权限分组信息 +r($groups3['dev100']) && p('0:account') && e('dev100'); //测试获取用户 dev100 的权限分组信息 +r($groups3['test2']) && p('0:account') && e('test2'); //测试获取用户 test2 的权限分组信息 From d1580bd9e9d96c5cf55c1ed1b524fbafe9926d97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=8D=8E=E4=BC=9F?= Date: Fri, 6 May 2022 15:50:38 +0800 Subject: [PATCH 002/166] *Test getAccessProgramGroup. --- test/model/group/getaccessprogramgroup.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/test/model/group/getaccessprogramgroup.php b/test/model/group/getaccessprogramgroup.php index 86d4e51068..c1bcefab31 100644 --- a/test/model/group/getaccessprogramgroup.php +++ b/test/model/group/getaccessprogramgroup.php @@ -10,8 +10,11 @@ title=测试 groupModel->getAccessProgramGroup(); cid=1 pid=1 +测试获取group中用户个数 >> 14 + */ $group = new groupTest(); +$AccessProgramGroup = $group->getAccessProgramGroupTest(); -r($group->getAccessProgramGroupTest()) && p() && e(); \ No newline at end of file +r(count($AccessProgramGroup)) && p('') && e('14'); //测试获取group中用户个数 From c73cf3cea0099280e5b861ff6e343fe081ec82fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=8D=8E=E4=BC=9F?= Date: Fri, 6 May 2022 16:32:00 +0800 Subject: [PATCH 003/166] *Test getGroupAccounts. --- test/model/group/getgroupaccounts.php | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/test/model/group/getgroupaccounts.php b/test/model/group/getgroupaccounts.php index 4667ade60b..bbfb43d8c6 100644 --- a/test/model/group/getgroupaccounts.php +++ b/test/model/group/getgroupaccounts.php @@ -10,8 +10,17 @@ title=测试 groupModel->getGroupAccounts(); cid=1 pid=1 +测试获取 group 的 account td79 >> td79 +测试获取 group 的 account pm1 >> pm1 +测试获取 group 的 account po75 >> po75 +测试获取 group 的 account top88 >> top88 + */ $group = new groupTest(); +$groupIdList = array(1,9,2,12); -r($group->getGroupAccountsTest()) && p() && e(); \ No newline at end of file +r($group->getGroupAccountsTest($groupIdList)) && p('td79') && e('td79'); //测试获取 group 的 account td79 +r($group->getGroupAccountsTest($groupIdList)) && p('pm1') && e('pm1'); //测试获取 group 的 account pm1 +r($group->getGroupAccountsTest($groupIdList)) && p('po75') && e('po75'); //测试获取 group 的 account po75 +r($group->getGroupAccountsTest($groupIdList)) && p('top88') && e('top88'); //测试获取 group 的 account top88 From 557247387f33c07d49f8dc8ea41eaccaa486d988 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=8D=8E=E4=BC=9F?= Date: Fri, 6 May 2022 16:57:28 +0800 Subject: [PATCH 004/166] *Test getList. --- test/model/group/getlist.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/test/model/group/getlist.php b/test/model/group/getlist.php index 5e50b313ab..4376f98299 100644 --- a/test/model/group/getlist.php +++ b/test/model/group/getlist.php @@ -10,8 +10,14 @@ title=测试 groupModel->getList(); cid=1 pid=1 +测试获取 groupList 的信息 >> 其他,others,其他 +测试获取 groupList 的信息 >> guest,guest,For guest +测试获取 groupList 的信息 >> 项目管理员,projectAdmin,项目管理员可以维护项目的权限 + */ $group = new groupTest(); -r($group->getListTest()) && p() && e(); \ No newline at end of file +r($group->getListTest()) && p('9:name,role,desc') && e('其他,others,其他'); // 测试获取 groupList 的信息 +r($group->getListTest()) && p('10:name,role,desc') && e('guest,guest,For guest'); // 测试获取 groupList 的信息 +r($group->getListTest()) && p('12:name,role,desc') && e('项目管理员,projectAdmin,项目管理员可以维护项目的权限'); // 测试获取 groupList 的信息 From 08f23cc0bb7077c7338d86e0290571b354cf3700 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=8D=8E=E4=BC=9F?= Date: Sat, 7 May 2022 09:44:35 +0800 Subject: [PATCH 005/166] *Test checkMenuModule. --- test/class/group.class.php | 2 +- test/model/group/checkmenumodule.php | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/test/class/group.class.php b/test/class/group.class.php index 90f184156c..49f094445e 100644 --- a/test/class/group.class.php +++ b/test/class/group.class.php @@ -111,7 +111,7 @@ class groupTest public function getGroupAccountsTest($groupIdList) { - $objects = $this->objectModel->getGroupAccounts($groupIdList = array()); + $objects = $this->objectModel->getGroupAccounts($groupIdList); if(dao::isError()) return dao::getError(); diff --git a/test/model/group/checkmenumodule.php b/test/model/group/checkmenumodule.php index a4d0c07135..f5db30e17a 100644 --- a/test/model/group/checkmenumodule.php +++ b/test/model/group/checkmenumodule.php @@ -10,8 +10,14 @@ title=测试 groupModel->checkMenuModule(); cid=1 pid=1 +测试获取 '','index' 的返回结果 >> 1 +测试获取 'my','tree' 的返回结果 >> 0 +测试获取 'none','tree' 的返回结果 >> 0 + */ $group = new groupTest(); -r($group->checkMenuModuleTest()) && p() && e(); \ No newline at end of file +r($group->checkMenuModuleTest('','index')) && p('') && e(1); // 测试获取 '','index' 的返回结果 +r($group->checkMenuModuleTest('my','tree')) && p('') && e(''); // 测试获取 'my','tree' 的返回结果 +r($group->checkMenuModuleTest('none','tree')) && p('') && e(''); // 测试获取 'none','tree' 的返回结果 From 3d4374964a715540fa1377a3a1474514099b0233 Mon Sep 17 00:00:00 2001 From: wangyuting2 <851424971@qq.com> Date: Sat, 7 May 2022 09:52:16 +0800 Subject: [PATCH 006/166] * Merge zdoo framework. --- framework/control.class.php | 161 ++++++++---------------------- framework/model.class.php | 190 ++++++++++++++++++++++++++++++++++++ 2 files changed, 231 insertions(+), 120 deletions(-) diff --git a/framework/control.class.php b/framework/control.class.php index 77cf3e724d..803189b9c3 100644 --- a/framework/control.class.php +++ b/framework/control.class.php @@ -42,8 +42,6 @@ class control extends baseControl /* Code for task #9224. Set requiredFields for workflow. */ if($this->dbh and (defined('IN_USE') or (defined('RUN_MODE') and RUN_MODE == 'api'))) { - $this->checkRequireFlowField(); - if(isset($this->config->{$this->moduleName}) and strpos($this->methodName, 'export') !== false) { if(isset($this->config->{$this->moduleName}->exportFields) or isset($this->config->{$this->moduleName}->list->exportFields)) @@ -291,6 +289,24 @@ class control extends baseControl chdir($currentPWD); } + /** + * Build operate menu of a method. + * + * @param object $object product|project|productplan|release|build|story|task|bug|testtask|testcase|testsuite + * @param string $displayOn view|browse + * @access public + * @return void + */ + public function buildOperateMenu($object, $displayOn = 'view') + { + if(!isset($this->config->bizVersion)) return false; + + $flow = $this->loadModel('workflow')->getByModule($this->moduleName); + return $this->loadModel('flow')->buildOperateMenu($flow, $object, $displayOn); + //$moduleName = $this->moduleName; + //return $this->$moduleName->buildOperateMenu($object, $type); + } + /** * Execute hooks of a method. * @@ -307,19 +323,18 @@ class control extends baseControl } /** - * Build operate menu of a method. - * - * @param object $object product|project|productplan|release|build|story|task|bug|testtask|testcase|testsuite - * @param string $displayOn view|browse + * Set workflow export fields + * + * @param array $fields * @access public - * @return void + * @return array */ - public function buildOperateMenu($object, $displayOn = 'view') + public function getFlowExportFields() { - if(!isset($this->config->bizVersion)) return false; + if(!isset($this->config->bizVersion)) return array(); - $flow = $this->loadModel('workflow')->getByModule($this->moduleName); - return $this->loadModel('flow')->buildOperateMenu($flow, $object, $displayOn); + $moduleName = $this->moduleName; + return $this->$moduleName->getFlowExportFields(); } /** @@ -332,14 +347,27 @@ class control extends baseControl * position=left|right The position which the fields displayed in a page. * inForm=0|1 The fields displayed in a form or not. The default is 1. * inCell=0|1 The fields displayed in a div with class cell or not. The default is 0. + * @param bool $print * @access public * @return void */ - public function printExtendFields($object, $type, $extras = '') + public function printExtendFields($object, $type, $extras = '', $print = false) { if(!isset($this->config->bizVersion)) return false; - echo $this->loadModel('flow')->printFields($this->moduleName, $this->methodName, $object, $type, $extras); + $moduleName = $this->app->getModuleName(); + $methodName = $this->app->getMethodName(); + $fields = $this->loadModel('flow')->printFields($moduleName, $methodName, $object, $type, $extras); + if(!$print) return $fields; + + $jsRoot = $this->config->webRoot . "js/"; + $picker = file_get_contents($this->app->getBasePath() . 'app/sys/common/view/picker.html.php'); + $picker = substr($picker, strpos($picker, ' +loadLang('execution'); +$app->loadLang('release'); +$app->loadLang('build'); +$app->loadLang('productplan'); +?>
kanban->archivedCard;?> @@ -76,10 +83,33 @@ status == 'done'):?>
kanban->finished;?>
+ fromType)):?> createLink('kanban', 'viewCard', "cardID=$card->id", '', true), $card->name, '', "class='cardName iframe' data-toggle='modal' data-width='80%' title='$card->name'");?>
pri;?> estimate and $card->estimate != 0) echo "{$card->estimate}h";?> + fromType == 'productplan'):?> + createLink('productplan', 'view', "id=$card->fromID"), $card->title, '', "class='cardName' title='$card->title'");?> +
+ {$card->fromType}->statusList[$card->objectStatus];?> + fromType == 'release'):?> + createLink('release', 'view', "id=$card->fromID"), $card->name, '', "class='cardName' title='$card->name'");?> +
+ {$card->fromType}->statusList[$card->objectStatus];?> + date)):?> + date));?> + + fromType == 'execution'):?> + createLink('execution', 'view', "id=$card->fromID"), $card->name, '', "class='cardName' title='$card->name'");?> +
+ {$card->fromType}->statusList[$card->objectStatus];?> + fromType == 'build'):?> + createLink('build', 'view', "id=$card->fromID"), $card->name, '', "class='cardName' title='$card->name'");?> +
+ date)):?> + date));?> + + end) and !helper::isZeroDate($card->begin)):?> begin)) . $lang->kanbancard->beginAB;?> @@ -152,5 +182,17 @@ $(function() { $('#archivedCards').animate({right: -400}, 500); }); + $('.card-item').each(function() + { + var $item = $(this).children('.col-xs-10').children('.kanban-item'); + var icon = ''; + + if($item.children('.build').length) icon = ''; + if($item.children('.execution').length) icon = ''; + if($item.children('.productplan').length) icon = ''; + if($item.children('.release').length) icon = ''; + + $item.children('a').prepend(icon); + }); }) From d88c1310b6a1bdad3636e8cccd28a14ae3d14682 Mon Sep 17 00:00:00 2001 From: sunjun Date: Tue, 10 May 2022 07:37:12 +0000 Subject: [PATCH 066/166] sprint_sunjun_53654 --- module/release/control.php | 7 +++++-- module/release/view/browse.html.php | 3 +++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/module/release/control.php b/module/release/control.php index 2c76a1f05a..4f167c7fa7 100644 --- a/module/release/control.php +++ b/module/release/control.php @@ -41,15 +41,18 @@ class release extends control * @access public * @return void */ - public function browse($productID, $branch = 'all', $type = 'all', $orderBy = 't1.date_desc') + public function browse($productID, $branch = 'all', $type = 'all', $orderBy = 't1.date_desc', $recTotal = 0, $recPerPage = 20, $pageID = 1) { + $this->app->loadClass('pager', $static = true); + $pager = new pager($recTotal, $recPerPage, $pageID); $this->commonAction($productID, $branch); $this->session->set('releaseList', $this->app->getURI(true), 'product'); $this->view->title = $this->view->product->name . $this->lang->colon . $this->lang->release->browse; $this->view->position[] = $this->lang->release->browse; - $this->view->releases = $this->release->getList($productID, $branch, $type, $orderBy); + $this->view->releases = $this->release->getList($productID, $branch, $type, $orderBy, $pager); $this->view->type = $type; + $this->view->pager = $pager; $this->display(); } diff --git a/module/release/view/browse.html.php b/module/release/view/browse.html.php index f980074b89..d81a13eb59 100644 --- a/module/release/view/browse.html.php +++ b/module/release/view/browse.html.php @@ -105,5 +105,8 @@ +
From 14b9350a1cd3fbc29c4fb4fa918c0cc66fceb141 Mon Sep 17 00:00:00 2001 From: sunjun Date: Tue, 10 May 2022 07:40:57 +0000 Subject: [PATCH 067/166] sprint_sunjun_53654 --- module/release/view/browse.html.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/module/release/view/browse.html.php b/module/release/view/browse.html.php index d81a13eb59..3eea2f090a 100644 --- a/module/release/view/browse.html.php +++ b/module/release/view/browse.html.php @@ -105,8 +105,8 @@ - +
From 57b5a8a1c525255a7d81f48e6503003fee81f4f0 Mon Sep 17 00:00:00 2001 From: sunjun Date: Tue, 10 May 2022 08:13:05 +0000 Subject: [PATCH 068/166] task_sunjun_53672 --- module/release/model.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/module/release/model.php b/module/release/model.php index b0965abe8c..6241f8baac 100644 --- a/module/release/model.php +++ b/module/release/model.php @@ -191,9 +191,8 @@ class releaseModel extends model $this->dao->insert(TABLE_RELEASE)->data($release) ->autoCheck() ->batchCheck($this->config->release->create->requiredFields, 'notempty') - ->check('name', 'unique', "product = '{$release->product}' AND branch = '{$release->branch}' AND deleted = '0'"); - ->checkFlow() - + ->check('name', 'unique', "product = '{$release->product}' AND branch = '{$release->branch}' AND deleted = '0'") + ->checkFlow(); if(dao::isError()) { if(!empty($buildID)) $this->dao->delete()->from(TABLE_BUILD)->where('id')->eq($buildID)->exec(); From bf1f9172ff01be0a1c8145ddc499c67e5e140f36 Mon Sep 17 00:00:00 2001 From: sunjun Date: Tue, 10 May 2022 08:15:50 +0000 Subject: [PATCH 069/166] tasj_sunjun_53665 --- module/release/model.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/module/release/model.php b/module/release/model.php index b0965abe8c..89c64ab08c 100644 --- a/module/release/model.php +++ b/module/release/model.php @@ -191,8 +191,8 @@ class releaseModel extends model $this->dao->insert(TABLE_RELEASE)->data($release) ->autoCheck() ->batchCheck($this->config->release->create->requiredFields, 'notempty') - ->check('name', 'unique', "product = '{$release->product}' AND branch = '{$release->branch}' AND deleted = '0'"); - ->checkFlow() + ->check('name', 'unique', "product = '{$release->product}' AND branch = '{$release->branch}' AND deleted = '0'") + ->checkFlow(); if(dao::isError()) { From 0a23be8a5b8b05932c6f8b13cbbf8e9ff8533bd2 Mon Sep 17 00:00:00 2001 From: sunjun Date: Tue, 10 May 2022 08:22:25 +0000 Subject: [PATCH 070/166] task_sunjun_53672 --- module/release/model.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/module/release/model.php b/module/release/model.php index 6241f8baac..63a8bb5f32 100644 --- a/module/release/model.php +++ b/module/release/model.php @@ -121,9 +121,6 @@ class releaseModel extends model /* Check build if build is required. */ if(strpos($this->config->release->create->requiredFields, 'build') !== false and $this->post->build == false) return dao::$errors[] = sprintf($this->lang->error->notempty, $this->lang->release->build); - /* Check date must be not more than today. */ - if($this->post->date > date('Y-m-d')) return dao::$errors[] = $this->lang->release->errorDate; - $release = fixer::input('post') ->add('product', (int)$productID) ->add('branch', (int)$branch) From 6abe1812a0ddf13a14196c01a9b895b89de3efd1 Mon Sep 17 00:00:00 2001 From: sunjun Date: Tue, 10 May 2022 08:23:33 +0000 Subject: [PATCH 071/166] task_sunjun_53672 --- module/release/model.php | 1 + 1 file changed, 1 insertion(+) diff --git a/module/release/model.php b/module/release/model.php index 63a8bb5f32..28cc033b6f 100644 --- a/module/release/model.php +++ b/module/release/model.php @@ -190,6 +190,7 @@ class releaseModel extends model ->batchCheck($this->config->release->create->requiredFields, 'notempty') ->check('name', 'unique', "product = '{$release->product}' AND branch = '{$release->branch}' AND deleted = '0'") ->checkFlow(); + if(dao::isError()) { if(!empty($buildID)) $this->dao->delete()->from(TABLE_BUILD)->where('id')->eq($buildID)->exec(); From 987edcc3cf0e5aadcb217e861d694063f658a16e Mon Sep 17 00:00:00 2001 From: liumengyi Date: Tue, 10 May 2022 16:29:56 +0800 Subject: [PATCH 072/166] * Finish task #53663. --- module/kanban/control.php | 11 +++++++++-- module/kanban/js/view.js | 6 +++--- module/kanban/lang/en.php | 2 ++ module/kanban/lang/zh-cn.php | 2 ++ module/kanban/view/viewarchivedcard.html.php | 4 ++-- 5 files changed, 18 insertions(+), 7 deletions(-) diff --git a/module/kanban/control.php b/module/kanban/control.php index a18e14e40d..158625aa88 100644 --- a/module/kanban/control.php +++ b/module/kanban/control.php @@ -1380,13 +1380,20 @@ class kanban extends control */ public function deleteCard($cardID, $confirm = 'no') { + $card = $this->kanban->getCardByID($cardID); if($confirm == 'no') { - return print(js::confirm($this->lang->kanbancard->confirmDelete, $this->createLink('kanban', 'deleteCard', "cardID=$cardID&confirm=yes"))); + $confirmTip = $card->fromType == '' ? $this->lang->kanbancard->confirmDelete : $this->lang->kanbancard->confirmRemove; + return print(js::confirm($confirmTip, $this->createLink('kanban', 'deleteCard', "cardID=$cardID&confirm=yes"))); } else { - $this->kanban->delete(TABLE_KANBANCARD, $cardID); + if($card->fromType == '') $this->kanban->delete(TABLE_KANBANCARD, $cardID); + if($card->fromType != '') + { + $this->dao->delete()->from(TABLE_KANBANCARD)->where('id')->eq($cardID)->exec(); + $this->loadModel('action')->create('kanbancard', $cardID, 'Deleted', '', $cardID); + } if(isonlybody()) return print(js::reload('parent.parent')); return print(js::reload('parent')); diff --git a/module/kanban/js/view.js b/module/kanban/js/view.js index a7e66e4e40..1ba790454f 100644 --- a/module/kanban/js/view.js +++ b/module/kanban/js/view.js @@ -1086,7 +1086,7 @@ function createCardMenu(options) if(!privs.length) return []; var items = []; - if(privs.includes('editCard')) 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('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('performable') && kanban.performable == 1) { if(card.status == 'done') @@ -1125,7 +1125,7 @@ function createCardMenu(options) if(privs.includes('setCardColor')) { var cardColoritems = []; - if(!card.color) color = "#fff"; + if(!card.color) card.color = "#fff"; for(let i = 0 ; i < colorList.length ; i ++ ) { var attr = card.color == colorList[i] ? '' : ''; @@ -1135,7 +1135,7 @@ function createCardMenu(options) }; items.push({label: kanbanLang.cardColor, icon: 'color', items: cardColoritems}); } - if(privs.includes('deleteCard')) items.push({label: kanbanLang.deleteCard, icon: 'trash', url: createLink('kanban', 'deleteCard', 'cardID=' + card.id), attrs: {'target': 'hiddenwin'}}); + 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'}}); var bounds = options.$trigger[0].getBoundingClientRect(); items.$options = {x: bounds.right, y: bounds.top}; diff --git a/module/kanban/lang/en.php b/module/kanban/lang/en.php index b6d8efb4a2..cce018447c 100644 --- a/module/kanban/lang/en.php +++ b/module/kanban/lang/en.php @@ -40,6 +40,7 @@ $lang->kanban->moveCard = 'Move Card'; $lang->kanban->cardColor = 'Card Color'; $lang->kanban->setCardColor = 'Set Card Color'; $lang->kanban->deleteCard = 'Delete Card'; +$lang->kanban->removeCard = 'Remove Card'; $lang->kanban->assigntoCard = 'Assign'; $lang->kanban->setting = 'Setting'; $lang->kanban->enableArchived = 'Enable Archived'; @@ -365,6 +366,7 @@ $lang->kanbancard->confirmArchive = 'Are you sure to archive this card? After $lang->kanbancard->confirmDelete = 'Are you sure to delete this card? After deleting the card, it will be deleted from the Kanban. You can only view it in the system recycle bin.'; $lang->kanbancard->confirmRestore = "Are you sure you want to restore this card? After the card is restored, the card will be restored to the '%s' Kanban column."; $lang->kanbancard->confirmRestoreTip = "The card's column has been archived or deleted, please restore '%s' column first."; +$lang->kanbancard->confirmRemove = 'Are you sure to remove this card? After removing the card, the original data would not be affected.The card would be removed from the Kanban and counld not be restored.'; $lang->kanbancard->priList[1] = 1; $lang->kanbancard->priList[2] = 2; diff --git a/module/kanban/lang/zh-cn.php b/module/kanban/lang/zh-cn.php index 3b30ccdcdf..00a8305975 100644 --- a/module/kanban/lang/zh-cn.php +++ b/module/kanban/lang/zh-cn.php @@ -40,6 +40,7 @@ $lang->kanban->moveCard = '移动卡片'; $lang->kanban->cardColor = '卡片颜色'; $lang->kanban->setCardColor = '设置卡片颜色'; $lang->kanban->deleteCard = '删除卡片'; +$lang->kanban->removeCard = '移除卡片'; $lang->kanban->assigntoCard = '指派'; $lang->kanban->setting = '设置'; $lang->kanban->enableArchived = '设置归档功能'; @@ -365,6 +366,7 @@ $lang->kanbancard->confirmArchive = '您确认归档该卡片吗?归档卡 $lang->kanbancard->confirmDelete = '您确认删除该卡片吗?删除卡片后,该卡片将从看板中删除,您只能通过系统回收站查看。'; $lang->kanbancard->confirmRestore = '您确定要还原该卡片吗?还原卡片后,该卡片将还原到“%s”看板列中。'; $lang->kanbancard->confirmRestoreTip = '该卡片所属的看板列已被归档或删除,请先还原“%s”看板列。'; +$lang->kanbancard->confirmRemove = '您确认移除该卡片吗?移除卡片后,源数据不会受到影响,卡片将从看板中移除且无法恢复。'; $lang->kanbancard->priList[1] = 1; $lang->kanbancard->priList[2] = 2; diff --git a/module/kanban/view/viewarchivedcard.html.php b/module/kanban/view/viewarchivedcard.html.php index 107abd4988..e5fd50c1f5 100644 --- a/module/kanban/view/viewarchivedcard.html.php +++ b/module/kanban/view/viewarchivedcard.html.php @@ -104,7 +104,7 @@ $app->loadLang('productplan');
{$card->fromType}->statusList[$card->objectStatus];?> fromType == 'build'):?> - createLink('build', 'view', "id=$card->fromID"), $card->name, '', "class='cardName' title='$card->name'");?> + createLink('build', 'view', "id=$card->fromID"), $card->name, '', "class='cardName' title='$card->name' data-app='project'");?>
date)):?> date));?> @@ -167,7 +167,7 @@ $app->loadLang('productplan'); if($canRestore) echo html::a(inlink('restoreCard', "cardID={$card->id}"), $lang->kanban->restore, '', "class='btn btn-xs btn-primary' target='hiddenwin'"); - if($canDelete) echo html::a($this->createLink('kanban', 'deleteCard', "cardID=$card->id"), $lang->delete, '', "class='btn btn-xs delete-card' target='hiddenwin'"); + if($canDelete) echo html::a($this->createLink('kanban', 'deleteCard', "cardID=$card->id"), $card->fromType == '' ? $lang->delete : $lang->unlink, '', "class='btn btn-xs delete-card' target='hiddenwin'"); ?>
From fe3c882c5e7268e5b82e2df845c5b105bfb6f93a Mon Sep 17 00:00:00 2001 From: wangyuting2 <851424971@qq.com> Date: Tue, 10 May 2022 16:32:04 +0800 Subject: [PATCH 073/166] * Adjust buildin workflow menu. --- framework/control.class.php | 5 +- framework/model.class.php | 15 ++- module/caselib/model.php | 61 ++++++++++++ module/caselib/view/browse.html.php | 10 +- module/caselib/view/view.html.php | 12 +-- module/testcase/model.php | 130 ++++++++++++++++++++++---- module/testcase/view/view.html.php | 36 +------ module/testsuite/model.php | 23 +++++ module/testsuite/view/browse.html.php | 6 +- module/testsuite/view/view.html.php | 4 - module/testtask/model.php | 72 ++++++++++++++ module/testtask/view/browse.html.php | 15 +-- module/testtask/view/view.html.php | 17 ---- 13 files changed, 296 insertions(+), 110 deletions(-) diff --git a/framework/control.class.php b/framework/control.class.php index c7666ca0db..381e637cb8 100644 --- a/framework/control.class.php +++ b/framework/control.class.php @@ -320,7 +320,10 @@ class control extends baseControl if(!isset($this->config->bizVersion)) return false; $moduleName = $this->moduleName; - if($moduleName == 'bug' || $moduleName == 'feedback') return $this->$moduleName->buildOperateMenu($object, $type); + if($moduleName == 'bug' || $moduleName == 'feedback' || $moduleName == 'caselib' || $moduleName == 'testsuite' || $moduleName == 'testtask' || $moduleName == 'testcase') + { + return $this->$moduleName->buildOperateMenu($object, $type); + } $flow = $this->loadModel('workflow')->getByModule($moduleName); return $this->loadModel('flow')->buildOperateMenu($flow, $object, $type); diff --git a/framework/model.class.php b/framework/model.class.php index 267fbc1edf..7f58ebbde1 100644 --- a/framework/model.class.php +++ b/framework/model.class.php @@ -83,7 +83,12 @@ class model extends baseModel if(isset($this->config->bizVersion)) { static $actions; - if(empty($actions)) $actions = $this->dao->select('*')->from(TABLE_WORKFLOWACTION)->where('module')->eq($moduleName)->andWhere('buildin')->eq('1')->andWhere('status')->eq('enable')->fetchAll('action'); + if(empty($actions)) $actions = $this->dao->select('*')->from(TABLE_WORKFLOWACTION) + ->where('module')->eq($moduleName) + ->andWhere('buildin')->eq('1') + ->andWhere('status')->eq('enable') + ->beginIF(!empty($this->config->vision))->andWhere('vision')->eq($this->config->vision)->fi() + ->fetchAll('action'); } $enabled = true; @@ -133,7 +138,13 @@ class model extends baseModel if(strpos($module, '.') !== false) list($appName, $moduleName) = explode('.', $module); static $actions; - if(empty($actions)) $actions = $this->dao->select('*')->from(TABLE_WORKFLOWACTION)->where('module')->eq($moduleName)->andWhere('buildin')->eq('0')->andWhere('status')->eq('enable')->orderBy('order_asc')->fetchAll(); + if(empty($actions)) $actions = $this->dao->select('*')->from(TABLE_WORKFLOWACTION) + ->where('module')->eq($moduleName) + ->andWhere('buildin')->eq('0') + ->andWhere('status')->eq('enable') + ->beginIF(!empty($this->config->vision))->andWhere('vision')->eq($this->config->vision)->fi() + ->orderBy('order_asc') + ->fetchAll(); $menu = ''; if($show) diff --git a/module/caselib/model.php b/module/caselib/model.php index 19e11a3c29..1be4157617 100644 --- a/module/caselib/model.php +++ b/module/caselib/model.php @@ -594,4 +594,65 @@ class caselibModel extends model } } } + + /** + * Build case lib menu. + * + * @param object $object + * @param string $type + * @access public + * @return string + */ + public function buildOperateMenu($object, $type = 'view') + { + $function = 'buildOperate' . ucfirst($type) . 'Menu'; + return $this->$function($object); + } + + /** + * Build case lib view menu. + * + * @param object $lib + * @access public + * @return string + */ + public function buildOperateViewMenu($lib) + { + if($lib->deleted) return ''; + + $menu = ''; + $params = "libID=$lib->id"; + $menu .= $this->buildFlowMenu('caselib', $lib, 'view', 'direct'); + $menu .= "
"; + $menu .= $this->buildMenu('caselib', 'edit', $params, $lib, 'view'); + $menu .= $this->buildMenu('caselib', 'delete', $params, $lib, 'view', 'trash', 'hiddenwin'); + + return $menu; + } + + /** + * Build case lib browse menu. + * + * @param object $case + * @access public + * @return string + */ + public function buildOperateBrowseMenu($case) + { + $menu = ''; + $params = "caseID=$case->id"; + + if($this->config->testcase->needReview || !empty($this->config->testcase->forceReview)) + { + $menu .= $this->buildMenu('testcase', 'review', $params, $case, 'browse', 'glasses', '', 'iframe'); + } + $menu .= $this->buildMenu('testcase', 'edit', $params, $case, 'browse'); + if(common::hasPriv('testcase', 'delete')) + { + $deleteURL = helper::createLink('testcase', 'delete', "$params&confirm=yes"); + $menu .= html::a("javascript:ajaxDelete(\"$deleteURL\", \"caseList\", confirmDelete)", '', '', "title='{$this->lang->testcase->delete}' class='btn'"); + } + + return $menu; + } } diff --git a/module/caselib/view/browse.html.php b/module/caselib/view/browse.html.php index 5fc8f8174d..35101bfe14 100644 --- a/module/caselib/view/browse.html.php +++ b/module/caselib/view/browse.html.php @@ -157,15 +157,7 @@ js::set('flow', $config->global->flow); processStatus('testcase', $case);?> " . $this->loadModel('flow')->getFieldValue($extendField, $case) . "";?> - testcase->needReview or !empty($config->testcase->forceReview)) common::printIcon('testcase', 'review', "caseID=$case->id", $case, 'list', 'glasses', '', 'iframe'); - common::printIcon('testcase', 'edit', "caseID=$case->id", $case, 'list'); - if(common::hasPriv('testcase', 'delete')) - { - $deleteURL = $this->createLink('testcase', 'delete', "caseID=$case->id&confirm=yes"); - echo html::a("javascript:ajaxDelete(\"$deleteURL\", \"caseList\", confirmDelete)", '', '', "title='{$lang->testcase->delete}' class='btn'"); - } - ?> + buildOperateMenu($case, 'browse');?> diff --git a/module/caselib/view/view.html.php b/module/caselib/view/view.html.php index 1d3b1dc160..868c67dccc 100644 --- a/module/caselib/view/view.html.php +++ b/module/caselib/view/view.html.php @@ -37,15 +37,9 @@
- deleted) - { - echo "
"; - common::printIcon('caselib', 'edit', "libID=$lib->id"); - common::printIcon('caselib', 'delete', "libID=$lib->id", '', 'button', 'trash', 'hiddenwin'); - } - ?> + +
";?> + buildOperateMenu($lib, 'view');?>
diff --git a/module/testcase/model.php b/module/testcase/model.php index ad0f5a2c6b..6316e0a981 100644 --- a/module/testcase/model.php +++ b/module/testcase/model.php @@ -1715,22 +1715,8 @@ class testcaseModel extends model echo $case->stepNumber; break; case 'actions': - if($canBeChanged) - { - if($case->needconfirm or $browseType == 'needconfirm') - { - common::printIcon('testcase', 'confirmstorychange', "caseID=$case->id", $case, 'list', 'confirm', 'hiddenwin', '', '', '', $this->lang->confirm); - break; - } - - common::printIcon('testtask', 'results', "runID=0&caseID=$case->id", $case, 'list', '', '', 'iframe', true, "data-width='95%'"); - common::printIcon('testtask', 'runCase', "runID=0&caseID=$case->id&version=$case->version", $case, 'list', 'play', '', 'runCase iframe', false, "data-width='95%'"); - common::printIcon('testcase', 'edit', "caseID=$case->id", $case, 'list'); - if($this->config->testcase->needReview or !empty($this->config->testcase->forceReview)) common::printIcon('testcase', 'review', "caseID=$case->id", $case, 'list', 'glasses', '', 'iframe'); - common::printIcon('testcase', 'createBug', "product=$case->product&branch=$case->branch&extra=caseID=$case->id,version=$case->version,runID=", $case, 'list', 'bug', '', 'iframe', '', "data-width='90%'"); - common::printIcon('testcase', 'create', "productID=$case->product&branch=$case->branch&moduleID=$case->module&from=testcase¶m=$case->id", $case, 'list', 'copy'); - } - + $case->browseType = $browseType; + echo $this->buildOperateMenu($case, 'browse'); break; } echo ''; @@ -2016,4 +2002,116 @@ class testcaseModel extends model return ''; } + + /** + * Build test case menu. + * + * @param object $case + * @param string $type + * @access public + * @return string + */ + public function buildOperateMenu($case, $type = 'view') + { + $function = 'buildOperate' . ucfirst($type) . 'Menu'; + return $this->$function($case); + } + + /** + * Build test case view menu. + * + * @param object $case + * @access public + * @return string + */ + public function buildOperateViewMenu($case) + { + if($case->deleted) return ''; + + $menu = ''; + $params = "caseID=$case->id"; + $extraParams = "runID=$case->runID&$params"; + if(!$case->needconfirm) + { + if(!$case->isLibCase) + { + if($this->app->getViewType() == 'xhtml') + { + $menu .= $this->buildMenu('testtask', 'runCase', "$extraParams&version=$case->currentVersion", $case, 'view', 'play', '', 'showinonlybody', false, "data-width='95%'"); + $menu .= $this->buildMenu('testtask', 'results', "$extraParams&version=$case->version", $case, 'view', '', '', 'showinonlybody', false, "data-width='95%'"); + } + else + { + $menu .= $this->buildMenu('testtask', 'runCase', "$extraParams&version=$case->currentVersion", $case, 'view', 'play', '', 'showinonlybody iframe', false, "data-width='95%'"); + $menu .= $this->buildMenu('testtask', 'results', "$extraParams&version=$case->version", $case, 'view', '', '', 'showinonlybody iframe', false, "data-width='95%'"); + } + if($case->caseFails > 0) + { + $menu .= $this->buildMenu('testcase', 'createBug', "product=$case->product&branch=$case->branch&extra=$params,version=$case->version,runID=$case->runID", $case, 'view', 'bug', '', 'iframe', '', "data-width='90%'"); + } + } + if($this->config->testcase->needReview || !empty($this->config->testcase->forceReview)) + { + $menu .= $this->buildMenu('testcase', 'review', $params, $case, 'view', '', '', 'iframe', '', '', $this->lang->testcase->reviewAB); + } + } + else + { + $menu .= $this->buildMenu('testcase', 'confirmstorychange', $params, $case, 'view', 'confirm', 'hiddenwin', '', '', '', $this->lang->confirm); + } + + $menu .= "
"; + $menu .= $this->buildFlowMenu('testcase', $case, 'view', 'direct'); + $menu .= "
"; + + if(!$case->needconfirm) + { + if(!isonlybody()) $menu .= $this->buildMenu('testcase', 'edit', $params, $case, 'view', '', '', 'showinonlybody'); + if(!$case->isLibCase && $case->auto != 'unit') + { + $menu .= $this->buildMenu('testcase', 'create', "productID=$case->product&branch=$case->branch&moduleID=$case->module&from=testcase¶m=$case->id", $case, 'view', 'copy'); + } + if($case->isLibCase && common::hasPriv('caselib', 'createCase')) + { + echo html::a(helper::createLink('caselib', 'createCase', "libID=$case->lib&moduleID=$case->module¶m=$case->id"), "", '', "class='btn' title='{$this->lang->testcase->copy}'"); + } + + $menu .= $this->buildMenu('testcase', 'delete', $params, $case, 'view', 'trash', 'hiddenwin', ''); + } + + return $menu; + } + + /** + * Build test case browse menu. + * + * @param object $case + * @access public + * @return string + */ + public function buildOperateBrowseMenu($case) + { + $canBeChanged = common::canBeChanged('case', $case); + if(!$canBeChanged) return ''; + + $menu = ''; + $params = "caseID=$case->id"; + + if($case->needconfirm || $case->browseType == 'needconfirm') + { + return $this->buildMenu('testcase', 'confirmstorychange', $params, $case, 'browse', 'confirm', 'hiddenwin', '', '', '', $this->lang->confirm); + } + + $menu .= $this->buildMenu('testtask', 'results', "runID=0&$params", $case, 'browse', '', '', 'iframe', true, "data-width='95%'"); + $menu .= $this->buildMenu('testtask', 'runCase', "runID=0&$params&version=$case->version", $case, 'browse', 'play', '', 'runCase iframe', false, "data-width='95%'"); + $menu .= $this->buildMenu('testcase', 'edit', "caseID=$case->id", $case, 'browse'); + if($this->config->testcase->needReview || !empty($this->config->testcase->forceReview)) + { + common::printIcon('testcase', 'review', $params, $case, 'browse', 'glasses', '', 'iframe'); + } + $menu .= $this->buildMenu('testcase', 'createBug', "product=$case->product&branch=$case->branch&extra=caseID=$case->id,version=$case->version,runID=", $case, 'browse', 'bug', '', 'iframe', '', "data-width='90%'"); + $menu .= $this->buildMenu('testcase', 'create', "productID=$case->product&branch=$case->branch&moduleID=$case->module&from=testcase¶m=$case->id", $case, 'browse', 'copy'); + + return $menu; + } } diff --git a/module/testcase/view/view.html.php b/module/testcase/view/view.html.php index 37a3ad7e13..28a613dd52 100644 --- a/module/testcase/view/view.html.php +++ b/module/testcase/view/view.html.php @@ -112,41 +112,11 @@
- deleted):?>
";?> - needconfirm):?> -
"; - if($this->app->getViewType() == 'xhtml') - { - common::printIcon('testtask', 'runCase', "runID=$runID&caseID=$case->id&version=$case->currentVersion", $case, 'button', 'play', '', 'showinonlybody', false, "data-width='95%'"); - common::printIcon('testtask', 'results', "runID=$runID&caseID=$case->id&version=$case->version", $case, 'button', '', '', 'showinonlybody', false, "data-width='95%'"); - } - else - { - common::printIcon('testtask', 'runCase', "runID=$runID&caseID=$case->id&version=$case->currentVersion", $case, 'button', 'play', '', 'showinonlybody iframe', false, "data-width='95%'"); - common::printIcon('testtask', 'results', "runID=$runID&caseID=$case->id&version=$case->version", $case, 'button', '', '', 'showinonlybody iframe', false, "data-width='95%'"); - } - - if($caseFails > 0) common::printIcon('testcase', 'createBug', "product=$case->product&branch=$case->branch&extra=caseID=$case->id,version=$case->version,runID=$runID", $case, 'button', 'bug', '', 'iframe', '', "data-width='90%'"); - } - if($config->testcase->needReview or !empty($config->testcase->forceReview)) common::printIcon('testcase', 'review', "caseID=$case->id", $case, 'button', '', '', 'iframe', '', '', $lang->testcase->reviewAB); - ?> - + isLibCase = $isLibCase;?> + caseFails = $caseFails;?> + runID = $runID;?> buildOperateMenu($case, 'view');?> - - id", $case, 'button', '', '', 'showinonlybody'); - if(!$isLibCase and $case->auto != 'unit') common::printIcon('testcase', 'create', "productID=$case->product&branch=$case->branch&moduleID=$case->module&from=testcase¶m=$case->id", $case, 'button', 'copy'); - if($isLibCase and common::hasPriv('caselib', 'createCase')) echo html::a($this->createLink('caselib', 'createCase', "libID=$case->lib&moduleID=$case->module¶m=$case->id"), "", '', "class='btn' title='{$lang->testcase->copy}'"); - common::printIcon('testcase', 'delete', "caseID=$case->id", $case, 'button', 'trash', 'hiddenwin', ''); - ?> - needconfirm):?> - id", $case, 'list', 'confirm', 'hiddenwin', '', '', '', $this->lang->confirm);?> - -
diff --git a/module/testsuite/model.php b/module/testsuite/model.php index bb3470d280..9ddaf7a619 100644 --- a/module/testsuite/model.php +++ b/module/testsuite/model.php @@ -325,4 +325,27 @@ class testsuiteModel extends model ->page($pager) ->fetchAll('id'); } + + + /** + * Build testsuite menu. + * + * @param object $suite + * @param string $type + * @access public + * @return string + */ + public function buildOperateMenu($suite, $type = 'view') + { + $menu = ''; + $params = "suiteID=$suite->id"; + + if($type == 'view') $menu .= $this->buildFlowMenu('testsuite', $suite, $type, 'direct'); + + $menu .= $this->buildMenu('testsuite', 'linkCase', $params, $suite, $type, 'link', '', '', '', '', $this->lang->testsuite->linkCase); + $menu .= $this->buildMenu('testsuite', 'edit', $params, $suite, $type); + $menu .= $this->buildMenu('testsuite', 'delete', $params, $suite, $type, 'trash', 'hiddenwin'); + + return $menu; + } } diff --git a/module/testsuite/view/browse.html.php b/module/testsuite/view/browse.html.php index a4d24ca90e..70fd6b4070 100644 --- a/module/testsuite/view/browse.html.php +++ b/module/testsuite/view/browse.html.php @@ -70,11 +70,7 @@ addedDate;?> " . $this->loadModel('flow')->getFieldValue($extendField, $suite) . "";?> - id", $suite, 'list', 'link'); - common::printIcon('testsuite', 'edit', "suiteID=$suite->id", $suite, 'list'); - common::printIcon('testsuite', 'delete', "suiteID=$suite->id", $suite, 'list', 'trash', 'hiddenwin'); - ?> + buildOperateMenu($suite, 'browse');?> diff --git a/module/testsuite/view/view.html.php b/module/testsuite/view/view.html.php index b3e3faf113..6a44d631bc 100644 --- a/module/testsuite/view/view.html.php +++ b/module/testsuite/view/view.html.php @@ -32,10 +32,6 @@ if(!$suite->deleted and $canBeChanged) { echo $this->buildOperateMenu($suite, 'view'); - - common::printLink('testsuite', 'linkCase', "suiteID=$suite->id", " " . '', '', "class='btn btn-link' title='{$lang->testsuite->linkCase}'"); - common::printIcon('testsuite', 'edit', "suiteID=$suite->id"); - common::printIcon('testsuite', 'delete', "suiteID=$suite->id", '', 'button', 'trash', 'hiddenwin'); } ?> diff --git a/module/testtask/model.php b/module/testtask/model.php index ab145e1f10..8caf00e163 100644 --- a/module/testtask/model.php +++ b/module/testtask/model.php @@ -2160,4 +2160,76 @@ class testtaskModel extends model return array('suites' => $suites, 'cases' => $cases, 'results' => $results, 'suiteNames' => $suiteNames, 'caseTitles' => $caseTitles); } + + /** + * Build test task menu. + * + * @param object $task + * @param string $type + * @access public + * @return string + */ + public function buildOperateMenu($task, $type = 'view') + { + $function = 'buildOperate' . ucfirst($type) . 'Menu'; + return $this->$function($task); + } + + /** + * Build test task view menu. + * + * @param object $task + * @access public + * @return string + */ + public function buildOperateViewMenu($task) + { + if($task->deleted) return ''; + + $menu = ''; + $params = "taskID=$task->id"; + + $menu .= $this->buildMenu('testtask', 'start', $params, $task, 'view', '', '', 'iframe showinonlybody', true); + $menu .= $this->buildMenu('testtask', 'close', $params, $task, 'view', '', '', 'iframe showinonlybody', true); + $menu .= $this->buildMenu('testtask', 'block', $params, $task, 'view', 'pause', '', 'iframe showinonlybody', true); + $menu .= $this->buildMenu('testtask', 'activate', $params, $task, 'view', 'magic', '', 'iframe showinonlybody', true); + $menu .= $this->buildMenu('testtask', 'cases', $params, $task, 'view', 'sitemap'); + $menu .= $this->buildMenu('testtask', 'linkCase', $params, $task, 'view', 'link'); + + $menu .= "
"; + $menu .= $this->buildFlowMenu('testtask', $task, 'view', 'direct'); + $menu .= "
"; + + $menu .= $this->buildMenu('testtask', 'edit', $params, $task, 'view'); + $menu .= $this->buildMenu('testtask', 'delete', $params, $task, 'view', 'trash', 'hiddenwin'); + + return $menu; + } + + /** + * Build test task browse menu. + * + * @param object $task + * @access public + * @return string + */ + public function buildOperateBrowseMenu($task) + { + $menu = ''; + $params = "taskID=$task->id"; + + $menu .= '
'; + $menu .= $this->buildMenu('testtask', 'cases', $params, $task, 'browse', 'sitemap'); + $menu .= $this->buildMenu('testtask', 'linkCase', "$params&type=all¶m=myQueryID", $task, 'browse', 'link'); + $menu .= $this->buildMenu('testreport', 'browse', "objectID=$task->product&objectType=product&extra=$task->id", $task, 'browse', 'flag'); + $menu .= '
'; + $menu .= $this->buildMenu('testtask', 'view', $params, $task, 'browse', 'list-alt', '', 'iframe', true, "data-width='90%'"); + $menu .= $this->buildMenu('testtask', 'edit', $params, $task, 'browse'); + if(common::hasPriv('testtask', 'delete', $task)) + { + $deleteURL = helper::createLink('testtask', 'delete', "taskID=$task->id&confirm=yes"); + $menu .= html::a("javascript:ajaxDelete(\"$deleteURL\",\"taskList\",confirmDelete)", '', '', "title='{$this->lang->testtask->delete}' class='btn'"); + } + return $menu; + } } diff --git a/module/testtask/view/browse.html.php b/module/testtask/view/browse.html.php index 74b54c4461..e417cb11f6 100644 --- a/module/testtask/view/browse.html.php +++ b/module/testtask/view/browse.html.php @@ -102,20 +102,7 @@ $status = $this->session->testTaskVersionStatus; " . $this->loadModel('flow')->getFieldValue($extendField, $task) . "";?> - '; - common::printIcon('testtask', 'cases', "taskID=$task->id", $task, 'list', 'sitemap'); - common::printIcon('testtask', 'linkCase', "taskID=$task->id&type=all¶m=myQueryID", $task, 'list', 'link'); - common::printIcon('testreport', 'browse', "objectID=$task->product&objectType=product&extra=$task->id", $task, 'list', 'flag'); - echo ''; - common::printIcon('testtask', 'view', "taskID=$task->id", '', 'list', 'list-alt', '', 'iframe', true, "data-width='90%'"); - common::printIcon('testtask', 'edit', "taskID=$task->id", $task, 'list'); - if(common::hasPriv('testtask', 'delete', $task)) - { - $deleteURL = $this->createLink('testtask', 'delete', "taskID=$task->id&confirm=yes"); - echo html::a("javascript:ajaxDelete(\"$deleteURL\",\"taskList\",confirmDelete)", '', '', "title='{$lang->testtask->delete}' class='btn'"); - } - ?> + buildOperateMenu($task, 'browse');?> diff --git a/module/testtask/view/view.html.php b/module/testtask/view/view.html.php index 14fa49a23d..7324b9d56e 100644 --- a/module/testtask/view/view.html.php +++ b/module/testtask/view/view.html.php @@ -50,25 +50,8 @@
' . $lang->goback, '', 'btn btn-secondary');?> - deleted):?>
- id", $task, 'button', '', '', 'iframe showinonlybody', true); - common::printIcon('testtask', 'close', "taskID=$task->id", $task, 'button', '', '', 'iframe showinonlybody', true); - common::printIcon('testtask', 'block', "taskID=$task->id", $task, 'button', 'pause', '', 'iframe showinonlybody', true); - common::printIcon('testtask', 'activate', "taskID=$task->id", $task, 'button', 'magic', '', 'iframe showinonlybody', true); - common::printIcon('testtask', 'cases', "taskID=$task->id", $task, 'button', 'sitemap'); - common::printIcon('testtask', 'linkCase', "taskID=$task->id", $task, 'button', 'link'); - ?> - buildOperateMenu($task, 'view');?> - -
- id", $task); - common::printIcon('testtask', 'delete', "taskID=$task->id", $task, 'button', 'trash', 'hiddenwin'); - ?> -
From 248683c67dbfc94af49eb36e0fbb28fdb59337c8 Mon Sep 17 00:00:00 2001 From: wangyuting2 <851424971@qq.com> Date: Tue, 10 May 2022 16:36:06 +0800 Subject: [PATCH 074/166] * Merge code. --- framework/control.class.php | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/framework/control.class.php b/framework/control.class.php index 381e637cb8..926fab0f05 100644 --- a/framework/control.class.php +++ b/framework/control.class.php @@ -320,10 +320,7 @@ class control extends baseControl if(!isset($this->config->bizVersion)) return false; $moduleName = $this->moduleName; - if($moduleName == 'bug' || $moduleName == 'feedback' || $moduleName == 'caselib' || $moduleName == 'testsuite' || $moduleName == 'testtask' || $moduleName == 'testcase') - { - return $this->$moduleName->buildOperateMenu($object, $type); - } + if(strpos(',bug,feedback,caselib,testsuite,testtask,testcase,product,', ",{$moduleName},") !== false) return $this->$moduleName->buildOperateMenu($object, $type); $flow = $this->loadModel('workflow')->getByModule($moduleName); return $this->loadModel('flow')->buildOperateMenu($flow, $object, $type); From bcf64c0c54902255c1af46643f600e9cc54567a0 Mon Sep 17 00:00:00 2001 From: wangyuting2 <851424971@qq.com> Date: Tue, 10 May 2022 16:41:36 +0800 Subject: [PATCH 075/166] * Optimize code. --- framework/model.class.php | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/framework/model.class.php b/framework/model.class.php index 7f58ebbde1..be9480d01f 100644 --- a/framework/model.class.php +++ b/framework/model.class.php @@ -83,12 +83,15 @@ class model extends baseModel if(isset($this->config->bizVersion)) { static $actions; - if(empty($actions)) $actions = $this->dao->select('*')->from(TABLE_WORKFLOWACTION) - ->where('module')->eq($moduleName) - ->andWhere('buildin')->eq('1') - ->andWhere('status')->eq('enable') - ->beginIF(!empty($this->config->vision))->andWhere('vision')->eq($this->config->vision)->fi() - ->fetchAll('action'); + if(empty($actions)) + { + $actions = $this->dao->select('*')->from(TABLE_WORKFLOWACTION) + ->where('module')->eq($moduleName) + ->andWhere('buildin')->eq('1') + ->andWhere('status')->eq('enable') + ->beginIF(!empty($this->config->vision))->andWhere('vision')->eq($this->config->vision)->fi() + ->fetchAll('action'); + } } $enabled = true; @@ -138,13 +141,16 @@ class model extends baseModel if(strpos($module, '.') !== false) list($appName, $moduleName) = explode('.', $module); static $actions; - if(empty($actions)) $actions = $this->dao->select('*')->from(TABLE_WORKFLOWACTION) - ->where('module')->eq($moduleName) - ->andWhere('buildin')->eq('0') - ->andWhere('status')->eq('enable') - ->beginIF(!empty($this->config->vision))->andWhere('vision')->eq($this->config->vision)->fi() - ->orderBy('order_asc') - ->fetchAll(); + if(empty($actions)) + { + $actions = $this->dao->select('*')->from(TABLE_WORKFLOWACTION) + ->where('module')->eq($moduleName) + ->andWhere('buildin')->eq('0') + ->andWhere('status')->eq('enable') + ->beginIF(!empty($this->config->vision))->andWhere('vision')->eq($this->config->vision)->fi() + ->orderBy('order_asc') + ->fetchAll(); + } $menu = ''; if($show) From bd06901bfa40f8197df2c548edfd1967c4f50863 Mon Sep 17 00:00:00 2001 From: tanghucheng Date: Tue, 10 May 2022 08:52:05 +0000 Subject: [PATCH 076/166] * Fix bug. --- db/update16.5.sql | 4 ---- 1 file changed, 4 deletions(-) diff --git a/db/update16.5.sql b/db/update16.5.sql index 47c6e3031c..46afc5aa1d 100644 --- a/db/update16.5.sql +++ b/db/update16.5.sql @@ -91,15 +91,11 @@ DELETE FROM `zt_config` WHERE `section` = 'customMenu'; UPDATE `zt_story` SET `plan` = '' WHERE `plan` = 0; UPDATE `zt_workflowfield` set `control` = 'datetime' WHERE `module` = 'testcase' and `field` IN ('openedDate','reviewedDate','lastEditedDate','lastRunDate'); -UPDATE `zt_workflowfield` set `control` = 'select' WHERE `module` = 'testcase' and `field` = 'lib'; UPDATE `zt_workflowfield` set `control` = 'date' WHERE `module` = 'testtask' and `field` IN ('begin','end'); UPDATE `zt_workflowfield` set `control` = 'richtext' WHERE `module` = 'testtask' and `field` = 'desc'; UPDATE `zt_workflowfield` set `control` = 'datetime' WHERE `module` IN ('testsuite','caselib') and `field` IN ('addedDate','lastEditedDate'); -UPDATE `zt_workflowfield` set `control` = 'select' WHERE `module` = 'testsuite' and `field` = 'type'; UPDATE `zt_workflowfield` set `control` = 'richtext' WHERE `module` = 'testsuite' and `field` = 'desc'; UPDATE `zt_workflowfield` set `control` = 'datetime' WHERE `module` = 'feedback' and `field` IN ('openedDate','reviewedDate','processedDate','closedDate','editedDate','assignedDate'); -UPDATE `zt_workflowfield` set `control` = 'select' WHERE `module` = 'feedback' and `field` IN ('public','notify'); - From d8d6ce45f7e3fd78e3878d46b8237c4dbf54e763 Mon Sep 17 00:00:00 2001 From: zenggang Date: Tue, 10 May 2022 08:58:00 +0000 Subject: [PATCH 077/166] * Finish task#53653 --- module/program/control.php | 11 +++++++++-- module/program/js/browse.js | 4 ++++ module/program/lang/en.php | 1 + module/program/lang/zh-cn.php | 1 + module/program/model.php | 17 +++++++++++++---- module/program/view/browse.html.php | 1 + module/program/view/browsebylist.html.php | 1 + 7 files changed, 30 insertions(+), 6 deletions(-) diff --git a/module/program/control.php b/module/program/control.php index 54e34c9fa2..3ef0331eb9 100644 --- a/module/program/control.php +++ b/module/program/control.php @@ -26,13 +26,16 @@ class program extends control * @access public * @return void */ - public function browse($status = 'all', $orderBy = 'order_asc') + public function browse($status = 'all', $orderBy = 'order_asc', $recTotal = 0, $recPerPage = 10, $pageID = 1) { if(common::hasPriv('program', 'create')) $this->lang->pageActions = html::a($this->createLink('program', 'create'), " " . $this->lang->program->create, '', "class='btn btn-primary create-program-btn'"); $this->session->set('programList', $this->app->getURI(true), 'program'); $this->session->set('projectList', $this->app->getURI(true), 'program'); + $this->app->loadClass('pager', $static = true); + $pager = new pager($recTotal, $recPerPage, $pageID); + $programType = $this->cookie->programType ? $this->cookie->programType : 'bylist'; if($programType === 'bygrid') @@ -41,7 +44,10 @@ class program extends control } else { - $programs = $this->program->getList($status, $orderBy, null, true); + $topPrograms = $this->program->getList($status, $orderBy, $pager, 'topProgram'); + $programIDs = array(); + foreach($topPrograms as $programID => $program) $programIDs[] = $programID; + $programs = $this->program->getList($status, $orderBy, null, 'byTopIDs', $programIDs); } /* Get PM id list. */ @@ -58,6 +64,7 @@ class program extends control $this->view->programs = $programs; $this->view->status = $status; $this->view->orderBy = $orderBy; + $this->view->pager = $pager; $this->view->users = $this->user->getPairs('noletter'); $this->view->userIdPairs = $this->user->getPairs('noletter|showid'); $this->view->usersAvatar = $this->user->getAvatarPairs(''); diff --git a/module/program/js/browse.js b/module/program/js/browse.js index e84d284444..b042c063d3 100644 --- a/module/program/js/browse.js +++ b/module/program/js/browse.js @@ -43,6 +43,10 @@ $(function() $('#programForm').removeClass('has-row-checked'); } }); + + var myPager = $('.pager').data('zui.pager'); + myPager.lang.pageSize = pageSize; + myPager.set(); }); function showEditCheckbox(show) diff --git a/module/program/lang/en.php b/module/program/lang/en.php index 31568de285..62bf6dce4f 100644 --- a/module/program/lang/en.php +++ b/module/program/lang/en.php @@ -71,6 +71,7 @@ $lang->program->moreProgram = 'More program'; $lang->program->stakeholderType = 'Stakeholder type'; $lang->program->parentBudget = 'Parent program surplus budget:'; $lang->program->isStakeholderKey = 'Key stakeholder'; +$lang->program->pageSize = '{recPerPage} Top Programs per page'; $lang->program->stakeholderTypeList['inside'] = 'Inside'; $lang->program->stakeholderTypeList['outside'] = 'Outside'; diff --git a/module/program/lang/zh-cn.php b/module/program/lang/zh-cn.php index c38753ce88..6afc1ca4b4 100644 --- a/module/program/lang/zh-cn.php +++ b/module/program/lang/zh-cn.php @@ -71,6 +71,7 @@ $lang->program->moreProgram = '更多项目集'; $lang->program->stakeholderType = '干系人类型'; $lang->program->parentBudget = '所属项目集剩余预算:'; $lang->program->isStakeholderKey = '关键干系人'; +$lang->program->pageSize = '每页 {recPerPage} 项顶级项目集'; $lang->program->stakeholderTypeList['inside'] = '内部'; $lang->program->stakeholderTypeList['outside'] = '外部'; diff --git a/module/program/model.php b/module/program/model.php index f5bd3cdb18..892a34a19d 100644 --- a/module/program/model.php +++ b/module/program/model.php @@ -133,8 +133,15 @@ class programModel extends model * @access public * @return array */ - public function getList($status = 'all', $orderBy = 'id_asc', $pager = NULL) + public function getList($status = 'all', $orderBy = 'id_asc', $pager = NULL, $filter = '', $filterParams = '') { + $filterSql = ''; + if($filter === 'byTopIDs') + { + foreach($filterParams as $topID) $filterSql .= "path like ',{$topID},%' or "; + if($filterSql) $filterSql = '(' . substr($filterSql, 0, -3) . ')'; // Remove last or. + } + return $this->dao->select('*')->from(TABLE_PROGRAM) ->where('deleted')->eq(0) ->andWhere('vision')->eq($this->config->vision) @@ -146,6 +153,8 @@ class programModel extends model ->markRight(2) ->beginIF($status != 'all')->andWhere('status')->eq($status)->fi() ->beginIF(!$this->cookie->showClosed)->andWhere('status')->ne('closed')->fi() + ->beginIF($filter === 'topProgram')->andWhere('parent')->eq(0)->fi() + ->beginIF(!empty($filterSql))->andWhere($filterSql)->fi() ->orderBy($orderBy) ->page($pager) ->fetchAll('id'); @@ -240,15 +249,15 @@ class programModel extends model foreach($products as $product) { $product->plans = zget($plans, $product->id, array()); - + /* Convert predefined HTML entities to characters. */ !empty($product->plans) && array_map(function($planVal) { return $planVal->title = htmlspecialchars_decode($planVal->title, ENT_QUOTES); - }, + }, $product->plans); $product->name = htmlspecialchars_decode($product->name, ENT_QUOTES); - + $product->releases = zget($releases, $product->id, array()); $projects = zget($projectGroup, $product->id, array()); foreach($projects as $project) diff --git a/module/program/view/browse.html.php b/module/program/view/browse.html.php index 6b13491250..e26b262b62 100644 --- a/module/program/view/browse.html.php +++ b/module/program/view/browse.html.php @@ -15,6 +15,7 @@ edit);?> selectAll);?> +program->pageSize);?> diff --git a/module/program/view/browsebylist.html.php b/module/program/view/browsebylist.html.php index 3271346cda..5e6a78f15e 100644 --- a/module/program/view/browsebylist.html.php +++ b/module/program/view/browsebylist.html.php @@ -138,6 +138,7 @@ + @@ -105,9 +107,12 @@ $app->loadLang('productplan'); begin) and !helper::isZeroDate($card->end) and $card->begin != '2030-01-01' and $card->end != '2030-01-01'):?> end)) . $lang->kanbancard->deadlineAB;?> - begin) and !helper::isZeroDate($card->end) and $card->begin != '2030-01-01' and $card->end != '2030-01-01'):?> + begin) and !helper::isZeroDate($card->end) and $card->begin != '2030-01-01' and $card->end != '2030-01-01' and $card->fromType == ''):?> begin)) . ' ~ ' . date("m/d", strtotime($card->end));?> + begin) and !helper::isZeroDate($card->end) and $card->begin != '2030-01-01' and $card->end != '2030-01-01' and $card->fromType != ''):?> + begin)) . ' ' . $lang->{$card->fromType}->to . ' ' . date("m-d", strtotime($card->end));?> + begin == '2030-01-01' or $card->end == '2030-01-01') echo '' . $lang->{$card->fromType}->future . ''; From 90f6f0f63f107a4b65d0940e958393b5829a1c6d Mon Sep 17 00:00:00 2001 From: daitingting Date: Wed, 11 May 2022 07:22:16 +0000 Subject: [PATCH 130/166] * Build operate menu for story module. --- module/story/model.php | 110 +++++++++++++++++++++++++------- module/story/view/view.html.php | 48 +------------- 2 files changed, 88 insertions(+), 70 deletions(-) diff --git a/module/story/model.php b/module/story/model.php index 3f5d681686..10100ef2ed 100644 --- a/module/story/model.php +++ b/module/story/model.php @@ -3760,6 +3760,92 @@ class storyModel extends model return true; } + /** + * Build operate menu. + * + * @param object $story + * @param string $type + * @access public + * @return string + */ + public function buildOperateMenu($story, $type = 'view') + { + $menu = ''; + $params = "storyID=$story->id"; + + if($type == 'browse') + { + if(common::canBeChanged('story', $story)) + { + if($story->URChanged) return $this->buildMenu('story', 'processStoryChange', $params, $story, $type, 'search', '', 'iframe', true, '', $this->lang->confirm); + + $menu .= $this->buildMenu('story', 'change', $params . "&from=$story->from", $story, $type, 'alter'); + $menu .= $this->buildMenu('story', 'review', $params . "&from=$story->from", $story, $type, 'search'); + $menu .= $this->buildMenu('story', 'recall', $params, $story, $type, 'undo', 'hiddenwin', '', '', '', $this->lang->story->recall); + $menu .= $this->buildMenu('story', 'close', $params, $story, $type, '', '', 'iframe', true); + $menu .= $this->buildMenu('story', 'edit', $params . "&from=$story->from", $story, $type); + + if($story->type != 'requirement' and $this->config->vision != 'lite') $menu .= $this->buildMenu('story', 'createCase', "productID=$story->product&branch=$story->branch&module=0&from=¶m=0&$params", $story, $type, 'sitemap', '', '', false, "data-app='qa'"); + if($this->app->rawModule != 'projectstory' OR $this->config->vision == 'lite') $menu .= $this->buildMenu('story', 'batchCreate', "productID=$story->product&branch=$story->branch&module=$story->module&$params&executionID={$this->session->project}", $story, $type, 'split', '', '', '', '', $this->lang->story->subdivide); + if($this->app->rawModule == 'projectstory' and $this->config->vision != 'lite') $menu .= $this->buildMenu('projectstory', 'unlinkStory', "projectID={$this->session->project}&$params", $story, $type, 'unlink', 'hiddenwin'); + } + else + { + return $this->buildMenu('story', 'close', $params, $story, 'list', '', '', 'iframe', true); + } + } + + if($type == 'view') + { + $menu .= $this->buildMenu('story', 'change', $params, $story, $type, 'alter', '', 'showinonlybody'); + $menu .= $this->buildMenu('story', 'recall', $params, $story, $type, 'undo', '', 'showinonlybody'); + $menu .= $this->buildMenu('story', 'review', $params, $story, $type, 'search', '', 'showinonlybody'); + + if(!isonlybody()) $menu .= $this->buildMenu('story', 'batchCreate', "productID=$story->product&branch=$story->branch&moduleID=$story->module&$params", $story, $type, 'split', '', 'divideStory', '', "data-toggle='modal' data-type='iframe' data-width='95%'", $this->lang->story->subdivide); + + $menu .= $this->buildMenu('story', 'assignTo', $params, $story, $type, '', '', 'iframe showinonlybody', true); + $menu .= $this->buildMenu('story', 'close', $params, $story, $type, '', '', 'iframe showinonlybody', true); + $menu .= $this->buildMenu('story', 'activate', $params, $story, $type, '', '', 'iframe showinonlybody', true); + + if($this->config->edition == 'max' and $this->app->tab == 'project' and common::hasPriv('story', 'importToLib')) $menu .= html::a('#importToLib', " " . $this->lang->story->importToLib, '', 'class="btn" data-toggle="modal"'); + + /* Print testcate actions. */ + if($story->parent >= 0 and $story->type != 'requirement' and (common::hasPriv('testcase', 'create', $story) or common::hasPriv('testcase', 'batchCreate', $story))) + { + $this->app->loadLang('testcase'); + $menu .= "
"; + $menu .= ""; + $menu .= "
"; + } + + if($this->app->tab == 'execution' and strpos('draft,closed', $story->status) === false) $menu .= $this->buildMenu('task', 'create', "execution={$this->session->project}&{$params}&moduleID=$story->module", $story, $type, 'plus', '', 'showinonly body'); + + $menu .= "
"; + $menu .= $this->buildMenu('story', 'edit', $params, $story, $type); + $menu .= $this->buildMenu('story', 'create', "productID=$story->product&branch=$story->branch&moduleID=$story->module&{$params}&executionID=0&bugID=0&planID=0&todoID=0&extra=&type=$story->type", $story, $type, 'copy', '', '', ' ', "data-width='1050'"); + $menu .= $this->buildMenu('story', 'delete', $params, $story, 'button', 'trash', 'hiddenwin', 'showinonlybody', true); + } + + return $menu; + } + /** * Merge plan title. * @@ -4164,29 +4250,7 @@ class storyModel extends model echo $story->version; break; case 'actions': - $vars = "story={$story->id}"; - $executionParams = $this->config->vision == 'lite' ? "&executionID={$this->session->project}" : ''; - if($canBeChanged) - { - if($story->URChanged) - { - common::printIcon('story', 'processStoryChange', "storyID=$story->id", '', 'list', 'search', '', 'iframe', true, '', $this->lang->confirm); - break; - } - - common::printIcon('story', 'change', $vars . "&from=$story->from", $story, 'list', 'alter', '', '', false, "data-group=$story->from"); - common::printIcon('story', 'review', $vars . "&from=$story->from", $story, 'list', 'search', '', '', false, "data-group=$story->from"); - common::printIcon('story', 'recall', $vars, $story, 'list', 'undo', 'hiddenwin', '', '', '', $this->lang->story->recall); - common::printIcon('story', 'close', $vars, $story, 'list', '', '', 'iframe', true); - common::printIcon('story', 'edit', $vars . "&from=$story->from", $story, 'list', '', '', '', false, "data-group=$story->from"); - if($story->type != 'requirement' and $this->config->vision != 'lite') common::printIcon('story', 'createCase', "productID=$story->product&branch=$story->branch&module=0&from=¶m=0&$vars", $story, 'list', 'sitemap', '', '', false, "data-app='qa'"); - if($this->app->rawModule != 'projectstory' OR $this->config->vision == 'lite') common::printIcon('story', 'batchCreate', "productID=$story->product&branch=$story->branch&module=$story->module&storyID=$story->id" . $executionParams, $story, 'list', 'split', '', '', '', '', $this->lang->story->subdivide); - if($this->app->rawModule == 'projectstory' and $this->config->vision != 'lite') common::printIcon('projectstory', 'unlinkStory', "projectID={$this->session->project}&storyID=$story->id", '', 'list', 'unlink', 'hiddenwin'); - } - else - { - common::printIcon('story', 'close', $vars, $story, 'list', '', '', 'iframe', true); - } + echo $this->buildOperateMenu($story, 'browse'); break; } echo ''; diff --git a/module/story/view/view.html.php b/module/story/view/view.html.php index b6967b86c7..5c6f57ab9b 100644 --- a/module/story/view/view.html.php +++ b/module/story/view/view.html.php @@ -200,53 +200,7 @@
";?> - deleted):?> - id", $story, 'button', 'alter', '', 'showinonlybody'); - common::printIcon('story', 'recall', "storyID=$story->id", $story, 'button', 'undo', '', 'showinonlybody'); - common::printIcon('story', 'review', "storyID=$story->id", $story, 'button', 'search', '', 'showinonlybody'); - if($story->status == 'active' and $story->stage == 'wait' and $story->parent <= 0 and !isonlybody()) - { - $divideLang = $lang->story->subdivide; - $misc = "class='btn divideStory' data-toggle='modal' data-type='iframe' data-width='95%'"; - $link = $this->createLink('story', 'batchCreate', "productID=$story->product&branch=$story->branch&moduleID=$story->module&storyID=$story->id", '', true); - if(common::hasPriv('story', 'batchCreate', $story)) echo html::a($link, " " . $divideLang, '', $misc); - } - - common::printIcon('story', 'assignTo', "storyID=$story->id", $story, 'button', '', '', 'iframe showinonlybody', true); - common::printIcon('story', 'close', "storyID=$story->id", $story, 'button', '', '', 'iframe showinonlybody', true); - common::printIcon('story', 'activate', "storyID=$story->id", $story, 'button', '', '', 'iframe showinonlybody', true); - if($this->config->edition == 'max' and $this->app->tab == 'project' and common::hasPriv('story', 'importToLib')) echo html::a('#importToLib', " " . $this->lang->story->importToLib, '', 'class="btn" data-toggle="modal"'); - - if($story->parent >= 0 and $story->type != 'requirement' and (common::hasPriv('testcase', 'create', $story) or common::hasPriv('testcase', 'batchCreate', $story))) - { - $this->app->loadLang('testcase'); - echo "
"; - echo ""; - echo ""; - echo "
"; - } - - if($from == 'execution' and strpos('draft,closed', $story->status) === false) common::printIcon('task', 'create', "execution=$param&storyID=$story->id&moduleID=$story->module", $story, 'button', 'plus', '', 'showinonlybody'); - - echo $this->buildOperateMenu($story, 'view'); - - echo "
"; - common::printIcon('story', 'edit', "storyID=$story->id", $story); - common::printIcon('story', 'create', "productID=$story->product&branch=$story->branch&moduleID=$story->module&storyID=$story->id&executionID=0&bugID=0&planID=0&todoID=0&extra=&type=$story->type", $story, 'button', 'copy', '', '', '', "data-width='1050'"); - common::printIcon('story', 'delete', "storyID=$story->id", $story, 'button', 'trash', 'hiddenwin', 'showinonlybody',true); - ?> - + deleted) echo $this->buildOperateMenu($story, 'view');?> From 0695047d20ab499b683aa5dd81f74a46441d395e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=8D=8E=E4=BC=9F?= Date: Wed, 11 May 2022 15:40:59 +0800 Subject: [PATCH 131/166] *Finish task #53659. --- module/program/model.php | 6 ++-- module/project/config.php | 37 +++++++++++++++++++++++ module/project/control.php | 5 +++ module/project/lang/zh-cn.php | 4 +++ module/project/model.php | 33 ++++++++++++++++++++ module/project/view/browsebylist.html.php | 2 ++ 6 files changed, 84 insertions(+), 3 deletions(-) diff --git a/module/program/model.php b/module/program/model.php index baff7f83d0..da8f3dd75a 100644 --- a/module/program/model.php +++ b/module/program/model.php @@ -240,15 +240,15 @@ class programModel extends model foreach($products as $product) { $product->plans = zget($plans, $product->id, array()); - + /* Convert predefined HTML entities to characters. */ !empty($product->plans) && array_map(function($planVal) { return $planVal->title = htmlspecialchars_decode($planVal->title, ENT_QUOTES); - }, + }, $product->plans); $product->name = htmlspecialchars_decode($product->name, ENT_QUOTES); - + $product->releases = zget($releases, $product->id, array()); $projects = zget($projectGroup, $product->id, array()); foreach($projects as $project) diff --git a/module/project/config.php b/module/project/config.php index a9e7474d96..9c8be57d6b 100644 --- a/module/project/config.php +++ b/module/project/config.php @@ -132,6 +132,43 @@ $config->project->maxCheckList = new stdclass(); $config->project->maxCheckList->scrum = array('bug', 'execution', 'build', 'doc', 'release', 'testtask', 'case', 'issue', 'risk', 'meeting'); $config->project->maxCheckList->waterfall = array('execution', 'design', 'doc', 'bug', 'case', 'build', 'release', 'testtask', 'review', 'build', 'researchplan', 'issue', 'risk', 'opportunity', 'auditplan', 'gapanalysis', 'meeting'); +$config->project->search['module'] = 'project'; +$config->project->search['fields']['name'] = $lang->project->name; +$config->project->search['fields']['code'] = $lang->project->code; +$config->project->search['fields']['id'] = $lang->project->id; +$config->project->search['fields']['model'] = $lang->project->manageType; +$config->project->search['fields']['parent'] = $lang->project->parent; +$config->project->search['fields']['status'] = $lang->project->projectStatus; +$config->project->search['fields']['desc'] = $lang->project->desc; +$config->project->search['fields']['PM'] = $lang->project->PM; +$config->project->search['fields']['openedDate'] = $lang->project->openedDate; +$config->project->search['fields']['begin'] = $lang->project->begin; +$config->project->search['fields']['end'] = $lang->project->end; +$config->project->search['fields']['realBeginAB'] = $lang->project->realBeginAB; +$config->project->search['fields']['realEndAB'] = $lang->project->realEndAB; +$config->project->search['fields']['openedBy'] = $lang->project->openedBy; +$config->project->search['fields']['closedBy'] = $lang->project->closedBy; +$config->project->search['fields']['lastEditedDate'] = $lang->project->lastEditedDate; +$config->project->search['fields']['closedDate'] = $lang->project->closedDate; + +$config->project->search['params']['name'] = array('operator' => 'include', 'control' => 'input' , 'values' => ''); +$config->project->search['params']['code'] = array('operator' => '=' , 'control' => 'input' , 'values' => ''); +$config->project->search['params']['id'] = array('operator' => '=' , 'control' => 'input' , 'values' => ''); +$config->project->search['params']['model'] = array('operator' => '=' , 'control' => 'select', 'values' => $lang->project->modelList); +$config->project->search['params']['parent'] = array('operator' => '=' , 'control' => 'select', 'values' => ''); +$config->project->search['params']['status'] = array('operator' => '=' , 'control' => 'select', 'values' => $lang->project->statusList); +$config->project->search['params']['desc'] = array('operator' => 'include', 'control' => 'input' , 'values' => ''); +$config->project->search['params']['PM'] = array('operator' => '=' , 'control' => 'select', 'values' => 'users'); +$config->project->search['params']['openedDate'] = array('operator' => '=' , 'control' => 'input' , 'values' => '', 'class' => 'date'); +$config->project->search['params']['begin'] = array('operator' => '=' , 'control' => 'input' , 'values' => '', 'class' => 'date'); +$config->project->search['params']['end'] = array('operator' => '=' , 'control' => 'input' , 'values' => '', 'class' => 'date'); +$config->project->search['params']['realBeginAB'] = array('operator' => '=' , 'control' => 'input' , 'values' => '', 'class' => 'date'); +$config->project->search['params']['realEndAB'] = array('operator' => '=' , 'control' => 'input' , 'values' => '', 'class' => 'date'); +$config->project->search['params']['openedBy'] = array('operator' => '=' , 'control' => 'select', 'values' => 'users'); +$config->project->search['params']['closedBy'] = array('operator' => '=' , 'control' => 'select', 'values' => 'users'); +$config->project->search['params']['lastEditedDate'] = array('operator' => '=' , 'control' => 'input' , 'values' => '', 'class' => 'date'); +$config->project->search['params']['closedDate'] = array('operator' => '=' , 'control' => 'input' , 'values' => '', 'class' => 'date'); + $config->project->includedPriv['project'] = array('edit', 'group', 'createGroup', 'managePriv', 'manageMembers', 'manageGroupMember', 'copyGroup', 'editGroup', 'start', 'suspend', 'close', 'activate', 'delete', 'view', 'whitelist', 'addWhitelist', 'unbindWhitelist', 'manageProducts', 'dynamic', 'build', 'bug', 'testcase', 'testtask', 'testreport', 'execution', 'team', 'unlinkMember'); $config->project->includedPriv['execution'] = array('create', 'start', 'delete', 'calendar', 'effortCalendar', 'effort', 'taskEffort', 'computeTaskEffort', 'deleterelation', 'maintainrelation', 'relation', 'gantt'); $config->project->includedPriv['task'] = array('create'); diff --git a/module/project/control.php b/module/project/control.php index e46b59976d..e99b77f51e 100644 --- a/module/project/control.php +++ b/module/project/control.php @@ -307,6 +307,11 @@ class project extends control $programTitle = $this->loadModel('setting')->getItem('owner=' . $this->app->user->account . '&module=project&key=programTitle'); $projectStats = $this->loadModel('program')->getProjectStats($programID, $browseType, $queryID, $orderBy, $pager, $programTitle); + $actionURL = $this->createLink('project', 'browse', "&programID=$programID&browseType=bySearch&queryID=myQueryID"); + $this->project->buildSearchFrom($queryID, $actionURL); + $projectQuery = $this->session->projectQuery; + if($browseType == 'bySearch') $projectStats = $this->project->getBySearch($projectQuery); + $this->view->title = $this->lang->project->browse; $this->view->position[] = $this->lang->project->browse; diff --git a/module/project/lang/zh-cn.php b/module/project/lang/zh-cn.php index 551d4649ed..ba4ec95a1f 100644 --- a/module/project/lang/zh-cn.php +++ b/module/project/lang/zh-cn.php @@ -66,6 +66,7 @@ $lang->project->id = '项目编号'; $lang->project->project = '所属项目'; $lang->project->stage = '阶段'; $lang->project->model = '项目管理方式'; +$lang->project->manageType = '管理类型'; $lang->project->PM = '负责人'; $lang->project->PO = '项目负责人'; $lang->project->QD = '测试负责人'; @@ -79,6 +80,7 @@ $lang->project->begin = '计划开始'; $lang->project->end = '计划完成'; $lang->project->status = '状态'; $lang->project->subStatus = '子状态'; +$lang->project->projectStatus = '项目状态'; $lang->project->type = '项目类型'; $lang->project->lifetime = '项目周期'; $lang->project->attribute = '阶段类型'; @@ -227,6 +229,7 @@ $lang->project->currencySymbol['NZD'] = 'NZ$'; $lang->project->currencySymbol['THB'] = '฿'; $lang->project->currencySymbol['SGD'] = 'S$'; +$lang->project->modelList[''] = ""; $lang->project->modelList['scrum'] = "Scrum"; $lang->project->modelList['waterfall'] = "瀑布"; $lang->project->modelList['kanban'] = "看板"; @@ -257,6 +260,7 @@ $lang->project->kanbanSubAclList['program'] = '项目集内公开(所有上级 $lang->project->authList['extend'] = '继承 (取系统权限与项目权限的合集)'; $lang->project->authList['reset'] = '重新定义 (只取项目权限)'; +$lang->project->statusList[''] = ''; $lang->project->statusList['wait'] = '未开始'; $lang->project->statusList['doing'] = '进行中'; $lang->project->statusList['suspended'] = '已挂起'; diff --git a/module/project/model.php b/module/project/model.php index ab4804577c..65b2b5717f 100644 --- a/module/project/model.php +++ b/module/project/model.php @@ -629,6 +629,39 @@ class projectModel extends model ->fetchGroup('productID', 'branchID'); } + /* + * Get projects by search conditions. + * + * @param string $projectQuery + * @return array + * */ + public function getBySearch($projectQuery) + { + $projects = $this->dao->select('*')->from(TABLE_PROJECT) + ->where($projectQuery) + ->fetchAll(); + return $projects; + } + + /* + * Build search form + * + * @param int $queryID + * @param string $actionURL + * + * @return 0 + * */ + public function buildSearchFrom($queryID, $actionURL) + { + $this->config->project->search['queryID'] = $queryID; + $this->config->project->search['actionURL'] = $actionURL; + + $programPairs = array(0 => ''); + $programPairs += $this->loadModel('program')->getPairs(); + $this->config->project->search['params']['parent']['values'] = $programPairs; + $this->loadModel('search')->setSearchParams($this->config->project->search); + } + /** * Build the query. * diff --git a/module/project/view/browsebylist.html.php b/module/project/view/browsebylist.html.php index 93a0f68599..df3626ef01 100644 --- a/module/project/view/browsebylist.html.php +++ b/module/project/view/browsebylist.html.php @@ -40,6 +40,7 @@ $lang->project->mine), '', $this->cookie->involved ? 'checked=checked' : '');?> +
@@ -67,6 +68,7 @@
+

From bbb5ec189d03ae1f5cdf9f2ecce0a335e2699546 Mon Sep 17 00:00:00 2001 From: mayue Date: Wed, 11 May 2022 07:57:36 +0000 Subject: [PATCH 132/166] * Optimize code. --- module/project/model.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/module/project/model.php b/module/project/model.php index 0a4b6d9110..3a4b42f608 100644 --- a/module/project/model.php +++ b/module/project/model.php @@ -472,7 +472,7 @@ class projectModel extends model $link = helper::createLink('project', 'index', "projectID=%s"); $project = $this->getByID($projectID); - if(strpos(',project,product,projectstory,story,bug,testcase,testtask,testreport,build,projectrelease,stakeholder,', ',' . $module . ',') !== false) + if(strpos(',project,product,projectstory,story,bug,doc,testcase,testtask,testreport,build,projectrelease,stakeholder,', ',' . $module . ',') !== false) { if($module == 'project' and $method == 'execution') { @@ -606,7 +606,7 @@ class projectModel extends model } elseif($module == 'doc') { - $link = helper::createLink($module, 'tablecontents', "type=projectprojectID=%s#app=project"); + $link = helper::createLink($module, 'tablecontents', "type=project&objectID=%s#app=project"); } elseif($module == 'build') { From ed90476621970eb586f163047e06bd8102d9893e Mon Sep 17 00:00:00 2001 From: liumengyi Date: Wed, 11 May 2022 16:10:07 +0800 Subject: [PATCH 133/166] * Refactoring bug search code. --- module/bug/model.php | 101 ++++++++++++++----------------------------- 1 file changed, 32 insertions(+), 69 deletions(-) diff --git a/module/bug/model.php b/module/bug/model.php index 5ac9ba0e38..4b8abe39ea 100644 --- a/module/bug/model.php +++ b/module/bug/model.php @@ -1679,32 +1679,7 @@ class bugModel extends model } } - $allProduct = "`product` = 'all'"; - $bugQuery = $this->session->projectBugQuery; - if(strpos($this->session->projectBugQuery, $allProduct) !== false) - { - $bugQuery = str_replace($allProduct, '1', $this->session->projectBugQuery); - } - if(strpos($bugQuery, ' `story` ') !== false) - { - preg_match_all("/`story`[ ]+(NOT *)?LIKE[ ]+'%([^%]*)%'/Ui", $bugQuery, $out); - if(!empty($out[2])) - { - foreach($out[2] as $searchValue) - { - $story = $this->dao->select('id')->from(TABLE_STORY)->alias('t1') - ->leftJoin(TABLE_STORYSPEC)->alias('t2')->on('t1.id=t2.story') - ->where('t1.title')->like("%$searchValue%") - ->orWhere('t1.keywords')->like("%$searchValue%") - ->orWhere('t2.spec')->like("%$searchValue%") - ->orWhere('t2.verify')->like("%$searchValue%") - ->fetchPairs('id'); - - $bugQuery = preg_replace("/`story`[ ]+(NOT[ ]*)?LIKE[ ]+'%$searchValue%'/Ui", '`story` $1 IN (' . implode(',', $story) .')', $bugQuery); - } - } - $bugQuery .= ' AND `story` != 0'; - } + $bugQuery = $this->getBugQuery($this->session->projectBugQuery); $bugs = $this->dao->select('*')->from(TABLE_BUG) ->where($bugQuery) @@ -1766,32 +1741,7 @@ class bugModel extends model } } - $allProduct = "`product` = 'all'"; - $bugQuery = $this->session->executionBugQuery; - if(strpos($this->session->executionBugQuery, $allProduct) !== false) - { - $bugQuery = str_replace($allProduct, '1', $this->session->executionBugQuery); - } - if(strpos($bugQuery, ' `story` ') !== false) - { - preg_match_all("/`story`[ ]+(NOT *)?LIKE[ ]+'%([^%]*)%'/Ui", $bugQuery, $out); - if(!empty($out[2])) - { - foreach($out[2] as $searchValue) - { - $story = $this->dao->select('id')->from(TABLE_STORY)->alias('t1') - ->leftJoin(TABLE_STORYSPEC)->alias('t2')->on('t1.id=t2.story') - ->where('t1.title')->like("%$searchValue%") - ->orWhere('t1.keywords')->like("%$searchValue%") - ->orWhere('t2.spec')->like("%$searchValue%") - ->orWhere('t2.verify')->like("%$searchValue%") - ->fetchPairs('id'); - - $bugQuery = preg_replace("/`story`[ ]+(NOT[ ]*)?LIKE[ ]+'%$searchValue%'/Ui", '`story` $1 IN (' . implode(',', $story) .')', $bugQuery); - } - } - $bugQuery .= ' AND `story` != 0'; - } + $bugQuery = $this->getBugQuery($this->session->executionBugQuery); $bugs = $this->dao->select('*')->from(TABLE_BUG) ->where($bugQuery) @@ -2743,10 +2693,37 @@ class bugModel extends model if($this->session->bugQuery == false) $this->session->set('bugQuery', ' 1 = 1'); } - $allProduct = "`product` = 'all'"; - $bugQuery = $this->session->bugQuery; + $bugQuery = $this->getBugQuery($this->session->bugQuery, $productIDList, $branch); if(is_array($productIDList)) $productIDList = implode(',', $productIDList); if(strpos($bugQuery, '`product` =') === false) $bugQuery .= ' AND `product` in (' . $productIDList . ')'; + + $bugs = $this->dao->select('*')->from(TABLE_BUG)->where($bugQuery) + ->beginIF(!$this->app->user->admin)->andWhere('execution')->in('0,' . $this->app->user->view->sprints)->fi() + ->beginIF($excludeBugs)->andWhere('id')->notIN($excludeBugs)->fi() + + ->beginIF($projectID) + ->andWhere('project', true)->eq($projectID) + ->orWhere('project')->eq(0) + ->andWhere('openedBuild')->eq('trunk') + ->markRight(1) + ->fi() + + ->andWhere('deleted')->eq(0) + ->orderBy($orderBy)->page($pager)->fetchAll(); + return $bugs; + } + + /** + * Get bug query. + * + * @param string $bugQuery + * @param string $branch + * @access public + * @return string + */ + public function getBugQuery($bugQuery, $branch = 'all') + { + $allProduct = "`product` = 'all'"; if(strpos($bugQuery, $allProduct) !== false) { $products = $this->app->user->view->products; @@ -2790,21 +2767,7 @@ class bugModel extends model } $bugQuery .= ' AND `story` != 0'; } - - $bugs = $this->dao->select('*')->from(TABLE_BUG)->where($bugQuery) - ->beginIF(!$this->app->user->admin)->andWhere('execution')->in('0,' . $this->app->user->view->sprints)->fi() - ->beginIF($excludeBugs)->andWhere('id')->notIN($excludeBugs)->fi() - - ->beginIF($projectID) - ->andWhere('project', true)->eq($projectID) - ->orWhere('project')->eq(0) - ->andWhere('openedBuild')->eq('trunk') - ->markRight(1) - ->fi() - - ->andWhere('deleted')->eq(0) - ->orderBy($orderBy)->page($pager)->fetchAll(); - return $bugs; + return $bugQuery; } /** From 3380222afc1522cfc0cef831b7e0f26fd2432d35 Mon Sep 17 00:00:00 2001 From: wangyuting2 <851424971@qq.com> Date: Wed, 11 May 2022 16:11:34 +0800 Subject: [PATCH 134/166] * Fix build action menu bug. --- module/build/view/view.html.php | 2 +- module/caselib/view/browse.html.php | 2 +- module/caselib/view/view.html.php | 2 +- module/execution/view/view.html.php | 2 +- module/product/view/all.html.php | 2 +- module/product/view/view.html.php | 2 +- module/productplan/view/browsebylist.html.php | 2 +- module/productplan/view/view.html.php | 2 +- module/project/view/view.html.php | 2 +- module/story/view/view.html.php | 2 +- module/task/view/view.html.php | 2 +- module/testcase/view/view.html.php | 2 +- module/testsuite/view/browse.html.php | 2 +- module/testsuite/view/view.html.php | 2 +- module/testtask/view/browse.html.php | 2 +- module/testtask/view/view.html.php | 2 +- 16 files changed, 16 insertions(+), 16 deletions(-) diff --git a/module/build/view/view.html.php b/module/build/view/view.html.php index 3adcc8d6f1..b2dad81742 100644 --- a/module/build/view/view.html.php +++ b/module/build/view/view.html.php @@ -48,7 +48,7 @@ tbody tr td:first-child input {display: none;}

- buildOperateMenu($build, 'view');?> + build->buildOperateMenu($build, 'view');?>
diff --git a/module/caselib/view/browse.html.php b/module/caselib/view/browse.html.php index 35101bfe14..980fcde929 100644 --- a/module/caselib/view/browse.html.php +++ b/module/caselib/view/browse.html.php @@ -157,7 +157,7 @@ js::set('flow', $config->global->flow); processStatus('testcase', $case);?> " . $this->loadModel('flow')->getFieldValue($extendField, $case) . "";?> - buildOperateMenu($case, 'browse');?> + caselib->buildOperateMenu($case, 'browse');?> diff --git a/module/caselib/view/view.html.php b/module/caselib/view/view.html.php index 868c67dccc..0bc7645556 100644 --- a/module/caselib/view/view.html.php +++ b/module/caselib/view/view.html.php @@ -39,7 +39,7 @@
";?> - buildOperateMenu($lib, 'view');?> + caselib->buildOperateMenu($lib, 'view');?>
diff --git a/module/execution/view/view.html.php b/module/execution/view/view.html.php index 2bc2913fd1..90ec222e0e 100644 --- a/module/execution/view/view.html.php +++ b/module/execution/view/view.html.php @@ -148,7 +148,7 @@
session->executionList ? $this->session->executionList : inlink('browse', "executionID=$execution->id");?> - buildOperateMenu($execution, 'view');?> + execution->buildOperateMenu($execution, 'view');?>
diff --git a/module/product/view/all.html.php b/module/product/view/all.html.php index 83b96d0c5c..3a065df1ea 100644 --- a/module/product/view/all.html.php +++ b/module/product/view/all.html.php @@ -214,7 +214,7 @@ plans;?> releases;?> " . $this->loadModel('flow')->getFieldValue($extendField, $product) . "";?> - buildOperateMenu($product, 'browse');?> + product->buildOperateMenu($product, 'browse');?> diff --git a/module/product/view/view.html.php b/module/product/view/view.html.php index 9dff1daa07..dd670efb83 100644 --- a/module/product/view/view.html.php +++ b/module/product/view/view.html.php @@ -161,7 +161,7 @@ $browseLink = $this->session->productList ? $this->session->productList : inlink('browse', "productID=$product->id"); common::printBack($browseLink); - if(!$product->deleted) echo $this->buildOperateMenu($product, 'view'); + if(!$product->deleted) echo $this->product->buildOperateMenu($product, 'view'); ?> diff --git a/module/productplan/view/browsebylist.html.php b/module/productplan/view/browsebylist.html.php index db0c2e0b73..b4bbe598f4 100644 --- a/module/productplan/view/browsebylist.html.php +++ b/module/productplan/view/browsebylist.html.php @@ -144,7 +144,7 @@
" . $this->loadModel('flow')->getFieldValue($extendField, $plan) . "";?> - buildOperateMenu($plan, 'browse'); ?> + productplan->buildOperateMenu($plan, 'browse'); ?> diff --git a/module/productplan/view/view.html.php b/module/productplan/view/view.html.php index cff6af86a6..76002e70b1 100644 --- a/module/productplan/view/view.html.php +++ b/module/productplan/view/view.html.php @@ -38,7 +38,7 @@
- deleted && !isonlybody()) echo $this->buildOperateMenu($plan, 'view'); ?> + deleted && !isonlybody()) echo $this->productplan->buildOperateMenu($plan, 'view'); ?>
diff --git a/module/project/view/view.html.php b/module/project/view/view.html.php index 8986fb8d76..cca23ade7a 100644 --- a/module/project/view/view.html.php +++ b/module/project/view/view.html.php @@ -98,7 +98,7 @@
session->projectList ? $this->session->projectList : inlink('browse');?> - buildOperateMenu($project, 'view');?> + project->buildOperateMenu($project, 'view');?>
diff --git a/module/story/view/view.html.php b/module/story/view/view.html.php index 5c6f57ab9b..63f42cf8b9 100644 --- a/module/story/view/view.html.php +++ b/module/story/view/view.html.php @@ -200,7 +200,7 @@
";?> - deleted) echo $this->buildOperateMenu($story, 'view');?> + deleted) echo $this->story->buildOperateMenu($story, 'view');?> diff --git a/module/task/view/view.html.php b/module/task/view/view.html.php index 8cab2c2c8e..ec607004ca 100644 --- a/module/task/view/view.html.php +++ b/module/task/view/view.html.php @@ -170,7 +170,7 @@ ";?> executionList = $execution;?> - buildOperateMenu($task, 'view');?> + task->buildOperateMenu($task, 'view');?> diff --git a/module/testcase/view/view.html.php b/module/testcase/view/view.html.php index 28a613dd52..afd9e223d8 100644 --- a/module/testcase/view/view.html.php +++ b/module/testcase/view/view.html.php @@ -116,7 +116,7 @@ isLibCase = $isLibCase;?> caseFails = $caseFails;?> runID = $runID;?> - buildOperateMenu($case, 'view');?> + testcase->buildOperateMenu($case, 'view');?> diff --git a/module/testsuite/view/browse.html.php b/module/testsuite/view/browse.html.php index 70fd6b4070..6503d4d34a 100644 --- a/module/testsuite/view/browse.html.php +++ b/module/testsuite/view/browse.html.php @@ -70,7 +70,7 @@ addedDate;?> " . $this->loadModel('flow')->getFieldValue($extendField, $suite) . "";?> - buildOperateMenu($suite, 'browse');?> + testsuite->buildOperateMenu($suite, 'browse');?> diff --git a/module/testsuite/view/view.html.php b/module/testsuite/view/view.html.php index 6a44d631bc..efdb7d4a9f 100644 --- a/module/testsuite/view/view.html.php +++ b/module/testsuite/view/view.html.php @@ -31,7 +31,7 @@ deleted and $canBeChanged) { - echo $this->buildOperateMenu($suite, 'view'); + echo $this->testsuite->buildOperateMenu($suite, 'view'); } ?> diff --git a/module/testtask/view/browse.html.php b/module/testtask/view/browse.html.php index e417cb11f6..fbd46f6bb1 100644 --- a/module/testtask/view/browse.html.php +++ b/module/testtask/view/browse.html.php @@ -102,7 +102,7 @@ $status = $this->session->testTaskVersionStatus; " . $this->loadModel('flow')->getFieldValue($extendField, $task) . "";?> - buildOperateMenu($task, 'browse');?> + testtask->buildOperateMenu($task, 'browse');?> diff --git a/module/testtask/view/view.html.php b/module/testtask/view/view.html.php index 7324b9d56e..7bb7fa2871 100644 --- a/module/testtask/view/view.html.php +++ b/module/testtask/view/view.html.php @@ -51,7 +51,7 @@
' . $lang->goback, '', 'btn btn-secondary');?>
- buildOperateMenu($task, 'view');?> + testtask->buildOperateMenu($task, 'view');?>
From 160c0fbcaaa7ae965b7d106de1b7b5df9140d2f3 Mon Sep 17 00:00:00 2001 From: zhouxin Date: Wed, 11 May 2022 08:13:06 +0000 Subject: [PATCH 135/166] * Fix bug #53656. --- module/product/control.php | 8 ++++++-- module/product/view/all.html.php | 5 +++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/module/product/control.php b/module/product/control.php index e6d17166e3..eea2e15688 100644 --- a/module/product/control.php +++ b/module/product/control.php @@ -1197,7 +1197,7 @@ class product extends control * @access public * @return void */ - public function all($browseType = 'noclosed', $orderBy = 'order_asc', $param = 0) + public function all($browseType = 'noclosed', $orderBy = 'order_asc', $param = 0, $recTotal = 0, $recPerPage = 20, $pageID = 1) { /* Load module and set session. */ $this->loadModel('program'); @@ -1211,8 +1211,11 @@ class product extends control $this->product->setMenu($productID); } + $this->app->loadClass('pager', $static = true); + $pager = new pager($recTotal, $recPerPage, $pageID); + /* Process product structure. */ - $productStats = $this->product->getStats($orderBy, '', $browseType, '', 'story', '', $queryID); + $productStats = $this->product->getStats($orderBy, $pager, $browseType, '', 'story', '', $queryID); $productStructure = $this->product->statisticProgram($productStats); $actionURL = $this->createLink('product', 'all', "browseType=bySearch&orderBy=order_asc&queryID=myQueryID"); @@ -1226,6 +1229,7 @@ class product extends control $this->view->productStructure = $productStructure; $this->view->orderBy = $orderBy; $this->view->browseType = $browseType; + $this->view->pager = $pager; $this->display(); } diff --git a/module/product/view/all.html.php b/module/product/view/all.html.php index 83b96d0c5c..f3df14cae4 100644 --- a/module/product/view/all.html.php +++ b/module/product/view/all.html.php @@ -222,17 +222,18 @@ - - From 6d61b450685ad4fb01fa33e1d47f7069d4743ec7 Mon Sep 17 00:00:00 2001 From: liumengyi Date: Wed, 11 May 2022 16:15:07 +0800 Subject: [PATCH 136/166] * Refactoring bug search code. --- module/bug/model.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/module/bug/model.php b/module/bug/model.php index 4b8abe39ea..9ff6b81d69 100644 --- a/module/bug/model.php +++ b/module/bug/model.php @@ -2693,10 +2693,15 @@ class bugModel extends model if($this->session->bugQuery == false) $this->session->set('bugQuery', ' 1 = 1'); } - $bugQuery = $this->getBugQuery($this->session->bugQuery, $productIDList, $branch); + $bugQuery = $this->getBugQuery($this->session->bugQuery); + if(is_array($productIDList)) $productIDList = implode(',', $productIDList); if(strpos($bugQuery, '`product` =') === false) $bugQuery .= ' AND `product` in (' . $productIDList . ')'; + $allBranch = "`branch` = 'all'"; + if($branch !== 'all' and strpos($bugQuery, '`branch` =') === false) $bugQuery .= " AND `branch` in('0','$branch')"; + if(strpos($bugQuery, $allBranch) !== false) $bugQuery = str_replace($allBranch, '1', $bugQuery); + $bugs = $this->dao->select('*')->from(TABLE_BUG)->where($bugQuery) ->beginIF(!$this->app->user->admin)->andWhere('execution')->in('0,' . $this->app->user->view->sprints)->fi() ->beginIF($excludeBugs)->andWhere('id')->notIN($excludeBugs)->fi() @@ -2717,11 +2722,10 @@ class bugModel extends model * Get bug query. * * @param string $bugQuery - * @param string $branch * @access public * @return string */ - public function getBugQuery($bugQuery, $branch = 'all') + public function getBugQuery($bugQuery) { $allProduct = "`product` = 'all'"; if(strpos($bugQuery, $allProduct) !== false) @@ -2731,10 +2735,6 @@ class bugModel extends model $bugQuery = $bugQuery . ' AND `product` ' . helper::dbIN($products); } - $allBranch = "`branch` = 'all'"; - if($branch !== 'all' and strpos($bugQuery, '`branch` =') === false) $bugQuery .= " AND `branch` in('0','$branch')"; - if(strpos($bugQuery, $allBranch) !== false) $bugQuery = str_replace($allBranch, '1', $bugQuery); - $allProject = "`project` = 'all'"; if(strpos($bugQuery, $allProject) !== false) { From ffed15713bfc7ebbbaf4defc676b326ad4b5ebf3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=8D=8E=E4=BC=9F?= Date: Wed, 11 May 2022 16:15:54 +0800 Subject: [PATCH 137/166] *Optimize the code. --- module/project/model.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/module/project/model.php b/module/project/model.php index 65b2b5717f..6cfcc799d9 100644 --- a/module/project/model.php +++ b/module/project/model.php @@ -637,6 +637,8 @@ class projectModel extends model * */ public function getBySearch($projectQuery) { + $flag = stripos($projectQuery, 'and') + 3; + $projectQuery = substr_replace($projectQuery, " (`type` = 'project') and", $flag, 0); $projects = $this->dao->select('*')->from(TABLE_PROJECT) ->where($projectQuery) ->fetchAll(); From 0aa36bd6e5ab9c5e4a3a5fa7c2cfa0635e1970ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=8D=8E=E4=BC=9F?= Date: Wed, 11 May 2022 16:25:43 +0800 Subject: [PATCH 138/166] *Optimize the code. --- module/project/config.php | 2 +- module/project/lang/zh-cn.php | 2 +- module/project/model.php | 3 +-- module/project/view/browsebylist.html.php | 2 +- 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/module/project/config.php b/module/project/config.php index 9c8be57d6b..9fb9286c56 100644 --- a/module/project/config.php +++ b/module/project/config.php @@ -136,7 +136,7 @@ $config->project->search['module'] = 'project'; $config->project->search['fields']['name'] = $lang->project->name; $config->project->search['fields']['code'] = $lang->project->code; $config->project->search['fields']['id'] = $lang->project->id; -$config->project->search['fields']['model'] = $lang->project->manageType; +$config->project->search['fields']['model'] = $lang->project->model; $config->project->search['fields']['parent'] = $lang->project->parent; $config->project->search['fields']['status'] = $lang->project->projectStatus; $config->project->search['fields']['desc'] = $lang->project->desc; diff --git a/module/project/lang/zh-cn.php b/module/project/lang/zh-cn.php index ba4ec95a1f..b60f1e6366 100644 --- a/module/project/lang/zh-cn.php +++ b/module/project/lang/zh-cn.php @@ -66,7 +66,6 @@ $lang->project->id = '项目编号'; $lang->project->project = '所属项目'; $lang->project->stage = '阶段'; $lang->project->model = '项目管理方式'; -$lang->project->manageType = '管理类型'; $lang->project->PM = '负责人'; $lang->project->PO = '项目负责人'; $lang->project->QD = '测试负责人'; @@ -163,6 +162,7 @@ $lang->project->branch = '所属分支'; $lang->project->plan = '所属计划'; $lang->project->createKanban = '添加看板'; $lang->project->kanban = '看板'; +$lang->project->search = '搜索'; /* Project Kanban. */ $lang->project->typeList = array(); diff --git a/module/project/model.php b/module/project/model.php index 6cfcc799d9..458bac3853 100644 --- a/module/project/model.php +++ b/module/project/model.php @@ -637,10 +637,9 @@ class projectModel extends model * */ public function getBySearch($projectQuery) { - $flag = stripos($projectQuery, 'and') + 3; - $projectQuery = substr_replace($projectQuery, " (`type` = 'project') and", $flag, 0); $projects = $this->dao->select('*')->from(TABLE_PROJECT) ->where($projectQuery) + ->andWhere('type')->eq('project') ->fetchAll(); return $projects; } diff --git a/module/project/view/browsebylist.html.php b/module/project/view/browsebylist.html.php index df3626ef01..052a85fe84 100644 --- a/module/project/view/browsebylist.html.php +++ b/module/project/view/browsebylist.html.php @@ -40,7 +40,7 @@ $lang->project->mine), '', $this->cookie->involved ? 'checked=checked' : '');?> - + project->search;?>
From 008236e9976b4ee95fd3ce1405a363e3af59923d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=8D=8E=E4=BC=9F?= Date: Wed, 11 May 2022 08:29:42 +0000 Subject: [PATCH 139/166] Update zh-cn.php --- module/project/lang/zh-cn.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/project/lang/zh-cn.php b/module/project/lang/zh-cn.php index b60f1e6366..19108aa0e6 100644 --- a/module/project/lang/zh-cn.php +++ b/module/project/lang/zh-cn.php @@ -229,7 +229,7 @@ $lang->project->currencySymbol['NZD'] = 'NZ$'; $lang->project->currencySymbol['THB'] = '฿'; $lang->project->currencySymbol['SGD'] = 'S$'; -$lang->project->modelList[''] = ""; +$lang->project->modelList[''] = ""; $lang->project->modelList['scrum'] = "Scrum"; $lang->project->modelList['waterfall'] = "瀑布"; $lang->project->modelList['kanban'] = "看板"; From b5093f3a1ba9ca5f175bf8506dbe86ec0613cd60 Mon Sep 17 00:00:00 2001 From: zenggang Date: Wed, 11 May 2022 08:32:50 +0000 Subject: [PATCH 140/166] * Code for task#53657 --- module/program/config.php | 28 ++++++++++++ module/program/control.php | 24 ++++++++--- module/program/js/browse.js | 2 +- module/program/lang/en.php | 59 +++++++++++++------------ module/program/lang/zh-cn.php | 59 +++++++++++++------------ module/program/model.php | 67 +++++++++++++++++++++++++---- module/program/view/browse.html.php | 3 ++ 7 files changed, 171 insertions(+), 71 deletions(-) diff --git a/module/program/config.php b/module/program/config.php index d93159b907..15afcb8278 100644 --- a/module/program/config.php +++ b/module/program/config.php @@ -22,3 +22,31 @@ $config->program->sortFields = new stdclass(); $config->program->sortFields->id = 'id'; $config->program->sortFields->begin = 'begin'; $config->program->sortFields->end = 'end'; + +global $lang; +$config->program->search['module'] = 'program'; +$config->program->search['fields']['name'] = $lang->program->name; +$config->program->search['fields']['status'] = $lang->program->status; +$config->program->search['fields']['desc'] = $lang->program->desc; +$config->program->search['fields']['PM'] = $lang->program->PM; +$config->program->search['fields']['openedDate'] = $lang->program->openedDate; +$config->program->search['fields']['begin'] = $lang->program->begin; +$config->program->search['fields']['end'] = $lang->program->end; +$config->program->search['fields']['openedBy'] = $lang->program->openedBy; +$config->program->search['fields']['lastEditedDate'] = $lang->program->lastEditedDate; +$config->program->search['fields']['realBegan'] = $lang->program->realBegin; +$config->program->search['fields']['realEnd'] = $lang->program->realEnd; +$config->program->search['fields']['closedDate'] = $lang->program->closedDate; + +$config->program->search['params']['name'] = array('operator' => 'include', 'control' => 'input', 'values' => ''); +$config->program->search['params']['status'] = array('operator' => '=', 'control' => 'select', 'values' => array('' => '') + $lang->program->statusList); +$config->program->search['params']['desc'] = array('operator' => 'include', 'control' => 'input', 'values' => ''); +$config->program->search['params']['PM'] = array('operator' => '=', 'control' => 'select', 'values' => 'users'); +$config->program->search['params']['openedDate'] = array('operator' => '=', 'control' => 'input', 'values' => '', 'class' => 'date'); +$config->program->search['params']['begin'] = array('operator' => '=', 'control' => 'input', 'values' => '', 'class' => 'date'); +$config->program->search['params']['end'] = array('operator' => '=', 'control' => 'input', 'values' => '', 'class' => 'date'); +$config->program->search['params']['openedBy'] = array('operator' => '=', 'control' => 'select', 'values' => 'users'); +$config->program->search['params']['lastEditedDate'] = array('operator' => '=', 'control' => 'input', 'values' => '', 'class' => 'date'); +$config->program->search['params']['realBegan'] = array('operator' => '=', 'control' => 'input', 'values' => '', 'class' => 'date'); +$config->program->search['params']['realEnd'] = array('operator' => '=', 'control' => 'input', 'values' => '', 'class' => 'date'); +$config->program->search['params']['closedDate'] = array('operator' => '=', 'control' => 'input', 'values' => '', 'class' => 'date'); diff --git a/module/program/control.php b/module/program/control.php index 3ef0331eb9..780397b955 100644 --- a/module/program/control.php +++ b/module/program/control.php @@ -26,7 +26,7 @@ class program extends control * @access public * @return void */ - public function browse($status = 'all', $orderBy = 'order_asc', $recTotal = 0, $recPerPage = 10, $pageID = 1) + public function browse($status = 'all', $orderBy = 'order_asc', $recTotal = 0, $recPerPage = 10, $pageID = 1, $param = 0) { if(common::hasPriv('program', 'create')) $this->lang->pageActions = html::a($this->createLink('program', 'create'), " " . $this->lang->program->create, '', "class='btn btn-primary create-program-btn'"); @@ -44,10 +44,18 @@ class program extends control } else { - $topPrograms = $this->program->getList($status, $orderBy, $pager, 'topProgram'); - $programIDs = array(); - foreach($topPrograms as $programID => $program) $programIDs[] = $programID; - $programs = $this->program->getList($status, $orderBy, null, 'byTopIDs', $programIDs); + if(strtolower($status) == 'bysearch') + { + $queryID = (int)$param; + $programs = $this->program->getListBySearch($orderBy, $pager, $queryID); + } + else + { + $topPrograms = $this->program->getList($status, $orderBy, $pager, 'top'); + $programIDs = array(); + foreach($topPrograms as $programID => $program) $programIDs[] = $programID; + $programs = $this->program->getList($status, $orderBy, null, 'child', $programIDs); + } } /* Get PM id list. */ @@ -58,6 +66,12 @@ class program extends control } $PMList = $this->loadModel('user')->getListByAccounts($accounts, 'account'); + /* Build the search form. */ + $actionURL = $this->createLink('program', 'browse', "status=bySearch&orderBy={$orderBy}&recTotal={$recTotal}&recPerPage={$recPerPage}&pageID={$pageID}¶m=myQueryID"); + $this->config->program->search['onMenuBar'] = 'yes'; + $this->config->program->search['actionURL'] = $actionURL; + $this->loadModel('search')->setSearchParams($this->config->program->search); + $this->view->title = $this->lang->program->browse; $this->view->position[] = $this->lang->program->browse; diff --git a/module/program/js/browse.js b/module/program/js/browse.js index 6526d35fc9..dc14dca89b 100644 --- a/module/program/js/browse.js +++ b/module/program/js/browse.js @@ -45,7 +45,7 @@ $(function() }); var myPager = $('.pager').data('zui.pager'); - if(myPager) + if(status != 'bySearch' && myPager) { myPager.lang.pageSize = pageSize; myPager.set(); diff --git a/module/program/lang/en.php b/module/program/lang/en.php index 62bf6dce4f..754323b538 100644 --- a/module/program/lang/en.php +++ b/module/program/lang/en.php @@ -1,33 +1,36 @@ program->id = 'ID'; -$lang->program->name = 'Name'; -$lang->program->template = 'Template'; -$lang->program->category = 'Type'; -$lang->program->desc = 'Description'; -$lang->program->status = 'Status'; -$lang->program->PM = 'Manager'; -$lang->program->budget = 'Budget'; -$lang->program->budgetUnit = 'Budget Unit'; -$lang->program->begin = 'Begin'; -$lang->program->end = 'End'; -$lang->program->stage = 'Stage'; -$lang->program->type = 'Type'; -$lang->program->pri = 'Priority'; -$lang->program->parent = 'Parent'; -$lang->program->exchangeRate = 'Exchange Rate'; -$lang->program->openedBy = 'OpenedBy'; -$lang->program->openedDate = 'OpenedDate'; -$lang->program->closedBy = 'ClosedBy'; -$lang->program->closedDate = 'ClosedDate'; -$lang->program->canceledBy = 'CanceledBy'; -$lang->program->canceledDate = 'CanceledDate'; -$lang->program->team = 'Team'; -$lang->program->order = 'Rank'; -$lang->program->days = 'Days'; -$lang->program->acl = 'Access Control'; -$lang->program->whitelist = 'WhiteList'; -$lang->program->deleted = 'Deleted'; +$lang->program->id = 'ID'; +$lang->program->name = 'Name'; +$lang->program->template = 'Template'; +$lang->program->category = 'Type'; +$lang->program->desc = 'Description'; +$lang->program->status = 'Status'; +$lang->program->PM = 'Manager'; +$lang->program->budget = 'Budget'; +$lang->program->budgetUnit = 'Budget Unit'; +$lang->program->begin = 'Begin'; +$lang->program->end = 'End'; +$lang->program->realBegin = 'Actual Begin'; +$lang->program->realEnd = 'Actual End'; +$lang->program->stage = 'Stage'; +$lang->program->type = 'Type'; +$lang->program->pri = 'Priority'; +$lang->program->parent = 'Parent'; +$lang->program->exchangeRate = 'Exchange Rate'; +$lang->program->openedBy = 'OpenedBy'; +$lang->program->openedDate = 'OpenedDate'; +$lang->program->closedBy = 'ClosedBy'; +$lang->program->closedDate = 'ClosedDate'; +$lang->program->canceledBy = 'CanceledBy'; +$lang->program->canceledDate = 'CanceledDate'; +$lang->program->lastEditedDate = 'LastEditedDate'; +$lang->program->team = 'Team'; +$lang->program->order = 'Rank'; +$lang->program->days = 'Days'; +$lang->program->acl = 'Access Control'; +$lang->program->whitelist = 'WhiteList'; +$lang->program->deleted = 'Deleted'; /* Actions. */ $lang->program->common = 'Program'; diff --git a/module/program/lang/zh-cn.php b/module/program/lang/zh-cn.php index 6afc1ca4b4..f4279b673c 100644 --- a/module/program/lang/zh-cn.php +++ b/module/program/lang/zh-cn.php @@ -1,33 +1,36 @@ program->id = '编号'; -$lang->program->name = '项目集名称'; -$lang->program->template = '项目集模板'; -$lang->program->category = '项目集类型'; -$lang->program->desc = '项目集描述'; -$lang->program->status = '状态'; -$lang->program->PM = '负责人'; -$lang->program->budget = '预算'; -$lang->program->budgetUnit = '预算单位'; -$lang->program->begin = '计划开始'; -$lang->program->end = '计划完成'; -$lang->program->stage = '阶段'; -$lang->program->type = '类型'; -$lang->program->pri = '优先级'; -$lang->program->parent = '父项目集'; -$lang->program->exchangeRate = '汇率'; -$lang->program->openedBy = '由谁创建'; -$lang->program->openedDate = '创建日期'; -$lang->program->closedBy = '由谁关闭'; -$lang->program->closedDate = '关闭日期'; -$lang->program->canceledBy = '由谁取消'; -$lang->program->canceledDate = '取消日期'; -$lang->program->team = '团队'; -$lang->program->order = '排序'; -$lang->program->days = '可用工作日'; -$lang->program->acl = '访问控制'; -$lang->program->whitelist = '白名单'; -$lang->program->deleted = '已删除'; +$lang->program->id = '编号'; +$lang->program->name = '项目集名称'; +$lang->program->template = '项目集模板'; +$lang->program->category = '项目集类型'; +$lang->program->desc = '项目集描述'; +$lang->program->status = '状态'; +$lang->program->PM = '负责人'; +$lang->program->budget = '预算'; +$lang->program->budgetUnit = '预算单位'; +$lang->program->begin = '计划开始'; +$lang->program->end = '计划完成'; +$lang->program->realBegin = '实际开始'; +$lang->program->realEnd = '实际完成'; +$lang->program->stage = '阶段'; +$lang->program->type = '类型'; +$lang->program->pri = '优先级'; +$lang->program->parent = '父项目集'; +$lang->program->exchangeRate = '汇率'; +$lang->program->openedBy = '由谁创建'; +$lang->program->openedDate = '创建日期'; +$lang->program->closedBy = '由谁关闭'; +$lang->program->closedDate = '关闭日期'; +$lang->program->canceledBy = '由谁取消'; +$lang->program->canceledDate = '取消日期'; +$lang->program->lastEditedDate = '最后编辑'; +$lang->program->team = '团队'; +$lang->program->order = '排序'; +$lang->program->days = '可用工作日'; +$lang->program->acl = '访问控制'; +$lang->program->whitelist = '白名单'; +$lang->program->deleted = '已删除'; /* Actions. */ $lang->program->common = '项目集'; diff --git a/module/program/model.php b/module/program/model.php index 465e3c7003..45ec48e1c4 100644 --- a/module/program/model.php +++ b/module/program/model.php @@ -130,18 +130,21 @@ class programModel extends model * @param string $status * @param string $orderBy * @param object $pager - * @param string $filter topProgram|byTopIDs - * @param mixed $filterParams + * @param string $type top|child + * @param mixed $typeParams * @access public * @return array */ - public function getList($status = 'all', $orderBy = 'id_asc', $pager = NULL, $filter = '', $filterParams = '') + public function getList($status = 'all', $orderBy = 'id_asc', $pager = NULL, $type = '', $typeParams = '') { - $filterSql = ''; - if($filter === 'byTopIDs') + $ids = array(); + if($type === 'child') { - foreach($filterParams as $topID) $filterSql .= "path like ',{$topID},%' or "; - if($filterSql) $filterSql = '(' . substr($filterSql, 0, -3) . ')'; // Remove last or. + foreach($typeParams as $topID) + { + $topIDs = $this->dao->select('id')->from(TABLE_PROGRAM)->Where('path')->like(",$topID,%")->fetchPairs('id'); + if($topIDs) $ids = array_merge($ids, $topIDs); + } } return $this->dao->select('*')->from(TABLE_PROGRAM) @@ -155,8 +158,54 @@ class programModel extends model ->markRight(2) ->beginIF($status != 'all')->andWhere('status')->eq($status)->fi() ->beginIF(!$this->cookie->showClosed)->andWhere('status')->ne('closed')->fi() - ->beginIF($filter === 'topProgram')->andWhere('parent')->eq(0)->fi() - ->beginIF(!empty($filterSql))->andWhere($filterSql)->fi() + ->beginIF($type === 'top')->andWhere('parent')->eq(0)->fi() + ->beginIF(!empty($ids))->andWhere('id')->in($ids)->fi() + ->orderBy($orderBy) + ->page($pager) + ->fetchAll('id'); + } + + /** + * Get program list by search. + * + * @param string $orderBy + * @param object $pager + * @param int $queryID + * @access public + * @return void + */ + public function getListBySearch($orderBy = 'id_asc', $pager = NULL, $queryID = 0) + { + if($queryID) + { + $query = $this->loadModel('search')->getQuery($queryID); + if($query) + { + $this->session->set('programQuery', $query->sql); + $this->session->set('programForm', $query->form); + } + else + { + $this->session->set('programQuery', ' 1 = 1'); + } + } + else + { + if($this->session->programQuery == false) $this->session->set('programQuery', ' 1 = 1'); + } + $query = $this->session->programQuery; + + return $this->dao->select('*')->from(TABLE_PROGRAM) + ->where('deleted')->eq(0) + ->andWhere('vision')->eq($this->config->vision) + ->andWhere('((type')->eq('program') + ->beginIF(!$this->app->user->admin and $this->app->rawMethod != 'browse')->andWhere('id')->in($this->app->user->view->programs)->fi() + ->markRight(1) + ->orWhere('(type')->eq('project') + ->beginIF(!$this->app->user->admin)->andWhere('id')->in($this->app->user->view->projects)->fi() + ->markRight(2) + ->beginIF(!$this->cookie->showClosed)->andWhere('status')->ne('closed')->fi() + ->beginIF($query)->andWhere($query)->fi() ->orderBy($orderBy) ->page($pager) ->fetchAll('id'); diff --git a/module/program/view/browse.html.php b/module/program/view/browse.html.php index e26b262b62..abbf959b56 100644 --- a/module/program/view/browse.html.php +++ b/module/program/view/browse.html.php @@ -28,6 +28,7 @@ $lang->program->showClosed), '', $this->cookie->showClosed ? 'checked=checked' : '');?> $lang->project->edit), '', $this->cookie->editProject ? 'checked=checked' : '');?> + user->search;?>
' . $lang->project->create, '', 'class="btn btn-secondary" data-toggle="modal" data-target="#guideDialog"');?> @@ -36,6 +37,7 @@
+

program->noProgram;?> @@ -44,6 +46,7 @@

+
Date: Wed, 11 May 2022 16:40:48 +0800 Subject: [PATCH 141/166] *Optimize the code. --- module/project/config.php | 2 +- module/project/lang/en.php | 2 ++ module/project/lang/zh-cn.php | 2 -- module/project/view/browsebylist.html.php | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/module/project/config.php b/module/project/config.php index 9fb9286c56..5330fe9321 100644 --- a/module/project/config.php +++ b/module/project/config.php @@ -138,7 +138,7 @@ $config->project->search['fields']['code'] = $lang->project->code; $config->project->search['fields']['id'] = $lang->project->id; $config->project->search['fields']['model'] = $lang->project->model; $config->project->search['fields']['parent'] = $lang->project->parent; -$config->project->search['fields']['status'] = $lang->project->projectStatus; +$config->project->search['fields']['status'] = $lang->project->status; $config->project->search['fields']['desc'] = $lang->project->desc; $config->project->search['fields']['PM'] = $lang->project->PM; $config->project->search['fields']['openedDate'] = $lang->project->openedDate; diff --git a/module/project/lang/en.php b/module/project/lang/en.php index 8f30c43aac..c44e458fe8 100644 --- a/module/project/lang/en.php +++ b/module/project/lang/en.php @@ -226,6 +226,7 @@ $lang->project->currencySymbol['NZD'] = 'NZ$'; $lang->project->currencySymbol['THB'] = '฿'; $lang->project->currencySymbol['SGD'] = 'S$'; +$lang->project->modelList[''] = ''; $lang->project->modelList['scrum'] = "Scrum"; $lang->project->modelList['waterfall'] = "CMMI"; $lang->project->modelList['kanban'] = "Kanban"; @@ -256,6 +257,7 @@ $lang->project->kanbanSubAclList['program'] = 'Open in the program (all upper-le $lang->project->authList['extend'] = 'Inherit (system privilege and project privilege)'; $lang->project->authList['reset'] = 'Reset (project privilege only)'; +$lang->project->statusList[''] = ''; $lang->project->statusList['wait'] = 'Waiting'; $lang->project->statusList['doing'] = 'Doing'; $lang->project->statusList['suspended'] = 'Suspended'; diff --git a/module/project/lang/zh-cn.php b/module/project/lang/zh-cn.php index b60f1e6366..4ef428fc61 100644 --- a/module/project/lang/zh-cn.php +++ b/module/project/lang/zh-cn.php @@ -79,7 +79,6 @@ $lang->project->begin = '计划开始'; $lang->project->end = '计划完成'; $lang->project->status = '状态'; $lang->project->subStatus = '子状态'; -$lang->project->projectStatus = '项目状态'; $lang->project->type = '项目类型'; $lang->project->lifetime = '项目周期'; $lang->project->attribute = '阶段类型'; @@ -162,7 +161,6 @@ $lang->project->branch = '所属分支'; $lang->project->plan = '所属计划'; $lang->project->createKanban = '添加看板'; $lang->project->kanban = '看板'; -$lang->project->search = '搜索'; /* Project Kanban. */ $lang->project->typeList = array(); diff --git a/module/project/view/browsebylist.html.php b/module/project/view/browsebylist.html.php index 052a85fe84..c459a4c95f 100644 --- a/module/project/view/browsebylist.html.php +++ b/module/project/view/browsebylist.html.php @@ -40,7 +40,7 @@ $lang->project->mine), '', $this->cookie->involved ? 'checked=checked' : '');?> - project->search;?> + search->common;?>
From 43984d13b4e1b52e8fba5fb1a6106ea949a8b241 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=8D=8E=E4=BC=9F?= Date: Wed, 11 May 2022 08:45:54 +0000 Subject: [PATCH 142/166] Update model.php --- module/project/model.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/module/project/model.php b/module/project/model.php index 458bac3853..c2abf92f62 100644 --- a/module/project/model.php +++ b/module/project/model.php @@ -637,11 +637,10 @@ class projectModel extends model * */ public function getBySearch($projectQuery) { - $projects = $this->dao->select('*')->from(TABLE_PROJECT) + return $this->dao->select('*')->from(TABLE_PROJECT) ->where($projectQuery) ->andWhere('type')->eq('project') ->fetchAll(); - return $projects; } /* From 675d2c2e86d04a51234ffe7f14d55ba887e488d6 Mon Sep 17 00:00:00 2001 From: zhouxudong Date: Wed, 11 May 2022 08:49:22 +0000 Subject: [PATCH 143/166] * Fix bug #22339. --- module/execution/js/edit.js | 2 +- "module/execution/view/\\" | 142 ++++++++++++++++++++++++++++ module/execution/view/edit.html.php | 2 +- 3 files changed, 144 insertions(+), 2 deletions(-) create mode 100644 "module/execution/view/\\" diff --git a/module/execution/js/edit.js b/module/execution/js/edit.js index 0c09b6bfe8..3955629251 100644 --- a/module/execution/js/edit.js +++ b/module/execution/js/edit.js @@ -71,6 +71,6 @@ $(function() { $('#submit').after(""); } - $("#syncStories").val(confirm(confirmSyncStories) ? 'yes' : 'no'); + $("#syncStories").val(confirm(confirmSync) ? 'yes' : 'no'); }); }) diff --git "a/module/execution/view/\\" "b/module/execution/view/\\" new file mode 100644 index 0000000000..aa7fc31b38 --- /dev/null +++ "b/module/execution/view/\\" @@ -0,0 +1,142 @@ + + * @package ZenTaoPMS + * @version $Id: index.html.php 4129 2013-01-18 01:58:14Z wwccss $ + */ +?> + + +
+
+

execution->batchEdit;?>

+
+ createLink('custom', 'ajaxSaveCustomFields', 'module=execution§ion=custom&key=batchEditFields')?> + +
+
+ execution->edit->requiredFields) as $field) + { + if($field) + { + $requiredFields[$field] = ''; + if(strpos(",{$config->execution->customBatchEditFields},", ",{$field},") !== false) $visibleFields[$field] = ''; + } + } + $minWidth = (count($visibleFields) > 5) ? 'w-150px' : ''; + + $name = $from == 'execution' ? 'execName' : 'name'; + $code = $from == 'execution' ? 'execCode' : 'code'; + $PM = $from == 'execution' ? 'execPM' : 'PM'; + $type = $from == 'execution' ? 'execType' : 'type'; + $desc = $from == 'execution' ? 'execDesc' : 'desc'; + $status = $from == 'execution' ? 'execStatus' : 'status'; + + ?> +
'> +
+ + + + + systemMode == 'new' and isset($project) and $project->model == 'scrum'):?> + + + + + + + + + + + + + + + + execution->getFlowExtendFields(); + foreach($extendFields as $extendField) echo ""; + ?> + + + + + config->moreLinks["PM"])) $this->config->moreLinks["PMs[$executionID]"] = $this->config->moreLinks["PM"]; + if(!empty($this->config->moreLinks["PO"])) $this->config->moreLinks["POs[$executionID]"] = $this->config->moreLinks["PO"]; + if(!empty($this->config->moreLinks["QD"])) $this->config->moreLinks["QDs[$executionID]"] = $this->config->moreLinks["QD"]; + if(!empty($this->config->moreLinks["RD"])) $this->config->moreLinks["RDs[$executionID]"] = $this->config->moreLinks["RD"]; + ?> + + + systemMode == 'new' and isset($project) and $project->model == 'scrum'):?> + + + + + + + + + + + + + + + + control == 'select' or $extendField->control == 'multi-select') ? " style='overflow:visible'" : '') . ">" . $this->loadModel('flow')->getFieldControl($extendField, $executions[$executionID], $extendField->field . "[{$executionID}]") . "";?> + + config->moreLinks["PMs[$executionID]"])) unset($this->config->moreLinks["PMs[$executionID]"]); + if(isset($this->config->moreLinks["POs[$executionID]"])) unset($this->config->moreLinks["POs[$executionID]"]); + if(isset($this->config->moreLinks["QDs[$executionID]"])) unset($this->config->moreLinks["QDs[$executionID]"]); + if(isset($this->config->moreLinks["RDs[$executionID]"])) unset($this->config->moreLinks["RDs[$executionID]"]); + ?> + + + + + + + +
idAB;?>execution->projectName;?>execution->$name;?>execution->$code;?>'>execution->$PM;?>'>execution->PO;?>'>execution->QD;?>'>execution->RD;?>'>execution->$type;?>'>execution->$status;?>execution->begin;?>execution->end;?>'>execution->$desc;?>'>execution->teamname;?>'>execution->days;?>{$extendField->name}
project, "class='form-control picker-select' onchange='sync($executionID, {$executions[$executionID]->project})'");?>name, "class='form-control'");?>code, "class='form-control'");?>' style='overflow:visible'>PM, "class='form-control picker-select'");?>' style='overflow:visible'>PO, "class='form-control picker-select'");?>' style='overflow:visible'>QD, "class='form-control picker-select'");?>' style='overflow:visible'>RD, "class='form-control picker-select'");?>'> + type == 'stage') + { + echo html::select("attributes[$executionID]", $lang->stage->typeList, $executions[$executionID]->attribute, 'class=form-control'); + } + else + { + echo html::select("lifetimes[$executionID]", $lang->execution->lifeTimeList, $executions[$executionID]->lifetime, 'class=form-control'); + } + ?> + '>execution->statusList, $executions[$executionID]->status, 'class=form-control');?>begin, "class='form-control form-date' onchange='computeWorkDays(this.id)'");?>end, "class='form-control form-date' onchange='computeWorkDays(this.id)'");?>'> desc, "rows='1' class='form-control autosize'");?>'>team, "class='form-control'");?>'> +
+ days, "class='form-control'");?> + execution->day;?> +
+
+ + goback, $this->session->executionList, 'self', '', 'btn btn-wide');;?> +
+
+
+
+execution->weekend);?> +execution->confirmSync);?> +project);?> + diff --git a/module/execution/view/edit.html.php b/module/execution/view/edit.html.php index 7c664b9c0a..449d728f84 100644 --- a/module/execution/view/edit.html.php +++ b/module/execution/view/edit.html.php @@ -220,6 +220,6 @@ execution->notAllowRemoveProducts);?> -execution->confirmSyncStories);?> +execution->confirmSync);?> systemMode);?> From a0f2b068dc9287e98516d43da674ed5a26c53cec Mon Sep 17 00:00:00 2001 From: zhouxudong Date: Wed, 11 May 2022 08:51:36 +0000 Subject: [PATCH 144/166] * Fix bug #22339. --- "module/execution/view/\\" | 142 ------------------------------------- 1 file changed, 142 deletions(-) delete mode 100644 "module/execution/view/\\" diff --git "a/module/execution/view/\\" "b/module/execution/view/\\" deleted file mode 100644 index aa7fc31b38..0000000000 --- "a/module/execution/view/\\" +++ /dev/null @@ -1,142 +0,0 @@ - - * @package ZenTaoPMS - * @version $Id: index.html.php 4129 2013-01-18 01:58:14Z wwccss $ - */ -?> - - -
-
-

execution->batchEdit;?>

-
- createLink('custom', 'ajaxSaveCustomFields', 'module=execution§ion=custom&key=batchEditFields')?> - -
-
- execution->edit->requiredFields) as $field) - { - if($field) - { - $requiredFields[$field] = ''; - if(strpos(",{$config->execution->customBatchEditFields},", ",{$field},") !== false) $visibleFields[$field] = ''; - } - } - $minWidth = (count($visibleFields) > 5) ? 'w-150px' : ''; - - $name = $from == 'execution' ? 'execName' : 'name'; - $code = $from == 'execution' ? 'execCode' : 'code'; - $PM = $from == 'execution' ? 'execPM' : 'PM'; - $type = $from == 'execution' ? 'execType' : 'type'; - $desc = $from == 'execution' ? 'execDesc' : 'desc'; - $status = $from == 'execution' ? 'execStatus' : 'status'; - - ?> -
'> -
- - - - - systemMode == 'new' and isset($project) and $project->model == 'scrum'):?> - - - - - - - - - - - - - - - - execution->getFlowExtendFields(); - foreach($extendFields as $extendField) echo ""; - ?> - - - - - config->moreLinks["PM"])) $this->config->moreLinks["PMs[$executionID]"] = $this->config->moreLinks["PM"]; - if(!empty($this->config->moreLinks["PO"])) $this->config->moreLinks["POs[$executionID]"] = $this->config->moreLinks["PO"]; - if(!empty($this->config->moreLinks["QD"])) $this->config->moreLinks["QDs[$executionID]"] = $this->config->moreLinks["QD"]; - if(!empty($this->config->moreLinks["RD"])) $this->config->moreLinks["RDs[$executionID]"] = $this->config->moreLinks["RD"]; - ?> - - - systemMode == 'new' and isset($project) and $project->model == 'scrum'):?> - - - - - - - - - - - - - - - - control == 'select' or $extendField->control == 'multi-select') ? " style='overflow:visible'" : '') . ">" . $this->loadModel('flow')->getFieldControl($extendField, $executions[$executionID], $extendField->field . "[{$executionID}]") . "";?> - - config->moreLinks["PMs[$executionID]"])) unset($this->config->moreLinks["PMs[$executionID]"]); - if(isset($this->config->moreLinks["POs[$executionID]"])) unset($this->config->moreLinks["POs[$executionID]"]); - if(isset($this->config->moreLinks["QDs[$executionID]"])) unset($this->config->moreLinks["QDs[$executionID]"]); - if(isset($this->config->moreLinks["RDs[$executionID]"])) unset($this->config->moreLinks["RDs[$executionID]"]); - ?> - - - - - - - -
idAB;?>execution->projectName;?>execution->$name;?>execution->$code;?>'>execution->$PM;?>'>execution->PO;?>'>execution->QD;?>'>execution->RD;?>'>execution->$type;?>'>execution->$status;?>execution->begin;?>execution->end;?>'>execution->$desc;?>'>execution->teamname;?>'>execution->days;?>{$extendField->name}
project, "class='form-control picker-select' onchange='sync($executionID, {$executions[$executionID]->project})'");?>name, "class='form-control'");?>code, "class='form-control'");?>' style='overflow:visible'>PM, "class='form-control picker-select'");?>' style='overflow:visible'>PO, "class='form-control picker-select'");?>' style='overflow:visible'>QD, "class='form-control picker-select'");?>' style='overflow:visible'>RD, "class='form-control picker-select'");?>'> - type == 'stage') - { - echo html::select("attributes[$executionID]", $lang->stage->typeList, $executions[$executionID]->attribute, 'class=form-control'); - } - else - { - echo html::select("lifetimes[$executionID]", $lang->execution->lifeTimeList, $executions[$executionID]->lifetime, 'class=form-control'); - } - ?> - '>execution->statusList, $executions[$executionID]->status, 'class=form-control');?>begin, "class='form-control form-date' onchange='computeWorkDays(this.id)'");?>end, "class='form-control form-date' onchange='computeWorkDays(this.id)'");?>'> desc, "rows='1' class='form-control autosize'");?>'>team, "class='form-control'");?>'> -
- days, "class='form-control'");?> - execution->day;?> -
-
- - goback, $this->session->executionList, 'self', '', 'btn btn-wide');;?> -
-
-
-
-execution->weekend);?> -execution->confirmSync);?> -project);?> - From 41f8454bb45bc70f9513b21a96ab29f1c13e2113 Mon Sep 17 00:00:00 2001 From: wangyuting2 <851424971@qq.com> Date: Wed, 11 May 2022 16:52:02 +0800 Subject: [PATCH 145/166] * Adjust release action menu. --- module/release/model.php | 76 +++++++++++++++++++++++++++++ module/release/view/browse.html.php | 20 +------- module/release/view/view.html.php | 18 +------ 3 files changed, 79 insertions(+), 35 deletions(-) diff --git a/module/release/model.php b/module/release/model.php index 89adcb5dbb..1253044b8d 100644 --- a/module/release/model.php +++ b/module/release/model.php @@ -670,4 +670,80 @@ class releaseModel extends model $this->loadModel('mail')->send(implode(',', $toList), $subject, $mailContent, '', false, $emails); } } + + /** + * Build release action menu. + * + * @param object $release + * @param string $type + * @access public + * @return string + */ + public function buildOperateMenu($release, $type = 'view') + { + $function = 'buildOperate' . ucfirst($type) . 'Menu'; + return $this->$function($release); + } + + /** + * Build release view action menu. + * + * @param object $release + * @access public + * @return string + */ + public function buildOperateViewMenu($release) + { + $canBeChanged = common::canBeChanged('release', $release); + if($release->deleted || !$canBeChanged || isonlybody()) return ''; + + $menu = ''; + $params = "releaseID=$release->id"; + + if(common::hasPriv('release', 'changeStatus', $release)) + { + $changedStatus = $release->status == 'normal' ? 'terminate' : 'normal'; + $menu .= html::a(inlink('changeStatus', "releaseID=$release->id&status=$changedStatus"), ' ' . $this->lang->release->changeStatusList[$changedStatus], 'hiddenwin', "class='btn btn-link' title='{$this->lang->release->changeStatusList[$changedStatus]}'"); + } + + $menu .= "
"; + $menu .= $this->buildFlowMenu('release', $release, 'view', 'direct'); + $menu .= "
"; + + $menu .= $this->buildMenu('release', 'edit', $params, $release, 'view'); + $menu .= $this->buildMenu('release', 'delete', $params, $release, 'view', 'trash', 'hiddenwin'); + + return $menu; + } + + /** + * Build release browse action menu. + * + * @param object $release + * @access public + * @return string + */ + public function buildOperateBrowseMenu($release) + { + $canBeChanged = common::canBeChanged('release', $release); + if(!$canBeChanged) return ''; + + $menu = ''; + $params = "releaseID=$release->id"; + $changedStatus = $release->status == 'normal' ? 'terminate' : 'normal'; + + if(common::hasPriv('release', 'linkStory')) $menu .= html::a(inlink('view', "$params&type=story&link=true"), ' ', '', "class='btn' title='{$this->lang->release->linkStory}'"); + if(common::hasPriv('release', 'linkBug')) $menu .= html::a(inlink('view', "$params&type=bug&link=true"), ' ', '', "class='btn' title='{$this->lang->release->linkBug}'"); + $menu .= $this->buildMenu('release', 'changeStatus', "$params&status=$changedStatus", $release, 'browse', $release->status == 'normal' ? 'pause' : 'play', 'hiddenwin', '', '', '',$this->lang->release->changeStatusList[$changedStatus]); + $menu .= $this->buildMenu('release', 'edit', "release=$release->id", $release, 'browse'); + $menu .= $this->buildMenu('release', 'notify', "release=$release->id", $release, 'browse', 'bullhorn', '', 'iframe', true); + + if(common::hasPriv('release', 'delete', $release)) + { + $deleteURL = helper::createLink('release', 'delete', "releaseID=$release->id&confirm=yes"); + $menu .= html::a("javascript:ajaxDelete(\"$deleteURL\", \"releaseList\", confirmDelete)", '', '', "class='btn' title='{$this->lang->release->delete}'"); + } + + return $menu; + } } diff --git a/module/release/view/browse.html.php b/module/release/view/browse.html.php index 9ed17da60f..4444a5242b 100644 --- a/module/release/view/browse.html.php +++ b/module/release/view/browse.html.php @@ -80,25 +80,7 @@ " . $this->loadModel('flow')->getFieldValue($extendField, $release) . "";?> - id&type=story&link=true"), ' ', '', "class='btn' title='{$lang->release->linkStory}'"); - if(common::hasPriv('release', 'linkBug')) echo html::a(inlink('view', "releaseID=$release->id&type=bug&link=true"), ' ', '', "class='btn' title='{$lang->release->linkBug}'"); - if(common::hasPriv('release', 'changeStatus', $release)) - { - $changedStatus = $release->status == 'normal' ? 'terminate' : 'normal'; - echo html::a($this->createLink('release', 'changeStatus', "releaseID=$release->id&status=$changedStatus"), ' ', 'hiddenwin', "class='btn' title='{$lang->release->changeStatusList[$changedStatus]}'"); - } - common::printIcon('release', 'edit', "release=$release->id", $release, 'list'); - common::printIcon('release', 'notify', "release=$release->id", $release, 'list', 'bullhorn', '', 'iframe', true); - if(common::hasPriv('release', 'delete', $release)) - { - $deleteURL = $this->createLink('release', 'delete', "releaseID=$release->id&confirm=yes"); - echo html::a("javascript:ajaxDelete(\"$deleteURL\", \"releaseList\", confirmDelete)", '', '', "class='btn' title='{$lang->release->delete}'"); - } - } - ?> + release->buildOperateMenu($release, 'browse');?> diff --git a/module/release/view/view.html.php b/module/release/view/view.html.php index da1fbae9c1..71a3c84d30 100644 --- a/module/release/view/view.html.php +++ b/module/release/view/view.html.php @@ -14,6 +14,7 @@ release->confirmUnlinkStory)?> release->confirmUnlinkBug)?> +
- deleted and $canBeChanged and !isonlybody()) - { - echo $this->buildOperateMenu($release, 'view'); - - if(common::hasPriv('release', 'changeStatus', $release)) - { - $changedStatus = $release->status == 'normal' ? 'terminate' : 'normal'; - echo html::a(inlink('changeStatus', "releaseID=$release->id&status=$changedStatus"), ' ' . $lang->release->changeStatusList[$changedStatus], 'hiddenwin', "class='btn btn-link' title='{$lang->release->changeStatusList[$changedStatus]}'"); - } - if(common::hasPriv('release', 'edit')) echo html::a(inlink('edit', "releaseID=$release->id"), " " . $this->lang->edit, '', "class='btn btn-link' title='{$this->lang->edit}'"); - if(common::hasPriv('release', 'delete')) echo html::a(inlink('delete', "releaseID=$release->id"), " " . $this->lang->delete, '', "class='btn btn-link' title='{$this->lang->delete}' target='hiddenwin'"); - } - ?> + release->buildOperateMenu($release, 'view');?>
From f65a51e5e1498b4dcc1ca98ea0d15c259c10e7d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=8D=8E=E4=BC=9F?= Date: Wed, 11 May 2022 17:00:59 +0800 Subject: [PATCH 146/166] *Fix bug. --- module/project/config.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/module/project/config.php b/module/project/config.php index 5330fe9321..c4370e1bd0 100644 --- a/module/project/config.php +++ b/module/project/config.php @@ -144,8 +144,8 @@ $config->project->search['fields']['PM'] = $lang->project->PM; $config->project->search['fields']['openedDate'] = $lang->project->openedDate; $config->project->search['fields']['begin'] = $lang->project->begin; $config->project->search['fields']['end'] = $lang->project->end; -$config->project->search['fields']['realBeginAB'] = $lang->project->realBeginAB; -$config->project->search['fields']['realEndAB'] = $lang->project->realEndAB; +$config->project->search['fields']['realBegin'] = $lang->project->realBeginAB; +$config->project->search['fields']['realEnd'] = $lang->project->realEndAB; $config->project->search['fields']['openedBy'] = $lang->project->openedBy; $config->project->search['fields']['closedBy'] = $lang->project->closedBy; $config->project->search['fields']['lastEditedDate'] = $lang->project->lastEditedDate; @@ -162,8 +162,8 @@ $config->project->search['params']['PM'] = array('operator' => '=' $config->project->search['params']['openedDate'] = array('operator' => '=' , 'control' => 'input' , 'values' => '', 'class' => 'date'); $config->project->search['params']['begin'] = array('operator' => '=' , 'control' => 'input' , 'values' => '', 'class' => 'date'); $config->project->search['params']['end'] = array('operator' => '=' , 'control' => 'input' , 'values' => '', 'class' => 'date'); -$config->project->search['params']['realBeginAB'] = array('operator' => '=' , 'control' => 'input' , 'values' => '', 'class' => 'date'); -$config->project->search['params']['realEndAB'] = array('operator' => '=' , 'control' => 'input' , 'values' => '', 'class' => 'date'); +$config->project->search['params']['realBegin'] = array('operator' => '=' , 'control' => 'input' , 'values' => '', 'class' => 'date'); +$config->project->search['params']['realEnd'] = array('operator' => '=' , 'control' => 'input' , 'values' => '', 'class' => 'date'); $config->project->search['params']['openedBy'] = array('operator' => '=' , 'control' => 'select', 'values' => 'users'); $config->project->search['params']['closedBy'] = array('operator' => '=' , 'control' => 'select', 'values' => 'users'); $config->project->search['params']['lastEditedDate'] = array('operator' => '=' , 'control' => 'input' , 'values' => '', 'class' => 'date'); From 318ccfb4bcc27267d0b3f2b04e77300fff86f657 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=8D=8E=E4=BC=9F?= Date: Wed, 11 May 2022 09:03:10 +0000 Subject: [PATCH 147/166] Update config.php --- module/project/config.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/module/project/config.php b/module/project/config.php index c4370e1bd0..c2c56be5c3 100644 --- a/module/project/config.php +++ b/module/project/config.php @@ -144,8 +144,8 @@ $config->project->search['fields']['PM'] = $lang->project->PM; $config->project->search['fields']['openedDate'] = $lang->project->openedDate; $config->project->search['fields']['begin'] = $lang->project->begin; $config->project->search['fields']['end'] = $lang->project->end; -$config->project->search['fields']['realBegin'] = $lang->project->realBeginAB; -$config->project->search['fields']['realEnd'] = $lang->project->realEndAB; +$config->project->search['fields']['realBegin'] = $lang->project->realBeginAB; +$config->project->search['fields']['realEnd'] = $lang->project->realEndAB; $config->project->search['fields']['openedBy'] = $lang->project->openedBy; $config->project->search['fields']['closedBy'] = $lang->project->closedBy; $config->project->search['fields']['lastEditedDate'] = $lang->project->lastEditedDate; @@ -162,8 +162,8 @@ $config->project->search['params']['PM'] = array('operator' => '=' $config->project->search['params']['openedDate'] = array('operator' => '=' , 'control' => 'input' , 'values' => '', 'class' => 'date'); $config->project->search['params']['begin'] = array('operator' => '=' , 'control' => 'input' , 'values' => '', 'class' => 'date'); $config->project->search['params']['end'] = array('operator' => '=' , 'control' => 'input' , 'values' => '', 'class' => 'date'); -$config->project->search['params']['realBegin'] = array('operator' => '=' , 'control' => 'input' , 'values' => '', 'class' => 'date'); -$config->project->search['params']['realEnd'] = array('operator' => '=' , 'control' => 'input' , 'values' => '', 'class' => 'date'); +$config->project->search['params']['realBegin'] = array('operator' => '=' , 'control' => 'input' , 'values' => '', 'class' => 'date'); +$config->project->search['params']['realEnd'] = array('operator' => '=' , 'control' => 'input' , 'values' => '', 'class' => 'date'); $config->project->search['params']['openedBy'] = array('operator' => '=' , 'control' => 'select', 'values' => 'users'); $config->project->search['params']['closedBy'] = array('operator' => '=' , 'control' => 'select', 'values' => 'users'); $config->project->search['params']['lastEditedDate'] = array('operator' => '=' , 'control' => 'input' , 'values' => '', 'class' => 'date'); From 0e18988f6acb9a5c810d4ff55bd53bb532f42110 Mon Sep 17 00:00:00 2001 From: liumengyi Date: Wed, 11 May 2022 17:05:04 +0800 Subject: [PATCH 148/166] * Fix bug for close product. --- module/product/model.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/product/model.php b/module/product/model.php index 79493dc5df..a6c1d0ba54 100644 --- a/module/product/model.php +++ b/module/product/model.php @@ -2108,7 +2108,7 @@ class productModel extends model $menu .= $this->buildFlowMenu('product', $product, $type, 'direct'); $menu .= "
"; - $menu .= $this->buildMenu('product', 'close', $params, $product, $type, '', '', '', '', "data-app='product'"); + $menu .= $this->buildMenu('product', 'close', $params, $product, $type, '', '', 'iframe', true, "data-app='product'"); $menu .= "
"; } From 2bc6e6b468a030ca93da2dac20b8167e74896d4f Mon Sep 17 00:00:00 2001 From: zenggang Date: Wed, 11 May 2022 09:08:18 +0000 Subject: [PATCH 149/166] * Adjust code --- module/program/model.php | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/module/program/model.php b/module/program/model.php index 45ec48e1c4..63e7ee5e0c 100644 --- a/module/program/model.php +++ b/module/program/model.php @@ -135,15 +135,14 @@ class programModel extends model * @access public * @return array */ - public function getList($status = 'all', $orderBy = 'id_asc', $pager = NULL, $type = '', $typeParams = '') + public function getList($status = 'all', $orderBy = 'id_asc', $pager = NULL, $type = '', $topIdList = '') { - $ids = array(); + $projectIdList = array(); if($type === 'child') { - foreach($typeParams as $topID) + foreach($topIdList as $topID) { - $topIDs = $this->dao->select('id')->from(TABLE_PROGRAM)->Where('path')->like(",$topID,%")->fetchPairs('id'); - if($topIDs) $ids = array_merge($ids, $topIDs); + $projectIdList += $this->dao->select('id')->from(TABLE_PROGRAM)->Where('path')->like(",$topID,%")->fetchPairs('id'); } } @@ -159,7 +158,7 @@ class programModel extends model ->beginIF($status != 'all')->andWhere('status')->eq($status)->fi() ->beginIF(!$this->cookie->showClosed)->andWhere('status')->ne('closed')->fi() ->beginIF($type === 'top')->andWhere('parent')->eq(0)->fi() - ->beginIF(!empty($ids))->andWhere('id')->in($ids)->fi() + ->beginIF(!empty($projectIdList))->andWhere('id')->in($projectIdList)->fi() ->orderBy($orderBy) ->page($pager) ->fetchAll('id'); From 0fe5a1884f7fcf41bcc3178d534286284b3f04a9 Mon Sep 17 00:00:00 2001 From: zenggang Date: Wed, 11 May 2022 09:11:13 +0000 Subject: [PATCH 150/166] * Adjust code --- module/program/model.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/module/program/model.php b/module/program/model.php index 63e7ee5e0c..01c47c2219 100644 --- a/module/program/model.php +++ b/module/program/model.php @@ -131,16 +131,16 @@ class programModel extends model * @param string $orderBy * @param object $pager * @param string $type top|child - * @param mixed $typeParams + * @param mixed $idList * @access public * @return array */ - public function getList($status = 'all', $orderBy = 'id_asc', $pager = NULL, $type = '', $topIdList = '') + public function getList($status = 'all', $orderBy = 'id_asc', $pager = NULL, $type = '', $idList = '') { $projectIdList = array(); if($type === 'child') { - foreach($topIdList as $topID) + foreach($idList as $topID) { $projectIdList += $this->dao->select('id')->from(TABLE_PROGRAM)->Where('path')->like(",$topID,%")->fetchPairs('id'); } From 214259dfc0cd784d561c56dfc3b5da6ccd4cd433 Mon Sep 17 00:00:00 2001 From: tanghucheng Date: Wed, 11 May 2022 09:23:03 +0000 Subject: [PATCH 151/166] * Fix bug. --- db/update16.5.sql | 2 -- 1 file changed, 2 deletions(-) diff --git a/db/update16.5.sql b/db/update16.5.sql index 4cd109e11e..3b86f8abb9 100644 --- a/db/update16.5.sql +++ b/db/update16.5.sql @@ -135,8 +135,6 @@ DELETE FROM `zt_workflowfield` WHERE `module`='project' AND `field`='stage'; DELETE FROM `zt_workflowfield` WHERE `module`='bug' AND `field`='feedback'; DELETE FROM `zt_workflowfield` WHERE `module`='task' AND `field`='feedback'; -ALTER TABLE `zt_workflowdatasource` ADD UNIQUE `code` (`code`); - REPLACE INTO `zt_workflowdatasource` (`type`, `name`, `code`, `buildin`, `datasource`, `view`, `keyField`, `valueField`) VALUES ('lang', '项目模型', 'projectModel', '1', 'projectModel', '', '', ''), ('lang', '反馈类型', 'feedbackType', '1', 'feedbackType', '', '', ''), From a2b64debb935aacd5665c70877cfa5a96d2a67ab Mon Sep 17 00:00:00 2001 From: zenggang Date: Wed, 11 May 2022 09:24:30 +0000 Subject: [PATCH 152/166] * Adjust code --- module/program/control.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/module/program/control.php b/module/program/control.php index 780397b955..3c8d716d36 100644 --- a/module/program/control.php +++ b/module/program/control.php @@ -52,9 +52,9 @@ class program extends control else { $topPrograms = $this->program->getList($status, $orderBy, $pager, 'top'); - $programIDs = array(); - foreach($topPrograms as $programID => $program) $programIDs[] = $programID; - $programs = $this->program->getList($status, $orderBy, null, 'child', $programIDs); + $programIds = array(); + foreach($topPrograms as $programID => $program) $programIds[] = $programID; + $programs = $this->program->getList($status, $orderBy, null, 'child', $programIds); } } From a798dd5f9c051441f6053b4a62c4435716e01420 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=8D=8E=E4=BC=9F?= Date: Wed, 11 May 2022 17:33:50 +0800 Subject: [PATCH 153/166] *Fix upgrade bug. --- db/update16.5.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/update16.5.sql b/db/update16.5.sql index 4cd109e11e..a841fc8213 100644 --- a/db/update16.5.sql +++ b/db/update16.5.sql @@ -140,7 +140,7 @@ ALTER TABLE `zt_workflowdatasource` ADD UNIQUE `code` (`code`); REPLACE INTO `zt_workflowdatasource` (`type`, `name`, `code`, `buildin`, `datasource`, `view`, `keyField`, `valueField`) VALUES ('lang', '项目模型', 'projectModel', '1', 'projectModel', '', '', ''), ('lang', '反馈类型', 'feedbackType', '1', 'feedbackType', '', '', ''), -('lang', '反馈处理方案', 'feedbackSolution', '1', 'feedbackSolution', '', '', ''); +('lang', '反馈处理方案', 'feedbackSolution', '1', 'feedbackSolution', '', '', ''), ('lang', '反馈关闭原因', 'feedbackclosedReason', '1', 'feedbackclosedReason', '', '', ''); REPLACE INTO `zt_workflowfield` (`module`, `field`, `type`, `length`, `name`, `control`, `expression`, `options`, `default`, `rules`, `placeholder`, `order`, `searchOrder`, `exportOrder`, `canExport`, `canSearch`, `isValue`, `readonly`, `buildin`, `desc`, `createdBy`, `createdDate`, `editedBy`, `editedDate`) VALUES From 1f72825b20f9114fabff44c8b7ce82c72189602e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=8D=8E=E4=BC=9F?= Date: Wed, 11 May 2022 09:36:27 +0000 Subject: [PATCH 154/166] Update update16.5.sql --- db/update16.5.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/update16.5.sql b/db/update16.5.sql index 4cd109e11e..500a338ec4 100644 --- a/db/update16.5.sql +++ b/db/update16.5.sql @@ -140,7 +140,7 @@ ALTER TABLE `zt_workflowdatasource` ADD UNIQUE `code` (`code`); REPLACE INTO `zt_workflowdatasource` (`type`, `name`, `code`, `buildin`, `datasource`, `view`, `keyField`, `valueField`) VALUES ('lang', '项目模型', 'projectModel', '1', 'projectModel', '', '', ''), ('lang', '反馈类型', 'feedbackType', '1', 'feedbackType', '', '', ''), -('lang', '反馈处理方案', 'feedbackSolution', '1', 'feedbackSolution', '', '', ''); +('lang', '反馈处理方案', 'feedbackSolution', '1', 'feedbackSolution', '', '', ''), ('lang', '反馈关闭原因', 'feedbackclosedReason', '1', 'feedbackclosedReason', '', '', ''); REPLACE INTO `zt_workflowfield` (`module`, `field`, `type`, `length`, `name`, `control`, `expression`, `options`, `default`, `rules`, `placeholder`, `order`, `searchOrder`, `exportOrder`, `canExport`, `canSearch`, `isValue`, `readonly`, `buildin`, `desc`, `createdBy`, `createdDate`, `editedBy`, `editedDate`) VALUES From 2eddac20a1730abf00eb261e74a6c2a26deaf016 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=8D=8E=E4=BC=9F?= Date: Wed, 11 May 2022 09:36:56 +0000 Subject: [PATCH 155/166] Update update16.5.sql --- db/update16.5.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/update16.5.sql b/db/update16.5.sql index 500a338ec4..a841fc8213 100644 --- a/db/update16.5.sql +++ b/db/update16.5.sql @@ -140,7 +140,7 @@ ALTER TABLE `zt_workflowdatasource` ADD UNIQUE `code` (`code`); REPLACE INTO `zt_workflowdatasource` (`type`, `name`, `code`, `buildin`, `datasource`, `view`, `keyField`, `valueField`) VALUES ('lang', '项目模型', 'projectModel', '1', 'projectModel', '', '', ''), ('lang', '反馈类型', 'feedbackType', '1', 'feedbackType', '', '', ''), -('lang', '反馈处理方案', 'feedbackSolution', '1', 'feedbackSolution', '', '', ''), +('lang', '反馈处理方案', 'feedbackSolution', '1', 'feedbackSolution', '', '', ''), ('lang', '反馈关闭原因', 'feedbackclosedReason', '1', 'feedbackclosedReason', '', '', ''); REPLACE INTO `zt_workflowfield` (`module`, `field`, `type`, `length`, `name`, `control`, `expression`, `options`, `default`, `rules`, `placeholder`, `order`, `searchOrder`, `exportOrder`, `canExport`, `canSearch`, `isValue`, `readonly`, `buildin`, `desc`, `createdBy`, `createdDate`, `editedBy`, `editedDate`) VALUES From 1251eda902dedfc8d41097427a88aa9114dea119 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=8D=8E=E4=BC=9F?= Date: Thu, 12 May 2022 08:35:59 +0800 Subject: [PATCH 156/166] *Fix bug. --- module/project/config.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/module/project/config.php b/module/project/config.php index c2c56be5c3..21224eac94 100644 --- a/module/project/config.php +++ b/module/project/config.php @@ -144,7 +144,7 @@ $config->project->search['fields']['PM'] = $lang->project->PM; $config->project->search['fields']['openedDate'] = $lang->project->openedDate; $config->project->search['fields']['begin'] = $lang->project->begin; $config->project->search['fields']['end'] = $lang->project->end; -$config->project->search['fields']['realBegin'] = $lang->project->realBeginAB; +$config->project->search['fields']['realBegan'] = $lang->project->realBeganAB; $config->project->search['fields']['realEnd'] = $lang->project->realEndAB; $config->project->search['fields']['openedBy'] = $lang->project->openedBy; $config->project->search['fields']['closedBy'] = $lang->project->closedBy; @@ -162,7 +162,7 @@ $config->project->search['params']['PM'] = array('operator' => '=' $config->project->search['params']['openedDate'] = array('operator' => '=' , 'control' => 'input' , 'values' => '', 'class' => 'date'); $config->project->search['params']['begin'] = array('operator' => '=' , 'control' => 'input' , 'values' => '', 'class' => 'date'); $config->project->search['params']['end'] = array('operator' => '=' , 'control' => 'input' , 'values' => '', 'class' => 'date'); -$config->project->search['params']['realBegin'] = array('operator' => '=' , 'control' => 'input' , 'values' => '', 'class' => 'date'); +$config->project->search['params']['realBegan'] = array('operator' => '=' , 'control' => 'input' , 'values' => '', 'class' => 'date'); $config->project->search['params']['realEnd'] = array('operator' => '=' , 'control' => 'input' , 'values' => '', 'class' => 'date'); $config->project->search['params']['openedBy'] = array('operator' => '=' , 'control' => 'select', 'values' => 'users'); $config->project->search['params']['closedBy'] = array('operator' => '=' , 'control' => 'select', 'values' => 'users'); From 86344c7a65d6844be319158a8d6300ac7b778310 Mon Sep 17 00:00:00 2001 From: zhouxin Date: Thu, 12 May 2022 01:35:53 +0000 Subject: [PATCH 157/166] * Fix bug #22361. --- module/product/view/all.html.php | 1 + 1 file changed, 1 insertion(+) diff --git a/module/product/view/all.html.php b/module/product/view/all.html.php index 3350ee0031..7b29353309 100644 --- a/module/product/view/all.html.php +++ b/module/product/view/all.html.php @@ -27,6 +27,7 @@
+

product->noProduct;?>

From 46c555fb3fc5aa0da32d609c7198bd3e12768b83 Mon Sep 17 00:00:00 2001 From: mayue Date: Thu, 12 May 2022 02:38:33 +0000 Subject: [PATCH 158/166] * Add max code. --- config/zentaopms.php | 2 + module/project/model.php | 50 +++++++++++++++++++- module/project/view/ajaxgetdropmenu.html.php | 4 +- 3 files changed, 53 insertions(+), 3 deletions(-) diff --git a/config/zentaopms.php b/config/zentaopms.php index dd24aaf97f..86ef7cdbe9 100644 --- a/config/zentaopms.php +++ b/config/zentaopms.php @@ -378,3 +378,5 @@ $config->newFeatures = array('introduction', 'tutorial', 'youngBlueTheme', 'visi $config->programPriv = new stdclass(); $config->programPriv->scrum = array('story', 'projectstory', 'projectrelease', 'project', 'execution', 'build', 'bug', 'testcase', 'testreport', 'doc', 'repo', 'meeting', 'stakeholder', 'testtask'); $config->programPriv->waterfall = array_merge($config->programPriv->scrum, array('task', 'workestimation', 'durationestimation', 'budget', 'programplan', 'review', 'reviewissue', 'weekly', 'cm', 'milestone', 'design', 'issue', 'risk', 'opportunity', 'measrecord', 'auditplan', 'trainplan', 'gapanalysis', 'pssp', 'researchplan', 'researchreport')); + +$config->waterfallModules = array('workestimation', 'durationestimation', 'budget', 'programplan', 'review', 'reviewissue', 'weekly', 'cm', 'milestone', 'design', 'opportunity', 'auditplan', 'trainplan', 'gapanalysis', 'pssp', 'researchplan', 'researchreport'); diff --git a/module/project/model.php b/module/project/model.php index 3a4b42f608..5e0a1d60c5 100644 --- a/module/project/model.php +++ b/module/project/model.php @@ -472,7 +472,7 @@ class projectModel extends model $link = helper::createLink('project', 'index', "projectID=%s"); $project = $this->getByID($projectID); - if(strpos(',project,product,projectstory,story,bug,doc,testcase,testtask,testreport,build,projectrelease,stakeholder,', ',' . $module . ',') !== false) + if(strpos(',project,product,projectstory,story,bug,doc,testcase,testtask,testreport,build,projectrelease,stakeholder,issue,risk,meeting,report,measrecord', ',' . $module . ',') !== false) { if($module == 'project' and $method == 'execution') { @@ -641,6 +641,54 @@ class projectModel extends model $link = helper::createLink($module, 'browse', "projectID=%s"); } } + elseif(strpos("issue,risk,meeting,report,measrecord", $module) !== false) + { + if($method == 'projectsummary') + { + $link = helper::createLink($module, $method, "projectID=%s#app=project"); + } + else + { + $link = helper::createLink($module, 'browse', "projectID=%s"); + } + } + } + + if(in_array($module, $this->config->waterfallModules + array('projectstory'=>'projectstory'))) + { + $link = helper::createLink($module, 'browse', "projectID=%s"); + if($module == 'projectstory' and $method = 'track') + { + $link = helper::createLink($module, $method, "projectID=%s"); + } + elseif($module == 'reviewissue') + { + $link = helper::createLink($module, 'issue', "projectID=%s"); + } + elseif($module == 'cm' and $method = 'report') + { + $link = helper::createLink($module, $method, "projectID=%s"); + } + elseif($module == 'weekly' and $method = 'index') + { + $link = helper::createLink($module, $method, "projectID=%s"); + } + elseif($module == 'milestone' and $method = 'index') + { + $link = helper::createLink($module, $method, "projectID=%s"); + } + elseif($module == 'workestimation' and $method = 'index') + { + $link = helper::createLink($module, $method, "projectID=%s"); + } + elseif($module == 'durationestimation' and $method = 'index') + { + $link = helper::createLink($module, $method, "projectID=%s"); + } + elseif($module == 'budget' and $method = 'summary') + { + $link = helper::createLink($module, $method, "projectID=%s"); + } } if($project->model == 'kanban') $link = helper::createLink('project', 'index', "projectID=%s"); diff --git a/module/project/view/ajaxgetdropmenu.html.php b/module/project/view/ajaxgetdropmenu.html.php index e1d549a031..e6dba4ce87 100644 --- a/module/project/view/ajaxgetdropmenu.html.php +++ b/module/project/view/ajaxgetdropmenu.html.php @@ -73,9 +73,9 @@ foreach($projects as $programID => $programProjects) $selected = $project->id == $projectID ? 'selected' : ''; $icon = ' '; - if($project->model == 'waterfall' and $module == 'design') + if($project->model != 'waterfall' and (in_array($module, $config->waterfallModules) or $method == 'track')) { - $link = helper::createLink('design', 'browse', "projectID=%s"); + $link = helper::createLink('project', 'index', "projectID=%s"); } elseif($project->model == 'kanban') { From d25488046633be9e8a8e979f36eb7bad36ebaf09 Mon Sep 17 00:00:00 2001 From: liumengyi Date: Thu, 12 May 2022 10:40:41 +0800 Subject: [PATCH 159/166] * add unit test of sprint 189. --- test/class/bug.class.php | 21 ++++++++++++++ test/class/kanban.class.php | 7 +++-- test/model/bug/getbugquery.php | 40 ++++++++++++++++++++++++++ test/model/kanban/getimportedcards.php | 7 ++++- 4 files changed, 71 insertions(+), 4 deletions(-) create mode 100755 test/model/bug/getbugquery.php diff --git a/test/class/bug.class.php b/test/class/bug.class.php index c7929bd28d..1a9a726a66 100644 --- a/test/class/bug.class.php +++ b/test/class/bug.class.php @@ -2024,4 +2024,25 @@ class bugTest return $array; } } + + /** + * Test get bug query. + * + * @param string $bugQuery + * @access public + * @return array + */ + public function getBugQueryTest($bugQuery) + { + $array = $this->objectModel->getBugQuery($bugQuery); + + if(dao::isError()) + { + return dao::getError(); + } + else + { + return $array; + } + } } diff --git a/test/class/kanban.class.php b/test/class/kanban.class.php index 1a61562ed8..6e6e5adc1c 100644 --- a/test/class/kanban.class.php +++ b/test/class/kanban.class.php @@ -518,20 +518,21 @@ class kanbanTest * * @param int $kanbanID * @param string $fromType + * @param int $archived * @access public * @return string */ - public function getImportedCardsTest($kanbanID, $fromType) + public function getImportedCardsTest($kanbanID, $fromType, $archived = 0) { global $tester; $cards = $tester->dao->select('*')->from(TABLE_KANBANCARD) ->where('deleted')->eq(0) ->andWhere('kanban')->eq($kanbanID) - ->andWhere('archived')->eq(0) + ->andWhere('archived')->eq($archived) ->andWhere('fromID')->eq(0) ->fetchAll('id'); - $objects = $this->objectModel->getImportedCards($kanbanID, $cards, $fromType); + $objects = $this->objectModel->getImportedCards($kanbanID, $cards, $fromType, $archived); if(dao::isError()) return dao::getError(); diff --git a/test/model/bug/getbugquery.php b/test/model/bug/getbugquery.php new file mode 100755 index 0000000000..cd4d92ccc1 --- /dev/null +++ b/test/model/bug/getbugquery.php @@ -0,0 +1,40 @@ +#!/usr/bin/env php +getBugQuery(); +cid=1 +pid=1 + +查询 `product` = 'all' 的bugQuery >> 1 AND `product` IN ('1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','25','26','27','28','29','30','31','32','33','34','35','36','37','38','39','40','41','42','43','44','45','46','47','48','49','50','51','52','53','54','55','56','57','58','59','60','61','62','63','64','65','66','67','68','69','70','71','72','73','74','75','76','77','78','79','80','81','82','83','84','85','86','87','88','89','90','91','92','93','94','95','96','97','98','99','100','101','102','103','104','105','106','107','108','109','110','111','112','113','114','115','116','117','118','119','120','1','2','3','4','5','6','7','8','9','10','21','22','23','24','25','26','27','28','29','30','41','42','43','44','45','46','47','48','49','50','61','62','63','64','65','66','67','68','69','70','81','82','83','84','85','86','87','88','89','90','101','102','103','104','105','106','107','108','109','110 +查询 `project` = 'all' 的bugQuery >> 1 AND `project` in (11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750) +查询 `resolvedDate` = '2022-01-01' 的bugQuery >> `resolvedDate` != '0000-00-00 00:00:00' AND `resolvedDate` > '2022-01-01' +查询 `closedDate` = '2022-01-01' 的bugQuery >> `closedDate` != '0000-00-00 00:00:00' AND `closedDate` <= '2022-01-01' +查询 `story` LIKE '%abc%' 的bugQuery >> `story` IN (2,12,20,21,22,23,24,25,26,27,28,29,32,42,52,62,70,71,72,73,74,75,76,77,78,79,82,92,102,112,120,121,122,123,124,125,126,127,128,129,132,142,152,162,172,182,192,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,302,312,320,321,322,323,324,325,326,327,328,329,332,342,352,362,372,382,392,402,412,420,421,422,423,424,425,426,427,428,429,432,442) AND `story` != 0 +查询 `story` NOT LIKE '%abc%' 的bugQuery >> `story` NOT IN (2,12,20,21,22,23,24,25,26,27,28,29,32,42,52,62,70,71,72,73,74,75,76,77,78,79,82,92,102,112,120,121,122,123,124,125,126,127,128,129,132,142,152,162,172,182,192,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,302,312,320,321,322,323,324,325,326,327,328,329,332,342,352,362,372,382,392,402,412,420,421,422,423,424,425,426,427,428,429,432,442) AND `story` != 0 +查询 `product` = '1' and `project` = '1' and `story` > 'abc' 的bugQuery >> `product` = '1' and `project` = '1' and `story` > 'abc' AND `story` != 0 + +*/ + +$bugQuery = array(); +$bugQuery[] = "`product` = 'all'"; +$bugQuery[] = "`project` = 'all'"; +$bugQuery[] = " `resolvedDate` > '2022-01-01'"; +$bugQuery[] = " `closedDate` <= '2022-01-01'"; +$bugQuery[] = " `story` LIKE '%2%'"; +$bugQuery[] = " `story` NOT LIKE '%2%'"; +$bugQuery[] = " `product` = '1' and `project` = '1' and `story` > 'abc'"; + +$bug=new bugTest(); + +r($bug->getBugQueryTest($bugQuery[0])) && p() && e("1 AND `product` IN ('1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','25','26','27','28','29','30','31','32','33','34','35','36','37','38','39','40','41','42','43','44','45','46','47','48','49','50','51','52','53','54','55','56','57','58','59','60','61','62','63','64','65','66','67','68','69','70','71','72','73','74','75','76','77','78','79','80','81','82','83','84','85','86','87','88','89','90','91','92','93','94','95','96','97','98','99','100','101','102','103','104','105','106','107','108','109','110','111','112','113','114','115','116','117','118','119','120','1','2','3','4','5','6','7','8','9','10','21','22','23','24','25','26','27','28','29','30','41','42','43','44','45','46','47','48','49','50','61','62','63','64','65','66','67','68','69','70','81','82','83','84','85','86','87','88','89','90','101','102','103','104','105','106','107','108','109','110')"); // 查询 `product` = 'all' 的bugQuery +r($bug->getBugQueryTest($bugQuery[1])) && p() && e("1 AND `project` in (11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750)"); // 查询 `project` = 'all' 的bugQuery +r($bug->getBugQueryTest($bugQuery[2])) && p() && e(" `resolvedDate` != '0000-00-00 00:00:00' AND `resolvedDate` > '2022-01-01'"); // 查询 `resolvedDate` = '2022-01-01' 的bugQuery +r($bug->getBugQueryTest($bugQuery[3])) && p() && e(" `closedDate` != '0000-00-00 00:00:00' AND `closedDate` <= '2022-01-01'"); // 查询 `closedDate` = '2022-01-01' 的bugQuery +r($bug->getBugQueryTest($bugQuery[4])) && p() && e(" `story` IN (2,12,20,21,22,23,24,25,26,27,28,29,32,42,52,62,70,71,72,73,74,75,76,77,78,79,82,92,102,112,120,121,122,123,124,125,126,127,128,129,132,142,152,162,172,182,192,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,302,312,320,321,322,323,324,325,326,327,328,329,332,342,352,362,372,382,392,402,412,420,421,422,423,424,425,426,427,428,429,432,442) AND `story` != 0"); // 查询 `story` LIKE '%abc%' 的bugQuery +r($bug->getBugQueryTest($bugQuery[5])) && p() && e(" `story` NOT IN (2,12,20,21,22,23,24,25,26,27,28,29,32,42,52,62,70,71,72,73,74,75,76,77,78,79,82,92,102,112,120,121,122,123,124,125,126,127,128,129,132,142,152,162,172,182,192,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,302,312,320,321,322,323,324,325,326,327,328,329,332,342,352,362,372,382,392,402,412,420,421,422,423,424,425,426,427,428,429,432,442) AND `story` != 0"); // 查询 `story` NOT LIKE '%abc%' 的bugQuery +r($bug->getBugQueryTest($bugQuery[6])) && p() && e("`product` = '1' and `project` = '1' and `story` > 'abc' AND `story` != 0"); // 查询 `product` = '1' and `project` = '1' and `story` > 'abc' 的bugQuery diff --git a/test/model/kanban/getimportedcards.php b/test/model/kanban/getimportedcards.php index 699429d5ff..2790ae8641 100755 --- a/test/model/kanban/getimportedcards.php +++ b/test/model/kanban/getimportedcards.php @@ -31,6 +31,7 @@ pid=1 $kanbanIDList = array('1', '2', '9', '10', '11', '12', '23', '25'); $fromType = array('productplan', 'release', 'execution', 'build'); +$archived = 1; $kanban = new kanbanTest(); @@ -49,4 +50,8 @@ r($kanban->getImportedCardstest($kanbanIDList[5], $fromType[3])) && p() && e(',8 r($kanban->getImportedCardstest($kanbanIDList[6], $fromType[3])) && p() && e(',177,178,179,180,181,182,183,184,981,982,983,984'); // 查看看板23的普通卡片和build卡片 r($kanban->getImportedCardstest($kanbanIDList[6], $fromType[0])) && p() && e(',177,178,179,180,181,182,183,184'); // 查看看板23的普通卡片和productplan片 r($kanban->getImportedCardstest($kanbanIDList[7], $fromType[3])) && p() && e(',193,194,195,196,197,198,199,200,993,994,995,996,997,998,999,1000'); // 查看看板25的普通卡片和build卡片 -r($kanban->getImportedCardstest($kanbanIDList[7], $fromType[0])) && p() && e(',193,194,195,196,197,198,199,200'); // 查看看板25的普通卡片和productplan片 \ No newline at end of file +r($kanban->getImportedCardstest($kanbanIDList[7], $fromType[0])) && p() && e(',193,194,195,196,197,198,199,200'); // 查看看板25的普通卡片和productplan片 +global $tester; +$tester->dao->update(TABLE_KANBANCARD)->set('archived')->eq(1)->where('id')->gt('5')->exec(); +r($kanban->getImportedCardsTest($kanbanIDList[0], $fromType[0], $archived)) && p() && e(',6,7,8,801,802,803,804,805,806,807,808'); // 查看看板1已归档的普通卡片和productplan卡片 +$tester->dao->update(TABLE_KANBANCARD)->set('archived')->eq(0)->where('id')->gt('5')->exec(); From f3f439cb47d5795a215f04ade474f0c227d1fb10 Mon Sep 17 00:00:00 2001 From: liumengyi Date: Thu, 12 May 2022 10:44:16 +0800 Subject: [PATCH 160/166] * Add annotation. --- test/model/kanban/getimportedcards.php | 1 + 1 file changed, 1 insertion(+) diff --git a/test/model/kanban/getimportedcards.php b/test/model/kanban/getimportedcards.php index 2790ae8641..800527d2b4 100755 --- a/test/model/kanban/getimportedcards.php +++ b/test/model/kanban/getimportedcards.php @@ -26,6 +26,7 @@ pid=1 查看看板23的普通卡片和productplan片 >> ,177,178,179,180,181,182,183,184 查看看板25的普通卡片和build卡片 >> ,193,194,195,196,197,198,199,200,993,994,995,996,997,998,999,1000 查看看板25的普通卡片和productplan片 >> ,193,194,195,196,197,198,199,200 +查看看板1已归档的普通卡片和productplan卡片 >> ,6,7,8,801,802,803,804,805,806,807,808 */ From 3e2181dea011f73d6d0cc87499a477f9f5c9ebff Mon Sep 17 00:00:00 2001 From: zhouxin Date: Thu, 12 May 2022 02:44:37 +0000 Subject: [PATCH 161/166] * Fix bug #22371. --- module/product/control.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/product/control.php b/module/product/control.php index eea2e15688..5026674f7f 100644 --- a/module/product/control.php +++ b/module/product/control.php @@ -1197,7 +1197,7 @@ class product extends control * @access public * @return void */ - public function all($browseType = 'noclosed', $orderBy = 'order_asc', $param = 0, $recTotal = 0, $recPerPage = 20, $pageID = 1) + public function all($browseType = 'noclosed', $orderBy = 'program_asc', $param = 0, $recTotal = 0, $recPerPage = 20, $pageID = 1) { /* Load module and set session. */ $this->loadModel('program'); From 4460a50980a3f98e77e710de8d40dcaa5eb8b84d Mon Sep 17 00:00:00 2001 From: mayue Date: Thu, 12 May 2022 02:50:13 +0000 Subject: [PATCH 162/166] * Optimize code. --- module/project/view/ajaxgetdropmenu.html.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/project/view/ajaxgetdropmenu.html.php b/module/project/view/ajaxgetdropmenu.html.php index e6dba4ce87..fc010e15d1 100644 --- a/module/project/view/ajaxgetdropmenu.html.php +++ b/module/project/view/ajaxgetdropmenu.html.php @@ -90,7 +90,7 @@ foreach($projects as $programID => $programProjects) if($project->auth == 'reset') { $this->loadModel('common')->resetProjectPriv($project->id); - $link = helper::createLink('project', 'index', "projectID=%s"); + if(!common::hasPriv($module, $method)) $link = helper::createLink('project', 'index', "projectID=%s"); } if($project->model != 'scrum') $icon = " "; From ac6e3ab49145bd87c0daf4db3bd5fca183cd08cb Mon Sep 17 00:00:00 2001 From: mayue Date: Thu, 12 May 2022 02:58:23 +0000 Subject: [PATCH 163/166] * Optimize code. --- module/project/model.php | 4 +++- module/project/view/ajaxgetdropmenu.html.php | 6 +----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/module/project/model.php b/module/project/model.php index 5e0a1d60c5..1a18b3dbf1 100644 --- a/module/project/model.php +++ b/module/project/model.php @@ -491,7 +491,9 @@ class projectModel extends model $link = helper::createLink($module, $method, "projectID=%s"); } elseif($module == 'project' and $method == 'testreport') - { $link = helper::createLink($module, $method, "projectID=%s"); } + { + $link = helper::createLink($module, $method, "projectID=%s"); + } elseif($module == 'project' and $method == 'build') { $link = helper::createLink($module, $method, "projectID=%s"); diff --git a/module/project/view/ajaxgetdropmenu.html.php b/module/project/view/ajaxgetdropmenu.html.php index fc010e15d1..c6a2b8e485 100644 --- a/module/project/view/ajaxgetdropmenu.html.php +++ b/module/project/view/ajaxgetdropmenu.html.php @@ -87,11 +87,7 @@ foreach($projects as $programID => $programProjects) } /* Set link when project redefines permissions. */ - if($project->auth == 'reset') - { - $this->loadModel('common')->resetProjectPriv($project->id); - if(!common::hasPriv($module, $method)) $link = helper::createLink('project', 'index', "projectID=%s"); - } + if($project->auth == 'reset') $link = helper::createLink('project', 'index', "projectID=%s"); if($project->model != 'scrum') $icon = " "; $projectName = $icon . $project->name; From 3a2c85415947c6e428cda434c536bbbf57558717 Mon Sep 17 00:00:00 2001 From: mayue Date: Thu, 12 May 2022 03:13:39 +0000 Subject: [PATCH 164/166] * Optimize code. --- module/project/model.php | 73 ++++++++-------------------------------- 1 file changed, 14 insertions(+), 59 deletions(-) diff --git a/module/project/model.php b/module/project/model.php index 1a18b3dbf1..2415489e50 100644 --- a/module/project/model.php +++ b/module/project/model.php @@ -478,55 +478,7 @@ class projectModel extends model { $link = helper::createLink($module, $method, "status=all&projectID=%s"); } - elseif($module == 'project' and $method == 'bug') - { - $link = helper::createLink($module, $method, "projectID=%s"); - } - elseif($module == 'project' and $method == 'testcase') - { - $link = helper::createLink($module, $method, "projectID=%s"); - } - elseif($module == 'project' and $method == 'testtask') - { - $link = helper::createLink($module, $method, "projectID=%s"); - } - elseif($module == 'project' and $method == 'testreport') - { - $link = helper::createLink($module, $method, "projectID=%s"); - } - elseif($module == 'project' and $method == 'build') - { - $link = helper::createLink($module, $method, "projectID=%s"); - } - elseif($module == 'project' and $method == 'dynamic') - { - $link = helper::createLink($module, $method, "projectID=%s"); - } - elseif($module == 'project' and $method == 'view') - { - $link = helper::createLink($module, $method, "projectID=%s"); - } - elseif($module == 'project' and $method == 'manageproducts') - { - $link = helper::createLink($module, $method, "projectID=%s"); - } - elseif($module == 'project' and $method == 'team') - { - $link = helper::createLink($module, $method, "projectID=%s"); - } - elseif($module == 'project' and $method == 'managemembers') - { - $link = helper::createLink($module, $method, "projectID=%s"); - } - elseif($module == 'project' and $method == 'whitelist') - { - $link = helper::createLink($module, $method, "projectID=%s"); - } - elseif($module == 'project' and $method == 'addwhitelist') - { - $link = helper::createLink($module, $method, "projectID=%s"); - } - elseif($module == 'project' and $method == 'group') + elseif($module == 'project' and strpos(',bug,testcase,testtask,testreport,build,dynamic,view,manageproducts,team,managemembers,whitelist,addwhitelist,group', $method)) { $link = helper::createLink($module, $method, "projectID=%s"); } @@ -557,17 +509,20 @@ class projectModel extends model $link = helper::createLink('project', 'bug', "projectID=%s"); } } - elseif($module == 'story' and $method == 'create') + elseif($module == 'story') { - $link = helper::createLink($module, $method); - } - elseif($module == 'story' and $method == 'change') - { - $link = helper::createLink('projectstory', 'story', "projectID=%s"); - } - elseif($module == 'story' and $method == 'zerocase') - { - $link = helper::createLink('project', 'testcase', "projectID=%s"); + if($method == 'create') + { + $link = helper::createLink($module, $method); + } + elseif($method == 'change') + { + $link = helper::createLink('projectstory', 'story', "projectID=%s"); + } + elseif($method == 'zerocase') + { + $link = helper::createLink('project', 'testcase', "projectID=%s"); + } } elseif($module == 'testcase' and $method == 'create') { From 5a2ef22f3b33eccb898e2883652ec5140f5c47ec Mon Sep 17 00:00:00 2001 From: mayue Date: Thu, 12 May 2022 03:17:00 +0000 Subject: [PATCH 165/166] * Optimize code. --- module/project/model.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/project/model.php b/module/project/model.php index 2415489e50..f58413ceee 100644 --- a/module/project/model.php +++ b/module/project/model.php @@ -478,7 +478,7 @@ class projectModel extends model { $link = helper::createLink($module, $method, "status=all&projectID=%s"); } - elseif($module == 'project' and strpos(',bug,testcase,testtask,testreport,build,dynamic,view,manageproducts,team,managemembers,whitelist,addwhitelist,group', $method)) + elseif($module == 'project' and strpos(',bug,testcase,testtask,testreport,build,dynamic,view,manageproducts,team,managemembers,whitelist,addwhitelist,group,', ',' . $method . ',')) { $link = helper::createLink($module, $method, "projectID=%s"); } From e65e7568b21abfc3b489cbcae8221cd45549465e Mon Sep 17 00:00:00 2001 From: mayue Date: Thu, 12 May 2022 03:37:22 +0000 Subject: [PATCH 166/166] * Optimize code. --- module/project/model.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/module/project/model.php b/module/project/model.php index f58413ceee..87682c35eb 100644 --- a/module/project/model.php +++ b/module/project/model.php @@ -498,6 +498,10 @@ class projectModel extends model { $link = helper::createLink($module, $method, "projectID=%s"); } + elseif($module == 'projectstory' and $method = 'track') + { + $link = helper::createLink($module, $method, "projectID=%s"); + } elseif($module == 'bug') { if($method == 'create') @@ -611,14 +615,10 @@ class projectModel extends model } } - if(in_array($module, $this->config->waterfallModules + array('projectstory'=>'projectstory'))) + if(in_array($module, $this->config->waterfallModules)) { $link = helper::createLink($module, 'browse', "projectID=%s"); - if($module == 'projectstory' and $method = 'track') - { - $link = helper::createLink($module, $method, "projectID=%s"); - } - elseif($module == 'reviewissue') + if($module == 'reviewissue') { $link = helper::createLink($module, 'issue', "projectID=%s"); }