{"version":3,"file":"popovers.chunk-CZmrth7v.js","sources":["../../shared/utils/directives/popovers.ts"],"sourcesContent":["import { requestFrame } from '@shared/utils';\r\nimport { propogateForDataset } from '@shared/utils/DOM';\r\nimport { Directive } from 'vue';\r\n\r\nimport './popovers.css';\r\n\r\n/*\r\n * howto - add new stuff\r\n - under blueplrints in templates add a blueplrint method\r\n - add a get method in templates to generate a new template if none are cached of the same type // TODO: by-id template caching\r\n - create a setup function defining options, content, events yadayada. run 'popoverSetup' with that stuff\r\n - create a vue directive (has to start with a 'v' a la 'vPopconfirm') and define option syntax for markup. run the setup function from the previous step with the parsed options\r\n*/\r\n\r\ninterface UExt {\r\n __ugs: {\r\n // TODO: map\r\n [k: string]: any;\r\n };\r\n}\r\n//** extend markup element with '__ugs' custom property */\r\nexport const uExt = (target: T | (T & UExt)): T & UExt => {\r\n if (!target.hasOwnProperty('__ugs')) Object.defineProperty(target, '__ugs', { value: {} });\r\n\r\n return target;\r\n};\r\n\r\ntype TemplateBlueprint = {\r\n tag: string;\r\n id?: string;\r\n class?: string;\r\n innerText?: string;\r\n dataset?: {\r\n [k: string]: string;\r\n };\r\n children?: TemplateBlueprint[];\r\n ref?: string;\r\n displayHtml?: boolean;\r\n};\r\n\r\ntype GeneratedTemplate = {\r\n el: HTMLElement;\r\n refs: DynamicIndexable;\r\n};\r\n\r\n/**\r\n * * generates markup templates\r\n * @param blueprint template blueprint object\r\n * @returns object containing the template element and references to elements specified in blueprint props\r\n */\r\nconst templateFactory = (blueprint: TemplateBlueprint): GeneratedTemplate => {\r\n let refs: DynamicIndexable = {};\r\n\r\n const createElement = (props: TemplateBlueprint): HTMLElement => {\r\n let el = document.createElement(props.tag);\r\n\r\n if (props.id) el.id = props.id;\r\n\r\n if (props.class) el.classList.value = props.class;\r\n\r\n if (props.dataset) for (let key in props.dataset) el.dataset[key] = props.dataset[key];\r\n\r\n if (props.children) for (let childProps of props.children) el.appendChild(createElement(childProps));\r\n\r\n if (props.innerText) el.innerHTML = props.innerText;\r\n\r\n if (props.innerText) {\r\n if (props.displayHtml) {\r\n el.innerHTML = props.innerText;\r\n } else {\r\n el.innerText = props.innerText;\r\n }\r\n }\r\n\r\n if (props.ref) refs[props.ref] = el;\r\n\r\n return el;\r\n };\r\n\r\n return {\r\n el: createElement(blueprint),\r\n refs,\r\n };\r\n};\r\n\r\ntype PopoverTemplateType = 'popover' | 'popconfirm' | 'info';\r\ninterface TemplatesController extends MappedProperties {\r\n cache: DynamicIndexable;\r\n blueprints: DynamicIndexable<(children?: TemplateBlueprint[]) => TemplateBlueprint>;\r\n}\r\n\r\nconst templates: TemplatesController = {\r\n cache: {},\r\n blueprints: {\r\n popover: (children = []): TemplateBlueprint => ({\r\n tag: 'div', // html tag\r\n class: 'popover ugs-popover', // css classes, define styles in './popovers.css'\r\n dataset: {\r\n // datasets\r\n popover: 'active', // used for closing on outside click\r\n },\r\n children: [\r\n {\r\n tag: 'div',\r\n class: 'arrow',\r\n },\r\n ...children, // dynamic children\r\n ],\r\n }),\r\n popconfirm: () => ({\r\n tag: 'div',\r\n class: 'popconfirm ugs-popconfirm',\r\n children: [\r\n {\r\n tag: 'h3',\r\n class: 'popover-title',\r\n ref: 'heading', // 'ref' creates an element reference with given id to apply content|events|... has to be unique within the same template\r\n },\r\n {\r\n tag: 'div',\r\n class: 'popover-content',\r\n ref: 'body',\r\n },\r\n {\r\n tag: 'div',\r\n class: 'popover-btns text-right',\r\n children: [\r\n {\r\n tag: 'button',\r\n class: 'btn btn-link btn-sm',\r\n innerText: $Resources.ConfirmCancelButton, // non dynamic content\r\n ref: 'button_cancel', // used for events\r\n },\r\n {\r\n tag: 'button',\r\n class: 'btn btn-primary btn-sm',\r\n innerText: $Resources.ConfirmOkButton,\r\n ref: 'button_confirm',\r\n },\r\n ],\r\n },\r\n ],\r\n }),\r\n info: () => ({\r\n tag: 'div',\r\n children: [\r\n // kanske lägga till ett kryss?\r\n {\r\n tag: 'h3',\r\n class: 'popover-title',\r\n ref: 'heading',\r\n },\r\n {\r\n tag: 'div',\r\n class: 'popover-content',\r\n ref: 'body',\r\n },\r\n ],\r\n }),\r\n },\r\n get popover() {\r\n return (this.cache.popover ||= templateFactory(this.blueprints.popover()));\r\n },\r\n get popconfirm() {\r\n return (this.cache.popconfirm ||= templateFactory(this.blueprints.popover([this.blueprints.popconfirm()])));\r\n },\r\n get info() {\r\n return (this.cache.info ||= templateFactory(this.blueprints.popover([this.blueprints.info()])));\r\n },\r\n};\r\n\r\n//** popover instancing, placement and so on */\r\nexport const popover = (\r\n el: HTMLElement,\r\n container: HTMLElement | string | null = document.body,\r\n template: HTMLElement,\r\n placement: string = 'top',\r\n options?: { transitions: string }\r\n): void => {\r\n let selector = '';\r\n if (typeof container === 'string') container = document.querySelector((selector = container));\r\n\r\n if (!container) throw new Error(`Container element not found in popover, selector: ${selector}`, { cause: container });\r\n\r\n let containerRect = container.getBoundingClientRect(),\r\n elRect = el.getBoundingClientRect(),\r\n x = elRect.x - containerRect.x,\r\n y = elRect.y - containerRect.y;\r\n\r\n template.classList.add(placement);\r\n\r\n if (/top|bottom/.test(placement)) x += elRect.width / 2;\r\n if (placement === 'bottom') y += elRect.height;\r\n\r\n if (/left|right/.test(placement)) y += elRect.height / 2;\r\n if (placement === 'right') x += elRect.width;\r\n\r\n template.style.left = x + 'px';\r\n template.style.top = y + 'px';\r\n\r\n // TODO: define transitions & their trigger classes in options\r\n template.classList.add('fade');\r\n\r\n container.appendChild(template);\r\n\r\n requestFrame(() => template.classList.add('in'));\r\n};\r\n\r\ntype PopoverEvent = {\r\n target: HTMLElement | Window | Document | string;\r\n type: string;\r\n handler: Func;\r\n options?: boolean | AddEventListenerOptions | undefined;\r\n};\r\ntype ActivePopover = {\r\n type: PopoverTemplateType;\r\n target: HTMLElement;\r\n template: HTMLElement;\r\n placement?: string;\r\n events: PopoverEvent[];\r\n};\r\n\r\nconst active: {\r\n [k: string]: {\r\n popover: ActivePopover | null;\r\n lastTriggeredBy: HTMLElement | string | undefined;\r\n };\r\n} = {\r\n popconfirm: {\r\n popover: null,\r\n lastTriggeredBy: undefined,\r\n },\r\n info: {\r\n popover: null,\r\n lastTriggeredBy: undefined,\r\n },\r\n};\r\n\r\n//** reset popover */\r\nconst popoverReset = async (popover: ActivePopover | string | null = null, queue?: HTMLElement | string) => {\r\n if (typeof popover === 'string') popover = active[popover].popover;\r\n\r\n if (popover === null) return false;\r\n\r\n let { type, target, template, placement, events } = popover,\r\n { refs } = templates[type];\r\n\r\n if (target === queue) return false;\r\n active[popover.type].lastTriggeredBy = queue;\r\n\r\n template.classList.remove('in');\r\n await transitionState(template);\r\n\r\n template.remove();\r\n\r\n template.classList.remove(placement || 'top');\r\n\r\n for (let { target, type, handler } of events) {\r\n if (typeof target === 'string') target = refs[target];\r\n\r\n target?.removeEventListener(type, handler);\r\n }\r\n\r\n delete target.dataset.popover;\r\n active[popover.type].popover = null;\r\n\r\n return active[popover.type].lastTriggeredBy === queue;\r\n};\r\n\r\ninterface PopoverSetupOptions {\r\n innerText: { [k: string]: string };\r\n events?: PopoverEvent[];\r\n container?: HTMLElement | string | null;\r\n placement?: string;\r\n displayHtml: boolean;\r\n}\r\n/*\r\n * generalized popover setup\r\n ** goes through given options applying markup content, events, placement, etc\r\n */\r\nconst popoverSetup = async (type: PopoverTemplateType, target: HTMLElement | string, options: PopoverSetupOptions) => {\r\n let { innerText = {}, events = [], container, placement, displayHtml } = options,\r\n selector = '';\r\n if (typeof target === 'string') target = document.querySelector((selector = target));\r\n\r\n if (!target) throw new Error(`Target element not found in popover-${type}, selector: ${selector}`, { cause: target });\r\n\r\n target.dataset.popover = 'active'; // maybe specify a different value with better information || maybe not really needed\r\n if (active[type].popover) if (!(await popoverReset(active[type].popover, target))) return;\r\n\r\n let { el: template, refs } = templates[type];\r\n\r\n for (let ref in innerText) {\r\n if (displayHtml) {\r\n refs[ref].innerHTML = innerText[ref];\r\n } else {\r\n refs[ref].innerText = innerText[ref];\r\n }\r\n }\r\n\r\n // place target el\r\n popover(target, container, template, placement);\r\n\r\n // events\r\n for (let { target, type, handler, options } of events) {\r\n if (typeof target === 'string') target = refs[target];\r\n\r\n target?.addEventListener(type, handler, options);\r\n }\r\n\r\n // store active\r\n active[type].popover = {\r\n type,\r\n target,\r\n template,\r\n placement,\r\n events,\r\n };\r\n};\r\n\r\n/**\r\n * * poconfirm options setup\r\n * * can be used in plain code instancing\r\n * @param target HTMLElement or selector string\r\n * @param heading Message heading\r\n * @param body Message body\r\n * @param callback Callback on confirmed. Payload should be specified as an anonymous/decorated function e.g. () => callback(paybload)\r\n * @param container Container element. Defaults to body\r\n * @param placement\r\n */\r\nexport const popconfirm = async (\r\n target: HTMLElement | string,\r\n heading: string,\r\n body: string,\r\n callback: Func,\r\n cancelCallback?: Func,\r\n container?: HTMLElement | string | null,\r\n placement?: string,\r\n displayHtml: boolean = false\r\n) => {\r\n const type = 'popconfirm';\r\n\r\n // events\r\n const handleConfirm = () => {\r\n callback();\r\n\r\n popoverReset(type);\r\n };\r\n const handleCancel = () => {\r\n cancelCallback && cancelCallback();\r\n\r\n popoverReset(type);\r\n };\r\n const handleOutsideClick = (ev: MouseEvent) => {\r\n if (!propogateForDataset(ev.target, /active/, 'popover')) popoverReset(type);\r\n };\r\n\r\n let events: PopoverEvent[] = [\r\n {\r\n target: 'button_confirm',\r\n type: 'click',\r\n handler: handleConfirm,\r\n },\r\n {\r\n target: 'button_cancel',\r\n type: 'click',\r\n handler: handleCancel,\r\n },\r\n {\r\n target: window,\r\n type: 'click',\r\n handler: handleOutsideClick,\r\n },\r\n ];\r\n\r\n // setup popover\r\n popoverSetup(type, target, {\r\n innerText: {\r\n heading,\r\n body,\r\n },\r\n events,\r\n container,\r\n placement,\r\n displayHtml,\r\n });\r\n};\r\n\r\n//** shared directive things */\r\nconst placementModifiers = ['top', 'right', 'bottom', 'left'];\r\n\r\ninterface PopoverDirectiveBindings extends MappedProperties<'heading' | 'body' | 'placement', string> {\r\n container: HTMLElement | string | null;\r\n}\r\n\r\ninterface PopconfirmDirectiveBindings extends PopoverDirectiveBindings {\r\n callback: Func;\r\n cancelCallback?: Func;\r\n}\r\n\r\ninterface PopoverInfoDirectiveBindings extends MappedProperties<'heading' | 'body', string> {\r\n placement?: string | undefined;\r\n container?: HTMLElement | string;\r\n displayHtml?: boolean;\r\n}\r\n\r\n//** vue directive, simply for directive syntax options as it uses the plain code function for instancing */\r\nexport const vPopconfirm: Directive = {\r\n mounted(el, { value: { heading, body, callback, cancelCallback, container, placement }, modifiers, arg }) {\r\n if (!placement) for (let p of placementModifiers) if (modifiers[p]) placement = p;\r\n\r\n if (modifiers.unique) {\r\n // TODO: handle unique templates for each binding. // SPEC: WeakMap(el, template)\r\n }\r\n if (modifiers.shared && arg) {\r\n // TODO: handle shared templates with arg as the identifier\r\n }\r\n\r\n const handler = () => popconfirm(el, heading, body, callback, cancelCallback, container, placement);\r\n el.addEventListener('click', handler);\r\n\r\n uExt(el);\r\n\r\n el.__ugs.dispose = () => {\r\n el.removeEventListener('click', handler);\r\n };\r\n },\r\n unmounted(el) {\r\n el.__ugs.dispose();\r\n },\r\n};\r\n\r\n/**\r\n * * popover info options setup\r\n * * can be used in plain code instancing\r\n * @param target HTMLElement or selector string\r\n * @param heading Message heading\r\n * @param body Message body\r\n * @param container Container element. Defaults to body\r\n * @param placement\r\n */\r\nexport const popoverInfo = async (\r\n target: HTMLElement | string,\r\n heading: string,\r\n body: string,\r\n container?: HTMLElement | string,\r\n placement?: string,\r\n displayHtml: boolean = false\r\n) => {\r\n const type = 'info';\r\n\r\n // event handlers\r\n const handleClose = () => {\r\n popoverReset(type);\r\n };\r\n const handleOutsideClick = (ev: MouseEvent) => {\r\n if (!propogateForDataset(ev.target, /active/, 'popover')) popoverReset(type);\r\n };\r\n\r\n // events\r\n let events: PopoverEvent[] = [\r\n {\r\n target: 'button_close',\r\n type: 'click',\r\n handler: handleClose,\r\n },\r\n {\r\n target: window,\r\n type: 'click',\r\n handler: handleOutsideClick,\r\n },\r\n ];\r\n\r\n // setup popover\r\n popoverSetup(type, target, {\r\n innerText: {\r\n heading,\r\n body,\r\n },\r\n events,\r\n container,\r\n placement,\r\n displayHtml: displayHtml,\r\n });\r\n};\r\n\r\n//** vue directive, simply for directive syntax options as it uses the plain code function for instancing */\r\nexport const vPopoverInfo: Directive = {\r\n mounted(el, { value: { heading, body, placement, container, displayHtml }, modifiers, arg }) {\r\n if (!placement) for (let p of placementModifiers) if (modifiers[p]) placement = p;\r\n\r\n if (modifiers.unique) {\r\n // TODO: handle unique templates for each binding. // SPEC: WeakMap(el, template)\r\n }\r\n if (modifiers.shared && arg) {\r\n // TODO: handle shared templates with arg as the identifier\r\n }\r\n\r\n if (!displayHtml) displayHtml = false;\r\n\r\n const handler = () => popoverInfo(el, heading, body, container, placement, displayHtml);\r\n el.addEventListener('click', handler);\r\n\r\n uExt(el);\r\n\r\n el.__ugs.dispose = () => {\r\n el.removeEventListener('click', handler);\r\n };\r\n },\r\n unmounted(el) {\r\n el.__ugs.dispose();\r\n },\r\n};\r\n\r\n//** track transition state */\r\nexport const transitionState = (el: HTMLElement | (HTMLElement & UExt), callback?: Func) => {\r\n let target = uExt(el),\r\n resolve: Func;\r\n\r\n target.__ugs.transition = 'init';\r\n\r\n const setEndState = () => {\r\n target.__ugs.transition = 'done';\r\n target.removeEventListener('transitionrun', handleTransition);\r\n target.removeEventListener('transitionstart', handleTransition);\r\n target.removeEventListener('transitioncancel', handleTransitionEnd);\r\n target.removeEventListener('transitionend', handleTransitionEnd);\r\n\r\n resolve();\r\n };\r\n\r\n const handleTransition = (ev: TransitionEvent) => {\r\n if (ev.target !== target) return;\r\n\r\n target.__ugs.transition = 'active';\r\n };\r\n const handleTransitionEnd = (ev: TransitionEvent) => {\r\n if (ev.target !== target) return;\r\n\r\n setEndState();\r\n };\r\n\r\n target.addEventListener('transitionrun', handleTransition);\r\n target.addEventListener('transitionstart', handleTransition);\r\n target.addEventListener('transitioncancel', handleTransitionEnd);\r\n target.addEventListener('transitionend', handleTransitionEnd);\r\n\r\n // fallback in case motion is turned off in browser settings or no transition event is fired\r\n setTimeout(() => {\r\n if (target.__ugs.transition === 'init') setEndState();\r\n }, 64); // ~4 frames\r\n\r\n return new Promise((res: Func) => {\r\n resolve = () => {\r\n res();\r\n\r\n callback && callback();\r\n };\r\n });\r\n};\r\n"],"names":["requestFrame","propogateForDataset","uExt","target","templateFactory","blueprint","refs","createElement","props","el","key","childProps","templates","children","_a","popover","container","template","placement","options","selector","containerRect","elRect","x","y","active","popoverReset","queue","type","events","transitionState","handler","popoverSetup","innerText","displayHtml","ref","popconfirm","heading","body","callback","cancelCallback","ev","placementModifiers","vPopconfirm","modifiers","arg","p","popoverInfo","vPopoverInfo","resolve","setEndState","handleTransition","handleTransitionEnd","res"],"mappings":"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"}