hongluan-business-ui
Version:
Hongluan Business Component Library for Vue 3
166 lines (163 loc) • 4.67 kB
JavaScript
import { ref, computed, getCurrentInstance, watch, nextTick, onMounted, onBeforeUnmount } from 'vue';
import { useTimeoutFn } from '@vueuse/core';
import { useZIndex } from 'hongluan-ui';
import '../../modeless-dialog/index.mjs';
import isServer from '../../../utils/isServer.mjs';
import { useRestoreActive } from '../../../utils/use-restore-active.mjs';
import { ModelessDialogManager } from '../../modeless-dialog/src/manager.mjs';
const CLOSE_EVENT = "close";
const OPEN_EVENT = "open";
const CLOSED_EVENT = "closed";
const OPENED_EVENT = "opened";
const ITEM_ADDED_EVENT = "item-added";
const ITEM_CLOSED_EVENT = "item-closed";
const ITEM_RESTORED_EVENT = "item-restored";
const UPDATE_MODEL_EVENT = "update:modelValue";
const useDockContainer = (props, scrollbarRef) => {
const { nextZIndex } = useZIndex();
const visible = ref(false);
const closed = ref(false);
const zIndex = ref(props.zIndex || nextZIndex());
const dockItems = ref([]);
const animName = computed(() => {
let name = props.animationName;
if (!name) {
switch (props.placement) {
case "left":
name = "slideRightSide";
break;
case "right":
name = "slideLeftSide";
break;
case "bottom":
name = "slideTopSide";
break;
case "top":
name = "slideBottomSide";
break;
}
}
return name;
});
let stopOpenTimer = void 0;
let stopCloseTimer = void 0;
const { emit } = getCurrentInstance();
function afterEnter() {
emit(OPENED_EVENT);
}
function afterLeave() {
emit(CLOSED_EVENT);
emit(UPDATE_MODEL_EVENT, false);
}
function beforeLeave() {
emit(CLOSE_EVENT);
}
function open() {
stopCloseTimer == null ? void 0 : stopCloseTimer();
stopOpenTimer == null ? void 0 : stopOpenTimer();
if (props.openDelay && props.openDelay > 0) {
({ stop: stopOpenTimer } = useTimeoutFn(() => doOpen(), props.openDelay));
} else {
doOpen();
}
}
function close() {
stopOpenTimer == null ? void 0 : stopOpenTimer();
stopCloseTimer == null ? void 0 : stopCloseTimer();
if (props.closeDelay && props.closeDelay > 0) {
({ stop: stopCloseTimer } = useTimeoutFn(() => doClose(), props.closeDelay));
} else {
doClose();
}
}
function hide(shouldCancel) {
if (shouldCancel)
return;
closed.value = true;
visible.value = false;
}
function handleClose() {
if (props.beforeClose) {
props.beforeClose(hide);
} else {
close();
}
}
function doOpen() {
if (isServer) {
return;
}
visible.value = true;
}
function doClose() {
visible.value = false;
}
useRestoreActive(visible);
watch(() => props.modelValue, (val) => {
if (val) {
closed.value = false;
open();
emit(OPEN_EVENT);
zIndex.value = props.zIndex ? zIndex.value++ : nextZIndex();
} else {
if (visible.value) {
close();
}
}
});
watch(() => dockItems.value.length, () => {
nextTick(() => {
var _a;
(_a = scrollbarRef.value) == null ? void 0 : _a.update();
});
});
function addDockItems(id) {
const dialog = ModelessDialogManager.get(id);
const item = {
id,
title: dialog.title || document.querySelector(`#${id} .panel-header`).innerText,
snapshot: dialog.snapshot
};
dockItems.value.push(item);
emit(ITEM_ADDED_EVENT, item, dockItems.value);
}
function closeDockItem(id) {
const itemIdx = dockItems.value.findIndex((i) => i.id === id);
const itemsDel = dockItems.value.splice(itemIdx, 1);
ModelessDialogManager.get(id).close();
emit(ITEM_CLOSED_EVENT, itemsDel[0], dockItems.value);
}
function restoreDockItem(id) {
const itemIdx = dockItems.value.findIndex((i) => i.id === id);
const itemsDel = dockItems.value.splice(itemIdx, 1);
ModelessDialogManager.get(id).toggleShow();
emit(ITEM_RESTORED_EVENT, itemsDel[0], dockItems.value);
}
const eventRemover = ModelessDialogManager.addEventListener({
collapse: addDockItems
});
onMounted(() => {
if (props.modelValue) {
visible.value = true;
open();
}
});
onBeforeUnmount(() => {
eventRemover();
});
return {
afterEnter,
afterLeave,
beforeLeave,
handleClose,
closed,
visible,
zIndex,
animName,
dockItems,
closeDockItem,
restoreDockItem
};
};
export { CLOSED_EVENT, CLOSE_EVENT, ITEM_ADDED_EVENT, ITEM_CLOSED_EVENT, ITEM_RESTORED_EVENT, OPENED_EVENT, OPEN_EVENT, UPDATE_MODEL_EVENT, useDockContainer };
//# sourceMappingURL=use-dock-container.mjs.map