diff --git a/module/testcase/config/table.php b/module/testcase/config/table.php index 86b8f1bc05..073f16df53 100644 --- a/module/testcase/config/table.php +++ b/module/testcase/config/table.php @@ -180,6 +180,41 @@ $config->testcase->zerocase->dtable->fieldList['actions']['menu'] = array('c $config->testcase->zerocase->dtable->fieldList['actions']['required'] = true; $config->testcase->zerocase->dtable->fieldList['actions']['group'] = '7'; +$config->testcase->importfromlib = new stdclass(); +$config->testcase->importfromlib->dtable = new stdclass(); +$config->testcase->importfromlib->dtable->fieldList['id']['name'] = 'id'; +$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'] = 'category'; + +$config->testcase->importfromlib->dtable->fieldList['pri']['name'] = 'pri'; +$config->testcase->importfromlib->dtable->fieldList['pri']['title'] = $lang->testcase->pri; +$config->testcase->importfromlib->dtable->fieldList['pri']['type'] = 'pri'; + +$config->testcase->importfromlib->dtable->fieldList['title']['name'] = 'title'; +$config->testcase->importfromlib->dtable->fieldList['title']['title'] = $lang->testcase->title; +$config->testcase->importfromlib->dtable->fieldList['title']['type'] = 'title'; +$config->testcase->importfromlib->dtable->fieldList['title']['fixed'] = false; +$config->testcase->importfromlib->dtable->fieldList['title']['link'] = array('module' => 'testcase', 'method' => 'view', 'params' => "caseID={id}"); +$config->testcase->importfromlib->dtable->fieldList['title']['data-toggle'] = 'modal'; + +$config->testcase->importfromlib->dtable->fieldList['fromModule']['name'] = 'fromModule'; +$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['type']['name'] = 'type'; +$config->testcase->importfromlib->dtable->fieldList['type']['title'] = $lang->testcase->type; +$config->testcase->importfromlib->dtable->fieldList['type']['type'] = 'status'; +$config->testcase->importfromlib->dtable->fieldList['type']['statusMap'] = $lang->testcase->typeList; + $config->scene->dtable = new stdclass(); $config->scene->dtable->fieldList['id']['title'] = $lang->idAB; $config->scene->dtable->fieldList['id']['type'] = 'checkID'; diff --git a/module/testcase/control.php b/module/testcase/control.php index ce9fe288ae..279c374024 100644 --- a/module/testcase/control.php +++ b/module/testcase/control.php @@ -2058,17 +2058,23 @@ class testcase extends control if($product->type != 'normal') $branches = array(BRANCH_MAIN => $this->lang->branch->main) + $this->branch->getPairs($productID, 'active', $projectID); $libraries = $this->loadModel('caselib')->getLibraries(); - if(empty($libraries)) - { - echo js::alert($this->lang->testcase->noLibrary); - return print(js::locate($this->session->caseList)); - } + if(empty($libraries)) return $this->send(array('result' => 'fail', 'message' => $this->lang->testcase->noLibrary, 'load' => $this->session->caseList)); + if(empty($libID) or !isset($libraries[$libID])) $libID = key($libraries); if($_POST) { - $this->testcase->importFromLib($productID, $libID, $branch); - return print(js::reload('parent')); + $result = $this->testcase->importFromLib($productID, $libID, $branch); + + if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError())); + + if(!empty($result) && is_string($result)) + { + $imported = trim($result, ','); + return $this->send(array('result' => 'fail', 'message' => sprintf($this->lang->testcase->importedCases, $imported))); + } + + return $this->send(array('result' => 'success', 'message' => $this->lang->importSuccess, 'load' => true)); } $this->app->tab == 'project' ? $this->loadModel('project')->setMenu($this->session->project) : $this->testcase->setMenu($this->products, $productID, $branch); diff --git a/module/testcase/js/importfromlib.ui.js b/module/testcase/js/importfromlib.ui.js new file mode 100644 index 0000000000..f707b82aeb --- /dev/null +++ b/module/testcase/js/importfromlib.ui.js @@ -0,0 +1,42 @@ +window.renderModuleItem = function(result, info) +{ + if(info.col.name == 'module' && info.col.type == 'html') + { + 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()}; + } + + return result; +} + +function reload() +{ + const libID = $(this).val(); + const link = $.createLink('testcase','importFromLib','productID=' + productID + '&branch=' + branch + '&libID=' + libID); + + location.href = link; +} + +$(document).off('click', '.import-btn').on('click', '.import-btn', function() +{ + const dtable = zui.DTable.query($(this).target); + const checkedList = dtable.$.getChecks(); + if(!checkedList.length) return false; + + const url = $('#importFromLibForm').attr('action'); + const formData = new FormData($("#importFromLibForm")[0]); + checkedList.forEach((id) => formData.append(`caseIdList[${id}]`, id)); + + $.ajaxSubmit({url: url, data: formData}); + + return false; +}); diff --git a/module/testcase/model.php b/module/testcase/model.php index 8e5dd41e87..ed8da84c74 100644 --- a/module/testcase/model.php +++ b/module/testcase/model.php @@ -1830,11 +1830,10 @@ class testcaseModel extends model $this->loadModel('action')->create('case', $caseID, 'fromlib', '', $case->lib); } } - if(!empty($imported)) - { - $imported = trim($imported, ','); - return print(js::error(sprintf($this->lang->testcase->importedCases, $imported))); - } + + if(!empty($imported)) return $imported; + + return !dao::isError(); } /** diff --git a/module/testcase/ui/importfromlib.html.php b/module/testcase/ui/importfromlib.html.php new file mode 100644 index 0000000000..2028e764ff --- /dev/null +++ b/module/testcase/ui/importfromlib.html.php @@ -0,0 +1,101 @@ + + * @package testcase + * @link https://www.zentao.net + */ +namespace zin; + +jsVar('app', $app->tab); +jsVar('productID', $productID); +jsVar('branch', $branch); + +featureBar +( + to::before + ( + backBtn + ( + $lang->goback, + set::icon('back'), + set::url($this->session->caseList), + set::class('secondary') + ), + select + ( + zui::width('200px'), + set::name('fromlib'), + set::items($libraries), + set::value($libID), + set::placeholder($lang->testcase->placeholder->selectLib), + on::change('reload') + ) + ), +); + +div +( + setid('searchFormPanel'), + searchToggle + ( + set::open(true), + set::module('testsuite') + ) +); + +$config->testcase->importfromlib->dtable->fieldList['fromModule']['map'] = $libModules; +if($product->type == 'normal') unset($config->testcase->importfromlib->dtable->fieldList['branch']); + +foreach($cases as $case) +{ + $case->fromModule = $case->module; + + $caseBranches = $branches; + $caseBranch = ($branch == 'all' || empty($branch)) ? 0 : $branch; + foreach($caseBranches as $branchID => $branchName) + { + if(empty($canImportModules[$branchID][$case->id])) + { + unset($caseBranches[$branchID]); + + if($caseBranch == $branchID) $caseBranch = key($caseBranches); + } + } + + $case->moduleItems = $canImportModules[$caseBranch][$case->id]; +} + +$footToolbar = array('items' => array(array('text' => $lang->testcase->import, 'btnType' => 'secondary', 'className' => 'import-btn'))); + +formBase +( + setID('importFromLibForm'), + set::action(createLink('testcase', 'importFromLib', "product={$productID}&branch={$branch}&libID={$libID}")), + set::actions(array()), + + dtable + ( + set::cols($config->testcase->importfromlib->dtable->fieldList), + set::data($cases), + set::onRenderCell(jsRaw('window.renderModuleItem')), + set::checkable(true), + set::footToolbar($footToolbar), + set::footPager(usePager()), + ) +); + +div +( + setID('moduleSelect'), + setClass('hidden'), + select + ( + set::name('module[]'), + ) +); + +render();