From 8243e4c175a56799351d88f41f71fd4b5bb6b580 Mon Sep 17 00:00:00 2001 From: daitingting Date: Wed, 11 May 2022 01:47:55 +0000 Subject: [PATCH 37/52] * Remove empty line. --- module/productplan/model.php | 1 - 1 file changed, 1 deletion(-) diff --git a/module/productplan/model.php b/module/productplan/model.php index d388bce67f..7ec779299b 100644 --- a/module/productplan/model.php +++ b/module/productplan/model.php @@ -1123,7 +1123,6 @@ class productplanModel extends model if($plan->parent >= 0 && common::hasPriv('productplan', 'delete', $plan)) $menu .= html::a(helper::createLink('productplan', 'delete', $params), " " . $this->lang->delete, '', "class='btn btn-link' title='{$this->lang->delete}' target='hiddenwin'"); } - return $menu; } } From 977e100d042985b946a29844f28f5ce059e21e2d Mon Sep 17 00:00:00 2001 From: liumengyi Date: Wed, 11 May 2022 09:48:08 +0800 Subject: [PATCH 38/52] * Finish task #53647. --- module/bug/config.php | 2 ++ module/bug/model.php | 25 ++++++++++++++++++++++--- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/module/bug/config.php b/module/bug/config.php index 23ccd42efb..a2a00b49c6 100644 --- a/module/bug/config.php +++ b/module/bug/config.php @@ -71,6 +71,7 @@ $config->bug->search['fields']['resolvedBy'] = $lang->bug->resolvedBy; $config->bug->search['fields']['status'] = $lang->bug->status; $config->bug->search['fields']['confirmed'] = $lang->bug->confirmed; +$config->bug->search['fields']['story'] = $lang->bug->story; if($config->systemMode == 'new') $config->bug->search['fields']['project'] = $lang->bug->project; $config->bug->search['fields']['product'] = $lang->bug->product; @@ -116,6 +117,7 @@ $config->bug->search['params']['resolvedBy'] = array('operator' => '=', $config->bug->search['params']['status'] = array('operator' => '=', 'control' => 'select', 'values' => $lang->bug->statusList); $config->bug->search['params']['confirmed'] = array('operator' => '=', 'control' => 'select', 'values' => $lang->bug->confirmedList); +$config->bug->search['params']['story'] = array('operator' => 'include', 'control' => 'input', 'values' => ''); if($config->systemMode == 'new') $config->bug->search['params']['project'] = array('operator' => '=', 'control' => 'select', 'values' => ''); $config->bug->search['params']['product'] = array('operator' => '=', 'control' => 'select', 'values' => ''); diff --git a/module/bug/model.php b/module/bug/model.php index a534aded89..4dd3da215f 100644 --- a/module/bug/model.php +++ b/module/bug/model.php @@ -2730,6 +2730,25 @@ class bugModel extends model /* Fix bug #2878. */ if(strpos($bugQuery, ' `resolvedDate` ') !== false) $bugQuery = str_replace(' `resolvedDate` ', " `resolvedDate` != '0000-00-00 00:00:00' AND `resolvedDate` ", $bugQuery); if(strpos($bugQuery, ' `closedDate` ') !== false) $bugQuery = str_replace(' `closedDate` ', " `closedDate` != '0000-00-00 00:00:00' AND `closedDate` ", $bugQuery); + 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); + } + } + } $bugs = $this->dao->select('*')->from(TABLE_BUG)->where($bugQuery) ->beginIF(!$this->app->user->admin)->andWhere('execution')->in('0,' . $this->app->user->view->sprints)->fi() @@ -3234,9 +3253,9 @@ class bugModel extends model /** * Build bug menu. - * - * @param object $bug - * @param string $type + * + * @param object $bug + * @param string $type * @access public * @return string */ From b015ea5c77da6243e5bb6f62af7f3c251ce7e456 Mon Sep 17 00:00:00 2001 From: zhouxin Date: Wed, 11 May 2022 01:53:10 +0000 Subject: [PATCH 39/52] * Finish task #53658. --- module/bug/model.php | 6 ++-- module/product/config.php | 32 +++++++++++++++++ module/product/control.php | 9 +++-- module/product/model.php | 62 ++++++++++++++++++++++++++++++-- module/product/view/all.html.php | 2 ++ 5 files changed, 104 insertions(+), 7 deletions(-) diff --git a/module/bug/model.php b/module/bug/model.php index a534aded89..6a7e8afc11 100644 --- a/module/bug/model.php +++ b/module/bug/model.php @@ -3234,9 +3234,9 @@ class bugModel extends model /** * Build bug menu. - * - * @param object $bug - * @param string $type + * + * @param object $bug + * @param string $type * @access public * @return string */ diff --git a/module/product/config.php b/module/product/config.php index 15b950ff39..d717bec8cc 100644 --- a/module/product/config.php +++ b/module/product/config.php @@ -87,6 +87,38 @@ $config->product->search['params']['closedDate'] = array('operator' => '=', $config->product->search['params']['lastEditedDate'] = array('operator' => '=', 'control' => 'input', 'values' => '', 'class' => 'date'); $config->product->search['params']['activatedDate'] = array('operator' => '=', 'control' => 'input', 'values' => '', 'class' => 'date'); +$config->product->all = new stdclass(); +$config->product->all->search['module'] = 'product'; +$config->product->all->search['fields']['name'] = $lang->product->name; +$config->product->all->search['fields']['code'] = $lang->product->code; +$config->product->all->search['fields']['id'] = $lang->product->id; +if($config->systemMode == 'new') $config->product->all->search['fields']['program'] = $lang->product->program; +$config->product->all->search['fields']['line'] = $lang->product->line; +$config->product->all->search['fields']['desc'] = $lang->product->desc; +$config->product->all->search['fields']['PO'] = $lang->product->PO; +$config->product->all->search['fields']['QD'] = $lang->product->QD; +$config->product->all->search['fields']['RD'] = $lang->product->RD; +$config->product->all->search['fields']['feedback'] = $lang->product->feedback; +$config->product->all->search['fields']['reviewer'] = $lang->product->reviewer; +$config->product->all->search['fields']['type'] = $lang->product->type; +$config->product->all->search['fields']['createdDate'] = $lang->product->createdDate; +$config->product->all->search['fields']['createdBy'] = $lang->product->createdBy; + +$config->product->all->search['params']['name'] = array('operator' => 'include', 'control' => 'input', 'values' => ''); +$config->product->all->search['params']['code'] = array('operator' => 'include', 'control' => 'input', 'values' => ''); +$config->product->all->search['params']['id'] = array('operator' => '=', 'control' => 'input', 'values' => ''); +if($config->systemMode == 'new') $config->product->all->search['params']['program'] = array('operator' => '=', 'control' => 'select', 'values' => ''); +$config->product->all->search['params']['line'] = array('operator' => '=', 'control' => 'select', 'values' => ''); +$config->product->all->search['params']['desc'] = array('operator' => 'include', 'control' => 'input', 'values' => ''); +$config->product->all->search['params']['PO'] = array('operator' => '=', 'control' => 'select', 'values' => 'users'); +$config->product->all->search['params']['QD'] = array('operator' => '=', 'control' => 'select', 'values' => 'users'); +$config->product->all->search['params']['RD'] = array('operator' => '=', 'control' => 'select', 'values' => 'users'); +$config->product->all->search['params']['feedback'] = array('operator' => '=', 'control' => 'select', 'values' => 'users'); +$config->product->all->search['params']['reviewer'] = array('operator' => '=', 'control' => 'select', 'values' => 'users'); +$config->product->all->search['params']['type'] = array('operator' => '=', 'control' => 'select', 'values' => $lang->product->typeList); +$config->product->all->search['params']['createdDate'] = array('operator' => '=', 'control' => 'input', 'values' => '', 'class' => 'date'); +$config->product->all->search['params']['createdBy'] = array('operator' => '=', 'control' => 'select', 'values' => 'users'); + $config->product->create = new stdclass(); $config->product->edit = new stdclass(); $config->product->create->requiredFields = 'name,code'; diff --git a/module/product/control.php b/module/product/control.php index 17e5520626..e6d17166e3 100644 --- a/module/product/control.php +++ b/module/product/control.php @@ -1197,12 +1197,14 @@ class product extends control * @access public * @return void */ - public function all($browseType = 'noclosed', $orderBy = 'order_asc') + public function all($browseType = 'noclosed', $orderBy = 'order_asc', $param = 0) { /* Load module and set session. */ $this->loadModel('program'); $this->session->set('productList', $this->app->getURI(true), 'product'); + $queryID = ($browseType == 'bySearch') ? (int)$param : 0; + if($this->app->viewType == 'mhtml') { $productID = $this->product->saveState(0, $this->products); @@ -1210,9 +1212,12 @@ class product extends control } /* Process product structure. */ - $productStats = $this->product->getStats($orderBy, '', $browseType, '', 'story'); + $productStats = $this->product->getStats($orderBy, '', $browseType, '', 'story', '', $queryID); $productStructure = $this->product->statisticProgram($productStats); + $actionURL = $this->createLink('product', 'all', "browseType=bySearch&orderBy=order_asc&queryID=myQueryID"); + $this->product->buildProductSearchForm($param, $actionURL); + $this->view->title = $this->lang->product->common; $this->view->position[] = $this->lang->product->common; diff --git a/module/product/model.php b/module/product/model.php index 4de525f5e5..266c95c11c 100644 --- a/module/product/model.php +++ b/module/product/model.php @@ -275,6 +275,47 @@ class productModel extends model ->fetchAll('id'); } + public function getListBySearch($queryID = 0) + { + if($queryID) + { + $query = $this->loadModel('search')->getQuery($queryID); + if($query) + { + $this->session->set('productQuery', $query->sql); + $this->session->set('productForm', $query->form); + } + else + { + $this->session->set('productQuery', ' 1 = 1'); + } + } + else + { + if($this->session->productQuery == false) $this->session->set('productQuery', ' 1 = 1'); + } + + $productQuery = $this->session->productQuery; + $productQuery = preg_replace('/`(\w+)`/', 't1.`$1`', $productQuery); + + $products = $this->dao->select('t1.id as id,t1.*')->from(TABLE_PRODUCT)->alias('t1') + ->leftJoin(TABLE_PROGRAM)->alias('t2')->on('t1.program = t2.id') + ->where($productQuery) + ->andWhere('t1.deleted')->eq(0) + ->beginIF(!$this->app->user->admin)->andWhere('t1.id')->in($this->app->user->view->products)->fi() + ->andWhere('t1.vision')->eq($this->config->vision)->fi() + ->andWhere('t1.PO', true)->eq($this->app->user->account) + ->orWhere('t1.QD')->eq($this->app->user->account) + ->orWhere('t1.RD')->eq($this->app->user->account) + ->orWhere('t1.createdBy')->eq($this->app->user->account) + ->markRight(1) + ->fi() + ->orderBy('t1.order_asc') + ->fetchAll('id'); + + return $products; + } + /** * Get product pairs. * @@ -1045,6 +1086,23 @@ class productModel extends model $this->loadModel('search')->setSearchParams($this->config->product->search); } + public function buildProductSearchForm($queryID, $actionURL) + { + $this->config->product->all->search['queryID'] = $queryID; + $this->config->product->all->search['actionURL'] = $actionURL; + + $linePairs = $this->getLinePairs(); + $this->config->product->all->search['params']['line']['values'] = array('' => '') + $linePairs; + + if($this->config->systemMode == 'new') + { + $programPairs = $this->loadModel('program')->getTopPairs('', 'noclosed'); + $this->config->product->all->search['params']['program']['values'] = array('' => '') + $programPairs; + } + + $this->loadModel('search')->setSearchParams($this->config->product->all->search); + } + /** * Get project pairs by product. * @@ -1565,13 +1623,13 @@ class productModel extends model * @access public * @return array */ - public function getStats($orderBy = 'order_asc', $pager = null, $status = 'noclosed', $line = 0, $storyType = 'story', $programID = 0) + public function getStats($orderBy = 'order_asc', $pager = null, $status = 'noclosed', $line = 0, $storyType = 'story', $programID = 0, $param = 0) { $this->loadModel('report'); $this->loadModel('story'); $this->loadModel('bug'); - $products = $this->getList($programID, $status, $limit = 0, $line); + $products = $status == 'bySearch' ? $this->getListBySearch($param) : $this->getList($programID, $status, $limit = 0, $line); if(empty($products)) return array(); $productKeys = array_keys($products); diff --git a/module/product/view/all.html.php b/module/product/view/all.html.php index 1365dd5449..1938ba8971 100644 --- a/module/product/view/all.html.php +++ b/module/product/view/all.html.php @@ -17,6 +17,7 @@ {$recTotal}" : '';?> {$label}" . $recTotalLabel, '', "class='btn btn-link' id='{$key}Tab'");?> + product->searchStory;?>