@optionfactory/ful 0.76.0 → 0.78.0

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.
@@ -1 +1 @@
1
- {"version":3,"file":"ful.min.mjs","sources":["../src/encodings.mjs","../src/http-client.mjs","../src/storage.mjs","../src/oauth-authorization-code.mjs","../src/timing.mjs","../src/deferred.mjs","../src/elements/elements.mjs","../src/elements/form.mjs","../src/elements/input.mjs","../src/elements/select.mjs","../src/elements/radio.mjs","../src/elements/spinner.mjs"],"sourcesContent":["\n\nclass Base64 {\n static encode(arrayBuffer, dialect) {\n const d = dialect || Base64.URL_SAFE;\n const len = arrayBuffer.byteLength;\n const view = new Uint8Array(arrayBuffer);\n let res = '';\n for (let i = 0; i < len; i += 3) {\n const v1 = d[view[i] >> 2];\n const v2 = d[((view[i] & 3) << 4) | (view[i + 1] >> 4)];\n const v3 = d[((view[i + 1] & 15) << 2) | (view[i + 2] >> 6)];\n const v4 = d[view[i + 2] & 63];\n res += v1 + v2 + v3 + v4;\n }\n if (len % 3 === 2) {\n res = res.substring(0, res.length - 1);\n } else if (len % 3 === 1) {\n res = res.substring(0, res.length - 2);\n }\n return res;\n }\n static decode(str, dialect) {\n const d = dialect || Base64.URL_SAFE;\n let nbytes = Math.floor(str.length * 0.75);\n for (let i = 0; i !== str.length; ++i) {\n if (str[str.length - i - 1] !== '=') {\n break;\n }\n --nbytes;\n }\n const view = new Uint8Array(nbytes);\n\n let vi = 0;\n let si = 0;\n while (vi < str.length * 0.75) {\n const v1 = d.indexOf(str.charAt(si++));\n const v2 = d.indexOf(str.charAt(si++));\n const v3 = d.indexOf(str.charAt(si++));\n const v4 = d.indexOf(str.charAt(si++));\n view[vi++] = (v1 << 2) | (v2 >> 4);\n view[vi++] = ((v2 & 15) << 4) | (v3 >> 2);\n view[vi++] = ((v3 & 3) << 6) | v4;\n }\n\n return view.buffer;\n }\n}\n\nBase64.STANDARD = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\nBase64.URL_SAFE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';\n\n\nclass Hex {\n static decode(hex) {\n if (hex.length % 2 !== 0) {\n throw new Error(\"invalid length\");\n }\n const lenInBytes = hex.length / 2;\n return new Uint8Array(lenInBytes).map((e, i) => {\n const offset = i * 2;\n const octet = hex.substring(offset, offset + 2);\n return parseInt(octet, 16);\n });\n }\n static encode(bytes, upper) {\n return Array.from(bytes)\n .map(b => b.toString(16))\n .map(b => upper ? b.toUpperCase() : b)\n .map(o => o.padStart(2, 0))\n .join('');\n }\n}\n\nexport { Base64, Hex };","class ContextInterceptor {\n constructor() {\n const context = document.querySelector(\"meta[name='context']\").getAttribute(\"content\");\n this.context = context.endsWith(\"/\") ? context.substring(0, context.length - 1) : context;\n }\n async intercept(request, chain){\n const separator = request.resource.startsWith(\"/\") ? \"\" : \"/\";\n request.resource = this.context + separator + request.resource;\n return await chain.proceed(request);\n }\n}\n\nclass CsrfTokenInterceptor {\n constructor() {\n this.k = document.querySelector(\"meta[name='_csrf_header']\").getAttribute(\"content\");\n this.v = document.querySelector(\"meta[name='_csrf']\").getAttribute(\"content\");\n }\n async intercept(request, chain){\n const headers = new Headers(request.options.headers);\n headers.set(this.k, this.v);\n request.options.headers = headers;\n return await chain.proceed(request);\n }\n}\n\nclass RedirectOnUnauthorizedInterceptor {\n constructor(redirectUri) {\n this.redirectUri = redirectUri;\n }\n async intercept(request, chain){\n const response = await chain.proceed(request);\n if (response.status !== 401) {\n return response;\n }\n window.location.href = this.redirectUri;\n }\n}\n\nclass Failure extends Error {\n static parseProblems(status, text) {\n const def = [{\n type: \"GENERIC_PROBLEM\",\n context: null,\n reason: `${status}: ${text}`,\n details: null\n }];\n try {\n return text ? JSON.parse(text) : def;\n } catch (e) {\n return def;\n }\n }\n static fromResponse(status, text) {\n return new Failure(status, Failure.parseProblems(status, text));\n }\n constructor(status, problems) {\n super(JSON.stringify(problems));\n this.name = `Failure:${status}`;\n this.status = status;\n this.problems = problems;\n }\n}\n\nclass HttpClientBuilder {\n constructor() {\n this.interceptors = [];\n }\n withContext() {\n this.interceptors.push(new ContextInterceptor());\n return this;\n }\n withCsrfToken() {\n this.interceptors.push(new CsrfTokenInterceptor());\n return this;\n }\n withRedirectOnUnauthorized(redirectUri) {\n this.interceptors.push(new RedirectOnUnauthorizedInterceptor(redirectUri));\n return this;\n }\n withInterceptors(...interceptors) {\n this.interceptors.push(...interceptors);\n return this;\n }\n build() {\n const interceptors = this.interceptors;\n return new HttpClient({interceptors});\n }\n}\n\nclass HttpCall {\n async intercept(request, chain){\n return await fetch(request.resource, request.options);\n } \n}\n\nclass HttpInterceptorChain {\n constructor(interceptors, current){\n this.interceptors = interceptors;\n this.current = current;\n }\n async proceed(request){\n const interceptor = this.interceptors[this.current];\n return await interceptor.intercept(request, new HttpInterceptorChain(this.interceptors, this.current + 1));\n }\n}\n\n\nclass HttpClient {\n static builder() {\n return new HttpClientBuilder();\n }\n constructor({interceptors}){\n this.interceptors = interceptors || [];\n }\n async exchange(resource, options) {\n const opts = options || {};\n const interceptors = [...this.interceptors, ...opts.interceptors || [], new HttpCall()];\n const chain = new HttpInterceptorChain(interceptors, 0);\n return await chain.proceed({resource, options: opts});\n }\n async fetch(resource, options) {\n const response = await this.exchange(resource, options);\n if (!response.ok) {\n const message = await response.text();\n throw Failure.fromResponse(response.status, message);\n } \n return response;\n }\n async json(resource, options) {\n try {\n const response = await this.fetch(resource, options);\n const text = await response.text();\n return text ? JSON.parse(text) : undefined;\n } catch (e) {\n if (e instanceof Failure) {\n throw e;\n }\n throw new Failure(0, [{\n type: \"CONNECTION_PROBLEM\",\n context: null,\n reason: e.message,\n details: null\n }]);\n }\n }\n}\n\nfunction jsonRequest(method, body, headers){\n return {\n headers: {\n \"Content-Type\": \"application/json\",\n ...headers\n },\n method: method,\n body: JSON.stringify(body) \n }\n}\nfunction jsonPost(body, headers){\n return jsonRequest('POST', body, headers);\n}\nfunction jsonPut(body, headers){\n return jsonRequest('PUT', body, headers);\n}\nfunction jsonPatch(body, headers){\n return jsonRequest('PATCH', body, headers);\n}\n\n\nexport { HttpClient, Failure, jsonRequest, jsonPost, jsonPut, jsonPatch };\n","\nclass Storage {\n constructor(prefix, storage) {\n this.prefix = prefix;\n this.storage = storage;\n }\n save(k, v) {\n this.storage.setItem(`${this.prefix}-${k}`, JSON.stringify(v));\n }\n load(k) {\n const got = this.storage.getItem(`${this.prefix}-${k}`);\n return got === undefined ? undefined : JSON.parse(got);\n }\n remove(k) {\n this.storage.removeItem(`${this.prefix}-${k}`);\n }\n pop(k) {\n const decoded = this.load(k);\n this.remove(k);\n return decoded;\n }\n}\n\nclass LocalStorage extends Storage {\n constructor(prefix) {\n super(prefix, localStorage);\n }\n}\n\nclass SessionStorage extends Storage {\n constructor(prefix) {\n super(prefix, sessionStorage);\n }\n}\n\nclass VersionedStorage {\n constructor(storage, key, dataSupplier){\n this.storage = storage;\n this.key = key;\n this.dataSupplier = dataSupplier;\n this.cache = null;\n \n }\n async load(revision){\n const saved = this.storage.load(this.key);\n if (!!saved && saved.revision === revision) {\n this.cache = saved.value;\n return;\n }\n const freshData = await this.dataSupplier(revision, this.key);\n this.storage.save(this.key, {\n revision: revision,\n value: freshData\n });\n this.cache = freshData;\n }\n data(){\n return this.cache;\n }\n}\n\n\n\nexport {LocalStorage, SessionStorage, VersionedStorage};","import { Base64 } from \"./encodings.mjs\";\nimport { SessionStorage } from \"./storage.mjs\";\n\n\nclass AuthorizationCodeFlow {\n static forKeycloak(clientId, realmBaseUrl, redirectUri){\n const scope = \"openid profile\";\n return new AuthorizationCodeFlow(clientId, scope, {\n auth: new URL(\"protocol/openid-connect/auth\", realmBaseUrl),\n token: new URL(\"protocol/openid-connect/token\", realmBaseUrl),\n logout: new URL(\"protocol/openid-connect/logout\", realmBaseUrl),\n registration: new URL(\"protocol/openid-connect/registrations\", realmBaseUrl),\n redirect: redirectUri\n }); \n }\n constructor(clientId, scope, {auth, token, registration, logout, redirect}) {\n this.storage = new SessionStorage(clientId);\n this.clientId = clientId;\n this.scope = scope;\n this.uri = {auth, token, registration, logout, redirect};\n }\n async action(uri, additionalParams){\n const pkceVerifier = Base64.encode(crypto.getRandomValues(new Uint8Array(32)).buffer);\n const pkceChallenge = Base64.encode(await crypto.subtle.digest(\"SHA-256\", new TextEncoder().encode(pkceVerifier)));\n const state = this.clientId + Base64.encode(crypto.getRandomValues(new Uint8Array(16)).buffer);\n this.storage.save(AuthorizationCodeFlow.PKCE_AND_STATE_KEY, {\n state: state,\n verifier: pkceVerifier\n });\n const url = new URL(uri);\n url.searchParams.set(\"client_id\", this.clientId);\n url.searchParams.set(\"redirect_uri\", this.uri.redirect);\n url.searchParams.set(\"response_type\", 'code');\n url.searchParams.set(\"scope\", this.scope);\n url.searchParams.set(\"state\", state);\n url.searchParams.set(\"code_challenge\", pkceChallenge);\n url.searchParams.set(\"code_challenge_method\", 'S256');\n Object.entries(additionalParams || {}).forEach(kv => {\n url.searchParams.set(kv[0], kv[1]);\n });\n window.location = url;\n }\n async registration(additionalParams){\n await this.action(this.uri.registration, additionalParams);\n }\n async applicationInitiatedAction(kcAction){\n await this.action(this.uri.auth, {\n kc_action: kcAction\n });\n }\n async _tokenExchange(code, state) {\n window.history.replaceState('', \"\", this.uri.redirect);\n const stateAndVerifier = this.storage.pop(AuthorizationCodeFlow.PKCE_AND_STATE_KEY);\n if (stateAndVerifier.state !== state) {\n throw new Error(\"State mismatch\");\n }\n const response = await fetch(this.uri.token, {\n method: \"POST\",\n headers: {\n \"Content-Type\": 'application/x-www-form-urlencoded'\n },\n body: new URLSearchParams([\n [\"client_id\", this.clientId],\n [\"code\", code],\n [\"grant_type\", \"authorization_code\"],\n [\"code_verifier\", stateAndVerifier.verifier],\n [\"state\", stateAndVerifier.state],\n [\"redirect_uri\", this.uri.redirect]\n ])\n });\n if (!response.ok) {\n const text = await response.text();\n throw new Error(\"Error:\" + response.status + \": \" + text);\n }\n const token = await response.json();\n return new AuthorizationCodeFlowSession(this.clientId, token, this.uri);\n }\n async ensureLoggedIn() {\n const url = new URL(window.location.href);\n const code = url.searchParams.get(\"code\");\n if (code && this.storage.load(AuthorizationCodeFlow.PKCE_AND_STATE_KEY)) {\n //if callback from keycloak and we have our state still stored\n const state = url.searchParams.get(\"state\");\n return await this._tokenExchange(code, state);\n }\n //if not authorized\n await this.action(this.uri.auth, {});\n return null;\n }\n}\nAuthorizationCodeFlow.PKCE_AND_STATE_KEY = \"state-and-verifier\";\n\nclass AuthorizationCodeFlowSession {\n static parseToken(token) {\n const [rawHeader, rawPayload, signature] = token.split(\".\");\n const ut8decoder = new TextDecoder(\"utf-8\");\n return {\n header: JSON.parse(ut8decoder.decode(Base64.decode(rawHeader, Base64.STANDARD))),\n payload: JSON.parse(ut8decoder.decode(Base64.decode(rawPayload, Base64.STANDARD))),\n signature: signature\n };\n } \n constructor(clientId, t, {token, logout, redirect}) {\n this.clientId = clientId;\n this.token = t;\n this.accessToken = AuthorizationCodeFlowSession.parseToken(t.access_token);\n this.refreshToken = AuthorizationCodeFlowSession.parseToken(t.refresh_token);\n this.uri = { token, logout, redirect }\n this.refreshCallback = null;\n }\n onRefresh(callback) {\n this.refreshCallback = callback;\n }\n async refresh() {\n const response = await fetch(this.uri.token, {\n method: \"POST\",\n headers: {\n \"Content-Type\": 'application/x-www-form-urlencoded'\n },\n body: new URLSearchParams([\n [\"client_id\", this.clientId],\n [\"grant_type\", \"refresh_token\"],\n [\"refresh_token\", this.token.refresh_token]\n ])\n });\n if (!response.ok) {\n throw new Error(\"Error:\" + response.status + \": \" + response.text());\n }\n const token = await response.json();\n this.token = token;\n this.accessToken = AuthorizationCodeFlowSession.parseToken(token.access_token);\n this.refreshToken = AuthorizationCodeFlowSession.parseToken(token.refresh_token);\n if (this.refreshCallback) {\n this.refreshCallback(this.token, this.accessToken, this.refreshToken);\n }\n }\n shouldBeRefreshed(gracePeriod) {\n const now = new Date().getTime();\n const refreshTokenExpiresAt = this.refreshToken.payload.exp * 1000;\n const expired = now > refreshTokenExpiresAt;\n const shouldRefresh = now - gracePeriod > refreshTokenExpiresAt;\n return !expired && shouldRefresh;\n }\n async refreshIf(gracePeriod) {\n if (!this.shouldBeRefreshed(gracePeriod)) {\n return;\n }\n await this.refresh();\n }\n logout() {\n const url = new URL(this.uri.logout);\n url.searchParams.set(\"post_logout_redirect_uri\", this.uri.redirect);\n url.searchParams.set(\"id_token_hint\", this.token.id_token);\n window.location = url;\n }\n\n bearerToken() {\n return `Bearer ${this.token.access_token}`;\n }\n \n interceptor(gracePeriodBefore, gracePeriodAfter){\n return new AuthorizationCodeFlowInterceptor(this, gracePeriodBefore, gracePeriodAfter); \n }\n}\n\nclass AuthorizationCodeFlowInterceptor {\n constructor(session, gracePeriodBefore, gracePeriodAfter) {\n this.session = session;\n this.gracePeriodBefore = gracePeriodBefore || 2000;\n this.gracePeriodAfter = gracePeriodAfter || 30000;\n }\n async intercept(request, chain) {\n await this.session.refreshIf(this.gracePeriodBefore);\n const headers = new Headers(request.options.headers);\n headers.set(\"Authorization\", this.session.bearerToken());\n request.options.headers = headers;\n const response = await chain.proceed(request);\n await this.session.refreshIf(this.gracePeriodAfter);\n return response;\n }\n}\n\n\nexport {AuthorizationCodeFlow, AuthorizationCodeFlowSession, AuthorizationCodeFlowInterceptor };","\nconst timing = {\n sleep(ms) {\n return new Promise(resolve => setTimeout(resolve, ms));\n },\n DEBOUNCE_DEFAULT: 0,\n DEBOUNCE_IMMEDIATE: 1,\n debounce(timeoutMs, func, options) {\n let tid = null;\n let args = [];\n let previousTimestamp = 0;\n let opts = options || timing.DEBOUNCE_DEFAULT;\n\n const later = () => {\n const elapsed = new Date().getTime() - previousTimestamp;\n if (timeoutMs > elapsed) {\n tid = setTimeout(later, timeoutMs - elapsed);\n return;\n }\n tid = null;\n if (opts !== timing.DEBOUNCE_IMMEDIATE) {\n func(...args);\n }\n // This check is needed because `func` can recursively invoke `debounced`.\n if (tid === null) {\n args = [];\n }\n };\n\n return function () {\n args = arguments;\n previousTimestamp = new Date().getTime();\n if (tid === null) {\n tid = setTimeout(later, timeoutMs);\n if (opts === timing.DEBOUNCE_IMMEDIATE) {\n func(...args);\n }\n }\n };\n },\n THROTTLE_DEFAULT: 0,\n THROTTLE_NO_LEADING: 1,\n THROTTLE_NO_TRAILING: 2,\n throttle(timeoutMs, func, options) {\n let tid = null;\n let args = [];\n let previousTimestamp = 0;\n let opts = options || timing.THROTTLE_DEFAULT;\n\n const later = () => {\n previousTimestamp = (opts & timing.THROTTLE_NO_LEADING) ? 0 : new Date().getTime();\n tid = null;\n func(...args);\n if (tid === null) {\n args = [];\n }\n };\n\n return function () {\n const now = new Date().getTime();\n if (!previousTimestamp && (opts & timing.THROTTLE_NO_LEADING)) {\n previousTimestamp = now;\n }\n const remaining = timeoutMs - (now - previousTimestamp);\n args = arguments;\n if (remaining <= 0 || remaining > timeoutMs) {\n if (tid !== null) {\n clearTimeout(tid);\n tid = null;\n }\n previousTimestamp = now;\n func(...args);\n if (tid === null) {\n args = [];\n }\n } else if (tid === null && !(opts & timing.THROTTLE_NO_TRAILING)) {\n tid = setTimeout(later, remaining);\n }\n };\n\n }\n};\n\n\nexport { timing };","class Deferred {\n constructor() {\n this.promise = new Promise((resolve, reject) => {\n this.reject = reject;\n this.resolve = resolve;\n });\n }\n}\n\n\nexport { Deferred }","class Fragments {\n /**\n * \n * @param {...string} html \n * @returns \n */\n static fromHtml(...html) {\n const el = document.createElement(\"template\");\n el.innerHTML = html.join(\"\");\n return el.content;\n }\n /**\n * \n * @param {DocumentFragment} fragment \n * @returns \n */\n static toHtml(fragment) {\n var el = document.createElement(\"template\");\n el.content.appendChild(fragment);\n return el.innerHTML;\n }\n /**\n * \n * @param {...Node} nodes \n * @returns \n */\n static from(...nodes) {\n const fragment = new DocumentFragment();\n fragment.append(...nodes);\n return fragment;\n }\n /**\n * \n * @param {HTMLElement} el \n * @returns \n */\n static fromChildNodes(el) {\n const fragment = new DocumentFragment();\n fragment.append(...el.childNodes);\n return fragment;\n }\n}\n\nclass Attributes {\n static id = 0;\n /**\n * \n * @param {string} prefix \n * @returns \n */\n static uid(prefix) {\n return `${prefix}-${++Attributes.id}`;\n }\n /**\n * \n * @param {HTMLElement} el \n * @param {string} k \n * @param {string} v \n * @returns \n */\n static defaultValue(el, k, v) {\n if (!el.hasAttribute(k)) {\n el.setAttribute(k, v);\n }\n return el.getAttribute(k);\n }\n /**\n * \n * @param {string} prefix \n * @param {HTMLElement} from \n * @param {HTMLElement} to \n */\n static forward(prefix, from, to) {\n from.getAttributeNames()\n .filter(a => a.startsWith(prefix))\n .forEach(a => {\n const target = a.substring(prefix.length);\n if (target === 'class') {\n to.classList.add(...from.getAttribute(prefix + \"class\").split(\" \").filter(a => a.length));\n return;\n }\n to.setAttribute(target, from.getAttribute(a))\n });\n }\n /**\n * \n * @param {HTMLElement} el \n * @param {stirng} attr \n * @param {boolean} value \n */\n static toggle(el, attr, value) {\n if (value) {\n el.setAttribute(attr, '');\n } else {\n el.removeAttribute(attr);\n }\n }\n static flip(el, attr) {\n if (el.hasAttribute(attr)) {\n el.removeAttribute(attr);\n } else {\n el.setAttribute(attr, '');\n }\n }\n\n}\n\nclass LightSlots {\n /**\n * \n * @param {HTMLElement} el \n * @returns the slots\n */\n static from(el) {\n const namedSlots = Array.from(el.childNodes)\n .filter(el => el.matches && el.matches('[slot]'))\n .map(el => {\n el.remove();\n const slot = el.getAttribute(\"slot\");\n el.removeAttribute(\"slot\");\n return [slot, el];\n });\n const slots = {};\n slots.default = new DocumentFragment();\n slots.default.append(...el.childNodes);\n for(const [name,el] of namedSlots){\n if(!(name in slots)){\n slots[name] = new DocumentFragment();\n }\n slots[name].append(el);\n }\n return slots;\n }\n}\n\nclass Nodes {\n static isParsed(el) {\n for (var c = el; c; c = c.parentNode) {\n if (c.nextSibling) {\n return true;\n }\n }\n return false;\n }\n}\n\nclass Events {\n static dispatchChange(el, value) {\n return el.dispatchEvent(new CustomEvent(\"change\", {\n bubbles: true,\n cancelable: true,\n detail: {\n target: el,\n value: value\n }\n }));\n }\n}\n\nclass TemplatesRegistry {\n #idToFragment = {};\n #idToTemplate = {};\n #ec;\n put(k, fragment) {\n if (this.#ec) {\n this.#idToTemplate[k] = Template.fromFragment(fragment, ec);\n return;\n }\n this.#idToFragment[k] = fragment;\n }\n get(k) {\n if (!this.#ec) {\n throw new Error(\"TemplatesRegistry is not configured\");\n }\n const tpl = this.#idToTemplate[k];\n if (!tpl) {\n throw new Error(`missing template: '${k}'`);\n }\n return tpl;\n }\n configure(ec) {\n this.#ec = ec;\n for (const [k, fragment] of Object.entries(this.#idToFragment)) {\n delete this.#idToFragment[k];\n this.#idToTemplate[k] = ftl.Template.fromFragment(fragment, ec);\n }\n }\n}\n\n\nclass ElementsRegistry {\n #templates;\n #tagToclass;\n #configured;\n #id = 0;\n constructor() {\n this.#templates = new TemplatesRegistry();\n this.#tagToclass = {};\n }\n defineTemplate(html) {\n if (html === null || html === undefined) {\n return undefined;\n }\n const name = `unnamed-${++this.#id}`;\n this.#templates.put(name, Fragments.fromHtml(html));\n return name;\n }\n template(k) {\n if (k === null || k === undefined) {\n return undefined;\n }\n return this.#templates.get(k);\n }\n define(tag, klass) {\n if (!this.#configured) {\n this.#tagToclass[tag] = klass;\n return this;\n }\n customElements.define(tag, klass);\n return this;\n }\n configure(ec) {\n this.#templates.configure(ec);\n for (const [tag, klass] of Object.entries(this.#tagToclass)) {\n customElements.define(tag, klass);\n delete this.#tagToclass[tag];\n }\n this.#configured = true;\n }\n}\n\nconst elements = new ElementsRegistry();\n\n\nclass UpgradeQueue {\n #q = [];\n constructor() {\n document.addEventListener('DOMContentLoaded', this.dequeue.bind(this));\n }\n enqueue(el) {\n if (!this.#q.length) {\n requestAnimationFrame(this.dequeue.bind(this));\n }\n this.#q.push(el);\n }\n dequeue() {\n this.#q.splice(0).forEach(el => el.upgrade());\n }\n}\n\nconst upgradeQueue = new UpgradeQueue();\n\nconst mappers = {\n 'string': attr => attr,\n 'number': attr => attr === null ? null : Number(attr),\n 'presence': attr => attr !== null,\n 'state': attr => attr !== null,\n 'bool': attr => attr === 'true',\n 'json': attr => JSON.parse(attr)\n};\n\nconst ParsedElement = (conf) => {\n const { observed, template, slots } = conf || {};\n\n const attrsAndTypes = (observed || []).map(a => {\n const [attr, maybeType] = a.split(\":\");\n const type = maybeType?.trim() || 'string';\n if (!(type in mappers)) {\n throw new Error(`unsupported attribute type: ${type}`);\n }\n return [attr.trim(), type];\n });\n\n const attrsAndMappers = attrsAndTypes.map(([attr, type]) => [attr, mappers[type]]);\n\n const attrToMapper = Object.fromEntries(attrsAndMappers);\n\n const templateId = elements.defineTemplate(template);\n\n const k = class extends HTMLElement {\n static get observedAttributes() {\n return Object.keys(attrToMapper);\n }\n #parsed;\n #initialized;\n #reflecting;\n #internals;\n constructor(...args) {\n super(...args);\n this.#internals = this.attachInternals();\n }\n get initialized() {\n return this.#initialized;\n }\n get internals() {\n return this.#internals;\n }\n connectedCallback() {\n if (this.#parsed) {\n return;\n }\n if (this.ownerDocument.readyState === 'complete' || Nodes.isParsed(this)) {\n upgradeQueue.enqueue(this);\n return;\n }\n this.ownerDocument.addEventListener('DOMContentLoaded', () => {\n observer.disconnect();\n upgradeQueue.enqueue(this);\n });\n const observer = new MutationObserver(() => {\n if (!Nodes.isParsed(this)) {\n return;\n }\n observer.disconnect();\n upgradeQueue.enqueue(this);\n });\n observer.observe(this.parentNode, { childList: true, subtree: true });\n }\n attributeChangedCallback(attr, oldValue, newValue) {\n if (!this.#parsed || oldValue === newValue) {\n return;\n }\n if (this.#reflecting) {\n return;\n }\n const mapper = attrToMapper[attr];\n this[attr] = mapper(newValue);\n }\n reflect(fn) {\n this.#reflecting = true;\n try {\n fn();\n } finally {\n this.#reflecting = false;\n }\n }\n async upgrade() {\n if (this.#parsed) {\n return;\n }\n this.#parsed = true;\n await this.render(elements.template(templateId), slots ? LightSlots.from(this) : undefined);\n\n for (const [attr, mapper] of attrsAndMappers) {\n if (this.hasAttribute(attr)) {\n this[attr] = mapper(this.getAttribute(attr));\n }\n }\n this.#initialized = true;\n }\n };\n\n for (const [attr, type] of attrsAndTypes.filter(([a, t]) => t === 'state')) {\n Object.defineProperty(k.prototype, attr, {\n enumerable: true,\n configurable: true,\n get() {\n return this.internals.states.has(`--${attr}`);\n },\n set(value) {\n this.internals.states[value ? 'add' : 'delete'](`--${attr}`);\n this.reflect(() => Attributes.toggle(this, attr, value));\n }\n });\n }\n\n return k;\n}\n\nexport { Fragments, Attributes, LightSlots, Nodes, Events, TemplatesRegistry, ElementsRegistry, elements, ParsedElement };\n","/* global Infinity, CSS */\n\nimport { Failure } from \"../http-client.mjs\";\nimport { ParsedElement } from \"./elements.mjs\"\n\nfunction flatten(obj, prefix) {\n return Object.keys(obj).reduce((acc, k) => {\n const pre = prefix.length ? prefix + '.' : '';\n if (typeof obj[k] === 'object' && obj[k] !== null) {\n Object.assign(acc, flatten(obj[k], pre + k));\n } else {\n acc[pre + k] = obj[k];\n }\n return acc;\n }, {});\n}\n\nfunction providePath(result, path, value) {\n const keys = path.split(\".\").map((k) => k.match(/^[0-9]+$/) ? +k : k);\n let current = result;\n let previous = null;\n for (let i = 0; ; ++i) {\n const ckey = keys[i];\n const pkey = keys[i - 1];\n if (Number.isInteger(ckey) && !Array.isArray(current)) {\n if (previous !== null) {\n previous[pkey] = current = [];\n } else {\n result = current = [];\n }\n }\n if (i === keys.length - 1) {\n //when value is undefined we only want to define the property if it's not defined \n current[ckey] = value !== undefined ? value : (ckey in current ? current[ckey] : null);\n return result;\n }\n if (current[ckey] === undefined) {\n current[ckey] = {};\n }\n previous = current;\n current = current[ckey];\n }\n}\n\nfunction extract(el) {\n if (el.getAttribute('type') === 'radio') {\n if (!el.checked) {\n return undefined;\n }\n return el.dataset['fulBindType'] === 'boolean' ? el.value === 'true' : el.value;\n }\n if (el.getAttribute('type') === 'checkbox') {\n return el.checked;\n }\n if (el.dataset['fulBindType'] === 'boolean') {\n return !el.value ? null : el.value === 'true';\n }\n return el.value === '' || el.value === undefined ? null : el.value;\n}\n\nfunction mutate(el, raw) {\n if (el.getAttribute('type') === 'radio') {\n el.checked = el.getAttribute('value') === raw;\n return;\n }\n if (el.getAttribute('type') === 'checkbox') {\n el.checked = raw;\n return;\n }\n el.value = raw;\n}\n\nclass Form extends ParsedElement() {\n static IGNORED_CHILDREN_SELECTOR = '.d-none, [hidden]';\n static SCROLL_OFFSET = 50;\n render() {\n const form = document.createElement('form');\n form.replaceChildren(...this.childNodes);\n form.addEventListener('submit', async (e) => {\n e.preventDefault();\n this.spinning(async () => {\n await this.submitter?.(this.values, this);\n });\n })\n this.replaceChildren(form);\n }\n spinner(spin) {\n this.querySelectorAll('ful-spinner').forEach(el => el.hidden = !spin)\n this.querySelectorAll('[type=submit],[type=reset]').forEach(el => el.disabled = spin)\n }\n async remoting(fn) {\n try {\n await fn();\n } catch (e) {\n if (e instanceof Failure) {\n this.errors = e.problems;\n }\n throw e;\n }\n }\n async spinningUntilError(fn) {\n this.spinner(true)\n try {\n await this.remoting(fn);\n } catch(e) {\n this.spinner(false);\n throw e;\n }\n }\n async spinning(fn) {\n this.spinner(true)\n try {\n await this.remoting(fn);\n } finally {\n this.spinner(false);\n }\n }\n set values(vs) {\n for (const [flattenedKey, value] of Object.entries(flatten(vs, ''))) {\n this.querySelectorAll(`[name='${CSS.escape(flattenedKey)}']`).forEach(el => mutate(el, value));\n }\n }\n get values() {\n return Array.from(this.querySelectorAll('[name]'))\n .filter((el) => {\n if (el.dataset['fulBindInclude'] === 'never') {\n return false;\n }\n return el.dataset['fulBindInclude'] === 'always' || el.closest(Form.IGNORED_CHILDREN_SELECTOR) === null;\n })\n .reduce((result, el) => {\n return providePath(result, el.getAttribute('name'), extract(el));\n }, {});\n }\n set errors(es) {\n const fieldErrors = es.filter((e) => e.type === 'FIELD_ERROR' || e.type === 'INVALID_FORMAT');\n const globalErrors = es.filter((e) => e.type !== 'FIELD_ERROR' && e.type !== 'INVALID_FORMAT');\n this.querySelectorAll('.is-invalid').forEach(el => el.classList.remove('is-invalid'));\n this.querySelectorAll(\"ful-errors\").forEach(el => {\n el.replaceChildren();\n el.setAttribute('hidden', '');\n });\n fieldErrors.forEach((e) => {\n const name = e.context.replace(\"[\", \".\").replace(\"].\", \".\");\n const validationTargetsSelector = `[name='${CSS.escape(name)}'] [ful-validation-target],[name='${CSS.escape(name)}']:not(:has([ful-validation-target]))`;\n this.querySelectorAll(validationTargetsSelector).forEach(input => input.classList.add('is-invalid'));\n const fieldErrorsSelector = `ful-field-error[field='${CSS.escape(name)}']`;\n this.querySelectorAll(fieldErrorsSelector).forEach(el => el.innerText = e.reason);\n });\n this.querySelectorAll(\"ful-errors\").forEach(el => {\n el.innerText = globalErrors.map(e => e.reason).join(\"\\n\");\n if (globalErrors.length !== 0) {\n el.removeAttribute('hidden');\n }\n });\n if (!this.hasAttribute('scroll-on-error')) {\n return;\n }\n const ys = Array.from(this.querySelectorAll('[ful-validated-field]:has(.is-invalid) ful-field-error'))\n .map(el => el.parentElement ? el.parentElement : el)\n .map(el => el.getBoundingClientRect().y + window.scrollY);\n const miny = Math.min(...ys);\n if (miny !== Infinity) {\n window.scroll(window.scrollX, miny > Form.SCROLL_OFFSET ? miny - Form.SCROLL_OFFSET : 0);\n }\n }\n}\n\nexport { Form };\n","import { Attributes, Events, ParsedElement } from \"./elements.mjs\"\n\n\nconst INPUT_TEMPLATE = `\n<div ful-validated-field>\n <label data-tpl-for=\"id\" class=\"form-label\">{{{{ slots.default }}}}</label>\n <div class=\"input-group\">\n <span data-tpl-if=\"slots.ibefore\" class=\"input-group-text\">{{{{ slots.ibefore }}}}</span>\n <div data-tpl-if=\"slots.before\" data-tpl-remove=\"tag\">{{{{ slots.before }}}}</div>\n {{{{ slots.input }}}} \n <div data-tpl-if=\"slots.after\" data-tpl-remove=\"tag\">{{{{ slots.after }}}}</div>\n <span data-tpl-if=\"slots.iafter\" class=\"input-group-text\">{{{{ slots.iafter }}}}</span>\n </div>\n <ful-field-error data-tpl-if=\"name\" data-tpl-field=\"name\"></ful-field-error>\n</div>\n`;\n\nconst makeInputFragment = (el, template, slots) => {\n const input = el.input = slots.input = slots.input?.firstElementChild || (() => {\n const el = document.createElement(\"input\")\n el.classList.add(\"form-control\");\n return el;\n })();\n input.setAttribute('ful-validation-target', '');\n input.addEventListener('change', (evt) => {\n evt.stopPropagation();\n Events.dispatchChange(el, el.value);\n });\n const id = input.getAttribute('id') || el.getAttribute('input-id') || Attributes.uid('ful-input');\n Attributes.forward('input-', el, slots.input)\n Attributes.defaultValue(slots.input, \"id\", id);\n Attributes.defaultValue(slots.input, \"type\", \"text\");\n Attributes.defaultValue(slots.input, \"placeholder\", \" \");\n const name = el.getAttribute('name');\n return template.render(el, { id, name, slots });\n}\n\nclass Input extends ParsedElement({\n observed: ['value'],\n slots: true,\n template: INPUT_TEMPLATE\n}){\n render(template, slots) {\n const fragment = makeInputFragment(this, template, slots);\n this.replaceChildren(fragment);\n }\n get value() {\n return this.input.value;\n }\n set value(value) {\n this.input.value = value;\n }\n}\n\nexport { makeInputFragment, INPUT_TEMPLATE, Input };\n","import { Fragments, Attributes, Events, ParsedElement } from \"./elements.mjs\"\n\n/**\n * <script src=\"tom-select.complete.js\"></script>\n * <link href=\"tom-select.bootstrap5.css\" rel=\"stylesheet\" />\n */\n\nclass Select extends ParsedElement({\n observed: [\"value\"],\n slots: true,\n template: `\n <div ful-validated-field>\n <label data-tpl-for=\"tsId\" class=\"form-label\">{{{{ slots.default }}}}</label>\n {{{{ input }}}}\n <div class=\"input-group\">\n <span data-tpl-if=\"slots.ibefore\" class=\"input-group-text\">{{{{ slots.ibefore }}}}</span>\n <div data-tpl-if=\"slots.before\" data-tpl-remove=\"tag\">{{{{ slots.before }}}}</div>\n {{{{ slots.input }}}} \n <div data-tpl-if=\"slots.after\" data-tpl-remove=\"tag\">{{{{ slots.after }}}}</div>\n <span data-tpl-if=\"slots.iafter\" class=\"input-group-text\">{{{{ slots.iafter }}}}</span>\n </div>\n <ful-field-error data-tpl-if=\"name\" data-tpl-field=\"name\"></ful-field-error>\n </div>\n `\n}) {\n constructor(tsConfig) {\n super();\n this.tsConfig = tsConfig;\n }\n render(template, slots) {\n const type = this.getAttribute(\"type\") || 'local';\n const remote = type != 'local';\n const loadOnce = this.getAttribute('load') != 'always';\n const name = this.getAttribute('name');\n const input = slots.input = slots.input?.firstElementChild || (() => {\n return document.createElement(\"select\");\n })();\n input.setAttribute('ful-validation-target', '');\n\n const id = input.getAttribute('id') || this.getAttribute('input-id') || Attributes.uid('ful-select');\n const tsId = `${id}-ts-control`;\n Attributes.forward('input-', this, input)\n Attributes.defaultValue(input, \"id\", id);\n Attributes.defaultValue(input, \"placeholder\", \" \");\n\n //tomselect needs the input to have a parent.\n //se we move the input to a fragment\n slots.input = Fragments.from(input);\n\n this.loaded = !remote;\n\n const tsDefaultConfig = {\n render: {\n loading: () => '<ful-spinner class=\"centered p-2\"></ful-spinner>'\n }\n }\n\n this._remote = remote;\n // we need to await this load in setValue when remote is configured and the option\n // is not loaded yet.\n // tomselect settings.load does not retun a promise as it wraps the configured load function\n // with a debouncer\n this._unwrappedRemoteLoad = async (query, callback) => {\n\n if (!remote || remote && loadOnce && this.loaded) {\n callback();\n return;\n }\n const type = query && query.hasOwnProperty('byId') ? 'id' : 'query';\n const qvalue = type === 'id' ? query.byId : query;\n const data = await (this.#loader ? this.#loader(qvalue, type) : []);\n if (type !== 'id') {\n this.loaded = true;\n }\n callback(data);\n };\n this.ts = new TomSelect(input, Object.assign(remote ? {\n preload: 'focus',\n load: this._unwrappedRemoteLoad,\n shouldLoad: (query) => this.shouldLoad ? this.shouldLoad(query) : true\n } : {}, tsDefaultConfig, this.tsConfig));\n this.ts.on('change', value => {\n Events.dispatchChange(this, this.value);\n });\n //we remove the input to move it\n input.addEventListener('change', (evt) => {\n evt.stopPropagation();\n });\n input.remove();\n template.renderTo(this, { id, tsId, name, input, slots });\n }\n #loader;\n set loader(l) {\n this.#loader = l;\n // loader can be configured later so we load now\n if (this.hasAttribute('value')) {\n this.value = this.getAttribute(\"value\");\n }\n }\n get value() {\n const v = this.ts.getValue();\n return v === '' ? null : v;\n }\n set value(value) {\n (async () => {\n if (this._remote) {\n await this._unwrappedRemoteLoad({ byId: value }, this.ts.loadCallback.bind(this.ts));\n }\n const silent = true;\n this.ts.setValue(value, silent);\n })();\n }\n}\n\nexport { Select };\n","import { Attributes, Fragments, Events, ParsedElement } from \"./elements.mjs\"\n\nclass RadioGroup extends ParsedElement({\n observed: ['value', 'disabled:state'],\n slots: true,\n template: `\n <fieldset ful-validated-field>\n <legend class=\"form-label\">\n {{{{ slots.default }}}}\n </legend>\n <header data-tpl-if=\"slots.header\">\n {{{{ slots.header }}}}\n </header>\n <section>\n <div class=\"label-wrapper\" data-tpl-each=\"inputsAndLabels\" data-tpl-var=\"ial\">\n <label>\n {{{{ ial[0] }}}}\n {{{{ ial[1] }}}}\n </label>\n </div>\n </section>\n <ful-field-error data-tpl-if=\"name\" data-tpl-field=\"name\"></ful-field-error>\n <footer data-tpl-if=\"slots.footer\">\n {{{{ slots.footer }}}}\n </footer>\n </fieldset>\n `\n}) {\n render(template, slots) {\n const name = this.getAttribute('name') || Attributes.uid('ful-radiogroup');\n const radioEls = Array.from(slots.default.querySelectorAll('ful-radio'));\n const inputsAndLabels = radioEls.map(el => {\n const input = document.createElement('input');\n input.setAttribute('type', 'radio');\n Attributes.forward('input-', this, input);\n Attributes.forward('', el, input);\n input.setAttribute('name', `${name}-ignore`);\n input.setAttribute('ful-validation-target', '');\n input.dataset['fulBindInclude'] = 'never';\n input.addEventListener('change', evt => {\n evt.stopPropagation();\n //change is not cancelable\n Events.dispatchChange(this, this.value);\n }); \n const label = Fragments.fromChildNodes(el);\n return [input, label];\n });\n\n radioEls.forEach(el => el.remove());\n template.renderTo(this, {name, slots, inputsAndLabels});\n }\n get value() {\n const checked = this.querySelector('input[type=radio]:checked');\n return checked ? checked.value : null;\n }\n set value(value) {\n if(!Events.dispatchChange(this, value)){\n return;\n }\n this.querySelector(`input[type=radio][value=${CSS.escape(value)}]`).checked = true;\n }\n}\n\n\nexport { RadioGroup };","import { ParsedElement } from \"./elements.mjs\"\n\nclass Spinner extends ParsedElement({\n slots: true,\n template: `\n <div class=\"ful-spinner-wrapper\">\n <div class=\"ful-spinner-text\">{{{{ slots.default }}}}</div>\n <div class=\"ful-spinner-icon\"></div>\n </div>\n `\n}) {\n render(template, slots) {\n template.renderTo(this, { slots });\n }\n}\n\nexport { Spinner };"],"names":["Base64","encode","arrayBuffer","dialect","d","URL_SAFE","len","byteLength","view","Uint8Array","res","i","substring","length","decode","str","nbytes","Math","floor","vi","si","v1","indexOf","charAt","v2","v3","v4","buffer","STANDARD","Hex","hex","Error","lenInBytes","map","e","offset","octet","parseInt","bytes","upper","Array","from","b","toString","toUpperCase","o","padStart","join","ContextInterceptor","constructor","context","document","querySelector","getAttribute","this","endsWith","intercept","request","chain","separator","resource","startsWith","proceed","CsrfTokenInterceptor","k","v","headers","Headers","options","set","RedirectOnUnauthorizedInterceptor","redirectUri","response","status","window","location","href","Failure","parseProblems","text","def","type","reason","details","JSON","parse","fromResponse","problems","super","stringify","name","HttpClientBuilder","interceptors","withContext","push","withCsrfToken","withRedirectOnUnauthorized","withInterceptors","build","HttpClient","HttpCall","fetch","HttpInterceptorChain","current","interceptor","builder","exchange","opts","ok","message","json","undefined","jsonRequest","method","body","jsonPost","jsonPut","jsonPatch","Storage","prefix","storage","save","setItem","load","got","getItem","remove","removeItem","pop","decoded","LocalStorage","localStorage","SessionStorage","sessionStorage","VersionedStorage","key","dataSupplier","cache","revision","saved","value","freshData","data","AuthorizationCodeFlow","forKeycloak","clientId","realmBaseUrl","auth","URL","token","logout","registration","redirect","scope","uri","action","additionalParams","pkceVerifier","crypto","getRandomValues","pkceChallenge","subtle","digest","TextEncoder","state","PKCE_AND_STATE_KEY","verifier","url","searchParams","Object","entries","forEach","kv","applicationInitiatedAction","kcAction","kc_action","_tokenExchange","code","history","replaceState","stateAndVerifier","URLSearchParams","AuthorizationCodeFlowSession","ensureLoggedIn","get","parseToken","rawHeader","rawPayload","signature","split","ut8decoder","TextDecoder","header","payload","t","accessToken","access_token","refreshToken","refresh_token","refreshCallback","onRefresh","callback","refresh","shouldBeRefreshed","gracePeriod","now","Date","getTime","refreshTokenExpiresAt","exp","refreshIf","id_token","bearerToken","gracePeriodBefore","gracePeriodAfter","AuthorizationCodeFlowInterceptor","session","timing","sleep","ms","Promise","resolve","setTimeout","DEBOUNCE_DEFAULT","DEBOUNCE_IMMEDIATE","debounce","timeoutMs","func","tid","args","previousTimestamp","later","elapsed","arguments","THROTTLE_DEFAULT","THROTTLE_NO_LEADING","THROTTLE_NO_TRAILING","throttle","remaining","clearTimeout","Deferred","promise","reject","Fragments","fromHtml","html","el","createElement","innerHTML","content","toHtml","fragment","appendChild","nodes","DocumentFragment","append","fromChildNodes","childNodes","Attributes","static","uid","id","defaultValue","hasAttribute","setAttribute","forward","to","getAttributeNames","filter","a","target","classList","add","toggle","attr","removeAttribute","flip","LightSlots","namedSlots","matches","slot","slots","default","Nodes","isParsed","c","parentNode","nextSibling","Events","dispatchChange","dispatchEvent","CustomEvent","bubbles","cancelable","detail","TemplatesRegistry","idToFragment","idToTemplate","ec","put","Template","fromFragment","tpl","configure","ftl","ElementsRegistry","templates","tagToclass","configured","defineTemplate","template","define","tag","klass","customElements","elements","upgradeQueue","q","addEventListener","dequeue","bind","enqueue","requestAnimationFrame","splice","upgrade","mappers","string","number","Number","presence","bool","ParsedElement","conf","observed","attrsAndTypes","maybeType","trim","attrsAndMappers","attrToMapper","fromEntries","templateId","HTMLElement","observedAttributes","keys","parsed","initialized","reflecting","internals","attachInternals","connectedCallback","ownerDocument","readyState","observer","disconnect","MutationObserver","observe","childList","subtree","attributeChangedCallback","oldValue","newValue","mapper","reflect","fn","render","defineProperty","prototype","enumerable","configurable","states","has","flatten","obj","reduce","acc","pre","assign","mutate","raw","checked","Form","form","replaceChildren","async","preventDefault","spinning","submitter","values","spinner","spin","querySelectorAll","hidden","disabled","remoting","errors","spinningUntilError","vs","flattenedKey","CSS","escape","dataset","closest","IGNORED_CHILDREN_SELECTOR","result","path","match","previous","ckey","pkey","isInteger","isArray","providePath","extract","es","fieldErrors","globalErrors","replace","validationTargetsSelector","input","fieldErrorsSelector","innerText","ys","parentElement","getBoundingClientRect","y","scrollY","miny","min","Infinity","scroll","scrollX","SCROLL_OFFSET","INPUT_TEMPLATE","makeInputFragment","firstElementChild","evt","stopPropagation","Input","Select","tsConfig","remote","loadOnce","tsId","loaded","_remote","_unwrappedRemoteLoad","query","hasOwnProperty","qvalue","byId","loader","ts","TomSelect","preload","shouldLoad","loading","on","renderTo","l","getValue","loadCallback","setValue","RadioGroup","radioEls","inputsAndLabels","Spinner"],"mappings":"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"}
1
+ {"version":3,"file":"ful.min.mjs","sources":["../src/encodings.mjs","../src/http-client.mjs","../src/storage.mjs","../src/oauth-authorization-code.mjs","../src/timing.mjs","../src/deferred.mjs","../src/elements/elements.mjs","../src/elements/form.mjs","../src/elements/input.mjs","../src/elements/select.mjs","../src/elements/radio.mjs","../src/elements/spinner.mjs"],"sourcesContent":["\n\nclass Base64 {\n static encode(arrayBuffer, dialect) {\n const d = dialect || Base64.URL_SAFE;\n const len = arrayBuffer.byteLength;\n const view = new Uint8Array(arrayBuffer);\n let res = '';\n for (let i = 0; i < len; i += 3) {\n const v1 = d[view[i] >> 2];\n const v2 = d[((view[i] & 3) << 4) | (view[i + 1] >> 4)];\n const v3 = d[((view[i + 1] & 15) << 2) | (view[i + 2] >> 6)];\n const v4 = d[view[i + 2] & 63];\n res += v1 + v2 + v3 + v4;\n }\n if (len % 3 === 2) {\n res = res.substring(0, res.length - 1);\n } else if (len % 3 === 1) {\n res = res.substring(0, res.length - 2);\n }\n return res;\n }\n static decode(str, dialect) {\n const d = dialect || Base64.URL_SAFE;\n let nbytes = Math.floor(str.length * 0.75);\n for (let i = 0; i !== str.length; ++i) {\n if (str[str.length - i - 1] !== '=') {\n break;\n }\n --nbytes;\n }\n const view = new Uint8Array(nbytes);\n\n let vi = 0;\n let si = 0;\n while (vi < str.length * 0.75) {\n const v1 = d.indexOf(str.charAt(si++));\n const v2 = d.indexOf(str.charAt(si++));\n const v3 = d.indexOf(str.charAt(si++));\n const v4 = d.indexOf(str.charAt(si++));\n view[vi++] = (v1 << 2) | (v2 >> 4);\n view[vi++] = ((v2 & 15) << 4) | (v3 >> 2);\n view[vi++] = ((v3 & 3) << 6) | v4;\n }\n\n return view.buffer;\n }\n}\n\nBase64.STANDARD = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\nBase64.URL_SAFE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';\n\n\nclass Hex {\n static decode(hex) {\n if (hex.length % 2 !== 0) {\n throw new Error(\"invalid length\");\n }\n const lenInBytes = hex.length / 2;\n return new Uint8Array(lenInBytes).map((e, i) => {\n const offset = i * 2;\n const octet = hex.substring(offset, offset + 2);\n return parseInt(octet, 16);\n });\n }\n static encode(bytes, upper) {\n return Array.from(bytes)\n .map(b => b.toString(16))\n .map(b => upper ? b.toUpperCase() : b)\n .map(o => o.padStart(2, 0))\n .join('');\n }\n}\n\nexport { Base64, Hex };","class ContextInterceptor {\n constructor() {\n const context = document.querySelector(\"meta[name='context']\").getAttribute(\"content\");\n this.context = context.endsWith(\"/\") ? context.substring(0, context.length - 1) : context;\n }\n async intercept(request, chain){\n const separator = request.resource.startsWith(\"/\") ? \"\" : \"/\";\n request.resource = this.context + separator + request.resource;\n return await chain.proceed(request);\n }\n}\n\nclass CsrfTokenInterceptor {\n constructor() {\n this.k = document.querySelector(\"meta[name='_csrf_header']\").getAttribute(\"content\");\n this.v = document.querySelector(\"meta[name='_csrf']\").getAttribute(\"content\");\n }\n async intercept(request, chain){\n const headers = new Headers(request.options.headers);\n headers.set(this.k, this.v);\n request.options.headers = headers;\n return await chain.proceed(request);\n }\n}\n\nclass RedirectOnUnauthorizedInterceptor {\n constructor(redirectUri) {\n this.redirectUri = redirectUri;\n }\n async intercept(request, chain){\n const response = await chain.proceed(request);\n if (response.status !== 401) {\n return response;\n }\n window.location.href = this.redirectUri;\n }\n}\n\nclass Failure extends Error {\n static parseProblems(status, text) {\n const def = [{\n type: \"GENERIC_PROBLEM\",\n context: null,\n reason: `${status}: ${text}`,\n details: null\n }];\n try {\n return text ? JSON.parse(text) : def;\n } catch (e) {\n return def;\n }\n }\n static fromResponse(status, text) {\n return new Failure(status, Failure.parseProblems(status, text));\n }\n constructor(status, problems) {\n super(JSON.stringify(problems));\n this.name = `Failure:${status}`;\n this.status = status;\n this.problems = problems;\n }\n}\n\nclass HttpClientBuilder {\n constructor() {\n this.interceptors = [];\n }\n withContext() {\n this.interceptors.push(new ContextInterceptor());\n return this;\n }\n withCsrfToken() {\n this.interceptors.push(new CsrfTokenInterceptor());\n return this;\n }\n withRedirectOnUnauthorized(redirectUri) {\n this.interceptors.push(new RedirectOnUnauthorizedInterceptor(redirectUri));\n return this;\n }\n withInterceptors(...interceptors) {\n this.interceptors.push(...interceptors);\n return this;\n }\n build() {\n const interceptors = this.interceptors;\n return new HttpClient({interceptors});\n }\n}\n\nclass HttpCall {\n async intercept(request, chain){\n return await fetch(request.resource, request.options);\n } \n}\n\nclass HttpInterceptorChain {\n constructor(interceptors, current){\n this.interceptors = interceptors;\n this.current = current;\n }\n async proceed(request){\n const interceptor = this.interceptors[this.current];\n return await interceptor.intercept(request, new HttpInterceptorChain(this.interceptors, this.current + 1));\n }\n}\n\n\nclass HttpClient {\n static builder() {\n return new HttpClientBuilder();\n }\n constructor({interceptors}){\n this.interceptors = interceptors || [];\n }\n async exchange(resource, options) {\n const opts = options || {};\n const interceptors = [...this.interceptors, ...opts.interceptors || [], new HttpCall()];\n const chain = new HttpInterceptorChain(interceptors, 0);\n return await chain.proceed({resource, options: opts});\n }\n async fetch(resource, options) {\n const response = await this.exchange(resource, options);\n if (!response.ok) {\n const message = await response.text();\n throw Failure.fromResponse(response.status, message);\n } \n return response;\n }\n async json(resource, options) {\n try {\n const response = await this.fetch(resource, options);\n const text = await response.text();\n return text ? JSON.parse(text) : undefined;\n } catch (e) {\n if (e instanceof Failure) {\n throw e;\n }\n throw new Failure(0, [{\n type: \"CONNECTION_PROBLEM\",\n context: null,\n reason: e.message,\n details: null\n }]);\n }\n }\n}\n\nfunction jsonRequest(method, body, headers){\n return {\n headers: {\n \"Content-Type\": \"application/json\",\n ...headers\n },\n method: method,\n body: JSON.stringify(body) \n }\n}\nfunction jsonPost(body, headers){\n return jsonRequest('POST', body, headers);\n}\nfunction jsonPut(body, headers){\n return jsonRequest('PUT', body, headers);\n}\nfunction jsonPatch(body, headers){\n return jsonRequest('PATCH', body, headers);\n}\n\n\nexport { HttpClient, Failure, jsonRequest, jsonPost, jsonPut, jsonPatch };\n","\nclass Storage {\n constructor(prefix, storage) {\n this.prefix = prefix;\n this.storage = storage;\n }\n save(k, v) {\n this.storage.setItem(`${this.prefix}-${k}`, JSON.stringify(v));\n }\n load(k) {\n const got = this.storage.getItem(`${this.prefix}-${k}`);\n return got === undefined ? undefined : JSON.parse(got);\n }\n remove(k) {\n this.storage.removeItem(`${this.prefix}-${k}`);\n }\n pop(k) {\n const decoded = this.load(k);\n this.remove(k);\n return decoded;\n }\n}\n\nclass LocalStorage extends Storage {\n constructor(prefix) {\n super(prefix, localStorage);\n }\n}\n\nclass SessionStorage extends Storage {\n constructor(prefix) {\n super(prefix, sessionStorage);\n }\n}\n\nclass VersionedStorage {\n constructor(storage, key, dataSupplier){\n this.storage = storage;\n this.key = key;\n this.dataSupplier = dataSupplier;\n this.cache = null;\n \n }\n async load(revision){\n const saved = this.storage.load(this.key);\n if (!!saved && saved.revision === revision) {\n this.cache = saved.value;\n return;\n }\n const freshData = await this.dataSupplier(revision, this.key);\n this.storage.save(this.key, {\n revision: revision,\n value: freshData\n });\n this.cache = freshData;\n }\n data(){\n return this.cache;\n }\n}\n\n\n\nexport {LocalStorage, SessionStorage, VersionedStorage};","import { Base64 } from \"./encodings.mjs\";\nimport { SessionStorage } from \"./storage.mjs\";\n\n\nclass AuthorizationCodeFlow {\n static forKeycloak(clientId, realmBaseUrl, redirectUri){\n const scope = \"openid profile\";\n return new AuthorizationCodeFlow(clientId, scope, {\n auth: new URL(\"protocol/openid-connect/auth\", realmBaseUrl),\n token: new URL(\"protocol/openid-connect/token\", realmBaseUrl),\n logout: new URL(\"protocol/openid-connect/logout\", realmBaseUrl),\n registration: new URL(\"protocol/openid-connect/registrations\", realmBaseUrl),\n redirect: redirectUri\n }); \n }\n constructor(clientId, scope, {auth, token, registration, logout, redirect}) {\n this.storage = new SessionStorage(clientId);\n this.clientId = clientId;\n this.scope = scope;\n this.uri = {auth, token, registration, logout, redirect};\n }\n async action(uri, additionalParams){\n const pkceVerifier = Base64.encode(crypto.getRandomValues(new Uint8Array(32)).buffer);\n const pkceChallenge = Base64.encode(await crypto.subtle.digest(\"SHA-256\", new TextEncoder().encode(pkceVerifier)));\n const state = this.clientId + Base64.encode(crypto.getRandomValues(new Uint8Array(16)).buffer);\n this.storage.save(AuthorizationCodeFlow.PKCE_AND_STATE_KEY, {\n state: state,\n verifier: pkceVerifier\n });\n const url = new URL(uri);\n url.searchParams.set(\"client_id\", this.clientId);\n url.searchParams.set(\"redirect_uri\", this.uri.redirect);\n url.searchParams.set(\"response_type\", 'code');\n url.searchParams.set(\"scope\", this.scope);\n url.searchParams.set(\"state\", state);\n url.searchParams.set(\"code_challenge\", pkceChallenge);\n url.searchParams.set(\"code_challenge_method\", 'S256');\n Object.entries(additionalParams || {}).forEach(kv => {\n url.searchParams.set(kv[0], kv[1]);\n });\n window.location = url;\n }\n async registration(additionalParams){\n await this.action(this.uri.registration, additionalParams);\n }\n async applicationInitiatedAction(kcAction){\n await this.action(this.uri.auth, {\n kc_action: kcAction\n });\n }\n async _tokenExchange(code, state) {\n window.history.replaceState('', \"\", this.uri.redirect);\n const stateAndVerifier = this.storage.pop(AuthorizationCodeFlow.PKCE_AND_STATE_KEY);\n if (stateAndVerifier.state !== state) {\n throw new Error(\"State mismatch\");\n }\n const response = await fetch(this.uri.token, {\n method: \"POST\",\n headers: {\n \"Content-Type\": 'application/x-www-form-urlencoded'\n },\n body: new URLSearchParams([\n [\"client_id\", this.clientId],\n [\"code\", code],\n [\"grant_type\", \"authorization_code\"],\n [\"code_verifier\", stateAndVerifier.verifier],\n [\"state\", stateAndVerifier.state],\n [\"redirect_uri\", this.uri.redirect]\n ])\n });\n if (!response.ok) {\n const text = await response.text();\n throw new Error(\"Error:\" + response.status + \": \" + text);\n }\n const token = await response.json();\n return new AuthorizationCodeFlowSession(this.clientId, token, this.uri);\n }\n async ensureLoggedIn() {\n const url = new URL(window.location.href);\n const code = url.searchParams.get(\"code\");\n if (code && this.storage.load(AuthorizationCodeFlow.PKCE_AND_STATE_KEY)) {\n //if callback from keycloak and we have our state still stored\n const state = url.searchParams.get(\"state\");\n return await this._tokenExchange(code, state);\n }\n //if not authorized\n await this.action(this.uri.auth, {});\n return null;\n }\n}\nAuthorizationCodeFlow.PKCE_AND_STATE_KEY = \"state-and-verifier\";\n\nclass AuthorizationCodeFlowSession {\n static parseToken(token) {\n const [rawHeader, rawPayload, signature] = token.split(\".\");\n const ut8decoder = new TextDecoder(\"utf-8\");\n return {\n header: JSON.parse(ut8decoder.decode(Base64.decode(rawHeader, Base64.STANDARD))),\n payload: JSON.parse(ut8decoder.decode(Base64.decode(rawPayload, Base64.STANDARD))),\n signature: signature\n };\n } \n constructor(clientId, t, {token, logout, redirect}) {\n this.clientId = clientId;\n this.token = t;\n this.accessToken = AuthorizationCodeFlowSession.parseToken(t.access_token);\n this.refreshToken = AuthorizationCodeFlowSession.parseToken(t.refresh_token);\n this.uri = { token, logout, redirect }\n this.refreshCallback = null;\n }\n onRefresh(callback) {\n this.refreshCallback = callback;\n }\n async refresh() {\n const response = await fetch(this.uri.token, {\n method: \"POST\",\n headers: {\n \"Content-Type\": 'application/x-www-form-urlencoded'\n },\n body: new URLSearchParams([\n [\"client_id\", this.clientId],\n [\"grant_type\", \"refresh_token\"],\n [\"refresh_token\", this.token.refresh_token]\n ])\n });\n if (!response.ok) {\n throw new Error(\"Error:\" + response.status + \": \" + response.text());\n }\n const token = await response.json();\n this.token = token;\n this.accessToken = AuthorizationCodeFlowSession.parseToken(token.access_token);\n this.refreshToken = AuthorizationCodeFlowSession.parseToken(token.refresh_token);\n if (this.refreshCallback) {\n this.refreshCallback(this.token, this.accessToken, this.refreshToken);\n }\n }\n shouldBeRefreshed(gracePeriod) {\n const now = new Date().getTime();\n const refreshTokenExpiresAt = this.refreshToken.payload.exp * 1000;\n const expired = now > refreshTokenExpiresAt;\n const shouldRefresh = now - gracePeriod > refreshTokenExpiresAt;\n return !expired && shouldRefresh;\n }\n async refreshIf(gracePeriod) {\n if (!this.shouldBeRefreshed(gracePeriod)) {\n return;\n }\n await this.refresh();\n }\n logout() {\n const url = new URL(this.uri.logout);\n url.searchParams.set(\"post_logout_redirect_uri\", this.uri.redirect);\n url.searchParams.set(\"id_token_hint\", this.token.id_token);\n window.location = url;\n }\n\n bearerToken() {\n return `Bearer ${this.token.access_token}`;\n }\n \n interceptor(gracePeriodBefore, gracePeriodAfter){\n return new AuthorizationCodeFlowInterceptor(this, gracePeriodBefore, gracePeriodAfter); \n }\n}\n\nclass AuthorizationCodeFlowInterceptor {\n constructor(session, gracePeriodBefore, gracePeriodAfter) {\n this.session = session;\n this.gracePeriodBefore = gracePeriodBefore || 2000;\n this.gracePeriodAfter = gracePeriodAfter || 30000;\n }\n async intercept(request, chain) {\n await this.session.refreshIf(this.gracePeriodBefore);\n const headers = new Headers(request.options.headers);\n headers.set(\"Authorization\", this.session.bearerToken());\n request.options.headers = headers;\n const response = await chain.proceed(request);\n await this.session.refreshIf(this.gracePeriodAfter);\n return response;\n }\n}\n\n\nexport {AuthorizationCodeFlow, AuthorizationCodeFlowSession, AuthorizationCodeFlowInterceptor };","\nconst timing = {\n sleep(ms) {\n return new Promise(resolve => setTimeout(resolve, ms));\n },\n DEBOUNCE_DEFAULT: 0,\n DEBOUNCE_IMMEDIATE: 1,\n debounce(timeoutMs, func, options) {\n let tid = null;\n let args = [];\n let previousTimestamp = 0;\n let opts = options || timing.DEBOUNCE_DEFAULT;\n\n const later = () => {\n const elapsed = new Date().getTime() - previousTimestamp;\n if (timeoutMs > elapsed) {\n tid = setTimeout(later, timeoutMs - elapsed);\n return;\n }\n tid = null;\n if (opts !== timing.DEBOUNCE_IMMEDIATE) {\n func(...args);\n }\n // This check is needed because `func` can recursively invoke `debounced`.\n if (tid === null) {\n args = [];\n }\n };\n\n return function () {\n args = arguments;\n previousTimestamp = new Date().getTime();\n if (tid === null) {\n tid = setTimeout(later, timeoutMs);\n if (opts === timing.DEBOUNCE_IMMEDIATE) {\n func(...args);\n }\n }\n };\n },\n THROTTLE_DEFAULT: 0,\n THROTTLE_NO_LEADING: 1,\n THROTTLE_NO_TRAILING: 2,\n throttle(timeoutMs, func, options) {\n let tid = null;\n let args = [];\n let previousTimestamp = 0;\n let opts = options || timing.THROTTLE_DEFAULT;\n\n const later = () => {\n previousTimestamp = (opts & timing.THROTTLE_NO_LEADING) ? 0 : new Date().getTime();\n tid = null;\n func(...args);\n if (tid === null) {\n args = [];\n }\n };\n\n return function () {\n const now = new Date().getTime();\n if (!previousTimestamp && (opts & timing.THROTTLE_NO_LEADING)) {\n previousTimestamp = now;\n }\n const remaining = timeoutMs - (now - previousTimestamp);\n args = arguments;\n if (remaining <= 0 || remaining > timeoutMs) {\n if (tid !== null) {\n clearTimeout(tid);\n tid = null;\n }\n previousTimestamp = now;\n func(...args);\n if (tid === null) {\n args = [];\n }\n } else if (tid === null && !(opts & timing.THROTTLE_NO_TRAILING)) {\n tid = setTimeout(later, remaining);\n }\n };\n\n }\n};\n\n\nexport { timing };","class Deferred {\n constructor() {\n this.promise = new Promise((resolve, reject) => {\n this.reject = reject;\n this.resolve = resolve;\n });\n }\n}\n\n\nexport { Deferred }","class Fragments {\n /**\n * \n * @param {...string} html \n * @returns \n */\n static fromHtml(...html) {\n const el = document.createElement(\"template\");\n el.innerHTML = html.join(\"\");\n return el.content;\n }\n /**\n * \n * @param {DocumentFragment} fragment \n * @returns \n */\n static toHtml(fragment) {\n var el = document.createElement(\"template\");\n el.content.appendChild(fragment);\n return el.innerHTML;\n }\n /**\n * \n * @param {...Node} nodes \n * @returns \n */\n static from(...nodes) {\n const fragment = new DocumentFragment();\n fragment.append(...nodes);\n return fragment;\n }\n /**\n * \n * @param {HTMLElement} el \n * @returns \n */\n static fromChildNodes(el) {\n const fragment = new DocumentFragment();\n fragment.append(...el.childNodes);\n return fragment;\n }\n}\n\nclass Attributes {\n static id = 0;\n /**\n * \n * @param {string} prefix \n * @returns \n */\n static uid(prefix) {\n return `${prefix}-${++Attributes.id}`;\n }\n /**\n * \n * @param {HTMLElement} el \n * @param {string} k \n * @param {string} v \n * @returns \n */\n static defaultValue(el, k, v) {\n if (!el.hasAttribute(k)) {\n el.setAttribute(k, v);\n }\n return el.getAttribute(k);\n }\n /**\n * \n * @param {string} prefix \n * @param {HTMLElement} from \n * @param {HTMLElement} to \n */\n static forward(prefix, from, to) {\n from.getAttributeNames()\n .filter(a => a.startsWith(prefix))\n .forEach(a => {\n const target = a.substring(prefix.length);\n if (target === 'class') {\n to.classList.add(...from.getAttribute(prefix + \"class\").split(\" \").filter(a => a.length));\n return;\n }\n to.setAttribute(target, from.getAttribute(a))\n });\n }\n /**\n * \n * @param {HTMLElement} el \n * @param {stirng} attr \n * @param {boolean} value \n */\n static toggle(el, attr, value) {\n if (value) {\n el.setAttribute(attr, '');\n } else {\n el.removeAttribute(attr);\n }\n }\n static flip(el, attr) {\n if (el.hasAttribute(attr)) {\n el.removeAttribute(attr);\n } else {\n el.setAttribute(attr, '');\n }\n }\n\n}\n\nclass LightSlots {\n /**\n * \n * @param {HTMLElement} el \n * @returns the slots\n */\n static from(el) {\n const namedSlots = Array.from(el.childNodes)\n .filter(el => el.matches && el.matches('[slot]'))\n .map(el => {\n el.remove();\n const slot = el.getAttribute(\"slot\");\n el.removeAttribute(\"slot\");\n return [slot, el];\n });\n const slots = {};\n slots.default = new DocumentFragment();\n slots.default.append(...el.childNodes);\n for(const [name,el] of namedSlots){\n if(!(name in slots)){\n slots[name] = new DocumentFragment();\n }\n slots[name].append(el);\n }\n return slots;\n }\n}\n\nclass Nodes {\n static isParsed(el) {\n for (var c = el; c; c = c.parentNode) {\n if (c.nextSibling) {\n return true;\n }\n }\n return false;\n }\n}\n\nclass TemplatesRegistry {\n #idToFragment = {};\n #idToTemplate = {};\n #ec;\n put(k, fragment) {\n if (this.#ec) {\n this.#idToTemplate[k] = Template.fromFragment(fragment, ec);\n return;\n }\n this.#idToFragment[k] = fragment;\n }\n get(k) {\n if (!this.#ec) {\n throw new Error(\"TemplatesRegistry is not configured\");\n }\n const tpl = this.#idToTemplate[k];\n if (!tpl) {\n throw new Error(`missing template: '${k}'`);\n }\n return tpl;\n }\n configure(ec, ...data) {\n this.#ec = ec;\n for (const [k, fragment] of Object.entries(this.#idToFragment)) {\n delete this.#idToFragment[k];\n this.#idToTemplate[k] = ftl.Template.fromFragment(fragment, ec, ...data);\n }\n }\n}\n\n\nclass ElementsRegistry {\n #templates;\n #tagToclass;\n #configured;\n #id = 0;\n constructor() {\n this.#templates = new TemplatesRegistry();\n this.#tagToclass = {};\n }\n defineTemplate(html) {\n if (html === null || html === undefined) {\n return undefined;\n }\n const name = `unnamed-${++this.#id}`;\n this.#templates.put(name, Fragments.fromHtml(html));\n return name;\n }\n define(tag, klass) {\n if (!this.#configured) {\n this.#tagToclass[tag] = klass;\n return this;\n }\n customElements.define(tag, klass);\n return this;\n }\n configure(ec, ...data) {\n this.#templates.configure(ec, ...data);\n for (const [tag, klass] of Object.entries(this.#tagToclass)) {\n customElements.define(tag, klass);\n delete this.#tagToclass[tag];\n }\n this.#configured = true;\n }\n template(k) {\n if (k === null || k === undefined) {\n return undefined;\n }\n return this.#templates.get(k);\n }\n}\n\nconst elements = new ElementsRegistry();\n\n\nclass UpgradeQueue {\n #q = [];\n constructor() {\n document.addEventListener('DOMContentLoaded', this.dequeue.bind(this));\n }\n enqueue(el) {\n if (!this.#q.length) {\n requestAnimationFrame(this.dequeue.bind(this));\n }\n this.#q.push(el);\n }\n dequeue() {\n this.#q.splice(0).forEach(el => el.upgrade());\n }\n}\n\nconst upgradeQueue = new UpgradeQueue();\n\nconst mappers = {\n 'string': attr => attr,\n 'number': attr => attr === null ? null : Number(attr),\n 'presence': attr => attr !== null,\n 'state': attr => attr !== null,\n 'bool': attr => attr === 'true',\n 'json': attr => JSON.parse(attr)\n};\n\nconst ParsedElement = (conf) => {\n const { observed, template, slots } = conf || {};\n\n const attrsAndTypes = (observed || []).map(a => {\n const [attr, maybeType] = a.split(\":\");\n const type = maybeType?.trim() || 'string';\n if (!(type in mappers)) {\n throw new Error(`unsupported attribute type: ${type}`);\n }\n return [attr.trim(), type];\n });\n\n const attrsAndMappers = attrsAndTypes.map(([attr, type]) => [attr, mappers[type]]);\n\n const attrToMapper = Object.fromEntries(attrsAndMappers);\n\n const templateId = elements.defineTemplate(template);\n\n const k = class extends HTMLElement {\n static get observedAttributes() {\n return Object.keys(attrToMapper);\n }\n #parsed;\n #initialized;\n #reflecting;\n #internals;\n constructor(...args) {\n super(...args);\n this.#internals = this.attachInternals();\n }\n get initialized() {\n return this.#initialized;\n }\n get internals() {\n return this.#internals;\n }\n connectedCallback() {\n if (this.#parsed) {\n return;\n }\n if (this.ownerDocument.readyState === 'complete' || Nodes.isParsed(this)) {\n upgradeQueue.enqueue(this);\n return;\n }\n this.ownerDocument.addEventListener('DOMContentLoaded', () => {\n observer.disconnect();\n upgradeQueue.enqueue(this);\n });\n const observer = new MutationObserver(() => {\n if (!Nodes.isParsed(this)) {\n return;\n }\n observer.disconnect();\n upgradeQueue.enqueue(this);\n });\n observer.observe(this.parentNode, { childList: true, subtree: true });\n }\n attributeChangedCallback(attr, oldValue, newValue) {\n if (!this.#parsed || oldValue === newValue) {\n return;\n }\n if (this.#reflecting) {\n return;\n }\n const mapper = attrToMapper[attr];\n this[attr] = mapper(newValue);\n }\n reflect(fn) {\n this.#reflecting = true;\n try {\n fn();\n } finally {\n this.#reflecting = false;\n }\n }\n async upgrade() {\n if (this.#parsed) {\n return;\n }\n this.#parsed = true;\n await this.render(elements.template(templateId), slots ? LightSlots.from(this) : undefined);\n\n for (const [attr, mapper] of attrsAndMappers) {\n if (this.hasAttribute(attr)) {\n this[attr] = mapper(this.getAttribute(attr));\n }\n }\n this.#initialized = true;\n }\n };\n\n for (const [attr, type] of attrsAndTypes.filter(([a, t]) => t === 'state')) {\n Object.defineProperty(k.prototype, attr, {\n enumerable: true,\n configurable: true,\n get() {\n return this.internals.states.has(`--${attr}`);\n },\n set(value) {\n this.internals.states[value ? 'add' : 'delete'](`--${attr}`);\n this.reflect(() => Attributes.toggle(this, attr, value));\n }\n });\n }\n\n return k;\n}\n\nexport { Fragments, Attributes, LightSlots, Nodes, TemplatesRegistry, ElementsRegistry, elements, ParsedElement };\n","/* global Infinity, CSS */\n\nimport { Failure } from \"../http-client.mjs\";\nimport { ParsedElement } from \"./elements.mjs\"\n\nfunction flatten(obj, prefix) {\n return Object.keys(obj).reduce((acc, k) => {\n const pre = prefix.length ? prefix + '.' : '';\n if (typeof obj[k] === 'object' && obj[k] !== null) {\n Object.assign(acc, flatten(obj[k], pre + k));\n } else {\n acc[pre + k] = obj[k];\n }\n return acc;\n }, {});\n}\n\nfunction providePath(result, path, value) {\n const keys = path.split(\".\").map((k) => k.match(/^[0-9]+$/) ? +k : k);\n let current = result;\n let previous = null;\n for (let i = 0; ; ++i) {\n const ckey = keys[i];\n const pkey = keys[i - 1];\n if (Number.isInteger(ckey) && !Array.isArray(current)) {\n if (previous !== null) {\n previous[pkey] = current = [];\n } else {\n result = current = [];\n }\n }\n if (i === keys.length - 1) {\n //when value is undefined we only want to define the property if it's not defined \n current[ckey] = value !== undefined ? value : (ckey in current ? current[ckey] : null);\n return result;\n }\n if (current[ckey] === undefined) {\n current[ckey] = {};\n }\n previous = current;\n current = current[ckey];\n }\n}\n\nfunction extract(el) {\n if (el.getAttribute('type') === 'radio') {\n if (!el.checked) {\n return undefined;\n }\n return el.dataset['fulBindType'] === 'boolean' ? el.value === 'true' : el.value;\n }\n if (el.getAttribute('type') === 'checkbox') {\n return el.checked;\n }\n if (el.dataset['fulBindType'] === 'boolean') {\n return !el.value ? null : el.value === 'true';\n }\n if (el.tagName === 'INPUT' || el.tagName === 'SELECT'){\n return el.value === '' || el.value === undefined ? null : el.value; \n }\n return el.value;\n}\n\nfunction mutate(el, raw) {\n if (el.getAttribute('type') === 'radio') {\n el.checked = el.getAttribute('value') === raw;\n return;\n }\n if (el.getAttribute('type') === 'checkbox') {\n el.checked = raw;\n return;\n }\n el.value = raw;\n}\n\nclass Form extends ParsedElement() {\n static IGNORED_CHILDREN_SELECTOR = '.d-none, [hidden]';\n static SCROLL_OFFSET = 50;\n static INVALID_CLASS = 'is-invalid';\n render() {\n const form = document.createElement('form');\n form.replaceChildren(...this.childNodes);\n form.addEventListener('submit', async (e) => {\n e.preventDefault();\n this.spinning(async () => {\n await this.submitter?.(this.values, this);\n });\n })\n this.replaceChildren(form);\n }\n spinner(spin) {\n this.querySelectorAll('ful-spinner').forEach(el => el.hidden = !spin)\n this.querySelectorAll('[type=submit],[type=reset]').forEach(el => el.disabled = spin)\n }\n async remoting(fn) {\n try {\n await fn();\n } catch (e) {\n if (e instanceof Failure) {\n this.errors = e.problems;\n }\n throw e;\n }\n }\n async spinningUntilError(fn) {\n this.spinner(true)\n try {\n await this.remoting(fn);\n } catch(e) {\n this.spinner(false);\n throw e;\n }\n }\n async spinning(fn) {\n this.spinner(true)\n try {\n await this.remoting(fn);\n } finally {\n this.spinner(false);\n }\n }\n set values(vs) {\n for (const [flattenedKey, value] of Object.entries(flatten(vs, ''))) {\n this.querySelectorAll(`[name='${CSS.escape(flattenedKey)}']`).forEach(el => mutate(el, value));\n }\n }\n get values() {\n return Array.from(this.querySelectorAll('[name]'))\n .filter((el) => {\n if (el.dataset['fulBindInclude'] === 'never') {\n return false;\n }\n return el.dataset['fulBindInclude'] === 'always' || el.closest(Form.IGNORED_CHILDREN_SELECTOR) === null;\n })\n .reduce((result, el) => {\n return providePath(result, el.getAttribute('name'), extract(el));\n }, {});\n }\n set errors(es) {\n const fieldErrors = es.filter((e) => e.type === 'FIELD_ERROR' || e.type === 'INVALID_FORMAT');\n const globalErrors = es.filter((e) => e.type !== 'FIELD_ERROR' && e.type !== 'INVALID_FORMAT');\n this.querySelectorAll(`.${Form.INVALID_CLASS}`).forEach(el => el.classList.remove(Form.INVALID_CLASS));\n this.querySelectorAll(\"ful-errors\").forEach(el => {\n el.replaceChildren();\n el.setAttribute('hidden', '');\n });\n fieldErrors.forEach((e) => {\n const name = e.context.replace(\"[\", \".\").replace(\"].\", \".\");\n const validationTargetsSelector = `[name='${CSS.escape(name)}'] [ful-validation-target],[name='${CSS.escape(name)}']:not(:has([ful-validation-target]))`;\n this.querySelectorAll(validationTargetsSelector).forEach(input => input.classList.add(Form.INVALID_CLASS));\n const fieldErrorsSelector = `ful-field-error[field='${CSS.escape(name)}']`;\n this.querySelectorAll(fieldErrorsSelector).forEach(el => el.innerText = e.reason);\n });\n this.querySelectorAll(\"ful-errors\").forEach(el => {\n el.innerText = globalErrors.map(e => e.reason).join(\"\\n\");\n if (globalErrors.length !== 0) {\n el.removeAttribute('hidden');\n }\n });\n if (!this.hasAttribute('scroll-on-error')) {\n return;\n }\n const ys = Array.from(this.querySelectorAll(`[ful-validated-field]:has(.${Form.INVALID_CLASS}) ful-field-error`))\n .map(el => el.parentElement ? el.parentElement : el)\n .map(el => el.getBoundingClientRect().y + window.scrollY);\n const miny = Math.min(...ys);\n if (miny !== Infinity) {\n window.scroll(window.scrollX, miny > Form.SCROLL_OFFSET ? miny - Form.SCROLL_OFFSET : 0);\n }\n }\n}\n\nexport { Form };\n","import { Attributes, ParsedElement } from \"./elements.mjs\"\n\n\nconst INPUT_TEMPLATE = `\n<div ful-validated-field>\n <label data-tpl-for=\"id\" class=\"form-label\">{{{{ slots.default }}}}</label>\n <div class=\"input-group\">\n <span data-tpl-if=\"slots.ibefore\" class=\"input-group-text\">{{{{ slots.ibefore }}}}</span>\n <div data-tpl-if=\"slots.before\" data-tpl-remove=\"tag\">{{{{ slots.before }}}}</div>\n {{{{ slots.input }}}} \n <div data-tpl-if=\"slots.after\" data-tpl-remove=\"tag\">{{{{ slots.after }}}}</div>\n <span data-tpl-if=\"slots.iafter\" class=\"input-group-text\">{{{{ slots.iafter }}}}</span>\n </div>\n <ful-field-error data-tpl-if=\"name\" data-tpl-field=\"name\"></ful-field-error>\n</div>\n`;\n\nconst makeInputFragment = (el, template, slots) => {\n const input = el.input = slots.input = slots.input?.firstElementChild || (() => {\n const el = document.createElement(\"input\")\n el.classList.add(\"form-control\");\n return el;\n })();\n input.setAttribute('ful-validation-target', '');\n input.addEventListener('change', (evt) => {\n evt.stopPropagation();\n el.dispatchEvent(new CustomEvent('change', { \n bubbles: true, \n cancelable: false, \n detail: {\n value: el.value\n }\n }));\n });\n const id = input.getAttribute('id') || el.getAttribute('input-id') || Attributes.uid('ful-input');\n Attributes.forward('input-', el, slots.input)\n Attributes.defaultValue(slots.input, \"id\", id);\n Attributes.defaultValue(slots.input, \"type\", \"text\");\n Attributes.defaultValue(slots.input, \"placeholder\", \" \");\n const name = el.getAttribute('name');\n return template.render(el, { id, name, slots });\n}\n\nclass Input extends ParsedElement({\n observed: ['value'],\n slots: true,\n template: INPUT_TEMPLATE\n}){\n render(template, slots) {\n const fragment = makeInputFragment(this, template, slots);\n this.replaceChildren(fragment);\n }\n get value() {\n return this.input.value;\n }\n set value(value) {\n this.input.value = value;\n }\n}\n\nexport { makeInputFragment, INPUT_TEMPLATE, Input };\n","import { Fragments, Attributes, ParsedElement } from \"./elements.mjs\"\n\n/**\n * <script src=\"tom-select.complete.js\"></script>\n * <link href=\"tom-select.bootstrap5.css\" rel=\"stylesheet\" />\n */\n\nclass Select extends ParsedElement({\n observed: [\"value\"],\n slots: true,\n template: `\n <div ful-validated-field>\n <label data-tpl-for=\"tsId\" class=\"form-label\">{{{{ slots.default }}}}</label>\n {{{{ input }}}}\n <div class=\"input-group\">\n <span data-tpl-if=\"slots.ibefore\" class=\"input-group-text\">{{{{ slots.ibefore }}}}</span>\n <div data-tpl-if=\"slots.before\" data-tpl-remove=\"tag\">{{{{ slots.before }}}}</div>\n {{{{ slots.input }}}} \n <div data-tpl-if=\"slots.after\" data-tpl-remove=\"tag\">{{{{ slots.after }}}}</div>\n <span data-tpl-if=\"slots.iafter\" class=\"input-group-text\">{{{{ slots.iafter }}}}</span>\n </div>\n <ful-field-error data-tpl-if=\"name\" data-tpl-field=\"name\"></ful-field-error>\n </div>\n `\n}) {\n constructor(tsConfig) {\n super();\n this.tsConfig = tsConfig;\n }\n render(template, slots) {\n const type = this.getAttribute(\"type\") || 'local';\n const remote = type != 'local';\n const loadOnce = this.getAttribute('load') != 'always';\n const name = this.getAttribute('name');\n const input = slots.input = slots.input?.firstElementChild || (() => {\n return document.createElement(\"select\");\n })();\n input.setAttribute('ful-validation-target', '');\n\n const id = input.getAttribute('id') || this.getAttribute('input-id') || Attributes.uid('ful-select');\n const tsId = `${id}-ts-control`;\n Attributes.forward('input-', this, input)\n Attributes.defaultValue(input, \"id\", id);\n Attributes.defaultValue(input, \"placeholder\", \" \");\n\n //tomselect needs the input to have a parent.\n //se we move the input to a fragment\n slots.input = Fragments.from(input);\n\n this.loaded = !remote;\n\n const tsDefaultConfig = {\n render: {\n loading: () => '<ful-spinner class=\"centered p-2\"></ful-spinner>'\n }\n }\n\n this._remote = remote;\n // we need to await this load in setValue when remote is configured and the option\n // is not loaded yet.\n // tomselect settings.load does not retun a promise as it wraps the configured load function\n // with a debouncer\n this._unwrappedRemoteLoad = async (query, callback) => {\n\n if (!remote || remote && loadOnce && this.loaded) {\n callback();\n return;\n }\n const type = query && query.hasOwnProperty('byId') ? 'id' : 'query';\n const qvalue = type === 'id' ? query.byId : query;\n const data = await (this.#loader ? this.#loader(qvalue, type) : []);\n if (type !== 'id') {\n this.loaded = true;\n }\n callback(data);\n };\n this.ts = new TomSelect(input, Object.assign(remote ? {\n preload: 'focus',\n load: this._unwrappedRemoteLoad,\n shouldLoad: (query) => this.shouldLoad ? this.shouldLoad(query) : true\n } : {}, tsDefaultConfig, this.tsConfig));\n this.ts.on('change', value => {\n this.dispatchEvent(new CustomEvent('change', { \n bubbles: true, \n cancelable: false, \n detail: {\n value: this.value\n }\n }));\n });\n //we remove the input to move it\n input.addEventListener('change', (evt) => {\n evt.stopPropagation();\n });\n input.remove();\n template.renderTo(this, { id, tsId, name, input, slots });\n }\n #loader;\n set loader(l) {\n this.#loader = l;\n // loader can be configured later so we load now\n if (this.hasAttribute('value')) {\n this.value = this.getAttribute(\"value\");\n }\n }\n get value() {\n const v = this.ts.getValue();\n return v === '' ? null : v;\n }\n set value(value) {\n (async () => {\n if (this._remote) {\n await this._unwrappedRemoteLoad({ byId: value }, this.ts.loadCallback.bind(this.ts));\n }\n const silent = true;\n this.ts.setValue(value, silent);\n })();\n }\n}\n\nexport { Select };\n","import { Attributes, Fragments, ParsedElement } from \"./elements.mjs\"\n\nclass RadioGroup extends ParsedElement({\n observed: ['value', 'disabled:state'],\n slots: true,\n template: `\n <fieldset ful-validated-field>\n <legend class=\"form-label\">\n {{{{ slots.default }}}}\n </legend>\n <header data-tpl-if=\"slots.header\">\n {{{{ slots.header }}}}\n </header>\n <section>\n <div class=\"label-wrapper\" data-tpl-each=\"inputsAndLabels\" data-tpl-var=\"ial\">\n <label>\n {{{{ ial[0] }}}}\n {{{{ ial[1] }}}}\n </label>\n </div>\n </section>\n <ful-field-error data-tpl-if=\"name\" data-tpl-field=\"name\"></ful-field-error>\n <footer data-tpl-if=\"slots.footer\">\n {{{{ slots.footer }}}}\n </footer>\n </fieldset>\n `\n}) {\n render(template, slots) {\n const name = this.getAttribute('name') || Attributes.uid('ful-radiogroup');\n const radioEls = Array.from(slots.default.querySelectorAll('ful-radio'));\n const inputsAndLabels = radioEls.map(el => {\n const input = document.createElement('input');\n input.setAttribute('type', 'radio');\n Attributes.forward('input-', this, input);\n Attributes.forward('', el, input);\n input.setAttribute('name', `${name}-ignore`);\n input.setAttribute('ful-validation-target', '');\n input.dataset['fulBindInclude'] = 'never';\n input.addEventListener('change', evt => {\n evt.stopPropagation();\n //change is not cancelable\n this.dispatchEvent(new CustomEvent('change', { \n bubbles: true, \n cancelable: false, \n detail: {\n value: this.value\n }\n })); \n }); \n const label = Fragments.fromChildNodes(el);\n return [input, label];\n });\n\n radioEls.forEach(el => el.remove());\n template.renderTo(this, {name, slots, inputsAndLabels});\n }\n get value() {\n const checked = this.querySelector('input[type=radio]:checked');\n return checked ? checked.value : null;\n }\n set value(value) {\n this.querySelector(`input[type=radio][value=${CSS.escape(value)}]`).checked = true;\n }\n}\n\n\nexport { RadioGroup };","import { ParsedElement } from \"./elements.mjs\"\n\nclass Spinner extends ParsedElement({\n slots: true,\n template: `\n <div class=\"ful-spinner-wrapper\">\n <div class=\"ful-spinner-text\">{{{{ slots.default }}}}</div>\n <div class=\"ful-spinner-icon\"></div>\n </div>\n `\n}) {\n render(template, slots) {\n template.renderTo(this, { slots });\n }\n}\n\nexport { Spinner };"],"names":["Base64","encode","arrayBuffer","dialect","d","URL_SAFE","len","byteLength","view","Uint8Array","res","i","substring","length","decode","str","nbytes","Math","floor","vi","si","v1","indexOf","charAt","v2","v3","v4","buffer","STANDARD","Hex","hex","Error","lenInBytes","map","e","offset","octet","parseInt","bytes","upper","Array","from","b","toString","toUpperCase","o","padStart","join","ContextInterceptor","constructor","context","document","querySelector","getAttribute","this","endsWith","intercept","request","chain","separator","resource","startsWith","proceed","CsrfTokenInterceptor","k","v","headers","Headers","options","set","RedirectOnUnauthorizedInterceptor","redirectUri","response","status","window","location","href","Failure","parseProblems","text","def","type","reason","details","JSON","parse","fromResponse","problems","super","stringify","name","HttpClientBuilder","interceptors","withContext","push","withCsrfToken","withRedirectOnUnauthorized","withInterceptors","build","HttpClient","HttpCall","fetch","HttpInterceptorChain","current","interceptor","builder","exchange","opts","ok","message","json","undefined","jsonRequest","method","body","jsonPost","jsonPut","jsonPatch","Storage","prefix","storage","save","setItem","load","got","getItem","remove","removeItem","pop","decoded","LocalStorage","localStorage","SessionStorage","sessionStorage","VersionedStorage","key","dataSupplier","cache","revision","saved","value","freshData","data","AuthorizationCodeFlow","forKeycloak","clientId","realmBaseUrl","auth","URL","token","logout","registration","redirect","scope","uri","action","additionalParams","pkceVerifier","crypto","getRandomValues","pkceChallenge","subtle","digest","TextEncoder","state","PKCE_AND_STATE_KEY","verifier","url","searchParams","Object","entries","forEach","kv","applicationInitiatedAction","kcAction","kc_action","_tokenExchange","code","history","replaceState","stateAndVerifier","URLSearchParams","AuthorizationCodeFlowSession","ensureLoggedIn","get","parseToken","rawHeader","rawPayload","signature","split","ut8decoder","TextDecoder","header","payload","t","accessToken","access_token","refreshToken","refresh_token","refreshCallback","onRefresh","callback","refresh","shouldBeRefreshed","gracePeriod","now","Date","getTime","refreshTokenExpiresAt","exp","refreshIf","id_token","bearerToken","gracePeriodBefore","gracePeriodAfter","AuthorizationCodeFlowInterceptor","session","timing","sleep","ms","Promise","resolve","setTimeout","DEBOUNCE_DEFAULT","DEBOUNCE_IMMEDIATE","debounce","timeoutMs","func","tid","args","previousTimestamp","later","elapsed","arguments","THROTTLE_DEFAULT","THROTTLE_NO_LEADING","THROTTLE_NO_TRAILING","throttle","remaining","clearTimeout","Deferred","promise","reject","Fragments","fromHtml","html","el","createElement","innerHTML","content","toHtml","fragment","appendChild","nodes","DocumentFragment","append","fromChildNodes","childNodes","Attributes","static","uid","id","defaultValue","hasAttribute","setAttribute","forward","to","getAttributeNames","filter","a","target","classList","add","toggle","attr","removeAttribute","flip","LightSlots","namedSlots","matches","slot","slots","default","Nodes","isParsed","c","parentNode","nextSibling","TemplatesRegistry","idToFragment","idToTemplate","ec","put","Template","fromFragment","tpl","configure","ftl","ElementsRegistry","templates","tagToclass","configured","defineTemplate","define","tag","klass","customElements","template","elements","upgradeQueue","q","addEventListener","dequeue","bind","enqueue","requestAnimationFrame","splice","upgrade","mappers","string","number","Number","presence","bool","ParsedElement","conf","observed","attrsAndTypes","maybeType","trim","attrsAndMappers","attrToMapper","fromEntries","templateId","HTMLElement","observedAttributes","keys","parsed","initialized","reflecting","internals","attachInternals","connectedCallback","ownerDocument","readyState","observer","disconnect","MutationObserver","observe","childList","subtree","attributeChangedCallback","oldValue","newValue","mapper","reflect","fn","render","defineProperty","prototype","enumerable","configurable","states","has","flatten","obj","reduce","acc","pre","assign","mutate","raw","checked","Form","form","replaceChildren","async","preventDefault","spinning","submitter","values","spinner","spin","querySelectorAll","hidden","disabled","remoting","errors","spinningUntilError","vs","flattenedKey","CSS","escape","dataset","closest","IGNORED_CHILDREN_SELECTOR","result","path","match","previous","ckey","pkey","isInteger","isArray","providePath","tagName","extract","es","fieldErrors","globalErrors","INVALID_CLASS","replace","validationTargetsSelector","input","fieldErrorsSelector","innerText","ys","parentElement","getBoundingClientRect","y","scrollY","miny","min","Infinity","scroll","scrollX","SCROLL_OFFSET","INPUT_TEMPLATE","makeInputFragment","firstElementChild","evt","stopPropagation","dispatchEvent","CustomEvent","bubbles","cancelable","detail","Input","Select","tsConfig","remote","loadOnce","tsId","loaded","_remote","_unwrappedRemoteLoad","query","hasOwnProperty","qvalue","byId","loader","ts","TomSelect","preload","shouldLoad","loading","on","renderTo","l","getValue","loadCallback","setValue","RadioGroup","radioEls","inputsAndLabels","Spinner"],"mappings":"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"}
package/dist/ful.mjs CHANGED
@@ -712,19 +712,6 @@ class Nodes {
712
712
  }
