diff --git a/backend/src/main/java/io/metersphere/track/controller/TestCaseController.java b/backend/src/main/java/io/metersphere/track/controller/TestCaseController.java index 304733c69e..b359daf3af 100644 --- a/backend/src/main/java/io/metersphere/track/controller/TestCaseController.java +++ b/backend/src/main/java/io/metersphere/track/controller/TestCaseController.java @@ -120,8 +120,8 @@ public class TestCaseController { @PostMapping(value = "/add", consumes = {"multipart/form-data"}) @RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR) - public void addTestCase(@RequestPart("request") EditTestCaseRequest request, @RequestPart(value = "file") List files) { - testCaseService.save(request, files); + public String addTestCase(@RequestPart("request") EditTestCaseRequest request, @RequestPart(value = "file") List files) { + return testCaseService.save(request, files); } @PostMapping(value = "/edit", consumes = {"multipart/form-data"}) diff --git a/frontend/src/business/components/track/case/TestCase.vue b/frontend/src/business/components/track/case/TestCase.vue index 6e9658aea6..725d332c4d 100644 --- a/frontend/src/business/components/track/case/TestCase.vue +++ b/frontend/src/business/components/track/case/TestCase.vue @@ -8,6 +8,7 @@ @setTreeNodes="setTreeNodes" @exportTestCase="exportTestCase" @saveAsEdit="editTestCase" + @createCase="handleCaseCreateOrEdit($event, 'add')" @refreshAll="refreshAll" :type="'edit'" ref="nodeTree" @@ -44,7 +45,7 @@ :tree-nodes="treeNodes" :project-id="projectId" v-if="activeDom === 'right'" - ref="testCaseList"/> + ref="minder"/> { + this.result = this.$request(option, (response) => { this.$success(this.$t('commons.save_success')); if (this.operationType == 'add' && this.isCreateContinue) { this.form.name = ''; @@ -678,6 +678,13 @@ export default { } this.dialogFormVisible = false; this.$emit("refresh"); + if (this.type === 'add' || this.type === 'copy') { + param.id = response.data; + this.$emit("caseCreate", param); + this.close(); + } else { + this.$emit("caseEdit", param); + } }); } } else { diff --git a/frontend/src/business/components/track/common/TestCaseNodeTree.vue b/frontend/src/business/components/track/common/TestCaseNodeTree.vue index b66e83caba..5b09ba8094 100644 --- a/frontend/src/business/components/track/common/TestCaseNodeTree.vue +++ b/frontend/src/business/components/track/common/TestCaseNodeTree.vue @@ -35,6 +35,7 @@ @@ -98,6 +99,9 @@ export default { saveAsEdit(data) { this.$emit('saveAsEdit', data); }, + createCase(data) { + this.$emit('createCase', data); + }, refresh() { this.$emit("refreshTable"); }, diff --git a/frontend/src/business/components/track/common/minder/TestCaseMinder.vue b/frontend/src/business/components/track/common/minder/TestCaseMinder.vue index 90a5e80e7f..38d6ad35a9 100644 --- a/frontend/src/business/components/track/common/minder/TestCaseMinder.vue +++ b/frontend/src/business/components/track/common/minder/TestCaseMinder.vue @@ -11,7 +11,12 @@ diff --git a/frontend/src/business/components/track/common/minder/minderUtils.js b/frontend/src/business/components/track/common/minder/minderUtils.js index e8147ba655..308d3cc6c0 100644 --- a/frontend/src/business/components/track/common/minder/minderUtils.js +++ b/frontend/src/business/components/track/common/minder/minderUtils.js @@ -1,44 +1,55 @@ +import {getUUID} from "@/common/js/utils"; + export function getTestCaseDataMap(testCase, isDisable, setParamCallback) { let dataMap = new Map(); if (testCase) { testCase.forEach(item => { - item.steps = JSON.parse(item.steps); - // if (item.tags && item.tags.length > 0) { - // item.tags = JSON.parse(item.tags); - // } - let mapItem = dataMap.get(item.nodeId); - let nodeItem = { - data: { - id: item.id, - text: item.name, - priority: Number.parseInt(item.priority.substring(item.priority.length - 1 )) + 1, - resource: ["用例"], - type: item.type, - method: item.method, - maintainer: item.maintainer - } - } - if (setParamCallback) { - setParamCallback(nodeItem.data, item); - } - if (isDisable) { - nodeItem.data.disable = true; - // 用例节点可以打标签 - nodeItem.data.allowDisabledTag = true; - } - parseChildren(nodeItem, item, isDisable); - if (mapItem) { - mapItem.push(nodeItem); - } else { - mapItem = []; - mapItem.push(nodeItem); - dataMap.set(item.nodeId, mapItem); - } + parseCase(item, dataMap, isDisable, setParamCallback); }) } return dataMap; } +export function parseCase(item, dataMap, isDisable, setParamCallback) { + if (item.steps) { + item.steps = JSON.parse(item.steps); + } else { + item.steps = []; + } + // if (item.tags && item.tags.length > 0) { + // item.tags = JSON.parse(item.tags); + // } + let mapItem = dataMap.get(item.nodeId); + let nodeItem = { + data: { + id: item.id, + text: item.name, + priority: Number.parseInt(item.priority.substring(item.priority.length - 1 )) + 1, + resource: ["用例"], + type: item.type, + method: item.method, + maintainer: item.maintainer + } + } + if (setParamCallback) { + setParamCallback(nodeItem.data, item); + } + if (isDisable) { + nodeItem.data.disable = true; + // 用例节点可以打标签 + nodeItem.data.allowDisabledTag = true; + } + parseChildren(nodeItem, item, isDisable); + if (mapItem) { + mapItem.push(nodeItem); + } else { + mapItem = []; + mapItem.push(nodeItem); + dataMap.set(item.nodeId, mapItem); + } + return nodeItem; +} + function parseChildren(nodeItem, item, isDisable) { nodeItem.children = []; let children = []; @@ -63,7 +74,8 @@ function _parseChildren(children, k, v, isDisable) { data: { text: k, resource: v ? [v] : [] - } + }, + children: [] } if (isDisable) { node.data.disable = true; @@ -72,3 +84,69 @@ function _parseChildren(children, k, v, isDisable) { return node; } } + +export function appendChild(pId, appendNode) { + if (!pId) { + pId = 'root'; + } + let minder = window.minder; + let nodes = minder.getAllNode(); + let parent = undefined; + for (let index = nodes.length -1; index >= 0; index--) { + let item = nodes[index]; + if(item.data.id === pId) { + parent = item; + break; + } + } + if (!parent) { + return; + } + let node = minder.createNode("", parent); + minder.select(node, true); + node.data = appendNode.data; + if (parent.isExpanded()) { + node.render(); + } else { + parent.expand(); + parent.renderTree(); + } + minder.layout(600); + + // 添加子节点 + let children = appendNode.children; + if (children) { + children.forEach(child => { + child.data.id = getUUID(); + appendChild(node.data.id, child); + }) + } +} + +export function editNode(node) { + let minder = window.minder; + let nodes = minder.getAllNode(); + let children = []; + let item = undefined; + for (const index in nodes) { + item = nodes[index]; + if(item.data.id === node.data.id) { + item.data = node.data; + children = node.children; + if (item.children) { + item.children.forEach(n => { + minder.removeNode(n); + }) + } + item.render(); + break; + } + } + minder.layout(600); + if (item) { + children.forEach(child => { + child.data.id = getUUID(); + appendChild(item.data.id, child); + }) + } +}