UNPKG

@shopware-ag/meteor-component-library

Version:

The meteor component library is a Vue component library developed by Shopware. It is based on the [Meteor Design System](https://shopware.design/).

1 lines 23.5 kB
{"version":3,"file":"tooltip.directive-a5042569.mjs","sources":["../src/directives/tooltip.directive.ts"],"sourcesContent":["import { createId } from \"../utils/id\";\nimport type { ObjectDirective } from \"vue\";\n\n/**\n * @package admin\n */\ntype Placements = \"top\" | \"right\" | \"bottom\" | \"left\";\n\nconst availableTooltipPlacements: Placements[] = [\"top\", \"right\", \"bottom\", \"left\"];\n\nconst tooltipRegistry = new Map<string, Tooltip>();\n\n/**\n * @private\n */\nclass Tooltip {\n private _id?: string;\n\n private _placement?: Placements;\n\n private _message: string;\n\n private _width: number | string;\n\n private _parentDOMElement: HTMLElement;\n\n private _showDelay: number;\n\n private _hideDelay: number;\n\n private _disabled: boolean;\n\n private _appearance: string;\n\n private _showOnDisabledElements: boolean;\n\n private _zIndex: number | null;\n\n private _isShown: boolean;\n\n private _state: boolean;\n\n private _DOMElement: HTMLElement | null;\n\n private _parentDOMElementWrapper: HTMLElement | null;\n\n private _actualTooltipPlacement: Placements | null;\n\n private _timeout?: ReturnType<typeof setTimeout>;\n\n constructor({\n id = createId(),\n placement = \"top\",\n message,\n width = 200,\n element,\n showDelay = 100,\n hideDelay = showDelay,\n disabled = false,\n appearance = \"dark\",\n showOnDisabledElements = false,\n zIndex = null,\n }: {\n id?: string;\n placement?: Placements;\n message?: string;\n width?: number | string;\n element: HTMLElement;\n showDelay?: number;\n hideDelay?: number;\n disabled: boolean;\n appearance?: string;\n showOnDisabledElements?: boolean;\n zIndex?: number | null;\n }) {\n this._id = id;\n this._placement = Tooltip.validatePlacement(placement);\n this._message = Tooltip.validateMessage(message);\n this._width = Tooltip.validateWidth(width);\n this._parentDOMElement = element;\n this._showDelay = showDelay ?? 100;\n this._hideDelay = hideDelay ?? 100;\n this._disabled = disabled;\n this._appearance = appearance;\n this._showOnDisabledElements = showOnDisabledElements;\n this._zIndex = zIndex;\n\n // initialize tooltip variables\n this._isShown = false;\n this._state = false;\n this._DOMElement = null;\n this._parentDOMElementWrapper = null;\n this._actualTooltipPlacement = null;\n }\n\n get id() {\n return this._id;\n }\n\n /**\n * Initializes the tooltip.\n * Needs to be called after the parent DOM Element is inserted to the DOM.\n */\n init() {\n this._DOMElement = this.createDOMElement();\n\n if (this._showOnDisabledElements) {\n this._parentDOMElementWrapper = this.createParentDOMElementWrapper();\n }\n\n this.registerEvents();\n }\n\n /**\n * Updates the styles and/or text of the tooltip\n */\n update({\n message,\n placement,\n width,\n showDelay,\n hideDelay,\n disabled,\n appearance,\n showOnDisabledElements,\n zIndex,\n }: {\n message?: string;\n placement?: Placements;\n width?: number | string;\n showDelay?: number;\n hideDelay?: number;\n disabled?: boolean;\n appearance?: string;\n showOnDisabledElements?: boolean;\n zIndex?: number | null;\n }) {\n if (message && this._message !== message) {\n this._message = Tooltip.validateMessage(message);\n\n if (this._DOMElement) {\n this._DOMElement.innerHTML = this._message;\n }\n\n this.registerEvents();\n }\n\n if (width && this._width !== width) {\n this._width = Tooltip.validateWidth(width);\n this._DOMElement!.style.width = `${this._width}px`;\n }\n\n if (placement && this._placement !== placement) {\n this._placement = Tooltip.validatePlacement(placement);\n this._placeTooltip();\n }\n\n if (showDelay && this._showDelay !== showDelay) {\n this._showDelay = showDelay;\n }\n\n if (hideDelay && this._hideDelay !== hideDelay) {\n this._hideDelay = hideDelay;\n }\n\n if (disabled !== undefined && this._disabled !== disabled) {\n this._disabled = disabled;\n }\n\n if (appearance && this._appearance !== appearance) {\n this._DOMElement!.classList.remove(`mt-tooltip--${this._appearance}`);\n this._appearance = appearance;\n this._DOMElement!.classList.add(`mt-tooltip--${this._appearance}`);\n }\n\n if (\n showOnDisabledElements !== undefined &&\n this._showOnDisabledElements !== showOnDisabledElements\n ) {\n this._showOnDisabledElements = showOnDisabledElements;\n }\n\n if (zIndex !== this._zIndex && zIndex !== undefined) {\n this._zIndex = zIndex;\n }\n }\n\n /**\n * Creates a wrapper around the original DOMElement.\n * This is needed because a disabled input field does not fire any mouse events and prevents the tooltip\n * therefore from working.\n * @returns {HTMLElement}\n */\n createParentDOMElementWrapper() {\n const element = document.createElement(\"div\");\n element.classList.add(\"mt-tooltip--wrapper\");\n\n this._parentDOMElement.parentNode!.insertBefore(element, this._parentDOMElement);\n element.appendChild(this._parentDOMElement);\n\n return element;\n }\n\n createDOMElement(): HTMLElement {\n const element = document.createElement(\"div\");\n element.innerHTML = this._message;\n element.style.width = `${this._width}px`;\n element.setAttribute(\"aria-hidden\", \"false\");\n element.setAttribute(\"aria-role\", \"tooltip\");\n element.setAttribute(\"aria-label\", \"currently-opened-tooltip\");\n element.classList.add(\"mt-tooltip\");\n element.classList.add(`mt-tooltip--${this._appearance}`);\n\n if (this._zIndex !== null) {\n element.style.zIndex = this._zIndex.toFixed(0);\n }\n\n return element;\n }\n\n registerEvents() {\n if (this._parentDOMElementWrapper) {\n this._parentDOMElementWrapper.addEventListener(\"mouseenter\", this.onMouseToggle.bind(this));\n this._parentDOMElementWrapper.addEventListener(\"mouseleave\", this.onMouseToggle.bind(this));\n } else {\n this._parentDOMElement.addEventListener(\"mouseenter\", this.onMouseToggle.bind(this));\n this._parentDOMElement.addEventListener(\"mouseleave\", this.onMouseToggle.bind(this));\n }\n this._DOMElement!.addEventListener(\"mouseenter\", this.onMouseToggle.bind(this));\n this._DOMElement!.addEventListener(\"mouseleave\", this.onMouseToggle.bind(this));\n }\n\n /**\n * Sets the state and triggers the toggle.\n */\n onMouseToggle(event: MouseEvent) {\n this._state = event.type === \"mouseenter\";\n\n if (this._timeout) {\n clearTimeout(this._timeout);\n }\n\n this._timeout = setTimeout(\n this._toggle.bind(this),\n this._state ? this._showDelay : this._hideDelay,\n );\n }\n\n _toggle() {\n if (this._state && !this._isShown && this._doesParentExist()) {\n this.showTooltip();\n return;\n }\n\n if (!this._state && this._isShown) {\n this.hideTooltip();\n }\n }\n\n /**\n * Gets the parent element by tag name and tooltip id and returns true or false whether the element exists.\n * @returns {boolean}\n * @private\n */\n _doesParentExist() {\n const tooltipIdOfParentElement = this._parentDOMElement.getAttribute(\"tooltip-id\") ?? \"\";\n const htmlTagOfParentElement = this._parentDOMElement.tagName.toLowerCase();\n\n return !!document.querySelector(\n `${htmlTagOfParentElement}[tooltip-id=\"${tooltipIdOfParentElement}\"]`,\n );\n }\n\n /**\n * Appends the tooltip to the DOM and sets a suitable position\n */\n showTooltip() {\n if (this._disabled) {\n return;\n }\n document.body.appendChild(this._DOMElement!);\n\n this._placeTooltip();\n this._isShown = true;\n }\n\n /**\n * Removes the tooltip from the DOM\n */\n hideTooltip() {\n if (this._disabled) {\n return;\n }\n\n this._DOMElement!.remove();\n this._isShown = false;\n }\n\n _placeTooltip() {\n let possiblePlacements = availableTooltipPlacements;\n let placement = this._placement;\n possiblePlacements = possiblePlacements.filter((pos) => pos !== placement);\n\n // Remove previous placement class if it exists\n this._DOMElement!.classList.remove(`mt-tooltip--${this._actualTooltipPlacement!}`);\n\n // Set the tooltip to the desired place\n this._setDOMElementPosition(this._calculateTooltipPosition(placement ?? \"top\"));\n this._actualTooltipPlacement = placement ?? null;\n\n // Check if the tooltip is fully visible in viewport and change position if not\n while (!this._isElementInViewport(this._DOMElement!)) {\n // The tooltip wont fit in any position\n if (possiblePlacements.length < 1) {\n this._actualTooltipPlacement = this._placement ?? null;\n this._setDOMElementPosition(this._calculateTooltipPosition(this._placement ?? \"top\"));\n break;\n }\n // try the next position in the possiblePositions array\n placement = possiblePlacements.shift();\n this._setDOMElementPosition(this._calculateTooltipPosition(placement ?? \"top\"));\n this._actualTooltipPlacement = placement ?? null;\n }\n\n this._DOMElement!.classList.add(`mt-tooltip--${this._actualTooltipPlacement ?? \"\"}`);\n }\n\n _setDOMElementPosition({ top, left }: { top: string; left: string }) {\n this._DOMElement!.style.position = \"fixed\";\n this._DOMElement!.style.top = top;\n this._DOMElement!.style.left = left;\n }\n\n _calculateTooltipPosition(placement: Placements) {\n const boundingBox = this._parentDOMElement.getBoundingClientRect();\n const secureOffset = 10;\n\n let top;\n let left;\n\n switch (placement) {\n case \"bottom\":\n top = `${boundingBox.top + boundingBox.height + secureOffset}px`;\n left = `${boundingBox.left + boundingBox.width / 2 - this._DOMElement!.offsetWidth / 2}px`;\n break;\n case \"left\":\n top = `${boundingBox.top + boundingBox.height / 2 - this._DOMElement!.offsetHeight / 2}px`;\n left = `${boundingBox.left - secureOffset - this._DOMElement!.offsetWidth}px`;\n break;\n case \"right\":\n top = `${boundingBox.top + boundingBox.height / 2 - this._DOMElement!.offsetHeight / 2}px`;\n left = `${boundingBox.right + secureOffset}px`;\n break;\n case \"top\":\n default:\n top = `${boundingBox.top - this._DOMElement!.offsetHeight - secureOffset}px`;\n left = `${boundingBox.left + boundingBox.width / 2 - this._DOMElement!.offsetWidth / 2}px`;\n }\n return { top: top, left: left };\n }\n\n _isElementInViewport(element: HTMLElement) {\n // get position\n const boundingClientRect = element.getBoundingClientRect();\n const windowHeight = window.innerHeight || document.documentElement.clientHeight;\n const windowWidth = window.innerWidth || document.documentElement.clientWidth;\n\n // calculate which borders are in viewport\n const visibleBorders = {\n top: boundingClientRect.top > 0,\n right: boundingClientRect.right < windowWidth,\n bottom: boundingClientRect.bottom < windowHeight,\n left: boundingClientRect.left > 0,\n };\n\n return (\n visibleBorders.top && visibleBorders.right && visibleBorders.bottom && visibleBorders.left\n );\n }\n\n static validatePlacement<P extends Placements>(placement: P): Placements {\n if (!availableTooltipPlacements.includes(placement)) {\n console.warn(\n \"Tooltip Directive\",\n `The modifier has to be one of these \"${availableTooltipPlacements.join(\",\")}\"`,\n );\n\n return \"top\";\n }\n return placement;\n }\n\n static validateMessage(message?: string): string {\n if (typeof message !== \"string\") {\n console.warn(\"Tooltip Directive\", \"The tooltip needs a message with type string\");\n }\n\n return message ?? \"\";\n }\n\n static validateWidth(width: number | string): number | string {\n if (width === \"auto\") {\n return width;\n }\n\n if (typeof width !== \"number\" || width < 1) {\n console.warn(\"Tooltip Directive\", \"The tooltip width has to be a number greater 0\");\n return 200;\n }\n\n return width;\n }\n\n static validateDelay(delay: number): number {\n if (typeof delay !== \"number\" || delay < 1) {\n console.warn(\"Tooltip Directive\", \"The tooltip delay has to be a number greater 0\");\n return 100;\n }\n\n return delay;\n }\n}\n\n/**\n * Helper function for creating or updating a tooltip instance\n */\nfunction createOrUpdateTooltip(\n el: HTMLElement,\n {\n value,\n modifiers,\n }: {\n value: {\n message: string;\n position: Placements;\n showDelay: number;\n hideDelay: number;\n disabled: boolean;\n appearance: string;\n width: number | string;\n showOnDisabledElements: boolean;\n zIndex: number;\n };\n modifiers: {\n [key: string]: unknown;\n };\n },\n) {\n let message: string = typeof value === \"string\" ? value : value.message;\n message = message ? message.trim() : \"\";\n\n const placement = value.position || Object.keys(modifiers)[0];\n const showDelay = value.showDelay;\n const hideDelay = value.hideDelay;\n const disabled = value.disabled;\n const appearance = value.appearance;\n const width = value.width;\n const showOnDisabledElements = value.showOnDisabledElements;\n const zIndex = value.zIndex;\n\n const configuration = {\n element: el,\n message: message,\n placement: placement,\n width: width,\n showDelay: showDelay,\n hideDelay: hideDelay,\n disabled: disabled,\n appearance: appearance,\n showOnDisabledElements: showOnDisabledElements,\n zIndex: zIndex,\n };\n\n if (el.hasAttribute(\"tooltip-id\")) {\n const tooltip = tooltipRegistry.get(el.getAttribute(\"tooltip-id\")!);\n tooltip!.update(configuration);\n\n return;\n }\n\n const tooltip = new Tooltip(configuration);\n\n tooltipRegistry.set(tooltip.id ?? \"\", tooltip);\n el.setAttribute(\"tooltip-id\", tooltip.id!);\n}\n\n/**\n * Directive for tooltips\n * Usage:\n * v-tooltip=\"{configuration}\"\n * // configuration options:\n * message: The text to be displayed.\n * position: Position of the tooltip relative to the original element(top, bottom etc.).\n * width: The width of the tooltip.\n * showDelay: The delay before the tooltip is shown when the original element is hovered.\n * hideDelay: The delay before the tooltip is removed when the original element is not hovered.\n * disabled: Disables the tooltip and it wont be shown.\n * appearance: Sets a additional css class \"mt-tooltip--$appearance\" for styling\n * showOnDisabledElements: Shows the tooltip also if the original element is disabled. To achieve\n * this a wrapper div element is created around the original element because the original element\n * prevents mouse events when disabled.\n *\n * Examples:\n * // tooltip with default width of 200px and default position top:\n * v-tooltip=\"'Some text'\"\n * // tooltip with position bottom by modifier:\n * v-tooltip.bottom=\"'Some text'\"\n * // tooltip with position bottom and width 300px:\n * v-tooltip=\"{ message: 'Some Text', width: 200, position: 'bottom' }\"\n * // Alternative tooltip with position bottom and width 300px:\n * v-tooltip.bottom=\"{ message: 'Some Text', width: 200 }\"\n * // adjusting the delay:\n * v-tooltip.bottom=\"{ message: 'Some Text', width: 200, showDelay: 200, hideDelay: 300 }\"\n *\n * *Note that the position variable has a higher priority as the modifier\n */\nexport default {\n beforeMount: (el: HTMLElement, binding) => {\n createOrUpdateTooltip(el, binding);\n },\n\n unmounted: (el: HTMLElement) => {\n if (el.hasAttribute(\"tooltip-id\")) {\n const tooltip = tooltipRegistry.get(el.getAttribute(\"tooltip-id\")!);\n tooltip!.hideTooltip();\n }\n },\n\n updated: (el: HTMLElement, binding) => {\n createOrUpdateTooltip(el, binding);\n },\n\n /**\n * Initialize the tooltip once it has been inserted to the DOM.\n */\n mounted: (el: HTMLElement) => {\n if (el.hasAttribute(\"tooltip-id\")) {\n const tooltip = tooltipRegistry.get(el.getAttribute(\"tooltip-id\")!);\n\n tooltip!.init();\n }\n },\n} as ObjectDirective;\n"],"names":["tooltip"],"mappings":"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"}