Merge branch release/22.0.beta of zentao/zentaopms (#13229)
This commit is contained in:
@@ -83,7 +83,7 @@ class twinsStory extends wg
|
||||
picker(setID('plans_0'), set::name('plans[0]'), set::items($planItems), set::value($defaultPlan))
|
||||
)
|
||||
),
|
||||
count($branchItems) > 1 ? formGroup
|
||||
!empty($branchItems) && count($branchItems) > 1 ? formGroup
|
||||
(
|
||||
setClass('c-actions'),
|
||||
btn(setClass('btn-link addNewLine'), setData(array('on' => 'click', 'call' => 'addBranchesBox', 'params' => 'event')), set::title(sprintf($lang->story->addBranch, $lang->product->branchName[$productType])), icon('plus'))
|
||||
|
||||
@@ -119,11 +119,18 @@ class story extends control
|
||||
$fields = $this->storyZen->setModuleField($fields, $moduleID);
|
||||
$fields = $this->storyZen->removeFormFieldsForCreate($fields, $storyType);
|
||||
|
||||
$this->view->title = $this->view->product->name . $this->lang->hyphen . $this->lang->story->create;
|
||||
$this->view->fields = $fields;
|
||||
$this->view->blockID = $this->storyZen->getAssignMeBlockID();
|
||||
$this->view->type = $storyType;
|
||||
$this->view->initStory = $initStory;
|
||||
$this->view->title = $this->view->product->name . $this->lang->hyphen . $this->lang->story->create;
|
||||
$this->view->fields = $fields;
|
||||
$this->view->blockID = $this->storyZen->getAssignMeBlockID();
|
||||
$this->view->type = $storyType;
|
||||
$this->view->initStory = $initStory;
|
||||
$this->view->forceReview = $this->story->checkForceReview($storyType);
|
||||
|
||||
$extras = str_replace(array(',', ' ', '*'), array('&', '', '-'), $extra);
|
||||
parse_str($extras, $params);
|
||||
if(!isset($params['needNotReview'])) $extra .= ',needNotReview={needNotReview}';
|
||||
$this->view->needNotReview = $params['needNotReview'] ?? !$this->view->forceReview;
|
||||
$this->view->loadUrl = $this->createLink($storyType, 'create', "productID={product}&branch={branch}&moduleID=$moduleID&story=$storyID&objectID=$objectID&bugID=$bugID&planID=$planID&todoID=$todoID&extra=$extra&storyType=$storyType");
|
||||
|
||||
$this->display();
|
||||
}
|
||||
|
||||
@@ -68,7 +68,7 @@ window.loadProductPlans = function(productID, branch)
|
||||
|
||||
let params = config.currentMethod == 'create' ? 'unexpired,noclosed' : '';
|
||||
let planLink = $.createLink('product', 'ajaxGetPlans', 'productID=' + productID + '&branch=' + branch + '¶ms=' + params + '&skipParent=true');
|
||||
let $planIdBox = $('#planIdBox');
|
||||
let $planIdBox = $('div[data-name="plan"] #planIdBox');
|
||||
|
||||
$.get(planLink, function(data)
|
||||
{
|
||||
|
||||
@@ -14,7 +14,7 @@ cid=18698
|
||||
- 第plan条的className属性 @hidden
|
||||
- 第product条的className属性 @hidden
|
||||
- 测试步骤5第parent条的className属性 @~~
|
||||
- 测试步骤6第parent条的className属性 @hidden
|
||||
- 测试步骤6第parent条的className属性 @~~
|
||||
- 测试步骤7第product条的className属性 @~~
|
||||
|
||||
*/
|
||||
@@ -129,7 +129,7 @@ $product6 = new stdClass();
|
||||
$product6->id = 1;
|
||||
$product6->shadow = 0;
|
||||
$tester->config->showStoryGrade = '';
|
||||
r($storyTest->hiddenFormFieldsForEditTest($fields6, 'epic', $product6)) && p('parent:className') && e('hidden'); // 测试步骤6
|
||||
r($storyTest->hiddenFormFieldsForEditTest($fields6, 'epic', $product6)) && p('parent:className') && e('~~'); // 测试步骤6
|
||||
|
||||
// 测试场景7: 普通产品(非影子产品),story类型
|
||||
$fields7 = array(
|
||||
@@ -142,4 +142,4 @@ $fields7 = array(
|
||||
$product7 = new stdClass();
|
||||
$product7->id = 1;
|
||||
$product7->shadow = 0;
|
||||
r($storyTest->hiddenFormFieldsForEditTest($fields7, 'story', $product7)) && p('product:className') && e('~~'); // 测试步骤7
|
||||
r($storyTest->hiddenFormFieldsForEditTest($fields7, 'story', $product7)) && p('product:className') && e('~~'); // 测试步骤7
|
||||
|
||||
@@ -33,7 +33,7 @@ foreach(explode(',', $this->config->{$type}->create->requiredFields) as $require
|
||||
$roadmaps = !empty($roadmaps) ? $roadmaps : array();
|
||||
|
||||
/* Generate fields for the batch create form. */
|
||||
$fnGenerateFields = function() use ($app, $lang, $type, $fields, $stories, $customFields, $showFields, $storyID, $gradeRule, $hiddenGrade, $roadmaps)
|
||||
$fnGenerateFields = function() use ($app, $lang, $type, $fields, $stories, $customFields, $showFields, $storyID, $gradeRule, $roadmaps)
|
||||
{
|
||||
global $config;
|
||||
|
||||
@@ -66,7 +66,6 @@ $fnGenerateFields = function() use ($app, $lang, $type, $fields, $stories, $cust
|
||||
if($colName == 'sourceNote' && strpos(",$showFields,", ",source,") === false) $cols[$index]['hidden'] = true;
|
||||
if($colName == 'plan' && $type != 'story') $cols[$index]['multiple'] = true;
|
||||
if($colName == 'grade' && $gradeRule == 'stepwise') $cols[$index]['disabled'] = true;
|
||||
if($colName == 'grade' && $hiddenGrade) $cols[$index]['hidden'] = true;
|
||||
if($colName == 'parent' && $storyID > 0 ) $cols[$index]['hidden'] = true;
|
||||
if($colName == 'source') $cols[$index]['items'] = $lang->{$type}->sourceList;
|
||||
if($colName == 'category') $cols[$index]['items'] = $lang->{$type}->categoryList;
|
||||
|
||||
@@ -26,45 +26,42 @@ $fields->field('module')
|
||||
->items($createFields['module']['options'])
|
||||
->value($createFields['module']['default']);
|
||||
|
||||
if(isset($createFields['branch']) && $type == 'story')
|
||||
{
|
||||
$fields->remove('module');
|
||||
$fields->field('twinsStory')
|
||||
->width('full')
|
||||
->control(array
|
||||
(
|
||||
'type' => 'twinsstory',
|
||||
'productType' => data('product.type'),
|
||||
'branchItems' => $createFields['branch']['options'],
|
||||
'defaultBranch' => $createFields['branch']['default'],
|
||||
'moduleItems' => $createFields['module']['options'],
|
||||
'defaultModule' => $createFields['module']['default'],
|
||||
'planItems' => $createFields['plan']['options'],
|
||||
'defaultPlan' => $createFields['plan']['default'],
|
||||
));
|
||||
}
|
||||
if(isset($createFields['branch']) && $type == 'story') $fields->remove('module');
|
||||
$fields->field('twinsStory')
|
||||
->width('full')
|
||||
->hidden(!isset($createFields['branch']) || $type != 'story')
|
||||
->control(array
|
||||
(
|
||||
'type' => 'twinsstory',
|
||||
'productType' => data('product.type'),
|
||||
'branchItems' => $createFields['branch']['options'] ?? array(),
|
||||
'defaultBranch' => $createFields['branch']['default'] ?? 0,
|
||||
'moduleItems' => $createFields['module']['options'],
|
||||
'defaultModule' => $createFields['module']['default'],
|
||||
'planItems' => $createFields['plan']['options'],
|
||||
'defaultPlan' => $createFields['plan']['default'],
|
||||
));
|
||||
|
||||
$fields->field('parent')
|
||||
->id('parentBox')
|
||||
->hidden(data('hiddenParent'))
|
||||
->items($createFields['parent']['options'])
|
||||
->value($createFields['parent']['default']);
|
||||
|
||||
$fields->field('grade')
|
||||
->hidden(data('hiddenGrade'))
|
||||
->disabled($gradeRule == 'stepwise')
|
||||
->required()
|
||||
->items($createFields['grade']['options'])
|
||||
->value($createFields['grade']['default']);
|
||||
|
||||
$fields->field('reviewer')
|
||||
->hidden(!data('forceReview') && !empty(data('needNotReview')))
|
||||
->width('full')
|
||||
->required()
|
||||
->control('inputGroup')
|
||||
->id('reviewerBox')
|
||||
->items(false)
|
||||
->itemBegin('reviewer[]')->control('picker')->id('reviewer')->items($createFields['reviewer']['options'])->value($createFields['reviewer']['default'])->multiple()->itemEnd();
|
||||
$fields->field('needNotReview')->control('hidden')->value(0);
|
||||
$fields->field('needNotReview')->control('hidden')->value(data('forceReview') ? 0 : 1);
|
||||
|
||||
$fields->field('assignedTo')
|
||||
->required($createFields['assignedTo']['required'])
|
||||
@@ -136,7 +133,7 @@ if(!(isset($createFields['branch']) && $type == 'story') && isset($createFields[
|
||||
->items(false)
|
||||
->itemBegin('plan')->control('picker')->id('planIdBox')->items($createFields['plan']['options'])->value($createFields['plan']['default'])->multiple($type != 'story')->itemEnd()
|
||||
->item(empty($createFields['plan']['options']) && hasPriv('productplan', 'create') ? field()->control('btn')->icon('plus')->url(createLink('productplan', 'create', 'productID=' . data('productID') . '&branch=' . data('branch')))->set(array('data-toggle' => 'modal', 'data-size' => 'lg'))->set('title', $lang->productplan->create) : null)
|
||||
->item(empty($createFields['plan']['options']) ? field()->control('btn')->icon('refresh')->id("loadProductPlans")->set('title', $lang->refresh) : null);
|
||||
->item(empty($createFields['plan']['options']) ? field()->control(array('control' => 'btn', 'data-on' => 'click', 'data-call' => 'loadProductPlans', 'data-params' => data('productID')))->icon('refresh')->id("loadProductPlans")->set('title', $lang->refresh) : null);
|
||||
}
|
||||
|
||||
$fields->field('source')
|
||||
|
||||
@@ -17,10 +17,7 @@ data('storyType', $type);
|
||||
data('gradeRule', $gradeRule);
|
||||
if($app->tab == 'product') data('activeMenuID', $type);
|
||||
|
||||
$forceReview = $this->story->checkForceReview($type);
|
||||
$createFields = useFields('story.create');
|
||||
$createFields->field('needNotReview')->value($forceReview ? 0 : 1);
|
||||
if(!$forceReview) $createFields->field('reviewer')->hidden(true);
|
||||
|
||||
if((isset($fields['branch']) && $type == 'story') || $type != 'story')
|
||||
{
|
||||
@@ -82,7 +79,7 @@ else
|
||||
if($type != 'story') $fullModeOrders = 'product,module,twinsStory,plan,parent,grade,reviewer,region,lane,assignedTo,category,title,pri,estimate,spec,verify,files';
|
||||
if($type == 'story' and isset($fields['branch']))
|
||||
{
|
||||
$fullModeOrders = 'product,module,twinsStory,plan,parent,grade,reviewer,region,lane,assignedTo,category,title,pri,estimate,spec,verify,files';
|
||||
$fullModeOrders = 'product,module,twinsStory,plan,parent,grade,reviewer,region,lane,assignedTo,title,category,pri,estimate,spec,verify,files';
|
||||
}
|
||||
|
||||
$createFields->orders('product,module,twinsStory,parent,grade,reviewer,region,lane,assignedTo,category,title,pri,estimate,spec,verify,files');
|
||||
@@ -99,6 +96,9 @@ jsVar('feedbackSource', $config->story->feedbackSource);
|
||||
|
||||
$pinnedItems = !empty($this->config->{$type}->custom->createFields) ? $this->config->{$type}->custom->createFields : array();
|
||||
|
||||
$createFields->autoLoad('product', array('items' => 'product,module,twinsStory,plan,parent,grade,reviewer,region,lane,assignedTo,' . (!empty($lang->{$type}->flowExtraFields) ? implode(',', $lang->{$type}->flowExtraFields) : ''), 'updateOrders' => true));
|
||||
if($type != 'story') $createFields->autoLoad('branch', 'module');
|
||||
|
||||
formGridPanel
|
||||
(
|
||||
set::ajax(array('beforeSubmit' => jsRaw('clickSubmit'))),
|
||||
@@ -117,10 +117,8 @@ formGridPanel
|
||||
set::fields($createFields),
|
||||
set::pinnedItems($pinnedItems),
|
||||
set::data($initStory),
|
||||
on::click('#loadProductPlans', "loadProductPlans('{$productID}')"),
|
||||
on::change('[name=parent]', 'loadGrade'),
|
||||
on::change('[name=product]', 'loadProduct'),
|
||||
on::change('[name=source]', "toggleFeedback(e.target)"),
|
||||
on::change('[name=region]', 'setLane'),
|
||||
$type != 'story' ? on::change('[name=branch]', "loadBranchModule('{$productID}')") : null,
|
||||
set::loadUrl($loadUrl)
|
||||
);
|
||||
|
||||
+10
-13
@@ -749,13 +749,10 @@ class storyZen extends story
|
||||
if($this->story->checkForceReview($storyType)) $fields['reviewer']['required'] = true;
|
||||
if(empty($branches)) unset($fields['branch']);
|
||||
if(!empty($this->view->hiddenPlan)) unset($fields['plan']);
|
||||
if($this->config->edition != 'ipd' && $storyType == 'epic') $fields['parent']['hidden'] = true;
|
||||
|
||||
$hiddenGrade = empty($this->config->showStoryGrade);
|
||||
if($hiddenGrade && $storyType == 'epic') $fields['parent']['hidden'] = true;
|
||||
|
||||
$this->view->branchID = $branch;
|
||||
$this->view->gradeRule = $this->config->{$storyType}->gradeRule;
|
||||
$this->view->hiddenGrade = $hiddenGrade;
|
||||
$this->view->branchID = $branch;
|
||||
$this->view->gradeRule = $this->config->{$storyType}->gradeRule;
|
||||
return $fields;
|
||||
}
|
||||
|
||||
@@ -1066,7 +1063,7 @@ class storyZen extends story
|
||||
$objectID = $this->view->objectID;
|
||||
|
||||
/* Hidden some fields of projects without products. */
|
||||
$hiddenProduct = $hiddenParent = $hiddenPlan = false;
|
||||
$hiddenProduct = $hiddenPlan = false;
|
||||
$teamUsers = array();
|
||||
|
||||
if($this->app->tab === 'project' || $this->app->tab === 'execution')
|
||||
@@ -1091,11 +1088,6 @@ class storyZen extends story
|
||||
$fields['assignedTo']['options'] = $teamUsers;
|
||||
}
|
||||
|
||||
$hiddenGrade = empty($this->config->showStoryGrade);
|
||||
if($hiddenGrade && $storyType == 'epic') $hiddenParent = true;
|
||||
|
||||
$this->view->hiddenParent = $hiddenParent;
|
||||
$this->view->hiddenGrade = $hiddenGrade;
|
||||
return $fields;
|
||||
}
|
||||
|
||||
@@ -1136,7 +1128,6 @@ class storyZen extends story
|
||||
$fields['reviewer']['options'] = $teamUsers;
|
||||
$fields['assignedTo']['options'] = $teamUsers;
|
||||
}
|
||||
if(empty($this->config->showStoryGrade) && $storyType == 'epic') $fields['parent']['className'] = 'hidden';
|
||||
|
||||
return $fields;
|
||||
}
|
||||
@@ -1751,6 +1742,12 @@ class storyZen extends story
|
||||
return $this->session->storyList;
|
||||
}
|
||||
|
||||
if($this->app->tab == 'product')
|
||||
{
|
||||
$storyProductID = $this->story->fetchByID($storyID)->product;
|
||||
return $this->createLink('product', 'browse', "productID=$storyProductID&branch=$branch&browseType=unclosed¶m=0&storyType=$storyType");
|
||||
}
|
||||
|
||||
helper::setcookie('storyModule', '0', 0);
|
||||
$branchID = $this->post->branch ? $this->post->branch : $branch;
|
||||
if(empty($_SESSION['storyList'])) return $this->createLink('product', 'browse', "productID=$productID&branch=$branchID&browseType=¶m=0&storyType=$storyType&orderBy=id_desc");
|
||||
|
||||
Reference in New Issue
Block a user