diff --git a/module/common/lang/en.php b/module/common/lang/en.php index c9024c1ef2..bb6a59ce57 100644 --- a/module/common/lang/en.php +++ b/module/common/lang/en.php @@ -176,6 +176,7 @@ $lang->doc->menu->browse = array('link' => 'Doc|doc|browse|libID=%s'); $lang->doc->menu->edit = 'Edit Library|doc|editLib|libID=%s'; $lang->doc->menu->module = 'Modules|tree|browse|libID=%s&viewType=doc'; $lang->doc->menu->delete = array('link' => 'Delete Library|doc|deleteLib|libID=%s', 'target' => 'hiddenwin'); +$lang->doc->menu->search = array('link' => 'Search|doc|byQuery'); $lang->doc->menu->create = array('link' => 'New Library|doc|createLib', 'float' => 'right'); /* Company menu. */ diff --git a/module/common/lang/zh-cn.php b/module/common/lang/zh-cn.php index adee57821a..6b256c1f6c 100644 --- a/module/common/lang/zh-cn.php +++ b/module/common/lang/zh-cn.php @@ -176,6 +176,7 @@ $lang->doc->menu->browse = array('link' => '文档列表|doc|browse|libID=%s'); $lang->doc->menu->edit = '编辑文档库|doc|editLib|libID=%s'; $lang->doc->menu->module = '维护模块|tree|browse|libID=%s&viewType=doc'; $lang->doc->menu->delete = array('link' => '删除文档库|doc|deleteLib|libID=%s', 'target' => 'hiddenwin'); +$lang->doc->menu->search = array('link' => '搜索|doc|byQuery'); $lang->doc->menu->create = array('link' => '新增文档库|doc|createLib', 'float' => 'right'); /* 组织结构视图菜单设置。*/ diff --git a/module/common/model.php b/module/common/model.php index 1bad087e40..f8a868ec49 100644 --- a/module/common/model.php +++ b/module/common/model.php @@ -297,8 +297,13 @@ class commonModel extends model /* Is the currentModule active? */ if($currentModule == $subModule) $active = 'active'; if($module == $currentModule and ($method == $currentMethod or strpos($alias, $currentMethod) !== false)) $active = 'active'; - - echo "
  • " . html::a(helper::createLink($module, $method, $vars), $label, $target) . "
  • \n"; + if($method == "byQuery") + { + echo "
  • " . html::a('#',$label,$target,"id='$method'") . "
  • \n"; + }else + { + echo "
  • " . html::a(helper::createLink($module, $method, $vars), $label, $target) . "
  • \n"; + } } } } diff --git a/module/doc/config.php b/module/doc/config.php index bb335f11c6..80687dbc68 100644 --- a/module/doc/config.php +++ b/module/doc/config.php @@ -1,4 +1,5 @@ doc->createLib->requiredFields = 'name'; $config->doc->editLib->requiredFields = 'name'; $config->doc->create->requiredFields = 'title'; @@ -6,3 +7,37 @@ $config->doc->edit->requiredFields = 'title'; $config->doc->editor->create = array('id' => 'content', 'tools' => 'fullTools'); $config->doc->editor->edit = array('id' => 'content', 'tools' => 'fullTools'); + +$config->doc->search['module'] = 'doc'; +$config->doc->search['fields']['title'] = $lang->doc->title; +$config->doc->search['fields']['id'] = $lang->doc->id; +$config->doc->search['fields']['keywords'] = $lang->doc->keywords; +$config->doc->search['fields']['product'] = $lang->doc->product; +$config->doc->search['fields']['module'] = $lang->doc->module; +$config->doc->search['fields']['project'] = $lang->doc->project; +$config->doc->search['fields']['type'] = $lang->doc->type; +$config->doc->search['fields']['lib'] = $lang->doc->lib; +$config->doc->search['fields']['digest'] = $lang->doc->digest; +$config->doc->search['fields']['content'] = $lang->doc->content; +$config->doc->search['fields']['url'] = $lang->doc->url; +$config->doc->search['fields']['views'] = $lang->doc->views; +$config->doc->search['fields']['addedBy'] = $lang->doc->addedBy; +$config->doc->search['fields']['addedDate'] = $lang->doc->addedDate; +$config->doc->search['fields']['editedBy'] = $lang->doc->editedBy; +$config->doc->search['fields']['editedDate'] = $lang->doc->editedDate; + +$config->doc->search['params']['title'] = array('operator' => 'include', 'control' => 'input', 'values' => ''); +$config->doc->search['params']['keywords'] = array('operator' => 'include', 'control' => 'input', 'values' => ''); +$config->doc->search['params']['product'] = array('operator' => '=', 'control' => 'select', 'values' => ''); +$config->doc->search['params']['module'] = array('operator' => '=', 'control' => 'select', 'values' => 'modules'); +$config->doc->search['params']['project'] = array('operator' => '=', 'control' => 'select', 'values' => 'projects'); +$config->doc->search['params']['type'] = array('operator' => '=', 'control' => 'select', 'values' => $lang->doc->types); +$config->doc->search['params']['lib'] = array('operator' => '=', 'control' => 'select', 'values' => '' ); +$config->doc->search['params']['digest'] = array('operator' => 'include', 'control' => 'input', 'values' => ''); +$config->doc->search['params']['content'] = array('operator' => 'include', 'control' => 'input', 'values' => ''); +$config->doc->search['params']['url'] = array('operator' => 'include', 'control' => 'input', 'values' => ''); +$config->doc->search['params']['views'] = array('operator' => '>', 'control' => 'input', 'values' => '' ); +$config->doc->search['params']['addedBy'] = array('operator' => '=', 'control' => 'select', 'values' => 'users'); +$config->doc->search['params']['addedDate'] = array('operator' => '>=', 'control' => 'input', 'values' => ''); +$config->doc->search['params']['editedBy'] = array('operator' => '=', 'control' => 'select', 'values' => 'users'); +$config->doc->search['params']['editedDate'] = array('operator' => '>=', 'control' => 'input', 'values' => ''); diff --git a/module/doc/control.php b/module/doc/control.php index 65e08cffe4..e6d876e344 100644 --- a/module/doc/control.php +++ b/module/doc/control.php @@ -11,6 +11,7 @@ */ class doc extends control { + private $products = array(); /** * Construct function, load user, tree, action auto. * @@ -23,7 +24,15 @@ class doc extends control $this->loadModel('user'); $this->loadModel('tree'); $this->loadModel('action'); + $this->loadModel('product'); $this->libs = $this->doc->getLibs(); + $this->products = $this->product->getPairs(); + if(empty($this->products)) + { + echo js::alert($this->lang->product->errorNoProduct); + die(js::locate($this->createLink('product', 'create'))); + } + $this->view->products = $this->products; } /** @@ -51,8 +60,13 @@ class doc extends control * @access public * @return void */ - public function browse($libID = 'product', $moduleID = 0, $productID = 0, $projectID = 0, $orderBy = 'id_desc', $recTotal = 0, $recPerPage = 20, $pageID = 1) - { + public function browse($libID = 'product', $moduleID = 0, $productID = 0, $projectID = 0, $browseType = 'byModule', $param = 0, $orderBy = 'id_desc', $recTotal = 0, $recPerPage = 20, $pageID = 1) + { + /* Set browseType.*/ + $browseType = strtolower($browseType); + $productID = $this->product->saveState($productID, $this->products); + $queryID = ($browseType == 'bysearch') ? (int)$param : 0; + /* Set menu, save session. */ $this->doc->setMenu($this->libs, $libID, 'doc'); $this->session->set('docList', $this->app->getURI(true)); @@ -64,11 +78,39 @@ class doc extends control /* Load pager. */ $this->app->loadClass('pager', $static = true); $pager = new pager($recTotal, $recPerPage, $pageID); - + /* Get docs. */ $modules = 0; - if($moduleID) $modules = $this->tree->getAllChildID($moduleID); - $docs = $this->doc->getDocs($libID, $productID, $projectID, $modules, $orderBy, $pager); + $docs=array(); + if($browseType == "bymodule") + { + if($moduleID) $modules = $this->tree->getAllChildID($moduleID); + $docs = $this->doc->getDocs($libID, $productID, $projectID, $modules, $orderBy, $pager); + } + elseif($browseType == "bysearch") + { + if($queryID) + { + $query = $this->loadModel('search')->getQuery($queryID); + if($query) + { + $this->session->set('docQuery', $query->sql); + $this->session->set('docForm', $query->form); + } + else + { + $this->session->set('docQuery', ' 1 = 1'); + } + } + else + { + if($this->session->docQuery == false) $this->session->set('docQuery', ' 1 = 1'); + } + $docQuery = str_replace("`product` = 'all'", '1', $this->session->docQuery); // Search all producti. + $docs = $this->dao->select('*')->from(TABLE_DOC)->where($docQuery) + ->andWhere('deleted')->eq(0) + ->orderBy($orderBy)->page($pager)->fetchAll(); + } /* Get the tree menu. */ if($libID == 'product') @@ -83,6 +125,14 @@ class doc extends control { $moduleTree = $this->tree->getTreeMenu($libID, $viewType = 'customdoc', $startModuleID = 0, array('treeModel', 'createDocLink')); } + + /* Build the search form. */ + $this->config->doc->search['actionURL'] = $this->createLink('doc', 'browse', "libID=$libID&moduleID=$moduleID&procuctID=$productID&projectID=$projectID&browseType=bySearch&queryID=myQueryID"); + $this->config->doc->search['queryID'] = $queryID; + $this->config->doc->search['params']['product']['values'] = array($productID => $this->products[$productID], 'all' => $this->lang->doc->allProduct); + $this->config->doc->search['params']['lib']['values'] = $this->doc->getLibs(); + $this->config->doc->search['params']['module']['values'] = $this->tree->getOptionMenu($productID, $viewType = 'doc', $startModuleID = 0); + $this->view->searchForm = $this->fetch('search', 'buildForm', $this->config->doc->search); $this->view->libID = $libID; $this->view->libName = $this->libs[$libID]; @@ -95,6 +145,8 @@ class doc extends control $this->view->orderBy = $orderBy; $this->view->productID = $productID; $this->view->projectID = $projectID; + $this->view->browseType = $browseType; + $this->view->param = $param; $this->display(); } diff --git a/module/doc/js/browse.js b/module/doc/js/browse.js new file mode 100644 index 0000000000..24417ab305 --- /dev/null +++ b/module/doc/js/browse.js @@ -0,0 +1,7 @@ +$(function(){$("#byQuery").css("color","red");}); +/* Search doc. */ +$("#byQuery").bind("click",function(){ + $(this).css({color:"green","font-weight":"bold"}); + $('.divider').addClass('hidden'); + $('#querybox').removeClass('hidden'); + }); diff --git a/module/doc/lang/en.php b/module/doc/lang/en.php index 353bd377c8..3e686d0ca2 100644 --- a/module/doc/lang/en.php +++ b/module/doc/lang/en.php @@ -44,6 +44,9 @@ $lang->doc->editLib = 'Edit library'; $lang->doc->deleteLib = 'Delete library'; $lang->doc->libName = 'Library name'; +/* Browse tabs. */ +$lang->doc->allProduct = 'All products'; + $lang->doc->systemLibs['product'] = 'Product doc'; $lang->doc->systemLibs['project'] = 'Project doc'; diff --git a/module/doc/lang/zh-cn.php b/module/doc/lang/zh-cn.php index 738004ef93..eece722ee1 100644 --- a/module/doc/lang/zh-cn.php +++ b/module/doc/lang/zh-cn.php @@ -44,6 +44,9 @@ $lang->doc->editLib = '编辑文档库'; $lang->doc->deleteLib = '删除文档库'; $lang->doc->libName = '文档库名称'; +/* 查询条件列表 */ +$lang->doc->allProduct = '所有产品'; + $lang->doc->systemLibs['product'] = '产品文档库'; $lang->doc->systemLibs['project'] = '项目文档库'; diff --git a/module/doc/view/browse.html.php b/module/doc/view/browse.html.php index b1933e93c2..c626f19099 100644 --- a/module/doc/view/browse.html.php +++ b/module/doc/view/browse.html.php @@ -18,6 +18,7 @@ doc->create);?> +
    '>
    @@ -35,7 +36,7 @@
    - recTotal}&recPerPage={$pager->recPerPage}";?> + recTotal}&recPerPage={$pager->recPerPage}";?> diff --git a/module/project/config.php b/module/project/config.php index 0a077854fc..07a4aa6282 100644 --- a/module/project/config.php +++ b/module/project/config.php @@ -1,6 +1,52 @@ loadLang('task'); $config->project->create->requiredFields = 'name,code,team,begin,end'; $config->project->edit->requiredFields = 'name,code,team,begin,end'; $config->project->editor->create = array('id' => 'desc,goal', 'tools' => 'simpleTools'); $config->project->editor->edit = array('id' => 'desc,goal', 'tools' => 'simpleTools'); + +$config->project->search['module'] = 'task'; +$config->project->search['fields']['name'] = $lang->task->name; +$config->project->search['fields']['id'] = $lang->task->id; +$config->project->search['fields']['story'] = $lang->task->story; +$config->project->search['fields']['project'] = $lang->task->project; +$config->project->search['fields']['type'] = $lang->task->type; +$config->project->search['fields']['mailto'] = $lang->task->mailto; +$config->project->search['fields']['estimate'] = $lang->task->estimate; +$config->project->search['fields']['left'] = $lang->task->left; +$config->project->search['fields']['consumed'] = $lang->task->consumed; +$config->project->search['fields']['deadline'] = $lang->task->deadline; +$config->project->search['fields']['status'] = $lang->task->status; +$config->project->search['fields']['pri'] = $lang->task->pri; +$config->project->search['fields']['desc'] = $lang->task->desc; +$config->project->search['fields']['assignedTo'] = $lang->task->assignedTo; +$config->project->search['fields']['assignedDate'] = $lang->task->assignedDate; +$config->project->search['fields']['openedDate'] = $lang->task->openedDate; +$config->project->search['fields']['openedBy'] = $lang->task->openedBy; +$config->project->search['fields']['finishedBy'] = $lang->task->finishedBy; +$config->project->search['fields']['finishedDate'] = $lang->task->finishedDate; +$config->project->search['fields']['canceledBy'] = $lang->task->canceledBy; +$config->project->search['fields']['canceledDate'] = $lang->task->canceledDate; +$config->project->search['fields']['closedBy'] = $lang->task->closedBy; +$config->project->search['fields']['closedDate'] = $lang->task->closedDate; +$config->project->search['fields']['closedReason'] = $lang->task->closedReason; +$config->project->search['fields']['lastEdited'] = $lang->task->lastEdited; + +$config->project->search['params']['name'] = array('operator' => 'include', 'control' => 'input', 'values' => ''); +$config->project->search['params']['story'] = array('operator' => 'include', 'control' => 'input', 'values' => ''); +$config->project->search['params']['desc'] = array('operator' => 'include', 'control' => 'input', 'values' => ''); +$config->project->search['params']['project'] = array('operator' => '=', 'control' => 'select', 'values' => ''); +$config->project->search['params']['assignedTo'] = array('operator' => '=', 'control' => 'select', 'values' => 'users'); +$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']['cancelBy'] = array('operator' => '=', 'control' => 'select', 'values' => 'users'); +$config->project->search['params']['lastEdited'] = array('operator' => '=', 'control' => 'select', 'values' => 'users'); +$config->project->search['params']['finishedBy'] = array('operator' => '=', 'control' => 'select', 'values' => 'users'); +$config->project->search['params']['mailto'] = array('operator' => '=', 'control' => 'select', 'values' => 'users'); +$config->project->search['params']['status'] = array('operator' => '=', 'control' => 'select', 'values' => $lang->task->statusList); +$config->project->search['params']['sclosedReason'] = array('operator' => '=', 'control' => 'select', 'values' => $lang->task->reasonList); +$config->project->search['params']['pri'] = array('operator' => '=', 'control' => 'select', 'values' => $lang->task->priList); +$config->project->search['params']['type'] = array('operator' => '=', 'control' => 'select', 'values' => $lang->task->typeList); + diff --git a/module/project/control.php b/module/project/control.php index 12ddcda4d3..3a588db10c 100644 --- a/module/project/control.php +++ b/module/project/control.php @@ -102,8 +102,11 @@ class project extends control * @access public * @return void */ - public function task($projectID = 0, $status = 'all', $orderBy = 'status_asc,id_desc', $recTotal = 0, $recPerPage = 100, $pageID = 1) - { + public function task($projectID = 0, $status = 'all', $param=0, $orderBy = 'status_asc,id_desc', $recTotal = 0, $recPerPage = 100, $pageID = 1) + { + /* Set browseType, productID, moduleID and queryID. */ + $browseType = strtolower($status); + $queryID = ($browseType == 'bysearch') ? (int)$param : 0; $project = $this->commonAction($projectID); $projectID = $project->id; @@ -121,7 +124,51 @@ class project extends control /* Load pager and get tasks. */ $this->app->loadClass('pager', $static = true); $pager = new pager($recTotal, $recPerPage, $pageID); - $tasks = $this->loadModel('task')->getProjectTasks($projectID, $status, $orderBy, $pager); + + $tasks=array(); + if($browseType!="bysearch") + { + $tasks = $this->loadModel('task')->getProjectTasks($projectID, $status, $orderBy, $pager); + } + else + { + if($queryID) + { + $query = $this->loadModel('search')->getQuery($queryID); + if($query) + { + $this->session->set('taskQuery', $query->sql); + $this->session->set('taskForm', $query->form); + } + else + { + $this->session->set('taskQuery', ' 1 = 1'); + } + } + else + { + if($this->session->taskQuery == false) $this->session->set('taskQuery', ' 1 = 1'); + } + $taskQuery = str_replace("`project` = 'all'", '1', $this->session->taskQuery); // Search all product. + $taskids = $this->dao->select('id')->from(TABLE_TASK)->where($taskQuery) + ->andWhere('deleted')->eq(0) + ->orderBy($orderBy)->fetchAll('id'); + $tasks = $this->dao->select('t1.*, t2.id AS storyID, t2.title AS storyTitle, t2.version AS latestStoryVersion, t2.status AS storyStatus, t3.realname AS assignedToRealName') + ->from(TABLE_TASK)->alias('t1') + ->leftJoin(TABLE_STORY)->alias('t2')->on('t1.story = t2.id') + ->leftJoin(TABLE_USER)->alias('t3')->on('t1.assignedTo = t3.account') + ->where('t1.project')->eq((int)$projectID) + ->andWhere('t1.deleted')->eq(0) + ->andWhere('t1.id')->in(array_keys($taskids)) + ->orderBy($orderBy) + ->page($pager) + ->fetchAll(); + } + /* Build the search form. */ + $this->config->project->search['actionURL'] = $this->createLink('project', 'task', "projectID=$projectID&status=bySearch¶m=myQueryID"); + $this->config->project->search['queryID'] = $queryID; + $this->config->project->search['params']['project']['values'] = array($projectID => $this->projects[$projectID], 'all' => $this->lang->project->allProject); + $this->view->searchForm = $this->fetch('search', 'buildForm', $this->config->project->search); /* Assign. */ $this->view->tasks = $tasks ? $tasks : array(); @@ -130,9 +177,10 @@ class project extends control $this->view->recTotal = $pager->recTotal; $this->view->recPerPage = $pager->recPerPage; $this->view->orderBy = $orderBy; - $this->view->browseType = strtolower($status); + $this->view->browseType = $browseType; $this->view->status = $status; $this->view->users = $this->loadModel('user')->getPairs('noletter'); + $this->view->param = $param; $this->display(); } diff --git a/module/project/js/task.js b/module/project/js/task.js new file mode 100644 index 0000000000..d1f45cafea --- /dev/null +++ b/module/project/js/task.js @@ -0,0 +1,7 @@ +/* Search bugs. */ +function browseBySearch(active) +{ + $('.divider').addClass('hidden'); + $('#querybox').removeClass('hidden'); + $('#' + active + 'Tab').removeClass('active'); +} diff --git a/module/project/lang/en.php b/module/project/lang/en.php index bf021d6421..07b7c67e9c 100644 --- a/module/project/lang/en.php +++ b/module/project/lang/en.php @@ -103,6 +103,10 @@ $lang->project->groups['left'] = 'Group by left'; $lang->project->groups['type'] = 'Group by type'; $lang->project->groups['deadline'] = 'Group by deadline'; $lang->project->listTaskNeedConfrim = 'Story changed'; +$lang->project->byQuery = 'Search'; + +/* Browse tabs. */ +$lang->project->allProject = 'All projects'; /* Notcie. */ $lang->project->selectProject = "Select project"; diff --git a/module/project/lang/zh-cn.php b/module/project/lang/zh-cn.php index e325342e53..a342deb18d 100644 --- a/module/project/lang/zh-cn.php +++ b/module/project/lang/zh-cn.php @@ -102,6 +102,10 @@ $lang->project->groups['left'] = '剩余分组'; $lang->project->groups['type'] = '类型分组'; $lang->project->groups['deadline'] = '截止分组'; $lang->project->listTaskNeedConfrim = '需求变动'; +$lang->project->byQuery = '搜索'; + +/* 查询条件列表。*/ +$lang->project->allProject = '所有项目'; /* 页面提示。*/ $lang->project->selectProject = "请选择项目"; diff --git a/module/project/view/task.html.php b/module/project/view/task.html.php index ebf4e2e28c..17a15e6755 100644 --- a/module/project/view/task.html.php +++ b/module/project/view/task.html.php @@ -14,8 +14,9 @@ +
    '>
    idAB);?> doc->title);?> doc->type);?>
    - id&status=$status&orderBy=%s&recTotal=$recTotal&recPerPage=$recPerPage"; ?> + id&status=$status&parma=$param&orderBy=%s&recTotal=$recTotal&recPerPage=$recPerPage"; ?> diff --git a/module/project/view/taskheader.html.php b/module/project/view/taskheader.html.php index 6bbfb1ba09..c69072c7dc 100644 --- a/module/project/view/taskheader.html.php +++ b/module/project/view/taskheader.html.php @@ -13,6 +13,7 @@ echo html::select('groupBy', $lang->project->groups, isset($groupBy) ? $groupBy : '', "onchange='switchGroup({$project->id}, this.value)'"); echo ""; echo ""; common::printLink('project', 'task', "project=$project->id&status=needConfirm",$lang->project->listTaskNeedConfrim); echo '' ; + echo "{$lang->project->byQuery} "; ?>
    diff --git a/module/search/view/buildform.html.php b/module/search/view/buildform.html.php index 8c34d98fb9..14cebc587b 100644 --- a/module/search/view/buildform.html.php +++ b/module/search/view/buildform.html.php @@ -34,8 +34,8 @@ var actionURL = ''; function setField(fieldName, fieldNO) { $('#operator' + fieldNO).val(params[fieldName]['operator']); // Set the operator according the param setting. - htmlString = $('#box' + fieldName).html().replace(fieldName, 'value' + fieldNO).replace(fieldName, 'value' + fieldNO); - $('#valueBox' + fieldNO).html(htmlString); + $('#valueBox' + fieldNO) .html($('#box' + fieldName).children().clone()); + $('#valueBox' + fieldNO).children().attr({name : 'value' + fieldNO, id : 'value' + fieldNO}); } /**
    idAB);?>