diff --git a/module/my/config/table.php b/module/my/config/table.php index 0a1fc89b0c..be551f286e 100644 --- a/module/my/config/table.php +++ b/module/my/config/table.php @@ -138,36 +138,36 @@ $config->my->requirement->actionList = array(); $config->my->requirement->actionList['change']['icon'] = 'alter'; $config->my->requirement->actionList['change']['text'] = $lang->story->change; $config->my->requirement->actionList['change']['hint'] = $lang->story->change; -$config->my->requirement->actionList['change']['url'] = helper::createLink('story', 'change', 'story={id}&from=&storyType=requirement'); +$config->my->requirement->actionList['change']['url'] = helper::createLink('story', 'change', 'storyID={id}&from=&storyType=requirement'); $config->my->requirement->actionList['change']['data-toggle'] = 'modal'; $config->my->requirement->actionList['submitReview']['icon'] = 'confirm'; $config->my->requirement->actionList['submitReview']['text'] = $lang->story->submitReview; $config->my->requirement->actionList['submitReview']['hint'] = $lang->story->submitReview; -$config->my->requirement->actionList['submitReview']['url'] = helper::createLink('story', 'submitReview', 'story={id}&storyType=requirement'); +$config->my->requirement->actionList['submitReview']['url'] = helper::createLink('story', 'submitReview', 'storyID={id}&storyType=requirement'); $config->my->requirement->actionList['submitReview']['data-toggle'] = 'modal'; $config->my->requirement->actionList['review']['icon'] = 'search'; $config->my->requirement->actionList['review']['text'] = $lang->story->review; $config->my->requirement->actionList['review']['hint'] = $lang->story->review; -$config->my->requirement->actionList['review']['url'] = helper::createLink('story', 'review', 'story={id}&from=product&storyType=requirement'); +$config->my->requirement->actionList['review']['url'] = helper::createLink('story', 'review', 'storyID={id}&from=product&storyType=requirement'); $config->my->requirement->actionList['review']['data-toggle'] = 'modal'; $config->my->requirement->actionList['recall']['icon'] = 'undo'; $config->my->requirement->actionList['recall']['text'] = $lang->story->recall; $config->my->requirement->actionList['recall']['hint'] = $lang->story->recall; -$config->my->requirement->actionList['recall']['url'] = helper::createLink('story', 'recall', 'story={id}&from=list&confirm=no&storyType=requirement'); +$config->my->requirement->actionList['recall']['url'] = helper::createLink('story', 'recall', 'storyID={id}&from=list&confirm=no&storyType=requirement'); $config->my->requirement->actionList['edit']['icon'] = 'edit'; $config->my->requirement->actionList['edit']['text'] = $lang->story->edit; $config->my->requirement->actionList['edit']['hint'] = $lang->story->edit; -$config->my->requirement->actionList['edit']['url'] = helper::createLink('story', 'edit', 'story={id}&from=default&storyType=requirement'); +$config->my->requirement->actionList['edit']['url'] = helper::createLink('story', 'edit', 'storyID={id}&from=default&storyType=requirement'); $config->my->requirement->actionList['edit']['data-toggle'] = 'modal'; -$config->my->requirement->actionList['close']['icon'] = 'close'; +$config->my->requirement->actionList['close']['icon'] = 'off'; $config->my->requirement->actionList['close']['text'] = $lang->story->close; $config->my->requirement->actionList['close']['hint'] = $lang->story->close; -$config->my->requirement->actionList['close']['url'] = helper::createLink('story', 'close', 'story={id}&from=&storyType=requirement'); +$config->my->requirement->actionList['close']['url'] = helper::createLink('story', 'close', 'storyID={id}&from=&storyType=requirement'); $config->my->requirement->dtable = new stdclass(); $config->my->requirement->dtable->fieldList['id']['name'] = 'id'; @@ -200,7 +200,6 @@ $config->my->requirement->dtable->fieldList['status']['group'] = 'pri'; $config->my->requirement->dtable->fieldList['openedBy']['name'] = 'openedBy'; $config->my->requirement->dtable->fieldList['openedBy']['title'] = $lang->story->openedByAB; $config->my->requirement->dtable->fieldList['openedBy']['type'] = 'user'; -$config->my->requirement->dtable->fieldList['openedBy']['statusMap'] = $lang->story->statusList; $config->my->requirement->dtable->fieldList['openedBy']['group'] = 'openedBy'; $config->my->requirement->dtable->fieldList['estimate']['name'] = 'estimate'; @@ -221,6 +220,98 @@ $config->my->requirement->dtable->fieldList['actions']['sortType'] = false; $config->my->requirement->dtable->fieldList['actions']['list'] = $config->my->requirement->actionList; $config->my->requirement->dtable->fieldList['actions']['menu'] = array('change', 'submitReview|review', 'recall', 'edit', 'close'); +$config->my->story = new stdclass(); +$config->my->story->actionList = array(); +$config->my->story->actionList['change']['icon'] = 'alter'; +$config->my->story->actionList['change']['text'] = $lang->story->change; +$config->my->story->actionList['change']['hint'] = $lang->story->change; +$config->my->story->actionList['change']['url'] = helper::createLink('story', 'change', 'storyID={id}'); +$config->my->story->actionList['change']['data-toggle'] = 'modal'; + +$config->my->story->actionList['submitReview']['icon'] = 'confirm'; +$config->my->story->actionList['submitReview']['text'] = $lang->story->submitReview; +$config->my->story->actionList['submitReview']['hint'] = $lang->story->submitReview; +$config->my->story->actionList['submitReview']['url'] = helper::createLink('story', 'submitReview', 'storyID={id}'); +$config->my->story->actionList['submitReview']['data-toggle'] = 'modal'; + +$config->my->story->actionList['review']['icon'] = 'search'; +$config->my->story->actionList['review']['text'] = $lang->story->review; +$config->my->story->actionList['review']['hint'] = $lang->story->review; +$config->my->story->actionList['review']['url'] = helper::createLink('story', 'review', 'storyID={id}'); +$config->my->story->actionList['review']['data-toggle'] = 'modal'; + +$config->my->story->actionList['recall']['icon'] = 'undo'; +$config->my->story->actionList['recall']['text'] = $lang->story->recall; +$config->my->story->actionList['recall']['hint'] = $lang->story->recall; +$config->my->story->actionList['recall']['url'] = helper::createLink('story', 'recall', 'storyID={id}'); + +$config->my->story->actionList['create']['icon'] = 'sitemap'; +$config->my->story->actionList['create']['text'] = $lang->story->edit; +$config->my->story->actionList['create']['hint'] = $lang->story->edit; +$config->my->story->actionList['create']['url'] = helper::createLink('testcase', 'create', 'productID={product}&branch={branch}&module=0&from=¶m=0&storyID={id}'); +$config->my->story->actionList['create']['data-toggle'] = 'modal'; + +$config->my->story->actionList['close']['icon'] = 'off'; +$config->my->story->actionList['close']['text'] = $lang->story->close; +$config->my->story->actionList['close']['hint'] = $lang->story->close; +$config->my->story->actionList['close']['url'] = helper::createLink('story', 'close', 'storyID={id}'); + +$config->my->story->dtable = new stdclass(); +$config->my->story->dtable->fieldList['id']['name'] = 'id'; +$config->my->story->dtable->fieldList['id']['title'] = $lang->idAB; +$config->my->story->dtable->fieldList['id']['type'] = 'checkID'; +$config->my->story->dtable->fieldList['id']['fixed'] = 'left'; + +$config->my->story->dtable->fieldList['title']['name'] = 'title'; +$config->my->story->dtable->fieldList['title']['title'] = common::checkNotCN() ? $lang->SRCommon . ' ' . $lang->my->name : $lang->SRCommon . $lang->my->name; +$config->my->story->dtable->fieldList['title']['type'] = 'title'; +$config->my->story->dtable->fieldList['title']['link'] = helper::createLink('story', 'view', 'id={id}'); +$config->my->story->dtable->fieldList['title']['fixed'] = 'left'; + +$config->my->story->dtable->fieldList['pri']['name'] = 'pri'; +$config->my->story->dtable->fieldList['pri']['title'] = $lang->priAB; +$config->my->story->dtable->fieldList['pri']['type'] = 'pri'; +$config->my->story->dtable->fieldList['pri']['group'] = 'pri'; + +$config->my->story->dtable->fieldList['product']['name'] = 'productTitle'; +$config->my->story->dtable->fieldList['product']['title'] = $lang->story->product; +$config->my->story->dtable->fieldList['product']['type'] = 'text'; +$config->my->story->dtable->fieldList['product']['group'] = 'pri'; + +$config->my->story->dtable->fieldList['plan']['name'] = 'planTitle'; +$config->my->story->dtable->fieldList['plan']['title'] = $lang->story->plan; +$config->my->story->dtable->fieldList['plan']['type'] = 'text'; +$config->my->story->dtable->fieldList['plan']['group'] = 'pri'; + +$config->my->story->dtable->fieldList['status']['name'] = 'status'; +$config->my->story->dtable->fieldList['status']['title'] = $lang->statusAB; +$config->my->story->dtable->fieldList['status']['type'] = 'status'; +$config->my->story->dtable->fieldList['status']['statusMap'] = $lang->story->statusList; +$config->my->story->dtable->fieldList['status']['group'] = 'pri'; + +$config->my->story->dtable->fieldList['openedBy']['name'] = 'openedBy'; +$config->my->story->dtable->fieldList['openedBy']['title'] = $lang->story->openedByAB; +$config->my->story->dtable->fieldList['openedBy']['type'] = 'user'; +$config->my->story->dtable->fieldList['openedBy']['group'] = 'openedBy'; + +$config->my->story->dtable->fieldList['estimate']['name'] = 'estimate'; +$config->my->story->dtable->fieldList['estimate']['title'] = $lang->story->estimateAB; +$config->my->story->dtable->fieldList['estimate']['type'] = 'count'; +$config->my->story->dtable->fieldList['estimate']['group'] = 'openedBy'; + +$config->my->story->dtable->fieldList['stage']['name'] = 'stage'; +$config->my->story->dtable->fieldList['stage']['title'] = $lang->story->stageAB; +$config->my->story->dtable->fieldList['stage']['type'] = 'category'; +$config->my->story->dtable->fieldList['stage']['map'] = $lang->story->stageList; +$config->my->story->dtable->fieldList['stage']['group'] = 'openedBy'; + +$config->my->story->dtable->fieldList['actions']['name'] = 'actions'; +$config->my->story->dtable->fieldList['actions']['title'] = $lang->actions; +$config->my->story->dtable->fieldList['actions']['type'] = 'actions'; +$config->my->story->dtable->fieldList['actions']['sortType'] = false; +$config->my->story->dtable->fieldList['actions']['list'] = $config->my->story->actionList; +$config->my->story->dtable->fieldList['actions']['menu'] = array('change', 'submitReview|review', 'recall', 'create', 'close'); + $config->my->audit->dtable = new stdclass(); $config->my->audit->dtable->fieldList['id']['name'] = 'id'; $config->my->audit->dtable->fieldList['id']['title'] = $lang->idAB; diff --git a/module/my/control.php b/module/my/control.php index bf3fc7d5eb..9b6a3dafc9 100755 --- a/module/my/control.php +++ b/module/my/control.php @@ -372,6 +372,8 @@ EOF; $actionURL = $this->createLink('my', $currentMethod, "mode=story&type=bysearch¶m=myQueryID&orderBy={$orderBy}&recTotal={$recTotal}&recPerPage={$recPerPage}&pageID={$pageID}"); $this->my->buildStorySearchForm($queryID, $actionURL, $currentMethod); + foreach($stories as $story) $story->estimate = $story->estimate . $this->config->hourUnit; + /* Assign. */ $this->view->title = $this->lang->my->common . $this->lang->colon . $this->lang->my->story; $this->view->stories = $stories; diff --git a/module/my/model.php b/module/my/model.php index 5bb539aa27..68651c8aba 100644 --- a/module/my/model.php +++ b/module/my/model.php @@ -786,7 +786,7 @@ class myModel extends model $this->config->product->search['actionURL'] = $actionURL; $this->config->product->search['params']['product']['values'] = array('' => '') + $products; $this->config->product->search['params']['plan']['values'] = array('' => '') + $this->loadModel('productplan')->getPairs($productIdList, $branchParam); - + $this->config->product->search['fields']['title'] = $this->lang->story->title; unset($this->config->product->search['fields']['module']); $this->loadModel('search')->setSearchParams($this->config->product->search); diff --git a/module/my/ui/story.html.php b/module/my/ui/story.html.php new file mode 100644 index 0000000000..206a1a6574 --- /dev/null +++ b/module/my/ui/story.html.php @@ -0,0 +1,84 @@ + + * @package my + * @link https://www.zentao.net + */ +namespace zin; + +featureBar +( + set::current($type), + set::linkParams("mode=story&type={key}¶m={$param}"), + li(searchToggle()) +); + +$footToolbar = array('items' => array +( + array('text' => $lang->edit, 'className' => 'batch-btn ' . (common::hasPriv('story', 'batchEdit') ? '' : 'hidden'), 'data-url' => helper::createLink('story', 'batchEdit', "productID=0&executionID=0&branch=0&storyType=story&from={$app->rawMethod}")), + array('caret' => 'up', 'text' => $lang->story->review, 'className' => common::hasPriv('story', 'batchReview') ? '' : 'hidden', 'url' => '#navReview', 'data-toggle' => 'dropdown', 'data-placement' => 'top-start'), + array('caret' => 'up', 'text' => $lang->story->assignedTo, 'className' => common::hasPriv('story', 'batchAssignTo') ? '' : 'hidden','url' => '#navAssignedTo', 'data-toggle' => 'dropdown', 'data-placement' => 'top-start'), + array('text' => $lang->story->close, 'className' => 'batch-btn ajax-btn ' . (common::hasPriv('story', 'batchClose') ? '' : 'hidden'), 'data-url' => helper::createLink('story', 'batchClose', "productID=0&executionID=0&storyType=story&from={$app->rawMethod}")), +), 'btnProps' => array('size' => 'sm', 'btnType' => 'secondary')); + +$rejectItems = array(); +foreach($lang->story->reasonList as $key => $reason) +{ + if(!$key || $key == 'subdivided' || $key == 'duplicate') continue; + $rejectItems[] = array('text' => $reason, 'class' => 'batch-btn ajax-btn', 'data-url' => helper::createLink('story', 'batchReview', "result=reject&reason={$key}&storyType=story")); +} + +$reviewItems = array(); +foreach($lang->story->reviewResultList as $key => $result) +{ + if(!$key || $key == 'revert') continue; + if($key == 'reject') + { + $reviewItems[] = array('text' => $result, 'class' => 'not-hide-menu', 'items' => $rejectItems); + } + else + { + $reviewItems[] = array('text' => $result, 'class' => 'batch-btn ajax-btn', 'data-url' => helper::createLink('story', 'batchReview', "result={$key}&reason=&storyType=story")); + } +} + +menu +( + set::id('navReview'), + set::class('menu dropdown-menu'), + set::items($reviewItems) +); + +$assignedToItems = array(); +foreach($users as $key => $value) +{ + if(empty($key) || $key == 'closed') continue; + $assignedToItems[] = array('text' => $value, 'class' => 'batch-btn ajax-btn', 'data-url' => helper::createLink('story', 'batchAssignTo', "storyType=story&assignedTo={$key}")); +} + +menu +( + set::id('navAssignedTo'), + set::class('dropdown-menu'), + set::items($assignedToItems) +); + +$stories = initTableData($stories, $config->my->story->dtable->fieldList, $this->story); +$cols = array_values($config->my->story->dtable->fieldList); +$data = array_values($stories); +dtable +( + set::cols($cols), + set::data($data), + set::userMap($users), + set::fixedLeftWidth('44%'), + set::checkable(true), + set::footToolbar($footToolbar), + set::footPager(usePager()), +); + +render();