This commit is contained in:
wangyidong
2021-03-15 09:45:09 +08:00
25 changed files with 202 additions and 55 deletions
+4
View File
@@ -80,10 +80,14 @@ $filter->product->project = new stdclass();
$filter->program->default = new stdclass(); $filter->program->default = new stdclass();
$filter->program->pgmproject = new stdclass(); $filter->program->pgmproject = new stdclass();
$filter->program->prjbrowse = new stdclass(); $filter->program->prjbrowse = new stdclass();
$filter->program->project = new stdclass();
$filter->program->browse = new stdclass();
$filter->program->export = new stdclass();
$filter->program->pgmbrowse = new stdclass(); $filter->program->pgmbrowse = new stdclass();
$filter->program->export = new stdclass(); $filter->program->export = new stdclass();
$filter->program->ajaxgetpgmdropmenu = new stdclass(); $filter->program->ajaxgetpgmdropmenu = new stdclass();
$filter->project->default = new stdclass(); $filter->project->default = new stdclass();
$filter->project->browse = new stdclass();
$filter->project->story = new stdclass(); $filter->project->story = new stdclass();
$filter->project->export = new stdclass(); $filter->project->export = new stdclass();
$filter->project->task = new stdclass(); $filter->project->task = new stdclass();
+2 -3
View File
@@ -189,9 +189,7 @@ class bug extends control
$this->config->bug->search['onMenuBar'] = 'yes'; $this->config->bug->search['onMenuBar'] = 'yes';
$this->bug->buildSearchForm($productID, $this->products, $queryID, $actionURL); $this->bug->buildSearchForm($productID, $this->products, $queryID, $actionURL);
$showModule = !empty($this->config->datatable->bugBrowse->showModule) ? $this->config->datatable->bugBrowse->showModule : ''; $showModule = !empty($this->config->datatable->bugBrowse->showModule) ? $this->config->datatable->bugBrowse->showModule : '';
$this->view->modulePairs = $showModule ? $this->tree->getModulePairs($productID, 'bug', $showModule) : array();
$productName = $productID ? $this->products[$productID] : $this->lang->product->allProduct; $productName = $productID ? $this->products[$productID] : $this->lang->product->allProduct;
/* Set view. */ /* Set view. */
@@ -223,6 +221,7 @@ class bug extends control
$this->view->tasks = $taskList; $this->view->tasks = $taskList;
$this->view->setModule = true; $this->view->setModule = true;
$this->view->isProjectBug = ($productID and !$this->projectID) ? false : true; $this->view->isProjectBug = ($productID and !$this->projectID) ? false : true;
$this->view->modulePairs = $showModule ? $this->tree->getModulePairs($productID, 'bug', $showModule) : array();
$this->display(); $this->display();
} }
+10 -1
View File
@@ -1247,11 +1247,20 @@ class bugModel extends model
$productParams = $productID ? array($productID => $products[$productID]) : $products; $productParams = $productID ? array($productID => $products[$productID]) : $products;
$productParams = $productParams + array('all' => $this->lang->bug->allProduct); $productParams = $productParams + array('all' => $this->lang->bug->allProduct);
/* Get all modules. */
$modules = array();
$this->loadModel('tree');
if($productID) $modules = $this->tree->getOptionMenu($productID, 'bug', 0);
if(!$productID)
{
foreach($products as $id => $productName) $modules += $this->tree->getOptionMenu($id, 'bug');
}
$this->config->bug->search['actionURL'] = $actionURL; $this->config->bug->search['actionURL'] = $actionURL;
$this->config->bug->search['queryID'] = $queryID; $this->config->bug->search['queryID'] = $queryID;
$this->config->bug->search['params']['product']['values'] = $productParams; $this->config->bug->search['params']['product']['values'] = $productParams;
$this->config->bug->search['params']['plan']['values'] = $this->loadModel('productplan')->getPairs($productID); $this->config->bug->search['params']['plan']['values'] = $this->loadModel('productplan')->getPairs($productID);
$this->config->bug->search['params']['module']['values'] = $this->loadModel('tree')->getOptionMenu($productID, $viewType = 'bug', $startModuleID = 0); $this->config->bug->search['params']['module']['values'] = $modules;
$this->config->bug->search['params']['execution']['values'] = $this->product->getExecutionPairsByProduct($productID, 0, 'id_desc', $projectID); $this->config->bug->search['params']['execution']['values'] = $this->product->getExecutionPairsByProduct($productID, 0, 'id_desc', $projectID);
$this->config->bug->search['params']['severity']['values'] = array(0 => '') + $this->lang->bug->severityList; //Fix bug #939. $this->config->bug->search['params']['severity']['values'] = array(0 => '') + $this->lang->bug->severityList; //Fix bug #939.
$this->config->bug->search['params']['openedBuild']['values'] = $this->loadModel('build')->getProductBuildPairs($productID, 0, $params = ''); $this->config->bug->search['params']['openedBuild']['values'] = $this->loadModel('build')->getProductBuildPairs($productID, 0, $params = '');
+1 -1
View File
@@ -169,7 +169,7 @@ $currentBrowseType = isset($lang->bug->mySelects[$browseType]) && in_array($brow
<?php endif;?> <?php endif;?>
<?php echo $moduleTree;?> <?php echo $moduleTree;?>
<div class="text-center"> <div class="text-center">
<?php common::printLink('tree', 'browse', "productID=$productID&view=bug&currentModuleID=0&branch=0&from={$this->lang->navGroup->bug}", $lang->tree->manage, '', "class='btn btn-info btn-wide'");?> <?php if($productID) common::printLink('tree', 'browse', "productID=$productID&view=bug&currentModuleID=0&branch=0&from={$this->lang->navGroup->bug}", $lang->tree->manage, '', "class='btn btn-info btn-wide'");?>
<hr class="space-sm" /> <hr class="space-sm" />
</div> </div>
</div> </div>
+7 -6
View File
@@ -86,12 +86,13 @@ $lang->execution->menuOrder[15] = 'burn';
$lang->execution->menuOrder[20] = 'view'; $lang->execution->menuOrder[20] = 'view';
$lang->execution->menuOrder[25] = 'story'; $lang->execution->menuOrder[25] = 'story';
$lang->execution->menuOrder[30] = 'qa'; $lang->execution->menuOrder[30] = 'qa';
$lang->execution->menuOrder[35] = 'ci'; $lang->execution->menuOrder[35] = 'repo';
$lang->execution->menuOrder[40] = 'doc'; $lang->execution->menuOrder[40] = 'ci';
$lang->execution->menuOrder[45] = 'build'; $lang->execution->menuOrder[45] = 'doc';
$lang->execution->menuOrder[50] = 'release'; $lang->execution->menuOrder[50] = 'build';
$lang->execution->menuOrder[55] = 'action'; $lang->execution->menuOrder[55] = 'release';
$lang->execution->menuOrder[60] = 'setting'; $lang->execution->menuOrder[60] = 'action';
$lang->execution->menuOrder[65] = 'setting';
$lang->task->menuOrder = $lang->execution->menuOrder; $lang->task->menuOrder = $lang->execution->menuOrder;
$lang->build->menuOrder = $lang->execution->menuOrder; $lang->build->menuOrder = $lang->execution->menuOrder;
+3 -1
View File
@@ -337,7 +337,7 @@ $lang->story->menu = $lang->product->menu;
$lang->execution = new stdclass(); $lang->execution = new stdclass();
$lang->execution->homeMenu = new stdclass(); $lang->execution->homeMenu = new stdclass();
$lang->execution->homeMenu->index = '仪表盘|execution|index|'; $lang->execution->homeMenu->index = '仪表盘|execution|index|';
$lang->execution->homeMenu->list = '执行|execution|all|'; $lang->execution->homeMenu->list = array('link' => '执行|execution|all|', 'alias' => 'batchedit');
$lang->execution->menu = new stdclass(); $lang->execution->menu = new stdclass();
$lang->execution->menu->task = array('link' => '任务|execution|task|executionID=%s', 'subModule' => 'task,tree', 'alias' => 'importtask,importbug'); $lang->execution->menu->task = array('link' => '任务|execution|task|executionID=%s', 'subModule' => 'task,tree', 'alias' => 'importtask,importbug');
@@ -346,8 +346,10 @@ $lang->execution->menu->burn = array('link' => '燃尽图|execution|burn|exe
$lang->execution->menu->view = array('link' => '视图|execution|grouptask|executionID=%s', 'alias' => 'grouptask,tree', 'class' => 'dropdown dropdown-hover'); $lang->execution->menu->view = array('link' => '视图|execution|grouptask|executionID=%s', 'alias' => 'grouptask,tree', 'class' => 'dropdown dropdown-hover');
$lang->execution->menu->story = array('link' => "{$lang->SRCommon}|execution|story|executionID=%s", 'subModule' => 'story', 'alias' => 'linkstory,storykanban'); $lang->execution->menu->story = array('link' => "{$lang->SRCommon}|execution|story|executionID=%s", 'subModule' => 'story', 'alias' => 'linkstory,storykanban');
$lang->execution->menu->qa = array('link' => '测试|execution|qa|', 'alias' => 'qa,bug,testcase,testtask,testreport'); $lang->execution->menu->qa = array('link' => '测试|execution|qa|', 'alias' => 'qa,bug,testcase,testtask,testreport');
$lang->execution->menu->repo = array('link' => '代码|repo|browse|projectID=%s');
$lang->execution->menu->doc = array('link' => '文档|doc|objectLibs|type=execution&objectID=%s&from=execution', 'subModule' => 'doc'); $lang->execution->menu->doc = array('link' => '文档|doc|objectLibs|type=execution&objectID=%s&from=execution', 'subModule' => 'doc');
$lang->execution->menu->build = array('link' => '版本|execution|build|executionID=%s', 'subModule' => 'build'); $lang->execution->menu->build = array('link' => '版本|execution|build|executionID=%s', 'subModule' => 'build');
$lang->execution->menu->release = array('link' => '发布|projectrelease|browse|project=%s');
$lang->execution->menu->action = array('link' => '动态|execution|dynamic|executionID=%s'); $lang->execution->menu->action = array('link' => '动态|execution|dynamic|executionID=%s');
$lang->execution->menu->setting = array('link' => '设置|execution|view|executionID=%s', 'subModule' => 'personnel', 'alias' => 'edit,manageproducts,team,whitelist,addwhitelist,managemembers', 'class' => 'dropdown dropdown-hover'); $lang->execution->menu->setting = array('link' => '设置|execution|view|executionID=%s', 'subModule' => 'personnel', 'alias' => 'edit,manageproducts,team,whitelist,addwhitelist,managemembers', 'class' => 'dropdown dropdown-hover');
+11 -9
View File
@@ -819,8 +819,8 @@ class execution extends control
} }
/** /**
* Exectuion qa dashboard. * Exectuion qa dashboard.
* *
* @param int $executionID * @param int $executionID
* @access public * @access public
* @return void * @return void
@@ -910,9 +910,9 @@ class execution extends control
} }
/** /**
* Execution case list. * Execution case list.
* *
* @param int $executionID * @param int $executionID
* @access public * @access public
* @return void * @return void
*/ */
@@ -932,7 +932,7 @@ class execution extends control
$this->view->executionID = $executionID; $this->view->executionID = $executionID;
$this->view->productID = $productID; $this->view->productID = $productID;
$this->view->execution = $this->execution->getByID($executionID); $this->view->execution = $this->execution->getByID($executionID);
$this->display(); $this->display();
} }
@@ -1444,6 +1444,8 @@ class execution extends control
*/ */
public function batchEdit($executionID = 0) public function batchEdit($executionID = 0)
{ {
$this->lang->execution->menu = $this->lang->execution->homeMenu;
$this->app->loadLang('stage'); $this->app->loadLang('stage');
if($this->post->names) if($this->post->names)
@@ -2348,7 +2350,7 @@ class execution extends control
{ {
if($confirm == 'no') if($confirm == 'no')
{ {
$tip = $this->app->rawModule == 'executionstory' ? $this->lang->execution->confirmUnlinkExecutionStory : $this->lang->execution->confirmUnlinkStory; $tip = $this->app->rawModule == 'projectstory' ? $this->lang->execution->confirmUnlinkExecutionStory : $this->lang->execution->confirmUnlinkStory;
die(js::confirm($tip, $this->createLink('execution', 'unlinkstory', "executionID=$executionID&storyID=$storyID&confirm=yes"))); die(js::confirm($tip, $this->createLink('execution', 'unlinkstory', "executionID=$executionID&storyID=$storyID&confirm=yes")));
} }
else else
@@ -2988,8 +2990,8 @@ class execution extends control
} }
/** /**
* Show module menu for some module. * Show module menu for some module.
* *
* @access public * @access public
* @return void * @return void
*/ */
+1 -1
View File
@@ -25,7 +25,7 @@ $(function()
var planID = $('#plan').val(); var planID = $('#plan').val();
if(planID) if(planID)
{ {
parent.location.href = createLink('project', 'importPlanStories', 'projectID=' + projectID + '&planID=' + planID); parent.location.href = createLink('execution', 'importPlanStories', 'executionID=' + executionID + '&planID=' + planID);
} }
}) })
+1
View File
@@ -142,6 +142,7 @@ $lang->execution->index = "Home";
$lang->execution->task = 'Aufgaben'; $lang->execution->task = 'Aufgaben';
$lang->execution->groupTask = 'Nach Gruppen'; $lang->execution->groupTask = 'Nach Gruppen';
$lang->execution->story = 'Storys'; $lang->execution->story = 'Storys';
$lang->execution->qa = 'QA';
$lang->execution->bug = 'Bugs'; $lang->execution->bug = 'Bugs';
$lang->execution->dynamic = 'Verlauf'; $lang->execution->dynamic = 'Verlauf';
$lang->execution->latestDynamic = 'Letzter Verlauf'; $lang->execution->latestDynamic = 'Letzter Verlauf';
+2 -1
View File
@@ -146,6 +146,7 @@ $lang->execution->index = "{$lang->executionCommon} Home";
$lang->execution->task = 'Task List'; $lang->execution->task = 'Task List';
$lang->execution->groupTask = 'Group View'; $lang->execution->groupTask = 'Group View';
$lang->execution->story = 'Story List'; $lang->execution->story = 'Story List';
$lang->execution->qa = 'QA';
$lang->execution->bug = 'Bug List'; $lang->execution->bug = 'Bug List';
$lang->execution->dynamic = 'Dynamics'; $lang->execution->dynamic = 'Dynamics';
$lang->execution->latestDynamic = 'Dynamics'; $lang->execution->latestDynamic = 'Dynamics';
@@ -185,7 +186,7 @@ $lang->execution->delete = "Delete {$lang->executionCommon}";
$lang->execution->browse = "{$lang->executionCommon} List"; $lang->execution->browse = "{$lang->executionCommon} List";
$lang->execution->list = "{$lang->executionCommon} List"; $lang->execution->list = "{$lang->executionCommon} List";
$lang->execution->edit = "Edit {$lang->executionCommon}"; $lang->execution->edit = "Edit {$lang->executionCommon}";
$lang->execution->batchEdit = "Batch Edit"; $lang->execution->batchEdit = "Edit";
$lang->execution->manageMembers = 'Manage Team'; $lang->execution->manageMembers = 'Manage Team';
$lang->execution->unlinkMember = 'Remove Member'; $lang->execution->unlinkMember = 'Remove Member';
$lang->execution->unlinkStory = 'Unlink Story'; $lang->execution->unlinkStory = 'Unlink Story';
+1
View File
@@ -141,6 +141,7 @@ $lang->execution->index = "Accueil {$lang->executionCommon}";
$lang->execution->task = 'Liste Tâches'; $lang->execution->task = 'Liste Tâches';
$lang->execution->groupTask = 'Vision Groupée'; $lang->execution->groupTask = 'Vision Groupée';
$lang->execution->story = 'Liste Stories'; $lang->execution->story = 'Liste Stories';
$lang->execution->qa = 'QA';
$lang->execution->bug = 'Liste Bugs'; $lang->execution->bug = 'Liste Bugs';
$lang->execution->dynamic = 'Historique'; $lang->execution->dynamic = 'Historique';
$lang->execution->latestDynamic = 'Historique'; $lang->execution->latestDynamic = 'Historique';
+1
View File
@@ -142,6 +142,7 @@ $lang->execution->index = "{$lang->executionCommon} Home";
$lang->execution->task = 'Danh sách nhiệm vụ'; $lang->execution->task = 'Danh sách nhiệm vụ';
$lang->execution->groupTask = 'Xem kiểu nhóm'; $lang->execution->groupTask = 'Xem kiểu nhóm';
$lang->execution->story = 'Danh sách câu chuyện'; $lang->execution->story = 'Danh sách câu chuyện';
$lang->execution->qa = 'QA';
$lang->execution->bug = 'Danh sách Bug'; $lang->execution->bug = 'Danh sách Bug';
$lang->execution->dynamic = 'Lịch sử'; $lang->execution->dynamic = 'Lịch sử';
$lang->execution->latestDynamic = 'Lịch sử'; $lang->execution->latestDynamic = 'Lịch sử';
+2 -1
View File
@@ -150,6 +150,7 @@ $lang->execution->index = "{$lang->executionCommon}主页";
$lang->execution->task = '任务列表'; $lang->execution->task = '任务列表';
$lang->execution->groupTask = '分组浏览任务'; $lang->execution->groupTask = '分组浏览任务';
$lang->execution->story = "{$lang->SRCommon}列表"; $lang->execution->story = "{$lang->SRCommon}列表";
$lang->execution->qa = '测试仪表盘';
$lang->execution->bug = 'Bug列表'; $lang->execution->bug = 'Bug列表';
$lang->execution->testcase = '用例列表'; $lang->execution->testcase = '用例列表';
$lang->execution->dynamic = '动态'; $lang->execution->dynamic = '动态';
@@ -190,7 +191,7 @@ $lang->execution->delete = "删除{$lang->executionCommon}";
$lang->execution->browse = "浏览{$lang->executionCommon}"; $lang->execution->browse = "浏览{$lang->executionCommon}";
$lang->execution->list = "{$lang->executionCommon}列表"; $lang->execution->list = "{$lang->executionCommon}列表";
$lang->execution->edit = "编辑{$lang->executionCommon}"; $lang->execution->edit = "编辑{$lang->executionCommon}";
$lang->execution->batchEdit = "批量编辑"; $lang->execution->batchEdit = "编辑";
$lang->execution->manageMembers = '团队管理'; $lang->execution->manageMembers = '团队管理';
$lang->execution->unlinkMember = '移除成员'; $lang->execution->unlinkMember = '移除成员';
$lang->execution->unlinkStory = "移除{$lang->SRCommon}"; $lang->execution->unlinkStory = "移除{$lang->SRCommon}";
+73 -5
View File
@@ -113,8 +113,8 @@ class executionModel extends model
if($methodName == 'all') $label = $this->lang->execution->allExecutions; if($methodName == 'all') $label = $this->lang->execution->allExecutions;
if($methodName == 'create' and $moduleName == 'execution') $label = $this->lang->execution->create; if($methodName == 'create' and $moduleName == 'execution') $label = $this->lang->execution->create;
foreach($this->lang->execution->viewMenu as $key => $menu) common::setMenuVars($this->lang->execution->viewMenu, $key, $executionID); foreach($this->lang->execution->viewMenu as $key => $menu) common::setMenuVars($this->lang->execution->viewMenu, $key, $executionID);
foreach($this->lang->execution->qaMenu as $key => $menu) common::setMenuVars($this->lang->execution->qaMenu, $key, $executionID); foreach($this->lang->execution->qaMenu as $key => $menu) common::setMenuVars($this->lang->execution->qaMenu, $key, $executionID);
foreach($this->lang->execution->menu as $key => $menu) foreach($this->lang->execution->menu as $key => $menu)
{ {
@@ -881,7 +881,7 @@ class executionModel extends model
*/ */
public function getMainAction($module, $method) public function getMainAction($module, $method)
{ {
if($method == 'index' or $method == 'all') return; if(in_array($method, array('index', 'all', 'batchedit'))) return;
$link = html::a(helper::createLink('execution', 'all'), "<i class='icon icon-list'></i>", '', "style='border: none;'"); $link = html::a(helper::createLink('execution', 'all'), "<i class='icon icon-list'></i>", '', "style='border: none;'");
$html = "<p style='padding-top:5px;'>" . $link . "</p>"; $html = "<p style='padding-top:5px;'>" . $link . "</p>";
@@ -900,7 +900,7 @@ class executionModel extends model
*/ */
public function getSwitcher($executionID, $currentModule, $currentMethod) public function getSwitcher($executionID, $currentModule, $currentMethod)
{ {
if($currentMethod == 'index' or $currentMethod == 'all') return; if(in_array($currentMethod, array('index', 'all', 'batchedit'))) return;
$this->session->set('moreExecutionLink', $this->app->getURI(true)); $this->session->set('moreExecutionLink', $this->app->getURI(true));
@@ -2046,12 +2046,51 @@ class executionModel extends model
$data->version = $versions[$storyID]; $data->version = $versions[$storyID];
$data->order = ++$lastOrder; $data->order = ++$lastOrder;
$this->dao->insert(TABLE_PROJECTSTORY)->data($data)->exec(); $this->dao->insert(TABLE_PROJECTSTORY)->data($data)->exec();
$this->story->setStage($storyID); $this->story->setStage($storyID);
$this->linkCases($executionID, (int)$products[$storyID], $storyID);
$action = $executionID == $this->session->PRJ ? 'linked2project' : 'linked2execution'; $action = $executionID == $this->session->PRJ ? 'linked2project' : 'linked2execution';
$this->action->create('story', $storyID, $action, '', $executionID); $this->action->create('story', $storyID, $action, '', $executionID);
} }
} }
/**
* Link cases.
*
* @param int $executionID
* @param int $productID
* @param int $storyID
* @param string $type
* @access public
* @return void
*/
public function linkCases($executionID, $productID, $storyID, $type = '')
{
$this->loadModel('action');
$linkedCases = $this->dao->select('*')->from(TABLE_PROJECTCASE)->where('project')->eq($executionID)->orderBy('order_desc')->fetchPairs('case', 'order');
$lastCaseOrder = empty($linkedCases) ? 0 : reset($linkedCases);
$cases = $this->dao->select('id, version')->from(TABLE_CASE)->where('story')->eq($storyID)->fetchParis('id');
foreach($cases as $caseID => $case)
{
if(isset($linkedCases[$caseID])) continue;
$object = new stdclass();
$object->project = $executionID;
$object->product = $productID;
$object->case = $caseID;
$object->version = $case->version;
$object->order = ++$lastCaseOrder;
$this->dao->insert(TABLE_PROJECTCASE)->data($object)->exec();
$action = $executionID == $this->session->PRJ ? 'linked2project' : 'linked2execution';
if($type) $action = $type == 'project' ? 'linked2project' : 'linked2execution';
$this->action->create('case', $caseID, $action, '', $executionID);
}
}
/** /**
* Link all stories by execution. * Link all stories by execution.
* *
@@ -2106,7 +2145,7 @@ class executionModel extends model
public function unlinkStory($executionID, $storyID) public function unlinkStory($executionID, $storyID)
{ {
$execution = $this->dao->findById($executionID)->from(TABLE_EXECUTION)->fetch(); $execution = $this->dao->findById($executionID)->from(TABLE_EXECUTION)->fetch();
if($execution->type == 'execution') if($execution->type == 'project')
{ {
$executions = $this->dao->select('*')->from(TABLE_EXECUTION)->where('parent')->eq($executionID)->fetchAll('id'); $executions = $this->dao->select('*')->from(TABLE_EXECUTION)->where('parent')->eq($executionID)->fetchAll('id');
$executionStories = $this->dao->select('project,story')->from(TABLE_PROJECTSTORY)->where('story')->eq($storyID)->andWhere('project')->in(array_keys($executions))->fetchAll(); $executionStories = $this->dao->select('project,story')->from(TABLE_PROJECTSTORY)->where('story')->eq($storyID)->andWhere('project')->in(array_keys($executions))->fetchAll();
@@ -2123,6 +2162,7 @@ class executionModel extends model
} }
$this->loadModel('story')->setStage($storyID); $this->loadModel('story')->setStage($storyID);
$this->unlinkCases($executionID, $storyID);
$objectType = $executionID == $this->session->PRJ ? unlinkedfromproject : unlinkedfromexecution; $objectType = $executionID == $this->session->PRJ ? unlinkedfromproject : unlinkedfromexecution;
$this->loadModel('action')->create('story', $storyID, $objectType, '', $executionID); $this->loadModel('action')->create('story', $storyID, $objectType, '', $executionID);
@@ -2136,6 +2176,34 @@ class executionModel extends model
} }
} }
/**
* Unlink cases.
*
* @param int $executionID
* @param int $storyID
* @access public
* @return void
*/
public function unlinkCases($executionID, $storyID)
{
$this->loadModel('action');
$cases = $this->dao->select('id')->from(TABLE_CASE)->where('story')->eq($storyID)->fetchAll('id');
foreach($cases as $caseID => $case)
{
$this->dao->delete()->from(TABLE_PROJECTCASE)->where('project')->eq($executionID)->andWhere('`case`')->eq($caseID)->limit(1)->exec();
$action = $executionID == $this->session->PRJ ? 'unlinkedfromproject' : 'unlinkedfromexecution';
$this->action->create('case', $caseID, $action, '', $executionID);
}
$order = 1;
$cases = $this->dao->select('*')->from(TABLE_PROJECTCASE)->where('project')->eq($executionID)->orderBy('order')->fetchAll();
foreach($cases as $case)
{
if($case->order != $order) $this->dao->update(TABLE_PROJECTCASE)->set('`order`')->eq($order)->where('project')->eq($executionID)->andWhere('`case`')->eq($case->case)->exec();
$order++;
}
}
/** /**
* Get team members. * Get team members.
* *
+10 -13
View File
@@ -72,14 +72,13 @@
<?php common::printOrderLink('id', $orderBy, $vars, $lang->idAB);?> <?php common::printOrderLink('id', $orderBy, $vars, $lang->idAB);?>
</th> </th>
<th><?php common::printOrderLink('name', $orderBy, $vars, $from == 'execution' ? $lang->execution->execName : $lang->execution->name);?></th> <th><?php common::printOrderLink('name', $orderBy, $vars, $from == 'execution' ? $lang->execution->execName : $lang->execution->name);?></th>
<th class='w-150px'><?php common::printOrderLink('code', $orderBy, $vars, $from == 'execution' ? $lang->execution->execCode : $lang->execution->code);?></th>
<th class='thWidth'><?php common::printOrderLink('PM', $orderBy, $vars, $lang->execution->owner);?></th> <th class='thWidth'><?php common::printOrderLink('PM', $orderBy, $vars, $lang->execution->owner);?></th>
<th class='w-90px'><?php common::printOrderLink('end', $orderBy, $vars, $lang->execution->end);?></th> <th class='w-90px'><?php common::printOrderLink('end', $orderBy, $vars, $lang->execution->end);?></th>
<th class='w-90px'><?php common::printOrderLink('status', $orderBy, $vars, $from == 'execution' ? $lang->execution->execStatus : $lang->execution->status);?></th> <th class='w-90px'><?php common::printOrderLink('status', $orderBy, $vars, $from == 'execution' ? $lang->execution->execStatus : $lang->execution->status);?></th>
<th class='w-70px hours'><?php echo $lang->execution->totalEstimate;?></th> <th class='w-40px'><?php echo $lang->execution->totalEstimate;?></th>
<th class='w-70px hours'><?php echo $lang->execution->totalConsumed;?></th> <th class='w-40px'><?php echo $lang->execution->totalConsumed;?></th>
<th class='w-70px hours'><?php echo $lang->execution->totalLeft;?></th> <th class='w-40px'><?php echo $lang->execution->totalLeft;?></th>
<th class='w-80px'><?php echo $lang->execution->progress;?></th> <th class='w-60px'><?php echo $lang->execution->progress;?></th>
<th class='w-100px'><?php echo $lang->execution->burn;?></th> <th class='w-100px'><?php echo $lang->execution->burn;?></th>
<?php if($canOrder):?> <?php if($canOrder):?>
<th class='w-60px sort-default'><?php common::printOrderLink('order', $orderBy, $vars, $lang->execution->orderAB);?></th> <th class='w-60px sort-default'><?php common::printOrderLink('order', $orderBy, $vars, $lang->execution->orderAB);?></th>
@@ -107,16 +106,15 @@
<a class="plan-toggle" data-id="<?php echo $execution->id;?>"><i class="icon icon-angle-double-right"></i></a> <a class="plan-toggle" data-id="<?php echo $execution->id;?>"><i class="icon icon-angle-double-right"></i></a>
<?php endif;?> <?php endif;?>
</td> </td>
<td class='text-left' title="<?php echo $execution->code;?>"><?php echo $execution->code;?></td>
<td><?php echo zget($users, $execution->PM);?></td> <td><?php echo zget($users, $execution->PM);?></td>
<td><?php echo $execution->end;?></td> <td><?php echo $execution->end;?></td>
<?php $executionStatus = $this->processStatus('execution', $execution);?> <?php $executionStatus = $this->processStatus('execution', $execution);?>
<td class='c-status' title='<?php echo $executionStatus;?>'> <td class='c-status' title='<?php echo $executionStatus;?>'>
<span class="status-execution status-<?php echo $execution->status?>"><?php echo $executionStatus;?></span> <span class="status-execution status-<?php echo $execution->status?>"><?php echo $executionStatus;?></span>
</td> </td>
<td class='hours'><?php echo $execution->hours->totalEstimate . ' ' . $config->hourUnit;?></td> <td class='hours' title='<?php echo $execution->hours->totalEstimate . ' ' . $this->lang->execution->workHour;?>'><?php echo $execution->hours->totalEstimate . ' ' . $this->lang->execution->workHourUnit;?></td>
<td class='hours'><?php echo $execution->hours->totalConsumed . ' ' . $config->hourUnit;?></td> <td class='hours' title='<?php echo $execution->hours->totalConsumed . ' ' . $this->lang->execution->workHour;?>'><?php echo $execution->hours->totalConsumed . ' ' . $this->lang->execution->workHourUnit;?></td>
<td class='hours'><?php echo $execution->hours->totalLeft . ' ' . $config->hourUnit;?></td> <td class='hours' title='<?php echo $execution->hours->totalLeft . ' ' . $this->lang->execution->workHour;?>'><?php echo $execution->hours->totalLeft . ' ' . $this->lang->execution->workHourUnit;?></td>
<td class="c-progress"> <td class="c-progress">
<div class='progress-pie' data-doughnut-size='90' data-color='#00da88' data-value='<?php echo $execution->hours->progress;?>' data-width='24' data-height='24' data-back-color='#e8edf3'> <div class='progress-pie' data-doughnut-size='90' data-color='#00da88' data-value='<?php echo $execution->hours->progress;?>' data-width='24' data-height='24' data-back-color='#e8edf3'>
<div class='progress-info'><?php echo $execution->hours->progress;?></div> <div class='progress-info'><?php echo $execution->hours->progress;?></div>
@@ -149,16 +147,15 @@
echo html::a($this->createLink('execution', 'view', 'execution=' . $child->id), $child->name); echo html::a($this->createLink('execution', 'view', 'execution=' . $child->id), $child->name);
?> ?>
</td> </td>
<td class='text-left' title="<?php echo $child->code;?>"><?php echo $child->code;?></td>
<td><?php echo zget($users, $child->PM);?></td> <td><?php echo zget($users, $child->PM);?></td>
<td><?php echo $child->end;?></td> <td><?php echo $child->end;?></td>
<?php $executionStatus = $this->processStatus('execution', $child);?> <?php $executionStatus = $this->processStatus('execution', $child);?>
<td class='c-status' title='<?php echo $executionStatus;?>'> <td class='c-status' title='<?php echo $executionStatus;?>'>
<span class="status-execution status-<?php echo $child->status?>"><?php echo $executionStatus;?></span> <span class="status-execution status-<?php echo $child->status?>"><?php echo $executionStatus;?></span>
</td> </td>
<td class='hours'><?php echo $child->hours->totalEstimate;?></td> <td class='hours' title='<?php echo $child->hours->totalEstimate . ' ' . $this->lang->execution->workHour;?>'><?php echo $child->hours->totalEstimate . ' ' . $this->lang->execution->workHourUnit;?></td>
<td class='hours'><?php echo $child->hours->totalConsumed;?></td> <td class='hours' title='<?php echo $child->hours->totalConsumed . ' ' . $this->lang->execution->workHour;?>'><?php echo $child->hours->totalConsumed . ' ' . $this->lang->execution->workHourUnit;?></td>
<td class='hours'><?php echo $child->hours->totalLeft;?></td> <td class='hours' title='<?php echo $child->hours->totalLeft . ' ' . $this->lang->execution->workHour;?>'><?php echo $child->hours->totalLeft . ' ' . $this->lang->execution->workHourUnit;?></td>
<td class="c-progress"> <td class="c-progress">
<div class='progress-pie' data-doughnut-size='90' data-color='#00da88' data-value='<?php echo $child->hours->progress;?>' data-width='24' data-height='24' data-back-color='#e8edf3'> <div class='progress-pie' data-doughnut-size='90' data-color='#00da88' data-value='<?php echo $child->hours->progress;?>' data-width='24' data-height='24' data-back-color='#e8edf3'>
<div class='progress-info'><?php echo $child->hours->progress;?></div> <div class='progress-info'><?php echo $child->hours->progress;?></div>
+7 -2
View File
@@ -82,7 +82,7 @@
} }
else else
{ {
echo html::select("lifetimes[$executionID]", $lang->program->PRJLifeTimeList, $executions[$executionID]->lifetime, 'class=form-control'); echo html::select("lifetimes[$executionID]", $lang->execution->lifeTimeList, $executions[$executionID]->lifetime, 'class=form-control');
} }
?> ?>
</td> </td>
@@ -108,7 +108,12 @@
<?php endforeach;?> <?php endforeach;?>
</tbody> </tbody>
<tfoot> <tfoot>
<tr><td colspan='<?php echo count($visibleFields) + 6?>' class='text-center form-actions'><?php echo html::submitButton();?></td></tr> <tr>
<td colspan='<?php echo count($visibleFields) + 6?>' class='text-center form-actions'>
<?php echo html::submitButton();?>
<?php echo html::backButton();?>
</td>
</tr>
</tfoot> </tfoot>
</table> </table>
</div> </div>
+1
View File
@@ -16,6 +16,7 @@
<?php js::set('moduleID', $this->cookie->storyModuleParam);?> <?php js::set('moduleID', $this->cookie->storyModuleParam);?>
<?php js::set('productID', $this->cookie->storyProductParam);?> <?php js::set('productID', $this->cookie->storyProductParam);?>
<?php js::set('branchID', str_replace(',', '_', $this->cookie->storyBranchParam));?> <?php js::set('branchID', str_replace(',', '_', $this->cookie->storyBranchParam));?>
<?php js::set('executionID', $execution->id);?>
<?php js::set('confirmUnlinkStory', $lang->execution->confirmUnlinkStory)?> <?php js::set('confirmUnlinkStory', $lang->execution->confirmUnlinkStory)?>
<?php js::set('typeError', sprintf($this->lang->error->notempty, $this->lang->task->type))?> <?php js::set('typeError', sprintf($this->lang->error->notempty, $this->lang->task->type))?>
<?php js::set('workingHourError', sprintf($this->lang->error->notempty, $this->lang->workingHour))?> <?php js::set('workingHourError', sprintf($this->lang->error->notempty, $this->lang->workingHour))?>
+1
View File
@@ -95,6 +95,7 @@ body.menu-hide {padding-left: 0;}
#upgradeContent {display: none; position: absolute; right: 10px; top: -290px; height: 282px; background-color: #fff; left: 0px; padding: 5px 0; border: 1px solid rgba(0,0,0,.15); border-color: rgba(0,0,0,.1); opacity: 1; border-radius: 4px; box-shadow: 0 6px 12px rgba(0,0,0,.12), 0 1px 3px rgba(0,0,0,.1);} #upgradeContent {display: none; position: absolute; right: 10px; top: -290px; height: 282px; background-color: #fff; left: 0px; padding: 5px 0; border: 1px solid rgba(0,0,0,.15); border-color: rgba(0,0,0,.1); opacity: 1; border-radius: 4px; box-shadow: 0 6px 12px rgba(0,0,0,.12), 0 1px 3px rgba(0,0,0,.1);}
#latestVersionList {height: 190px; overflow: auto;} #latestVersionList {height: 190px; overflow: auto;}
#empty-tip {top: 1px; position: relative;}
.version-name {width: 20%;} .version-name {width: 20%;}
.version-date {width: 15%; color: #8a8a8a;} .version-date {width: 15%; color: #8a8a8a;}
+3 -1
View File
@@ -90,10 +90,12 @@ js::set('defaultOpen', $open);
<div id="latestVersionList"> <div id="latestVersionList">
<?php if(empty($latestVersionList)):?> <?php if(empty($latestVersionList)):?>
<div class="table-empty-tip" style='padding: 66px 10px;'> <div class="table-empty-tip" style='padding: 66px 10px;'>
<div style='display: inline-block'><?php echo $lang->noData;?></div> <div style='display: inline-block'>
<span id='empty-tip'><?php echo $lang->noData;?></span>
<a href='<?php echo $lang->website;?>' target='_blank'> <a href='<?php echo $lang->website;?>' target='_blank'>
<span class="label label-badge label-info label-outline"><?php echo $lang->index->website . ': '. $lang->website;?></span> <span class="label label-badge label-info label-outline"><?php echo $lang->index->website . ': '. $lang->website;?></span>
</a> </a>
</div>
</div> </div>
<?php else:?> <?php else:?>
<table class='table has-sort-head'> <table class='table has-sort-head'>
+6 -2
View File
@@ -215,8 +215,12 @@ $lang->testcase->searchStories = 'Story suchen';
$lang->testcase->selectLib = 'Bibliothek wählen'; $lang->testcase->selectLib = 'Bibliothek wählen';
$lang->testcase->action = new stdclass(); $lang->testcase->action = new stdclass();
$lang->testcase->action->fromlib = array('main' => '$date, importiert von <strong>$actor</strong> aus Bibliothek <strong>$extra</strong>.'); $lang->testcase->action->fromlib = array('main' => '$date, importiert von <strong>$actor</strong> aus Bibliothek <strong>$extra</strong>.');
$lang->testcase->action->reviewed = array('main' => '$date, überprüft von <strong>$actor</strong> und Prüfungsergebnis ist <strong>$extra</strong>.', 'extra' => 'reviewResultList'); $lang->testcase->action->reviewed = array('main' => '$date, überprüft von <strong>$actor</strong> und Prüfungsergebnis ist <strong>$extra</strong>.', 'extra' => 'reviewResultList');
$lang->testcase->action->linked2project = array('main' => '$date, 由 <strong>$actor</strong> 关联到项目 <strong>$extra</strong>。');
$lang->testcase->action->unlinkedfromproject = array('main' => '$date, 由 <strong>$actor</strong> 从项目 <strong>$extra</strong> 移除。');
$lang->testcase->action->linked2execution = array('main' => '$date, 由 <strong>$actor</strong> 关联到' . $lang->executionCommon . ' <strong>$extra</strong>。');
$lang->testcase->action->unlinkedfromexecution = array('main' => '$date, 由 <strong>$actor</strong> 从' . $lang->executionCommon . ' <strong>$extra</strong> 移除。');
$lang->testcase->featureBar['browse']['all'] = $lang->testcase->allCases; $lang->testcase->featureBar['browse']['all'] = $lang->testcase->allCases;
$lang->testcase->featureBar['browse']['wait'] = 'Wartend'; $lang->testcase->featureBar['browse']['wait'] = 'Wartend';
+6 -2
View File
@@ -215,8 +215,12 @@ $lang->testcase->searchStories = 'Enter to search for stories';
$lang->testcase->selectLib = 'Select Library'; $lang->testcase->selectLib = 'Select Library';
$lang->testcase->action = new stdclass(); $lang->testcase->action = new stdclass();
$lang->testcase->action->fromlib = array('main' => '$date, imported by <strong>$actor</strong> from <strong>$extra</strong>.'); $lang->testcase->action->fromlib = array('main' => '$date, imported by <strong>$actor</strong> from <strong>$extra</strong>.');
$lang->testcase->action->reviewed = array('main' => '$date, recorded by <strong>$actor</strong> and the review result is <strong>$extra</strong>.', 'extra' => 'reviewResultList'); $lang->testcase->action->reviewed = array('main' => '$date, recorded by <strong>$actor</strong> and the review result is <strong>$extra</strong>.', 'extra' => 'reviewResultList');
$lang->testcase->action->linked2project = array('main' => '$date, 由 <strong>$actor</strong> 关联到项目 <strong>$extra</strong>。');
$lang->testcase->action->unlinkedfromproject = array('main' => '$date, 由 <strong>$actor</strong> 从项目 <strong>$extra</strong> 移除。');
$lang->testcase->action->linked2execution = array('main' => '$date, 由 <strong>$actor</strong> 关联到' . $lang->executionCommon . ' <strong>$extra</strong>。');
$lang->testcase->action->unlinkedfromexecution = array('main' => '$date, 由 <strong>$actor</strong> 从' . $lang->executionCommon . ' <strong>$extra</strong> 移除。');
$lang->testcase->featureBar['browse']['all'] = $lang->testcase->allCases; $lang->testcase->featureBar['browse']['all'] = $lang->testcase->allCases;
$lang->testcase->featureBar['browse']['wait'] = 'Waiting'; $lang->testcase->featureBar['browse']['wait'] = 'Waiting';
+6 -2
View File
@@ -215,8 +215,12 @@ $lang->testcase->searchStories = 'Rechercher des stories';
$lang->testcase->selectLib = 'Sélectionner Library'; $lang->testcase->selectLib = 'Sélectionner Library';
$lang->testcase->action = new stdclass(); $lang->testcase->action = new stdclass();
$lang->testcase->action->fromlib = array('main' => '$date, importé par <strong>$actor</strong> depuis <strong>$extra</strong>.'); $lang->testcase->action->fromlib = array('main' => '$date, importé par <strong>$actor</strong> depuis <strong>$extra</strong>.');
$lang->testcase->action->reviewed = array('main' => '$date, enregistré par <strong>$actor</strong> et le résultat de validation est <strong>$extra</strong>.', 'extra' => 'reviewResultList'); $lang->testcase->action->reviewed = array('main' => '$date, enregistré par <strong>$actor</strong> et le résultat de validation est <strong>$extra</strong>.', 'extra' => 'reviewResultList');
$lang->testcase->action->linked2project = array('main' => '$date, 由 <strong>$actor</strong> 关联到项目 <strong>$extra</strong>。');
$lang->testcase->action->unlinkedfromproject = array('main' => '$date, 由 <strong>$actor</strong> 从项目 <strong>$extra</strong> 移除。');
$lang->testcase->action->linked2execution = array('main' => '$date, 由 <strong>$actor</strong> 关联到' . $lang->executionCommon . ' <strong>$extra</strong>。');
$lang->testcase->action->unlinkedfromexecution = array('main' => '$date, 由 <strong>$actor</strong> 从' . $lang->executionCommon . ' <strong>$extra</strong> 移除。');
$lang->testcase->featureBar['browse']['all'] = $lang->testcase->allCases; $lang->testcase->featureBar['browse']['all'] = $lang->testcase->allCases;
$lang->testcase->featureBar['browse']['wait'] = 'En Attente'; $lang->testcase->featureBar['browse']['wait'] = 'En Attente';
+6 -2
View File
@@ -215,8 +215,12 @@ $lang->testcase->searchStories = 'Nhập nội dung cần tìm cho câu chuyện
$lang->testcase->selectLib = 'Chọn thư viện'; $lang->testcase->selectLib = 'Chọn thư viện';
$lang->testcase->action = new stdclass(); $lang->testcase->action = new stdclass();
$lang->testcase->action->fromlib = array('main' => '$date, nhập bởi <strong>$actor</strong> từ <strong>$extra</strong>.'); $lang->testcase->action->fromlib = array('main' => '$date, nhập bởi <strong>$actor</strong> từ <strong>$extra</strong>.');
$lang->testcase->action->reviewed = array('main' => '$date, ghi nhận bởi <strong>$actor</strong> và kết quả xét duyệt này là <strong>$extra</strong>.', 'extra' => 'reviewResultList'); $lang->testcase->action->reviewed = array('main' => '$date, ghi nhận bởi <strong>$actor</strong> và kết quả xét duyệt này là <strong>$extra</strong>.', 'extra' => 'reviewResultList');
$lang->testcase->action->linked2project = array('main' => '$date, 由 <strong>$actor</strong> 关联到项目 <strong>$extra</strong>。');
$lang->testcase->action->unlinkedfromproject = array('main' => '$date, 由 <strong>$actor</strong> 从项目 <strong>$extra</strong> 移除。');
$lang->testcase->action->linked2execution = array('main' => '$date, 由 <strong>$actor</strong> 关联到' . $lang->executionCommon . ' <strong>$extra</strong>。');
$lang->testcase->action->unlinkedfromexecution = array('main' => '$date, 由 <strong>$actor</strong> 从' . $lang->executionCommon . ' <strong>$extra</strong> 移除。');
$lang->testcase->featureBar['browse']['all'] = $lang->testcase->allCases; $lang->testcase->featureBar['browse']['all'] = $lang->testcase->allCases;
$lang->testcase->featureBar['browse']['wait'] = 'Đang đợi'; $lang->testcase->featureBar['browse']['wait'] = 'Đang đợi';
+6 -2
View File
@@ -215,8 +215,12 @@ $lang->testcase->searchStories = "键入来搜索{$lang->SRCommon}";
$lang->testcase->selectLib = '请选择库'; $lang->testcase->selectLib = '请选择库';
$lang->testcase->action = new stdclass(); $lang->testcase->action = new stdclass();
$lang->testcase->action->fromlib = array('main' => '$date, 由 <strong>$actor</strong> 从用例库 <strong>$extra</strong>导入。'); $lang->testcase->action->fromlib = array('main' => '$date, 由 <strong>$actor</strong> 从用例库 <strong>$extra</strong>导入。');
$lang->testcase->action->reviewed = array('main' => '$date, 由 <strong>$actor</strong> 记录评审结果,结果为 <strong>$extra</strong>。', 'extra' => 'reviewResultList'); $lang->testcase->action->reviewed = array('main' => '$date, 由 <strong>$actor</strong> 记录评审结果,结果为 <strong>$extra</strong>。', 'extra' => 'reviewResultList');
$lang->testcase->action->linked2project = array('main' => '$date, 由 <strong>$actor</strong> 关联到项目 <strong>$extra</strong>。');
$lang->testcase->action->unlinkedfromproject = array('main' => '$date, 由 <strong>$actor</strong> 从项目 <strong>$extra</strong> 移除。');
$lang->testcase->action->linked2execution = array('main' => '$date, 由 <strong>$actor</strong> 关联到' . $lang->executionCommon . ' <strong>$extra</strong>。');
$lang->testcase->action->unlinkedfromexecution = array('main' => '$date, 由 <strong>$actor</strong> 从' . $lang->executionCommon . ' <strong>$extra</strong> 移除。');
$lang->testcase->featureBar['browse']['all'] = $lang->testcase->allCases; $lang->testcase->featureBar['browse']['all'] = $lang->testcase->allCases;
$lang->testcase->featureBar['browse']['wait'] = '待评审'; $lang->testcase->featureBar['browse']['wait'] = '待评审';
+31
View File
@@ -697,6 +697,37 @@ class testcaseModel extends model
} }
} }
/* Process the project and execute the use case. */
if($case->story != $oldCase->story)
{
$this->loadModel('action');
$oldProjects = $this->dao->select('t1.project,t2.type')->from(TABLE_PROJECTSTORY)->alias('t1')
->leftJoin(TABLE_PROJECT)->alias('t2')->on('t1.project=t2.id')
->where('t1.story')->eq($oldCase->story)
->fetchPairs();
foreach($oldProjects as $id => $type)
{
$this->dao->delete()->from(TABLE_PROJECTCASE)->where('project')->eq($id)->andWhere('`case`')->eq($caseID)->exec();
$action = $type == 'project' ? 'unlinkedfromproject' : 'unlinkedfromexecution';
$this->action->create('case', $caseID, $action, '', $executionID);
}
if($case->story != 0)
{
$this->loadModel('execution');
$projects = $this->dao->select('t1.project,t2.type')->from(TABLE_PROJECTSTORY)->alias('t1')
->leftJoin(TABLE_PROJECT)->alias('t2')->on('t1.project=t2.id')
->where('t1.story')->eq($case->story)
->fetchPairs();
foreach($projects as $id => $type)
{
$this->execution->linkCases($id, $case->product, $case->story, $type);
}
}
}
/* Join the steps to diff. */ /* Join the steps to diff. */
if($stepChanged and $this->post->steps) if($stepChanged and $this->post->steps)
{ {