1
0

useLayoutSider.tsx 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. import type { Ref } from 'vue';
  2. import { computed, unref, onMounted, nextTick, ref } from 'vue';
  3. import LayoutTrigger from '/@/layouts/default/trigger/index.vue';
  4. import { TriggerEnum } from '/@/enums/menuEnum';
  5. import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';
  6. import { useDebounce } from '/@/hooks/core/useDebounce';
  7. /**
  8. * Handle related operations of menu events
  9. */
  10. export function useSiderEvent() {
  11. const initRef = ref(false);
  12. const brokenRef = ref(false);
  13. const collapseRef = ref(true);
  14. const { setMenuSetting, getCollapsed, getMiniWidthNumber, getShowMenu } = useMenuSetting();
  15. const getCollapsedWidth = computed(() => {
  16. return unref(brokenRef) ? 0 : unref(getMiniWidthNumber);
  17. });
  18. function onCollapseChange(val: boolean) {
  19. if (initRef.value) {
  20. collapseRef.value = val;
  21. setMenuSetting({ collapsed: val });
  22. } else {
  23. !unref(getCollapsed) && setMenuSetting({ collapsed: val });
  24. }
  25. initRef.value = true;
  26. }
  27. function onBreakpointChange(broken: boolean) {
  28. brokenRef.value = broken;
  29. }
  30. function onSiderClick(e: ChangeEvent) {
  31. if (!e || !e.target || e.target.className !== 'basic-menu__content') return;
  32. if (!unref(getCollapsed) || !unref(getShowMenu)) return;
  33. setMenuSetting({ collapsed: false });
  34. }
  35. return { getCollapsedWidth, onCollapseChange, onBreakpointChange, onSiderClick };
  36. }
  37. /**
  38. * Handle related operations of menu folding
  39. */
  40. export function useTrigger() {
  41. const { getTrigger } = useMenuSetting();
  42. const showTrigger = computed(() => {
  43. const trigger = unref(getTrigger);
  44. return trigger !== TriggerEnum.NONE && trigger === TriggerEnum.FOOTER;
  45. });
  46. const getTriggerAttr = computed(() => {
  47. if (unref(showTrigger)) {
  48. return {};
  49. }
  50. return {
  51. trigger: null,
  52. };
  53. });
  54. const getTriggerSlot = computed(() => {
  55. if (unref(showTrigger)) {
  56. return {
  57. trigger: () => <LayoutTrigger />,
  58. };
  59. }
  60. return {};
  61. });
  62. return { getTriggerAttr, getTriggerSlot };
  63. }
  64. /**
  65. * Handle menu drag and drop related operations
  66. * @param siderRef
  67. * @param dragBarRef
  68. */
  69. export function useDragLine(siderRef: Ref<any>, dragBarRef: Ref<any>) {
  70. const { getMiniWidthNumber, getCollapsed, setMenuSetting, getCanDrag } = useMenuSetting();
  71. const getDragBarStyle = computed(() => {
  72. if (unref(getCollapsed)) {
  73. return { left: `${unref(getMiniWidthNumber)}px` };
  74. }
  75. return {};
  76. });
  77. onMounted(() => {
  78. nextTick(() => {
  79. const [exec] = useDebounce(changeWrapWidth, 20);
  80. exec();
  81. });
  82. });
  83. function renderDragLine() {
  84. return (
  85. <div
  86. class={[`layout-sidebar__darg-bar`, { hide: !unref(getCanDrag) }]}
  87. style={unref(getDragBarStyle)}
  88. ref={dragBarRef}
  89. />
  90. );
  91. }
  92. function handleMouseMove(ele: HTMLElement, wrap: HTMLElement, clientX: number) {
  93. document.onmousemove = function (innerE) {
  94. let iT = (ele as any).left + (innerE.clientX - clientX);
  95. innerE = innerE || window.event;
  96. const maxT = 600;
  97. const minT = unref(getMiniWidthNumber);
  98. iT < 0 && (iT = 0);
  99. iT > maxT && (iT = maxT);
  100. iT < minT && (iT = minT);
  101. ele.style.left = wrap.style.width = iT + 'px';
  102. return false;
  103. };
  104. }
  105. // Drag and drop in the menu area-release the mouse
  106. function removeMouseup(ele: any) {
  107. const wrap = unref(siderRef).$el;
  108. document.onmouseup = function () {
  109. document.onmousemove = null;
  110. document.onmouseup = null;
  111. const width = parseInt(wrap.style.width);
  112. const miniWidth = unref(getMiniWidthNumber);
  113. if (!unref(getCollapsed)) {
  114. width > miniWidth + 20
  115. ? setMenuSetting({ menuWidth: width })
  116. : setMenuSetting({ collapsed: true });
  117. } else {
  118. width > miniWidth && setMenuSetting({ collapsed: false, menuWidth: width });
  119. }
  120. ele.releaseCapture?.();
  121. };
  122. }
  123. function changeWrapWidth() {
  124. const ele = unref(dragBarRef) as any;
  125. const side = unref(siderRef);
  126. const wrap = (side || {}).$el;
  127. ele &&
  128. (ele.onmousedown = (e: any) => {
  129. wrap.style.transition = 'unset';
  130. const clientX = e?.clientX;
  131. ele.left = ele.offsetLeft;
  132. handleMouseMove(ele, wrap, clientX);
  133. removeMouseup(ele);
  134. ele.setCapture?.();
  135. return false;
  136. });
  137. }
  138. return { renderDragLine };
  139. }