web-mojo 2.4.6 → 2.4.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin-models.cjs.js +1 -1
- package/dist/admin-models.cjs.js.map +1 -1
- package/dist/admin-models.es.js +1 -1
- package/dist/admin-models.es.js.map +1 -1
- package/dist/admin.cjs.js +1 -1
- package/dist/admin.cjs.js.map +1 -1
- package/dist/admin.es.js +1 -1
- package/dist/admin.es.js.map +1 -1
- package/dist/auth.cjs.js +1 -1
- package/dist/auth.es.js +1 -1
- package/dist/charts.cjs.js +1 -1
- package/dist/charts.es.js +1 -1
- package/dist/chunks/{ChatView-D2WOSxPu.js → ChatView-C_2dRLAY.js} +2 -2
- package/dist/chunks/{ChatView-D2WOSxPu.js.map → ChatView-C_2dRLAY.js.map} +1 -1
- package/dist/chunks/{ChatView-kWguc444.js → ChatView-DVb2Ufq_.js} +2 -2
- package/dist/chunks/{ChatView-kWguc444.js.map → ChatView-DVb2Ufq_.js.map} +1 -1
- package/dist/chunks/{Collection-DNmr743A.js → Collection-Bq_EMAqK.js} +2 -2
- package/dist/chunks/{Collection-DNmr743A.js.map → Collection-Bq_EMAqK.js.map} +1 -1
- package/dist/chunks/{Collection-C0pHSKDH.js → Collection-tgvDhyz_.js} +2 -2
- package/dist/chunks/{Collection-C0pHSKDH.js.map → Collection-tgvDhyz_.js.map} +1 -1
- package/dist/chunks/{ContextMenu-T3yDdsIe.js → ContextMenu-BL_sdgIw.js} +2 -2
- package/dist/chunks/{ContextMenu-T3yDdsIe.js.map → ContextMenu-BL_sdgIw.js.map} +1 -1
- package/dist/chunks/{ContextMenu-BeveGkJr.js → ContextMenu-fIy3upEy.js} +2 -2
- package/dist/chunks/{ContextMenu-BeveGkJr.js.map → ContextMenu-fIy3upEy.js.map} +1 -1
- package/dist/chunks/{DataView-VZIXSsZa.js → DataView-DRQ2yFRz.js} +2 -2
- package/dist/chunks/{DataView-VZIXSsZa.js.map → DataView-DRQ2yFRz.js.map} +1 -1
- package/dist/chunks/{DataView-z2rxXk4L.js → DataView-DW_ufpQo.js} +2 -2
- package/dist/chunks/{DataView-z2rxXk4L.js.map → DataView-DW_ufpQo.js.map} +1 -1
- package/dist/chunks/{FormView-COIPtbrd.js → FormView-eWUWw8oL.js} +2 -2
- package/dist/chunks/{FormView-COIPtbrd.js.map → FormView-eWUWw8oL.js.map} +1 -1
- package/dist/chunks/{FormView-DUXQruUZ.js → FormView-xl_w506t.js} +2 -2
- package/dist/chunks/{FormView-DUXQruUZ.js.map → FormView-xl_w506t.js.map} +1 -1
- package/dist/chunks/{ListView-BjsNHuZ1.js → ListView-Bj4ONQFG.js} +2 -2
- package/dist/chunks/{ListView-BjsNHuZ1.js.map → ListView-Bj4ONQFG.js.map} +1 -1
- package/dist/chunks/{ListView-BxcxIwC3.js → ListView-jyIVhCN3.js} +2 -2
- package/dist/chunks/{ListView-BxcxIwC3.js.map → ListView-jyIVhCN3.js.map} +1 -1
- package/dist/chunks/MetricsCountryMapView-D_666qlW.js +2 -0
- package/dist/chunks/MetricsCountryMapView-D_666qlW.js.map +1 -0
- package/dist/chunks/MetricsCountryMapView-U3xr0QXD.js +2 -0
- package/dist/chunks/MetricsCountryMapView-U3xr0QXD.js.map +1 -0
- package/dist/chunks/Modal-CCVJefEX.js +3 -0
- package/dist/chunks/{Modal-Bm1OQ8Ou.js.map → Modal-CCVJefEX.js.map} +1 -1
- package/dist/chunks/Modal-Uwt-GBgJ.js +3 -0
- package/dist/chunks/{Modal-KnJhNZ1E.js.map → Modal-Uwt-GBgJ.js.map} +1 -1
- package/dist/chunks/Passkeys-DScGUF6p.js +2 -0
- package/dist/chunks/{Passkeys-BlHx11-5.js.map → Passkeys-DScGUF6p.js.map} +1 -1
- package/dist/chunks/{Passkeys-B1-Z4-16.js → Passkeys-c4amXO03.js} +2 -2
- package/dist/chunks/{Passkeys-B1-Z4-16.js.map → Passkeys-c4amXO03.js.map} +1 -1
- package/dist/chunks/{TokenManager-CiNtJclo.js → TokenManager-BRx2U5w4.js} +2 -2
- package/dist/chunks/{TokenManager-CiNtJclo.js.map → TokenManager-BRx2U5w4.js.map} +1 -1
- package/dist/chunks/{TokenManager-6atX9uKB.js → TokenManager-DZP2Lcnz.js} +2 -2
- package/dist/chunks/{TokenManager-6atX9uKB.js.map → TokenManager-DZP2Lcnz.js.map} +1 -1
- package/dist/chunks/{User-9qvKV7G6.js → User-DR-2VJcv.js} +2 -2
- package/dist/chunks/{User-9qvKV7G6.js.map → User-DR-2VJcv.js.map} +1 -1
- package/dist/chunks/{User-BM76Ughk.js → User-e9aOjdHv.js} +2 -2
- package/dist/chunks/{User-BM76Ughk.js.map → User-e9aOjdHv.js.map} +1 -1
- package/dist/chunks/{UserProfileView-DDflzpTa.js → UserProfileView-CCNcNT-M.js} +2 -2
- package/dist/chunks/{UserProfileView-DDflzpTa.js.map → UserProfileView-CCNcNT-M.js.map} +1 -1
- package/dist/chunks/{UserProfileView-cUF8ED9n.js → UserProfileView-PmerV2tC.js} +2 -2
- package/dist/chunks/{UserProfileView-cUF8ED9n.js.map → UserProfileView-PmerV2tC.js.map} +1 -1
- package/dist/chunks/{View-CPWwS19u.js → View-CLWMWXbO.js} +2 -2
- package/dist/chunks/{View-CPWwS19u.js.map → View-CLWMWXbO.js.map} +1 -1
- package/dist/chunks/{View-BxlKR1IW.js → View-DADtcBcb.js} +2 -2
- package/dist/chunks/{View-BxlKR1IW.js.map → View-DADtcBcb.js.map} +1 -1
- package/dist/chunks/{WebApp-BdxhRnnT.js → WebApp-BBrvjnnH.js} +2 -2
- package/dist/chunks/{WebApp-BdxhRnnT.js.map → WebApp-BBrvjnnH.js.map} +1 -1
- package/dist/chunks/{WebApp-Bo_egO0c.js → WebApp-wMWf0qkm.js} +2 -2
- package/dist/chunks/{WebApp-Bo_egO0c.js.map → WebApp-wMWf0qkm.js.map} +1 -1
- package/dist/chunks/exportChart-BszC9qir.js +2 -0
- package/dist/chunks/{exportChart-BTrEOM9j.js.map → exportChart-BszC9qir.js.map} +1 -1
- package/dist/chunks/exportChart-CnAGJjyS.js +2 -0
- package/dist/chunks/{exportChart-BfzZUb1j.js.map → exportChart-CnAGJjyS.js.map} +1 -1
- package/dist/chunks/{index-DsID1QpB.js → index-B312g4f-.js} +2 -2
- package/dist/chunks/{index-DsID1QpB.js.map → index-B312g4f-.js.map} +1 -1
- package/dist/chunks/{index-Cxffar1o.js → index-D7ITRVln.js} +2 -2
- package/dist/chunks/{index-Cxffar1o.js.map → index-D7ITRVln.js.map} +1 -1
- package/dist/chunks/{version-BxLEknar.js → version-Cz_nlYsB.js} +2 -2
- package/dist/chunks/{version-BxLEknar.js.map → version-Cz_nlYsB.js.map} +1 -1
- package/dist/chunks/{version-BYy2UAT0.js → version-D2vRYNuT.js} +2 -2
- package/dist/chunks/{version-BYy2UAT0.js.map → version-D2vRYNuT.js.map} +1 -1
- package/dist/docit.cjs.js +1 -1
- package/dist/docit.es.js +1 -1
- package/dist/index.cjs.js +1 -1
- package/dist/index.es.js +1 -1
- package/dist/lightbox.cjs.js +1 -1
- package/dist/lightbox.es.js +1 -1
- package/dist/map.cjs.js +1 -1
- package/dist/map.es.js +1 -1
- package/dist/timeline.cjs.js +1 -1
- package/dist/timeline.es.js +1 -1
- package/dist/user-profile.cjs.js +1 -1
- package/dist/user-profile.es.js +1 -1
- package/package.json +1 -1
- package/dist/chunks/AssistantPanelView-CkQEcaFk.js +0 -2
- package/dist/chunks/AssistantPanelView-CkQEcaFk.js.map +0 -1
- package/dist/chunks/AssistantPanelView-D1wEbgtM.js +0 -2
- package/dist/chunks/AssistantPanelView-D1wEbgtM.js.map +0 -1
- package/dist/chunks/MetricsCountryMapView-Bp3qoVHp.js +0 -2
- package/dist/chunks/MetricsCountryMapView-Bp3qoVHp.js.map +0 -1
- package/dist/chunks/MetricsCountryMapView-CWjIEBJB.js +0 -2
- package/dist/chunks/MetricsCountryMapView-CWjIEBJB.js.map +0 -1
- package/dist/chunks/Modal-Bm1OQ8Ou.js +0 -3
- package/dist/chunks/Modal-KnJhNZ1E.js +0 -3
- package/dist/chunks/Passkeys-BlHx11-5.js +0 -2
- package/dist/chunks/TicketPanelView-DVePzWyJ.js +0 -2
- package/dist/chunks/TicketPanelView-DVePzWyJ.js.map +0 -1
- package/dist/chunks/TicketPanelView-TYh5iZiR.js +0 -2
- package/dist/chunks/TicketPanelView-TYh5iZiR.js.map +0 -1
- package/dist/chunks/admin-CHPo4iDn.js +0 -2
- package/dist/chunks/admin-CHPo4iDn.js.map +0 -1
- package/dist/chunks/admin-CucHFXfD.js +0 -2
- package/dist/chunks/admin-CucHFXfD.js.map +0 -1
- package/dist/chunks/admin-models-CkHjtMHf.js +0 -2
- package/dist/chunks/admin-models-CkHjtMHf.js.map +0 -1
- package/dist/chunks/admin-models-DLtFboxy.js +0 -2
- package/dist/chunks/admin-models-DLtFboxy.js.map +0 -1
- package/dist/chunks/exportChart-BTrEOM9j.js +0 -2
- package/dist/chunks/exportChart-BfzZUb1j.js +0 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"View-CPWwS19u.js","sources":["../../src/core/utils/mustache.js","../../src/core/mixins/EventDelegate.js","../../src/core/View.js"],"sourcesContent":["/**\n * MOJO Mustache - Clean ES6 Template Engine\n * Simplified mustache implementation for MOJO Framework\n * Based on mustache.js logic-less templates\n */\n\nimport MOJOUtils from './MOJOUtils.js';\n\n// Utility functions\nconst objectToString = Object.prototype.toString;\nconst isArray = Array.isArray || function(obj) {\n return objectToString.call(obj) === '[object Array]';\n};\n\nconst isFunction = function(obj) {\n return typeof obj === 'function';\n};\n\nconst isObject = function(obj) {\n return obj !== null && typeof obj === 'object';\n};\n\n// Access DataFormatter without async imports so Mustache remains synchronous.\nfunction getDataFormatter() {\n if (typeof window === 'undefined') return null;\n if (window.MOJO?.dataFormatter) return window.MOJO.dataFormatter;\n if (window.dataFormatter) return window.dataFormatter;\n return null;\n}\n\nconst escapeHtml = function(string) {\n const entityMap = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n '/': '/',\n '`': '`',\n '=': '='\n };\n\n return String(string).replace(/[&<>\"'`=\\/]/g, function(s) {\n return entityMap[s];\n });\n};\n\n// Scanner class for parsing templates\nclass Scanner {\n constructor(string) {\n this.string = string;\n this.tail = string;\n this.pos = 0;\n }\n\n eos() {\n return this.tail === '';\n }\n\n scan(re) {\n const match = this.tail.match(re);\n if (!match || match.index !== 0) {\n return '';\n }\n\n const string = match[0];\n this.tail = this.tail.substring(string.length);\n this.pos += string.length;\n return string;\n }\n\n scanUntil(re) {\n const index = this.tail.search(re);\n let match;\n\n switch (index) {\n case -1:\n match = this.tail;\n this.tail = '';\n break;\n case 0:\n match = '';\n break;\n default:\n match = this.tail.substring(0, index);\n this.tail = this.tail.substring(index);\n }\n\n this.pos += match.length;\n return match;\n }\n}\n\n// Context class for variable resolution\nclass Context {\n constructor(view, parentContext) {\n this.view = view;\n this.cache = { '.': this.view };\n this.parent = parentContext;\n\n // Generate unique context ID for render caching\n if (!this.view?._cacheId) {\n if (this.view && typeof this.view === 'object') {\n this.view._cacheId = Math.random().toString(36).substring(2);\n }\n }\n }\n\n push(view) {\n return new Context(view, this);\n }\n\n lookup(name) {\n // Check render-level cache first\n if (this.renderCache && this.view?._cacheId) {\n const cacheKey = `${this.view._cacheId}:${name}`;\n if (this.renderCache.has(cacheKey)) {\n return this.renderCache.get(cacheKey);\n }\n }\n\n // Special case: '.' refers to the current context value itself\n if (name === '.') {\n return this.view;\n }\n\n // Handle dot-prefix to prevent context chain walking\n // If name starts with '.', only look in current context\n if (name && name.startsWith('.')) {\n let actualName = name.substring(1);\n let shouldIterate = false;\n\n // Support pipe formatting on dot-prefixed lookups, e.g. \".title|upper\"\n // We split pipes here so the lookup remains \"current context only\" while still\n // allowing DataFormatter-style pipe transforms in templates.\n let pipeString = null;\n const pipeIndex = actualName.indexOf('|');\n if (pipeIndex !== -1) {\n pipeString = actualName.substring(pipeIndex + 1).trim();\n actualName = actualName.substring(0, pipeIndex).trim();\n }\n\n // Check for |iter suffix for array iteration (only applies to the base name)\n if (actualName.endsWith('|iter')) {\n actualName = actualName.substring(0, actualName.length - 5); // Remove '|iter'\n shouldIterate = true;\n }\n\n // Only check current view, not parents\n if (this.view && typeof this.view === 'object') {\n let value;\n\n // Check if view has a get method for unified access\n if (typeof this.view.getContextValue === 'function') {\n try {\n value = this.view.getContextValue(actualName);\n if (value !== undefined) {\n if (isFunction(value)) {\n value = value.call(this.view);\n }\n }\n } catch (e) {\n // Fall back to direct property access\n value = undefined;\n }\n }\n\n // Direct property access if get didn't work\n if (value === undefined && actualName in this.view) {\n value = this.view[actualName];\n if (isFunction(value)) {\n value = value.call(this.view);\n }\n }\n\n // If pipes were provided, apply them before any boolean \"existence check\"\n // conversions for arrays/objects. This keeps \".items|iter\" behavior intact\n // while allowing \".title|upper\" style formatting.\n if (pipeString && value !== undefined) {\n try {\n const formatter = getDataFormatter();\n if (formatter && typeof formatter.pipe === 'function') {\n value = formatter.pipe(value, pipeString, this);\n }\n } catch (e) {\n // If formatting fails, fall back to the raw value\n }\n }\n\n // Handle array values based on shouldIterate flag\n if (isArray(value)) {\n if (shouldIterate) {\n // Return array for iteration\n return value;\n } else {\n // Return boolean for existence check\n return value.length > 0;\n }\n }\n\n if (isObject(value)) {\n if (shouldIterate) {\n // Return array of key-value pairs for iteration\n return Object.entries(value).map(([key, val]) => ({\n key: key,\n value: val\n }));\n } else {\n // Return boolean for existence check\n return Object.keys(value).length > 0;\n }\n }\n\n return value;\n }\n\n return undefined; // Don't walk up the chain\n }\n\n // Original lookup logic for non-dot-prefixed names\n const cache = this.cache;\n\n let value;\n if (cache.hasOwnProperty(name)) {\n value = cache[name];\n } else {\n let context = this;\n let intermediateValue;\n let names;\n let index;\n let lookupHit = false;\n\n while (context) {\n // Check if view has a get method for unified access\n if (context.view && typeof context.view.getContextValue === 'function') {\n try {\n intermediateValue = context.view.getContextValue(name);\n if (intermediateValue !== undefined) {\n lookupHit = true;\n }\n } catch (e) {\n // If get throws, fall back to standard lookup\n lookupHit = false;\n }\n }\n\n // Fall back to standard property lookup if get method didn't work\n if (!lookupHit) {\n if (name.indexOf('.') > 0) {\n intermediateValue = context.view;\n names = name.split('.');\n index = 0;\n\n while (intermediateValue != null && index < names.length) {\n // Check if intermediate value has a get method\n if (intermediateValue && typeof intermediateValue.getContextValue === 'function' && index < names.length) {\n try {\n const remainingPath = names.slice(index).join('.');\n intermediateValue = intermediateValue.getContextValue(remainingPath);\n index = names.length; // Skip to end\n if (intermediateValue !== undefined) {\n lookupHit = true;\n }\n } catch (e) {\n // Fall back to property access\n if (index === names.length - 1) {\n lookupHit = (\n hasProperty(intermediateValue, names[index]) ||\n primitiveHasOwnProperty(intermediateValue, names[index])\n );\n }\n intermediateValue = intermediateValue[names[index++]];\n }\n } else {\n if (index === names.length - 1) {\n lookupHit = (\n hasProperty(intermediateValue, names[index]) ||\n primitiveHasOwnProperty(intermediateValue, names[index])\n );\n }\n intermediateValue = intermediateValue[names[index++]];\n }\n }\n } else {\n intermediateValue = context.view[name];\n lookupHit = hasProperty(context.view, name);\n }\n }\n\n if (lookupHit) {\n value = intermediateValue;\n break;\n }\n\n context = context.parent;\n }\n\n cache[name] = value;\n }\n\n if (isFunction(value)) value = value.call(this.view);\n\n // Store in render-level cache after function evaluation\n if (this.renderCache && this.view?._cacheId) {\n const cacheKey = `${this.view._cacheId}:${name}`;\n this.renderCache.set(cacheKey, value);\n }\n\n return value;\n }\n}\n\n// Helper functions\nfunction hasProperty(obj, propName) {\n return obj != null && typeof obj === 'object' && (propName in obj);\n}\n\nfunction primitiveHasOwnProperty(primitive, propName) {\n return (\n primitive != null &&\n typeof primitive !== 'object' &&\n primitive.hasOwnProperty &&\n primitive.hasOwnProperty(propName)\n );\n}\n\n// Writer class for rendering\nclass Writer {\n constructor() {\n this.templateCache = new Map();\n }\n\n clearCache() {\n this.templateCache.clear();\n }\n\n parse(template, tags) {\n tags = tags || ['{{', '}}'];\n\n const cacheKey = template + ':' + tags.join(':');\n let tokens = this.templateCache.get(cacheKey);\n\n if (tokens == null) {\n tokens = this.parseTemplate(template, tags);\n this.templateCache.set(cacheKey, tokens);\n }\n\n return tokens;\n }\n\n parseTemplate(template, tags) {\n if (!template) return [];\n\n const openingTag = tags[0];\n const closingTag = tags[1];\n const scanner = new Scanner(template);\n const tokens = [];\n let start, type, value, chr, token;\n\n const openingTagRe = new RegExp(escapeRegExp(openingTag) + '\\\\s*');\n const closingTagRe = new RegExp('\\\\s*' + escapeRegExp(closingTag));\n const closingCurlyRe = new RegExp('\\\\s*' + escapeRegExp('}' + closingTag));\n\n while (!scanner.eos()) {\n start = scanner.pos;\n\n // Match text before tags\n value = scanner.scanUntil(openingTagRe);\n\n if (value) {\n for (let i = 0; i < value.length; ++i) {\n chr = value.charAt(i);\n\n if (chr === '\\n') {\n tokens.push(['text', chr]);\n } else {\n tokens.push(['text', chr]);\n }\n }\n }\n\n if (!scanner.scan(openingTagRe)) break;\n\n type = scanner.scan(/[#^\\/>{&=!]/);\n if (!type) type = 'name';\n\n scanner.scan(/\\s*/);\n\n if (type === '=') {\n value = scanner.scanUntil(/\\s*=/);\n scanner.scan(/\\s*=/);\n scanner.scanUntil(closingTagRe);\n } else if (type === '{') {\n value = scanner.scanUntil(closingCurlyRe);\n scanner.scan(closingCurlyRe);\n type = '&';\n } else {\n value = scanner.scanUntil(closingTagRe);\n }\n\n scanner.scan(closingTagRe);\n\n if (type === '#' || type === '^') {\n token = [type, value, start, scanner.pos];\n tokens.push(token);\n } else if (type === '/') {\n // Find matching opening section\n let openSection;\n for (let i = tokens.length - 1; i >= 0; --i) {\n if (tokens[i][0] === '#' || tokens[i][0] === '^') {\n if (tokens[i][1] === value) {\n openSection = tokens[i];\n break;\n }\n }\n }\n\n if (openSection) {\n // Add closing position if token doesn't have it yet\n if (openSection.length === 4) {\n openSection.push(scanner.pos);\n }\n }\n // Add closing token for nestSections processing\n tokens.push([type, value, start, scanner.pos]);\n } else {\n tokens.push([type, value, start, scanner.pos]);\n }\n }\n\n return this.nestSections(this.squashTokens(tokens));\n }\n\n squashTokens(tokens) {\n const squashedTokens = [];\n let token, lastToken;\n\n for (let i = 0; i < tokens.length; ++i) {\n token = tokens[i];\n\n if (token) {\n if (token[0] === 'text' && lastToken && lastToken[0] === 'text') {\n lastToken[1] += token[1];\n lastToken[3] = token[3];\n } else {\n squashedTokens.push(token);\n lastToken = token;\n }\n }\n }\n\n return squashedTokens;\n }\n\n nestSections(tokens) {\n const nestedTokens = [];\n let collector = nestedTokens;\n const sections = [];\n\n for (let i = 0; i < tokens.length; ++i) {\n const token = tokens[i];\n\n switch (token[0]) {\n case '#':\n case '^':\n // Create section token with proper structure: [type, name, start, end, children, closing]\n const sectionToken = [\n token[0], // type ('#' or '^')\n token[1], // section name\n token[2], // start position\n token[3], // end position after opening tag\n [], // children array\n token[4] || null // closing position (if set during parsing)\n ];\n\n collector.push(sectionToken);\n sections.push(sectionToken);\n collector = sectionToken[4]; // children array\n break;\n case '/':\n const section = sections.pop();\n if (section) {\n // Set closing position\n section[5] = token[2];\n // Return to parent collector\n collector = sections.length > 0 ? sections[sections.length - 1][4] : nestedTokens;\n }\n break;\n default:\n collector.push(token);\n }\n }\n\n return nestedTokens;\n }\n\n render(template, view, partials, config) {\n const tags = this.getConfigTags(config) || ['{{', '}}'];\n const tokens = this.parse(template, tags);\n\n // Create render-level cache for this render operation\n const renderCache = new Map();\n\n return this.renderTokens(tokens, new Context(view), partials, template, config, renderCache);\n }\n\n renderTokens(tokens, context, partials, originalTemplate, config, renderCache) {\n // Attach render cache to context if provided\n if (renderCache && !context.renderCache) {\n context.renderCache = renderCache;\n }\n let buffer = '';\n\n for (let i = 0; i < tokens.length; ++i) {\n const token = tokens[i];\n let value;\n\n switch (token[0]) {\n case '#':\n value = context.lookup(token[1]);\n if (!value) continue;\n\n // Ensure we have child tokens\n const childTokens = token[4];\n if (!childTokens || !isArray(childTokens)) {\n console.warn(`MUSTACHE WARNING - Section ${token[1]} has no child tokens:`, token);\n continue;\n }\n\n if (isArray(value)) {\n // Process each array item\n for (let j = 0; j < value.length; ++j) {\n const itemContext = context.push(value[j]);\n // Pass render cache to child context\n if (context.renderCache) {\n itemContext.renderCache = context.renderCache;\n }\n const itemResult = this.renderTokens(childTokens, itemContext, partials, originalTemplate, config, renderCache);\n buffer += itemResult;\n }\n } else if (typeof value === 'object' || typeof value === 'string' || typeof value === 'number') {\n const pushedContext = context.push(value);\n // Pass render cache to child context\n if (context.renderCache) {\n pushedContext.renderCache = context.renderCache;\n }\n buffer += this.renderTokens(childTokens, pushedContext, partials, originalTemplate, config, renderCache);\n } else if (isFunction(value)) {\n const text = originalTemplate == null ? null : originalTemplate.slice(token[3], token[5]);\n value = value.call(context.view, text, (template) => this.render(template, context.view, partials, config));\n if (value != null) buffer += value;\n } else if (value) {\n // Handle boolean true and other truthy values\n buffer += this.renderTokens(childTokens, context, partials, originalTemplate, config, renderCache);\n }\n break;\n\n case '^':\n value = context.lookup(token[1]);\n if (!value || (isArray(value) && value.length === 0)) {\n // Ensure we have child tokens for inverted sections too\n const childTokens = token[4];\n if (childTokens && isArray(childTokens)) {\n buffer += this.renderTokens(childTokens, context, partials, originalTemplate, config, renderCache);\n }\n }\n break;\n\n case '>':\n if (!partials) continue;\n value = isFunction(partials) ? partials(token[1]) : partials[token[1]];\n if (value != null) {\n buffer += this.render(value, context.view, partials, config);\n }\n break;\n\n case '&':\n value = context.lookup(token[1]);\n if (value != null) buffer += value;\n break;\n\n case 'name':\n value = context.lookup(token[1]);\n if (value != null) buffer += escapeHtml(value);\n break;\n\n case 'text':\n buffer += token[1];\n break;\n }\n }\n\n return buffer;\n }\n\n getConfigTags(config) {\n if (isObject(config) && isArray(config.tags)) {\n return config.tags;\n }\n return null;\n }\n}\n\nfunction escapeRegExp(string) {\n return string.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g, '\\\\$&');\n}\n\n// Default writer instance\nconst defaultWriter = new Writer();\n\n// Main Mustache object\nconst Mustache = {\n name: 'MOJO Mustache',\n version: '1.0.0',\n tags: ['{{', '}}'],\n\n Scanner,\n Context,\n Writer,\n\n escape: escapeHtml,\n\n clearCache() {\n return defaultWriter.clearCache();\n },\n\n parse(template, tags) {\n return defaultWriter.parse(template, tags);\n },\n\n render(template, view, partials, config) {\n if (typeof template !== 'string') {\n throw new TypeError('Invalid template! Template should be a \"string\"');\n }\n\n // Auto-wrap context to enable pipe formatters if not already wrapped\n // This ensures pipes work everywhere without requiring manual wrapping\n if (view && typeof view === 'object' && !view.getContextValue && typeof view.toJSON !== 'function') {\n view = MOJOUtils.wrapData(view);\n }\n\n return defaultWriter.render(template, view, partials, config);\n }\n};\n\n// ES6 Module Export\nexport default Mustache;\n","// EventDelegate.js\nexport class EventDelegate {\n constructor(view) {\n this.view = view;\n this.domListeners = [];\n this.debounceTimers = new Map();\n }\n\n bind(rootEl) {\n this.unbind();\n if (!rootEl) return;\n\n const onClick = async (event) => {\n const actionEl = event.target.closest('[data-action]');\n if (actionEl && this.shouldHandle(actionEl, event)) {\n const action = actionEl.getAttribute('data-action');\n\n // Prevent default immediately for anchor tags to avoid navigation\n // before async dispatch completes (e.g. <a href=\"#\" data-action=\"...\">)\n if (actionEl.tagName === 'A') {\n event.preventDefault();\n }\n\n // Hide any tooltips on the clicked element\n this.hideTooltip(actionEl);\n\n const handled = await this.dispatch(action, event, actionEl);\n if (handled) {\n event.preventDefault();\n event.stopPropagation();\n event.handledByChild = true;\n return;\n }\n }\n const navEl = event.target.closest('a[href], [data-page]');\n if (navEl && !navEl.hasAttribute('data-action') && this.shouldHandle(navEl, event)) {\n if (event.ctrlKey || event.metaKey || event.shiftKey || event.button === 1) return;\n if (navEl.tagName === 'A') {\n const href = navEl.getAttribute('href');\n if (href && href !== '#' && !href.startsWith('#') &&\n (this.view.isExternalLink(href) || navEl.hasAttribute('data-external'))) return;\n }\n\n // Hide any tooltips on the clicked element before navigation\n this.hideTooltip(navEl);\n\n event.preventDefault();\n event.stopPropagation();\n event.handledByChild = true;\n if (navEl.hasAttribute('data-page')) await this.view.handlePageNavigation(navEl);\n else await this.view.handleHrefNavigation(navEl);\n }\n };\n\n const onChange = (event) => {\n // `data-change-action` always wins for change events (existing behavior).\n const changeEl = event.target.closest('[data-change-action]');\n if (changeEl && this.shouldHandle(changeEl, event)) {\n const action = changeEl.getAttribute('data-change-action');\n this.dispatchChange(action, event, changeEl).then((handled) => {\n if (handled) {\n event.stopPropagation();\n event.handledByChild = true;\n }\n });\n return;\n }\n\n // Fallback: `data-action` on a form control fires onAction* on change.\n const actionEl = event.target.closest('[data-action]');\n if (actionEl && this.isFormControl(actionEl) && this.shouldHandle(actionEl, event)) {\n const action = actionEl.getAttribute('data-action');\n this.dispatch(action, event, actionEl).then((handled) => {\n if (handled) {\n event.stopPropagation();\n event.handledByChild = true;\n }\n });\n }\n };\n\n const onInput = (event) => {\n // Existing `data-change-action` + `data-filter=\"live-search\"` path.\n const changeEl = event.target.closest('[data-change-action]');\n if (changeEl && this.shouldHandle(changeEl, event) &&\n event.target.matches('[data-filter=\"live-search\"]')) {\n const action = changeEl.getAttribute('data-change-action');\n const debounceMs = parseInt(changeEl.getAttribute('data-filter-debounce')) || 300;\n const timerId = `change-${action}-${changeEl.getAttribute('data-container') || 'default'}`;\n\n if (this.debounceTimers.has(timerId)) {\n clearTimeout(this.debounceTimers.get(timerId));\n }\n\n const timer = setTimeout(() => {\n this.debounceTimers.delete(timerId);\n this.dispatchChange(action, event, changeEl).then((handled) => {\n if (handled) {\n event.stopPropagation();\n event.handledByChild = true;\n }\n });\n }, debounceMs);\n\n this.debounceTimers.set(timerId, timer);\n return;\n }\n\n // New: `data-action` on a form control fires onAction* on input\n // (keystrokes for text-like inputs/textarea, value updates for select).\n // `data-change-action` takes precedence above, so this only runs when\n // the element doesn't carry a change-action.\n const actionEl = event.target.closest('[data-action]');\n if (!actionEl || !this.isFormControl(actionEl)) return;\n if (actionEl.hasAttribute('data-change-action')) return;\n if (!this.shouldHandle(actionEl, event)) return;\n\n const action = actionEl.getAttribute('data-action');\n const debounceAttr = actionEl.getAttribute('data-action-debounce');\n const debounceMs = debounceAttr != null ? parseInt(debounceAttr) || 0 : 0;\n\n if (debounceMs > 0) {\n const timerId = `action-${action}-${actionEl.getAttribute('data-container') || 'default'}`;\n if (this.debounceTimers.has(timerId)) {\n clearTimeout(this.debounceTimers.get(timerId));\n }\n const timer = setTimeout(() => {\n this.debounceTimers.delete(timerId);\n this.dispatch(action, event, actionEl).then((handled) => {\n if (handled) {\n event.stopPropagation();\n event.handledByChild = true;\n }\n });\n }, debounceMs);\n this.debounceTimers.set(timerId, timer);\n return;\n }\n\n this.dispatch(action, event, actionEl).then((handled) => {\n if (handled) {\n event.stopPropagation();\n event.handledByChild = true;\n }\n });\n };\n\n const onKeyDown = (event) => {\n if (event.target.matches('[data-filter=\"search\"]')) return;\n const el = event.target.closest('[data-keydown-action]') || event.target.closest('[data-change-action]');\n if (!el || !this.shouldHandle(el, event)) return;\n let changeKeys = [\"Enter\"];\n if (el.getAttribute('data-change-keys')) {\n changeKeys = el.getAttribute('data-change-keys').split(',').map(key => key.trim());\n }\n if (changeKeys.includes('*') || changeKeys.includes(event.key)) {\n const action = el.getAttribute('data-keydown-action') || el.getAttribute('data-change-action');\n this.dispatch(action, event, el).then((handled) => {\n if (handled) {\n event.preventDefault();\n event.stopPropagation();\n event.handledByChild = true;\n }\n });\n }\n };\n\n const onSubmit = (event) => {\n const form = event.target.closest('form[data-action]');\n if (!form || !this.shouldHandle(form, event)) return;\n event.preventDefault();\n const action = form.getAttribute('data-action');\n this.dispatch(action, event, form);\n };\n\n rootEl.addEventListener('click', onClick);\n rootEl.addEventListener('change', onChange);\n rootEl.addEventListener('input', onInput);\n rootEl.addEventListener('keydown', onKeyDown);\n rootEl.addEventListener('submit', onSubmit);\n\n this.domListeners.push(\n { el: rootEl, type: 'click', fn: onClick },\n { el: rootEl, type: 'change', fn: onChange },\n { el: rootEl, type: 'input', fn: onInput },\n { el: rootEl, type: 'keydown', fn: onKeyDown },\n { el: rootEl, type: 'submit', fn: onSubmit },\n );\n }\n\n unbind() {\n for (const { el, type, fn } of this.domListeners) el.removeEventListener(type, fn);\n this.domListeners = [];\n\n // Clear any pending debounce timers\n for (const timer of this.debounceTimers.values()) {\n clearTimeout(timer);\n }\n this.debounceTimers.clear();\n }\n\n hideDropdown(element) {\n const dropdownMenu = element.closest('.dropdown-menu');\n const dropdown = dropdownMenu.closest('.dropdown');\n if (!dropdown) {\n return;\n }\n\n const dropdownBtn = dropdown.querySelector('[data-bs-toggle=\"dropdown\"]');\n if (dropdownBtn && window.bootstrap?.Dropdown) {\n const dropdownInstance = window.bootstrap.Dropdown.getInstance(dropdownBtn);\n dropdownInstance?.hide();\n }\n }\n\n hideTooltip(element) {\n // Hide tooltip on the clicked element\n if (element && window.bootstrap?.Tooltip) {\n const tooltip = window.bootstrap.Tooltip.getInstance(element);\n if (tooltip) {\n tooltip.dispose();\n // tooltip.hide();\n }\n }\n }\n\n hideAllTooltips() {\n // Hide all visible tooltips in the document\n if (window.bootstrap?.Tooltip) {\n const tooltips = document.querySelectorAll('[data-bs-toggle=\"tooltip\"]');\n tooltips.forEach(el => {\n const tooltip = window.bootstrap.Tooltip.getInstance(el);\n if (tooltip) {\n tooltip.hide();\n }\n });\n }\n }\n\n async dispatch(action, event, el) {\n const v = this.view;\n const cap = (s) => (s.includes('-') ? s.split('-').map(w => w[0].toUpperCase()+w.slice(1)).join('') : s[0].toUpperCase()+s.slice(1));\n\n const specific = `handleAction${cap(action)}`;\n if (typeof v[specific] === 'function') {\n try { event.preventDefault(); await v[specific](event, el); return true; }\n catch (e) { console.error(`Error in action ${action}:`, e); v.handleActionError(action, e, event, el); return true; }\n }\n\n const generic = `onAction${cap(action)}`;\n if (typeof v[generic] === 'function') {\n try {\n if (await v[generic](event, el)) {\n const isInDropdown = !!el.closest('.dropdown-menu');\n if (isInDropdown) this.hideDropdown(el);\n event.preventDefault();\n event.stopPropagation();\n return true;\n }\n return false;\n }\n catch (e) { console.error(`Error in action ${action}:`, e); v.handleActionError(action, e, event, el); return true; }\n }\n\n const passThru = `onPassThruAction${cap(action)}`;\n if (typeof v[passThru] === 'function') {\n try { await v[passThru](event, el); return false; }\n catch (e) { console.error(`Error in action ${action}:`, e); v.handleActionError(action, e, event, el); return true; }\n }\n\n if (typeof v.onActionDefault === 'function') {\n try { return await v.onActionDefault(action, event, el); }\n catch (e) { console.error(`Error in default action handler for ${action}:`, e); v.handleActionError(action, e, event, el); return true; }\n }\n\n v.emit?.(`action:${action}`, { action, event, element: el });\n return false;\n }\n\n async dispatchChange(action, event, el) {\n const v = this.view;\n const cap = (s) => (s.includes('-') ? s.split('-').map(w => w[0].toUpperCase()+w.slice(1)).join('') : s[0].toUpperCase()+s.slice(1));\n\n const changeHandler = `onChange${cap(action)}`;\n if (typeof v[changeHandler] === 'function') {\n try {\n await v[changeHandler](event, el);\n return true;\n }\n catch (e) {\n console.error(`Error in onChange ${action}:`, e);\n v.handleActionError?.(action, e, event, el);\n return true;\n }\n }\n\n // Fall back to regular dispatch if no onChange handler exists\n return await this.dispatch(action, event, el);\n }\n\n isFormControl(el) {\n if (!el || !el.tagName) return false;\n const tag = el.tagName;\n return tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT';\n }\n\n shouldHandle(el, event) {\n if (this.owns(el)) return true;\n if (this.contains(el) && !event.handledByChild) return true;\n return false;\n }\n\n owns(el) {\n const root = this.view.element;\n if (!root || !root.contains(el)) return false;\n for (const child of Object.values(this.view.children)) {\n if (child.element && child.element.contains(el)) return false;\n }\n return true;\n }\n\n contains(el) { return !!this.view.element && this.view.element.contains(el); }\n}\n\nexport default EventDelegate;\n","// -----------------------------------------------\n// Imports\n// -----------------------------------------------\nimport Mustache from '@core/utils/mustache.js';\nif (typeof window !== 'undefined') {\n window.Mustache = Mustache;\n}\nimport MOJOUtils from '@core/utils/MOJOUtils.js';\nimport EventDelegate from '@core/mixins/EventDelegate.js';\n\n// -----------------------------------------------\n// View\n// -----------------------------------------------\nexport class View {\n // ---------------------------------------------\n // Construction & defaults\n // ---------------------------------------------\n constructor(opts = {}) {\n this.tagName = opts.tagName ?? \"div\";\n this.className = opts.className ?? \"mojo-view\";\n this.style = opts.style ?? null; // inline css text\n this.id = opts.id ?? View._genId(); // element id\n this.containerId = opts.containerId ?? null; // container to render into\n this.container = opts.container ?? null; // container element\n\n // If container is a string, treat it as containerId and set container to null\n if (typeof this.container === 'string') {\n this.containerId = this.container;\n this.container = null;\n }\n this.parent = opts.parent ?? null; // parent view\n this.children = opts.children ?? {}; // dict of id -> child view\n this.template = opts.template || opts.templateUrl || \"\"; // string or function(model) -> string\n this.data = opts.data ?? {}; // data for Mustache or basic templating\n this.isRendering = false;\n this.lastRenderTime = 0;\n this.mounted = false;\n this.debug = opts.debug ?? false;\n this.app = opts.app ?? null;\n this.cacheTemplate = opts.cacheTemplate ?? true;\n this.enableTooltips = opts.enableTooltips ?? false; // Auto-initialize Bootstrap tooltips after render\n\n // keep original options\n this.options = { ...opts };\n\n // internal DOM element\n this.element = this._ensureElement();\n\n // in constructor\n this.events = new EventDelegate(this);\n\n if (opts.model) this.setModel(opts.model);\n\n }\n\n // ---------------------------------------------\n // Lifecycle hooks (overridable)\n // ---------------------------------------------\n async onInit() {\n\n }\n async onInitView() {\n if (this.initialized) return;\n this.initialized = true;\n await this.onInit();\n }\n async onBeforeRender() {}\n async onAfterRender() {}\n async onBeforeMount() {}\n async onAfterMount() {}\n async onBeforeUnmount() {}\n async onAfterUnmount() {}\n async onBeforeDestroy() {}\n async onAfterDestroy() {}\n\n // ---------------------------------------------\n // Public API\n // ---------------------------------------------\n setModel(model = {}) {\n let isDiff = model !== this.model;\n if (!isDiff) return this;\n if (this.model && this.model.off) {\n this.model.off(\"change\", this._onModelChange, this);\n }\n this.model = model;\n if (this.model && this.model.on) {\n this.model.on(\"change\", this._onModelChange, this);\n }\n\n // Set model on all children\n for (const id in this.children) {\n const child = this.children[id];\n if (child && typeof child.setModel === 'function') {\n child.setModel(model);\n }\n }\n\n if (isDiff ) {\n this._onModelChange();\n }\n return this;\n }\n\n _onModelChange() {\n if (this.isMounted()) {\n this.render();\n }\n }\n\n setTemplate(tpl) { this.template = tpl ?? \"\"; return this; }\n\n addChild(childView, options) {\n try {\n if (!childView || typeof childView !== \"object\") return this;\n\n // Allow overriding containerId and id via options\n if (options) {\n if (options.containerId || options.container) {\n childView.containerId = options.containerId || options.container;\n }\n if (options.id) {\n childView.id = options.id;\n }\n // lazyMount: defer the child's render until its container scrolls\n // into view. Useful for long dashboards where below-the-fold\n // panels would otherwise fetch on first paint.\n if (options.lazyMount === true) {\n childView._lazyMount = true;\n }\n }\n\n childView.parent = this;\n if (this.getApp()) childView.app = this.app;\n this.children[childView.id] = childView;\n } catch (e) { View._warn(\"addChild error\", e); }\n return childView;\n }\n\n removeChild(idOrView) {\n try {\n const id = typeof idOrView === \"string\" ? idOrView : (idOrView && idOrView.id);\n if (!id) return this;\n const child = this.children[id];\n if (child) {\n // allow for async or sync destroy\n Promise.resolve(child.destroy()).catch(err => View._warn(\"removeChild destroy error\", err));\n delete this.children[id];\n }\n } catch (e) { View._warn(\"removeChild error\", e); }\n return this;\n }\n\n getChild(id) {\n return this.children[id];\n }\n\n async updateData(newData, rerender = false) {\n Object.assign(this.data, newData);\n\n if (rerender && this.isMounted()) {\n await this.render();\n }\n\n return this;\n }\n\n toggleClass(className, force) {\n if (force === undefined) {\n force = !this.element.classList.contains(className);\n }\n this.element.classList.toggle(className, force);\n return this;\n }\n\n addClass(className) {\n this.element.classList.add(className);\n return this;\n }\n\n setClass(className) {\n this.element.className = className;\n return this;\n }\n\n removeClass(className) {\n this.element.classList.remove(className);\n return this;\n }\n\n canRender() {\n if (this.isRendering) return false;\n // Optional render throttling\n const now = Date.now();\n if (this.options.renderCooldown > 0 && now - this.lastRenderTime < this.options.renderCooldown) {\n View._warn(`View ${this.id}: Render called too quickly, cooldown active`);\n return false;\n }\n if (this.options.noAppend) {\n if (this.parent) {\n if (!this.parent.contains(this.containerId || this.container)) {\n return false;\n } else if (this.containerId && !document.getElementById(this.containerId)) {\n return false;\n } else if (this.container && !document.contains(this.container)) {\n return false;\n }\n }\n }\n return true;\n }\n\n // ---------------------------------------------\n // Render flow\n // ---------------------------------------------\n async render(allowMount = true, container = null) {\n const now = Date.now();\n\n if (!this.canRender()) {\n return this;\n }\n\n this.isRendering = true;\n this.lastRenderTime = now;\n\n try {\n if (!this.initialized) await this.onInitView();\n this.unbindEvents();\n\n await this.onBeforeRender();\n if (this.getViewData) {\n this.data = await this.getViewData();\n }\n // 1) render own HTML (FIX #5: await the async template render)\n const html = await this.renderTemplate();\n this.element.innerHTML = html;\n\n if (allowMount && !this.isMounted()) {\n await this.mount(container)\n }\n\n // 3) render children\n await this._renderChildren();\n await this.onAfterRender();\n this.bindEvents();\n\n } catch (e) {\n View._warn(`Render error in ${this.id}`, e);\n } finally {\n // FIX #4: always reset isRendering\n this.isRendering = false;\n }\n\n return this;\n }\n\n async _renderChildren() {\n const lazyPending = [];\n for (const id in this.children) {\n const child = this.children[id];\n if (!child) continue;\n child.parent = this;\n if (child._lazyMount && !child._lazyTriggered) {\n // Skip render — observer will mount it when its container enters\n // the viewport. Track it for observer setup below.\n lazyPending.push(child);\n continue;\n }\n await Promise.resolve(child.render()).catch(err => View._warn(`Child render error (${id})`, err));\n }\n if (lazyPending.length) this._setupLazyMountObserver(lazyPending);\n }\n\n /**\n * Start an IntersectionObserver per pending lazy child. When the\n * container scrolls into view, mark the child as triggered and render.\n * @private\n */\n _setupLazyMountObserver(pendingChildren) {\n if (typeof IntersectionObserver === 'undefined') {\n // SSR / unsupported — fall back to immediate render so behavior\n // degrades gracefully.\n pendingChildren.forEach(c => {\n c._lazyTriggered = true;\n Promise.resolve(c.render()).catch(err => View._warn(`Lazy child render error (${c.id})`, err));\n });\n return;\n }\n\n if (!this._lazyObserver) {\n this._lazyObserver = new IntersectionObserver((entries, observer) => {\n for (const entry of entries) {\n if (!entry.isIntersecting) continue;\n const child = entry.target.__mojoLazyChild;\n observer.unobserve(entry.target);\n if (!child || child._lazyTriggered) continue;\n child._lazyTriggered = true;\n Promise.resolve(child.render()).catch(err => View._warn(`Lazy child render error (${child.id})`, err));\n }\n }, {\n rootMargin: '120px 0px', // start mounting just before scroll-in\n threshold: 0.01\n });\n }\n\n for (const child of pendingChildren) {\n const container = this.getChildElement(child.containerId);\n if (!container) continue;\n container.__mojoLazyChild = child;\n // IntersectionObserver doesn't fire on 0-height elements. Give the\n // placeholder a minimal height so the observer can measure it; this\n // is overridden once the real child mounts and fills the container.\n if (!container.style.minHeight) {\n container.classList.add('mojo-lazy-placeholder');\n container.style.minHeight = '1px';\n }\n this._lazyObserver.observe(container);\n\n // Belt-and-suspenders: IntersectionObserver's initial callback can\n // be flaky inside scrolled sub-containers (the dashboard renders\n // inside a separately-scrolled .portal-content panel). On the next\n // tick, manually check whether the container is in the viewport and\n // trigger if so. The normal observer still handles future scrolls.\n requestAnimationFrame(() => {\n if (child._lazyTriggered) return;\n const rect = container.getBoundingClientRect();\n const vh = (typeof window !== 'undefined') ? window.innerHeight : 0;\n const vw = (typeof window !== 'undefined') ? window.innerWidth : 0;\n const visible = rect.top < (vh + 120) && rect.bottom > -120 && rect.left < vw && rect.right > 0;\n if (visible) {\n child._lazyTriggered = true;\n this._lazyObserver?.unobserve(container);\n Promise.resolve(child.render()).catch(err => View._warn(`Lazy child render error (${child.id})`, err));\n }\n });\n }\n }\n\n async _unmountChildren() {\n for (const id in this.children) {\n const child = this.children[id];\n if (!child) continue;\n child.unbindEvents()\n }\n }\n\n\n isMounted() {\n return this.element?.isConnected;\n }\n\n getChildElementById(id, root = null) {\n const cleanId = id.startsWith('#') ? id.substring(1) : id;\n if (root) {\n return root.querySelector(`#${cleanId}`);\n }\n return this.element.querySelector(`#${cleanId}`);\n }\n\n getChildElement(id) {\n if (id.startsWith(\"#\")) {\n return this.getChildElementById(id);\n }\n let el = this.element?.querySelector(`[data-container=\"${id}\"]`);\n if (!el) {\n return this.getChildElementById(id);\n }\n return el;\n }\n\n getContainer() {\n if (this.replaceById) {\n // this means we want to place the element in the dom that matches our id\n if (this.parent) {\n return this.parent.getChildElementById(this.id);\n }\n // return this.getChildElementById(this.id, document.body);\n return null;\n }\n if (!this.containerId) return null;\n if (this.parent) {\n return this.parent.getChildElement(this.containerId);\n }\n return this.getChildElementById(this.containerId, document.body);\n }\n\n async mount(container = null) {\n await this.onBeforeMount();\n if (!container) {\n container = this.getContainer();\n }\n\n if (this.containerId && !container) {\n // throw new Error(`Container not found for ${this.containerId}`);\n console.error(`Container not found for ${this.containerId}`);\n return;\n }\n\n if (container && this.replaceById) {\n container.replaceWith(this.element);\n } else if (container) {\n // if we have a container just replace its children with our element\n container.replaceChildren(this.element);\n } else if (!this.containerId && this.parent) {\n // append to parent\n this.parent.element.appendChild(this.element);\n } else if (!this.containerId && !this.parent && this.options.allowAppendToBody) {\n // append to body\n console.log(\"APPENDING TO BODY!!!!\");\n document.body.appendChild(this.element);\n } else {\n // there is a containerId but no container\n console.error(`Container not found for ${this.containerId}`);\n }\n\n await this.onAfterMount();\n this.mounted = true;\n }\n\n async unmount() {\n if (!this.element || !this.element.parentNode) return;\n await this.onBeforeUnmount();\n // unbind all children\n await this._unmountChildren();\n if (this.element.parentNode) this.element.parentNode.removeChild(this.element);\n this.events.unbind();\n await this.onAfterUnmount();\n this.mounted = false;\n }\n\n // FIX #1: make destroy async (it already awaited hooks)\n async destroy() {\n try {\n this.events.unbind();\n if (this._lazyObserver) {\n this._lazyObserver.disconnect();\n this._lazyObserver = null;\n }\n // destroy children first (support async or sync destroy)\n for (const id in this.children) {\n const ch = this.children[id];\n if (ch) {\n await Promise.resolve(ch.destroy()).catch(err => View._warn(`Child destroy error (${id})`, err));\n }\n }\n this.mounted = false;\n if (this.element && this.element.parentNode) {\n await this.onBeforeDestroy();\n if (this.element.parentNode) this.element.parentNode.removeChild(this.element);\n await this.onAfterDestroy();\n }\n } catch (e) {\n View._warn(`Destroy error in ${this.id}`, e);\n }\n }\n\n // ---------------------------------------------\n // DOM helpers\n // ---------------------------------------------\n _ensureElement() {\n try {\n if (this.element && this.element.tagName?.toLowerCase() === this.tagName) {\n this._syncAttrs();\n return this.element;\n }\n const el = document.createElement(this.tagName);\n this.element = el;\n this.el = el;\n this._syncAttrs();\n return el;\n } catch (e) {\n View._warn(\"ensureElement error\", e);\n // last resort: create a DIV to avoid throwing\n const el = document.createElement(\"div\");\n // FIX #2: use View._genId() (not SimpleView)\n el.id = this.id || View._genId();\n return el;\n }\n }\n\n _syncAttrs() {\n try {\n if (!this.element) return;\n if (this.id) this.element.id = this.id;\n this.element.className = this.className || \"\";\n if (this.style == null) {\n this.element.removeAttribute(\"style\");\n } else {\n this.element.style.cssText = String(this.style);\n }\n } catch (e) { View._warn(\"_syncAttrs error\", e); }\n }\n\n bindEvents() {\n this.events.bind(this.element);\n\n // Initialize tooltips if enabled\n if (this.enableTooltips) {\n this.initializeTooltips();\n }\n }\n\n unbindEvents() {\n this.events.unbind();\n\n // Cleanup tooltips if enabled\n if (this.enableTooltips) {\n this.disposeTooltips();\n }\n }\n\n // ---------------------------------------------\n // Template helpers\n // ---------------------------------------------\n async renderTemplate() {\n const templateContent = await this.getTemplate();\n if (!templateContent) return '';\n const partials = this.getPartials();\n return Mustache.render(templateContent, this, partials);\n }\n\n renderTemplateString(template, context, partials) {\n // Mustache.render now auto-wraps context to enable pipe formatters\n return Mustache.render(template, context, partials);\n }\n\n getPartials() { return {}; }\n\n async getTemplate() {\n if (this._templateCache && this.cacheTemplate) {\n return this._templateCache;\n }\n const template = this.template || this.templateUrl;\n if (!template) {\n throw new Error('Template not found');\n }\n\n let templateContent = '';\n\n if (typeof template === 'string') {\n if (template.includes('<') || template.includes('{')) {\n templateContent = template;\n } else {\n try {\n let templatePath = template;\n if (!this.app) this.app = this.getApp();\n if (this.app && this.app.basePath) {\n if (!templatePath.startsWith('/') &&\n !templatePath.startsWith('http://') &&\n !templatePath.startsWith('https://')) {\n const base = this.app.basePath.endsWith('/')\n ? this.app.basePath.slice(0, -1)\n : this.app.basePath;\n templatePath = `${base}/${templatePath}`;\n }\n }\n\n const response = await fetch(templatePath);\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n templateContent = await response.text();\n } catch (error) {\n View._warn(`Failed to load template from ${template}: ${error}`);\n // NOTE: showError may be provided by host app\n this.showError?.(`Failed to load template from ${template}: ${error.message}`);\n }\n }\n } else if (typeof template === 'function') {\n templateContent = await this.template(this.data, this.state);\n }\n\n if (this.cacheTemplate && templateContent) {\n this._templateCache = templateContent;\n }\n\n return templateContent;\n }\n\n getContextValue(path) {\n const value = MOJOUtils.getContextData(this, path);\n\n if (path && path.startsWith('data.') && value && typeof value === 'object') {\n return MOJOUtils.wrapData(value, this);\n }\n\n if (path && path.startsWith('model.') &&\n path !== 'model' &&\n value && typeof value === 'object' &&\n typeof value.getContextValue !== 'function') {\n return MOJOUtils.wrapData(value, null);\n }\n\n return value;\n }\n\n // 9) Navigation Helpers ------------------------------------------------------\n async handlePageNavigation(element) {\n const pageName = element.getAttribute('data-page');\n const paramsAttr = element.getAttribute('data-params');\n let params = {};\n if (paramsAttr) {\n try { params = JSON.parse(paramsAttr); }\n catch (error) { console.warn('Invalid JSON in data-params:', paramsAttr); }\n }\n\n const app = this.getApp();\n if (app) { app.showPage(pageName, params); return; }\n\n const router = this.findRouter();\n if (router && typeof router.navigateToPage === 'function') {\n await router.navigateToPage(pageName, params);\n } else {\n console.error(`No router found for page navigation to '${pageName}'`);\n }\n }\n\n async handleHrefNavigation(element) {\n const href = element.getAttribute('href');\n if (this.isExternalLink(href) || element.hasAttribute('data-external')) return;\n\n const router = this.findRouter();\n if (router) {\n if (router.options && router.options.mode === 'param' && href.startsWith('?')) {\n const fullPath = '/' + href;\n await router.navigate(fullPath);\n return;\n }\n if (router.options && router.options.mode === 'hash' && href.startsWith('#')) {\n await router.navigate(href);\n return;\n }\n const routePath = this.hrefToRoutePath(href);\n await router.navigate(routePath);\n } else {\n console.warn('No router found for navigation, using default behavior');\n window.location.href = href;\n }\n }\n\n isExternalLink(href) {\n if (!href) return true;\n if (href.startsWith(\"/\") && this.getApp()) {\n if (href.startsWith(this.findRouter().basePath)) return false;\n return true;\n }\n return href.startsWith('#') || href.startsWith('mailto:') || href.startsWith('tel:') || href.startsWith('http://') || href.startsWith('https://') || href.startsWith('//');\n }\n\n hrefToRoutePath(href) {\n if (href.startsWith('/')) {\n const router = this.findRouter();\n if (router && router.options && router.options.base) {\n const base = router.options.base;\n if (href.startsWith(base)) return href.substring(base.length) || '/';\n }\n return href;\n }\n return href.startsWith('./') ? href.substring(2) : href;\n }\n\n findRouter() {\n this.getApp();\n return this.app?.router || null;\n }\n\n getApp() {\n if (this.app) return this.app;\n const apps = [\n window.__app__,\n window.MOJO?.app,\n window.APP,\n window.app,\n window.WebApp,\n window.matchUUID ? window[window.matchUUID]() : window[window.matchUUID]\n ];\n this.app = apps.find(app => app && typeof app.showPage === 'function') || null;\n return this.app;\n }\n\n handleActionError(action, err, evt, el) {\n this.showError(`Action '${action}' failed: ${err}`, evt, el);\n }\n\n // ---------------------------------------------\n // Utilities\n // ---------------------------------------------\n /**\n * Escape HTML characters\n * @param {string} str - String to escape\n * @returns {string} Escaped string\n */\n escapeHtml(str) {\n if (typeof str !== 'string') return str;\n\n const div = document.createElement('div');\n div.textContent = str;\n return div.innerHTML;\n }\n\n contains(el) {\n if (typeof el === 'string') {\n if (!this.element) return false; // no parent element yet\n el = document.getElementById(el);\n }\n if (!el) return false; // no element with that id\n return this.element.contains(el);\n }\n\n /**\n * Initialize Bootstrap tooltips in this view's element\n * Called automatically in bindEvents() if enableTooltips is true\n */\n initializeTooltips() {\n if (!this.element || !window.bootstrap?.Tooltip) return;\n this.disposeTooltips();\n const tooltipTriggerList = this.element.querySelectorAll('[data-bs-toggle=\"tooltip\"]');\n [...tooltipTriggerList].map(tooltipTriggerEl => {\n // Extract custom options from data attributes\n const theme = tooltipTriggerEl.getAttribute('data-tooltip-theme');\n const size = tooltipTriggerEl.getAttribute('data-tooltip-size');\n\n // Build custom class list\n let customClass = '';\n if (theme) customClass += `tooltip-${theme} `;\n if (size) customClass += `tooltip-${size}`;\n\n // Build options object - only include customClass if it has a value\n const options = {};\n const trimmedClass = customClass.trim();\n if (trimmedClass) {\n options.customClass = trimmedClass;\n }\n\n // Initialize tooltip with custom options\n return new window.bootstrap.Tooltip(tooltipTriggerEl, options);\n });\n }\n\n /**\n * Dispose all Bootstrap tooltips in this view's element\n * Called automatically in unbindEvents() if enableTooltips is true\n */\n disposeTooltips() {\n if (!this.element || !window.bootstrap?.Tooltip) return;\n\n const tooltipElements = this.element.querySelectorAll('[data-bs-toggle=\"tooltip\"]');\n tooltipElements.forEach(element => {\n const tooltip = window.bootstrap.Tooltip.getInstance(element);\n if (tooltip) {\n tooltip.dispose();\n }\n });\n }\n\n /**\n * Show error message\n * @param {string} message - Error message\n */\n async showError(message) {\n console.error(`View ${this.id} error:`, message);\n const app = this.getApp ? this.getApp() : (this.app || null);\n if (app && typeof app.showError === 'function') {\n await app.showError(message);\n return;\n }\n // Fallback to browser alert if no app or helper available\n alert(`Error: ${message}`);\n }\n\n /**\n * Show success message\n * @param {string} message - Success message\n */\n async showSuccess(message) {\n if (this.debug) {\n console.log(`View ${this.id} success:`, message);\n }\n const app = this.getApp ? this.getApp() : (this.app || null);\n if (app && typeof app.showSuccess === 'function') {\n await app.showSuccess(message);\n return;\n }\n // Fallback to browser alert if no app or helper available\n alert(`Success: ${message}`);\n }\n\n /**\n * Show info message\n * @param {string} message - Info message\n */\n async showInfo(message) {\n console.info(`View ${this.id} info:`, message);\n const app = this.getApp ? this.getApp() : (this.app || null);\n if (app && typeof app.showInfo === 'function') {\n await app.showInfo(message);\n return;\n }\n // Fallback to browser alert if no app or helper available\n alert(`Info: ${message}`);\n }\n\n /**\n * Show warning message\n * @param {string} message - Warning message\n */\n async showWarning(message) {\n console.warn(`View ${this.id} warning:`, message);\n const app = this.getApp ? this.getApp() : (this.app || null);\n if (app && typeof app.showWarning === 'function') {\n await app.showWarning(message);\n return;\n }\n // Fallback to browser alert if no app or helper available\n alert(`Warning: ${message}`);\n }\n\n // Default action: copy value from data-clipboard to clipboard\n async onActionCopyToClipboard(event, element) {\n try {\n const carrier = element?.closest('[data-clipboard]') || element;\n const text = carrier?.getAttribute('data-clipboard') || '';\n // Consider handled even if empty to avoid bubbling\n if (!text) return true;\n\n if (navigator.clipboard && window.isSecureContext) {\n await navigator.clipboard.writeText(text);\n } else {\n const textarea = document.createElement('textarea');\n textarea.value = text;\n document.body.appendChild(textarea);\n textarea.select();\n document.execCommand('copy');\n document.body.removeChild(textarea);\n }\n\n // Visual feedback: temporarily swap icon to a checkmark\n const icon = element.querySelector('i');\n const originalClass = icon && icon.className;\n if (icon) {\n icon.className = 'bi bi-check';\n setTimeout(() => { icon.className = originalClass; }, 1000);\n }\n return true;\n } catch (err) {\n console.warn('Copy to clipboard failed:', err);\n return true;\n }\n }\n\n static _genId() { return `view_${Math.random().toString(36).substr(2, 9)}`; }\n\n static _warn(msg, err) {\n try {\n if (err) console.warn(`[View] ${msg}:`, err);\n else console.warn(`[View] ${msg}`);\n } catch { /* never throw on logging */ }\n }\n}\n\nimport EventEmitter from '@core/mixins/EventEmitter.js';\nObject.assign(View.prototype, EventEmitter);\n\nexport default View;\n"],"names":["objectToString","Object","prototype","toString","isArray","Array","obj","call","isFunction","isObject","escapeHtml","string","entityMap","String","replace","s","Scanner","constructor","this","tail","pos","eos","scan","re","match","index","substring","length","scanUntil","search","Context","view","parentContext","cache","parent","_cacheId","Math","random","push","lookup","name","renderCache","cacheKey","has","get","startsWith","actualName","shouldIterate","pipeString","pipeIndex","indexOf","trim","endsWith","value","getContextValue","e","formatter","window","MOJO","dataFormatter","pipe","entries","map","key","val","keys","hasOwnProperty","intermediateValue","names","context","lookupHit","split","remainingPath","slice","join","hasProperty","primitiveHasOwnProperty","set","propName","primitive","Writer","templateCache","Map","clearCache","clear","parse","template","tags","tokens","parseTemplate","openingTag","closingTag","scanner","start","type","chr","token","openingTagRe","RegExp","escapeRegExp","closingTagRe","closingCurlyRe","i","charAt","openSection","nestSections","squashTokens","squashedTokens","lastToken","nestedTokens","collector","sections","sectionToken","section","pop","render","partials","config","getConfigTags","renderTokens","originalTemplate","buffer","childTokens","console","warn","j","itemContext","pushedContext","text","defaultWriter","Mustache","version","escape","TypeError","toJSON","MOJOUtils","wrapData","EventDelegate","domListeners","debounceTimers","bind","rootEl","unbind","onClick","async","event","actionEl","target","closest","shouldHandle","action","getAttribute","tagName","preventDefault","hideTooltip","dispatch","stopPropagation","handledByChild","navEl","hasAttribute","ctrlKey","metaKey","shiftKey","button","href","isExternalLink","handlePageNavigation","handleHrefNavigation","onChange","changeEl","dispatchChange","then","handled","isFormControl","onInput","matches","debounceMs","parseInt","timerId","clearTimeout","timer","setTimeout","delete","debounceAttr","onKeyDown","el","changeKeys","includes","onSubmit","form","addEventListener","fn","removeEventListener","values","hideDropdown","element","dropdown","dropdownBtn","querySelector","bootstrap","Dropdown","dropdownInstance","getInstance","hide","Tooltip","tooltip","dispose","hideAllTooltips","document","querySelectorAll","forEach","v","cap","w","toUpperCase","specific","error","handleActionError","generic","passThru","onActionDefault","emit","changeHandler","tag","owns","contains","root","child","children","View","opts","className","style","id","_genId","containerId","container","templateUrl","data","isRendering","lastRenderTime","mounted","debug","app","cacheTemplate","enableTooltips","options","_ensureElement","events","model","setModel","onInit","onInitView","initialized","onBeforeRender","onAfterRender","onBeforeMount","onAfterMount","onBeforeUnmount","onAfterUnmount","onBeforeDestroy","onAfterDestroy","isDiff","off","_onModelChange","on","isMounted","setTemplate","tpl","addChild","childView","lazyMount","_lazyMount","getApp","_warn","removeChild","idOrView","Promise","resolve","destroy","catch","err","getChild","updateData","newData","rerender","assign","toggleClass","force","classList","toggle","addClass","add","setClass","removeClass","remove","canRender","now","Date","renderCooldown","noAppend","getElementById","allowMount","unbindEvents","getViewData","html","renderTemplate","innerHTML","mount","_renderChildren","bindEvents","lazyPending","_lazyTriggered","_setupLazyMountObserver","pendingChildren","IntersectionObserver","_lazyObserver","observer","entry","isIntersecting","__mojoLazyChild","unobserve","rootMargin","threshold","getChildElement","minHeight","observe","requestAnimationFrame","rect","getBoundingClientRect","vh","innerHeight","vw","innerWidth","top","bottom","left","right","c","_unmountChildren","isConnected","getChildElementById","cleanId","getContainer","replaceById","body","replaceWith","replaceChildren","appendChild","allowAppendToBody","unmount","parentNode","disconnect","ch","toLowerCase","_syncAttrs","createElement","removeAttribute","cssText","initializeTooltips","disposeTooltips","templateContent","getTemplate","getPartials","renderTemplateString","_templateCache","Error","templatePath","basePath","response","fetch","ok","status","statusText","showError","message","state","path","getContextData","pageName","paramsAttr","params","JSON","showPage","router","findRouter","navigateToPage","mode","fullPath","navigate","routePath","hrefToRoutePath","location","base","apps","__app__","APP","WebApp","matchUUID","find","evt","str","div","textContent","tooltipTriggerEl","theme","size","customClass","trimmedClass","alert","showSuccess","showInfo","showWarning","onActionCopyToClipboard","carrier","navigator","clipboard","isSecureContext","writeText","textarea","select","execCommand","icon","originalClass","substr","msg","EventEmitter"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"View-CLWMWXbO.js","sources":["../../src/core/utils/mustache.js","../../src/core/mixins/EventDelegate.js","../../src/core/View.js"],"sourcesContent":["/**\n * MOJO Mustache - Clean ES6 Template Engine\n * Simplified mustache implementation for MOJO Framework\n * Based on mustache.js logic-less templates\n */\n\nimport MOJOUtils from './MOJOUtils.js';\n\n// Utility functions\nconst objectToString = Object.prototype.toString;\nconst isArray = Array.isArray || function(obj) {\n return objectToString.call(obj) === '[object Array]';\n};\n\nconst isFunction = function(obj) {\n return typeof obj === 'function';\n};\n\nconst isObject = function(obj) {\n return obj !== null && typeof obj === 'object';\n};\n\n// Access DataFormatter without async imports so Mustache remains synchronous.\nfunction getDataFormatter() {\n if (typeof window === 'undefined') return null;\n if (window.MOJO?.dataFormatter) return window.MOJO.dataFormatter;\n if (window.dataFormatter) return window.dataFormatter;\n return null;\n}\n\nconst escapeHtml = function(string) {\n const entityMap = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n '/': '/',\n '`': '`',\n '=': '='\n };\n\n return String(string).replace(/[&<>\"'`=\\/]/g, function(s) {\n return entityMap[s];\n });\n};\n\n// Scanner class for parsing templates\nclass Scanner {\n constructor(string) {\n this.string = string;\n this.tail = string;\n this.pos = 0;\n }\n\n eos() {\n return this.tail === '';\n }\n\n scan(re) {\n const match = this.tail.match(re);\n if (!match || match.index !== 0) {\n return '';\n }\n\n const string = match[0];\n this.tail = this.tail.substring(string.length);\n this.pos += string.length;\n return string;\n }\n\n scanUntil(re) {\n const index = this.tail.search(re);\n let match;\n\n switch (index) {\n case -1:\n match = this.tail;\n this.tail = '';\n break;\n case 0:\n match = '';\n break;\n default:\n match = this.tail.substring(0, index);\n this.tail = this.tail.substring(index);\n }\n\n this.pos += match.length;\n return match;\n }\n}\n\n// Context class for variable resolution\nclass Context {\n constructor(view, parentContext) {\n this.view = view;\n this.cache = { '.': this.view };\n this.parent = parentContext;\n\n // Generate unique context ID for render caching\n if (!this.view?._cacheId) {\n if (this.view && typeof this.view === 'object') {\n this.view._cacheId = Math.random().toString(36).substring(2);\n }\n }\n }\n\n push(view) {\n return new Context(view, this);\n }\n\n lookup(name) {\n // Check render-level cache first\n if (this.renderCache && this.view?._cacheId) {\n const cacheKey = `${this.view._cacheId}:${name}`;\n if (this.renderCache.has(cacheKey)) {\n return this.renderCache.get(cacheKey);\n }\n }\n\n // Special case: '.' refers to the current context value itself\n if (name === '.') {\n return this.view;\n }\n\n // Handle dot-prefix to prevent context chain walking\n // If name starts with '.', only look in current context\n if (name && name.startsWith('.')) {\n let actualName = name.substring(1);\n let shouldIterate = false;\n\n // Support pipe formatting on dot-prefixed lookups, e.g. \".title|upper\"\n // We split pipes here so the lookup remains \"current context only\" while still\n // allowing DataFormatter-style pipe transforms in templates.\n let pipeString = null;\n const pipeIndex = actualName.indexOf('|');\n if (pipeIndex !== -1) {\n pipeString = actualName.substring(pipeIndex + 1).trim();\n actualName = actualName.substring(0, pipeIndex).trim();\n }\n\n // Check for |iter suffix for array iteration (only applies to the base name)\n if (actualName.endsWith('|iter')) {\n actualName = actualName.substring(0, actualName.length - 5); // Remove '|iter'\n shouldIterate = true;\n }\n\n // Only check current view, not parents\n if (this.view && typeof this.view === 'object') {\n let value;\n\n // Check if view has a get method for unified access\n if (typeof this.view.getContextValue === 'function') {\n try {\n value = this.view.getContextValue(actualName);\n if (value !== undefined) {\n if (isFunction(value)) {\n value = value.call(this.view);\n }\n }\n } catch (e) {\n // Fall back to direct property access\n value = undefined;\n }\n }\n\n // Direct property access if get didn't work\n if (value === undefined && actualName in this.view) {\n value = this.view[actualName];\n if (isFunction(value)) {\n value = value.call(this.view);\n }\n }\n\n // If pipes were provided, apply them before any boolean \"existence check\"\n // conversions for arrays/objects. This keeps \".items|iter\" behavior intact\n // while allowing \".title|upper\" style formatting.\n if (pipeString && value !== undefined) {\n try {\n const formatter = getDataFormatter();\n if (formatter && typeof formatter.pipe === 'function') {\n value = formatter.pipe(value, pipeString, this);\n }\n } catch (e) {\n // If formatting fails, fall back to the raw value\n }\n }\n\n // Handle array values based on shouldIterate flag\n if (isArray(value)) {\n if (shouldIterate) {\n // Return array for iteration\n return value;\n } else {\n // Return boolean for existence check\n return value.length > 0;\n }\n }\n\n if (isObject(value)) {\n if (shouldIterate) {\n // Return array of key-value pairs for iteration\n return Object.entries(value).map(([key, val]) => ({\n key: key,\n value: val\n }));\n } else {\n // Return boolean for existence check\n return Object.keys(value).length > 0;\n }\n }\n\n return value;\n }\n\n return undefined; // Don't walk up the chain\n }\n\n // Original lookup logic for non-dot-prefixed names\n const cache = this.cache;\n\n let value;\n if (cache.hasOwnProperty(name)) {\n value = cache[name];\n } else {\n let context = this;\n let intermediateValue;\n let names;\n let index;\n let lookupHit = false;\n\n while (context) {\n // Check if view has a get method for unified access\n if (context.view && typeof context.view.getContextValue === 'function') {\n try {\n intermediateValue = context.view.getContextValue(name);\n if (intermediateValue !== undefined) {\n lookupHit = true;\n }\n } catch (e) {\n // If get throws, fall back to standard lookup\n lookupHit = false;\n }\n }\n\n // Fall back to standard property lookup if get method didn't work\n if (!lookupHit) {\n if (name.indexOf('.') > 0) {\n intermediateValue = context.view;\n names = name.split('.');\n index = 0;\n\n while (intermediateValue != null && index < names.length) {\n // Check if intermediate value has a get method\n if (intermediateValue && typeof intermediateValue.getContextValue === 'function' && index < names.length) {\n try {\n const remainingPath = names.slice(index).join('.');\n intermediateValue = intermediateValue.getContextValue(remainingPath);\n index = names.length; // Skip to end\n if (intermediateValue !== undefined) {\n lookupHit = true;\n }\n } catch (e) {\n // Fall back to property access\n if (index === names.length - 1) {\n lookupHit = (\n hasProperty(intermediateValue, names[index]) ||\n primitiveHasOwnProperty(intermediateValue, names[index])\n );\n }\n intermediateValue = intermediateValue[names[index++]];\n }\n } else {\n if (index === names.length - 1) {\n lookupHit = (\n hasProperty(intermediateValue, names[index]) ||\n primitiveHasOwnProperty(intermediateValue, names[index])\n );\n }\n intermediateValue = intermediateValue[names[index++]];\n }\n }\n } else {\n intermediateValue = context.view[name];\n lookupHit = hasProperty(context.view, name);\n }\n }\n\n if (lookupHit) {\n value = intermediateValue;\n break;\n }\n\n context = context.parent;\n }\n\n cache[name] = value;\n }\n\n if (isFunction(value)) value = value.call(this.view);\n\n // Store in render-level cache after function evaluation\n if (this.renderCache && this.view?._cacheId) {\n const cacheKey = `${this.view._cacheId}:${name}`;\n this.renderCache.set(cacheKey, value);\n }\n\n return value;\n }\n}\n\n// Helper functions\nfunction hasProperty(obj, propName) {\n return obj != null && typeof obj === 'object' && (propName in obj);\n}\n\nfunction primitiveHasOwnProperty(primitive, propName) {\n return (\n primitive != null &&\n typeof primitive !== 'object' &&\n primitive.hasOwnProperty &&\n primitive.hasOwnProperty(propName)\n );\n}\n\n// Writer class for rendering\nclass Writer {\n constructor() {\n this.templateCache = new Map();\n }\n\n clearCache() {\n this.templateCache.clear();\n }\n\n parse(template, tags) {\n tags = tags || ['{{', '}}'];\n\n const cacheKey = template + ':' + tags.join(':');\n let tokens = this.templateCache.get(cacheKey);\n\n if (tokens == null) {\n tokens = this.parseTemplate(template, tags);\n this.templateCache.set(cacheKey, tokens);\n }\n\n return tokens;\n }\n\n parseTemplate(template, tags) {\n if (!template) return [];\n\n const openingTag = tags[0];\n const closingTag = tags[1];\n const scanner = new Scanner(template);\n const tokens = [];\n let start, type, value, chr, token;\n\n const openingTagRe = new RegExp(escapeRegExp(openingTag) + '\\\\s*');\n const closingTagRe = new RegExp('\\\\s*' + escapeRegExp(closingTag));\n const closingCurlyRe = new RegExp('\\\\s*' + escapeRegExp('}' + closingTag));\n\n while (!scanner.eos()) {\n start = scanner.pos;\n\n // Match text before tags\n value = scanner.scanUntil(openingTagRe);\n\n if (value) {\n for (let i = 0; i < value.length; ++i) {\n chr = value.charAt(i);\n\n if (chr === '\\n') {\n tokens.push(['text', chr]);\n } else {\n tokens.push(['text', chr]);\n }\n }\n }\n\n if (!scanner.scan(openingTagRe)) break;\n\n type = scanner.scan(/[#^\\/>{&=!]/);\n if (!type) type = 'name';\n\n scanner.scan(/\\s*/);\n\n if (type === '=') {\n value = scanner.scanUntil(/\\s*=/);\n scanner.scan(/\\s*=/);\n scanner.scanUntil(closingTagRe);\n } else if (type === '{') {\n value = scanner.scanUntil(closingCurlyRe);\n scanner.scan(closingCurlyRe);\n type = '&';\n } else {\n value = scanner.scanUntil(closingTagRe);\n }\n\n scanner.scan(closingTagRe);\n\n if (type === '#' || type === '^') {\n token = [type, value, start, scanner.pos];\n tokens.push(token);\n } else if (type === '/') {\n // Find matching opening section\n let openSection;\n for (let i = tokens.length - 1; i >= 0; --i) {\n if (tokens[i][0] === '#' || tokens[i][0] === '^') {\n if (tokens[i][1] === value) {\n openSection = tokens[i];\n break;\n }\n }\n }\n\n if (openSection) {\n // Add closing position if token doesn't have it yet\n if (openSection.length === 4) {\n openSection.push(scanner.pos);\n }\n }\n // Add closing token for nestSections processing\n tokens.push([type, value, start, scanner.pos]);\n } else {\n tokens.push([type, value, start, scanner.pos]);\n }\n }\n\n return this.nestSections(this.squashTokens(tokens));\n }\n\n squashTokens(tokens) {\n const squashedTokens = [];\n let token, lastToken;\n\n for (let i = 0; i < tokens.length; ++i) {\n token = tokens[i];\n\n if (token) {\n if (token[0] === 'text' && lastToken && lastToken[0] === 'text') {\n lastToken[1] += token[1];\n lastToken[3] = token[3];\n } else {\n squashedTokens.push(token);\n lastToken = token;\n }\n }\n }\n\n return squashedTokens;\n }\n\n nestSections(tokens) {\n const nestedTokens = [];\n let collector = nestedTokens;\n const sections = [];\n\n for (let i = 0; i < tokens.length; ++i) {\n const token = tokens[i];\n\n switch (token[0]) {\n case '#':\n case '^':\n // Create section token with proper structure: [type, name, start, end, children, closing]\n const sectionToken = [\n token[0], // type ('#' or '^')\n token[1], // section name\n token[2], // start position\n token[3], // end position after opening tag\n [], // children array\n token[4] || null // closing position (if set during parsing)\n ];\n\n collector.push(sectionToken);\n sections.push(sectionToken);\n collector = sectionToken[4]; // children array\n break;\n case '/':\n const section = sections.pop();\n if (section) {\n // Set closing position\n section[5] = token[2];\n // Return to parent collector\n collector = sections.length > 0 ? sections[sections.length - 1][4] : nestedTokens;\n }\n break;\n default:\n collector.push(token);\n }\n }\n\n return nestedTokens;\n }\n\n render(template, view, partials, config) {\n const tags = this.getConfigTags(config) || ['{{', '}}'];\n const tokens = this.parse(template, tags);\n\n // Create render-level cache for this render operation\n const renderCache = new Map();\n\n return this.renderTokens(tokens, new Context(view), partials, template, config, renderCache);\n }\n\n renderTokens(tokens, context, partials, originalTemplate, config, renderCache) {\n // Attach render cache to context if provided\n if (renderCache && !context.renderCache) {\n context.renderCache = renderCache;\n }\n let buffer = '';\n\n for (let i = 0; i < tokens.length; ++i) {\n const token = tokens[i];\n let value;\n\n switch (token[0]) {\n case '#':\n value = context.lookup(token[1]);\n if (!value) continue;\n\n // Ensure we have child tokens\n const childTokens = token[4];\n if (!childTokens || !isArray(childTokens)) {\n console.warn(`MUSTACHE WARNING - Section ${token[1]} has no child tokens:`, token);\n continue;\n }\n\n if (isArray(value)) {\n // Process each array item\n for (let j = 0; j < value.length; ++j) {\n const itemContext = context.push(value[j]);\n // Pass render cache to child context\n if (context.renderCache) {\n itemContext.renderCache = context.renderCache;\n }\n const itemResult = this.renderTokens(childTokens, itemContext, partials, originalTemplate, config, renderCache);\n buffer += itemResult;\n }\n } else if (typeof value === 'object' || typeof value === 'string' || typeof value === 'number') {\n const pushedContext = context.push(value);\n // Pass render cache to child context\n if (context.renderCache) {\n pushedContext.renderCache = context.renderCache;\n }\n buffer += this.renderTokens(childTokens, pushedContext, partials, originalTemplate, config, renderCache);\n } else if (isFunction(value)) {\n const text = originalTemplate == null ? null : originalTemplate.slice(token[3], token[5]);\n value = value.call(context.view, text, (template) => this.render(template, context.view, partials, config));\n if (value != null) buffer += value;\n } else if (value) {\n // Handle boolean true and other truthy values\n buffer += this.renderTokens(childTokens, context, partials, originalTemplate, config, renderCache);\n }\n break;\n\n case '^':\n value = context.lookup(token[1]);\n if (!value || (isArray(value) && value.length === 0)) {\n // Ensure we have child tokens for inverted sections too\n const childTokens = token[4];\n if (childTokens && isArray(childTokens)) {\n buffer += this.renderTokens(childTokens, context, partials, originalTemplate, config, renderCache);\n }\n }\n break;\n\n case '>':\n if (!partials) continue;\n value = isFunction(partials) ? partials(token[1]) : partials[token[1]];\n if (value != null) {\n buffer += this.render(value, context.view, partials, config);\n }\n break;\n\n case '&':\n value = context.lookup(token[1]);\n if (value != null) buffer += value;\n break;\n\n case 'name':\n value = context.lookup(token[1]);\n if (value != null) buffer += escapeHtml(value);\n break;\n\n case 'text':\n buffer += token[1];\n break;\n }\n }\n\n return buffer;\n }\n\n getConfigTags(config) {\n if (isObject(config) && isArray(config.tags)) {\n return config.tags;\n }\n return null;\n }\n}\n\nfunction escapeRegExp(string) {\n return string.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g, '\\\\$&');\n}\n\n// Default writer instance\nconst defaultWriter = new Writer();\n\n// Main Mustache object\nconst Mustache = {\n name: 'MOJO Mustache',\n version: '1.0.0',\n tags: ['{{', '}}'],\n\n Scanner,\n Context,\n Writer,\n\n escape: escapeHtml,\n\n clearCache() {\n return defaultWriter.clearCache();\n },\n\n parse(template, tags) {\n return defaultWriter.parse(template, tags);\n },\n\n render(template, view, partials, config) {\n if (typeof template !== 'string') {\n throw new TypeError('Invalid template! Template should be a \"string\"');\n }\n\n // Auto-wrap context to enable pipe formatters if not already wrapped\n // This ensures pipes work everywhere without requiring manual wrapping\n if (view && typeof view === 'object' && !view.getContextValue && typeof view.toJSON !== 'function') {\n view = MOJOUtils.wrapData(view);\n }\n\n return defaultWriter.render(template, view, partials, config);\n }\n};\n\n// ES6 Module Export\nexport default Mustache;\n","// EventDelegate.js\nexport class EventDelegate {\n constructor(view) {\n this.view = view;\n this.domListeners = [];\n this.debounceTimers = new Map();\n }\n\n bind(rootEl) {\n this.unbind();\n if (!rootEl) return;\n\n const onClick = async (event) => {\n const actionEl = event.target.closest('[data-action]');\n if (actionEl && this.shouldHandle(actionEl, event)) {\n const action = actionEl.getAttribute('data-action');\n\n // Prevent default immediately for anchor tags to avoid navigation\n // before async dispatch completes (e.g. <a href=\"#\" data-action=\"...\">)\n if (actionEl.tagName === 'A') {\n event.preventDefault();\n }\n\n // Hide any tooltips on the clicked element\n this.hideTooltip(actionEl);\n\n const handled = await this.dispatch(action, event, actionEl);\n if (handled) {\n event.preventDefault();\n event.stopPropagation();\n event.handledByChild = true;\n return;\n }\n }\n const navEl = event.target.closest('a[href], [data-page]');\n if (navEl && !navEl.hasAttribute('data-action') && this.shouldHandle(navEl, event)) {\n if (event.ctrlKey || event.metaKey || event.shiftKey || event.button === 1) return;\n if (navEl.tagName === 'A') {\n const href = navEl.getAttribute('href');\n if (href && href !== '#' && !href.startsWith('#') &&\n (this.view.isExternalLink(href) || navEl.hasAttribute('data-external'))) return;\n }\n\n // Hide any tooltips on the clicked element before navigation\n this.hideTooltip(navEl);\n\n event.preventDefault();\n event.stopPropagation();\n event.handledByChild = true;\n if (navEl.hasAttribute('data-page')) await this.view.handlePageNavigation(navEl);\n else await this.view.handleHrefNavigation(navEl);\n }\n };\n\n const onChange = (event) => {\n // `data-change-action` always wins for change events (existing behavior).\n const changeEl = event.target.closest('[data-change-action]');\n if (changeEl && this.shouldHandle(changeEl, event)) {\n const action = changeEl.getAttribute('data-change-action');\n this.dispatchChange(action, event, changeEl).then((handled) => {\n if (handled) {\n event.stopPropagation();\n event.handledByChild = true;\n }\n });\n return;\n }\n\n // Fallback: `data-action` on a form control fires onAction* on change.\n const actionEl = event.target.closest('[data-action]');\n if (actionEl && this.isFormControl(actionEl) && this.shouldHandle(actionEl, event)) {\n const action = actionEl.getAttribute('data-action');\n this.dispatch(action, event, actionEl).then((handled) => {\n if (handled) {\n event.stopPropagation();\n event.handledByChild = true;\n }\n });\n }\n };\n\n const onInput = (event) => {\n // Existing `data-change-action` + `data-filter=\"live-search\"` path.\n const changeEl = event.target.closest('[data-change-action]');\n if (changeEl && this.shouldHandle(changeEl, event) &&\n event.target.matches('[data-filter=\"live-search\"]')) {\n const action = changeEl.getAttribute('data-change-action');\n const debounceMs = parseInt(changeEl.getAttribute('data-filter-debounce')) || 300;\n const timerId = `change-${action}-${changeEl.getAttribute('data-container') || 'default'}`;\n\n if (this.debounceTimers.has(timerId)) {\n clearTimeout(this.debounceTimers.get(timerId));\n }\n\n const timer = setTimeout(() => {\n this.debounceTimers.delete(timerId);\n this.dispatchChange(action, event, changeEl).then((handled) => {\n if (handled) {\n event.stopPropagation();\n event.handledByChild = true;\n }\n });\n }, debounceMs);\n\n this.debounceTimers.set(timerId, timer);\n return;\n }\n\n // New: `data-action` on a form control fires onAction* on input\n // (keystrokes for text-like inputs/textarea, value updates for select).\n // `data-change-action` takes precedence above, so this only runs when\n // the element doesn't carry a change-action.\n const actionEl = event.target.closest('[data-action]');\n if (!actionEl || !this.isFormControl(actionEl)) return;\n if (actionEl.hasAttribute('data-change-action')) return;\n if (!this.shouldHandle(actionEl, event)) return;\n\n const action = actionEl.getAttribute('data-action');\n const debounceAttr = actionEl.getAttribute('data-action-debounce');\n const debounceMs = debounceAttr != null ? parseInt(debounceAttr) || 0 : 0;\n\n if (debounceMs > 0) {\n const timerId = `action-${action}-${actionEl.getAttribute('data-container') || 'default'}`;\n if (this.debounceTimers.has(timerId)) {\n clearTimeout(this.debounceTimers.get(timerId));\n }\n const timer = setTimeout(() => {\n this.debounceTimers.delete(timerId);\n this.dispatch(action, event, actionEl).then((handled) => {\n if (handled) {\n event.stopPropagation();\n event.handledByChild = true;\n }\n });\n }, debounceMs);\n this.debounceTimers.set(timerId, timer);\n return;\n }\n\n this.dispatch(action, event, actionEl).then((handled) => {\n if (handled) {\n event.stopPropagation();\n event.handledByChild = true;\n }\n });\n };\n\n const onKeyDown = (event) => {\n if (event.target.matches('[data-filter=\"search\"]')) return;\n const el = event.target.closest('[data-keydown-action]') || event.target.closest('[data-change-action]');\n if (!el || !this.shouldHandle(el, event)) return;\n let changeKeys = [\"Enter\"];\n if (el.getAttribute('data-change-keys')) {\n changeKeys = el.getAttribute('data-change-keys').split(',').map(key => key.trim());\n }\n if (changeKeys.includes('*') || changeKeys.includes(event.key)) {\n const action = el.getAttribute('data-keydown-action') || el.getAttribute('data-change-action');\n this.dispatch(action, event, el).then((handled) => {\n if (handled) {\n event.preventDefault();\n event.stopPropagation();\n event.handledByChild = true;\n }\n });\n }\n };\n\n const onSubmit = (event) => {\n const form = event.target.closest('form[data-action]');\n if (!form || !this.shouldHandle(form, event)) return;\n event.preventDefault();\n const action = form.getAttribute('data-action');\n this.dispatch(action, event, form);\n };\n\n rootEl.addEventListener('click', onClick);\n rootEl.addEventListener('change', onChange);\n rootEl.addEventListener('input', onInput);\n rootEl.addEventListener('keydown', onKeyDown);\n rootEl.addEventListener('submit', onSubmit);\n\n this.domListeners.push(\n { el: rootEl, type: 'click', fn: onClick },\n { el: rootEl, type: 'change', fn: onChange },\n { el: rootEl, type: 'input', fn: onInput },\n { el: rootEl, type: 'keydown', fn: onKeyDown },\n { el: rootEl, type: 'submit', fn: onSubmit },\n );\n }\n\n unbind() {\n for (const { el, type, fn } of this.domListeners) el.removeEventListener(type, fn);\n this.domListeners = [];\n\n // Clear any pending debounce timers\n for (const timer of this.debounceTimers.values()) {\n clearTimeout(timer);\n }\n this.debounceTimers.clear();\n }\n\n hideDropdown(element) {\n const dropdownMenu = element.closest('.dropdown-menu');\n const dropdown = dropdownMenu.closest('.dropdown');\n if (!dropdown) {\n return;\n }\n\n const dropdownBtn = dropdown.querySelector('[data-bs-toggle=\"dropdown\"]');\n if (dropdownBtn && window.bootstrap?.Dropdown) {\n const dropdownInstance = window.bootstrap.Dropdown.getInstance(dropdownBtn);\n dropdownInstance?.hide();\n }\n }\n\n hideTooltip(element) {\n // Hide tooltip on the clicked element\n if (element && window.bootstrap?.Tooltip) {\n const tooltip = window.bootstrap.Tooltip.getInstance(element);\n if (tooltip) {\n tooltip.dispose();\n // tooltip.hide();\n }\n }\n }\n\n hideAllTooltips() {\n // Hide all visible tooltips in the document\n if (window.bootstrap?.Tooltip) {\n const tooltips = document.querySelectorAll('[data-bs-toggle=\"tooltip\"]');\n tooltips.forEach(el => {\n const tooltip = window.bootstrap.Tooltip.getInstance(el);\n if (tooltip) {\n tooltip.hide();\n }\n });\n }\n }\n\n async dispatch(action, event, el) {\n const v = this.view;\n const cap = (s) => (s.includes('-') ? s.split('-').map(w => w[0].toUpperCase()+w.slice(1)).join('') : s[0].toUpperCase()+s.slice(1));\n\n const specific = `handleAction${cap(action)}`;\n if (typeof v[specific] === 'function') {\n try { event.preventDefault(); await v[specific](event, el); return true; }\n catch (e) { console.error(`Error in action ${action}:`, e); v.handleActionError(action, e, event, el); return true; }\n }\n\n const generic = `onAction${cap(action)}`;\n if (typeof v[generic] === 'function') {\n try {\n if (await v[generic](event, el)) {\n const isInDropdown = !!el.closest('.dropdown-menu');\n if (isInDropdown) this.hideDropdown(el);\n event.preventDefault();\n event.stopPropagation();\n return true;\n }\n return false;\n }\n catch (e) { console.error(`Error in action ${action}:`, e); v.handleActionError(action, e, event, el); return true; }\n }\n\n const passThru = `onPassThruAction${cap(action)}`;\n if (typeof v[passThru] === 'function') {\n try { await v[passThru](event, el); return false; }\n catch (e) { console.error(`Error in action ${action}:`, e); v.handleActionError(action, e, event, el); return true; }\n }\n\n if (typeof v.onActionDefault === 'function') {\n try { return await v.onActionDefault(action, event, el); }\n catch (e) { console.error(`Error in default action handler for ${action}:`, e); v.handleActionError(action, e, event, el); return true; }\n }\n\n v.emit?.(`action:${action}`, { action, event, element: el });\n return false;\n }\n\n async dispatchChange(action, event, el) {\n const v = this.view;\n const cap = (s) => (s.includes('-') ? s.split('-').map(w => w[0].toUpperCase()+w.slice(1)).join('') : s[0].toUpperCase()+s.slice(1));\n\n const changeHandler = `onChange${cap(action)}`;\n if (typeof v[changeHandler] === 'function') {\n try {\n await v[changeHandler](event, el);\n return true;\n }\n catch (e) {\n console.error(`Error in onChange ${action}:`, e);\n v.handleActionError?.(action, e, event, el);\n return true;\n }\n }\n\n // Fall back to regular dispatch if no onChange handler exists\n return await this.dispatch(action, event, el);\n }\n\n isFormControl(el) {\n if (!el || !el.tagName) return false;\n const tag = el.tagName;\n return tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT';\n }\n\n shouldHandle(el, event) {\n if (this.owns(el)) return true;\n if (this.contains(el) && !event.handledByChild) return true;\n return false;\n }\n\n owns(el) {\n const root = this.view.element;\n if (!root || !root.contains(el)) return false;\n for (const child of Object.values(this.view.children)) {\n if (child.element && child.element.contains(el)) return false;\n }\n return true;\n }\n\n contains(el) { return !!this.view.element && this.view.element.contains(el); }\n}\n\nexport default EventDelegate;\n","// -----------------------------------------------\n// Imports\n// -----------------------------------------------\nimport Mustache from '@core/utils/mustache.js';\nif (typeof window !== 'undefined') {\n window.Mustache = Mustache;\n}\nimport MOJOUtils from '@core/utils/MOJOUtils.js';\nimport EventDelegate from '@core/mixins/EventDelegate.js';\n\n// -----------------------------------------------\n// View\n// -----------------------------------------------\nexport class View {\n // ---------------------------------------------\n // Construction & defaults\n // ---------------------------------------------\n constructor(opts = {}) {\n this.tagName = opts.tagName ?? \"div\";\n this.className = opts.className ?? \"mojo-view\";\n this.style = opts.style ?? null; // inline css text\n this.id = opts.id ?? View._genId(); // element id\n this.containerId = opts.containerId ?? null; // container to render into\n this.container = opts.container ?? null; // container element\n\n // If container is a string, treat it as containerId and set container to null\n if (typeof this.container === 'string') {\n this.containerId = this.container;\n this.container = null;\n }\n this.parent = opts.parent ?? null; // parent view\n this.children = opts.children ?? {}; // dict of id -> child view\n this.template = opts.template || opts.templateUrl || \"\"; // string or function(model) -> string\n this.data = opts.data ?? {}; // data for Mustache or basic templating\n this.isRendering = false;\n this.lastRenderTime = 0;\n this.mounted = false;\n this.debug = opts.debug ?? false;\n this.app = opts.app ?? null;\n this.cacheTemplate = opts.cacheTemplate ?? true;\n this.enableTooltips = opts.enableTooltips ?? false; // Auto-initialize Bootstrap tooltips after render\n\n // keep original options\n this.options = { ...opts };\n\n // internal DOM element\n this.element = this._ensureElement();\n\n // in constructor\n this.events = new EventDelegate(this);\n\n if (opts.model) this.setModel(opts.model);\n\n }\n\n // ---------------------------------------------\n // Lifecycle hooks (overridable)\n // ---------------------------------------------\n async onInit() {\n\n }\n async onInitView() {\n if (this.initialized) return;\n this.initialized = true;\n await this.onInit();\n }\n async onBeforeRender() {}\n async onAfterRender() {}\n async onBeforeMount() {}\n async onAfterMount() {}\n async onBeforeUnmount() {}\n async onAfterUnmount() {}\n async onBeforeDestroy() {}\n async onAfterDestroy() {}\n\n // ---------------------------------------------\n // Public API\n // ---------------------------------------------\n setModel(model = {}) {\n let isDiff = model !== this.model;\n if (!isDiff) return this;\n if (this.model && this.model.off) {\n this.model.off(\"change\", this._onModelChange, this);\n }\n this.model = model;\n if (this.model && this.model.on) {\n this.model.on(\"change\", this._onModelChange, this);\n }\n\n // Set model on all children\n for (const id in this.children) {\n const child = this.children[id];\n if (child && typeof child.setModel === 'function') {\n child.setModel(model);\n }\n }\n\n if (isDiff ) {\n this._onModelChange();\n }\n return this;\n }\n\n _onModelChange() {\n if (this.isMounted()) {\n this.render();\n }\n }\n\n setTemplate(tpl) { this.template = tpl ?? \"\"; return this; }\n\n addChild(childView, options) {\n try {\n if (!childView || typeof childView !== \"object\") return this;\n\n // Allow overriding containerId and id via options\n if (options) {\n if (options.containerId || options.container) {\n childView.containerId = options.containerId || options.container;\n }\n if (options.id) {\n childView.id = options.id;\n }\n // lazyMount: defer the child's render until its container scrolls\n // into view. Useful for long dashboards where below-the-fold\n // panels would otherwise fetch on first paint.\n if (options.lazyMount === true) {\n childView._lazyMount = true;\n }\n }\n\n childView.parent = this;\n if (this.getApp()) childView.app = this.app;\n this.children[childView.id] = childView;\n } catch (e) { View._warn(\"addChild error\", e); }\n return childView;\n }\n\n removeChild(idOrView) {\n try {\n const id = typeof idOrView === \"string\" ? idOrView : (idOrView && idOrView.id);\n if (!id) return this;\n const child = this.children[id];\n if (child) {\n // allow for async or sync destroy\n Promise.resolve(child.destroy()).catch(err => View._warn(\"removeChild destroy error\", err));\n delete this.children[id];\n }\n } catch (e) { View._warn(\"removeChild error\", e); }\n return this;\n }\n\n getChild(id) {\n return this.children[id];\n }\n\n async updateData(newData, rerender = false) {\n Object.assign(this.data, newData);\n\n if (rerender && this.isMounted()) {\n await this.render();\n }\n\n return this;\n }\n\n toggleClass(className, force) {\n if (force === undefined) {\n force = !this.element.classList.contains(className);\n }\n this.element.classList.toggle(className, force);\n return this;\n }\n\n addClass(className) {\n this.element.classList.add(className);\n return this;\n }\n\n setClass(className) {\n this.element.className = className;\n return this;\n }\n\n removeClass(className) {\n this.element.classList.remove(className);\n return this;\n }\n\n canRender() {\n if (this.isRendering) return false;\n // Optional render throttling\n const now = Date.now();\n if (this.options.renderCooldown > 0 && now - this.lastRenderTime < this.options.renderCooldown) {\n View._warn(`View ${this.id}: Render called too quickly, cooldown active`);\n return false;\n }\n if (this.options.noAppend) {\n if (this.parent) {\n if (!this.parent.contains(this.containerId || this.container)) {\n return false;\n } else if (this.containerId && !document.getElementById(this.containerId)) {\n return false;\n } else if (this.container && !document.contains(this.container)) {\n return false;\n }\n }\n }\n return true;\n }\n\n // ---------------------------------------------\n // Render flow\n // ---------------------------------------------\n async render(allowMount = true, container = null) {\n const now = Date.now();\n\n if (!this.canRender()) {\n return this;\n }\n\n this.isRendering = true;\n this.lastRenderTime = now;\n\n try {\n if (!this.initialized) await this.onInitView();\n this.unbindEvents();\n\n await this.onBeforeRender();\n if (this.getViewData) {\n this.data = await this.getViewData();\n }\n // 1) render own HTML (FIX #5: await the async template render)\n const html = await this.renderTemplate();\n this.element.innerHTML = html;\n\n if (allowMount && !this.isMounted()) {\n await this.mount(container)\n }\n\n // 3) render children\n await this._renderChildren();\n await this.onAfterRender();\n this.bindEvents();\n\n } catch (e) {\n View._warn(`Render error in ${this.id}`, e);\n } finally {\n // FIX #4: always reset isRendering\n this.isRendering = false;\n }\n\n return this;\n }\n\n async _renderChildren() {\n const lazyPending = [];\n for (const id in this.children) {\n const child = this.children[id];\n if (!child) continue;\n child.parent = this;\n if (child._lazyMount && !child._lazyTriggered) {\n // Skip render — observer will mount it when its container enters\n // the viewport. Track it for observer setup below.\n lazyPending.push(child);\n continue;\n }\n await Promise.resolve(child.render()).catch(err => View._warn(`Child render error (${id})`, err));\n }\n if (lazyPending.length) this._setupLazyMountObserver(lazyPending);\n }\n\n /**\n * Start an IntersectionObserver per pending lazy child. When the\n * container scrolls into view, mark the child as triggered and render.\n * @private\n */\n _setupLazyMountObserver(pendingChildren) {\n if (typeof IntersectionObserver === 'undefined') {\n // SSR / unsupported — fall back to immediate render so behavior\n // degrades gracefully.\n pendingChildren.forEach(c => {\n c._lazyTriggered = true;\n Promise.resolve(c.render()).catch(err => View._warn(`Lazy child render error (${c.id})`, err));\n });\n return;\n }\n\n if (!this._lazyObserver) {\n this._lazyObserver = new IntersectionObserver((entries, observer) => {\n for (const entry of entries) {\n if (!entry.isIntersecting) continue;\n const child = entry.target.__mojoLazyChild;\n observer.unobserve(entry.target);\n if (!child || child._lazyTriggered) continue;\n child._lazyTriggered = true;\n Promise.resolve(child.render()).catch(err => View._warn(`Lazy child render error (${child.id})`, err));\n }\n }, {\n rootMargin: '120px 0px', // start mounting just before scroll-in\n threshold: 0.01\n });\n }\n\n for (const child of pendingChildren) {\n const container = this.getChildElement(child.containerId);\n if (!container) continue;\n container.__mojoLazyChild = child;\n // IntersectionObserver doesn't fire on 0-height elements. Give the\n // placeholder a minimal height so the observer can measure it; this\n // is overridden once the real child mounts and fills the container.\n if (!container.style.minHeight) {\n container.classList.add('mojo-lazy-placeholder');\n container.style.minHeight = '1px';\n }\n this._lazyObserver.observe(container);\n\n // Belt-and-suspenders: IntersectionObserver's initial callback can\n // be flaky inside scrolled sub-containers (the dashboard renders\n // inside a separately-scrolled .portal-content panel). On the next\n // tick, manually check whether the container is in the viewport and\n // trigger if so. The normal observer still handles future scrolls.\n requestAnimationFrame(() => {\n if (child._lazyTriggered) return;\n const rect = container.getBoundingClientRect();\n const vh = (typeof window !== 'undefined') ? window.innerHeight : 0;\n const vw = (typeof window !== 'undefined') ? window.innerWidth : 0;\n const visible = rect.top < (vh + 120) && rect.bottom > -120 && rect.left < vw && rect.right > 0;\n if (visible) {\n child._lazyTriggered = true;\n this._lazyObserver?.unobserve(container);\n Promise.resolve(child.render()).catch(err => View._warn(`Lazy child render error (${child.id})`, err));\n }\n });\n }\n }\n\n async _unmountChildren() {\n for (const id in this.children) {\n const child = this.children[id];\n if (!child) continue;\n child.unbindEvents()\n }\n }\n\n\n isMounted() {\n return this.element?.isConnected;\n }\n\n getChildElementById(id, root = null) {\n const cleanId = id.startsWith('#') ? id.substring(1) : id;\n if (root) {\n return root.querySelector(`#${cleanId}`);\n }\n return this.element.querySelector(`#${cleanId}`);\n }\n\n getChildElement(id) {\n if (id.startsWith(\"#\")) {\n return this.getChildElementById(id);\n }\n let el = this.element?.querySelector(`[data-container=\"${id}\"]`);\n if (!el) {\n return this.getChildElementById(id);\n }\n return el;\n }\n\n getContainer() {\n if (this.replaceById) {\n // this means we want to place the element in the dom that matches our id\n if (this.parent) {\n return this.parent.getChildElementById(this.id);\n }\n // return this.getChildElementById(this.id, document.body);\n return null;\n }\n if (!this.containerId) return null;\n if (this.parent) {\n return this.parent.getChildElement(this.containerId);\n }\n return this.getChildElementById(this.containerId, document.body);\n }\n\n async mount(container = null) {\n await this.onBeforeMount();\n if (!container) {\n container = this.getContainer();\n }\n\n if (this.containerId && !container) {\n // throw new Error(`Container not found for ${this.containerId}`);\n console.error(`Container not found for ${this.containerId}`);\n return;\n }\n\n if (container && this.replaceById) {\n container.replaceWith(this.element);\n } else if (container) {\n // if we have a container just replace its children with our element\n container.replaceChildren(this.element);\n } else if (!this.containerId && this.parent) {\n // append to parent\n this.parent.element.appendChild(this.element);\n } else if (!this.containerId && !this.parent && this.options.allowAppendToBody) {\n // append to body\n console.log(\"APPENDING TO BODY!!!!\");\n document.body.appendChild(this.element);\n } else {\n // there is a containerId but no container\n console.error(`Container not found for ${this.containerId}`);\n }\n\n await this.onAfterMount();\n this.mounted = true;\n }\n\n async unmount() {\n if (!this.element || !this.element.parentNode) return;\n await this.onBeforeUnmount();\n // unbind all children\n await this._unmountChildren();\n if (this.element.parentNode) this.element.parentNode.removeChild(this.element);\n this.events.unbind();\n await this.onAfterUnmount();\n this.mounted = false;\n }\n\n // FIX #1: make destroy async (it already awaited hooks)\n async destroy() {\n try {\n this.events.unbind();\n if (this._lazyObserver) {\n this._lazyObserver.disconnect();\n this._lazyObserver = null;\n }\n // destroy children first (support async or sync destroy)\n for (const id in this.children) {\n const ch = this.children[id];\n if (ch) {\n await Promise.resolve(ch.destroy()).catch(err => View._warn(`Child destroy error (${id})`, err));\n }\n }\n this.mounted = false;\n if (this.element && this.element.parentNode) {\n await this.onBeforeDestroy();\n if (this.element.parentNode) this.element.parentNode.removeChild(this.element);\n await this.onAfterDestroy();\n }\n } catch (e) {\n View._warn(`Destroy error in ${this.id}`, e);\n }\n }\n\n // ---------------------------------------------\n // DOM helpers\n // ---------------------------------------------\n _ensureElement() {\n try {\n if (this.element && this.element.tagName?.toLowerCase() === this.tagName) {\n this._syncAttrs();\n return this.element;\n }\n const el = document.createElement(this.tagName);\n this.element = el;\n this.el = el;\n this._syncAttrs();\n return el;\n } catch (e) {\n View._warn(\"ensureElement error\", e);\n // last resort: create a DIV to avoid throwing\n const el = document.createElement(\"div\");\n // FIX #2: use View._genId() (not SimpleView)\n el.id = this.id || View._genId();\n return el;\n }\n }\n\n _syncAttrs() {\n try {\n if (!this.element) return;\n if (this.id) this.element.id = this.id;\n this.element.className = this.className || \"\";\n if (this.style == null) {\n this.element.removeAttribute(\"style\");\n } else {\n this.element.style.cssText = String(this.style);\n }\n } catch (e) { View._warn(\"_syncAttrs error\", e); }\n }\n\n bindEvents() {\n this.events.bind(this.element);\n\n // Initialize tooltips if enabled\n if (this.enableTooltips) {\n this.initializeTooltips();\n }\n }\n\n unbindEvents() {\n this.events.unbind();\n\n // Cleanup tooltips if enabled\n if (this.enableTooltips) {\n this.disposeTooltips();\n }\n }\n\n // ---------------------------------------------\n // Template helpers\n // ---------------------------------------------\n async renderTemplate() {\n const templateContent = await this.getTemplate();\n if (!templateContent) return '';\n const partials = this.getPartials();\n return Mustache.render(templateContent, this, partials);\n }\n\n renderTemplateString(template, context, partials) {\n // Mustache.render now auto-wraps context to enable pipe formatters\n return Mustache.render(template, context, partials);\n }\n\n getPartials() { return {}; }\n\n async getTemplate() {\n if (this._templateCache && this.cacheTemplate) {\n return this._templateCache;\n }\n const template = this.template || this.templateUrl;\n if (!template) {\n throw new Error('Template not found');\n }\n\n let templateContent = '';\n\n if (typeof template === 'string') {\n if (template.includes('<') || template.includes('{')) {\n templateContent = template;\n } else {\n try {\n let templatePath = template;\n if (!this.app) this.app = this.getApp();\n if (this.app && this.app.basePath) {\n if (!templatePath.startsWith('/') &&\n !templatePath.startsWith('http://') &&\n !templatePath.startsWith('https://')) {\n const base = this.app.basePath.endsWith('/')\n ? this.app.basePath.slice(0, -1)\n : this.app.basePath;\n templatePath = `${base}/${templatePath}`;\n }\n }\n\n const response = await fetch(templatePath);\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n templateContent = await response.text();\n } catch (error) {\n View._warn(`Failed to load template from ${template}: ${error}`);\n // NOTE: showError may be provided by host app\n this.showError?.(`Failed to load template from ${template}: ${error.message}`);\n }\n }\n } else if (typeof template === 'function') {\n templateContent = await this.template(this.data, this.state);\n }\n\n if (this.cacheTemplate && templateContent) {\n this._templateCache = templateContent;\n }\n\n return templateContent;\n }\n\n getContextValue(path) {\n const value = MOJOUtils.getContextData(this, path);\n\n if (path && path.startsWith('data.') && value && typeof value === 'object') {\n return MOJOUtils.wrapData(value, this);\n }\n\n if (path && path.startsWith('model.') &&\n path !== 'model' &&\n value && typeof value === 'object' &&\n typeof value.getContextValue !== 'function') {\n return MOJOUtils.wrapData(value, null);\n }\n\n return value;\n }\n\n // 9) Navigation Helpers ------------------------------------------------------\n async handlePageNavigation(element) {\n const pageName = element.getAttribute('data-page');\n const paramsAttr = element.getAttribute('data-params');\n let params = {};\n if (paramsAttr) {\n try { params = JSON.parse(paramsAttr); }\n catch (error) { console.warn('Invalid JSON in data-params:', paramsAttr); }\n }\n\n const app = this.getApp();\n if (app) { app.showPage(pageName, params); return; }\n\n const router = this.findRouter();\n if (router && typeof router.navigateToPage === 'function') {\n await router.navigateToPage(pageName, params);\n } else {\n console.error(`No router found for page navigation to '${pageName}'`);\n }\n }\n\n async handleHrefNavigation(element) {\n const href = element.getAttribute('href');\n if (this.isExternalLink(href) || element.hasAttribute('data-external')) return;\n\n const router = this.findRouter();\n if (router) {\n if (router.options && router.options.mode === 'param' && href.startsWith('?')) {\n const fullPath = '/' + href;\n await router.navigate(fullPath);\n return;\n }\n if (router.options && router.options.mode === 'hash' && href.startsWith('#')) {\n await router.navigate(href);\n return;\n }\n const routePath = this.hrefToRoutePath(href);\n await router.navigate(routePath);\n } else {\n console.warn('No router found for navigation, using default behavior');\n window.location.href = href;\n }\n }\n\n isExternalLink(href) {\n if (!href) return true;\n if (href.startsWith(\"/\") && this.getApp()) {\n if (href.startsWith(this.findRouter().basePath)) return false;\n return true;\n }\n return href.startsWith('#') || href.startsWith('mailto:') || href.startsWith('tel:') || href.startsWith('http://') || href.startsWith('https://') || href.startsWith('//');\n }\n\n hrefToRoutePath(href) {\n if (href.startsWith('/')) {\n const router = this.findRouter();\n if (router && router.options && router.options.base) {\n const base = router.options.base;\n if (href.startsWith(base)) return href.substring(base.length) || '/';\n }\n return href;\n }\n return href.startsWith('./') ? href.substring(2) : href;\n }\n\n findRouter() {\n this.getApp();\n return this.app?.router || null;\n }\n\n getApp() {\n if (this.app) return this.app;\n const apps = [\n window.__app__,\n window.MOJO?.app,\n window.APP,\n window.app,\n window.WebApp,\n window.matchUUID ? window[window.matchUUID]() : window[window.matchUUID]\n ];\n this.app = apps.find(app => app && typeof app.showPage === 'function') || null;\n return this.app;\n }\n\n handleActionError(action, err, evt, el) {\n this.showError(`Action '${action}' failed: ${err}`, evt, el);\n }\n\n // ---------------------------------------------\n // Utilities\n // ---------------------------------------------\n /**\n * Escape HTML characters\n * @param {string} str - String to escape\n * @returns {string} Escaped string\n */\n escapeHtml(str) {\n if (typeof str !== 'string') return str;\n\n const div = document.createElement('div');\n div.textContent = str;\n return div.innerHTML;\n }\n\n contains(el) {\n if (typeof el === 'string') {\n if (!this.element) return false; // no parent element yet\n el = document.getElementById(el);\n }\n if (!el) return false; // no element with that id\n return this.element.contains(el);\n }\n\n /**\n * Initialize Bootstrap tooltips in this view's element\n * Called automatically in bindEvents() if enableTooltips is true\n */\n initializeTooltips() {\n if (!this.element || !window.bootstrap?.Tooltip) return;\n this.disposeTooltips();\n const tooltipTriggerList = this.element.querySelectorAll('[data-bs-toggle=\"tooltip\"]');\n [...tooltipTriggerList].map(tooltipTriggerEl => {\n // Extract custom options from data attributes\n const theme = tooltipTriggerEl.getAttribute('data-tooltip-theme');\n const size = tooltipTriggerEl.getAttribute('data-tooltip-size');\n\n // Build custom class list\n let customClass = '';\n if (theme) customClass += `tooltip-${theme} `;\n if (size) customClass += `tooltip-${size}`;\n\n // Build options object - only include customClass if it has a value\n const options = {};\n const trimmedClass = customClass.trim();\n if (trimmedClass) {\n options.customClass = trimmedClass;\n }\n\n // Initialize tooltip with custom options\n return new window.bootstrap.Tooltip(tooltipTriggerEl, options);\n });\n }\n\n /**\n * Dispose all Bootstrap tooltips in this view's element\n * Called automatically in unbindEvents() if enableTooltips is true\n */\n disposeTooltips() {\n if (!this.element || !window.bootstrap?.Tooltip) return;\n\n const tooltipElements = this.element.querySelectorAll('[data-bs-toggle=\"tooltip\"]');\n tooltipElements.forEach(element => {\n const tooltip = window.bootstrap.Tooltip.getInstance(element);\n if (tooltip) {\n tooltip.dispose();\n }\n });\n }\n\n /**\n * Show error message\n * @param {string} message - Error message\n */\n async showError(message) {\n console.error(`View ${this.id} error:`, message);\n const app = this.getApp ? this.getApp() : (this.app || null);\n if (app && typeof app.showError === 'function') {\n await app.showError(message);\n return;\n }\n // Fallback to browser alert if no app or helper available\n alert(`Error: ${message}`);\n }\n\n /**\n * Show success message\n * @param {string} message - Success message\n */\n async showSuccess(message) {\n if (this.debug) {\n console.log(`View ${this.id} success:`, message);\n }\n const app = this.getApp ? this.getApp() : (this.app || null);\n if (app && typeof app.showSuccess === 'function') {\n await app.showSuccess(message);\n return;\n }\n // Fallback to browser alert if no app or helper available\n alert(`Success: ${message}`);\n }\n\n /**\n * Show info message\n * @param {string} message - Info message\n */\n async showInfo(message) {\n console.info(`View ${this.id} info:`, message);\n const app = this.getApp ? this.getApp() : (this.app || null);\n if (app && typeof app.showInfo === 'function') {\n await app.showInfo(message);\n return;\n }\n // Fallback to browser alert if no app or helper available\n alert(`Info: ${message}`);\n }\n\n /**\n * Show warning message\n * @param {string} message - Warning message\n */\n async showWarning(message) {\n console.warn(`View ${this.id} warning:`, message);\n const app = this.getApp ? this.getApp() : (this.app || null);\n if (app && typeof app.showWarning === 'function') {\n await app.showWarning(message);\n return;\n }\n // Fallback to browser alert if no app or helper available\n alert(`Warning: ${message}`);\n }\n\n // Default action: copy value from data-clipboard to clipboard\n async onActionCopyToClipboard(event, element) {\n try {\n const carrier = element?.closest('[data-clipboard]') || element;\n const text = carrier?.getAttribute('data-clipboard') || '';\n // Consider handled even if empty to avoid bubbling\n if (!text) return true;\n\n if (navigator.clipboard && window.isSecureContext) {\n await navigator.clipboard.writeText(text);\n } else {\n const textarea = document.createElement('textarea');\n textarea.value = text;\n document.body.appendChild(textarea);\n textarea.select();\n document.execCommand('copy');\n document.body.removeChild(textarea);\n }\n\n // Visual feedback: temporarily swap icon to a checkmark\n const icon = element.querySelector('i');\n const originalClass = icon && icon.className;\n if (icon) {\n icon.className = 'bi bi-check';\n setTimeout(() => { icon.className = originalClass; }, 1000);\n }\n return true;\n } catch (err) {\n console.warn('Copy to clipboard failed:', err);\n return true;\n }\n }\n\n static _genId() { return `view_${Math.random().toString(36).substr(2, 9)}`; }\n\n static _warn(msg, err) {\n try {\n if (err) console.warn(`[View] ${msg}:`, err);\n else console.warn(`[View] ${msg}`);\n } catch { /* never throw on logging */ }\n }\n}\n\nimport EventEmitter from '@core/mixins/EventEmitter.js';\nObject.assign(View.prototype, EventEmitter);\n\nexport default View;\n"],"names":["objectToString","Object","prototype","toString","isArray","Array","obj","call","isFunction","isObject","escapeHtml","string","entityMap","String","replace","s","Scanner","constructor","this","tail","pos","eos","scan","re","match","index","substring","length","scanUntil","search","Context","view","parentContext","cache","parent","_cacheId","Math","random","push","lookup","name","renderCache","cacheKey","has","get","startsWith","actualName","shouldIterate","pipeString","pipeIndex","indexOf","trim","endsWith","value","getContextValue","e","formatter","window","MOJO","dataFormatter","pipe","entries","map","key","val","keys","hasOwnProperty","intermediateValue","names","context","lookupHit","split","remainingPath","slice","join","hasProperty","primitiveHasOwnProperty","set","propName","primitive","Writer","templateCache","Map","clearCache","clear","parse","template","tags","tokens","parseTemplate","openingTag","closingTag","scanner","start","type","chr","token","openingTagRe","RegExp","escapeRegExp","closingTagRe","closingCurlyRe","i","charAt","openSection","nestSections","squashTokens","squashedTokens","lastToken","nestedTokens","collector","sections","sectionToken","section","pop","render","partials","config","getConfigTags","renderTokens","originalTemplate","buffer","childTokens","console","warn","j","itemContext","pushedContext","text","defaultWriter","Mustache","version","escape","TypeError","toJSON","MOJOUtils","wrapData","EventDelegate","domListeners","debounceTimers","bind","rootEl","unbind","onClick","async","event","actionEl","target","closest","shouldHandle","action","getAttribute","tagName","preventDefault","hideTooltip","dispatch","stopPropagation","handledByChild","navEl","hasAttribute","ctrlKey","metaKey","shiftKey","button","href","isExternalLink","handlePageNavigation","handleHrefNavigation","onChange","changeEl","dispatchChange","then","handled","isFormControl","onInput","matches","debounceMs","parseInt","timerId","clearTimeout","timer","setTimeout","delete","debounceAttr","onKeyDown","el","changeKeys","includes","onSubmit","form","addEventListener","fn","removeEventListener","values","hideDropdown","element","dropdown","dropdownBtn","querySelector","bootstrap","Dropdown","dropdownInstance","getInstance","hide","Tooltip","tooltip","dispose","hideAllTooltips","document","querySelectorAll","forEach","v","cap","w","toUpperCase","specific","error","handleActionError","generic","passThru","onActionDefault","emit","changeHandler","tag","owns","contains","root","child","children","View","opts","className","style","id","_genId","containerId","container","templateUrl","data","isRendering","lastRenderTime","mounted","debug","app","cacheTemplate","enableTooltips","options","_ensureElement","events","model","setModel","onInit","onInitView","initialized","onBeforeRender","onAfterRender","onBeforeMount","onAfterMount","onBeforeUnmount","onAfterUnmount","onBeforeDestroy","onAfterDestroy","isDiff","off","_onModelChange","on","isMounted","setTemplate","tpl","addChild","childView","lazyMount","_lazyMount","getApp","_warn","removeChild","idOrView","Promise","resolve","destroy","catch","err","getChild","updateData","newData","rerender","assign","toggleClass","force","classList","toggle","addClass","add","setClass","removeClass","remove","canRender","now","Date","renderCooldown","noAppend","getElementById","allowMount","unbindEvents","getViewData","html","renderTemplate","innerHTML","mount","_renderChildren","bindEvents","lazyPending","_lazyTriggered","_setupLazyMountObserver","pendingChildren","IntersectionObserver","_lazyObserver","observer","entry","isIntersecting","__mojoLazyChild","unobserve","rootMargin","threshold","getChildElement","minHeight","observe","requestAnimationFrame","rect","getBoundingClientRect","vh","innerHeight","vw","innerWidth","top","bottom","left","right","c","_unmountChildren","isConnected","getChildElementById","cleanId","getContainer","replaceById","body","replaceWith","replaceChildren","appendChild","allowAppendToBody","unmount","parentNode","disconnect","ch","toLowerCase","_syncAttrs","createElement","removeAttribute","cssText","initializeTooltips","disposeTooltips","templateContent","getTemplate","getPartials","renderTemplateString","_templateCache","Error","templatePath","basePath","response","fetch","ok","status","statusText","showError","message","state","path","getContextData","pageName","paramsAttr","params","JSON","showPage","router","findRouter","navigateToPage","mode","fullPath","navigate","routePath","hrefToRoutePath","location","base","apps","__app__","APP","WebApp","matchUUID","find","evt","str","div","textContent","tooltipTriggerEl","theme","size","customClass","trimmedClass","alert","showSuccess","showInfo","showWarning","onActionCopyToClipboard","carrier","navigator","clipboard","isSecureContext","writeText","textarea","select","execCommand","icon","originalClass","substr","msg","EventEmitter"],"mappings":"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"}
|