SettingDrawer.tsx 12 KB

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