useMenuSetting.ts 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. import type { MenuSetting } from '/#/config';
  2. import { computed, unref, ref } from 'vue';
  3. import { useAppStore } from '/@/store/modules/app';
  4. import { SIDE_BAR_MINI_WIDTH, SIDE_BAR_SHOW_TIT_MINI_WIDTH } from '/@/enums/appEnum';
  5. import { MenuModeEnum, MenuTypeEnum, TriggerEnum } from '/@/enums/menuEnum';
  6. import { useFullContent } from '/@/hooks/web/useFullContent';
  7. const mixSideHasChildren = ref(false);
  8. export function useMenuSetting() {
  9. const { getFullContent: fullContent } = useFullContent();
  10. const appStore = useAppStore();
  11. const getShowSidebar = computed(() => {
  12. return unref(getSplit) || (unref(getShowMenu) && unref(getMenuMode) !== MenuModeEnum.HORIZONTAL && !unref(fullContent));
  13. });
  14. const getCollapsed = computed(() => appStore.getMenuSetting.collapsed);
  15. const getMenuType = computed(() => appStore.getMenuSetting.type);
  16. const getMenuMode = computed(() => appStore.getMenuSetting.mode);
  17. const getMenuFixed = computed(() => appStore.getMenuSetting.fixed);
  18. const getShowMenu = computed(() => appStore.getMenuSetting.show);
  19. const getMenuHidden = computed(() => appStore.getMenuSetting.hidden);
  20. const getMenuWidth = computed(() => {
  21. const scale = document.body.clientWidth / 1920;
  22. const menuWidth = appStore.getMenuSetting.menuWidth;
  23. return menuWidth * scale;
  24. });
  25. const getTrigger = computed(() => appStore.getMenuSetting.trigger);
  26. const getMenuTheme = computed(() => appStore.getMenuSetting.theme);
  27. const getSplit = computed(() => appStore.getMenuSetting.split);
  28. const getMenuBgColor = computed(() => appStore.getMenuSetting.bgColor);
  29. const getMixSideTrigger = computed(() => appStore.getMenuSetting.mixSideTrigger);
  30. const getCanDrag = computed(() => appStore.getMenuSetting.canDrag);
  31. const getAccordion = computed(() => appStore.getMenuSetting.accordion);
  32. const getMixSideFixed = computed(() => appStore.getMenuSetting.mixSideFixed);
  33. const getTopMenuAlign = computed(() => appStore.getMenuSetting.topMenuAlign);
  34. const getCloseMixSidebarOnChange = computed(() => appStore.getMenuSetting.closeMixSidebarOnChange);
  35. const getIsSidebarType = computed(() => unref(getMenuType) === MenuTypeEnum.SIDEBAR);
  36. const getIsTopMenu = computed(() => unref(getMenuType) === MenuTypeEnum.TOP_MENU);
  37. const getCollapsedShowTitle = computed(() => appStore.getMenuSetting.collapsedShowTitle);
  38. const getShowTopMenu = computed(() => {
  39. return unref(getMenuMode) === MenuModeEnum.HORIZONTAL || unref(getSplit);
  40. });
  41. const getShowHeaderTrigger = computed(() => {
  42. if (unref(getMenuType) === MenuTypeEnum.TOP_MENU || !unref(getShowMenu) || unref(getMenuHidden)) {
  43. return false;
  44. }
  45. return unref(getTrigger) === TriggerEnum.HEADER;
  46. });
  47. const getIsHorizontal = computed(() => {
  48. return unref(getMenuMode) === MenuModeEnum.HORIZONTAL;
  49. });
  50. const getIsMixSidebar = computed(() => {
  51. return unref(getMenuType) === MenuTypeEnum.MIX_SIDEBAR;
  52. });
  53. const getIsMixMode = computed(() => {
  54. return unref(getMenuMode) === MenuModeEnum.INLINE && unref(getMenuType) === MenuTypeEnum.MIX;
  55. });
  56. const getRealWidth = computed(() => {
  57. if (unref(getIsMixSidebar)) {
  58. return unref(getCollapsed) && !unref(getMixSideFixed) ? unref(getMiniWidthNumber) : unref(getMenuWidth);
  59. }
  60. return unref(getCollapsed) ? unref(getMiniWidthNumber) : unref(getMenuWidth);
  61. });
  62. const getMiniWidthNumber = computed(() => {
  63. const { collapsedShowTitle } = appStore.getMenuSetting;
  64. return collapsedShowTitle ? SIDE_BAR_SHOW_TIT_MINI_WIDTH : SIDE_BAR_MINI_WIDTH;
  65. });
  66. const getCalcContentWidth = computed(() => {
  67. const width =
  68. unref(getIsTopMenu) || !unref(getShowMenu) || (unref(getSplit) && unref(getMenuHidden))
  69. ? 0
  70. : unref(getIsMixSidebar)
  71. ? (unref(getCollapsed) ? SIDE_BAR_MINI_WIDTH : SIDE_BAR_SHOW_TIT_MINI_WIDTH) + (unref(getMixSideFixed) && unref(mixSideHasChildren) ? unref(getRealWidth) : 0)
  72. : unref(getRealWidth);
  73. return `calc(100% - ${unref(width)}px)`;
  74. });
  75. // Set menu configuration
  76. function setMenuSetting(menuSetting: Partial<MenuSetting>): void {
  77. appStore.setProjectConfig({ menuSetting });
  78. }
  79. function toggleCollapsed() {
  80. setMenuSetting({
  81. collapsed: !unref(getCollapsed),
  82. });
  83. }
  84. return {
  85. setMenuSetting,
  86. toggleCollapsed,
  87. getMenuFixed,
  88. getRealWidth,
  89. getMenuType,
  90. getMenuMode,
  91. getShowMenu,
  92. getCollapsed,
  93. getMiniWidthNumber,
  94. getCalcContentWidth,
  95. getMenuWidth,
  96. getTrigger,
  97. getSplit,
  98. getMenuTheme,
  99. getCanDrag,
  100. getCollapsedShowTitle,
  101. getIsHorizontal,
  102. getIsSidebarType,
  103. getAccordion,
  104. getShowTopMenu,
  105. getShowHeaderTrigger,
  106. getTopMenuAlign,
  107. getMenuHidden,
  108. getIsTopMenu,
  109. getMenuBgColor,
  110. getShowSidebar,
  111. getIsMixMode,
  112. getIsMixSidebar,
  113. getCloseMixSidebarOnChange,
  114. getMixSideTrigger,
  115. getMixSideFixed,
  116. mixSideHasChildren,
  117. };
  118. }