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}";?>
| idAB);?> |
doc->title);?> |
doc->type);?> |
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 @@
+'>
- id&status=$status&orderBy=%s&recTotal=$recTotal&recPerPage=$recPerPage"; ?>
+ id&status=$status&parma=$param&orderBy=%s&recTotal=$recTotal&recPerPage=$recPerPage"; ?>
| idAB);?> |
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});
}
/**