diff --git a/module/task/config/form.php b/module/task/config/form.php index a90903c359..71a67fe4e5 100644 --- a/module/task/config/form.php +++ b/module/task/config/form.php @@ -128,9 +128,22 @@ $config->task->form->pause['lastEditedDate'] = array('type' => 'string', 'requir $config->task->form->pause['status'] = array('type' => 'string', 'required' => false, 'default' => 'pause'); $config->task->form->activate = array(); -$config->task->form->activate['mode'] = array('type' => 'string', 'required' => false, 'default' => ''); -$config->task->form->activate['left'] = array('type' => 'float', 'required' => true, 'default' => 0); -$config->task->form->activate['assignedTo'] = array('type' => 'string', 'required' => true); +$config->task->form->activate['mode'] = array('type' => 'string', 'required' => false, 'default' => ''); +$config->task->form->activate['left'] = array('type' => 'float', 'required' => true, 'default' => 0); +$config->task->form->activate['assignedTo'] = array('type' => 'string', 'required' => false); +$config->task->form->activate['comment'] = array('type' => 'string', 'required' => false, 'control' => 'editor'); +$config->task->form->activate['status'] = array('type' => 'string', 'required' => false, 'default' => 'doing'); +$config->task->form->activate['activatedDate'] = array('type' => 'string', 'required' => false, 'default' => $now); +$config->task->form->activate['assignedDate'] = array('type' => 'string', 'required' => false, 'default' => $now); +$config->task->form->activate['lastEditedBy'] = array('type' => 'string', 'required' => false, 'default' => $app->user->account); +$config->task->form->activate['lastEditedDate'] = array('type' => 'string', 'required' => false, 'default' => $now); +$config->task->form->activate['finishedBy'] = array('type' => 'string', 'required' => false, 'default' => ''); +$config->task->form->activate['canceledBy'] = array('type' => 'string', 'required' => false, 'default' => ''); +$config->task->form->activate['closedBy'] = array('type' => 'string', 'required' => false, 'default' => ''); +$config->task->form->activate['closedReason'] = array('type' => 'string', 'required' => false, 'default' => ''); +$config->task->form->activate['finishedDate'] = array('type' => 'string', 'required' => false, 'default' => null); +$config->task->form->activate['canceledDate'] = array('type' => 'string', 'required' => false, 'default' => null); +$config->task->form->activate['closedDate'] = array('type' => 'string', 'required' => false, 'default' => null); $config->task->form->start = array(); $config->task->form->start['status'] = array('type' => 'string', 'required' => false, 'default' => 'doing'); diff --git a/module/task/control.php b/module/task/control.php index 50424d3bd6..bbf71de549 100755 --- a/module/task/control.php +++ b/module/task/control.php @@ -476,7 +476,7 @@ class task extends control /* Get the information returned after a task is started. */ $from = zget($output, 'from'); - $response = $this->taskZen->responseAfterChangeStatus($task, $from); + $response = $this->taskZen->responseAfterChangeStatus($taskData, $from); $this->send($response); } @@ -797,8 +797,7 @@ class task extends control if(!empty($_POST)) { /* Init task data. */ - $postData = form::data($this->config->task->form->pause); - $task = $postData->data; + $task = form::data($this->config->task->form->pause)->get(); $task->id = $taskID; /* Pause task. */ @@ -816,7 +815,6 @@ class task extends control /* Get response after the suspended task. */ $from = zget($output, 'from'); - $task = $this->task->getById($taskID); $response = $this->taskZen->responseAfterChangeStatus($task, $from); return $this->send($response); } @@ -1114,19 +1112,21 @@ class task extends control * @access public * @return void */ - public function activate(int $taskID, string $cardPosition = '', string $cardDrag = '', string $from = '') + public function activate(int $taskID, string $cardPosition = '', string $from = '') { + /* Analytic parameter. */ + $cardPosition = str_replace(array(',', ' '), array('&', ''), $cardPosition); + parse_str($cardPosition, $output); + $this->taskZen->commonAction($taskID); - if($cardPosition) list($regionID) = $cardPosition; if(!empty($_POST)) { - $taskData = form::data($this->config->task->form->acivate); + /* Prepare the data information before activate the task. */ + $task = $this->taskZen->buildTaskForActivate($taskID); $teamData = form::data($this->config->task->form->team->edit)->get(); - - $task = $this->taskZen->prepareActivate($taskData, $taskID); - $changes = $this->task->activate($task, $this->post->comment, $teamData, explode(',', $cardDrag)); - if(dao::isError()) return print(js::error(dao::getError())); + $changes = $this->task->activate($task, $this->post->comment, $teamData, $output); + if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError())); if($this->post->comment != '' or !empty($changes)) { @@ -1136,13 +1136,9 @@ class task extends control $this->executeHooks($taskID); - if(isonlybody()) - { - $task = $this->task->getById($taskID); - $regionID = !empty($regionID) ? (int)$regionID : 0; - return $this->taskZen->responseKanban($task, $from, $regionID); - } - return array('result' => 'success', 'message' => $this->lang->saveSuccess, 'load' => $this->createLink('task', 'view', "taskID=$taskID"), 'closeModal' => true); + /* Get the information returned after a task is started. */ + $response = $this->taskZen->responseAfterChangeStatus($task, $from); + $this->send($response); } if(!isset($this->view->members[$this->view->task->finishedBy])) $this->view->members[$this->view->task->finishedBy] = $this->view->task->finishedBy; // Ensure that the completion person is on the user list. @@ -1159,8 +1155,9 @@ class task extends control $this->view->teamMembers = $teamMembers; } - $this->view->title = $this->view->execution->name . $this->lang->colon . $this->lang->task->activate; - $this->view->users = $this->loadModel('user')->getPairs('noletter'); + $this->view->title = $this->view->execution->name . $this->lang->colon . $this->lang->task->activate; + $this->view->users = $this->loadModel('user')->getPairs('noletter'); + $this->view->isMultiple = !empty($this->view->task->team); $this->display(); } diff --git a/module/task/css/start.ui.css b/module/task/css/start.ui.css deleted file mode 100644 index 45f31075f6..0000000000 --- a/module/task/css/start.ui.css +++ /dev/null @@ -1 +0,0 @@ -#taskStartForm .no-background .input-group-addon {background: none;} diff --git a/module/task/model.php b/module/task/model.php index ec95ae09af..a5a1f51dd2 100755 --- a/module/task/model.php +++ b/module/task/model.php @@ -1772,14 +1772,14 @@ class taskModel extends model * 激活任务。 * Activate task. * - * @param object $task - * @param string $comment - * @param object $teamData - * @param string $drag + * @param object $task + * @param string $comment + * @param object $teamData + * @param string $drag * @access public * @return array|false */ - public function activate(object $task, string $comment, object $teamData, array $drag): array|false + public function activate(object $task, string $comment, object $teamData, array $drag = array()): array|false { $taskID = $task->id; diff --git a/module/task/test/model/activate.php b/module/task/test/model/activate.php index e16caed830..4c88a8024d 100755 --- a/module/task/test/model/activate.php +++ b/module/task/test/model/activate.php @@ -3,6 +3,14 @@ include dirname(__FILE__, 5) . '/test/lib/init.php'; include dirname(__FILE__, 2) . '/task.class.php'; +zdTable('project')->config('project')->gen(6); +zdTable('task')->config('task')->gen(9); +zdTable('taskteam')->config('taskteam')->gen(6); +zdTable('kanbanregion')->config('kanbanregion')->gen(1); +zdTable('kanbanlane')->config('kanbanlane')->gen(1); +zdTable('kanbancolumn')->config('kanbancolumn')->gen(7); +zdTable('kanbancell')->config('kanbancell')->gen(7); + /** title=taskModel->activate(); @@ -11,15 +19,38 @@ cid=1 */ -zdTable('task')->gen(10); -zdTable('project')->config('execution')->gen(10); -zdTable('story')->gen(30); +$accountList = array('admin', 'user1', 'user2', 'user3'); +$teamEstimateList = array(1, 2, 3, 4); +$teamConsumedList = array(4, 3, 2, 1); +$teamLeftList = array(0, 0, 0, 0); +$teamSourceList = array('admin', 'user1', 'user2', 'user3'); -$taskIDList = array(1, 3, 4, 5, 6); +$teamData = new stdclass(); +$teamData->team = $accountList; +$teamData->teamLeftList = $teamLeftList; +$teamData->teamSourceList = $teamSourceList; +$teamData->teamEstimateList = $teamEstimateList; +$teamData->teamConsumedList = $teamConsumedList; + +$emptyTeamData = new stdclass(); + +$drag = array('fromColID' => 1, 'toColID' => 2, 'fromLaneID' => 1, 'toLaneID' => 1); + +$taskIDList = range(1, 9); $task = new taskTest(); -r($task->activateTest($taskIDList[0])) && p('0:field,old,new') && e('status,wait,doing'); //wait状态任务激活 -r($task->activateTest($taskIDList[1])) && p('0:field,old,new') && e('status,done,doing'); //done状态任务激活 -r($task->activateTest($taskIDList[2])) && p('0:field,old,new') && e('status,pause,doing'); //pause状态任务激活 -r($task->activateTest($taskIDList[3])) && p('0:field,old,new') && e('status,cancel,doing'); //cancel状态任务激活 -r($task->activateTest($taskIDList[4])) && p('0:field,old,new') && e('status,closed,doing'); //closed状态任务激活 +r($task->activateTest($taskIDList[0], '', $emptyTeamData)) && p('0:field,old,new') && e('status,wait,doing'); // wait状态任务激活 +r($task->activateTest($taskIDList[1], '', $emptyTeamData)) && p('0:field,old,new') && e('left,1,3'); // doing状态任务激活 +r($task->activateTest($taskIDList[2], '', $emptyTeamData)) && p('0:field,old,new') && e('status,done,doing'); // done状态任务激活 +r($task->activateTest($taskIDList[3], '', $emptyTeamData)) && p('0:field,old,new') && e('status,cancel,doing'); // cancel状态任务激活 +r($task->activateTest($taskIDList[4], '', $emptyTeamData)) && p('0:field,old,new') && e('status,closed,doing'); // closed状态任务激活 +r($task->activateTest($taskIDList[7], '', $teamData)) && p('0:field,old,new') && e('status,wait,doing'); // wait状态串行任务激活 +r($task->activateTest($taskIDList[8], '', $teamData)) && p('0:field,old,new') && e('left,8,0'); // doing状态并行任务激活 + +r($task->activateTest($taskIDList[0], '', $emptyTeamData, $drag)) && p() && e('0'); // wait状态任务激活 +r($task->activateTest($taskIDList[1], '', $emptyTeamData, $drag)) && p() && e('0'); // doing状态任务激活 +r($task->activateTest($taskIDList[2], '', $emptyTeamData, $drag)) && p() && e('0'); // done状态任务激活 +r($task->activateTest($taskIDList[3], '', $emptyTeamData, $drag)) && p() && e('0'); // cancel状态任务激活 +r($task->activateTest($taskIDList[4], '', $emptyTeamData, $drag)) && p() && e('0'); // closed状态任务激活 +r($task->activateTest($taskIDList[7], '', $teamData, $drag)) && p('0:field,old,new') && e('status,wait,doing'); // wait状态串行任务激活 +r($task->activateTest($taskIDList[8], '', $teamData, $drag)) && p('0:field,old,new') && e('left,8,0'); // doing状态并行任务激活 diff --git a/module/task/test/model/managetaskteammember.php b/module/task/test/model/managetaskteammember.php index 354d08c8b9..3b7a889f88 100755 --- a/module/task/test/model/managetaskteammember.php +++ b/module/task/test/model/managetaskteammember.php @@ -18,9 +18,9 @@ $taskStatusList = array('wait', 'doing', 'done'); foreach($taskStatusList as $index => $status) { $taskName = "{$status}Task"; - $$taskName = new stdclass(); - $$taskName->id = $taskIdList[$index]; - $$taskName->status = $status; + $taskName = new stdclass(); + $taskName->id = $taskIdList[$index]; + $taskName->status = $status; } $account = array(array('admin', 'user1', 'user2', 'user3'), array('user4', 'user5', 'user6', 'user7', 'user9')); diff --git a/module/task/test/model/yaml/activate/execution.yaml b/module/task/test/model/yaml/activate/execution.yaml deleted file mode 100644 index c01c1e03cb..0000000000 --- a/module/task/test/model/yaml/activate/execution.yaml +++ /dev/null @@ -1,75 +0,0 @@ -title: table zt_execution -author: Zhu Jinyong -version: "1.0" -fields: - - field: id - range: 101-700 - - field: name - note: "名称" - fields: - - field: name1 - range: 迭代{30},阶段{30},看板{30} - - field: name2 - range: 1-10000 - - field: project - range: 11-100 - - field: model - range: [] - - field: type - range: sprint{30},stage{30},kanban{30} - - field: budget - range: 800000-1:100 - - field: status - range: wait,doing - - field: percent - range: 0{30},10{30},0{30} - - field: milestone - range: 0{30},1{10},0{10},1{10},0{30} - - field: auth - range: "extend" - - field: desc - range: 1-10000 - prefix: "迭代描述" - - field: begin - range: "(-2M)-(+M):1D" - type: timestamp - format: "YY/MM/DD" - postfix: "\t" - - field: end - range: "(+1w)-(+2M):1D" - type: timestamp - format: "YY/MM/DD" - postfix: "\t" - - field: grade - range: 1 - - field: parent - range: 11-40,41-70,71-100 - - field: path - fields: - - field: path1 - prefix: "," - range: 11-100 - - field: path2 - prefix: "," - range: 101-700 - postfix: "," - - field: acl - range: open{4},private{4} - - field: openedVersion - range: "16.5" - - field: whitelist - froms: - - from: common.user.v1.yaml - use: empty{8} - - from: common.user.v1.yaml - use: empty{8} - prefix: "," - - from: common.user.v1.yaml - use: one{8} - prefix: "," - - from: common.user.v1.yaml - use: two{8} - prefix: "," - - from: common.user.v1.yaml - use: three{8} - prefix: "," diff --git a/module/task/test/model/yaml/activate/kanbancell.yaml b/module/task/test/model/yaml/activate/kanbancell.yaml new file mode 100644 index 0000000000..d08a208f3a --- /dev/null +++ b/module/task/test/model/yaml/activate/kanbancell.yaml @@ -0,0 +1,19 @@ +--- +title: zt_kanbancell +author: Mengyi Liu +version: "1.0" +fields: +- field: id + range: 1-100 +- field: kanban + range: 11 +- field: lane + range: 1 +- field: column + range: 1-7 +- field: type + range: "task" +- field: cards + range: "[]" +... + diff --git a/module/task/test/model/yaml/activate/kanbancolumn.yaml b/module/task/test/model/yaml/activate/kanbancolumn.yaml new file mode 100644 index 0000000000..30d9d8d7f3 --- /dev/null +++ b/module/task/test/model/yaml/activate/kanbancolumn.yaml @@ -0,0 +1,19 @@ +--- +title: zt_kanbancolumn +author: Mengyi Liu +version: "1.0" +fields: +- field: id + range: 1-7 +- field: region + range: 1 +- field: type + range: wait,develop,developing,developed,pause,canceled,closed, +- field: parent + range: "0,`-1`,2{2},0{3}" +- field: name + range: 未开始,开发,研发中,研发完毕,已暂停,已取消,已关闭 +- field: limit + range: "`-1`" +... + diff --git a/module/task/test/model/yaml/activate/kanbanlane.yaml b/module/task/test/model/yaml/activate/kanbanlane.yaml new file mode 100644 index 0000000000..e9fbd9a9db --- /dev/null +++ b/module/task/test/model/yaml/activate/kanbanlane.yaml @@ -0,0 +1,19 @@ +--- +title: zt_kanbanlane +author: Mengyi Liu +version: "1.0" +fields: +- field: id + range: 1-10 +- field: execution + range: 11 +- field: type + range: "task" +- field: region + range: 1 +- field: lastEditedTime + range: "20220101 000000" + type: timestamp + format: "YY/MM/DD hh:mm:ss" +... + diff --git a/module/task/test/model/yaml/activate/kanbanregion.yaml b/module/task/test/model/yaml/activate/kanbanregion.yaml new file mode 100644 index 0000000000..300db12fd6 --- /dev/null +++ b/module/task/test/model/yaml/activate/kanbanregion.yaml @@ -0,0 +1,17 @@ +--- +title: zt_kanbanregion +author: Mengyi Liu +version: "1.0" +fields: +- field: id + range: 1-10 +- field: space + range: 0 +- field: kanban + range: 11 +- field: lastEditedDate + range: "20220101 000000" + type: timestamp + format: "YY/MM/DD hh:mm:ss" +... + diff --git a/module/task/test/model/yaml/activate/project.yaml b/module/task/test/model/yaml/activate/project.yaml new file mode 100755 index 0000000000..23b3bc32bd --- /dev/null +++ b/module/task/test/model/yaml/activate/project.yaml @@ -0,0 +1,19 @@ +title: zt_project +author: Mengyi Liu +version: "1.0" +fields: +- field: id + range: 1-6 +- field: type + range: "project{2},sprint{2},stage{2}" +- field: name + range: "项目1,项目2,迭代1,迭代2,阶段1,阶段2" +- field: project + range: "0{2},1{2},2{2}" +- field: model + range: "scrum,waterfall,[]{4}" +- field: path + range: "1,2,`1,3`,`1,4`,`2,5`, `2,6`" + prefix: ',' + postfix: ',' + diff --git a/module/task/test/model/yaml/activate/task.yaml b/module/task/test/model/yaml/activate/task.yaml new file mode 100755 index 0000000000..8c11712c61 --- /dev/null +++ b/module/task/test/model/yaml/activate/task.yaml @@ -0,0 +1,16 @@ +title: zt_task +author: Mengyi Liu +version: "1.0" +fields: +- field: execution + range: 3 +- field: story + range: 1,0{9} +- field: fromBug + range: 0,1,0{8} +- field: parent + range: "0{5},`-1`,6,0{2}" +- field: status + range: "wait,doing,done,cancel,closed,wait{3},doing" +- field: mode + range: "[]{7},linear,multi" diff --git a/module/task/test/model/yaml/activate/taskteam.yaml b/module/task/test/model/yaml/activate/taskteam.yaml new file mode 100755 index 0000000000..6aa4a6dc4e --- /dev/null +++ b/module/task/test/model/yaml/activate/taskteam.yaml @@ -0,0 +1,20 @@ +title: zt_taskteam +author: Shujie Tian +version: "1.0" +fields: +- field: task + range: 8{3},9{3} +- field: left + range: 1-10 +- field: estimate + range: 1-10 +- field: consumed + range: 0 +- field: account + fields: + - field: account1 + range: admin,user{2} + - field: account2 + range: "[],1-2" +- field: status + range: "wait{4},done{2}" diff --git a/module/task/test/task.class.php b/module/task/test/task.class.php index a1f877e254..37e60e27f3 100644 --- a/module/task/test/task.class.php +++ b/module/task/test/task.class.php @@ -258,31 +258,29 @@ class taskTest } /** - * Test activate a task. + * 激活任务。 + * Activate a task. * * @param int $taskID - * @param array $param + * @param string $comment + * @param object $teamData + * @param array $drag * @access public * @return array */ - public function activateTest(int $taskID, array $param = array()) + public function activateTest(int $taskID, string $comment = '', object $teamData = null, array $drag = array()): array { - $createFields = array('id' => $taskID, 'status' => 'doing','assignedTo' => '', 'left' => '3'); - foreach($createFields as $field => $defaultValue) $postData[$field] = $defaultValue; - foreach($param as $key => $value) $postData[$key] = $value; + global $tester; + $_SERVER['HTTP_HOST'] = $tester->config->db->host; - $comment = '单元测试'; - $teamData = new stdclass(); - $object = $this->objectModel->activate((object)$postData, $comment, $teamData, array()); - if(dao::isError()) - { - $error = dao::getError(); - return $error[0]; - } - else - { - return $object; - } + $task = new stdclass(); + $activateFields = array('id' => $taskID, 'status' => 'doing','assignedTo' => '', 'left' => '3'); + foreach($activateFields as $field => $defaultValue) $task->{$field} = $defaultValue; + + $changes = $this->objectModel->activate($task, $comment, $teamData, $drag); + + if(dao::isError()) return dao::getError(); + return $changes; } /** diff --git a/module/task/ui/activate.html.php b/module/task/ui/activate.html.php index ed996680c1..408cb9d1ae 100644 --- a/module/task/ui/activate.html.php +++ b/module/task/ui/activate.html.php @@ -54,9 +54,9 @@ if($task->parent != '-1') $leftBox = formGroup( set::width('1/4'), set::label($lang->task->left), + set::name('left'), inputControl ( - input(set::name('left')), to::suffix($lang->task->suffixHour), set::suffixWidth(20), ), diff --git a/module/task/zen.php b/module/task/zen.php index dc91974ffa..a9ed4b3059 100644 --- a/module/task/zen.php +++ b/module/task/zen.php @@ -1385,29 +1385,18 @@ class taskZen extends task } /** - * 准备激活任务数据。 - * Prepare to activate task data. + * 构造激活的任务数据。 + * Build the task data to activate. * - * @param form $taskData * @param int $taskID * @access protected * @return object */ - protected function prepareActivate(form $taskData, int $taskID): object + protected function buildTaskForActivate(int $taskID): object { - $task = $taskData - ->add('id', $taskID) - ->setDefault('status', 'doing') - ->setDefault('finishedBy, canceledBy, closedBy, closedReason', '') - ->setDefault('finishedDate, canceledDate, closedDate', null) - ->setDefault('lastEditedBy', $this->app->user->account) - ->setDefault('lastEditedDate', helper::now()) - ->setDefault('assignedDate', helper::now()) - ->setDefault('activatedDate', helper::now()) - ->stripTags($this->config->task->editor->activate['id'], $this->config->allowedTags) - ->get(); + $task = form::data($this->config->task->form->activate)->add('id', $taskID)->get(); - return $this->loadModel('file')->processImgURL($task, $this->config->task->editor->activate['id'], $taskData->field('uid')); + return $this->loadModel('file')->processImgURL($task, $this->config->task->editor->activate['id'], $this->post->uid); } /**