{"version":3,"file":"index.min.js","sources":["../../../SiteBuilderFramework/ClientLib/src/razor/builder.js","../../../SiteBuilderFramework/ClientLib/src/razor/accordion.js","../../../SiteBuilderFramework/ClientLib/src/razor/checkbox.js","../../../SiteBuilderFramework/ClientLib/src/utils/dom.js","../../../SiteBuilderFramework/ClientLib/src/utils/ui.js","../../../SiteBuilderFramework/ClientLib/src/razor/dialog.js","../../../SiteBuilderFramework/ClientLib/src/razor/dropdown.js","../../../SiteBuilderFramework/ClientLib/src/razor/fileupload.js","../../../SiteBuilderFramework/ClientLib/src/razor/inputpin.js","../../../SiteBuilderFramework/ClientLib/src/razor/place.js","../../../SiteBuilderFramework/ClientLib/src/utils/string.js","../../../SiteBuilderFramework/ClientLib/src/directives/tooltip.js","../../../SiteBuilderFramework/ClientLib/src/razor/tooltip.js","../../../SiteBuilderFramework/ClientLib/src/razor/razorUtils.js","../../../SiteBuilderFramework/ClientLib/src/razor/navigation.js","../../../SiteBuilderFramework/ClientLib/src/razor/index.js","../../../SiteBuilderFramework/ClientLib/src/razor/razorForm.js","../../ClientApp/src/website-tenant/index.js"],"sourcesContent":["export default function createRazorBuilder(options) {\r\n const self = {\r\n components: [],\r\n add: (component) => {\r\n console.log(\"builder.add\", component);\r\n self.components.push(component);\r\n // component.selector\r\n // component.create\r\n // component.attach\r\n return self;\r\n },\r\n init: (win) => {\r\n self.components.forEach((compo) => {\r\n Array.from(win.document.querySelectorAll(compo.selector)).forEach((node) => {\r\n compo.attach(node);\r\n console.log(\"attach component\", compo.selector, node);\r\n });\r\n });\r\n },\r\n };\r\n return self;\r\n}\r\n","/*\r\n * Accordion\r\n */\r\nconst showTab = (tab) => {\r\n console.log(\"showTab\", tab);\r\n const panel = tab.querySelector(\".accordion-tab-panel\");\r\n const toogleButton = tab.querySelector(\".accordion-trigger\");\r\n toogleButton.setAttribute(\"aria-expanded\", \"true\");\r\n\r\n tab.classList.add(\"active\");\r\n panel.style.height = \"auto\";\r\n\r\n var height = panel.clientHeight + \"px\";\r\n panel.style.height = \"0px\";\r\n\r\n setTimeout(function () {\r\n panel.style.height = height;\r\n }, 0);\r\n};\r\nconst hideTab = (tab) => {\r\n console.log(\"hideTab\", tab);\r\n const panel = tab.querySelector(\".accordion-tab-panel\");\r\n const toogleButton = tab.querySelector(\".accordion-trigger\");\r\n toogleButton.setAttribute(\"aria-expanded\", \"false\");\r\n\r\n if (parseInt(panel.style.height) > 0) {\r\n panel.style.height = \"0px\";\r\n panel.addEventListener(\"transitionend\", () => tab.classList.remove(\"active\"), { once: true });\r\n } else {\r\n tab.classList.remove(\"active\");\r\n }\r\n};\r\n\r\nconst attachAccordion = (node) => {\r\n const multiple = node.dataset.multiple === \"true\";\r\n const tabs = Array.from(node.querySelectorAll(\".a-accordion-tab\"));\r\n tabs.forEach((tab) => {\r\n if (tab.classList.contains(\"active\")) {\r\n const panel = tab.querySelector(\".accordion-tab-panel\");\r\n panel.style.height = panel.clientHeight + \"px\";\r\n }\r\n\r\n const toogleButton = tab.querySelector(\".accordion-trigger\");\r\n toogleButton.addEventListener(\"mousedown\", (e) => {\r\n e.preventDefault();\r\n if (tab.classList.contains(\"active\")) {\r\n hideTab(tab);\r\n } else {\r\n showTab(tab);\r\n }\r\n if (!multiple) {\r\n tabs.filter((t) => t !== tab).forEach((t) => hideTab(t));\r\n }\r\n });\r\n });\r\n};\r\n\r\nconst createAccordion = (attributes) => {};\r\n\r\nconst razorAccordion = {\r\n selector: \".a-accordion\",\r\n create: createAccordion,\r\n attach: attachAccordion,\r\n};\r\n\r\nexport default razorAccordion;\r\n","/*\r\n * Checkbox\r\n */\r\n\r\nconst attachCheckbox = (node) => {};\r\n\r\nconst createCheckbox = (attributes) => {};\r\n\r\nconst razorCheckbox = {\r\n selector: \".a-checkbox\",\r\n create: createCheckbox,\r\n attach: attachCheckbox,\r\n};\r\n\r\nexport default razorCheckbox;\r\n","const FOCUSABLE_ELEMENTS = [\r\n \"a[href]\",\r\n \"area[href]\",\r\n 'input:not([disabled]):not([type=\"hidden\"]):not([aria-hidden])',\r\n \"select:not([disabled]):not([aria-hidden])\",\r\n \"textarea:not([disabled]):not([aria-hidden])\",\r\n \"button:not([disabled]):not([aria-hidden])\",\r\n \"iframe\",\r\n \"object\",\r\n \"embed\",\r\n \"[contenteditable]\",\r\n '[tabindex]:not([tabindex^=\"-\"])',\r\n];\r\n\r\nexport function findAncestor(el, selector) {\r\n while ((el = el.parentElement) && !el.matches(selector));\r\n return el;\r\n}\r\n\r\nexport function findAncestorOrSelf(el, selector) {\r\n do {\r\n if (el.matches(selector)) {\r\n return true;\r\n }\r\n } while ((el = el.parentElement));\r\n return null;\r\n}\r\n\r\nexport function isVisible(elem) {\r\n return !!(elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length);\r\n}\r\n\r\n// Get absolute offset (top, left) of a node\r\nexport function offset(el) {\r\n // si le noeud est dans un document situé dans une iframe,\r\n // on ajout l'offet de l'iframe\r\n let iframeLeft = 0,\r\n iframeTop = 0;\r\n\r\n if (el.ownerDocument != document) {\r\n const parentIframe = el.ownerDocument.defaultView.frameElement;\r\n const iframeOffset = offset(parentIframe);\r\n iframeLeft = iframeOffset.left;\r\n iframeTop = iframeOffset.top;\r\n }\r\n\r\n const rect = el.getBoundingClientRect();\r\n const scrollLeft = parseInt(window.pageXOffset || document.documentElement.scrollLeft);\r\n const scrollTop = parseInt(window.pageYOffset || document.documentElement.scrollTop);\r\n\r\n return {\r\n top: parseInt(rect.top) + scrollTop + iframeTop,\r\n left: parseInt(rect.left) + scrollLeft + iframeLeft,\r\n right: parseInt(rect.right) + scrollLeft + iframeLeft,\r\n bottom: parseInt(rect.bottom) + scrollTop + iframeTop,\r\n };\r\n}\r\n\r\nexport function fadeIn(element, duration, callback) {\r\n if (element) {\r\n element.style.opacity = 0;\r\n\r\n let last = +new Date();\r\n let opacity = 0;\r\n\r\n let tick = function () {\r\n opacity = +element.style.opacity + (new Date().getTime() - last) / duration;\r\n element.style.opacity = opacity;\r\n last = +new Date();\r\n\r\n if (+opacity < 1) {\r\n (window.requestAnimationFrame && requestAnimationFrame(tick)) || setTimeout(tick, 16);\r\n } else {\r\n callback && callback();\r\n }\r\n };\r\n\r\n tick();\r\n }\r\n}\r\n\r\nexport function fadeOut(element, duration, callback) {\r\n if (element) {\r\n element.style.opacity = 1;\r\n\r\n let last = +new Date();\r\n let opacity = 1;\r\n\r\n let tick = function () {\r\n opacity = +element.style.opacity - (new Date().getTime() - last) / duration;\r\n element.style.opacity = opacity;\r\n last = +new Date();\r\n\r\n if (+opacity > 0) {\r\n (window.requestAnimationFrame && requestAnimationFrame(tick)) || setTimeout(tick, 16);\r\n } else {\r\n callback && callback();\r\n }\r\n };\r\n\r\n tick();\r\n }\r\n}\r\n\r\nexport function getFocusableNodes(node) {\r\n const nodes = node.querySelectorAll(FOCUSABLE_ELEMENTS);\r\n return Array(...nodes);\r\n}\r\n\r\n/// Retain focus in containerNode\r\nexport function retainFocus(event, containerNode) {\r\n let focusableNodes = getFocusableNodes(containerNode);\r\n\r\n if (focusableNodes.length === 0) return;\r\n\r\n focusableNodes = focusableNodes.filter((node) => {\r\n return node.offsetParent !== null;\r\n });\r\n\r\n // if disableFocus is true\r\n if (!containerNode.contains(document.activeElement)) {\r\n focusableNodes[0].focus();\r\n } else {\r\n const focusedItemIndex = focusableNodes.indexOf(document.activeElement);\r\n\r\n if (event.shiftKey && focusedItemIndex === 0) {\r\n focusableNodes[focusableNodes.length - 1].focus();\r\n event.preventDefault();\r\n }\r\n\r\n if (!event.shiftKey && focusableNodes.length > 0 && focusedItemIndex === focusableNodes.length - 1) {\r\n focusableNodes[0].focus();\r\n event.preventDefault();\r\n }\r\n }\r\n}\r\n\r\nexport const getRangeBeforeCursor = (node) => getRangeFromCursor(node, true);\r\nexport const getRangeAfterCursor = (node) => getRangeFromCursor(node, false);\r\nexport const getRangeFromCursor = (node, start = false) => {\r\n var range = window.getSelection().getRangeAt(0);\r\n var clonedRange = range.cloneRange();\r\n clonedRange.collapse(start);\r\n\r\n // Create a new range from the end of the cloned range to the end of the content editable element\r\n var newRange = document.createRange();\r\n newRange.selectNodeContents(node);\r\n start ? newRange.setEnd(clonedRange.startContainer, clonedRange.startOffset) : newRange.setStart(clonedRange.endContainer, clonedRange.endOffset);\r\n\r\n return newRange;\r\n};\r\n\r\nexport const getCursorPosition = () => {\r\n const selection = window.getSelection();\r\n const range = selection.getRangeAt(0);\r\n let rect = range.getBoundingClientRect();\r\n\r\n if (range.collapsed && rect.top === 0 && rect.left === 0) {\r\n let tmpNode = document.createTextNode(\"\\ufeff\");\r\n range.insertNode(tmpNode);\r\n rect = range.getBoundingClientRect();\r\n tmpNode.remove();\r\n }\r\n\r\n return {\r\n left: parseFloat(rect.left),\r\n top: parseFloat(rect.top),\r\n };\r\n};\r\n\r\nexport const setCursorPosition = (node, x, y) => {\r\n var range = null;\r\n if (document.caretPositionFromPoint) {\r\n var position = document.caretPositionFromPoint(x, y);\r\n range = document.createRange();\r\n range.setStart(position.offsetNode, position.offset);\r\n } else if (document.caretRangeFromPoint) {\r\n range = document.caretRangeFromPoint(x, y);\r\n }\r\n\r\n // Set the selection to the new range\r\n var selection = window.getSelection();\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n\r\n // Set focus to the content editable element\r\n // node.focus();\r\n};\r\n\r\nexport const isEmptyNode = (node) => (node ? getNodeContentLength(node) == 0 : true);\r\nexport const getNodeContentLength = (node) => node.textContent.length;\r\n\r\n/// getCursorOffset within a contenteditable div\r\nexport const getCursorOffset = (node) => {\r\n if (!node) {\r\n return -1;\r\n }\r\n\r\n var caretOffset = 0;\r\n if (typeof window.getSelection != \"undefined\") {\r\n var range = window.getSelection().getRangeAt(0);\r\n var preCaretRange = range.cloneRange();\r\n preCaretRange.selectNodeContents(node);\r\n preCaretRange.setEnd(range.endContainer, range.endOffset);\r\n caretOffset = preCaretRange.toString().length;\r\n } else if (typeof document.selection != \"undefined\" && document.selection.type != \"Control\") {\r\n var textRange = document.selection.createRange();\r\n var preCaretTextRange = document.body.createTextRange();\r\n preCaretTextRange.moveToElementText(node);\r\n preCaretTextRange.setEndPoint(\"EndToEnd\", textRange);\r\n caretOffset = preCaretTextRange.text.length;\r\n }\r\n return caretOffset;\r\n};\r\n\r\nexport const setCursorOffset = (node, offset) => {\r\n const range = document.createRange();\r\n const sel = window.getSelection();\r\n return __setCursorOffset(node, { sel, range, offset, currentOffset: 0 }, node);\r\n};\r\n\r\nconst __setCursorOffset = (node, context, containerNode) => {\r\n const { range, sel } = context;\r\n\r\n if (node.nodeType === Node.TEXT_NODE) {\r\n const nodeLength = node.length;\r\n if (context.currentOffset + nodeLength >= context.offset) {\r\n range.setStart(node, context.offset - context.currentOffset);\r\n range.collapse(true);\r\n sel.removeAllRanges();\r\n sel.addRange(range);\r\n containerNode.focus();\r\n return true;\r\n }\r\n context.currentOffset += nodeLength;\r\n\r\n /// If node is empty without text node, select it\r\n } else if (node.childNodes.length == 0) {\r\n range.setStart(node, 0);\r\n range.setEnd(node, 0);\r\n sel.removeAllRanges();\r\n sel.addRange(range);\r\n return true;\r\n } else {\r\n for (let i = 0; i < node.childNodes.length; i++) {\r\n if (__setCursorOffset(node.childNodes[i], context, containerNode)) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n};\r\n\r\nexport const moveCursorToStart = (node) => moveCursorTo(node, true);\r\nexport const moveCursorToEnd = (node) => moveCursorTo(node, false);\r\nconst moveCursorTo = (node, start) => {\r\n const range = document.createRange();\r\n range.selectNodeContents(node);\r\n range.collapse(start);\r\n const selection = window.getSelection();\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n};\r\n\r\n/// Return a rect of all absolute position removing padding\r\nexport const getNodeContentRect = (node) => {\r\n const styles = window.getComputedStyle(node, null);\r\n\r\n const prop = (name) => parseFloat(styles.getPropertyValue(name));\r\n\r\n const extraBottom = prop(\"padding-bottom\") + prop(\"border-bottom-width\");\r\n const extraLeft = prop(\"padding-left\") + prop(\"border-left-width\");\r\n const extraRight = prop(\"padding-right\") + prop(\"border-right-width\");\r\n const extraTop = prop(\"padding-top\") + prop(\"border-top-width\");\r\n\r\n const rect = node.getBoundingClientRect();\r\n return {\r\n top: rect.top + extraTop,\r\n left: rect.left + extraLeft,\r\n right: rect.right - extraRight,\r\n bottom: rect.bottom - extraBottom,\r\n };\r\n};\r\n\r\n/// Return the line height of the node. If no\r\nexport const getLineHeight = (node) => {\r\n const computedStyle = getComputedStyle(node);\r\n const lineHeight = computedStyle.getPropertyValue(\"line-height\");\r\n if ([\"normal\", \"initial\", \"inherit\"].includes(lineHeight)) {\r\n return parseFloat(computedStyle.getPropertyValue(\"font-size\"));\r\n }\r\n return parseFloat(lineHeight);\r\n};\r\n\r\nexport function pasteHtmlAtSelection(html) {\r\n const selection = window.getSelection();\r\n\r\n let range = selection.getRangeAt(0);\r\n range.deleteContents();\r\n\r\n // Range.createContextualFragment() would be useful here but is\r\n // non-standard and not supported in all browsers (IE9, for one)\r\n const el = document.createElement(\"div\");\r\n el.innerHTML = html;\r\n let frag = document.createDocumentFragment(),\r\n node,\r\n lastNode;\r\n while ((node = el.firstChild)) {\r\n lastNode = frag.appendChild(node);\r\n }\r\n range.insertNode(frag);\r\n\r\n // Preserve the selection\r\n if (lastNode) {\r\n range = range.cloneRange();\r\n range.setStartAfter(lastNode);\r\n range.collapse(true);\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n }\r\n}\r\n\r\nexport function removeElementsByTagName(node, names) {\r\n if (!node) {\r\n return;\r\n }\r\n if (!Array.isArray(names)) {\r\n names = [names];\r\n }\r\n\r\n if (node.nodeType === Node.ELEMENT_NODE && names.find((name) => node.nodeName === name.toUpperCase())) {\r\n node.replaceWith(...node.childNodes);\r\n } else {\r\n const children = node.childNodes;\r\n for (let i = 0; i < children.length; i++) {\r\n removeElementsByTagName(children[i], names);\r\n }\r\n }\r\n}\r\n\r\nexport const findDomParent = (node, filter) => findDomOrSelfParent(node.parentNode, filter);\r\nexport function findDomOrSelfParent(node, filter) {\r\n if (filter(node)) {\r\n return node;\r\n }\r\n return node.parentNode ? findDomOrSelfParent(node.parentNode, filter) : null;\r\n}\r\n\r\nexport const getRootParent = (node) => findDomParent(node, (n) => !n.parentNode);\r\n\r\nexport const findNodeIndex = (node) => {\r\n let index = 0;\r\n while (node.previousSibling) {\r\n index++;\r\n node = node.previousSibling;\r\n }\r\n return index;\r\n};\r\n\r\n// Helper function to get the XPath of an element\r\nexport function getElementXPath(element) {\r\n const nodes = [];\r\n while (element && element.contentEditable != \"true\" && element.parentNode.nodeType === Node.ELEMENT_NODE) {\r\n const index = findNodeIndex(element);\r\n nodes.unshift(`[${index}]`);\r\n element = element.parentNode;\r\n }\r\n return nodes.length ? `/${nodes.join(\"/\")}` : null;\r\n}\r\n\r\n// Helper function to get an element by XPath\r\nexport function getElementByXPath(path, startingNode) {\r\n const steps = path.split(\"/\");\r\n let node = startingNode ?? document;\r\n for (const step of steps) {\r\n if (step) {\r\n const match = step.match(/^\\[(\\d+)\\]$/);\r\n if (match) {\r\n node = node.childNodes[parseInt(match[1])];\r\n }\r\n }\r\n }\r\n return node;\r\n}\r\n","export function getSeverityIcon(severity) {\r\n switch (severity) {\r\n case \"danger\":\r\n return \"ico-alert\";\r\n case \"info\":\r\n return \"ico-info-circle\";\r\n case \"success\":\r\n return \"ico-check\";\r\n case \"warning\":\r\n return \"ico-alert\";\r\n }\r\n return null;\r\n}\r\n","/*\r\n * Dialog\r\n */\r\nimport { retainFocus } from \"@sitebuilder/utils/dom.js\";\r\nimport { getSeverityIcon } from \"@sitebuilder/utils/ui.js\";\r\n\r\nconst onKeydown = (node) => (e) => {\r\n if (e.code === \"Escape\" && node.dataset.closeOnEscape) {\r\n node.hide();\r\n }\r\n if (e.keyCode === 9) {\r\n // tab\r\n retainFocus(event, node);\r\n }\r\n};\r\n\r\nconst onAnimationEnd = (node) => {\r\n const keydown = onKeydown(node);\r\n return (e) => {\r\n if (e.target !== node) return;\r\n\r\n // on hide\r\n if (node.__isHidding) {\r\n node.__isHidding = false;\r\n node.classList.remove(\"a-dialog-visible\");\r\n window.document.removeEventListener(\"keydown\", keydown);\r\n } else {\r\n window.document.addEventListener(\"keydown\", keydown);\r\n }\r\n };\r\n};\r\n\r\nconst attachDialog = (node) => {\r\n (document.querySelector(node.dataset.appendTo) || document.body).appendChild(node);\r\n\r\n // Set default settings\r\n const ds = node.dataset;\r\n if (typeof ds.closeOnEscape === \"undefined\") {\r\n ds.closeOnEscape = true;\r\n }\r\n\r\n const boxNode = node.querySelector(\".a-dialog-box\");\r\n\r\n node.show = () => {\r\n node.__isHidding = false;\r\n\r\n node.classList.add(\"fadeIn\");\r\n node.classList.remove(\"fadeOut\");\r\n node.classList.add(\"a-dialog-visible\");\r\n\r\n boxNode.classList.add(node.dataset.openingAnimation);\r\n boxNode.classList.remove(node.dataset.closingAnimation);\r\n\r\n node.dispatchEvent(new Event(\"show\"));\r\n };\r\n\r\n node.hide = () => {\r\n node.__isHidding = true;\r\n\r\n node.classList.remove(\"fadeIn\");\r\n node.classList.add(\"fadeOut\");\r\n node.classList.add(\"a-dialog-visible\");\r\n\r\n boxNode.classList.add(node.dataset.closingAnimation);\r\n boxNode.classList.remove(node.dataset.openingAnimation);\r\n\r\n node.dispatchEvent(new Event(\"hide\"));\r\n };\r\n\r\n /// Header close handler\r\n const closeNode = node.querySelector(\".a-dialog-header-close-icon\");\r\n closeNode && closeNode.parentNode.addEventListener(\"click\", () => node.hide());\r\n\r\n /// onhide need to wait for animationEnd()\r\n node.addEventListener(\"animationend\", onAnimationEnd(node));\r\n};\r\n\r\nconst createDialog = (attributes) => {};\r\n\r\nconst razorDialog = {\r\n selector: \".a-dialog\",\r\n create: createDialog,\r\n attach: attachDialog,\r\n};\r\n\r\nexport function alertDialog(title, message, severity) {\r\n\r\n return new Promise((resolve) => {\r\n const parser = new DOMParser();\r\n const id = \"__alert-diag__\";\r\n const existant = document.getElementById(id);\r\n if (existant) {\r\n existant.remove();\r\n }\r\n severity = severity || \"danger\";\r\n const doc = parser.parseFromString(\r\n '
` +\r\n title +\r\n '
' +\r\n message +\r\n '
',\r\n \"text/html\",\r\n );\r\n const node = doc.getElementById(id);\r\n document.body.appendChild(node);\r\n attachDialog(node);\r\n node.addEventListener(\"hide\", resolve);\r\n });\r\n\r\n}\r\n\r\nexport default razorDialog;\r\n","/*\r\n * Dropdown\r\n */\r\n\r\n// LE BUT EST D'AVOIR UN MÊME COMPOSANT EN:\r\n// - Vue\r\n// - Razor (server side TagHelper)\r\n// - Vanilla Js\r\n\r\n/// 1. create from JS:\r\n//const node = builder.component('p-dropdown', { placeholer: '' }); // create like razor taghelper + attachDropdown(node)\r\n\r\nconst attachDropdown = (node) => {};\r\n\r\nconst createDropdown = (attributes) => {};\r\n\r\nconst razorDropdown = {\r\n selector: \".a-dropdown\",\r\n create: createDropdown,\r\n attach: attachDropdown,\r\n};\r\n\r\nexport default razorDropdown;\r\n","/*\r\n * Fileupload\r\n */\r\n\r\n// LE BUT EST D'AVOIR UN MÊME COMPOSANT EN:\r\n// - Vue\r\n// - Razor (server side TagHelper)\r\n// - Vanilla Js\r\n\r\nimport { alertDialog } from \"./dialog.js\";\r\nimport { fadeIn, fadeOut } from \"@sitebuilder/utils/dom.js\";\r\n\r\nfunction preventDefaults(e) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n}\r\n\r\nfunction highlight(e, node) {\r\n node.classList.add(\"drag-active\");\r\n preventDefaults(e);\r\n}\r\n\r\nfunction deleteFile(node, url, mediaId, callback) {\r\n const ondelete = () => {\r\n callback && callback();\r\n onChangeFiles(node); // always last\r\n };\r\n\r\n // If no url to post delete => remove current media \r\n if (!url) {\r\n ondelete();\r\n return;\r\n }\r\n\r\n const xhttp = new XMLHttpRequest();\r\n xhttp.open(\"DELETE\", `${url}/${mediaId}`, true);\r\n xhttp.onreadystatechange = () => {\r\n if (xhttp.readyState === 4 && xhttp.status >= 200 && xhttp.status < 300) {\r\n ondelete();\r\n } else {\r\n let json = {};\r\n try {\r\n json = JSON.parse(xhttp.response);\r\n } catch {\r\n /* empty */\r\n }\r\n alertDialog(\"Une erreur s'est produite\", `Une erreur s'est produite durant le suppression du fichier :

${Object.values(json?.errors ?? {}).join(\", \")}`);\r\n }\r\n };\r\n xhttp.send();\r\n}\r\n\r\nfunction unhighlight(e, node) {\r\n node.classList.remove(\"drag-active\");\r\n preventDefaults(e);\r\n}\r\n\r\nconst onChangeFiles = (node) => {\r\n const mediaIds = Array.from(node.querySelectorAll(`input[name=\"${node.dataset.name}[]\"]`));\r\n\r\n const label = node.querySelector(\"label\");\r\n\r\n const multiple = node.querySelector(\"input[type=file]\").hasAttribute(\"multiple\");\r\n if (mediaIds.length < 1) {\r\n node.classList.remove(\"has-files\");\r\n !multiple && fadeIn(label, 200);\r\n } else {\r\n multiple ? node.classList.add(\"has-files\") : fadeOut(label, 200, () => node.classList.add(\"has-files\"));\r\n }\r\n};\r\n\r\nconst onUploadFiles = (e, node) => {\r\n const input = e.target;\r\n // console.log(\"on change files\", input.files);\r\n const filesNode = node.querySelector(\".a-fileupload-files\");\r\n\r\n // Loop through files\r\n for (let i = 0; i < input.files.length; i++) {\r\n const file = input.files[i];\r\n\r\n const xhttp = new XMLHttpRequest();\r\n\r\n const div = document.createElement(\"div\");\r\n div.className = \"a-fileupload-file\";\r\n div.innerHTML = `
\r\n
\r\n ${file.name}\r\n \r\n
\r\n
\r\n
\r\n
`;\r\n\r\n filesNode.appendChild(div);\r\n const deleteBtn = div.querySelector(\".ico-trash\");\r\n const loadingBar = div.querySelector(\".a-loading-bar\");\r\n const progressBar = loadingBar.firstChild;\r\n\r\n deleteBtn.onclick = () => deleteFile(node, node.dataset.deleteUrl, div.querySelector(\"input\").value, () => div.remove());\r\n\r\n xhttp.open(\"POST\", node.dataset.uploadUrl, true);\r\n const data = new FormData();\r\n data.append(\"file\", file);\r\n\r\n xhttp.upload.addEventListener(\"progress\", (e) => {\r\n const percent = (e.loaded / e.total) * 100;\r\n progressBar.style.width = `${Math.round(percent)}%`;\r\n });\r\n xhttp.addEventListener(\"load\", (e) => {\r\n if (xhttp.status >= 200 && xhttp.status < 300) {\r\n const media = JSON.parse(e.currentTarget.responseText)[0];\r\n div.querySelector(\"input\").value = media.id;\r\n div.querySelector(\"span\").innerHTML = media.name;\r\n setTimeout(() => {\r\n input.value = null;\r\n div.classList.add(\"success\");\r\n div.querySelector(\".ico-check\").classList.add(\"pulse\");\r\n loadingBar.remove();\r\n onChangeFiles(node);\r\n }, 1000);\r\n } else {\r\n div.remove();\r\n alertDialog(\"Une erreur s'est produite\", \"Une erreur s'est produite durant le téléchargement du fichier.\");\r\n onChangeFiles(node);\r\n }\r\n });\r\n xhttp.onerror = function () {\r\n alertDialog(\"Une erreur s'est produite\", \"Une erreur s'est produite durant le téléchargement du fichier (réseau).\");\r\n };\r\n xhttp.addEventListener(\"abort\", function () {\r\n alertDialog(\"Une erreur s'est produite\", \"Une erreur s'est produite durant le téléchargement du fichier (abandon).\");\r\n });\r\n xhttp.send(data);\r\n }\r\n};\r\n\r\n/// 1. create from JS:\r\nconst attachFileUpload = (node) => {\r\n const input = node.querySelector(\"input[type=file]\");\r\n const multiple = input.hasAttribute(\"multiple\");\r\n const btn = node.querySelector(\"button[type=button]\");\r\n\r\n input.addEventListener(\"change\", (e) => onUploadFiles(e, node));\r\n btn.addEventListener(\"click\", () => input.click());\r\n\r\n Array.from(node.querySelectorAll(\".a-fileupload-file\")).forEach(\r\n (div) => (div.querySelector(\".ico-trash\").onclick = () => deleteFile(node, node.dataset.deleteUrl, div.querySelector(\"input\").value, () => div.remove())),\r\n );\r\n\r\n node.addEventListener(\"dragenter\", (e) => highlight(e, node), false);\r\n node.addEventListener(\"dragover\", (e) => highlight(e, node), false);\r\n node.addEventListener(\"dragleave\", (e) => unhighlight(e, node), false);\r\n node.addEventListener(\r\n \"drop\",\r\n (e) => {\r\n unhighlight(e, node);\r\n\r\n const dt = e.dataTransfer;\r\n const files = dt.files;\r\n\r\n if (files.length) {\r\n if (multiple) {\r\n // Combine existing files and new files\r\n const combinedFileList = new DataTransfer();\r\n Array.from(input.files)\r\n .concat(Array.from(files))\r\n .forEach((file) => {\r\n combinedFileList.items.add(file);\r\n });\r\n input.files = combinedFileList.files;\r\n } else {\r\n input.files = files;\r\n }\r\n\r\n // Force Dispatch \"onchange\" the event\r\n input.dispatchEvent(new Event(\"change\", { bubbles: true }));\r\n }\r\n },\r\n false,\r\n );\r\n};\r\n\r\nconst createFileUpload = (attributes) => {};\r\n\r\nconst razorFileUpload = {\r\n selector: \".a-fileupload\",\r\n create: createFileUpload,\r\n attach: attachFileUpload,\r\n};\r\n\r\nexport default razorFileUpload;\r\n","/*\r\n * Input Pin\r\n */\r\n\r\n// LE BUT EST D'AVOIR UN MÊME COMPOSANT EN:\r\n// - Vue\r\n// - Razor (server side TagHelper)\r\n// - Vanilla Js\r\n\r\n/// 1. create from JS:\r\n//const node = builder.component('p-dropdown', { placeholer: '' }); // create like razor taghelper + attachDropdown(node)\r\n\r\nconst attachInputPin = (node) => {\r\n const inputs = Array.from(node.querySelectorAll(\".a-inputtext\"));\r\n const inputPin = node.querySelector('[name=\"' + node.dataset.name + '\"]');\r\n\r\n const selectNextInput = (index) => {\r\n if (index + 1 < inputs.length) {\r\n inputs[index + 1].focus();\r\n } else {\r\n inputs[index].blur();\r\n }\r\n };\r\n\r\n const onchange = () => {\r\n const pin = inputs.map((i) => i.value).join(\"\");\r\n inputPin.value = pin;\r\n console.log(\"onchange pin\", pin);\r\n };\r\n\r\n inputs.forEach((input, index) => {\r\n const currentIndex = index;\r\n input.onchange = onchange;\r\n input.onblur = onchange;\r\n input.onpaste = (e) => {\r\n const digits = (e.clipboardData.getData(\"text/plain\") + \"\").split(\"\");\r\n digits.forEach((c, index) => {\r\n if (currentIndex + index < inputs.length) {\r\n const intValue = parseInt(c, 10);\r\n if (!isNaN(intValue)) {\r\n inputs[currentIndex + index].value = intValue;\r\n inputs[currentIndex + index].focus();\r\n } else {\r\n inputs[currentIndex + index].value = \"\";\r\n }\r\n }\r\n });\r\n onchange();\r\n e.preventDefault();\r\n return false;\r\n };\r\n input.onkeydown = (e) => {\r\n if (e.keyCode === 39 && currentIndex + 1 < inputs.length) {\r\n // right\r\n inputs[currentIndex + 1].focus();\r\n } else if (e.keyCode === 37 && currentIndex > 0) {\r\n // left\r\n inputs[currentIndex - 1].focus();\r\n } else if (e.keyCode === 8) {\r\n // backspace\r\n inputs[currentIndex].value = \"\";\r\n if (currentIndex > 0) {\r\n inputs[currentIndex - 1].focus();\r\n }\r\n onchange();\r\n e.preventDefault();\r\n return false;\r\n }\r\n };\r\n input.onkeypress = (e) => {\r\n if (e.which < 48 || e.which > 57) {\r\n // If not a number, prevent the default behavior\r\n e.preventDefault();\r\n return false;\r\n }\r\n if (input.value.length) {\r\n input.value = \"\";\r\n onchange();\r\n }\r\n\r\n setTimeout(() => selectNextInput(index), 10);\r\n };\r\n });\r\n};\r\n\r\nconst createInputPin = (attributes) => {};\r\n\r\nconst razorInputPin = {\r\n selector: \".a-inputpin\",\r\n create: createInputPin,\r\n attach: attachInputPin,\r\n};\r\n\r\nexport default razorInputPin;\r\n","/*\r\n * Place (map)\r\n */\r\nconst attachPlace = (node) => {\r\n const rootNode = node;\r\n const containerImage = node.querySelector(\".a-place-image-container\");\r\n const zoomImage = node.querySelector(\".a-place-image-zoom\");\r\n const wrapper = node.querySelector(\".a-place-wrapper\");\r\n\r\n const zoomInButton = node.querySelector(\".a-place-zoom-in\");\r\n const centerButton = node.querySelector(\".a-place-zoom-center\");\r\n const zoomOutButton = node.querySelector(\".a-place-zoom-out\");\r\n\r\n const place = {\r\n scale: 1,\r\n wasDragged: false,\r\n isFullscreen: node.classList.contains(\"fullscreen\"),\r\n };\r\n node._place = place;\r\n\r\n // let scale = 1;\r\n let isDragging = false;\r\n let startCoords = { x: 0, y: 0 };\r\n let offset = { x: 0, y: 0 };\r\n\r\n zoomInButton.addEventListener(\"click\", (e) => {\r\n place.scale += 0.1;\r\n updateTransform();\r\n updateZoom();\r\n e.stopPropagation();\r\n });\r\n\r\n centerButton.addEventListener(\"click\", (e) => {\r\n place.scale = 1;\r\n centerZoom();\r\n e.stopPropagation();\r\n });\r\n\r\n zoomOutButton.addEventListener(\"click\", (e) => {\r\n place.scale = Math.max(1, place.scale - 0.1);\r\n moveTo(lastMove.dx, lastMove.dy);\r\n updateZoom();\r\n e.stopPropagation();\r\n });\r\n\r\n const mousedown = (e) => {\r\n isDragging = true;\r\n\r\n const isMouseEvent = e.type.toLowerCase() === \"mousedown\";\r\n const clientX = isMouseEvent ? e.clientX : e.touches[0].clientX;\r\n const clientY = isMouseEvent ? e.clientY : e.touches[0].clientY;\r\n\r\n startCoords = { x: clientX, y: clientY };\r\n\r\n const computedStyle = getComputedStyle(zoomImage);\r\n const matrix = new DOMMatrix(computedStyle.transform);\r\n offset = { x: matrix.e, y: matrix.f };\r\n\r\n zoomImage.style.transition = \"none\";\r\n\r\n if (isMouseEvent) {\r\n e.preventDefault();\r\n return false;\r\n }\r\n };\r\n zoomImage.addEventListener(\"mousedown\", mousedown);\r\n zoomImage.addEventListener(\"touchstart\", mousedown);\r\n\r\n let lastMove = { dx: 0, dy: 0 };\r\n\r\n const moveTo = (dx, dy) => {\r\n const imgWidth = zoomImage.querySelector(\"img\").naturalWidth;\r\n const imgHeight = zoomImage.querySelector(\"img\").naturalHeight;\r\n\r\n const deltaX = (imgWidth - imgWidth * place.scale) / 2;\r\n const deltaY = (imgHeight - imgHeight * place.scale) / 2;\r\n\r\n const maxDx = wrapper.clientWidth > imgWidth * place.scale ? (wrapper.clientWidth - imgWidth) / 2 + deltaX : -imgWidth + wrapper.clientWidth + deltaX;\r\n const maxDy = wrapper.clientHeight > imgHeight * place.scale ? (wrapper.clientHeight - imgHeight) / 2 + deltaY : -imgHeight + wrapper.clientHeight + deltaY;\r\n\r\n if (dx > -deltaX) dx = -deltaX;\r\n if (dy > -deltaY) dy = -deltaY;\r\n if (dx < maxDx) dx = maxDx;\r\n if (dy < maxDy) dy = maxDy;\r\n\r\n zoomImage.style.transform = `translate(${dx}px, ${dy}px) scale(${place.scale})`;\r\n lastMove = { dx, dy };\r\n };\r\n\r\n function updateTransform() {\r\n const computedStyle = getComputedStyle(zoomImage);\r\n const matrix = new DOMMatrix(computedStyle.transform);\r\n zoomImage.style.transform = `translate(${matrix.e}px, ${matrix.f}px) scale(${place.scale})`;\r\n }\r\n\r\n function centerZoom() {\r\n const containerWidth = wrapper.clientWidth;\r\n const containerHeight = wrapper.clientHeight;\r\n\r\n const imageWidth = zoomImage.querySelector(\"img\").naturalWidth * place.scale;\r\n const imageHeight = zoomImage.querySelector(\"img\").naturalHeight * place.scale;\r\n\r\n const offsetX = (containerWidth - imageWidth) / 2;\r\n const offsetY = (containerHeight - imageHeight) / 2;\r\n zoomImage.style.transform = `translate(${offsetX}px, ${offsetY}px) scale(${place.scale})`;\r\n\r\n lastMove = { dx: offsetX, dy: offsetY };\r\n\r\n updateZoom();\r\n }\r\n\r\n function updateZoom() {\r\n if (place.scale == 1) {\r\n zoomOutButton.classList.add(\"disabled\");\r\n centerButton.classList.add(\"disabled\");\r\n } else {\r\n zoomOutButton.classList.remove(\"disabled\");\r\n centerButton.classList.remove(\"disabled\");\r\n }\r\n rootNode.dataset.zoom = place.scale;\r\n }\r\n\r\n function toggleFullscreen() {\r\n zoomImage.style.transition = \"none\";\r\n\r\n if (node.classList.contains(\"fullscreen\")) {\r\n node.classList.remove(\"fullscreen\");\r\n place.isFullscreen = false;\r\n } else {\r\n node.classList.add(\"fullscreen\");\r\n place.isFullscreen = true;\r\n }\r\n centerZoom();\r\n setTimeout(() => (zoomImage.style.transition = null), 300);\r\n }\r\n\r\n const onResize = () => {\r\n zoomImage.style.transition = \"none\";\r\n centerZoom();\r\n setTimeout(() => (zoomImage.style.transition = null), 300);\r\n };\r\n\r\n //\r\n // Export to node\r\n //\r\n node.centerZoom = centerZoom;\r\n node.toggleFullscreen = toggleFullscreen;\r\n\r\n window.addEventListener(\"resize\", onResize);\r\n\r\n // On \"mounted\"\"\r\n if (document.readyState === \"loading\") {\r\n window.addEventListener(\"DOMContentLoaded\", onResize);\r\n } else {\r\n onResize();\r\n }\r\n\r\n const mousemove = (e) => {\r\n if (isDragging) {\r\n if (e.type.toLowerCase() === \"touchmove\") {\r\n e.preventDefault();\r\n }\r\n\r\n const isMouseEvent = e.type.toLowerCase() === \"mousemove\";\r\n const clientX = isMouseEvent ? e.clientX : e.touches[0].clientX;\r\n const clientY = isMouseEvent ? e.clientY : e.touches[0].clientY;\r\n\r\n let dx = offset.x + clientX - startCoords.x;\r\n let dy = offset.y + clientY - startCoords.y;\r\n\r\n // console.log(\"max X\", Math.abs(clientX - startCoords.x));\r\n // console.log(\"max Y\", Math.abs(clientY - startCoords.y));\r\n if (!place.wasDragged && (Math.abs(clientX - startCoords.x) > 10 || Math.abs(clientY - startCoords.y) > 10)) {\r\n place.wasDragged = true;\r\n }\r\n\r\n if (place.wasDragged) {\r\n moveTo(dx, dy);\r\n }\r\n }\r\n };\r\n document.addEventListener(\"mousemove\", mousemove);\r\n document.addEventListener(\"touchmove\", mousemove, { passive: false });\r\n\r\n // Escape to remove full screen\r\n document.addEventListener(\"keydown\", (event) => {\r\n if (event.key === \"Escape\" && place.isFullscreen) {\r\n toggleFullscreen();\r\n }\r\n });\r\n\r\n const mouseup = () => {\r\n if (isDragging) {\r\n isDragging = false;\r\n\r\n place.wasDragged = false;\r\n zoomImage.style.transition = \"\"; // Restore transition property for smooth animations\r\n }\r\n };\r\n document.addEventListener(\"mouseup\", () => setTimeout(mouseup, 50)); // This little timeout permit the place.onclick() to check if the click was fired during a dragging (and we do not need to open de place details).\r\n document.addEventListener(\"touchend\", mouseup);\r\n};\r\n\r\nconst createPlace = (attributes) => {};\r\n\r\nconst razorPlace = {\r\n selector: \".a-place\",\r\n create: createPlace,\r\n attach: attachPlace,\r\n};\r\n\r\nexport default razorPlace;\r\n","import { isNotEmpty } from \"./objects\";\r\n\r\nexport function slugify(str, useSeparator) {\r\n if (!str) {\r\n return str;\r\n }\r\n const separator = useSeparator || \"-\";\r\n return str\r\n .normalize(\"NFD\") // split an accented letter in the base letter and the acent\r\n .replace(/[\\u0300-\\u036f]/g, \"\") // remove all previously split accents\r\n .toLowerCase()\r\n .trim()\r\n .replace(/['’\\-_]/g, \"-\")\r\n .replace(/[^a-z0-9 '’\\-_]/g, \"\") // remove all chars not letters, numbers and spaces (to be replaced)\r\n .replace(/\\s+/g, separator)\r\n .replace(/-{2,}/g, \"-\") // no more than one '-'\r\n .replace(/^-+|-+$/g, \"\"); // trim starting & ending '-'\r\n}\r\n\r\nexport function isPrintableCharacter(char = \"\") {\r\n return isNotEmpty(char) && char.length === 1 && char.match(/\\S| /);\r\n}\r\n\r\nexport function uuidv4() {\r\n return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, (c) =>\r\n (\r\n c ^\r\n (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))\r\n ).toString(16)\r\n ); /* eslint-disable-line no-bitwise, no-mixed-operators */\r\n}\r\n\r\nexport function isUUID(str) {\r\n const regexExp =\r\n /^[0-9a-fA-F]{8}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{12}$/gi;\r\n return regexExp.test(str);\r\n}\r\n\r\nexport function toUpperFirst(str) {\r\n str = `${str}`;\r\n if (!str) return str;\r\n return (\r\n str.substring(0, 1).toUpperCase() + (str.substring(1)?.toLowerCase() ?? \"\")\r\n );\r\n}\r\n\r\nexport function toSnakeCase(str, character) {\r\n return (\r\n str &&\r\n str\r\n .match(\r\n /[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]+|[0-9]+/g\r\n )\r\n .map((x) => x.toLowerCase())\r\n .join(character || \"_\")\r\n );\r\n}\r\n","/*\r\n *\r\n * Tooltip replacement for PrimeVue tooltip that doesn't work with our editor iframe.\r\n *\r\n */\r\nimport { uuidv4 } from \"../utils/string\";\r\nimport { fadeIn } from \"../utils/dom\";\r\n\r\nfunction onMouseEnter(e) {\r\n show(e.currentTarget);\r\n}\r\n\r\nfunction onMouseLeave(e) {\r\n hide(e.currentTarget);\r\n}\r\n\r\nfunction onClick(e) {\r\n hide(e.currentTarget);\r\n}\r\n\r\nfunction bindEvents(el) {\r\n el.addEventListener(\"mouseenter\", onMouseEnter);\r\n el.addEventListener(\"mouseleave\", onMouseLeave);\r\n el.addEventListener(\"click\", onClick);\r\n}\r\n\r\nfunction unbindEvents(el) {\r\n el.removeEventListener(\"mouseenter\", onMouseEnter);\r\n el.removeEventListener(\"mouseleave\", onMouseLeave);\r\n el.removeEventListener(\"click\", onClick);\r\n}\r\n\r\nfunction show(el) {\r\n let node = create(el);\r\n fadeIn(node, 250);\r\n}\r\nfunction hide(el) {\r\n const node = document.getElementById(el._tooltipId);\r\n if (node) {\r\n document.body.removeChild(node);\r\n }\r\n}\r\n\r\nfunction updateLabel(node, label) {\r\n if (node?.lastChild) {\r\n node.lastChild.innerHTML = label;\r\n }\r\n}\r\n\r\nfunction align(el, tooltipElement, pos) {\r\n var rect = el.getBoundingClientRect();\r\n\r\n const space = 5;\r\n const styles = tooltipElement.style;\r\n const tooltipWidth = tooltipElement.offsetWidth;\r\n const tooltipHeight = tooltipElement.offsetHeight;\r\n\r\n const top = rect.top + window.scrollY;\r\n const left = rect.left + window.scrollX;\r\n\r\n styles.position = \"absolute\";\r\n styles.zIndex = \"1000000\";\r\n if (pos === \"left\" || pos === \"right\") {\r\n styles.top = top + parseInt((el.offsetHeight - tooltipHeight) / 2) + \"px\";\r\n\r\n if (pos === \"left\") {\r\n styles.left = left - tooltipWidth - space + \"px\";\r\n } else {\r\n styles.left = left + el.offsetWidth + space + \"px\";\r\n }\r\n } else if (pos === \"top\" || pos === \"bottom\") {\r\n styles.left = left + parseInt((el.offsetWidth - tooltipWidth) / 2) + \"px\";\r\n\r\n if (pos === \"top\") {\r\n styles.top = top - tooltipHeight - space + \"px\";\r\n } else {\r\n styles.top = top + el.offsetHeight + space + \"px\";\r\n }\r\n }\r\n}\r\n\r\nfunction create(el) {\r\n const id = uuidv4() + \"_tooltip\";\r\n\r\n el._tooltipId = id;\r\n const position = el.dataset.tooltipPosition ?? \"top\";\r\n const disableArrow = el.dataset.tooltipArrow === \"false\";\r\n\r\n let node = document.createElement(\"div\");\r\n node.className = `a-tooltip a-component a-tooltip-${position} ${el.dataset.tooltipTheme}${disableArrow ? \" a-tooltip-no-arrow\" : \"\"}`;\r\n node.id = id;\r\n node.innerHTML = \"
\";\r\n\r\n let label = el.dataset.tooltipContent ? document.querySelector(el.dataset.tooltipContent)?.innerHTML : el.dataset.tooltipLabel;\r\n // console.log(\"CREATE\", label);\r\n updateLabel(node, label);\r\n\r\n document.body.appendChild(node);\r\n node.style.display = \"inline-block\";\r\n\r\n align(el, node, position);\r\n\r\n return node;\r\n}\r\n\r\nexport function initTooltip(el, binding) {\r\n let label = undefined;\r\n if (!el.dataset.tooltipContent) {\r\n if (binding.value === undefined) {\r\n console.warn(\"v-tooltip needs to be pass as String and not as value. Example: v-tooltip=\\\"'Value'\\\"\");\r\n }\r\n label = binding.value;\r\n }\r\n\r\n el.setAttribute(\"data-tooltip-label\", label);\r\n bindEvents(el);\r\n}\r\n\r\nconst Tooltip = {\r\n beforeMount: initTooltip,\r\n unmounted(el) {\r\n unbindEvents(el);\r\n },\r\n updated(el, options) {\r\n // const node = document.getElementById(el._tooltipId);\r\n // node && updateLabel(node, options);\r\n },\r\n};\r\n\r\nexport default Tooltip;\r\n","/*\r\n * Tooltip\r\n */\r\n\r\n// LE BUT EST D'AVOIR UN MÊME COMPOSANT EN:\r\n// - Vue\r\n// - Razor (server side TagHelper)\r\n// - Vanilla Js\r\n\r\n/// 1. create from JS:\r\n//const node = builder.component('p-tooltip', { placeholer: '' }); // create like razor taghelper + attachTooltip(node)\r\n\r\nimport { initTooltip } from \"../directives/tooltip\";\r\n\r\nconst attachTooltip = (node) => {\r\n initTooltip(node, {\r\n value: node.getAttribute(\"v-tooltip\"),\r\n });\r\n};\r\n\r\nconst createTooltip = (attributes) => {};\r\n\r\nconst razorTooltip = {\r\n selector: \"[v-tooltip]\",\r\n create: createTooltip,\r\n attach: attachTooltip,\r\n};\r\n\r\nexport default razorTooltip;\r\n","import { isVisible } from \"@sitebuilder/utils/dom\";\r\n\r\n// const isVisible = (id) => document.getElementById(id).offsetParent != null;\r\n\r\nconst utils = {\r\n isVisible,\r\n isMobile: () => isVisible(\"is-md\"),\r\n isMediaXs: () => isVisible(\"is-xs\"),\r\n isMediaMd: () => isVisible(\"is-md\"),\r\n isMediaLg: () => isVisible(\"is-lg\"),\r\n isMediaXl: () => isVisible(\"is-xl\"),\r\n};\r\n\r\nexport default utils;\r\n","import \"@sitebuilder/assets/scss/cms/navigation.scss\";\r\nimport utils from \"./razorUtils.js\";\r\n\r\nconst initNavigation = (nav, hamburgerMenu) => {\r\n nav.addEventListener(\"mouseleave\", (e) => (_timeoutHideMenu = setTimeout(() => currentMenu && focusMenu(null), 300)));\r\nalert('ok');\r\n let isMobileOpened = false;\r\n\r\n const navList = nav.querySelector(\".navigation-list\");\r\n\r\n if (hamburgerMenu) {\r\n hamburgerMenu.addEventListener(\"click\", (e) => {\r\n hamburgerMenu.classList.toggle(\"close\");\r\n navList.classList.toggle(\"visible\");\r\n isMobileOpened = hamburgerMenu.classList.contains(\"close\");\r\n hamburgerMenu.setAttribute(\"aria-expanded\", isMobileOpened);\r\n });\r\n }\r\n\r\n const menus = Array.from(nav.querySelectorAll(\".menu\"));\r\n\r\n let currentMenu = null;\r\n\r\n const getParentAndSelfMenus = (menu) => {\r\n const arr = [];\r\n if (!menu) return arr;\r\n arr.push(menu);\r\n\r\n const addRecursiveParents = (menu, arr) => {\r\n const parentId = menu.id.substring(0, menu.id.lastIndexOf(\".\"));\r\n const parent = document.getElementById(parentId);\r\n if (parent) {\r\n arr.push(parent);\r\n addRecursiveParents(parent, arr);\r\n }\r\n };\r\n addRecursiveParents(menu, arr);\r\n return arr.reverse();\r\n };\r\n\r\n const activeMenu = (menu) => {\r\n if (isMenuDropdown(menu)) {\r\n getMenuDropdown(menu).classList.add(\"active\");\r\n menu.setAttribute(\"aria-expanded\", \"true\");\r\n menu.nextElementSibling.setAttribute(\"aria-hidden\", \"false\");\r\n } else {\r\n menu.classList.add(\"active\");\r\n }\r\n };\r\n\r\n const desactiveMenu = (menu) => {\r\n if (isMenuDropdown(menu)) {\r\n getMenuDropdown(menu).classList.remove(\"active\");\r\n menu.setAttribute(\"aria-expanded\", \"false\");\r\n menu.nextElementSibling.setAttribute(\"aria-hidden\", \"true\");\r\n } else {\r\n menu.classList.remove(\"active\");\r\n }\r\n menu.blur();\r\n };\r\n\r\n let _timeoutHideMenu = null;\r\n const clearHideMenuTimeout = () => {\r\n if (_timeoutHideMenu) {\r\n clearTimeout(_timeoutHideMenu);\r\n _timeoutHideMenu = null;\r\n }\r\n };\r\n\r\n const focusMenu = (node) => {\r\n if (node) {\r\n clearHideMenuTimeout();\r\n }\r\n\r\n if (node == currentMenu) return;\r\n const actuals = getParentAndSelfMenus(currentMenu);\r\n const news = getParentAndSelfMenus(node);\r\n\r\n // Unselect of menu from actuals not present in news\r\n actuals.forEach((menu, index) => {\r\n if (index >= news.length || news[index] != actuals[index]) {\r\n desactiveMenu(actuals[index]);\r\n }\r\n });\r\n\r\n // Select menu from news not present in actuals\r\n news.forEach((menu, index) => {\r\n if (index >= actuals.length || news[index] != actuals[index]) {\r\n activeMenu(news[index]);\r\n }\r\n });\r\n\r\n currentMenu = node;\r\n if (node && document.activeElement !== node) {\r\n node.focus();\r\n }\r\n };\r\n\r\n const selectMenuByOffset = (offset) => {\r\n setTimeout(clearHideMenuTimeout, 10);\r\n\r\n if (!currentMenu) return;\r\n const ol = currentMenu.closest(\"ol\");\r\n\r\n const menus = Array.from(ol.querySelectorAll(\":not(ol) > .menu\"));\r\n let index = menus.indexOf(currentMenu);\r\n // console.log('move to INDEX', index + offset)\r\n\r\n if (index < 0) return;\r\n\r\n index += offset;\r\n if (index < 0) return;\r\n if (index >= menus.length) return;\r\n\r\n menus[index].focus();\r\n };\r\n\r\n const getMenuDropdown = (menu) => menu.parentNode;\r\n const isMenuDropdown = (menu) => getMenuDropdown(menu).classList.contains(\"menu-dropdown\");\r\n\r\n menus.forEach((menu) => {\r\n menu.addEventListener(\"mouseover\", () => !(utils.isMobile() && isMobileOpened) && focusMenu(menu));\r\n menu.addEventListener(\"focus\", () => !(utils.isMobile() && isMobileOpened) && focusMenu(menu));\r\n menu.addEventListener(\"blur\", (e) => {\r\n if (!(utils.isMobile() && isMobileOpened) && e.relatedTarget && !nav.contains(e.relatedTarget)) {\r\n focusMenu(null);\r\n }\r\n });\r\n menu.addEventListener(\"click\", (e) => {\r\n if (utils.isMobile() && isMenuDropdown(menu)) {\r\n focusMenu(menu);\r\n e.preventDefault();\r\n }\r\n });\r\n\r\n if (isMenuDropdown(menu)) {\r\n getMenuDropdown(menu)\r\n .querySelector(\".menu-dropdown-content-title\")\r\n .addEventListener(\"click\", (e) => {\r\n const last2Menus = getParentAndSelfMenus(menu).slice(-2);\r\n focusMenu(last2Menus.length == 2 ? last2Menus.pop() : null);\r\n });\r\n }\r\n\r\n menu.addEventListener(\"keydown\", (e) => {\r\n if (e.keyCode === 37) {\r\n // left\r\n selectMenuByOffset(-1);\r\n e.preventDefault();\r\n } else if (e.keyCode === 39) {\r\n // right\r\n selectMenuByOffset(1);\r\n e.preventDefault();\r\n }\r\n });\r\n });\r\n};\r\n\r\nexport default initNavigation;\r\n","import createRazorBuilder from \"./builder.js\";\r\nimport razorAccordion from \"./accordion.js\";\r\nimport razorCheckbox from \"./checkbox.js\";\r\nimport razorSwitch from \"./switch.js\";\r\nimport razorDialog from \"./dialog.js\";\r\nimport razorDropdown from \"./dropdown.js\";\r\nimport razorFileUpload from \"./fileupload.js\";\r\nimport razorInputPin from \"./inputpin.js\";\r\nimport razorPlace from \"./place.js\";\r\nimport razorTooltip from \"./tooltip.js\";\r\nimport initNavigation from \"./navigation.js\";\r\nimport utils from \"./razorUtils.js\";\r\n\r\nconst builder = createRazorBuilder();\r\nbuilder\r\n .add(razorAccordion)\r\n .add(razorCheckbox)\r\n .add(razorDialog)\r\n .add(razorDropdown)\r\n .add(razorFileUpload)\r\n .add(razorInputPin)\r\n .add(razorPlace)\r\n .add(razorTooltip)\r\n ;\r\n\r\nexport function initRazorComponents(win) {\r\n builder.init(win);\r\n}\r\n\r\n/// Exports to window\r\nwindow.initNavigation = initNavigation;\r\nwindow.utils = utils;\r\n","import { ref, unref, computed, watch } from \"vue\";\r\nimport { findAncestor } from \"../utils/dom\";\r\nimport { deepMap } from \"../utils/objects\";\r\nimport { uuidv4, toUpperFirst } from \"../utils/string\";\r\nimport IMask from \"imask\";\r\n\r\nconst VALIDATION_ATTRIBUTES = [\"required\", \"min\", \"max\", \"minlength\", \"maxlength\", \"pattern\"];\r\nconst VALIDATION_MESSAGE_REGEX = /-message(?:-([a-z]{2}(?:_[A-Z]{2})?))?/; // matches, -message, -message-en, -message-en_US\r\n\r\nconst VALIDATION_TESTS = {\r\n text: { name: \"text\", fn: () => true, priority: 0 },\r\n required: {\r\n name: \"required\",\r\n fn: function (val) {\r\n return val !== \"\" && val !== undefined && val !== null && (!Array.isArray(val) || (Array.isArray(val) && val.length));\r\n },\r\n priority: 99,\r\n halt: true,\r\n },\r\n email: {\r\n name: \"email\",\r\n fn: (val) => !val || /^(([^<>()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/.test(val),\r\n },\r\n number: { name: \"number\", fn: (val) => !val || !isNaN(parseFloat(val)), priority: 2 },\r\n integer: { name: \"integer\", fn: (val) => !val || /^\\d+$/.test(val) },\r\n minlength: { name: \"minlength\", fn: (val, length) => !val || val.length >= parseInt(length) },\r\n maxlength: { name: \"maxlength\", fn: (val, length) => !val || val.length <= parseInt(length) },\r\n min: {\r\n name: \"min\",\r\n fn: function (val, limit) {\r\n return !val || (this.type === \"checkbox\" ? groupedElemCount(this) >= parseInt(limit) : parseFloat(val) >= parseFloat(limit));\r\n },\r\n },\r\n max: {\r\n name: \"max\",\r\n fn: function (val, limit) {\r\n return !val || (this.type === \"checkbox\" ? groupedElemCount(this) <= parseInt(limit) : parseFloat(val) <= parseFloat(limit));\r\n },\r\n },\r\n pattern: {\r\n name: \"pattern\",\r\n fn: (val, pattern) => {\r\n let m = pattern.match(new RegExp(\"^/(.*?)/([gimy]*)$\"));\r\n return !val || new RegExp(m[1], m[2]).test(val);\r\n },\r\n },\r\n equals: {\r\n name: \"equals\",\r\n fn: (val, otherFieldSelector) => {\r\n let other = document.querySelector(otherFieldSelector);\r\n return other && ((!val && !other.value) || other.value === val);\r\n },\r\n },\r\n};\r\n\r\nconst VALIDATION_MESSAGES = {\r\n en: {\r\n required: \"This field is required\",\r\n email: \"This field requires a valid e-mail address\",\r\n number: \"This field requires a number\",\r\n integer: \"This field requires an integer value\",\r\n url: \"This field requires a valid website URL\",\r\n tel: \"This field requires a valid telephone number\",\r\n maxlength: \"This fields length must be < ${1}\",\r\n minlength: \"This fields length must be > ${1}\",\r\n min: \"Minimum value for this field is ${1}\",\r\n max: \"Maximum value for this field is ${1}\",\r\n pattern: \"Please match the requested format\",\r\n equals: \"The two fields do not match\",\r\n default: \"Please enter a correct value\",\r\n },\r\n fr: {\r\n required: \"Ce champ est requis\",\r\n email: \"L'email n'est pas valide.\",\r\n number: \"This field requires a number\",\r\n integer: \"This field requires an integer value\",\r\n url: \"This field requires a valid website URL\",\r\n tel: \"This field requires a valid telephone number\",\r\n maxlength: \"This fields length must be < ${1}\",\r\n minlength: \"This fields length must be > ${1}\",\r\n min: \"Minimum value for this field is ${1}\",\r\n max: \"Maximum value for this field is ${1}\",\r\n pattern: \"Please match the requested format\",\r\n equals: \"The two fields do not match\",\r\n default: \"Please enter a correct value\",\r\n },\r\n};\r\n\r\nfunction tmpl() {\r\n return this.replace(/\\${([^{}]*)}/g, (a, b) => arguments[b]);\r\n}\r\n\r\nfunction getInputValue(input) {\r\n if (input.type === \"radio\" || input.type === \"checkbox\") {\r\n console.log(input._validation);\r\n const checkedElements = Array.from(input._validation.form.node.querySelectorAll('input[name=\"' + input.getAttribute(\"name\") + '\"]:checked')).map((el) => el.value);\r\n return checkedElements.length ? checkedElements : null;\r\n }\r\n // Check for our FileUpload component. Fo them, we need to check all files Name[] @see FileUploadTagHelper\r\n if (input.type === \"file\" && input.dataset.name) {\r\n let form = input;\r\n while (form.tagName != \"FORM\" && form.parentNode) {\r\n form = form.parentNode;\r\n }\r\n const values = Array.from((form ?? document).querySelectorAll(`input[name=\"${input.dataset.name}[]\"]`));\r\n return values.join(\",\");\r\n }\r\n return input.value;\r\n}\r\n\r\nfunction _getDataMethod(node, name) {\r\n name = `form${toUpperFirst(name)}`;\r\n return name in node.dataset && node.dataset[name] in window ? window[node.dataset[name]] : () => void 0;\r\n}\r\n\r\nconst _initForm = (form) => {\r\n if (form._validation) return;\r\n\r\n form.setAttribute(\"novalidate\", \"true\");\r\n\r\n const live = !form.dataset.formLive;\r\n const submitButton = form.querySelector(form.dataset.submitButton || \"button\");\r\n const submitDelay = form.dataset.submitDelay || 1000;\r\n\r\n if (submitButton && submitButton.type == \"submit\") {\r\n console.warn('form data-submit-button type MUST NOT be \"submit\".');\r\n }\r\n\r\n const self = {\r\n node: form,\r\n dirty: true,\r\n errors: {},\r\n fields: [],\r\n masks: [],\r\n live: !(live === false),\r\n reset: function () {\r\n self.dirty = true;\r\n self.errors = {};\r\n Array.from(self.fields).forEach((field) => {\r\n const input = field.input;\r\n if (input.type === \"radio\" || input.type === \"checkbox\") input.checked = false;\r\n else input.value = \"\";\r\n\r\n _showSuccess(field);\r\n });\r\n },\r\n onPost: _getDataMethod(form, \"onpost\"),\r\n onBeforePost: _getDataMethod(form, \"onbeforepost\"), \r\n createPromise: _getDataMethod(form, \"createPromise\"),\r\n updatePromise: _getDataMethod(form, \"updatePromise\"),\r\n deletePromise: _getDataMethod(form, \"deletePromise\"),\r\n validate: function (input, silent) {\r\n let firstErrorInput = null;\r\n let fullFormValidation = true;\r\n\r\n silent = (input && silent === true) || input === true;\r\n\r\n let fields = self.fields;\r\n if (input !== true && input !== false && input !== undefined) {\r\n if (input instanceof HTMLElement) {\r\n fields = [input._validation];\r\n } else if (input instanceof NodeList || input instanceof (window.$ || Array) || input instanceof Array) {\r\n fields = Array.from(input).map((el) => el._validation);\r\n }\r\n fullFormValidation = false;\r\n }\r\n\r\n if (fullFormValidation) {\r\n self.dirty = false; // remove dirty state after the first global form validation\r\n }\r\n\r\n let valid = true;\r\n fields.forEach((field) => {\r\n if (_validateField(field)) {\r\n !silent && _showSuccess(field);\r\n } else {\r\n if (!firstErrorInput) {\r\n firstErrorInput = field;\r\n }\r\n valid = false;\r\n !silent && _showError(field);\r\n }\r\n });\r\n\r\n if (fullFormValidation) {\r\n // Focus the first invalid input\r\n if (firstErrorInput) {\r\n firstErrorInput.input.focus();\r\n }\r\n\r\n if (valid) {\r\n if (self.onBeforePost() === false) {\r\n return false;\r\n }\r\n self.onPost();\r\n }\r\n }\r\n return valid;\r\n },\r\n };\r\n\r\n const inputs = Array.from(form.querySelectorAll(\"input:not([type^=hidden]):not([type^=submit]):not([type^=button]), select, textarea\"));\r\n inputs.forEach((input) => {\r\n let fns = [];\r\n let params = {};\r\n let messages = {};\r\n\r\n [].forEach.call(input.attributes, function (attr) {\r\n if (/^data-form-/.test(attr.name)) {\r\n let name = attr.name.substr(\"data-form-\".length);\r\n\r\n let messageMatch = name.match(VALIDATION_MESSAGE_REGEX);\r\n if (messageMatch !== null) {\r\n let locale = messageMatch[1] === undefined ? \"fr\" : messageMatch[1];\r\n if (!messages.hasOwnProperty(locale)) {\r\n messages[locale] = {};\r\n }\r\n messages[locale][name.slice(0, name.length - messageMatch[0].length)] = attr.value;\r\n return;\r\n }\r\n if (name === \"type\") name = attr.value;\r\n _addValidatorToField(fns, params, name, attr.value);\r\n } else if (~VALIDATION_ATTRIBUTES.indexOf(attr.name)) {\r\n _addValidatorToField(fns, params, attr.name, attr.value);\r\n } else if (attr.name === \"type\") {\r\n _addValidatorToField(fns, params, attr.value);\r\n }\r\n });\r\n fns.sort((a, b) => (b.priority || 1) - (a.priority || 1));\r\n\r\n self.live &&\r\n input.addEventListener(\r\n !~[\"radio\", \"checkbox\"].indexOf(input.getAttribute(\"type\")) ? \"input\" : \"change\",\r\n function (e) {\r\n if (!self.dirty) {\r\n self.validate(e.target);\r\n }\r\n }.bind(self),\r\n );\r\n\r\n /// Pressing return in an Input will call the submitButton click thats submit the form\r\n if (input.tagName != \"TEXTAREA\") {\r\n input.addEventListener(\"keydown\", function (e) {\r\n if (e.keyCode === 13) {\r\n submitButton && submitButton.click();\r\n e.preventDefault();\r\n }\r\n });\r\n }\r\n\r\n // INPUT Masks\r\n // @see https://imask.js.org/guide.html\r\n // Note: when form is posted, all input with mask will be replaced with the unmasker value\r\n if (input.tagName == \"INPUT\") {\r\n const inputMask = input.getAttribute(\"mask\");\r\n if (inputMask) {\r\n const mask = IMask(input, { mask: inputMask });\r\n self.masks.push({ mask, input });\r\n input._mask = mask;\r\n }\r\n }\r\n\r\n const togglePassword = input.parentNode?.querySelector(\".a-input-password-toggle\");\r\n if (togglePassword) {\r\n const onTogglePassword = () => {\r\n if (input.type === \"password\") {\r\n input.setAttribute(\"type\", \"text\");\r\n togglePassword.innerHTML = \"Masquer\";\r\n } else {\r\n input.setAttribute(\"type\", \"password\");\r\n togglePassword.innerHTML = \"Afficher\";\r\n }\r\n };\r\n [\"click\", \"touch\", \"keypress\"].forEach((name) => togglePassword.addEventListener(name, onTogglePassword))\r\n }\r\n\r\n input._validation = {\r\n input,\r\n validators: fns,\r\n params,\r\n messages,\r\n messageNode: _getOrcreateMessageNode(input),\r\n fieldNode: findAncestor(input, \".a-field\"),\r\n form: self,\r\n };\r\n self.fields.push(input._validation);\r\n });\r\n\r\n form._validation = self;\r\n\r\n if (submitButton) {\r\n submitButton.addEventListener(\"click\", () => {\r\n if (self.validate()) {\r\n if (form.onsubmit && form.onsubmit() === false) {\r\n return;\r\n }\r\n submitButton.classList.add(\"a-button-loading\");\r\n\r\n // replace input with mask values\r\n self.masks.forEach(({ mask, input }) => {\r\n input.value = mask.unmaskedValue;\r\n mask.destroy();\r\n });\r\n\r\n // Form protection with Google recaptcha v3 ? (@see RecaptchaTagHelper)\r\n const recaptchaNode = form.querySelector(\"input[data-recaptcha-key]\");\r\n if (recaptchaNode) {\r\n try {\r\n console.info(\"Generate recaptcha token.\");\r\n window.grecaptcha.ready(function () {\r\n window.grecaptcha.execute(recaptchaNode.dataset.recaptchaKey, { action: recaptchaNode.dataset.recaptchaAction }).then(function (token) {\r\n recaptchaNode.value = token;\r\n console.info(\"Recaptcha token generate.\");\r\n setTimeout(() => form.submit(), submitDelay);\r\n });\r\n });\r\n } catch {\r\n console.warn(\"Recaptcha token generation failed.\");\r\n // if js error => post form to let the server return the error \r\n setTimeout(() => form.submit(), submitDelay);\r\n }\r\n } else {\r\n setTimeout(() => form.submit(), submitDelay);\r\n }\r\n }\r\n });\r\n }\r\n};\r\n\r\nfunction _getOrcreateMessageNode(input) {\r\n const parent = input.closest(\".a-field\");\r\n\r\n if (!parent) {\r\n console.warn(\"input has no .field parent.\", input);\r\n return null;\r\n }\r\n\r\n let messageNode = parent.querySelector(\".a-field-message\");\r\n if (!messageNode) {\r\n messageNode = document.createElement(\"div\");\r\n parent.appendChild(messageNode);\r\n messageNode.className = \"a-field-message\";\r\n messageNode.innerHTML = '';\r\n }\r\n\r\n return messageNode;\r\n}\r\n\r\nfunction _addValidatorToField(fns, params, name, value) {\r\n let validator = VALIDATION_TESTS[name];\r\n if (validator && !fns.find((f) => f.name === name)) {\r\n fns.push(validator);\r\n if (value) {\r\n let valueParams = name === \"pattern\" ? [value] : value.split(\",\");\r\n valueParams.unshift(null); // placeholder for input's value\r\n params[name] = valueParams;\r\n }\r\n }\r\n}\r\n\r\nfunction _validateField(field) {\r\n let errors = [];\r\n let currentLocale = \"fr\";\r\n let valid = true;\r\n for (let i = 0; field.validators[i]; i++) {\r\n let validator = field.validators[i];\r\n const value = getInputValue(field.input);\r\n let params = field.params[validator.name] ? field.params[validator.name] : [];\r\n params[0] = value;\r\n\r\n if (!validator.fn.apply(value, params)) {\r\n valid = false;\r\n if (typeof validator.msg === \"function\") {\r\n errors.push(validator.msg(value, params));\r\n } else if (typeof validator.msg === \"string\") {\r\n errors.push(tmpl.apply(validator.msg, params));\r\n } else if (validator.msg === Object(validator.msg) && validator.msg[currentLocale]) {\r\n // typeof generates unnecessary babel code\r\n errors.push(tmpl.apply(validator.msg[currentLocale], params));\r\n } else if (field.messages[currentLocale] && field.messages[currentLocale][validator.name]) {\r\n errors.push(tmpl.apply(field.messages[currentLocale][validator.name], params));\r\n } else if (VALIDATION_MESSAGES[currentLocale] && VALIDATION_MESSAGES[currentLocale][validator.name]) {\r\n errors.push(tmpl.apply(VALIDATION_MESSAGES[currentLocale][validator.name], params));\r\n } else {\r\n errors.push(tmpl.apply(VALIDATION_MESSAGES[currentLocale].default, params));\r\n }\r\n\r\n if (validator.halt === true) {\r\n break;\r\n }\r\n }\r\n }\r\n field.errors = errors;\r\n return valid;\r\n}\r\n\r\nfunction _showSuccess(field) {\r\n setTimeout(() => {\r\n const classList = field.messageNode?.classList;\r\n if (classList) {\r\n classList.remove(\"visible\");\r\n field.fieldNode && field.fieldNode.classList.remove(\"a-invalid-field\");\r\n }\r\n }, 15); // Timeout let the fade in/out effect works\r\n}\r\n\r\nfunction _showError(field) {\r\n setTimeout(() => {\r\n field.fieldNode && field.fieldNode.classList.add(\"a-invalid-field\");\r\n field.messageNode.querySelector(\".a-field-message-content\").innerHTML = field.errors.join(\"
\");\r\n\r\n const classList = field.messageNode?.classList;\r\n if (classList) {\r\n classList.add(\"invalid\");\r\n classList.add(\"visible\");\r\n }\r\n }, 15); // Timeout let the fade in/out effect works\r\n}\r\n\r\n/*\r\n *\r\n * VueJs adaptater\r\n *\r\n */\r\nexport function initRazorFormValidation(win) {\r\n const forms = Array.from(win.document.querySelectorAll(\"form\"));\r\n forms.forEach(_initForm);\r\n}\r\n\r\nfunction checkState(state, rules, $errors) {\r\n let count = 0;\r\n $errors.value = deepMap(state, (prop, value, path) => {\r\n const $errors = [];\r\n\r\n if (path.indexOf(\".\") > 0) {\r\n // TODO: NOT IMPLEMENTED CHILDREN PATH\r\n console.log(\"skip checkState\", path);\r\n return;\r\n }\r\n if (path in rules) {\r\n const fieldRules = { ...rules[path] };\r\n\r\n let validators = [];\r\n let params = {};\r\n\r\n for (const ruleName in fieldRules) {\r\n _addValidatorToField(validators, params, ruleName); // fieldRules[ruleName]);\r\n }\r\n validators.sort((a, b) => (b.priority || 1) - (a.priority || 1));\r\n\r\n for (var i = 0; i < validators.length; i++) {\r\n const validator = validators[i];\r\n\r\n params = params[validator.name] ? params[validator.name] : [];\r\n params[0] = value;\r\n\r\n if (!validator.fn.apply(null, params)) {\r\n count++;\r\n $errors.push({\r\n $message: VALIDATION_MESSAGES[\"fr\"][validator.name],\r\n $property: path,\r\n $validator: validator.name,\r\n $uid: uuidv4(),\r\n });\r\n\r\n if (validator.halt === true) {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n return { \r\n $errors,\r\n rules: rules[prop] ?? null,\r\n };\r\n });\r\n return count;\r\n}\r\n\r\nexport function useValidationForm(rules, state) {\r\n const initErrors = () => deepMap(state, (prop) => ({ \r\n $errors: [],\r\n rules: prop in rules ? rules[prop] : null,\r\n }));\r\n\r\n let $dirty = ref(true);\r\n let $invalid = ref(false);\r\n const $errors = ref(initErrors());\r\n\r\n watch(\r\n () => state,\r\n (newState) => {\r\n if (!$dirty.value) {\r\n $invalid.value = checkState(newState, rules, $errors) > 0;\r\n }\r\n },\r\n { deep: true },\r\n );\r\n\r\n const $touch = () => {\r\n $dirty.value = false;\r\n $invalid.value = checkState(state, rules, $errors) > 0;\r\n };\r\n\r\n const $reset = () => {\r\n $dirty.value = true;\r\n $errors.value = initErrors();\r\n $invalid.value = false;\r\n };\r\n\r\n return computed(() => {\r\n return {\r\n ...unref($errors),\r\n $dirty: unref($dirty),\r\n $invalid: unref($invalid),\r\n $errors,\r\n $touch,\r\n $reset,\r\n };\r\n });\r\n}\r\n","// Styles\r\nimport \"./assets/scss/index.scss\";\r\n\r\nimport { initRazorComponents } from \"@sitebuilder/razor/index.js\";\r\nimport { initRazorFormValidation } from \"@sitebuilder/razor/razorForm.js\";\r\nimport { HubConnectionBuilder, LogLevel } from \"@microsoft/signalr\";\r\n\r\nconst connection = new HubConnectionBuilder().withUrl(\"/placeHub\").configureLogging(LogLevel.Information).build();\r\n\r\nconst blockProduct = (data) => {\r\n const place = document.getElementById(\"emplacement-\" + data);\r\n if (place) {\r\n place.classList.add(\"registered\");\r\n }\r\n};\r\n\r\nconst orderedItems = [];\r\n\r\nconnection.on(\"SaveProductItem\", blockProduct);\r\nconnection.on(\"OrderedProductItem\", (data) => setTimeout(() => {orderedItems.push(data); blockProduct(data); }, 500));\r\n\r\nconnection.on(\"ReleaseProductItem\", (data) => {\n const place = document.getElementById(\"emplacement-\" + data);\r\n if (place && !orderedItems.includes(place)) {\r\n place.classList.remove(\"registered\");\r\n }\r\n});\r\n\r\nfunction start() {\r\n return connection.start().catch((err) => {\r\n console.error(\"Failed to connect with hub. Retry in 5s.\", err);\r\n return new Promise((resolve, reject) => setTimeout(() => start().then(resolve).catch(reject), 5000));\r\n });\r\n}\r\nconnection.onclose(() => start());\r\nstart();\r\n\r\n// connection.start().then(() => connection.invoke(\"send\", \"Hello\"));\r\n\r\nconsole.log(\"connection\", connection);\r\n\r\nwindow.consent = (val) => {\r\n fetch(\"/consent\", {\r\n method: \"post\",\r\n headers: {\r\n Accept: \"application/json\",\r\n \"Content-Type\": \"application/json\",\r\n },\r\n body: JSON.stringify(val),\r\n })\r\n .then((resp) => resp.json())\r\n .then((data) => console.log(data))\r\n .catch(function (error) {\r\n console.log(\"Request failed\", error);\r\n })\r\n .finally(() => document.getElementById(\"cookieConsent\").remove());\r\n};\r\n\r\nwindow.addEventListener(\"DOMContentLoaded\", () => {\r\n initRazorComponents(window);\r\n initRazorFormValidation(window);\r\n console.log(\"init tenant website\");\r\n});\r\n"],"names":["createRazorBuilder","options","self","component","win","compo","node","showTab","tab","panel","height","hideTab","attachAccordion","multiple","tabs","e","t","createAccordion","attributes","razorAccordion","attachCheckbox","createCheckbox","razorCheckbox","FOCUSABLE_ELEMENTS","findAncestor","el","selector","isVisible","elem","fadeIn","element","duration","callback","last","opacity","tick","fadeOut","getFocusableNodes","nodes","retainFocus","event","containerNode","focusableNodes","focusedItemIndex","getSeverityIcon","severity","onKeydown","onAnimationEnd","keydown","attachDialog","ds","boxNode","closeNode","createDialog","razorDialog","alertDialog","title","message","resolve","parser","id","existant","attachDropdown","createDropdown","razorDropdown","preventDefaults","highlight","deleteFile","url","mediaId","ondelete","onChangeFiles","xhttp","json","_a","unhighlight","mediaIds","label","onUploadFiles","input","filesNode","i","file","div","deleteBtn","loadingBar","progressBar","data","percent","media","attachFileUpload","btn","files","combinedFileList","createFileUpload","razorFileUpload","attachInputPin","inputs","inputPin","selectNextInput","index","onchange","pin","currentIndex","c","intValue","createInputPin","razorInputPin","attachPlace","rootNode","zoomImage","wrapper","zoomInButton","centerButton","zoomOutButton","place","isDragging","startCoords","offset","updateTransform","updateZoom","centerZoom","moveTo","lastMove","mousedown","isMouseEvent","clientX","clientY","computedStyle","matrix","dx","dy","imgWidth","imgHeight","deltaX","deltaY","maxDx","maxDy","containerWidth","containerHeight","imageWidth","imageHeight","offsetX","offsetY","toggleFullscreen","onResize","mousemove","mouseup","createPlace","razorPlace","uuidv4","toUpperFirst","str","_b","onMouseEnter","show","onMouseLeave","hide","onClick","bindEvents","create","updateLabel","align","tooltipElement","pos","rect","space","styles","tooltipWidth","tooltipHeight","top","left","position","disableArrow","initTooltip","binding","attachTooltip","createTooltip","razorTooltip","utils","initNavigation","nav","hamburgerMenu","_timeoutHideMenu","currentMenu","focusMenu","isMobileOpened","navList","menus","getParentAndSelfMenus","menu","arr","addRecursiveParents","parentId","parent","activeMenu","isMenuDropdown","getMenuDropdown","desactiveMenu","clearHideMenuTimeout","actuals","news","selectMenuByOffset","ol","last2Menus","builder","initRazorComponents","VALIDATION_ATTRIBUTES","VALIDATION_MESSAGE_REGEX","VALIDATION_TESTS","val","length","limit","pattern","m","otherFieldSelector","other","VALIDATION_MESSAGES","tmpl","a","b","getInputValue","checkedElements","form","_getDataMethod","name","_initForm","live","submitButton","submitDelay","field","_showSuccess","silent","firstErrorInput","fullFormValidation","fields","valid","_validateField","_showError","fns","params","messages","attr","messageMatch","locale","_addValidatorToField","inputMask","mask","IMask","togglePassword","onTogglePassword","_getOrcreateMessageNode","recaptchaNode","token","messageNode","value","validator","f","valueParams","errors","currentLocale","classList","initRazorFormValidation","connection","HubConnectionBuilder","LogLevel","blockProduct","orderedItems","start","err","reject","resp","error"],"mappings":"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"}