tav-ui
Version:
1 lines • 5.09 kB
Source Map (JSON)
{"version":3,"file":"clickOutside2.mjs","sources":["../../../../../../packages/directives/src/clickOutside.ts"],"sourcesContent":["import { on } from '@tav-ui/utils/domUtils'\nimport { isServer } from '@tav-ui/utils/is'\nimport type { App, ComponentPublicInstance, DirectiveBinding, ObjectDirective } from 'vue'\n\ntype DocumentHandler = <T extends MouseEvent>(mouseup: T, mousedown: T) => void\ntype Nullable<T> = T | null\ntype FlushList = Map<\n HTMLElement,\n {\n documentHandler: DocumentHandler\n bindingFn: (...args: unknown[]) => unknown\n }\n>\n\nconst nodeList: FlushList = new Map()\n\nlet startClick: MouseEvent\n\nif (!isServer) {\n on(document, 'mousedown', (e: any) => (startClick = e))\n on(document, 'mouseup', (e: any) => {\n for (const { documentHandler } of nodeList.values()) {\n documentHandler(e, startClick)\n }\n })\n}\n\nfunction createDocumentHandler(el: HTMLElement, binding: DirectiveBinding): DocumentHandler {\n let excludes: HTMLElement[] = []\n if (Array.isArray(binding.arg)) {\n excludes = binding.arg\n } else {\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: Nullable<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 = el.contains(mouseUpTarget) || el.contains(mouseDownTarget)\n const isSelf = el === mouseUpTarget\n\n const isTargetExcluded =\n (excludes.length && excludes.some((item) => item?.contains(mouseUpTarget))) ||\n (excludes.length && excludes.includes(mouseDownTarget as HTMLElement))\n const isContainedByPopper =\n popperRef && (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()\n }\n}\n\nconst ClickOutsideDirective: ObjectDirective = {\n beforeMount(el, binding) {\n nodeList.set(el, {\n documentHandler: createDocumentHandler(el, binding),\n bindingFn: binding.value,\n })\n },\n updated(el, binding) {\n nodeList.set(el, {\n documentHandler: createDocumentHandler(el, binding),\n bindingFn: binding.value,\n })\n },\n unmounted(el) {\n nodeList.delete(el)\n },\n}\n\nexport function setupClickOutsideDirective(app: App) {\n app.directive('clickOutside', ClickOutsideDirective)\n}\n\nexport default ClickOutsideDirective\n"],"names":[],"mappings":"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"}