From 11aa556ce3269933aa27f372bddc8f02f3e2c3fd Mon Sep 17 00:00:00 2001 From: tianshujie Date: Mon, 21 Oct 2024 15:33:26 +0800 Subject: [PATCH] * [task#130232,done,5h] add story field for batch edit task. --- lib/zin/wg/taskeffortinfo/v1.php | 2 +- module/task/js/batchedit.ui.js | 69 +++++++++++++++++++++++++++++++ module/task/model.php | 8 ++-- module/task/tao.php | 2 +- module/task/ui/batchedit.html.php | 6 ++- module/task/zen.php | 10 ++++- 6 files changed, 90 insertions(+), 7 deletions(-) diff --git a/lib/zin/wg/taskeffortinfo/v1.php b/lib/zin/wg/taskeffortinfo/v1.php index cf8ce3b201..32803a23ee 100644 --- a/lib/zin/wg/taskeffortinfo/v1.php +++ b/lib/zin/wg/taskeffortinfo/v1.php @@ -23,7 +23,7 @@ class taskEffortInfo extends wg $items[$lang->task->estimate] = $task->estimate . ' ' . $lang->task->suffixHour; $items[$lang->task->consumed] = - round($task->consumed, 2) . ' ' . $lang->task->suffixHour; + $task->consumed . ' ' . $lang->task->suffixHour; $items[$lang->task->left] = $task->left . ' ' . $lang->task->suffixHour; $items[$lang->task->estStarted] = array('content' => helper::isZeroDate($task->estStarted) ? '' : $task->estStarted, 'contentClass' => 'estStarted-text'); diff --git a/module/task/js/batchedit.ui.js b/module/task/js/batchedit.ui.js index 91294b04e9..0f7cf55646 100644 --- a/module/task/js/batchedit.ui.js +++ b/module/task/js/batchedit.ui.js @@ -58,6 +58,14 @@ window.renderRowData = function($row, index, row) $module.$.setValue(row.module); }); } + + $row.find('[data-name="story"]').find('.picker-box').on('inited', function(e, info) + { + const storyItems = stories[row.module] != undefined ? stories[row.module] : []; + const $storyPicker = info[0]; + $storyPicker.render({items: storyItems}); + $storyPicker.$.setValue(row.story); + }); } window.clickSubmit = async function(e) @@ -191,3 +199,64 @@ function checkBatchEstStartedAndDeadline(event) } } } + +/** + * Get select of stories. + * + * @access public + * @return void + */ +function setStories(event) +{ + const $module = $(event.target); + const $currentRow = $module.closest('tr'); + const moduleID = $module.val(); + const getStoryLink = $.createLink('task', 'ajaxGetStories', 'executionID=' + executionID + '&moduleID=' + moduleID); + + let $row = $currentRow; + while($row.length) + { + const $storyPicker = $row.find('[name^=story]').zui('picker'); + const storyID = $row.find('[name^=story]').val(); + $.getJSON(getStoryLink, function(stories) + { + $storyPicker.render({items: stories}) + $storyPicker.$.setValue(storyID); + }); + + $row = $row.next('tr'); + if(!$row.find('td[data-name="module"][data-ditto="on"]').length) break; + } +} + +/** + * Set preview. + * + * @access public + * @return void + */ +function setStoryRelated(event) +{ + let $story = $(event.target).closest('td').find('input[name^=story]'); + let $currentRow = $(event.target).closest('tr'); + let storyID = $story.val(); + let link = $.createLink('story', 'ajaxGetInfo', 'storyID=' + storyID + '&pageType=batch'); + let $row = $currentRow; + + while($row.length) + { + const $module = $row.find('input[name^="module"]'); + + if(storyID > 0) + { + $.getJSON(link, function(data) + { + const storyInfo = data['storyInfo']; + $module.zui('picker').$.setValue(parseInt(storyInfo.moduleID), true); + }); + } + + $row = $row.next('tr'); + if(!$row.find('td[data-name="story"][data-ditto="on"]').length) break; + } +} diff --git a/module/task/model.php b/module/task/model.php index c655c01574..08e579372c 100755 --- a/module/task/model.php +++ b/module/task/model.php @@ -1273,9 +1273,6 @@ class taskModel extends model $task->closedDate = !empty($task->closedDate) ? substr($task->closedDate, 0, 19) : null; $task->lastEditedDate = !empty($task->lastEditedDate) ? substr($task->lastEditedDate, 0, 19) : null; $task->realStarted = !empty($task->realStarted) ? substr($task->realStarted, 0, 19) : null; - $task->estimate = helper::formatHours($task->estimate); - $task->left = helper::formatHours($task->left); - $task->consumed = helper::formatHours($task->consumed); /* Get the child tasks of the parent task. */ $children = $this->dao->select('*')->from(TABLE_TASK)->where('parent')->eq($taskID)->andWhere('deleted')->eq(0)->fetchAll('id'); @@ -2588,6 +2585,11 @@ class taskModel extends model $task->teamMembers = implode(',', array_keys($teamMembers)); } + /* Format task hours. */ + $task->estimate = helper::formatHours($task->estimate); + $task->consumed = helper::formatHours($task->consumed); + $task->left = helper::formatHours($task->left); + foreach($task as $field => $value) { if(in_array($field, $this->config->task->dateFields) && helper::isZeroDate($value)) $task->$field = ''; diff --git a/module/task/tao.php b/module/task/tao.php index 5293226797..527e55fbec 100644 --- a/module/task/tao.php +++ b/module/task/tao.php @@ -259,7 +259,7 @@ class taskTao extends taskModel */ protected function computeTaskProgress(object $task): float { - if($task->left > 0) return round($task->consumed / ($task->consumed + (float)$task->left), 2) * 100; + if($task->left > 0) return round($task->consumed / ((float)$task->consumed + (float)$task->left), 2) * 100; if($task->consumed == 0) return 0; return 100; } diff --git a/module/task/ui/batchedit.html.php b/module/task/ui/batchedit.html.php index 2d872b000b..71a3d9e89a 100644 --- a/module/task/ui/batchedit.html.php +++ b/module/task/ui/batchedit.html.php @@ -21,6 +21,7 @@ jsVar('executionID', $executionID); jsVar('childTasks', $childTasks); jsVar('nonStoryChildTasks', $nonStoryChildTasks); jsVar('tasks', $tasks); +jsVar('stories', $stories); jsVar('syncStoryToAllChildrenTip', $lang->task->syncStoryToAllChildrenTip); jsVar('syncStoryToChildrenTip', $lang->task->syncStoryToChildrenTip); jsVar('parentTasks', $parentTasks); @@ -39,6 +40,9 @@ formBatchPanel set::ajax(array('beforeSubmit' => jsRaw('clickSubmit'))), on::change('[data-name="status"]', 'statusChange'), on::change('[data-name="estStarted"], [data-name="deadline"]', 'checkBatchEstStartedAndDeadline'), + on::change('[data-name="module"]', 'setStories'), + on::change('input[name^=story]', 'setStoryRelated'), + on::click('[data-name=story] [data-type=ditto]', 'setStoryRelated'), set::formID('taskBatchEditForm' . $executionID), formBatchItem ( @@ -76,7 +80,7 @@ formBatchPanel set::name('story'), set::label($lang->task->story), set::control('picker'), - set::items($stories), + set::items(array()), set::width('200px'), set::ditto(true), set::defaultDitto('off') diff --git a/module/task/zen.php b/module/task/zen.php index 085016a259..9b4777211a 100644 --- a/module/task/zen.php +++ b/module/task/zen.php @@ -237,6 +237,14 @@ class taskZen extends task } list($childTasks, $nonStoryChildTasks) = $this->task->getChildTasksByList(array_keys($tasks)); + $storyPairs = $this->story->getExecutionStoryPairs($executionID, 0, 'all', '', 'full', 'active', 'story', false);; + $storyList = $this->story->getByList(array_keys($storyPairs)); + $stories = array(); + foreach($storyList as $story) + { + $stories[0][] = array('value' => $story->id, 'text' => $storyPairs[$story->id]); + if($story->module) $stories[$story->module][] = array('value' => $story->id, 'text' => $storyPairs[$story->id]); + } /* Assign. */ $this->view->executionID = $executionID; @@ -247,7 +255,7 @@ class taskZen extends task $this->view->moduleGroup = $moduleGroup; $this->view->childTasks = $childTasks; $this->view->nonStoryChildTasks = $nonStoryChildTasks; - $this->view->stories = $this->story->getExecutionStoryPairs($executionID, 0, 'all', '', 'full', 'active', 'story', false); + $this->view->stories = $stories; $this->view->parentTasks = $this->task->getByIdList($parentTaskIdList); $this->display();