@optionfactory/ful 0.20.0 → 0.21.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ful.iife.js +15 -2
- 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 +15 -3
- package/dist/ful.mjs.map +1 -1
- package/package.json +1 -1
package/dist/ful.min.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ful.min.mjs","sources":["../src/encodings.mjs","../src/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","Hex","hex","Error","lenInBytes","map","e","offset","octet","parseInt","bytes","upper","Array","from","b","toString","toUpperCase","o","padStart","join","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","parseProblems","text","def","type","reason","details","JSON","parse","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","to","except","getAttributeNames","filter","a","forEach","setAttribute","classList","add","split","extractSlots","el","slotted","Object","fromEntries","querySelectorAll","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","CSS","escape","mutate","dataset","closest","reduce","result","providePath","extract","errors","scroll","clearErrors","replace","contains","innerText","globalErrors","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","LocalStorage","localStorage","SessionStorage","sessionStorage","VersionedStorage","dataSupplier","cache","revision","saved","freshData","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","App","configurers","initializers","handlers","running","all","h","cb","initialize","ready"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ful.min.mjs","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 opts = options || {};\n const interceptors = [...this.interceptors, ...opts.interceptors || [], new HttpCall()];\n const chain = new HttpInterceptorChain(interceptors, 0);\n return await chain.proceed({resource, opts});\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\nfunction jsonRequest(method, body, headers){\n return {\n headers: {\n \"Content-Type\": \"application/json\",\n ...headers\n },\n method: method,\n body: JSON.stringify(body) \n }\n}\n\n\nexport { HttpClient, Failure, jsonRequest };\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","Hex","hex","Error","lenInBytes","map","e","offset","octet","parseInt","bytes","upper","Array","from","b","toString","toUpperCase","o","padStart","join","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","parseProblems","text","def","type","reason","details","JSON","parse","fromResponse","problems","super","stringify","name","HttpClientBuilder","interceptors","withContext","withCsrfToken","withRedirectOnUnauthorized","withInterceptors","build","HttpClient","HttpCall","fetch","HttpInterceptorChain","current","interceptor","builder","opts","json","ok","message","undefined","jsonRequest","method","body","CustomElements","static","uid","prefix","id","forwardAttributes","to","except","getAttributeNames","filter","a","forEach","setAttribute","classList","add","split","extractSlots","el","slotted","Object","fromEntries","querySelectorAll","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","CSS","escape","mutate","dataset","closest","reduce","result","providePath","extract","errors","scroll","clearErrors","replace","contains","innerText","globalErrors","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","LocalStorage","localStorage","SessionStorage","sessionStorage","VersionedStorage","dataSupplier","cache","revision","saved","freshData","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","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","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","App","configurers","initializers","handlers","running","all","h","cb","initialize","ready"],"mappings":"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"}
|
package/dist/ful.mjs
CHANGED
|
@@ -224,9 +224,10 @@ class HttpClient {
|
|
|
224
224
|
this.interceptors = interceptors || [];
|
|
225
225
|
}
|
|
226
226
|
async fetch(resource, options) {
|
|
227
|
-
const
|
|
227
|
+
const opts = options || {};
|
|
228
|
+
const interceptors = [...this.interceptors, ...opts.interceptors || [], new HttpCall()];
|
|
228
229
|
const chain = new HttpInterceptorChain(interceptors, 0);
|
|
229
|
-
return await chain.proceed({resource,
|
|
230
|
+
return await chain.proceed({resource, opts});
|
|
230
231
|
}
|
|
231
232
|
async json(resource, options) {
|
|
232
233
|
try {
|
|
@@ -251,6 +252,17 @@ class HttpClient {
|
|
|
251
252
|
}
|
|
252
253
|
}
|
|
253
254
|
|
|
255
|
+
function jsonRequest(method, body, headers){
|
|
256
|
+
return {
|
|
257
|
+
headers: {
|
|
258
|
+
"Content-Type": "application/json",
|
|
259
|
+
...headers
|
|
260
|
+
},
|
|
261
|
+
method: method,
|
|
262
|
+
body: JSON.stringify(body)
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
|
|
254
266
|
/* global Infinity, CSS */
|
|
255
267
|
|
|
256
268
|
class CustomElements {
|
|
@@ -1126,5 +1138,5 @@ class App {
|
|
|
1126
1138
|
}
|
|
1127
1139
|
}
|
|
1128
1140
|
|
|
1129
|
-
export { App, AuthorizationCodeFlow, AuthorizationCodeFlowInterceptor, AuthorizationCodeFlowSession, Base64, CustomElements, Errors, Failure, FieldError, Form, Hex, HttpClient, Input, LocalStorage, Observable, Select, SessionStorage, Spinner, VersionedStorage, Wizard, timing };
|
|
1141
|
+
export { App, AuthorizationCodeFlow, AuthorizationCodeFlowInterceptor, AuthorizationCodeFlowSession, Base64, CustomElements, Errors, Failure, FieldError, Form, Hex, HttpClient, Input, LocalStorage, Observable, Select, SessionStorage, Spinner, VersionedStorage, Wizard, jsonRequest, timing };
|
|
1130
1142
|
//# sourceMappingURL=ful.mjs.map
|