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 54e34c9fa2..3c8d716d36 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, $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'"); $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,18 @@ class program extends control } else { - $programs = $this->program->getList($status, $orderBy, null, true); + 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. */ @@ -52,12 +66,19 @@ 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; $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..dc14dca89b 100644 --- a/module/program/js/browse.js +++ b/module/program/js/browse.js @@ -43,6 +43,13 @@ $(function() $('#programForm').removeClass('has-row-checked'); } }); + + var myPager = $('.pager').data('zui.pager'); + if(status != 'bySearch' && myPager) + { + 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..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'; @@ -71,6 +74,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..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 = '项目集'; @@ -71,6 +74,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..01c47c2219 100644 --- a/module/program/model.php +++ b/module/program/model.php @@ -130,11 +130,22 @@ class programModel extends model * @param string $status * @param string $orderBy * @param object $pager + * @param string $type top|child + * @param mixed $idList * @access public * @return array */ - public function getList($status = 'all', $orderBy = 'id_asc', $pager = NULL) + public function getList($status = 'all', $orderBy = 'id_asc', $pager = NULL, $type = '', $idList = '') { + $projectIdList = array(); + if($type === 'child') + { + foreach($idList as $topID) + { + $projectIdList += $this->dao->select('id')->from(TABLE_PROGRAM)->Where('path')->like(",$topID,%")->fetchPairs('id'); + } + } + return $this->dao->select('*')->from(TABLE_PROGRAM) ->where('deleted')->eq(0) ->andWhere('vision')->eq($this->config->vision) @@ -146,6 +157,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($type === 'top')->andWhere('parent')->eq(0)->fi() + ->beginIF(!empty($projectIdList))->andWhere('id')->in($projectIdList)->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'); @@ -240,15 +299,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..abbf959b56 100644 --- a/module/program/view/browse.html.php +++ b/module/program/view/browse.html.php @@ -15,6 +15,7 @@ edit);?> selectAll);?> +program->pageSize);?> @@ -27,6 +28,7 @@ $lang->program->showClosed), '', $this->cookie->showClosed ? 'checked=checked' : '');?> $lang->project->edit), '', $this->cookie->editProject ? 'checked=checked' : '');?> + user->search;?>