SettingDrawer.tsx 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433
  1. import { defineComponent, computed, unref } from 'vue';
  2. import { BasicDrawer } from '/@/components/Drawer/index';
  3. import { Divider } from 'ant-design-vue';
  4. import {
  5. TypePicker,
  6. ThemeColorPicker,
  7. SettingFooter,
  8. SwitchItem,
  9. SelectItem,
  10. InputNumberItem,
  11. } from './components';
  12. import { AppDarkModeToggle } from '/@/components/Application';
  13. import { MenuTypeEnum, TriggerEnum } from '/@/enums/menuEnum';
  14. import { useRootSetting } from '/@/hooks/setting/useRootSetting';
  15. import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';
  16. import { useHeaderSetting } from '/@/hooks/setting/useHeaderSetting';
  17. import { useMultipleTabSetting } from '/@/hooks/setting/useMultipleTabSetting';
  18. import { useTransitionSetting } from '/@/hooks/setting/useTransitionSetting';
  19. import { useI18n } from '/@/hooks/web/useI18n';
  20. import { baseHandler } from './handler';
  21. import {
  22. HandlerEnum,
  23. contentModeOptions,
  24. topMenuAlignOptions,
  25. getMenuTriggerOptions,
  26. routerTransitionOptions,
  27. menuTypeList,
  28. mixSidebarTriggerOptions,
  29. tabsThemeOptions,
  30. } from './enum'
  31. import {
  32. HEADER_PRESET_BG_COLOR_LIST,
  33. SIDE_BAR_BG_COLOR_LIST,
  34. APP_PRESET_COLOR_LIST,
  35. } from '/@/settings/designSetting';
  36. const { t } = useI18n();
  37. export default defineComponent({
  38. name: 'SettingDrawer',
  39. setup(_, { attrs }) {
  40. const {
  41. getContentMode,
  42. getShowFooter,
  43. getShowBreadCrumb,
  44. getShowBreadCrumbIcon,
  45. getShowLogo,
  46. getFullContent,
  47. getColorWeak,
  48. getGrayMode,
  49. getLockTime,
  50. getShowDarkModeToggle,
  51. getThemeColor,
  52. } = useRootSetting();
  53. const { getOpenPageLoading, getBasicTransition, getEnableTransition, getOpenNProgress } =
  54. useTransitionSetting();
  55. const {
  56. getIsHorizontal,
  57. getShowMenu,
  58. getMenuType,
  59. getTrigger,
  60. getCollapsedShowTitle,
  61. getMenuFixed,
  62. getCollapsed,
  63. getCanDrag,
  64. getTopMenuAlign,
  65. getAccordion,
  66. getMenuWidth,
  67. getMenuBgColor,
  68. getIsTopMenu,
  69. getSplit,
  70. getIsMixSidebar,
  71. getCloseMixSidebarOnChange,
  72. getMixSideTrigger,
  73. getMixSideFixed,
  74. } = useMenuSetting();
  75. const {
  76. getShowHeader,
  77. getFixed: getHeaderFixed,
  78. getHeaderBgColor,
  79. getShowSearch,
  80. } = useHeaderSetting();
  81. const { getShowMultipleTab, getShowQuick, getShowRedo, getShowFold, getTabsTheme } = useMultipleTabSetting()
  82. const getShowMenuRef = computed(() => {
  83. return unref(getShowMenu) && !unref(getIsHorizontal);
  84. });
  85. function renderSidebar() {
  86. return (
  87. <>
  88. <TypePicker
  89. menuTypeList={menuTypeList}
  90. handler={(item: typeof menuTypeList[0]) => {
  91. baseHandler(HandlerEnum.CHANGE_LAYOUT, {
  92. mode: item.mode,
  93. type: item.type,
  94. split: unref(getIsHorizontal) ? false : undefined,
  95. });
  96. }}
  97. def={unref(getMenuType)}
  98. />
  99. </>
  100. );
  101. }
  102. function renderHeaderTheme() {
  103. return (
  104. <ThemeColorPicker
  105. colorList={HEADER_PRESET_BG_COLOR_LIST}
  106. def={unref(getHeaderBgColor)}
  107. event={HandlerEnum.HEADER_THEME}
  108. />
  109. );
  110. }
  111. function renderSiderTheme() {
  112. return (
  113. <ThemeColorPicker
  114. colorList={SIDE_BAR_BG_COLOR_LIST}
  115. def={unref(getMenuBgColor)}
  116. event={HandlerEnum.MENU_THEME}
  117. />
  118. );
  119. }
  120. function renderMainTheme() {
  121. return (
  122. <ThemeColorPicker
  123. colorList={APP_PRESET_COLOR_LIST}
  124. def={unref(getThemeColor)}
  125. event={HandlerEnum.CHANGE_THEME_COLOR}
  126. />
  127. );
  128. }
  129. /**
  130. * @description:
  131. */
  132. function renderFeatures() {
  133. let triggerDef = unref(getTrigger);
  134. const triggerOptions = getMenuTriggerOptions(unref(getSplit));
  135. const some = triggerOptions.some((item) => item.value === triggerDef);
  136. if (!some) {
  137. triggerDef = TriggerEnum.FOOTER;
  138. }
  139. return (
  140. <>
  141. <SwitchItem
  142. title={t('layout.setting.splitMenu')}
  143. event={HandlerEnum.MENU_SPLIT}
  144. def={unref(getSplit)}
  145. disabled={!unref(getShowMenuRef) || unref(getMenuType) !== MenuTypeEnum.MIX}
  146. />
  147. {/*<SwitchItem*/}
  148. {/* title={t('layout.setting.mixSidebarFixed')}*/}
  149. {/* event={HandlerEnum.MENU_FIXED_MIX_SIDEBAR}*/}
  150. {/* def={unref(getMixSideFixed)}*/}
  151. {/* disabled={!unref(getIsMixSidebar)}*/}
  152. {/*/>*/}
  153. {/*<SwitchItem*/}
  154. {/* title={t('layout.setting.closeMixSidebarOnChange')}*/}
  155. {/* event={HandlerEnum.MENU_CLOSE_MIX_SIDEBAR_ON_CHANGE}*/}
  156. {/* def={unref(getCloseMixSidebarOnChange)}*/}
  157. {/* disabled={!unref(getIsMixSidebar)}*/}
  158. {/*/>*/}
  159. {/*<SwitchItem*/}
  160. {/* title={t('layout.setting.menuCollapse')}*/}
  161. {/* event={HandlerEnum.MENU_COLLAPSED}*/}
  162. {/* def={unref(getCollapsed)}*/}
  163. {/* disabled={!unref(getShowMenuRef)}*/}
  164. {/*/>*/}
  165. {/*<SwitchItem*/}
  166. {/* title={t('layout.setting.menuSearch')}*/}
  167. {/* event={HandlerEnum.HEADER_SEARCH}*/}
  168. {/* def={unref(getShowSearch)}*/}
  169. {/* disabled={!unref(getShowHeader)}*/}
  170. {/*/>*/}
  171. {/*<SwitchItem*/}
  172. {/* title={t('layout.setting.menuAccordion')}*/}
  173. {/* event={HandlerEnum.MENU_ACCORDION}*/}
  174. {/* def={unref(getAccordion)}*/}
  175. {/* disabled={!unref(getShowMenuRef)}*/}
  176. {/*/>*/}
  177. {/*<SwitchItem*/}
  178. {/* title={t('layout.setting.fixedHeader')}*/}
  179. {/* event={HandlerEnum.HEADER_FIXED}*/}
  180. {/* def={unref(getHeaderFixed)}*/}
  181. {/* disabled={!unref(getShowHeader)}*/}
  182. {/*/>*/}
  183. {/*<SwitchItem*/}
  184. {/* title={t('layout.setting.fixedSideBar')}*/}
  185. {/* event={HandlerEnum.MENU_FIXED}*/}
  186. {/* def={unref(getMenuFixed)}*/}
  187. {/* disabled={!unref(getShowMenuRef) || unref(getIsMixSidebar)}*/}
  188. {/*/>*/}
  189. {/*<SelectItem*/}
  190. {/* title={t('layout.setting.mixSidebarTrigger')}*/}
  191. {/* event={HandlerEnum.MENU_TRIGGER_MIX_SIDEBAR}*/}
  192. {/* def={unref(getMixSideTrigger)}*/}
  193. {/* options={mixSidebarTriggerOptions}*/}
  194. {/* disabled={!unref(getIsMixSidebar)}*/}
  195. {/*/>*/}
  196. <SelectItem
  197. title={t('layout.setting.tabsTheme')}
  198. event={HandlerEnum.TABS_THEME}
  199. def={unref(getTabsTheme)}
  200. options={tabsThemeOptions}
  201. />
  202. <SelectItem
  203. title={t('layout.setting.topMenuLayout')}
  204. event={HandlerEnum.MENU_TOP_ALIGN}
  205. def={unref(getTopMenuAlign)}
  206. options={topMenuAlignOptions}
  207. disabled={
  208. !unref(getShowHeader) ||
  209. unref(getSplit) ||
  210. (!unref(getIsTopMenu) && !unref(getSplit)) ||
  211. unref(getIsMixSidebar)
  212. }
  213. />
  214. <SelectItem
  215. title={t('layout.setting.menuCollapseButton')}
  216. event={HandlerEnum.MENU_TRIGGER}
  217. def={triggerDef}
  218. options={triggerOptions}
  219. disabled={!unref(getShowMenuRef) || unref(getIsMixSidebar)}
  220. />
  221. <SelectItem
  222. title={t('layout.setting.contentMode')}
  223. event={HandlerEnum.CONTENT_MODE}
  224. def={unref(getContentMode)}
  225. options={contentModeOptions}
  226. />
  227. <InputNumberItem
  228. title={t('layout.setting.autoScreenLock')}
  229. min={0}
  230. event={HandlerEnum.LOCK_TIME}
  231. defaultValue={unref(getLockTime)}
  232. formatter={(value: string) => {
  233. return parseInt(value) === 0
  234. ? `0(${t('layout.setting.notAutoScreenLock')})`
  235. : `${value}${t('layout.setting.minute')}`;
  236. }}
  237. />
  238. <InputNumberItem
  239. title={t('layout.setting.expandedMenuWidth')}
  240. max={600}
  241. min={100}
  242. step={10}
  243. event={HandlerEnum.MENU_WIDTH}
  244. disabled={!unref(getShowMenuRef)}
  245. defaultValue={unref(getMenuWidth)}
  246. formatter={(value: string) => `${parseInt(value)}px`}
  247. />
  248. </>
  249. );
  250. }
  251. function renderContent() {
  252. return (
  253. <>
  254. <SwitchItem
  255. title={t('layout.setting.menuDrag')}
  256. event={HandlerEnum.MENU_HAS_DRAG}
  257. def={unref(getCanDrag)}
  258. disabled={!unref(getShowMenuRef)}
  259. />
  260. <SwitchItem
  261. title={t('layout.setting.collapseMenuDisplayName')}
  262. event={HandlerEnum.MENU_COLLAPSED_SHOW_TITLE}
  263. def={unref(getCollapsedShowTitle)}
  264. disabled={!unref(getShowMenuRef) || !unref(getCollapsed) || unref(getIsMixSidebar)}
  265. />
  266. <SwitchItem
  267. title={t('layout.setting.tabs')}
  268. event={HandlerEnum.TABS_SHOW}
  269. def={unref(getShowMultipleTab)}
  270. />
  271. <SwitchItem
  272. title={t('layout.setting.breadcrumb')}
  273. event={HandlerEnum.SHOW_BREADCRUMB}
  274. def={unref(getShowBreadCrumb)}
  275. disabled={!unref(getShowHeader)}
  276. />
  277. {/*<SwitchItem*/}
  278. {/* title={t('layout.setting.breadcrumbIcon')}*/}
  279. {/* event={HandlerEnum.SHOW_BREADCRUMB_ICON}*/}
  280. {/* def={unref(getShowBreadCrumbIcon)}*/}
  281. {/* disabled={!unref(getShowHeader)}*/}
  282. {/*/>*/}
  283. {/*<SwitchItem*/}
  284. {/* title={t('layout.setting.tabsRedoBtn')}*/}
  285. {/* event={HandlerEnum.TABS_SHOW_REDO}*/}
  286. {/* def={unref(getShowRedo)}*/}
  287. {/* disabled={!unref(getShowMultipleTab)}*/}
  288. {/*/>*/}
  289. {/*<SwitchItem*/}
  290. {/* title={t('layout.setting.tabsQuickBtn')}*/}
  291. {/* event={HandlerEnum.TABS_SHOW_QUICK}*/}
  292. {/* def={unref(getShowQuick)}*/}
  293. {/* disabled={!unref(getShowMultipleTab)}*/}
  294. {/*/>*/}
  295. {/*<SwitchItem*/}
  296. {/* title={t('layout.setting.tabsFoldBtn')}*/}
  297. {/* event={HandlerEnum.TABS_SHOW_FOLD}*/}
  298. {/* def={unref(getShowFold)}*/}
  299. {/* disabled={!unref(getShowMultipleTab)}*/}
  300. {/*/>*/}
  301. {/*<SwitchItem*/}
  302. {/* title={t('layout.setting.sidebar')}*/}
  303. {/* event={HandlerEnum.MENU_SHOW_SIDEBAR}*/}
  304. {/* def={unref(getShowMenu)}*/}
  305. {/* disabled={unref(getIsHorizontal)}*/}
  306. {/*/>*/}
  307. {/*<SwitchItem*/}
  308. {/* title={t('layout.setting.header')}*/}
  309. {/* event={HandlerEnum.HEADER_SHOW}*/}
  310. {/* def={unref(getShowHeader)}*/}
  311. {/*/>*/}
  312. {/*<SwitchItem*/}
  313. {/* title="Logo"*/}
  314. {/* event={HandlerEnum.SHOW_LOGO}*/}
  315. {/* def={unref(getShowLogo)}*/}
  316. {/* disabled={unref(getIsMixSidebar)}*/}
  317. {/*/>*/}
  318. <SwitchItem
  319. title={t('layout.setting.footer')}
  320. event={HandlerEnum.SHOW_FOOTER}
  321. def={unref(getShowFooter)}
  322. />
  323. {/*<SwitchItem*/}
  324. {/* title={t('layout.setting.fullContent')}*/}
  325. {/* event={HandlerEnum.FULL_CONTENT}*/}
  326. {/* def={unref(getFullContent)}*/}
  327. {/*/>*/}
  328. <SwitchItem
  329. title={t('layout.setting.grayMode')}
  330. event={HandlerEnum.GRAY_MODE}
  331. def={unref(getGrayMode)}
  332. />
  333. <SwitchItem
  334. title={t('layout.setting.colorWeak')}
  335. event={HandlerEnum.COLOR_WEAK}
  336. def={unref(getColorWeak)}
  337. />
  338. </>
  339. );
  340. }
  341. function renderTransition() {
  342. return (
  343. <>
  344. <SwitchItem
  345. title={t('layout.setting.progress')}
  346. event={HandlerEnum.OPEN_PROGRESS}
  347. def={unref(getOpenNProgress)}
  348. />
  349. <SwitchItem
  350. title={t('layout.setting.switchLoading')}
  351. event={HandlerEnum.OPEN_PAGE_LOADING}
  352. def={unref(getOpenPageLoading)}
  353. />
  354. <SwitchItem
  355. title={t('layout.setting.switchAnimation')}
  356. event={HandlerEnum.OPEN_ROUTE_TRANSITION}
  357. def={unref(getEnableTransition)}
  358. />
  359. <SelectItem
  360. title={t('layout.setting.animationType')}
  361. event={HandlerEnum.ROUTER_TRANSITION}
  362. def={unref(getBasicTransition)}
  363. options={routerTransitionOptions}
  364. disabled={!unref(getEnableTransition)}
  365. />
  366. </>
  367. );
  368. }
  369. return () => (
  370. <BasicDrawer
  371. {...attrs}
  372. title={t('layout.setting.drawerTitle')}
  373. width={330}
  374. wrapClassName="setting-drawer"
  375. >
  376. {unref(getShowDarkModeToggle) && <Divider>{() => t('layout.setting.darkMode')}</Divider>}
  377. {unref(getShowDarkModeToggle) && <AppDarkModeToggle class="mx-auto" />}
  378. <Divider>{() => t('layout.setting.navMode')}</Divider>
  379. {renderSidebar()}
  380. <Divider>{() => t('layout.setting.sysTheme')}</Divider>
  381. {renderMainTheme()}
  382. <Divider>{() => t('layout.setting.headerTheme')}</Divider>
  383. {renderHeaderTheme()}
  384. <Divider>{() => t('layout.setting.sidebarTheme')}</Divider>
  385. {renderSiderTheme()}
  386. <Divider>{() => t('layout.setting.interfaceFunction')}</Divider>
  387. {renderFeatures()}
  388. {/*<Divider>{() => t('layout.setting.interfaceDisplay')}</Divider>*/}
  389. {renderContent()}
  390. {/*<Divider>{() => t('layout.setting.animation')}</Divider>*/}
  391. {/*{renderTransition()}*/}
  392. <Divider />
  393. <SettingFooter />
  394. </BasicDrawer>
  395. );
  396. },
  397. });