diff --git a/module/testcase/config/form.php b/module/testcase/config/form.php index bd6d431874..955dfd7043 100644 --- a/module/testcase/config/form.php +++ b/module/testcase/config/form.php @@ -119,6 +119,6 @@ $config->testcase->form->showImport['pri'] = array('required' => false, $config->testcase->form->showImport['precondition'] = array('required' => false, 'type' => 'string', 'default' => ''); $config->testcase->form->showImport['keywords'] = array('required' => false, 'type' => 'string', 'default' => ''); $config->testcase->form->showImport['stage'] = array('required' => false, 'type' => 'array', 'default' => array(''), 'filter' => 'join'); -$config->testcase->form->showImport['desc'] = array('required' => false, 'type' => 'array', 'default' => array()); -$config->testcase->form->showImport['expect'] = array('required' => false, 'type' => 'array', 'default' => array()); -$config->testcase->form->showImport['stepType'] = array('required' => false, 'type' => 'array', 'default' => array()); +$config->testcase->form->showImport['desc'] = array('required' => false, 'type' => 'array', 'default' => array()); +$config->testcase->form->showImport['expect'] = array('required' => false, 'type' => 'array', 'default' => array()); +$config->testcase->form->showImport['stepType'] = array('required' => false, 'type' => 'array', 'default' => array()); diff --git a/module/testcase/config/table.php b/module/testcase/config/table.php index 22ffc6dd11..b3d72e8011 100644 --- a/module/testcase/config/table.php +++ b/module/testcase/config/table.php @@ -219,10 +219,11 @@ $config->testcase->importfromlib->dtable->fieldList['id']['title'] = $lang->idAB $config->testcase->importfromlib->dtable->fieldList['id']['type'] = 'checkID'; $config->testcase->importfromlib->dtable->fieldList['id']['fixed'] = false; -$config->testcase->importfromlib->dtable->fieldList['branch']['name'] = 'branch'; -$config->testcase->importfromlib->dtable->fieldList['branch']['title'] = $lang->testcase->branch; -$config->testcase->importfromlib->dtable->fieldList['branch']['type'] = 'html'; -$config->testcase->importfromlib->dtable->fieldList['branch']['width'] = '200px'; +$config->testcase->importfromlib->dtable->fieldList['branch']['name'] = 'branch'; +$config->testcase->importfromlib->dtable->fieldList['branch']['title'] = $lang->testcase->branch; +$config->testcase->importfromlib->dtable->fieldList['branch']['type'] = 'control'; +$config->testcase->importfromlib->dtable->fieldList['branch']['control'] = 'picker'; +$config->testcase->importfromlib->dtable->fieldList['branch']['width'] = '200px'; $config->testcase->importfromlib->dtable->fieldList['pri']['name'] = 'pri'; $config->testcase->importfromlib->dtable->fieldList['pri']['title'] = $lang->testcase->pri; @@ -239,10 +240,11 @@ $config->testcase->importfromlib->dtable->fieldList['fromModule']['name'] = 'fr $config->testcase->importfromlib->dtable->fieldList['fromModule']['title'] = $lang->testcase->fromModule; $config->testcase->importfromlib->dtable->fieldList['fromModule']['type'] = 'category'; -$config->testcase->importfromlib->dtable->fieldList['module']['name'] = 'module'; -$config->testcase->importfromlib->dtable->fieldList['module']['title'] = $lang->testcase->module; -$config->testcase->importfromlib->dtable->fieldList['module']['type'] = 'html'; -$config->testcase->importfromlib->dtable->fieldList['module']['width'] = '200px'; +$config->testcase->importfromlib->dtable->fieldList['module']['name'] = 'module'; +$config->testcase->importfromlib->dtable->fieldList['module']['title'] = $lang->testcase->module; +$config->testcase->importfromlib->dtable->fieldList['module']['type'] = 'control'; +$config->testcase->importfromlib->dtable->fieldList['module']['control'] = 'picker'; +$config->testcase->importfromlib->dtable->fieldList['module']['width'] = '200px'; $config->testcase->importfromlib->dtable->fieldList['type']['name'] = 'type'; $config->testcase->importfromlib->dtable->fieldList['type']['title'] = $lang->testcase->type; diff --git a/module/testcase/control.php b/module/testcase/control.php index 945d492523..5d1b245c4b 100644 --- a/module/testcase/control.php +++ b/module/testcase/control.php @@ -1087,87 +1087,67 @@ class testcase extends control /** * Import case from lib. * - * @param int $productID - * @param int $branch - * @param int $libID - * @param string $orderBy - * @param int $recTotal - * @param int $recPerPage - * @param int $pageID + * @param int $productID + * @param int|string $branch + * @param int $libID + * @param string $orderBy + * @param int $recTotal + * @param int $recPerPage + * @param int $pageID * @access public * @return void */ - public function importFromLib($productID, $branch = 0, $libID = 0, $orderBy = 'id_desc', $browseType = '', $queryID = 0, $recTotal = 0, $recPerPage = 20, $pageID = 1, $projectID = 0) + public function importFromLib(int $productID, string $branch = '0', int $libID = 0, string $orderBy = 'id_desc', string $browseType = '', int $queryID = 0, int $recTotal = 0, int $recPerPage = 20, int $pageID = 1, int $projectID = 0) { - $browseType = strtolower($browseType); - $queryID = (int)$queryID; - $product = $this->loadModel('product')->getById($productID); - $branches = array(); - if($branch == '') $branch = 0; - - $this->loadModel('branch'); - if($product->type != 'normal') $branches = array(BRANCH_MAIN => $this->lang->branch->main) + $this->branch->getPairs($productID, 'active', $projectID); - + /* 获取用例库,设置用例库 id 和分支。 */ + /* Get libraries, set lib id and branch. */ $libraries = $this->loadModel('caselib')->getLibraries(); if(empty($libraries)) return $this->send(array('result' => 'fail', 'message' => $this->lang->testcase->noLibrary, 'load' => $this->session->caseList)); - if(empty($libID) || !isset($libraries[$libID])) $libID = key($libraries); + if($branch == '') $branch = 0; if($_POST) { - $result = $this->testcase->importFromLib($productID, $libID, $branch); + list($cases, $steps, $files, $imported) = $this->testcaseZen->buildDataForImportFromLib($productID, $branch, $libID); - if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError())); - - if(!empty($result) && is_string($result)) + $this->loadModel('action'); + foreach($cases as $oldCaseID => $case) { - $imported = trim($result, ','); - return $this->send(array('result' => 'fail', 'message' => sprintf($this->lang->testcase->importedCases, $imported))); + $this->testcase->doCreate($case); + $caseID = $this->dao->lastInsertID(); + $this->executeHooks($caseID); + $this->testcase->syncCase2Project($case, $caseID); + $this->testcase->importSteps($caseID, zget($steps, $oldCaseID, array())); + $this->testcase->importFiles($caseID, zget($files, $oldCaseID, array())); + + $this->action->create('case', $caseID, 'fromlib', '', $case->lib); } + if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError())); + if(!empty($imported) && is_string($imported)) return $this->send(array('result' => 'fail', 'message' => sprintf($this->lang->testcase->importedCases, trim($imported, ',')))); return $this->send(array('result' => 'success', 'message' => $this->lang->importSuccess, 'load' => true)); } + /* 设置菜单。 */ + /* Set menu. */ $this->app->tab == 'project' ? $this->loadModel('project')->setMenu($this->session->project) : $this->testcase->setMenu($this->products, $productID, $branch); - /* Build the search form. */ - $actionURL = $this->createLink('testcase', 'importFromLib', "productID=$productID&branch=$branch&libID=$libID&orderBy=$orderBy&browseType=bySearch&queryID=myQueryID"); - $this->config->testcase->search['module'] = 'testsuite'; - $this->config->testcase->search['onMenuBar'] = 'no'; - $this->config->testcase->search['actionURL'] = $actionURL; - $this->config->testcase->search['queryID'] = $queryID; - $this->config->testcase->search['fields']['lib'] = $this->lang->testcase->lib; - $this->config->testcase->search['params']['lib'] = array('operator' => '=', 'control' => 'select', 'values' => array('' => '', $libID => $libraries[$libID], 'all' => $this->lang->caselib->all)); - $this->config->testcase->search['params']['module']['values'] = $this->loadModel('tree')->getOptionMenu($libID, $viewType = 'caselib'); - if(!$this->config->testcase->needReview) unset($this->config->testcase->search['params']['status']['values']['wait']); - unset($this->config->testcase->search['fields']['product']); - unset($this->config->testcase->search['fields']['branch']); - $this->loadModel('search')->setSearchParams($this->config->testcase->search); - - $this->loadModel('testsuite'); - foreach($branches as $branchID => $branchName) $canImportModules[$branchID] = $this->testsuite->getCanImportModules($productID, $libID, $branchID); - if(empty($branches)) $canImportModules[0] = $this->testsuite->getCanImportModules($productID, $libID, 0); + $browseType = strtolower($browseType); /* Load pager. */ $this->app->loadClass('pager', $static = true); $pager = pager::init(0, $recPerPage, $pageID); + /* 展示变量. */ + /* Show the variables. */ + $this->testcaseZen->assignForImportFromLib($productID, $branch, $libID, $orderBy, $queryID, $libraries); + $this->view->title = $this->lang->testcase->common . $this->lang->colon . $this->lang->testcase->importFromLib; - - $this->view->libraries = $libraries; - $this->view->libID = $libID; - $this->view->product = $product; - $this->view->productID = $productID; - $this->view->branch = $branch; - $this->view->cases = $this->testsuite->getCanImportCases($productID, $libID, $branch, $orderBy, $pager, $browseType, $queryID); - $this->view->libModules = $this->tree->getOptionMenu($libID, 'caselib'); - $this->view->pager = $pager; - $this->view->orderBy = $orderBy; - $this->view->branches = $branches; - $this->view->browseType = $browseType; - $this->view->queryID = $queryID; - $this->view->canImportModules = $canImportModules; - + $this->view->libraries = $libraries; + $this->view->cases = $this->loadModel('testsuite')->getCanImportCases($productID, $libID, $branch, $orderBy, $pager, $browseType, $queryID); + $this->view->libModules = $this->tree->getOptionMenu($libID, 'caselib'); + $this->view->pager = $pager; + $this->view->browseType = $browseType; $this->display(); } diff --git a/module/testcase/js/importfromlib.ui.js b/module/testcase/js/importfromlib.ui.js index d43932335c..c5f872d791 100644 --- a/module/testcase/js/importfromlib.ui.js +++ b/module/testcase/js/importfromlib.ui.js @@ -1,34 +1,7 @@ window.renderModuleItem = function(result, info) { - if(info.col.name == 'module') - { - const $module = $('#moduleSelect select').empty(); - - $module.attr('name', `module[${info.row.data.id}]`); - - $.each(info.row.data.moduleItems, function(moduleID, moduleName) - { - $module.append(''); - }); - - result[0] = null; - result[result.length] = {html: $('#moduleSelect').html()}; - } - - if(info.col.name == 'branch') - { - const $branch = $('#branchSelect select').empty(); - - $branch.attr('name', `branch[${info.row.data.id}]`); - - $.each(info.row.data.branchItems, function(branchID, branchName) - { - $branch.append(''); - }); - - result[0] = null; - result[result.length] = {html: $('#branchSelect').html()}; - } + if(info.col.name == 'module') info.col.setting.control.props.items = info.row.data.moduleItems; + if(info.col.name == 'branch') info.col.setting.control.props.items = info.row.data.branchItems; return result; } diff --git a/module/testcase/ui/importfromlib.html.php b/module/testcase/ui/importfromlib.html.php index fdb8cba971..3e3a0f79a6 100644 --- a/module/testcase/ui/importfromlib.html.php +++ b/module/testcase/ui/importfromlib.html.php @@ -50,27 +50,30 @@ div ); $config->testcase->importfromlib->dtable->fieldList['fromModule']['map'] = $libModules; +$config->testcase->importfromlib->dtable->fieldList['branch']['controlItems'] = array(); +$config->testcase->importfromlib->dtable->fieldList['module']['controlItems'] = array(); if($product->type == 'normal') unset($config->testcase->importfromlib->dtable->fieldList['branch']); foreach($cases as $case) { $case->fromModule = $case->module; - $caseBranches = $branches; + $caseBranches = array(); $caseBranch = ($branch == 'all' || empty($branch)) ? 0 : $branch; - foreach($caseBranches as $branchID => $branchName) + foreach($branches as $branchID => $branchName) { if(empty($canImportModules[$branchID][$case->id])) { - unset($caseBranches[$branchID]); - if($caseBranch == $branchID) $caseBranch = key($caseBranches); + continue; } + $caseBranches[] = array('text' => $branchName, 'value' => $branchID); } $case->moduleItems = $canImportModules[$caseBranch][$case->id]; $case->branchItems = $caseBranches; $case->branch = $caseBranch; + if($case->id != key($cases)) $case->module = 'ditto'; } $footToolbar = array('items' => array(array('text' => $lang->testcase->import, 'btnType' => 'secondary', 'className' => 'import-btn'))); @@ -81,7 +84,6 @@ formBase set::action(createLink('testcase', 'importFromLib', "product={$productID}&branch={$branch}&libID={$libID}")), set::actions(array()), on::change('[name*=branch]', 'updateModules'), - dtable ( set::cols($config->testcase->importfromlib->dtable->fieldList), @@ -90,6 +92,7 @@ formBase set::checkable(true), set::footToolbar($footToolbar), set::footPager(usePager()), + set::plugins(array('form')), ) ); @@ -101,6 +104,7 @@ div ( zui::width('176px'), set::name('branch[]'), + set::items($branches), ) ); diff --git a/module/testcase/zen.php b/module/testcase/zen.php index 1986028ab6..3b4fcfaf8e 100644 --- a/module/testcase/zen.php +++ b/module/testcase/zen.php @@ -139,6 +139,61 @@ class testcaseZen extends testcase $this->testcase->buildSearchForm($productID, $searchProducts, $queryID, $actionURL, $projectID); } + /** + * 展示从用例库导入的用例。 + * Assign the cases imported from the library. + * + * @param int $productID + * @param string $branch + * @param int $libID + * @param string $orderBy + * @param int $queryID + * @param array $libraries + * @access protected + * @return void + */ + protected function assignForImportFromLib(int $productID, string $branch, int $libID, string $orderBy, int $queryID, array $libraries): void + { + $product = $this->loadModel('product')->getById($productID); + $branches = array(); + if($product->type != 'normal') + { + $this->loadModel('branch'); + $branches = array(BRANCH_MAIN => $this->lang->branch->main) + $this->branch->getPairs($productID, 'active', $projectID); + } + + $this->loadModel('testsuite'); + foreach($branches as $branchID => $branchName) $canImportModules[$branchID] = $this->testsuite->getCanImportModules($productID, $libID, $branchID, 'items'); + if(empty($branches)) $canImportModules[0] = $this->testsuite->getCanImportModules($productID, $libID, 0, 'items'); + + /* Build the search form. */ + $actionURL = $this->createLink('testcase', 'importFromLib', "productID={$productID}&branch={$branch}&libID={$libID}&orderBy={$orderBy}&browseType=bySearch&queryID=myQueryID"); + + $this->config->testcase->search['module'] = 'testsuite'; + $this->config->testcase->search['onMenuBar'] = 'no'; + $this->config->testcase->search['actionURL'] = $actionURL; + $this->config->testcase->search['queryID'] = $queryID; + + $this->config->testcase->search['fields']['lib'] = $this->lang->testcase->lib; + $this->config->testcase->search['params']['lib'] = array('operator' => '=', 'control' => 'select', 'values' => array('' => '', $libID => $libraries[$libID], 'all' => $this->lang->caselib->all)); + $this->config->testcase->search['params']['module']['values'] = $this->loadModel('tree')->getOptionMenu($libID, 'caselib'); + + if(!$this->config->testcase->needReview) unset($this->config->testcase->search['params']['status']['values']['wait']); + unset($this->config->testcase->search['fields']['product']); + unset($this->config->testcase->search['fields']['branch']); + + $this->loadModel('search')->setSearchParams($this->config->testcase->search); + + $this->view->productID = $productID; + $this->view->branch = $branch; + $this->view->libID = $libID; + $this->view->orderBy = $orderBy; + $this->view->queryID = $queryID; + $this->view->product = $product; + $this->view->branches = $branches; + $this->view->canImportModules = $canImportModules; + } + /** * 展示创建 testcase 的相关变量。 * Show the variables associated with the creation testcase. @@ -1361,6 +1416,85 @@ class testcaseZen extends testcase return $cases; } + /** + * Build data for importing from lib. + * + * @param int $productID + * @param string $branch + * @param int $libID + * @access protected + * @return array + */ + protected function buildDataForImportFromLib(int $productID, string $branch, int $libID): array + { + /* 处理模块。 */ + /* Process modules. */ + $preModule = 0; + $modules = $this->post->module; + foreach($modules as $caseID => $module) + { + if($module != 'ditto') $preModule = $module; + if($module == 'ditto') $modules[$caseID] = $preModule; + } + + /* 处理分支。 */ + /* Process branches. */ + $preBranch = 0; + $caseModules = array(); + $branches = $this->post->branch; + $caseIdList = $this->post->caseIdList; + if(!empty($branches)) + { + foreach($branches as $caseID => $branch) + { + if($branch != 'ditto') $prevBranch = $branch; + if($branch == 'ditto') $branches[$caseID] = $prevBranch; + if(!isset($caseModules[$branch]) && in_array($caseID, $caseIdList) !== false) $caseModules[$branch] = $this->testsuite->getCanImportModules($productID, $libID, $branch); + } + } + else + { + $caseModules[$branch] = $this->loadModel('testsuite')->getCanImportModules($productID, $libID, $branch); + } + + /* 构建用例。 */ + /* Build cases. */ + $imported = ''; + $cases = array(); + $steps = array(); + $files = array(); + $fromCases = $this->testcase->getByList($caseIdList); + $fromSteps = $this->testcase->getRelatedSteps($caseIdList); + $fromFiles = $this->testcase->getRelatedFiles($caseIdList); + foreach($caseIdList as $caseID) + { + if(!isset($fromCases[$caseID])) continue; + + $case = clone $fromCases[$caseID]; + $case->steps = array(); + $case->expects = array(); + $case->stepType = array(); + $case->product = $productID; + $case->fromCaseID = $case->id; + $case->fromCaseVersion = $case->version; + if(isset($modules[$case->id])) $case->module = $modules[$case->id]; + if(isset($branches[$case->id])) $case->branch = $branches[$case->id]; + unset($case->id); + + if(empty($caseModules[$branch][$case->fromCaseID][$case->module])) + { + $imported .= "$case->fromCaseID,"; + } + else + { + $cases[$caseID] = $case; + $steps[$caseID] = zget($fromSteps, $caseID, array()); + $files[$caseID] = zget($fromFiles, $caseID, array()); + } + } + + return array($cases, $steps, $files, $imported); + } /** * 为展示导入用例构建更新的用例。 diff --git a/module/testsuite/model.php b/module/testsuite/model.php index 3af158e9e0..934e36ad52 100644 --- a/module/testsuite/model.php +++ b/module/testsuite/model.php @@ -287,7 +287,7 @@ class testsuiteModel extends model * @access public * @return array */ - public function getCanImportCases(int $productID, int $libID, int $branch, string $orderBy = 'id_desc', object $pager = null, string $browseType = '', int $queryID = 0): array + public function getCanImportCases(int $productID, int $libID, int|string $branch, string $orderBy = 'id_desc', object $pager = null, string $browseType = '', int $queryID = 0): array { $query = ''; if($browseType == 'bysearch') @@ -336,18 +336,19 @@ class testsuiteModel extends model * 获取。 * Get imported case modules. * - * @param int $productID - * @param int $libID - * @param int $branch + * @param int $productID + * @param int $libID + * @param int|string $branch + * @param string $returnType * @access public * @return array */ - public function getCanImportModules(int$productID, int $libID, int $branch): array + public function getCanImportModules(int$productID, int $libID, int|string $branch, string $returnType = 'pairs'): array { $importedModules = $this->dao->select('fromCaseID,module')->from(TABLE_CASE) ->where('product')->eq($productID) ->andWhere('lib')->eq($libID) - ->andWhere('branch')->eq($branch) + ->beginIF($branch != 'all')->andWhere('branch')->eq($branch)->fi() ->andWhere('fromCaseID')->ne('') ->andWhere('deleted')->eq('0') ->fetchGroup('fromCaseID', 'module'); @@ -355,12 +356,28 @@ class testsuiteModel extends model $libCases = $this->loadModel('caselib')->getLibCases($libID, 'all'); $modules = $this->loadModel('tree')->getOptionMenu($productID, 'case', 0, $branch); + if($returnType == 'items') + { + $moduleItems = array(); + foreach($modules as $moduleID => $moduleName) $moduleItems[$moduleID] = array('text' => $moduleName, 'value' => $moduleID); + } $canImportModules = array(); foreach($libCases as $caseID => $case){ $caseModules = !empty($importedModules[$caseID]) ? $importedModules[$caseID] : array(); - $canImportModules[$caseID] = array_diff_key($modules, $caseModules); - if(!empty($canImportModules[$caseID])) $canImportModules[$caseID]['ditto'] = $this->lang->testcase->ditto; + $canImportModules[$caseID] = $returnType == 'pairs' ? array_diff_key($modules, $caseModules) : array_diff_key($moduleItems, $caseModules); + if(!empty($canImportModules[$caseID])) + { + if($returnType == 'pairs') + { + $canImportModules[$caseID]['ditto'] = $this->lang->testcase->ditto; + } + else + { + $canImportModules[$caseID]['ditto'] = array('text' => $this->lang->testcase->ditto, 'value' => 'ditto'); + $canImportModules[$caseID] = array_values($canImportModules[$caseID]); + } + } if(empty($canImportModules[$caseID])) unset($canImportModules[$caseID]); }