@optionfactory/ful 0.74.0 → 0.75.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.
package/dist/ful.iife.js CHANGED
@@ -1348,6 +1348,7 @@ var ful = (function (exports) {
1348
1348
  exports.Base64 = Base64;
1349
1349
  exports.Deferred = Deferred;
1350
1350
  exports.ElementsRegistry = ElementsRegistry;
1351
+ exports.Events = Events;
1351
1352
  exports.Failure = Failure;
1352
1353
  exports.Form = Form;
1353
1354
  exports.Fragments = Fragments;
@@ -1 +1 @@
1
- {"version":3,"file":"ful.iife.js","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(el, 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":[],"mappings":"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"}
1
+ {"version":3,"file":"ful.iife.js","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(el, 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":[],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- var ful=function(t){"use strict";class e{static encode(t,s){const r=s||e.URL_SAFE,n=t.byteLength,i=new Uint8Array(t);let a="";for(let t=0;t<n;t+=3){a+=r[i[t]>>2]+r[(3&i[t])<<4|i[t+1]>>4]+r[(15&i[t+1])<<2|i[t+2]>>6]+r[63&i[t+2]]}return n%3==2?a=a.substring(0,a.length-1):n%3==1&&(a=a.substring(0,a.length-2)),a}static decode(t,s){const r=s||e.URL_SAFE;let n=Math.floor(.75*t.length);for(let e=0;e!==t.length&&"="===t[t.length-e-1];++e)--n;const i=new Uint8Array(n);let a=0,o=0;for(;a<.75*t.length;){const e=r.indexOf(t.charAt(o++)),s=r.indexOf(t.charAt(o++)),n=r.indexOf(t.charAt(o++)),l=r.indexOf(t.charAt(o++));i[a++]=e<<2|s>>4,i[a++]=(15&s)<<4|n>>2,i[a++]=(3&n)<<6|l}return i.buffer}}e.STANDARD="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",e.URL_SAFE="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";class s{constructor(){const t=document.querySelector("meta[name='context']").getAttribute("content");this.context=t.endsWith("/")?t.substring(0,t.length-1):t}async intercept(t,e){const s=t.resource.startsWith("/")?"":"/";return t.resource=this.context+s+t.resource,await e.proceed(t)}}class r{constructor(){this.k=document.querySelector("meta[name='_csrf_header']").getAttribute("content"),this.v=document.querySelector("meta[name='_csrf']").getAttribute("content")}async intercept(t,e){const s=new Headers(t.options.headers);return s.set(this.k,this.v),t.options.headers=s,await e.proceed(t)}}class n{constructor(t){this.redirectUri=t}async intercept(t,e){const s=await e.proceed(t);if(401!==s.status)return s;window.location.href=this.redirectUri}}class i extends Error{static parseProblems(t,e){const s=[{type:"GENERIC_PROBLEM",context:null,reason:`${t}: ${e}`,details:null}];try{return e?JSON.parse(e):s}catch(t){return s}}static fromResponse(t,e){return new i(t,i.parseProblems(t,e))}constructor(t,e){super(JSON.stringify(e)),this.name=`Failure:${t}`,this.status=t,this.problems=e}}class a{constructor(){this.interceptors=[]}withContext(){return this.interceptors.push(new s),this}withCsrfToken(){return this.interceptors.push(new r),this}withRedirectOnUnauthorized(t){return this.interceptors.push(new n(t)),this}withInterceptors(...t){return this.interceptors.push(...t),this}build(){const t=this.interceptors;return new c({interceptors:t})}}class o{async intercept(t,e){return await fetch(t.resource,t.options)}}class l{constructor(t,e){this.interceptors=t,this.current=e}async proceed(t){const e=this.interceptors[this.current];return await e.intercept(t,new l(this.interceptors,this.current+1))}}class c{static builder(){return new a}constructor({interceptors:t}){this.interceptors=t||[]}async exchange(t,e){const s=e||{},r=[...this.interceptors,...s.interceptors||[],new o],n=new l(r,0);return await n.proceed({resource:t,options:s})}async fetch(t,e){const s=await this.exchange(t,e);if(!s.ok){const t=await s.text();throw i.fromResponse(s.status,t)}return s}async json(t,e){try{const s=await this.fetch(t,e),r=await s.text();return r?JSON.parse(r):void 0}catch(t){if(t instanceof i)throw t;throw new i(0,[{type:"CONNECTION_PROBLEM",context:null,reason:t.message,details:null}])}}}function u(t,e,s){return{headers:{"Content-Type":"application/json",...s},method:t,body:JSON.stringify(e)}}class d{constructor(t,e){this.prefix=t,this.storage=e}save(t,e){this.storage.setItem(`${this.prefix}-${t}`,JSON.stringify(e))}load(t){const e=this.storage.getItem(`${this.prefix}-${t}`);return void 0===e?void 0:JSON.parse(e)}remove(t){this.storage.removeItem(`${this.prefix}-${t}`)}pop(t){const e=this.load(t);return this.remove(t),e}}class h extends d{constructor(t){super(t,sessionStorage)}}class p{static forKeycloak(t,e,s){return new p(t,"openid profile",{auth:new URL("protocol/openid-connect/auth",e),token:new URL("protocol/openid-connect/token",e),logout:new URL("protocol/openid-connect/logout",e),registration:new URL("protocol/openid-connect/registrations",e),redirect:s})}constructor(t,e,{auth:s,token:r,registration:n,logout:i,redirect:a}){this.storage=new h(t),this.clientId=t,this.scope=e,this.uri={auth:s,token:r,registration:n,logout:i,redirect:a}}async action(t,s){const r=e.encode(crypto.getRandomValues(new Uint8Array(32)).buffer),n=e.encode(await crypto.subtle.digest("SHA-256",(new TextEncoder).encode(r))),i=this.clientId+e.encode(crypto.getRandomValues(new Uint8Array(16)).buffer);this.storage.save(p.PKCE_AND_STATE_KEY,{state:i,verifier:r});const a=new URL(t);a.searchParams.set("client_id",this.clientId),a.searchParams.set("redirect_uri",this.uri.redirect),a.searchParams.set("response_type","code"),a.searchParams.set("scope",this.scope),a.searchParams.set("state",i),a.searchParams.set("code_challenge",n),a.searchParams.set("code_challenge_method","S256"),Object.entries(s||{}).forEach((t=>{a.searchParams.set(t[0],t[1])})),window.location=a}async registration(t){await this.action(this.uri.registration,t)}async applicationInitiatedAction(t){await this.action(this.uri.auth,{kc_action:t})}async _tokenExchange(t,e){window.history.replaceState("","",this.uri.redirect);const s=this.storage.pop(p.PKCE_AND_STATE_KEY);if(s.state!==e)throw new Error("State mismatch");const r=await fetch(this.uri.token,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams([["client_id",this.clientId],["code",t],["grant_type","authorization_code"],["code_verifier",s.verifier],["state",s.state],["redirect_uri",this.uri.redirect]])});if(!r.ok){const t=await r.text();throw new Error("Error:"+r.status+": "+t)}const n=await r.json();return new f(this.clientId,n,this.uri)}async ensureLoggedIn(){const t=new URL(window.location.href),e=t.searchParams.get("code");if(e&&this.storage.load(p.PKCE_AND_STATE_KEY)){const s=t.searchParams.get("state");return await this._tokenExchange(e,s)}return await this.action(this.uri.auth,{}),null}}p.PKCE_AND_STATE_KEY="state-and-verifier";class f{static parseToken(t){const[s,r,n]=t.split("."),i=new TextDecoder("utf-8");return{header:JSON.parse(i.decode(e.decode(s,e.STANDARD))),payload:JSON.parse(i.decode(e.decode(r,e.STANDARD))),signature:n}}constructor(t,e,{token:s,logout:r,redirect:n}){this.clientId=t,this.token=e,this.accessToken=f.parseToken(e.access_token),this.refreshToken=f.parseToken(e.refresh_token),this.uri={token:s,logout:r,redirect:n},this.refreshCallback=null}onRefresh(t){this.refreshCallback=t}async refresh(){const t=await fetch(this.uri.token,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams([["client_id",this.clientId],["grant_type","refresh_token"],["refresh_token",this.token.refresh_token]])});if(!t.ok)throw new Error("Error:"+t.status+": "+t.text());const e=await t.json();this.token=e,this.accessToken=f.parseToken(e.access_token),this.refreshToken=f.parseToken(e.refresh_token),this.refreshCallback&&this.refreshCallback(this.token,this.accessToken,this.refreshToken)}shouldBeRefreshed(t){const e=(new Date).getTime(),s=1e3*this.refreshToken.payload.exp;return!(e>s)&&e-t>s}async refreshIf(t){this.shouldBeRefreshed(t)&&await this.refresh()}logout(){const t=new URL(this.uri.logout);t.searchParams.set("post_logout_redirect_uri",this.uri.redirect),t.searchParams.set("id_token_hint",this.token.id_token),window.location=t}bearerToken(){return`Bearer ${this.token.access_token}`}interceptor(t,e){return new m(this,t,e)}}class m{constructor(t,e,s){this.session=t,this.gracePeriodBefore=e||2e3,this.gracePeriodAfter=s||3e4}async intercept(t,e){await this.session.refreshIf(this.gracePeriodBefore);const s=new Headers(t.options.headers);s.set("Authorization",this.session.bearerToken()),t.options.headers=s;const r=await e.proceed(t);return await this.session.refreshIf(this.gracePeriodAfter),r}}const g={sleep:t=>new Promise((e=>setTimeout(e,t))),DEBOUNCE_DEFAULT:0,DEBOUNCE_IMMEDIATE:1,debounce(t,e,s){let r=null,n=[],i=0,a=s||g.DEBOUNCE_DEFAULT;const o=()=>{const s=(new Date).getTime()-i;t>s?r=setTimeout(o,t-s):(r=null,a!==g.DEBOUNCE_IMMEDIATE&&e(...n),null===r&&(n=[]))};return function(){n=arguments,i=(new Date).getTime(),null===r&&(r=setTimeout(o,t),a===g.DEBOUNCE_IMMEDIATE&&e(...n))}},THROTTLE_DEFAULT:0,THROTTLE_NO_LEADING:1,THROTTLE_NO_TRAILING:2,throttle(t,e,s){let r=null,n=[],i=0,a=s||g.THROTTLE_DEFAULT;const o=()=>{i=a&g.THROTTLE_NO_LEADING?0:(new Date).getTime(),r=null,e(...n),null===r&&(n=[])};return function(){const s=(new Date).getTime();!i&&a&g.THROTTLE_NO_LEADING&&(i=s);const l=t-(s-i);n=arguments,l<=0||l>t?(null!==r&&(clearTimeout(r),r=null),i=s,e(...n),null===r&&(n=[])):null!==r||a&g.THROTTLE_NO_TRAILING||(r=setTimeout(o,l))}}};class w{static fromHtml(...t){const e=document.createElement("template");return e.innerHTML=t.join(""),e.content}static toHtml(t){var e=document.createElement("template");return e.content.appendChild(t),e.innerHTML}static from(...t){const e=new DocumentFragment;return e.append(...t),e}static fromChildNodes(t){const e=new DocumentFragment;return e.append(...t.childNodes),e}}class b{static id=0;static uid(t){return`${t}-${++b.id}`}static defaultValue(t,e,s){return t.hasAttribute(e)||t.setAttribute(e,s),t.getAttribute(e)}static forward(t,e,s){e.getAttributeNames().filter((e=>e.startsWith(t))).forEach((r=>{const n=r.substring(t.length);"class"!==n?s.setAttribute(n,e.getAttribute(r)):s.classList.add(...e.getAttribute(t+"class").split(" ").filter((t=>t.length)))}))}static toggle(t,e,s){s?t.setAttribute(e,""):t.removeAttribute(e)}static flip(t,e){t.hasAttribute(e)?t.removeAttribute(e):t.setAttribute(e,"")}}class v{static from(t){const e=Array.from(t.childNodes).filter((t=>t.matches&&t.matches("[slot]"))).map((t=>{t.remove();const e=t.getAttribute("slot");return t.removeAttribute("slot"),[e,t]})),s={};s.default=new DocumentFragment,s.default.append(...t.childNodes);for(const[t,r]of e)t in s||(s[t]=new DocumentFragment),s[t].append(r);return s}}class y{static isParsed(t){for(var e=t;e;e=e.parentNode)if(e.nextSibling)return!0;return!1}}class T{static dispatchChange(t,e){return t.dispatchEvent(new CustomEvent("change",{bubbles:!0,cancelable:!0,detail:{target:t,value:e}}))}}class A{#t={};#e={};#s;put(t,e){this.#s?this.#e[t]=Template.fromFragment(e,ec):this.#t[t]=e}get(t){if(!this.#s)throw new Error("TemplatesRegistry is not configured");const e=this.#e[t];if(!e)throw new Error(`missing template: '${t}'`);return e}configure(t){this.#s=t;for(const[e,s]of Object.entries(this.#t))delete this.#t[e],this.#e[e]=ftl.Template.fromFragment(s,t)}}class E{#r;#n;#i;#a=0;constructor(){this.#r=new A,this.#n={}}defineTemplate(t){if(null==t)return;const e="unnamed-"+ ++this.#a;return this.#r.put(e,w.fromHtml(t)),e}template(t){if(null!=t)return this.#r.get(t)}define(t,e){return this.#i?(customElements.define(t,e),this):(this.#n[t]=e,this)}configure(t){this.#r.configure(t);for(const[t,e]of Object.entries(this.#n))customElements.define(t,e),delete this.#n[t];this.#i=!0}}const _=new E;const S=new class{#o=[];constructor(){document.addEventListener("DOMContentLoaded",this.dequeue.bind(this))}enqueue(t){this.#o.length||requestAnimationFrame(this.dequeue.bind(this)),this.#o.push(t)}dequeue(){this.#o.splice(0).forEach((t=>t.upgrade()))}},L={string:t=>t,number:t=>null===t?null:Number(t),presence:t=>null!==t,state:t=>null!==t,bool:t=>"true"===t,json:t=>JSON.parse(t)},k=t=>{const{observed:e,template:s,slots:r}=t||{},n=(e||[]).map((t=>{const[e,s]=t.split(":"),r=s?.trim()||"string";if(!(r in L))throw new Error(`unsupported attribute type: ${r}`);return[e.trim(),r]})),i=n.map((([t,e])=>[t,L[e]])),a=Object.fromEntries(i),o=_.defineTemplate(s),l=class extends HTMLElement{static get observedAttributes(){return Object.keys(a)}#l;#c;#u;#d;constructor(...t){super(...t),this.#d=this.attachInternals()}get initialized(){return this.#c}get internals(){return this.#d}connectedCallback(){if(this.#l)return;if("complete"===this.ownerDocument.readyState||y.isParsed(this))return void S.enqueue(this);this.ownerDocument.addEventListener("DOMContentLoaded",(()=>{t.disconnect(),S.enqueue(this)}));const t=new MutationObserver((()=>{y.isParsed(this)&&(t.disconnect(),S.enqueue(this))}));t.observe(this.parentNode,{childList:!0,subtree:!0})}attributeChangedCallback(t,e,s){if(!this.#l||e===s)return;if(this.#u)return;const r=a[t];this[t]=r(s)}reflect(t){this.#u=!0;try{t()}finally{this.#u=!1}}async upgrade(){if(!this.#l){this.#l=!0,await this.render(_.template(o),r?v.from(this):void 0);for(const[t,e]of i)this.hasAttribute(t)&&(this[t]=e(this.getAttribute(t)));this.#c=!0}}};for(const[t,e]of n.filter((([t,e])=>"state"===e)))Object.defineProperty(l.prototype,t,{enumerable:!0,configurable:!0,get(){return this.internals.states.has(`--${t}`)},set(e){this.internals.states[e?"add":"delete"](`--${t}`),this.reflect((()=>b.toggle(this,t,e)))}});return l};function O(t,e){return Object.keys(t).reduce(((s,r)=>{const n=e.length?e+".":"";return"object"==typeof t[r]&&null!==t[r]?Object.assign(s,O(t[r],n+r)):s[n+r]=t[r],s}),{})}function C(t,e){"radio"!==t.getAttribute("type")?"checkbox"!==t.getAttribute("type")?t.value=e:t.checked=e:t.checked=t.getAttribute("value")===e}class R extends(k()){static IGNORED_CHILDREN_SELECTOR=".d-none, [hidden]";static SCROLL_OFFSET=50;render(){const t=document.createElement("form");t.replaceChildren(...this.childNodes),t.addEventListener("submit",(async t=>{t.preventDefault(),this.spinning((async()=>{await(this.submitter?.(this.values,this))}))})),this.replaceChildren(t)}spinner(t){this.querySelectorAll("ful-spinner").forEach((e=>e.hidden=!t)),this.querySelectorAll("[type=submit],[type=reset]").forEach((e=>e.disabled=t))}async remoting(t){try{await t()}catch(t){throw t instanceof i&&(this.errors=t.problems),t}}async spinningUntilError(t){this.spinner(!0);try{await this.remoting(t)}catch(t){throw this.spinner(!1),t}}async spinning(t){this.spinner(!0);try{await this.remoting(t)}finally{this.spinner(!1)}}set values(t){for(const[e,s]of Object.entries(O(t,"")))this.querySelectorAll(`[name='${CSS.escape(e)}']`).forEach((t=>C(t,s)))}get values(){return Array.from(this.querySelectorAll("[name]")).filter((t=>"never"!==t.dataset.fulBindInclude&&("always"===t.dataset.fulBindInclude||null===t.closest(R.IGNORED_CHILDREN_SELECTOR)))).reduce(((t,e)=>function(t,e,s){const r=e.split(".").map((t=>t.match(/^[0-9]+$/)?+t:t));let n=t,i=null;for(let e=0;;++e){const a=r[e],o=r[e-1];if(Number.isInteger(a)&&!Array.isArray(n)&&(null!==i?i[o]=n=[]:t=n=[]),e===r.length-1)return n[a]=void 0!==s?s:a in n?n[a]:null,t;void 0===n[a]&&(n[a]={}),i=n,n=n[a]}}(t,e.getAttribute("name"),function(t){if("radio"===t.getAttribute("type")){if(!t.checked)return;return"boolean"===t.dataset.fulBindType?"true"===t.value:t.value}return"checkbox"===t.getAttribute("type")?t.checked:"boolean"===t.dataset.fulBindType?t.value?"true"===t.value:null:""===t.value||void 0===t.value?null:t.value}(e))),{})}set errors(t){const e=t.filter((t=>"FIELD_ERROR"===t.type||"INVALID_FORMAT"===t.type)),s=t.filter((t=>"FIELD_ERROR"!==t.type&&"INVALID_FORMAT"!==t.type));if(this.querySelectorAll(".is-invalid").forEach((t=>t.classList.remove("is-invalid"))),this.querySelectorAll("ful-errors").forEach((t=>{t.replaceChildren(),t.setAttribute("hidden","")})),e.forEach((t=>{const e=t.context.replace("[",".").replace("].","."),s=`[name='${CSS.escape(e)}'] [ful-validation-target],[name='${CSS.escape(e)}']:not(:has([ful-validation-target]))`;this.querySelectorAll(s).forEach((t=>t.classList.add("is-invalid")));const r=`ful-field-error[field='${CSS.escape(e)}']`;this.querySelectorAll(r).forEach((e=>e.innerText=t.reason))})),this.querySelectorAll("ful-errors").forEach((t=>{t.innerText=s.map((t=>t.reason)).join("\n"),0!==s.length&&t.removeAttribute("hidden")})),!this.hasAttribute("scroll-on-error"))return;const r=Array.from(this.querySelectorAll("[ful-validated-field]:has(.is-invalid) ful-field-error")).map((t=>t.parentElement?t.parentElement:t)).map((t=>t.getBoundingClientRect().y+window.scrollY)),n=Math.min(...r);n!==1/0&&window.scroll(window.scrollX,n>R.SCROLL_OFFSET?n-R.SCROLL_OFFSET:0)}}const I='\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=(t,e,s)=>{const r=t.input=s.input=s.input?.firstElementChild||(()=>{const t=document.createElement("input");return t.classList.add("form-control"),t})();r.setAttribute("ful-validation-target",""),r.addEventListener("change",(e=>{e.stopPropagation(),T.dispatchChange(t,t.value)}));const n=r.getAttribute("id")||t.getAttribute("input-id")||b.uid("ful-input");b.forward("input-",t,s.input),b.defaultValue(s.input,"id",n),b.defaultValue(s.input,"type","text"),b.defaultValue(s.input,"placeholder"," ");const i=t.getAttribute("name");return e.render(t,{id:n,name:i,slots:s})};class x extends(k({observed:["value"],slots:!0,template:I})){render(t,e){const s=N(this,t,e);this.replaceChildren(s)}get value(){return this.input.value}set value(t){this.input.value=t}}class D extends(k({observed:["value"],slots:!0,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 '})){constructor(t){super(),this.tsConfig=t}render(t,e){const s="local"!=(this.getAttribute("type")||"local"),r="always"!=this.getAttribute("load"),n=this.getAttribute("name"),i=e.input=e.input?.firstElementChild||document.createElement("select");i.setAttribute("ful-validation-target","");const a=i.getAttribute("id")||this.getAttribute("input-id")||b.uid("ful-select"),o=`${a}-ts-control`;b.forward("input-",this,i),b.defaultValue(i,"id",a),b.defaultValue(i,"placeholder"," "),e.input=w.from(i),this.loaded=!s;this._remote=s,this._unwrappedRemoteLoad=async(t,e)=>{if(!s||s&&r&&this.loaded)return void e();const n=t&&t.hasOwnProperty("byId")?"id":"query",i="id"===n?t.byId:t,a=await(this.#h?this.#h(i,n):[]);"id"!==n&&(this.loaded=!0),e(a)},this.ts=new TomSelect(i,Object.assign(s?{preload:"focus",load:this._unwrappedRemoteLoad,shouldLoad:t=>!this.shouldLoad||this.shouldLoad(t)}:{},{render:{loading:()=>'<ful-spinner class="centered p-2"></ful-spinner>'}},this.tsConfig)),this.ts.on("change",(t=>{T.dispatchChange(this,this.value)})),i.addEventListener("change",(t=>{t.stopPropagation()})),i.remove(),t.renderTo(this,{id:a,tsId:o,name:n,input:i,slots:e})}#h;set loader(t){this.#h=t,this.hasAttribute("value")&&(this.value=this.getAttribute("value"))}get value(){const t=this.ts.getValue();return""===t?null:t}set value(t){(async()=>{this._remote&&await this._unwrappedRemoteLoad({byId:t},this.ts.loadCallback.bind(this.ts));this.ts.setValue(t,!0)})()}}class P extends(k({observed:["value","disabled:state"],slots:!0,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 '})){render(t,e){const s=this.getAttribute("name")||b.uid("ful-radiogroup"),r=Array.from(e.default.querySelectorAll("ful-radio")),n=r.map((t=>{const e=document.createElement("input");e.setAttribute("type","radio"),b.forward("input-",this,e),b.forward("",t,e),e.setAttribute("name",`${s}-ignore`),e.setAttribute("ful-validation-target",""),e.dataset.fulBindInclude="never",e.addEventListener("change",(e=>{e.stopPropagation(),T.dispatchChange(t,this.value)}));return[e,w.fromChildNodes(t)]}));r.forEach((t=>t.remove())),t.renderTo(this,{name:s,slots:e,inputsAndLabels:n})}get value(){const t=this.querySelector("input[type=radio]:checked");return t?t.value:null}set value(t){T.dispatchChange(this,t)&&(this.querySelector(`input[type=radio][value=${CSS.escape(t)}]`).checked=!0)}}class F extends(k({slots:!0,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 '})){render(t,e){t.renderTo(this,{slots:e})}}return t.Attributes=b,t.AuthorizationCodeFlow=p,t.AuthorizationCodeFlowInterceptor=m,t.AuthorizationCodeFlowSession=f,t.Base64=e,t.Deferred=class{constructor(){this.promise=new Promise(((t,e)=>{this.reject=e,this.resolve=t}))}},t.ElementsRegistry=E,t.Failure=i,t.Form=R,t.Fragments=w,t.Hex=class{static decode(t){if(t.length%2!=0)throw new Error("invalid length");const e=t.length/2;return new Uint8Array(e).map(((e,s)=>{const r=2*s,n=t.substring(r,r+2);return parseInt(n,16)}))}static encode(t,e){return Array.from(t).map((t=>t.toString(16))).map((t=>e?t.toUpperCase():t)).map((t=>t.padStart(2,0))).join("")}},t.HttpClient=c,t.INPUT_TEMPLATE=I,t.Input=x,t.LightSlots=v,t.LocalStorage=class extends d{constructor(t){super(t,localStorage)}},t.Nodes=y,t.ParsedElement=k,t.RadioGroup=P,t.Select=D,t.SessionStorage=h,t.Spinner=F,t.TemplatesRegistry=A,t.VersionedStorage=class{constructor(t,e,s){this.storage=t,this.key=e,this.dataSupplier=s,this.cache=null}async load(t){const e=this.storage.load(this.key);if(e&&e.revision===t)return void(this.cache=e.value);const s=await this.dataSupplier(t,this.key);this.storage.save(this.key,{revision:t,value:s}),this.cache=s}data(){return this.cache}},t.elements=_,t.jsonPatch=function(t,e){return u("PATCH",t,e)},t.jsonPost=function(t,e){return u("POST",t,e)},t.jsonPut=function(t,e){return u("PUT",t,e)},t.jsonRequest=u,t.makeInputFragment=N,t.timing=g,Object.defineProperty(t,"__esModule",{value:!0}),t}({});
1
+ var ful=function(t){"use strict";class e{static encode(t,s){const r=s||e.URL_SAFE,n=t.byteLength,i=new Uint8Array(t);let a="";for(let t=0;t<n;t+=3){a+=r[i[t]>>2]+r[(3&i[t])<<4|i[t+1]>>4]+r[(15&i[t+1])<<2|i[t+2]>>6]+r[63&i[t+2]]}return n%3==2?a=a.substring(0,a.length-1):n%3==1&&(a=a.substring(0,a.length-2)),a}static decode(t,s){const r=s||e.URL_SAFE;let n=Math.floor(.75*t.length);for(let e=0;e!==t.length&&"="===t[t.length-e-1];++e)--n;const i=new Uint8Array(n);let a=0,o=0;for(;a<.75*t.length;){const e=r.indexOf(t.charAt(o++)),s=r.indexOf(t.charAt(o++)),n=r.indexOf(t.charAt(o++)),l=r.indexOf(t.charAt(o++));i[a++]=e<<2|s>>4,i[a++]=(15&s)<<4|n>>2,i[a++]=(3&n)<<6|l}return i.buffer}}e.STANDARD="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",e.URL_SAFE="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";class s{constructor(){const t=document.querySelector("meta[name='context']").getAttribute("content");this.context=t.endsWith("/")?t.substring(0,t.length-1):t}async intercept(t,e){const s=t.resource.startsWith("/")?"":"/";return t.resource=this.context+s+t.resource,await e.proceed(t)}}class r{constructor(){this.k=document.querySelector("meta[name='_csrf_header']").getAttribute("content"),this.v=document.querySelector("meta[name='_csrf']").getAttribute("content")}async intercept(t,e){const s=new Headers(t.options.headers);return s.set(this.k,this.v),t.options.headers=s,await e.proceed(t)}}class n{constructor(t){this.redirectUri=t}async intercept(t,e){const s=await e.proceed(t);if(401!==s.status)return s;window.location.href=this.redirectUri}}class i extends Error{static parseProblems(t,e){const s=[{type:"GENERIC_PROBLEM",context:null,reason:`${t}: ${e}`,details:null}];try{return e?JSON.parse(e):s}catch(t){return s}}static fromResponse(t,e){return new i(t,i.parseProblems(t,e))}constructor(t,e){super(JSON.stringify(e)),this.name=`Failure:${t}`,this.status=t,this.problems=e}}class a{constructor(){this.interceptors=[]}withContext(){return this.interceptors.push(new s),this}withCsrfToken(){return this.interceptors.push(new r),this}withRedirectOnUnauthorized(t){return this.interceptors.push(new n(t)),this}withInterceptors(...t){return this.interceptors.push(...t),this}build(){const t=this.interceptors;return new c({interceptors:t})}}class o{async intercept(t,e){return await fetch(t.resource,t.options)}}class l{constructor(t,e){this.interceptors=t,this.current=e}async proceed(t){const e=this.interceptors[this.current];return await e.intercept(t,new l(this.interceptors,this.current+1))}}class c{static builder(){return new a}constructor({interceptors:t}){this.interceptors=t||[]}async exchange(t,e){const s=e||{},r=[...this.interceptors,...s.interceptors||[],new o],n=new l(r,0);return await n.proceed({resource:t,options:s})}async fetch(t,e){const s=await this.exchange(t,e);if(!s.ok){const t=await s.text();throw i.fromResponse(s.status,t)}return s}async json(t,e){try{const s=await this.fetch(t,e),r=await s.text();return r?JSON.parse(r):void 0}catch(t){if(t instanceof i)throw t;throw new i(0,[{type:"CONNECTION_PROBLEM",context:null,reason:t.message,details:null}])}}}function u(t,e,s){return{headers:{"Content-Type":"application/json",...s},method:t,body:JSON.stringify(e)}}class d{constructor(t,e){this.prefix=t,this.storage=e}save(t,e){this.storage.setItem(`${this.prefix}-${t}`,JSON.stringify(e))}load(t){const e=this.storage.getItem(`${this.prefix}-${t}`);return void 0===e?void 0:JSON.parse(e)}remove(t){this.storage.removeItem(`${this.prefix}-${t}`)}pop(t){const e=this.load(t);return this.remove(t),e}}class h extends d{constructor(t){super(t,sessionStorage)}}class p{static forKeycloak(t,e,s){return new p(t,"openid profile",{auth:new URL("protocol/openid-connect/auth",e),token:new URL("protocol/openid-connect/token",e),logout:new URL("protocol/openid-connect/logout",e),registration:new URL("protocol/openid-connect/registrations",e),redirect:s})}constructor(t,e,{auth:s,token:r,registration:n,logout:i,redirect:a}){this.storage=new h(t),this.clientId=t,this.scope=e,this.uri={auth:s,token:r,registration:n,logout:i,redirect:a}}async action(t,s){const r=e.encode(crypto.getRandomValues(new Uint8Array(32)).buffer),n=e.encode(await crypto.subtle.digest("SHA-256",(new TextEncoder).encode(r))),i=this.clientId+e.encode(crypto.getRandomValues(new Uint8Array(16)).buffer);this.storage.save(p.PKCE_AND_STATE_KEY,{state:i,verifier:r});const a=new URL(t);a.searchParams.set("client_id",this.clientId),a.searchParams.set("redirect_uri",this.uri.redirect),a.searchParams.set("response_type","code"),a.searchParams.set("scope",this.scope),a.searchParams.set("state",i),a.searchParams.set("code_challenge",n),a.searchParams.set("code_challenge_method","S256"),Object.entries(s||{}).forEach((t=>{a.searchParams.set(t[0],t[1])})),window.location=a}async registration(t){await this.action(this.uri.registration,t)}async applicationInitiatedAction(t){await this.action(this.uri.auth,{kc_action:t})}async _tokenExchange(t,e){window.history.replaceState("","",this.uri.redirect);const s=this.storage.pop(p.PKCE_AND_STATE_KEY);if(s.state!==e)throw new Error("State mismatch");const r=await fetch(this.uri.token,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams([["client_id",this.clientId],["code",t],["grant_type","authorization_code"],["code_verifier",s.verifier],["state",s.state],["redirect_uri",this.uri.redirect]])});if(!r.ok){const t=await r.text();throw new Error("Error:"+r.status+": "+t)}const n=await r.json();return new f(this.clientId,n,this.uri)}async ensureLoggedIn(){const t=new URL(window.location.href),e=t.searchParams.get("code");if(e&&this.storage.load(p.PKCE_AND_STATE_KEY)){const s=t.searchParams.get("state");return await this._tokenExchange(e,s)}return await this.action(this.uri.auth,{}),null}}p.PKCE_AND_STATE_KEY="state-and-verifier";class f{static parseToken(t){const[s,r,n]=t.split("."),i=new TextDecoder("utf-8");return{header:JSON.parse(i.decode(e.decode(s,e.STANDARD))),payload:JSON.parse(i.decode(e.decode(r,e.STANDARD))),signature:n}}constructor(t,e,{token:s,logout:r,redirect:n}){this.clientId=t,this.token=e,this.accessToken=f.parseToken(e.access_token),this.refreshToken=f.parseToken(e.refresh_token),this.uri={token:s,logout:r,redirect:n},this.refreshCallback=null}onRefresh(t){this.refreshCallback=t}async refresh(){const t=await fetch(this.uri.token,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams([["client_id",this.clientId],["grant_type","refresh_token"],["refresh_token",this.token.refresh_token]])});if(!t.ok)throw new Error("Error:"+t.status+": "+t.text());const e=await t.json();this.token=e,this.accessToken=f.parseToken(e.access_token),this.refreshToken=f.parseToken(e.refresh_token),this.refreshCallback&&this.refreshCallback(this.token,this.accessToken,this.refreshToken)}shouldBeRefreshed(t){const e=(new Date).getTime(),s=1e3*this.refreshToken.payload.exp;return!(e>s)&&e-t>s}async refreshIf(t){this.shouldBeRefreshed(t)&&await this.refresh()}logout(){const t=new URL(this.uri.logout);t.searchParams.set("post_logout_redirect_uri",this.uri.redirect),t.searchParams.set("id_token_hint",this.token.id_token),window.location=t}bearerToken(){return`Bearer ${this.token.access_token}`}interceptor(t,e){return new m(this,t,e)}}class m{constructor(t,e,s){this.session=t,this.gracePeriodBefore=e||2e3,this.gracePeriodAfter=s||3e4}async intercept(t,e){await this.session.refreshIf(this.gracePeriodBefore);const s=new Headers(t.options.headers);s.set("Authorization",this.session.bearerToken()),t.options.headers=s;const r=await e.proceed(t);return await this.session.refreshIf(this.gracePeriodAfter),r}}const g={sleep:t=>new Promise((e=>setTimeout(e,t))),DEBOUNCE_DEFAULT:0,DEBOUNCE_IMMEDIATE:1,debounce(t,e,s){let r=null,n=[],i=0,a=s||g.DEBOUNCE_DEFAULT;const o=()=>{const s=(new Date).getTime()-i;t>s?r=setTimeout(o,t-s):(r=null,a!==g.DEBOUNCE_IMMEDIATE&&e(...n),null===r&&(n=[]))};return function(){n=arguments,i=(new Date).getTime(),null===r&&(r=setTimeout(o,t),a===g.DEBOUNCE_IMMEDIATE&&e(...n))}},THROTTLE_DEFAULT:0,THROTTLE_NO_LEADING:1,THROTTLE_NO_TRAILING:2,throttle(t,e,s){let r=null,n=[],i=0,a=s||g.THROTTLE_DEFAULT;const o=()=>{i=a&g.THROTTLE_NO_LEADING?0:(new Date).getTime(),r=null,e(...n),null===r&&(n=[])};return function(){const s=(new Date).getTime();!i&&a&g.THROTTLE_NO_LEADING&&(i=s);const l=t-(s-i);n=arguments,l<=0||l>t?(null!==r&&(clearTimeout(r),r=null),i=s,e(...n),null===r&&(n=[])):null!==r||a&g.THROTTLE_NO_TRAILING||(r=setTimeout(o,l))}}};class w{static fromHtml(...t){const e=document.createElement("template");return e.innerHTML=t.join(""),e.content}static toHtml(t){var e=document.createElement("template");return e.content.appendChild(t),e.innerHTML}static from(...t){const e=new DocumentFragment;return e.append(...t),e}static fromChildNodes(t){const e=new DocumentFragment;return e.append(...t.childNodes),e}}class b{static id=0;static uid(t){return`${t}-${++b.id}`}static defaultValue(t,e,s){return t.hasAttribute(e)||t.setAttribute(e,s),t.getAttribute(e)}static forward(t,e,s){e.getAttributeNames().filter((e=>e.startsWith(t))).forEach((r=>{const n=r.substring(t.length);"class"!==n?s.setAttribute(n,e.getAttribute(r)):s.classList.add(...e.getAttribute(t+"class").split(" ").filter((t=>t.length)))}))}static toggle(t,e,s){s?t.setAttribute(e,""):t.removeAttribute(e)}static flip(t,e){t.hasAttribute(e)?t.removeAttribute(e):t.setAttribute(e,"")}}class v{static from(t){const e=Array.from(t.childNodes).filter((t=>t.matches&&t.matches("[slot]"))).map((t=>{t.remove();const e=t.getAttribute("slot");return t.removeAttribute("slot"),[e,t]})),s={};s.default=new DocumentFragment,s.default.append(...t.childNodes);for(const[t,r]of e)t in s||(s[t]=new DocumentFragment),s[t].append(r);return s}}class y{static isParsed(t){for(var e=t;e;e=e.parentNode)if(e.nextSibling)return!0;return!1}}class T{static dispatchChange(t,e){return t.dispatchEvent(new CustomEvent("change",{bubbles:!0,cancelable:!0,detail:{target:t,value:e}}))}}class A{#t={};#e={};#s;put(t,e){this.#s?this.#e[t]=Template.fromFragment(e,ec):this.#t[t]=e}get(t){if(!this.#s)throw new Error("TemplatesRegistry is not configured");const e=this.#e[t];if(!e)throw new Error(`missing template: '${t}'`);return e}configure(t){this.#s=t;for(const[e,s]of Object.entries(this.#t))delete this.#t[e],this.#e[e]=ftl.Template.fromFragment(s,t)}}class E{#r;#n;#i;#a=0;constructor(){this.#r=new A,this.#n={}}defineTemplate(t){if(null==t)return;const e="unnamed-"+ ++this.#a;return this.#r.put(e,w.fromHtml(t)),e}template(t){if(null!=t)return this.#r.get(t)}define(t,e){return this.#i?(customElements.define(t,e),this):(this.#n[t]=e,this)}configure(t){this.#r.configure(t);for(const[t,e]of Object.entries(this.#n))customElements.define(t,e),delete this.#n[t];this.#i=!0}}const _=new E;const S=new class{#o=[];constructor(){document.addEventListener("DOMContentLoaded",this.dequeue.bind(this))}enqueue(t){this.#o.length||requestAnimationFrame(this.dequeue.bind(this)),this.#o.push(t)}dequeue(){this.#o.splice(0).forEach((t=>t.upgrade()))}},L={string:t=>t,number:t=>null===t?null:Number(t),presence:t=>null!==t,state:t=>null!==t,bool:t=>"true"===t,json:t=>JSON.parse(t)},k=t=>{const{observed:e,template:s,slots:r}=t||{},n=(e||[]).map((t=>{const[e,s]=t.split(":"),r=s?.trim()||"string";if(!(r in L))throw new Error(`unsupported attribute type: ${r}`);return[e.trim(),r]})),i=n.map((([t,e])=>[t,L[e]])),a=Object.fromEntries(i),o=_.defineTemplate(s),l=class extends HTMLElement{static get observedAttributes(){return Object.keys(a)}#l;#c;#u;#d;constructor(...t){super(...t),this.#d=this.attachInternals()}get initialized(){return this.#c}get internals(){return this.#d}connectedCallback(){if(this.#l)return;if("complete"===this.ownerDocument.readyState||y.isParsed(this))return void S.enqueue(this);this.ownerDocument.addEventListener("DOMContentLoaded",(()=>{t.disconnect(),S.enqueue(this)}));const t=new MutationObserver((()=>{y.isParsed(this)&&(t.disconnect(),S.enqueue(this))}));t.observe(this.parentNode,{childList:!0,subtree:!0})}attributeChangedCallback(t,e,s){if(!this.#l||e===s)return;if(this.#u)return;const r=a[t];this[t]=r(s)}reflect(t){this.#u=!0;try{t()}finally{this.#u=!1}}async upgrade(){if(!this.#l){this.#l=!0,await this.render(_.template(o),r?v.from(this):void 0);for(const[t,e]of i)this.hasAttribute(t)&&(this[t]=e(this.getAttribute(t)));this.#c=!0}}};for(const[t,e]of n.filter((([t,e])=>"state"===e)))Object.defineProperty(l.prototype,t,{enumerable:!0,configurable:!0,get(){return this.internals.states.has(`--${t}`)},set(e){this.internals.states[e?"add":"delete"](`--${t}`),this.reflect((()=>b.toggle(this,t,e)))}});return l};function O(t,e){return Object.keys(t).reduce(((s,r)=>{const n=e.length?e+".":"";return"object"==typeof t[r]&&null!==t[r]?Object.assign(s,O(t[r],n+r)):s[n+r]=t[r],s}),{})}function C(t,e){"radio"!==t.getAttribute("type")?"checkbox"!==t.getAttribute("type")?t.value=e:t.checked=e:t.checked=t.getAttribute("value")===e}class R extends(k()){static IGNORED_CHILDREN_SELECTOR=".d-none, [hidden]";static SCROLL_OFFSET=50;render(){const t=document.createElement("form");t.replaceChildren(...this.childNodes),t.addEventListener("submit",(async t=>{t.preventDefault(),this.spinning((async()=>{await(this.submitter?.(this.values,this))}))})),this.replaceChildren(t)}spinner(t){this.querySelectorAll("ful-spinner").forEach((e=>e.hidden=!t)),this.querySelectorAll("[type=submit],[type=reset]").forEach((e=>e.disabled=t))}async remoting(t){try{await t()}catch(t){throw t instanceof i&&(this.errors=t.problems),t}}async spinningUntilError(t){this.spinner(!0);try{await this.remoting(t)}catch(t){throw this.spinner(!1),t}}async spinning(t){this.spinner(!0);try{await this.remoting(t)}finally{this.spinner(!1)}}set values(t){for(const[e,s]of Object.entries(O(t,"")))this.querySelectorAll(`[name='${CSS.escape(e)}']`).forEach((t=>C(t,s)))}get values(){return Array.from(this.querySelectorAll("[name]")).filter((t=>"never"!==t.dataset.fulBindInclude&&("always"===t.dataset.fulBindInclude||null===t.closest(R.IGNORED_CHILDREN_SELECTOR)))).reduce(((t,e)=>function(t,e,s){const r=e.split(".").map((t=>t.match(/^[0-9]+$/)?+t:t));let n=t,i=null;for(let e=0;;++e){const a=r[e],o=r[e-1];if(Number.isInteger(a)&&!Array.isArray(n)&&(null!==i?i[o]=n=[]:t=n=[]),e===r.length-1)return n[a]=void 0!==s?s:a in n?n[a]:null,t;void 0===n[a]&&(n[a]={}),i=n,n=n[a]}}(t,e.getAttribute("name"),function(t){if("radio"===t.getAttribute("type")){if(!t.checked)return;return"boolean"===t.dataset.fulBindType?"true"===t.value:t.value}return"checkbox"===t.getAttribute("type")?t.checked:"boolean"===t.dataset.fulBindType?t.value?"true"===t.value:null:""===t.value||void 0===t.value?null:t.value}(e))),{})}set errors(t){const e=t.filter((t=>"FIELD_ERROR"===t.type||"INVALID_FORMAT"===t.type)),s=t.filter((t=>"FIELD_ERROR"!==t.type&&"INVALID_FORMAT"!==t.type));if(this.querySelectorAll(".is-invalid").forEach((t=>t.classList.remove("is-invalid"))),this.querySelectorAll("ful-errors").forEach((t=>{t.replaceChildren(),t.setAttribute("hidden","")})),e.forEach((t=>{const e=t.context.replace("[",".").replace("].","."),s=`[name='${CSS.escape(e)}'] [ful-validation-target],[name='${CSS.escape(e)}']:not(:has([ful-validation-target]))`;this.querySelectorAll(s).forEach((t=>t.classList.add("is-invalid")));const r=`ful-field-error[field='${CSS.escape(e)}']`;this.querySelectorAll(r).forEach((e=>e.innerText=t.reason))})),this.querySelectorAll("ful-errors").forEach((t=>{t.innerText=s.map((t=>t.reason)).join("\n"),0!==s.length&&t.removeAttribute("hidden")})),!this.hasAttribute("scroll-on-error"))return;const r=Array.from(this.querySelectorAll("[ful-validated-field]:has(.is-invalid) ful-field-error")).map((t=>t.parentElement?t.parentElement:t)).map((t=>t.getBoundingClientRect().y+window.scrollY)),n=Math.min(...r);n!==1/0&&window.scroll(window.scrollX,n>R.SCROLL_OFFSET?n-R.SCROLL_OFFSET:0)}}const I='\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=(t,e,s)=>{const r=t.input=s.input=s.input?.firstElementChild||(()=>{const t=document.createElement("input");return t.classList.add("form-control"),t})();r.setAttribute("ful-validation-target",""),r.addEventListener("change",(e=>{e.stopPropagation(),T.dispatchChange(t,t.value)}));const n=r.getAttribute("id")||t.getAttribute("input-id")||b.uid("ful-input");b.forward("input-",t,s.input),b.defaultValue(s.input,"id",n),b.defaultValue(s.input,"type","text"),b.defaultValue(s.input,"placeholder"," ");const i=t.getAttribute("name");return e.render(t,{id:n,name:i,slots:s})};class x extends(k({observed:["value"],slots:!0,template:I})){render(t,e){const s=N(this,t,e);this.replaceChildren(s)}get value(){return this.input.value}set value(t){this.input.value=t}}class D extends(k({observed:["value"],slots:!0,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 '})){constructor(t){super(),this.tsConfig=t}render(t,e){const s="local"!=(this.getAttribute("type")||"local"),r="always"!=this.getAttribute("load"),n=this.getAttribute("name"),i=e.input=e.input?.firstElementChild||document.createElement("select");i.setAttribute("ful-validation-target","");const a=i.getAttribute("id")||this.getAttribute("input-id")||b.uid("ful-select"),o=`${a}-ts-control`;b.forward("input-",this,i),b.defaultValue(i,"id",a),b.defaultValue(i,"placeholder"," "),e.input=w.from(i),this.loaded=!s;this._remote=s,this._unwrappedRemoteLoad=async(t,e)=>{if(!s||s&&r&&this.loaded)return void e();const n=t&&t.hasOwnProperty("byId")?"id":"query",i="id"===n?t.byId:t,a=await(this.#h?this.#h(i,n):[]);"id"!==n&&(this.loaded=!0),e(a)},this.ts=new TomSelect(i,Object.assign(s?{preload:"focus",load:this._unwrappedRemoteLoad,shouldLoad:t=>!this.shouldLoad||this.shouldLoad(t)}:{},{render:{loading:()=>'<ful-spinner class="centered p-2"></ful-spinner>'}},this.tsConfig)),this.ts.on("change",(t=>{T.dispatchChange(this,this.value)})),i.addEventListener("change",(t=>{t.stopPropagation()})),i.remove(),t.renderTo(this,{id:a,tsId:o,name:n,input:i,slots:e})}#h;set loader(t){this.#h=t,this.hasAttribute("value")&&(this.value=this.getAttribute("value"))}get value(){const t=this.ts.getValue();return""===t?null:t}set value(t){(async()=>{this._remote&&await this._unwrappedRemoteLoad({byId:t},this.ts.loadCallback.bind(this.ts));this.ts.setValue(t,!0)})()}}class P extends(k({observed:["value","disabled:state"],slots:!0,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 '})){render(t,e){const s=this.getAttribute("name")||b.uid("ful-radiogroup"),r=Array.from(e.default.querySelectorAll("ful-radio")),n=r.map((t=>{const e=document.createElement("input");e.setAttribute("type","radio"),b.forward("input-",this,e),b.forward("",t,e),e.setAttribute("name",`${s}-ignore`),e.setAttribute("ful-validation-target",""),e.dataset.fulBindInclude="never",e.addEventListener("change",(e=>{e.stopPropagation(),T.dispatchChange(t,this.value)}));return[e,w.fromChildNodes(t)]}));r.forEach((t=>t.remove())),t.renderTo(this,{name:s,slots:e,inputsAndLabels:n})}get value(){const t=this.querySelector("input[type=radio]:checked");return t?t.value:null}set value(t){T.dispatchChange(this,t)&&(this.querySelector(`input[type=radio][value=${CSS.escape(t)}]`).checked=!0)}}class F extends(k({slots:!0,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 '})){render(t,e){t.renderTo(this,{slots:e})}}return t.Attributes=b,t.AuthorizationCodeFlow=p,t.AuthorizationCodeFlowInterceptor=m,t.AuthorizationCodeFlowSession=f,t.Base64=e,t.Deferred=class{constructor(){this.promise=new Promise(((t,e)=>{this.reject=e,this.resolve=t}))}},t.ElementsRegistry=E,t.Events=T,t.Failure=i,t.Form=R,t.Fragments=w,t.Hex=class{static decode(t){if(t.length%2!=0)throw new Error("invalid length");const e=t.length/2;return new Uint8Array(e).map(((e,s)=>{const r=2*s,n=t.substring(r,r+2);return parseInt(n,16)}))}static encode(t,e){return Array.from(t).map((t=>t.toString(16))).map((t=>e?t.toUpperCase():t)).map((t=>t.padStart(2,0))).join("")}},t.HttpClient=c,t.INPUT_TEMPLATE=I,t.Input=x,t.LightSlots=v,t.LocalStorage=class extends d{constructor(t){super(t,localStorage)}},t.Nodes=y,t.ParsedElement=k,t.RadioGroup=P,t.Select=D,t.SessionStorage=h,t.Spinner=F,t.TemplatesRegistry=A,t.VersionedStorage=class{constructor(t,e,s){this.storage=t,this.key=e,this.dataSupplier=s,this.cache=null}async load(t){const e=this.storage.load(this.key);if(e&&e.revision===t)return void(this.cache=e.value);const s=await this.dataSupplier(t,this.key);this.storage.save(this.key,{revision:t,value:s}),this.cache=s}data(){return this.cache}},t.elements=_,t.jsonPatch=function(t,e){return u("PATCH",t,e)},t.jsonPost=function(t,e){return u("POST",t,e)},t.jsonPut=function(t,e){return u("PUT",t,e)},t.jsonRequest=u,t.makeInputFragment=N,t.timing=g,Object.defineProperty(t,"__esModule",{value:!0}),t}({});
2
2
  //# sourceMappingURL=ful.iife.min.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ful.iife.min.js","sources":["../src/encodings.mjs","../src/http-client.mjs","../src/storage.mjs","../src/oauth-authorization-code.mjs","../src/timing.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","../src/deferred.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 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(el, 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 };","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 }"],"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","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","Error","parseProblems","text","def","type","reason","details","JSON","parse","e","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","Storage","prefix","storage","save","setItem","load","got","getItem","remove","removeItem","pop","decoded","SessionStorage","sessionStorage","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","Fragments","fromHtml","html","el","createElement","innerHTML","join","content","toHtml","fragment","appendChild","from","nodes","DocumentFragment","append","fromChildNodes","childNodes","Attributes","static","uid","id","defaultValue","hasAttribute","setAttribute","forward","to","getAttributeNames","filter","a","target","classList","add","toggle","attr","value","removeAttribute","flip","LightSlots","namedSlots","Array","matches","map","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","data","loader","ts","TomSelect","preload","shouldLoad","loading","on","renderTo","l","getValue","loadCallback","setValue","RadioGroup","radioEls","inputsAndLabels","Spinner","promise","reject","hex","lenInBytes","offset","octet","parseInt","bytes","upper","b","toString","toUpperCase","o","padStart","localStorage","key","dataSupplier","cache","revision","saved","freshData"],"mappings":"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"}
1
+ {"version":3,"file":"ful.iife.min.js","sources":["../src/encodings.mjs","../src/http-client.mjs","../src/storage.mjs","../src/oauth-authorization-code.mjs","../src/timing.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","../src/deferred.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 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(el, 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 };","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 }"],"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","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","Error","parseProblems","text","def","type","reason","details","JSON","parse","e","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","Storage","prefix","storage","save","setItem","load","got","getItem","remove","removeItem","pop","decoded","SessionStorage","sessionStorage","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","Fragments","fromHtml","html","el","createElement","innerHTML","join","content","toHtml","fragment","appendChild","from","nodes","DocumentFragment","append","fromChildNodes","childNodes","Attributes","static","uid","id","defaultValue","hasAttribute","setAttribute","forward","to","getAttributeNames","filter","a","target","classList","add","toggle","attr","value","removeAttribute","flip","LightSlots","namedSlots","Array","matches","map","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","data","loader","ts","TomSelect","preload","shouldLoad","loading","on","renderTo","l","getValue","loadCallback","setValue","RadioGroup","radioEls","inputsAndLabels","Spinner","promise","reject","hex","lenInBytes","offset","octet","parseInt","bytes","upper","b","toString","toUpperCase","o","padStart","localStorage","key","dataSupplier","cache","revision","saved","freshData"],"mappings":"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"}
package/dist/ful.min.mjs CHANGED
@@ -1,2 +1,2 @@
1
- class t{static encode(e,s){const r=s||t.URL_SAFE,n=e.byteLength,i=new Uint8Array(e);let a="";for(let t=0;t<n;t+=3){a+=r[i[t]>>2]+r[(3&i[t])<<4|i[t+1]>>4]+r[(15&i[t+1])<<2|i[t+2]>>6]+r[63&i[t+2]]}return n%3==2?a=a.substring(0,a.length-1):n%3==1&&(a=a.substring(0,a.length-2)),a}static decode(e,s){const r=s||t.URL_SAFE;let n=Math.floor(.75*e.length);for(let t=0;t!==e.length&&"="===e[e.length-t-1];++t)--n;const i=new Uint8Array(n);let a=0,o=0;for(;a<.75*e.length;){const t=r.indexOf(e.charAt(o++)),s=r.indexOf(e.charAt(o++)),n=r.indexOf(e.charAt(o++)),l=r.indexOf(e.charAt(o++));i[a++]=t<<2|s>>4,i[a++]=(15&s)<<4|n>>2,i[a++]=(3&n)<<6|l}return i.buffer}}t.STANDARD="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",t.URL_SAFE="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";class e{static decode(t){if(t.length%2!=0)throw new Error("invalid length");const e=t.length/2;return new Uint8Array(e).map(((e,s)=>{const r=2*s,n=t.substring(r,r+2);return parseInt(n,16)}))}static encode(t,e){return Array.from(t).map((t=>t.toString(16))).map((t=>e?t.toUpperCase():t)).map((t=>t.padStart(2,0))).join("")}}class s{constructor(){const t=document.querySelector("meta[name='context']").getAttribute("content");this.context=t.endsWith("/")?t.substring(0,t.length-1):t}async intercept(t,e){const s=t.resource.startsWith("/")?"":"/";return t.resource=this.context+s+t.resource,await e.proceed(t)}}class r{constructor(){this.k=document.querySelector("meta[name='_csrf_header']").getAttribute("content"),this.v=document.querySelector("meta[name='_csrf']").getAttribute("content")}async intercept(t,e){const s=new Headers(t.options.headers);return s.set(this.k,this.v),t.options.headers=s,await e.proceed(t)}}class n{constructor(t){this.redirectUri=t}async intercept(t,e){const s=await e.proceed(t);if(401!==s.status)return s;window.location.href=this.redirectUri}}class i extends Error{static parseProblems(t,e){const s=[{type:"GENERIC_PROBLEM",context:null,reason:`${t}: ${e}`,details:null}];try{return e?JSON.parse(e):s}catch(t){return s}}static fromResponse(t,e){return new i(t,i.parseProblems(t,e))}constructor(t,e){super(JSON.stringify(e)),this.name=`Failure:${t}`,this.status=t,this.problems=e}}class a{constructor(){this.interceptors=[]}withContext(){return this.interceptors.push(new s),this}withCsrfToken(){return this.interceptors.push(new r),this}withRedirectOnUnauthorized(t){return this.interceptors.push(new n(t)),this}withInterceptors(...t){return this.interceptors.push(...t),this}build(){const t=this.interceptors;return new c({interceptors:t})}}class o{async intercept(t,e){return await fetch(t.resource,t.options)}}class l{constructor(t,e){this.interceptors=t,this.current=e}async proceed(t){const e=this.interceptors[this.current];return await e.intercept(t,new l(this.interceptors,this.current+1))}}class c{static builder(){return new a}constructor({interceptors:t}){this.interceptors=t||[]}async exchange(t,e){const s=e||{},r=[...this.interceptors,...s.interceptors||[],new o],n=new l(r,0);return await n.proceed({resource:t,options:s})}async fetch(t,e){const s=await this.exchange(t,e);if(!s.ok){const t=await s.text();throw i.fromResponse(s.status,t)}return s}async json(t,e){try{const s=await this.fetch(t,e),r=await s.text();return r?JSON.parse(r):void 0}catch(t){if(t instanceof i)throw t;throw new i(0,[{type:"CONNECTION_PROBLEM",context:null,reason:t.message,details:null}])}}}function u(t,e,s){return{headers:{"Content-Type":"application/json",...s},method:t,body:JSON.stringify(e)}}function d(t,e){return u("POST",t,e)}function h(t,e){return u("PUT",t,e)}function p(t,e){return u("PATCH",t,e)}class f{constructor(t,e){this.prefix=t,this.storage=e}save(t,e){this.storage.setItem(`${this.prefix}-${t}`,JSON.stringify(e))}load(t){const e=this.storage.getItem(`${this.prefix}-${t}`);return void 0===e?void 0:JSON.parse(e)}remove(t){this.storage.removeItem(`${this.prefix}-${t}`)}pop(t){const e=this.load(t);return this.remove(t),e}}class m extends f{constructor(t){super(t,localStorage)}}class g extends f{constructor(t){super(t,sessionStorage)}}class b{constructor(t,e,s){this.storage=t,this.key=e,this.dataSupplier=s,this.cache=null}async load(t){const e=this.storage.load(this.key);if(e&&e.revision===t)return void(this.cache=e.value);const s=await this.dataSupplier(t,this.key);this.storage.save(this.key,{revision:t,value:s}),this.cache=s}data(){return this.cache}}class w{static forKeycloak(t,e,s){return new w(t,"openid profile",{auth:new URL("protocol/openid-connect/auth",e),token:new URL("protocol/openid-connect/token",e),logout:new URL("protocol/openid-connect/logout",e),registration:new URL("protocol/openid-connect/registrations",e),redirect:s})}constructor(t,e,{auth:s,token:r,registration:n,logout:i,redirect:a}){this.storage=new g(t),this.clientId=t,this.scope=e,this.uri={auth:s,token:r,registration:n,logout:i,redirect:a}}async action(e,s){const r=t.encode(crypto.getRandomValues(new Uint8Array(32)).buffer),n=t.encode(await crypto.subtle.digest("SHA-256",(new TextEncoder).encode(r))),i=this.clientId+t.encode(crypto.getRandomValues(new Uint8Array(16)).buffer);this.storage.save(w.PKCE_AND_STATE_KEY,{state:i,verifier:r});const a=new URL(e);a.searchParams.set("client_id",this.clientId),a.searchParams.set("redirect_uri",this.uri.redirect),a.searchParams.set("response_type","code"),a.searchParams.set("scope",this.scope),a.searchParams.set("state",i),a.searchParams.set("code_challenge",n),a.searchParams.set("code_challenge_method","S256"),Object.entries(s||{}).forEach((t=>{a.searchParams.set(t[0],t[1])})),window.location=a}async registration(t){await this.action(this.uri.registration,t)}async applicationInitiatedAction(t){await this.action(this.uri.auth,{kc_action:t})}async _tokenExchange(t,e){window.history.replaceState("","",this.uri.redirect);const s=this.storage.pop(w.PKCE_AND_STATE_KEY);if(s.state!==e)throw new Error("State mismatch");const r=await fetch(this.uri.token,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams([["client_id",this.clientId],["code",t],["grant_type","authorization_code"],["code_verifier",s.verifier],["state",s.state],["redirect_uri",this.uri.redirect]])});if(!r.ok){const t=await r.text();throw new Error("Error:"+r.status+": "+t)}const n=await r.json();return new v(this.clientId,n,this.uri)}async ensureLoggedIn(){const t=new URL(window.location.href),e=t.searchParams.get("code");if(e&&this.storage.load(w.PKCE_AND_STATE_KEY)){const s=t.searchParams.get("state");return await this._tokenExchange(e,s)}return await this.action(this.uri.auth,{}),null}}w.PKCE_AND_STATE_KEY="state-and-verifier";class v{static parseToken(e){const[s,r,n]=e.split("."),i=new TextDecoder("utf-8");return{header:JSON.parse(i.decode(t.decode(s,t.STANDARD))),payload:JSON.parse(i.decode(t.decode(r,t.STANDARD))),signature:n}}constructor(t,e,{token:s,logout:r,redirect:n}){this.clientId=t,this.token=e,this.accessToken=v.parseToken(e.access_token),this.refreshToken=v.parseToken(e.refresh_token),this.uri={token:s,logout:r,redirect:n},this.refreshCallback=null}onRefresh(t){this.refreshCallback=t}async refresh(){const t=await fetch(this.uri.token,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams([["client_id",this.clientId],["grant_type","refresh_token"],["refresh_token",this.token.refresh_token]])});if(!t.ok)throw new Error("Error:"+t.status+": "+t.text());const e=await t.json();this.token=e,this.accessToken=v.parseToken(e.access_token),this.refreshToken=v.parseToken(e.refresh_token),this.refreshCallback&&this.refreshCallback(this.token,this.accessToken,this.refreshToken)}shouldBeRefreshed(t){const e=(new Date).getTime(),s=1e3*this.refreshToken.payload.exp;return!(e>s)&&e-t>s}async refreshIf(t){this.shouldBeRefreshed(t)&&await this.refresh()}logout(){const t=new URL(this.uri.logout);t.searchParams.set("post_logout_redirect_uri",this.uri.redirect),t.searchParams.set("id_token_hint",this.token.id_token),window.location=t}bearerToken(){return`Bearer ${this.token.access_token}`}interceptor(t,e){return new y(this,t,e)}}class y{constructor(t,e,s){this.session=t,this.gracePeriodBefore=e||2e3,this.gracePeriodAfter=s||3e4}async intercept(t,e){await this.session.refreshIf(this.gracePeriodBefore);const s=new Headers(t.options.headers);s.set("Authorization",this.session.bearerToken()),t.options.headers=s;const r=await e.proceed(t);return await this.session.refreshIf(this.gracePeriodAfter),r}}const T={sleep:t=>new Promise((e=>setTimeout(e,t))),DEBOUNCE_DEFAULT:0,DEBOUNCE_IMMEDIATE:1,debounce(t,e,s){let r=null,n=[],i=0,a=s||T.DEBOUNCE_DEFAULT;const o=()=>{const s=(new Date).getTime()-i;t>s?r=setTimeout(o,t-s):(r=null,a!==T.DEBOUNCE_IMMEDIATE&&e(...n),null===r&&(n=[]))};return function(){n=arguments,i=(new Date).getTime(),null===r&&(r=setTimeout(o,t),a===T.DEBOUNCE_IMMEDIATE&&e(...n))}},THROTTLE_DEFAULT:0,THROTTLE_NO_LEADING:1,THROTTLE_NO_TRAILING:2,throttle(t,e,s){let r=null,n=[],i=0,a=s||T.THROTTLE_DEFAULT;const o=()=>{i=a&T.THROTTLE_NO_LEADING?0:(new Date).getTime(),r=null,e(...n),null===r&&(n=[])};return function(){const s=(new Date).getTime();!i&&a&T.THROTTLE_NO_LEADING&&(i=s);const l=t-(s-i);n=arguments,l<=0||l>t?(null!==r&&(clearTimeout(r),r=null),i=s,e(...n),null===r&&(n=[])):null!==r||a&T.THROTTLE_NO_TRAILING||(r=setTimeout(o,l))}}};class A{constructor(){this.promise=new Promise(((t,e)=>{this.reject=e,this.resolve=t}))}}class E{static fromHtml(...t){const e=document.createElement("template");return e.innerHTML=t.join(""),e.content}static toHtml(t){var e=document.createElement("template");return e.content.appendChild(t),e.innerHTML}static from(...t){const e=new DocumentFragment;return e.append(...t),e}static fromChildNodes(t){const e=new DocumentFragment;return e.append(...t.childNodes),e}}class _{static id=0;static uid(t){return`${t}-${++_.id}`}static defaultValue(t,e,s){return t.hasAttribute(e)||t.setAttribute(e,s),t.getAttribute(e)}static forward(t,e,s){e.getAttributeNames().filter((e=>e.startsWith(t))).forEach((r=>{const n=r.substring(t.length);"class"!==n?s.setAttribute(n,e.getAttribute(r)):s.classList.add(...e.getAttribute(t+"class").split(" ").filter((t=>t.length)))}))}static toggle(t,e,s){s?t.setAttribute(e,""):t.removeAttribute(e)}static flip(t,e){t.hasAttribute(e)?t.removeAttribute(e):t.setAttribute(e,"")}}class S{static from(t){const e=Array.from(t.childNodes).filter((t=>t.matches&&t.matches("[slot]"))).map((t=>{t.remove();const e=t.getAttribute("slot");return t.removeAttribute("slot"),[e,t]})),s={};s.default=new DocumentFragment,s.default.append(...t.childNodes);for(const[t,r]of e)t in s||(s[t]=new DocumentFragment),s[t].append(r);return s}}class L{static isParsed(t){for(var e=t;e;e=e.parentNode)if(e.nextSibling)return!0;return!1}}class k{static dispatchChange(t,e){return t.dispatchEvent(new CustomEvent("change",{bubbles:!0,cancelable:!0,detail:{target:t,value:e}}))}}class O{#t={};#e={};#s;put(t,e){this.#s?this.#e[t]=Template.fromFragment(e,ec):this.#t[t]=e}get(t){if(!this.#s)throw new Error("TemplatesRegistry is not configured");const e=this.#e[t];if(!e)throw new Error(`missing template: '${t}'`);return e}configure(t){this.#s=t;for(const[e,s]of Object.entries(this.#t))delete this.#t[e],this.#e[e]=ftl.Template.fromFragment(s,t)}}class C{#r;#n;#i;#a=0;constructor(){this.#r=new O,this.#n={}}defineTemplate(t){if(null==t)return;const e="unnamed-"+ ++this.#a;return this.#r.put(e,E.fromHtml(t)),e}template(t){if(null!=t)return this.#r.get(t)}define(t,e){return this.#i?(customElements.define(t,e),this):(this.#n[t]=e,this)}configure(t){this.#r.configure(t);for(const[t,e]of Object.entries(this.#n))customElements.define(t,e),delete this.#n[t];this.#i=!0}}const R=new C;const I=new class{#o=[];constructor(){document.addEventListener("DOMContentLoaded",this.dequeue.bind(this))}enqueue(t){this.#o.length||requestAnimationFrame(this.dequeue.bind(this)),this.#o.push(t)}dequeue(){this.#o.splice(0).forEach((t=>t.upgrade()))}},N={string:t=>t,number:t=>null===t?null:Number(t),presence:t=>null!==t,state:t=>null!==t,bool:t=>"true"===t,json:t=>JSON.parse(t)},x=t=>{const{observed:e,template:s,slots:r}=t||{},n=(e||[]).map((t=>{const[e,s]=t.split(":"),r=s?.trim()||"string";if(!(r in N))throw new Error(`unsupported attribute type: ${r}`);return[e.trim(),r]})),i=n.map((([t,e])=>[t,N[e]])),a=Object.fromEntries(i),o=R.defineTemplate(s),l=class extends HTMLElement{static get observedAttributes(){return Object.keys(a)}#l;#c;#u;#d;constructor(...t){super(...t),this.#d=this.attachInternals()}get initialized(){return this.#c}get internals(){return this.#d}connectedCallback(){if(this.#l)return;if("complete"===this.ownerDocument.readyState||L.isParsed(this))return void I.enqueue(this);this.ownerDocument.addEventListener("DOMContentLoaded",(()=>{t.disconnect(),I.enqueue(this)}));const t=new MutationObserver((()=>{L.isParsed(this)&&(t.disconnect(),I.enqueue(this))}));t.observe(this.parentNode,{childList:!0,subtree:!0})}attributeChangedCallback(t,e,s){if(!this.#l||e===s)return;if(this.#u)return;const r=a[t];this[t]=r(s)}reflect(t){this.#u=!0;try{t()}finally{this.#u=!1}}async upgrade(){if(!this.#l){this.#l=!0,await this.render(R.template(o),r?S.from(this):void 0);for(const[t,e]of i)this.hasAttribute(t)&&(this[t]=e(this.getAttribute(t)));this.#c=!0}}};for(const[t,e]of n.filter((([t,e])=>"state"===e)))Object.defineProperty(l.prototype,t,{enumerable:!0,configurable:!0,get(){return this.internals.states.has(`--${t}`)},set(e){this.internals.states[e?"add":"delete"](`--${t}`),this.reflect((()=>_.toggle(this,t,e)))}});return l};function D(t,e){return Object.keys(t).reduce(((s,r)=>{const n=e.length?e+".":"";return"object"==typeof t[r]&&null!==t[r]?Object.assign(s,D(t[r],n+r)):s[n+r]=t[r],s}),{})}function P(t,e){"radio"!==t.getAttribute("type")?"checkbox"!==t.getAttribute("type")?t.value=e:t.checked=e:t.checked=t.getAttribute("value")===e}class U extends(x()){static IGNORED_CHILDREN_SELECTOR=".d-none, [hidden]";static SCROLL_OFFSET=50;render(){const t=document.createElement("form");t.replaceChildren(...this.childNodes),t.addEventListener("submit",(async t=>{t.preventDefault(),this.spinning((async()=>{await(this.submitter?.(this.values,this))}))})),this.replaceChildren(t)}spinner(t){this.querySelectorAll("ful-spinner").forEach((e=>e.hidden=!t)),this.querySelectorAll("[type=submit],[type=reset]").forEach((e=>e.disabled=t))}async remoting(t){try{await t()}catch(t){throw t instanceof i&&(this.errors=t.problems),t}}async spinningUntilError(t){this.spinner(!0);try{await this.remoting(t)}catch(t){throw this.spinner(!1),t}}async spinning(t){this.spinner(!0);try{await this.remoting(t)}finally{this.spinner(!1)}}set values(t){for(const[e,s]of Object.entries(D(t,"")))this.querySelectorAll(`[name='${CSS.escape(e)}']`).forEach((t=>P(t,s)))}get values(){return Array.from(this.querySelectorAll("[name]")).filter((t=>"never"!==t.dataset.fulBindInclude&&("always"===t.dataset.fulBindInclude||null===t.closest(U.IGNORED_CHILDREN_SELECTOR)))).reduce(((t,e)=>function(t,e,s){const r=e.split(".").map((t=>t.match(/^[0-9]+$/)?+t:t));let n=t,i=null;for(let e=0;;++e){const a=r[e],o=r[e-1];if(Number.isInteger(a)&&!Array.isArray(n)&&(null!==i?i[o]=n=[]:t=n=[]),e===r.length-1)return n[a]=void 0!==s?s:a in n?n[a]:null,t;void 0===n[a]&&(n[a]={}),i=n,n=n[a]}}(t,e.getAttribute("name"),function(t){if("radio"===t.getAttribute("type")){if(!t.checked)return;return"boolean"===t.dataset.fulBindType?"true"===t.value:t.value}return"checkbox"===t.getAttribute("type")?t.checked:"boolean"===t.dataset.fulBindType?t.value?"true"===t.value:null:""===t.value||void 0===t.value?null:t.value}(e))),{})}set errors(t){const e=t.filter((t=>"FIELD_ERROR"===t.type||"INVALID_FORMAT"===t.type)),s=t.filter((t=>"FIELD_ERROR"!==t.type&&"INVALID_FORMAT"!==t.type));if(this.querySelectorAll(".is-invalid").forEach((t=>t.classList.remove("is-invalid"))),this.querySelectorAll("ful-errors").forEach((t=>{t.replaceChildren(),t.setAttribute("hidden","")})),e.forEach((t=>{const e=t.context.replace("[",".").replace("].","."),s=`[name='${CSS.escape(e)}'] [ful-validation-target],[name='${CSS.escape(e)}']:not(:has([ful-validation-target]))`;this.querySelectorAll(s).forEach((t=>t.classList.add("is-invalid")));const r=`ful-field-error[field='${CSS.escape(e)}']`;this.querySelectorAll(r).forEach((e=>e.innerText=t.reason))})),this.querySelectorAll("ful-errors").forEach((t=>{t.innerText=s.map((t=>t.reason)).join("\n"),0!==s.length&&t.removeAttribute("hidden")})),!this.hasAttribute("scroll-on-error"))return;const r=Array.from(this.querySelectorAll("[ful-validated-field]:has(.is-invalid) ful-field-error")).map((t=>t.parentElement?t.parentElement:t)).map((t=>t.getBoundingClientRect().y+window.scrollY)),n=Math.min(...r);n!==1/0&&window.scroll(window.scrollX,n>U.SCROLL_OFFSET?n-U.SCROLL_OFFSET:0)}}const q='\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',F=(t,e,s)=>{const r=t.input=s.input=s.input?.firstElementChild||(()=>{const t=document.createElement("input");return t.classList.add("form-control"),t})();r.setAttribute("ful-validation-target",""),r.addEventListener("change",(e=>{e.stopPropagation(),k.dispatchChange(t,t.value)}));const n=r.getAttribute("id")||t.getAttribute("input-id")||_.uid("ful-input");_.forward("input-",t,s.input),_.defaultValue(s.input,"id",n),_.defaultValue(s.input,"type","text"),_.defaultValue(s.input,"placeholder"," ");const i=t.getAttribute("name");return e.render(t,{id:n,name:i,slots:s})};class $ extends(x({observed:["value"],slots:!0,template:q})){render(t,e){const s=F(this,t,e);this.replaceChildren(s)}get value(){return this.input.value}set value(t){this.input.value=t}}class j extends(x({observed:["value"],slots:!0,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 '})){constructor(t){super(),this.tsConfig=t}render(t,e){const s="local"!=(this.getAttribute("type")||"local"),r="always"!=this.getAttribute("load"),n=this.getAttribute("name"),i=e.input=e.input?.firstElementChild||document.createElement("select");i.setAttribute("ful-validation-target","");const a=i.getAttribute("id")||this.getAttribute("input-id")||_.uid("ful-select"),o=`${a}-ts-control`;_.forward("input-",this,i),_.defaultValue(i,"id",a),_.defaultValue(i,"placeholder"," "),e.input=E.from(i),this.loaded=!s;this._remote=s,this._unwrappedRemoteLoad=async(t,e)=>{if(!s||s&&r&&this.loaded)return void e();const n=t&&t.hasOwnProperty("byId")?"id":"query",i="id"===n?t.byId:t,a=await(this.#h?this.#h(i,n):[]);"id"!==n&&(this.loaded=!0),e(a)},this.ts=new TomSelect(i,Object.assign(s?{preload:"focus",load:this._unwrappedRemoteLoad,shouldLoad:t=>!this.shouldLoad||this.shouldLoad(t)}:{},{render:{loading:()=>'<ful-spinner class="centered p-2"></ful-spinner>'}},this.tsConfig)),this.ts.on("change",(t=>{k.dispatchChange(this,this.value)})),i.addEventListener("change",(t=>{t.stopPropagation()})),i.remove(),t.renderTo(this,{id:a,tsId:o,name:n,input:i,slots:e})}#h;set loader(t){this.#h=t,this.hasAttribute("value")&&(this.value=this.getAttribute("value"))}get value(){const t=this.ts.getValue();return""===t?null:t}set value(t){(async()=>{this._remote&&await this._unwrappedRemoteLoad({byId:t},this.ts.loadCallback.bind(this.ts));this.ts.setValue(t,!0)})()}}class H extends(x({observed:["value","disabled:state"],slots:!0,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 '})){render(t,e){const s=this.getAttribute("name")||_.uid("ful-radiogroup"),r=Array.from(e.default.querySelectorAll("ful-radio")),n=r.map((t=>{const e=document.createElement("input");e.setAttribute("type","radio"),_.forward("input-",this,e),_.forward("",t,e),e.setAttribute("name",`${s}-ignore`),e.setAttribute("ful-validation-target",""),e.dataset.fulBindInclude="never",e.addEventListener("change",(e=>{e.stopPropagation(),k.dispatchChange(t,this.value)}));return[e,E.fromChildNodes(t)]}));r.forEach((t=>t.remove())),t.renderTo(this,{name:s,slots:e,inputsAndLabels:n})}get value(){const t=this.querySelector("input[type=radio]:checked");return t?t.value:null}set value(t){k.dispatchChange(this,t)&&(this.querySelector(`input[type=radio][value=${CSS.escape(t)}]`).checked=!0)}}class B extends(x({slots:!0,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 '})){render(t,e){t.renderTo(this,{slots:e})}}export{_ as Attributes,w as AuthorizationCodeFlow,y as AuthorizationCodeFlowInterceptor,v as AuthorizationCodeFlowSession,t as Base64,A as Deferred,C as ElementsRegistry,i as Failure,U as Form,E as Fragments,e as Hex,c as HttpClient,q as INPUT_TEMPLATE,$ as Input,S as LightSlots,m as LocalStorage,L as Nodes,x as ParsedElement,H as RadioGroup,j as Select,g as SessionStorage,B as Spinner,O as TemplatesRegistry,b as VersionedStorage,R as elements,p as jsonPatch,d as jsonPost,h as jsonPut,u as jsonRequest,F as makeInputFragment,T as timing};
1
+ class t{static encode(e,s){const r=s||t.URL_SAFE,n=e.byteLength,i=new Uint8Array(e);let a="";for(let t=0;t<n;t+=3){a+=r[i[t]>>2]+r[(3&i[t])<<4|i[t+1]>>4]+r[(15&i[t+1])<<2|i[t+2]>>6]+r[63&i[t+2]]}return n%3==2?a=a.substring(0,a.length-1):n%3==1&&(a=a.substring(0,a.length-2)),a}static decode(e,s){const r=s||t.URL_SAFE;let n=Math.floor(.75*e.length);for(let t=0;t!==e.length&&"="===e[e.length-t-1];++t)--n;const i=new Uint8Array(n);let a=0,o=0;for(;a<.75*e.length;){const t=r.indexOf(e.charAt(o++)),s=r.indexOf(e.charAt(o++)),n=r.indexOf(e.charAt(o++)),l=r.indexOf(e.charAt(o++));i[a++]=t<<2|s>>4,i[a++]=(15&s)<<4|n>>2,i[a++]=(3&n)<<6|l}return i.buffer}}t.STANDARD="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",t.URL_SAFE="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";class e{static decode(t){if(t.length%2!=0)throw new Error("invalid length");const e=t.length/2;return new Uint8Array(e).map(((e,s)=>{const r=2*s,n=t.substring(r,r+2);return parseInt(n,16)}))}static encode(t,e){return Array.from(t).map((t=>t.toString(16))).map((t=>e?t.toUpperCase():t)).map((t=>t.padStart(2,0))).join("")}}class s{constructor(){const t=document.querySelector("meta[name='context']").getAttribute("content");this.context=t.endsWith("/")?t.substring(0,t.length-1):t}async intercept(t,e){const s=t.resource.startsWith("/")?"":"/";return t.resource=this.context+s+t.resource,await e.proceed(t)}}class r{constructor(){this.k=document.querySelector("meta[name='_csrf_header']").getAttribute("content"),this.v=document.querySelector("meta[name='_csrf']").getAttribute("content")}async intercept(t,e){const s=new Headers(t.options.headers);return s.set(this.k,this.v),t.options.headers=s,await e.proceed(t)}}class n{constructor(t){this.redirectUri=t}async intercept(t,e){const s=await e.proceed(t);if(401!==s.status)return s;window.location.href=this.redirectUri}}class i extends Error{static parseProblems(t,e){const s=[{type:"GENERIC_PROBLEM",context:null,reason:`${t}: ${e}`,details:null}];try{return e?JSON.parse(e):s}catch(t){return s}}static fromResponse(t,e){return new i(t,i.parseProblems(t,e))}constructor(t,e){super(JSON.stringify(e)),this.name=`Failure:${t}`,this.status=t,this.problems=e}}class a{constructor(){this.interceptors=[]}withContext(){return this.interceptors.push(new s),this}withCsrfToken(){return this.interceptors.push(new r),this}withRedirectOnUnauthorized(t){return this.interceptors.push(new n(t)),this}withInterceptors(...t){return this.interceptors.push(...t),this}build(){const t=this.interceptors;return new c({interceptors:t})}}class o{async intercept(t,e){return await fetch(t.resource,t.options)}}class l{constructor(t,e){this.interceptors=t,this.current=e}async proceed(t){const e=this.interceptors[this.current];return await e.intercept(t,new l(this.interceptors,this.current+1))}}class c{static builder(){return new a}constructor({interceptors:t}){this.interceptors=t||[]}async exchange(t,e){const s=e||{},r=[...this.interceptors,...s.interceptors||[],new o],n=new l(r,0);return await n.proceed({resource:t,options:s})}async fetch(t,e){const s=await this.exchange(t,e);if(!s.ok){const t=await s.text();throw i.fromResponse(s.status,t)}return s}async json(t,e){try{const s=await this.fetch(t,e),r=await s.text();return r?JSON.parse(r):void 0}catch(t){if(t instanceof i)throw t;throw new i(0,[{type:"CONNECTION_PROBLEM",context:null,reason:t.message,details:null}])}}}function u(t,e,s){return{headers:{"Content-Type":"application/json",...s},method:t,body:JSON.stringify(e)}}function d(t,e){return u("POST",t,e)}function h(t,e){return u("PUT",t,e)}function p(t,e){return u("PATCH",t,e)}class f{constructor(t,e){this.prefix=t,this.storage=e}save(t,e){this.storage.setItem(`${this.prefix}-${t}`,JSON.stringify(e))}load(t){const e=this.storage.getItem(`${this.prefix}-${t}`);return void 0===e?void 0:JSON.parse(e)}remove(t){this.storage.removeItem(`${this.prefix}-${t}`)}pop(t){const e=this.load(t);return this.remove(t),e}}class m extends f{constructor(t){super(t,localStorage)}}class g extends f{constructor(t){super(t,sessionStorage)}}class b{constructor(t,e,s){this.storage=t,this.key=e,this.dataSupplier=s,this.cache=null}async load(t){const e=this.storage.load(this.key);if(e&&e.revision===t)return void(this.cache=e.value);const s=await this.dataSupplier(t,this.key);this.storage.save(this.key,{revision:t,value:s}),this.cache=s}data(){return this.cache}}class w{static forKeycloak(t,e,s){return new w(t,"openid profile",{auth:new URL("protocol/openid-connect/auth",e),token:new URL("protocol/openid-connect/token",e),logout:new URL("protocol/openid-connect/logout",e),registration:new URL("protocol/openid-connect/registrations",e),redirect:s})}constructor(t,e,{auth:s,token:r,registration:n,logout:i,redirect:a}){this.storage=new g(t),this.clientId=t,this.scope=e,this.uri={auth:s,token:r,registration:n,logout:i,redirect:a}}async action(e,s){const r=t.encode(crypto.getRandomValues(new Uint8Array(32)).buffer),n=t.encode(await crypto.subtle.digest("SHA-256",(new TextEncoder).encode(r))),i=this.clientId+t.encode(crypto.getRandomValues(new Uint8Array(16)).buffer);this.storage.save(w.PKCE_AND_STATE_KEY,{state:i,verifier:r});const a=new URL(e);a.searchParams.set("client_id",this.clientId),a.searchParams.set("redirect_uri",this.uri.redirect),a.searchParams.set("response_type","code"),a.searchParams.set("scope",this.scope),a.searchParams.set("state",i),a.searchParams.set("code_challenge",n),a.searchParams.set("code_challenge_method","S256"),Object.entries(s||{}).forEach((t=>{a.searchParams.set(t[0],t[1])})),window.location=a}async registration(t){await this.action(this.uri.registration,t)}async applicationInitiatedAction(t){await this.action(this.uri.auth,{kc_action:t})}async _tokenExchange(t,e){window.history.replaceState("","",this.uri.redirect);const s=this.storage.pop(w.PKCE_AND_STATE_KEY);if(s.state!==e)throw new Error("State mismatch");const r=await fetch(this.uri.token,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams([["client_id",this.clientId],["code",t],["grant_type","authorization_code"],["code_verifier",s.verifier],["state",s.state],["redirect_uri",this.uri.redirect]])});if(!r.ok){const t=await r.text();throw new Error("Error:"+r.status+": "+t)}const n=await r.json();return new v(this.clientId,n,this.uri)}async ensureLoggedIn(){const t=new URL(window.location.href),e=t.searchParams.get("code");if(e&&this.storage.load(w.PKCE_AND_STATE_KEY)){const s=t.searchParams.get("state");return await this._tokenExchange(e,s)}return await this.action(this.uri.auth,{}),null}}w.PKCE_AND_STATE_KEY="state-and-verifier";class v{static parseToken(e){const[s,r,n]=e.split("."),i=new TextDecoder("utf-8");return{header:JSON.parse(i.decode(t.decode(s,t.STANDARD))),payload:JSON.parse(i.decode(t.decode(r,t.STANDARD))),signature:n}}constructor(t,e,{token:s,logout:r,redirect:n}){this.clientId=t,this.token=e,this.accessToken=v.parseToken(e.access_token),this.refreshToken=v.parseToken(e.refresh_token),this.uri={token:s,logout:r,redirect:n},this.refreshCallback=null}onRefresh(t){this.refreshCallback=t}async refresh(){const t=await fetch(this.uri.token,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams([["client_id",this.clientId],["grant_type","refresh_token"],["refresh_token",this.token.refresh_token]])});if(!t.ok)throw new Error("Error:"+t.status+": "+t.text());const e=await t.json();this.token=e,this.accessToken=v.parseToken(e.access_token),this.refreshToken=v.parseToken(e.refresh_token),this.refreshCallback&&this.refreshCallback(this.token,this.accessToken,this.refreshToken)}shouldBeRefreshed(t){const e=(new Date).getTime(),s=1e3*this.refreshToken.payload.exp;return!(e>s)&&e-t>s}async refreshIf(t){this.shouldBeRefreshed(t)&&await this.refresh()}logout(){const t=new URL(this.uri.logout);t.searchParams.set("post_logout_redirect_uri",this.uri.redirect),t.searchParams.set("id_token_hint",this.token.id_token),window.location=t}bearerToken(){return`Bearer ${this.token.access_token}`}interceptor(t,e){return new y(this,t,e)}}class y{constructor(t,e,s){this.session=t,this.gracePeriodBefore=e||2e3,this.gracePeriodAfter=s||3e4}async intercept(t,e){await this.session.refreshIf(this.gracePeriodBefore);const s=new Headers(t.options.headers);s.set("Authorization",this.session.bearerToken()),t.options.headers=s;const r=await e.proceed(t);return await this.session.refreshIf(this.gracePeriodAfter),r}}const T={sleep:t=>new Promise((e=>setTimeout(e,t))),DEBOUNCE_DEFAULT:0,DEBOUNCE_IMMEDIATE:1,debounce(t,e,s){let r=null,n=[],i=0,a=s||T.DEBOUNCE_DEFAULT;const o=()=>{const s=(new Date).getTime()-i;t>s?r=setTimeout(o,t-s):(r=null,a!==T.DEBOUNCE_IMMEDIATE&&e(...n),null===r&&(n=[]))};return function(){n=arguments,i=(new Date).getTime(),null===r&&(r=setTimeout(o,t),a===T.DEBOUNCE_IMMEDIATE&&e(...n))}},THROTTLE_DEFAULT:0,THROTTLE_NO_LEADING:1,THROTTLE_NO_TRAILING:2,throttle(t,e,s){let r=null,n=[],i=0,a=s||T.THROTTLE_DEFAULT;const o=()=>{i=a&T.THROTTLE_NO_LEADING?0:(new Date).getTime(),r=null,e(...n),null===r&&(n=[])};return function(){const s=(new Date).getTime();!i&&a&T.THROTTLE_NO_LEADING&&(i=s);const l=t-(s-i);n=arguments,l<=0||l>t?(null!==r&&(clearTimeout(r),r=null),i=s,e(...n),null===r&&(n=[])):null!==r||a&T.THROTTLE_NO_TRAILING||(r=setTimeout(o,l))}}};class A{constructor(){this.promise=new Promise(((t,e)=>{this.reject=e,this.resolve=t}))}}class E{static fromHtml(...t){const e=document.createElement("template");return e.innerHTML=t.join(""),e.content}static toHtml(t){var e=document.createElement("template");return e.content.appendChild(t),e.innerHTML}static from(...t){const e=new DocumentFragment;return e.append(...t),e}static fromChildNodes(t){const e=new DocumentFragment;return e.append(...t.childNodes),e}}class _{static id=0;static uid(t){return`${t}-${++_.id}`}static defaultValue(t,e,s){return t.hasAttribute(e)||t.setAttribute(e,s),t.getAttribute(e)}static forward(t,e,s){e.getAttributeNames().filter((e=>e.startsWith(t))).forEach((r=>{const n=r.substring(t.length);"class"!==n?s.setAttribute(n,e.getAttribute(r)):s.classList.add(...e.getAttribute(t+"class").split(" ").filter((t=>t.length)))}))}static toggle(t,e,s){s?t.setAttribute(e,""):t.removeAttribute(e)}static flip(t,e){t.hasAttribute(e)?t.removeAttribute(e):t.setAttribute(e,"")}}class S{static from(t){const e=Array.from(t.childNodes).filter((t=>t.matches&&t.matches("[slot]"))).map((t=>{t.remove();const e=t.getAttribute("slot");return t.removeAttribute("slot"),[e,t]})),s={};s.default=new DocumentFragment,s.default.append(...t.childNodes);for(const[t,r]of e)t in s||(s[t]=new DocumentFragment),s[t].append(r);return s}}class L{static isParsed(t){for(var e=t;e;e=e.parentNode)if(e.nextSibling)return!0;return!1}}class k{static dispatchChange(t,e){return t.dispatchEvent(new CustomEvent("change",{bubbles:!0,cancelable:!0,detail:{target:t,value:e}}))}}class O{#t={};#e={};#s;put(t,e){this.#s?this.#e[t]=Template.fromFragment(e,ec):this.#t[t]=e}get(t){if(!this.#s)throw new Error("TemplatesRegistry is not configured");const e=this.#e[t];if(!e)throw new Error(`missing template: '${t}'`);return e}configure(t){this.#s=t;for(const[e,s]of Object.entries(this.#t))delete this.#t[e],this.#e[e]=ftl.Template.fromFragment(s,t)}}class C{#r;#n;#i;#a=0;constructor(){this.#r=new O,this.#n={}}defineTemplate(t){if(null==t)return;const e="unnamed-"+ ++this.#a;return this.#r.put(e,E.fromHtml(t)),e}template(t){if(null!=t)return this.#r.get(t)}define(t,e){return this.#i?(customElements.define(t,e),this):(this.#n[t]=e,this)}configure(t){this.#r.configure(t);for(const[t,e]of Object.entries(this.#n))customElements.define(t,e),delete this.#n[t];this.#i=!0}}const R=new C;const I=new class{#o=[];constructor(){document.addEventListener("DOMContentLoaded",this.dequeue.bind(this))}enqueue(t){this.#o.length||requestAnimationFrame(this.dequeue.bind(this)),this.#o.push(t)}dequeue(){this.#o.splice(0).forEach((t=>t.upgrade()))}},N={string:t=>t,number:t=>null===t?null:Number(t),presence:t=>null!==t,state:t=>null!==t,bool:t=>"true"===t,json:t=>JSON.parse(t)},x=t=>{const{observed:e,template:s,slots:r}=t||{},n=(e||[]).map((t=>{const[e,s]=t.split(":"),r=s?.trim()||"string";if(!(r in N))throw new Error(`unsupported attribute type: ${r}`);return[e.trim(),r]})),i=n.map((([t,e])=>[t,N[e]])),a=Object.fromEntries(i),o=R.defineTemplate(s),l=class extends HTMLElement{static get observedAttributes(){return Object.keys(a)}#l;#c;#u;#d;constructor(...t){super(...t),this.#d=this.attachInternals()}get initialized(){return this.#c}get internals(){return this.#d}connectedCallback(){if(this.#l)return;if("complete"===this.ownerDocument.readyState||L.isParsed(this))return void I.enqueue(this);this.ownerDocument.addEventListener("DOMContentLoaded",(()=>{t.disconnect(),I.enqueue(this)}));const t=new MutationObserver((()=>{L.isParsed(this)&&(t.disconnect(),I.enqueue(this))}));t.observe(this.parentNode,{childList:!0,subtree:!0})}attributeChangedCallback(t,e,s){if(!this.#l||e===s)return;if(this.#u)return;const r=a[t];this[t]=r(s)}reflect(t){this.#u=!0;try{t()}finally{this.#u=!1}}async upgrade(){if(!this.#l){this.#l=!0,await this.render(R.template(o),r?S.from(this):void 0);for(const[t,e]of i)this.hasAttribute(t)&&(this[t]=e(this.getAttribute(t)));this.#c=!0}}};for(const[t,e]of n.filter((([t,e])=>"state"===e)))Object.defineProperty(l.prototype,t,{enumerable:!0,configurable:!0,get(){return this.internals.states.has(`--${t}`)},set(e){this.internals.states[e?"add":"delete"](`--${t}`),this.reflect((()=>_.toggle(this,t,e)))}});return l};function D(t,e){return Object.keys(t).reduce(((s,r)=>{const n=e.length?e+".":"";return"object"==typeof t[r]&&null!==t[r]?Object.assign(s,D(t[r],n+r)):s[n+r]=t[r],s}),{})}function P(t,e){"radio"!==t.getAttribute("type")?"checkbox"!==t.getAttribute("type")?t.value=e:t.checked=e:t.checked=t.getAttribute("value")===e}class U extends(x()){static IGNORED_CHILDREN_SELECTOR=".d-none, [hidden]";static SCROLL_OFFSET=50;render(){const t=document.createElement("form");t.replaceChildren(...this.childNodes),t.addEventListener("submit",(async t=>{t.preventDefault(),this.spinning((async()=>{await(this.submitter?.(this.values,this))}))})),this.replaceChildren(t)}spinner(t){this.querySelectorAll("ful-spinner").forEach((e=>e.hidden=!t)),this.querySelectorAll("[type=submit],[type=reset]").forEach((e=>e.disabled=t))}async remoting(t){try{await t()}catch(t){throw t instanceof i&&(this.errors=t.problems),t}}async spinningUntilError(t){this.spinner(!0);try{await this.remoting(t)}catch(t){throw this.spinner(!1),t}}async spinning(t){this.spinner(!0);try{await this.remoting(t)}finally{this.spinner(!1)}}set values(t){for(const[e,s]of Object.entries(D(t,"")))this.querySelectorAll(`[name='${CSS.escape(e)}']`).forEach((t=>P(t,s)))}get values(){return Array.from(this.querySelectorAll("[name]")).filter((t=>"never"!==t.dataset.fulBindInclude&&("always"===t.dataset.fulBindInclude||null===t.closest(U.IGNORED_CHILDREN_SELECTOR)))).reduce(((t,e)=>function(t,e,s){const r=e.split(".").map((t=>t.match(/^[0-9]+$/)?+t:t));let n=t,i=null;for(let e=0;;++e){const a=r[e],o=r[e-1];if(Number.isInteger(a)&&!Array.isArray(n)&&(null!==i?i[o]=n=[]:t=n=[]),e===r.length-1)return n[a]=void 0!==s?s:a in n?n[a]:null,t;void 0===n[a]&&(n[a]={}),i=n,n=n[a]}}(t,e.getAttribute("name"),function(t){if("radio"===t.getAttribute("type")){if(!t.checked)return;return"boolean"===t.dataset.fulBindType?"true"===t.value:t.value}return"checkbox"===t.getAttribute("type")?t.checked:"boolean"===t.dataset.fulBindType?t.value?"true"===t.value:null:""===t.value||void 0===t.value?null:t.value}(e))),{})}set errors(t){const e=t.filter((t=>"FIELD_ERROR"===t.type||"INVALID_FORMAT"===t.type)),s=t.filter((t=>"FIELD_ERROR"!==t.type&&"INVALID_FORMAT"!==t.type));if(this.querySelectorAll(".is-invalid").forEach((t=>t.classList.remove("is-invalid"))),this.querySelectorAll("ful-errors").forEach((t=>{t.replaceChildren(),t.setAttribute("hidden","")})),e.forEach((t=>{const e=t.context.replace("[",".").replace("].","."),s=`[name='${CSS.escape(e)}'] [ful-validation-target],[name='${CSS.escape(e)}']:not(:has([ful-validation-target]))`;this.querySelectorAll(s).forEach((t=>t.classList.add("is-invalid")));const r=`ful-field-error[field='${CSS.escape(e)}']`;this.querySelectorAll(r).forEach((e=>e.innerText=t.reason))})),this.querySelectorAll("ful-errors").forEach((t=>{t.innerText=s.map((t=>t.reason)).join("\n"),0!==s.length&&t.removeAttribute("hidden")})),!this.hasAttribute("scroll-on-error"))return;const r=Array.from(this.querySelectorAll("[ful-validated-field]:has(.is-invalid) ful-field-error")).map((t=>t.parentElement?t.parentElement:t)).map((t=>t.getBoundingClientRect().y+window.scrollY)),n=Math.min(...r);n!==1/0&&window.scroll(window.scrollX,n>U.SCROLL_OFFSET?n-U.SCROLL_OFFSET:0)}}const q='\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',F=(t,e,s)=>{const r=t.input=s.input=s.input?.firstElementChild||(()=>{const t=document.createElement("input");return t.classList.add("form-control"),t})();r.setAttribute("ful-validation-target",""),r.addEventListener("change",(e=>{e.stopPropagation(),k.dispatchChange(t,t.value)}));const n=r.getAttribute("id")||t.getAttribute("input-id")||_.uid("ful-input");_.forward("input-",t,s.input),_.defaultValue(s.input,"id",n),_.defaultValue(s.input,"type","text"),_.defaultValue(s.input,"placeholder"," ");const i=t.getAttribute("name");return e.render(t,{id:n,name:i,slots:s})};class $ extends(x({observed:["value"],slots:!0,template:q})){render(t,e){const s=F(this,t,e);this.replaceChildren(s)}get value(){return this.input.value}set value(t){this.input.value=t}}class j extends(x({observed:["value"],slots:!0,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 '})){constructor(t){super(),this.tsConfig=t}render(t,e){const s="local"!=(this.getAttribute("type")||"local"),r="always"!=this.getAttribute("load"),n=this.getAttribute("name"),i=e.input=e.input?.firstElementChild||document.createElement("select");i.setAttribute("ful-validation-target","");const a=i.getAttribute("id")||this.getAttribute("input-id")||_.uid("ful-select"),o=`${a}-ts-control`;_.forward("input-",this,i),_.defaultValue(i,"id",a),_.defaultValue(i,"placeholder"," "),e.input=E.from(i),this.loaded=!s;this._remote=s,this._unwrappedRemoteLoad=async(t,e)=>{if(!s||s&&r&&this.loaded)return void e();const n=t&&t.hasOwnProperty("byId")?"id":"query",i="id"===n?t.byId:t,a=await(this.#h?this.#h(i,n):[]);"id"!==n&&(this.loaded=!0),e(a)},this.ts=new TomSelect(i,Object.assign(s?{preload:"focus",load:this._unwrappedRemoteLoad,shouldLoad:t=>!this.shouldLoad||this.shouldLoad(t)}:{},{render:{loading:()=>'<ful-spinner class="centered p-2"></ful-spinner>'}},this.tsConfig)),this.ts.on("change",(t=>{k.dispatchChange(this,this.value)})),i.addEventListener("change",(t=>{t.stopPropagation()})),i.remove(),t.renderTo(this,{id:a,tsId:o,name:n,input:i,slots:e})}#h;set loader(t){this.#h=t,this.hasAttribute("value")&&(this.value=this.getAttribute("value"))}get value(){const t=this.ts.getValue();return""===t?null:t}set value(t){(async()=>{this._remote&&await this._unwrappedRemoteLoad({byId:t},this.ts.loadCallback.bind(this.ts));this.ts.setValue(t,!0)})()}}class H extends(x({observed:["value","disabled:state"],slots:!0,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 '})){render(t,e){const s=this.getAttribute("name")||_.uid("ful-radiogroup"),r=Array.from(e.default.querySelectorAll("ful-radio")),n=r.map((t=>{const e=document.createElement("input");e.setAttribute("type","radio"),_.forward("input-",this,e),_.forward("",t,e),e.setAttribute("name",`${s}-ignore`),e.setAttribute("ful-validation-target",""),e.dataset.fulBindInclude="never",e.addEventListener("change",(e=>{e.stopPropagation(),k.dispatchChange(t,this.value)}));return[e,E.fromChildNodes(t)]}));r.forEach((t=>t.remove())),t.renderTo(this,{name:s,slots:e,inputsAndLabels:n})}get value(){const t=this.querySelector("input[type=radio]:checked");return t?t.value:null}set value(t){k.dispatchChange(this,t)&&(this.querySelector(`input[type=radio][value=${CSS.escape(t)}]`).checked=!0)}}class B extends(x({slots:!0,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 '})){render(t,e){t.renderTo(this,{slots:e})}}export{_ as Attributes,w as AuthorizationCodeFlow,y as AuthorizationCodeFlowInterceptor,v as AuthorizationCodeFlowSession,t as Base64,A as Deferred,C as ElementsRegistry,k as Events,i as Failure,U as Form,E as Fragments,e as Hex,c as HttpClient,q as INPUT_TEMPLATE,$ as Input,S as LightSlots,m as LocalStorage,L as Nodes,x as ParsedElement,H as RadioGroup,j as Select,g as SessionStorage,B as Spinner,O as TemplatesRegistry,b as VersionedStorage,R as elements,p as jsonPatch,d as jsonPost,h as jsonPut,u as jsonRequest,F as makeInputFragment,T as timing};
2
2
  //# sourceMappingURL=ful.min.mjs.map
package/dist/ful.mjs CHANGED
@@ -1338,5 +1338,5 @@ class Spinner extends ParsedElement({
1338
1338
  }
1339
1339
  }
1340
1340
 
1341
- 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 };
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 };
1342
1342
  //# sourceMappingURL=ful.mjs.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@optionfactory/ful",
3
- "version": "0.74.0",
3
+ "version": "0.75.0",
4
4
  "main": "./dist/ful.iife.js",
5
5
  "module": "./dist/ful.mjs",
6
6
  "files": [