diff --git a/module/execution/js/kanban.js b/module/execution/js/kanban.js index 8444f72c7a..fa0359e255 100644 --- a/module/execution/js/kanban.js +++ b/module/execution/js/kanban.js @@ -192,7 +192,7 @@ function createColumnCreateMenu(options) else if(col.type == 'wait') { if(priv.canCreateTask) items.push({label: taskLang.create, url: $.createLink('task', 'create', 'executionID=' + executionID + "&storyID=0&moduleID=0&taskID=0&todoID=0&extra=laneID=" + laneID + ",columnID=" + col.id, '', true), className: 'iframe', attrs: {'data-toggle': 'modal', 'data-width': '80%'}}); - if(priv.canBatchCreateTask) items.push({label: taskLang.batchCreate, url: $.createLink('task', 'batchcreate', 'executionID=' + executionID, '', true), className: 'iframe', attrs: {'data-toggle': 'modal', 'data-width': '80%'}}); + if(priv.canBatchCreateTask) items.push({label: taskLang.batchCreate, url: $.createLink('task', 'batchcreate', 'executionID=' + executionID + "&storyID=0&moduleID=0&taskID=0&iframe=0&extra=laneID=" + laneID + ",columnID=" + col.id, '', true), className: 'iframe', attrs: {'data-toggle': 'modal', 'data-width': '80%'}}); } return items; } @@ -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/execution/model.php b/module/execution/model.php index 22e5fbdf36..72197cd678 100644 --- a/module/execution/model.php +++ b/module/execution/model.php @@ -3238,13 +3238,14 @@ class executionModel extends model /** * Get Kanban tasks * - * @param int $executionID - * @param string $orderBy - * @param object $pager + * @param int $executionID + * @param string $orderBy + * @param object $pager + * @param array|string $excludeTasks * @access public * @return void */ - public function getKanbanTasks($executionID, $orderBy = 'status_asc, id_desc', $pager = null) + public function getKanbanTasks($executionID, $orderBy = 'status_asc, id_desc', $pager = null, $excludeTasks = '') { $tasks = $this->dao->select('t1.*, t2.id AS storyID, t2.title AS storyTitle, t2.version AS latestStoryVersion, t2.status AS storyStatus, t3.realname AS assignedToRealName') ->from(TABLE_TASK)->alias('t1') @@ -3253,6 +3254,7 @@ class executionModel extends model ->where('t1.execution')->eq((int)$executionID) ->andWhere('t1.deleted')->eq(0) ->andWhere('t1.parent')->ge(0) + ->beginIF($excludeTasks)->andWhere('t1.id')->notIN($excludeTasks)->fi() ->orderBy($orderBy) ->page($pager) ->fetchAll('id'); diff --git a/module/kanban/model.php b/module/kanban/model.php index f2cf659958..f9fedc0775 100644 --- a/module/kanban/model.php +++ b/module/kanban/model.php @@ -1912,7 +1912,7 @@ class kanbanModel extends model } else { - $cell->cards = $cell->cards ? $cell->cards . "$cardID," : ",$cardID,"; + $cell->cards = $cell->cards ? ",$cardID" . $cell->cards : ",$cardID,"; $this->dao->update(TABLE_KANBANCELL)->set('cards')->eq($cell->cards)->where('id')->eq($cell->id)->exec(); } } @@ -2071,15 +2071,39 @@ 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); } @@ -2093,9 +2117,24 @@ class kanbanModel extends model */ public function refreshCards($lane) { - $laneType = $lane->type; - $executionID = $lane->execution; - $cardPairs = $this->dao->select('t2.type, t1.cards')->from(TABLE_KANBANCELL)->alias('t1') + $laneType = $lane->type; + $executionID = $lane->execution; + $otherCardList = ''; + $otherLanes = $this->dao->select('t2.id, t2.cards')->from(TABLE_KANBANLANE)->alias('t1') + ->leftJoin(TABLE_KANBANCELL)->alias('t2')->on('t1.id=t2.lane') + ->where('t1.deleted')->eq(0) + ->andWhere('t1.id')->ne($lane->id) + ->andWhere('t1.execution')->eq($executionID) + ->andWhere('t2.`type`')->eq($lane->type) + ->fetchPairs(); + + foreach($otherLanes as $cardIDList) + { + $cardIDList = trim($cardIDList, ','); + if(!empty($cardIDList)) $otherCardList .= ',' . $cardIDList; + } + + $cardPairs = $this->dao->select('t2.type, t1.cards')->from(TABLE_KANBANCELL)->alias('t1') ->leftJoin(TABLE_KANBANCOLUMN)->alias('t2')->on('t1.`column` = t2.id') ->where('t1.kanban')->eq($executionID) ->andWhere('t1.lane')->eq($lane->id) @@ -2105,7 +2144,7 @@ class kanbanModel extends model if($laneType == 'story') { - $stories = $this->loadModel('story')->getExecutionStories($executionID); + $stories = $this->loadModel('story')->getExecutionStories($executionID, 0, 0, 't1.`order`_desc', 'byModule', 0, 'story', $otherCardList); foreach($stories as $storyID => $story) { foreach($this->config->kanban->storyColumnStageList as $colType => $stage) @@ -2132,7 +2171,7 @@ class kanbanModel extends model } elseif($laneType == 'bug') { - $bugs = $this->loadModel('bug')->getExecutionBugs($executionID); + $bugs = $this->loadModel('bug')->getExecutionBugs($executionID, 0, 0, '', 0, 'id_desc', $otherCardList); foreach($bugs as $bugID => $bug) { foreach($this->config->kanban->bugColumnStatusList as $colType => $status) @@ -2175,7 +2214,7 @@ class kanbanModel extends model } elseif($laneType == 'task') { - $tasks = $this->loadModel('execution')->getKanbanTasks($executionID); + $tasks = $this->loadModel('execution')->getKanbanTasks($executionID, 'status_asc, id_desc', null, $otherCardList); foreach($tasks as $taskID => $task) { foreach($this->config->kanban->taskColumnStatusList as $colType => $status) diff --git a/module/story/control.php b/module/story/control.php index 6900c0a77d..b648736863 100644 --- a/module/story/control.php +++ b/module/story/control.php @@ -95,7 +95,7 @@ class story extends control $response['message'] = $this->lang->saveSuccess; setcookie('lastStoryModule', (int)$this->post->module, $this->config->cookieLife, $this->config->webRoot, '', $this->config->cookieSecure, false); - $storyResult = $this->story->create($objectID, $bugID, $from = isset($fromObjectIDKey) ? $fromObjectIDKey : ''); + $storyResult = $this->story->create($objectID, $bugID, $from = isset($fromObjectIDKey) ? $fromObjectIDKey : '', $extra); if(!$storyResult or dao::isError()) { $response['result'] = 'fail'; diff --git a/module/story/model.php b/module/story/model.php index 5935d04092..833da1e3a4 100644 --- a/module/story/model.php +++ b/module/story/model.php @@ -183,11 +183,15 @@ class storyModel extends model * @param int $executionID * @param int $bugID * @param string $from + * @param string $extra * @access public * @return int|bool the id of the created story or false when error. */ - public function create($executionID = 0, $bugID = 0, $from = '') + public function create($executionID = 0, $bugID = 0, $from = '', $extra = '') { + $extra = str_replace(array(',', ' '), array('&', ''), $extra); + parse_str($extra, $output); + if(isset($_POST['reviewer'])) $_POST['reviewer'] = array_filter($_POST['reviewer']); if(!$this->post->needNotReview and empty($_POST['reviewer'])) { @@ -280,7 +284,9 @@ class storyModel extends model { $this->linkStory($executionID, $this->post->product, $storyID); if($this->config->systemMode == 'new' and $executionID != $this->session->project) $this->linkStory($this->session->project, $this->post->product, $storyID); - $this->loadModel('kanban')->updateLane($executionID, 'story'); + $this->loadModel('kanban'); + if(isset($output['laneID']) and isset($output['columnID'])) $this->kanban->addKanbanCell($kanbanID, $output['laneID'], $output['columnID'], 'story', $storyID); + if(!isset($output['laneID']) or !isset($output['columnID'])) $this->kanban->updateLane($kanbanID, 'story'); } if(is_array($this->post->URS)) diff --git a/module/task/control.php b/module/task/control.php index 956dd1a83b..e053c6ac67 100644 --- a/module/task/control.php +++ b/module/task/control.php @@ -106,8 +106,6 @@ class task extends control return $this->send($response); } - if(isset($output['laneID']) and isset($output['columnID'])) $this->loadModel('kanban')->addKanbanCell($executionID, $output['laneID'], $output['columnID'], 'task', $taskID); - /* if the count of tasksID is 1 then check exists. */ if(count($tasksID) == 1) { @@ -131,6 +129,11 @@ class task extends control $this->action->create('task', $taskID, 'Opened', ''); } + $this->loadModel('kanban'); + $kanbanID = $execution->type == 'kanban' ? $executionID : $_POST['execution']; + if(isset($output['laneID']) and isset($output['columnID'])) $this->kanban->addKanbanCell($kanbanID, $output['laneID'], $output['columnID'], 'task', $taskID); + if(!isset($output['laneID']) or !isset($output['columnID'])) $this->kanban->updateLane($kanbanID, 'task'); + if($todoID > 0) { $this->dao->update(TABLE_TODO)->set('status')->eq('done')->where('id')->eq($todoID)->exec(); @@ -248,15 +251,16 @@ class task extends control /** * Batch create task. * - * @param int $executionID - * @param int $storyID - * @param int $iframe - * @param int $taskID + * @param int $executionID + * @param int $storyID + * @param int $iframe + * @param int $taskID + * @param string $extra * * @access public * @return void */ - public function batchCreate($executionID = 0, $storyID = 0, $moduleID = 0, $taskID = 0, $iframe = 0) + public function batchCreate($executionID = 0, $storyID = 0, $moduleID = 0, $taskID = 0, $iframe = 0, $extra = '') { $this->execution->getLimitedExecution(); $limitedExecutions = !empty($_SESSION['limitedExecutions']) ? $_SESSION['limitedExecutions'] : ''; @@ -295,7 +299,7 @@ class task extends control if(!empty($_POST)) { - $mails = $this->task->batchCreate($executionID); + $mails = $this->task->batchCreate($executionID, $extra); if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError())); $taskIDList = array(); @@ -797,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); @@ -809,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()) { @@ -963,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())); @@ -1049,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)) @@ -1125,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())); @@ -1257,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)) @@ -1293,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 e1116c3b5a..e3cb5ab2f0 100644 --- a/module/task/model.php +++ b/module/task/model.php @@ -137,8 +137,6 @@ class taskModel extends model $this->dao->insert(TABLE_TASKSPEC)->data($taskSpec)->autoCheck()->exec(); if(dao::isError()) return false; - $this->loadModel('kanban')->updateLane($executionID, 'task'); - if($this->post->story) $this->loadModel('story')->setStage($this->post->story); if($this->post->selectTestStory) { @@ -233,10 +231,11 @@ class taskModel extends model * Create a batch task. * * @param int $executionID + * @param string $extra * @access public * @return void */ - public function batchCreate($executionID) + public function batchCreate($executionID, $extra = '') { /* Load module and init vars. */ $this->loadModel('action'); @@ -247,6 +246,9 @@ class taskModel extends model $preStory = 0; $tasks = fixer::input('post')->get(); + $extra = str_replace(array(',', ' '), array('&', ''), $extra); + parse_str($extra, $output); + /* Judge whether the current task is a parent. */ $parentID = !empty($this->post->parent[0]) ? $this->post->parent[0] : 0; @@ -401,6 +403,9 @@ class taskModel extends model $this->executeHooks($taskID); + $this->loadModel('kanban'); + if(isset($output['laneID']) and isset($output['columnID'])) $this->kanban->addKanbanCell($executionID, $output['laneID'], $output['columnID'], 'task', $taskID); + $actionID = $this->action->create('task', $taskID, 'Opened', ''); if(!dao::isError()) $this->loadModel('score')->create('task', 'create', $taskID); @@ -409,11 +414,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)) { @@ -456,6 +457,8 @@ class taskModel extends model $actionID = $this->action->create('task', $parentID, 'createChildren', '', trim($childTasks, ',')); if(!empty($changes)) $this->action->logHistory($actionID, $changes); } + + if(!isset($output['laneID']) or !isset($output['columnID'])) $this->kanban->updateLane($kanbanID, 'task'); return $mails; } @@ -1014,8 +1017,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; if($oldTask->parent > 0) @@ -1293,7 +1295,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 @@ -1388,12 +1390,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)) @@ -1469,7 +1475,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['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(!dao::isError()) return common::createChanges($oldTask, $task); } @@ -1608,12 +1617,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(); @@ -1731,7 +1744,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['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(!dao::isError()) return common::createChanges($oldTask, $task); } @@ -1740,11 +1756,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') @@ -1757,18 +1777,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['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(!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(); @@ -1791,7 +1819,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['toColID'])) $this->kanban->updateLane($oldTask->execution, 'task', $taskID); + if(isset($output['toColID'])) $this->kanban->moveCard($taskID, $output['fromColID'], $output['toColID'], $output['fromLaneID'], $output['toLaneID']); return common::createChanges($oldTask, $task); } @@ -1800,13 +1831,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(); @@ -1831,7 +1866,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['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(!dao::isError()) return common::createChanges($oldTask, $task); } @@ -1839,13 +1876,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); @@ -1897,7 +1938,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['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(!dao::isError()) return common::createChanges($oldTask, $task); } diff --git a/module/task/view/create.html.php b/module/task/view/create.html.php index c8d56862f1..d161c2f6f0 100644 --- a/module/task/view/create.html.php +++ b/module/task/view/create.html.php @@ -35,10 +35,12 @@ ?>
+ type != 'kanban'):?> +
task->execution;?> id, "class='form-control chosen' onchange='loadAll(this.value)' required");?>
task->type;?> task->typeList, $task->type, "class='form-control chosen' onchange='setOwners(this.value)' required");?>