element-plus
Version:
A Component Library for Vue 3
1 lines • 6.38 kB
Source Map (JSON)
{"version":3,"file":"index.mjs","sources":["../../../../../packages/directives/click-outside/index.ts"],"sourcesContent":["import { isArray, isClient, isElement } from '@element-plus/utils'\n\nimport type {\n ComponentPublicInstance,\n DirectiveBinding,\n ObjectDirective,\n} from 'vue'\n\ntype DocumentHandler = <T extends MouseEvent>(mouseup: T, mousedown: T) => void\ntype FlushList = Map<\n HTMLElement,\n {\n documentHandler: DocumentHandler\n bindingFn: (...args: unknown[]) => unknown\n }[]\n>\n\nconst nodeList: FlushList = new Map()\n\nif (isClient) {\n let startClick: MouseEvent | undefined\n document.addEventListener('mousedown', (e: MouseEvent) => (startClick = e))\n document.addEventListener('mouseup', (e: MouseEvent) => {\n if (startClick) {\n for (const handlers of nodeList.values()) {\n for (const { documentHandler } of handlers) {\n documentHandler(e as MouseEvent, startClick)\n }\n }\n startClick = undefined\n }\n })\n}\n\nfunction createDocumentHandler(\n el: HTMLElement,\n binding: DirectiveBinding\n): DocumentHandler {\n let excludes: HTMLElement[] = []\n if (isArray(binding.arg)) {\n excludes = binding.arg\n } else if (isElement(binding.arg)) {\n // due to current implementation on binding type is wrong the type casting is necessary here\n excludes.push(binding.arg as unknown as HTMLElement)\n }\n return function (mouseup, mousedown) {\n const popperRef = (\n binding.instance as ComponentPublicInstance<{\n popperRef: HTMLElement\n }>\n ).popperRef\n const mouseUpTarget = mouseup.target as Node\n const mouseDownTarget = mousedown?.target as Node\n const isBound = !binding || !binding.instance\n const isTargetExists = !mouseUpTarget || !mouseDownTarget\n const isContainedByEl =\n el.contains(mouseUpTarget) || el.contains(mouseDownTarget)\n const isSelf = el === mouseUpTarget\n\n const isTargetExcluded =\n (excludes.length &&\n excludes.some((item) => item?.contains(mouseUpTarget))) ||\n (excludes.length && excludes.includes(mouseDownTarget as HTMLElement))\n const isContainedByPopper =\n popperRef &&\n (popperRef.contains(mouseUpTarget) || popperRef.contains(mouseDownTarget))\n if (\n isBound ||\n isTargetExists ||\n isContainedByEl ||\n isSelf ||\n isTargetExcluded ||\n isContainedByPopper\n ) {\n return\n }\n binding.value(mouseup, mousedown)\n }\n}\n\nconst ClickOutside: ObjectDirective<HTMLElement, any> = {\n beforeMount(el, binding) {\n // there could be multiple handlers on the element\n if (!nodeList.has(el)) {\n nodeList.set(el, [])\n }\n\n nodeList.get(el)!.push({\n documentHandler: createDocumentHandler(el, binding),\n bindingFn: binding.value,\n })\n },\n updated(el, binding) {\n if (!nodeList.has(el)) {\n nodeList.set(el, [])\n }\n\n const handlers = nodeList.get(el)!\n const oldHandlerIndex = handlers.findIndex(\n (item) => item.bindingFn === binding.oldValue\n )\n const newHandler = {\n documentHandler: createDocumentHandler(el, binding),\n bindingFn: binding.value,\n }\n\n if (oldHandlerIndex >= 0) {\n // replace the old handler to the new handler\n handlers.splice(oldHandlerIndex, 1, newHandler)\n } else {\n handlers.push(newHandler)\n }\n },\n unmounted(el) {\n // remove all listeners when a component unmounted\n nodeList.delete(el)\n },\n}\n\nexport default ClickOutside\n"],"names":[],"mappings":"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"}