SettingDrawer.tsx 13 KB

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