diff --git a/db/update3.0.beta1.sql b/db/update3.0.beta1.sql index 636259a08f..922f68c4c6 100644 --- a/db/update3.0.beta1.sql +++ b/db/update3.0.beta1.sql @@ -1,3 +1,4 @@ UPDATE `zt_story` SET `source` = 'customer' WHERE `source` = 'custom'; ALTER TABLE `zt_action` CHANGE `product` `product` VARCHAR( 255 ) NOT NULL ; ALTER TABLE `zt_history` CHANGE `diff` `diff` MEDIUMTEXT CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ; +ALTER TABLE `zt_project` ADD `order` TINYINT NOT NULL AFTER `whitelist`; diff --git a/module/common/lang/en.php b/module/common/lang/en.php index ad7ec5d989..97774bd894 100644 --- a/module/common/lang/en.php +++ b/module/common/lang/en.php @@ -139,6 +139,7 @@ $lang->product->menu->view = 'Info|product|view|productID=%s'; $lang->product->menu->edit = 'Edit|product|edit|productID=%s'; $lang->product->menu->delete = array('link' => 'Delete|product|delete|productID=%s', 'target' => 'hiddenwin'); $lang->product->menu->module = 'Modules|tree|browse|productID=%s&view=story'; +$lang->product->menu->order = 'Order|product|order|productID=%s'; $lang->product->menu->create = array('link' => 'New Product|product|create', 'float' => 'right'); $lang->product->menu->project = array('link' => 'Project list|product|project|status=all&productID=%s', 'float' => 'right'); $lang->product->menu->all = array('link' => 'All product|product|index|locate=false', 'float' => 'right'); @@ -162,6 +163,7 @@ $lang->project->menu->linkstory = array('link' => 'Link Story|project|linkstory| $lang->project->menu->view = 'Info|project|view|projectID=%s'; $lang->project->menu->edit = 'Edit|project|edit|projectID=%s'; $lang->project->menu->delete = array('link' => 'Delete|project|delete|projectID=%s', 'target' => 'hiddenwin'); +$lang->project->menu->order = 'Order|project|order|projectID=%s'; $lang->project->menu->create = array('link' => 'New Project|project|create', 'float' => 'right'); $lang->project->menu->toCopy = array('link' => 'Copy Project|project|create|projectID=©ProjectID=%s', 'float' => 'right'); $lang->project->menu->all = array('link' => 'Project list|project|index|locate=no', 'float' => 'right'); diff --git a/module/common/lang/zh-cn.php b/module/common/lang/zh-cn.php index cc71c18430..c2319709cb 100644 --- a/module/common/lang/zh-cn.php +++ b/module/common/lang/zh-cn.php @@ -139,6 +139,7 @@ $lang->product->menu->view = '概况|product|view|productID=%s'; $lang->product->menu->edit = '编辑|product|edit|productID=%s'; $lang->product->menu->delete = array('link' => '删除|product|delete|productID=%s', 'target' => 'hiddenwin'); $lang->product->menu->module = '模块|tree|browse|productID=%s&view=story'; +$lang->product->menu->order = '排序|product|order|productID=%s'; $lang->product->menu->create = array('link' => '新增产品|product|create', 'float' => 'right'); $lang->product->menu->project = array('link' => '项目列表|product|project|status=all&productID=%s', 'float' => 'right'); $lang->product->menu->all = array('link' => '所有产品|product|index|locate=false', 'float' => 'right'); @@ -162,6 +163,7 @@ $lang->project->menu->linkstory = array('link' => '关联需求|project|linkstor $lang->project->menu->view = '概况|project|view|projectID=%s'; $lang->project->menu->edit = '编辑|project|edit|projectID=%s'; $lang->project->menu->delete = array('link' => '删除|project|delete|projectID=%s', 'target' => 'hiddenwin'); +$lang->project->menu->order = '排序|project|order|projectID=%s'; $lang->project->menu->create = array('link' => '新增项目|project|create', 'float' => 'right'); $lang->project->menu->toCopy = array('link' => '复制项目|project|create|projectID=©ProjectID=%s', 'float' => 'right'); $lang->project->menu->all = array('link' => '所有项目|project|index|locate=false', 'float' => 'right'); diff --git a/module/project/config.php b/module/project/config.php index 550d1fd510..1c98bf34ce 100644 --- a/module/project/config.php +++ b/module/project/config.php @@ -1,6 +1,6 @@ project->defaultWorkhours = 7; -$config->project->orderBy = 'status, id desc'; +$config->project->orderBy = 'isDone, `order`, status'; global $lang, $app; $app->loadLang('task'); diff --git a/module/project/control.php b/module/project/control.php index 48c3441e6d..6343d09e3c 100644 --- a/module/project/control.php +++ b/module/project/control.php @@ -873,6 +873,27 @@ class project extends control } } + /** + * Order project + * + * @param int $projectID + * @access public + * @return void + */ + public function order($projectID) + { + if($_POST) + { + $this->project->saveOrder(); + die(js::reload('parent')); + } + $project = $this->commonAction($projectID); + $this->project->setMenu($this->projects, $project->id); + $this->view->projects = $this->project->getList(); + $this->view->projectID = $project->id; + $this->display(); + } + /** * Send email. * diff --git a/module/project/lang/en.php b/module/project/lang/en.php index b0c5844b07..5bea1ec0e1 100644 --- a/module/project/lang/en.php +++ b/module/project/lang/en.php @@ -38,6 +38,7 @@ $lang->project->QM = 'Test manager'; $lang->project->RM = 'Release manager'; $lang->project->acl = 'Access limitation'; $lang->project->teamname = 'Team name'; +$lang->project->order = 'Project order'; $lang->project->products = 'Products'; $lang->project->childProjects = 'Child projects'; $lang->project->whitelist = 'Whitelist'; @@ -102,6 +103,7 @@ $lang->project->assignedToMe = 'To me'; $lang->project->finishedByMe = 'My done'; $lang->project->statusWait = 'Pending'; $lang->project->statusDoing = 'Progressing'; +$lang->project->statusUndone = 'Not final'; $lang->project->statusDone = 'Done'; $lang->project->statusClosed = 'Closed'; $lang->project->delayed = 'Delayed'; diff --git a/module/project/lang/zh-cn.php b/module/project/lang/zh-cn.php index b910ee7bc2..30e92ddcfc 100644 --- a/module/project/lang/zh-cn.php +++ b/module/project/lang/zh-cn.php @@ -38,6 +38,7 @@ $lang->project->QM = '测试负责人'; $lang->project->RM = '发布负责人'; $lang->project->acl = '访问控制'; $lang->project->teamname = '团队名称'; +$lang->project->order = '项目排序'; $lang->project->products = '相关产品'; $lang->project->childProjects = '子项目'; $lang->project->whitelist = '分组白名单'; @@ -102,6 +103,7 @@ $lang->project->assignedToMe = '指派给我'; $lang->project->finishedByMe = '由我完成'; $lang->project->statusWait = '未开始'; $lang->project->statusDoing = '进行中'; +$lang->project->statusUndone = '未完成'; $lang->project->statusDone = '已完成'; $lang->project->statusClosed = '已关闭'; $lang->project->delayed = '已延期'; diff --git a/module/project/model.php b/module/project/model.php index fd7b660667..e123a975cd 100644 --- a/module/project/model.php +++ b/module/project/model.php @@ -121,6 +121,20 @@ class projectModel extends model return $this->session->project; } + /** + * Save order + * + * @access public + * @return void + */ + public function saveOrder() + { + foreach($_POST as $projectID => $order) + { + $this->dao->update(TABLE_PROJECT)->set('`order`')->eq($order)->where('id')->eq($projectID)->exec(); + } + } + /** * Create a project. * @@ -237,9 +251,10 @@ class projectModel extends model */ public function getPairs($mode = '') { - $orderBy = !empty($this->config->project->orderBy) ? $this->config->project->orderBy : 'status, id desc'; + $orderBy = !empty($this->config->project->orderBy) ? $this->config->project->orderBy : 'isDone, `order`, status'; $mode .= $this->cookie->projectMode; - $projects = $this->dao->select('*')->from(TABLE_PROJECT) + /* Order by status's content whether or not done */ + $projects = $this->dao->select('*, IF(INSTR(" done", status) < 2, 0, 1) AS isDone')->from(TABLE_PROJECT) ->where('iscat')->eq(0) ->andWhere('deleted')->eq(0) ->orderBy($orderBy) @@ -289,17 +304,17 @@ class projectModel extends model ->andWhere('t2.iscat')->eq(0) ->beginIF($status == 'undone')->andWhere('t2.status')->ne('done')->fi() ->beginIF($status != 'all' and $status != 'undone')->andWhere('status')->in($status)->fi() - ->orderBy('status, id desc') + ->orderBy($this->config->project->orderBy) ->beginIF($limit)->limit($limit)->fi() ->fetchAll('id'); } else { - return $this->dao->select('*')->from(TABLE_PROJECT)->where('iscat')->eq(0) + return $this->dao->select('*, IF(INSTR(" done", status) < 2, 0, 1) AS isDone')->from(TABLE_PROJECT)->where('iscat')->eq(0) ->beginIF($status == 'undone')->andWhere('status')->ne('done')->fi() ->beginIF($status != 'all' and $status != 'undone')->andWhere('status')->in($status)->fi() ->andWhere('deleted')->eq(0) - ->orderBy('status, id') + ->orderBy($this->config->project->orderBy) ->beginIF($limit)->limit($limit)->fi() ->fetchAll('id'); } diff --git a/module/project/view/order.html.php b/module/project/view/order.html.php new file mode 100644 index 0000000000..3bc8240735 --- /dev/null +++ b/module/project/view/order.html.php @@ -0,0 +1,55 @@ + + * @package project + * @version $Id$ + * @link http://www.zentao.net + */ +?> + +
+ + + + + + + + + + status == 'done') continue;?> + + + + + + + + +
project->statusUndone?>
project->id?>project->name?>project->status?>project->order?>
id?>name?>project->statusList[$project->status]?>id, $project->order, "size='5'")?>
+
+
+ + + + + + + + + status != 'done') continue;?> + + + + + + + +
project->statusDone?>
project->id?>project->name?>project->order?>
id?>name?>id, $project->order, "size='5'")?>
+
+ + diff --git a/module/upgrade/model.php b/module/upgrade/model.php index 011fc7a69e..13660c7bd5 100644 --- a/module/upgrade/model.php +++ b/module/upgrade/model.php @@ -785,6 +785,7 @@ class upgradeModel extends model { $this->execSQL($this->getUpgradeFile('3.0.beta1')); $this->updateTableAction(); + $this->setOrderData(); if(!$this->isError()) $this->setting->updateVersion('3.0'); } @@ -1092,6 +1093,26 @@ class upgradeModel extends model } } + /** + * Init the data of product and project order field. + * + * @access public + * @return void + */ + public function setOrderData() + { + $products = $this->dao->select('*')->from(TABLE_PRODUCT)->where('deleted')->eq(0)->orderBy('code')->fetchAll('id'); + foreach(array_keys($products) as $key => $productID) + { + $this->dao->update(TABLE_PRODUCT)->set('`order`')->eq(($key + 1) * 10)->where('id')->eq($productID)->exec(); + } + $projects = $this->dao->select('*')->from(TABLE_PROJECT)->where('iscat')->eq(0)->andWhere('deleted')->eq(0)->orderBy('status, id desc')->fetchAll('id'); + foreach(array_keys($projects) as $key => $projectID) + { + $this->dao->update(TABLE_PROJECT)->set('`order`')->eq(($key + 1) * 10)->where('id')->eq($projectID)->exec(); + } + } + /** * Delete the patch record. *