Merge branch 'release-ipd1.2' into 18.x

This commit is contained in:
tanghucheng
2024-01-22 10:48:20 +08:00
32 changed files with 282 additions and 82 deletions
+2 -2
View File
@@ -5,7 +5,7 @@
"version": "8.0"
},
"zentaoext": {
"gitVersion": "release-18.10",
"gitVersion": "release-ipd1.2",
"gitRepo": "easycorp/zentaoext"
},
"zdoo": {
@@ -15,7 +15,7 @@
"gitVersion": "master"
},
"downgrade": {
"gitVersion": "release-18.10",
"gitVersion": "release-ipd1.2",
"gitRepo": "devops/zentaopms-downgrade"
}
},
+2
View File
@@ -28,6 +28,8 @@ IPD版:
51992 需求池需求提交、需求详情和编辑页面中将所属产品字段调整为分发产品
51995 需求池没有绑定产品时需求可以分发到多个产品
51997 需求池绑定产品后需求可以分发到绑定产品中
52658 需求编辑页面中实现解除与已分发产品的关联关系
52111 撤回的用户需求影响到其他对象时,其他对象增加确认操作
修复的Bug
43006 调研的阶段列表下搜索报错
43126 复制需求池需求时选择父需求,保存报错
+11 -11
View File
@@ -443,7 +443,7 @@ pipeline {
steps {
script {
buildZboxLinux.doBuild()
buildZboxLinux.test()
//buildZboxLinux.test()
buildZboxLinux.uploadInternal()
}
}
@@ -524,20 +524,20 @@ pipeline {
sh "make markdown-init"
}
stage("docker build") {
sh 'make test-open'
sh 'make build'
//sh 'make test-open'
//sh 'make build'
sh 'make test-biz'
sh 'make build-biz'
//sh 'make test-biz'
//sh 'make build-biz'
sh 'make test-biz-k8s'
sh 'make build-biz-k8s'
//sh 'make test-biz-k8s'
//sh 'make build-biz-k8s'
sh 'make test-max'
sh 'make build-max'
//sh 'make test-max'
//sh 'make build-max'
sh 'make test-max-k8s'
sh 'make build-max-k8s'
//sh 'make test-max-k8s'
//sh 'make build-max-k8s'
sh 'make test-ipd'
sh 'make build-ipd'
+2
View File
@@ -227,6 +227,7 @@ class bug extends control
$branchTagOption[$branchInfo->id] = $branchInfo->name . ($branchInfo->status == 'closed' ? ' (' . $this->lang->branch->statusList['closed'] . ')' : '');
}
}
if($this->config->edition == 'ipd') $bugs = $this->loadModel('story')->getAffectObject($bugs, 'bug');
/* Set view. */
$this->view->title = $productName . $this->lang->colon . $this->lang->bug->common;
@@ -935,6 +936,7 @@ class bug extends control
$this->session->set("project", key($projects), 'project');
$this->executeHooks($bugID);
if($this->config->edition == 'ipd') $bug = $this->loadModel('story')->getAffectObject('', 'bug', $bug);
/* Header and positon. */
$this->view->title = "BUG #$bug->id $bug->title - " . $product->name;
+3
View File
@@ -566,6 +566,9 @@ $lang->noticePasteImg = "Paste images here";
$lang->pasteImgFail = "Failed to paste images. Try again later.";
$lang->pasteImgUploading = "Uploading...";
$lang->visionTips = "You can switch vision here";
$lang->IKnow = "I know";
/* Time formats settings. */
if(!defined('DT_DATETIME1')) define('DT_DATETIME1', 'Y-m-d H:i:s');
if(!defined('DT_DATETIME2')) define('DT_DATETIME2', 'y-m-d H:i');
+3
View File
@@ -566,6 +566,9 @@ $lang->noticePasteImg = "You can paste images into the editor.";
$lang->pasteImgFail = "Failed to paste images. Try again later.";
$lang->pasteImgUploading = "Uploading...";
$lang->visionTips = "You can switch vision here";
$lang->IKnow = "I know";
/* Time formats settings. */
if(!defined('DT_DATETIME1')) define('DT_DATETIME1', 'Y-m-d H:i:s');
if(!defined('DT_DATETIME2')) define('DT_DATETIME2', 'y-m-d H:i');
+3
View File
@@ -566,6 +566,9 @@ $lang->noticePasteImg = "Vous pouvez déposer des images dans l'éditeur.";
$lang->pasteImgFail = "Echec lors de la dépose des images. Essayez plus tard.";
$lang->pasteImgUploading = "Chargement...";
$lang->visionTips = "You can switch vision here";
$lang->IKnow = "I know";
/* Time formats settings. */
if(!defined('DT_DATETIME1')) define('DT_DATETIME1', 'Y-m-d H:i:s');
if(!defined('DT_DATETIME2')) define('DT_DATETIME2', 'y-m-d H:i');
+3
View File
@@ -566,6 +566,9 @@ $lang->noticePasteImg = "可以在编辑器直接贴图。";
$lang->pasteImgFail = "贴图失败,请稍后重试。";
$lang->pasteImgUploading = "正在上传图片,请稍后...";
$lang->visionTips = "您可以在这里切换界面";
$lang->IKnow = "我知道了";
/* 时间格式设置。*/
if(!defined('DT_DATETIME1')) define('DT_DATETIME1', 'Y-m-d H:i:s');
if(!defined('DT_DATETIME2')) define('DT_DATETIME2', 'y-m-d H:i');
+1
View File
@@ -2660,6 +2660,7 @@ EOF;
if($module == 'story' and $method == 'linkrequirements') $module = 'requirement';
if($module == 'requirement' and $method == 'processstorychange') $module = 'story';
if($app->config->vision != 'lite' and $module == 'feedback' and $method == 'view') $method = 'adminview';
if($method == 'confirmdemandretract' and $module == 'requirement') $module = 'story';
/* If the user is doing a tutorial, have all tutorial privs. */
if(defined('TUTORIAL'))
+25
View File
@@ -8,6 +8,13 @@ include 'chosen.html.php';
<?php $this->app->loadConfig('sso');?>
<?php if(!empty($config->sso->redirect)) js::set('ssoRedirect', $config->sso->redirect);?>
<?php if($config->showMainMenu):?>
<style>
#visionTips {width: 280px; height: 0; position: absolute; top:64px; right: 48px; z-index: 200;}
#visionTips .inner {width: 270px; height: 58px; position: relative; bottom: 0; left: 0; border-radius: 8px; display: flex; justify-content: space-around; align-items: center;}
#visionTips .line {width: 2px; height: 31px; position: absolute; top: -31px; left: 224px;}
#visionTips .circle {width: 10px; height: 10px; border-radius: 50%; border-width: 3px; border-style: solid; position: relative; left: -4px; background-color: white;}
#visionTips .inner > button {border-color: white;}
</style>
<header id='header'>
<div id='mainHeader'>
<div class='container'>
@@ -26,6 +33,17 @@ include 'chosen.html.php';
</ul>
</div>
</div>
<?php if(count(explode(',', $this->app->user->visions)) > 1 && empty($config->global->hideVisionTips)):?>
<div id="visionTips">
<div class="inner bg-primary">
<span><?php echo $lang->visionTips;?></span>
<button type="button" class="btn btn-primary" onclick="hideVisionTips()"><?php echo $lang->IKnow;?></button>
<div class="line bg-primary pannel-primary">
<div class="circle alert-primary-inverse"></div>
</div>
</div>
</div>
<?php endif;?>
</div>
</div>
<?php if(isset($lang->{$app->tab}->menu->$activeMenu) and is_array($lang->{$app->tab}->menu->$activeMenu) and isset($lang->{$app->tab}->menu->{$activeMenu}['subMenu'])):?>
@@ -65,6 +83,13 @@ if(window.navigator.userAgent.indexOf('xuanxuan') > 0)
$('#subHeader').parent().parent().children('#main').css('top', '100px');
});
}
function hideVisionTips()
{
$('#visionTips').hide();
var link = createLink('custom', 'ajaxSaveCustomFields', 'module=common&section=global&key=hideVisionTips');
$.post(link, {fields: 1});
}
</script>
<main id='main' <?php if(!empty($config->sso->redirect)) echo "class='ranzhiFixedTfootAction'";?> >
<div class='container'>
+6
View File
@@ -232,6 +232,7 @@ class execution extends control
$this->config->execution->search['onMenuBar'] = 'yes';
if(!$execution->multiple) unset($this->config->execution->search['fields']['execution']);
$this->execution->buildTaskSearchForm($executionID, $this->executions, $queryID, $actionURL, $modules);
if($this->config->edition == 'ipd') $tasks = $this->loadModel('story')->getAffectObject($tasks, 'task');
/* Assign. */
$this->view->tasks = $tasks;
@@ -968,6 +969,8 @@ class execution extends control
$summary = $this->product->summary($stories, $storyType);
if($storyType == 'requirement') $summary = str_replace($this->lang->SRCommon, $this->lang->URCommon, $summary);
if($this->config->edition == 'ipd') $stories = $this->loadModel('story')->getAffectObject($stories, 'story');
/* Assign. */
$this->view->title = $title;
$this->view->position = $position;
@@ -1150,6 +1153,8 @@ class execution extends control
$tree = $moduleID ? $this->tree->getByID($moduleID) : '';
$showModule = !empty($this->config->datatable->executionBug->showModule) ? $this->config->datatable->executionBug->showModule : '';
if($this->config->edition == 'ipd') $bugs = $this->loadModel('story')->getAffectObject($bugs, 'bug');
/* Assign. */
$this->view->title = $title;
@@ -1244,6 +1249,7 @@ class execution extends control
$moduleTree = $this->tree->getTreeMenu($productID, 'case', 0, array('treeModel', 'createCaseLink'), array('projectID' => $executionID, 'productID' => $productID), $branchID);
}
$tree = $moduleID ? $this->tree->getByID($moduleID) : '';
if($this->config->edition == 'ipd') $cases = $this->loadModel('story')->getAffectObject($cases, 'case');
$this->view->title = $this->lang->execution->testcase;
$this->view->executionID = $executionID;
+2 -1
View File
@@ -3433,7 +3433,7 @@ class executionModel extends model
$action = $execution->type == 'project' ? 'linked2project' : 'linked2execution';
if($action == 'linked2execution' and $execution->type == 'kanban') $action = 'linked2kanban';
if($execution->multiple or $execution->type == 'project') $this->action->create('story', $storyID, $action, '', $executionID);
if($storyType == 'requirement' and $execution->model == 'ipd') $this->dao->update(TABLE_STORY)->set('status')->eq('developing')->where('id')->eq($storyID)->exec();
if($this->config->edition == 'ipd' and $storyType == 'requirement') $this->dao->update(TABLE_STORY)->set('status')->eq('developing')->where('id')->eq($storyID)->exec();
}
if(!isset($output['laneID']) or !isset($output['columnID'])) $this->kanban->updateLane($executionID, 'story');
@@ -5488,6 +5488,7 @@ class executionModel extends model
{
$canStart = $execution->status == 'wait' ? $execution->ipdStage['canStart'] : 1;
if($execution->status == 'close') $canStart = false;
if($project->parallel) $canStart = true;
$task->ipdStage = new stdclass();
$task->ipdStage->canStart = $canStart;
$task->ipdStage->taskStartTip = sprintf($this->lang->execution->disabledTip->taskStartTip, $this->lang->stage->ipdTypeList[$execution->ipdStage['preAttribute']], $this->lang->stage->ipdTypeList[$execution->attribute]);
+44 -40
View File
@@ -709,27 +709,28 @@ $config->group->package->manageStory = new stdclass();
$config->group->package->manageStory->order = 10;
$config->group->package->manageStory->subset = 'story';
$config->group->package->manageStory->privs = array();
$config->group->package->manageStory->privs['story-create'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 0, 'depend' => array(), 'recommend' => array('story-activate', 'story-assignTo', 'story-batchCreate', 'story-change', 'story-close', 'story-edit', 'story-linkStories', 'story-linkStory', 'story-processStoryChange', 'story-recall', 'story-relation', 'story-relieved', 'story-submitReview'));
$config->group->package->manageStory->privs['story-batchCreate'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 1, 'depend' => array('product-browse'), 'recommend' => array('story-create'));
$config->group->package->manageStory->privs['story-edit'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 2, 'depend' => array('story-view'), 'recommend' => array('story-activate', 'story-assignTo', 'story-batchEdit', 'story-change', 'story-close', 'story-create', 'story-linkStories', 'story-linkStory', 'story-processStoryChange', 'story-recall', 'story-relieved', 'story-submitReview'));
$config->group->package->manageStory->privs['story-change'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 4, 'depend' => array('story-view'), 'recommend' => array('story-activate', 'story-assignTo', 'story-close', 'story-create', 'story-edit', 'story-linkStories', 'story-linkStory', 'story-processStoryChange', 'story-recall', 'story-relieved', 'story-submitReview'));
$config->group->package->manageStory->privs['story-submitReview'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 5, 'depend' => array('story-view'), 'recommend' => array('story-activate', 'story-assignTo', 'story-change', 'story-close', 'story-create', 'story-edit', 'story-linkStories', 'story-linkStory', 'story-processStoryChange', 'story-recall', 'story-relieved'));
$config->group->package->manageStory->privs['story-recall'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 6, 'depend' => array('story-view'), 'recommend' => array('story-activate', 'story-assignTo', 'story-change', 'story-close', 'story-create', 'story-edit', 'story-linkStories', 'story-linkStory', 'story-processStoryChange', 'story-relieved', 'story-submitReview'));
$config->group->package->manageStory->privs['story-close'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 7, 'depend' => array('story-view'), 'recommend' => array('story-activate', 'story-assignTo', 'story-change', 'story-create', 'story-edit', 'story-linkStories', 'story-linkStory', 'story-processStoryChange', 'story-recall', 'story-relieved', 'story-submitReview'));
$config->group->package->manageStory->privs['story-batchClose'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 8, 'depend' => array('product-browse'), 'recommend' => array('story-close'));
$config->group->package->manageStory->privs['story-batchChangePlan'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 9, 'depend' => array('product-browse'), 'recommend' => array('story-edit'));
$config->group->package->manageStory->privs['story-batchChangeStage'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 10, 'depend' => array('product-browse'), 'recommend' => array('story-edit'));
$config->group->package->manageStory->privs['story-assignTo'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 11, 'depend' => array('product-browse'), 'recommend' => array('story-activate', 'story-change', 'story-close', 'story-create', 'story-edit', 'story-linkStories', 'story-linkStory', 'story-processStoryChange', 'story-recall', 'story-relieved', 'story-submitReview'));
$config->group->package->manageStory->privs['story-batchAssignTo'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 12, 'depend' => array('product-browse'), 'recommend' => array('story-edit'));
$config->group->package->manageStory->privs['story-activate'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 13, 'depend' => array('story-view'), 'recommend' => array('story-assignTo', 'story-change', 'story-close', 'story-create', 'story-edit', 'story-linkStories', 'story-linkStory', 'story-processStoryChange', 'story-recall', 'story-relieved', 'story-submitReview'));
$config->group->package->manageStory->privs['story-linkStory'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 14, 'depend' => array('story-view'), 'recommend' => array('story-activate', 'story-assignTo', 'story-change', 'story-close', 'story-create', 'story-edit', 'story-linkStories', 'story-processStoryChange', 'story-recall', 'story-relieved', 'story-submitReview'));
$config->group->package->manageStory->privs['story-batchChangeBranch'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 15, 'depend' => array('product-browse'), 'recommend' => array('story-edit'));
$config->group->package->manageStory->privs['story-batchChangeModule'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 16, 'depend' => array('product-browse'), 'recommend' => array('story-edit'));
$config->group->package->manageStory->privs['story-processStoryChange'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 17, 'depend' => array('story-view'), 'recommend' => array('story-activate', 'story-assignTo', 'story-change', 'story-close', 'story-create', 'story-edit', 'story-linkStories', 'story-linkStory', 'story-recall', 'story-relieved', 'story-submitReview'));
$config->group->package->manageStory->privs['story-linkStories'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 18, 'depend' => array('story-view'), 'recommend' => array('story-activate', 'story-assignTo', 'story-change', 'story-close', 'story-create', 'story-edit', 'story-linkStory', 'story-processStoryChange', 'story-recall', 'story-relieved', 'story-submitReview'));
$config->group->package->manageStory->privs['story-relieved'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 20, 'depend' => array('story-view'), 'recommend' => array('story-activate', 'story-assignTo', 'story-change', 'story-close', 'story-create', 'story-edit', 'story-linkStories', 'story-linkStory', 'story-processStoryChange', 'story-recall', 'story-submitReview'));
$config->group->package->manageStory->privs['story-batchEdit'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 3, 'depend' => array('product-browse'), 'recommend' => array('story-edit'));
$config->group->package->manageStory->privs['story-relation'] = array('edition' => 'max,ipd', 'vision' => 'rnd', 'order' => 19, 'depend' => array('story-view'), 'recommend' => array());
$config->group->package->manageStory->privs['story-create'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 0, 'depend' => array(), 'recommend' => array('story-activate', 'story-assignTo', 'story-batchCreate', 'story-change', 'story-close', 'story-edit', 'story-linkStories', 'story-linkStory', 'story-processStoryChange', 'story-recall', 'story-relation', 'story-relieved', 'story-submitReview'));
$config->group->package->manageStory->privs['story-batchCreate'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 1, 'depend' => array('product-browse'), 'recommend' => array('story-create'));
$config->group->package->manageStory->privs['story-edit'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 2, 'depend' => array('story-view'), 'recommend' => array('story-activate', 'story-assignTo', 'story-batchEdit', 'story-change', 'story-close', 'story-create', 'story-linkStories', 'story-linkStory', 'story-processStoryChange', 'story-recall', 'story-relieved', 'story-submitReview'));
$config->group->package->manageStory->privs['story-change'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 4, 'depend' => array('story-view'), 'recommend' => array('story-activate', 'story-assignTo', 'story-close', 'story-create', 'story-edit', 'story-linkStories', 'story-linkStory', 'story-processStoryChange', 'story-recall', 'story-relieved', 'story-submitReview'));
$config->group->package->manageStory->privs['story-submitReview'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 5, 'depend' => array('story-view'), 'recommend' => array('story-activate', 'story-assignTo', 'story-change', 'story-close', 'story-create', 'story-edit', 'story-linkStories', 'story-linkStory', 'story-processStoryChange', 'story-recall', 'story-relieved'));
$config->group->package->manageStory->privs['story-recall'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 6, 'depend' => array('story-view'), 'recommend' => array('story-activate', 'story-assignTo', 'story-change', 'story-close', 'story-create', 'story-edit', 'story-linkStories', 'story-linkStory', 'story-processStoryChange', 'story-relieved', 'story-submitReview'));
$config->group->package->manageStory->privs['story-close'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 7, 'depend' => array('story-view'), 'recommend' => array('story-activate', 'story-assignTo', 'story-change', 'story-create', 'story-edit', 'story-linkStories', 'story-linkStory', 'story-processStoryChange', 'story-recall', 'story-relieved', 'story-submitReview'));
$config->group->package->manageStory->privs['story-batchClose'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 8, 'depend' => array('product-browse'), 'recommend' => array('story-close'));
$config->group->package->manageStory->privs['story-batchChangePlan'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 9, 'depend' => array('product-browse'), 'recommend' => array('story-edit'));
$config->group->package->manageStory->privs['story-batchChangeStage'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 10, 'depend' => array('product-browse'), 'recommend' => array('story-edit'));
$config->group->package->manageStory->privs['story-assignTo'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 11, 'depend' => array('product-browse'), 'recommend' => array('story-activate', 'story-change', 'story-close', 'story-create', 'story-edit', 'story-linkStories', 'story-linkStory', 'story-processStoryChange', 'story-recall', 'story-relieved', 'story-submitReview'));
$config->group->package->manageStory->privs['story-batchAssignTo'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 12, 'depend' => array('product-browse'), 'recommend' => array('story-edit'));
$config->group->package->manageStory->privs['story-activate'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 13, 'depend' => array('story-view'), 'recommend' => array('story-assignTo', 'story-change', 'story-close', 'story-create', 'story-edit', 'story-linkStories', 'story-linkStory', 'story-processStoryChange', 'story-recall', 'story-relieved', 'story-submitReview'));
$config->group->package->manageStory->privs['story-linkStory'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 14, 'depend' => array('story-view'), 'recommend' => array('story-activate', 'story-assignTo', 'story-change', 'story-close', 'story-create', 'story-edit', 'story-linkStories', 'story-processStoryChange', 'story-recall', 'story-relieved', 'story-submitReview'));
$config->group->package->manageStory->privs['story-batchChangeBranch'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 15, 'depend' => array('product-browse'), 'recommend' => array('story-edit'));
$config->group->package->manageStory->privs['story-batchChangeModule'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 16, 'depend' => array('product-browse'), 'recommend' => array('story-edit'));
$config->group->package->manageStory->privs['story-processStoryChange'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 17, 'depend' => array('story-view'), 'recommend' => array('story-activate', 'story-assignTo', 'story-change', 'story-close', 'story-create', 'story-edit', 'story-linkStories', 'story-linkStory', 'story-recall', 'story-relieved', 'story-submitReview'));
$config->group->package->manageStory->privs['story-linkStories'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 18, 'depend' => array('story-view'), 'recommend' => array('story-activate', 'story-assignTo', 'story-change', 'story-close', 'story-create', 'story-edit', 'story-linkStory', 'story-processStoryChange', 'story-recall', 'story-relieved', 'story-submitReview'));
$config->group->package->manageStory->privs['story-relieved'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 20, 'depend' => array('story-view'), 'recommend' => array('story-activate', 'story-assignTo', 'story-change', 'story-close', 'story-create', 'story-edit', 'story-linkStories', 'story-linkStory', 'story-processStoryChange', 'story-recall', 'story-submitReview'));
$config->group->package->manageStory->privs['story-batchEdit'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 3, 'depend' => array('product-browse'), 'recommend' => array('story-edit'));
$config->group->package->manageStory->privs['story-relation'] = array('edition' => 'max,ipd', 'vision' => 'rnd', 'order' => 19, 'depend' => array('story-view'), 'recommend' => array());
$config->group->package->manageStory->privs['story-confirmdemandretract'] = array('edition' => 'ipd', 'vision' => 'rnd', 'order' => 19, 'depend' => array('story-view'), 'recommend' => array());
$config->group->package->importStory = new stdclass();
$config->group->package->importStory->order = 20;
@@ -1053,6 +1054,7 @@ $config->group->package->manageTask->privs['task-deleteEstimate'] = arra
$config->group->package->manageTask->privs['task-batchChangeModule'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 23, 'depend' => array('execution-task'), 'recommend' => array('task-edit'));
$config->group->package->manageTask->privs['task-batchCancel'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 11, 'depend' => array('execution-task'), 'recommend' => array('task-cancel'));
$config->group->package->manageTask->privs['task-confirmdesignchange'] = array('edition' => 'max,ipd', 'vision' => 'rnd', 'order' => 19, 'depend' => array('execution-task'), 'recommend' => array('task-edit'));
$config->group->package->manageTask->privs['task-confirmdemandretract'] = array('edition' => 'ipd', 'vision' => 'rnd,or', 'order' => 24, 'depend' => array('execution-task'), 'recommend' => array('task-edit'));
$config->group->package->deleteTask = new stdclass();
$config->group->package->deleteTask->order = 20;
@@ -1769,25 +1771,26 @@ $config->group->package->manageBug = new stdclass();
$config->group->package->manageBug->order = 10;
$config->group->package->manageBug->subset = 'bug';
$config->group->package->manageBug->privs = array();
$config->group->package->manageBug->privs['bug-create'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 0, 'depend' => array('bug-view'), 'recommend' => array('bug-activate', 'bug-assignTo', 'bug-batchCreate', 'bug-close', 'bug-confirmBug', 'bug-confirmStoryChange', 'bug-edit', 'bug-linkBugs', 'bug-resolve'));
$config->group->package->manageBug->privs['bug-batchCreate'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 1, 'depend' => array(), 'recommend' => array('bug-create'));
$config->group->package->manageBug->privs['bug-batchEdit'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 3, 'depend' => array(), 'recommend' => array('bug-edit'));
$config->group->package->manageBug->privs['bug-confirmBug'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 4, 'depend' => array('bug-view'), 'recommend' => array('bug-activate', 'bug-assignTo', 'bug-batchConfirm', 'bug-close', 'bug-confirmStoryChange', 'bug-create', 'bug-edit', 'bug-linkBugs', 'bug-resolve'));
$config->group->package->manageBug->privs['bug-batchConfirm'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 5, 'depend' => array(), 'recommend' => array('bug-confirmBug'));
$config->group->package->manageBug->privs['bug-edit'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 2, 'depend' => array('bug-view'), 'recommend' => array('bug-activate', 'bug-assignTo', 'bug-batchEdit', 'bug-close', 'bug-confirmBug', 'bug-confirmStoryChange', 'bug-create', 'bug-linkBugs', 'bug-resolve'));
$config->group->package->manageBug->privs['bug-assignTo'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 6, 'depend' => array('bug-view'), 'recommend' => array('bug-activate', 'bug-batchAssignTo', 'bug-close', 'bug-confirmBug', 'bug-confirmStoryChange', 'bug-create', 'bug-edit', 'bug-linkBugs', 'bug-resolve'));
$config->group->package->manageBug->privs['bug-batchAssignTo'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 7, 'depend' => array(), 'recommend' => array('bug-assignTo'));
$config->group->package->manageBug->privs['bug-resolve'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 8, 'depend' => array('bug-view'), 'recommend' => array('bug-activate', 'bug-assignTo', 'bug-batchResolve', 'bug-close', 'bug-confirmBug', 'bug-confirmStoryChange', 'bug-create', 'bug-edit', 'bug-linkBugs'));
$config->group->package->manageBug->privs['bug-batchResolve'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 9, 'depend' => array(), 'recommend' => array('bug-resolve'));
$config->group->package->manageBug->privs['bug-batchClose'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 11, 'depend' => array(), 'recommend' => array('bug-close'));
$config->group->package->manageBug->privs['bug-batchActivate'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 13, 'depend' => array(), 'recommend' => array('bug-activate'));
$config->group->package->manageBug->privs['bug-activate'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 12, 'depend' => array('bug-view'), 'recommend' => array('bug-assignTo', 'bug-batchActivate', 'bug-close', 'bug-confirmBug', 'bug-confirmStoryChange', 'bug-create', 'bug-edit', 'bug-linkBugs', 'bug-resolve'));
$config->group->package->manageBug->privs['bug-close'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 10, 'depend' => array('bug-view'), 'recommend' => array('bug-activate', 'bug-assignTo', 'bug-batchClose', 'bug-confirmBug', 'bug-confirmStoryChange', 'bug-create', 'bug-edit', 'bug-linkBugs', 'bug-resolve'));
$config->group->package->manageBug->privs['bug-confirmStoryChange'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 14, 'depend' => array('bug-view'), 'recommend' => array('bug-activate', 'bug-assignTo', 'bug-close', 'bug-confirmBug', 'bug-create', 'bug-edit', 'bug-linkBugs', 'bug-resolve'));
$config->group->package->manageBug->privs['bug-linkBugs'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 15, 'depend' => array('bug-edit'), 'recommend' => array());
$config->group->package->manageBug->privs['bug-batchChangeModule'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 16, 'depend' => array(), 'recommend' => array('bug-edit'));
$config->group->package->manageBug->privs['bug-batchChangeBranch'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 17, 'depend' => array(), 'recommend' => array('bug-edit'));
$config->group->package->manageBug->privs['bug-batchChangePlan'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 18, 'depend' => array(), 'recommend' => array('bug-edit'));
$config->group->package->manageBug->privs['bug-create'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 0, 'depend' => array('bug-view'), 'recommend' => array('bug-activate', 'bug-assignTo', 'bug-batchCreate', 'bug-close', 'bug-confirmBug', 'bug-confirmStoryChange', 'bug-edit', 'bug-linkBugs', 'bug-resolve'));
$config->group->package->manageBug->privs['bug-batchCreate'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 1, 'depend' => array(), 'recommend' => array('bug-create'));
$config->group->package->manageBug->privs['bug-batchEdit'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 3, 'depend' => array(), 'recommend' => array('bug-edit'));
$config->group->package->manageBug->privs['bug-confirmBug'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 4, 'depend' => array('bug-view'), 'recommend' => array('bug-activate', 'bug-assignTo', 'bug-batchConfirm', 'bug-close', 'bug-confirmStoryChange', 'bug-create', 'bug-edit', 'bug-linkBugs', 'bug-resolve'));
$config->group->package->manageBug->privs['bug-batchConfirm'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 5, 'depend' => array(), 'recommend' => array('bug-confirmBug'));
$config->group->package->manageBug->privs['bug-edit'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 2, 'depend' => array('bug-view'), 'recommend' => array('bug-activate', 'bug-assignTo', 'bug-batchEdit', 'bug-close', 'bug-confirmBug', 'bug-confirmStoryChange', 'bug-create', 'bug-linkBugs', 'bug-resolve'));
$config->group->package->manageBug->privs['bug-assignTo'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 6, 'depend' => array('bug-view'), 'recommend' => array('bug-activate', 'bug-batchAssignTo', 'bug-close', 'bug-confirmBug', 'bug-confirmStoryChange', 'bug-create', 'bug-edit', 'bug-linkBugs', 'bug-resolve'));
$config->group->package->manageBug->privs['bug-batchAssignTo'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 7, 'depend' => array(), 'recommend' => array('bug-assignTo'));
$config->group->package->manageBug->privs['bug-resolve'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 8, 'depend' => array('bug-view'), 'recommend' => array('bug-activate', 'bug-assignTo', 'bug-batchResolve', 'bug-close', 'bug-confirmBug', 'bug-confirmStoryChange', 'bug-create', 'bug-edit', 'bug-linkBugs'));
$config->group->package->manageBug->privs['bug-batchResolve'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 9, 'depend' => array(), 'recommend' => array('bug-resolve'));
$config->group->package->manageBug->privs['bug-batchClose'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 11, 'depend' => array(), 'recommend' => array('bug-close'));
$config->group->package->manageBug->privs['bug-batchActivate'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 13, 'depend' => array(), 'recommend' => array('bug-activate'));
$config->group->package->manageBug->privs['bug-activate'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 12, 'depend' => array('bug-view'), 'recommend' => array('bug-assignTo', 'bug-batchActivate', 'bug-close', 'bug-confirmBug', 'bug-confirmStoryChange', 'bug-create', 'bug-edit', 'bug-linkBugs', 'bug-resolve'));
$config->group->package->manageBug->privs['bug-close'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 10, 'depend' => array('bug-view'), 'recommend' => array('bug-activate', 'bug-assignTo', 'bug-batchClose', 'bug-confirmBug', 'bug-confirmStoryChange', 'bug-create', 'bug-edit', 'bug-linkBugs', 'bug-resolve'));
$config->group->package->manageBug->privs['bug-confirmStoryChange'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 14, 'depend' => array('bug-view'), 'recommend' => array('bug-activate', 'bug-assignTo', 'bug-close', 'bug-confirmBug', 'bug-create', 'bug-edit', 'bug-linkBugs', 'bug-resolve'));
$config->group->package->manageBug->privs['bug-linkBugs'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 15, 'depend' => array('bug-edit'), 'recommend' => array());
$config->group->package->manageBug->privs['bug-batchChangeModule'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 16, 'depend' => array(), 'recommend' => array('bug-edit'));
$config->group->package->manageBug->privs['bug-batchChangeBranch'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 17, 'depend' => array(), 'recommend' => array('bug-edit'));
$config->group->package->manageBug->privs['bug-batchChangePlan'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 18, 'depend' => array(), 'recommend' => array('bug-edit'));
$config->group->package->manageBug->privs['bug-confirmdemandretract'] = array('edition' => 'ipd', 'vision' => 'rnd,or', 'order' => 19, 'depend' => array(), 'recommend' => array('bug-edit'));
$config->group->package->deleteBug = new stdclass();
$config->group->package->deleteBug->order = 20;
@@ -1834,6 +1837,7 @@ $config->group->package->manageCase->privs['testcase-confirmLibcaseChange'] =
$config->group->package->manageCase->privs['testcase-ignoreLibcaseChange'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 15, 'depend' => array('testcase-view'), 'recommend' => array('testcase-confirmChange', 'testcase-confirmLibcaseChange', 'testcase-confirmStoryChange', 'testcase-create', 'testcase-edit'));
$config->group->package->manageCase->privs['testcase-submit'] = array('edition' => 'max,ipd', 'vision' => 'rnd', 'order' => 4, 'depend' => array('testcase-view'), 'recommend' => array('testcase-confirmChange', 'testcase-confirmLibcaseChange', 'testcase-confirmStoryChange', 'testcase-create', 'testcase-edit', 'testcase-ignoreLibcaseChange', 'testcase-linkBugs', 'testcase-linkCases'));
$config->group->package->manageCase->privs['testcase-updateOrder'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 30, 'depend' => array(), 'recommend' => array());
$config->group->package->manageCase->privs['testcase-confirmdemandretract'] = array('edition' => 'ipd', 'vision' => 'rnd,or', 'order' => 30, 'depend' => array(), 'recommend' => array());
$config->group->package->importCase = new stdclass();
$config->group->package->importCase->order = 25;
+5
View File
@@ -364,6 +364,7 @@ EOF;
$currentMethod = $this->app->rawMethod;
$actionURL = $this->createLink('my', $currentMethod, "mode=story&type=bysearch&param=myQueryID&orderBy={$orderBy}&recTotal={$recTotal}&recPerPage={$recPerPage}&pageID={$pageID}");
$this->my->buildStorySearchForm($queryID, $actionURL, $currentMethod);
if($this->config->edition == 'ipd') $stories = $this->loadModel('story')->getAffectObject($stories, 'story');
/* Assign. */
$this->view->title = $this->lang->my->common . $this->lang->colon . $this->lang->my->story;
@@ -520,6 +521,7 @@ EOF;
$actionURL = $this->createLink('my', $this->app->rawMethod, "mode=task&browseType=bySearch&queryID=myQueryID");
$this->my->buildTaskSearchForm($queryID, $actionURL);
if($this->config->edition == 'ipd') $tasks = $this->loadModel('story')->getAffectObject($tasks, 'task');
/* Assign. */
$this->view->title = $this->lang->my->common . $this->lang->colon . $this->lang->my->task;
@@ -585,6 +587,7 @@ EOF;
$actionURL = $this->createLink('my', $this->app->rawMethod, "mode=bug&browseType=bySearch&queryID=myQueryID");
$this->my->buildBugSearchForm($queryID, $actionURL);
if($this->config->edition == 'ipd') $bugs = $this->loadModel('story')->getAffectObject($bugs, 'bug');
/* assign. */
$this->view->title = $this->lang->my->common . $this->lang->colon . $this->lang->my->bug;
@@ -696,6 +699,7 @@ EOF;
$currentMethod = $this->app->rawMethod;
$actionURL = $this->createLink('my', $currentMethod, "mode=testcase&type=bysearch&param=myQueryID&orderBy={$orderBy}&recTotal={$recTotal}&recPerPage={$recPerPage}&pageID={$pageID}");
$this->my->buildTestcaseSearchForm($queryID, $actionURL, $currentMethod);
if($this->config->edition == 'ipd') $cases = $this->loadModel('story')->getAffectObject($cases, 'case');
/* Assign. */
$this->view->title = $this->lang->my->common . $this->lang->colon . $this->lang->my->myTestCase;
@@ -1671,6 +1675,7 @@ EOF;
{
$_SESSION['vision'] = $vision;
$this->loadModel('setting')->setItem("{$this->app->user->account}.common.global.vision", $vision);
if(empty($this->config->hideVisionTips)) $this->setting->setItem("{$this->app->user->account}.common.global.hideVisionTips", 1);
$this->config->vision = $vision;
$_SESSION['user']->rights = $this->loadModel('user')->authorize($this->app->user->account);
+6 -1
View File
@@ -145,7 +145,12 @@
<td><?php echo zget($lang->bug->resolutionList, $bug->resolution);?></td>
<td class='c-actions'>
<?php
if($canBeChanged)
if(!empty($bug->retractConfirm))
{
$retractObject = join(',', $bug->retractObject);
common::printIcon('bug', 'confirmDemandRetract', "objectID=$bug->id&object=bug&extra=$retractObject", $bug, 'browse', 'search', '', 'iframe', true);
}
else if($canBeChanged)
{
$params = "bugID=$bug->id";
common::printIcon('bug', 'confirmBug', $params, $bug, 'list', 'ok', '', 'iframe', true, '', '', $bug->project);
+6 -1
View File
@@ -100,7 +100,12 @@
<td class='c-stage'><?php echo zget($lang->story->stageList, $story->stage);?></td>
<td class='c-actions'>
<?php
if($canBeChanged)
if(!empty($story->retractConfirm))
{
$retractObject = join(',', $story->retractObject);
common::printIcon('story', 'confirmDemandRetract', "objectID=$story->id&object=story&extra=$retractObject", $story, 'browse', 'search', '', 'iframe', true);
}
else if($canBeChanged)
{
$vars = "story={$story->id}";
echo common::buildIconButton('story', 'change', $vars, $story, 'list', 'alter', '', 'iframe', true);
+6 -1
View File
@@ -138,7 +138,12 @@
<?php
if($canBeChanged)
{
if($task->needConfirm)
if(!empty($task->retractConfirm))
{
$retractObject = join(',', $task->retractObject);
common::printIcon('task', 'confirmDemandRetract', "objectID=$task->id&object=task&extra=$retractObject", $task, 'browse', 'search', '', 'iframe', true);
}
else if($task->needConfirm)
{
$this->lang->task->confirmStoryChange = $this->lang->confirm;
common::printIcon('task', 'confirmStoryChange', "taskid=$task->id", '', 'list', '', 'hiddenwin', '', '', '', '', $task->project);
+6 -1
View File
@@ -112,7 +112,12 @@
<td class='result-testcase <?php echo $case->lastRunResult;?>'><?php echo $case->lastRunResult ? $lang->testcase->resultList[$case->lastRunResult] : $lang->testcase->unexecuted;?></td>
<td class='c-actions'>
<?php
if($canBeChanged)
if(!empty($case->retractConfirm))
{
$retractObject = join(',', $case->retractObject);
common::printIcon('testcase', 'confirmDemandRetract', "objectID=$case->id&object=case&extra=$retractObject", $case, 'browse', 'search', '', 'iframe', true);
}
else if($canBeChanged)
{
$disabled = (isset($case->lastRunResult) and $case->lastRunResult != 'fail') ? 'disabled' : '';
common::printIcon('testcase', 'createBug', "product=$case->product&branch=$case->branch&extra=caseID=$caseID,version=$case->version,runID=$runID", $case, 'list', 'bug', '', "iframe $disabled", 'true', "data-app='qa' data-toggle=''");
+5 -5
View File
@@ -1594,18 +1594,18 @@ class pivotModel extends model
switch($stat)
{
case 'sum':
$sliceGroupRecord->$fieldKey[$stat] += $floatValue;
$sliceGroupRecord->{$fieldKey}[$stat] += $floatValue;
break;
case 'avg':
case 'max':
case 'min':
$sliceGroupRecord->$fieldKey[$stat][] = $floatValue;
$sliceGroupRecord->{$fieldKey}[$stat][] = $floatValue;
break;
case 'count':
$sliceGroupRecord->$fieldKey[$stat] += 1;
$sliceGroupRecord->{$fieldKey}[$stat] += 1;
break;
case 'distinct':
$sliceGroupRecord->$fieldKey[$stat][] = $value;
$sliceGroupRecord->{$fieldKey}[$stat][] = $value;
break;
}
}
@@ -1619,7 +1619,7 @@ class pivotModel extends model
/* Skip the group field directly. */
if(in_array($sliceField, $groups)) continue;
$sliceStat = $sliceRecord->$sliceField[$stat];
$sliceStat = $sliceRecord->{$sliceField}[$stat];
switch($stat)
{
case 'sum':
+7 -5
View File
@@ -315,6 +315,7 @@ class product extends control
$storyIdList[$story->id] = $story->id;
if(!empty($story->children))
{
if($this->config->edition == 'ipd') $this->story->getAffectObject($story->children, 'story');
foreach($story->children as $child) $storyIdList[$child->id] = $child->id;
}
}
@@ -636,13 +637,14 @@ class product extends control
$unauthorizedPrograms = array();
if(in_array($this->config->systemMode, array('ALM', 'PLM')))
{
$programs = $this->loadModel('program')->getTopPairs();
$this->app->loadLang('project');
$programs = $this->loadModel('program')->getTopPairs() + array(0 => $this->lang->project->future);
/* Get unauthorized programs. */
$programIDList = array();
foreach($products as $product)
{
if($product->program and !isset($programs[$product->program]) and !in_array($product->program, $programIDList)) $programIDList[] = $product->program;
if(!isset($programs[$product->program]) and !in_array($product->program, $programIDList)) $programIDList[] = $product->program;
}
$unauthorizedPrograms = $this->program->getPairsByList($programIDList);
@@ -650,12 +652,12 @@ class product extends control
$lines = array(0 => '');
foreach($programs + $unauthorizedPrograms as $id => $program)
{
$lines[$id] = array('') + $this->product->getLinePairs($id);
$lines[$id] = array('') + $this->product->getLinePairs($id, true);
}
}
else
{
$lines = array('') + $this->product->getLinePairs();
$lines = array('') + $this->product->getLinePairs(0, true);
}
$this->view->title = $this->lang->product->batchEdit;
@@ -1125,7 +1127,7 @@ class product extends control
public function ajaxGetLine($programID, $productID = 0)
{
$lines = array();
if(empty($productID) or $programID) $lines = $this->product->getLinePairs($programID, true);
$lines = $this->product->getLinePairs($programID, true);
if($productID) return print(html::select("lines[$productID]", array('' => '') + $lines, '', "class='form-control picker-select'"));
if(!$productID) return print(html::select('line', array('' => '') + $lines, '', "class='form-control picker-select'"));
+1
View File
@@ -21,6 +21,7 @@ $(function()
*/
function loadProductLines(programID, productID)
{
if(!programID) programID = 0;
var link = createLink('product', 'ajaxGetLine', 'programID=' + programID + '&productID=' + productID);
$('#line_' + productID).load(link, function()
{
+3 -2
View File
@@ -614,10 +614,11 @@ class productModel extends model
* Get products group by program.
*
* @param array $appendIDList
* @param bool $allVision
* @access public
* @return array
*/
public function getProductsGroupByProgram($appendIDList = array())
public function getProductsGroupByProgram($appendIDList = array(), $allVision = false)
{
$views = $this->app->user->view->products;
if(!empty($appendIDList)) $views .= ',' . implode(',', $appendIDList);
@@ -625,7 +626,7 @@ class productModel extends model
$products = $this->dao->select("t1.id, t1.name, t1.program, t2.name AS programName")->from(TABLE_PRODUCT)->alias('t1')
->leftJoin(TABLE_PROJECT)->alias('t2')->on('t1.program = t2.id')
->where('t1.deleted')->eq('0')
->andWhere("FIND_IN_SET('{$this->config->vision}', t1.vision)")
->beginIF(!$allVision)->andWhere("FIND_IN_SET('{$this->config->vision}', t1.vision)")->fi()
->andWhere('t1.shadow')->eq((int)0)
->andWhere('t1.status')->ne('closed')
->beginIF(!$this->app->user->admin)->andWhere('t1.id')->in($views)->fi()
+1 -1
View File
@@ -85,7 +85,7 @@
<?php if(isset($unauthorizedPrograms[$products[$productID]->program])):?>
<td class='text-left<?php echo zget($visibleFields, 'program', ' hidden')?>' style='overflow:visible'><?php echo html::select("programs[$productID]", $unauthorizedPrograms, $products[$productID]->program, "class='form-control' disabled");?></td>
<?php else:?>
<td class='text-left<?php echo zget($visibleFields, 'program', ' hidden')?>' style='overflow:visible'><?php echo html::select("programs[$productID]", $programs, $products[$productID]->program, "class='form-control picker-select' onchange='loadProductLines(this.value, $productID)'");?></td>
<td class='text-left<?php echo zget($visibleFields, 'program', ' hidden')?>' style='overflow:visible'><?php echo html::select("programs[$productID]", $programs, $products[$productID]->program, "class='form-control picker-select' data-allow_single_deselect='false' onchange='loadProductLines(this.value, $productID)'");?></td>
<?php endif;?>
<?php endif;?>
<td title='<?php echo $products[$productID]->name?>'><?php echo html::input("names[$productID]", $products[$productID]->name, "class='form-control'");?></td>
+2 -2
View File
@@ -265,7 +265,7 @@ js::set('pageSummary', $summary);
$buttonTitle = $lang->execution->linkStoryByPlan;
$dataToggle = 'data-toggle="modal"';
}
if(common::hasPriv('projectstory', 'importRoadmapStories') and $storyType == 'requirement' and $this->config->edition == 'ipd')
if(common::hasPriv('projectstory', 'importRoadmapStories') and $project->charter and $storyType == 'requirement' and $this->config->edition == 'ipd')
{
$buttonLink = empty($productID) ? '' : '#linkStoryByRoadmap';
$buttonTitle = $lang->product->linkStoryByRoadmap;;
@@ -283,7 +283,7 @@ js::set('pageSummary', $summary);
$hidden = empty($buttonLink) ? 'hidden' : '';
echo html::a($buttonLink, "<i class='icon-link'></i> $buttonTitle", '', "class='btn btn-primary $hidden' $dataToggle");
if(!empty($productID) and common::hasPriv('projectstory', 'linkStory') and common::hasPriv('projectstory', 'importRoadmapStories') and $storyType == 'requirement' and $this->config->edition == 'ipd')
if(!empty($productID) and common::hasPriv('projectstory', 'linkStory') and common::hasPriv('projectstory', 'importRoadmapStories') and $project->charter and $storyType == 'requirement' and $this->config->edition == 'ipd')
{
echo "<button type='button' class='btn btn-primary dropdown-toggle' data-toggle='dropdown'><span class='caret'></span></button>";
echo "<ul class='dropdown-menu pull-right'>";
+1
View File
@@ -1285,6 +1285,7 @@ class project extends control
$taskList = $taskIdList ? $this->loadModel('task')->getByList($taskIdList) : array();
$showModule = !empty($this->config->datatable->projectBug->showModule) ? $this->config->datatable->projectBug->showModule : '';
if($this->config->edition == 'ipd') $bugs = $this->loadModel('story')->getAffectObject($bugs, 'bug');
/* Assign. */
$this->view->title = $title;
+5 -3
View File
@@ -949,8 +949,10 @@ class story extends control
if($this->app->tab == 'project' or $this->app->tab == 'execution')
{
$objectID = $this->app->tab == 'project' ? $this->session->project : $this->session->execution;
$products = $this->product->getProductPairsByProject($objectID);
$objectID = $this->app->tab == 'project' ? $this->session->project : $this->session->execution;
$projectProducts = $this->product->getProductPairsByProject($objectID);
if(!isset($projectProducts[$story->product]) && isset($products[$story->product])) $projectProducts[$story->product] = $products[$story->product];
$products = $projectProducts;
$this->view->objectID = $objectID;
}
@@ -1435,7 +1437,7 @@ class story extends control
public function view($storyID, $version = 0, $param = 0, $storyType = 'story')
{
$story = $this->story->getById($storyID, $version, true);
if($this->config->edition == 'ipd') $story = $this->story->getAffectObject('', $story->type, $story);
if($this->config->edition == 'ipd' and $story->type == 'story') $story = $this->story->getAffectObject('', $story->type, $story);
$linkModuleName = $this->config->vision == 'lite' ? 'project' : 'product';
if(!$story)
+106 -6
View File
@@ -162,11 +162,18 @@ class storyModel extends model
*/
public function getAffectedScope($story)
{
$storyIdList = $story->id;
if($story->type == 'story') $storyIdList = $story->id;
if($story->type == 'requirement')
{
$stories = $this->getStoryRelationByIds($story->id, 'requirement');
if(isset($stories[$story->id])) $storyIdList = $stories[$story->id];
if(isset($stories[$story->id]))
{
$storyIdList = $stories[$story->id];
}
else
{
$storyIdList = '';
}
}
/* Remove closed executions. */
if($story->executions)
@@ -184,6 +191,14 @@ class storyModel extends model
->fetchGroup('root');
}
if(!$story->twins && empty($storyIdList))
{
$story->bugs = array();
$story->cases = array();
if($this->config->vision == 'or') $story->stories = array();
return $story;
}
/* Get affected bugs. */
$story->bugs = $this->dao->select('*')->from(TABLE_BUG)
->where('status')->ne('closed')
@@ -199,13 +214,14 @@ class storyModel extends model
->beginIF(!$story->twins)->andWhere('story')->in($storyIdList)->fi()
->fetchAll();
$story->stories = $this->dao->select('t1.*, t2.spec, t2.verify, t3.name as productTitle, t3.deleted as productDeleted')
if($this->config->vision == 'or') $story->stories = $this->dao->select('t1.*, t2.spec, t2.verify, t3.name as productTitle, t3.deleted as productDeleted')
->from(TABLE_STORY)->alias('t1')
->leftJoin(TABLE_STORYSPEC)->alias('t2')->on('t1.id=t2.story')
->leftJoin(TABLE_PRODUCT)->alias('t3')->on('t1.product=t3.id')
->where('t1.version=t2.version')
->andWhere('t1.deleted')->eq(0)
->andWhere('t1.id')->in($storyIdList)
->beginIF($story->twins)->andWhere('t1.id')->in(ltrim($story->twins, ',') . $storyIdList)->fi()
->beginIF(!$story->twins)->andWhere('t1.id')->in($storyIdList)->fi()
->fetchAll('id');
return $story;
@@ -6217,8 +6233,12 @@ class storyModel extends model
$story->finalResult = $result;
/* If in ipd mode, set requirement status = 'launched'. */
if($this->config->systemMode == 'PLM' and $oldStory->type == 'requirement' and $story->status == 'active' and $this->config->vision == 'rnd') $story->status = 'launched';
if($story->status == 'launched' and $this->app->tab != 'product') $story->status = 'developing';
if($this->config->systemMode == 'PLM' and $oldStory->type == 'requirement' and $story->status == 'active' and (strpos($oldStory->vision, 'rnd') !== false)) $story->status = 'launched';
if($story->status == 'launched')
{
$project = $this->dao->select('project')->from(TABLE_PROJECTSTORY)->where('story')->eq($oldStory->id)->orderBy('project')->fetch();
if($project) $story->status = 'developing';
}
return $story;
}
@@ -6991,4 +7011,84 @@ class storyModel extends model
return !dao::isError();
}
/**
* Get affect objects.
*
* @param mixed $objects
* @param string $objectType
* @param string $object
* @access public
* @return void
*/
public function getAffectObject($objects = '', $objectType = '', $objectInfo = '')
{
if(empty($objects) and empty($objectInfo)) return $objects;
if(empty($objects) and $objectInfo) $objects = array($objectInfo->id => $objectInfo);
$objectIDList = array();
$storyIDList = array();
foreach($objects as $object)
{
if($this->app->rawModule == 'testtask') $object->id = $object->case;
$objectIDList[] = $object->id;
if($objectType == 'story') $storyIDList[] = $object->id;
if($objectType != 'story') $storyIDList[] = $object->story;
$object->retractConfirm = false;
$object->retractObject = array();
}
/* 获取需要确认的用户需求id。 */
$URs = $this->getStoryRelationByIds($storyIDList, 'story');
$URIds = implode(',', $URs);
if(!$URIds) return $objectInfo ? $objectInfo : $objects;
/* 获取已经撤回的用户需求。*/
$requirements = $this->dao->select('id')->from(TABLE_STORY)
->where('id')->in($URIds)
->andWhere('retractedBy')->ne('')
->fetchPairs('id');
if(!$requirements) return $objectInfo ? $objectInfo : $objects;
/* 获取已经确认过的对象。*/
$actions = $this->dao->select('*')->from(TABLE_ACTION)
->where('objectType')->eq($objectType)
->andWhere('objectID')->in($objectIDList)
->andWhere('action')->eq('confirmedretract')
->fetchPairs('objectID', 'extra');
foreach($actions as $objecyID => $action) $actions[$objecyID] = explode(',', $action);
/* 获取需要进行确认操作的研发需求 => 用户需求。*/
$confirmObjects = array();
foreach($requirements as $requirement)
{
foreach($URs as $storyID => $UR)
{
if (strpos($UR, (string) $requirement) !== false) $confirmObjects[$storyID][$requirement] = $requirement;
}
}
/* 将确认信息插入到objects中并且过滤掉已经确认的用户需求。*/
foreach($objects as $object)
{
$confirmed = array();
if($this->app->rawModule == 'testtask') $object->id = $object->case;
if(isset($actions[$object->id])) $confirmed = $actions[$object->id]; // 已经确认的用户需求
if($objectType == 'story' and isset($confirmObjects[$object->id]))
{
$object->retractObject = array_diff($confirmObjects[$object->id], $confirmed);
if($object->retractObject) $object->retractConfirm = true;
}
else if($objectType != 'story' and isset($confirmObjects[$object->story]))
{
$object->retractObject = array_diff($confirmObjects[$object->story], $confirmed);
if($object->retractObject) $object->retractConfirm = true;
}
}
if($objectInfo) return $objects[$objectInfo->id];
return $objects;
}
}
+2
View File
@@ -1003,6 +1003,8 @@ class task extends control
$this->executeHooks($taskID);
if($this->config->edition == 'ipd') $task = $this->loadModel('story')->getAffectObject('', 'task', $task);
$title = "TASK#$task->id $task->name / $execution->name";
$position[] = html::a($this->createLink('execution', 'browse', "executionID=$task->execution"), $execution->name);
$position[] = $this->lang->task->common;
+1
View File
@@ -4258,6 +4258,7 @@ class taskModel extends model
$execution->ipdStage = $this->loadModel('execution')->canStageStart($execution);
$plmCanStart = $execution->status == 'wait' ? $execution->ipdStage['canStart'] : 1;
if($execution->status == 'close') $plmCanStart = false;
if($execution->parallel) $plmCanStart = true;
}
$menu = '';
+2
View File
@@ -183,6 +183,7 @@ class testcase extends control
$sceneCount = count($scenes);
$caseCount = 0;
/* Process case for check story changed. */
if($this->config->edition == 'ipd') $cases = $this->loadModel('story')->getAffectObject($cases, 'case');
$cases = $this->loadModel('story')->checkNeedConfirm($cases);
$cases = $this->testcase->appendData($cases);
foreach($cases as $case)
@@ -906,6 +907,7 @@ class testcase extends control
$case->caseFails = $caseFails;
$this->executeHooks($caseID);
if($this->config->edition == 'ipd') $case = $this->loadModel('story')->getAffectObject('', 'case', $case);
$this->view->position[] = $this->lang->testcase->common;
$this->view->position[] = $this->lang->testcase->view;
+3
View File
@@ -562,9 +562,12 @@ class testtask extends control
/* Get test cases. */
$runs = $this->testtask->getTaskCases($productID, $browseType, $queryID, $moduleID, $sort, $pager, $task);
if($this->config->edition == 'ipd') $runs = $this->loadModel('story')->getAffectObject($runs, 'case');
$this->loadModel('common')->saveQueryCondition($this->dao->get(), 'testcase', false);
$runs = $this->loadModel('story')->checkNeedConfirm($runs);
$case2RunMap = array();
foreach($runs as $run) $case2RunMap[$run->case] = $run->id;
+7
View File
@@ -1965,6 +1965,13 @@ class testtaskModel extends model
break;
case 'actions':
if($isScene) break;
if(!empty($run->retractConfirm))
{
$retractObject = join(',', $run->retractObject);
common::printIcon('testcase', 'confirmDemandRetract', "objectID=$run->case&object=case&extra=$retractObject", $run, 'list', 'search', '', 'iframe', true);
break;
}
if($run->caseStatus != 'wait' and $caseChanged)
{
common::printIcon('testcase', 'confirmChange', "id=$run->case&taskID=$run->task&from=list", $run, 'list', 'search', 'hiddenwin');