UNPKG

element-plus

Version:

A Component Library for Vue 3

1 lines 8.67 kB
{"version":3,"file":"popup-manager.mjs","sources":["../../../../packages/utils/popup-manager.ts"],"sourcesContent":["import isServer from './isServer'\nimport * as configs from './config'\nimport { addClass, removeClass, on } from './dom'\nimport { EVENT_CODE } from './aria'\n\nimport type { Ref } from 'vue'\ninterface Instance {\n closeOnClickModal: Ref<boolean>\n closeOnPressEscape: Ref<boolean>\n close: () => void\n handleClose?: () => void\n handleAction?: (action: string) => void\n}\n\ntype StackFrame = { id: string; zIndex: number; modalClass: string }\n\ninterface IPopupManager {\n getInstance: (id: string) => Instance\n zIndex: number\n modalDom?: HTMLElement\n modalFade: boolean\n modalStack: StackFrame[]\n nextZIndex: () => number\n register: (id: string, instance: Instance) => void\n deregister: (id: string) => void\n doOnModalClick: () => void\n openModal: (\n id: string,\n zIndex: number,\n dom: HTMLElement,\n modalClass: string,\n modalFade: boolean\n ) => void\n closeModal: (id: string) => void\n}\n\nconst onTouchMove = (e: Event) => {\n e.preventDefault()\n e.stopPropagation()\n}\n\nconst onModalClick = () => {\n PopupManager?.doOnModalClick()\n}\n\nlet hasModal = false\nlet zIndex: number\n\nconst getModal = function (): HTMLElement {\n if (isServer) return\n let modalDom = PopupManager.modalDom\n if (modalDom) {\n hasModal = true\n } else {\n hasModal = false\n modalDom = document.createElement('div')\n PopupManager.modalDom = modalDom\n\n on(modalDom, 'touchmove', onTouchMove)\n on(modalDom, 'click', onModalClick)\n }\n\n return modalDom\n}\n\nconst instances = {}\n\nconst PopupManager: IPopupManager = {\n modalFade: true,\n modalDom: undefined,\n zIndex,\n\n getInstance(id) {\n return instances[id]\n },\n\n register(id, instance) {\n if (id && instance) {\n instances[id] = instance\n }\n },\n\n deregister(id) {\n if (id) {\n instances[id] = null\n delete instances[id]\n }\n },\n\n nextZIndex() {\n return ++PopupManager.zIndex\n },\n\n modalStack: [],\n\n doOnModalClick() {\n const topItem = PopupManager.modalStack[PopupManager.modalStack.length - 1]\n if (!topItem) return\n\n const instance = PopupManager.getInstance(topItem.id)\n if (instance && instance.closeOnClickModal.value) {\n instance.close()\n }\n },\n\n openModal(id, zIndex, dom, modalClass, modalFade) {\n if (isServer) return\n if (!id || zIndex === undefined) return\n this.modalFade = modalFade\n\n const modalStack = this.modalStack\n\n for (let i = 0, j = modalStack.length; i < j; i++) {\n const item = modalStack[i]\n if (item.id === id) {\n return\n }\n }\n\n const modalDom = getModal()\n\n addClass(modalDom, 'v-modal')\n if (this.modalFade && !hasModal) {\n addClass(modalDom, 'v-modal-enter')\n }\n if (modalClass) {\n const classArr = modalClass.trim().split(/\\s+/)\n classArr.forEach((item) => addClass(modalDom, item))\n }\n setTimeout(() => {\n removeClass(modalDom, 'v-modal-enter')\n }, 200)\n\n if (dom && dom.parentNode && dom.parentNode.nodeType !== 11) {\n dom.parentNode.appendChild(modalDom)\n } else {\n document.body.appendChild(modalDom)\n }\n\n if (zIndex) {\n modalDom.style.zIndex = String(zIndex)\n }\n modalDom.tabIndex = 0\n modalDom.style.display = ''\n\n this.modalStack.push({ id, zIndex, modalClass })\n },\n\n closeModal(id) {\n const modalStack = this.modalStack\n const modalDom = getModal()\n\n if (modalStack.length > 0) {\n const topItem = modalStack[modalStack.length - 1]\n if (topItem.id === id) {\n if (topItem.modalClass) {\n const classArr = topItem.modalClass.trim().split(/\\s+/)\n classArr.forEach((item) => removeClass(modalDom, item))\n }\n\n modalStack.pop()\n if (modalStack.length > 0) {\n modalDom.style.zIndex = modalStack[modalStack.length - 1].zIndex\n }\n } else {\n for (let i = modalStack.length - 1; i >= 0; i--) {\n if (modalStack[i].id === id) {\n modalStack.splice(i, 1)\n break\n }\n }\n }\n }\n\n if (modalStack.length === 0) {\n if (this.modalFade) {\n addClass(modalDom, 'v-modal-leave')\n }\n setTimeout(() => {\n if (modalStack.length === 0) {\n if (modalDom.parentNode) modalDom.parentNode.removeChild(modalDom)\n modalDom.style.display = 'none'\n // off(modalDom, 'touchmove', onTouchMove)\n // off(modalDom, 'click', onModalClick)\n PopupManager.modalDom = undefined\n }\n removeClass(modalDom, 'v-modal-leave')\n }, 200)\n }\n },\n}\n\nObject.defineProperty(PopupManager, 'zIndex', {\n configurable: true,\n get() {\n if (zIndex === undefined) {\n zIndex = (configs.getConfig('zIndex') as number) || 2000\n }\n return zIndex\n },\n set(value) {\n zIndex = value\n },\n})\n\nconst getTopPopup = function () {\n if (isServer) return\n if (PopupManager.modalStack.length > 0) {\n const topPopup = PopupManager.modalStack[PopupManager.modalStack.length - 1]\n if (!topPopup) return\n const instance = PopupManager.getInstance(topPopup.id)\n\n return instance\n }\n}\n\nif (!isServer) {\n // handle `esc` key when the popup is shown\n on(window, 'keydown', function (event: KeyboardEvent) {\n if (event.code === EVENT_CODE.esc) {\n const topPopup = getTopPopup()\n\n if (topPopup && topPopup.closeOnPressEscape.value) {\n topPopup.handleClose\n ? topPopup.handleClose()\n : topPopup.handleAction\n ? topPopup.handleAction('cancel')\n : topPopup.close()\n }\n }\n })\n}\n\nexport default PopupManager\n"],"names":["configs.getConfig"],"mappings":"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"}