From 103f9b8935be83f943436826700e65b030112192 Mon Sep 17 00:00:00 2001 From: tianshujie Date: Mon, 17 Jan 2022 14:54:08 +0800 Subject: [PATCH] * Refactored update swimlane code. --- module/execution/js/kanban.js | 12 ++--- module/kanban/model.php | 41 ++++++++++++++--- module/task/control.php | 32 ++++++++------ module/task/model.php | 83 +++++++++++++++++++++++++---------- 4 files changed, 120 insertions(+), 48 deletions(-) diff --git a/module/execution/js/kanban.js b/module/execution/js/kanban.js index e68c54ab01..636698ec06 100644 --- a/module/execution/js/kanban.js +++ b/module/execution/js/kanban.js @@ -737,7 +737,7 @@ function changeCardColType(cardID, fromColID, toColID, fromLaneID, toLaneID, car { if((fromColType == 'developing' || fromColType == 'wait') && priv.canFinishTask) { - var link = createLink('task', 'finish', 'taskID=' + objectID, '', true); + var link = createLink('task', 'finish', 'taskID=' + objectID + '&extra=fromColID=' + fromColID + ',toColID=' + toColID + ',fromLaneID=' + fromLaneID + ',toLaneID=' + toLaneID, '', true); showIframe = true; } } @@ -745,7 +745,7 @@ function changeCardColType(cardID, fromColID, toColID, fromLaneID, toLaneID, car { if(fromColType == 'developing' && priv.canPauseTask) { - var link = createLink('task', 'pause', 'taskID=' + objectID, '', true); + var link = createLink('task', 'pause', 'taskID=' + objectID + '&extra=fromColID=' + fromColID + ',toColID=' + toColID + ',fromLaneID=' + fromLaneID + ',toLaneID=' + toLaneID, '', true); showIframe = true; } } @@ -753,12 +753,12 @@ function changeCardColType(cardID, fromColID, toColID, fromLaneID, toLaneID, car { if((fromColType == 'pause' || fromColType == 'cancel' || fromColType == 'closed' || fromColType == 'developed') && priv.canActivateTask) { - var link = createLink('task', 'activate', 'taskID=' + objectID, '', true); + var link = createLink('task', 'activate', 'taskID=' + objectID + '&extra=fromColID=' + fromColID + ',toColID=' + toColID + ',fromLaneID=' + fromLaneID + ',toLaneID=' + toLaneID, '', true); showIframe = true; } if(fromColType == 'wait' && priv.canStartTask) { - var link = createLink('task', 'start', 'taskID=' + objectID, '', true); + var link = createLink('task', 'start', 'taskID=' + objectID + '&extra=fromColID=' + fromColID + ',toColID=' + toColID + ',fromLaneID=' + fromLaneID + ',toLaneID=' + toLaneID, '', true); showIframe = true; } } @@ -766,7 +766,7 @@ function changeCardColType(cardID, fromColID, toColID, fromLaneID, toLaneID, car { if((fromColType == 'developing' || fromColType == 'wait' || fromColType == 'pause') && priv.canCancelTask) { - var link = createLink('task', 'cancel', 'taskID=' + objectID, '', true); + var link = createLink('task', 'cancel', 'taskID=' + objectID + '&extra=fromColID=' + fromColID + ',toColID=' + toColID + ',fromLaneID=' + fromLaneID + ',toLaneID=' + toLaneID, '', true); showIframe = true; } } @@ -774,7 +774,7 @@ function changeCardColType(cardID, fromColID, toColID, fromLaneID, toLaneID, car { if((fromColType == 'developed' || fromColType == 'canceled') && priv.canCloseTask) { - var link = createLink('task', 'close', 'taskID=' + objectID, '', true); + var link = createLink('task', 'close', 'taskID=' + objectID + '&extra=fromColID=' + fromColID + ',toColID=' + toColID + ',fromLaneID=' + fromLaneID + ',toLaneID=' + toLaneID, '', true); showIframe = true; } } diff --git a/module/kanban/model.php b/module/kanban/model.php index 0908c3bd9c..33f5f664f7 100644 --- a/module/kanban/model.php +++ b/module/kanban/model.php @@ -2071,15 +2071,42 @@ class kanbanModel extends model * * @param int $executionID * @param string $laneType + * @param int $cardID * @access public * @return void */ - public function updateLane($executionID, $laneType) + public function updateLane($executionID, $laneType, $cardID = 0) { - $lanes = $this->dao->select('*')->from(TABLE_KANBANLANE) - ->where('execution')->eq($executionID) - ->andWhere('type')->eq($laneType) - ->fetchAll('id'); + $execution = $this->loadModel('execution')->getByID($executionID); + if($execution->type == 'kanban') + { + $regionIdList = $this->dao->select('id')->from(TABLE_KANBANREGION) + ->where('deleted')->eq(0) + ->andWhere('kanban')->eq($executionID) + ->fetchPairs(); + + $lanes = $this->dao->select('t1.*')->from(TABLE_KANBANLANE)->alias('t1') + ->leftJoin(TABLE_KANBANCELL)->alias('t2')->on('t1.id=t2.lane') + ->where('t1.deleted')->eq(0) + ->andWhere('t1.execution')->eq($executionID) + ->andWhere('t1.type')->eq($laneType) + ->andWhere('t1.region')->in($regionIdList) + ->beginIF(!empty($cardID))->andWhere('t2.cards')->like("%,$cardID,%")->fi() + ->orderBy('t1.`order` asc') + ->fetchAll('id'); + + if(count($lanes) > 1) + { + $lanes = array_slice($lanes, 0, 1); + } + } + else + { + $lanes = $this->dao->select('*')->from(TABLE_KANBANLANE) + ->where('execution')->eq($executionID) + ->andWhere('type')->eq($laneType) + ->fetchAll('id'); + } foreach($lanes as $lane) $this->refreshCards($lane); } @@ -2103,9 +2130,11 @@ class kanbanModel extends model ->andWhere('t1.execution')->eq($executionID) ->andWhere('t2.`type`')->eq($lane->type) ->fetchPairs(); + foreach($lanes as $cardIDList) { - if(!empty($cardIDList)) $otherCardList .= $cardIDList; + $cardIDList = trim($cardIDList, ','); + if(!empty($cardIDList)) $otherCardList .= ',' . $cardIDList; } $cardPairs = $this->dao->select('t2.type, t1.cards')->from(TABLE_KANBANCELL)->alias('t1') diff --git a/module/task/control.php b/module/task/control.php index 1b07f2f0d3..e053c6ac67 100644 --- a/module/task/control.php +++ b/module/task/control.php @@ -801,10 +801,11 @@ class task extends control * Start a task. * * @param int $taskID + * @param string $extra * @access public * @return void */ - public function start($taskID) + public function start($taskID, $extra = '') { $this->commonAction($taskID); @@ -813,7 +814,7 @@ class task extends control if(!empty($_POST)) { $this->loadModel('action'); - $changes = $this->task->start($taskID); + $changes = $this->task->start($taskID, $extra); if(dao::isError()) { @@ -967,17 +968,18 @@ class task extends control * Finish a task. * * @param int $taskID + * @param string $extra * @access public * @return void */ - public function finish($taskID) + public function finish($taskID, $extra = '') { $this->commonAction($taskID); if(!empty($_POST)) { $this->loadModel('action'); - $changes = $this->task->finish($taskID); + $changes = $this->task->finish($taskID, $extra); if(dao::isError()) { if($this->viewType == 'json' or (defined('RUN_MODE') && RUN_MODE == 'api')) return $this->send(array('result' => 'fail', 'message' => dao::getError())); @@ -1053,17 +1055,18 @@ class task extends control * Pause task. * * @param int $taskID + * @param string $extra * @access public * @return void */ - public function pause($taskID) + public function pause($taskID, $extra = '') { $this->commonAction($taskID); if(!empty($_POST)) { $this->loadModel('action'); - $changes = $this->task->pause($taskID); + $changes = $this->task->pause($taskID, $extra); if(dao::isError()) die(js::error(dao::getError())); if($this->post->comment != '' or !empty($changes)) @@ -1129,18 +1132,19 @@ class task extends control /** * Close a task. * - * @param int $taskID + * @param int $taskID + * @param string $extra * @access public * @return void */ - public function close($taskID) + public function close($taskID, $extra = '') { $this->commonAction($taskID); if(!empty($_POST)) { $this->loadModel('action'); - $changes = $this->task->close($taskID); + $changes = $this->task->close($taskID, $extra); if(dao::isError()) die(js::error(dao::getError())); @@ -1261,17 +1265,18 @@ class task extends control * Cancel a task. * * @param int $taskID + * @param string $extra * @access public * @return void */ - public function cancel($taskID) + public function cancel($taskID, $extra = '') { $this->commonAction($taskID); if(!empty($_POST)) { $this->loadModel('action'); - $changes = $this->task->cancel($taskID); + $changes = $this->task->cancel($taskID, $extra); if(dao::isError()) die(js::error(dao::getError())); if($this->post->comment != '' or !empty($changes)) @@ -1297,17 +1302,18 @@ class task extends control * Activate a task. * * @param int $taskID + * @param string $extra * @access public * @return void */ - public function activate($taskID) + public function activate($taskID, $extra = '') { $this->commonAction($taskID); if(!empty($_POST)) { $this->loadModel('action'); - $changes = $this->task->activate($taskID); + $changes = $this->task->activate($taskID, $extra); if(dao::isError()) die(js::error(dao::getError())); if($this->post->comment != '' or !empty($changes)) diff --git a/module/task/model.php b/module/task/model.php index 2a4e287f98..6b7eeb5f1c 100644 --- a/module/task/model.php +++ b/module/task/model.php @@ -413,11 +413,7 @@ class taskModel extends model $mails[$i]->actionID = $actionID; } - if(!dao::isError()) - { - $this->loadModel('score')->create('ajax', 'batchCreate'); - $this->loadModel('kanban')->updateLane($executionID, 'task'); - } + if(!dao::isError()) $this->loadModel('score')->create('ajax', 'batchCreate'); if($parentID > 0 && !empty($taskID)) { @@ -1018,7 +1014,7 @@ class taskModel extends model if($this->post->story != false) $this->loadModel('story')->setStage($this->post->story); if($task->status == 'done') $this->loadModel('score')->create('task', 'finish', $taskID); if($task->status == 'closed') $this->loadModel('score')->create('task', 'close', $taskID); - if($task->status != $oldTask->status) $this->loadModel('kanban')->updateLane($task->execution, 'task'); + if($task->status != $oldTask->status) $this->loadModel('kanban')->updateLane($task->execution, 'task', $taskID); $this->loadModel('action'); $changed = $task->parent != $oldTask->parent; @@ -1297,7 +1293,7 @@ class taskModel extends model if($task->status == 'done') $this->loadModel('score')->create('task', 'finish', $taskID); if($task->status == 'closed') $this->loadModel('score')->create('task', 'close', $taskID); - if($task->status != $oldTask->status) $this->loadModel('kanban')->updateLane($oldTask->execution, 'task'); + if($task->status != $oldTask->status) $this->loadModel('kanban')->updateLane($oldTask->execution, 'task', $oldTask->id); $allChanges[$taskID] = common::createChanges($oldTask, $task); } else @@ -1392,12 +1388,16 @@ class taskModel extends model /** * Start a task. * - * @param int $taskID + * @param int $taskID + * @param string $extra * @access public * @return void */ - public function start($taskID) + public function start($taskID, $extra = '') { + $extra = str_replace(array(',', ' '), array('&', ''), $extra); + parse_str($extra, $output); + $oldTask = $this->getById($taskID); if($oldTask->status == 'doing') dao::$errors[] = $this->lang->task->error->alreadyStarted; if(!empty($oldTask->team)) @@ -1473,7 +1473,10 @@ class taskModel extends model $this->computeBeginAndEnd($oldTask->parent); } if($oldTask->story) $this->loadModel('story')->setStage($oldTask->story); - $this->loadModel('kanban')->updateLane($oldTask->execution, 'task'); + + $this->loadModel('kanban'); + if(!isset($output['fromColID'])) $this->kanban->updateLane($oldTask->execution, 'task', $taskID); + if(isset($output['fromColID'])) $this->kanban->moveCard($taskID, $output['fromColID'], $output['toColID'], $output['fromLaneID'], $output['toLaneID']); if(!dao::isError()) return common::createChanges($oldTask, $task); } @@ -1612,12 +1615,16 @@ class taskModel extends model /** * Finish a task. * - * @param int $taskID + * @param int $taskID + * @param string $extra * @access public * @return void */ - public function finish($taskID) + public function finish($taskID, $extra = '') { + $extra = str_replace(array(',', ' '), array('&', ''), $extra); + parse_str($extra, $output); + $oldTask = $this->getById($taskID); $now = helper::now(); $today = helper::today(); @@ -1735,7 +1742,10 @@ class taskModel extends model if($task->status == 'done' && !dao::isError()) { $this->loadModel('score')->create('task', 'finish', $taskID); - $this->loadModel('kanban')->updateLane($oldTask->execution, 'task'); + + $this->loadModel('kanban'); + if(!isset($output['fromColID'])) $this->kanban->updateLane($oldTask->execution, 'task', $taskID); + if(isset($output['fromColID'])) $this->kanban->moveCard($taskID, $output['fromColID'], $output['toColID'], $output['fromLaneID'], $output['toLaneID']); } if(!dao::isError()) return common::createChanges($oldTask, $task); } @@ -1744,11 +1754,15 @@ class taskModel extends model * Pause task * * @param int $taskID + * @param string $extra * @access public * @return array */ - public function pause($taskID) + public function pause($taskID, $extra = '') { + $extra = str_replace(array(',', ' '), array('&', ''), $extra); + parse_str($extra, $output); + $oldTask = $this->getById($taskID); $task = fixer::input('post') @@ -1761,18 +1775,26 @@ class taskModel extends model $this->dao->update(TABLE_TASK)->data($task)->autoCheck()->where('id')->eq((int)$taskID)->exec(); if($oldTask->parent > 0) $this->updateParentStatus($taskID); + + $this->loadModel('kanban'); + if(!isset($output['fromColID'])) $this->kanban->updateLane($oldTask->execution, 'task', $taskID); + if(isset($output['fromColID'])) $this->kanban->moveCard($taskID, $output['fromColID'], $output['toColID'], $output['fromLaneID'], $output['toLaneID']); if(!dao::isError()) return common::createChanges($oldTask, $task); } /** * Close a task. * - * @param int $taskID + * @param int $taskID + * @param string $extra * @access public * @return array */ - public function close($taskID) + public function close($taskID, $extra = '') { + $extra = str_replace(array(',', ' '), array('&', ''), $extra); + parse_str($extra, $output); + $oldTask = $this->dao->select('*')->from(TABLE_TASK)->where('id')->eq($taskID)->fetch(); $now = helper::now(); @@ -1795,7 +1817,10 @@ class taskModel extends model if($oldTask->parent > 0) $this->updateParentStatus($taskID); if($oldTask->story) $this->loadModel('story')->setStage($oldTask->story); $this->loadModel('score')->create('task', 'close', $taskID); - $this->loadModel('kanban')->updateLane($oldTask->execution, 'task'); + + $this->loadModel('kanban'); + if(!isset($output['fromColID'])) $this->kanban->updateLane($oldTask->execution, 'task', $taskID); + if(isset($output['fromColID'])) $this->kanban->moveCard($taskID, $output['fromColID'], $output['toColID'], $output['fromLaneID'], $output['toLaneID']); return common::createChanges($oldTask, $task); } @@ -1804,13 +1829,17 @@ class taskModel extends model /** * Cancel a task. * - * @param int $taskID + * @param int $taskID + * @param string $extra * * @access public * @return array */ - public function cancel($taskID) + public function cancel($taskID, $extra = '') { + $extra = str_replace(array(',', ' '), array('&', ''), $extra); + parse_str($extra, $output); + $oldTask = $this->getById($taskID); $now = helper::now(); @@ -1835,7 +1864,9 @@ class taskModel extends model $this->dao->update(TABLE_TASK)->set('assignedTo=openedBy')->where('parent')->eq((int)$taskID)->exec(); } if($oldTask->story) $this->loadModel('story')->setStage($oldTask->story); - $this->loadModel('kanban')->updateLane($oldTask->execution, 'task'); + $this->loadModel('kanban'); + if(!isset($output['fromColID'])) $this->kanban->updateLane($oldTask->execution, 'task', $taskID); + if(isset($output['fromColID'])) $this->kanban->moveCard($taskID, $output['fromColID'], $output['toColID'], $output['fromLaneID'], $output['toLaneID']); if(!dao::isError()) return common::createChanges($oldTask, $task); } @@ -1843,13 +1874,17 @@ class taskModel extends model /** * Activate a task. * - * @param int $taskID + * @param int $taskID + * @param string $extra * * @access public * @return array */ - public function activate($taskID) + 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) { dao::$errors[] = sprintf($this->lang->error->notempty, $this->lang->comment); @@ -1901,7 +1936,9 @@ class taskModel extends model $this->computeWorkingHours($taskID); } if($oldTask->story) $this->loadModel('story')->setStage($oldTask->story); - $this->loadModel('kanban')->updateLane($oldTask->execution, 'task'); + $this->loadModel('kanban'); + if(!isset($output['fromColID'])) $this->kanban->updateLane($oldTask->execution, 'task', $taskID); + if(isset($output['fromColID'])) $this->kanban->moveCard($taskID, $output['fromColID'], $output['toColID'], $output['fromLaneID'], $output['toLaneID']); if(!dao::isError()) return common::createChanges($oldTask, $task); }