diff --git a/module/release/js/view.ui.js b/module/release/js/view.ui.js index 284e6434c1..62c25e4c25 100644 --- a/module/release/js/view.ui.js +++ b/module/release/js/view.ui.js @@ -12,3 +12,79 @@ $(document).off('click','.dtable-footer .batch-btn').on('click', '.dtable-footer data: postData }); }); + +/** + * 计算表格任务信息的统计。 + * set task summary for table footer. + * + * @param element element + * @param array checkedidlist + * @access public + * @return object + */ +window.setStoryStatistics = function(element, checkedIDList) +{ + const checkedTotal = checkedIDList.length; + if(checkedTotal == 0) return {html: summary}; + + let checkedEstimate = 0; + let checkedCase = 0; + let rateCount = checkedTotal; + + const rows = element.layout.allRows; + rows.forEach((row) => { + if(checkedIDList.includes(row.id)) + { + const story = row.data; + const cases = storyCases[row.id]; + checkedEstimate += story.estimate; + + if(cases > 0) + { + checkedCase ++; + } + else if(story.children != undefined && story.children > 0) + { + rateCount --; + } + } + }) + + let rate = '0%'; + if(rateCount) rate = Math.round(checkedCase / rateCount * 100) + '%'; + + return { + html: checkedSummary.replace('%total%', checkedTotal).replace('%estimate%', checkedEstimate.toFixed(1)).replace('%rate%', rate) + }; +} + +/** + * 生成列表的排序链接。 + * Create sort link for table. + * + * @param object col + * @access public + * @return string + */ +window.createSortLink = function(col) +{ + var sort = col.name + '_asc'; + if(sort == orderBy) sort = col.name + '_desc'; + return sortLink.replace('{orderBy}', sort); +} + +/** + * 移除关联的需求。 + * Remove linked story. + * + * @param int storyID + * @access public + * @return void + */ +window.unlinkStory = function(storyID) +{ + if(window.confirm(confirmUnlinkStory)) + { + $.ajaxSubmit({url: unlinkStoryUrl.replace('%s', storyID)}); + } +} diff --git a/module/release/ui/view.html.php b/module/release/ui/view.html.php index 0bc86a2c4b..55a5b22c5b 100644 --- a/module/release/ui/view.html.php +++ b/module/release/ui/view.html.php @@ -19,13 +19,21 @@ detailHeader ); jsVar('type', $type); +jsVar('orderBy', $orderBy); +jsVar('sortLink', helper::createLink('release', 'view', "releaseID={$release->id}&type={$type}&link={$link}¶m={$param}&orderBy={orderBy}")); +jsVar('storyCases', $storyCases); +jsVar('summary', $summary); +jsVar('checkedSummary', str_replace('%storyCommon%', $lang->SRCommon, $lang->product->checkedSummary)); /* Table data and setting for finished story tab. */ -$storyFootToolbar = array(); -$storyTableData = initTableData($stories, $config->release->dtable->story->fieldList, $this->release); +jsVar('confirmUnlinkStory', $lang->release->confirmUnlinkStory); +jsVar('unlinkStoryUrl', helper::createLink('release', 'unlinkStory', "releaseID={$release->id}&story=%s")); +$storyTableData = initTableData($stories, $config->release->dtable->story->fieldList, $this->release); $canBatchUnlinkStory = common::hasPriv('release', 'batchUnlinkStory'); $canBatchCloseStory = common::hasPriv('story', 'batchClose'); + +$storyFootToolbar = array(); if($canBatchUnlinkStory) $storyFootToolbar['items'][] = array('class' => 'btn primary size-sm batch-btn', 'text' => $lang->release->batchUnlink, 'btnType' => 'primary', 'data-url' => inlink('batchUnlinkStory', "release={$release->id}")); if($canBatchCloseStory) $storyFootToolbar['items'][] = array('class' => 'btn primary size-sm batch-btn', 'text' => $lang->story->batchClose, 'btnType' => 'primary', 'data-url' => createLink('story', 'batchClose', "productID={$release->product}")); @@ -45,7 +53,7 @@ detailBody set::cols(array_values($config->release->dtable->story->fieldList)), set::data($storyTableData), set::checkable(true), - //set::sortLink(jsRaw('createSortLink')), + set::sortLink(jsRaw('createSortLink')), set::footToolbar($storyFootToolbar), set::footPager( usePager(null, 'storyPager'), @@ -53,7 +61,7 @@ detailBody set::recTotal($storyPager->recTotal), set::linkCreator(helper::createLink('release', 'view', "releaseID={$release->id}&type={$type}&link={$link}¶m={$param}&orderBy={$orderBy}&recTotal={$storyPager->recTotal}&recPerPage={recPerPage}&page={page}")) ), - //set::checkInfo(jsRaw('function(checkedIDList){return window.setStatistics(this, checkedIDList);}')) + set::checkInfo(jsRaw('function(checkedIDList){return window.setStoryStatistics(this, checkedIDList);}')) ) ), )