diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestCaseMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestCaseMapper.xml
index 3716d7959d..77590bee2f 100644
--- a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestCaseMapper.xml
+++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtTestCaseMapper.xml
@@ -524,6 +524,9 @@
and (test_case.status is null or test_case.status != #{request.notEqStatus})
+
+ and test_case.case_public = true
+
and (test_case.name like CONCAT('%', #{request.name},'%')
or test_case.num like CONCAT('%', #{request.name},'%')
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 05fb14487b..93661cc432 100644
--- a/backend/src/main/java/io/metersphere/track/controller/TestCaseController.java
+++ b/backend/src/main/java/io/metersphere/track/controller/TestCaseController.java
@@ -28,6 +28,7 @@ import io.metersphere.notice.annotation.SendNotice;
import io.metersphere.service.CheckPermissionService;
import io.metersphere.service.FileService;
import io.metersphere.track.dto.TestCaseDTO;
+import io.metersphere.track.dto.TestCaseNodeDTO;
import io.metersphere.track.request.testcase.*;
import io.metersphere.track.request.testplan.FileOperationRequest;
import io.metersphere.track.request.testplan.LoadCaseRequest;
@@ -73,6 +74,12 @@ public class TestCaseController {
return PageUtils.setPageInfo(page, testCaseService.publicListTestCase(request));
}
+
+ @PostMapping("/public/case/node")
+ public List getPublicCaseNode(@RequestBody QueryTestCaseRequest request) {
+ return testCaseService.getPublicCaseNode(request);
+ }
+
@GetMapping("/list/{projectId}")
@RequiresPermissions("PROJECT_TRACK_CASE:READ")
public List list(@PathVariable String projectId) {
diff --git a/backend/src/main/java/io/metersphere/track/service/TestCaseNodeService.java b/backend/src/main/java/io/metersphere/track/service/TestCaseNodeService.java
index feebe870e1..a5c34990fd 100644
--- a/backend/src/main/java/io/metersphere/track/service/TestCaseNodeService.java
+++ b/backend/src/main/java/io/metersphere/track/service/TestCaseNodeService.java
@@ -143,10 +143,14 @@ public class TestCaseNodeService extends NodeTreeService {
}
}
public List getNodeTreeByProjectId(String projectId) {
+ QueryTestCaseRequest request = new QueryTestCaseRequest();
+ return getNodeTreeByProjectId(projectId, request);
+ }
+
+ public List getNodeTreeByProjectId(String projectId, QueryTestCaseRequest request) {
// 判断当前项目下是否有默认模块,没有添加默认模块
this.getDefaultNode(projectId);
List testCaseNodes = extTestCaseNodeMapper.getNodeTreeByProjectId(projectId);
- QueryTestCaseRequest request = new QueryTestCaseRequest();
request.setUserId(SessionUtils.getUserId());
request.setProjectId(projectId);
@@ -305,6 +309,25 @@ public class TestCaseNodeService extends NodeTreeService {
return getNodeTreeWithPruningTree(projectNodeMap);
}
+ public List getNodeByTestCases(List testCaseDTOS) {
+ Map> projectNodeMap = new HashMap<>();
+ for (TestCase testCase : testCaseDTOS) {
+ List nodeIds = Optional.ofNullable(projectNodeMap.get(testCase.getProjectId())).orElse(new ArrayList<>());
+ nodeIds.add(testCase.getNodeId());
+ projectNodeMap.put(testCase.getProjectId(), nodeIds);
+ }
+ List tree = getNodeTreeWithPruningTree(projectNodeMap);
+ QueryTestCaseRequest request = new QueryTestCaseRequest();
+ request.setCasePublic(true);
+ for (TestCaseNodeDTO dto : tree) {
+ List children = this.getNodeTreeByProjectId(dto.getId(), request);
+ dto.setChildren(children);
+ int sum = children.stream().mapToInt(TestCaseNodeDTO::getCaseNum).sum();
+ dto.setCaseNum(sum);
+ }
+ return tree;
+ }
+
public List getNodeByReviewId(String reviewId) {
List testCases = extTestCaseReviewTestCaseMapper.getTestCaseWithNodeInfo(reviewId);
Map> projectNodeMap = getProjectNodeMap(testCases);
diff --git a/backend/src/main/java/io/metersphere/track/service/TestCaseService.java b/backend/src/main/java/io/metersphere/track/service/TestCaseService.java
index 0a9853e314..994804d58d 100644
--- a/backend/src/main/java/io/metersphere/track/service/TestCaseService.java
+++ b/backend/src/main/java/io/metersphere/track/service/TestCaseService.java
@@ -45,6 +45,7 @@ import io.metersphere.performance.service.PerformanceTestService;
import io.metersphere.service.*;
import io.metersphere.track.dto.TestCaseCommentDTO;
import io.metersphere.track.dto.TestCaseDTO;
+import io.metersphere.track.dto.TestCaseNodeDTO;
import io.metersphere.track.issue.AbstractIssuePlatform;
import io.metersphere.track.issue.IssueFactory;
import io.metersphere.track.issue.service.XpackIssueService;
@@ -2673,4 +2674,9 @@ public class TestCaseService {
}
return false;
}
+
+ public List getPublicCaseNode(QueryTestCaseRequest request) {
+ List testCaseDTOS = publicListTestCase(request);
+ return testCaseNodeService.getNodeByTestCases(testCaseDTOS);
+ }
}
diff --git a/frontend/src/business/components/track/case/TestCase.vue b/frontend/src/business/components/track/case/TestCase.vue
index b241b964e7..6f80932f9a 100644
--- a/frontend/src/business/components/track/case/TestCase.vue
+++ b/frontend/src/business/components/track/case/TestCase.vue
@@ -21,6 +21,15 @@
/>
+
+
+
+
@@ -66,6 +75,7 @@
@getPublicList="getPublicList"
@refresh="refresh"
@refreshAll="refreshAll"
+ @refreshPublic="refreshPublic"
@setCondition="setCondition"
ref="testCasePublicList">
@@ -253,6 +263,8 @@ export default {
currentTrashVersion: null,
versionEnable: false,
isAsideHidden: true,
+ showPublicNode: false,
+ publicTreeNodes: []
};
},
mounted() {
@@ -286,6 +298,7 @@ export default {
},
activeName(newVal, oldVal) {
this.isAsideHidden = this.activeName === 'default';
+ this.showPublicNode = this.activeName === 'public';
if (oldVal !== 'default' && newVal === 'default' && this.$refs.minder) {
this.$refs.minder.refresh();
}
@@ -307,6 +320,9 @@ export default {
publicEnable() {
if (this.publicEnable) {
this.activeName = 'public';
+ this.result = this.$post('/test/case/public/case/node', {workspaceId: getCurrentWorkspaceId()}, res => {
+ this.publicTreeNodes = res.data;
+ })
} else {
this.activeName = 'default';
}
@@ -561,6 +577,13 @@ export default {
this.publicEnable = false;
this.activeName = "default";
},
+ publicNodeChange(node, nodeIds, pNodes) {
+ this.activeName = 'public';
+ this.publicEnable = true;
+ if (this.$refs.testCasePublicList) {
+ this.$refs.testCasePublicList.initTableData(nodeIds);
+ }
+ },
increase(id) {
this.$refs.nodeTree.increase(id);
},
@@ -658,6 +681,14 @@ export default {
this.$refs.nodeTree.list();
this.setTable(data);
},
+ refreshPublic() {
+ if (this.$refs.testCasePublicList) {
+ this.$refs.testCasePublicList.initTableData([]);
+ }
+ this.result = this.$post('/test/case/public/case/node', {workspaceId: getCurrentWorkspaceId()}, res => {
+ this.publicTreeNodes = res.data;
+ })
+ },
setTreeNodes(data) {
this.treeNodes = data;
},
diff --git a/frontend/src/business/components/track/case/components/TestCaseList.vue b/frontend/src/business/components/track/case/components/TestCaseList.vue
index c0cb17dd43..575c44ceb7 100644
--- a/frontend/src/business/components/track/case/components/TestCaseList.vue
+++ b/frontend/src/business/components/track/case/components/TestCaseList.vue
@@ -708,7 +708,7 @@ export default {
let dataType = this.$route.params.dataType;
this.selectDataRange = dataType === 'case' ? dataRange : 'all';
},
- initTableData() {
+ initTableData(nodeIds) {
this.condition.planId = "";
this.condition.nodeIds = [];
initCondition(this.condition, this.condition.selectAll);
@@ -728,6 +728,11 @@ export default {
}
}
}
+
+ if (nodeIds && nodeIds.length > 0) {
+ this.condition.nodeIds = nodeIds;
+ this.condition.workspaceId = getCurrentWorkspaceId();
+ }
this.getData();
},
open() {
@@ -1101,7 +1106,7 @@ export default {
let param = buildBatchParam(this, this.$refs.table.selectIds);
this.$post('/test/case/batch/movePublic/deleteToGc', param, () => {
this.$refs.table.clear();
- this.$emit("refresh");
+ this.$emit("refreshPublic");
this.$success(this.$t('commons.delete_success'));
});
}
@@ -1123,7 +1128,7 @@ export default {
this.$get('/test/case/deletePublic/' + testCase.versionId + '/' + testCase.refId, () => {
this.$success(this.$t('commons.delete_success'));
this.$refs.apiDeleteConfirm.close();
- this.$emit("refreshAll");
+ this.$emit("refreshPublic");
});
} else {
this.$get('/test/case/delete/' + testCase.versionId + '/' + testCase.refId, () => {
@@ -1137,12 +1142,11 @@ export default {
else {
if (this.publicEnable) {
let param = buildBatchParam(this, this.$refs.table.selectIds);
+ param.ids.push(testCase.id);
this.$post('/test/case/batch/movePublic/deleteToGc', param, () => {
this.$success(this.$t('commons.delete_success'));
- // this.initTable();
this.$refs.apiDeleteConfirm.close();
- this.$emit("refreshAll");
-
+ this.$emit("refreshPublic");
});
} else {
this._handleDeleteToGc(testCase);