useLayoutSider.ts 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. import type { Ref } from 'vue';
  2. import { computed, unref, onMounted, nextTick, ref } from 'vue';
  3. import { TriggerEnum } from '/@/enums/menuEnum';
  4. import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';
  5. import { useDebounceFn } from '@vueuse/core';
  6. /**
  7. * Handle related operations of menu events
  8. */
  9. export function useSiderEvent() {
  10. const brokenRef = ref(false);
  11. const { getMiniWidthNumber } = useMenuSetting();
  12. const getCollapsedWidth = computed(() => {
  13. return unref(brokenRef) ? 0 : unref(getMiniWidthNumber);
  14. });
  15. function onBreakpointChange(broken: boolean) {
  16. brokenRef.value = broken;
  17. }
  18. return { getCollapsedWidth, onBreakpointChange };
  19. }
  20. /**
  21. * Handle related operations of menu folding
  22. */
  23. export function useTrigger(getIsMobile: Ref<boolean>) {
  24. const { getTrigger, getSplit } = useMenuSetting();
  25. const getShowTrigger = computed(() => {
  26. const trigger = unref(getTrigger);
  27. return trigger !== TriggerEnum.NONE && !unref(getIsMobile) && (trigger === TriggerEnum.FOOTER || unref(getSplit));
  28. });
  29. const getTriggerAttr = computed(() => {
  30. if (unref(getShowTrigger)) {
  31. return {};
  32. }
  33. return {
  34. trigger: null,
  35. };
  36. });
  37. return { getTriggerAttr, getShowTrigger };
  38. }
  39. /**
  40. * Handle menu drag and drop related operations
  41. * @param siderRef
  42. * @param dragBarRef
  43. */
  44. export function useDragLine(siderRef: Ref<any>, dragBarRef: Ref<any>, mix = false) {
  45. const { getMiniWidthNumber, getCollapsed, setMenuSetting } = useMenuSetting();
  46. onMounted(() => {
  47. nextTick(() => {
  48. const exec = useDebounceFn(changeWrapWidth, 80);
  49. exec();
  50. });
  51. });
  52. function getEl(elRef: Ref<ElRef | ComponentRef>): any {
  53. const el = unref(elRef);
  54. if (!el) return null;
  55. if (Reflect.has(el, '$el')) {
  56. return (unref(elRef) as ComponentRef)?.$el;
  57. }
  58. return unref(elRef);
  59. }
  60. function handleMouseMove(ele: HTMLElement, wrap: HTMLElement, clientX: number) {
  61. document.onmousemove = function (innerE) {
  62. let iT = (ele as any).left + (innerE.clientX - clientX);
  63. innerE = innerE || window.event;
  64. const maxT = 800;
  65. const minT = unref(getMiniWidthNumber);
  66. iT < 0 && (iT = 0);
  67. iT > maxT && (iT = maxT);
  68. iT < minT && (iT = minT);
  69. ele.style.left = wrap.style.width = iT + 'px';
  70. return false;
  71. };
  72. }
  73. // Drag and drop in the menu area-release the mouse
  74. function removeMouseup(ele: any) {
  75. const wrap = getEl(siderRef);
  76. document.onmouseup = function () {
  77. document.onmousemove = null;
  78. document.onmouseup = null;
  79. wrap.style.transition = 'width 0.2s';
  80. const width = parseInt(wrap.style.width);
  81. if (!mix) {
  82. const miniWidth = unref(getMiniWidthNumber);
  83. if (!unref(getCollapsed)) {
  84. width > miniWidth + 20 ? setMenuSetting({ menuWidth: width }) : setMenuSetting({ collapsed: true });
  85. } else {
  86. width > miniWidth && setMenuSetting({ collapsed: false, menuWidth: width });
  87. }
  88. } else {
  89. setMenuSetting({ menuWidth: width });
  90. }
  91. ele.releaseCapture?.();
  92. };
  93. }
  94. function changeWrapWidth() {
  95. const ele = getEl(dragBarRef);
  96. if (!ele) return;
  97. const wrap = getEl(siderRef);
  98. if (!wrap) return;
  99. ele.onmousedown = (e: any) => {
  100. wrap.style.transition = 'unset';
  101. const clientX = e?.clientX;
  102. ele.left = ele.offsetLeft;
  103. handleMouseMove(ele, wrap, clientX);
  104. removeMouseup(ele);
  105. ele.setCapture?.();
  106. return false;
  107. };
  108. }
  109. return {};
  110. }