* Task activate batchupdate method and unit
This commit is contained in:
@@ -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);
|
||||
|
||||
+17
-34
@@ -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');
|
||||
|
||||
@@ -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;}
|
||||
|
||||
+66
-94
@@ -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);
|
||||
}
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
<?php
|
||||
include dirname(__FILE__, 5) . '/test/lib/init.php';
|
||||
include dirname(__FILE__, 2) . '/task.class.php';
|
||||
su('admin');
|
||||
|
||||
/**
|
||||
|
||||
@@ -18,7 +17,9 @@ closed状态任务激活 >> 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状态任务激活
|
||||
|
||||
@@ -2,25 +2,30 @@
|
||||
<?php
|
||||
include dirname(__FILE__, 5) . '/test/lib/init.php';
|
||||
include dirname(__FILE__, 2) . '/task.class.php';
|
||||
su('admin');
|
||||
|
||||
/**
|
||||
|
||||
title=测试taskModel->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'); // 测试批量修改任务
|
||||
|
||||
@@ -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(' 『关闭原因』必须为空。'); // 测试修改任务关闭原因
|
||||
@@ -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'); //改变团队第二个成员后任务
|
||||
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'); //增加一个成员后任务团队
|
||||
@@ -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();
|
||||
|
||||
@@ -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'
|
||||
)
|
||||
)
|
||||
),
|
||||
|
||||
+28
-2
@@ -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'));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user