|
|
@ -1,29 +1,36 @@ |
|
|
import { defineComponent, computed, unref, ref } from 'vue'; |
|
|
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 { BasicDrawer } from '/@/components/Drawer/index'; |
|
|
import { Divider, Switch, Tooltip, InputNumber, Select } from 'ant-design-vue'; |
|
|
import { Divider, Switch, Tooltip, InputNumber, Select } from 'ant-design-vue'; |
|
|
import Button from '/@/components/Button/index.vue'; |
|
|
import Button from '/@/components/Button/index.vue'; |
|
|
import { MenuModeEnum, MenuTypeEnum } from '/@/enums/menuEnum'; |
|
|
|
|
|
import { CopyOutlined, RedoOutlined, CheckOutlined } from '@ant-design/icons-vue'; |
|
|
import { CopyOutlined, RedoOutlined, CheckOutlined } from '@ant-design/icons-vue'; |
|
|
|
|
|
|
|
|
|
|
|
import { MenuTypeEnum } from '/@/enums/menuEnum'; |
|
|
import { appStore } from '/@/store/modules/app'; |
|
|
import { appStore } from '/@/store/modules/app'; |
|
|
import { ProjectConfig } from '/@/types/config'; |
|
|
|
|
|
|
|
|
|
|
|
import { useMessage } from '/@/hooks/web/useMessage'; |
|
|
import { useMessage } from '/@/hooks/web/useMessage'; |
|
|
import { useCopyToClipboard } from '/@/hooks/web/useCopyToClipboard'; |
|
|
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 defaultSetting from '/@/settings/projectSetting'; |
|
|
|
|
|
|
|
|
|
|
|
import mixImg from '/@/assets/images/layout/menu-mix.svg'; |
|
|
|
|
|
import sidebarImg from '/@/assets/images/layout/menu-sidebar.svg'; |
|
|
|
|
|
import menuTopImg from '/@/assets/images/layout/menu-top.svg'; |
|
|
|
|
|
import { updateColorWeak, updateGrayMode } from '/@/setup/theme'; |
|
|
import { updateColorWeak, updateGrayMode } from '/@/setup/theme'; |
|
|
|
|
|
|
|
|
import { baseHandler } from './handler'; |
|
|
import { baseHandler } from './handler'; |
|
|
|
|
|
|
|
|
import { |
|
|
import { |
|
|
HandlerEnum, |
|
|
HandlerEnum, |
|
|
contentModeOptions, |
|
|
contentModeOptions, |
|
|
topMenuAlignOptions, |
|
|
topMenuAlignOptions, |
|
|
menuTriggerOptions, |
|
|
menuTriggerOptions, |
|
|
routerTransitionOptions, |
|
|
routerTransitionOptions, |
|
|
} from './const'; |
|
|
menuTypeList, |
|
|
|
|
|
} from './enum'; |
|
|
|
|
|
|
|
|
import { HEADER_PRESET_BG_COLOR_LIST, SIDE_BAR_BG_COLOR_LIST } from '/@/settings/colorSetting'; |
|
|
import { HEADER_PRESET_BG_COLOR_LIST, SIDE_BAR_BG_COLOR_LIST } from '/@/settings/colorSetting'; |
|
|
|
|
|
|
|
|
interface SwitchOptions { |
|
|
interface SwitchOptions { |
|
|
@ -40,215 +47,280 @@ interface SelectConfig { |
|
|
handler?: Fn; |
|
|
handler?: Fn; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
interface ThemeOptions { |
|
|
interface ThemePickerProps { |
|
|
def?: string; |
|
|
colorList: string[]; |
|
|
handler?: Fn; |
|
|
handler: Fn; |
|
|
|
|
|
def: string; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
const { createSuccessModal, createMessage } = useMessage(); |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* Menu type Picker comp |
|
|
|
|
|
*/ |
|
|
|
|
|
const MenuTypePicker: FunctionalComponent = () => { |
|
|
|
|
|
const { getIsHorizontal, getMenuType } = useMenuSetting(); |
|
|
|
|
|
return ( |
|
|
|
|
|
<div class={`setting-drawer__siderbar`}> |
|
|
|
|
|
{menuTypeList.map((item) => { |
|
|
|
|
|
const { title, type: ItemType, mode, src } = item; |
|
|
|
|
|
return ( |
|
|
|
|
|
<Tooltip title={title} placement="bottom" key={title}> |
|
|
|
|
|
{{ |
|
|
|
|
|
default: () => ( |
|
|
|
|
|
<div |
|
|
|
|
|
onClick={baseHandler.bind(null, HandlerEnum.CHANGE_LAYOUT, { |
|
|
|
|
|
mode: mode, |
|
|
|
|
|
type: ItemType, |
|
|
|
|
|
split: unref(getIsHorizontal) ? false : undefined, |
|
|
|
|
|
})} |
|
|
|
|
|
> |
|
|
|
|
|
<CheckOutlined |
|
|
|
|
|
class={['check-icon', unref(getMenuType) === ItemType ? 'active' : '']} |
|
|
|
|
|
/> |
|
|
|
|
|
<img src={src} /> |
|
|
|
|
|
</div> |
|
|
|
|
|
), |
|
|
|
|
|
}} |
|
|
|
|
|
</Tooltip> |
|
|
|
|
|
); |
|
|
|
|
|
})} |
|
|
|
|
|
</div> |
|
|
|
|
|
); |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
const ThemePicker: FunctionalComponent<ThemePickerProps> = (props) => { |
|
|
|
|
|
return ( |
|
|
|
|
|
<div class={`setting-drawer__theme-item`}> |
|
|
|
|
|
{props.colorList.map((color) => { |
|
|
|
|
|
return ( |
|
|
|
|
|
<span |
|
|
|
|
|
onClick={() => props.handler?.(color)} |
|
|
|
|
|
key={color} |
|
|
|
|
|
class={[props.def === color ? 'active' : '']} |
|
|
|
|
|
style={{ |
|
|
|
|
|
background: color, |
|
|
|
|
|
}} |
|
|
|
|
|
> |
|
|
|
|
|
<CheckOutlined class="icon" /> |
|
|
|
|
|
</span> |
|
|
|
|
|
); |
|
|
|
|
|
})} |
|
|
|
|
|
</div> |
|
|
|
|
|
); |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* 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 ( |
|
|
|
|
|
<div class="setting-drawer__footer"> |
|
|
|
|
|
<Button type="primary" block onClick={handleCopy}> |
|
|
|
|
|
{() => ( |
|
|
|
|
|
<> |
|
|
|
|
|
<CopyOutlined class="mr-2" /> |
|
|
|
|
|
拷贝 |
|
|
|
|
|
</> |
|
|
|
|
|
)} |
|
|
|
|
|
</Button> |
|
|
|
|
|
<Button block class="mt-2" onClick={handleResetSetting} color="warning"> |
|
|
|
|
|
{() => ( |
|
|
|
|
|
<> |
|
|
|
|
|
<RedoOutlined class="mr-2" /> |
|
|
|
|
|
重置 |
|
|
|
|
|
</> |
|
|
|
|
|
)} |
|
|
|
|
|
</Button> |
|
|
|
|
|
<Button block class="mt-2" onClick={handleClearAndRedo} color="error"> |
|
|
|
|
|
{() => ( |
|
|
|
|
|
<> |
|
|
|
|
|
<RedoOutlined class="mr-2" /> |
|
|
|
|
|
清空缓存并返回登录页 |
|
|
|
|
|
</> |
|
|
|
|
|
)} |
|
|
|
|
|
</Button> |
|
|
|
|
|
</div> |
|
|
|
|
|
); |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
export default defineComponent({ |
|
|
export default defineComponent({ |
|
|
name: 'SettingDrawer', |
|
|
name: 'SettingDrawer', |
|
|
setup(_, { attrs }) { |
|
|
setup(_, { attrs }) { |
|
|
const { createSuccessModal, createMessage } = useMessage(); |
|
|
const { |
|
|
|
|
|
getContentMode, |
|
|
|
|
|
getRouterTransition, |
|
|
|
|
|
getOpenRouterTransition, |
|
|
|
|
|
getOpenPageLoading, |
|
|
|
|
|
getShowFooter, |
|
|
|
|
|
getShowBreadCrumb, |
|
|
|
|
|
getShowBreadCrumbIcon, |
|
|
|
|
|
getShowLogo, |
|
|
|
|
|
getFullContent, |
|
|
|
|
|
getColorWeak, |
|
|
|
|
|
getGrayMode, |
|
|
|
|
|
} = useRootSetting(); |
|
|
|
|
|
|
|
|
const getProjectConfigRef = computed(() => { |
|
|
const { |
|
|
return appStore.getProjectConfig; |
|
|
getIsHorizontal, |
|
|
}); |
|
|
getShowMenu, |
|
|
|
|
|
getMenuType, |
|
|
|
|
|
getTrigger, |
|
|
|
|
|
getCollapsedShowTitle, |
|
|
|
|
|
getMenuFixed, |
|
|
|
|
|
getCollapsed, |
|
|
|
|
|
getShowSearch, |
|
|
|
|
|
getHasDrag, |
|
|
|
|
|
getTopMenuAlign, |
|
|
|
|
|
getAccordion, |
|
|
|
|
|
getMenuWidth, |
|
|
|
|
|
getMenuBgColor, |
|
|
|
|
|
getIsTopMenu, |
|
|
|
|
|
getSplit, |
|
|
|
|
|
} = useMenuSetting(); |
|
|
|
|
|
|
|
|
const getIsHorizontalRef = computed(() => { |
|
|
const { getShowHeader, getFixed: getHeaderFixed, getHeaderBgColor } = useHeaderSetting(); |
|
|
return unref(getProjectConfigRef).menuSetting.mode === MenuModeEnum.HORIZONTAL; |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
const getShowHeaderRef = computed(() => { |
|
|
const { getShowMultipleTab, getShowQuick } = useMultipleTabSetting(); |
|
|
return unref(getProjectConfigRef).headerSetting.show; |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
const getShowMenuRef = computed(() => { |
|
|
const getShowMenuRef = computed(() => { |
|
|
return unref(getProjectConfigRef).menuSetting.show && !unref(getIsHorizontalRef); |
|
|
return unref(getShowMenu) && !unref(getIsHorizontal); |
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
const getShowTabsRef = computed(() => { |
|
|
function renderSidebar() { |
|
|
return unref(getProjectConfigRef).multiTabsSetting.show; |
|
|
return ( |
|
|
}); |
|
|
<> |
|
|
|
|
|
<MenuTypePicker /> |
|
|
function handleCopy() { |
|
|
{renderSwitchItem('分割菜单', { |
|
|
const { isSuccessRef } = useCopyToClipboard( |
|
|
handler: (e) => { |
|
|
JSON.stringify(unref(getProjectConfigRef), null, 2) |
|
|
baseHandler(HandlerEnum.MENU_SPLIT, e); |
|
|
|
|
|
}, |
|
|
|
|
|
def: unref(getSplit), |
|
|
|
|
|
disabled: !unref(getShowMenuRef) || unref(getMenuType) !== MenuTypeEnum.MIX, |
|
|
|
|
|
})} |
|
|
|
|
|
</> |
|
|
); |
|
|
); |
|
|
unref(isSuccessRef) && |
|
|
|
|
|
createSuccessModal({ |
|
|
|
|
|
title: '操作成功', |
|
|
|
|
|
content: '复制成功,请到 src/settings/projectSetting.ts 中修改配置!', |
|
|
|
|
|
}); |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
function handleResetSetting() { |
|
|
function renderTheme() { |
|
|
try { |
|
|
return ( |
|
|
appStore.commitProjectConfigState(defaultSetting); |
|
|
<> |
|
|
const { colorWeak, grayMode } = defaultSetting; |
|
|
<Divider>{() => '顶栏主题'}</Divider> |
|
|
// updateTheme(themeColor);
|
|
|
<ThemePicker |
|
|
updateColorWeak(colorWeak); |
|
|
colorList={HEADER_PRESET_BG_COLOR_LIST} |
|
|
updateGrayMode(grayMode); |
|
|
def={unref(getHeaderBgColor)} |
|
|
createMessage.success('重置成功!'); |
|
|
handler={(e) => { |
|
|
} catch (error) { |
|
|
baseHandler(HandlerEnum.HEADER_THEME, e); |
|
|
createMessage.error(error); |
|
|
}} |
|
|
} |
|
|
/> |
|
|
} |
|
|
<Divider>{() => '菜单主题'}</Divider> |
|
|
|
|
|
<ThemePicker |
|
|
function handleClearAndRedo() { |
|
|
colorList={SIDE_BAR_BG_COLOR_LIST} |
|
|
localStorage.clear(); |
|
|
def={unref(getMenuBgColor)} |
|
|
appStore.resumeAllState(); |
|
|
handler={(e) => { |
|
|
location.reload(); |
|
|
baseHandler(HandlerEnum.MENU_THEME, e); |
|
|
|
|
|
}} |
|
|
|
|
|
/> |
|
|
|
|
|
</> |
|
|
|
|
|
); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
function renderSidebar() { |
|
|
|
|
|
const { |
|
|
|
|
|
menuSetting: { type, split }, |
|
|
|
|
|
} = unref(getProjectConfigRef); |
|
|
|
|
|
|
|
|
|
|
|
const typeList = ref([ |
|
|
|
|
|
{ |
|
|
|
|
|
title: '左侧菜单模式', |
|
|
|
|
|
mode: MenuModeEnum.INLINE, |
|
|
|
|
|
type: MenuTypeEnum.SIDEBAR, |
|
|
|
|
|
src: sidebarImg, |
|
|
|
|
|
}, |
|
|
|
|
|
{ |
|
|
|
|
|
title: '混合模式', |
|
|
|
|
|
mode: MenuModeEnum.INLINE, |
|
|
|
|
|
type: MenuTypeEnum.MIX, |
|
|
|
|
|
src: mixImg, |
|
|
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
{ |
|
|
|
|
|
title: '顶部菜单模式', |
|
|
|
|
|
mode: MenuModeEnum.HORIZONTAL, |
|
|
|
|
|
type: MenuTypeEnum.TOP_MENU, |
|
|
|
|
|
src: menuTopImg, |
|
|
|
|
|
}, |
|
|
|
|
|
]); |
|
|
|
|
|
return [ |
|
|
|
|
|
<div class={`setting-drawer__siderbar`}> |
|
|
|
|
|
{unref(typeList).map((item) => { |
|
|
|
|
|
const { title, type: ItemType, mode, src } = item; |
|
|
|
|
|
return ( |
|
|
|
|
|
<Tooltip title={title} placement="bottom" key={title}> |
|
|
|
|
|
{{ |
|
|
|
|
|
default: () => ( |
|
|
|
|
|
<div |
|
|
|
|
|
onClick={baseHandler.bind(null, HandlerEnum.CHANGE_LAYOUT, { |
|
|
|
|
|
mode: mode, |
|
|
|
|
|
type: ItemType, |
|
|
|
|
|
split: unref(getIsHorizontalRef) ? false : undefined, |
|
|
|
|
|
})} |
|
|
|
|
|
> |
|
|
|
|
|
<CheckOutlined class={['check-icon', type === ItemType ? 'active' : '']} /> |
|
|
|
|
|
<img src={src} /> |
|
|
|
|
|
</div> |
|
|
|
|
|
), |
|
|
|
|
|
}} |
|
|
|
|
|
</Tooltip> |
|
|
|
|
|
); |
|
|
|
|
|
})} |
|
|
|
|
|
</div>, |
|
|
|
|
|
renderSwitchItem('分割菜单', { |
|
|
|
|
|
handler: (e) => { |
|
|
|
|
|
baseHandler(HandlerEnum.MENU_SPLIT, e); |
|
|
|
|
|
}, |
|
|
|
|
|
def: split, |
|
|
|
|
|
disabled: !unref(getShowMenuRef) || type !== MenuTypeEnum.MIX, |
|
|
|
|
|
}), |
|
|
|
|
|
// renderSelectItem('顶栏主题', {
|
|
|
|
|
|
// handler: (e) => {
|
|
|
|
|
|
// baseHandler(HandlerEnum.HEADER_THEME, e);
|
|
|
|
|
|
// },
|
|
|
|
|
|
// def: headerTheme,
|
|
|
|
|
|
// options: themeOptions,
|
|
|
|
|
|
// disabled: !unref(getShowHeaderRef),
|
|
|
|
|
|
// }),
|
|
|
|
|
|
// renderSelectItem('菜单主题', {
|
|
|
|
|
|
// handler: (e) => {
|
|
|
|
|
|
// baseHandler(HandlerEnum.MENU_THEME, e);
|
|
|
|
|
|
// },
|
|
|
|
|
|
// def: menuTheme,
|
|
|
|
|
|
// options: themeOptions,
|
|
|
|
|
|
// disabled: !unref(getShowMenuRef),
|
|
|
|
|
|
// }),
|
|
|
|
|
|
]; |
|
|
|
|
|
} |
|
|
|
|
|
/** |
|
|
/** |
|
|
* @description: |
|
|
* @description: |
|
|
*/ |
|
|
*/ |
|
|
function renderFeatures() { |
|
|
function renderFeatures() { |
|
|
const { |
|
|
|
|
|
contentMode, |
|
|
|
|
|
headerSetting: { fixed }, |
|
|
|
|
|
menuSetting: { |
|
|
|
|
|
hasDrag, |
|
|
|
|
|
collapsed, |
|
|
|
|
|
showSearch, |
|
|
|
|
|
menuWidth, |
|
|
|
|
|
topMenuAlign, |
|
|
|
|
|
collapsedShowTitle, |
|
|
|
|
|
trigger, |
|
|
|
|
|
accordion, |
|
|
|
|
|
} = {}, |
|
|
|
|
|
} = appStore.getProjectConfig; |
|
|
|
|
|
return [ |
|
|
return [ |
|
|
renderSwitchItem('侧边菜单拖拽', { |
|
|
renderSwitchItem('侧边菜单拖拽', { |
|
|
handler: (e) => { |
|
|
handler: (e) => { |
|
|
baseHandler(HandlerEnum.MENU_HAS_DRAG, e); |
|
|
baseHandler(HandlerEnum.MENU_HAS_DRAG, e); |
|
|
}, |
|
|
}, |
|
|
def: hasDrag, |
|
|
def: unref(getHasDrag), |
|
|
disabled: !unref(getShowMenuRef), |
|
|
disabled: !unref(getShowMenuRef), |
|
|
}), |
|
|
}), |
|
|
renderSwitchItem('侧边菜单搜索', { |
|
|
renderSwitchItem('侧边菜单搜索', { |
|
|
handler: (e) => { |
|
|
handler: (e) => { |
|
|
baseHandler(HandlerEnum.MENU_SHOW_SEARCH, e); |
|
|
baseHandler(HandlerEnum.MENU_SHOW_SEARCH, e); |
|
|
}, |
|
|
}, |
|
|
def: showSearch, |
|
|
def: unref(getShowSearch), |
|
|
disabled: !unref(getShowMenuRef), |
|
|
disabled: !unref(getShowMenuRef), |
|
|
}), |
|
|
}), |
|
|
renderSwitchItem('侧边菜单手风琴模式', { |
|
|
renderSwitchItem('侧边菜单手风琴模式', { |
|
|
handler: (e) => { |
|
|
handler: (e) => { |
|
|
baseHandler(HandlerEnum.MENU_ACCORDION, e); |
|
|
baseHandler(HandlerEnum.MENU_ACCORDION, e); |
|
|
}, |
|
|
}, |
|
|
def: accordion, |
|
|
def: unref(getAccordion), |
|
|
disabled: !unref(getShowMenuRef), |
|
|
disabled: !unref(getShowMenuRef), |
|
|
}), |
|
|
}), |
|
|
renderSwitchItem('折叠菜单', { |
|
|
renderSwitchItem('折叠菜单', { |
|
|
handler: (e) => { |
|
|
handler: (e) => { |
|
|
baseHandler(HandlerEnum.MENU_COLLAPSED, e); |
|
|
baseHandler(HandlerEnum.MENU_COLLAPSED, e); |
|
|
}, |
|
|
}, |
|
|
def: collapsed, |
|
|
def: unref(getCollapsed), |
|
|
disabled: !unref(getShowMenuRef), |
|
|
disabled: !unref(getShowMenuRef), |
|
|
}), |
|
|
}), |
|
|
renderSwitchItem('折叠菜单显示名称', { |
|
|
renderSwitchItem('折叠菜单显示名称', { |
|
|
handler: (e) => { |
|
|
handler: (e) => { |
|
|
baseHandler(HandlerEnum.MENU_COLLAPSED_SHOW_TITLE, e); |
|
|
baseHandler(HandlerEnum.MENU_COLLAPSED_SHOW_TITLE, e); |
|
|
}, |
|
|
}, |
|
|
def: collapsedShowTitle, |
|
|
def: unref(getCollapsedShowTitle), |
|
|
disabled: !unref(getShowMenuRef) || !collapsed, |
|
|
disabled: !unref(getShowMenuRef) || !unref(getCollapsed), |
|
|
}), |
|
|
}), |
|
|
renderSwitchItem('固定header', { |
|
|
renderSwitchItem('固定header', { |
|
|
handler: (e) => { |
|
|
handler: (e) => { |
|
|
baseHandler(HandlerEnum.HEADER_FIXED, e); |
|
|
baseHandler(HandlerEnum.HEADER_FIXED, e); |
|
|
}, |
|
|
}, |
|
|
def: fixed, |
|
|
def: unref(getHeaderFixed), |
|
|
disabled: !unref(getShowHeaderRef), |
|
|
disabled: !unref(getShowHeader), |
|
|
|
|
|
}), |
|
|
|
|
|
renderSwitchItem('固定Siderbar', { |
|
|
|
|
|
handler: (e) => { |
|
|
|
|
|
baseHandler(HandlerEnum.MENU_FIXED, e); |
|
|
|
|
|
}, |
|
|
|
|
|
def: unref(getMenuFixed), |
|
|
|
|
|
disabled: !unref(getShowMenuRef), |
|
|
}), |
|
|
}), |
|
|
renderSelectItem('顶部菜单布局', { |
|
|
renderSelectItem('顶部菜单布局', { |
|
|
handler: (e) => { |
|
|
handler: (e) => { |
|
|
baseHandler(HandlerEnum.MENU_TOP_ALIGN, e); |
|
|
baseHandler(HandlerEnum.MENU_TOP_ALIGN, e); |
|
|
}, |
|
|
}, |
|
|
def: topMenuAlign, |
|
|
def: unref(getTopMenuAlign), |
|
|
options: topMenuAlignOptions, |
|
|
options: topMenuAlignOptions, |
|
|
disabled: !unref(getShowHeaderRef), |
|
|
disabled: !unref(getShowHeader) || (!unref(getIsTopMenu) && !unref(getSplit)), |
|
|
}), |
|
|
}), |
|
|
renderSelectItem('菜单折叠按钮', { |
|
|
renderSelectItem('菜单折叠按钮', { |
|
|
handler: (e) => { |
|
|
handler: (e) => { |
|
|
baseHandler(HandlerEnum.MENU_TRIGGER, e); |
|
|
baseHandler(HandlerEnum.MENU_TRIGGER, e); |
|
|
}, |
|
|
}, |
|
|
def: trigger, |
|
|
disabled: !unref(getShowMenuRef), |
|
|
|
|
|
def: unref(getTrigger), |
|
|
options: menuTriggerOptions, |
|
|
options: menuTriggerOptions, |
|
|
}), |
|
|
}), |
|
|
|
|
|
|
|
|
@ -256,7 +328,7 @@ export default defineComponent({ |
|
|
handler: (e) => { |
|
|
handler: (e) => { |
|
|
baseHandler(HandlerEnum.CONTENT_MODE, e); |
|
|
baseHandler(HandlerEnum.CONTENT_MODE, e); |
|
|
}, |
|
|
}, |
|
|
def: contentMode, |
|
|
def: unref(getContentMode), |
|
|
options: contentModeOptions, |
|
|
options: contentModeOptions, |
|
|
}), |
|
|
}), |
|
|
<div class={`setting-drawer__cell-item`}> |
|
|
<div class={`setting-drawer__cell-item`}> |
|
|
@ -286,7 +358,7 @@ export default defineComponent({ |
|
|
min={100} |
|
|
min={100} |
|
|
step={10} |
|
|
step={10} |
|
|
disabled={!unref(getShowMenuRef)} |
|
|
disabled={!unref(getShowMenuRef)} |
|
|
defaultValue={menuWidth} |
|
|
defaultValue={unref(getMenuWidth)} |
|
|
formatter={(value: string) => `${parseInt(value)}px`} |
|
|
formatter={(value: string) => `${parseInt(value)}px`} |
|
|
onChange={(e: any) => { |
|
|
onChange={(e: any) => { |
|
|
baseHandler(HandlerEnum.MENU_WIDTH, e); |
|
|
baseHandler(HandlerEnum.MENU_WIDTH, e); |
|
|
@ -295,121 +367,112 @@ export default defineComponent({ |
|
|
</div>, |
|
|
</div>, |
|
|
]; |
|
|
]; |
|
|
} |
|
|
} |
|
|
function renderTransition() { |
|
|
|
|
|
const { routerTransition, openRouterTransition, openPageLoading } = appStore.getProjectConfig; |
|
|
|
|
|
|
|
|
|
|
|
return ( |
|
|
|
|
|
<> |
|
|
|
|
|
{renderSwitchItem('页面切换loading', { |
|
|
|
|
|
handler: (e) => { |
|
|
|
|
|
baseHandler(HandlerEnum.OPEN_PAGE_LOADING, e); |
|
|
|
|
|
}, |
|
|
|
|
|
def: openPageLoading, |
|
|
|
|
|
})} |
|
|
|
|
|
{renderSwitchItem('切换动画', { |
|
|
|
|
|
handler: (e) => { |
|
|
|
|
|
baseHandler(HandlerEnum.OPEN_ROUTE_TRANSITION, e); |
|
|
|
|
|
}, |
|
|
|
|
|
def: openRouterTransition, |
|
|
|
|
|
})} |
|
|
|
|
|
{renderSelectItem('路由动画', { |
|
|
|
|
|
handler: (e) => { |
|
|
|
|
|
baseHandler(HandlerEnum.ROUTER_TRANSITION, e); |
|
|
|
|
|
}, |
|
|
|
|
|
def: routerTransition, |
|
|
|
|
|
options: routerTransitionOptions, |
|
|
|
|
|
disabled: !openRouterTransition, |
|
|
|
|
|
})} |
|
|
|
|
|
</> |
|
|
|
|
|
); |
|
|
|
|
|
} |
|
|
|
|
|
function renderContent() { |
|
|
function renderContent() { |
|
|
const { |
|
|
|
|
|
grayMode, |
|
|
|
|
|
colorWeak, |
|
|
|
|
|
fullContent, |
|
|
|
|
|
showLogo, |
|
|
|
|
|
headerSetting: { show: showHeader }, |
|
|
|
|
|
menuSetting: { show: showMenu }, |
|
|
|
|
|
multiTabsSetting: { show: showMultiple, showQuick, showIcon: showTabIcon }, |
|
|
|
|
|
showBreadCrumb, |
|
|
|
|
|
showBreadCrumbIcon, |
|
|
|
|
|
} = unref(getProjectConfigRef); |
|
|
|
|
|
return [ |
|
|
return [ |
|
|
renderSwitchItem('面包屑', { |
|
|
renderSwitchItem('面包屑', { |
|
|
handler: (e) => { |
|
|
handler: (e) => { |
|
|
baseHandler(HandlerEnum.SHOW_BREADCRUMB, e); |
|
|
baseHandler(HandlerEnum.SHOW_BREADCRUMB, e); |
|
|
}, |
|
|
}, |
|
|
def: showBreadCrumb, |
|
|
def: unref(getShowBreadCrumb), |
|
|
disabled: !unref(getShowHeaderRef), |
|
|
disabled: !unref(getShowHeader), |
|
|
}), |
|
|
}), |
|
|
renderSwitchItem('面包屑图标', { |
|
|
renderSwitchItem('面包屑图标', { |
|
|
handler: (e) => { |
|
|
handler: (e) => { |
|
|
baseHandler(HandlerEnum.SHOW_BREADCRUMB_ICON, e); |
|
|
baseHandler(HandlerEnum.SHOW_BREADCRUMB_ICON, e); |
|
|
}, |
|
|
}, |
|
|
def: showBreadCrumbIcon, |
|
|
def: unref(getShowBreadCrumbIcon), |
|
|
disabled: !unref(getShowHeaderRef), |
|
|
disabled: !unref(getShowHeader), |
|
|
}), |
|
|
}), |
|
|
renderSwitchItem('标签页', { |
|
|
renderSwitchItem('标签页', { |
|
|
handler: (e) => { |
|
|
handler: (e) => { |
|
|
baseHandler(HandlerEnum.TABS_SHOW, e); |
|
|
baseHandler(HandlerEnum.TABS_SHOW, e); |
|
|
}, |
|
|
}, |
|
|
def: showMultiple, |
|
|
def: unref(getShowMultipleTab), |
|
|
}), |
|
|
}), |
|
|
renderSwitchItem('标签页快捷按钮', { |
|
|
renderSwitchItem('标签页快捷按钮', { |
|
|
handler: (e) => { |
|
|
handler: (e) => { |
|
|
baseHandler(HandlerEnum.TABS_SHOW_QUICK, e); |
|
|
baseHandler(HandlerEnum.TABS_SHOW_QUICK, e); |
|
|
}, |
|
|
}, |
|
|
def: showQuick, |
|
|
def: unref(getShowQuick), |
|
|
disabled: !unref(getShowTabsRef), |
|
|
disabled: !unref(getShowMultipleTab), |
|
|
}), |
|
|
|
|
|
renderSwitchItem('标签页图标', { |
|
|
|
|
|
handler: (e) => { |
|
|
|
|
|
baseHandler(HandlerEnum.TABS_SHOW_ICON, e); |
|
|
|
|
|
}, |
|
|
|
|
|
def: showTabIcon, |
|
|
|
|
|
disabled: !unref(getShowTabsRef), |
|
|
|
|
|
}), |
|
|
}), |
|
|
|
|
|
|
|
|
renderSwitchItem('左侧菜单', { |
|
|
renderSwitchItem('左侧菜单', { |
|
|
handler: (e) => { |
|
|
handler: (e) => { |
|
|
baseHandler(HandlerEnum.MENU_SHOW_SIDEBAR, e); |
|
|
baseHandler(HandlerEnum.MENU_SHOW_SIDEBAR, e); |
|
|
}, |
|
|
}, |
|
|
def: showMenu, |
|
|
def: unref(getShowMenu), |
|
|
disabled: unref(getIsHorizontalRef), |
|
|
disabled: unref(getIsHorizontal), |
|
|
}), |
|
|
}), |
|
|
renderSwitchItem('顶栏', { |
|
|
renderSwitchItem('顶栏', { |
|
|
handler: (e) => { |
|
|
handler: (e) => { |
|
|
baseHandler(HandlerEnum.HEADER_SHOW, e); |
|
|
baseHandler(HandlerEnum.HEADER_SHOW, e); |
|
|
}, |
|
|
}, |
|
|
def: showHeader, |
|
|
def: unref(getShowHeader), |
|
|
}), |
|
|
}), |
|
|
renderSwitchItem('Logo', { |
|
|
renderSwitchItem('Logo', { |
|
|
handler: (e) => { |
|
|
handler: (e) => { |
|
|
baseHandler(HandlerEnum.SHOW_LOGO, e); |
|
|
baseHandler(HandlerEnum.SHOW_LOGO, e); |
|
|
}, |
|
|
}, |
|
|
def: showLogo, |
|
|
def: unref(getShowLogo), |
|
|
|
|
|
}), |
|
|
|
|
|
renderSwitchItem('页脚', { |
|
|
|
|
|
handler: (e) => { |
|
|
|
|
|
baseHandler(HandlerEnum.SHOW_FOOTER, e); |
|
|
|
|
|
}, |
|
|
|
|
|
def: unref(getShowFooter), |
|
|
}), |
|
|
}), |
|
|
renderSwitchItem('全屏内容', { |
|
|
renderSwitchItem('全屏内容', { |
|
|
handler: (e) => { |
|
|
handler: (e) => { |
|
|
baseHandler(HandlerEnum.FULL_CONTENT, e); |
|
|
baseHandler(HandlerEnum.FULL_CONTENT, e); |
|
|
}, |
|
|
}, |
|
|
def: fullContent, |
|
|
def: unref(getFullContent), |
|
|
}), |
|
|
}), |
|
|
renderSwitchItem('灰色模式', { |
|
|
renderSwitchItem('灰色模式', { |
|
|
handler: (e) => { |
|
|
handler: (e) => { |
|
|
baseHandler(HandlerEnum.GRAY_MODE, e); |
|
|
baseHandler(HandlerEnum.GRAY_MODE, e); |
|
|
}, |
|
|
}, |
|
|
def: grayMode, |
|
|
def: unref(getGrayMode), |
|
|
}), |
|
|
}), |
|
|
renderSwitchItem('色弱模式', { |
|
|
renderSwitchItem('色弱模式', { |
|
|
handler: (e) => { |
|
|
handler: (e) => { |
|
|
baseHandler(HandlerEnum.COLOR_WEAK, e); |
|
|
baseHandler(HandlerEnum.COLOR_WEAK, e); |
|
|
}, |
|
|
}, |
|
|
def: colorWeak, |
|
|
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) { |
|
|
function renderSelectItem(text: string, config?: SelectConfig) { |
|
|
const { handler, def, disabled = false, options } = config || {}; |
|
|
const { handler, def, disabled = false, options } = config || {}; |
|
|
const opt = def ? { value: def, defaultValue: def } : {}; |
|
|
const opt = def ? { value: def, defaultValue: def } : {}; |
|
|
@ -449,50 +512,6 @@ export default defineComponent({ |
|
|
); |
|
|
); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
function renderTheme() { |
|
|
|
|
|
const { headerBgColor, menuBgColor } = unref(getProjectConfigRef); |
|
|
|
|
|
return ( |
|
|
|
|
|
<> |
|
|
|
|
|
<Divider>{() => '顶栏主题'}</Divider> |
|
|
|
|
|
{renderThemeItem(HEADER_PRESET_BG_COLOR_LIST, { |
|
|
|
|
|
def: headerBgColor, |
|
|
|
|
|
handler: (e) => { |
|
|
|
|
|
baseHandler(HandlerEnum.HEADER_THEME, e); |
|
|
|
|
|
}, |
|
|
|
|
|
})} |
|
|
|
|
|
<Divider>{() => '菜单主题'}</Divider> |
|
|
|
|
|
{renderThemeItem(SIDE_BAR_BG_COLOR_LIST, { |
|
|
|
|
|
def: menuBgColor, |
|
|
|
|
|
handler: (e) => { |
|
|
|
|
|
baseHandler(HandlerEnum.MENU_THEME, e); |
|
|
|
|
|
}, |
|
|
|
|
|
})} |
|
|
|
|
|
</> |
|
|
|
|
|
); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
function renderThemeItem(colorList: string[], opt: ThemeOptions) { |
|
|
|
|
|
const { def, handler } = opt; |
|
|
|
|
|
return ( |
|
|
|
|
|
<div class={`setting-drawer__theme-item`}> |
|
|
|
|
|
{colorList.map((item) => { |
|
|
|
|
|
return ( |
|
|
|
|
|
<span |
|
|
|
|
|
onClick={() => handler && handler(item)} |
|
|
|
|
|
key={item} |
|
|
|
|
|
class={[def === item ? 'active' : '']} |
|
|
|
|
|
style={{ |
|
|
|
|
|
background: item, |
|
|
|
|
|
}} |
|
|
|
|
|
> |
|
|
|
|
|
<CheckOutlined class="icon" /> |
|
|
|
|
|
</span> |
|
|
|
|
|
); |
|
|
|
|
|
})} |
|
|
|
|
|
</div> |
|
|
|
|
|
); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return () => ( |
|
|
return () => ( |
|
|
<BasicDrawer {...attrs} title="项目配置" width={300} wrapClassName="setting-drawer"> |
|
|
<BasicDrawer {...attrs} title="项目配置" width={300} wrapClassName="setting-drawer"> |
|
|
{{ |
|
|
{{ |
|
|
@ -500,9 +519,7 @@ export default defineComponent({ |
|
|
<> |
|
|
<> |
|
|
<Divider>{() => '导航栏模式'}</Divider> |
|
|
<Divider>{() => '导航栏模式'}</Divider> |
|
|
{renderSidebar()} |
|
|
{renderSidebar()} |
|
|
|
|
|
|
|
|
{renderTheme()} |
|
|
{renderTheme()} |
|
|
|
|
|
|
|
|
<Divider>{() => '界面功能'}</Divider> |
|
|
<Divider>{() => '界面功能'}</Divider> |
|
|
{renderFeatures()} |
|
|
{renderFeatures()} |
|
|
<Divider>{() => '界面显示'}</Divider> |
|
|
<Divider>{() => '界面显示'}</Divider> |
|
|
@ -510,32 +527,7 @@ export default defineComponent({ |
|
|
<Divider>{() => '切换动画'}</Divider> |
|
|
<Divider>{() => '切换动画'}</Divider> |
|
|
{renderTransition()} |
|
|
{renderTransition()} |
|
|
<Divider /> |
|
|
<Divider /> |
|
|
<div class="setting-drawer__footer"> |
|
|
<FooterButton /> |
|
|
<Button type="primary" block onClick={handleCopy}> |
|
|
|
|
|
{() => ( |
|
|
|
|
|
<> |
|
|
|
|
|
<CopyOutlined class="mr-2" /> |
|
|
|
|
|
拷贝 |
|
|
|
|
|
</> |
|
|
|
|
|
)} |
|
|
|
|
|
</Button> |
|
|
|
|
|
<Button block class="mt-2" onClick={handleResetSetting} color="warning"> |
|
|
|
|
|
{() => ( |
|
|
|
|
|
<> |
|
|
|
|
|
<RedoOutlined class="mr-2" /> |
|
|
|
|
|
重置 |
|
|
|
|
|
</> |
|
|
|
|
|
)} |
|
|
|
|
|
</Button> |
|
|
|
|
|
<Button block class="mt-2" onClick={handleClearAndRedo} color="error"> |
|
|
|
|
|
{() => ( |
|
|
|
|
|
<> |
|
|
|
|
|
<RedoOutlined class="mr-2" /> |
|
|
|
|
|
清空缓存并返回登录页 |
|
|
|
|
|
</> |
|
|
|
|
|
)} |
|
|
|
|
|
</Button> |
|
|
|
|
|
</div> |
|
|
|
|
|
</> |
|
|
</> |
|
|
), |
|
|
), |
|
|
}} |
|
|
}} |
|
|
|