Merge branch 'release-ipd1.2' into 18.x
This commit is contained in:
@@ -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"
|
||||
}
|
||||
},
|
||||
|
||||
@@ -28,6 +28,8 @@ IPD版:
|
||||
51992 需求池需求提交、需求详情和编辑页面中将所属产品字段调整为分发产品
|
||||
51995 需求池没有绑定产品时需求可以分发到多个产品
|
||||
51997 需求池绑定产品后需求可以分发到绑定产品中
|
||||
52658 需求编辑页面中实现解除与已分发产品的关联关系
|
||||
52111 撤回的用户需求影响到其他对象时,其他对象增加确认操作
|
||||
修复的Bug
|
||||
43006 调研的阶段列表下搜索报错
|
||||
43126 复制需求池需求时选择父需求,保存报错
|
||||
|
||||
Vendored
+11
-11
@@ -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'
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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');
|
||||
|
||||
@@ -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');
|
||||
|
||||
@@ -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');
|
||||
|
||||
@@ -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');
|
||||
|
||||
@@ -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'))
|
||||
|
||||
@@ -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§ion=global&key=hideVisionTips');
|
||||
$.post(link, {fields: 1});
|
||||
}
|
||||
</script>
|
||||
<main id='main' <?php if(!empty($config->sso->redirect)) echo "class='ranzhiFixedTfootAction'";?> >
|
||||
<div class='container'>
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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]);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -364,6 +364,7 @@ EOF;
|
||||
$currentMethod = $this->app->rawMethod;
|
||||
$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);
|
||||
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¶m=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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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=''");
|
||||
|
||||
@@ -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':
|
||||
|
||||
@@ -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'"));
|
||||
|
||||
@@ -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()
|
||||
{
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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'>";
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 = '';
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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');
|
||||
|
||||
Reference in New Issue
Block a user