{"version":3,"file":"Toolkit.js","names":["Toolkit","a","setters","ToolTip","default","deepMerge","Event","throttle","execute","constructor","element","options","arguments","length","debugKey","freezeKey","debugModeShortcut","ctrlKey","altKey","shiftKey","key","hideTooltipOnMouseLeave","initState","state","isToolkitEnabled","isDebugKeyPressed","isDetailsFrozen","currentUUID","bindEvents","document","addEventListener","onKeydown","bind","onKeyup","onMousemove","event","x","clientX","y","clientY","elementFromPoint","hasAttribute","closest","uuid","getAttribute","hasContent","hideToolkitTooltip","tree","retrieveParentTree","meta","window","nglDebugMeta","content","concat","nglComponent","forEach","itemMeta","text","selectors","target","highlight","showContent","emit","type","classList","add","remove","initMeta","isFocusDisabled","onTooltipCloseClick","hideContent","unbindCustomTooltipEvents","unhighlight","retrieveParent","node","skipNodes","prevNode","previousSibling","parentNode","nodeType","Node","COMMENT_NODE","data","indexOf","parseMeta","nglID","nglTag","unshift","treeWalker","createTreeWalker","body","NodeFilter","SHOW_COMMENT","nextNode","currentNode","sibling","nextSibling","siblingUUID","siblingMeta","ELEMENT_NODE","TEXT_NODE","parent","nodeValue","trim","span","createElement","innerHTML","replaceChild","nextElementSibling","setAttribute","targetWidth","targetLeft","targetRectangle","getBoundingClientRect","targetRectangleLeft","left","scrollX","targetTop","top","scrollY","targetHeight","height","width","clientWidth","highlighterStyle","style","opacity","split","item","parts","map","str","value","destroy","removeEventListener"],"sources":["components/global/Toolkit.js"],"sourcesContent":["import ToolTip from 'components/global/ToolTip';\nimport { deepMerge } from 'toolbox/deepMerge';\nimport { Event } from 'services/EventEmitter';\nimport { throttle } from 'toolbox/throttle';\n\n/* eslint-disable complexity */\n/* eslint max-depth: [\"error\", 8] */\n\n/**\n * This is a description of the Toolkit constructor function.\n * @class\n * @classdesc This is a description of the Toolkit class. (must be edited)\n * @extends Component\n */\nexport default class Toolkit extends ToolTip {\n /**\n * Constructor of the class that mainly merge the options of the components\n * @param {HTMLElement} element HTMLElement of the component\n * @param {object} options options that belongs to the component\n */\n constructor(element, options = {}) {\n super(element, deepMerge({\n debugKey: 'Shift', // Hold this key and hover a component with mouse to display the debug information\n freezeKey: 'Alt', // Press this key to freeze the tooltip with debug information\n debugModeShortcut: { // Default toolkit enabling shortcut: CTRL + SHIFT + F12\n ctrlKey: true,\n altKey: false,\n shiftKey: true,\n key: 'F12',\n },\n hideTooltipOnMouseLeave: false,\n }, options));\n }\n\n /**\n * Init the different state of the component\n * It helps to avoid heavy DOM manipulation\n */\n initState() {\n super.initState();\n\n this.state.isToolkitEnabled = false;\n this.state.isDebugKeyPressed = false;\n this.state.isDetailsFrozen = false;\n this.state.currentUUID = null;\n }\n\n /**\n * Should contain only event listeners and nothing else\n * All the event handlers should be into a separated function. No usage of anonyous function\n */\n bindEvents() {\n document.addEventListener('keydown', this.onKeydown.bind(this));\n document.addEventListener('keyup', this.onKeyup.bind(this));\n document.addEventListener('mousemove', throttle(this.onMousemove.bind(this), 200));\n }\n\n /**\n * Mousemove event handler\n * @param {Object} event dom event\n */\n onMousemove(event) {\n if (!this.state.isDebugKeyPressed || this.state.isDetailsFrozen) {\n return;\n }\n\n const x = event.clientX;\n const y = event.clientY;\n let element = document.elementFromPoint(x, y);\n\n if (!element) {\n return;\n }\n\n if (!element.hasAttribute('[data-ngl-debug-uuid]')) {\n element = element.closest('[data-ngl-debug-uuid]');\n }\n\n const uuid = (element && element.getAttribute('data-ngl-debug-uuid')) || null;\n\n // hide content if no selected component or it is not equal to current one\n if (this.state.currentUUID !== uuid) {\n this.state.hasContent = false;\n if (!this.state.isDetailsFrozen) {\n this.hideToolkitTooltip();\n }\n }\n\n this.state.currentUUID = uuid;\n\n if (!this.state.currentUUID) {\n return;\n }\n\n const tree = this.retrieveParentTree(element);\n const meta = window.nglDebugMeta[uuid];\n let content = `<p><strong>Component: </strong>${meta.nglComponent}</p>`;\n\n if (tree.length) {\n content += '<p><strong>Components tree</strong></p>';\n content += '<ul>';\n tree.forEach((itemMeta) => {\n content += `<li>${itemMeta.nglComponent}</li>`;\n });\n content += '</ul>';\n }\n this.options.text = content;\n this.hideToolkitTooltip();\n this.selectors.target = element;\n this.highlight(this.selectors.target);\n super.showContent();\n }\n\n /**\n * Keydown event handler\n * @param {Object} event dom event\n */\n onKeydown(event) {\n if (this.options.debugModeShortcut.ctrlKey === event.ctrlKey\n && this.options.debugModeShortcut.altKey === event.altKey\n && this.options.debugModeShortcut.shiftKey === event.shiftKey\n && this.options.debugModeShortcut.key === event.key) {\n // Toggle developer toolkit debug mode\n this.state.isToolkitEnabled = !this.state.isToolkitEnabled;\n\n if (this.state.isToolkitEnabled) {\n Event.emit('snackbar.notify', { content: 'Developer toolkit is enabled', type: 'success' });\n this.element.classList.add('m-visible');\n } else {\n Event.emit('snackbar.notify', { content: 'Developer toolkit is disabled', type: 'warning' });\n this.element.classList.remove('m-visible');\n }\n }\n\n if (this.state.isToolkitEnabled && event.key === this.options.debugKey) {\n if (!this.state.isDebugKeyPressed) {\n this.initMeta();\n }\n\n this.state.isDebugKeyPressed = true;\n }\n\n if (this.state.isToolkitEnabled\n && this.state.isDebugKeyPressed && event.key === this.options.freezeKey) {\n this.hideToolkitTooltip();\n this.state.isFocusDisabled = false;\n this.highlight(this.selectors.target);\n super.showContent();\n this.state.isDetailsFrozen = true;\n }\n }\n\n /**\n * Keyup event handler\n * @param {Object} event DOM event\n */\n onKeyup(event) {\n if ((event.key === this.options.debugKey && !this.state.isDetailsFrozen) || event.key === 'Escape') {\n this.hideToolkitTooltip();\n }\n }\n\n /**\n * Tooltip Close click event handler\n */\n onTooltipCloseClick() {\n this.hideToolkitTooltip();\n }\n\n /**\n * Hide toolkit tooltip\n * @param {Object} event DOM event\n */\n hideToolkitTooltip() {\n this.state.isDebugKeyPressed = false;\n this.state.isDetailsFrozen = false;\n\n super.hideContent();\n super.unbindCustomTooltipEvents();\n this.unhighlight(this.selectors.target);\n\n this.state.isFocusDisabled = true;\n }\n\n /**\n * Retrieves parent meta data commonet\n * @param {Node} node DOM node\n * @returns {Node} parent commone node with tooklit metadata\n */\n retrieveParent(node) {\n // list of comment nodes which should not be taken into account\n const skipNodes = {};\n // get prev node\n let prevNode = node.previousSibling || node.parentNode;\n\n // iterate from the current node up the tree\n while (prevNode) {\n // check if node is comment node with NGL meta data\n if (prevNode.nodeType === Node.COMMENT_NODE && prevNode.data && prevNode.data.indexOf('nglID') > -1) {\n const meta = this.parseMeta(prevNode.data);\n const uuid = meta.nglID;\n\n // if \"end\" comment found first, skip its start, because comments on same level but not parent\n if (meta.nglTag === 'end') {\n skipNodes[uuid] = true;\n } else if (meta.nglTag === 'begin' && !skipNodes[uuid]) {\n // return comment node with debug meta\n return prevNode;\n }\n }\n\n // retrieve next node\n prevNode = prevNode.previousSibling || prevNode.parentNode;\n }\n\n return null;\n }\n\n /**\n * Return list of parent meta data objects\n * @param {Node} element DOM element\n * @returns {array} list of parent meta data objects\n */\n retrieveParentTree(element) {\n const tree = [];\n let node = this.retrieveParent(element);\n\n while (node) {\n // build list of parent components\n tree.unshift(this.parseMeta(node.data));\n node = this.retrieveParent(node);\n }\n\n return tree;\n }\n\n /**\n * Tooltip method overload to unfreeze modal-like tooltip\n */\n hideContent() {\n this.hideToolkitTooltip();\n }\n\n /**\n * Initialize component meta data\n */\n initMeta() {\n const treeWalker = document.createTreeWalker(document.body, NodeFilter.SHOW_COMMENT, null, false);\n // set global debug meta\n window.nglDebugMeta = {};\n\n while (treeWalker.nextNode()) {\n const { currentNode } = treeWalker;\n\n if (!currentNode.data || currentNode.data.indexOf('nglID') === -1) {\n continue; // eslint-disable-line no-continue\n }\n\n const meta = this.parseMeta(currentNode.data);\n const uuid = meta.nglID;\n\n // skip end tag processing\n if (meta.nglTag === 'end') {\n continue; // eslint-disable-line no-continue\n }\n\n // find content between two begin/end comments\n let sibling = currentNode.nextSibling;\n\n while (sibling) {\n // check if this is end of current component\n if (sibling.nodeType === Node.COMMENT_NODE) {\n let siblingUUID = null;\n\n if (sibling.data && sibling.data.indexOf('nglID') > -1) {\n const siblingMeta = this.parseMeta(sibling.data);\n siblingUUID = siblingMeta.nglID;\n }\n\n // compare uuid of comments\n if (uuid && uuid === siblingUUID) {\n // prevent execution if end found\n break;\n }\n } else if (sibling.nodeType === Node.ELEMENT_NODE || sibling.nodeType === Node.TEXT_NODE) {\n let target = null;\n // if node is pure text, wrap it in span, otherwise we will not be able to add \"mouseenter\" event listener\n if (sibling.nodeType === Node.TEXT_NODE) {\n const parent = sibling.parentNode;\n\n if (parent && sibling.nodeValue && sibling.nodeValue.trim()) {\n // create span and replace text node with it\n const span = document.createElement('span');\n span.innerHTML = sibling.nodeValue;\n parent.replaceChild(span, sibling);\n target = span;\n }\n } else {\n target = currentNode.nextElementSibling;\n }\n\n // do no assign new event listeners if element already has debug information\n if (target) {\n // set debug uuid to element\n target.setAttribute('data-ngl-debug-uuid', uuid);\n window.nglDebugMeta[uuid] = meta;\n }\n }\n\n // go to next sibling if end was not reached\n sibling = sibling.nextSibling;\n }\n }\n }\n\n /**\n * Highlight element\n * @param {Element} element dom element to be highlighted\n */\n highlight(element) {\n if (!this.selectors.target) {\n return;\n }\n\n let targetWidth;\n let targetLeft;\n const borderWidth = 3;\n const targetRectangle = element.getBoundingClientRect();\n const targetRectangleLeft = targetRectangle.left + window.scrollX;\n const targetTop = targetRectangle.top + window.scrollY - (borderWidth * 2);\n const targetHeight = targetRectangle.height + (borderWidth * 2);\n\n // Check if target element full width\n if (targetRectangle.width >= document.body.clientWidth) {\n targetWidth = targetRectangle.width - (borderWidth * 4);\n targetLeft = borderWidth;\n // Check if target element too close to left side\n } else if (targetRectangleLeft < borderWidth * 2) {\n targetWidth = targetRectangle.width - (borderWidth * 2);\n targetLeft = borderWidth;\n // Check if target element too close to right side\n } else if (targetRectangleLeft + targetRectangle.width + (borderWidth * 2)\n >= document.body.clientWidth) {\n targetWidth = targetRectangle.width - (borderWidth * 2);\n targetLeft = document.body.clientWidth - targetRectangle.width - borderWidth;\n } else {\n targetWidth = targetRectangle.width + (borderWidth * 2);\n targetLeft = targetRectangleLeft - (borderWidth * 2);\n }\n\n const highlighterStyle = this.element.style;\n\n highlighterStyle.top = `${targetTop}px`;\n highlighterStyle.left = `${targetLeft}px`;\n highlighterStyle.width = `${targetWidth >= 0 ? targetWidth : 0}px`;\n highlighterStyle.height = `${targetHeight}px`;\n highlighterStyle.opacity = '1';\n }\n\n /**\n * Unhighlight element\n * @param {Element} element dom element to be unhighlighted\n */\n unhighlight() {\n if (!this.selectors.target) {\n return;\n }\n\n const highlighterStyle = this.element.style;\n\n highlighterStyle.width = '0';\n highlighterStyle.height = '0';\n highlighterStyle.opacity = '0';\n }\n\n /**\n * Parse meta data into object\n * @param {String} data meta data to be parsed\n * @returns {Object} toolkit meta\n */\n parseMeta(data) {\n if (!data) {\n return {};\n }\n const meta = {};\n\n data.split(':').forEach((item) => {\n const parts = item.split('=').map(str => str.trim());\n\n if (parts && parts.length === 2) {\n const [key, value] = parts;\n meta[key] = value;\n }\n });\n\n return meta;\n }\n\n /**\n * Destroy is called automatically after the component is being removed from the DOM\n * You must always destroy the listeners attached to an element to avoid any memory leaks\n */\n destroy() {\n super.destroy();\n\n document.removeEventListener('keydown', this.onKeydown.bind(this));\n document.removeEventListener('keyup', this.onKeyup.bind(this));\n document.removeEventListener('mousemove', this.onMousemove.bind(this));\n }\n}\n"],"mappings":"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","ignoreList":[]}