@optionfactory/ful 0.19.0 → 0.20.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-client-errors.iife.min.js.map +1 -1
- package/dist/ful.css +2 -0
- package/dist/ful.css.map +1 -0
- package/dist/ful.iife.js +508 -190
- 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 +502 -190
- package/dist/ful.mjs.map +1 -1
- package/package.json +9 -5
package/dist/ful.iife.min.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ful.iife.min.js","sources":["../src/bindings.mjs","../src/encodings.mjs","../src/forms.mjs","../src/http-client.mjs","../src/storage.mjs","../src/oauth-authorization-code.mjs","../src/timing.mjs","../src/app.mjs","../src/wizard.mjs"],"sourcesContent":["/* global CSS */\n\nfunction extract(extractors, el) {\n const maybeExtractor = extractors[el.dataset['bindExtractor']] || extractors[el.dataset['bindProvide']];\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['bindType'] === 'boolean' ? el.value === 'true' : el.value;\n }\n if (el.getAttribute('type') === 'checkbox') {\n return el.checked;\n }\n if (el.dataset['bindType'] === 'boolean') {\n return !el.value ? null : el.value === 'true';\n }\n return el.value || null;\n}\n\nfunction mutate(mutators, el, raw, key, values) {\n const maybeMutator = mutators[el.dataset['bindMutator']] || mutators[el.dataset['bindProvide']];\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 el.value = raw;\n}\n\n\nfunction providePath(result, path, value) {\n const keys = path.split(\".\").map((k) => k.match(/^[0-9]+$/) ? +k : k);\n let current = result;\n let previous = null;\n for (let i = 0; ; ++i) {\n const ckey = keys[i];\n const pkey = keys[i - 1];\n if (Number.isInteger(ckey) && !Array.isArray(current)) {\n if (previous !== null) {\n previous[pkey] = current = [];\n } else {\n result = current = [];\n }\n }\n if (i === keys.length - 1) {\n //when value is undefined we only want to define the property if it's not defined \n current[ckey] = value !== undefined ? value : (ckey in current ? current[ckey] : null);\n return result;\n }\n if (current[ckey] === undefined) {\n current[ckey] = {};\n }\n previous = current;\n current = current[ckey];\n }\n}\n\nclass Bindings {\n\n constructor( {extractors, mutators, ignoredChildrenSelector, valueHoldersSelector}) {\n this.extractors = extractors || {};\n this.mutators = mutators || {};\n this.valueHoldersSelector = valueHoldersSelector || 'input[name], select[name], textarea[name]';\n this.ignoredChildrenSelector = ignoredChildrenSelector || '.d-none';\n }\n setValues(el, values) {\n for (let k in values) {\n if (!values.hasOwnProperty(k)) {\n continue;\n }\n Array.from(el.querySelectorAll(`[name='${CSS.escape(k)}']`)).forEach((el) => {\n mutate(this.mutators, el, values[k], k, values);\n });\n }\n }\n getValues(el) {\n return Array.from(el.querySelectorAll(this.valueHoldersSelector))\n .filter((el) => {\n if (el.dataset['bindInclude'] === 'never') {\n return false;\n }\n return el.dataset['bindInclude'] === 'always' || el.closest(this.ignoredChildrenSelector) === null;\n })\n .reduce((result, el) => {\n return providePath(result, el.getAttribute('name'), extract(this.extractors, el));\n }, {});\n }\n}\n\n\n\nexport { Bindings };","\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 };","/* global Infinity, CSS */\n\n\nclass Form {\n constructor(el, bindings, {globalErrorsEl, fieldContainerSelector, errorClass, hideClass}) {\n this.el = el;\n this.bindings = bindings;\n this.globalErrorsEl = globalErrorsEl;\n this.fieldContainerSelector = fieldContainerSelector !== undefined ? fieldContainerSelector : Form.DEFAULT_FIELD_CONTAINER_SELECTOR;\n this.errorClass = errorClass || Form.DEFAULT_ERROR_CLASS;\n this.hideClass = hideClass || Form.DEFAULT_HIDE_CLASS;\n }\n setValues(values) {\n return this.bindings.setValues(this.el, values);\n }\n getValues() {\n return this.bindings.getValues(this.el);\n }\n setErrors(errors, scrollFirstErrorIntoView, context) {\n\n this.clearErrors();\n errors\n .map(this.mapError ? this.mapError : (e) => e)\n .filter((e) => e.type === 'FIELD_ERROR' || e.type === 'INVALID_FORMAT')\n .forEach((e) => {\n const name = e.context.replace(\"[\", \".\").replace(\"].\", \".\");\n Array.from(this.el.querySelectorAll(`[name='${CSS.escape(name)}']`))\n .map(el => this.fieldContainerSelector ? el.closest(this.fieldContainerSelector) : el)\n .filter(el => el !== null)\n .forEach(label => {\n label.classList.add(this.errorClass);\n label.dataset['error'] = e.reason;\n });\n });\n if (this.globalErrorsEl) {\n const globalErrors = errors.filter((e) => e.type !== 'FIELD_ERROR' && e.type !== 'INVALID_FORMAT');\n this.globalErrorsEl.innerHTML = globalErrors.map(e => e.reason).join(\"\\n\");\n if (globalErrors.length !== 0) {\n this.globalErrorsEl.classList.remove(this.hideClass);\n }\n }\n if (!scrollFirstErrorIntoView) {\n return;\n }\n const yOffsets = Array.from(this.el.querySelectorAll('.${CSS.escape(this.errorClass)}'))\n .map((label) => label.getBoundingClientRect().y + window.scrollY);\n const firstErrorScrollY = Math.min(...yOffsets);\n if (firstErrorScrollY !== Infinity) {\n window.scroll(window.scrollX, firstErrorScrollY > 100 ? firstErrorScrollY - 100 : 0);\n }\n }\n clearErrors() {\n this.el.querySelectorAll(`.${CSS.escape(this.errorClass)}`).forEach(l => l.classList.remove(this.errorClass));\n if (this.globalErrorsEl) {\n this.globalErrorsEl.innerHTML = '';\n this.globalErrorsEl.classList.add(this.hideClass);\n }\n }\n}\n\nForm.DEFAULT_FIELD_CONTAINER_SELECTOR = 'label';\nForm.DEFAULT_ERROR_CLASS = 'has-error';\nForm.DEFAULT_HIDE_CLASS = 'd-none';\n\n\n/*\n export function forms() {\n }\n \n forms.dropContext = function (context) {\n return function (e) {\n if (e.context && e.context.indexOf(context) === 0) {\n e.context = e.context.substring(context.length);\n }\n return e;\n };\n };\n \n \n Dom.ready(() => {\n document.querySelectorAll('label:not([data-error])').forEach(el => {\n el.dataset['error'] = \"Il valore inserito non è valido\";\n });\n });\n \n Dom.ready(() => {\n Dom.on(document.body, 'change', '[data-pattern]', {}, evt => {\n const el = evt.srcElement;\n const pattern = el.dataset['pattern'];\n const matches = el.value.match(pattern);\n const label = el.closest('label');\n if(label === null){\n return;\n }\n label.classList[matches ? 'remove' : 'add']('has-error'); \n });\n });\n */\nexport { Form };","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 = 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 fetch(resource, options) {\n const interceptors = [...this.interceptors, ...options.interceptors || [], new HttpCall()];\n const chain = new HttpInterceptorChain(interceptors, 0);\n return await chain.proceed({resource, options});\n }\n async json(resource, options) {\n try {\n const response = await this.fetch(resource, options);\n if (!response.ok) {\n const message = await response.text();\n throw Failure.fromResponse(response.status, message);\n }\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 async form(resource, options, uiOptions) {\n const ui = uiOptions || {};\n ui.buttons?.forEach(el => {\n el.setAttribute(\"disabled\", \"disabled\");\n if (ui.loader) {\n el.dataset['oldContent'] = el.innerHTML;\n el.innerHTML = ui.loader;\n }\n });\n try {\n const r = await this.json(resource, options);\n ui.form?.clearErrors();\n return r;\n } catch (e) {\n ui.form?.setErrors(e.problems);\n throw e;\n } finally {\n ui.buttons?.forEach(el => {\n el.removeAttribute(\"disabled\");\n el.innerHTML = el.dataset['oldContent'];\n delete el.dataset['oldContent'];\n });\n }\n }\n}\n\n\n\nexport { HttpClient, Failure };\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.code + \": \" + response.text());\n }\n const token = await response.json();\n this.token = token;\n this.accessToken = this._parseToken(token.access_token);\n this.refreshToken = this._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 App {\n constructor() {\n this.configurers = [];\n this.initializers = [];\n this.handlers = [];\n this.running = false;\n document.addEventListener(\"DOMContentLoaded\", async () => {\n await Promise.all(this.configurers);\n await Promise.all(this.initializers.map(h => Promise.resolve(h())));\n await Promise.all(this.handlers.map(h => Promise.resolve(h())));\n });\n }\n configure(cb) {\n this.configurers.push(Promise.resolve(cb()));\n return this;\n }\n initialize(cb) {\n this.initializers.push(cb);\n return this;\n }\n ready(cb) {\n this.handlers.push(cb);\n return this;\n }\n}\n\nexport { App };\n","class Wizard {\n constructor(el) {\n this.el = el;\n this.progress = [...el.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.el.querySelector('section.current') === null) {\n const firstSection = this.el.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.el.querySelector('section.current');\n currentSection.classList.remove(\"current\");\n currentSection.nextElementSibling.classList.add('current');\n\n this.el.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.el.querySelector('section.current');\n currentSection.classList.remove(\"current\");\n currentSection.previousElementSibling.classList.add('current');\n this.el.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.el.querySelector('section.current');\n currentSection?.classList.remove(\"current\");\n const nthSection = this.el.querySelector(`section:nth-child(${+n})`);\n nthSection.classList.add('current');\n this.el.dispatchEvent(new CustomEvent('wizard:activate', {\n bubbles: true,\n cancelable: true\n }));\n }\n}\n\n\n\n\nexport { Wizard };\n"],"names":["mutate","mutators","el","raw","key","values","maybeMutator","dataset","getAttribute","value","checked","Base64","static","arrayBuffer","dialect","d","URL_SAFE","len","byteLength","view","Uint8Array","res","i","substring","length","str","nbytes","Math","floor","vi","si","v1","indexOf","charAt","v2","v3","v4","buffer","STANDARD","Form","constructor","bindings","globalErrorsEl","fieldContainerSelector","errorClass","hideClass","this","undefined","DEFAULT_FIELD_CONTAINER_SELECTOR","DEFAULT_ERROR_CLASS","DEFAULT_HIDE_CLASS","setValues","getValues","setErrors","errors","scrollFirstErrorIntoView","context","clearErrors","map","mapError","e","filter","type","forEach","name","replace","Array","from","querySelectorAll","CSS","escape","closest","label","classList","add","reason","globalErrors","innerHTML","join","remove","yOffsets","getBoundingClientRect","y","window","scrollY","firstErrorScrollY","min","Infinity","scroll","scrollX","l","ContextInterceptor","document","querySelector","endsWith","async","request","chain","separator","resource","startsWith","proceed","CsrfTokenInterceptor","k","v","headers","Headers","options","set","RedirectOnUnauthorizedInterceptor","redirectUri","response","status","location","href","Failure","Error","text","def","details","JSON","parse","parseProblems","problems","super","stringify","HttpClientBuilder","interceptors","withContext","push","withCsrfToken","withRedirectOnUnauthorized","withInterceptors","build","HttpClient","HttpCall","fetch","HttpInterceptorChain","current","interceptor","intercept","ok","message","fromResponse","uiOptions","ui","buttons","setAttribute","loader","r","json","form","removeAttribute","Storage","prefix","storage","save","setItem","load","got","getItem","removeItem","pop","decoded","SessionStorage","sessionStorage","AuthorizationCodeFlow","clientId","realmBaseUrl","auth","URL","token","logout","registration","redirect","scope","uri","additionalParams","pkceVerifier","encode","crypto","getRandomValues","pkceChallenge","subtle","digest","TextEncoder","state","PKCE_AND_STATE_KEY","verifier","url","searchParams","Object","entries","kv","action","kcAction","kc_action","code","history","replaceState","stateAndVerifier","method","body","URLSearchParams","AuthorizationCodeFlowSession","get","_tokenExchange","rawHeader","rawPayload","signature","split","ut8decoder","TextDecoder","header","decode","payload","t","accessToken","parseToken","access_token","refreshToken","refresh_token","refreshCallback","onRefresh","callback","_parseToken","shouldBeRefreshed","gracePeriod","now","Date","getTime","refreshTokenExpiresAt","exp","refresh","id_token","bearerToken","gracePeriodBefore","gracePeriodAfter","AuthorizationCodeFlowInterceptor","session","refreshIf","timing","sleep","ms","Promise","resolve","setTimeout","DEBOUNCE_DEFAULT","DEBOUNCE_IMMEDIATE","debounce","timeoutMs","func","tid","args","previousTimestamp","opts","later","elapsed","arguments","THROTTLE_DEFAULT","THROTTLE_NO_LEADING","THROTTLE_NO_TRAILING","throttle","remaining","clearTimeout","configurers","initializers","handlers","running","addEventListener","all","h","configure","cb","initialize","ready","extractors","ignoredChildrenSelector","valueHoldersSelector","hasOwnProperty","reduce","result","path","keys","match","previous","ckey","pkey","Number","isInteger","isArray","providePath","maybeExtractor","extract","hex","lenInBytes","offset","octet","parseInt","bytes","upper","b","toString","toUpperCase","o","padStart","localStorage","dataSupplier","cache","revision","saved","freshData","data","progress","children","matches","p","firstSection","next","nextElementSibling","currentSection","dispatchEvent","CustomEvent","bubbles","cancelable","prev","previousElementSibling","moveTo","n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ful.iife.min.js","sources":["../src/encodings.mjs","../src/observable.mjs","../src/http-client.mjs","../src/forms.mjs","../src/storage.mjs","../src/oauth-authorization-code.mjs","../src/timing.mjs","../src/wizard.mjs","../src/app.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 };","\nclass Observable {\n constructor() {\n this.listeners = {};\n }\n fireSync(event, data, initialAcc) {\n const listeners = this.listeners[event] || [];\n let acc = initialAcc;\n for (const l of listeners) {\n acc = l(data, this, acc);\n }\n return acc;\n }\n async fire(event, data, initialAcc) {\n const listeners = this.listeners[event] || [];\n let acc = initialAcc;\n for (const l of listeners) {\n acc = await l(data, this, acc);\n }\n return acc;\n }\n on(event, listener) {\n this.listeners[event] = this.listeners[event] || [];\n this.listeners[event].push(listener);\n }\n un(event, listener) {\n const listeners = this.listeners[event] || [];\n const idx = listeners.indexOf(listener);\n return idx === -1 ? [] : listeners.splice(idx, 1);\n }\n static mixin(self) {\n self.listeners = {}\n self.fireSync = Observable.prototype.fireSync;\n self.fire = Observable.prototype.fire;\n self.on = Observable.prototype.on;\n self.un = Observable.prototype.un;\n }\n\n}\n\n\nexport { Observable };","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 = 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 fetch(resource, options) {\n const interceptors = [...this.interceptors, ...options.interceptors || [], new HttpCall()];\n const chain = new HttpInterceptorChain(interceptors, 0);\n return await chain.proceed({resource, options});\n }\n async json(resource, options) {\n try {\n const response = await this.fetch(resource, options);\n if (!response.ok) {\n const message = await response.text();\n throw Failure.fromResponse(response.status, message);\n }\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\n\n\nexport { HttpClient, Failure };\n","/* global Infinity, CSS */\n\nimport { Failure } from \"./http-client.mjs\";\nimport { Observable } from \"./observable.mjs\";\n\nclass CustomElements {\n static id = 0;\n static uid(prefix) {\n return `${prefix}-${++CustomElements.id}`;\n }\n static forwardAttributes(from, to, except) {\n const ans = from.getAttributeNames().filter(a => except.indexOf(a) === -1)\n .filter(a => a[0] === '@')\n .forEach(a => {\n if (a === '@class') {\n to.classList.add(...from.getAttribute(\"@class\").split(\" \").filter(a => a.length));\n return;\n }\n to.setAttribute(a.substring(1), from.getAttribute(a))\n });\n }\n static extractSlots(el) {\n const slotted = Object.fromEntries([...el.querySelectorAll(\"[slot]\")].map(el => {\n el.parentElement.removeChild(el);\n const slot = el.getAttribute(\"slot\");\n el.removeAttribute(\"slot\");\n return [slot, el];\n }));\n slotted.default = new DocumentFragment();\n slotted.default.append(...el.childNodes);\n return slotted;\n }\n static labelAndInputGroup(id, name, isFloating, slotted) {\n if (isFloating) {\n /**\n * <div class=\"input-group has-validation\">\n * <span data-tpl-if=\"slotted.before\" class=\"input-group-text\">{{{{ slotted.before }}}}</span>\n * <div class=\"form-floating\">\n * {{{{ slotted.input }}}} \n * <label data-tpl-for=\"name\" class=\"form-label\">{{{{ slotted.default }}}}</label>\n * </div>\n * <span data-tpl-if=\"slotted.after\" class=\"input-group-text\">{{{{ slotted.after }}}}</span>\n * <ful-field-error data-tpl-field=\"name\"></ful-field-error> \n * </div> \n */\n const label = document.createElement(\"label\");\n label.setAttribute(\"for\", id);\n label.classList.add('form-label');\n label.append(slotted.default);\n\n const ff = document.createElement('div');\n ff.classList.add(\"form-floating\");\n ff.append(slotted.input, label);\n\n const ffe = document.createElement('ful-field-error');\n ffe.setAttribute(\"field\", name);\n\n const ig = document.createElement(\"div\");\n ig.classList.add('input-group', 'has-validtion');\n\n if (slotted.before) {\n ig.append(slotted.before);\n } else if (slotted.ibefore) {\n const igt = document.createElement('div');\n igt.classList.add('input-group-text')\n igt.append(slotted.ibefore)\n ig.append(igt);\n }\n ig.append(ff);\n if (slotted.after) {\n ig.append(slotted.after);\n } else if (slotted.iafter) {\n const igt = document.createElement('div');\n igt.classList.add('input-group-text')\n igt.append(slotted.iafter)\n ig.append(igt);\n }\n ig.append(ffe);\n return ig;\n }\n /**\n <label data-tpl-for=\"name\" class=\"form-label\">{{{{ slotted.default }}}}</label>\n <div class=\"input-group has-validation\">\n <span data-tpl-if=\"slotted.before\" class=\"input-group-text\">{{{{ slotted.before }}}}</span>\n {{{{ slotted.input }}}} \n <span data-tpl-if=\"slotted.after\" class=\"input-group-text\">{{{{ slotted.after }}}}</span>\n <ful-field-error data-tpl-field=\"name\"></ful-field-error> \n </div> \n */\n\n const label = document.createElement(\"label\");\n label.setAttribute(\"for\", name);\n label.classList.add('form-label');\n label.append(slotted.default);\n\n const ffe = document.createElement('ful-field-error');\n ffe.setAttribute(\"field\", name);\n\n const ig = document.createElement(\"div\");\n ig.classList.add('input-group', 'has-validation');\n\n if (slotted.before) {\n ig.append(slotted.before);\n } else if (slotted.ibefore) {\n const igt = document.createElement('div');\n igt.classList.add('input-group-text')\n igt.append(slotted.ibefore)\n ig.append(igt);\n }\n ig.append(slotted.input);\n if (slotted.after) {\n ig.append(slotted.after);\n } else if (slotted.iafter) {\n const igt = document.createElement('div');\n igt.classList.add('input-group-text')\n igt.append(slotted.iafter)\n ig.append(igt);\n }\n ig.append(ffe);\n\n const fragment = new DocumentFragment();\n fragment.append(label, ig)\n return fragment;\n }\n\n}\n\n\nclass FieldError extends HTMLElement {\n constructor() {\n super();\n }\n connectedCallback() {\n this.classList.add('invalid-feedback');\n }\n static configure() {\n customElements.define('ful-field-error', FieldError);\n }\n}\n\nclass Errors extends HTMLElement {\n constructor() {\n super();\n }\n connectedCallback() {\n this.classList.add('alert', 'alert-danger', 'd-none');\n }\n static configure() {\n customElements.define('ful-errors', Errors);\n }\n\n}\n\nclass Spinner extends HTMLElement {\n constructor() {\n super();\n }\n connectedCallback() {\n this.classList.add('spinner-border', 'spinner-border-sm', 'd-none');\n this.setAttribute(\"aria-hidden\", \"true\");\n }\n show() {\n this.classList.remove(\"d-none\");\n }\n hide() {\n this.classList.add(\"d-none\");\n }\n static configure() {\n customElements.define('ful-spinner', Spinner);\n }\n}\n\n\n\nclass Input extends HTMLElement {\n constructor() {\n super();\n const id = CustomElements.uid('ful-input');\n const name = this.getAttribute('@name');\n const floating = this.hasAttribute('@floating');\n const slotted = CustomElements.extractSlots(this);\n slotted.input = slotted.input || (() => {\n const el = document.createElement(\"input\")\n el.classList.add(\"form-control\");\n return el;\n })();\n CustomElements.forwardAttributes(this, slotted.input, ['@floating'])\n const attrIfMissing = (el, k, v) => !el.hasAttribute(k) && el.setAttribute(k, v);\n attrIfMissing(slotted.input, \"name\", id);\n attrIfMissing(slotted.input, \"id\", id);\n attrIfMissing(slotted.input, \"type\", \"text\");\n attrIfMissing(slotted.input, \"placeholder\", \" \");\n this.innerHTML = '';\n this.append(CustomElements.labelAndInputGroup(id, name || id, floating, slotted));\n }\n static configure() {\n customElements.define('ful-input', Input);\n }\n}\n\n\n\n/**\n * <script src=\"tom-select.complete.js\"></script>\n * <link href=\"tom-select.bootstrap5.css\" rel=\"stylesheet\" />\n */\nclass Select extends HTMLElement {\n constructor(tsConfig) {\n super();\n Observable.mixin(this);\n const id = CustomElements.uid('ful-select');\n const name = this.getAttribute('@name');\n const floating = this.hasAttribute('@floating');\n const remote = this.hasAttribute('@remote');\n const slotted = CustomElements.extractSlots(this);\n slotted.input = slotted.input || (() => {\n return document.createElement(\"select\");\n })();\n CustomElements.forwardAttributes(this, slotted.input, ['@floating', '@remote'])\n const attrIfMissing = (el, k, v) => !el.hasAttribute(k) && el.setAttribute(k, v);\n attrIfMissing(slotted.input, \"name\", id);\n attrIfMissing(slotted.input, \"id\", id);\n attrIfMissing(slotted.input, \"placeholder\", \" \");\n this.innerHTML = '';\n this.append(CustomElements.labelAndInputGroup(id, name || id, floating, slotted));\n this.loaded = !remote;\n this.ts = new TomSelect(slotted.input, Object.assign(remote ? {\n preload: 'focus',\n load: async (query, callback) => {\n if (this.loaded) {\n callback();\n return;\n }\n const data = await this.fire('load', query, [])\n this.loaded = true;\n callback(data); \n } \n } : {}, tsConfig));\n slotted.input.setValue = this.setValue.bind(this);\n slotted.input.getValue = this.getValue.bind(this);\n }\n async setValue(v){\n if(!this.loaded){\n await this.ts.load();\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\nclass Form extends HTMLElement {\n constructor({ mutators, extractors, valueHoldersSelector, ignoredChildrenSelector }) {\n super();\n Observable.mixin(this);\n this.mutators = mutators || {}\n this.extractors = extractors || {}\n this.valueHoldersSelector = valueHoldersSelector || '[name]';\n this.ignoredChildrenSelector = ignoredChildrenSelector || '.d-none';\n\n const form = document.createElement('form');\n form.append(...this.childNodes);\n this.appendChild(form);\n\n form.addEventListener('submit', async (e) => {\n e.preventDefault();\n this.spinner(true);\n try {\n await this.fire('submit', this.getValues(), this);\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 }\n spinner(spin) {\n this.querySelectorAll('ful-spinner').forEach(el => {\n el[spin ? 'show' : 'hide']();\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(this.mutators, el, values[k], k, values);\n });\n }\n }\n getValues() {\n return Array.from(this.querySelectorAll(this.valueHoldersSelector))\n .filter((el) => {\n if (el.dataset['fulBindInclude'] === 'never') {\n return false;\n }\n return el.dataset['fulBindInclude'] === 'always' || el.closest(this.ignoredChildrenSelector) === null;\n })\n .reduce((result, el) => {\n return Form.providePath(result, el.getAttribute('name'), Form.extract(this.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 this.querySelectorAll(`[name='${CSS.escape(name)}']`)\n .forEach(input => {\n input.classList.add('is-invalid')\n if (input.parentElement.classList.contains(\"form-floating\")) {\n input.parentElement.classList.add('is-invalid')\n }\n });\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.classList.remove('d-none');\n }\n })\n\n if (!scroll) {\n return;\n }\n const ys = Array.from(this.querySelectorAll('ful-field-error:not(.d-none)'))\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('[name].is-invalid, .form-floating.is-invalid')\n .forEach(el => el.classList.remove('is-invalid'));\n this.querySelectorAll(\"ful-errors\")\n .forEach(el => {\n el.innerHTML = '';\n el.classList.add('d-none');\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 static configure(configuration) {\n FieldError.configure();\n Errors.configure();\n Spinner.configure();\n Input.configure();\n Select.configure();\n Form.custom('ful-form', configuration || {});\n }\n}\n\n\n\n\nexport { CustomElements, FieldError, Errors, Spinner, Input, Select, Form };\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 = this._parseToken(token.access_token);\n this.refreshToken = this._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 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","class App {\n constructor() {\n this.configurers = [];\n this.initializers = [];\n this.handlers = [];\n this.running = false;\n document.addEventListener(\"DOMContentLoaded\", async () => {\n await Promise.all(this.configurers);\n await Promise.all(this.initializers.map(h => Promise.resolve(h())));\n await Promise.all(this.handlers.map(h => Promise.resolve(h())));\n });\n }\n configure(cb) {\n this.configurers.push(Promise.resolve(cb()));\n return this;\n }\n initialize(cb) {\n this.initializers.push(cb);\n return this;\n }\n ready(cb) {\n this.handlers.push(cb);\n return this;\n }\n}\n\nexport { App };\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","Observable","constructor","this","listeners","fireSync","event","data","initialAcc","acc","l","fire","on","listener","push","un","idx","splice","mixin","self","prototype","ContextInterceptor","context","document","querySelector","getAttribute","endsWith","intercept","request","chain","separator","resource","startsWith","proceed","CsrfTokenInterceptor","k","v","headers","Headers","options","set","RedirectOnUnauthorizedInterceptor","redirectUri","response","status","window","location","href","Failure","Error","parseProblems","text","def","type","reason","details","JSON","parse","e","fromResponse","problems","super","stringify","name","HttpClientBuilder","interceptors","withContext","withCsrfToken","withRedirectOnUnauthorized","withInterceptors","build","HttpClient","HttpCall","fetch","HttpInterceptorChain","current","interceptor","builder","json","ok","message","undefined","CustomElements","static","uid","prefix","id","forwardAttributes","from","to","except","getAttributeNames","filter","a","forEach","setAttribute","classList","add","split","extractSlots","el","slotted","Object","fromEntries","querySelectorAll","map","parentElement","removeChild","slot","removeAttribute","default","DocumentFragment","append","childNodes","labelAndInputGroup","isFloating","label","createElement","ff","input","ffe","ig","before","ibefore","igt","after","iafter","fragment","FieldError","HTMLElement","connectedCallback","configure","customElements","define","Errors","Spinner","show","remove","hide","Input","floating","hasAttribute","attrIfMissing","innerHTML","Select","tsConfig","remote","loaded","ts","TomSelect","assign","preload","load","async","query","callback","setValue","bind","getValue","custom","tagName","configuration","Form","mutators","extractors","valueHoldersSelector","ignoredChildrenSelector","form","appendChild","addEventListener","preventDefault","spinner","getValues","setErrors","spin","disabled","setValues","values","hasOwnProperty","Array","CSS","escape","mutate","dataset","closest","reduce","result","providePath","extract","errors","scroll","clearErrors","replace","contains","innerText","globalErrors","join","ys","getBoundingClientRect","y","scrollY","miny","min","Infinity","scrollX","maybeExtractor","checked","value","raw","key","maybeMutator","path","keys","match","previous","ckey","pkey","Number","isInteger","isArray","Storage","storage","save","setItem","got","getItem","removeItem","pop","decoded","SessionStorage","sessionStorage","AuthorizationCodeFlow","forKeycloak","clientId","realmBaseUrl","auth","URL","token","logout","registration","redirect","scope","uri","action","additionalParams","pkceVerifier","crypto","getRandomValues","pkceChallenge","subtle","digest","TextEncoder","state","PKCE_AND_STATE_KEY","verifier","url","searchParams","entries","kv","applicationInitiatedAction","kcAction","kc_action","_tokenExchange","code","history","replaceState","stateAndVerifier","method","body","URLSearchParams","AuthorizationCodeFlowSession","ensureLoggedIn","get","parseToken","rawHeader","rawPayload","signature","ut8decoder","TextDecoder","header","payload","t","accessToken","access_token","refreshToken","refresh_token","refreshCallback","onRefresh","refresh","_parseToken","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","opts","later","elapsed","arguments","THROTTLE_DEFAULT","THROTTLE_NO_LEADING","THROTTLE_NO_TRAILING","throttle","remaining","clearTimeout","Wizard","progress","children","matches","p","firstSection","next","nextElementSibling","currentSection","dispatchEvent","CustomEvent","bubbles","cancelable","prev","previousElementSibling","moveTo","n","configurers","initializers","handlers","running","all","h","cb","initialize","ready","hex","lenInBytes","offset","octet","parseInt","bytes","upper","b","toString","toUpperCase","o","padStart","localStorage","dataSupplier","cache","revision","saved","freshData"],"mappings":"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"}
|
package/dist/ful.min.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
function e(e,t,r,s,i){const n=e[t.dataset.bindMutator]||e[t.dataset.bindProvide];n?n(t,r,s,i):"radio"!==t.getAttribute("type")?"checkbox"!==t.getAttribute("type")?t.value=r:t.checked=r:t.checked=t.getAttribute("value")===r}class t{constructor({extractors:e,mutators:t,ignoredChildrenSelector:r,valueHoldersSelector:s}){this.extractors=e||{},this.mutators=t||{},this.valueHoldersSelector=s||"input[name], select[name], textarea[name]",this.ignoredChildrenSelector=r||".d-none"}setValues(t,r){for(let s in r)r.hasOwnProperty(s)&&Array.from(t.querySelectorAll(`[name='${CSS.escape(s)}']`)).forEach((t=>{e(this.mutators,t,r[s],s,r)}))}getValues(e){return Array.from(e.querySelectorAll(this.valueHoldersSelector)).filter((e=>"never"!==e.dataset.bindInclude&&("always"===e.dataset.bindInclude||null===e.closest(this.ignoredChildrenSelector)))).reduce(((e,t)=>function(e,t,r){const s=t.split(".").map((e=>e.match(/^[0-9]+$/)?+e:e));let i=e,n=null;for(let t=0;;++t){const o=s[t],a=s[t-1];if(Number.isInteger(o)&&!Array.isArray(i)&&(null!==n?n[a]=i=[]:e=i=[]),t===s.length-1)return i[o]=void 0!==r?r:o in i?i[o]:null,e;void 0===i[o]&&(i[o]={}),n=i,i=i[o]}}(e,t.getAttribute("name"),function(e,t){const r=e[t.dataset.bindExtractor]||e[t.dataset.bindProvide];if(r)return r(t);if("radio"===t.getAttribute("type")){if(!t.checked)return;return"boolean"===t.dataset.bindType?"true"===t.value:t.value}return"checkbox"===t.getAttribute("type")?t.checked:"boolean"===t.dataset.bindType?t.value?"true"===t.value:null:t.value||null}(this.extractors,t))),{})}}class r{static encode(e,t){const s=t||r.URL_SAFE,i=e.byteLength,n=new Uint8Array(e);let o="";for(let e=0;e<i;e+=3){o+=s[n[e]>>2]+s[(3&n[e])<<4|n[e+1]>>4]+s[(15&n[e+1])<<2|n[e+2]>>6]+s[63&n[e+2]]}return i%3==2?o=o.substring(0,o.length-1):i%3==1&&(o=o.substring(0,o.length-2)),o}static decode(e,t){const s=t||r.URL_SAFE;let i=Math.floor(.75*e.length);for(let t=0;t!==e.length&&"="===e[e.length-t-1];++t)--i;const n=new Uint8Array(i);let o=0,a=0;for(;o<.75*e.length;){const t=s.indexOf(e.charAt(a++)),r=s.indexOf(e.charAt(a++)),i=s.indexOf(e.charAt(a++)),c=s.indexOf(e.charAt(a++));n[o++]=t<<2|r>>4,n[o++]=(15&r)<<4|i>>2,n[o++]=(3&i)<<6|c}return n.buffer}}r.STANDARD="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",r.URL_SAFE="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";class s{static decode(e){if(e.length%2!=0)throw new Error("invalid length");const t=e.length/2;return new Uint8Array(t).map(((t,r)=>{const s=2*r,i=e.substring(s,s+2);return parseInt(i,16)}))}static encode(e,t){return Array.from(e).map((e=>e.toString(16))).map((e=>t?e.toUpperCase():e)).map((e=>e.padStart(2,0))).join("")}}class i{constructor(e,t,{globalErrorsEl:r,fieldContainerSelector:s,errorClass:n,hideClass:o}){this.el=e,this.bindings=t,this.globalErrorsEl=r,this.fieldContainerSelector=void 0!==s?s:i.DEFAULT_FIELD_CONTAINER_SELECTOR,this.errorClass=n||i.DEFAULT_ERROR_CLASS,this.hideClass=o||i.DEFAULT_HIDE_CLASS}setValues(e){return this.bindings.setValues(this.el,e)}getValues(){return this.bindings.getValues(this.el)}setErrors(e,t,r){if(this.clearErrors(),e.map(this.mapError?this.mapError:e=>e).filter((e=>"FIELD_ERROR"===e.type||"INVALID_FORMAT"===e.type)).forEach((e=>{const t=e.context.replace("[",".").replace("].",".");Array.from(this.el.querySelectorAll(`[name='${CSS.escape(t)}']`)).map((e=>this.fieldContainerSelector?e.closest(this.fieldContainerSelector):e)).filter((e=>null!==e)).forEach((t=>{t.classList.add(this.errorClass),t.dataset.error=e.reason}))})),this.globalErrorsEl){const t=e.filter((e=>"FIELD_ERROR"!==e.type&&"INVALID_FORMAT"!==e.type));this.globalErrorsEl.innerHTML=t.map((e=>e.reason)).join("\n"),0!==t.length&&this.globalErrorsEl.classList.remove(this.hideClass)}if(!t)return;const s=Array.from(this.el.querySelectorAll(".${CSS.escape(this.errorClass)}")).map((e=>e.getBoundingClientRect().y+window.scrollY)),i=Math.min(...s);i!==1/0&&window.scroll(window.scrollX,i>100?i-100:0)}clearErrors(){this.el.querySelectorAll(`.${CSS.escape(this.errorClass)}`).forEach((e=>e.classList.remove(this.errorClass))),this.globalErrorsEl&&(this.globalErrorsEl.innerHTML="",this.globalErrorsEl.classList.add(this.hideClass))}}i.DEFAULT_FIELD_CONTAINER_SELECTOR="label",i.DEFAULT_ERROR_CLASS="has-error",i.DEFAULT_HIDE_CLASS="d-none";class n{constructor(){const e=document.querySelector("meta[name='context']").getAttribute("content");this.context=e.endsWith("/")?e.substring(0,e.length-1):e}async intercept(e,t){const r=e.resource.startsWith("/")?"":"/";return e.resource=this.context+r+e.resource,await t.proceed(e)}}class o{constructor(){this.k=document.querySelector("meta[name='_csrf_header']").getAttribute("content"),this.v=document.querySelector("meta[name='_csrf']").getAttribute("content")}async intercept(e,t){const r=new Headers(e.options.headers);return r.set(this.k,this.v),e.options.headers=r,await t.proceed(e)}}class a{constructor(e){this.redirectUri=e}async intercept(e,t){const r=await t.proceed(e);if(401!==r.status)return r;window.location.href=redirectUri}}class c extends Error{static parseProblems(e,t){const r=[{type:"GENERIC_PROBLEM",context:null,reason:`${e}: ${t}`,details:null}];try{return t?JSON.parse(t):r}catch(e){return r}}static fromResponse(e,t){return new c(e,c.parseProblems(e,t))}constructor(e,t){super(JSON.stringify(t)),this.name=`Failure:${e}`,this.status=e,this.problems=t}}class l{constructor(){this.interceptors=[]}withContext(){return this.interceptors.push(new n),this}withCsrfToken(){return this.interceptors.push(new o),this}withRedirectOnUnauthorized(e){return this.interceptors.push(new a(e)),this}withInterceptors(...e){return this.interceptors.push(...e),this}build(){const e=this.interceptors;return new d({interceptors:e})}}class h{async intercept(e,t){return await fetch(e.resource,e.options)}}class u{constructor(e,t){this.interceptors=e,this.current=t}async proceed(e){const t=this.interceptors[this.current];return await t.intercept(e,new u(this.interceptors,this.current+1))}}class d{static builder(){return new l}constructor({interceptors:e}){this.interceptors=e||[]}async fetch(e,t){const r=[...this.interceptors,...t.interceptors||[],new h],s=new u(r,0);return await s.proceed({resource:e,options:t})}async json(e,t){try{const r=await this.fetch(e,t);if(!r.ok){const e=await r.text();throw c.fromResponse(r.status,e)}const s=await r.text();return s?JSON.parse(s):void 0}catch(e){if(e instanceof c)throw e;throw new c(0,[{type:"CONNECTION_PROBLEM",context:null,reason:e.message,details:null}])}}async form(e,t,r){const s=r||{};s.buttons?.forEach((e=>{e.setAttribute("disabled","disabled"),s.loader&&(e.dataset.oldContent=e.innerHTML,e.innerHTML=s.loader)}));try{const r=await this.json(e,t);return s.form?.clearErrors(),r}catch(e){throw s.form?.setErrors(e.problems),e}finally{s.buttons?.forEach((e=>{e.removeAttribute("disabled"),e.innerHTML=e.dataset.oldContent,delete e.dataset.oldContent}))}}}class p{constructor(e,t){this.prefix=e,this.storage=t}save(e,t){this.storage.setItem(`${this.prefix}-${e}`,JSON.stringify(t))}load(e){const t=this.storage.getItem(`${this.prefix}-${e}`);return void 0===t?void 0:JSON.parse(t)}remove(e){this.storage.removeItem(`${this.prefix}-${e}`)}pop(e){const t=this.load(e);return this.remove(e),t}}class f extends p{constructor(e){super(e,localStorage)}}class E extends p{constructor(e){super(e,sessionStorage)}}class m{constructor(e,t,r){this.storage=e,this.key=t,this.dataSupplier=r,this.cache=null}async load(e){const t=this.storage.load(this.key);if(t&&t.revision===e)return void(this.cache=t.value);const r=await this.dataSupplier(e,this.key);this.storage.save(this.key,{revision:e,value:r}),this.cache=r}data(){return this.cache}}class g{static forKeycloak(e,t,r){return new g(e,"openid profile",{auth:new URL("protocol/openid-connect/auth",t),token:new URL("protocol/openid-connect/token",t),logout:new URL("protocol/openid-connect/logout",t),registration:new URL("protocol/openid-connect/registrations",t),redirect:r})}constructor(e,t,{auth:r,token:s,registration:i,logout:n,redirect:o}){this.storage=new E(e),this.clientId=e,this.scope=t,this.uri={auth:r,token:s,registration:i,logout:n,redirect:o}}async action(e,t){const s=r.encode(crypto.getRandomValues(new Uint8Array(32)).buffer),i=r.encode(await crypto.subtle.digest("SHA-256",(new TextEncoder).encode(s))),n=this.clientId+r.encode(crypto.getRandomValues(new Uint8Array(16)).buffer);this.storage.save(g.PKCE_AND_STATE_KEY,{state:n,verifier:s});const o=new URL(e);o.searchParams.set("client_id",this.clientId),o.searchParams.set("redirect_uri",this.uri.redirect),o.searchParams.set("response_type","code"),o.searchParams.set("scope",this.scope),o.searchParams.set("state",n),o.searchParams.set("code_challenge",i),o.searchParams.set("code_challenge_method","S256"),Object.entries(t||{}).forEach((e=>{o.searchParams.set(e[0],e[1])})),window.location=o}async registration(e){await this.action(this.uri.registration,e)}async applicationInitiatedAction(e){await this.action(this.uri.auth,{kc_action:e})}async _tokenExchange(e,t){window.history.replaceState("","",this.uri.redirect);const r=this.storage.pop(g.PKCE_AND_STATE_KEY);if(r.state!==t)throw new Error("State mismatch");const s=await fetch(this.uri.token,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams([["client_id",this.clientId],["code",e],["grant_type","authorization_code"],["code_verifier",r.verifier],["state",r.state],["redirect_uri",this.uri.redirect]])});if(!s.ok){const e=await s.text();throw new Error("Error:"+s.status+": "+e)}const i=await s.json();return new w(this.clientId,i,this.uri)}async ensureLoggedIn(){const e=new URL(window.location.href),t=e.searchParams.get("code");if(t&&this.storage.load(g.PKCE_AND_STATE_KEY)){const r=e.searchParams.get("state");return await this._tokenExchange(t,r)}return await this.action(this.uri.auth,{}),null}}g.PKCE_AND_STATE_KEY="state-and-verifier";class w{static parseToken(e){const[t,s,i]=e.split("."),n=new TextDecoder("utf-8");return{header:JSON.parse(n.decode(r.decode(t,r.STANDARD))),payload:JSON.parse(n.decode(r.decode(s,r.STANDARD))),signature:i}}constructor(e,t,{token:r,logout:s,redirect:i}){this.clientId=e,this.token=t,this.accessToken=w.parseToken(t.access_token),this.refreshToken=w.parseToken(t.refresh_token),this.uri={token:r,logout:s,redirect:i},this.refreshCallback=null}onRefresh(e){this.refreshCallback=e}async refresh(){const e=await fetch(this.uri.token,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams([["client_id",this.clientId],["grant_type","refresh_token"],["refresh_token",this.token.refresh_token]])});if(!e.ok)throw new Error("Error:"+e.code+": "+e.text());const t=await e.json();this.token=t,this.accessToken=this._parseToken(t.access_token),this.refreshToken=this._parseToken(t.refresh_token),this.refreshCallback&&this.refreshCallback(this.token,this.accessToken,this.refreshToken)}shouldBeRefreshed(e){const t=(new Date).getTime(),r=1e3*this.refreshToken.payload.exp;return!(t>r)&&t-e>r}async refreshIf(e){this.shouldBeRefreshed(e)&&await this.refresh()}logout(){const e=new URL(this.uri.logout);e.searchParams.set("post_logout_redirect_uri",this.uri.redirect),e.searchParams.set("id_token_hint",this.token.id_token),window.location=e}bearerToken(){return`Bearer ${this.token.access_token}`}interceptor(e,t){return new T(this,e,t)}}class T{constructor(e,t,r){this.session=e,this.gracePeriodBefore=t||2e3,this.gracePeriodAfter=r||3e4}async intercept(e,t){await this.session.refreshIf(this.gracePeriodBefore);const r=new Headers(e.options.headers);r.set("Authorization",this.session.bearerToken()),e.options.headers=r;const s=await t.proceed(e);return await this.session.refreshIf(this.gracePeriodAfter),s}}const y={sleep:e=>new Promise((t=>setTimeout(t,e))),DEBOUNCE_DEFAULT:0,DEBOUNCE_IMMEDIATE:1,debounce(e,t,r){let s=null,i=[],n=0,o=r||y.DEBOUNCE_DEFAULT;const a=()=>{const r=(new Date).getTime()-n;e>r?s=setTimeout(a,e-r):(s=null,o!==y.DEBOUNCE_IMMEDIATE&&t(...i),null===s&&(i=[]))};return function(){i=arguments,n=(new Date).getTime(),null===s&&(s=setTimeout(a,e),o===y.DEBOUNCE_IMMEDIATE&&t(...i))}},THROTTLE_DEFAULT:0,THROTTLE_NO_LEADING:1,THROTTLE_NO_TRAILING:2,throttle(e,t,r){let s=null,i=[],n=0,o=r||y.THROTTLE_DEFAULT;const a=()=>{n=o&y.THROTTLE_NO_LEADING?0:(new Date).getTime(),s=null,t(...i),null===s&&(i=[])};return function(){const r=(new Date).getTime();!n&&o&y.THROTTLE_NO_LEADING&&(n=r);const c=e-(r-n);i=arguments,c<=0||c>e?(null!==s&&(clearTimeout(s),s=null),n=r,t(...i),null===s&&(i=[])):null!==s||o&y.THROTTLE_NO_TRAILING||(s=setTimeout(a,c))}}};class _{constructor(e){if(this.el=e,this.progress=[...e.children].filter((e=>e.matches("header,ol,ul"))),this.progress.forEach((e=>{const t=[...e.children];void 0===t.filter((e=>e.matches(".active")))[0]&&t.length>0&&t[0].classList.add("active")})),null===this.el.querySelector("section.current")){const e=this.el.querySelector("section:first-of-type");null!==e&&e.classList.add("current")}}next(){this.progress.forEach((e=>{const t=[...e.children].filter((e=>e.matches(".active")))[0];t?.classList.remove("active"),t?.nextElementSibling?.classList.add("active")}));const e=this.el.querySelector("section.current");e.classList.remove("current"),e.nextElementSibling.classList.add("current"),this.el.dispatchEvent(new CustomEvent("wizard:activate",{bubbles:!0,cancelable:!0}))}prev(){this.progress.forEach((e=>{const t=[...e.children].filter((e=>e.matches(".active")))[0];t?.classList.remove("active"),t?.previousElementSibling?.classList.add("active")}));const e=this.el.querySelector("section.current");e.classList.remove("current"),e.previousElementSibling.classList.add("current"),this.el.dispatchEvent(new CustomEvent("wizard:activate",{bubbles:!0,cancelable:!0}))}moveTo=function(e){this.progress.forEach((t=>{[...t.children].filter((e=>e.matches(".active")))[0]?.classList.remove("active"),t.children[+e]?.classList.add("active")}));this.el.querySelector("section.current")?.classList.remove("current");this.el.querySelector(`section:nth-child(${+e})`).classList.add("current"),this.el.dispatchEvent(new CustomEvent("wizard:activate",{bubbles:!0,cancelable:!0}))}}class b{constructor(){this.configurers=[],this.initializers=[],this.handlers=[],this.running=!1,document.addEventListener("DOMContentLoaded",(async()=>{await Promise.all(this.configurers),await Promise.all(this.initializers.map((e=>Promise.resolve(e())))),await Promise.all(this.handlers.map((e=>Promise.resolve(e()))))}))}configure(e){return this.configurers.push(Promise.resolve(e())),this}initialize(e){return this.initializers.push(e),this}ready(e){return this.handlers.push(e),this}}export{b as App,g as AuthorizationCodeFlow,T as AuthorizationCodeFlowInterceptor,w as AuthorizationCodeFlowSession,r as Base64,t as Bindings,c as Failure,i as Form,s as Hex,d as HttpClient,f as LocalStorage,E as SessionStorage,m as VersionedStorage,_ as Wizard,y as timing};
|
|
1
|
+
class e{static encode(t,s){const r=s||e.URL_SAFE,i=t.byteLength,n=new Uint8Array(t);let o="";for(let e=0;e<i;e+=3){o+=r[n[e]>>2]+r[(3&n[e])<<4|n[e+1]>>4]+r[(15&n[e+1])<<2|n[e+2]>>6]+r[63&n[e+2]]}return i%3==2?o=o.substring(0,o.length-1):i%3==1&&(o=o.substring(0,o.length-2)),o}static decode(t,s){const r=s||e.URL_SAFE;let i=Math.floor(.75*t.length);for(let e=0;e!==t.length&&"="===t[t.length-e-1];++e)--i;const n=new Uint8Array(i);let o=0,a=0;for(;o<.75*t.length;){const e=r.indexOf(t.charAt(a++)),s=r.indexOf(t.charAt(a++)),i=r.indexOf(t.charAt(a++)),c=r.indexOf(t.charAt(a++));n[o++]=e<<2|s>>4,n[o++]=(15&s)<<4|i>>2,n[o++]=(3&i)<<6|c}return n.buffer}}e.STANDARD="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",e.URL_SAFE="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";class t{static decode(e){if(e.length%2!=0)throw new Error("invalid length");const t=e.length/2;return new Uint8Array(t).map(((t,s)=>{const r=2*s,i=e.substring(r,r+2);return parseInt(i,16)}))}static encode(e,t){return Array.from(e).map((e=>e.toString(16))).map((e=>t?e.toUpperCase():e)).map((e=>e.padStart(2,0))).join("")}}class s{constructor(){this.listeners={}}fireSync(e,t,s){const r=this.listeners[e]||[];let i=s;for(const e of r)i=e(t,this,i);return i}async fire(e,t,s){const r=this.listeners[e]||[];let i=s;for(const e of r)i=await e(t,this,i);return i}on(e,t){this.listeners[e]=this.listeners[e]||[],this.listeners[e].push(t)}un(e,t){const s=this.listeners[e]||[],r=s.indexOf(t);return-1===r?[]:s.splice(r,1)}static mixin(e){e.listeners={},e.fireSync=s.prototype.fireSync,e.fire=s.prototype.fire,e.on=s.prototype.on,e.un=s.prototype.un}}class r{constructor(){const e=document.querySelector("meta[name='context']").getAttribute("content");this.context=e.endsWith("/")?e.substring(0,e.length-1):e}async intercept(e,t){const s=e.resource.startsWith("/")?"":"/";return e.resource=this.context+s+e.resource,await t.proceed(e)}}class i{constructor(){this.k=document.querySelector("meta[name='_csrf_header']").getAttribute("content"),this.v=document.querySelector("meta[name='_csrf']").getAttribute("content")}async intercept(e,t){const s=new Headers(e.options.headers);return s.set(this.k,this.v),e.options.headers=s,await t.proceed(e)}}class n{constructor(e){this.redirectUri=e}async intercept(e,t){const s=await t.proceed(e);if(401!==s.status)return s;window.location.href=redirectUri}}class o extends Error{static parseProblems(e,t){const s=[{type:"GENERIC_PROBLEM",context:null,reason:`${e}: ${t}`,details:null}];try{return t?JSON.parse(t):s}catch(e){return s}}static fromResponse(e,t){return new o(e,o.parseProblems(e,t))}constructor(e,t){super(JSON.stringify(t)),this.name=`Failure:${e}`,this.status=e,this.problems=t}}class a{constructor(){this.interceptors=[]}withContext(){return this.interceptors.push(new r),this}withCsrfToken(){return this.interceptors.push(new i),this}withRedirectOnUnauthorized(e){return this.interceptors.push(new n(e)),this}withInterceptors(...e){return this.interceptors.push(...e),this}build(){const e=this.interceptors;return new u({interceptors:e})}}class c{async intercept(e,t){return await fetch(e.resource,e.options)}}class l{constructor(e,t){this.interceptors=e,this.current=t}async proceed(e){const t=this.interceptors[this.current];return await t.intercept(e,new l(this.interceptors,this.current+1))}}class u{static builder(){return new a}constructor({interceptors:e}){this.interceptors=e||[]}async fetch(e,t){const s=[...this.interceptors,...t.interceptors||[],new c],r=new l(s,0);return await r.proceed({resource:e,options:t})}async json(e,t){try{const s=await this.fetch(e,t);if(!s.ok){const e=await s.text();throw o.fromResponse(s.status,e)}const r=await s.text();return r?JSON.parse(r):void 0}catch(e){if(e instanceof o)throw e;throw new o(0,[{type:"CONNECTION_PROBLEM",context:null,reason:e.message,details:null}])}}}class d{static id=0;static uid(e){return`${e}-${++d.id}`}static forwardAttributes(e,t,s){e.getAttributeNames().filter((e=>-1===s.indexOf(e))).filter((e=>"@"===e[0])).forEach((s=>{"@class"!==s?t.setAttribute(s.substring(1),e.getAttribute(s)):t.classList.add(...e.getAttribute("@class").split(" ").filter((e=>e.length)))}))}static extractSlots(e){const t=Object.fromEntries([...e.querySelectorAll("[slot]")].map((e=>{e.parentElement.removeChild(e);const t=e.getAttribute("slot");return e.removeAttribute("slot"),[t,e]})));return t.default=new DocumentFragment,t.default.append(...e.childNodes),t}static labelAndInputGroup(e,t,s,r){if(s){const s=document.createElement("label");s.setAttribute("for",e),s.classList.add("form-label"),s.append(r.default);const i=document.createElement("div");i.classList.add("form-floating"),i.append(r.input,s);const n=document.createElement("ful-field-error");n.setAttribute("field",t);const o=document.createElement("div");if(o.classList.add("input-group","has-validtion"),r.before)o.append(r.before);else if(r.ibefore){const e=document.createElement("div");e.classList.add("input-group-text"),e.append(r.ibefore),o.append(e)}if(o.append(i),r.after)o.append(r.after);else if(r.iafter){const e=document.createElement("div");e.classList.add("input-group-text"),e.append(r.iafter),o.append(e)}return o.append(n),o}const i=document.createElement("label");i.setAttribute("for",t),i.classList.add("form-label"),i.append(r.default);const n=document.createElement("ful-field-error");n.setAttribute("field",t);const o=document.createElement("div");if(o.classList.add("input-group","has-validation"),r.before)o.append(r.before);else if(r.ibefore){const e=document.createElement("div");e.classList.add("input-group-text"),e.append(r.ibefore),o.append(e)}if(o.append(r.input),r.after)o.append(r.after);else if(r.iafter){const e=document.createElement("div");e.classList.add("input-group-text"),e.append(r.iafter),o.append(e)}o.append(n);const a=new DocumentFragment;return a.append(i,o),a}}class h extends HTMLElement{constructor(){super()}connectedCallback(){this.classList.add("invalid-feedback")}static configure(){customElements.define("ful-field-error",h)}}class p extends HTMLElement{constructor(){super()}connectedCallback(){this.classList.add("alert","alert-danger","d-none")}static configure(){customElements.define("ful-errors",p)}}class f extends HTMLElement{constructor(){super()}connectedCallback(){this.classList.add("spinner-border","spinner-border-sm","d-none"),this.setAttribute("aria-hidden","true")}show(){this.classList.remove("d-none")}hide(){this.classList.add("d-none")}static configure(){customElements.define("ful-spinner",f)}}class m extends HTMLElement{constructor(){super();const e=d.uid("ful-input"),t=this.getAttribute("@name"),s=this.hasAttribute("@floating"),r=d.extractSlots(this);r.input=r.input||(()=>{const e=document.createElement("input");return e.classList.add("form-control"),e})(),d.forwardAttributes(this,r.input,["@floating"]);const i=(e,t,s)=>!e.hasAttribute(t)&&e.setAttribute(t,s);i(r.input,"name",e),i(r.input,"id",e),i(r.input,"type","text"),i(r.input,"placeholder"," "),this.innerHTML="",this.append(d.labelAndInputGroup(e,t||e,s,r))}static configure(){customElements.define("ful-input",m)}}class g extends HTMLElement{constructor(e){super(),s.mixin(this);const t=d.uid("ful-select"),r=this.getAttribute("@name"),i=this.hasAttribute("@floating"),n=this.hasAttribute("@remote"),o=d.extractSlots(this);o.input=o.input||document.createElement("select"),d.forwardAttributes(this,o.input,["@floating","@remote"]);const a=(e,t,s)=>!e.hasAttribute(t)&&e.setAttribute(t,s);a(o.input,"name",t),a(o.input,"id",t),a(o.input,"placeholder"," "),this.innerHTML="",this.append(d.labelAndInputGroup(t,r||t,i,o)),this.loaded=!n,this.ts=new TomSelect(o.input,Object.assign(n?{preload:"focus",load:async(e,t)=>{if(this.loaded)return void t();const s=await this.fire("load",e,[]);this.loaded=!0,t(s)}}:{},e)),o.input.setValue=this.setValue.bind(this),o.input.getValue=this.getValue.bind(this)}async setValue(e){this.loaded||await this.ts.load(),this.ts.setValue(e)}getValue(){const e=this.ts.getValue();return""===e?null:e}static custom(e,t){customElements.define(e,class extends g{constructor(){super(t)}})}static configure(){return g.custom("ful-select")}}class E extends HTMLElement{constructor({mutators:e,extractors:t,valueHoldersSelector:r,ignoredChildrenSelector:i}){super(),s.mixin(this),this.mutators=e||{},this.extractors=t||{},this.valueHoldersSelector=r||"[name]",this.ignoredChildrenSelector=i||".d-none";const n=document.createElement("form");n.append(...this.childNodes),this.appendChild(n),n.addEventListener("submit",(async e=>{e.preventDefault(),this.spinner(!0);try{await this.fire("submit",this.getValues(),this)}catch(e){if(e instanceof o)return void this.setErrors(e.problems);throw e}finally{this.spinner(!1)}}))}spinner(e){this.querySelectorAll("ful-spinner").forEach((t=>{t[e?"show":"hide"]()})),this.querySelectorAll("[type=submit],[type=reset]").forEach((t=>{t.disabled=e}))}setValues(e){for(let t in e)e.hasOwnProperty(t)&&Array.from(this.querySelectorAll(`[name='${CSS.escape(t)}']`)).forEach((s=>{E.mutate(this.mutators,s,e[t],t,e)}))}getValues(){return Array.from(this.querySelectorAll(this.valueHoldersSelector)).filter((e=>"never"!==e.dataset.fulBindInclude&&("always"===e.dataset.fulBindInclude||null===e.closest(this.ignoredChildrenSelector)))).reduce(((e,t)=>E.providePath(e,t.getAttribute("name"),E.extract(this.extractors,t))),{})}setErrors(e,t){if(this.clearErrors(),e.filter((e=>"FIELD_ERROR"===e.type||"INVALID_FORMAT"===e.type)).forEach((e=>{const t=e.context.replace("[",".").replace("].",".");this.querySelectorAll(`[name='${CSS.escape(t)}']`).forEach((e=>{e.classList.add("is-invalid"),e.parentElement.classList.contains("form-floating")&&e.parentElement.classList.add("is-invalid")})),this.querySelectorAll(`ful-field-error[field='${CSS.escape(t)}']`).forEach((t=>t.innerText=e.reason))})),this.querySelectorAll("ful-errors").forEach((t=>{const s=e.filter((e=>"FIELD_ERROR"!==e.type&&"INVALID_FORMAT"!==e.type));t.innerHTML=s.map((e=>e.reason)).join("\n"),0!==s.length&&t.classList.remove("d-none")})),!t)return;const s=Array.from(this.querySelectorAll("ful-field-error:not(.d-none)")).map((e=>e.getBoundingClientRect().y+window.scrollY)),r=Math.min(...s);r!==1/0&&window.scroll(window.scrollX,r>100?r-100:0)}clearErrors(){this.querySelectorAll("[name].is-invalid, .form-floating.is-invalid").forEach((e=>e.classList.remove("is-invalid"))),this.querySelectorAll("ful-errors").forEach((e=>{e.innerHTML="",e.classList.add("d-none")}))}static extract(e,t){const s=e[t.dataset.fulBindExtractor]||e[t.dataset.fulBindProvide];if(s)return s(t);if("radio"===t.getAttribute("type")){if(!t.checked)return;return"boolean"===t.dataset.fulBindType?"true"===t.value:t.value}return"checkbox"===t.getAttribute("type")?t.checked:"boolean"===t.dataset.fulBindType?t.value?"true"===t.value:null:t.getValue?t.getValue():t.value||null}static mutate(e,t,s,r,i){const n=e[t.dataset.fulBindMutator]||e[t.dataset.fulBindProvide];n?n(t,s,r,i):"radio"!==t.getAttribute("type")?"checkbox"!==t.getAttribute("type")?t.setValue?t.setValue(s):t.value=s:t.checked=s:t.checked=t.getAttribute("value")===s}static providePath(e,t,s){const r=t.split(".").map((e=>e.match(/^[0-9]+$/)?+e:e));let i=e,n=null;for(let t=0;;++t){const o=r[t],a=r[t-1];if(Number.isInteger(o)&&!Array.isArray(i)&&(null!==n?n[a]=i=[]:e=i=[]),t===r.length-1)return i[o]=void 0!==s?s:o in i?i[o]:null,e;void 0===i[o]&&(i[o]={}),n=i,i=i[o]}}static custom(e,t){customElements.define(e,class extends E{constructor(){super(t)}})}static configure(e){h.configure(),p.configure(),f.configure(),m.configure(),g.configure(),E.custom("ful-form",e||{})}}class w{constructor(e,t){this.prefix=e,this.storage=t}save(e,t){this.storage.setItem(`${this.prefix}-${e}`,JSON.stringify(t))}load(e){const t=this.storage.getItem(`${this.prefix}-${e}`);return void 0===t?void 0:JSON.parse(t)}remove(e){this.storage.removeItem(`${this.prefix}-${e}`)}pop(e){const t=this.load(e);return this.remove(e),t}}class b extends w{constructor(e){super(e,localStorage)}}class y extends w{constructor(e){super(e,sessionStorage)}}class A{constructor(e,t,s){this.storage=e,this.key=t,this.dataSupplier=s,this.cache=null}async load(e){const t=this.storage.load(this.key);if(t&&t.revision===e)return void(this.cache=t.value);const s=await this.dataSupplier(e,this.key);this.storage.save(this.key,{revision:e,value:s}),this.cache=s}data(){return this.cache}}class v{static forKeycloak(e,t,s){return new v(e,"openid profile",{auth:new URL("protocol/openid-connect/auth",t),token:new URL("protocol/openid-connect/token",t),logout:new URL("protocol/openid-connect/logout",t),registration:new URL("protocol/openid-connect/registrations",t),redirect:s})}constructor(e,t,{auth:s,token:r,registration:i,logout:n,redirect:o}){this.storage=new y(e),this.clientId=e,this.scope=t,this.uri={auth:s,token:r,registration:i,logout:n,redirect:o}}async action(t,s){const r=e.encode(crypto.getRandomValues(new Uint8Array(32)).buffer),i=e.encode(await crypto.subtle.digest("SHA-256",(new TextEncoder).encode(r))),n=this.clientId+e.encode(crypto.getRandomValues(new Uint8Array(16)).buffer);this.storage.save(v.PKCE_AND_STATE_KEY,{state:n,verifier:r});const o=new URL(t);o.searchParams.set("client_id",this.clientId),o.searchParams.set("redirect_uri",this.uri.redirect),o.searchParams.set("response_type","code"),o.searchParams.set("scope",this.scope),o.searchParams.set("state",n),o.searchParams.set("code_challenge",i),o.searchParams.set("code_challenge_method","S256"),Object.entries(s||{}).forEach((e=>{o.searchParams.set(e[0],e[1])})),window.location=o}async registration(e){await this.action(this.uri.registration,e)}async applicationInitiatedAction(e){await this.action(this.uri.auth,{kc_action:e})}async _tokenExchange(e,t){window.history.replaceState("","",this.uri.redirect);const s=this.storage.pop(v.PKCE_AND_STATE_KEY);if(s.state!==t)throw new Error("State mismatch");const r=await fetch(this.uri.token,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams([["client_id",this.clientId],["code",e],["grant_type","authorization_code"],["code_verifier",s.verifier],["state",s.state],["redirect_uri",this.uri.redirect]])});if(!r.ok){const e=await r.text();throw new Error("Error:"+r.status+": "+e)}const i=await r.json();return new T(this.clientId,i,this.uri)}async ensureLoggedIn(){const e=new URL(window.location.href),t=e.searchParams.get("code");if(t&&this.storage.load(v.PKCE_AND_STATE_KEY)){const s=e.searchParams.get("state");return await this._tokenExchange(t,s)}return await this.action(this.uri.auth,{}),null}}v.PKCE_AND_STATE_KEY="state-and-verifier";class T{static parseToken(t){const[s,r,i]=t.split("."),n=new TextDecoder("utf-8");return{header:JSON.parse(n.decode(e.decode(s,e.STANDARD))),payload:JSON.parse(n.decode(e.decode(r,e.STANDARD))),signature:i}}constructor(e,t,{token:s,logout:r,redirect:i}){this.clientId=e,this.token=t,this.accessToken=T.parseToken(t.access_token),this.refreshToken=T.parseToken(t.refresh_token),this.uri={token:s,logout:r,redirect:i},this.refreshCallback=null}onRefresh(e){this.refreshCallback=e}async refresh(){const e=await fetch(this.uri.token,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams([["client_id",this.clientId],["grant_type","refresh_token"],["refresh_token",this.token.refresh_token]])});if(!e.ok)throw new Error("Error:"+e.status+": "+e.text());const t=await e.json();this.token=t,this.accessToken=this._parseToken(t.access_token),this.refreshToken=this._parseToken(t.refresh_token),this.refreshCallback&&this.refreshCallback(this.token,this.accessToken,this.refreshToken)}shouldBeRefreshed(e){const t=(new Date).getTime(),s=1e3*this.refreshToken.payload.exp;return!(t>s)&&t-e>s}async refreshIf(e){this.shouldBeRefreshed(e)&&await this.refresh()}logout(){const e=new URL(this.uri.logout);e.searchParams.set("post_logout_redirect_uri",this.uri.redirect),e.searchParams.set("id_token_hint",this.token.id_token),window.location=e}bearerToken(){return`Bearer ${this.token.access_token}`}interceptor(e,t){return new L(this,e,t)}}class L{constructor(e,t,s){this.session=e,this.gracePeriodBefore=t||2e3,this.gracePeriodAfter=s||3e4}async intercept(e,t){await this.session.refreshIf(this.gracePeriodBefore);const s=new Headers(e.options.headers);s.set("Authorization",this.session.bearerToken()),e.options.headers=s;const r=await t.proceed(e);return await this.session.refreshIf(this.gracePeriodAfter),r}}const S={sleep:e=>new Promise((t=>setTimeout(t,e))),DEBOUNCE_DEFAULT:0,DEBOUNCE_IMMEDIATE:1,debounce(e,t,s){let r=null,i=[],n=0,o=s||S.DEBOUNCE_DEFAULT;const a=()=>{const s=(new Date).getTime()-n;e>s?r=setTimeout(a,e-s):(r=null,o!==S.DEBOUNCE_IMMEDIATE&&t(...i),null===r&&(i=[]))};return function(){i=arguments,n=(new Date).getTime(),null===r&&(r=setTimeout(a,e),o===S.DEBOUNCE_IMMEDIATE&&t(...i))}},THROTTLE_DEFAULT:0,THROTTLE_NO_LEADING:1,THROTTLE_NO_TRAILING:2,throttle(e,t,s){let r=null,i=[],n=0,o=s||S.THROTTLE_DEFAULT;const a=()=>{n=o&S.THROTTLE_NO_LEADING?0:(new Date).getTime(),r=null,t(...i),null===r&&(i=[])};return function(){const s=(new Date).getTime();!n&&o&S.THROTTLE_NO_LEADING&&(n=s);const c=e-(s-n);i=arguments,c<=0||c>e?(null!==r&&(clearTimeout(r),r=null),n=s,t(...i),null===r&&(i=[])):null!==r||o&S.THROTTLE_NO_TRAILING||(r=setTimeout(a,c))}}};class _ extends HTMLElement{constructor(){if(super(),this.progress=[...this.children].filter((e=>e.matches("header,ol,ul"))),this.progress.forEach((e=>{const t=[...e.children];void 0===t.filter((e=>e.matches(".active")))[0]&&t.length>0&&t[0].classList.add("active")})),null===this.querySelector("section.current")){const e=this.querySelector("section:first-of-type");null!==e&&e.classList.add("current")}}next(){this.progress.forEach((e=>{const t=[...e.children].filter((e=>e.matches(".active")))[0];t?.classList.remove("active"),t?.nextElementSibling?.classList.add("active")}));const e=this.querySelector("section.current");e.classList.remove("current"),e.nextElementSibling.classList.add("current"),this.dispatchEvent(new CustomEvent("wizard:activate",{bubbles:!0,cancelable:!0}))}prev(){this.progress.forEach((e=>{const t=[...e.children].filter((e=>e.matches(".active")))[0];t?.classList.remove("active"),t?.previousElementSibling?.classList.add("active")}));const e=this.querySelector("section.current");e.classList.remove("current"),e.previousElementSibling.classList.add("current"),this.dispatchEvent(new CustomEvent("wizard:activate",{bubbles:!0,cancelable:!0}))}moveTo=function(e){this.progress.forEach((t=>{const s=[...t.children].filter((e=>e.matches(".active")))[0];s?.classList.remove("active"),t.children[+e]?.classList.add("active")}));const t=this.querySelector("section.current");t?.classList.remove("current");this.querySelector(`section:nth-child(${+e})`).classList.add("current"),this.dispatchEvent(new CustomEvent("wizard:activate",{bubbles:!0,cancelable:!0}))};static custom(e,t){customElements.define(e,class extends _{constructor(){super(t)}})}static configure(){return _.custom("ful-wizard")}}class k{constructor(){this.configurers=[],this.initializers=[],this.handlers=[],this.running=!1,document.addEventListener("DOMContentLoaded",(async()=>{await Promise.all(this.configurers),await Promise.all(this.initializers.map((e=>Promise.resolve(e())))),await Promise.all(this.handlers.map((e=>Promise.resolve(e()))))}))}configure(e){return this.configurers.push(Promise.resolve(e())),this}initialize(e){return this.initializers.push(e),this}ready(e){return this.handlers.push(e),this}}export{k as App,v as AuthorizationCodeFlow,L as AuthorizationCodeFlowInterceptor,T as AuthorizationCodeFlowSession,e as Base64,d as CustomElements,p as Errors,o as Failure,h as FieldError,E as Form,t as Hex,u as HttpClient,m as Input,b as LocalStorage,s as Observable,g as Select,y as SessionStorage,f as Spinner,A as VersionedStorage,_ as Wizard,S as timing};
|
|
2
2
|
//# sourceMappingURL=ful.min.mjs.map
|