123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 |
- import type { TabContentProps } from './types';
- import type { DropMenu } from '/@/components/Dropdown';
- import { computed, unref, reactive } from 'vue';
- import { TabContentEnum, MenuEventEnum } from './types';
- import { tabStore } from '/@/store/modules/tab';
- import router from '/@/router';
- 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';
- const { t } = useI18n();
- export function useTabDropdown(tabContentProps: TabContentProps) {
- const state = reactive({
- current: null as Nullable<RouteLocationNormalized>,
- currentIndex: 0,
- });
- const { currentRoute } = router;
- const { getShowMenu, setMenuSetting } = useMenuSetting();
- const { getShowHeader, setHeaderSetting } = useHeaderSetting();
- const isTabs = computed(() => tabContentProps.type === TabContentEnum.TAB_TYPE);
- const getCurrentTab = computed(
- (): RouteLocationNormalized => {
- return unref(isTabs) ? tabContentProps.tabItem : unref(currentRoute);
- }
- );
- const getIsScale = computed(() => {
- return !unref(getShowMenu) && !unref(getShowHeader);
- });
- /**
- * @description: drop-down list
- */
- const getDropMenuList = computed(() => {
- if (!unref(getCurrentTab)) return;
- const { meta } = unref(getCurrentTab);
- const { path } = unref(currentRoute);
- // Refresh button
- const curItem = state.current;
- const index = state.currentIndex;
- const refreshDisabled = curItem ? curItem.path !== path : true;
- // Close left
- const closeLeftDisabled = index === 0;
- const disabled = tabStore.getTabsState.length === 1;
- // Close right
- const closeRightDisabled =
- index === tabStore.getTabsState.length - 1 && tabStore.getLastDragEndIndexState >= 0;
- const dropMenuList: DropMenu[] = [
- {
- icon: 'ion:reload-sharp',
- event: MenuEventEnum.REFRESH_PAGE,
- text: t('layout.multipleTab.redo'),
- disabled: refreshDisabled,
- },
- {
- icon: 'clarity:close-line',
- event: MenuEventEnum.CLOSE_CURRENT,
- text: t('layout.multipleTab.close'),
- disabled: meta?.affix || disabled,
- divider: true,
- },
- {
- icon: 'line-md:arrow-close-left',
- event: MenuEventEnum.CLOSE_LEFT,
- text: t('layout.multipleTab.closeLeft'),
- disabled: closeLeftDisabled,
- divider: false,
- },
- {
- icon: 'line-md:arrow-close-right',
- event: MenuEventEnum.CLOSE_RIGHT,
- text: t('layout.multipleTab.closeRight'),
- disabled: closeRightDisabled,
- divider: true,
- },
- {
- icon: 'dashicons:align-center',
- event: MenuEventEnum.CLOSE_OTHER,
- text: t('layout.multipleTab.closeOther'),
- disabled: disabled,
- },
- {
- icon: 'clarity:minus-line',
- 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,
- });
- }
- return dropMenuList;
- });
- const getTrigger = computed(() => {
- return unref(isTabs) ? ['contextmenu'] : ['click'];
- });
- 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;
- };
- }
- function scaleScreen() {
- const isScale = !unref(getShowMenu) && !unref(getShowHeader);
- setMenuSetting({
- show: isScale,
- hidden: !isScale,
- });
- setHeaderSetting({
- show: isScale,
- });
- }
- // Handle right click event
- function handleMenuEvent(menu: DropMenu): void {
- const { refreshPage, closeAll, closeCurrent, closeLeft, closeOther, closeRight } = useTabs();
- const { event } = menu;
- switch (event) {
- case MenuEventEnum.SCALE:
- scaleScreen();
- break;
- case MenuEventEnum.REFRESH_PAGE:
- // refresh page
- refreshPage();
- break;
- // Close current
- case MenuEventEnum.CLOSE_CURRENT:
- closeCurrent();
- break;
- // Close left
- case MenuEventEnum.CLOSE_LEFT:
- closeLeft();
- break;
- // Close right
- case MenuEventEnum.CLOSE_RIGHT:
- closeRight();
- break;
- // Close other
- case MenuEventEnum.CLOSE_OTHER:
- closeOther();
- break;
- // Close all
- case MenuEventEnum.CLOSE_ALL:
- closeAll();
- break;
- }
- }
- return { getDropMenuList, handleMenuEvent, handleContextMenu, getTrigger, isTabs };
- }
|