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