vue-vben-admin/src/layouts/default/tabs/useTabDropdown.ts

175 lines
5.0 KiB
TypeScript
Raw Normal View History

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