UNPKG

element-plus

Version:

A Component Library for Vue 3

1 lines 5.03 kB
{"version":3,"file":"index.mjs","sources":["../../../../../packages/directives/click-outside/index.ts"],"sourcesContent":["import { on } from '@element-plus/utils/dom'\nimport isServer from '@element-plus/utils/isServer'\n\nimport type {\n ComponentPublicInstance,\n DirectiveBinding,\n ObjectDirective,\n} from 'vue'\nimport type { Nullable } from '@element-plus/utils/types'\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\nlet startClick: MouseEvent\n\nif (!isServer) {\n on(document, 'mousedown', (e: MouseEvent) => (startClick = e))\n on(document, 'mouseup', (e: MouseEvent) => {\n for (const handlers of nodeList.values()) {\n for (const { documentHandler } of handlers) {\n documentHandler(e, startClick)\n }\n }\n })\n}\n\nfunction createDocumentHandler(\n el: HTMLElement,\n binding: DirectiveBinding\n): DocumentHandler {\n let excludes: HTMLElement[] = []\n if (Array.isArray(binding.arg)) {\n excludes = binding.arg\n } else if ((binding.arg as unknown) instanceof HTMLElement) {\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 =\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 = {\n beforeMount(el: HTMLElement, binding: DirectiveBinding) {\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: HTMLElement, binding: DirectiveBinding) {\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: HTMLElement) {\n // remove all listeners when a component unmounted\n nodeList.delete(el)\n },\n}\n\nexport default ClickOutside\n"],"names":[],"mappings":";;;AAmBA,MAAM,WAAsB,IAAI;AAEhC,IAAI;AAEJ,IAAI,CAAC,UAAU;AACb,KAAG,UAAU,aAAa,CAAC,MAAmB,aAAa;AAC3D,KAAG,UAAU,WAAW,CAAC,MAAkB;AACzC,eAAW,YAAY,SAAS,UAAU;AACxC,iBAAW,EAAE,qBAAqB,UAAU;AAC1C,wBAAgB,GAAG;AAAA;AAAA;AAAA;AAAA;AAM3B,+BACE,IACA,SACiB;AACjB,MAAI,WAA0B;AAC9B,MAAI,MAAM,QAAQ,QAAQ,MAAM;AAC9B,eAAW,QAAQ;AAAA,aACT,QAAQ,eAA2B,aAAa;AAE1D,aAAS,KAAK,QAAQ;AAAA;AAExB,SAAO,SAAU,SAAS,WAAW;AACnC,UAAM,YACJ,QAAQ,SAGR;AACF,UAAM,gBAAgB,QAAQ;AAC9B,UAAM,kBAAkB,uCAAW;AACnC,UAAM,UAAU,CAAC,WAAW,CAAC,QAAQ;AACrC,UAAM,iBAAiB,CAAC,iBAAiB,CAAC;AAC1C,UAAM,kBACJ,GAAG,SAAS,kBAAkB,GAAG,SAAS;AAC5C,UAAM,SAAS,OAAO;AAEtB,UAAM,mBACH,SAAS,UACR,SAAS,KAAK,CAAC,SAAS,6BAAM,SAAS,mBACxC,SAAS,UAAU,SAAS,SAAS;AACxC,UAAM,sBACJ,wBACW,SAAS,kBAAkB,UAAU,SAAS;AAC3D,QACE,WACA,kBACA,mBACA,UACA,oBACA,qBACA;AACA;AAAA;AAEF,YAAQ,MAAM,SAAS;AAAA;AAAA;MAIrB,eAAgC;AAAA,EACpC,YAAY,IAAiB,SAA2B;AAEtD,QAAI,CAAC,SAAS,IAAI,KAAK;AACrB,eAAS,IAAI,IAAI;AAAA;AAGnB,aAAS,IAAI,IAAI,KAAK;AAAA,MACpB,iBAAiB,sBAAsB,IAAI;AAAA,MAC3C,WAAW,QAAQ;AAAA;AAAA;AAAA,EAGvB,QAAQ,IAAiB,SAA2B;AAClD,QAAI,CAAC,SAAS,IAAI,KAAK;AACrB,eAAS,IAAI,IAAI;AAAA;AAGnB,UAAM,WAAW,SAAS,IAAI;AAC9B,UAAM,kBAAkB,SAAS,UAC/B,CAAC,SAAS,KAAK,cAAc,QAAQ;AAEvC,UAAM,aAAa;AAAA,MACjB,iBAAiB,sBAAsB,IAAI;AAAA,MAC3C,WAAW,QAAQ;AAAA;AAGrB,QAAI,mBAAmB,GAAG;AAExB,eAAS,OAAO,iBAAiB,GAAG;AAAA,WAC/B;AACL,eAAS,KAAK;AAAA;AAAA;AAAA,EAGlB,UAAU,IAAiB;AAEzB,aAAS,OAAO;AAAA;AAAA;;;;"}