@optionfactory/ful 0.37.0 → 0.39.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 +72 -37
- package/dist/ful.iife.js.map +1 -1
- package/dist/ful.iife.min.js +1 -1
- package/dist/ful.iife.min.js.map +1 -1
- package/dist/ful.min.mjs +1 -1
- package/dist/ful.min.mjs.map +1 -1
- package/dist/ful.mjs +72 -38
- package/dist/ful.mjs.map +1 -1
- package/package.json +1 -1
package/dist/ful.min.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ful.min.mjs","sources":["../src/encodings.mjs","../src/http-client.mjs","../src/storage.mjs","../src/oauth-authorization-code.mjs","../src/timing.mjs","../src/elements/elements.mjs","../src/elements/form.mjs","../src/elements/input.mjs","../src/elements/select.mjs","../src/elements/radio.mjs","../src/elements/spinner.mjs","../src/elements/wizard.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 static fromHtml(...html) {\n const el = document.createElement('div');\n el.innerHTML = html.join(\"\");\n const fragment = new DocumentFragment();\n Array.from(el.childNodes).forEach(node => {\n fragment.appendChild(node);\n });\n return fragment;\n } \n static toHtml(fragment) {\n var r = document.createElement(\"root\");\n r.appendChild(fragment);\n return r.innerHTML;\n }\n static from(...nodes) {\n const fragment = new DocumentFragment();\n for (let i = 0; i !== nodes.length; ++i) {\n fragment.appendChild(nodes[i]);\n }\n return fragment;\n }\n static fromChildNodes(el) {\n const nodes = Array.from(el.childNodes);\n const fragment = new DocumentFragment();\n for (let i = 0; i !== nodes.length; ++i) {\n fragment.appendChild(nodes[i]);\n }\n return fragment;\n }\n}\n\nclass Attributes {\n static id = 0;\n static uid(prefix) {\n return `${prefix}-${++Attributes.id}`;\n }\n static asBoolean(value) {\n return value !== null && value !== undefined && value !== false;\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 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\nclass Slots {\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 slotted = Object.fromEntries(namedSlots);\n slotted.default = new DocumentFragment();\n slotted.default.append(...el.childNodes);\n return slotted;\n }\n}\n\nconst Templated = (SuperClass, template) => {\n return class extends SuperClass {\n rendered_;\n get rendered() {\n return this.rendered_;\n }\n async connectedCallback() {\n if (this.rendered_) {\n return;\n }\n const slotted = Slots.from(this);\n const fragment = await Promise.resolve(this.render(slotted, template));\n this.innerHTML = '';\n if (fragment) {\n this.appendChild(fragment);\n }\n this.rendered_ = true;\n }\n };\n}\n\nconst Stateful = (SuperClass, flags, others) => {\n\n const all = [].concat(flags).concat(others || []);\n\n return class extends SuperClass {\n static get observedAttributes() {\n return all;\n }\n constructor(...args) {\n super(...args);\n this.internals_ = this.internals_ || this.attachInternals();\n for (const flag of flags) {\n Object.defineProperty(this, flag, {\n get() {\n return this.hasAttribute(flag);\n },\n set(value) {\n //see https://developer.mozilla.org/en-US/docs/Web/API/CustomStateSet#using_double_dash_prefixed_idents\n if (Attributes.asBoolean(value)) {\n this.internals_.states.add(`--${flag}`);\n this.setAttribute(flag, '');\n return;\n }\n this.internals_.states.delete(`--${flag}`);\n this.removeAttribute(flag);\n }\n });\n }\n }\n attributeChangedCallback(name, oldValue, newValue) {\n if (oldValue === newValue) {\n return;\n }\n this[name] = newValue;\n const method = this[`on${name.charAt(0).toUpperCase()}${name.substr(1).toLowerCase()}Changed`];\n method?.call(this, newValue, oldValue);\n }\n };\n}\n\nexport { Fragments, Attributes, Slots, Templated, Stateful };\n","/* global Infinity, CSS */\n\nimport { Failure } from \"../http-client.mjs\";\nimport { Templated } from \"./elements.mjs\"\n\nclass Form extends Templated(HTMLElement) {\n static MUTATORS = {};\n static EXTRACTORS = {};\n static VALUE_HOLDERS_SELECTOR = '[name]';\n static IGNORED_CHILDREN_SELECTOR = '.d-none, [hidden]';\n\n render(slotted, template) {\n const form = document.createElement('form');\n form.append(slotted.default);\n form.addEventListener('submit', async (e) => {\n e.preventDefault();\n this.spinner(true);\n try {\n if (this.submitter) {\n await this.submitter(this.getValues(), this);\n }\n } catch (e) {\n if (e instanceof Failure) {\n this.setErrors(e.problems);\n return;\n }\n throw e;\n } finally {\n this.spinner(false)\n }\n })\n return form;\n }\n spinner(spin) {\n this.querySelectorAll('ful-spinner').forEach(el => {\n el.hidden = !spin;\n })\n this.querySelectorAll('[type=submit],[type=reset]').forEach(el => {\n el.disabled = spin;\n })\n }\n setValues(values) {\n for (let k in values) {\n if (!values.hasOwnProperty(k)) {\n continue;\n }\n Array.from(this.querySelectorAll(`[name='${CSS.escape(k)}']`)).forEach((el) => {\n Form.mutate(Form.MUTATORS, el, values[k], k, values);\n });\n }\n }\n getValues() {\n return Array.from(this.querySelectorAll(Form.VALUE_HOLDERS_SELECTOR))\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 Form.providePath(result, el.getAttribute('name'), Form.extract(Form.EXTRACTORS, el));\n }, {});\n }\n setErrors(errors, scroll) {\n this.clearErrors();\n errors\n .filter((e) => e.type === 'FIELD_ERROR' || e.type === 'INVALID_FORMAT')\n .forEach((e) => {\n const name = e.context.replace(\"[\", \".\").replace(\"].\", \".\");\n //TODO: match [name=] ful-validation-target and [name=]:not(:has(ful-validation-target))\n //\n this.querySelectorAll(`[name='${CSS.escape(name)}']`)\n .forEach(input => input.classList.add('is-invalid'));\n this.querySelectorAll(`ful-field-error[field='${CSS.escape(name)}']`)\n .forEach(el => el.innerText = e.reason);\n });\n this.querySelectorAll(\"ful-errors\")\n .forEach(el => {\n const globalErrors = errors.filter((e) => e.type !== 'FIELD_ERROR' && e.type !== 'INVALID_FORMAT');\n el.innerHTML = globalErrors.map(e => e.reason).join(\"\\n\");\n if (globalErrors.length !== 0) {\n el.removeAttribute('hidden');\n }\n })\n\n if (!scroll) {\n return;\n }\n const ys = Array.from(this.querySelectorAll('ful-field-error'))\n .map(el => el.getBoundingClientRect().y + window.scrollY)\n const miny = Math.min(...ys);\n if (miny !== Infinity) {\n window.scroll(window.scrollX, miny > 100 ? miny - 100 : 0);\n }\n }\n clearErrors() {\n this.querySelectorAll('.is-invalid')\n .forEach(el => el.classList.remove('is-invalid'));\n this.querySelectorAll(\"ful-errors\")\n .forEach(el => {\n el.innerHTML = '';\n el.setAttribute('hidden', '');\n });\n }\n static extract(extractors, el) {\n const maybeExtractor = extractors[el.dataset['fulBindExtractor']] || extractors[el.dataset['fulBindProvide']];\n if (maybeExtractor) {\n return maybeExtractor(el);\n }\n if (el.getAttribute('type') === 'radio') {\n if (!el.checked) {\n return undefined;\n }\n return el.dataset['fulBindType'] === 'boolean' ? el.value === 'true' : el.value;\n }\n if (el.getAttribute('type') === 'checkbox') {\n return el.checked;\n }\n if (el.dataset['fulBindType'] === 'boolean') {\n return !el.value ? null : el.value === 'true';\n }\n if (el.getValue) {\n return el.getValue();\n }\n return el.value || null;\n }\n static mutate(mutators, el, raw, key, values) {\n const maybeMutator = mutators[el.dataset['fulBindMutator']] || mutators[el.dataset['fulBindProvide']];\n if (maybeMutator) {\n maybeMutator(el, raw, key, values);\n return;\n }\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 if (el.setValue) {\n el.setValue(raw);\n return;\n }\n el.value = raw;\n }\n\n static 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 static custom(tagName, configuration) {\n customElements.define(tagName, class extends Form {\n constructor() {\n super(configuration);\n }\n });\n }\n}\n\nexport { Form };\n","import { Attributes, Templated } from \"./elements.mjs\"\n\nconst ful_input_ec = globalThis.ec || ftl.EvaluationContext.configure({\n\n});\n\nconst ful_input_template_ = globalThis.ful_input_template || ftl.Template.fromHtml(`\n <label data-tpl-for=\"id\" class=\"form-label\">{{{{ slotted.default }}}}</label>\n <div class=\"input-group\">\n <span data-tpl-if=\"slotted.ibefore\" class=\"input-group-text\">{{{{ slotted.ibefore }}}}</span>\n <div data-tpl-if=\"slotted.before\" data-tpl-remove=\"tag\">{{{{ slotted.before }}}}</div>\n {{{{ slotted.input }}}} \n <div data-tpl-if=\"slotted.after\" data-tpl-remove=\"tag\">{{{{ slotted.after }}}}</div>\n <span data-tpl-if=\"slotted.iafter\" class=\"input-group-text\">{{{{ slotted.iafter }}}}</span>\n </div>\n <ful-field-error data-tpl-if=\"name\" data-tpl-field=\"name\"></ful-field-error>\n`, ful_input_ec);\n\nclass Input extends Templated(HTMLElement, ful_input_template_) {\n render(slotted, template) {\n const input = slotted.input = slotted.input || (() => {\n const el = document.createElement(\"input\")\n el.classList.add(\"form-control\");\n return el;\n })();\n const id = input.getAttribute('id') || this.getAttribute('input-id') || Attributes.uid('ful-input');\n Attributes.forward('input-', this, slotted.input)\n Attributes.defaultValue(slotted.input, \"id\", id);\n Attributes.defaultValue(slotted.input, \"type\", \"text\");\n Attributes.defaultValue(slotted.input, \"placeholder\", \" \");\n const name = input.getAttribute('name');\n return template.render({ id, name, slotted });\n }\n static configure() {\n customElements.define('ful-input', Input);\n }\n}\n\nexport { Input };\n","import { Fragments, Attributes, Templated } from \"./elements.mjs\"\n/**\n * <script src=\"tom-select.complete.js\"></script>\n * <link href=\"tom-select.bootstrap5.css\" rel=\"stylesheet\" />\n */\nconst ful_select_ec = globalThis.ec || ftl.EvaluationContext.configure({\n\n});\n\nconst ful_select_template_ = globalThis.ful_select_template || ftl.Template.fromHtml(`\n <label data-tpl-for=\"tsId\" class=\"form-label\">{{{{ slotted.default }}}}</label>\n {{{{ input }}}}\n <div class=\"input-group\">\n <span data-tpl-if=\"slotted.ibefore\" class=\"input-group-text\">{{{{ slotted.ibefore }}}}</span>\n <div data-tpl-if=\"slotted.before\" data-tpl-remove=\"tag\">{{{{ slotted.before }}}}</div>\n {{{{ slotted.input }}}} \n <div data-tpl-if=\"slotted.after\" data-tpl-remove=\"tag\">{{{{ slotted.after }}}}</div>\n <span data-tpl-if=\"slotted.iafter\" class=\"input-group-text\">{{{{ slotted.iafter }}}}</span>\n </div>\n <ful-field-error data-tpl-if=\"name\" data-tpl-field=\"name\"></ful-field-error> \n`, ful_select_ec);\n\n\nclass Select extends Templated(HTMLElement, ful_select_template_) {\n constructor(tsConfig) {\n super();\n this.tsConfig = tsConfig;\n }\n render(slotted, template) {\n const type = this.getAttribute(\"type\") || 'local';\n const remote = type != 'local';\n const loadOnce = this.getAttribute('load') != 'always';\n\n const input = slotted.input = slotted.input || (() => {\n return document.createElement(\"select\");\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 const name = input.getAttribute('name');\n input.setValue = this.setValue.bind(this);\n input.getValue = this.getValue.bind(this);\n\n //tomselect needs the input to have a parent.\n //se we move the input to a fragment\n slotted.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\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\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 console.log(\"ts created\");\n //we remove the input to move it\n input.remove();\n\n return template.render({ id, tsId, name, input, slotted });\n }\n async setValue(v) {\n if(this._remote){\n await this._unwrappedRemoteLoad({byId: v}, this.ts.loadCallback.bind(this.ts));\n }\n this.ts.setValue(v);\n }\n getValue() {\n const v = this.ts.getValue();\n return v === '' ? null : v;\n }\n static custom(tagName, configuration) {\n customElements.define(tagName, class extends Select {\n constructor() {\n super(configuration);\n }\n });\n }\n static configure() {\n return Select.custom('ful-select');\n }\n\n}\n\nexport { Select };\n","import { Attributes, Fragments, Stateful, Templated } from \"./elements.mjs\"\n\n\n\n\n\nconst ful_radiogroup_ec = globalThis.ec || ftl.EvaluationContext.configure({\n\n});\n\nconst ful_radiougroup_template_ = globalThis.ful_radiogroup_template || ftl.Template.fromHtml(`\n <fieldset>\n <legend class=\"form-label\">\n {{{{ slotted.default }}}}\n </legend>\n <header data-tpl-if=\"slotted.header\">\n {{{{ slotted.header }}}}\n </header>\n <section>\n <label data-tpl-each=\"inputsAndLabels\" data-tpl-var=\"ial\">\n {{{{ ial[0] }}}}\n {{{{ ial[1] }}}}\n </label>\n </section>\n <ful-field-error data-tpl-if=\"name\" data-tpl-field=\"name\"></ful-field-error>\n </fieldset>\n`, ful_radiogroup_ec);\n\n\nclass RadioGroup extends Stateful(Templated(HTMLElement, ful_radiougroup_template_), ['disabled']) {\n render(slotted, template) { \n const name = this.getAttribute('input-name') || Attributes.uid('ful-radiogroup');\n const radioEls = Array.from(slotted.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 Attributes.defaultValue(input, 'name', name);\n const label = Fragments.fromChildNodes(el);\n return [input, label];\n });\n radioEls.forEach(el => el.remove());\n \n const fragment = template.render({\n name: name,\n slotted: slotted,\n inputsAndLabels: inputsAndLabels\n });\n return fragment;\n }\n static configure() {\n customElements.define('ful-radio-group', RadioGroup);\n } \n}\n\n\nexport { RadioGroup };","import { Attributes, Fragments, Templated } from \"./elements.mjs\"\n\n\n\nconst ful_spinner_ec = globalThis.ec || ftl.EvaluationContext.configure({\n\n});\n\nconst ful_spinner_template_ = globalThis.ful_spinner_template || ftl.Template.fromHtml(`\n <div class=\"ful-spinner-wrapper\">\n <div class=\"ful-spinner-text\">{{{{ slotted.default }}}}</div>\n <div class=\"ful-spinner-icon\"></div>\n </div>\n`, ful_spinner_ec);\n\n\nclass Spinner extends Templated(HTMLElement, ful_spinner_template_) {\n render(slotted, template) {\n return template.render({ slotted });\n }\n static configure() {\n customElements.define('ful-spinner', Spinner);\n }\n}\n\nexport { Spinner };","class Wizard extends HTMLElement {\n constructor() {\n super();\n this.progress = [...this.children].filter(e => e.matches(\"header,ol,ul\"));\n\n this.progress.forEach(p => {\n const children = [...p.children];\n const current = children.filter(e => e.matches(\".active\"))[0];\n if (current === undefined && children.length > 0) {\n children[0].classList.add('active');\n }\n });\n if (this.querySelector('section.current') === null) {\n const firstSection = this.querySelector('section:first-of-type');\n if (firstSection !== null) {\n firstSection.classList.add('current');\n }\n }\n }\n next() {\n this.progress.forEach(p => {\n const children = [...p.children];\n const current = children.filter(e => e.matches(\".active\"))[0];\n current?.classList.remove('active');\n current?.nextElementSibling?.classList.add('active');\n });\n const currentSection = this.querySelector('section.current');\n currentSection.classList.remove(\"current\");\n currentSection.nextElementSibling.classList.add('current');\n\n this.dispatchEvent(new CustomEvent('wizard:activate', {\n bubbles: true,\n cancelable: true\n }));\n\n }\n prev() {\n this.progress.forEach(p => {\n const children = [...p.children];\n const current = children.filter(e => e.matches(\".active\"))[0];\n current?.classList.remove('active');\n current?.previousElementSibling?.classList.add('active');\n });\n const currentSection = this.querySelector('section.current');\n currentSection.classList.remove(\"current\");\n currentSection.previousElementSibling.classList.add('current');\n this.dispatchEvent(new CustomEvent('wizard:activate', {\n bubbles: true,\n cancelable: true\n }));\n }\n moveTo = function (n) {\n this.progress.forEach(p => {\n const children = [...p.children];\n const current = children.filter(e => e.matches(\".active\"))[0];\n current?.classList.remove('active');\n p.children[+n]?.classList.add('active');\n });\n const currentSection = this.querySelector('section.current');\n currentSection?.classList.remove(\"current\");\n const nthSection = this.querySelector(`section:nth-child(${+n})`);\n nthSection.classList.add('current');\n this.dispatchEvent(new CustomEvent('wizard:activate', {\n bubbles: true,\n cancelable: true\n }));\n }\n static custom(tagName, configuration) {\n customElements.define(tagName, class extends Wizard {\n constructor() {\n super(configuration);\n }\n });\n }\n static configure() {\n return Wizard.custom('ful-wizard');\n }\n}\n\n\n\n\nexport { Wizard };\n"],"names":["Base64","encode","arrayBuffer","dialect","d","URL_SAFE","len","byteLength","view","Uint8Array","res","i","substring","length","decode","str","nbytes","Math","floor","vi","si","v1","indexOf","charAt","v2","v3","v4","buffer","STANDARD","Hex","hex","Error","lenInBytes","map","e","offset","octet","parseInt","bytes","upper","Array","from","b","toString","toUpperCase","o","padStart","join","ContextInterceptor","constructor","context","document","querySelector","getAttribute","this","endsWith","intercept","request","chain","separator","resource","startsWith","proceed","CsrfTokenInterceptor","k","v","headers","Headers","options","set","RedirectOnUnauthorizedInterceptor","redirectUri","response","status","window","location","href","Failure","parseProblems","text","def","type","reason","details","JSON","parse","fromResponse","problems","super","stringify","name","HttpClientBuilder","interceptors","withContext","push","withCsrfToken","withRedirectOnUnauthorized","withInterceptors","build","HttpClient","HttpCall","fetch","HttpInterceptorChain","current","interceptor","builder","exchange","opts","ok","message","json","undefined","jsonRequest","method","body","jsonPost","jsonPut","jsonPatch","Storage","prefix","storage","save","setItem","load","got","getItem","remove","removeItem","pop","decoded","LocalStorage","localStorage","SessionStorage","sessionStorage","VersionedStorage","key","dataSupplier","cache","revision","saved","value","freshData","data","AuthorizationCodeFlow","forKeycloak","clientId","realmBaseUrl","auth","URL","token","logout","registration","redirect","scope","uri","action","additionalParams","pkceVerifier","crypto","getRandomValues","pkceChallenge","subtle","digest","TextEncoder","state","PKCE_AND_STATE_KEY","verifier","url","searchParams","Object","entries","forEach","kv","applicationInitiatedAction","kcAction","kc_action","_tokenExchange","code","history","replaceState","stateAndVerifier","URLSearchParams","AuthorizationCodeFlowSession","ensureLoggedIn","get","parseToken","rawHeader","rawPayload","signature","split","ut8decoder","TextDecoder","header","payload","t","accessToken","access_token","refreshToken","refresh_token","refreshCallback","onRefresh","callback","refresh","shouldBeRefreshed","gracePeriod","now","Date","getTime","refreshTokenExpiresAt","exp","refreshIf","id_token","bearerToken","gracePeriodBefore","gracePeriodAfter","AuthorizationCodeFlowInterceptor","session","timing","sleep","ms","Promise","resolve","setTimeout","DEBOUNCE_DEFAULT","DEBOUNCE_IMMEDIATE","debounce","timeoutMs","func","tid","args","previousTimestamp","later","elapsed","arguments","THROTTLE_DEFAULT","THROTTLE_NO_LEADING","THROTTLE_NO_TRAILING","throttle","remaining","clearTimeout","Fragments","fromHtml","html","el","createElement","innerHTML","fragment","DocumentFragment","childNodes","node","appendChild","toHtml","r","nodes","fromChildNodes","Attributes","static","uid","id","asBoolean","defaultValue","hasAttribute","setAttribute","forward","to","getAttributeNames","filter","a","target","classList","add","Slots","namedSlots","matches","slot","removeAttribute","slotted","fromEntries","default","append","Templated","SuperClass","template","rendered_","rendered","connectedCallback","render","Stateful","flags","others","all","concat","observedAttributes","internals_","attachInternals","flag","defineProperty","states","delete","attributeChangedCallback","oldValue","newValue","substr","toLowerCase","call","Form","HTMLElement","form","addEventListener","async","preventDefault","spinner","submitter","getValues","setErrors","spin","querySelectorAll","hidden","disabled","setValues","values","hasOwnProperty","CSS","escape","mutate","MUTATORS","VALUE_HOLDERS_SELECTOR","dataset","closest","IGNORED_CHILDREN_SELECTOR","reduce","result","providePath","extract","EXTRACTORS","errors","scroll","clearErrors","replace","input","innerText","globalErrors","ys","getBoundingClientRect","y","scrollY","miny","min","Infinity","scrollX","extractors","maybeExtractor","checked","getValue","mutators","raw","maybeMutator","setValue","path","keys","match","previous","ckey","pkey","Number","isInteger","isArray","custom","tagName","configuration","customElements","define","ful_input_ec","globalThis","ec","ftl","EvaluationContext","configure","ful_input_template_","ful_input_template","Template","Input","ful_select_ec","ful_select_template_","ful_select_template","Select","tsConfig","remote","loadOnce","tsId","bind","loaded","_remote","_unwrappedRemoteLoad","query","qvalue","byId","loader","ts","TomSelect","assign","preload","shouldLoad","loading","console","log","loadCallback","ful_radiogroup_ec","ful_radiougroup_template_","ful_radiogroup_template","RadioGroup","radioEls","inputsAndLabels","ful_spinner_ec","ful_spinner_template_","ful_spinner_template","Spinner","Wizard","progress","children","p","firstSection","next","nextElementSibling","currentSection","dispatchEvent","CustomEvent","bubbles","cancelable","prev","previousElementSibling","moveTo","n"],"mappings":"AAEA,MAAMA,EACF,aAAOC,CAAOC,EAAaC,GACvB,MAAMC,EAAID,GAAWH,EAAOK,SACtBC,EAAMJ,EAAYK,WAClBC,EAAO,IAAIC,WAAWP,GAC5B,IAAIQ,EAAM,GACV,IAAK,IAAIC,EAAI,EAAGA,EAAIL,EAAKK,GAAK,EAAG,CAK7BD,GAJWN,EAAEI,EAAKG,IAAM,GACbP,GAAc,EAAVI,EAAKG,KAAW,EAAMH,EAAKG,EAAI,IAAM,GACzCP,GAAkB,GAAdI,EAAKG,EAAI,KAAY,EAAMH,EAAKG,EAAI,IAAM,GAC9CP,EAAgB,GAAdI,EAAKG,EAAI,GAEzB,CAMD,OALIL,EAAM,GAAM,EACZI,EAAMA,EAAIE,UAAU,EAAGF,EAAIG,OAAS,GAC7BP,EAAM,GAAM,IACnBI,EAAMA,EAAIE,UAAU,EAAGF,EAAIG,OAAS,IAEjCH,CACV,CACD,aAAOI,CAAOC,EAAKZ,GACf,MAAMC,EAAID,GAAWH,EAAOK,SAC5B,IAAIW,EAASC,KAAKC,MAAmB,IAAbH,EAAIF,QAC5B,IAAK,IAAIF,EAAI,EAAGA,IAAMI,EAAIF,QACU,MAA5BE,EAAIA,EAAIF,OAASF,EAAI,KADOA,IAI9BK,EAEN,MAAMR,EAAO,IAAIC,WAAWO,GAE5B,IAAIG,EAAK,EACLC,EAAK,EACT,KAAOD,EAAkB,IAAbJ,EAAIF,QAAe,CAC3B,MAAMQ,EAAKjB,EAAEkB,QAAQP,EAAIQ,OAAOH,MAC1BI,EAAKpB,EAAEkB,QAAQP,EAAIQ,OAAOH,MAC1BK,EAAKrB,EAAEkB,QAAQP,EAAIQ,OAAOH,MAC1BM,EAAKtB,EAAEkB,QAAQP,EAAIQ,OAAOH,MAChCZ,EAAKW,KAASE,GAAM,EAAMG,GAAM,EAChChB,EAAKW,MAAe,GAALK,IAAY,EAAMC,GAAM,EACvCjB,EAAKW,MAAe,EAALM,IAAW,EAAKC,CAClC,CAED,OAAOlB,EAAKmB,MACf,EAGL3B,EAAO4B,SAAW,mEAClB5B,EAAOK,SAAW,mEAGlB,MAAMwB,EACF,aAAOf,CAAOgB,GACV,GAAIA,EAAIjB,OAAS,GAAM,EACnB,MAAM,IAAIkB,MAAM,kBAEpB,MAAMC,EAAaF,EAAIjB,OAAS,EAChC,OAAO,IAAIJ,WAAWuB,GAAYC,KAAI,CAACC,EAAGvB,KACtC,MAAMwB,EAAa,EAAJxB,EACTyB,EAAQN,EAAIlB,UAAUuB,EAAQA,EAAS,GAC7C,OAAOE,SAASD,EAAO,GAAG,GAEjC,CACD,aAAOnC,CAAOqC,EAAOC,GACjB,OAAOC,MAAMC,KAAKH,GACTL,KAAIS,GAAKA,EAAEC,SAAS,MACpBV,KAAIS,GAAKH,EAAQG,EAAEE,cAAgBF,IACnCT,KAAIY,GAAKA,EAAEC,SAAS,EAAG,KACvBC,KAAK,GACjB,ECvEL,MAAMC,EACF,WAAAC,GACI,MAAMC,EAAUC,SAASC,cAAc,wBAAwBC,aAAa,WAC5EC,KAAKJ,QAAUA,EAAQK,SAAS,KAAOL,EAAQtC,UAAU,EAAGsC,EAAQrC,OAAS,GAAKqC,CACrF,CACD,eAAMM,CAAUC,EAASC,GACrB,MAAMC,EAAYF,EAAQG,SAASC,WAAW,KAAO,GAAK,IAE1D,OADAJ,EAAQG,SAAWN,KAAKJ,QAAUS,EAAYF,EAAQG,eACzCF,EAAMI,QAAQL,EAC9B,EAGL,MAAMM,EACF,WAAAd,GACIK,KAAKU,EAAIb,SAASC,cAAc,6BAA6BC,aAAa,WAC1EC,KAAKW,EAAId,SAASC,cAAc,sBAAsBC,aAAa,UACtE,CACD,eAAMG,CAAUC,EAASC,GACrB,MAAMQ,EAAU,IAAIC,QAAQV,EAAQW,QAAQF,SAG5C,OAFAA,EAAQG,IAAIf,KAAKU,EAAGV,KAAKW,GACzBR,EAAQW,QAAQF,QAAUA,QACbR,EAAMI,QAAQL,EAC9B,EAGL,MAAMa,EACF,WAAArB,CAAYsB,GACRjB,KAAKiB,YAAcA,CACtB,CACD,eAAMf,CAAUC,EAASC,GACrB,MAAMc,QAAkBd,EAAMI,QAAQL,GACtC,GAAwB,MAApBe,EAASC,OACT,OAAOD,EAEXE,OAAOC,SAASC,KAAOtB,KAAKiB,WAC/B,EAGL,MAAMM,UAAgB9C,MAClB,oBAAO+C,CAAcL,EAAQM,GACzB,MAAMC,EAAM,CAAC,CACLC,KAAM,kBACN/B,QAAS,KACTgC,OAAQ,GAAGT,MAAWM,IACtBI,QAAS,OAEjB,IACI,OAAOJ,EAAOK,KAAKC,MAAMN,GAAQC,CACpC,CAAC,MAAO9C,GACL,OAAO8C,CACV,CACJ,CACD,mBAAOM,CAAab,EAAQM,GACxB,OAAO,IAAIF,EAAQJ,EAAQI,EAAQC,cAAcL,EAAQM,GAC5D,CACD,WAAA9B,CAAYwB,EAAQc,GAChBC,MAAMJ,KAAKK,UAAUF,IACrBjC,KAAKoC,KAAO,WAAWjB,IACvBnB,KAAKmB,OAASA,EACdnB,KAAKiC,SAAWA,CACnB,EAGL,MAAMI,EACF,WAAA1C,GACIK,KAAKsC,aAAe,EACvB,CACD,WAAAC,GAEI,OADAvC,KAAKsC,aAAaE,KAAK,IAAI9C,GACpBM,IACV,CACD,aAAAyC,GAEI,OADAzC,KAAKsC,aAAaE,KAAK,IAAI/B,GACpBT,IACV,CACD,0BAAA0C,CAA2BzB,GAEvB,OADAjB,KAAKsC,aAAaE,KAAK,IAAIxB,EAAkCC,IACtDjB,IACV,CACD,gBAAA2C,IAAoBL,GAEhB,OADAtC,KAAKsC,aAAaE,QAAQF,GACnBtC,IACV,CACD,KAAA4C,GACI,MAAMN,EAAetC,KAAKsC,aAC1B,OAAO,IAAIO,EAAW,CAACP,gBAC1B,EAGL,MAAMQ,EACF,eAAM5C,CAAUC,EAASC,GACrB,aAAa2C,MAAM5C,EAAQG,SAAUH,EAAQW,QAChD,EAGL,MAAMkC,EACF,WAAArD,CAAY2C,EAAcW,GACtBjD,KAAKsC,aAAeA,EACpBtC,KAAKiD,QAAUA,CAClB,CACD,aAAMzC,CAAQL,GACV,MAAM+C,EAAclD,KAAKsC,aAAatC,KAAKiD,SAC3C,aAAaC,EAAYhD,UAAUC,EAAS,IAAI6C,EAAqBhD,KAAKsC,aAActC,KAAKiD,QAAU,GAC1G,EAIL,MAAMJ,EACF,cAAOM,GACH,OAAO,IAAId,CACd,CACD,WAAA1C,EAAY2C,aAACA,IACTtC,KAAKsC,aAAeA,GAAgB,EACvC,CACD,cAAMc,CAAS9C,EAAUQ,GACrB,MAAMuC,EAAOvC,GAAW,GAClBwB,EAAe,IAAItC,KAAKsC,gBAAiBe,EAAKf,cAAgB,GAAI,IAAIQ,GACtE1C,EAAQ,IAAI4C,EAAqBV,EAAc,GACrD,aAAalC,EAAMI,QAAQ,CAACF,WAAUQ,QAASuC,GAClD,CACD,WAAMN,CAAMzC,EAAUQ,GAClB,MAAMI,QAAiBlB,KAAKoD,SAAS9C,EAAUQ,GAC/C,IAAKI,EAASoC,GAAI,CACd,MAAMC,QAAgBrC,EAASO,OAC/B,MAAMF,EAAQS,aAAad,EAASC,OAAQoC,EAC/C,CACD,OAAOrC,CACV,CACD,UAAMsC,CAAKlD,EAAUQ,GACjB,IACI,MAAMI,QAAiBlB,KAAK+C,MAAMzC,EAAUQ,GACtCW,QAAaP,EAASO,OAC5B,OAAOA,EAAOK,KAAKC,MAAMN,QAAQgC,CACpC,CAAC,MAAO7E,GACL,GAAIA,aAAa2C,EACb,MAAM3C,EAEV,MAAM,IAAI2C,EAAQ,EAAG,CAAC,CACdI,KAAM,qBACN/B,QAAS,KACTgC,OAAQhD,EAAE2E,QACV1B,QAAS,OAEpB,CACJ,EAGL,SAAS6B,EAAYC,EAAQC,EAAMhD,GAC/B,MAAO,CACHA,QAAS,CACL,eAAgB,sBACbA,GAEP+C,OAAQA,EACRC,KAAM9B,KAAKK,UAAUyB,GAE7B,CACA,SAASC,EAASD,EAAMhD,GACpB,OAAO8C,EAAY,OAAQE,EAAMhD,EACrC,CACA,SAASkD,EAAQF,EAAMhD,GACnB,OAAO8C,EAAY,MAAOE,EAAMhD,EACpC,CACA,SAASmD,EAAUH,EAAMhD,GACrB,OAAO8C,EAAY,QAASE,EAAMhD,EACtC,CCpKA,MAAMoD,EACF,WAAArE,CAAYsE,EAAQC,GAChBlE,KAAKiE,OAASA,EACdjE,KAAKkE,QAAUA,CAClB,CACD,IAAAC,CAAKzD,EAAGC,GACJX,KAAKkE,QAAQE,QAAQ,GAAGpE,KAAKiE,UAAUvD,IAAKoB,KAAKK,UAAUxB,GAC9D,CACD,IAAA0D,CAAK3D,GACD,MAAM4D,EAAMtE,KAAKkE,QAAQK,QAAQ,GAAGvE,KAAKiE,UAAUvD,KACnD,YAAe+C,IAARa,OAAoBb,EAAY3B,KAAKC,MAAMuC,EACrD,CACD,MAAAE,CAAO9D,GACHV,KAAKkE,QAAQO,WAAW,GAAGzE,KAAKiE,UAAUvD,IAC7C,CACD,GAAAgE,CAAIhE,GACA,MAAMiE,EAAU3E,KAAKqE,KAAK3D,GAE1B,OADAV,KAAKwE,OAAO9D,GACLiE,CACV,EAGL,MAAMC,UAAqBZ,EACvB,WAAArE,CAAYsE,GACR/B,MAAM+B,EAAQY,aACjB,EAGL,MAAMC,UAAuBd,EACzB,WAAArE,CAAYsE,GACR/B,MAAM+B,EAAQc,eACjB,EAGL,MAAMC,EACF,WAAArF,CAAYuE,EAASe,EAAKC,GACtBlF,KAAKkE,QAAUA,EACflE,KAAKiF,IAAMA,EACXjF,KAAKkF,aAAeA,EACpBlF,KAAKmF,MAAQ,IAEhB,CACD,UAAMd,CAAKe,GACP,MAAMC,EAAQrF,KAAKkE,QAAQG,KAAKrE,KAAKiF,KACrC,GAAMI,GAASA,EAAMD,WAAaA,EAE9B,YADApF,KAAKmF,MAAQE,EAAMC,OAGvB,MAAMC,QAAkBvF,KAAKkF,aAAaE,EAAUpF,KAAKiF,KACzDjF,KAAKkE,QAAQC,KAAKnE,KAAKiF,IAAK,CACxBG,SAAUA,EACVE,MAAOC,IAEXvF,KAAKmF,MAAQI,CAChB,CACD,IAAAC,GACI,OAAOxF,KAAKmF,KACf,ECtDL,MAAMM,EACF,kBAAOC,CAAYC,EAAUC,EAAc3E,GAEvC,OAAO,IAAIwE,EAAsBE,EADnB,iBACoC,CAC9CE,KAAM,IAAIC,IAAI,+BAAgCF,GAC9CG,MAAO,IAAID,IAAI,gCAAiCF,GAChDI,OAAQ,IAAIF,IAAI,iCAAkCF,GAClDK,aAAc,IAAIH,IAAI,wCAAyCF,GAC/DM,SAAUjF,GAEjB,CACD,WAAAtB,CAAYgG,EAAUQ,GAAON,KAACA,EAAIE,MAAEA,EAAKE,aAAEA,EAAYD,OAAEA,EAAME,SAAEA,IAC7DlG,KAAKkE,QAAU,IAAIY,EAAea,GAClC3F,KAAK2F,SAAWA,EAChB3F,KAAKmG,MAAQA,EACbnG,KAAKoG,IAAM,CAACP,OAAME,QAAOE,eAAcD,SAAQE,WAClD,CACD,YAAMG,CAAOD,EAAKE,GACd,MAAMC,EAAe7J,EAAOC,OAAO6J,OAAOC,gBAAgB,IAAItJ,WAAW,KAAKkB,QACxEqI,EAAgBhK,EAAOC,aAAa6J,OAAOG,OAAOC,OAAO,WAAW,IAAIC,aAAclK,OAAO4J,KAC7FO,EAAQ9G,KAAK2F,SAAWjJ,EAAOC,OAAO6J,OAAOC,gBAAgB,IAAItJ,WAAW,KAAKkB,QACvF2B,KAAKkE,QAAQC,KAAKsB,EAAsBsB,mBAAoB,CACxDD,MAAOA,EACPE,SAAUT,IAEd,MAAMU,EAAM,IAAInB,IAAIM,GACpBa,EAAIC,aAAanG,IAAI,YAAaf,KAAK2F,UACvCsB,EAAIC,aAAanG,IAAI,eAAgBf,KAAKoG,IAAIF,UAC9Ce,EAAIC,aAAanG,IAAI,gBAAiB,QACtCkG,EAAIC,aAAanG,IAAI,QAASf,KAAKmG,OACnCc,EAAIC,aAAanG,IAAI,QAAS+F,GAC9BG,EAAIC,aAAanG,IAAI,iBAAkB2F,GACvCO,EAAIC,aAAanG,IAAI,wBAAyB,QAC9CoG,OAAOC,QAAQd,GAAoB,CAAE,GAAEe,SAAQC,IAC3CL,EAAIC,aAAanG,IAAIuG,EAAG,GAAIA,EAAG,GAAG,IAEtClG,OAAOC,SAAW4F,CACrB,CACD,kBAAMhB,CAAaK,SACTtG,KAAKqG,OAAOrG,KAAKoG,IAAIH,aAAcK,EAC5C,CACD,gCAAMiB,CAA2BC,SACvBxH,KAAKqG,OAAOrG,KAAKoG,IAAIP,KAAM,CAC7B4B,UAAWD,GAElB,CACD,oBAAME,CAAeC,EAAMb,GACvB1F,OAAOwG,QAAQC,aAAa,GAAI,GAAI7H,KAAKoG,IAAIF,UAC7C,MAAM4B,EAAmB9H,KAAKkE,QAAQQ,IAAIe,EAAsBsB,oBAChE,GAAIe,EAAiBhB,QAAUA,EAC3B,MAAM,IAAIrI,MAAM,kBAEpB,MAAMyC,QAAiB6B,MAAM/C,KAAKoG,IAAIL,MAAO,CACzCpC,OAAQ,OACR/C,QAAS,CACL,eAAgB,qCAEpBgD,KAAM,IAAImE,gBAAgB,CACtB,CAAC,YAAa/H,KAAK2F,UACnB,CAAC,OAAQgC,GACT,CAAC,aAAc,sBACf,CAAC,gBAAiBG,EAAiBd,UACnC,CAAC,QAASc,EAAiBhB,OAC3B,CAAC,eAAgB9G,KAAKoG,IAAIF,cAGlC,IAAKhF,EAASoC,GAAI,CACd,MAAM7B,QAAaP,EAASO,OAC5B,MAAM,IAAIhD,MAAM,SAAWyC,EAASC,OAAS,KAAOM,EACvD,CACD,MAAMsE,QAAc7E,EAASsC,OAC7B,OAAO,IAAIwE,EAA6BhI,KAAK2F,SAAUI,EAAO/F,KAAKoG,IACtE,CACD,oBAAM6B,GACF,MAAMhB,EAAM,IAAInB,IAAI1E,OAAOC,SAASC,MAC9BqG,EAAOV,EAAIC,aAAagB,IAAI,QAClC,GAAIP,GAAQ3H,KAAKkE,QAAQG,KAAKoB,EAAsBsB,oBAAqB,CAErE,MAAMD,EAAQG,EAAIC,aAAagB,IAAI,SACnC,aAAalI,KAAK0H,eAAeC,EAAMb,EAC1C,CAGD,aADM9G,KAAKqG,OAAOrG,KAAKoG,IAAIP,KAAM,CAAA,GAC1B,IACV,EAELJ,EAAsBsB,mBAAqB,qBAE3C,MAAMiB,EACF,iBAAOG,CAAWpC,GACd,MAAOqC,EAAWC,EAAYC,GAAavC,EAAMwC,MAAM,KACjDC,EAAa,IAAIC,YAAY,SACnC,MAAO,CACHC,OAAQ5G,KAAKC,MAAMyG,EAAWhL,OAAOd,EAAOc,OAAO4K,EAAW1L,EAAO4B,YACrEqK,QAAS7G,KAAKC,MAAMyG,EAAWhL,OAAOd,EAAOc,OAAO6K,EAAY3L,EAAO4B,YACvEgK,UAAWA,EAElB,CACD,WAAA3I,CAAYgG,EAAUiD,GAAG7C,MAACA,EAAKC,OAAEA,EAAME,SAAEA,IACrClG,KAAK2F,SAAWA,EAChB3F,KAAK+F,MAAQ6C,EACb5I,KAAK6I,YAAcb,EAA6BG,WAAWS,EAAEE,cAC7D9I,KAAK+I,aAAef,EAA6BG,WAAWS,EAAEI,eAC9DhJ,KAAKoG,IAAM,CAAEL,QAAOC,SAAQE,YAC5BlG,KAAKiJ,gBAAkB,IAC1B,CACD,SAAAC,CAAUC,GACNnJ,KAAKiJ,gBAAkBE,CAC1B,CACD,aAAMC,GACF,MAAMlI,QAAiB6B,MAAM/C,KAAKoG,IAAIL,MAAO,CACzCpC,OAAQ,OACR/C,QAAS,CACL,eAAgB,qCAEpBgD,KAAM,IAAImE,gBAAgB,CACtB,CAAC,YAAa/H,KAAK2F,UACnB,CAAC,aAAc,iBACf,CAAC,gBAAiB3F,KAAK+F,MAAMiD,mBAGrC,IAAK9H,EAASoC,GACV,MAAM,IAAI7E,MAAM,SAAWyC,EAASC,OAAS,KAAOD,EAASO,QAEjE,MAAMsE,QAAc7E,EAASsC,OAC7BxD,KAAK+F,MAAQA,EACb/F,KAAK6I,YAAcb,EAA6BG,WAAWpC,EAAM+C,cACjE9I,KAAK+I,aAAef,EAA6BG,WAAWpC,EAAMiD,eAC9DhJ,KAAKiJ,iBACLjJ,KAAKiJ,gBAAgBjJ,KAAK+F,MAAO/F,KAAK6I,YAAa7I,KAAK+I,aAE/D,CACD,iBAAAM,CAAkBC,GACd,MAAMC,GAAM,IAAIC,MAAOC,UACjBC,EAAwD,IAAhC1J,KAAK+I,aAAaJ,QAAQgB,IAGxD,QAFgBJ,EAAMG,IACAH,EAAMD,EAAcI,CAE7C,CACD,eAAME,CAAUN,GACPtJ,KAAKqJ,kBAAkBC,UAGtBtJ,KAAKoJ,SACd,CACD,MAAApD,GACI,MAAMiB,EAAM,IAAInB,IAAI9F,KAAKoG,IAAIJ,QAC7BiB,EAAIC,aAAanG,IAAI,2BAA4Bf,KAAKoG,IAAIF,UAC1De,EAAIC,aAAanG,IAAI,gBAAiBf,KAAK+F,MAAM8D,UACjDzI,OAAOC,SAAW4F,CACrB,CAED,WAAA6C,GACI,MAAO,UAAU9J,KAAK+F,MAAM+C,cAC/B,CAED,WAAA5F,CAAY6G,EAAmBC,GAC3B,OAAO,IAAIC,EAAiCjK,KAAM+J,EAAmBC,EACxE,EAGL,MAAMC,EACF,WAAAtK,CAAYuK,EAASH,EAAmBC,GACpChK,KAAKkK,QAAUA,EACflK,KAAK+J,kBAAoBA,GAAqB,IAC9C/J,KAAKgK,iBAAmBA,GAAoB,GAC/C,CACD,eAAM9J,CAAUC,EAASC,SACfJ,KAAKkK,QAAQN,UAAU5J,KAAK+J,mBAClC,MAAMnJ,EAAU,IAAIC,QAAQV,EAAQW,QAAQF,SAC5CA,EAAQG,IAAI,gBAAiBf,KAAKkK,QAAQJ,eAC1C3J,EAAQW,QAAQF,QAAUA,EAC1B,MAAMM,QAAiBd,EAAMI,QAAQL,GAErC,aADMH,KAAKkK,QAAQN,UAAU5J,KAAKgK,kBAC3B9I,CACV,EClLA,MAACiJ,EAAS,CACXC,MAAMC,GACK,IAAIC,SAAQC,GAAWC,WAAWD,EAASF,KAEtDI,iBAAkB,EAClBC,mBAAoB,EACpB,QAAAC,CAASC,EAAWC,EAAM/J,GACtB,IAAIgK,EAAM,KACNC,EAAO,GACPC,EAAoB,EACpB3H,EAAOvC,GAAWqJ,EAAOM,iBAE7B,MAAMQ,EAAQ,KACV,MAAMC,GAAU,IAAI1B,MAAOC,UAAYuB,EACnCJ,EAAYM,EACZJ,EAAMN,WAAWS,EAAOL,EAAYM,IAGxCJ,EAAM,KACFzH,IAAS8G,EAAOO,oBAChBG,KAAQE,GAGA,OAARD,IACAC,EAAO,IACV,EAGL,OAAO,WACHA,EAAOI,UACPH,GAAoB,IAAIxB,MAAOC,UACnB,OAARqB,IACAA,EAAMN,WAAWS,EAAOL,GACpBvH,IAAS8G,EAAOO,oBAChBG,KAAQE,GAG5B,CACK,EACDK,iBAAkB,EAClBC,oBAAqB,EACrBC,qBAAsB,EACtB,QAAAC,CAASX,EAAWC,EAAM/J,GACtB,IAAIgK,EAAM,KACNC,EAAO,GACPC,EAAoB,EACpB3H,EAAOvC,GAAWqJ,EAAOiB,iBAE7B,MAAMH,EAAQ,KACVD,EAAqB3H,EAAO8G,EAAOkB,oBAAuB,GAAI,IAAI7B,MAAOC,UACzEqB,EAAM,KACND,KAAQE,GACI,OAARD,IACAC,EAAO,GACV,EAGL,OAAO,WACH,MAAMxB,GAAM,IAAIC,MAAOC,WAClBuB,GAAsB3H,EAAO8G,EAAOkB,sBACrCL,EAAoBzB,GAExB,MAAMiC,EAAYZ,GAAarB,EAAMyB,GACrCD,EAAOI,UACHK,GAAa,GAAKA,EAAYZ,GAClB,OAARE,IACAW,aAAaX,GACbA,EAAM,MAEVE,EAAoBzB,EACpBsB,KAAQE,GACI,OAARD,IACAC,EAAO,KAEI,OAARD,GAAkBzH,EAAO8G,EAAOmB,uBACvCR,EAAMN,WAAWS,EAAOO,GAExC,CAEK,GChFL,MAAME,EACF,eAAOC,IAAYC,GACf,MAAMC,EAAKhM,SAASiM,cAAc,OAClCD,EAAGE,UAAYH,EAAKnM,KAAK,IACzB,MAAMuM,EAAW,IAAIC,iBAIrB,OAHA/M,MAAMC,KAAK0M,EAAGK,YAAY7E,SAAQ8E,IAC9BH,EAASI,YAAYD,EAAK,IAEvBH,CACV,CACD,aAAOK,CAAOL,GACV,IAAIM,EAAIzM,SAASiM,cAAc,QAE/B,OADAQ,EAAEF,YAAYJ,GACPM,EAAEP,SACZ,CACD,WAAO5M,IAAQoN,GACX,MAAMP,EAAW,IAAIC,iBACrB,IAAK,IAAI5O,EAAI,EAAGA,IAAMkP,EAAMhP,SAAUF,EAClC2O,EAASI,YAAYG,EAAMlP,IAE/B,OAAO2O,CACV,CACD,qBAAOQ,CAAeX,GAClB,MAAMU,EAAQrN,MAAMC,KAAK0M,EAAGK,YACtBF,EAAW,IAAIC,iBACrB,IAAK,IAAI5O,EAAI,EAAGA,IAAMkP,EAAMhP,SAAUF,EAClC2O,EAASI,YAAYG,EAAMlP,IAE/B,OAAO2O,CACV,EAGL,MAAMS,EACFC,UAAY,EACZ,UAAOC,CAAI1I,GACP,MAAO,GAAGA,OAAYwI,EAAWG,IACpC,CACD,gBAAOC,CAAUvH,GACb,OAAOA,UAAmD,IAAVA,CACnD,CACD,mBAAOwH,CAAajB,EAAInL,EAAGC,GAIvB,OAHKkL,EAAGkB,aAAarM,IACjBmL,EAAGmB,aAAatM,EAAGC,GAEhBkL,EAAG9L,aAAaW,EAC1B,CACD,cAAOuM,CAAQhJ,EAAQ9E,EAAM+N,GACzB/N,EAAKgO,oBACAC,QAAOC,GAAKA,EAAE9M,WAAW0D,KACzBoD,SAAQgG,IACL,MAAMC,EAASD,EAAE/P,UAAU2G,EAAO1G,QACnB,UAAX+P,EAIJJ,EAAGF,aAAaM,EAAQnO,EAAKY,aAAasN,IAHtCH,EAAGK,UAAUC,OAAOrO,EAAKY,aAAakE,EAAS,SAASsE,MAAM,KAAK6E,QAAOC,GAAKA,EAAE9P,SAGxC,GAExD,EAGL,MAAMkQ,EACF,WAAOtO,CAAK0M,GACR,MAAM6B,EAAaxO,MAAMC,KAAK0M,EAAGK,YAC5BkB,QAAOvB,GAAMA,EAAG8B,SAAW9B,EAAG8B,QAAQ,YACtChP,KAAIkN,IACDA,EAAGrH,SACH,MAAMoJ,EAAO/B,EAAG9L,aAAa,QAE7B,OADA8L,EAAGgC,gBAAgB,QACZ,CAACD,EAAM/B,EAAG,IAEnBiC,EAAU3G,OAAO4G,YAAYL,GAGnC,OAFAI,EAAQE,QAAU,IAAI/B,iBACtB6B,EAAQE,QAAQC,UAAUpC,EAAGK,YACtB4B,CACV,EAGA,MAACI,EAAY,CAACC,EAAYC,IACpB,cAAcD,EACjBE,UACA,YAAIC,GACA,OAAOtO,KAAKqO,SACf,CACD,uBAAME,GACF,GAAIvO,KAAKqO,UACL,OAEJ,MAAMP,EAAUL,EAAMtO,KAAKa,MACrBgM,QAAiB1B,QAAQC,QAAQvK,KAAKwO,OAAOV,EAASM,IAC5DpO,KAAK+L,UAAY,GACbC,GACAhM,KAAKoM,YAAYJ,GAErBhM,KAAKqO,WAAY,CACpB,GAIHI,EAAW,CAACN,EAAYO,EAAOC,KAEjC,MAAMC,EAAM,GAAGC,OAAOH,GAAOG,OAAOF,GAAU,IAE9C,OAAO,cAAcR,EACjB,6BAAWW,GACP,OAAOF,CACV,CACD,WAAAjP,IAAeoL,GACX7I,SAAS6I,GACT/K,KAAK+O,WAAa/O,KAAK+O,YAAc/O,KAAKgP,kBAC1C,IAAK,MAAMC,KAAQP,EACfvH,OAAO+H,eAAelP,KAAMiP,EAAM,CAC9B,GAAA/G,GACI,OAAOlI,KAAK+M,aAAakC,EAC5B,EACD,GAAAlO,CAAIuE,GAEA,GAAImH,EAAWI,UAAUvH,GAGrB,OAFAtF,KAAK+O,WAAWI,OAAO3B,IAAI,KAAKyB,UAChCjP,KAAKgN,aAAaiC,EAAM,IAG5BjP,KAAK+O,WAAWI,OAAOC,OAAO,KAAKH,KACnCjP,KAAK6N,gBAAgBoB,EACxB,GAGZ,CACD,wBAAAI,CAAyBjN,EAAMkN,EAAUC,GACrC,GAAID,IAAaC,EACb,OAEJvP,KAAKoC,GAAQmN,EACb,MAAM5L,EAAS3D,KAAK,KAAKoC,EAAKnE,OAAO,GAAGqB,gBAAgB8C,EAAKoN,OAAO,GAAGC,wBACvE9L,GAAQ+L,KAAK1P,KAAMuP,EAAUD,EAChC,EACJ,EClIL,MAAMK,UAAazB,EAAU0B,cACzBlD,gBAAkB,CAAA,EAClBA,kBAAoB,CAAA,EACpBA,8BAAgC,SAChCA,iCAAmC,oBAEnC,MAAA8B,CAAOV,EAASM,GACZ,MAAMyB,EAAOhQ,SAASiM,cAAc,QAmBpC,OAlBA+D,EAAK5B,OAAOH,EAAQE,SACpB6B,EAAKC,iBAAiB,UAAUC,MAAOnR,IACnCA,EAAEoR,iBACFhQ,KAAKiQ,SAAQ,GACb,IACQjQ,KAAKkQ,iBACClQ,KAAKkQ,UAAUlQ,KAAKmQ,YAAanQ,KAE9C,CAAC,MAAOpB,GACL,GAAIA,aAAa2C,EAEb,YADAvB,KAAKoQ,UAAUxR,EAAEqD,UAGrB,MAAMrD,CACtB,CAAsB,QACNoB,KAAKiQ,SAAQ,EAChB,KAEEJ,CACV,CACD,OAAAI,CAAQI,GACJrQ,KAAKsQ,iBAAiB,eAAejJ,SAAQwE,IACzCA,EAAG0E,QAAUF,CAAI,IAErBrQ,KAAKsQ,iBAAiB,8BAA8BjJ,SAAQwE,IACxDA,EAAG2E,SAAWH,CAAI,GAEzB,CACD,SAAAI,CAAUC,GACN,IAAK,IAAIhQ,KAAKgQ,EACLA,EAAOC,eAAejQ,IAG3BxB,MAAMC,KAAKa,KAAKsQ,iBAAiB,UAAUM,IAAIC,OAAOnQ,SAAS2G,SAASwE,IACpE8D,EAAKmB,OAAOnB,EAAKoB,SAAUlF,EAAI6E,EAAOhQ,GAAIA,EAAGgQ,EAAO,GAG/D,CACD,SAAAP,GACI,OAAOjR,MAAMC,KAAKa,KAAKsQ,iBAAiBX,EAAKqB,yBACxC5D,QAAQvB,GACgC,UAAjCA,EAAGoF,QAAwB,iBAGS,WAAjCpF,EAAGoF,QAAwB,gBAAiE,OAA/CpF,EAAGqF,QAAQvB,EAAKwB,8BAEvEC,QAAO,CAACC,EAAQxF,IACN8D,EAAK2B,YAAYD,EAAQxF,EAAG9L,aAAa,QAAS4P,EAAK4B,QAAQ5B,EAAK6B,WAAY3F,KACxF,CAAE,EACZ,CACD,SAAAuE,CAAUqB,EAAQC,GAsBd,GArBA1R,KAAK2R,cACLF,EACKrE,QAAQxO,GAAiB,gBAAXA,EAAE+C,MAAqC,mBAAX/C,EAAE+C,OAC5C0F,SAASzI,IACN,MAAMwD,EAAOxD,EAAEgB,QAAQgS,QAAQ,IAAK,KAAKA,QAAQ,KAAM,KAGvD5R,KAAKsQ,iBAAiB,UAAUM,IAAIC,OAAOzO,QACtCiF,SAAQwK,GAASA,EAAMtE,UAAUC,IAAI,gBAC1CxN,KAAKsQ,iBAAiB,0BAA0BM,IAAIC,OAAOzO,QACtDiF,SAAQwE,GAAMA,EAAGiG,UAAYlT,EAAEgD,QAAO,IAEnD5B,KAAKsQ,iBAAiB,cACjBjJ,SAAQwE,IACL,MAAMkG,EAAeN,EAAOrE,QAAQxO,GAAiB,gBAAXA,EAAE+C,MAAqC,mBAAX/C,EAAE+C,OACxEkK,EAAGE,UAAYgG,EAAapT,KAAIC,GAAKA,EAAEgD,SAAQnC,KAAK,MACxB,IAAxBsS,EAAaxU,QACbsO,EAAGgC,gBAAgB,SACtB,KAGJ6D,EACD,OAEJ,MAAMM,EAAK9S,MAAMC,KAAKa,KAAKsQ,iBAAiB,oBACvC3R,KAAIkN,GAAMA,EAAGoG,wBAAwBC,EAAI9Q,OAAO+Q,UAC/CC,EAAOzU,KAAK0U,OAAOL,GACrBI,IAASE,KACTlR,OAAOsQ,OAAOtQ,OAAOmR,QAASH,EAAO,IAAMA,EAAO,IAAM,EAE/D,CACD,WAAAT,GACI3R,KAAKsQ,iBAAiB,eACjBjJ,SAAQwE,GAAMA,EAAG0B,UAAU/I,OAAO,gBACvCxE,KAAKsQ,iBAAiB,cACjBjJ,SAAQwE,IACLA,EAAGE,UAAY,GACfF,EAAGmB,aAAa,SAAU,GAAG,GAExC,CACD,cAAOuE,CAAQiB,EAAY3G,GACvB,MAAM4G,EAAiBD,EAAW3G,EAAGoF,QAA0B,mBAAMuB,EAAW3G,EAAGoF,QAAwB,gBAC3G,GAAIwB,EACA,OAAOA,EAAe5G,GAE1B,GAAgC,UAA5BA,EAAG9L,aAAa,QAAqB,CACrC,IAAK8L,EAAG6G,QACJ,OAEJ,MAAqC,YAA9B7G,EAAGoF,QAAqB,YAA+B,SAAbpF,EAAGvG,MAAmBuG,EAAGvG,KAC7E,CACD,MAAgC,aAA5BuG,EAAG9L,aAAa,QACT8L,EAAG6G,QAEoB,YAA9B7G,EAAGoF,QAAqB,YAChBpF,EAAGvG,MAA4B,SAAbuG,EAAGvG,MAAV,KAEnBuG,EAAG8G,SACI9G,EAAG8G,WAEP9G,EAAGvG,OAAS,IACtB,CACD,aAAOwL,CAAO8B,EAAU/G,EAAIgH,EAAK5N,EAAKyL,GAClC,MAAMoC,EAAeF,EAAS/G,EAAGoF,QAAwB,iBAAM2B,EAAS/G,EAAGoF,QAAwB,gBAC/F6B,EACAA,EAAajH,EAAIgH,EAAK5N,EAAKyL,GAGC,UAA5B7E,EAAG9L,aAAa,QAIY,aAA5B8L,EAAG9L,aAAa,QAIhB8L,EAAGkH,SACHlH,EAAGkH,SAASF,GAGhBhH,EAAGvG,MAAQuN,EAPPhH,EAAG6G,QAAUG,EAJbhH,EAAG6G,QAAU7G,EAAG9L,aAAa,WAAa8S,CAYjD,CAED,kBAAOvB,CAAYD,EAAQ2B,EAAM1N,GAC7B,MAAM2N,EAAOD,EAAKzK,MAAM,KAAK5J,KAAK+B,GAAMA,EAAEwS,MAAM,aAAexS,EAAIA,IACnE,IAAIuC,EAAUoO,EACV8B,EAAW,KACf,IAAK,IAAI9V,EAAI,KAAOA,EAAG,CACnB,MAAM+V,EAAOH,EAAK5V,GACZgW,EAAOJ,EAAK5V,EAAI,GAQtB,GAPIiW,OAAOC,UAAUH,KAAUlU,MAAMsU,QAAQvQ,KACxB,OAAbkQ,EACAA,EAASE,GAAQpQ,EAAU,GAE3BoO,EAASpO,EAAU,IAGvB5F,IAAM4V,EAAK1V,OAAS,EAGpB,OADA0F,EAAQmQ,QAAkB3P,IAAV6B,EAAsBA,EAAS8N,KAAQnQ,EAAUA,EAAQmQ,GAAQ,KAC1E/B,OAEW5N,IAAlBR,EAAQmQ,KACRnQ,EAAQmQ,GAAQ,IAEpBD,EAAWlQ,EACXA,EAAUA,EAAQmQ,EACrB,CACJ,CACD,aAAOK,CAAOC,EAASC,GACnBC,eAAeC,OAAOH,EAAS,cAAc/D,EACzC,WAAAhQ,GACIuC,MAAMyR,EACT,GAER,ECjLL,MAAMG,EAAeC,WAAWC,IAAMC,IAAIC,kBAAkBC,UAAU,CAEtE,GAEMC,EAAsBL,WAAWM,oBAAsBJ,IAAIK,SAAS3I,SAAS,ioBAUhFmI,GAEH,MAAMS,UAAcrG,EAAU0B,YAAawE,IACvC,MAAA5F,CAAOV,EAASM,GACZ,MAAMyD,EAAQ/D,EAAQ+D,MAAQ/D,EAAQ+D,OAAS,MAC3C,MAAMhG,EAAKhM,SAASiM,cAAc,SAElC,OADAD,EAAG0B,UAAUC,IAAI,gBACV3B,CACV,EAJ8C,GAKzCe,EAAKiF,EAAM9R,aAAa,OAASC,KAAKD,aAAa,aAAe0M,EAAWE,IAAI,aACvFF,EAAWQ,QAAQ,SAAUjN,KAAM8N,EAAQ+D,OAC3CpF,EAAWK,aAAagB,EAAQ+D,MAAO,KAAMjF,GAC7CH,EAAWK,aAAagB,EAAQ+D,MAAO,OAAQ,QAC/CpF,EAAWK,aAAagB,EAAQ+D,MAAO,cAAe,KACtD,MAAMzP,EAAOyP,EAAM9R,aAAa,QAChC,OAAOqO,EAASI,OAAO,CAAE5B,KAAIxK,OAAM0L,WACtC,CACD,gBAAOqG,GACHP,eAAeC,OAAO,YAAaU,EACtC,EC9BL,MAAMC,EAAgBT,WAAWC,IAAMC,IAAIC,kBAAkBC,UAAU,CAEvE,GAEMM,EAAuBV,WAAWW,qBAAuBT,IAAIK,SAAS3I,SAAS,oqBAWlF6I,GAGH,MAAMG,UAAezG,EAAU0B,YAAa6E,IACxC,WAAA9U,CAAYiV,GACR1S,QACAlC,KAAK4U,SAAWA,CACnB,CACD,MAAApG,CAAOV,EAASM,GACZ,MACMyG,EAAiB,UADV7U,KAAKD,aAAa,SAAW,SAEpC+U,EAAwC,UAA7B9U,KAAKD,aAAa,QAE7B8R,EAAQ/D,EAAQ+D,MAAQ/D,EAAQ+D,OAC3BhS,SAASiM,cAAc,UAE5Bc,EAAKiF,EAAM9R,aAAa,OAASC,KAAKD,aAAa,aAAe0M,EAAWE,IAAI,cACjFoI,EAAO,GAAGnI,eAChBH,EAAWQ,QAAQ,SAAUjN,KAAM6R,GACnCpF,EAAWK,aAAa+E,EAAO,KAAMjF,GACrCH,EAAWK,aAAa+E,EAAO,cAAe,KAC9C,MAAMzP,EAAOyP,EAAM9R,aAAa,QAChC8R,EAAMkB,SAAW/S,KAAK+S,SAASiC,KAAKhV,MACpC6R,EAAMc,SAAW3S,KAAK2S,SAASqC,KAAKhV,MAIpC8N,EAAQ+D,MAAQnG,EAAUvM,KAAK0S,GAE/B7R,KAAKiV,QAAUJ,EAuCf,OA9BA7U,KAAKkV,QAAUL,EAKf7U,KAAKmV,qBAAuBpF,MAAOqF,EAAOjM,KAEtC,IAAK0L,GAAUA,GAAUC,GAAY9U,KAAKiV,OAEtC,YADA9L,IAGJ,MAAMxH,EAAOyT,GAASA,EAAMzE,eAAe,QAAU,KAAO,QACtD0E,EAAkB,OAAT1T,EAAgByT,EAAME,KAAOF,EACtC5P,QAAcxF,KAAKuV,OAASvV,KAAKuV,OAAOF,EAAQ1T,GAAQ,IAClD,OAATA,IACC3B,KAAKiV,QAAS,GAElB9L,EAAS3D,EAAK,EAIlBxF,KAAKwV,GAAK,IAAIC,UAAU5D,EAAO1K,OAAOuO,OAAOb,EAAS,CAClDc,QAAS,QACTtR,KAAMrE,KAAKmV,qBACXS,WAAaR,IAAUpV,KAAK4V,YAAa5V,KAAK4V,WAAWR,IACzD,CAAE,EAhCkB,CACpB5G,OAAQ,CACJqH,QAAS,IAAM,qDA8BE7V,KAAK4U,WAC9BkB,QAAQC,IAAI,cAEZlE,EAAMrN,SAEC4J,EAASI,OAAO,CAAE5B,KAAImI,OAAM3S,OAAMyP,QAAO/D,WACnD,CACD,cAAMiF,CAASpS,GACRX,KAAKkV,eACElV,KAAKmV,qBAAqB,CAACG,KAAM3U,GAAIX,KAAKwV,GAAGQ,aAAahB,KAAKhV,KAAKwV,KAE9ExV,KAAKwV,GAAGzC,SAASpS,EACpB,CACD,QAAAgS,GACI,MAAMhS,EAAIX,KAAKwV,GAAG7C,WAClB,MAAa,KAANhS,EAAW,KAAOA,CAC5B,CACD,aAAO8S,CAAOC,EAASC,GACnBC,eAAeC,OAAOH,EAAS,cAAciB,EACzC,WAAAhV,GACIuC,MAAMyR,EACT,GAER,CACD,gBAAOQ,GACH,OAAOQ,EAAOlB,OAAO,aACxB,ECvGL,MAAMwC,EAAoBlC,WAAWC,IAAMC,IAAIC,kBAAkBC,UAAU,CAE3E,GAEM+B,EAA4BnC,WAAWoC,yBAA2BlC,IAAIK,SAAS3I,SAAS,4gBAgB3FsK,GAGH,MAAMG,UAAmB3H,EAASP,EAAU0B,YAAasG,GAA4B,CAAC,cAClF,MAAA1H,CAAOV,EAASM,GACZ,MAAMhM,EAAOpC,KAAKD,aAAa,eAAiB0M,EAAWE,IAAI,kBACzD0J,EAAWnX,MAAMC,KAAK2O,EAAQE,QAAQsC,iBAAiB,cACvDgG,EAAkBD,EAAS1X,KAAIkN,IACjC,MAAMgG,EAAQhS,SAASiM,cAAc,SACrC+F,EAAM7E,aAAa,OAAQ,SAC3BP,EAAWQ,QAAQ,SAAUjN,KAAM6R,GACnCpF,EAAWQ,QAAQ,GAAIpB,EAAIgG,GAC3BpF,EAAWK,aAAa+E,EAAO,OAAQzP,GAEvC,MAAO,CAACyP,EADMnG,EAAUc,eAAeX,GAClB,IAEzBwK,EAAShP,SAAQwE,GAAMA,EAAGrH,WAO1B,OALiB4J,EAASI,OAAO,CAC7BpM,KAAMA,EACN0L,QAASA,EACTwI,gBAAiBA,GAGxB,CACD,gBAAOnC,GACHP,eAAeC,OAAO,kBAAmBuC,EAC5C,ECjDL,MAAMG,EAAiBxC,WAAWC,IAAMC,IAAIC,kBAAkBC,UAAU,CAExE,GAEMqC,EAAwBzC,WAAW0C,sBAAwBxC,IAAIK,SAAS3I,SAAS,6KAKpF4K,GAGH,MAAMG,UAAgBxI,EAAU0B,YAAa4G,IACzC,MAAAhI,CAAOV,EAASM,GACZ,OAAOA,EAASI,OAAO,CAAEV,WAC5B,CACD,gBAAOqG,GACHP,eAAeC,OAAO,cAAe6C,EACxC,ECtBL,MAAMC,UAAe/G,YACjB,WAAAjQ,GAWI,GAVAuC,QACAlC,KAAK4W,SAAW,IAAI5W,KAAK6W,UAAUzJ,QAAOxO,GAAKA,EAAE+O,QAAQ,kBAEzD3N,KAAK4W,SAASvP,SAAQyP,IAClB,MAAMD,EAAW,IAAIC,EAAED,eAEPpT,IADAoT,EAASzJ,QAAOxO,GAAKA,EAAE+O,QAAQ,aAAY,IAC9BkJ,EAAStZ,OAAS,GAC3CsZ,EAAS,GAAGtJ,UAAUC,IAAI,SAC7B,IAEyC,OAA1CxN,KAAKF,cAAc,mBAA6B,CAChD,MAAMiX,EAAe/W,KAAKF,cAAc,yBACnB,OAAjBiX,GACAA,EAAaxJ,UAAUC,IAAI,UAElC,CACJ,CACD,IAAAwJ,GACIhX,KAAK4W,SAASvP,SAAQyP,IAClB,MACM7T,EADW,IAAI6T,EAAED,UACEzJ,QAAOxO,GAAKA,EAAE+O,QAAQ,aAAY,GAC3D1K,GAASsK,UAAU/I,OAAO,UAC1BvB,GAASgU,oBAAoB1J,UAAUC,IAAI,SAAS,IAExD,MAAM0J,EAAiBlX,KAAKF,cAAc,mBAC1CoX,EAAe3J,UAAU/I,OAAO,WAChC0S,EAAeD,mBAAmB1J,UAAUC,IAAI,WAEhDxN,KAAKmX,cAAc,IAAIC,YAAY,kBAAmB,CAClDC,SAAS,EACTC,YAAY,IAGnB,CACD,IAAAC,GACIvX,KAAK4W,SAASvP,SAAQyP,IAClB,MACM7T,EADW,IAAI6T,EAAED,UACEzJ,QAAOxO,GAAKA,EAAE+O,QAAQ,aAAY,GAC3D1K,GAASsK,UAAU/I,OAAO,UAC1BvB,GAASuU,wBAAwBjK,UAAUC,IAAI,SAAS,IAE5D,MAAM0J,EAAiBlX,KAAKF,cAAc,mBAC1CoX,EAAe3J,UAAU/I,OAAO,WAChC0S,EAAeM,uBAAuBjK,UAAUC,IAAI,WACpDxN,KAAKmX,cAAc,IAAIC,YAAY,kBAAmB,CAClDC,SAAS,EACTC,YAAY,IAEnB,CACDG,OAAS,SAAUC,GACf1X,KAAK4W,SAASvP,SAAQyP,IAClB,MACM7T,EADW,IAAI6T,EAAED,UACEzJ,QAAOxO,GAAKA,EAAE+O,QAAQ,aAAY,GAC3D1K,GAASsK,UAAU/I,OAAO,UAC1BsS,EAAED,UAAUa,IAAInK,UAAUC,IAAI,SAAS,IAE3C,MAAM0J,EAAiBlX,KAAKF,cAAc,mBAC1CoX,GAAgB3J,UAAU/I,OAAO,WACdxE,KAAKF,cAAc,sBAAsB4X,MACjDnK,UAAUC,IAAI,WACzBxN,KAAKmX,cAAc,IAAIC,YAAY,kBAAmB,CAClDC,SAAS,EACTC,YAAY,IAEnB,EACD,aAAO7D,CAAOC,EAASC,GACnBC,eAAeC,OAAOH,EAAS,cAAciD,EACzC,WAAAhX,GACIuC,MAAMyR,EACT,GAER,CACD,gBAAOQ,GACH,OAAOwC,EAAOlD,OAAO,aACxB"}
|
|
1
|
+
{"version":3,"file":"ful.min.mjs","sources":["../src/encodings.mjs","../src/http-client.mjs","../src/storage.mjs","../src/oauth-authorization-code.mjs","../src/timing.mjs","../src/elements/elements.mjs","../src/elements/form.mjs","../src/elements/input.mjs","../src/elements/select.mjs","../src/elements/radio.mjs","../src/elements/spinner.mjs","../src/elements/wizard.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 static fromHtml(...html) {\n const el = document.createElement('div');\n el.innerHTML = html.join(\"\");\n const fragment = new DocumentFragment();\n Array.from(el.childNodes).forEach(node => {\n fragment.appendChild(node);\n });\n return fragment;\n } \n static toHtml(fragment) {\n var r = document.createElement(\"root\");\n r.appendChild(fragment);\n return r.innerHTML;\n }\n static from(...nodes) {\n const fragment = new DocumentFragment();\n for (let i = 0; i !== nodes.length; ++i) {\n fragment.appendChild(nodes[i]);\n }\n return fragment;\n }\n static fromChildNodes(el) {\n const nodes = Array.from(el.childNodes);\n const fragment = new DocumentFragment();\n for (let i = 0; i !== nodes.length; ++i) {\n fragment.appendChild(nodes[i]);\n }\n return fragment;\n }\n}\n\nclass Attributes {\n static id = 0;\n static uid(prefix) {\n return `${prefix}-${++Attributes.id}`;\n }\n static asBoolean(value) {\n return value !== null && value !== undefined && value !== false;\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 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\nclass Slots {\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 slotted = Object.fromEntries(namedSlots);\n slotted.default = new DocumentFragment();\n slotted.default.append(...el.childNodes);\n return slotted;\n }\n}\n\nconst Templated = (SuperClass, template) => {\n return class extends SuperClass {\n rendered_;\n get rendered() {\n return this.rendered_;\n }\n async connectedCallback() {\n if (this.rendered_) {\n return;\n }\n const slotted = Slots.from(this);\n const fragment = await Promise.resolve(this.render(slotted, template));\n this.innerHTML = '';\n if (fragment) {\n this.appendChild(fragment);\n }\n this.rendered_ = true;\n }\n };\n}\n\nconst Stateful = (SuperClass, flags, others) => {\n\n const all = [].concat(flags).concat(others || []);\n\n return class extends SuperClass {\n static get observedAttributes() {\n return all;\n }\n constructor(...args) {\n super(...args);\n this.internals_ = this.internals_ || this.attachInternals();\n for (const flag of flags) {\n Object.defineProperty(this, flag, {\n get() {\n return this.hasAttribute(flag);\n },\n set(value) {\n //see https://developer.mozilla.org/en-US/docs/Web/API/CustomStateSet#using_double_dash_prefixed_idents\n if (Attributes.asBoolean(value)) {\n this.internals_.states.add(`--${flag}`);\n this.setAttribute(flag, '');\n return;\n }\n this.internals_.states.delete(`--${flag}`);\n this.removeAttribute(flag);\n }\n });\n }\n }\n attributeChangedCallback(name, oldValue, newValue) {\n if (oldValue === newValue) {\n return;\n }\n this[name] = newValue;\n const method = this[`on${name.charAt(0).toUpperCase()}${name.substr(1).toLowerCase()}Changed`];\n method?.call(this, newValue, oldValue);\n }\n };\n}\n\nexport { Fragments, Attributes, Slots, Templated, Stateful };\n","/* global Infinity, CSS */\n\nimport { Failure } from \"../http-client.mjs\";\nimport { Templated } 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\n\n\nclass Form extends Templated(HTMLElement) {\n static MUTATORS = {};\n static EXTRACTORS = {};\n static VALUE_HOLDERS_SELECTOR = '[name]';\n static IGNORED_CHILDREN_SELECTOR = '.d-none, [hidden]';\n\n render(slotted, template) {\n const form = document.createElement('form');\n form.append(slotted.default);\n form.addEventListener('submit', async (e) => {\n e.preventDefault();\n this.spinner(true);\n try {\n if (this.submitter) {\n await this.submitter(this.getValues(), this);\n }\n } catch (e) {\n if (e instanceof Failure) {\n this.setErrors(e.problems);\n return;\n }\n throw e;\n } finally {\n this.spinner(false)\n }\n })\n return form;\n }\n spinner(spin) {\n this.querySelectorAll('ful-spinner').forEach(el => {\n el.hidden = !spin;\n })\n this.querySelectorAll('[type=submit],[type=reset]').forEach(el => {\n el.disabled = spin;\n })\n }\n setValues(values) {\n for (const [flattenedKey, value] of Object.entries(flatten(values, ''))) {\n Array.from(this.querySelectorAll(`[name='${CSS.escape(flattenedKey)}']`)).forEach((el) => {\n Form.mutate(Form.MUTATORS, el, value, flattenedKey);\n });\n }\n }\n getValues() {\n return Array.from(this.querySelectorAll(Form.VALUE_HOLDERS_SELECTOR))\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 Form.providePath(result, el.getAttribute('name'), Form.extract(Form.EXTRACTORS, el));\n }, {});\n }\n setErrors(errors) {\n this.clearErrors();\n errors\n .filter((e) => e.type === 'FIELD_ERROR' || e.type === 'INVALID_FORMAT')\n .forEach((e) => {\n const name = e.context.replace(\"[\", \".\").replace(\"].\", \".\");\n this.querySelectorAll(`[name='${CSS.escape(name)}'] [ful-validation-target],[name='${CSS.escape(name)}']:not(:has([ful-validation-target]))`)\n .forEach(input => input.classList.add('is-invalid'));\n this.querySelectorAll(`ful-field-error[field='${CSS.escape(name)}']`)\n .forEach(el => el.innerText = e.reason);\n });\n this.querySelectorAll(\"ful-errors\")\n .forEach(el => {\n const globalErrors = errors.filter((e) => e.type !== 'FIELD_ERROR' && e.type !== 'INVALID_FORMAT');\n el.innerHTML = globalErrors.map(e => e.reason).join(\"\\n\");\n if (globalErrors.length !== 0) {\n el.removeAttribute('hidden');\n }\n })\n\n if (!this.hasAttribute('scroll-on-error')) {\n return;\n }\n const ys = Array.from(this.querySelectorAll('ful-field-error'))\n .map(el => el.getBoundingClientRect().y + window.scrollY)\n const miny = Math.min(...ys);\n if (miny !== Infinity) {\n window.scroll(window.scrollX, miny > 100 ? miny - 100 : 0);\n }\n }\n clearErrors() {\n this.querySelectorAll('.is-invalid')\n .forEach(el => el.classList.remove('is-invalid'));\n this.querySelectorAll(\"ful-errors\")\n .forEach(el => {\n el.innerHTML = '';\n el.setAttribute('hidden', '');\n });\n }\n static extract(extractors, el) {\n const maybeExtractor = extractors[el.dataset['fulBindExtractor']] || extractors[el.dataset['fulBindProvide']];\n if (maybeExtractor) {\n return maybeExtractor(el);\n }\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 || null;\n }\n static mutate(mutators, el, raw, flattenedKey) {\n const maybeMutator = mutators[el.dataset['fulBindMutator']] || mutators[el.dataset['fulBindProvide']];\n if (maybeMutator) {\n maybeMutator(el, raw, flattenedKey);\n return;\n }\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\n static 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 static custom(tagName, configuration) {\n customElements.define(tagName, class extends Form {\n constructor() {\n super(configuration);\n }\n });\n }\n}\n\nexport { Form };\n","import { Attributes, Stateful, Templated } from \"./elements.mjs\"\n\nconst ful_input_ec = globalThis.ec || ftl.EvaluationContext.configure({\n\n});\n\nconst ful_input_template_ = globalThis.ful_input_template || ftl.Template.fromHtml(`\n <label data-tpl-for=\"id\" class=\"form-label\">{{{{ slotted.default }}}}</label>\n <div class=\"input-group\">\n <span data-tpl-if=\"slotted.ibefore\" class=\"input-group-text\">{{{{ slotted.ibefore }}}}</span>\n <div data-tpl-if=\"slotted.before\" data-tpl-remove=\"tag\">{{{{ slotted.before }}}}</div>\n {{{{ slotted.input }}}} \n <div data-tpl-if=\"slotted.after\" data-tpl-remove=\"tag\">{{{{ slotted.after }}}}</div>\n <span data-tpl-if=\"slotted.iafter\" class=\"input-group-text\">{{{{ slotted.iafter }}}}</span>\n </div>\n <ful-field-error data-tpl-if=\"name\" data-tpl-field=\"name\"></ful-field-error>\n`, ful_input_ec);\n\nclass StatelessInput extends Templated(HTMLElement, ful_input_template_) {\n render(slotted, template) {\n const input = this.input = slotted.input = slotted.input || (() => {\n const el = document.createElement(\"input\")\n el.classList.add(\"form-control\");\n return el;\n })();\n input.setAttribute('ful-validation-target', '');\n \n const id = input.getAttribute('id') || this.getAttribute('input-id') || Attributes.uid('ful-input');\n Attributes.forward('input-', this, slotted.input)\n Attributes.defaultValue(slotted.input, \"id\", id);\n Attributes.defaultValue(slotted.input, \"type\", \"text\");\n Attributes.defaultValue(slotted.input, \"placeholder\", \" \");\n const name = this.getAttribute('name');\n return template.render({ id, name, slotted });\n }\n\n}\n\nclass Input extends Stateful(StatelessInput, [], ['value']) {\n render(slotted, template) {\n const fragment = super.render(slotted, template);\n this.input.value = this.getAttribute('value');\n return fragment;\n }\n get value() {\n if (this.input) {\n return this.getAttribute('value');\n }\n return this.input.value;\n }\n set value(value) {\n if (!this.input) {\n //handled during rendering\n return;\n }\n this.input.value = value;\n }\n static configure() {\n customElements.define('ful-input', Input);\n }\n}\n\nexport { StatelessInput, Input };\n","import { Fragments, Attributes, Templated } from \"./elements.mjs\"\n/**\n * <script src=\"tom-select.complete.js\"></script>\n * <link href=\"tom-select.bootstrap5.css\" rel=\"stylesheet\" />\n */\nconst ful_select_ec = globalThis.ec || ftl.EvaluationContext.configure({\n\n});\n\nconst ful_select_template_ = globalThis.ful_select_template || ftl.Template.fromHtml(`\n <label data-tpl-for=\"tsId\" class=\"form-label\">{{{{ slotted.default }}}}</label>\n {{{{ input }}}}\n <div class=\"input-group\">\n <span data-tpl-if=\"slotted.ibefore\" class=\"input-group-text\">{{{{ slotted.ibefore }}}}</span>\n <div data-tpl-if=\"slotted.before\" data-tpl-remove=\"tag\">{{{{ slotted.before }}}}</div>\n {{{{ slotted.input }}}} \n <div data-tpl-if=\"slotted.after\" data-tpl-remove=\"tag\">{{{{ slotted.after }}}}</div>\n <span data-tpl-if=\"slotted.iafter\" class=\"input-group-text\">{{{{ slotted.iafter }}}}</span>\n </div>\n <ful-field-error data-tpl-if=\"name\" data-tpl-field=\"name\"></ful-field-error> \n`, ful_select_ec);\n\n\nclass Select extends Templated(HTMLElement, ful_select_template_) {\n constructor(tsConfig) {\n super();\n this.tsConfig = tsConfig;\n }\n render(slotted, template) {\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 = slotted.input = slotted.input || (() => {\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 slotted.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\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\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 //we remove the input to move it\n input.remove();\n return template.render({ id, tsId, name, input, slotted });\n }\n set value(v) {\n (async () => {\n if(this._remote){\n await this._unwrappedRemoteLoad({byId: v}, this.ts.loadCallback.bind(this.ts));\n }\n this.ts.setValue(v);\n })();\n }\n get value() {\n const v = this.ts.getValue();\n return v === '' ? null : v;\n }\n static custom(tagName, configuration) {\n customElements.define(tagName, class extends Select {\n constructor() {\n super(configuration);\n }\n });\n }\n static configure() {\n return Select.custom('ful-select');\n }\n\n}\n\nexport { Select };\n","import { Attributes, Fragments, Stateful, Templated } from \"./elements.mjs\"\n\n\n\n\n\nconst ful_radiogroup_ec = globalThis.ec || ftl.EvaluationContext.configure({\n\n});\n\nconst ful_radiougroup_template_ = globalThis.ful_radiogroup_template || ftl.Template.fromHtml(`\n <fieldset>\n <legend class=\"form-label\">\n {{{{ slotted.default }}}}\n </legend>\n <header data-tpl-if=\"slotted.header\">\n {{{{ slotted.header }}}}\n </header>\n <section>\n <label data-tpl-each=\"inputsAndLabels\" data-tpl-var=\"ial\">\n {{{{ ial[0] }}}}\n {{{{ ial[1] }}}}\n </label>\n </section>\n <ful-field-error data-tpl-if=\"name\" data-tpl-field=\"name\"></ful-field-error>\n </fieldset>\n`, ful_radiogroup_ec);\n\n\nclass RadioGroup extends Stateful(Templated(HTMLElement, ful_radiougroup_template_), ['disabled']) {\n render(slotted, template) { \n const name = this.getAttribute('name') || Attributes.uid('ful-radiogroup');\n const radioEls = Array.from(slotted.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 const label = Fragments.fromChildNodes(el);\n return [input, label];\n });\n radioEls.forEach(el => el.remove());\n \n const fragment = template.render({\n name: name,\n slotted: slotted,\n inputsAndLabels: inputsAndLabels\n });\n return fragment;\n }\n get value() {\n const checked = this.querySelector('input[type=radio]:checked');\n return checked ? checked.value : null;\n }\n set value(value){\n this.querySelector(`input[type=radio][value=${CSS.escape(value)}]`).checked = true;\n }\n static configure() {\n customElements.define('ful-radio-group', RadioGroup);\n } \n}\n\n\nexport { RadioGroup };","import { Attributes, Fragments, Templated } from \"./elements.mjs\"\n\n\n\nconst ful_spinner_ec = globalThis.ec || ftl.EvaluationContext.configure({\n\n});\n\nconst ful_spinner_template_ = globalThis.ful_spinner_template || ftl.Template.fromHtml(`\n <div class=\"ful-spinner-wrapper\">\n <div class=\"ful-spinner-text\">{{{{ slotted.default }}}}</div>\n <div class=\"ful-spinner-icon\"></div>\n </div>\n`, ful_spinner_ec);\n\n\nclass Spinner extends Templated(HTMLElement, ful_spinner_template_) {\n render(slotted, template) {\n return template.render({ slotted });\n }\n static configure() {\n customElements.define('ful-spinner', Spinner);\n }\n}\n\nexport { Spinner };","class Wizard extends HTMLElement {\n constructor() {\n super();\n this.progress = [...this.children].filter(e => e.matches(\"header,ol,ul\"));\n\n this.progress.forEach(p => {\n const children = [...p.children];\n const current = children.filter(e => e.matches(\".active\"))[0];\n if (current === undefined && children.length > 0) {\n children[0].classList.add('active');\n }\n });\n if (this.querySelector('section.current') === null) {\n const firstSection = this.querySelector('section:first-of-type');\n if (firstSection !== null) {\n firstSection.classList.add('current');\n }\n }\n }\n next() {\n this.progress.forEach(p => {\n const children = [...p.children];\n const current = children.filter(e => e.matches(\".active\"))[0];\n current?.classList.remove('active');\n current?.nextElementSibling?.classList.add('active');\n });\n const currentSection = this.querySelector('section.current');\n currentSection.classList.remove(\"current\");\n currentSection.nextElementSibling.classList.add('current');\n\n this.dispatchEvent(new CustomEvent('wizard:activate', {\n bubbles: true,\n cancelable: true\n }));\n\n }\n prev() {\n this.progress.forEach(p => {\n const children = [...p.children];\n const current = children.filter(e => e.matches(\".active\"))[0];\n current?.classList.remove('active');\n current?.previousElementSibling?.classList.add('active');\n });\n const currentSection = this.querySelector('section.current');\n currentSection.classList.remove(\"current\");\n currentSection.previousElementSibling.classList.add('current');\n this.dispatchEvent(new CustomEvent('wizard:activate', {\n bubbles: true,\n cancelable: true\n }));\n }\n moveTo = function (n) {\n this.progress.forEach(p => {\n const children = [...p.children];\n const current = children.filter(e => e.matches(\".active\"))[0];\n current?.classList.remove('active');\n p.children[+n]?.classList.add('active');\n });\n const currentSection = this.querySelector('section.current');\n currentSection?.classList.remove(\"current\");\n const nthSection = this.querySelector(`section:nth-child(${+n})`);\n nthSection.classList.add('current');\n this.dispatchEvent(new CustomEvent('wizard:activate', {\n bubbles: true,\n cancelable: true\n }));\n }\n static custom(tagName, configuration) {\n customElements.define(tagName, class extends Wizard {\n constructor() {\n super(configuration);\n }\n });\n }\n static configure() {\n return Wizard.custom('ful-wizard');\n }\n}\n\n\n\n\nexport { Wizard };\n"],"names":["Base64","encode","arrayBuffer","dialect","d","URL_SAFE","len","byteLength","view","Uint8Array","res","i","substring","length","decode","str","nbytes","Math","floor","vi","si","v1","indexOf","charAt","v2","v3","v4","buffer","STANDARD","Hex","hex","Error","lenInBytes","map","e","offset","octet","parseInt","bytes","upper","Array","from","b","toString","toUpperCase","o","padStart","join","ContextInterceptor","constructor","context","document","querySelector","getAttribute","this","endsWith","intercept","request","chain","separator","resource","startsWith","proceed","CsrfTokenInterceptor","k","v","headers","Headers","options","set","RedirectOnUnauthorizedInterceptor","redirectUri","response","status","window","location","href","Failure","parseProblems","text","def","type","reason","details","JSON","parse","fromResponse","problems","super","stringify","name","HttpClientBuilder","interceptors","withContext","push","withCsrfToken","withRedirectOnUnauthorized","withInterceptors","build","HttpClient","HttpCall","fetch","HttpInterceptorChain","current","interceptor","builder","exchange","opts","ok","message","json","undefined","jsonRequest","method","body","jsonPost","jsonPut","jsonPatch","Storage","prefix","storage","save","setItem","load","got","getItem","remove","removeItem","pop","decoded","LocalStorage","localStorage","SessionStorage","sessionStorage","VersionedStorage","key","dataSupplier","cache","revision","saved","value","freshData","data","AuthorizationCodeFlow","forKeycloak","clientId","realmBaseUrl","auth","URL","token","logout","registration","redirect","scope","uri","action","additionalParams","pkceVerifier","crypto","getRandomValues","pkceChallenge","subtle","digest","TextEncoder","state","PKCE_AND_STATE_KEY","verifier","url","searchParams","Object","entries","forEach","kv","applicationInitiatedAction","kcAction","kc_action","_tokenExchange","code","history","replaceState","stateAndVerifier","URLSearchParams","AuthorizationCodeFlowSession","ensureLoggedIn","get","parseToken","rawHeader","rawPayload","signature","split","ut8decoder","TextDecoder","header","payload","t","accessToken","access_token","refreshToken","refresh_token","refreshCallback","onRefresh","callback","refresh","shouldBeRefreshed","gracePeriod","now","Date","getTime","refreshTokenExpiresAt","exp","refreshIf","id_token","bearerToken","gracePeriodBefore","gracePeriodAfter","AuthorizationCodeFlowInterceptor","session","timing","sleep","ms","Promise","resolve","setTimeout","DEBOUNCE_DEFAULT","DEBOUNCE_IMMEDIATE","debounce","timeoutMs","func","tid","args","previousTimestamp","later","elapsed","arguments","THROTTLE_DEFAULT","THROTTLE_NO_LEADING","THROTTLE_NO_TRAILING","throttle","remaining","clearTimeout","Fragments","fromHtml","html","el","createElement","innerHTML","fragment","DocumentFragment","childNodes","node","appendChild","toHtml","r","nodes","fromChildNodes","Attributes","static","uid","id","asBoolean","defaultValue","hasAttribute","setAttribute","forward","to","getAttributeNames","filter","a","target","classList","add","Slots","namedSlots","matches","slot","removeAttribute","slotted","fromEntries","default","append","Templated","SuperClass","template","rendered_","rendered","connectedCallback","render","Stateful","flags","others","all","concat","observedAttributes","internals_","attachInternals","flag","defineProperty","states","delete","attributeChangedCallback","oldValue","newValue","substr","toLowerCase","call","flatten","obj","keys","reduce","acc","pre","assign","Form","HTMLElement","form","addEventListener","async","preventDefault","spinner","submitter","getValues","setErrors","spin","querySelectorAll","hidden","disabled","setValues","values","flattenedKey","CSS","escape","mutate","MUTATORS","VALUE_HOLDERS_SELECTOR","dataset","closest","IGNORED_CHILDREN_SELECTOR","result","providePath","extract","EXTRACTORS","errors","clearErrors","replace","input","innerText","globalErrors","ys","getBoundingClientRect","y","scrollY","miny","min","Infinity","scroll","scrollX","extractors","maybeExtractor","checked","mutators","raw","maybeMutator","path","match","previous","ckey","pkey","Number","isInteger","isArray","custom","tagName","configuration","customElements","define","ful_input_ec","globalThis","ec","ftl","EvaluationContext","configure","ful_input_template_","ful_input_template","Template","StatelessInput","Input","ful_select_ec","ful_select_template_","ful_select_template","Select","tsConfig","remote","loadOnce","tsId","loaded","_remote","_unwrappedRemoteLoad","query","hasOwnProperty","qvalue","byId","loader","ts","TomSelect","preload","shouldLoad","loading","loadCallback","bind","setValue","getValue","ful_radiogroup_ec","ful_radiougroup_template_","ful_radiogroup_template","RadioGroup","radioEls","inputsAndLabels","ful_spinner_ec","ful_spinner_template_","ful_spinner_template","Spinner","Wizard","progress","children","p","firstSection","next","nextElementSibling","currentSection","dispatchEvent","CustomEvent","bubbles","cancelable","prev","previousElementSibling","moveTo","n"],"mappings":"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"}
|
package/dist/ful.mjs
CHANGED
|
@@ -697,6 +697,20 @@ const Stateful = (SuperClass, flags, others) => {
|
|
|
697
697
|
|
|
698
698
|
/* global Infinity, CSS */
|
|
699
699
|
|
|
700
|
+
function flatten(obj, prefix) {
|
|
701
|
+
return Object.keys(obj).reduce((acc, k) => {
|
|
702
|
+
const pre = prefix.length ? prefix + '.' : '';
|
|
703
|
+
if (typeof obj[k] === 'object' && obj[k] !== null) {
|
|
704
|
+
Object.assign(acc, flatten(obj[k], pre + k));
|
|
705
|
+
} else {
|
|
706
|
+
acc[pre + k] = obj[k];
|
|
707
|
+
}
|
|
708
|
+
return acc;
|
|
709
|
+
}, {});
|
|
710
|
+
}
|
|
711
|
+
|
|
712
|
+
|
|
713
|
+
|
|
700
714
|
class Form extends Templated(HTMLElement) {
|
|
701
715
|
static MUTATORS = {};
|
|
702
716
|
static EXTRACTORS = {};
|
|
@@ -734,12 +748,9 @@ class Form extends Templated(HTMLElement) {
|
|
|
734
748
|
});
|
|
735
749
|
}
|
|
736
750
|
setValues(values) {
|
|
737
|
-
for (
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
}
|
|
741
|
-
Array.from(this.querySelectorAll(`[name='${CSS.escape(k)}']`)).forEach((el) => {
|
|
742
|
-
Form.mutate(Form.MUTATORS, el, values[k], k, values);
|
|
751
|
+
for (const [flattenedKey, value] of Object.entries(flatten(values, ''))) {
|
|
752
|
+
Array.from(this.querySelectorAll(`[name='${CSS.escape(flattenedKey)}']`)).forEach((el) => {
|
|
753
|
+
Form.mutate(Form.MUTATORS, el, value, flattenedKey);
|
|
743
754
|
});
|
|
744
755
|
}
|
|
745
756
|
}
|
|
@@ -755,15 +766,13 @@ class Form extends Templated(HTMLElement) {
|
|
|
755
766
|
return Form.providePath(result, el.getAttribute('name'), Form.extract(Form.EXTRACTORS, el));
|
|
756
767
|
}, {});
|
|
757
768
|
}
|
|
758
|
-
setErrors(errors
|
|
769
|
+
setErrors(errors) {
|
|
759
770
|
this.clearErrors();
|
|
760
771
|
errors
|
|
761
772
|
.filter((e) => e.type === 'FIELD_ERROR' || e.type === 'INVALID_FORMAT')
|
|
762
773
|
.forEach((e) => {
|
|
763
774
|
const name = e.context.replace("[", ".").replace("].", ".");
|
|
764
|
-
|
|
765
|
-
//
|
|
766
|
-
this.querySelectorAll(`[name='${CSS.escape(name)}']`)
|
|
775
|
+
this.querySelectorAll(`[name='${CSS.escape(name)}'] [ful-validation-target],[name='${CSS.escape(name)}']:not(:has([ful-validation-target]))`)
|
|
767
776
|
.forEach(input => input.classList.add('is-invalid'));
|
|
768
777
|
this.querySelectorAll(`ful-field-error[field='${CSS.escape(name)}']`)
|
|
769
778
|
.forEach(el => el.innerText = e.reason);
|
|
@@ -777,7 +786,7 @@ class Form extends Templated(HTMLElement) {
|
|
|
777
786
|
}
|
|
778
787
|
});
|
|
779
788
|
|
|
780
|
-
if (!scroll) {
|
|
789
|
+
if (!this.hasAttribute('scroll-on-error')) {
|
|
781
790
|
return;
|
|
782
791
|
}
|
|
783
792
|
const ys = Array.from(this.querySelectorAll('ful-field-error'))
|
|
@@ -813,15 +822,12 @@ class Form extends Templated(HTMLElement) {
|
|
|
813
822
|
if (el.dataset['fulBindType'] === 'boolean') {
|
|
814
823
|
return !el.value ? null : el.value === 'true';
|
|
815
824
|
}
|
|
816
|
-
if (el.getValue) {
|
|
817
|
-
return el.getValue();
|
|
818
|
-
}
|
|
819
825
|
return el.value || null;
|
|
820
826
|
}
|
|
821
|
-
static mutate(mutators, el, raw,
|
|
827
|
+
static mutate(mutators, el, raw, flattenedKey) {
|
|
822
828
|
const maybeMutator = mutators[el.dataset['fulBindMutator']] || mutators[el.dataset['fulBindProvide']];
|
|
823
829
|
if (maybeMutator) {
|
|
824
|
-
maybeMutator(el, raw,
|
|
830
|
+
maybeMutator(el, raw, flattenedKey);
|
|
825
831
|
return;
|
|
826
832
|
}
|
|
827
833
|
if (el.getAttribute('type') === 'radio') {
|
|
@@ -832,10 +838,6 @@ class Form extends Templated(HTMLElement) {
|
|
|
832
838
|
el.checked = raw;
|
|
833
839
|
return;
|
|
834
840
|
}
|
|
835
|
-
if (el.setValue) {
|
|
836
|
-
el.setValue(raw);
|
|
837
|
-
return;
|
|
838
|
-
}
|
|
839
841
|
el.value = raw;
|
|
840
842
|
}
|
|
841
843
|
|
|
@@ -890,21 +892,45 @@ const ful_input_template_ = globalThis.ful_input_template || ftl.Template.fromHt
|
|
|
890
892
|
<ful-field-error data-tpl-if="name" data-tpl-field="name"></ful-field-error>
|
|
891
893
|
`, ful_input_ec);
|
|
892
894
|
|
|
893
|
-
class
|
|
895
|
+
class StatelessInput extends Templated(HTMLElement, ful_input_template_) {
|
|
894
896
|
render(slotted, template) {
|
|
895
|
-
const input = slotted.input = slotted.input || (() => {
|
|
897
|
+
const input = this.input = slotted.input = slotted.input || (() => {
|
|
896
898
|
const el = document.createElement("input");
|
|
897
899
|
el.classList.add("form-control");
|
|
898
900
|
return el;
|
|
899
901
|
})();
|
|
902
|
+
input.setAttribute('ful-validation-target', '');
|
|
903
|
+
|
|
900
904
|
const id = input.getAttribute('id') || this.getAttribute('input-id') || Attributes.uid('ful-input');
|
|
901
905
|
Attributes.forward('input-', this, slotted.input);
|
|
902
906
|
Attributes.defaultValue(slotted.input, "id", id);
|
|
903
907
|
Attributes.defaultValue(slotted.input, "type", "text");
|
|
904
908
|
Attributes.defaultValue(slotted.input, "placeholder", " ");
|
|
905
|
-
const name =
|
|
909
|
+
const name = this.getAttribute('name');
|
|
906
910
|
return template.render({ id, name, slotted });
|
|
907
911
|
}
|
|
912
|
+
|
|
913
|
+
}
|
|
914
|
+
|
|
915
|
+
class Input extends Stateful(StatelessInput, [], ['value']) {
|
|
916
|
+
render(slotted, template) {
|
|
917
|
+
const fragment = super.render(slotted, template);
|
|
918
|
+
this.input.value = this.getAttribute('value');
|
|
919
|
+
return fragment;
|
|
920
|
+
}
|
|
921
|
+
get value() {
|
|
922
|
+
if (this.input) {
|
|
923
|
+
return this.getAttribute('value');
|
|
924
|
+
}
|
|
925
|
+
return this.input.value;
|
|
926
|
+
}
|
|
927
|
+
set value(value) {
|
|
928
|
+
if (!this.input) {
|
|
929
|
+
//handled during rendering
|
|
930
|
+
return;
|
|
931
|
+
}
|
|
932
|
+
this.input.value = value;
|
|
933
|
+
}
|
|
908
934
|
static configure() {
|
|
909
935
|
customElements.define('ful-input', Input);
|
|
910
936
|
}
|
|
@@ -941,18 +967,17 @@ class Select extends Templated(HTMLElement, ful_select_template_) {
|
|
|
941
967
|
const type = this.getAttribute("type") || 'local';
|
|
942
968
|
const remote = type != 'local';
|
|
943
969
|
const loadOnce = this.getAttribute('load') != 'always';
|
|
944
|
-
|
|
970
|
+
const name = this.getAttribute('name');
|
|
945
971
|
const input = slotted.input = slotted.input || (() => {
|
|
946
972
|
return document.createElement("select");
|
|
947
973
|
})();
|
|
974
|
+
input.setAttribute('ful-validation-target', '');
|
|
975
|
+
|
|
948
976
|
const id = input.getAttribute('id') || this.getAttribute('input-id') || Attributes.uid('ful-select');
|
|
949
977
|
const tsId = `${id}-ts-control`;
|
|
950
978
|
Attributes.forward('input-', this, input);
|
|
951
979
|
Attributes.defaultValue(input, "id", id);
|
|
952
980
|
Attributes.defaultValue(input, "placeholder", " ");
|
|
953
|
-
const name = input.getAttribute('name');
|
|
954
|
-
input.setValue = this.setValue.bind(this);
|
|
955
|
-
input.getValue = this.getValue.bind(this);
|
|
956
981
|
|
|
957
982
|
//tomselect needs the input to have a parent.
|
|
958
983
|
//se we move the input to a fragment
|
|
@@ -993,19 +1018,19 @@ class Select extends Templated(HTMLElement, ful_select_template_) {
|
|
|
993
1018
|
load: this._unwrappedRemoteLoad,
|
|
994
1019
|
shouldLoad: (query) => this.shouldLoad ? this.shouldLoad(query) : true
|
|
995
1020
|
} : {}, tsDefaultConfig, this.tsConfig));
|
|
996
|
-
console.log("ts created");
|
|
997
1021
|
//we remove the input to move it
|
|
998
1022
|
input.remove();
|
|
999
|
-
|
|
1000
1023
|
return template.render({ id, tsId, name, input, slotted });
|
|
1001
1024
|
}
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1025
|
+
set value(v) {
|
|
1026
|
+
(async () => {
|
|
1027
|
+
if(this._remote){
|
|
1028
|
+
await this._unwrappedRemoteLoad({byId: v}, this.ts.loadCallback.bind(this.ts));
|
|
1029
|
+
}
|
|
1030
|
+
this.ts.setValue(v);
|
|
1031
|
+
})();
|
|
1007
1032
|
}
|
|
1008
|
-
|
|
1033
|
+
get value() {
|
|
1009
1034
|
const v = this.ts.getValue();
|
|
1010
1035
|
return v === '' ? null : v;
|
|
1011
1036
|
}
|
|
@@ -1047,14 +1072,16 @@ const ful_radiougroup_template_ = globalThis.ful_radiogroup_template || ftl.Temp
|
|
|
1047
1072
|
|
|
1048
1073
|
class RadioGroup extends Stateful(Templated(HTMLElement, ful_radiougroup_template_), ['disabled']) {
|
|
1049
1074
|
render(slotted, template) {
|
|
1050
|
-
const name = this.getAttribute('
|
|
1075
|
+
const name = this.getAttribute('name') || Attributes.uid('ful-radiogroup');
|
|
1051
1076
|
const radioEls = Array.from(slotted.default.querySelectorAll('ful-radio'));
|
|
1052
1077
|
const inputsAndLabels = radioEls.map(el => {
|
|
1053
1078
|
const input = document.createElement('input');
|
|
1054
1079
|
input.setAttribute('type', 'radio');
|
|
1055
1080
|
Attributes.forward('input-', this, input);
|
|
1056
1081
|
Attributes.forward('', el, input);
|
|
1057
|
-
|
|
1082
|
+
input.setAttribute('name', `${name}-ignore`);
|
|
1083
|
+
input.setAttribute('ful-validation-target', '');
|
|
1084
|
+
input.dataset['fulBindInclude'] = 'never';
|
|
1058
1085
|
const label = Fragments.fromChildNodes(el);
|
|
1059
1086
|
return [input, label];
|
|
1060
1087
|
});
|
|
@@ -1067,6 +1094,13 @@ class RadioGroup extends Stateful(Templated(HTMLElement, ful_radiougroup_templat
|
|
|
1067
1094
|
});
|
|
1068
1095
|
return fragment;
|
|
1069
1096
|
}
|
|
1097
|
+
get value() {
|
|
1098
|
+
const checked = this.querySelector('input[type=radio]:checked');
|
|
1099
|
+
return checked ? checked.value : null;
|
|
1100
|
+
}
|
|
1101
|
+
set value(value){
|
|
1102
|
+
this.querySelector(`input[type=radio][value=${CSS.escape(value)}]`).checked = true;
|
|
1103
|
+
}
|
|
1070
1104
|
static configure() {
|
|
1071
1105
|
customElements.define('ful-radio-group', RadioGroup);
|
|
1072
1106
|
}
|
|
@@ -1172,5 +1206,5 @@ class Wizard extends HTMLElement {
|
|
|
1172
1206
|
}
|
|
1173
1207
|
}
|
|
1174
1208
|
|
|
1175
|
-
export { Attributes, AuthorizationCodeFlow, AuthorizationCodeFlowInterceptor, AuthorizationCodeFlowSession, Base64, Failure, Form, Fragments, Hex, HttpClient, Input, LocalStorage, RadioGroup, Select, SessionStorage, Slots, Spinner, Stateful, Templated, VersionedStorage, Wizard, jsonPatch, jsonPost, jsonPut, jsonRequest, timing };
|
|
1209
|
+
export { Attributes, AuthorizationCodeFlow, AuthorizationCodeFlowInterceptor, AuthorizationCodeFlowSession, Base64, Failure, Form, Fragments, Hex, HttpClient, Input, LocalStorage, RadioGroup, Select, SessionStorage, Slots, Spinner, Stateful, StatelessInput, Templated, VersionedStorage, Wizard, jsonPatch, jsonPost, jsonPut, jsonRequest, timing };
|
|
1176
1210
|
//# sourceMappingURL=ful.mjs.map
|