From d5981e565a61c39f1d930f5f4bbd0f6bd928934c Mon Sep 17 00:00:00 2001 From: zenggang Date: Fri, 5 May 2023 06:31:44 +0000 Subject: [PATCH] * Fix task edit --- module/task/config/form.php | 10 +- module/task/control.php | 34 +- .../test/model/getdataoftasksperexecution.php | 11 +- .../test/tao/getlistbyreportcondition.php | 74 ++ module/task/test/task.class.php | 1 + module/task/ui/edit.html.php | 635 +++++++++--------- module/task/zen.php | 82 +-- 7 files changed, 454 insertions(+), 393 deletions(-) create mode 100644 module/task/test/tao/getlistbyreportcondition.php diff --git a/module/task/config/form.php b/module/task/config/form.php index 28a69266a9..0914fe827a 100644 --- a/module/task/config/form.php +++ b/module/task/config/form.php @@ -8,19 +8,17 @@ $config->task->form->assign['left'] = array('type' => 'float', 'requir $config->task->form->assign['lastEditedBy'] = array('type' => 'string', 'required' => false, 'default' => $app->user->account); $config->task->form->assign['lastEditedDate'] = array('type' => 'string', 'required' => false, 'default' => helper::now()); $config->task->form->assign['assignedDate'] = array('type' => 'string', 'required' => false, 'default' => helper::now()); -$config->task->form->assign['comment'] = array('type' => 'text', 'required' => false, 'default' => ''); $config->task->form->edit = array(); $config->task->form->edit['name'] = array('type' => 'string', 'required' => true); $config->task->form->edit['color'] = array('type' => 'string', 'required' => false, 'default' => ''); $config->task->form->edit['desc'] = array('type' => 'string', 'required' => false, 'default' => ''); -$config->task->form->edit['comment'] = array('type' => 'string', 'required' => false, 'default' => ''); $config->task->form->edit['lastEditedBy'] = array('type' => 'string', 'required' => false, 'default' => $app->user->account); $config->task->form->edit['execution'] = array('type' => 'int', 'required' => true); $config->task->form->edit['story'] = array('type' => 'int', 'required' => false, 'default' => 0); $config->task->form->edit['module'] = array('type' => 'int', 'required' => false, 'default' => 0); $config->task->form->edit['parent'] = array('type' => 'int', 'required' => false, 'default' => 0); -$config->task->form->edit['mailto'] = array('type' => 'string', 'required' => false, 'default' => ''); +$config->task->form->edit['mailto'] = array('type' => 'array', 'required' => false, 'default' => array()); $config->task->form->edit['mode'] = array('type' => 'string', 'required' => false, 'default' => ''); $config->task->form->edit['assignedTo'] = array('type' => 'string', 'required' => false, 'default' => ''); $config->task->form->edit['type'] = array('type' => 'string', 'required' => true); @@ -39,9 +37,3 @@ $config->task->form->edit['canceledDate'] = array('type' => 'string', 'required' $config->task->form->edit['closedBy'] = array('type' => 'string', 'required' => false, 'default' => ''); $config->task->form->edit['closedReason'] = array('type' => 'string', 'required' => false, 'default' => ''); $config->task->form->edit['closedDate'] = array('type' => 'string', 'required' => false, 'default' => ''); -$config->task->form->edit['team'] = array('type' => 'array', 'required' => false, 'default' => array()); -$config->task->form->edit['teamSource'] = array('type' => 'array', 'required' => false, 'default' => array()); -$config->task->form->edit['teamEstimate'] = array('type' => 'array', 'required' => false, 'default' => array()); -$config->task->form->edit['teamConsumed'] = array('type' => 'array', 'required' => false, 'default' => array()); -$config->task->form->edit['teamLeft'] = array('type' => 'array', 'required' => false, 'default' => array()); -$config->task->form->edit['deleteFiles'] = array('type' => 'array', 'required' => false, 'default' => array()); diff --git a/module/task/control.php b/module/task/control.php index c8ec150352..eb50716d46 100755 --- a/module/task/control.php +++ b/module/task/control.php @@ -546,12 +546,11 @@ class task extends control * * @param int $taskID * @param string $comment - * @param string $kanbanGroup * @param string $from * @access public * @return void */ - public function edit($taskID, $comment = 'false', $kanbanGroup = 'default', $from = '') + public function edit(string $taskID, string $comment = 'false', string $from = '') { $this->commonAction($taskID); @@ -561,27 +560,28 @@ class task extends control $changes = array(); $postDataFixer = form::data($this->config->task->form->edit); - $postData = $postDataFixer->rawdata; + $rawData = $postDataFixer->rawdata; if(!$comment or $comment == 'false') { - $task = $this->taskZen->prepareCreateExtras($postDataFixer, $taskID); - $changes = $this->task->update($task, $postData); + $task = $this->taskZen->prepareEdit($postDataFixer, $taskID); + $changes = $this->task->update($task, $rawData); if(dao::isError()) return print(js::error(dao::getError())); } - if($postData->comment != '' or !empty($changes)) + if($rawData->comment != '' or !empty($changes)) { $action = !empty($changes) ? 'Edited' : 'Commented'; - $actionID = $this->action->create('task', $taskID, $action, $postData->comment); + $actionID = $this->action->create('task', $taskID, $action, $rawData->comment); if(!empty($changes)) $this->action->logHistory($actionID, $changes); } $this->executeHooks($taskID); - if($postData->status == 'doing') $this->loadModel('common')->syncPPEStatus($taskID); + if($rawData->status == 'doing') $this->loadModel('common')->syncPPEStatus($taskID); - return $this->taskZen->reponseAfterEdit($taskID, $from); + $reponse = $this->taskZen->reponseAfterEdit($taskID, $from, $changes); + return is_array($reponse) ? $this->send($reponse) : $reponse; } $this->taskZen->buildEditForm($taskID); @@ -736,7 +736,7 @@ class task extends control * @access public * @return void */ - public function assignTo($executionID, $taskID, $kanbanGroup = 'default', $from = '') + public function assignTo(int $executionID, int $taskID, string $kanbanGroup = 'default', string $from = '') { $this->commonAction($taskID); $task = $this->task->getByID($taskID); @@ -749,18 +749,22 @@ class task extends control if(!empty($_POST)) { $postDataFixer = form::data($this->config->task->form->assign); - $postData = $postDataFixer->rawdata; + $rawData = $postDataFixer->rawdata; - $task = $this->taskZen->prepareAssignToExtras($postDataFixer, $taskID); + $task = $this->taskZen->prepareAssignTo($postDataFixer, $taskID); $changes = $this->task->assign($task); - if(dao::isError()) return $this->taskZen->errorAfterAssignTo(); + if(dao::isError()) + { + if($this->viewType == 'json' or (defined('RUN_MODE') && RUN_MODE == 'api')) return $this->send(array('result' => 'fail', 'message' => dao::getError())); + return print(js::error(dao::getError())); + } - $actionID = $this->loadModel('action')->create('task', $taskID, 'Assigned', $postData->comment, $task->assignedTo); + $actionID = $this->loadModel('action')->create('task', $taskID, 'Assigned', $rawData->comment, $task->assignedTo); $this->action->logHistory($actionID, $changes); $this->executeHooks($taskID); - return $this->taskZen->reponseAfterAssignTo($taskID); + return $this->taskZen->reponseAfterAssignTo($taskID, $from); } $this->taskZen->buildAssignToForm($executionID, $task); diff --git a/module/task/test/model/getdataoftasksperexecution.php b/module/task/test/model/getdataoftasksperexecution.php index c4e6f4068c..abfe7c4214 100755 --- a/module/task/test/model/getdataoftasksperexecution.php +++ b/module/task/test/model/getdataoftasksperexecution.php @@ -39,14 +39,18 @@ title=taskModel->getDataOfTasksPerExecution(); timeout=0 cid=1 -- 执行task模块的getDataOfTasksPerExecution方法,参数是2 +- 统计executionID为2的执行的任务数量 - 第2条的name属性 @/迭代2 - 第2条的value属性 @1 -- 执行task模块的getDataOfTasksPerExecution方法,参数是3 +- 统计executionID为3的执行的任务数量 - 第3条的name属性 @/迭代3 - 第3条的value属性 @2 +- 统计executionID为5的执行的任务数量 + - 第5条的name属性 @0 + - 第5条的value属性 @0 + */ @@ -55,4 +59,5 @@ initData(); $tester->session->set('taskOnlyCondition', true); $task = new taskTest(); r($task->getDataOfTasksPerExecutionTest(2)) && p('2:name,value') && e('/迭代2,1'); //统计executionID为2的执行的任务数量 -r($task->getDataOfTasksPerExecutionTest(3)) && p('3:name,value') && e('/迭代3,2'); //统计executionID为3的执行的任务数量 \ No newline at end of file +r($task->getDataOfTasksPerExecutionTest(3)) && p('3:name,value') && e('/迭代3,2'); //统计executionID为3的执行的任务数量 +r($task->getDataOfTasksPerExecutionTest(5)) && p('5:name,value') && e('0,0'); //统计executionID为5的执行的任务数量 \ No newline at end of file diff --git a/module/task/test/tao/getlistbyreportcondition.php b/module/task/test/tao/getlistbyreportcondition.php new file mode 100644 index 0000000000..63e706859b --- /dev/null +++ b/module/task/test/tao/getlistbyreportcondition.php @@ -0,0 +1,74 @@ +#!/usr/bin/env php +id->range('2-5'); + $project->project->range('6-9'); + $project->name->prefix("迭代")->range('2-5'); + $project->code->prefix("project")->range('2-5'); + $project->auth->range("[]"); + $project->path->range("`,6,2,`,`,7,3,`,`,8,4,`,`,9,5,`"); + $project->type->range("sprint"); + $project->grade->range("1"); + $project->days->range("1"); + $project->status->range("wait"); + $project->desc->range("[]"); + $project->budget->range("100000,200000"); + $project->budgetUnit->range("CNY"); + $project->percent->range("0-0"); + + $project->gen(4); + + $task = zdTable('task'); + $task->id->range('2-5'); + $task->execution->range('2,3,3,4'); + $task->name->prefix("任务")->range('2-5'); + $task->status->range("wait"); + + $task->gen(4); +} + +function getCondition($executionID) +{ + return "execution = '{$executionID}' AND status IN ('','wait','doing','done','pause','cancel') AND deleted = '0'"; +} + +/** + +title=taskModel->getDataOfTasksPerExecution(); +timeout=0 +cid=1 + +- 获取任务id,execution列表信息在执行2中 + - 第2条的id属性 @2 + - 第2条的execution属性 @2 + +- 获取任务id,execution列表信息在执行4中 + - 第5条的id属性 @5 + - 第5条的execution属性 @4 + +- 获取任务id,execution列表信息在执行5中 + - 第5条的id属性 @0 + - 第5条的execution属性 @0 + +- 获取执行3的任务个数 @2 + + + +*/ + +initData(); + +$fieldList = array('execution'); +$executionIdList = array(2, 3, 4, 5); + +$task = $tester->loadModel('task'); +r($task->getListByReportCondition($fieldList[0], getCondition($executionIdList[0]))) && p('2:id,execution') && e('2,2'); //获取任务id,execution列表信息在执行2中 +r($task->getListByReportCondition($fieldList[0], getCondition($executionIdList[2]))) && p('5:id,execution') && e('5,4'); //获取任务id,execution列表信息在执行4中 +r($task->getListByReportCondition($fieldList[0], getCondition($executionIdList[3]))) && p('5:id,execution') && e('0,0'); //获取任务id,execution列表信息在执行5中 +$taskList = $task->getListByReportCondition($fieldList[0], getCondition($executionIdList[1])); +r(count($taskList)) && p() && e(2); //获取执行3的任务个数 \ No newline at end of file diff --git a/module/task/test/task.class.php b/module/task/test/task.class.php index 3e5585435f..519286db12 100644 --- a/module/task/test/task.class.php +++ b/module/task/test/task.class.php @@ -292,6 +292,7 @@ class taskTest foreach($param as $key => $value) $_POST[$key] = $value; $task = $_POST; + $task['id'] = $taskID; unset($task['comment']); $object = $this->objectModel->assign((object)$task, $taskID); unset($_POST); diff --git a/module/task/ui/edit.html.php b/module/task/ui/edit.html.php index 4140664979..8e164412bf 100644 --- a/module/task/ui/edit.html.php +++ b/module/task/ui/edit.html.php @@ -47,32 +47,19 @@ if($task->status == 'wait' and $task->parent == 0) } else { - if($task->mode == '') - { - $modeOptions = $lang->task->editModeList['single']; - } - else - { - $modeOptions = zget($lang->task->editModeList, $task->mode); - } + $modeText = $task->mode == '' ? $lang->task->editModeList['single'] : zget($lang->task->editModeList, $task->mode); } $assignedToOptions = $taskMembers; $typeOptions = $lang->task->typeList; $statusOptions = (array)$lang->task->statusList; $priOptions = $lang->task->priList; -$mailtoOptions = $task->mailto; +$mailtoOptions = $users; $contactListMenuOptions = $contactLists; $finishedByOptions = $members; $canceledByOptions = $users; $closedByOptions = $users; $closedReasonOptions = $lang->task->reasonList; -$teamOptions = array(array('value' => "", 'text' => ""), array('value' => "zenggang", 'text' => "Z:曾刚")); -$teamOptions = array(array('value' => "", 'text' => ""), array('value' => "zenggang", 'text' => "Z:曾刚")); -$teamOptions = array(array('value' => "", 'text' => ""), array('value' => "zenggang", 'text' => "Z:曾刚")); -$teamOptions = array(array('value' => "", 'text' => ""), array('value' => "zenggang", 'text' => "Z:曾刚")); -$teamOptions = array(array('value' => "", 'text' => ""), array('value' => "zenggang", 'text' => "Z:曾刚")); -$teamOptions = array(array('value' => "", 'text' => ""), array('value' => "zenggang", 'text' => "Z:曾刚")); - +$teamOptions = $members; /* ====== Define the page structure with zin widgets ====== */ @@ -80,344 +67,360 @@ $teamOptions = array(array('value' => "", 'text' => ""), array('value' => "zengg formPanel ( set::title($formTitle), // The form title is diffrent from the page title, - formGroup + setStyle(['max-width' => '100%']), + div ( - set::width("1/4"), - set::name("execution"), - set::label("所属执行"), - set::required(true), - set::value("50"), - set::control("picker"), - set::items($executionOptions) - ), - formGroup + setClass('flex'), + cell ( - set::width("1/4"), - set::name("module"), - set::label("所属模块"), - set::value("0"), - set::control("picker"), - set::items($moduleOptions) - ), - formGroup - ( - set::width("1/4"), - set::name("story"), - set::label("相关软件需求"), - set::control("picker"), - set::items($storyOptions) - ), - formGroup - ( - set::width("1/4"), - set::name("mode"), - set::label("任务模式"), - set::value("linear"), - set::control("picker"), - set::items($modeOptions) - ), - formGroup - ( - set::width("1/4"), - set::label("指派给"), - inputGroup - ( - control(set(array - ( - 'name' => "assignedTo", - 'id' => "assignedTo", - 'value' => "zenggang", - 'disabled' => true, - 'type' => "picker", - 'items' => $assignedToOptions - ))), - btn(set(array - ( - 'type' => "btn", - 'text' => "团队", - 'class' => "input-group-btn team-group" - ))) - ) - ), - formGroup - ( - set::width("1/4"), - set::name("type"), - set::label("任务类型"), - set::required(true), - set::value("study"), - set::control("picker"), - set::items($typeOptions) - ), - formGroup - ( - set::width("1/4"), - set::name("status"), - set::label("任务状态"), - set::value("wait"), - set::control("picker"), - set::items($statusOptions) - ), - formGroup - ( - set::width("1/4"), - set::name("pri"), - set::label("优先级"), - set::value("3"), - set::control("picker"), - set::items($priOptions) - ), - formGroup - ( - set::width("1/4"), - set::label("抄送给"), - inputGroup - ( - control(set(array - ( - 'name' => "mailto[]", - 'id' => "mailto", - 'value' => NULL, - 'disabled' => false, - 'type' => "picker", - 'items' => $mailtoOptions, - 'multiple' => true - ))), - control(set(array - ( - 'name' => "contactListMenu", - 'id' => "contactListMenu", - 'value' => "", - 'disabled' => false, - 'type' => "picker", - 'onchange' => "setMailto", - 'items' => $contactListMenuOptions - ))) - ) - ), - formGroup - ( - set::width("1/4"), - set::name("estStarted"), - set::label("预计开始"), - set::value("2023-04-25"), - set::control("date") - ), - formGroup - ( - set::width("1/4"), - set::name("deadline"), - set::label("截止日期"), - set::value("2023-04-28"), - set::control("date") - ), - formGroup - ( - set::width("1/4"), - set::name("estimate"), - set::label("最初预计"), - set::value("7"), - set::control("text") - ), - formGroup - ( - set::width("1/4"), - set::name("left"), - set::label("预计剩余"), - set::value("7"), - set::control("text") - ), - formGroup - ( - set::width("1/4"), - set::name("realStarted"), - set::label("实际开始"), - set::value("2023-04-24 17:25:00"), - set::control("datetime") - ), - formGroup - ( - set::width("1/4"), - set::name("finishedBy"), - set::label("由谁完成"), - set::control("picker"), - set::items($finishedByOptions) - ), - formGroup - ( - set::width("1/4"), - set::name("finishedDate"), - set::label("实际完成"), - set::value("0000-00-00 00:00:00"), - set::control("datetime") - ), - formGroup - ( - set::width("1/4"), - set::name("canceledBy"), - set::label("由谁取消"), - set::control("picker"), - set::items($canceledByOptions) - ), - formGroup - ( - set::width("1/4"), - set::name("canceledDate"), - set::label("取消时间"), - set::value("0000-00-00 00:00:00"), - set::control("datetime") - ), - formGroup - ( - set::width("1/4"), - set::name("closedBy"), - set::label("由谁关闭"), - set::control("picker"), - set::items($closedByOptions) - ), - formGroup - ( - set::width("1/4"), - set::name("closedReason"), - set::label("关闭原因"), - set::control("picker"), - set::items($closedReasonOptions) - ), - formGroup - ( - set::width("1/4"), - set::name("closedDate"), - set::label("关闭时间"), - set::value("0000-00-00 00:00:00"), - set::control("datetime") - ), - formRow - ( - set::hidden(true), + set('width', '67%'), formGroup ( - set::width("1/4"), - set::name("team[]"), - set::value("zenggang"), - set::control("picker"), - set::id("team"), - set::items($teamOptions) + set::label($lang->task->name), + set::name('name'), + set::value($task->name), + set::placeholder($lang->task->name), + set::control('input'), + set::required(true), + set::autofocus(true), ), formGroup ( - set::width("1/4"), - inputGroup - ( - - ) - ) - ), - formRow - ( - set::hidden(true), - formGroup - ( - set::width("1/4"), - set::name("team[]"), - set::value("zenggang"), - set::control("picker"), - set::id("team"), - set::items($teamOptions) + set::label($lang->task->desc), + set::name('desc'), + set::value(htmlSpecialString($task->desc)), + set::control('textarea'), ), formGroup ( - set::width("1/4"), - inputGroup - ( - - ) + set::label($lang->comment), + set::name('comment'), + set::value(''), + set::control('textarea'), + ), + history + ( + set::actions($actions), + set::users($users), + set::methodName($methodName), ) ), - formRow + cell ( - set::hidden(true), + on::change('#execution'), + set('width', '33%'), formGroup ( - set::width("1/4"), - set::name("team[]"), + set::name("execution"), + set::label($lang->task->execution), + set::required(true), + set::value($task->execution), set::control("picker"), - set::id("team"), - set::items($teamOptions) + set::items($executionOptions) ), formGroup ( - set::width("1/4"), - inputGroup - ( - - ) - ) - ), - formRow - ( - set::hidden(true), - formGroup - ( - set::width("1/4"), - set::name("team[]"), + set::name("module"), + set::label($lang->task->module), + set::value($task->module), set::control("picker"), - set::id("team"), - set::items($teamOptions) + set::items($moduleOptions) ), formGroup ( - set::width("1/4"), - inputGroup - ( - - ) - ) - ), - formRow - ( - set::hidden(true), - formGroup - ( - set::width("1/4"), - set::name("team[]"), + set::name("story"), + set::label($lang->task->story), + set::value($task->story), set::control("picker"), - set::id("team"), - set::items($teamOptions) + set::items($storyOptions) + ), + (empty($modeText)) + ? formGroup + ( + set::name("mode"), + set::label($lang->task->mode), + set::value($task->mode), + set::control("picker"), + set::items($modeOptions) + ) + : label + ( + $modeText ), formGroup ( - set::width("1/4"), + set::label($lang->task->assignedTo), inputGroup ( - + control(set(array + ( + 'name' => "assignedTo", + 'id' => "assignedTo", + 'value' => $task->assignedTo, + 'disabled' => (!empty($task->team) and $task->mode == 'linear') ? true : false, + 'type' => "picker", + 'items' => $assignedToOptions + ))), + btn(set(array + ( + 'type' => "btn", + 'text' => $lang->task->team, + 'class' => "input-group-btn team-group" + ))) ) - ) - ), - formRow - ( - set::hidden(true), - formGroup - ( - set::width("1/4"), - set::name("team[]"), - set::control("picker"), - set::id("team"), - set::items($teamOptions) ), formGroup ( - set::width("1/4"), + set::name("type"), + set::label($lang->task->type), + set::required(true), + set::value($task->type), + set::control("picker"), + set::items($typeOptions) + ), + empty($task->children) + ? formGroup + ( + set::name("status"), + set::label($lang->task->status), + set::value($task->status), + set::control("picker"), + set::items($statusOptions) + ) + : null, + formGroup + ( + set::name("pri"), + set::label($lang->task->pri), + set::value($task->pri), + set::control("picker"), + set::items($priOptions) + ), + formGroup + ( + set::label($lang->task->mailto), inputGroup ( + control(set(array + ( + 'name' => "mailto[]", + 'id' => "mailto", + 'value' => $task->mailto, + 'type' => "picker", + 'items' => $mailtoOptions, + 'multiple' => true + ))), + control(set(array + ( + 'name' => "contactListMenu", + 'id' => "contactListMenu", + 'value' => "", + 'disabled' => false, + 'type' => "picker", + 'onchange' => "setMailto", + 'items' => $contactListMenuOptions + ))) + ) + ), + formGroup + ( + set::name("estStarted"), + set::label($lang->task->estStarted), + set::value($task->estStarted), + set::control("date") + ), + formGroup + ( + set::name("deadline"), + set::label($lang->task->deadline), + set::value($task->deadline), + set::control("date") + ), + formGroup + ( + set::name("estimate"), + set::label($lang->task->estimate), + set::value($task->estimate), + set::control("text") + ), + formGroup + ( + set::name("left"), + set::label($lang->task->left), + set::value($task->left), + set::control("text") + ), + formGroup + ( + set::name("realStarted"), + set::label($lang->task->realStarted), + set::value(helper::isZeroDate($task->realStarted) ? '' : $task->realStarted), + set::control("datetime") + ), + formGroup + ( + set::name("finishedBy"), + set::label($lang->task->finishedBy), + set::value($task->finishedBy), + set::control("picker"), + set::items($finishedByOptions) + ), + formGroup + ( + set::name("finishedDate"), + set::label($lang->task->finishedDate), + set::value($task->finishedDate), + set::control("datetime") + ), + formGroup + ( + set::name("canceledBy"), + set::label($lang->task->canceledBy), + set::value($task->canceledBy), + set::control("picker"), + set::items($canceledByOptions) + ), + formGroup + ( + set::name("canceledDate"), + set::label($lang->task->canceledDate), + set::value($task->canceledDate), + set::control("datetime") + ), + formGroup + ( + set::name("closedBy"), + set::label($lang->task->closedBy), + set::value($task->closedBy), + set::control("picker"), + set::items($closedByOptions) + ), + formGroup + ( + set::name("closedReason"), + set::label($lang->task->closedReason), + set::value($task->closedReason), + set::control("picker"), + set::items($closedReasonOptions) + ), + formGroup + ( + set::name("closedDate"), + set::label($lang->task->closedDate), + set::value($task->closedDate), + set::control("datetime") + ), + formRow + ( + set::hidden(true), + formGroup + ( + set::name("team[]"), + set::value("zenggang"), + set::control("picker"), + set::id("team"), + set::items($teamOptions) + ), + formGroup + ( + inputGroup + ( + ) + ) + ), + formRow + ( + set::hidden(true), + formGroup + ( + set::name("team[]"), + set::value("zenggang"), + set::control("picker"), + set::id("team"), + set::items($teamOptions) + ), + formGroup + ( + inputGroup + ( + + ) + ) + ), + formRow + ( + set::hidden(true), + formGroup + ( + set::name("team[]"), + set::control("picker"), + set::id("team"), + set::items($teamOptions) + ), + formGroup + ( + inputGroup + ( + + ) + ) + ), + formRow + ( + set::hidden(true), + formGroup + ( + set::name("team[]"), + set::control("picker"), + set::id("team"), + set::items($teamOptions) + ), + formGroup + ( + inputGroup + ( + + ) + ) + ), + formRow + ( + set::hidden(true), + formGroup + ( + set::name("team[]"), + set::control("picker"), + set::id("team"), + set::items($teamOptions) + ), + formGroup + ( + inputGroup + ( + + ) + ) + ), + formRow + ( + set::hidden(true), + formGroup + ( + set::name("team[]"), + set::control("picker"), + set::id("team"), + set::items($teamOptions) + ), + formGroup + ( + inputGroup + ( + + ) ) ) - ), - history - ( - set::actions($actions), - set::users($users), - set::methodName($methodName), + ) ) ); diff --git a/module/task/zen.php b/module/task/zen.php index 30a9070844..3c34051fcd 100644 --- a/module/task/zen.php +++ b/module/task/zen.php @@ -12,31 +12,23 @@ declare(strict_types=1); class taskZen extends task { /** - * prepareCreateExtras + * 准备创建数据。 + * Prepare edit data. * - * @param object $postData - * @param int $taskID + * @param form $postDataFixer + * @param int $taskID * @access protected - * @return void + * @return object */ - protected function prepareCreateExtras(object $postDataFixer, int $taskID) + protected function prepareEdit(form $postDataFixer, int $taskID): object { $oldTask = $this->task->getByID($taskID); $now = helper::now(); $postData = $postDataFixer->get(); $task = $postDataFixer->add('id', $taskID) - ->setIF(!$postData->assignedTo and !empty($oldTask->team) and !empty($postData->team), 'assignedTo', $this->task->getAssignedTo4Multi($postData->team, $oldTask)) - ->setIF(!$oldTask->mode and !$postData->assignedTo and !empty($postData->team), 'assignedTo', $postData->team[0]) - ->setIF(is_numeric($postData->estimate), 'estimate', (float)$postData->estimate) - ->setIF(is_numeric($postData->consumed), 'consumed', (float)$postData->consumed) - ->setIF(is_numeric($postData->left), 'left', (float)$postData->left) + ->setIF(!$postData->assignedTo and !empty($oldTask->team) and !empty($postDataFixer->rawdata->team), 'assignedTo', $this->task->getAssignedTo4Multi($postDataFixer->rawdata->team, $oldTask)) + ->setIF(!$oldTask->mode and !$postData->assignedTo and !empty($postDataFixer->rawdata->team), 'assignedTo', $postDataFixer->rawdata->team[0]) ->setIF($oldTask->parent == 0 && $postData->parent == '', 'parent', 0) - ->setIF(strpos($this->config->task->edit->requiredFields, 'estStarted') !== false, 'estStarted', $postData->estStarted) - ->setIF(strpos($this->config->task->edit->requiredFields, 'deadline') !== false, 'deadline', $postData->deadline) - ->setIF(strpos($this->config->task->edit->requiredFields, 'estimate') !== false, 'estimate', $postData->estimate) - ->setIF(strpos($this->config->task->edit->requiredFields, 'left') !== false, 'left', $postData->left) - ->setIF(strpos($this->config->task->edit->requiredFields, 'consumed') !== false, 'consumed', $postData->consumed) - ->setIF(strpos($this->config->task->edit->requiredFields, 'story') !== false, 'story', $postData->story) ->setIF($postData->story != false and $postData->story != $oldTask->story, 'storyVersion', $this->loadModel('story')->getVersion($postData->story)) ->setIF($postData->mode == 'single', 'mode', '') @@ -65,7 +57,6 @@ class taskZen extends task ->add('lastEditedDate', $now) ->stripTags($this->config->task->editor->edit['id'], $this->config->allowedTags) ->join('mailto', ',') - ->remove('comment,files,labels,uid,multiple,team,teamEstimate,teamConsumed,teamLeft,teamSource,contactListMenu') ->get(); return $task; @@ -75,11 +66,13 @@ class taskZen extends task * 编辑任务后返回响应. * Reponse after edit. * - * @param object $task + * @param int $taskID + * @param string $from + * @param array[] $changes * @access protected * @return int */ - protected function reponseAfterEdit(int $taskID, string $from): int + protected function reponseAfterEdit(int $taskID, string $from, array $changes) { $task = $this->task->getById($taskID); if($task->fromBug != 0) @@ -121,7 +114,7 @@ class taskZen extends task return print(js::reload('parent.parent')); } - if(defined('RUN_MODE') && RUN_MODE == 'api') return $this->send(array('status' => 'success', 'data' => $taskID)); + if(defined('RUN_MODE') && RUN_MODE == 'api') return array('status' => 'success', 'data' => $taskID); return print(js::locate($this->createLink('task', 'view', "taskID=$taskID"), 'parent')); } @@ -135,24 +128,23 @@ class taskZen extends task */ protected function buildEditForm(int $taskID): void { - $task = $this->task->getById($taskID); - - $tasks = $this->task->getParentTaskPairs($this->view->execution->id, $this->view->task->parent); + $task = $this->view->task; + $tasks = $this->task->getParentTaskPairs($this->view->execution->id, $task->parent); if(isset($tasks[$taskID])) unset($tasks[$taskID]); - if(!isset($this->view->members[$this->view->task->assignedTo])) $this->view->members[$this->view->task->assignedTo] = $this->view->task->assignedTo; - if(isset($this->view->members['closed']) or $this->view->task->status == 'closed') $this->view->members['closed'] = 'Closed'; + if(!isset($this->view->members[$task->assignedTo])) $this->view->members[$task->assignedTo] = $task->assignedTo; + if(isset($this->view->members['closed']) or $task->status == 'closed') $this->view->members['closed'] = 'Closed'; - $executions = array(); - if(!empty($task->project)) $executions = $this->execution->getByProject($task->project, 'all', 0, true); + $executions = !empty($task->project) ? $this->execution->getByProject($task->project, 'all', 0, true) : array(); + /* Get task members. */ $taskMembers = array(); if(!empty($task->team)) { $teamAccounts = $task->members; foreach($teamAccounts as $teamAccount) { - if(!isset($members[$teamAccount])) continue; + if(!isset($this->view->members[$teamAccount])) continue; $taskMembers[$teamAccount] = $this->view->members[$teamAccount]; } } @@ -167,39 +159,40 @@ class taskZen extends task $this->view->stories = $this->story->getExecutionStoryPairs($this->view->execution->id, 0, 'all', '', 'full', 'active'); $this->view->tasks = $tasks; $this->view->taskMembers = $taskMembers; - $this->view->users = $this->loadModel('user')->getPairs('nodeleted|noclosed', "{$this->view->task->openedBy},{$this->view->task->canceledBy},{$this->view->task->closedBy}"); + $this->view->users = $this->loadModel('user')->getPairs('nodeleted|noclosed', "{$task->openedBy},{$task->canceledBy},{$task->closedBy}"); $this->view->showAllModule = isset($this->config->execution->task->allModule) ? $this->config->execution->task->allModule : ''; - $this->view->modules = $this->tree->getTaskOptionMenu($this->view->task->execution, 0, 0, $this->view->showAllModule ? 'allModule' : ''); + $this->view->modules = $this->tree->getTaskOptionMenu($task->execution, 0, 0, $this->view->showAllModule ? 'allModule' : ''); $this->view->executions = $executions; $this->view->contactLists = $this->loadModel('user')->getContactLists($this->app->user->account, 'withnote'); $this->display(); } /** - * prepareAssignToExtras + * 准备指派给的数据. + * Prepare assignto data. * - * @param object $postDataFixer - * @param int $taskID + * @param form $postDataFixer + * @param int $taskID * @access protected - * @return void + * @return object */ - protected function prepareAssignToExtras(object $postDataFixer, int $taskID) + protected function prepareAssignTo(form $postDataFixer, int $taskID): object { $task = $postDataFixer->add('id', $taskID) ->stripTags($this->config->task->editor->assignto['id'], $this->config->allowedTags) - ->remove('comment,showModule') ->get(); return $task; } /** + * 指派后返回响应. * Reponse after assignto. * * @param int $taskID * @access protected - * @return void + * @return int */ - protected function reponseAfterAssignTo(int $taskID): int + protected function reponseAfterAssignTo(int $taskID, string $from) { if($this->viewType == 'json' or (defined('RUN_MODE') && RUN_MODE == 'api')) return $this->send(array('result' => 'success')); if(isonlybody()) @@ -232,18 +225,7 @@ class taskZen extends task } /** - * Return the error after assignto. - * - * @access protected - * @return void - */ - protected function errorAfterAssignTo(): int - { - if($this->viewType == 'json' or (defined('RUN_MODE') && RUN_MODE == 'api')) return $this->send(array('result' => 'fail', 'message' => dao::getError())); - return print(js::error(dao::getError())); - } - - /** + * 构建指派给表格。 * Build AssignTo Form. * * @param int $executionID