From 73510d72bd5ae8b76a0cece05da093d7e6b6935b Mon Sep 17 00:00:00 2001 From: zenggang Date: Fri, 12 May 2023 09:28:46 +0000 Subject: [PATCH] * Task activate batchupdate method and unit --- module/task/config/form.php | 24 ++++ module/task/control.php | 51 +++----- module/task/css/edit.ui.css | 10 +- module/task/model.php | 160 ++++++++++--------------- module/task/test/model/activate.php | 5 +- module/task/test/model/batchupdate.php | 23 ++-- module/task/test/model/update.php | 57 +++++++-- module/task/test/model/updateteam.php | 18 +-- module/task/test/task.class.php | 64 +++++----- module/task/ui/edit.html.php | 60 ++++++---- module/task/zen.php | 30 ++++- 11 files changed, 277 insertions(+), 225 deletions(-) diff --git a/module/task/config/form.php b/module/task/config/form.php index c1c28e16a7..c41cd73c8e 100644 --- a/module/task/config/form.php +++ b/module/task/config/form.php @@ -77,6 +77,25 @@ $config->task->form->team->edit['teamConsumed'] = array('type' => 'array', 'requ $config->task->form->team->edit['teamLeft'] = array('type' => 'array', 'required' => false, 'default' => array()); $config->task->form->team->edit['deleteFiles'] = array('type' => 'array', 'required' => false, 'default' => array()); +$config->task->form->batchEdit = array(); +$config->task->form->batchEdit['taskIDList'] = array('type' => 'array', 'required' => false, 'default' => array()); +$config->task->form->batchEdit['modules'] = array('type' => 'array', 'required' => false, 'default' => array()); +$config->task->form->batchEdit['names'] = array('type' => 'array', 'required' => true, 'default' => array()); +$config->task->form->batchEdit['colors'] = array('type' => 'array', 'required' => false, 'default' => array()); +$config->task->form->batchEdit['types'] = array('type' => 'array', 'required' => true, 'default' => array()); +$config->task->form->batchEdit['statuses'] = array('type' => 'array', 'required' => false, 'default' => array()); +$config->task->form->batchEdit['assignedTos'] = array('type' => 'array', 'required' => false, 'default' => array()); +$config->task->form->batchEdit['estimates'] = array('type' => 'array', 'required' => false, 'default' => array()); +$config->task->form->batchEdit['estStarteds'] = array('type' => 'array', 'required' => false, 'default' => array()); +$config->task->form->batchEdit['consumeds'] = array('type' => 'array', 'required' => false, 'default' => array()); +$config->task->form->batchEdit['lefts'] = array('type' => 'array', 'required' => false, 'default' => array()); +$config->task->form->batchEdit['finishedBys'] = array('type' => 'array', 'required' => false, 'default' => array()); +$config->task->form->batchEdit['canceledBys'] = array('type' => 'array', 'required' => false, 'default' => array()); +$config->task->form->batchEdit['closedBys'] = array('type' => 'array', 'required' => false, 'default' => array()); +$config->task->form->batchEdit['closedReasons'] = array('type' => 'array', 'required' => false, 'default' => array()); +$config->task->form->batchEdit['deadlines'] = array('type' => 'array', 'required' => false, 'default' => array()); +$config->task->form->batchEdit['pris'] = array('type' => 'array', 'required' => false, 'default' => array()); + $config->task->form->batchCreate = array(); $config->task->form->batchCreate['module'] = array('type' => 'array', 'required' => false, 'default' => array()); $config->task->form->batchCreate['parent'] = array('type' => 'array', 'required' => false, 'default' => array()); @@ -98,3 +117,8 @@ $config->task->form->pause = array(); $config->task->form->pause['lastEditedBy'] = array('type' => 'string', 'required' => false, 'default' => $app->user->account); $config->task->form->pause['lastEditedDate'] = array('type' => 'string', 'required' => false, 'default' => helper::now()); $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); diff --git a/module/task/control.php b/module/task/control.php index aa7ee58849..048d67cbc1 100755 --- a/module/task/control.php +++ b/module/task/control.php @@ -1147,26 +1147,28 @@ class task extends control * Activate a task. * * @param int $taskID - * @param string $extra + * @param string $cardPosition + * @param string $from * @access public * @return void */ - public function activate($taskID, $extra = '') + public function activate($taskID, $cardPosition = '', $drag = '', $from = '') { $this->taskZen->commonAction($taskID); - - $extra = str_replace(array(',', ' '), array('&', ''), $extra); - parse_str($extra, $output); + if($cardPosition) list($regionID) = $cardPosition; if(!empty($_POST)) { - $this->loadModel('action'); - $changes = $this->task->activate($taskID, $extra); + $taskData = form::data($this->config->task->form->acivate); + $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, $drag); if(dao::isError()) return print(js::error(dao::getError())); if($this->post->comment != '' or !empty($changes)) { - $actionID = $this->action->create('task', $taskID, 'Activated', $this->post->comment); + $actionID = $this->loadModel('action')->create('task', $taskID, 'Activated', $this->post->comment); $this->action->logHistory($actionID, $changes); } @@ -1174,36 +1176,16 @@ class task extends control if(isonlybody()) { - $task = $this->task->getById($taskID); - $execution = $this->execution->getByID($task->execution); - $executionLaneType = $this->session->executionLaneType ? $this->session->executionLaneType : 'all'; - $executionGroupBy = $this->session->executionGroupBy ? $this->session->executionGroupBy : 'default'; - if(($this->app->tab == 'execution' or ($this->config->vision == 'lite' and $this->app->tab == 'project')) and $execution->type == "kanban") - { - $rdSearchValue = $this->session->rdSearchValue ? $this->session->rdSearchValue : ''; - $regionID = !empty($output['regionID']) ? $output['regionID'] : 0; - $kanbanData = $this->loadModel('kanban')->getRDKanban($task->execution, $executionLaneType, 'id_desc', $regionID, $executionGroupBy, $rdSearchValue); - $kanbanData = json_encode($kanbanData); - - return print(js::closeModal('parent.parent', '', "parent.parent.updateKanban($kanbanData, $regionID)")); - } - if($output['from'] == "taskkanban") - { - $taskSearchValue = $this->session->taskSearchValue ? $this->session->taskSearchValue : ''; - $kanbanData = $this->loadModel('kanban')->getExecutionKanban($task->execution, $executionLaneType, $executionGroupBy, $taskSearchValue); - $kanbanType = $executionLaneType == 'all' ? 'task' : key($kanbanData); - $kanbanData = $kanbanData[$kanbanType]; - $kanbanData = json_encode($kanbanData); - - return print(js::closeModal('parent.parent', '', "parent.parent.updateKanban(\"task\", $kanbanData)")); - } - return print(js::closeModal('parent.parent', 'this')); + $task = $this->task->getById($taskID); + $regionID = !empty($regionID) ? (int)$regionID : 0; + return $this->taskZen->responseKanban($task, $from, $regionID); } - return print(js::locate($this->createLink('task', 'view', "taskID=$taskID"), 'parent')); + return array('result' => 'success', 'message' => $this->lang->saveSuccess, 'load' => $this->createLink('task', 'view', "taskID=$taskID"), 'closeModal' => true); } - if(!isset($this->view->members[$this->view->task->finishedBy])) $this->view->members[$this->view->task->finishedBy] = $this->view->task->finishedBy; + 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. + /* Get task teammembers. */ if(!empty($this->view->task->team)) { $teamAccounts = array_column($this->view->task->team, 'account'); @@ -1214,6 +1196,7 @@ class task extends control } $this->view->teamMembers = $teamMembers; } + $this->view->title = $this->view->execution->name . $this->lang->colon . $this->lang->task->activate; $this->view->position[] = $this->lang->task->activate; $this->view->users = $this->loadModel('user')->getPairs('noletter'); diff --git a/module/task/css/edit.ui.css b/module/task/css/edit.ui.css index 5492e1306d..e38143323d 100644 --- a/module/task/css/edit.ui.css +++ b/module/task/css/edit.ui.css @@ -1,9 +1 @@ -.pl-10px {padding-left: 10px;} -#showAllModuleBox{width:60px;} -#showAllModuleBox .no-margin {padding-left:22px;} -#taskTeamEditor .sortable .input-group .input-group-addon.required:after {top: 10px; right: 2px; z-index: 3;} -#storyIdBox .chosen-container .chosen-drop.chosen-no-wrap>.chosen-results>li {text-overflow: unset;} - -#modalTeam .modal-content {padding: 20px 13px 0; height: 340px;max-height: 296px!important; overflow-y: scroll!important;} -#taskTeamEditor tr .input-control {display: inline-block; width: 130px;} -#taskTeamEditor h2 {margin-top:0;} +.span-text {height: 2em; align-items: center; display: flex;} diff --git a/module/task/model.php b/module/task/model.php index cb5c27b3fd..b62f220130 100755 --- a/module/task/model.php +++ b/module/task/model.php @@ -712,66 +712,67 @@ class taskModel extends model } /** - * Batch update task. + * 批量更新任务。 + * Batch update tasks. * + * @param object $postData * @access public - * @return void + * @return array[]|false */ - public function batchUpdate() + public function batchUpdate(object $postData): array|false { $tasks = array(); $allChanges = array(); $now = helper::now(); $today = date(DT_DATE1); - $data = fixer::input('post')->get(); - $taskIDList = $this->post->taskIDList; + $taskIdList = $postData->taskIDList; /* Process data if the value is 'ditto'. */ - foreach($taskIDList as $taskID) + foreach($taskIdList as $taskID) { - if(isset($data->modules[$taskID]) and ($data->modules[$taskID] == 'ditto')) $data->modules[$taskID] = isset($prev['module']) ? $prev['module'] : 0; - if($data->types[$taskID] == 'ditto') $data->types[$taskID] = isset($prev['type']) ? $prev['type'] : ''; - if($data->pris[$taskID] == 'ditto') $data->pris[$taskID] = isset($prev['pri']) ? $prev['pri'] : 0; - if($data->finishedBys[$taskID] == 'ditto') $data->finishedBys[$taskID] = isset($prev['finishedBy']) ? $prev['finishedBy'] : ''; - if($data->canceledBys[$taskID] == 'ditto') $data->canceledBys[$taskID] = isset($prev['canceledBy']) ? $prev['canceledBy'] : ''; - if($data->closedBys[$taskID] == 'ditto') $data->closedBys[$taskID] = isset($prev['closedBy']) ? $prev['closedBy'] : ''; - if($data->estStarteds[$taskID] == '0000-00-00') $data->estStarteds[$taskID] = ''; - if($data->deadlines[$taskID] == '0000-00-00') $data->deadlines[$taskID] = ''; - if(isset($data->assignedTos[$taskID]) and $data->assignedTos[$taskID] == 'ditto') $data->assignedTos[$taskID] = isset($prev['assignedTo']) ? $prev['assignedTo'] : ''; + if(isset($postData->modules[$taskID]) and ($postData->modules[$taskID] == 'ditto')) $postData->modules[$taskID] = isset($prev['module']) ? $prev['module'] : 0; + if($postData->types[$taskID] == 'ditto') $postData->types[$taskID] = isset($prev['type']) ? $prev['type'] : ''; + if($postData->pris[$taskID] == 'ditto') $postData->pris[$taskID] = isset($prev['pri']) ? $prev['pri'] : 0; + if($postData->finishedBys[$taskID] == 'ditto') $postData->finishedBys[$taskID] = isset($prev['finishedBy']) ? $prev['finishedBy'] : ''; + if($postData->canceledBys[$taskID] == 'ditto') $postData->canceledBys[$taskID] = isset($prev['canceledBy']) ? $prev['canceledBy'] : ''; + if($postData->closedBys[$taskID] == 'ditto') $postData->closedBys[$taskID] = isset($prev['closedBy']) ? $prev['closedBy'] : ''; + if($postData->estStarteds[$taskID] == '0000-00-00') $postData->estStarteds[$taskID] = ''; + if($postData->deadlines[$taskID] == '0000-00-00') $postData->deadlines[$taskID] = ''; + if(isset($postData->assignedTos[$taskID]) and $postData->assignedTos[$taskID] == 'ditto') $postData->assignedTos[$taskID] = isset($prev['assignedTo']) ? $prev['assignedTo'] : ''; - $prev['module'] = $data->modules[$taskID]; - $prev['type'] = $data->types[$taskID]; - $prev['pri'] = $data->pris[$taskID]; - $prev['finishedBy'] = $data->finishedBys[$taskID]; - $prev['canceledBy'] = $data->canceledBys[$taskID]; - $prev['closedBy'] = $data->closedBys[$taskID]; - if(isset($data->assignedTos[$taskID])) $prev['assignedTo'] = $data->assignedTos[$taskID]; + $prev['module'] = $postData->modules[$taskID]; + $prev['type'] = $postData->types[$taskID]; + $prev['pri'] = $postData->pris[$taskID]; + $prev['finishedBy'] = $postData->finishedBys[$taskID]; + $prev['canceledBy'] = $postData->canceledBys[$taskID]; + $prev['closedBy'] = $postData->closedBys[$taskID]; + if(isset($postData->assignedTos[$taskID])) $prev['assignedTo'] = $postData->assignedTos[$taskID]; } /* Initialize tasks from the post data.*/ $extendFields = $this->getFlowExtendFields(); - $oldTasks = $taskIDList ? $this->getByList($taskIDList) : array(); + $oldTasks = $taskIdList ? $this->getByList($taskIdList) : array(); $tasks = array(); - foreach($taskIDList as $taskID) + foreach($taskIdList as $taskID) { $oldTask = $oldTasks[$taskID]; $task = new stdclass(); $task->id = $taskID; - $task->color = $data->colors[$taskID]; - $task->name = $data->names[$taskID]; - $task->module = isset($data->modules[$taskID]) ? $data->modules[$taskID] : 0; - $task->type = $data->types[$taskID]; - $task->status = isset($data->statuses[$taskID]) ? $data->statuses[$taskID] : $oldTask->status; - $task->pri = $data->pris[$taskID]; - $task->estimate = isset($data->estimates[$taskID]) ? $data->estimates[$taskID] : $oldTask->estimate; - $task->left = isset($data->lefts[$taskID]) ? $data->lefts[$taskID] : $oldTask->left; - $task->estStarted = $data->estStarteds[$taskID]; - $task->deadline = $data->deadlines[$taskID]; - $task->finishedBy = $data->finishedBys[$taskID]; - $task->canceledBy = $data->canceledBys[$taskID]; - $task->closedBy = $data->closedBys[$taskID]; - $task->closedReason = $data->closedReasons[$taskID]; + $task->color = $postData->colors[$taskID]; + $task->name = $postData->names[$taskID]; + $task->module = isset($postData->modules[$taskID]) ? $postData->modules[$taskID] : 0; + $task->type = $postData->types[$taskID]; + $task->status = isset($postData->statuses[$taskID]) ? $postData->statuses[$taskID] : $oldTask->status; + $task->pri = $postData->pris[$taskID]; + $task->estimate = isset($postData->estimates[$taskID]) ? $postData->estimates[$taskID] : $oldTask->estimate; + $task->left = isset($postData->lefts[$taskID]) ? $postData->lefts[$taskID] : $oldTask->left; + $task->estStarted = $postData->estStarteds[$taskID]; + $task->deadline = $postData->deadlines[$taskID]; + $task->finishedBy = $postData->finishedBys[$taskID]; + $task->canceledBy = $postData->canceledBys[$taskID]; + $task->closedBy = $postData->closedBys[$taskID]; + $task->closedReason = $postData->closedReasons[$taskID]; $task->finishedDate = $oldTask->finishedBy == $task->finishedBy ? $oldTask->finishedDate : $now; $task->canceledDate = $oldTask->canceledBy == $task->canceledBy ? $oldTask->canceledDate : $now; $task->closedDate = $oldTask->closedBy == $task->closedBy ? $oldTask->closedDate : $now; @@ -780,7 +781,7 @@ class taskModel extends model $task->consumed = $oldTask->consumed; $task->parent = $oldTask->parent; - if(isset($data->assignedTos[$taskID])) $task->assignedTo = $data->assignedTos[$taskID]; + if(isset($postData->assignedTos[$taskID])) $task->assignedTo = $postData->assignedTos[$taskID]; if($task->status == 'closed') $task->assignedTo = 'closed'; if(isset($task->assignedTo) and $oldTask->assignedTo != $task->assignedTo) $task->assignedDate = $now; @@ -815,9 +816,9 @@ class taskModel extends model $task->{$extendField->field} = htmlSpecialString($task->{$extendField->field}); } - if(!empty($data->consumeds[$taskID])) + if(!empty($postData->consumeds[$taskID])) { - if($data->consumeds[$taskID] < 0) + if($postData->consumeds[$taskID] < 0) { dao::$errors[] = sprintf($this->lang->task->error->consumed, $taskID); return false; @@ -829,7 +830,7 @@ class taskModel extends model $record->task = $taskID; $record->date = $today; $record->left = $task->left; - $record->consumed = $data->consumeds[$taskID]; + $record->consumed = $postData->consumeds[$taskID]; $this->addTaskEstimate($record); $task->consumed = $oldTask->consumed + $record->consumed; @@ -997,17 +998,17 @@ class taskModel extends model /** * Batch change the module of task. * - * @param array $taskIDList + * @param array $taskIdList * @param int $moduleID * @access public * @return array */ - public function batchChangeModule($taskIDList, $moduleID) + public function batchChangeModule($taskIdList, $moduleID) { $now = helper::now(); $allChanges = array(); - $oldTasks = $this->getByList($taskIDList); - foreach($taskIDList as $taskID) + $oldTasks = $this->getByList($taskIdList); + foreach($taskIdList as $taskID) { $oldTask = $oldTasks[$taskID]; if($moduleID == $oldTask->module) continue; @@ -1645,21 +1646,23 @@ class taskModel extends model if(!dao::isError()) return common::createChanges($oldTask, $task); } - /** - * Activate a task. - * - * @param int $taskID - * @param string $extra - * - * @access public - * @return array - */ - public function activate($taskID, $extra) - { - $extra = str_replace(array(',', ' '), array('&', ''), $extra); - parse_str($extra, $output); - if(strpos($this->config->task->activate->requiredFields, 'comment') !== false and !$this->post->comment) + /** + * 激活任务。 + * Activate task. + * + * @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, string $drag): array|false + { + $taskID = $task->id; + + if(strpos($this->config->task->activate->requiredFields, 'comment') !== false and !$comment) { dao::$errors[] = sprintf($this->lang->error->notempty, $this->lang->comment); return false; @@ -1667,44 +1670,13 @@ class taskModel extends model $oldTask = $this->getById($taskID); if($oldTask->parent == '-1') $this->config->task->activate->requiredFields = ''; - $task = fixer::input('post') - ->add('id', $taskID) - ->setIF(is_numeric($this->post->left), 'left', (float)$this->post->left) - ->setDefault('left', 0) - ->setDefault('assignedTo', '') - ->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) - ->setIF(empty($oldTask->finishedDate), 'finishedDate', '') - ->setIF(empty($oldTask->canceledDate), 'canceledDate', '') - ->setIF(empty($oldTask->closedDate), 'closedDate', '') - ->remove('comment,uid,multiple,team,teamEstimate,teamConsumed,teamLeft,teamSource') - ->get(); - - if(!is_numeric($task->left)) - { - dao::$errors[] = $this->lang->task->error->leftNumber; - return false; - } - - if(empty($task->left)) - { - dao::$errors[] = sprintf($this->lang->task->error->notempty, $this->lang->task->left); - return false; - } if(!empty($oldTask->team)) { - $this->manageTaskTeam($oldTask->mode, $oldTask->id, $task->status); + $this->manageTaskTeam($oldTask->mode, $task, $teamData->team, $teamData->teamSource, $teamData->teamEstimate, $teamData->teamConsumed); $task = $this->computeMultipleHours($oldTask, $task); } - $task = $this->loadModel('file')->processImgURL($task, $this->config->task->editor->activate['id'], $this->post->uid); $this->dao->update(TABLE_TASK)->data($task) ->autoCheck() ->batchCheck($this->config->task->activate->requiredFields, 'notempty') @@ -1732,8 +1704,8 @@ class taskModel extends model } if($oldTask->story) $this->loadModel('story')->setStage($oldTask->story); $this->loadModel('kanban'); - if(!isset($output['toColID'])) $this->kanban->updateLane($oldTask->execution, 'task', $taskID); - if(isset($output['toColID'])) $this->kanban->moveCard($taskID, $output['fromColID'], $output['toColID'], $output['fromLaneID'], $output['toLaneID']); + if(!isset($drag['toColID'])) $this->kanban->updateLane($oldTask->execution, 'task', $taskID); + if(isset($drag['toColID'])) $this->kanban->moveCard($taskID, $drag['fromColID'], $drag['toColID'], $drag['fromLaneID'], $drag['toLaneID']); if(!dao::isError()) return common::createChanges($oldTask, $task); } diff --git a/module/task/test/model/activate.php b/module/task/test/model/activate.php index 4c17cf50ea..c70e3686e6 100755 --- a/module/task/test/model/activate.php +++ b/module/task/test/model/activate.php @@ -2,7 +2,6 @@ > status,closed,doing */ -$taskIDList = array('37','39','40','41','42'); +$task = zdTable('task')->gen(10); + +$taskIDList = array(1, 3, 4, 5, 6); $task = new taskTest(); r($task->activateTest($taskIDList[0])) && p('0:field,old,new') && e('status,wait,doing'); //wait状态任务激活 diff --git a/module/task/test/model/batchupdate.php b/module/task/test/model/batchupdate.php index 800a910c11..b38faee3b7 100755 --- a/module/task/test/model/batchupdate.php +++ b/module/task/test/model/batchupdate.php @@ -2,25 +2,30 @@ batchUpdate(); +timeout=0 cid=1 -pid=1 -测试批量修改任务 >> name,开发任务17,批量修改任务一 +- 测试批量修改任务 + - 第0条的field属性 @name + - 第0条的old属性 @开发任务11 + - 第0条的new属性 @任务改名1 */ -$taskID = '7'; +$task = zdTable('task')->gen(10); +$taskSpec = zdTable('taskspec')->gen(10); -$name = array( '7' => '批量修改任务一'); -$type = array( '7' => 'devel'); -$statuses = array('7' =>'doing'); +$names = array(1 => '任务改名1', 2 => '任务改名2', 3 => '任务改名3'); +$type = array(1 => 'devel', 2 => 'design', 3 => 'test'); +$statuses = array(1 => 'doing', 2 => 'wait', 3 => 'done'); +$colors = array(1 => '#ff4e3e', 2 => '', 3 => ''); -$normal = array('names' => $name, 'types' => $type,'statuses'=> $statuses); +$normal = array('taskIDList' => array(1 => 1, 2 => 2, 3 => 3), 'names' => $names, 'types' => $type); +$status = array('taskIDList' => array(1 => 1, 2 => 2, 3 => 3), 'names' => $names, 'types' => $type,'statuses'=> $statuses); $task = new taskTest(); -r($task->batchUpdateObject($normal, $taskID)) && p('1:field,old,new') && e('name,开发任务17,批量修改任务一'); // 测试批量修改任务 +r($task->batchUpdateObject($normal)) && p('0:field,old,new') && e('name,开发任务11,任务改名1'); // 测试批量修改任务 diff --git a/module/task/test/model/update.php b/module/task/test/model/update.php index 310f66e733..840db59e7c 100755 --- a/module/task/test/model/update.php +++ b/module/task/test/model/update.php @@ -7,19 +7,51 @@ su('admin'); /** title=测试taskModel->update(); +timeout=0 cid=1 -pid=1 -测试修改任务名称 >> name,开发任务11,任务名修改 -测试无修改 >> 没有数据更新 -测试修改任务模块 >> module,24,25 -测试修改任务指派人 >> assignedTo,,user94 -测试修改任务类型 >> type,study,devel -测试修改任务状态 >> status,cancel,doing -测试修改任务优先级 >> pri,2,1 -测试修改任务所属执行 >> execution,107,101 -测试修改任务截止时间 >> deadline,2022-03-29 -测试修改任务关闭原因 >> 『关闭原因』必须为空。 +- 测试修改任务名称 + - 第1条的field属性 @name + - 第1条的old属性 @开发任务11 + - 第1条的new属性 @任务名修改 + +- 测试无修改 @没有数据更新 + +- 测试修改任务模块 + - 第0条的field属性 @module + - 第0条的old属性 @24 + - 第0条的new属性 @25 + +- 测试修改任务指派人 + - 第1条的field属性 @assignedTo + - 第1条的old属性 @ + - 第1条的new属性 @user94 + +- 测试修改任务类型 + - 第0条的field属性 @type + - 第0条的old属性 @study + - 第0条的new属性 @devel + +- 测试修改任务状态 + - 第0条的field属性 @status + - 第0条的old属性 @cancel + - 第0条的new属性 @doing + +- 测试修改任务优先级 + - 第0条的field属性 @pri + - 第0条的old属性 @2 + - 第0条的new属性 @1 + +- 测试修改任务所属执行 + - 第0条的field属性 @execution + - 第0条的old属性 @107 + - 第0条的new属性 @101 + +- 测试修改任务截止时间 + - 第0条的field属性 @deadline + - 第0条的new属性 @2022-03-29 + +- 测试修改任务关闭原因 @ 『关闭原因』必须为空。 */ @@ -49,5 +81,4 @@ r($task->updateObject($taskIDList[4], $changestatus)) && p('0:field,old,new' r($task->updateObject($taskIDList[5], $changepri)) && p('0:field,old,new') && e('pri,2,1'); // 测试修改任务优先级 r($task->updateObject($taskIDList[6], $changeexecution)) && p('0:field,old,new') && e('execution,107,101'); // 测试修改任务所属执行 r($task->updateObject($taskIDList[8], $changedeadline)) && p('0:field,new') && e("deadline,2022-03-29"); // 测试修改任务截止时间 -r($task->updateObject($taskIDList[0], $ckclosedReason)) && p('closedReason:0') && e(' 『关闭原因』必须为空。'); // 测试修改任务关闭原因 - +r($task->updateObject($taskIDList[0], $ckclosedReason)) && p('closedReason:0') && e(' 『关闭原因』必须为空。'); // 测试修改任务关闭原因 \ No newline at end of file diff --git a/module/task/test/model/updateteam.php b/module/task/test/model/updateteam.php index 5f3fa97530..f2d20928ae 100644 --- a/module/task/test/model/updateteam.php +++ b/module/task/test/model/updateteam.php @@ -14,14 +14,13 @@ cid=1 - 第1条的old属性 @0 - 第1条的new属性 @3.5 -- 分配1个成员团队后任务 - - 第1条的field属性 @mode - - 第1条的old属性 @multi - - 第1条的new属性 @~~ +- 分配1个成员团队后任 @团队成员必须大于1人 - 分配预计剩余为0工时团队后任务 @"总计消耗"和"预计剩余"不能同时为0 -- 改变团队第二个成员后任务属性1 @user3 +- 改变团队第二个成员后任务团队属性1 @user3 + +- 增加一个成员后任务团队属性2 @user2 */ @@ -36,7 +35,8 @@ $taskStatusList = array('doing','wait','done'); $teamList = array('user1','user2','user3'); $task = new taskTest(); -r($task->updateTeamTest($taskIDList[0], $taskStatusList[1], array($teamList[0], $teamList[1]), array($teamList[0], $teamList[1]), $teamEstimateList = array(1, 2.5), $teamConsumedList = array(0, 0), $teamLeftList = array(1, 0.5))) && p('1:field,old,new') && e('estimate,0,3.5'); //分配2个成员团队后任务 -r($task->updateTeamTest($taskIDList[1], $taskStatusList[1], array($teamList[0]), array($teamList[0]), $teamEstimateList = array(1), $teamConsumedList = array(0), $teamLeftList = array(1))) && p('1:field,old,new') && e('mode,multi,~~'); //分配1个成员团队后任务 -r($task->updateTeamTest($taskIDList[2], $taskStatusList[1], array($teamList[0], $teamList[1]), array($teamList[0], $teamList[1]), $teamEstimateList = array(1, 2.5), $teamConsumedList = array(0, 0), $teamLeftList = array(0, 0))) && p() && e('"总计消耗"和"预计剩余"不能同时为0'); //分配预计剩余为0工时团队后任务 -r($task->updateTeamTest($taskIDList[0], $taskStatusList[0], array($teamList[0], $teamList[2]), array($teamList[0], $teamList[1]), $teamEstimateList = array(1, 2.5), $teamConsumedList = array(0, 0), $teamLeftList = array(1, 0.5), true)) && p(1) && e('user3'); //改变团队第二个成员后任务 \ No newline at end of file +r($task->updateTeamTest($taskIDList[0], $taskStatusList[1], array($teamList[0], $teamList[1]), array($teamList[0], $teamList[1]), $teamEstimateList = array(1, 2.5), $teamConsumedList = array(0, 0), $teamLeftList = array(1, 0.5))) && p('1:field,old,new') && e('estimate,0,3.5'); //分配2个成员团队后任务 +r($task->updateTeamTest($taskIDList[1], $taskStatusList[1], array($teamList[0]), array($teamList[0]), $teamEstimateList = array(1), $teamConsumedList = array(0), $teamLeftList = array(1))) && p() && e('团队成员必须大于1人'); //分配1个成员团队后任 +r($task->updateTeamTest($taskIDList[2], $taskStatusList[1], array($teamList[0], $teamList[1]), array($teamList[0], $teamList[1]), $teamEstimateList = array(1, 2.5), $teamConsumedList = array(0, 0), $teamLeftList = array(0, 0))) && p() && e('"总计消耗"和"预计剩余"不能同时为0'); //分配预计剩余为0工时团队后任务 +r($task->updateTeamTest($taskIDList[0], $taskStatusList[0], array($teamList[0], $teamList[2]), array($teamList[0], $teamList[1]), $teamEstimateList = array(1, 2.5), $teamConsumedList = array(0, 0), $teamLeftList = array(1, 0.5), true)) && p(1) && e('user3'); //改变团队第二个成员后任务团队 +r($task->updateTeamTest($taskIDList[0], $taskStatusList[0], array($teamList[0], $teamList[2], $teamList[1]), array($teamList[0], $teamList[2]), $teamEstimateList = array(1, 2.5, 3), $teamConsumedList = array(0, 0, 0), $teamLeftList = array(1, 0.5, 3), true)) && p(2) && e('user2'); //增加一个成员后任务团队 \ No newline at end of file diff --git a/module/task/test/task.class.php b/module/task/test/task.class.php index 542932d73d..966544f89b 100644 --- a/module/task/test/task.class.php +++ b/module/task/test/task.class.php @@ -158,37 +158,39 @@ class taskTest * Test batch update tasks. * * @param array $param - * @param int $taskID * @access public * @return array */ - public function batchUpdateObject($param = array(), $taskID = '') + public function batchUpdateObject(array $param = array()) { - $taskIDList = array($taskID => $taskID); - $colors = array($taskID =>'#ff4e3e'); - $name = array($taskID =>''); - $modules = array($taskID => '0'); - $assignedTos = array($taskID =>''); - $types =array($taskID => ''); - $statuses = array($taskID =>'wait'); - $estStarteds = array($taskID => ''); - $deadlines = array($taskID => ''); - $pris = array($taskID => '3'); - $finishedBys = array($taskID => ''); - $canceledBys = array($taskID => ''); - $closedBys = array($taskID => ''); - $closedReasons = array($taskID => ''); - $consumeds = array($taskID => ''); - $lefts = array($taskID => ''); - $createFields = array('taskIDList' => $taskIDList, 'modules' => $modules, 'names' => $name, 'types' => $types, 'assignedTos' => $assignedTos, + $postData = new stdclass(); + + foreach($param['taskIDList'] as $taskID) + { + $colors[$taskID] = ''; + $name[$taskID] = ''; + $modules[$taskID] = '0'; + $assignedTos[$taskID] = ''; + $types[$taskID] = ''; + $statuses[$taskID] = 'wait'; + $estStarteds[$taskID] = ''; + $deadlines[$taskID] = ''; + $pris[$taskID] = '3'; + $finishedBys[$taskID] = ''; + $canceledBys[$taskID] = ''; + $closedBys[$taskID] = ''; + $closedReasons[$taskID] = ''; + $consumeds[$taskID] = 0; + $lefts[$taskID] = 0; + } + $createFields = array('modules' => $modules, 'names' => $name, 'types' => $types, 'assignedTos' => $assignedTos, 'pris' => $pris, 'estStarteds' => $estStarteds, 'colors' => $colors, 'deadlines' => $deadlines, 'statuses' => $statuses, 'finishedBys'=>$finishedBys, 'canceledBys' => $canceledBys, 'closedBys' => $closedBys, 'closedReasons' => $closedReasons, 'consumeds' => $consumeds, 'lefts'=> $lefts); - foreach($createFields as $field => $defaultValue) $_POST[$field] = $defaultValue; + foreach($createFields as $field => $defaultValue) $postData->$field = $defaultValue; - foreach($param as $key => $value) $_POST[$key] = $value; + foreach($param as $key => $value) $postData->$key = $value; - $object = $this->objectModel->batchUpdate(); - unset($_POST); + $allChanges = $this->objectModel->batchUpdate($postData); if(dao::isError()) { @@ -196,8 +198,7 @@ class taskTest } else { - $object = $object[$taskID]; - return $object; + return array_shift($allChanges); } } @@ -279,13 +280,14 @@ class taskTest * @access public * @return array */ - public function activateTest($taskID, $param = array()) + public function activateTest(int $taskID, array $param = array()) { - $createFields = array('status' => 'doing', 'comment' => '单元测试','assignedTo' => '', 'left' => '3'); - foreach($createFields as $field => $defaultValue) $_POST[$field] = $defaultValue; - foreach($param as $key => $value) $_POST[$key] = $value; - $object = $this->objectModel->activate($taskID, $extra = ''); - unset($_POST); + $createFields = array('id' => $taskID, 'status' => 'doing', 'comment' => '单元测试','assignedTo' => '', 'left' => '3'); + foreach($createFields as $field => $defaultValue) $postData[$field] = $defaultValue; + foreach($param as $key => $value) $postData[$key] = $value; + + $teamData = new stdclass(); + $object = $this->objectModel->activate((object)$postData, $extra = '', $teamData, ''); if(dao::isError()) { $error = dao::getError(); diff --git a/module/task/ui/edit.html.php b/module/task/ui/edit.html.php index 52b0921ddb..fce1fdee83 100644 --- a/module/task/ui/edit.html.php +++ b/module/task/ui/edit.html.php @@ -61,7 +61,6 @@ formPanel ( set::title($formTitle), // The form title is diffrent from the page title, setStyle(['max-width' => '100%']), - setClass('mx-8'), div ( setClass('flex'), @@ -143,14 +142,31 @@ formPanel set::items($executionOptions), on::change('loadAll(this.value)'), ), - formGroup + formRow ( - set::name("module"), - set::label($lang->task->module), - set::value($task->module), - set::control("picker"), - set::strong(true), - set::items($moduleOptions) + formGroup + ( + set::label($lang->task->module), + set::strong(true), + inputGroup + ( + control(set(array + ( + 'name' => "module", + 'value' => $task->module, + 'type' => "picker", + 'items' => $moduleOptions + ))), + ) + ), + formGroup + ( + set::width('1/5'), + set::name('showAllModule'), + set::value($showAllModule ? '1' : ''), + set::control(array('type' => 'checkList', 'inline' => true)), + set::items(array('1' => $lang->all)) + ) ), formGroup ( @@ -256,16 +272,14 @@ formPanel 'items' => $mailtoOptions, 'multiple' => true ))), - control(set(array + control ( - 'name' => "contactListMenu", - 'id' => "contactListMenu", - 'value' => "", - 'disabled' => false, - 'type' => "picker", - 'onchange' => "setMailto", - 'items' => $contactListMenuOptions - ))) + setStyle('width', '30%'), + set::name('contactListMenu'), + set::type("picker"), + set::items($contactListMenuOptions), + on::change('setMailto') + ), ) ), h::strong @@ -303,13 +317,15 @@ formPanel set::strong(true), span ( + setClass('span-text'), $task->consumed, - h::a + ), + h::a + ( + setClass('span-text'), + icon ( - icon - ( - 'time' - ) + 'time' ) ) ), diff --git a/module/task/zen.php b/module/task/zen.php index b8bdeb923f..8b6e7831fb 100644 --- a/module/task/zen.php +++ b/module/task/zen.php @@ -102,7 +102,7 @@ class taskZen extends task /** * 编辑任务后返回响应. - * Reponse after edit. + * Response after edit. * * @param int $taskID * @param string $from ''|taskkanban @@ -409,7 +409,7 @@ class taskZen extends task /** * 返回看板下响应。 - * Reposn from kanban. + * Response from kanban. * * @param object $task * @param string $from ''|taskkanban @@ -1347,4 +1347,30 @@ class taskZen extends task if(isonlybody()) return $this->taskZen->responseKanban($task, $from); return array('result' => 'success', 'message' => $this->lang->saveSuccess, 'load' => $this->createLink('task', 'view', "taskID={$task->id}")); } + + /** + * 准备激活任务数据。 + * Prepare to activate task data. + * + * @param form $taskData + * @param int $taskID + * @access protected + * @return object + */ + protected function prepareActivate(form $taskData, 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(); + + return $this->loadModel('file')->processImgURL($task, $this->config->task->editor->activate['id'], $taskData->field('uid')); + } }