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/index.vue'; 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 { 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(); /** * 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: '操作成功', content: '复制成功,请到 src/settings/projectSetting.ts 中修改配置!', }); } function handleResetSetting() { try { appStore.commitProjectConfigState(defaultSetting); const { colorWeak, grayMode } = defaultSetting; // updateTheme(themeColor); updateColorWeak(colorWeak); updateGrayMode(grayMode); createMessage.success('重置成功!'); } catch (error) { createMessage.error(error); } } function handleClearAndRedo() { localStorage.clear(); appStore.resumeAllState(); location.reload(); } return ( ); }; export default defineComponent({ name: 'SettingDrawer', setup(_, { attrs }) { const { getContentMode, getRouterTransition, getOpenRouterTransition, getOpenPageLoading, getShowFooter, getShowBreadCrumb, getShowBreadCrumbIcon, getShowLogo, getFullContent, getColorWeak, getGrayMode, } = useRootSetting(); const { getIsHorizontal, getShowMenu, getMenuType, getTrigger, getCollapsedShowTitle, getMenuFixed, getCollapsed, getShowSearch, getHasDrag, 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('分割菜单', { handler: (e) => { baseHandler(HandlerEnum.MENU_SPLIT, e); }, def: unref(getSplit), disabled: !unref(getShowMenuRef) || unref(getMenuType) !== MenuTypeEnum.MIX, })} ); } function renderTheme() { return ( <> {() => '顶栏主题'} { baseHandler(HandlerEnum.HEADER_THEME, e); }} /> {() => '菜单主题'} { baseHandler(HandlerEnum.MENU_THEME, e); }} /> ); } /** * @description: */ function renderFeatures() { return [ renderSwitchItem('侧边菜单拖拽', { handler: (e) => { baseHandler(HandlerEnum.MENU_HAS_DRAG, e); }, def: unref(getHasDrag), disabled: !unref(getShowMenuRef), }), renderSwitchItem('侧边菜单搜索', { handler: (e) => { baseHandler(HandlerEnum.MENU_SHOW_SEARCH, e); }, def: unref(getShowSearch), disabled: !unref(getShowMenuRef), }), renderSwitchItem('侧边菜单手风琴模式', { handler: (e) => { baseHandler(HandlerEnum.MENU_ACCORDION, e); }, def: unref(getAccordion), disabled: !unref(getShowMenuRef), }), renderSwitchItem('折叠菜单', { handler: (e) => { baseHandler(HandlerEnum.MENU_COLLAPSED, e); }, def: unref(getCollapsed), disabled: !unref(getShowMenuRef), }), renderSwitchItem('折叠菜单显示名称', { handler: (e) => { baseHandler(HandlerEnum.MENU_COLLAPSED_SHOW_TITLE, e); }, def: unref(getCollapsedShowTitle), disabled: !unref(getShowMenuRef) || !unref(getCollapsed), }), renderSwitchItem('固定header', { handler: (e) => { baseHandler(HandlerEnum.HEADER_FIXED, e); }, def: unref(getHeaderFixed), disabled: !unref(getShowHeader), }), renderSwitchItem('固定Siderbar', { handler: (e) => { baseHandler(HandlerEnum.MENU_FIXED, e); }, def: unref(getMenuFixed), disabled: !unref(getShowMenuRef), }), renderSelectItem('顶部菜单布局', { handler: (e) => { baseHandler(HandlerEnum.MENU_TOP_ALIGN, e); }, def: unref(getTopMenuAlign), options: topMenuAlignOptions, disabled: !unref(getShowHeader) || (!unref(getIsTopMenu) && !unref(getSplit)), }), renderSelectItem('菜单折叠按钮', { handler: (e) => { baseHandler(HandlerEnum.MENU_TRIGGER, e); }, disabled: !unref(getShowMenuRef), def: unref(getTrigger), options: menuTriggerOptions, }), renderSelectItem('内容区域宽度', { handler: (e) => { baseHandler(HandlerEnum.CONTENT_MODE, e); }, def: unref(getContentMode), options: contentModeOptions, }),
自动锁屏 { baseHandler(HandlerEnum.LOCK_TIME, e); }} defaultValue={appStore.getProjectConfig.lockTime} formatter={(value: string) => { if (parseInt(value) === 0) { return '0(不自动锁屏)'; } return `${value}分钟`; }} />
,
菜单展开宽度 `${parseInt(value)}px`} onChange={(e: any) => { baseHandler(HandlerEnum.MENU_WIDTH, e); }} />
, ]; } function renderContent() { return [ renderSwitchItem('面包屑', { handler: (e) => { baseHandler(HandlerEnum.SHOW_BREADCRUMB, e); }, def: unref(getShowBreadCrumb), disabled: !unref(getShowHeader), }), renderSwitchItem('面包屑图标', { handler: (e) => { baseHandler(HandlerEnum.SHOW_BREADCRUMB_ICON, e); }, def: unref(getShowBreadCrumbIcon), disabled: !unref(getShowHeader), }), renderSwitchItem('标签页', { handler: (e) => { baseHandler(HandlerEnum.TABS_SHOW, e); }, def: unref(getShowMultipleTab), }), renderSwitchItem('标签页快捷按钮', { handler: (e) => { baseHandler(HandlerEnum.TABS_SHOW_QUICK, e); }, def: unref(getShowQuick), disabled: !unref(getShowMultipleTab), }), renderSwitchItem('左侧菜单', { handler: (e) => { baseHandler(HandlerEnum.MENU_SHOW_SIDEBAR, e); }, def: unref(getShowMenu), disabled: unref(getIsHorizontal), }), renderSwitchItem('顶栏', { handler: (e) => { baseHandler(HandlerEnum.HEADER_SHOW, e); }, def: unref(getShowHeader), }), renderSwitchItem('Logo', { handler: (e) => { baseHandler(HandlerEnum.SHOW_LOGO, e); }, def: unref(getShowLogo), }), renderSwitchItem('页脚', { handler: (e) => { baseHandler(HandlerEnum.SHOW_FOOTER, e); }, def: unref(getShowFooter), }), renderSwitchItem('全屏内容', { handler: (e) => { baseHandler(HandlerEnum.FULL_CONTENT, e); }, def: unref(getFullContent), }), renderSwitchItem('灰色模式', { handler: (e) => { baseHandler(HandlerEnum.GRAY_MODE, e); }, def: unref(getGrayMode), }), renderSwitchItem('色弱模式', { handler: (e) => { baseHandler(HandlerEnum.COLOR_WEAK, e); }, def: unref(getColorWeak), }), ]; } function renderTransition() { return ( <> {renderSwitchItem('页面切换loading', { handler: (e) => { baseHandler(HandlerEnum.OPEN_PAGE_LOADING, e); }, def: unref(getOpenPageLoading), })} {renderSwitchItem('切换动画', { handler: (e) => { baseHandler(HandlerEnum.OPEN_ROUTE_TRANSITION, e); }, def: unref(getOpenRouterTransition), })} {renderSelectItem('路由动画', { handler: (e) => { baseHandler(HandlerEnum.ROUTER_TRANSITION, e); }, def: unref(getRouterTransition), options: routerTransitionOptions, disabled: !unref(getOpenRouterTransition), })} ); } function renderSelectItem(text: string, config?: SelectConfig) { const { handler, def, disabled = false, options } = config || {}; const opt = def ? { value: def, defaultValue: def } : {}; return (
{text}