From d8d6ce45f7e3fd78e3878d46b8237c4dbf54e763 Mon Sep 17 00:00:00 2001 From: zenggang Date: Tue, 10 May 2022 08:58:00 +0000 Subject: [PATCH 01/71] * 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 42/71] * 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 43/71] *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 ed90476621970eb586f163047e06bd8102d9893e Mon Sep 17 00:00:00 2001 From: liumengyi Date: Wed, 11 May 2022 16:10:07 +0800 Subject: [PATCH 44/71] * 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 45/71] * 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 46/71] * 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 47/71] * 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 48/71] *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 49/71] *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 50/71] 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 51/71] * 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 52/71] *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 53/71] 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 54/71] * 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 55/71] * 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 56/71] * 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 57/71] *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 58/71] 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 59/71] * 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 60/71] * 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 61/71] * 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 62/71] * 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 63/71] * 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 64/71] *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 65/71] 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 66/71] 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 67/71] *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 68/71] * 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 d25488046633be9e8a8e979f36eb7bad36ebaf09 Mon Sep 17 00:00:00 2001 From: liumengyi Date: Thu, 12 May 2022 10:40:41 +0800 Subject: [PATCH 69/71] * 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 70/71] * 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 71/71] * 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');