@@ -80,7 +81,8 @@ - createLink('story', 'view', "storyID=$storyID", '', true), $lang->preview, '', "class='btn' id='preview'");?> + + createLink('story', 'view', "storyID=$storyID", '', true), $lang->preview, '', "class='btn $class' id='preview'");?>
diff --git a/module/testreport/control.php b/module/testreport/control.php index 807802ceef..28574c31db 100644 --- a/module/testreport/control.php +++ b/module/testreport/control.php @@ -479,7 +479,7 @@ class testreport extends control { $reportID = (int)$reportID; $report = $this->testreport->getById($reportID); - if(!$report) die(js::error($this->lang->notFound) . js::locate('back')); + if(!$report) die(js::error($this->lang->notFound) . js::locate($this->createLink('qa', 'index'))); $this->session->project = $report->project; $browseLink = ''; diff --git a/module/testreport/lang/zh-tw.php b/module/testreport/lang/zh-tw.php index 28755b6f35..1a2fc60d67 100644 --- a/module/testreport/lang/zh-tw.php +++ b/module/testreport/lang/zh-tw.php @@ -1,5 +1,6 @@ testreport->common = '測試報告'; +$lang->testreport->id = '編號'; $lang->testreport->browse = '報告列表'; $lang->testreport->create = '創建報告'; $lang->testreport->edit = '編輯報告'; diff --git a/module/testsuite/lang/en.php b/module/testsuite/lang/en.php index 3ce7e271e6..0b64a3e23d 100644 --- a/module/testsuite/lang/en.php +++ b/module/testsuite/lang/en.php @@ -26,7 +26,6 @@ $lang->testsuite->successSaved = 'Saved'; $lang->testsuite->id = 'ID'; $lang->testsuite->common = 'Test Suite'; $lang->testsuite->project = 'Project'; -$lang->testsuite->suite = 'Test Suite'; $lang->testsuite->product = $lang->productCommon; $lang->testsuite->name = 'Name'; $lang->testsuite->type = 'Type'; diff --git a/module/testsuite/lang/zh-tw.php b/module/testsuite/lang/zh-tw.php index 44e345f2f2..2ce0b38183 100644 --- a/module/testsuite/lang/zh-tw.php +++ b/module/testsuite/lang/zh-tw.php @@ -25,10 +25,12 @@ $lang->testsuite->successSaved = '保存成功'; $lang->testsuite->id = '編號'; $lang->testsuite->common = '套件'; +$lang->testsuite->project = '所屬項目'; $lang->testsuite->product = '所屬' . $lang->productCommon; $lang->testsuite->name = '名稱'; $lang->testsuite->type = '類型'; $lang->testsuite->desc = '描述'; +$lang->testsuite->mailto = '抄送給'; $lang->testsuite->author = '訪問權限'; $lang->testsuite->addedBy = '由誰創建'; $lang->testsuite->addedDate = '創建時間'; diff --git a/module/testtask/control.php b/module/testtask/control.php index 1f3d1753c4..61c686b1d0 100644 --- a/module/testtask/control.php +++ b/module/testtask/control.php @@ -290,7 +290,7 @@ class testtask extends control if(!$task) { if(defined('RUN_MODE') && RUN_MODE == 'api') return $this->send(array('status' => 'fail', 'message' => '404 Not found')); - die(js::error($this->lang->notFound) . js::locate('back')); + die(js::error($this->lang->notFound) . js::locate($this->createLink('qa', 'index'))); } /* When the session changes, you need to query the related products again. */ diff --git a/module/testtask/lang/zh-tw.php b/module/testtask/lang/zh-tw.php index 38fb65d520..379b8a88c8 100644 --- a/module/testtask/lang/zh-tw.php +++ b/module/testtask/lang/zh-tw.php @@ -47,6 +47,12 @@ $lang->testtask->all = "全部" . $lang->productCommon; $lang->testtask->allTasks = '所有測試'; $lang->testtask->collapseAll = '全部摺疊'; $lang->testtask->expandAll = '全部展開'; +$lang->testtask->auto = '自動化'; +$lang->testtask->task = '測試單'; +$lang->testtask->run = '執行編號'; +$lang->testtask->job = '構建任務'; +$lang->testtask->compile = '構建'; +$lang->testtask->duration = '持續時間'; $lang->testtask->viewAction = "測試單概況"; $lang->testtask->casesAction = '查看用例'; diff --git a/module/todo/lang/zh-tw.php b/module/todo/lang/zh-tw.php index 3a354cf692..ae09ab15b9 100644 --- a/module/todo/lang/zh-tw.php +++ b/module/todo/lang/zh-tw.php @@ -56,6 +56,7 @@ $lang->todo->pri = '優先順序'; $lang->todo->name = '待辦名稱'; $lang->todo->status = '狀態'; $lang->todo->desc = '描述'; +$lang->todo->config = '配置'; $lang->todo->private = '私人事務'; $lang->todo->cycleDay = '天'; $lang->todo->cycleWeek = '周'; diff --git a/module/tutorial/lang/zh-tw.php b/module/tutorial/lang/zh-tw.php index e11059ab03..e926425113 100644 --- a/module/tutorial/lang/zh-tw.php +++ b/module/tutorial/lang/zh-tw.php @@ -52,25 +52,25 @@ $lang->tutorial->tasks['createStory'] = array('title' => "創建{$lang-> $lang->tutorial->tasks['createStory']['nav'] = array('app' => 'product', 'module' => 'story', 'method' => 'create', 'menuModule' => 'story', 'menu' => '#productTableList>tr:not(.has-nest-child):first>.c-name>a,#heading>.header-btn:first,#navbar>.nav>li[data-id="all"],.create-story-btn', 'target' => '.create-story-btn', 'form' => '#dataform', 'submit' => '#submit', 'targetPageName' => "提{$lang->SRCommon}"); $lang->tutorial->tasks['createStory']['desc'] = "

在系統創建一個新的{$lang->SRCommon}:

  • 打開 {$lang->productCommon} {$lang->SRCommon} 提{$lang->SRCommon} 頁面;
  • 在{$lang->productCommon}表單中填寫要創建的{$lang->SRCommon}信息;
  • 保存{$lang->SRCommon}信息。
"; -$lang->tutorial->tasks['createProject'] = array('title' => '創建' . $lang->projectCommon); +$lang->tutorial->tasks['createProject'] = array('title' => '創建項目'); $lang->tutorial->tasks['createProject']['mode'] = 'new'; -$lang->tutorial->tasks['createProject']['nav'] = array('app' => 'project', 'module' => 'project', 'method' => 'create', 'menuModule' => 'browse', 'menu' => '', 'form' => '#dataform', 'submit' => '#submit', 'target' => '.create-project-btn', 'targetPageName' => '添加' . $lang->projectCommon); -$lang->tutorial->tasks['createProject']['desc'] = "

在系統創建一個新的{$lang->projectCommon}:

  • 打開 {$lang->projectCommon} {$lang->projectCommon}列表 創建{$lang->projectCommon} 頁面;
  • 在{$lang->projectCommon}表單中填寫要創建的{$lang->projectCommon}信息;
  • 保存{$lang->projectCommon}信息。
"; +$lang->tutorial->tasks['createProject']['nav'] = array('app' => 'project', 'module' => 'project', 'method' => 'create', 'menuModule' => 'browse', 'menu' => '', 'form' => '#dataform', 'submit' => '#submit', 'target' => '.create-project-btn', 'targetPageName' => '添加項目'); +$lang->tutorial->tasks['createProject']['desc'] = "

在系統創建一個新的項目:

  • 打開 項目 項目列表 創建項目 頁面;
  • 在項目表單中填寫要創建的項目信息;
  • 保存項目信息。
"; -$lang->tutorial->tasks['manageTeam'] = array('title' => "管理{$lang->projectCommon}團隊"); +$lang->tutorial->tasks['manageTeam'] = array('title' => "管理項目團隊"); $lang->tutorial->tasks['manageTeam']['mode'] = 'new'; $lang->tutorial->tasks['manageTeam']['nav'] = array('app' => 'project', 'module' => 'project', 'method' => 'managemembers', 'menuModule' => '', 'menu' => '#navbar>.nav>li[data-id="browse"],#cards>.col>.panel:first .project-name,#projectTableList>tr:first>.c-name a,#navbar>.nav>li[data-id="settings"],#subNavbar>.nav>li[data-id="members"],.manage-team-btn', 'target' => '.manage-team-btn', 'vars' => 'projectID=0', 'form' => '#teamForm', 'requiredFields' => 'accounts1', 'submit' => '#submit', 'targetPageName' => '團隊管理'); -$lang->tutorial->tasks['manageTeam']['desc'] = "

管理{$lang->projectCommon}團隊成員:

  • 打開 {$lang->projectCommon} 設置 團隊 團隊管理 頁面;
  • 選擇要加入{$lang->projectCommon}團隊的成員;
  • 保存團隊成員信息。
"; +$lang->tutorial->tasks['manageTeam']['desc'] = "

管理項目團隊成員:

  • 打開 項目 設置 團隊 團隊管理 頁面;
  • 選擇要加入項目團隊的成員;
  • 保存團隊成員信息。
"; $lang->tutorial->tasks['createProjectExecution'] = array('title' => '添加' . $lang->executionCommon); $lang->tutorial->tasks['createProjectExecution']['mode'] = 'new'; $lang->tutorial->tasks['createProjectExecution']['nav'] = array('app' => 'project', 'module' => 'execution', 'method' => 'create', 'menuModule' => 'browse', 'menu' => '#navbar>.nav>li[data-id="browse"],#cards>.col>.panel:first .project-name,#projectTableList>tr:first>.c-name a,#navbar>.nav>li[data-id="execution"],.create-execution-btn', 'form' => '#dataform', 'submit' => '#submit', 'target' => '.create-execution-btn', 'targetPageName' => '添加' . $lang->executionCommon); -$lang->tutorial->tasks['createProjectExecution']['desc'] = "

在系統創建一個新的{$lang->executionCommon}:

  • 打開 {$lang->projectCommon} {$lang->executionCommon} 添加{$lang->executionCommon} 頁面;
  • 在{$lang->executionCommon}表單中填寫要創建的{$lang->executionCommon}信息;
  • 保存{$lang->executionCommon}信息。
"; +$lang->tutorial->tasks['createProjectExecution']['desc'] = "

在系統創建一個新的{$lang->executionCommon}:

  • 打開 項目 {$lang->executionCommon} 添加{$lang->executionCommon} 頁面;
  • 在{$lang->executionCommon}表單中填寫要創建的{$lang->executionCommon}信息;
  • 保存{$lang->executionCommon}信息。
"; $lang->tutorial->tasks['createExecution'] = array('title' => '創建' . $lang->executionCommon); $lang->tutorial->tasks['createExecution']['mode'] = 'classic'; $lang->tutorial->tasks['createExecution']['nav'] = array('app' => 'execution', 'module' => 'execution', 'method' => 'create', 'menuModule' => 'browse', 'menu' => '#heading>.header-btn:first,#navbar>.nav>li[data-id="all"],.create-execution-btn', 'form' => '#dataform', 'submit' => '#submit', 'target' => '.create-execution-btn', 'targetPageName' => '添加' . $lang->executionCommon); -$lang->tutorial->tasks['createExecution']['desc'] = "

在系統創建一個新的{$lang->executionCommon}:

  • 打開 {$lang->projectCommon} {$lang->executionCommon}列表 添加{$lang->executionCommon} 頁面;
  • 在表單中填寫要創建的{$lang->executionCommon}信息;
  • 保存{$lang->executionCommon}信息。
"; +$lang->tutorial->tasks['createExecution']['desc'] = "

在系統創建一個新的{$lang->executionCommon}:

  • 打開 項目 {$lang->executionCommon}列表 添加{$lang->executionCommon} 頁面;
  • 在表單中填寫要創建的{$lang->executionCommon}信息;
  • 保存{$lang->executionCommon}信息。
"; $lang->tutorial->tasks['manageExecutionTeam'] = array('title' => "管理團隊"); $lang->tutorial->tasks['manageExecutionTeam']['mode'] = 'classic'; diff --git a/module/tutorial/model.php b/module/tutorial/model.php index 992b3ba95c..558dec1ba1 100644 --- a/module/tutorial/model.php +++ b/module/tutorial/model.php @@ -155,6 +155,17 @@ class tutorialModel extends model return $project; } + /** + * Get tutorial project pairs. + * + * @access public + * @return array + */ + public function getProjectPairs() + { + return array(2 => 'Test Project'); + } + /** * Get project stats for tutorial * diff --git a/module/upgrade/control.php b/module/upgrade/control.php index f65055394f..46e71911f4 100644 --- a/module/upgrade/control.php +++ b/module/upgrade/control.php @@ -341,7 +341,7 @@ class upgrade extends control /* When upgrading historical data as a project, handle products that are not linked with the project. */ if(!empty($singleProducts)) $this->upgrade->computeProductAcl($singleProducts, $programID); } - elseif($type == 'sprint') + elseif($type == 'sprint' or $type == 'noProject') { $linkedSprints = $this->post->sprints; @@ -350,17 +350,22 @@ class upgrade extends control if(dao::isError()) die(js::error(dao::getError())); /* Process merged independent projects. */ + $productIdList = array(); + if($type == 'noProject') + { + $productIdList = $this->dao->select('product')->from(TABLE_PROJECTPRODUCT)->where('project')->in($linkedSprints)->fetchPairs(); + } if($_POST['projectType'] == 'execution') { /* Use historical projects as execution upgrades. */ - $this->upgrade->processMergedData($programID, $projectList, $lineID, array(), $linkedSprints); + $this->upgrade->processMergedData($programID, $projectList, $lineID, $productIdList, $linkedSprints); } else { /* Use historical projects as project upgrades. */ foreach($linkedSprints as $sprint) { - $this->upgrade->processMergedData($programID, $projectList[$sprint], $lineID, array(), array($sprint => $sprint)); + $this->upgrade->processMergedData($programID, $projectList[$sprint], $lineID, $productIdList, array($sprint => $sprint)); } } } @@ -453,6 +458,7 @@ class upgrade extends control $this->view->lineGroups = $lineGroups; $this->view->productGroups = $productGroups; } + /* Get projects group by product. */ if($type == 'product') { @@ -486,7 +492,6 @@ class upgrade extends control if(empty($noMergedProducts)) $this->locate($this->createLink('upgrade', 'mergeProgram', "type=sprint&programID=0&projectType=$projectType")); - /* Group project by product. */ $productGroups = array(); foreach($noMergedSprints as $sprint) @@ -501,6 +506,7 @@ class upgrade extends control $this->view->noMergedProducts = $noMergedProducts; $this->view->productGroups = $productGroups; } + /* Get no merged projects than is not linked product. */ if($type == 'sprint') { @@ -508,10 +514,26 @@ class upgrade extends control $projectProducts = $this->dao->select('*')->from(TABLE_PROJECTPRODUCT)->where('project')->in(array_keys($noMergedSprints))->fetchGroup('project', 'product'); foreach($projectProducts as $sprintID => $products) unset($noMergedSprints[$sprintID]); - if(empty($noMergedSprints)) $this->locate($this->createLink('upgrade', 'mergeProgram', "type=moreLink")); + if(empty($noMergedSprints)) $this->locate($this->createLink('upgrade', 'mergeProgram', "type=noProject")); $this->view->noMergedSprints = $noMergedSprints; } + + /* Get one no merged sprint that link more then two products and no project in the system. */ + if($type == 'noProject') + { + $project = $this->dao->select('*')->from(TABLE_PROJECT)->where('type')->eq('project')->fetch(); + if($project) $this->locate($this->createLink('upgrade', 'mergeProgram', 'type=moreLink')); + $noMergedSprints = $this->dao->select('*')->from(TABLE_PROJECT)->where('parent')->eq(0)->andWhere('path')->eq('')->orderBy('id_desc')->limit(1)->fetchAll('id'); + + $productPrograms = $this->dao->select('t3.id as id, t3.name as name')->from(TABLE_PROJECTPRODUCT)->alias('t1') + ->leftJoin(TABLE_PRODUCT)->alias('t2')->on('t1.product=t2.id') + ->leftJoin(TABLE_PROGRAM)->alias('t3')->on('t2.program=t3.id') + ->where('t1.project')->eq(key($noMergedSprints)) + ->fetchPairs(); + $this->view->noMergedSprints = $noMergedSprints; + } + /* Get no merged projects that link more then two products. */ if($type == 'moreLink') { @@ -549,7 +571,7 @@ class upgrade extends control $currentProgramID = $programID ? $programID : key($programs); $this->view->title = $this->lang->upgrade->mergeProgram; - $this->view->programs = $programs; + $this->view->programs = $type == 'noProject' ? $productPrograms : $programs; $this->view->programID = $programID; $this->view->projects = array('' => '') + $this->upgrade->getProjectPairsByProgram($currentProgramID); $this->view->lines = $currentProgramID ? array('' => '') + $this->loadModel('product')->getLinePairs($currentProgramID) : array('' => ''); diff --git a/module/upgrade/js/mergeprogram.js b/module/upgrade/js/mergeprogram.js index f84d05390b..1690fd8615 100644 --- a/module/upgrade/js/mergeprogram.js +++ b/module/upgrade/js/mergeprogram.js @@ -522,6 +522,7 @@ $(function() setProgramBegin(programBegin); setProgramEnd(programEnd); setProjectPM(); + toggleProgram(); hiddenProject(); }) @@ -638,7 +639,7 @@ function getLineByProgram() function toggleProgram(obj) { var $obj = $(obj); - if($obj.length == 0) return false; + if($obj.length == 0 && type != 'noProject') return false; var $programs = $obj.closest('table').find('#programs'); if($obj.prop('checked')) @@ -647,6 +648,8 @@ function toggleProgram(obj) $('form .pgm-exist').addClass('hidden'); $programs.attr('disabled', 'disabled'); $('.programStatus').show(); + $('#programStatus').val('wait'); + $('#programStatus').removeAttr('disabled').trigger("chosen:updated"); $('form #newProject0').prop('checked', true); $('form #newLine0').prop('checked', true); @@ -658,6 +661,7 @@ function toggleProgram(obj) $('form .pgm-exist').removeClass('hidden'); $('form .pgm-no-exist').addClass('hidden'); $('.programStatus').hide(); + $('#programStatus').attr('disabled', 'disabled'); if(!$('#newProgram0').prop('disabled')) { @@ -827,12 +831,16 @@ function setProgramByProduct(product) { $(this).prop('checked', false); $(this).attr('disabled', 'disabled'); + $('#checkAllProducts').attr('disabled', 'disabled'); + $('#checkAllProjects').attr('disabled', 'disabled'); $('[data-product=' + currentProductID + ']').prop('checked', false); $('[data-product=' + currentProductID + ']').attr('disabled', 'disabled'); } else if($(':checkbox:checked[data-programid=' + programID + ']').length == 0) { $(this).removeAttr('disabled'); + $('#checkAllProducts').removeAttr('disabled'); + $('#checkAllProjects').removeAttr('disabled'); $('[data-product=' + currentProductID + ']').removeAttr('disabled'); } } diff --git a/module/upgrade/lang/version.php b/module/upgrade/lang/version.php index 1e343452b6..1f29435766 100644 --- a/module/upgrade/lang/version.php +++ b/module/upgrade/lang/version.php @@ -143,3 +143,4 @@ $lang->upgrade->fromVersions['15_0_3'] = '15.0.3'; $lang->upgrade->fromVersions['15_2'] = '15.2'; $lang->upgrade->fromVersions['15_3'] = '15.3'; $lang->upgrade->fromVersions['15_4'] = '15.4'; +$lang->upgrade->fromVersions['15_5'] = '15.5'; diff --git a/module/upgrade/model.php b/module/upgrade/model.php index 0e46dee10e..3548c10896 100644 --- a/module/upgrade/model.php +++ b/module/upgrade/model.php @@ -923,6 +923,7 @@ class upgradeModel extends model $xuanxuanSql = $this->app->getAppRoot() . 'db' . DS . 'upgradexuanxuan4.4.sql'; $confirmContent .= file_get_contents($xuanxuanSql); } + case '15_5': $confirmContent .= file_get_contents($this->getUpgradeFile('15.5')); } return str_replace('zt_', $this->config->db->prefix, $confirmContent); } diff --git a/module/upgrade/view/createprogram.html.php b/module/upgrade/view/createprogram.html.php index 3824f3e72d..37fa143e4b 100644 --- a/module/upgrade/view/createprogram.html.php +++ b/module/upgrade/view/createprogram.html.php @@ -14,6 +14,7 @@