diff --git a/module/action/lang/en.php b/module/action/lang/en.php index 445d378656..b5635e3da8 100755 --- a/module/action/lang/en.php +++ b/module/action/lang/en.php @@ -361,8 +361,12 @@ $lang->action->dynamicAction->branch['activated'] = 'Activate Branch'; $lang->action->dynamicAction->branch['setdefaultbranch'] = 'Set Default Branch'; $lang->action->dynamicAction->branch['mergebranch'] = 'Merge Branch'; -$lang->action->dynamicAction->productplan['opened'] = 'Create Plan'; -$lang->action->dynamicAction->productplan['edited'] = 'Edit Plan'; +$lang->action->dynamicAction->productplan['opened'] = 'Create Plan'; +$lang->action->dynamicAction->productplan['edited'] = 'Edit Plan'; +$lang->action->dynamicAction->productplan['started'] = "Start Plan"; +$lang->action->dynamicAction->productplan['finished'] = "Finish Plan"; +$lang->action->dynamicAction->productplan['closed'] = "Close Plan"; +$lang->action->dynamicAction->productplan['activated'] = "Activate Plan"; $lang->action->dynamicAction->release['opened'] = 'Create Release'; $lang->action->dynamicAction->release['edited'] = 'Edit Release'; diff --git a/module/action/lang/zh-cn.php b/module/action/lang/zh-cn.php index 9285bf0bb9..ee4a3f4e0a 100755 --- a/module/action/lang/zh-cn.php +++ b/module/action/lang/zh-cn.php @@ -361,8 +361,12 @@ $lang->action->dynamicAction->branch['activated'] = '激活分支'; $lang->action->dynamicAction->branch['setdefaultbranch'] = '设置默认分支'; $lang->action->dynamicAction->branch['mergebranch'] = '合并分支'; -$lang->action->dynamicAction->productplan['opened'] = "创建计划"; -$lang->action->dynamicAction->productplan['edited'] = "编辑计划"; +$lang->action->dynamicAction->productplan['opened'] = "创建计划"; +$lang->action->dynamicAction->productplan['edited'] = "编辑计划"; +$lang->action->dynamicAction->productplan['started'] = "开始计划"; +$lang->action->dynamicAction->productplan['finished'] = "完成计划"; +$lang->action->dynamicAction->productplan['closed'] = "关闭计划"; +$lang->action->dynamicAction->productplan['activated'] = "激活计划"; $lang->action->dynamicAction->release['opened'] = '创建发布'; $lang->action->dynamicAction->release['edited'] = '编辑发布'; diff --git a/module/productplan/config.php b/module/productplan/config.php index 534647eb7c..45a3c8f51a 100644 --- a/module/productplan/config.php +++ b/module/productplan/config.php @@ -2,8 +2,10 @@ $config->productplan = new stdclass(); $config->productplan->create = new stdclass(); $config->productplan->edit = new stdclass(); +$config->productplan->start = new stdclass(); $config->productplan->create->requiredFields = 'title'; $config->productplan->edit->requiredFields = 'title'; +$config->productplan->start->requiredFields = 'begin,end'; $config->productplan->editor = new stdclass(); $config->productplan->editor->create = array('id' => 'desc', 'tools' => 'simpleTools'); diff --git a/module/productplan/control.php b/module/productplan/control.php index cfb3c5cdf7..d4c40b23b3 100644 --- a/module/productplan/control.php +++ b/module/productplan/control.php @@ -236,7 +236,7 @@ class productplan extends control * @access public * @return void */ - public function browse($productID = 0, $branch = 0, $browseType = 'all', $orderBy = 'begin_desc', $recTotal = 0, $recPerPage = 20, $pageID = 1 ) + public function browse($productID = 0, $branch = 0, $browseType = 'doing', $orderBy = 'begin_desc', $recTotal = 0, $recPerPage = 20, $pageID = 1 ) { /* Load pager. */ $this->app->loadClass('pager', $static = true); @@ -351,6 +351,129 @@ class productplan extends control $this->display(); } + /** + * Start a plan. + * + * @param int $planID + * @param string $confirm + * @access public + * @return void + */ + public function start($planID, $confirm = 'no') + { + $plan = $this->productplan->getByID($planID); + if(!isonlybody()) + { + if($confirm == 'no') + { + die(js::confirm($this->lang->productplan->confirmStart, $this->createLink('productplan', 'start', "planID=$planID&confirm=yes"))); + } + else + { + $changes = $this->productplan->updateStatus($planID, 'doing'); + if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError())); + + $actionID = $this->loadModel('action')->create('productplan', $planID, 'started'); + $this->action->logHistory($actionID, $changes); + + die(js::reload('parent')); + } + } + else + { + if(!empty($_POST)) + { + $changes = $this->productplan->updateStatus($planID, 'doing'); + if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError())); + + $actionID = $this->loadModel('action')->create('productplan', $planID, 'started'); + $this->action->logHistory($actionID, $changes); + + return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess,'locate' => 'parent')); + } + $this->view->plan = $plan; + $this->display(); + } + } + + /** + * Finish a plan. + * + * @param int $planID + * @param string $confirm + * @access public + * @return void + */ + public function finish($planID, $confirm = 'no') + { + if($confirm == 'no') + { + die(js::confirm($this->lang->productplan->confirmFinish, $this->createLink('productplan', 'finish', "planID=$planID&confirm=yes"))); + } + else + { + $changes = $this->productplan->updateStatus($planID, 'done'); + if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError())); + + $actionID = $this->loadModel('action')->create('productplan', $planID, 'finished'); + $this->action->logHistory($actionID, $changes); + + die(js::reload('parent')); + } + } + + /** + * Close a plan. + * + * @param int $planID + * @param string $confirm + * @access public + * @return void + */ + public function close($planID, $confirm = 'no') + { + if($confirm == 'no') + { + die(js::confirm($this->lang->productplan->confirmClose, $this->createLink('productplan', 'close', "planID=$planID&confirm=yes"))); + } + else + { + $changes = $this->productplan->updateStatus($planID, 'closed'); + if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError())); + + $actionID = $this->loadModel('action')->create('productplan', $planID, 'closed'); + $this->action->logHistory($actionID, $changes); + + die(js::reload('parent')); + } + } + + /** + * Activate a plan. + * + * @param int $planID + * @param string $confirm + * @access public + * @return void + */ + public function activate($planID, $confirm = 'no') + { + if($confirm == 'no') + { + die(js::confirm($this->lang->productplan->confirmActivate, $this->createLink('productplan', 'activate', "planID=$planID&confirm=yes"))); + } + else + { + $changes = $this->productplan->updateStatus($planID, 'doing'); + if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError())); + + $actionID = $this->loadModel('action')->create('productplan', $planID, 'activated'); + $this->action->logHistory($actionID, $changes); + + die(js::reload('parent')); + } + } + /** * Ajax: Get product plans. * diff --git a/module/productplan/lang/en.php b/module/productplan/lang/en.php index 2cf7a7c2cc..a90a0f974e 100644 --- a/module/productplan/lang/en.php +++ b/module/productplan/lang/en.php @@ -15,6 +15,10 @@ $lang->productplan->index = "List"; $lang->productplan->create = "Create Plan"; $lang->productplan->edit = "Edit Plan"; $lang->productplan->delete = "Delete Plan"; +$lang->productplan->start = "Start Plan"; +$lang->productplan->finish = "Finish Plan"; +$lang->productplan->close = "Close Plan"; +$lang->productplan->activate = "Activate Plan"; $lang->productplan->view = "Plan Detail"; $lang->productplan->bugSummary = "Total %s Bugs on this page."; $lang->productplan->basicInfo = 'Basic Info'; @@ -44,10 +48,15 @@ $lang->productplan->linkedBugs = 'Linked Bugs'; $lang->productplan->unlinkedBugs = 'Unlinked Bugs'; $lang->productplan->unexpired = 'Unexpired Plans'; $lang->productplan->all = 'All Plans'; +$lang->productplan->setDate = "Set Start and end Date"; $lang->productplan->confirmDelete = "Do you want to delete this plan?"; $lang->productplan->confirmUnlinkStory = "Do you want to unlink this story?"; $lang->productplan->confirmUnlinkBug = "Do you want to unlink this bug?"; +$lang->productplan->confirmStart = "Do you want to start this plan?"; +$lang->productplan->confirmFinish = "Do you want to finish this plan?"; +$lang->productplan->confirmClose = "Do you want to close this plan?"; +$lang->productplan->confirmActivate = "Do you want to activate this plan?"; $lang->productplan->noPlan = 'No plans yet. '; $lang->productplan->cannotDeleteParent = 'Cannot delete parent plan'; $lang->productplan->selectProjects = "Please select the project"; @@ -74,6 +83,7 @@ $lang->productplan->childrenAB = "C"; $lang->productplan->order = "Order"; $lang->productplan->deleted = "Deleted"; $lang->productplan->mailto = "Mailto"; +$lang->productplan->status = 'Status'; $lang->productplan->endList[7] = '1 Week'; $lang->productplan->endList[14] = '2 Weeks'; @@ -92,6 +102,8 @@ $lang->productplan->endGreaterParent = "The completion date of the parent plan: $lang->productplan->noLinkedProject = "The current product has not been linked with a project. Please enter the list of the product to link or create a project."; $lang->productplan->enterProjectList = "Enter the list of the product"; -$lang->productplan->featureBar['browse']['all'] = 'All'; -$lang->productplan->featureBar['browse']['unexpired'] = 'Unexpired'; -$lang->productplan->featureBar['browse']['overdue'] = 'Expired'; +$lang->productplan->featureBar['browse']['all'] = 'All'; +$lang->productplan->featureBar['browse']['wait'] = 'Waiting'; +$lang->productplan->featureBar['browse']['doing'] = 'Doing'; +$lang->productplan->featureBar['browse']['done'] = 'Done'; +$lang->productplan->featureBar['browse']['closed'] = 'Closed'; diff --git a/module/productplan/lang/zh-cn.php b/module/productplan/lang/zh-cn.php index 8471c6c1e1..08a1a1d93d 100644 --- a/module/productplan/lang/zh-cn.php +++ b/module/productplan/lang/zh-cn.php @@ -15,6 +15,10 @@ $lang->productplan->index = "计划列表"; $lang->productplan->create = "创建计划"; $lang->productplan->edit = "编辑计划"; $lang->productplan->delete = "删除计划"; +$lang->productplan->start = "开始计划"; +$lang->productplan->finish = "完成计划"; +$lang->productplan->close = "关闭计划"; +$lang->productplan->activate = "激活计划"; $lang->productplan->view = "计划详情"; $lang->productplan->bugSummary = "本页共 %s 个Bug"; $lang->productplan->basicInfo = '基本信息'; @@ -44,10 +48,15 @@ $lang->productplan->linkedBugs = 'Bug'; $lang->productplan->unlinkedBugs = '未关联Bug'; $lang->productplan->unexpired = "未过期计划"; $lang->productplan->all = "所有计划"; +$lang->productplan->setDate = "设置计划起止时间"; $lang->productplan->confirmDelete = "您确认删除该计划吗?"; $lang->productplan->confirmUnlinkStory = "您确认移除该{$lang->SRCommon}吗?"; $lang->productplan->confirmUnlinkBug = "您确认移除该Bug吗?"; +$lang->productplan->confirmStart = "您确认开始该计划吗?"; +$lang->productplan->confirmFinish = "您确认完成该计划吗?"; +$lang->productplan->confirmClose = "您确认关闭该计划吗?"; +$lang->productplan->confirmActivate = "您确认激活该计划吗?"; $lang->productplan->noPlan = "暂时没有计划。"; $lang->productplan->cannotDeleteParent = "不能删除父计划"; $lang->productplan->selectProjects = "请选择所属项目"; @@ -74,6 +83,7 @@ $lang->productplan->childrenAB = "子"; $lang->productplan->order = "排序"; $lang->productplan->deleted = "已删除"; $lang->productplan->mailto = "抄送给"; +$lang->productplan->status = '状态'; $lang->productplan->endList[7] = '一星期'; $lang->productplan->endList[14] = '两星期'; @@ -92,6 +102,8 @@ $lang->productplan->endGreaterParent = "父计划的完成日期:%s,完成 $lang->productplan->noLinkedProject = "当前产品还未关联项目,请进入产品的项目列表关联或创建一个项目"; $lang->productplan->enterProjectList = "进入产品的项目列表"; -$lang->productplan->featureBar['browse']['all'] = '全部'; -$lang->productplan->featureBar['browse']['unexpired'] = '未过期'; -$lang->productplan->featureBar['browse']['overdue'] = '已过期'; +$lang->productplan->featureBar['browse']['all'] = '所有'; +$lang->productplan->featureBar['browse']['wait'] = '未开始'; +$lang->productplan->featureBar['browse']['doing'] = '进行中'; +$lang->productplan->featureBar['browse']['done'] = '已完成'; +$lang->productplan->featureBar['browse']['closed'] = '已关闭'; diff --git a/module/productplan/model.php b/module/productplan/model.php index 6b785c3e2a..4fc16486d4 100644 --- a/module/productplan/model.php +++ b/module/productplan/model.php @@ -77,14 +77,13 @@ class productplanModel extends model * @access public * @return object */ - public function getList($product = 0, $branch = 0, $browseType = 'all', $pager = null, $orderBy = 'begin_desc') + public function getList($product = 0, $branch = 0, $browseType = 'doing', $pager = null, $orderBy = 'begin_desc') { $date = date('Y-m-d'); $plans = $this->dao->select('*')->from(TABLE_PRODUCTPLAN)->where('product')->eq($product) ->andWhere('deleted')->eq(0) ->beginIF(!empty($branch))->andWhere('branch')->eq($branch)->fi() - ->beginIF($browseType == 'unexpired')->andWhere('end')->ge($date)->fi() - ->beginIF($browseType == 'overdue')->andWhere('end')->lt($date)->fi() + ->beginIF($browseType != 'all')->andWhere('status')->eq($browseType)->fi() ->orderBy($orderBy) ->page($pager) ->fetchAll('id'); @@ -479,6 +478,53 @@ class productplanModel extends model } } + /** + * Update a plan's status. + * + * @param int $planID + * @param string $status + * @access public + * @return string + */ + public function updateStatus($planID, $status = '') + { + $oldPlan = $this->dao->findByID((int)$planID)->from(TABLE_PRODUCTPLAN)->fetch(); + + if($status == 'doing' and $_POST) + { + $plan = fixer::input('post')->add('status', $status)->get(); + if(strpos($this->config->productplan->start->requiredFields, 'begin') !== false and empty($_POST['begin'])) + { + dao::$errors['begin'] = sprintf($this->lang->error->notempty, $this->lang->productplan->begin); + } + if(strpos($this->config->productplan->start->requiredFields, 'end') !== false and empty($_POST['end'])) + { + dao::$errors['end'] = sprintf($this->lang->error->notempty, $this->lang->productplan->end); + } + if(dao::isError()) return false; + + $this->dao->update(TABLE_PRODUCTPLAN) + ->data($plan) + ->autoCheck() + ->batchCheck($this->config->productplan->start->requiredFields, 'notempty') + ->checkIF(!empty($_POST['begin']) && !empty($_POST['end']), 'end', 'ge', $plan->begin) + ->where('id')->eq((int)$planID) + ->exec(); + + } + else + { + $this->dao->update(TABLE_PRODUCTPLAN) + ->set('`status`')->eq($status) + ->where('id')->eq((int)$planID) + ->exec(); + + $plan = $this->dao->findByID((int)$planID)->from(TABLE_PRODUCTPLAN)->fetch(); + } + + if(!dao::isError())return common::createChanges($oldPlan, $plan); + } + /** * Batch update plan. * diff --git a/module/productplan/view/browsebylist.html.php b/module/productplan/view/browsebylist.html.php index f987acf2c4..7dca90e6cf 100644 --- a/module/productplan/view/browsebylist.html.php +++ b/module/productplan/view/browsebylist.html.php @@ -128,6 +128,23 @@ " . $this->loadModel('flow')->getFieldValue($extendField, $plan) . "";?>