import type { ProjectConfig } from '/@/types/config'; import defaultSetting from '/@/settings/projectSetting'; import { defineComponent, computed, unref, FunctionalComponent } from 'vue'; import { BasicDrawer } from '/@/components/Drawer/index'; import { Divider, Switch, Tooltip, InputNumber, Select } from 'ant-design-vue'; import { Button } from '/@/components/Button'; import { CopyOutlined, RedoOutlined, CheckOutlined } from '@ant-design/icons-vue'; import { MenuTypeEnum } from '/@/enums/menuEnum'; import { appStore } from '/@/store/modules/app'; import { useMessage } from '/@/hooks/web/useMessage'; import { useCopyToClipboard } from '/@/hooks/web/useCopyToClipboard'; import { useRootSetting } from '/@/hooks/setting/useRootSetting'; import { useMenuSetting } from '/@/hooks/setting/useMenuSetting'; import { useHeaderSetting } from '/@/hooks/setting/useHeaderSetting'; import { useMultipleTabSetting } from '/@/hooks/setting/useMultipleTabSetting'; import { useTransitionSetting } from '/@/hooks/setting/useTransitionSetting'; import { useI18n } from '/@/hooks/web/useI18n'; import { updateColorWeak, updateGrayMode } from '/@/setup/theme'; import { baseHandler } from './handler'; import { HandlerEnum, contentModeOptions, topMenuAlignOptions, menuTriggerOptions, routerTransitionOptions, menuTypeList, } from './enum'; import { HEADER_PRESET_BG_COLOR_LIST, SIDE_BAR_BG_COLOR_LIST } from '/@/settings/colorSetting'; interface SwitchOptions { config?: DeepPartial; def?: any; disabled?: boolean; handler?: Fn; } interface SelectConfig { options?: LabelValueOptions; def?: any; disabled?: boolean; handler?: Fn; } interface ThemePickerProps { colorList: string[]; handler: Fn; def: string; } const { createSuccessModal, createMessage } = useMessage(); const { t } = useI18n(); /** * Menu type Picker comp */ const MenuTypePicker: FunctionalComponent = () => { const { getIsHorizontal, getMenuType } = useMenuSetting(); return (
{menuTypeList.map((item) => { const { title, type: ItemType, mode, src } = item; return ( {{ default: () => (
), }}
); })}
); }; const ThemePicker: FunctionalComponent = (props) => { return (
{props.colorList.map((color) => { return ( props.handler?.(color)} key={color} class={[props.def === color ? 'active' : '']} style={{ background: color, }} > ); })}
); }; /** * FooterButton component */ const FooterButton: FunctionalComponent = () => { const { getRootSetting } = useRootSetting(); function handleCopy() { const { isSuccessRef } = useCopyToClipboard(JSON.stringify(unref(getRootSetting), null, 2)); unref(isSuccessRef) && createSuccessModal({ title: t('layout.setting.operatingTitle'), content: t('layout.setting.operatingContent'), }); } function handleResetSetting() { try { appStore.commitProjectConfigState(defaultSetting); const { colorWeak, grayMode } = defaultSetting; // updateTheme(themeColor); updateColorWeak(colorWeak); updateGrayMode(grayMode); createMessage.success(t('layout.setting.resetSuccess')); } catch (error) { createMessage.error(error); } } function handleClearAndRedo() { localStorage.clear(); appStore.resumeAllState(); location.reload(); } return ( ); }; export default defineComponent({ name: 'SettingDrawer', setup(_, { attrs }) { const { getContentMode, getShowFooter, getShowBreadCrumb, getShowBreadCrumbIcon, getShowLogo, getFullContent, getColorWeak, getGrayMode, } = useRootSetting(); const { getOpenPageLoading, getBasicTransition, getEnableTransition, getOpenNProgress, } = useTransitionSetting(); const { getIsHorizontal, getShowMenu, getMenuType, getTrigger, getCollapsedShowTitle, getMenuFixed, getCollapsed, getShowSearch, getCanDrag, getTopMenuAlign, getAccordion, getMenuWidth, getMenuBgColor, getIsTopMenu, getSplit, } = useMenuSetting(); const { getShowHeader, getFixed: getHeaderFixed, getHeaderBgColor } = useHeaderSetting(); const { getShowMultipleTab, getShowQuick } = useMultipleTabSetting(); const getShowMenuRef = computed(() => { return unref(getShowMenu) && !unref(getIsHorizontal); }); function renderSidebar() { return ( <> {renderSwitchItem(t('layout.setting.splitMenu'), { handler: (e) => { baseHandler(HandlerEnum.MENU_SPLIT, e); }, def: unref(getSplit), disabled: !unref(getShowMenuRef) || unref(getMenuType) !== MenuTypeEnum.MIX, })} ); } function renderTheme() { return ( <> {() => t('layout.setting.headerTheme')} { baseHandler(HandlerEnum.HEADER_THEME, e); }} /> {() => t('layout.setting.sidebarTheme')} { baseHandler(HandlerEnum.MENU_THEME, e); }} /> ); } /** * @description: */ function renderFeatures() { return [ renderSwitchItem(t('layout.setting.menuDrag'), { handler: (e) => { baseHandler(HandlerEnum.MENU_HAS_DRAG, e); }, def: unref(getCanDrag), disabled: !unref(getShowMenuRef), }), renderSwitchItem(t('layout.setting.menuSearch'), { handler: (e) => { baseHandler(HandlerEnum.MENU_SHOW_SEARCH, e); }, def: unref(getShowSearch), disabled: !unref(getShowMenuRef), }), renderSwitchItem(t('layout.setting.menuAccordion'), { handler: (e) => { baseHandler(HandlerEnum.MENU_ACCORDION, e); }, def: unref(getAccordion), disabled: !unref(getShowMenuRef), }), renderSwitchItem(t('layout.setting.menuCollapse'), { handler: (e) => { baseHandler(HandlerEnum.MENU_COLLAPSED, e); }, def: unref(getCollapsed), disabled: !unref(getShowMenuRef), }), renderSwitchItem(t('layout.setting.collapseMenuDisplayName'), { handler: (e) => { baseHandler(HandlerEnum.MENU_COLLAPSED_SHOW_TITLE, e); }, def: unref(getCollapsedShowTitle), disabled: !unref(getShowMenuRef) || !unref(getCollapsed), }), renderSwitchItem(t('layout.setting.fixedHeader'), { handler: (e) => { baseHandler(HandlerEnum.HEADER_FIXED, e); }, def: unref(getHeaderFixed), disabled: !unref(getShowHeader), }), renderSwitchItem(t('layout.setting.fixedSideBar'), { handler: (e) => { baseHandler(HandlerEnum.MENU_FIXED, e); }, def: unref(getMenuFixed), disabled: !unref(getShowMenuRef), }), renderSelectItem(t('layout.setting.topMenuLayout'), { handler: (e) => { baseHandler(HandlerEnum.MENU_TOP_ALIGN, e); }, def: unref(getTopMenuAlign), options: topMenuAlignOptions, disabled: !unref(getShowHeader) || (!unref(getIsTopMenu) && !unref(getSplit)), }), renderSelectItem(t('layout.setting.menuCollapseButton'), { handler: (e) => { baseHandler(HandlerEnum.MENU_TRIGGER, e); }, disabled: !unref(getShowMenuRef), def: unref(getTrigger), options: menuTriggerOptions, }), renderSelectItem(t('layout.setting.contentMode'), { handler: (e) => { baseHandler(HandlerEnum.CONTENT_MODE, e); }, def: unref(getContentMode), options: contentModeOptions, }),
{t('layout.setting.autoScreenLock')} { baseHandler(HandlerEnum.LOCK_TIME, e); }} defaultValue={appStore.getProjectConfig.lockTime} formatter={(value: string) => { if (parseInt(value) === 0) { return `0(${t('layout.setting.notAutoScreenLock')})`; } return `${value}${t('layout.setting.minute')}`; }} />
,
{t('layout.setting.expandedMenuWidth')} `${parseInt(value)}px`} onChange={(e: any) => { baseHandler(HandlerEnum.MENU_WIDTH, e); }} />
, ]; } function renderContent() { return [ renderSwitchItem(t('layout.setting.breadcrumb'), { handler: (e) => { baseHandler(HandlerEnum.SHOW_BREADCRUMB, e); }, def: unref(getShowBreadCrumb), disabled: !unref(getShowHeader), }), renderSwitchItem(t('layout.setting.breadcrumbIcon'), { handler: (e) => { baseHandler(HandlerEnum.SHOW_BREADCRUMB_ICON, e); }, def: unref(getShowBreadCrumbIcon), disabled: !unref(getShowHeader), }), renderSwitchItem(t('layout.setting.tabs'), { handler: (e) => { baseHandler(HandlerEnum.TABS_SHOW, e); }, def: unref(getShowMultipleTab), }), renderSwitchItem(t('layout.setting.tabsQuickBtn'), { handler: (e) => { baseHandler(HandlerEnum.TABS_SHOW_QUICK, e); }, def: unref(getShowQuick), disabled: !unref(getShowMultipleTab), }), renderSwitchItem(t('layout.setting.sidebar'), { handler: (e) => { baseHandler(HandlerEnum.MENU_SHOW_SIDEBAR, e); }, def: unref(getShowMenu), disabled: unref(getIsHorizontal), }), renderSwitchItem(t('layout.setting.header'), { handler: (e) => { baseHandler(HandlerEnum.HEADER_SHOW, e); }, def: unref(getShowHeader), }), renderSwitchItem('Logo', { handler: (e) => { baseHandler(HandlerEnum.SHOW_LOGO, e); }, def: unref(getShowLogo), }), renderSwitchItem(t('layout.setting.footer'), { handler: (e) => { baseHandler(HandlerEnum.SHOW_FOOTER, e); }, def: unref(getShowFooter), }), renderSwitchItem(t('layout.setting.fullContent'), { handler: (e) => { baseHandler(HandlerEnum.FULL_CONTENT, e); }, def: unref(getFullContent), }), renderSwitchItem(t('layout.setting.grayMode'), { handler: (e) => { baseHandler(HandlerEnum.GRAY_MODE, e); }, def: unref(getGrayMode), }), renderSwitchItem(t('layout.setting.colorWeak'), { handler: (e) => { baseHandler(HandlerEnum.COLOR_WEAK, e); }, def: unref(getColorWeak), }), ]; } function renderTransition() { return ( <> {renderSwitchItem(t('layout.setting.progress'), { handler: (e) => { baseHandler(HandlerEnum.OPEN_PROGRESS, e); }, def: unref(getOpenNProgress), })} {renderSwitchItem(t('layout.setting.switchLoading'), { handler: (e) => { baseHandler(HandlerEnum.OPEN_PAGE_LOADING, e); }, def: unref(getOpenPageLoading), })} {renderSwitchItem(t('layout.setting.switchAnimation'), { handler: (e) => { baseHandler(HandlerEnum.OPEN_ROUTE_TRANSITION, e); }, def: unref(getEnableTransition), })} {renderSelectItem(t('layout.setting.animationType'), { handler: (e) => { baseHandler(HandlerEnum.ROUTER_TRANSITION, e); }, def: unref(getBasicTransition), options: routerTransitionOptions, disabled: !unref(getEnableTransition), })} ); } function renderSelectItem(text: string, config?: SelectConfig) { const { handler, def, disabled = false, options } = config || {}; const opt = def ? { value: def, defaultValue: def } : {}; return (
{text}