vben
authored
|
1
|
import type { TabContentProps } from './types';
|
|
2
3
|
import type { DropMenu } from '/@/components/Dropdown';
|
vben
authored
|
4
5
|
import { computed, unref, reactive } from 'vue';
import { TabContentEnum, MenuEventEnum } from './types';
|
|
6
7
|
import { tabStore } from '/@/store/modules/tab';
import router from '/@/router';
|
vben
authored
|
8
9
10
11
12
13
|
import { RouteLocationNormalized } from 'vue-router';
import { useTabs } from '/@/hooks/web/useTabs';
import { useI18n } from '/@/hooks/web/useI18n';
import { useHeaderSetting } from '/@/hooks/setting/useHeaderSetting';
import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';
import { useMultipleTabSetting } from '/@/hooks/setting/useMultipleTabSetting';
|
|
14
|
|
vben
authored
|
15
|
const { t } = useI18n();
|
vben
authored
|
16
|
|
|
17
|
export function useTabDropdown(tabContentProps: TabContentProps) {
|
vben
authored
|
18
19
20
|
const state = reactive({
current: null as Nullable<RouteLocationNormalized>,
currentIndex: 0,
|
|
21
22
|
});
|
vben
authored
|
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
const { currentRoute } = router;
const { getShowMenu, setMenuSetting } = useMenuSetting();
const { getShowHeader, setHeaderSetting } = useHeaderSetting();
const { getShowQuick } = useMultipleTabSetting();
const isTabs = computed(() =>
!unref(getShowQuick) ? true : tabContentProps.type === TabContentEnum.TAB_TYPE
);
const getCurrentTab = computed(
(): RouteLocationNormalized => {
return unref(isTabs) ? tabContentProps.tabItem : unref(currentRoute);
}
);
const getIsScale = computed(() => {
return !unref(getShowMenu) && !unref(getShowHeader);
});
|
|
42
43
|
/**
|
vben
authored
|
44
|
* @description: drop-down list
|
|
45
46
|
*/
const getDropMenuList = computed(() => {
|
vben
authored
|
47
|
if (!unref(getCurrentTab)) return;
|
vben
authored
|
48
49
|
const { meta } = unref(getCurrentTab);
const { path } = unref(currentRoute);
|
|
50
|
|
vben
authored
|
51
|
// Refresh button
|
vben
authored
|
52
53
|
const curItem = state.current;
const index = state.currentIndex;
|
|
54
|
const refreshDisabled = curItem ? curItem.path !== path : true;
|
vben
authored
|
55
|
// Close left
|
|
56
57
|
const closeLeftDisabled = index === 0;
|
vben
authored
|
58
59
|
const disabled = tabStore.getTabsState.length === 1;
|
vben
authored
|
60
|
// Close right
|
vben
authored
|
61
62
63
64
|
const closeRightDisabled =
index === tabStore.getTabsState.length - 1 && tabStore.getLastDragEndIndexState >= 0;
const dropMenuList: DropMenu[] = [
{
|
|
65
|
icon: 'ion:reload-sharp',
|
vben
authored
|
66
67
68
69
70
|
event: MenuEventEnum.REFRESH_PAGE,
text: t('layout.multipleTab.redo'),
disabled: refreshDisabled,
},
{
|
|
71
|
icon: 'clarity:close-line',
|
vben
authored
|
72
73
74
75
76
77
|
event: MenuEventEnum.CLOSE_CURRENT,
text: t('layout.multipleTab.close'),
disabled: meta?.affix || disabled,
divider: true,
},
{
|
|
78
|
icon: 'line-md:arrow-close-left',
|
vben
authored
|
79
80
81
82
83
84
|
event: MenuEventEnum.CLOSE_LEFT,
text: t('layout.multipleTab.closeLeft'),
disabled: closeLeftDisabled,
divider: false,
},
{
|
|
85
|
icon: 'line-md:arrow-close-right',
|
vben
authored
|
86
87
88
89
90
91
|
event: MenuEventEnum.CLOSE_RIGHT,
text: t('layout.multipleTab.closeRight'),
disabled: closeRightDisabled,
divider: true,
},
{
|
|
92
|
icon: 'dashicons:align-center',
|
vben
authored
|
93
94
95
96
97
|
event: MenuEventEnum.CLOSE_OTHER,
text: t('layout.multipleTab.closeOther'),
disabled: disabled,
},
{
|
|
98
|
icon: 'clarity:minus-line',
|
vben
authored
|
99
100
101
102
103
104
105
106
107
108
109
110
111
112
|
event: MenuEventEnum.CLOSE_ALL,
text: t('layout.multipleTab.closeAll'),
disabled: disabled,
},
];
if (!unref(isTabs)) {
const isScale = unref(getIsScale);
dropMenuList.unshift({
icon: isScale ? 'codicon:screen-normal' : 'codicon:screen-full',
event: MenuEventEnum.SCALE,
text: isScale ? t('layout.multipleTab.putAway') : t('layout.multipleTab.unfold'),
disabled: false,
});
|
|
113
114
115
116
117
|
}
return dropMenuList;
});
|
vben
authored
|
118
119
120
|
const getTrigger = computed(() => {
return unref(isTabs) ? ['contextmenu'] : ['click'];
});
|
vben
authored
|
121
|
|
vben
authored
|
122
123
124
125
126
127
128
129
|
function handleContextMenu(tabItem: RouteLocationNormalized) {
return (e: Event) => {
if (!tabItem) return;
e?.preventDefault();
const index = tabStore.getTabsState.findIndex((tab) => tab.path === tabItem.path);
state.current = tabItem;
state.currentIndex = index;
};
|
|
130
|
}
|
vben
authored
|
131
|
|
|
132
|
function scaleScreen() {
|
vben
authored
|
133
134
135
|
const isScale = !unref(getShowMenu) && !unref(getShowHeader);
setMenuSetting({
show: isScale,
|
|
136
|
});
|
vben
authored
|
137
138
|
setHeaderSetting({
show: isScale,
|
|
139
140
141
|
});
}
|
vben
authored
|
142
|
// Handle right click event
|
|
143
|
function handleMenuEvent(menu: DropMenu): void {
|
vben
authored
|
144
|
const { refreshPage, closeAll, closeCurrent, closeLeft, closeOther, closeRight } = useTabs();
|
|
145
146
147
148
149
150
|
const { event } = menu;
switch (event) {
case MenuEventEnum.SCALE:
scaleScreen();
break;
case MenuEventEnum.REFRESH_PAGE:
|
vben
authored
|
151
|
// refresh page
|
|
152
153
|
refreshPage();
break;
|
vben
authored
|
154
|
// Close current
|
|
155
156
157
|
case MenuEventEnum.CLOSE_CURRENT:
closeCurrent();
break;
|
vben
authored
|
158
|
// Close left
|
|
159
160
161
|
case MenuEventEnum.CLOSE_LEFT:
closeLeft();
break;
|
vben
authored
|
162
|
// Close right
|
|
163
164
165
|
case MenuEventEnum.CLOSE_RIGHT:
closeRight();
break;
|
vben
authored
|
166
|
// Close other
|
|
167
168
169
|
case MenuEventEnum.CLOSE_OTHER:
closeOther();
break;
|
vben
authored
|
170
|
// Close all
|
|
171
172
173
174
175
|
case MenuEventEnum.CLOSE_ALL:
closeAll();
break;
}
}
|
vben
authored
|
176
|
return { getDropMenuList, handleMenuEvent, handleContextMenu, getTrigger, isTabs };
|
|
177
|
}
|