SettingDrawer.tsx 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408
  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 } = 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. <SwitchItem
  96. title={t('layout.setting.splitMenu')}
  97. event={HandlerEnum.MENU_SPLIT}
  98. def={unref(getSplit)}
  99. disabled={!unref(getShowMenuRef) || unref(getMenuType) !== MenuTypeEnum.MIX}
  100. />
  101. <SwitchItem
  102. title={t('layout.setting.mixSidebarFixed')}
  103. event={HandlerEnum.MENU_FIXED_MIX_SIDEBAR}
  104. def={unref(getMixSideFixed)}
  105. disabled={!unref(getIsMixSidebar)}
  106. />
  107. <SwitchItem
  108. title={t('layout.setting.closeMixSidebarOnChange')}
  109. event={HandlerEnum.MENU_CLOSE_MIX_SIDEBAR_ON_CHANGE}
  110. def={unref(getCloseMixSidebarOnChange)}
  111. disabled={!unref(getIsMixSidebar)}
  112. />
  113. <SelectItem
  114. title={t('layout.setting.mixSidebarTrigger')}
  115. event={HandlerEnum.MENU_TRIGGER_MIX_SIDEBAR}
  116. def={unref(getMixSideTrigger)}
  117. options={mixSidebarTriggerOptions}
  118. disabled={!unref(getIsMixSidebar)}
  119. />
  120. </>
  121. );
  122. }
  123. function renderHeaderTheme() {
  124. return (
  125. <ThemePicker
  126. colorList={HEADER_PRESET_BG_COLOR_LIST}
  127. def={unref(getHeaderBgColor)}
  128. event={HandlerEnum.HEADER_THEME}
  129. />
  130. );
  131. }
  132. function renderSiderTheme() {
  133. return (
  134. <ThemePicker
  135. colorList={SIDE_BAR_BG_COLOR_LIST}
  136. def={unref(getMenuBgColor)}
  137. event={HandlerEnum.MENU_THEME}
  138. />
  139. );
  140. }
  141. /**
  142. * @description:
  143. */
  144. function renderFeatures() {
  145. let triggerDef = unref(getTrigger);
  146. const triggerOptions = getMenuTriggerOptions(unref(getSplit));
  147. const some = triggerOptions.some((item) => item.value === triggerDef);
  148. if (!some) {
  149. triggerDef = TriggerEnum.FOOTER;
  150. }
  151. return (
  152. <>
  153. <SwitchItem
  154. title={t('layout.setting.menuDrag')}
  155. event={HandlerEnum.MENU_HAS_DRAG}
  156. def={unref(getCanDrag)}
  157. disabled={!unref(getShowMenuRef)}
  158. />
  159. <SwitchItem
  160. title={t('layout.setting.menuSearch')}
  161. event={HandlerEnum.HEADER_SEARCH}
  162. def={unref(getShowSearch)}
  163. disabled={!unref(getShowHeader)}
  164. />
  165. <SwitchItem
  166. title={t('layout.setting.menuAccordion')}
  167. event={HandlerEnum.MENU_ACCORDION}
  168. def={unref(getAccordion)}
  169. disabled={!unref(getShowMenuRef)}
  170. />
  171. <SwitchItem
  172. title={t('layout.setting.menuCollapse')}
  173. event={HandlerEnum.MENU_COLLAPSED}
  174. def={unref(getCollapsed)}
  175. disabled={!unref(getShowMenuRef) || unref(getIsMixSidebar)}
  176. />
  177. <SwitchItem
  178. title={t('layout.setting.collapseMenuDisplayName')}
  179. event={HandlerEnum.MENU_COLLAPSED_SHOW_TITLE}
  180. def={unref(getCollapsedShowTitle)}
  181. disabled={!unref(getShowMenuRef) || !unref(getCollapsed)}
  182. />
  183. <SwitchItem
  184. title={t('layout.setting.fixedHeader')}
  185. event={HandlerEnum.HEADER_FIXED}
  186. def={unref(getHeaderFixed)}
  187. disabled={!unref(getShowHeader)}
  188. />
  189. <SwitchItem
  190. title={t('layout.setting.fixedSideBar')}
  191. event={HandlerEnum.MENU_FIXED}
  192. def={unref(getMenuFixed)}
  193. disabled={!unref(getShowMenuRef) || 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.sidebar')}
  278. event={HandlerEnum.MENU_SHOW_SIDEBAR}
  279. def={unref(getShowMenu)}
  280. disabled={unref(getIsHorizontal)}
  281. />
  282. <SwitchItem
  283. title={t('layout.setting.header')}
  284. event={HandlerEnum.HEADER_SHOW}
  285. def={unref(getShowHeader)}
  286. />
  287. <SwitchItem
  288. title="Logo"
  289. event={HandlerEnum.SHOW_LOGO}
  290. def={unref(getShowLogo)}
  291. disabled={unref(getIsMixSidebar)}
  292. />
  293. <SwitchItem
  294. title={t('layout.setting.footer')}
  295. event={HandlerEnum.SHOW_FOOTER}
  296. def={unref(getShowFooter)}
  297. />
  298. <SwitchItem
  299. title={t('layout.setting.fullContent')}
  300. event={HandlerEnum.FULL_CONTENT}
  301. def={unref(getFullContent)}
  302. />
  303. <SwitchItem
  304. title={t('layout.setting.grayMode')}
  305. event={HandlerEnum.GRAY_MODE}
  306. def={unref(getGrayMode)}
  307. />
  308. <SwitchItem
  309. title={t('layout.setting.colorWeak')}
  310. event={HandlerEnum.COLOR_WEAK}
  311. def={unref(getColorWeak)}
  312. />
  313. </>
  314. );
  315. }
  316. function renderTransition() {
  317. return (
  318. <>
  319. <SwitchItem
  320. title={t('layout.setting.progress')}
  321. event={HandlerEnum.OPEN_PROGRESS}
  322. def={unref(getOpenNProgress)}
  323. />
  324. <SwitchItem
  325. title={t('layout.setting.switchLoading')}
  326. event={HandlerEnum.OPEN_PAGE_LOADING}
  327. def={unref(getOpenPageLoading)}
  328. />
  329. <SwitchItem
  330. title={t('layout.setting.switchAnimation')}
  331. event={HandlerEnum.OPEN_ROUTE_TRANSITION}
  332. def={unref(getEnableTransition)}
  333. />
  334. <SelectItem
  335. title={t('layout.setting.animationType')}
  336. event={HandlerEnum.ROUTER_TRANSITION}
  337. def={unref(getBasicTransition)}
  338. options={routerTransitionOptions}
  339. disabled={!unref(getEnableTransition)}
  340. />
  341. </>
  342. );
  343. }
  344. return () => (
  345. <BasicDrawer
  346. {...attrs}
  347. title={t('layout.setting.drawerTitle')}
  348. width={330}
  349. wrapClassName="setting-drawer"
  350. >
  351. {{
  352. default: () => (
  353. <>
  354. <Divider>{() => t('layout.setting.navMode')}</Divider>
  355. {renderSidebar()}
  356. <Divider>{() => t('layout.setting.headerTheme')}</Divider>
  357. {renderHeaderTheme()}
  358. <Divider>{() => t('layout.setting.sidebarTheme')}</Divider>
  359. {renderSiderTheme()}
  360. <Divider>{() => t('layout.setting.interfaceFunction')}</Divider>
  361. {renderFeatures()}
  362. <Divider>{() => t('layout.setting.interfaceDisplay')}</Divider>
  363. {renderContent()}
  364. <Divider>{() => t('layout.setting.animation')}</Divider>
  365. {renderTransition()}
  366. <Divider />
  367. <SettingFooter />
  368. </>
  369. ),
  370. }}
  371. </BasicDrawer>
  372. );
  373. },
  374. });