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]);
}