import { ref, onBeforeUnmount, onMounted } from 'vue'
|
import { useCache } from '@/hooks/web/useCache'
|
import { useEmitt } from '@/hooks/web/useEmitt'
|
|
type Sidebar = 'DATASET' | 'DASHBOARD' | 'DATASOURCE' | 'DATA-FILLING'
|
|
export const useMoveLine = (type: Sidebar) => {
|
const { wsCache } = useCache('localStorage')
|
const width = ref(wsCache.get(type) || 280)
|
wsCache.set('current-collapse_bar', width.value)
|
|
const getCoordinates = () => {
|
if (document.querySelector('.sidebar-move-line')) {
|
document.querySelector('.sidebar-move-line').className = 'sidebar-move-line dragging'
|
}
|
document.addEventListener('mousemove', setCoordinates)
|
document.addEventListener('mouseup', cancelEvent)
|
document.querySelector('body').style['user-select'] = 'none'
|
}
|
|
const setCollapseBarWidth = () => {
|
wsCache.set('current-collapse_bar', width.value)
|
useEmitt().emitter.emit('current-collapse_bar')
|
}
|
|
const setCoordinates = (e: MouseEvent) => {
|
const x = e.clientX
|
if (x > 401 || x < 279) {
|
width.value = Math.max(Math.min(401, x), 279)
|
ele.style.left = width.value - 5 + 'px'
|
setCollapseBarWidth()
|
return
|
}
|
ele.style.left = width.value - 5 + 'px'
|
width.value = x
|
setCollapseBarWidth()
|
}
|
|
const cancelEvent = () => {
|
if (document.querySelector('.sidebar-move-line')) {
|
document.querySelector('.sidebar-move-line').className = 'sidebar-move-line'
|
}
|
document.querySelector('body').style['user-select'] = 'auto'
|
wsCache.set(type, width.value)
|
document.removeEventListener('mousemove', setCoordinates)
|
}
|
|
const node = ref()
|
|
const ele = document.createElement('div')
|
ele.className = 'sidebar-move-line'
|
ele.style.top = '0'
|
ele.style.left = width.value - 5 + 'px'
|
ele.addEventListener('mousedown', getCoordinates)
|
|
onMounted(() => {
|
;(node.value?.$el || node.value)?.appendChild(ele)
|
})
|
|
onBeforeUnmount(() => {
|
cancelEvent()
|
ele.removeEventListener('mousedown', getCoordinates)
|
;(node.value?.$el || node.value)?.removeChild?.(ele)
|
width.value = null
|
})
|
|
return {
|
width,
|
node
|
}
|
}
|