713
713
  }
714
714
 
715
- class Events {
716
- static dispatchChange(el, value) {
717
- return el.dispatchEvent(new CustomEvent("change", {
718
- bubbles: true,
719
- cancelable: true,
720
- detail: {
721
- target: el,
722
- value: value
723
- }
724
- }));
725
- }
726
- }
727
-
728
715
  class TemplatesRegistry {
729
716
  #idToFragment = {};
730
717
  #idToTemplate = {};
@@ -746,11 +733,11 @@ class TemplatesRegistry {
746
733
  }
747
734
  return tpl;
748
735
  }
749
- configure(ec) {
736
+ configure(ec, ...data) {
750
737
  this.#ec = ec;
751
738
  for (const [k, fragment] of Object.entries(this.#idToFragment)) {
752
739
  delete this.#idToFragment[k];
753
- this.#idToTemplate[k] = ftl.Template.fromFragment(fragment, ec);
740
+ this.#idToTemplate[k] = ftl.Template.fromFragment(fragment, ec, ...data);
754
741
  }
755
742
  }
756
743
  }
@@ -773,12 +760,6 @@ class ElementsRegistry {
773
760
  this.#templates.put(name, Fragments.fromHtml(html));
774
761
  return name;
775
762
  }
776
- template(k) {
777
- if (k === null || k === undefined) {
778
- return undefined;
779
- }
780
- return this.#templates.get(k);
781
- }
782
763
  define(tag, klass) {
783
764
  if (!this.#configured) {
784
765
  this.#tagToclass[tag] = klass;
@@ -787,14 +768,20 @@ class ElementsRegistry {
787
768
  customElements.define(tag, klass);
788
769
  return this;
789
770
  }
790
- configure(ec) {
791
- this.#templates.configure(ec);
771
+ configure(ec, ...data) {
772
+ this.#templates.configure(ec, ...data);
792
773
  for (const [tag, klass] of Object.entries(this.#tagToclass)) {
793
774
  customElements.define(tag, klass);
794
775
  delete this.#tagToclass[tag];
795
776
  }
796
777
  this.#configured = true;
797
778
  }
779
+ template(k) {
780
+ if (k === null || k === undefined) {
781
+ return undefined;
782
+ }
783
+ return this.#templates.get(k);
784
+ }
798
785
  }
799
786
 
800
787
  const elements = new ElementsRegistry();
@@ -989,7 +976,10 @@ function extract(el) {
989
976
  if (el.dataset['fulBindType'] === 'boolean') {
990
977
  return !el.value ? null : el.value === 'true';
991
978
  }
992
- return el.value === '' || el.value === undefined ? null : el.value;
979
+ if (el.tagName === 'INPUT' || el.tagName === 'SELECT'){
980
+ return el.value === '' || el.value === undefined ? null : el.value;
981
+ }
982
+ return el.value;
993
983
  }
994
984
 
995
985
  function mutate(el, raw) {
@@ -1007,6 +997,7 @@ function mutate(el, raw) {
1007
997
  class Form extends ParsedElement() {
1008
998
  static IGNORED_CHILDREN_SELECTOR = '.d-none, [hidden]';
1009
999
  static SCROLL_OFFSET = 50;
1000
+ static INVALID_CLASS = 'is-invalid';
1010
1001
  render() {
1011
1002
  const form = document.createElement('form');
1012
1003
  form.replaceChildren(...this.childNodes);
@@ -1069,7 +1060,7 @@ class Form extends ParsedElement() {
1069
1060
  set errors(es) {
1070
1061
  const fieldErrors = es.filter((e) => e.type === 'FIELD_ERROR' || e.type === 'INVALID_FORMAT');
1071
1062
  const globalErrors = es.filter((e) => e.type !== 'FIELD_ERROR' && e.type !== 'INVALID_FORMAT');
1072
- this.querySelectorAll('.is-invalid').forEach(el => el.classList.remove('is-invalid'));
1063
+ this.querySelectorAll(`.${Form.INVALID_CLASS}`).forEach(el => el.classList.remove(Form.INVALID_CLASS));
1073
1064
  this.querySelectorAll("ful-errors").forEach(el => {
1074
1065
  el.replaceChildren();
1075
1066
  el.setAttribute('hidden', '');
@@ -1077,7 +1068,7 @@ class Form extends ParsedElement() {
1077
1068
  fieldErrors.forEach((e) => {
1078
1069
  const name = e.context.replace("[", ".").replace("].", ".");
1079
1070
  const validationTargetsSelector = `[name='${CSS.escape(name)}'] [ful-validation-target],[name='${CSS.escape(name)}']:not(:has([ful-validation-target]))`;
1080
- this.querySelectorAll(validationTargetsSelector).forEach(input => input.classList.add('is-invalid'));
1071
+ this.querySelectorAll(validationTargetsSelector).forEach(input => input.classList.add(Form.INVALID_CLASS));
1081
1072
  const fieldErrorsSelector = `ful-field-error[field='${CSS.escape(name)}']`;
1082
1073
  this.querySelectorAll(fieldErrorsSelector).forEach(el => el.innerText = e.reason);
1083
1074
  });
@@ -1090,7 +1081,7 @@ class Form extends ParsedElement() {
1090
1081
  if (!this.hasAttribute('scroll-on-error')) {
1091
1082
  return;
1092
1083
  }
1093
- const ys = Array.from(this.querySelectorAll('[ful-validated-field]:has(.is-invalid) ful-field-error'))
1084
+ const ys = Array.from(this.querySelectorAll(`[ful-validated-field]:has(.${Form.INVALID_CLASS}) ful-field-error`))
1094
1085
  .map(el => el.parentElement ? el.parentElement : el)
1095
1086
  .map(el => el.getBoundingClientRect().y + window.scrollY);
1096
1087
  const miny = Math.min(...ys);
@@ -1123,7 +1114,13 @@ const makeInputFragment = (el, template, slots) => {
1123
1114
  input.setAttribute('ful-validation-target', '');
1124
1115
  input.addEventListener('change', (evt) => {
1125
1116
  evt.stopPropagation();
1126
- Events.dispatchChange(el, el.value);
1117
+ el.dispatchEvent(new CustomEvent('change', {
1118
+ bubbles: true,
1119
+ cancelable: false,
1120
+ detail: {
1121
+ value: el.value
1122
+ }
1123
+ }));
1127
1124
  });
1128
1125
  const id = input.getAttribute('id') || el.getAttribute('input-id') || Attributes.uid('ful-input');
1129
1126
  Attributes.forward('input-', el, slots.input);
@@ -1231,7 +1228,13 @@ class Select extends ParsedElement({
1231
1228
  shouldLoad: (query) => this.shouldLoad ? this.shouldLoad(query) : true
1232
1229
  } : {}, tsDefaultConfig, this.tsConfig));
1233
1230
  this.ts.on('change', value => {
1234
- Events.dispatchChange(this, this.value);
1231
+ this.dispatchEvent(new CustomEvent('change', {
1232
+ bubbles: true,
1233
+ cancelable: false,
1234
+ detail: {
1235
+ value: this.value
1236
+ }
1237
+ }));
1235
1238
  });
1236
1239
  //we remove the input to move it
1237
1240
  input.addEventListener('change', (evt) => {
@@ -1303,7 +1306,13 @@ class RadioGroup extends ParsedElement({
1303
1306
  input.addEventListener('change', evt => {
1304
1307
  evt.stopPropagation();
1305
1308
  //change is not cancelable
1306
- Events.dispatchChange(this, this.value);
1309
+ this.dispatchEvent(new CustomEvent('change', {
1310
+ bubbles: true,
1311
+ cancelable: false,
1312
+ detail: {
1313
+ value: this.value
1314
+ }
1315
+ }));
1307
1316
  });
1308
1317
  const label = Fragments.fromChildNodes(el);
1309
1318
  return [input, label];
@@ -1317,9 +1326,6 @@ class RadioGroup extends ParsedElement({
1317
1326
  return checked ? checked.value : null;
1318
1327
  }
1319
1328
  set value(value) {
1320
- if(!Events.dispatchChange(this, value)){
1321
- return;
1322
- }
1323
1329
  this.querySelector(`input[type=radio][value=${CSS.escape(value)}]`).checked = true;
1324
1330
  }
1325
1331
  }
@@ -1338,5 +1344,5 @@ class Spinner extends ParsedElement({
1338
1344
  }
1339
1345
  }
1340
1346
 
1341
- export { Attributes, AuthorizationCodeFlow, AuthorizationCodeFlowInterceptor, AuthorizationCodeFlowSession, Base64, Deferred, ElementsRegistry, Events, Failure, Form, Fragments, Hex, HttpClient, INPUT_TEMPLATE, Input, LightSlots, LocalStorage, Nodes, ParsedElement, RadioGroup, Select, SessionStorage, Spinner, TemplatesRegistry, VersionedStorage, elements, jsonPatch, jsonPost, jsonPut, jsonRequest, makeInputFragment, timing };
1347
+ export { Attributes, AuthorizationCodeFlow, AuthorizationCodeFlowInterceptor, AuthorizationCodeFlowSession, Base64, Deferred, ElementsRegistry, Failure, Form, Fragments, Hex, HttpClient, INPUT_TEMPLATE, Input, LightSlots, LocalStorage, Nodes, ParsedElement, RadioGroup, Select, SessionStorage, Spinner, TemplatesRegistry, VersionedStorage, elements, jsonPatch, jsonPost, jsonPut, jsonRequest, makeInputFragment, timing };
1342
1348
  //# sourceMappingURL=ful.mjs.map