Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
MeterSphere
metersphere
提交
62252a87
M
metersphere
项目概览
MeterSphere
/
metersphere
上一次同步 3 年多
通知
25
Star
1
Fork
1
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
M
metersphere
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
62252a87
编写于
12月 14, 2020
作者:
C
chenjianxing
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
refacotr: 重构测试跟踪模块树
上级
f6d4f625
变更
15
隐藏空白更改
内联
并排
Showing
15 changed file
with
361 addition
and
280 deletion
+361
-280
frontend/src/business/components/track/case/TestCase.vue
frontend/src/business/components/track/case/TestCase.vue
+7
-99
frontend/src/business/components/track/case/components/TestCaseEdit.vue
...usiness/components/track/case/components/TestCaseEdit.vue
+7
-11
frontend/src/business/components/track/case/components/TestCaseImport.vue
...iness/components/track/case/components/TestCaseImport.vue
+3
-7
frontend/src/business/components/track/case/components/TestCaseList.vue
...usiness/components/track/case/components/TestCaseList.vue
+9
-15
frontend/src/business/components/track/common/NodeBreadcrumb.vue
...d/src/business/components/track/common/NodeBreadcrumb.vue
+6
-0
frontend/src/business/components/track/common/NodeTree.vue
frontend/src/business/components/track/common/NodeTree.vue
+184
-130
frontend/src/business/components/track/common/TestCaseNodeTree.vue
...src/business/components/track/common/TestCaseNodeTree.vue
+97
-0
frontend/src/business/components/track/plan/view/comonents/functional/TestCaseFunctionalRelevance.vue
...view/comonents/functional/TestCaseFunctionalRelevance.vue
+2
-2
frontend/src/business/components/track/plan/view/comonents/functional/TestPlanFunctional.vue
...ack/plan/view/comonents/functional/TestPlanFunctional.vue
+1
-3
frontend/src/business/components/track/plan/view/comonents/head/TestPlanHeaderBar.vue
...ents/track/plan/view/comonents/head/TestPlanHeaderBar.vue
+6
-1
frontend/src/business/components/track/review/view/TestCaseReviewView.vue
...iness/components/track/review/view/TestCaseReviewView.vue
+2
-3
frontend/src/business/components/track/review/view/components/TestReviewRelevance.vue
...ents/track/review/view/components/TestReviewRelevance.vue
+22
-6
frontend/src/i18n/en-US.js
frontend/src/i18n/en-US.js
+5
-1
frontend/src/i18n/zh-CN.js
frontend/src/i18n/zh-CN.js
+5
-1
frontend/src/i18n/zh-TW.js
frontend/src/i18n/zh-TW.js
+5
-1
未找到文件。
frontend/src/business/components/track/case/TestCase.vue
浏览文件 @
62252a87
...
...
@@ -2,23 +2,15 @@
<ms-container>
<ms-aside-container>
<node-tree
class=
"node-tree"
v-loading=
"result.loading"
<test-case-node-tree
@
nodeSelectEvent=
"nodeChange"
@
refresh=
"refresh"
:tree-nodes=
"treeNodes"
@
refreshTable=
"refresh"
:type=
"'edit'"
:draggable=
"nodeTreeDraggable"
:select-node.sync=
"selectNode"
@
refreshTable=
"refreshTable"
:current-project=
"
{id:currentProject}"
ref=
"nodeTree"
/>
</ms-aside-container>
<ms-main-container>
<test-case-list
:current-project=
"
{id:currentProject}"
:select-node-ids=
"selectNodeIds"
:select-parent-nodes=
"selectParentNodes"
@
testCaseEdit=
"editTestCase"
...
...
@@ -36,7 +28,6 @@
:read-only=
"testCaseReadOnly"
:tree-nodes=
"treeNodes"
:select-node=
"selectNode"
:current-project=
"
{id:currentProject}"
ref=
"testCaseEditDialog"
>
</test-case-edit>
...
...
@@ -52,7 +43,6 @@
import
NodeTree
from
'
../common/NodeTree
'
;
import
TestCaseEdit
from
'
./components/TestCaseEdit
'
;
import
{
PROJECT_ID
,
ROLE_TEST_MANAGER
,
ROLE_TEST_USER
}
from
'
../../../../common/js/constants
'
;
import
TestCaseList
from
"
./components/TestCaseList
"
;
import
SelectMenu
from
"
../common/SelectMenu
"
;
import
TestCaseMove
from
"
./components/TestCaseMove
"
;
...
...
@@ -61,10 +51,12 @@ import MsAsideContainer from "../../common/components/MsAsideContainer";
import
MsMainContainer
from
"
../../common/components/MsMainContainer
"
;
import
{
checkoutTestManagerOrTestUser
,
hasRoles
}
from
"
../../../../common/js/utils
"
;
import
BatchMove
from
"
./components/BatchMove
"
;
import
TestCaseNodeTree
from
"
../common/TestCaseNodeTree
"
;
export
default
{
name
:
"
TestCase
"
,
components
:
{
TestCaseNodeTree
,
MsMainContainer
,
MsAsideContainer
,
MsContainer
,
TestCaseMove
,
TestCaseList
,
NodeTree
,
TestCaseEdit
,
SelectMenu
,
BatchMove
},
...
...
@@ -76,35 +68,25 @@ export default {
pageSize
:
5
,
total
:
0
,
projects
:
[],
currentProject
:
null
,
treeNodes
:
[],
selectNodeIds
:
[],
selectParentNodes
:
[],
testCaseReadOnly
:
true
,
selectNode
:
{},
nodeTreeDraggable
:
true
,
}
},
activated
()
{
this
.
currentProject
=
localStorage
.
getItem
(
PROJECT_ID
);
},
mounted
()
{
this
.
init
(
this
.
$route
);
},
watch
:
{
'
$route
'
(
to
,
from
)
{
// console.log(this.$route.params.projectId)
this
.
init
(
to
);
},
currentProject
()
{
this
.
refresh
();
}
},
methods
:
{
init
(
route
)
{
let
path
=
route
.
path
;
if
(
path
.
indexOf
(
"
/track/case/edit
"
)
>=
0
||
path
.
indexOf
(
"
/track/case/create
"
)
>=
0
)
{
// this.getProjects();
this
.
testCaseReadOnly
=
false
;
if
(
!
checkoutTestManagerOrTestUser
())
{
this
.
testCaseReadOnly
=
true
;
...
...
@@ -113,50 +95,10 @@ export default {
this
.
openRecentTestCaseEditDialog
(
caseId
);
this
.
$router
.
push
(
'
/track/case/all
'
);
}
// else if (route.params.projectId) {
// this.getProjects();
// this.getProjectById(route.params.projectId);
// }
},
// getProjects() {
// this.$get("/project/listAll", (response) => {
// this.projects = response.data;
// let lastProject = JSON.parse(localStorage.getItem(CURRENT_PROJECT));
// if (lastProject) {
// let hasCurrentProject = false;
// for (let i = 0; i
<
this
.
projects
.
length
;
i
++
)
{
// if (this.projects[i].id == lastProject.id) {
// this.currentProject = lastProject;
// hasCurrentProject = true;
// break;
// }
// }
// if (!hasCurrentProject) {
// this.setCurrentProject(this.projects[0]);
// }
// } else {
// if (this.projects.length > 0) {
// this.setCurrentProject(this.projects[0]);
// }
// }
// // this.checkProject();
// });
// },
// checkProject() {
// if (this.currentProject === null) {
// this.$alert(this.$t('test_track.case.no_project'), {
// confirmButtonText: this.$t('project.create'),
// callback: action => {
// this.$router.push("/track/project/create");
// }
// });
// }
// },
// changeProject(project) {
// this.setCurrentProject(project);
// },
nodeChange
(
nodeIds
,
pNodes
)
{
nodeChange
(
node
,
nodeIds
,
pNodes
)
{
this
.
selectNodeIds
=
nodeIds
;
this
.
selectNode
=
node
;
this
.
selectParentNodes
=
pNodes
;
},
refreshTable
()
{
...
...
@@ -182,17 +124,11 @@ export default {
this
.
testCaseReadOnly
=
true
;
this
.
$refs
.
testCaseEditDialog
.
open
(
testCase
);
},
// getProjectByCaseId(caseId) {
// return this.$get('/test/case/project/' + caseId, async response => {
// this.setCurrentProject(response.data);
// });
// },
refresh
()
{
this
.
selectNodeIds
=
[];
this
.
selectParentNodes
=
[];
this
.
selectNode
=
{};
this
.
refreshTable
();
this
.
getNodeTree
();
},
openRecentTestCaseEditDialog
(
caseId
)
{
if
(
caseId
)
{
...
...
@@ -206,35 +142,7 @@ export default {
this
.
$refs
.
testCaseEditDialog
.
open
();
}
},
// getProjectById(id) {
// if (id && id != 'all') {
// this.$get('/project/get/' + id, response => {
// let project = response.data;
// this.setCurrentProject(project);
// // this.$router.push('/track/case/all');
// });
// }
// if (id === 'all') {
// this.refresh();
// }
// },
// setCurrentProject(project) {
// if (project) {
// this.currentProject = project;
// localStorage.setItem(CURRENT_PROJECT, JSON.stringify(project));
// }
// this.refresh();
// },
getNodeTree
()
{
if
(
!
hasRoles
(
ROLE_TEST_USER
,
ROLE_TEST_MANAGER
))
{
this
.
nodeTreeDraggable
=
false
;
}
if
(
this
.
currentProject
)
{
this
.
result
=
this
.
$get
(
"
/case/node/list/
"
+
this
.
currentProject
,
response
=>
{
this
.
treeNodes
=
response
.
data
;
});
}
},
moveToNode
(
selectIds
)
{
if
(
selectIds
.
size
<
1
)
{
this
.
$warning
(
this
.
$t
(
'
test_track.plan_view.select_manipulate
'
));
...
...
frontend/src/business/components/track/case/components/TestCaseEdit.vue
浏览文件 @
62252a87
...
...
@@ -262,6 +262,7 @@ import {listenGoBack, removeGoBackListener} from "@/common/js/utils";
import
{
LIST_CHANGE
,
TrackEvent
}
from
"
@/business/components/common/head/ListEvent
"
;
import
{
Message
}
from
"
element-ui
"
;
import
TestCaseAttachment
from
"
@/business/components/track/case/components/TestCaseAttachment
"
;
import
{
getCurrentProjectID
}
from
"
../../../../../common/js/utils
"
;
export
default
{
name
:
"
TestCaseEdit
"
,
...
...
@@ -269,6 +270,7 @@ export default {
data
()
{
return
{
result
:
{},
projectId
:
""
,
dialogFormVisible
:
false
,
form
:
{
name
:
''
,
...
...
@@ -329,9 +331,6 @@ export default {
selectNode
:
{
type
:
Object
},
currentProject
:
{
type
:
Object
}
},
mounted
()
{
this
.
getSelectOptions
();
...
...
@@ -340,9 +339,6 @@ export default {
treeNodes
()
{
this
.
getModuleOptions
();
},
currentProject
()
{
this
.
getTestOptions
();
}
},
methods
:
{
reload
()
{
...
...
@@ -351,7 +347,7 @@ export default {
},
open
(
testCase
)
{
this
.
resetForm
();
this
.
projectId
=
getCurrentProjectID
();
if
(
window
.
history
&&
window
.
history
.
pushState
)
{
history
.
pushState
(
null
,
null
,
document
.
URL
);
window
.
addEventListener
(
'
popstate
'
,
this
.
close
);
...
...
@@ -489,8 +485,8 @@ export default {
param
.
nodePath
=
item
.
path
;
}
});
if
(
this
.
currentProject
.
i
d
)
{
param
.
projectId
=
this
.
currentProject
.
i
d
;
if
(
this
.
projectI
d
)
{
param
.
projectId
=
this
.
projectI
d
;
}
param
.
name
=
param
.
name
.
trim
();
if
(
param
.
method
!=
'
auto
'
)
{
...
...
@@ -563,8 +559,8 @@ export default {
},
getTestOptions
()
{
this
.
testOptions
=
[];
if
(
this
.
currentProject
.
i
d
&&
this
.
form
.
type
!=
''
&&
this
.
form
.
type
!=
'
functional
'
)
{
this
.
result
=
this
.
$get
(
'
/
'
+
this
.
form
.
type
+
'
/list/
'
+
this
.
currentProject
.
i
d
,
response
=>
{
if
(
this
.
projectI
d
&&
this
.
form
.
type
!=
''
&&
this
.
form
.
type
!=
'
functional
'
)
{
this
.
result
=
this
.
$get
(
'
/
'
+
this
.
form
.
type
+
'
/list/
'
+
this
.
projectI
d
,
response
=>
{
this
.
testOptions
=
response
.
data
;
this
.
testOptions
.
unshift
({
id
:
'
other
'
,
name
:
this
.
$t
(
'
test_track.case.other
'
)})
});
...
...
frontend/src/business/components/track/case/components/TestCaseImport.vue
浏览文件 @
62252a87
...
...
@@ -111,8 +111,8 @@
<
script
>
import
ElUploadList
from
"
element-ui/packages/upload/src/upload-list
"
;
import
MsTableButton
from
'
../../../../components/common/components/MsTableButton
'
;
import
{
listenGoBack
,
removeGoBackListener
}
from
"
../../../../../common/js/utils
"
;
import
{
TokenKey
,
WORKSPACE_ID
}
from
'
../../../../../common/js/constants
'
;
import
{
getCurrentProjectID
,
listenGoBack
,
removeGoBackListener
}
from
"
../../../../../common/js/utils
"
;
import
{
TokenKey
}
from
'
../../../../../common/js/constants
'
;
import
axios
from
"
axios
"
;
export
default
{
...
...
@@ -129,11 +129,6 @@
isLoading
:
false
}
},
props
:
{
projectId
:
{
type
:
String
}
},
methods
:
{
handleExceed
(
files
,
fileList
)
{
this
.
$warning
(
this
.
$t
(
'
test_track.case.import.upload_limit_count
'
));
...
...
@@ -176,6 +171,7 @@
},
open
()
{
listenGoBack
(
this
.
close
);
this
.
projectId
=
getCurrentProjectID
();
this
.
dialogVisible
=
true
;
},
close
()
{
...
...
frontend/src/business/components/track/case/components/TestCaseList.vue
浏览文件 @
62252a87
...
...
@@ -25,8 +25,7 @@
</template>
<test-case-import
:projectId=
"currentProject == null? null : currentProject.id"
@
refresh=
"refresh"
ref=
"testCaseImport"
/>
<test-case-import
@
refresh=
"refresh"
ref=
"testCaseImport"
/>
<el-table
border
...
...
@@ -176,6 +175,7 @@ import {LIST_CHANGE, TrackEvent} from "@/business/components/common/head/ListEve
import
StatusTableItem
from
"
@/business/components/track/common/tableItems/planview/StatusTableItem
"
;
import
TestCaseDetail
from
"
./TestCaseDetail
"
;
import
ReviewStatus
from
"
@/business/components/track/case/components/ReviewStatus
"
;
import
{
getCurrentProjectID
}
from
"
../../../../../common/js/utils
"
;
export
default
{
name
:
"
TestCaseList
"
,
...
...
@@ -264,13 +264,11 @@ export default {
],
maintainer
:
[],
},
currentCaseId
:
null
currentCaseId
:
null
,
projectId
:
""
}
},
props
:
{
currentProject
:
{
type
:
Object
},
selectNodeIds
:
{
type
:
Array
},
...
...
@@ -282,9 +280,6 @@ export default {
this
.
initTableData
();
},
watch
:
{
currentProject
()
{
this
.
initTableData
();
},
selectNodeIds
()
{
this
.
currentPage
=
1
;
this
.
initTableData
();
...
...
@@ -292,6 +287,7 @@ export default {
},
methods
:
{
initTableData
()
{
this
.
projectId
=
getCurrentProjectID
();
this
.
condition
.
planId
=
""
;
this
.
condition
.
nodeIds
=
[];
if
(
this
.
planId
)
{
...
...
@@ -302,13 +298,11 @@ export default {
// param.nodeIds = this.selectNodeIds;
this
.
condition
.
nodeIds
=
this
.
selectNodeIds
;
}
if
(
this
.
currentProject
.
id
)
{
this
.
getData
();
}
this
.
getData
();
},
getData
()
{
if
(
this
.
currentProject
)
{
this
.
condition
.
projectId
=
this
.
currentProject
.
i
d
;
if
(
this
.
projectId
)
{
this
.
condition
.
projectId
=
this
.
projectI
d
;
this
.
result
=
this
.
$post
(
this
.
buildPagePath
(
'
/test/case/list
'
),
this
.
condition
,
response
=>
{
let
data
=
response
.
data
;
this
.
total
=
data
.
itemCount
;
...
...
@@ -416,7 +410,7 @@ export default {
method
:
'
post
'
,
responseType
:
'
blob
'
,
// data: {ids: [...this.selectIds]}
data
:
{
ids
:
ids
,
projectId
:
this
.
currentProject
.
i
d
}
data
:
{
ids
:
ids
,
projectId
:
this
.
projectI
d
}
};
this
.
result
=
this
.
$request
(
config
).
then
(
response
=>
{
const
filename
=
this
.
$t
(
'
test_track.case.test_case
'
)
+
"
.xlsx
"
;
...
...
frontend/src/business/components/track/common/NodeBreadcrumb.vue
浏览文件 @
62252a87
...
...
@@ -41,6 +41,12 @@
},
filterData
()
{
this
.
data
=
this
.
nodes
;
for
(
let
index
in
this
.
data
)
{
if
(
this
.
data
[
index
].
id
===
'
root
'
)
{
this
.
data
.
splice
(
index
,
1
);
break
;
}
}
if
(
this
.
data
.
length
>
4
)
{
let
lastData
=
this
.
data
[
this
.
data
.
length
-
1
];
this
.
data
.
splice
(
1
,
this
.
data
.
length
);
...
...
frontend/src/business/components/track/common/NodeTree.vue
浏览文件 @
62252a87
<
template
>
<div
v-loading=
"result.loading"
>
<el-input
:placeholder=
"$t('test_track.module.search')"
v-model=
"filterText"
size=
"small"
>
<template
v-if=
"type == 'edit'"
v-slot:append
>
<el-button
:disabled=
"disabled"
icon=
"el-icon-folder-add"
@
click=
"openEditNodeDialog('add')"
></el-button>
</
template
>
</el-input>
<div>
<slot
name=
"header"
>
<el-input
:placeholder=
"$t('test_track.module.search')"
v-model=
"filterText"
size=
"small"
:clearable=
"true"
/>
</slot>
<el-tree
class=
"filter-tree node-tree"
:data=
"
t
reeNodes"
:data=
"
extendT
reeNodes"
:default-expanded-keys=
"expandedNode"
node-key=
"id"
@
node-drag-end=
"handleDragEnd"
...
...
@@ -17,63 +15,70 @@
:filter-node-method=
"filterNode"
:expand-on-click-node=
"false"
highlight-current
:draggable=
"
draggable
"
:draggable=
"
!disabled
"
ref=
"tree"
>
<template
v-slot:default=
"
{node,data}">
<span
class=
"custom-tree-node father"
@
click=
"handleNodeSelect(node)"
>
<span
class=
"node-icon"
>
<i
class=
"el-icon-folder"
></i>
</span>
<span
class=
"custom-tree-node father"
@
click=
"handleNodeSelect(node)"
>
<span
class=
"node-title"
>
{{
node
.
label
}}
</span>
<span
v-if=
"data.isEdit"
@
click.stop
>
<el-input
@
blur.stop=
"save(node, data)"
v-model=
"data.name"
class=
"name-input"
size=
"mini"
/>
</span>
<span
v-if=
"type == 'edit' && !disabled"
class=
"node-operate child"
>
<el-tooltip
class=
"item"
effect=
"dark"
:open-delay=
"200"
:content=
"$t('test_track.module.rename')"
placement=
"top"
>
<i
@
click.stop=
"openEditNodeDialog('edit', data)"
class=
"el-icon-edit"
></i>
</el-tooltip>
<el-tooltip
class=
"item"
effect=
"dark"
:open-delay=
"200"
:content=
"$t('test_track.module.add_submodule')"
placement=
"top"
>
<i
@
click.stop=
"openEditNodeDialog('add', data)"
class=
"el-icon-circle-plus-outline"
></i>
</el-tooltip>
<el-tooltip
class=
"item"
effect=
"dark"
:open-delay=
"200"
:content=
"$t('commons.delete')"
placement=
"top"
>
<i
@
click.stop=
"remove(node, data)"
class=
"el-icon-delete"
></i>
</el-tooltip>
</span>
<span
v-if=
"!data.isEdit"
class=
"node-icon"
>
<i
class=
"el-icon-folder"
/>
</span>
<span
v-if=
"!data.isEdit"
class=
"node-title"
v-text=
"data.name"
/>
<span
v-if=
"!disabled"
class=
"node-operate child"
>
<el-tooltip
v-if=
"data.id != 'root'"
class=
"item"
effect=
"dark"
:open-delay=
"200"
:content=
"$t('test_track.module.rename')"
placement=
"top"
>
<i
@
click.stop=
"edit(node, data)"
class=
"el-icon-edit"
></i>
</el-tooltip>
<el-tooltip
class=
"item"
effect=
"dark"
:open-delay=
"200"
:content=
"$t('test_track.module.add_submodule')"
placement=
"top"
>
<i
@
click.stop=
"append(node, data)"
class=
"el-icon-circle-plus-outline"
></i>
</el-tooltip>
<el-tooltip
v-if=
"data.id != 'root'"
class=
"item"
effect=
"dark"
:open-delay=
"200"
:content=
"$t('commons.delete')"
placement=
"top"
>
<i
@
click.stop=
"remove(node, data)"
class=
"el-icon-delete"
></i>
</el-tooltip>
</span>
</span>
</
template
>
</el-tree>
<node-edit
ref=
"nodeEdit"
:current-project=
"currentProject"
:tree-nodes=
"treeNodes"
@
refresh=
"refreshNode"
/>
</div>
</template>
<
script
>
import
NodeEdit
from
"
./NodeEdit
"
;
import
{
checkoutTestManagerOrTestUser
,
hasRoles
}
from
"
../../../../common/js/utils
"
;
import
{
checkoutTestManagerOrTestUser
}
from
"
../../../../common/js/utils
"
;
export
default
{
name
:
"
NodeTree
"
,
components
:
{
NodeEdit
},
name
:
"
Ms
NodeTree
"
,
components
:
{},
data
()
{
return
{
result
:
{},
expandedNode
:
[],
filterText
:
""
,
expandedNode
:
[],
defaultProps
:
{
children
:
"
children
"
,
label
:
"
label
"
},
disabled
:
false
,
list
:
[]
extendTreeNodes
:
[]
};
},
props
:
{
...
...
@@ -84,43 +89,144 @@ export default {
treeNodes
:
{
type
:
Array
},
selectNode
:
{
type
:
Object
},
draggable
:
{
type
:
Boolean
,
default
:
true
allLabel
:
{
type
:
String
,
default
()
{
return
this
.
$t
(
"
commons.all_label.case
"
);
}
},
currentProject
:
{
type
:
Object
}
},
watch
:
{
treeNodes
()
{
this
.
init
();
},
filterText
(
val
)
{
this
.
$refs
.
tree
.
filter
(
val
);
this
.
filter
(
val
);
}
},
mounted
()
{
if
(
!
checkoutTestManagerOrTestUser
()
)
{
this
.
disabled
=
true
;
computed
:
{
disabled
(
)
{
return
this
.
type
!=
'
edit
'
||
!
checkoutTestManagerOrTestUser
()
;
}
},
methods
:
{
init
()
{
this
.
extendTreeNodes
=
[];
this
.
extendTreeNodes
.
unshift
({
"
id
"
:
"
root
"
,
"
name
"
:
this
.
allLabel
,
"
level
"
:
0
,
"
children
"
:
this
.
treeNodes
,
});
if
(
this
.
expandedNode
.
length
===
0
)
{
this
.
expandedNode
.
push
(
"
root
"
);
}
},
handleNodeSelect
(
node
)
{
let
nodeIds
=
[];
let
pNodes
=
[];
this
.
getChildNodeId
(
node
.
data
,
nodeIds
);
this
.
getParentNodes
(
node
,
pNodes
);
this
.
$emit
(
"
nodeSelectEvent
"
,
node
,
nodeIds
,
pNodes
);
},
filterNode
(
value
,
data
)
{
if
(
!
value
)
return
true
;
if
(
data
.
label
)
{
return
data
.
label
.
indexOf
(
value
)
!==
-
1
;
}
return
false
;
},
filter
(
val
)
{
this
.
$refs
.
tree
.
filter
(
val
);
},
nodeExpand
(
data
)
{
if
(
data
.
id
)
{
this
.
expandedNode
.
push
(
data
.
id
);
}
},
nodeCollapse
(
data
)
{
if
(
data
.
id
)
{
this
.
expandedNode
.
splice
(
this
.
expandedNode
.
indexOf
(
data
.
id
),
1
);
}
},
edit
(
node
,
data
)
{
this
.
$set
(
data
,
'
isEdit
'
,
true
);
},
append
(
node
,
data
)
{
const
newChild
=
{
id
:
undefined
,
isEdit
:
false
,
name
:
""
,
children
:
[]
};
if
(
!
data
.
children
)
{
this
.
$set
(
data
,
'
children
'
,
[])
}
data
.
children
.
push
(
newChild
);
this
.
edit
(
node
,
newChild
);
this
.
$nextTick
(()
=>
{
this
.
$refs
.
tree
.
setCurrentKey
(
data
.
id
);
});
},
save
(
node
,
data
)
{
if
(
data
.
name
.
trim
()
===
''
)
{
this
.
$warning
(
this
.
$t
(
'
test_track.case.input_name
'
));
return
;
}
let
param
=
{};
this
.
buildSaveParam
(
param
,
node
.
parent
.
data
,
data
);
if
(
param
.
type
===
'
edit
'
)
{
this
.
$emit
(
'
edit
'
,
param
);
}
else
{
this
.
$emit
(
'
add
'
,
param
);
}
this
.
$set
(
data
,
'
isEdit
'
,
false
);
},
remove
(
node
,
data
)
{
let
tip
=
'
确定删除节点
'
+
data
.
label
+
'
及其子节点下所有资源
'
+
'
?
'
;
// let info = this.$t("test_track.module.delete_confirm") + data.label + "," + this.$t("test_track.module.delete_all_resource") + "?";
this
.
$alert
(
tip
,
""
,
{
confirmButtonText
:
this
.
$t
(
"
commons.confirm
"
),
callback
:
action
=>
{
if
(
action
===
"
confirm
"
)
{
let
nodeIds
=
[];
this
.
getChildNodeId
(
node
.
data
,
nodeIds
);
this
.
$emit
(
'
remove
'
,
nodeIds
);
}
}
}
);
},
handleDragEnd
(
draggingNode
,
dropNode
,
dropType
,
ev
)
{
if
(
dropType
===
"
none
"
||
dropType
===
undefined
)
{
return
;
}
let
param
=
this
.
buildParam
(
draggingNode
,
dropNode
,
dropType
);
this
.
list
=
[];
this
.
getNodeTree
(
this
.
treeNodes
,
draggingNode
.
data
.
id
,
this
.
list
);
this
.
$post
(
"
/case/node/drag
"
,
param
,
()
=>
{
draggingNode
.
data
.
level
=
param
.
level
;
this
.
$post
(
"
/case/node/pos
"
,
this
.
list
);
this
.
refreshTable
();
},
(
error
)
=>
{
this
.
refreshNode
();
});
let
list
=
[];
this
.
getNodeTree
(
this
.
treeNodes
,
draggingNode
.
data
.
id
,
list
);
if
(
param
.
parentId
===
'
root
'
)
{
param
.
parentId
=
undefined
;
}
this
.
$emit
(
'
drag
'
,
param
,
list
);
},
buildSaveParam
(
param
,
parentData
,
data
)
{
if
(
data
.
id
)
{
param
.
nodeIds
=
[];
param
.
type
=
'
edit
'
;
param
.
id
=
data
.
id
;
param
.
level
=
data
.
level
;
this
.
getChildNodeId
(
data
,
param
.
nodeIds
);
}
else
{
param
.
level
=
1
;
param
.
type
=
'
add
'
;
if
(
parentData
.
id
!=
'
root
'
)
{
// 非根节点
param
.
parentId
=
parentData
.
id
;
param
.
level
=
parentData
.
level
+
1
;
}
}
param
.
name
=
data
.
name
.
trim
();
param
.
label
=
data
.
name
;
},
buildParam
(
draggingNode
,
dropNode
,
dropType
)
{
let
param
=
{};
...
...
@@ -141,7 +247,8 @@ export default {
}
let
nodeIds
=
[];
this
.
getChildNodeId
(
draggingNode
.
data
,
nodeIds
);
if
(
dropNode
.
level
==
1
&&
dropType
!=
"
inner
"
)
{
if
(
dropNode
.
data
.
level
==
1
&&
dropType
!=
"
inner
"
)
{
// nodeTree 为需要修改的子节点
param
.
nodeTree
=
draggingNode
.
data
;
}
else
{
for
(
let
i
=
0
;
i
<
this
.
treeNodes
.
length
;
i
++
)
{
...
...
@@ -151,7 +258,6 @@ export default {
}
}
}
param
.
nodeIds
=
nodeIds
;
return
param
;
},
...
...
@@ -171,9 +277,6 @@ export default {
}
}
},
refreshTable
()
{
this
.
$emit
(
'
refreshTable
'
);
},
findTreeByNodeId
(
rootNode
,
nodeId
)
{
if
(
rootNode
.
id
==
nodeId
)
{
return
rootNode
;
...
...
@@ -186,41 +289,6 @@ export default {
}
}
},
remove
(
node
,
data
)
{
this
.
$alert
(
this
.
$t
(
"
test_track.module.delete_confirm
"
)
+
data
.
label
+
"
,
"
+
this
.
$t
(
"
test_track.module.delete_all_resource
"
)
+
"
?
"
,
""
,
{
confirmButtonText
:
this
.
$t
(
"
commons.confirm
"
),
callback
:
action
=>
{
if
(
action
===
"
confirm
"
)
{
let
nodeIds
=
[];
this
.
getChildNodeId
(
node
.
data
,
nodeIds
);
this
.
$post
(
"
/case/node/delete
"
,
nodeIds
,
()
=>
{
const
parent
=
node
.
parent
;
const
children
=
parent
.
data
.
children
||
parent
.
data
;
const
index
=
children
.
findIndex
(
d
=>
d
.
id
===
data
.
id
);
children
.
splice
(
index
,
1
);
this
.
$success
(
this
.
$t
(
"
commons.delete_success
"
));
this
.
$emit
(
"
refresh
"
);
});
}
}
}
);
},
handleNodeSelect
(
node
)
{
let
nodeIds
=
[];
let
pNodes
=
[];
this
.
getChildNodeId
(
node
.
data
,
nodeIds
);
this
.
getParentNodes
(
node
,
pNodes
);
this
.
$emit
(
"
nodeSelectEvent
"
,
nodeIds
,
pNodes
);
this
.
$emit
(
"
update:selectNode
"
,
node
);
},
getChildNodeId
(
rootNode
,
nodeIds
)
{
//递归获取所有子节点ID
nodeIds
.
push
(
rootNode
.
id
);
...
...
@@ -238,30 +306,6 @@ export default {
pNodes
.
push
(
rootNode
.
data
);
}
},
filterNode
(
value
,
data
)
{
if
(
!
value
)
return
true
;
return
data
.
label
.
indexOf
(
value
)
!==
-
1
;
},
openEditNodeDialog
(
type
,
data
)
{
let
nodeIds
=
[];
if
(
type
==
'
edit
'
)
{
this
.
getChildNodeId
(
data
,
nodeIds
);
}
this
.
$refs
.
nodeEdit
.
open
(
type
,
data
,
nodeIds
);
},
refreshNode
()
{
this
.
$emit
(
"
refresh
"
);
},
nodeExpand
(
data
)
{
if
(
data
.
id
)
{
this
.
expandedNode
.
push
(
data
.
id
);
}
},
nodeCollapse
(
data
)
{
if
(
data
.
id
)
{
this
.
expandedNode
.
splice
(
this
.
expandedNode
.
indexOf
(
data
.
id
),
1
);
}
}
}
};
</
script
>
...
...
@@ -311,4 +355,14 @@ export default {
color
:
#409eff
;
margin
:
0px
5px
;
}
.name-input
{
height
:
25px
;
line-height
:
25px
;
}
.name-input
>>>
.el-input__inner
{
height
:
25px
;
line-height
:
25px
;
}
</
style
>
frontend/src/business/components/track/common/TestCaseNodeTree.vue
0 → 100644
浏览文件 @
62252a87
<
template
>
<ms-node-tree
v-loading=
"result.loading"
:tree-nodes=
"treeNodes"
:type=
"'edit'"
@
add=
"add"
@
edit=
"edit"
@
drag=
"drag"
@
remove=
"remove"
@
nodeSelectEvent=
"nodeChange"
ref=
"nodeTree"
/>
</
template
>
<
script
>
import
NodeEdit
from
"
./NodeEdit
"
;
import
{
getCurrentProjectID
}
from
"
../../../../common/js/utils
"
;
import
MsNodeTree
from
"
./NodeTree
"
;
export
default
{
name
:
"
TestCaseNodeTree
"
,
components
:
{
MsNodeTree
,
NodeEdit
},
data
()
{
return
{
defaultProps
:
{
children
:
"
children
"
,
label
:
"
label
"
},
result
:
{},
treeNodes
:
[],
projectId
:
""
};
},
props
:
{
type
:
{
type
:
String
,
default
:
"
view
"
},
},
mounted
()
{
this
.
projectId
=
getCurrentProjectID
();
this
.
list
();
},
methods
:
{
list
()
{
if
(
this
.
projectId
)
{
this
.
result
=
this
.
$get
(
"
/case/node/list/
"
+
this
.
projectId
,
response
=>
{
this
.
treeNodes
=
response
.
data
;
});
}
},
edit
(
param
)
{
param
.
projectId
=
this
.
projectId
;
this
.
$post
(
"
/case/node/edit
"
,
param
,
()
=>
{
this
.
$success
(
this
.
$t
(
'
commons.save_success
'
));
this
.
list
();
this
.
$emit
(
"
refreshTable
"
);
},
(
error
)
=>
{
this
.
list
();
});
},
add
(
param
)
{
param
.
projectId
=
this
.
projectId
;
this
.
$post
(
"
/case/node/add
"
,
param
,
()
=>
{
this
.
$success
(
this
.
$t
(
'
commons.save_success
'
));
this
.
list
();
},
(
error
)
=>
{
this
.
list
();
});
},
remove
(
nodeIds
)
{
this
.
$post
(
"
/case/node/delete
"
,
nodeIds
,
()
=>
{
this
.
list
();
this
.
$emit
(
"
refreshTable
"
)
},
(
error
)
=>
{
this
.
list
();
});
},
drag
(
param
,
list
)
{
this
.
$post
(
"
/case/node/drag
"
,
param
,
()
=>
{
this
.
$post
(
"
/case/node/pos
"
,
list
);
this
.
list
();
},
(
error
)
=>
{
this
.
list
();
});
},
nodeChange
(
node
,
nodeIds
,
pNodes
)
{
this
.
$emit
(
"
nodeSelectEvent
"
,
node
,
nodeIds
,
pNodes
);
},
}
};
</
script
>
<
style
scoped
>
</
style
>
frontend/src/business/components/track/plan/view/comonents/functional/TestCaseFunctionalRelevance.vue
浏览文件 @
62252a87
...
...
@@ -8,8 +8,8 @@
<template
v-slot:aside
>
<node-tree
class=
"node-tree"
v-loading=
"result.loading"
@
nodeSelectEvent=
"nodeChange"
@
refresh=
"refresh"
:tree-nodes=
"treeNodes"
ref=
"nodeTree"
/>
</
template
>
...
...
@@ -237,7 +237,7 @@
this
.
selectIds
.
add
(
row
.
id
);
}
},
nodeChange
(
nodeIds
,
nodeNames
)
{
nodeChange
(
node
,
node
Ids
,
nodeNames
)
{
this
.
selectNodeIds
=
nodeIds
;
this
.
selectNodeNames
=
nodeNames
;
},
...
...
frontend/src/business/components/track/plan/view/comonents/functional/TestPlanFunctional.vue
浏览文件 @
62252a87
...
...
@@ -5,9 +5,7 @@
<node-tree
class=
"node-tree"
v-loading=
"result.loading"
@
nodeSelectEvent=
"nodeChange"
@
refresh=
"refresh"
:tree-nodes=
"treeNodes"
:draggable=
"false"
ref=
"nodeTree"
/>
</
template
>
<
template
v-slot:main
>
...
...
@@ -81,7 +79,7 @@
openTestCaseRelevanceDialog
()
{
this
.
$refs
.
testCaseRelevance
.
open
();
},
nodeChange
(
nodeIds
,
pNodes
)
{
nodeChange
(
node
,
node
Ids
,
pNodes
)
{
this
.
selectNodeIds
=
nodeIds
;
this
.
selectParentNodes
=
pNodes
;
// 切换node后,重置分页数
...
...
frontend/src/business/components/track/plan/view/comonents/head/TestPlanHeaderBar.vue
浏览文件 @
62252a87
...
...
@@ -32,7 +32,8 @@ export default {
.test-plan-header-bar
{
height
:
50px
;
background-color
:
white
;
background-color
:
#FFF
;
border-bottom
:
2px
solid
#E6E6E6
;
}
.header-info
{
...
...
@@ -48,4 +49,8 @@ export default {
display
:
inline-block
;
}
.menu-ul
>>>
.el-menu-item
{
height
:
51px
!important
;
}
</
style
>
frontend/src/business/components/track/review/view/TestCaseReviewView.vue
浏览文件 @
62252a87
...
...
@@ -8,11 +8,10 @@
:title=
"$t('test_track.review_view.review')"
@
dataChange=
"changeReview"
/>
<node-tree
class=
"node-tree"
:all-label=
"$t('commons.all_label.review')"
v-loading=
"result.loading"
@
nodeSelectEvent=
"nodeChange"
@
refresh=
"refresh"
:tree-nodes=
"treeNodes"
:draggable=
"false"
ref=
"nodeTree"
/>
</ms-aside-container>
...
...
@@ -108,7 +107,7 @@ export default {
});
});
},
nodeChange
(
nodeIds
,
pNodes
)
{
nodeChange
(
node
,
node
Ids
,
pNodes
)
{
this
.
selectNodeIds
=
nodeIds
;
this
.
selectParentNodes
=
pNodes
;
},
...
...
frontend/src/business/components/track/review/view/components/TestReviewRelevance.vue
浏览文件 @
62252a87
<
template
>
<div>
<el-dialog
:title=
"$t('test_track.review_view.relevance_case')"
:visible.sync=
"dialogFormVisible"
@
close=
"close"
width=
"60%"
v-loading=
"result.loading"
width=
"60%"
:close-on-click-modal=
"false"
top=
"50px"
>
<el-container
class=
"main-content"
>
<el-aside
class=
"tree-aside"
width=
"250px"
>
<el-link
type=
"primary"
class=
"project-link"
@
click=
"switchProject"
>
{{
projectName
?
projectName
:
$t
(
'
test_track.switch_project
'
)
}}
</el-link>
<node-tree
class=
"node-tree"
@
nodeSelectEvent=
"nodeChange"
@
refresh=
"refresh"
:tree-nodes=
"treeNodes"
<select-menu
:data=
"projects"
width=
"160px"
:current-data=
"currentProject"
:title=
"$t('test_track.switch_project')"
@
dataChange=
"changeProject"
/>
<node-tree
class=
"node-tree"
:all-label=
"$t('commons.all_label.review')"
v-loading=
"result.loading"
@
nodeSelectEvent=
"nodeChange"
:tree-nodes=
"treeNodes"
ref=
"nodeTree"
/>
</el-aside>
...
...
@@ -21,6 +28,7 @@
@
filter-change=
"filter"
row-key=
"id"
@
select-all=
"handleSelectAll"
@
select=
"handleSelectionChange"
v-loading=
"result.loading"
height=
"50vh"
ref=
"table"
>
...
...
@@ -98,10 +106,12 @@
import
{
_filter
}
from
"
../../../../../../common/js/utils
"
;
import
ReviewStatus
from
"
@/business/components/track/case/components/ReviewStatus
"
;
import
elTableInfiniteScroll
from
'
el-table-infinite-scroll
'
;
import
SelectMenu
from
"
../../../common/SelectMenu
"
;
export
default
{
name
:
"
TestReviewRelevance
"
,
components
:
{
SelectMenu
,
NodeTree
,
MsDialogFooter
,
PriorityTableItem
,
...
...
@@ -119,6 +129,7 @@
data
()
{
return
{
result
:
{},
currentProject
:
{},
dialogFormVisible
:
false
,
isCheckAll
:
false
,
testReviews
:
[],
...
...
@@ -254,7 +265,7 @@
this
.
selectIds
.
add
(
row
.
id
);
}
},
nodeChange
(
nodeIds
,
nodeNames
)
{
nodeChange
(
node
,
node
Ids
,
nodeNames
)
{
this
.
selectNodeIds
=
nodeIds
;
this
.
selectNodeNames
=
nodeNames
;
},
...
...
@@ -297,6 +308,7 @@
this
.
$post
(
"
/test/case/review/projects
"
,
{
reviewId
:
this
.
reviewId
},
res
=>
{
let
data
=
res
.
data
;
if
(
data
)
{
this
.
currentProject
=
data
[
0
];
this
.
projects
=
data
;
this
.
projectId
=
data
[
0
].
id
;
this
.
projectName
=
data
[
0
].
name
;
...
...
@@ -318,11 +330,15 @@
this
.
testReviews
=
[];
this
.
getReviews
(
true
);
},
changeProject
(
project
)
{
this
.
projectId
=
project
.
id
;
},
getProjectNode
(
projectId
)
{
const
index
=
this
.
projects
.
findIndex
(
project
=>
project
.
id
===
projectId
);
if
(
index
!==
-
1
)
{
this
.
projectName
=
this
.
projects
[
index
].
name
;
this
.
currentProject
=
this
.
projects
[
index
];
}
if
(
projectId
)
{
this
.
projectId
=
projectId
;
...
...
frontend/src/i18n/en-US.js
浏览文件 @
62252a87
...
...
@@ -165,7 +165,11 @@ export default {
current_user
:
"
Current user
"
}
},
monitor
:
"
monitor
"
monitor
:
"
monitor
"
,
all_label
:
{
case
:
"
all
"
,
review
:
"
all
"
}
},
license
:
{
title
:
'
Authorization management
'
,
...
...
frontend/src/i18n/zh-CN.js
浏览文件 @
62252a87
...
...
@@ -165,7 +165,11 @@ export default {
current_user
:
"
是当前用户
"
}
},
monitor
:
"
监控
"
monitor
:
"
监控
"
,
all_label
:
{
case
:
"
全部用例
"
,
review
:
"
全部评审
"
}
},
license
:
{
title
:
'
授权管理
'
,
...
...
frontend/src/i18n/zh-TW.js
浏览文件 @
62252a87
...
...
@@ -165,7 +165,11 @@ export default {
current_user
:
"
是當前用戶
"
}
},
monitor
:
"
監控
"
monitor
:
"
監控
"
,
all_label
:
{
case
:
"
全部用例
"
,
review
:
"
全部評審
"
}
},
license
:
{
title
:
'
授權管理
'
,
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录