* Optimize the logic of edit a task.
This commit is contained in:
+28
-26
@@ -43,32 +43,34 @@ $config->task->form->manageTeam['lastEditedDate'] = array('type' => 'string', 'r
|
||||
$config->task->form->manageTeam['assignedDate'] = array('type' => 'string', 'required' => false, 'default' => helper::now());
|
||||
|
||||
$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['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' => '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);
|
||||
$config->task->form->edit['status'] = array('type' => 'string', 'required' => false, 'default' => '');
|
||||
$config->task->form->edit['pri'] = array('type' => 'int', 'required' => false, 'default' => 0);
|
||||
$config->task->form->edit['estStarted'] = array('type' => 'string', 'required' => false, 'default' => '');
|
||||
$config->task->form->edit['deadline'] = array('type' => 'string', 'required' => false, 'default' => '');
|
||||
$config->task->form->edit['estimate'] = array('type' => 'float', 'required' => false, 'default' => 0);
|
||||
$config->task->form->edit['left'] = array('type' => 'float', 'required' => false, 'default' => 0);
|
||||
$config->task->form->edit['consumed'] = array('type' => 'float', 'required' => false, 'default' => 0);
|
||||
$config->task->form->edit['realStarted'] = array('type' => 'string', 'required' => false, 'default' => '');
|
||||
$config->task->form->edit['finishedBy'] = array('type' => 'string', 'required' => false, 'default' => '');
|
||||
$config->task->form->edit['finishedDate'] = array('type' => 'string', 'required' => false, 'default' => '');
|
||||
$config->task->form->edit['canceledBy'] = array('type' => 'string', 'required' => false, 'default' => '');
|
||||
$config->task->form->edit['canceledDate'] = array('type' => 'string', 'required' => false, 'default' => '');
|
||||
$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['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['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' => '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);
|
||||
$config->task->form->edit['status'] = array('type' => 'string', 'required' => false, 'default' => '');
|
||||
$config->task->form->edit['pri'] = array('type' => 'int', 'required' => false, 'default' => 0);
|
||||
$config->task->form->edit['estStarted'] = array('type' => 'string', 'required' => false, 'default' => '');
|
||||
$config->task->form->edit['deadline'] = array('type' => 'string', 'required' => false, 'default' => '');
|
||||
$config->task->form->edit['estimate'] = array('type' => 'float', 'required' => false, 'default' => 0);
|
||||
$config->task->form->edit['left'] = array('type' => 'float', 'required' => false, 'default' => 0);
|
||||
$config->task->form->edit['consumed'] = array('type' => 'float', 'required' => false, 'default' => 0);
|
||||
$config->task->form->edit['realStarted'] = array('type' => 'string', 'required' => false, 'default' => '');
|
||||
$config->task->form->edit['finishedBy'] = array('type' => 'string', 'required' => false, 'default' => '');
|
||||
$config->task->form->edit['finishedDate'] = array('type' => 'string', 'required' => false, 'default' => '');
|
||||
$config->task->form->edit['canceledBy'] = array('type' => 'string', 'required' => false, 'default' => '');
|
||||
$config->task->form->edit['canceledDate'] = array('type' => 'string', 'required' => false, 'default' => '');
|
||||
$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['lastEditedBy'] = array('type' => 'string', 'required' => false, 'default' => $app->user->account);
|
||||
$config->task->form->edit['lastEditedDate'] = array('type' => 'string', 'required' => false, 'default' => helper::now());
|
||||
|
||||
$config->task->form->team->edit = array();
|
||||
$config->task->form->team->edit['team'] = array('type' => 'array', 'required' => false, 'default' => array());
|
||||
|
||||
+5
-10
@@ -167,25 +167,20 @@ class task extends control
|
||||
|
||||
if(!empty($_POST))
|
||||
{
|
||||
$changes = array();
|
||||
$taskDataFixer = form::data($this->config->task->form->edit);
|
||||
$teamDataFixer = form::data($this->config->task->form->team->edit);
|
||||
$rawData = $taskDataFixer->rawdata;
|
||||
|
||||
/* Prepare and check data. */
|
||||
$task = $this->taskZen->prepareEdit($taskDataFixer, $taskID);
|
||||
$team = $teamDataFixer->get();
|
||||
$postData = form::data()->getAll(true);
|
||||
$task = $this->taskZen->buildTaskForEdit($taskID, $postData);
|
||||
if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError()));
|
||||
|
||||
/* Update task. */
|
||||
$changes = $this->task->update($task, $team, $rawData);
|
||||
$changes = $this->task->update($task, $postData);
|
||||
if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError()));
|
||||
|
||||
/* Record log. */
|
||||
if($rawData->comment != '' or !empty($changes))
|
||||
if($postData->comment != '' or !empty($changes))
|
||||
{
|
||||
$action = !empty($changes) ? 'Edited' : 'Commented';
|
||||
$actionID = $this->loadModel('action')->create('task', $taskID, $action, $rawData->comment);
|
||||
$actionID = $this->loadModel('action')->create('task', $taskID, $action, $postData->comment);
|
||||
if(!empty($changes)) $this->action->logHistory($actionID, $changes);
|
||||
}
|
||||
|
||||
|
||||
+20
-12
@@ -586,12 +586,12 @@ class taskModel extends model
|
||||
/**
|
||||
* Update a task.
|
||||
*
|
||||
* @param object $task
|
||||
* @param object $team
|
||||
* @param object $task
|
||||
* @param object $postData
|
||||
* @access public
|
||||
* @return array|string|false
|
||||
*/
|
||||
public function update(object $task, object $team): array|string|false
|
||||
public function update(object $task, object $postData): array|string|false
|
||||
{
|
||||
$taskID = $task->id;
|
||||
if($taskID <= 0) return false;
|
||||
@@ -599,16 +599,24 @@ class taskModel extends model
|
||||
$oldTask = $this->getByID($taskID);
|
||||
|
||||
/* When the selected parent task is a common task and has consumption, select other parent tasks. */
|
||||
if($this->post->parent > 0)
|
||||
if($postData->parent > 0)
|
||||
{
|
||||
$taskConsumed = 0;
|
||||
$taskConsumed = $this->dao->select('consumed')->from(TABLE_TASK)->where('id')->eq($this->post->parent)->andWhere('parent')->eq(0)->fetch('consumed');
|
||||
if($taskConsumed > 0) return print(js::error($this->lang->task->error->alreadyConsumed));
|
||||
$taskConsumed = $this->dao->select('consumed')->from(TABLE_TASK)->where('id')->eq($postData->parent)->andWhere('parent')->eq(0)->fetch('consumed');
|
||||
if($taskConsumed > 0)
|
||||
{
|
||||
dao::$errors[] = $this->lang->task->error->alreadyConsumed;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if($task->consumed < $oldTask->consumed) return print(js::error($this->lang->task->error->consumedSmall));
|
||||
if($task->consumed < $oldTask->consumed)
|
||||
{
|
||||
dao::$errors[] = $this->lang->task->error->consumedSmall;
|
||||
return false;
|
||||
}
|
||||
|
||||
if($this->post->team and count(array_filter($this->post->team)) > 1)
|
||||
if($postData->team and count(array_filter($postData->team)) > 1)
|
||||
{
|
||||
$teams = $this->manageTaskTeam($oldTask->mode, $taskID, $task->status);
|
||||
if(!empty($teams)) $task = $this->computeMultipleHours($oldTask, $task, array(), false);
|
||||
@@ -623,9 +631,9 @@ class taskModel extends model
|
||||
|
||||
if(isset($task->version) && $task->version > $oldTask->version) $this->taskTao->recordTaskVersion($task);
|
||||
|
||||
if($this->post->story != $oldTask->story)
|
||||
if($postData->story != $oldTask->story)
|
||||
{
|
||||
$this->loadModel('story')->setStage($this->post->story);
|
||||
$this->loadModel('story')->setStage($postData->story);
|
||||
$this->story->setStage($oldTask->story);
|
||||
}
|
||||
if($task->status == 'done') $this->loadModel('score')->create('task', 'finish', $taskID);
|
||||
@@ -668,10 +676,10 @@ class taskModel extends model
|
||||
$oldTask->team = '';
|
||||
foreach($oldTeams as $team) $oldTask->team .= "{$this->lang->task->teamMember}: " . zget($users, $team->account) . ", {$this->lang->task->estimateAB}: " . (float)$team->estimate . ", {$this->lang->task->consumedAB}: " . (float)$team->consumed . ", {$this->lang->task->leftAB}: " . (float)$team->left . "\n";
|
||||
$task->team = '';
|
||||
foreach($this->post->team as $i => $account)
|
||||
foreach($postData->team as $i => $account)
|
||||
{
|
||||
if(empty($account)) continue;
|
||||
$task->team .= "{$this->lang->task->teamMember}: " . zget($users, $account) . ", {$this->lang->task->estimateAB}: " . zget($this->post->teamEstimate, $i, 0) . ", {$this->lang->task->consumedAB}: " . zget($this->post->teamConsumed, $i, 0) . ", {$this->lang->task->leftAB}: " . zget($this->post->teamLeft, $i, 0) . "\n";
|
||||
$task->team .= "{$this->lang->task->teamMember}: " . zget($users, $account) . ", {$this->lang->task->estimateAB}: " . zget($postData->teamEstimate, $i, 0) . ", {$this->lang->task->consumedAB}: " . zget($postData->teamConsumed, $i, 0) . ", {$this->lang->task->leftAB}: " . zget($postData->teamLeft, $i, 0) . "\n";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+24
-29
@@ -38,66 +38,61 @@ class taskZen extends task
|
||||
|
||||
/* Set menu. */
|
||||
$this->execution->setMenu($this->view->execution->id);
|
||||
$this->view->position[] = html::a($this->createLink('execution', 'browse', "execution={$this->view->task->execution}"), $this->view->execution->name);
|
||||
}
|
||||
|
||||
/**
|
||||
* 准备编辑数据。
|
||||
* Prepare edit data.
|
||||
* 构造待更新的任务数据。
|
||||
* Build the task data to be updated.
|
||||
*
|
||||
* @param form $postDataFixer
|
||||
* @param int $taskID
|
||||
* @param int $taskID
|
||||
* @access protected
|
||||
* @return object|false
|
||||
*/
|
||||
protected function prepareEdit(form $postDataFixer, int $taskID): object|false
|
||||
protected function buildTaskForEdit(int $taskID): object|false
|
||||
{
|
||||
$now = helper::now();
|
||||
$oldTask = $this->task->getByID($taskID);
|
||||
$postData = $postDataFixer->get();
|
||||
$postData = form::data()->getAll(true);
|
||||
|
||||
/* Check that the data is reasonable. */
|
||||
/* Check if the input post meets the requirements. */
|
||||
if($postData->estimate < 0 or $postData->left < 0 or $postData->consumed < 0) dao::$errors[] = $this->lang->task->error->recordMinus;
|
||||
if(!empty($this->config->limitTaskDate)) $this->task->checkEstStartedAndDeadline($oldTask->execution, $postData->estStarted, $postData->deadline);
|
||||
if(!empty($postData->lastEditedDate) && $oldTask->lastEditedDate != $postData->lastEditedDate) dao::$errors[] = $this->lang->error->editedByOther;
|
||||
if(dao::isError()) return false;
|
||||
|
||||
$task = $postDataFixer->add('id', $taskID)
|
||||
->setIF(!$postData->assignedTo && !empty($oldTask->team) && !empty($postDataFixer->rawdata->team), 'assignedTo', $this->task->getAssignedTo4Multi($postDataFixer->rawdata->team, $oldTask))
|
||||
->setIF(!$oldTask->mode && !$postData->assignedTo && !empty($postDataFixer->rawdata->team), 'assignedTo', $postDataFixer->rawdata->team[0])
|
||||
|
||||
->setIF($oldTask->parent == 0 && $postData->parent == '', 'parent', 0)
|
||||
->setIF($postData->story !== false && $postData->story != $oldTask->story, 'storyVersion', $this->loadModel('story')->getVersion($postData->story))
|
||||
$now = helper::now();
|
||||
$task = form::data()->add('id', $taskID)
|
||||
->setIF(!$postData->assignedTo && !empty($oldTask->team) && !empty($postData->team), 'assignedTo', $this->task->getAssignedTo4Multi($postData->team, $oldTask))
|
||||
->setIF($postData->assignedTo != $oldTask->assignedTo, 'assignedDate', $now)
|
||||
|
||||
->setIF($postData->mode == 'single', 'mode', '')
|
||||
->setIF($postData->status == 'done', 'left', 0)
|
||||
->setIF($postData->status == 'done' && !$postData->finishedBy, 'finishedBy', $this->app->user->account)
|
||||
->setIF($postData->status == 'done' && !$postData->finishedDate, 'finishedDate', $now)
|
||||
->setIF(!$oldTask->mode && !$postData->assignedTo && !empty($postData->team), 'assignedTo', $postData->team[0])
|
||||
->setIF($postData->story !== false && $postData->story != $oldTask->story, 'storyVersion', $this->loadModel('story')->getVersion($postData->story))
|
||||
->setIF($postData->status == 'wait' && $postData->left == $oldTask->left && $postData->consumed == 0 && $postData->estimate, 'left', $postData->estimate)
|
||||
|
||||
->setIF($postData->status == 'cancel' && !$postData->canceledBy, 'canceledBy', $this->app->user->account)
|
||||
->setIF($postData->status == 'cancel' && !$postData->canceledDate, 'canceledDate', $now)
|
||||
->setIF($postData->status == 'done', 'left', 0)
|
||||
->setIF($postData->status == 'done' && empty($postData->finishedBy), 'finishedBy', $this->app->user->account)
|
||||
->setIF($postData->status == 'done' && empty($postData->finishedDate), 'finishedDate', $now)
|
||||
|
||||
->setIF($postData->status == 'cancel' && empty($postData->canceledBy), 'canceledBy', $this->app->user->account)
|
||||
->setIF($postData->status == 'cancel' && empty($postData->canceledDate), 'canceledDate', $now)
|
||||
->setIF($postData->status == 'cancel', 'assignedTo', $oldTask->openedBy)
|
||||
->setIF($postData->status == 'cancel', 'assignedDate', $now)
|
||||
|
||||
->setIF($postData->status == 'closed' && !$postData->closedBy, 'closedBy', $this->app->user->account)
|
||||
->setIF($postData->status == 'closed' && !$postData->closedDate, 'closedDate', $now)
|
||||
->setIF($postData->status == 'closed' && empty($postData->closedBy), 'closedBy', $this->app->user->account)
|
||||
->setIF($postData->status == 'closed' && empty($postData->closedDate), 'closedDate', $now)
|
||||
|
||||
->setIF($postData->consumed > 0 && $postData->left > 0 && $postData->status == 'wait', 'status', 'doing')
|
||||
|
||||
->setIF($postData->assignedTo != $oldTask->assignedTo, 'assignedDate', $now)
|
||||
|
||||
->setIF($postData->status == 'wait' && $postData->left == $oldTask->left && $postData->consumed == 0 && $postData->estimate, 'left', $postData->estimate)
|
||||
->setIF($oldTask->parent > 0 && !$postData->parent, 'parent', 0)
|
||||
->setIF($oldTask->parent >= 0 && empty($postData->parent), 'parent', 0)
|
||||
->setIF($oldTask->parent < 0, 'estimate', $oldTask->estimate)
|
||||
->setIF($oldTask->parent < 0, 'left', $oldTask->left)
|
||||
|
||||
->setIF($oldTask->name != $postData->name || $oldTask->estStarted != $postData->estStarted || $oldTask->deadline != $postData->deadline, 'version', $oldTask->version + 1)
|
||||
->add('lastEditedBy', $this->app->user->account)
|
||||
->add('lastEditedDate', $now)
|
||||
->stripTags($this->config->task->editor->edit['id'], $this->config->allowedTags)
|
||||
->join('mailto', ',')
|
||||
->get();
|
||||
|
||||
return $this->loadModel('file')->processImgURL($task, $this->config->task->editor->edit['id'], $postDataFixer->rawData->uid);
|
||||
return $this->loadModel('file')->processImgURL($task, $this->config->task->editor->edit['id'], $postData->uid);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user