SettingDrawer.tsx 11 KB

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