@@ -12,14 +12,21 @@ import { useDesign } from '@/hooks/web/useDesign'
12
12
import { useTemplateRefsList } from ' @vueuse/core'
13
13
import { ElScrollbar } from ' element-plus'
14
14
import { useScrollTo } from ' @/hooks/event/useScrollTo'
15
+ import { useTagsView } from ' @/hooks/web/useTagsView'
16
+ import { cloneDeep } from ' lodash-es'
17
+
18
+
19
+ defineOptions ({ name: ' TagsView' })
15
20
16
21
const { getPrefixCls } = useDesign ()
17
22
18
23
const prefixCls = getPrefixCls (' tags-view' )
19
24
20
25
const { t } = useI18n ()
21
26
22
- const { currentRoute, push, replace } = useRouter ()
27
+ const { currentRoute, push } = useRouter ()
28
+
29
+ const { closeAll, closeLeft, closeRight, closeOther, closeCurrent, refreshPage } = useTagsView ()
23
30
24
31
const permissionStore = usePermissionStore ()
25
32
@@ -31,6 +38,10 @@ const visitedViews = computed(() => tagsViewStore.getVisitedViews)
31
38
32
39
const affixTagArr = ref <RouteLocationNormalizedLoaded []>([])
33
40
41
+ const selectedTag = computed (() => tagsViewStore .getSelectedTag )
42
+
43
+ const setSelectTag = tagsViewStore .setSelectedTag
44
+
34
45
const appStore = useAppStore ()
35
46
36
47
const tagsViewImmerse = computed (() => appStore .getTagsViewImmerse )
@@ -45,82 +56,73 @@ const initTags = () => {
45
56
for (const tag of unref (affixTagArr )) {
46
57
// Must have tag name
47
58
if (tag .name ) {
48
- tagsViewStore .addVisitedView (tag )
59
+ tagsViewStore .addVisitedView (cloneDeep ( tag ) )
49
60
}
50
61
}
51
62
}
52
63
53
- const selectedTag = ref <RouteLocationNormalizedLoaded >()
54
-
55
64
// 新增tag
56
65
const addTags = () => {
57
66
const { name } = unref (currentRoute )
58
67
if (name ) {
59
- selectedTag . value = unref (currentRoute )
68
+ setSelectTag ( unref (currentRoute ) )
60
69
tagsViewStore .addView (unref (currentRoute ))
61
70
}
62
- return false
63
71
}
64
72
65
73
// 关闭选中的tag
66
74
const closeSelectedTag = (view : RouteLocationNormalizedLoaded ) => {
67
- if (view ?.meta ?.affix ) return
68
- tagsViewStore .delView (view )
69
- if (isActive (view )) {
70
- toLastView ()
75
+ closeCurrent (view , () => {
76
+ if (isActive (view )) {
77
+ toLastView ()
78
+ }
79
+ })
80
+ }
81
+
82
+ // 去最后一个
83
+ const toLastView = () => {
84
+ const visitedViews = tagsViewStore .getVisitedViews
85
+ const latestView = visitedViews .slice (- 1 )[0 ]
86
+ if (latestView ) {
87
+ push (latestView )
88
+ } else {
89
+ if (
90
+ unref (currentRoute ).path === permissionStore .getAddRouters [0 ].path ||
91
+ unref (currentRoute ).path === permissionStore .getAddRouters [0 ].redirect
92
+ ) {
93
+ addTags ()
94
+ return
95
+ }
96
+ // You can set another route
97
+ push (permissionStore .getAddRouters [0 ].path )
71
98
}
72
99
}
73
100
74
101
// 关闭全部
75
102
const closeAllTags = () => {
76
- tagsViewStore .delAllViews ()
77
- toLastView ()
103
+ closeAll (() => {
104
+ toLastView ()
105
+ })
78
106
}
79
107
80
108
// 关闭其它
81
109
const closeOthersTags = () => {
82
- tagsViewStore . delOthersViews ( unref ( selectedTag ) as RouteLocationNormalizedLoaded )
110
+ closeOther ( )
83
111
}
84
112
85
113
// 重新加载
86
114
const refreshSelectedTag = async (view ? : RouteLocationNormalizedLoaded ) => {
87
- if (! view ) return
88
- tagsViewStore .delCachedView ()
89
- const { path, query } = view
90
- await nextTick ()
91
- replace ({
92
- path: ' /redirect' + path ,
93
- query: query
94
- })
115
+ refreshPage (view )
95
116
}
96
117
97
118
// 关闭左侧
98
119
const closeLeftTags = () => {
99
- tagsViewStore . delLeftViews ( unref ( selectedTag ) as RouteLocationNormalizedLoaded )
120
+ closeLeft ( )
100
121
}
101
122
102
123
// 关闭右侧
103
124
const closeRightTags = () => {
104
- tagsViewStore .delRightViews (unref (selectedTag ) as RouteLocationNormalizedLoaded )
105
- }
106
-
107
- // 跳转到最后一个
108
- const toLastView = () => {
109
- const visitedViews = tagsViewStore .getVisitedViews
110
- const latestView = visitedViews .slice (- 1 )[0 ]
111
- if (latestView ) {
112
- push (latestView )
113
- } else {
114
- if (
115
- unref (currentRoute ).path === permissionStore .getAddRouters [0 ].path ||
116
- unref (currentRoute ).path === permissionStore .getAddRouters [0 ].redirect
117
- ) {
118
- addTags ()
119
- return
120
- }
121
- // TODO: You can set another route
122
- push (' /' )
123
- }
125
+ closeRight ()
124
126
}
125
127
126
128
// 滚动到选中的tag
@@ -209,13 +211,14 @@ const isActive = (route: RouteLocationNormalizedLoaded): boolean => {
209
211
// 所有右键菜单组件的元素
210
212
const itemRefs = useTemplateRefsList <ComponentRef <typeof ContextMenu & ContextMenuExpose >>()
211
213
212
- // 右键菜单装填改变的时候
214
+ // 右键菜单状态改变的时候
213
215
const visibleChange = (visible : boolean , tagItem : RouteLocationNormalizedLoaded ) => {
214
216
if (visible ) {
215
217
for (const v of unref (itemRefs )) {
216
218
const elDropdownMenuRef = v .elDropdownMenuRef
217
219
if (tagItem .fullPath !== v .tagItem .fullPath ) {
218
220
elDropdownMenuRef ?.handleClose ()
221
+ setSelectTag (tagItem )
219
222
}
220
223
}
221
224
}
@@ -243,6 +246,16 @@ const move = (to: number) => {
243
246
start ()
244
247
}
245
248
249
+ const canShowIcon = (item : RouteLocationNormalizedLoaded ) => {
250
+ if (
251
+ (item ?.matched ?.[1 ]?.meta ?.icon && unref (tagsViewIcon )) ||
252
+ (item ?.meta ?.affix && unref (tagsViewIcon ) && item ?.meta ?.icon )
253
+ ) {
254
+ return true
255
+ }
256
+ return false
257
+ }
258
+
246
259
onBeforeMount (() => {
247
260
initTags ()
248
261
addTags ()
0 commit comments