@cas-smartdesign/combo-box 7.4.2 → 7.5.1
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/combo-box-with-externals.js +48 -72
- package/dist/combo-box-with-externals.js.map +4 -4
- package/dist/combo-box.mjs +75 -82
- package/dist/combo-box.mjs.map +1 -1
- package/dist/docs/2_basic-examples.js +1 -1
- package/dist/docs/6_validation_example.js +1 -1
- package/dist/docs/doc.css +1 -1
- package/dist/docs/doc.mjs +101 -106
- package/npm-third-party-licenses.json +57 -47
- package/package.json +10 -9
package/dist/combo-box.mjs
CHANGED
|
@@ -1,34 +1,34 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { property as
|
|
1
|
+
import { unsafeCSS as g, css as x, html as b } from "lit";
|
|
2
|
+
import { property as a } from "lit/decorators/property.js";
|
|
3
3
|
import { createPopper as v } from "@popperjs/core";
|
|
4
4
|
import _ from "@cas-smartdesign/lit-input";
|
|
5
5
|
import p, { ListDataProvider as y, SelectionType as u } from "@cas-smartdesign/virtual-list";
|
|
6
6
|
import { generator as w } from "@cas-smartdesign/list-item";
|
|
7
7
|
import I from "@cas-smartdesign/image-tools";
|
|
8
|
-
const V = ":host{display:inline-flex;position:relative;cursor:text;font-family:Segoe UI,Lucida Sans,Arial,sans-serif;font-size:16px;color:#111;contain:layout style;flex-direction:column}:host([hidden]),:host([type=hidden]){display:none!important}:host([effective-disabled]){opacity:.6;cursor:default;filter:grayscale(100%)}:host([effective-disabled]) .unfocused-line,:host([effective-disabled]) .focused-line{border-bottom-style:dashed}:host(:not([effective-disabled]):focus) .focused-line,:host(:not([effective-disabled])[focused]) .focused-line{transform:none;transition:transform .25s}:host(:not([effective-disabled]):focus) .label.float,:host(:not([effective-disabled])[focused]) .label.float{color:var(--sd-input-focused-color, #1467ba)}:host([inactive]) .input{pointer-events:none}:host([effective-disabled]:focus),:host([effective-disabled][focused]){box-shadow:0 0 0 1px #111}:host(:not([effective-disabled])[validationlevel]) .focused-line,:host(:not([effective-disabled]):invalid) .focused-line{transform:none;transition:transform .25s}:host([validationlevel=warn i]) .focused-line{border-bottom-color:var(--sd-input-validation-color, #555555)}:host([validationlevel=warn i]) .label,:host([validationlevel=warn i]) .validation-message{color:var(--sd-input-validation-color, #555555)!important}:host([validationlevel=suggest i]) .focused-line{border-bottom-color:var(--sd-input-validation-color, #bf8800)}:host([validationlevel=suggest i]) .label,:host([validationlevel=suggest i]) .validation-message{color:var(--sd-input-validation-color, #bf8800)!important}:host([validationlevel=error i]) .focused-line,:host(:not([validationlevel]):invalid) .focused-line{border-bottom-color:var(--sd-input-validation-color, #cc0017)}:host([validationlevel=error i]) .label,:host([validationlevel=error i]) .validation-message,:host(:not([validationlevel]):invalid) .label,:host(:not([validationlevel]):invalid) .validation-message{color:var(--sd-input-validation-color, #cc0017)!important}.validation-message-wrapper{min-height:var(--sd-input-validation-message-minheight, 0px);position:relative;font-size:0}.validation-message{position:relative;position:var(--sd-input-validation-message-minheight, absolute);left:0;right:0}.label.float{transform:translateY(-75%) scale(.75);width:133%}.label:not(.float){max-width:100%}.floated-label-placeholder{height:20px;width:100%}.label{position:absolute;top:0;left:0;line-height:24px;pointer-events:none;color:var(--sd-input-color, #767676);transition:transform .25s,width .25s;transform-origin:left top}.input-wrapper{position:relative;display:flex;flex-direction:row;align-items:center;background-color:var(--input-wrapper-background-color)}:host([extended-prefix]:focus-within:not([effective-disabled])) .input-wrapper{flex-direction:column;align-items:baseline}:host([extended-prefix]:focus-within:not([effective-disabled])) .input-container{width:100%}:host([extended-prefix]:not(:focus-within)) .input-container,:host([extended-prefix][effective-disabled]) .input-container{width:0px}.input-container{line-height:var(--sd-input-line-height, 24px);flex:1 1 auto}.input{width:100%;background:var(--sd-input-background, transparent);font-family:inherit;font-size:inherit;text-align:inherit;color:inherit;border:none;outline:none;resize:none;padding-left:0;padding-right:0}.input:-webkit-autofill{animation-name:onautofillstart}.input:not(:-webkit-autofill){animation-name:onautofillcancel}@keyframes onautofillstart{0%{outline:none}}@keyframes onautofillcancel{0%{outline:none}}.label,input.input{text-overflow:ellipsis;overflow-x:hidden;white-space:nowrap}.validation-message{text-overflow:ellipsis;overflow-x:hidden;white-space:normal;white-space:var(--sd-input-validation-message-minheight, nowrap)}.input::placeholder{color:var(--sd-input-color, #767676)}.underline{height:2px;width:100%;position:relative}.unfocused-line,.focused-line{position:absolute;
|
|
8
|
+
const V = ":host{display:inline-flex;position:relative;cursor:text;font-family:Segoe UI,Lucida Sans,Arial,sans-serif;font-size:16px;color:#111;contain:layout style;flex-direction:column}:host([hidden]),:host([type=hidden]){display:none!important}:host([effective-disabled]){opacity:.6;cursor:default;filter:grayscale(100%)}:host([effective-disabled]) .unfocused-line,:host([effective-disabled]) .focused-line{border-bottom-style:dashed}:host(:not([effective-disabled]):focus) .focused-line,:host(:not([effective-disabled])[focused]) .focused-line{transform:none;transition:transform .25s}:host(:not([effective-disabled]):focus) .label.float,:host(:not([effective-disabled])[focused]) .label.float{color:var(--sd-input-focused-color, #1467ba)}:host([inactive]) .input{pointer-events:none}:host([effective-disabled]:focus),:host([effective-disabled][focused]){box-shadow:0 0 0 1px #111}:host(:not([effective-disabled])[validationlevel]) .focused-line,:host(:not([effective-disabled]):invalid) .focused-line{transform:none;transition:transform .25s}:host([validationlevel=warn i]) .focused-line{border-bottom-color:var(--sd-input-validation-color, #555555)}:host([validationlevel=warn i]) .label,:host([validationlevel=warn i]) .validation-message{color:var(--sd-input-validation-color, #555555)!important}:host([validationlevel=suggest i]) .focused-line{border-bottom-color:var(--sd-input-validation-color, #bf8800)}:host([validationlevel=suggest i]) .label,:host([validationlevel=suggest i]) .validation-message{color:var(--sd-input-validation-color, #bf8800)!important}:host([validationlevel=error i]) .focused-line,:host(:not([validationlevel]):invalid) .focused-line{border-bottom-color:var(--sd-input-validation-color, #cc0017)}:host([validationlevel=error i]) .label,:host([validationlevel=error i]) .validation-message,:host(:not([validationlevel]):invalid) .label,:host(:not([validationlevel]):invalid) .validation-message{color:var(--sd-input-validation-color, #cc0017)!important}.validation-message-wrapper{min-height:var(--sd-input-validation-message-minheight, 0px);position:relative;font-size:0}.validation-message{position:relative;position:var(--sd-input-validation-message-minheight, absolute);left:0;right:0}.label.float{transform:translateY(-75%) scale(.75);width:133%}.label:not(.float){max-width:100%}.floated-label-placeholder{height:20px;width:100%}.label{position:absolute;top:0;left:0;line-height:24px;pointer-events:none;color:var(--sd-input-color, #767676);transition:transform .25s,width .25s;transform-origin:left top}.input-wrapper{position:relative;display:flex;flex-direction:row;align-items:center;background-color:var(--input-wrapper-background-color)}:host([extended-prefix]:focus-within:not([effective-disabled])) .input-wrapper{flex-direction:column;align-items:baseline}:host([extended-prefix]:focus-within:not([effective-disabled])) .input-container{width:100%}:host([extended-prefix]:not(:focus-within)) .input-container,:host([extended-prefix][effective-disabled]) .input-container{width:0px}.input-container{line-height:var(--sd-input-line-height, 24px);flex:1 1 auto}.input{width:100%;background:var(--sd-input-background, transparent);font-family:inherit;font-size:inherit;text-align:inherit;color:inherit;border:none;outline:none;resize:none;padding-left:0;padding-right:0}.input:-webkit-autofill{animation-name:onautofillstart}.input:not(:-webkit-autofill){animation-name:onautofillcancel}@keyframes onautofillstart{0%{outline:none}}@keyframes onautofillcancel{0%{outline:none}}.label,input.input{text-overflow:ellipsis;overflow-x:hidden;white-space:nowrap}.validation-message{text-overflow:ellipsis;overflow-x:hidden;white-space:normal;white-space:var(--sd-input-validation-message-minheight, nowrap)}.input::placeholder{color:var(--sd-input-color, #767676)}.underline{height:2px;width:100%;position:relative}.unfocused-line,.focused-line{position:absolute;inset:0}.unfocused-line{border-bottom:1px solid var(--sd-input-underline-color, #959595)}.focused-line{border-bottom:2px solid var(--sd-input-focused-color, #1467ba);transform-origin:center center;transform:scale3d(0,1,1)}.prefix,.suffix{display:flex;flex-wrap:nowrap;max-width:100%}.prefix ::slotted(*),.suffix ::slotted(*){display:flex}:host(:focus){outline:none}.suffix ::slotted(.clear-button),.suffix ::slotted(.toggle-button){cursor:pointer;width:16px;height:32px;padding:0 8px;margin-top:-8px;margin-bottom:-8px;fill:#666;outline:none;flex-shrink:0}.suffix ::slotted(.toggle-button){transition:transform .2s}:host([opened]) .suffix ::slotted(.toggle-button){transform:rotate(180deg)}:host([disabled]) .suffix ::slotted(.clear-button),:host([disabled]) .suffix ::slotted(.toggle-button){display:none!important}.prefix ::slotted(.icon-wrapper){width:32px;height:32px;padding-right:4px;margin-top:-8px;margin-bottom:-8px;display:flex;align-items:center;justify-content:center;flex-shrink:0}:host(:not([has-value])) .suffix ::slotted(.clear-button),:host([null-setting-disallowed]) .suffix ::slotted(.clear-button){display:none!important}:host(:not([allow-custom-value]):not([trigger-only])) .input{caret-color:transparent}:host(:not([allow-custom-value]):not([disabled])) .input{cursor:pointer}#default-slot{display:none}", C = `<svg xmlns="http://www.w3.org/2000/svg" class="toggle-button" slot="suffix" viewBox="0 0 16 16">\r
|
|
9
9
|
<path d="M13 4v2l-5 5-5-5v-2l5 5z"/>\r
|
|
10
10
|
</svg>\r
|
|
11
11
|
`, B = `<svg xmlns="http://www.w3.org/2000/svg" class="clear-button" slot="suffix" viewBox="0 0 16 16">\r
|
|
12
12
|
<path d="M12.96 4.46l-1.42-1.42-3.54 3.55-3.54-3.55-1.42 1.42 3.55 3.54-3.55 3.54 1.42 1.42 3.54-3.55 3.54 3.55 1.42-1.42-3.55-3.54 3.55-3.54z"/>\r
|
|
13
13
|
</svg>\r
|
|
14
14
|
`;
|
|
15
|
-
var P = Object.defineProperty,
|
|
16
|
-
for (var s =
|
|
17
|
-
(
|
|
18
|
-
return
|
|
15
|
+
var P = Object.defineProperty, r = (h, t, e, i) => {
|
|
16
|
+
for (var s = void 0, l = h.length - 1, d; l >= 0; l--)
|
|
17
|
+
(d = h[l]) && (s = d(t, e, s) || s);
|
|
18
|
+
return s && P(t, e, s), s;
|
|
19
19
|
};
|
|
20
|
-
const
|
|
20
|
+
const S = "sd-combo-box";
|
|
21
21
|
function f(h, t) {
|
|
22
22
|
let e;
|
|
23
23
|
return function(...i) {
|
|
24
24
|
e != null && clearTimeout(e), e = window.setTimeout(() => h(...i), t);
|
|
25
25
|
};
|
|
26
26
|
}
|
|
27
|
-
let
|
|
27
|
+
let D = 0;
|
|
28
28
|
var o;
|
|
29
|
-
const
|
|
29
|
+
const n = (o = class extends _ {
|
|
30
30
|
constructor() {
|
|
31
|
-
super(), this.opened = !1, this.itemHeight = 50, this.displayValuePath = "caption", this.id = o.ID + "_" +
|
|
31
|
+
super(), this.opened = !1, this.itemHeight = 50, this.displayValuePath = "caption", this.id = o.ID + "_" + D++, this.inMemoryFilter = (t, e) => {
|
|
32
32
|
if (!t)
|
|
33
33
|
return !0;
|
|
34
34
|
const i = t.toLowerCase();
|
|
@@ -120,8 +120,8 @@ const l = (o = class extends _ {
|
|
|
120
120
|
}
|
|
121
121
|
static get styles() {
|
|
122
122
|
return [
|
|
123
|
-
|
|
124
|
-
${
|
|
123
|
+
x`
|
|
124
|
+
${g(V)}
|
|
125
125
|
`
|
|
126
126
|
];
|
|
127
127
|
}
|
|
@@ -177,16 +177,14 @@ const l = (o = class extends _ {
|
|
|
177
177
|
t.style.backgroundRepeat = "no-repeat", t.style.backgroundPosition = "center", t.style.backgroundSize = "cover", t.style.height = "24px", t.style.width = "24px", this._icon.appendChild(t), this._icon.slot = "prefix", this.appendChild(this._icon), this.updateIconFromCurrentValue();
|
|
178
178
|
}
|
|
179
179
|
updateIconFromCurrentValue() {
|
|
180
|
-
|
|
181
|
-
this.isCustomValue(this.comboBoxValue) ? this.updateIcon(null) : this.updateIcon((t = this.comboBoxValue) == null ? void 0 : t.item);
|
|
180
|
+
this.isCustomValue(this.comboBoxValue) ? this.updateIcon(null) : this.updateIcon(this.comboBoxValue?.item);
|
|
182
181
|
}
|
|
183
182
|
updateIcon(t) {
|
|
184
183
|
if (this._icon)
|
|
185
184
|
if (t && (t.icon || t.iconPlaceholder)) {
|
|
186
185
|
const e = t;
|
|
187
186
|
e.attributes == null ? (this._icon.title = "", this._icon.ariaLabel = "") : (this._icon.title = e.attributes["icon-attr-title"] ?? "", this._icon.ariaLabel = e.attributes["icon-attr-aria-label"] ?? ""), this._icon.style.backgroundColor = e.iconBackgroundColor, this._icon.style.display = "", I.showImage(this._icon.querySelector("div"), t.icon, t.iconPlaceholder);
|
|
188
|
-
} else
|
|
189
|
-
this._icon && (this._icon.style.display = "none");
|
|
187
|
+
} else this._icon && (this._icon.style.display = "none");
|
|
190
188
|
}
|
|
191
189
|
updateHasValue() {
|
|
192
190
|
this.currentText || this.comboBoxValue != null && this.comboBoxValue != "" ? (this.setAttribute("has-value", ""), this._clearButton && (this._clearButton.style.display = "")) : this.removeAttribute("has-value");
|
|
@@ -258,15 +256,12 @@ const l = (o = class extends _ {
|
|
|
258
256
|
{
|
|
259
257
|
name: "offset",
|
|
260
258
|
options: {
|
|
261
|
-
offset: ({ placement: e }) =>
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
)) == null ? void 0 : i.offsetHeight) ?? 0)
|
|
268
|
-
] : [0, 0];
|
|
269
|
-
}
|
|
259
|
+
offset: ({ placement: e }) => e.indexOf("top") > -1 ? [0, -parseInt(getComputedStyle(t).paddingTop, 10)] : e.indexOf("bottom") > -1 ? [
|
|
260
|
+
0,
|
|
261
|
+
-parseInt(getComputedStyle(t).paddingBottom, 10) - (this.shadowRoot.querySelector(
|
|
262
|
+
".validation-message-wrapper"
|
|
263
|
+
)?.offsetHeight ?? 0)
|
|
264
|
+
] : [0, 0]
|
|
270
265
|
}
|
|
271
266
|
},
|
|
272
267
|
{
|
|
@@ -303,37 +298,36 @@ const l = (o = class extends _ {
|
|
|
303
298
|
await this._list.updateComplete, this._popper && await this._popper.update, this.ownerDocument.body.removeChild(this._list), window.removeEventListener("pointerdown", this.handleWindowPointerDown), this.updateValueOnClose(), this.clearFilter(), this.setSelectionRange(0, 0), this.inputElement.removeAttribute("aria-activedescendant"), this._popper && (this._popper.destroy(), this._popper = null);
|
|
304
299
|
}
|
|
305
300
|
updateValueOnClose() {
|
|
306
|
-
var e;
|
|
307
301
|
const t = this.comboBoxValue ?? "";
|
|
308
302
|
if (this.nullSettingDisallowed && !this.value && this.comboBoxValue)
|
|
309
303
|
this.restorePreviousSelection();
|
|
310
304
|
else if (this.value !== (this.convertToDisplayValue(null) ?? "")) {
|
|
311
|
-
const
|
|
312
|
-
if (
|
|
313
|
-
if (
|
|
305
|
+
const e = this._dataProvider.items[this._list.focusIndex];
|
|
306
|
+
if (e && (e[this.displayValuePath] ?? "") === this.value) {
|
|
307
|
+
if (e.disabled) {
|
|
314
308
|
this.restorePreviousSelection();
|
|
315
309
|
return;
|
|
316
310
|
}
|
|
317
|
-
this.comboBoxValue = { index: this._itemCache.indexOf(
|
|
311
|
+
this.comboBoxValue = { index: this._itemCache.indexOf(e), item: e };
|
|
318
312
|
} else if (this.allowCustomValue || !this.value)
|
|
319
313
|
this.comboBoxValue = this.value;
|
|
320
314
|
else {
|
|
321
|
-
const
|
|
322
|
-
(
|
|
315
|
+
const i = this._itemCache.findIndex(
|
|
316
|
+
(s) => (s[this.displayValuePath] ?? "") === this.value && !s.disabled
|
|
323
317
|
);
|
|
324
|
-
|
|
318
|
+
i > -1 ? this.comboBoxValue = { index: i, item: this._itemCache[i] } : this.restorePreviousSelection();
|
|
325
319
|
}
|
|
326
320
|
} else {
|
|
327
|
-
const
|
|
328
|
-
if (
|
|
329
|
-
if (
|
|
321
|
+
const e = this._dataProvider.items[this._list.focusIndex];
|
|
322
|
+
if (e && e.id != null) {
|
|
323
|
+
if (e.disabled) {
|
|
330
324
|
this.restorePreviousSelection();
|
|
331
325
|
return;
|
|
332
326
|
}
|
|
333
|
-
(!this.comboBoxValue || this.isCustomValue(this.comboBoxValue) || this.comboBoxValue.item.id !=
|
|
327
|
+
(!this.comboBoxValue || this.isCustomValue(this.comboBoxValue) || this.comboBoxValue.item.id != e.id) && (this.comboBoxValue = { index: this._itemCache.indexOf(e), item: e });
|
|
334
328
|
}
|
|
335
329
|
}
|
|
336
|
-
t !== (this.comboBoxValue ?? "") && this.dispatchSelectionChangeEvent(), this.updateIcon(this.isCustomValue(this.comboBoxValue) ? null :
|
|
330
|
+
t !== (this.comboBoxValue ?? "") && this.dispatchSelectionChangeEvent(), this.updateIcon(this.isCustomValue(this.comboBoxValue) ? null : this.comboBoxValue?.item);
|
|
337
331
|
}
|
|
338
332
|
restorePreviousSelection() {
|
|
339
333
|
this.updateInputValue(null);
|
|
@@ -396,7 +390,6 @@ const l = (o = class extends _ {
|
|
|
396
390
|
}
|
|
397
391
|
dispatchSelectionChangeEvent() {
|
|
398
392
|
this.updateComplete.then(() => {
|
|
399
|
-
var t;
|
|
400
393
|
if (this.dispatchEvent(
|
|
401
394
|
new CustomEvent("selection-change", {
|
|
402
395
|
detail: {
|
|
@@ -407,8 +400,8 @@ const l = (o = class extends _ {
|
|
|
407
400
|
), this.triggerOnly)
|
|
408
401
|
this.comboBoxValue = null;
|
|
409
402
|
else {
|
|
410
|
-
const
|
|
411
|
-
this.isCustomValue(
|
|
403
|
+
const t = this.comboBoxValue;
|
|
404
|
+
this.isCustomValue(t) ? this.setFormValue(t) : this.setFormValue(t?.item?.caption);
|
|
412
405
|
}
|
|
413
406
|
}).catch((t) => {
|
|
414
407
|
console.error("Could not dispatch selection change event due to:", t);
|
|
@@ -434,20 +427,20 @@ const l = (o = class extends _ {
|
|
|
434
427
|
if (this._lastRequestedPage == t && !e)
|
|
435
428
|
return;
|
|
436
429
|
this._pendingDataRequest && this._pendingDataRequest.cancel(o.DATA_REQUEST_CANCELLED);
|
|
437
|
-
const i = new Promise((s,
|
|
438
|
-
this._pendingDataRequest = { cancel:
|
|
430
|
+
const i = new Promise((s, l) => {
|
|
431
|
+
this._pendingDataRequest = { cancel: l };
|
|
439
432
|
});
|
|
440
433
|
this._lastRequestedPage = t, this._lastRequestedFilterText = this.filterText, this.setAttribute("loading", ""), Promise.race([i, this._onDataRequest(this._lastRequestedFilterText, t)]).then((s) => {
|
|
441
434
|
if (this.filterText == this._lastRequestedFilterText && this._lastRequestedPage == t && (this._dataProvider.finalSizeIsKnown = s.finalSizeIsKnown, e ? (this._dataProvider.items = s.items, this._itemCache = s.items) : (this._dataProvider.addItems(s.items), this._itemCache = this._dataProvider.items), this._list && (this._list.itemCount = this._dataProvider.items.length), this._popper && this.opened)) {
|
|
442
435
|
if (this.comboBoxValue && !this.isCustomValue(this.comboBoxValue)) {
|
|
443
|
-
const
|
|
444
|
-
if (this._list.selectedIndices.length == 0 || this.items[this._list.selectedIndices[0]] !=
|
|
445
|
-
let
|
|
446
|
-
if (
|
|
447
|
-
const c =
|
|
448
|
-
c != null && (
|
|
436
|
+
const l = this.comboBoxValue.item;
|
|
437
|
+
if (this._list.selectedIndices.length == 0 || this.items[this._list.selectedIndices[0]] != l) {
|
|
438
|
+
let d = this.items.indexOf(l);
|
|
439
|
+
if (d == -1) {
|
|
440
|
+
const c = l.id;
|
|
441
|
+
c != null && (d = this.items.findIndex((m) => m.id == c));
|
|
449
442
|
}
|
|
450
|
-
this.comboBoxValue.index =
|
|
443
|
+
this.comboBoxValue.index = d, this._list.selectedIndices = d == -1 ? [] : [d];
|
|
451
444
|
}
|
|
452
445
|
}
|
|
453
446
|
this.updateDropdownSizes(), this._popper.update();
|
|
@@ -473,39 +466,39 @@ ${s}`
|
|
|
473
466
|
return this.displayValuePath != "caption" && this.displayValuePath != "description" && (e[this.displayValuePath] = t[this.displayValuePath] || t.getAttribute(this.displayValuePath)), e;
|
|
474
467
|
}));
|
|
475
468
|
}
|
|
476
|
-
}, o.ID =
|
|
469
|
+
}, o.ID = S, o.ensureDefined = () => {
|
|
477
470
|
p.ensureDefined(), customElements.get(o.ID) || customElements.define(o.ID, o);
|
|
478
471
|
}, o.formAssociated = !0, o.DATA_REQUEST_CANCELLED = "cancel_data_request", o);
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
],
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
],
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
],
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
],
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
],
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
],
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
],
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
],
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
],
|
|
506
|
-
let
|
|
507
|
-
|
|
472
|
+
r([
|
|
473
|
+
a({ type: Boolean, reflect: !0 })
|
|
474
|
+
], n.prototype, "opened");
|
|
475
|
+
r([
|
|
476
|
+
a({ type: Number, attribute: "item-height" })
|
|
477
|
+
], n.prototype, "itemHeight");
|
|
478
|
+
r([
|
|
479
|
+
a({ type: Boolean, attribute: "allow-custom-value", reflect: !0 })
|
|
480
|
+
], n.prototype, "allowCustomValue");
|
|
481
|
+
r([
|
|
482
|
+
a({ type: Boolean, attribute: "trigger-only", reflect: !0 })
|
|
483
|
+
], n.prototype, "triggerOnly");
|
|
484
|
+
r([
|
|
485
|
+
a({ type: Boolean, attribute: "null-setting-disallowed", reflect: !0 })
|
|
486
|
+
], n.prototype, "nullSettingDisallowed");
|
|
487
|
+
r([
|
|
488
|
+
a({ type: Boolean, attribute: "show-icon", reflect: !0 })
|
|
489
|
+
], n.prototype, "showIcon");
|
|
490
|
+
r([
|
|
491
|
+
a({ type: String, attribute: "display-value-path", noAccessor: !0 })
|
|
492
|
+
], n.prototype, "displayValuePath");
|
|
493
|
+
r([
|
|
494
|
+
a({ type: String, attribute: "filter-property", noAccessor: !0 })
|
|
495
|
+
], n.prototype, "filterProperty");
|
|
496
|
+
r([
|
|
497
|
+
a({ type: String, attribute: !0, reflect: !0 })
|
|
498
|
+
], n.prototype, "id");
|
|
499
|
+
let L = n;
|
|
500
|
+
L.ensureDefined();
|
|
508
501
|
export {
|
|
509
|
-
|
|
502
|
+
L as default
|
|
510
503
|
};
|
|
511
504
|
//# sourceMappingURL=combo-box.mjs.map
|
package/dist/combo-box.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"combo-box.mjs","sources":["../toggle.svg?raw","../clear.svg?raw","../combo-box.ts"],"sourcesContent":["export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" class=\\\"toggle-button\\\" slot=\\\"suffix\\\" viewBox=\\\"0 0 16 16\\\">\\r\\n <path d=\\\"M13 4v2l-5 5-5-5v-2l5 5z\\\"/>\\r\\n</svg>\\r\\n\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" class=\\\"clear-button\\\" slot=\\\"suffix\\\" viewBox=\\\"0 0 16 16\\\">\\r\\n <path d=\\\"M12.96 4.46l-1.42-1.42-3.54 3.55-3.54-3.55-1.42 1.42 3.55 3.54-3.55 3.54 1.42 1.42 3.54-3.55 3.54 3.55 1.42-1.42-3.55-3.54 3.55-3.54z\\\"/>\\r\\n</svg>\\r\\n\"","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { unsafeCSS, PropertyValues, css, TemplateResult, html } from \"lit\";\nimport { property } from \"lit/decorators/property.js\";\nimport { createPopper, Instance as Popper } from \"@popperjs/core\";\nimport SDInput, { CustomEventMap as InputCustomEventMap } from \"@cas-smartdesign/lit-input\";\nimport VirtualList, { SelectionType, ItemGenerator, ListDataProvider } from \"@cas-smartdesign/virtual-list\";\nimport { ItemData, generator } from \"@cas-smartdesign/list-item\";\n\nconst TAG_NAME = \"sd-combo-box\";\n\nfunction debounce<T>(func: (...args: T[]) => unknown, delay: number): typeof func {\n let timeout: number;\n return function (...args: T[]) {\n if (timeout != null) {\n clearTimeout(timeout);\n }\n timeout = window.setTimeout(() => func(...args), delay);\n };\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [TAG_NAME]: ComboBox;\n }\n}\n\nimport style from \"./style.scss?inline\";\nimport toggleSvg from \"./toggle.svg?raw\";\nimport clearSvg from \"./clear.svg?raw\";\nimport ImageTools from \"@cas-smartdesign/image-tools\";\n\nexport type ComboBoxValue = {\n index: number;\n item: ItemData | any;\n};\nexport type InMemoryFilter = (filterText: string, item: any) => boolean;\nexport type DataResponse = {\n items: any[];\n finalSizeIsKnown: boolean;\n};\n\nlet idCounter = 0;\n\nexport interface ISelectionEvent {\n selection: ComboBoxValue | string;\n isCustomValue: boolean;\n}\nexport interface IFilterChangeEvent {\n value: string;\n}\n\nexport interface CustomEventMap extends InputCustomEventMap {\n \"selection-change\": CustomEvent<ISelectionEvent>;\n \"filter-change\": CustomEvent<IFilterChangeEvent>;\n}\n\nexport default interface ComboBox {\n addEventListener<K extends keyof CustomEventMap>(\n event: K,\n listener: ((this: this, ev: CustomEventMap[K]) => unknown) | null,\n options?: AddEventListenerOptions | boolean,\n ): void;\n addEventListener(\n type: string,\n callback: EventListenerOrEventListenerObject | null,\n options?: AddEventListenerOptions | boolean,\n ): void;\n removeEventListener<K extends keyof CustomEventMap>(\n type: K,\n listener: (this: this, ev: CustomEventMap[K]) => unknown,\n options?: boolean | EventListenerOptions,\n ): void;\n removeEventListener(\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | EventListenerOptions,\n ): void;\n dispatchEvent<EventType extends CustomEventMap[keyof CustomEventMap]>(event: EventType): boolean;\n}\n\nexport default class ComboBox extends SDInput {\n public static readonly ID: string = TAG_NAME;\n public static ensureDefined = (): void => {\n VirtualList.ensureDefined();\n if (!customElements.get(ComboBox.ID)) {\n customElements.define(ComboBox.ID, ComboBox);\n }\n };\n static formAssociated = true;\n\n private static readonly DATA_REQUEST_CANCELLED: string = \"cancel_data_request\";\n\n @property({ type: Boolean, reflect: true })\n public opened = false;\n @property({ type: Number, attribute: \"item-height\" })\n public itemHeight = 50;\n @property({ type: Boolean, attribute: \"allow-custom-value\", reflect: true })\n public allowCustomValue: boolean;\n @property({ type: Boolean, attribute: \"trigger-only\", reflect: true })\n public triggerOnly: boolean;\n @property({ type: Boolean, attribute: \"null-setting-disallowed\", reflect: true })\n public nullSettingDisallowed: boolean;\n @property({ type: Boolean, attribute: \"show-icon\", reflect: true })\n public showIcon: boolean;\n @property({ type: String, attribute: \"display-value-path\", noAccessor: true })\n public displayValuePath = \"caption\";\n @property({ type: String, attribute: \"filter-property\", noAccessor: true })\n public filterProperty: string;\n @property({ type: String, attribute: true, reflect: true })\n public id: string = ComboBox.ID + \"_\" + idCounter++;\n\n public inMemoryFilter: InMemoryFilter = (filterText, item) => {\n if (!filterText) {\n return true;\n }\n const lowerCaseFilter = filterText.toLowerCase();\n if (typeof item.caption == \"string\" && item.caption.toLowerCase().includes(lowerCaseFilter)) {\n return true;\n }\n if (typeof item.description == \"string\" && item.description.toLowerCase().includes(lowerCaseFilter)) {\n return true;\n }\n return false;\n };\n\n public filterText: string;\n public minimumOverlayWidth = 250;\n\n private _comboBoxValue: ComboBoxValue | string;\n private _clearButton: SVGElement;\n private _toggleButton: SVGElement;\n private _popper: Popper;\n private _list: VirtualList;\n private _dataProvider: ListDataProvider;\n private _itemGenerator: ItemGenerator = generator;\n private _itemCache: any[] = [];\n private _declarativeItems: HTMLElement[];\n private _onDataRequest: (filterText: string, page: number) => Promise<DataResponse>;\n private _pendingDataRequest: { cancel: (reason?: any) => void };\n private _openedByFilterTextChange: boolean;\n private _lastRequestedPage: number;\n private _lastRequestedFilterText: string;\n private _icon: HTMLElement;\n\n constructor() {\n super();\n this._dataProvider = new ListDataProvider();\n this._dataProvider.finalSizeIsKnown = true;\n }\n\n public get clearFilterOnLazyLoadedSelection(): boolean {\n return this.triggerOnly;\n }\n\n /**\n * @deprecated The method should not be used.\n * Use {@link ComboBox#triggerOnly} instead.\n * @param {boolean} value\n */\n public set clearFilterOnLazyLoadedSelection(value: boolean) {\n console.warn(\n \"Using clearFilterOnLazyLoadedSelection setting on a combo-box is deprecated. Use triggerOnly instead.\",\n );\n this.triggerOnly = value;\n }\n\n public get itemGenerator(): ItemGenerator {\n return this._itemGenerator;\n }\n\n public set itemGenerator(value: ItemGenerator) {\n this._itemGenerator = value;\n if (this._list) {\n this._list.itemGenerator = this._itemGenerator;\n }\n }\n\n public get items(): any[] {\n return this._itemCache;\n }\n\n public set items(items: any[]) {\n this._itemCache = items;\n if (this.isLazyLoadConfigured) {\n this._dataProvider.items = items;\n this._lastRequestedPage = null;\n }\n if (this.value && !this.comboBoxValue) {\n this.updateComboBoxValueFromValue();\n }\n this.filterItemsInMemory();\n if (this.opened && this._popper) {\n this._popper.update();\n }\n }\n\n public get finalSizeIsKnown(): boolean {\n return this._dataProvider.finalSizeIsKnown;\n }\n\n public set finalSizeIsKnown(value: boolean) {\n this._dataProvider.finalSizeIsKnown = value;\n }\n\n public configureLazyLoad(onDataRequest: (filterText: string, page: number) => Promise<DataResponse>): void {\n if (!onDataRequest) {\n throw new Error(\"It is not possible to configure lazy load without a given onDataRequest calback.\");\n }\n this._dataProvider.finalSizeIsKnown = false;\n this._onDataRequest = onDataRequest;\n this._dataProvider.onDataRequest = (page: number) => {\n this.requestData(page, false);\n };\n }\n\n public get comboBoxValue(): ComboBoxValue | string {\n return this._comboBoxValue;\n }\n\n public set comboBoxValue(value: ComboBoxValue | string) {\n this._comboBoxValue = value;\n this.updateInputValue(null);\n this.updateHasValue();\n }\n\n public get selectedIndex(): number {\n if (this.isCustomValue(this.comboBoxValue) || !this.comboBoxValue) {\n return -1;\n }\n return this.comboBoxValue.index;\n }\n\n public get displayValue(): string {\n return this.value;\n }\n\n public open(): void {\n this.opened = true;\n }\n\n static get styles() {\n return [\n css`\n ${unsafeCSS(style)}\n `,\n ];\n }\n\n public disconnectedCallback(): void {\n super.disconnectedCallback();\n if (this._popper) {\n this._popper.destroy();\n this._popper = null;\n }\n }\n\n public render(): TemplateResult {\n return html`\n ${super.render()}\n <slot @slotchange=${this.onDefaultSlotChange} id=\"default-slot\"></slot>\n `;\n }\n\n public attributeChangedCallback(name: string, oldValue: string, newValue: string): void {\n super.attributeChangedCallback(name, oldValue, newValue);\n if (oldValue !== newValue) {\n switch (name) {\n case \"opened\": {\n this.handleOpenedStateChange();\n break;\n }\n case \"item-height\": {\n if (this._list) {\n this._list.itemHeight = this.itemHeight;\n }\n break;\n }\n case \"id\": {\n this.updateListId();\n break;\n }\n }\n }\n }\n\n public firstUpdated(changedProperties: PropertyValues): void {\n super.firstUpdated(changedProperties);\n\n if (this.value && !this.comboBoxValue) {\n this.updateComboBoxValueFromValue();\n }\n window.requestAnimationFrame(() => {\n this.initClearButtton();\n this.initToggleButtton();\n this.updateHasValue();\n\n this.addEventListener(\"click\", () => {\n if (!this.disabled) {\n this.opened = !this.opened;\n }\n });\n this.addEventListener(\"keydown\", (event: KeyboardEvent) => {\n if (!this.disabled) {\n this.handleKeyDown(event);\n }\n });\n });\n this.inputElement.setAttribute(\"role\", \"combobox\");\n this.inputElement.setAttribute(\"aria-autocomplete\", \"list\");\n }\n\n private updateComboBoxValueFromValue() {\n if (this.value) {\n const selectedIndex = this._itemCache.findIndex(\n (item) => (item[this.displayValuePath] ?? \"\") === this.value,\n );\n if (selectedIndex > -1) {\n this._comboBoxValue = { index: selectedIndex, item: this._itemCache[selectedIndex] };\n } else if (this.allowCustomValue) {\n this._comboBoxValue = this.value;\n } else {\n this._comboBoxValue = null;\n }\n this.updateHasValue();\n this.updateIconFromCurrentValue();\n }\n }\n\n public updated(changedProperties: PropertyValues): void {\n super.updated(changedProperties);\n if (changedProperties.has(\"showIcon\")) {\n if (this.showIcon) {\n if (this._icon == null) {\n this.initIconWrapper();\n }\n } else if (this._icon != null) {\n this._icon.remove();\n this._icon = null;\n }\n }\n if (changedProperties.has(\"currentText\")) {\n this.updateHasValue();\n }\n if (changedProperties.has(\"triggerOnly\") && this._list) {\n this._list.selectionType = this.triggerOnly ? SelectionType.TriggerOnly : SelectionType.Single;\n }\n }\n\n private initIconWrapper() {\n this._icon = document.createElement(\"div\");\n this._icon.className = \"icon-wrapper\";\n this._icon.role = \"img\";\n const iconEl = document.createElement(\"div\");\n iconEl.style.backgroundRepeat = \"no-repeat\";\n iconEl.style.backgroundPosition = \"center\";\n iconEl.style.backgroundSize = \"cover\";\n iconEl.style.height = \"24px\";\n iconEl.style.width = \"24px\";\n this._icon.appendChild(iconEl);\n this._icon.slot = \"prefix\";\n this.appendChild(this._icon);\n this.updateIconFromCurrentValue();\n }\n\n private updateIconFromCurrentValue() {\n if (this.isCustomValue(this.comboBoxValue)) {\n this.updateIcon(null);\n } else {\n this.updateIcon(this.comboBoxValue?.item);\n }\n }\n\n private updateIcon(item) {\n if (this._icon) {\n if (item && (item.icon || item.iconPlaceholder)) {\n const selectedItem = item as {\n iconBackgroundColor?: string;\n attributes?: Record<string, string>;\n };\n if (selectedItem.attributes == null) {\n this._icon.title = \"\";\n this._icon.ariaLabel = \"\";\n } else {\n this._icon.title = selectedItem.attributes[\"icon-attr-title\"] ?? \"\";\n this._icon.ariaLabel = selectedItem.attributes[\"icon-attr-aria-label\"] ?? \"\";\n }\n this._icon.style.backgroundColor = selectedItem.iconBackgroundColor;\n this._icon.style.display = \"\";\n ImageTools.showImage(this._icon.querySelector(\"div\"), item.icon, item.iconPlaceholder);\n } else if (this._icon) {\n this._icon.style.display = \"none\";\n }\n }\n }\n\n private updateHasValue() {\n if (this.currentText || (this.comboBoxValue != null && this.comboBoxValue != \"\")) {\n this.setAttribute(\"has-value\", \"\");\n if (this._clearButton) {\n this._clearButton.style.display = \"\";\n }\n } else {\n this.removeAttribute(\"has-value\");\n }\n }\n\n protected shouldFloat() {\n return super.shouldFloat() || (this.comboBoxValue != null && this.comboBoxValue != \"\");\n }\n\n private initClearButtton(): void {\n const clearButtonTemplate = document.createElement(\"template\");\n clearButtonTemplate.innerHTML = clearSvg;\n this._clearButton = clearButtonTemplate.content.firstChild as SVGElement;\n this.appendChild(this._clearButton);\n\n this._clearButton.addEventListener(\"click\", (event) => {\n event.preventDefault();\n event.stopPropagation();\n this.opened = false;\n this.clearValue();\n });\n }\n\n private initToggleButtton(): void {\n const toggleButtonTemplate = document.createElement(\"template\");\n toggleButtonTemplate.innerHTML = toggleSvg;\n this._toggleButton = toggleButtonTemplate.content.firstChild as SVGElement;\n this.appendChild(this._toggleButton);\n\n this._toggleButton.addEventListener(\"click\", (event) => {\n event.preventDefault();\n event.stopPropagation();\n this.opened = !this.opened;\n this.select();\n });\n }\n\n private debouncedFilterItemsInMemory = debounce(this.filterItemsInMemory.bind(this), 200);\n private filterItemsInMemory(): void {\n if (this.isLazyLoadConfigured) {\n return;\n }\n let filteredInMemory = false;\n if (this.filterText) {\n if (this.filterProperty) {\n this._dataProvider.items = this._itemCache.filter((item) => {\n return item[this.filterProperty] && String(item[this.filterProperty]).indexOf(this.filterText) > -1;\n });\n filteredInMemory = true;\n } else if (this.inMemoryFilter) {\n this._dataProvider.items = this._itemCache.filter((item) => this.inMemoryFilter(this.filterText, item));\n filteredInMemory = true;\n }\n }\n if (!filteredInMemory) {\n this._dataProvider.items = this._itemCache;\n if (this._list) {\n this.updateFocusAndSelectedIndexFromValue();\n }\n } else if (this._list) {\n if (this.comboBoxValue && !this.isCustomValue(this.comboBoxValue)) {\n let index = this._dataProvider.items.indexOf(this.comboBoxValue.item);\n if (index == -1) {\n const selectedId = this.comboBoxValue.item.id;\n if (selectedId != null) {\n index = this._dataProvider.items.findIndex((item: any) => item.id == selectedId);\n }\n }\n this._list.focusIndex = index;\n this._list.selectedIndices = index == -1 ? [] : [index];\n } else {\n this._list.focusIndex = null;\n }\n }\n if (this.opened && this._popper) {\n this._popper.update();\n }\n }\n\n private ensureListAndPopperInitialized(): void {\n if (!this._list) {\n this._list = document.createElement(VirtualList.ID) as VirtualList;\n this.updateListId();\n this._list.classList.add(\"combo-box-dropdown\");\n this._list.itemHeight = this.itemHeight;\n this._list.itemGenerator = this.itemGenerator;\n this._list.selectionType = this.triggerOnly ? SelectionType.TriggerOnly : SelectionType.Single;\n this._list.setAttribute(\"focus-target\", \"\");\n Object.assign(this._list.style, {\n zIndex: \"21000\",\n boxShadow: `rgba(0, 0, 0, 0.14) 0px 2px 2px 0px,\n rgba(0, 0, 0, 0.12) 0px 1px 5px 0px,\n rgba(0, 0, 0, 0.2) 0px 3px 1px -2px`,\n background: \"white\",\n overflowY: \"auto\",\n });\n this._list.addEventListener(\"selection\", this.handleSelection);\n this._dataProvider.connectList(this._list);\n }\n if (!this._popper) {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const comboBox = this;\n this._popper = createPopper(this, this._list, {\n placement: \"bottom-start\",\n modifiers: [\n {\n name: \"computeStyles\",\n options: {\n gpuAcceleration: true,\n },\n },\n {\n name: \"hide\",\n enabled: false,\n },\n {\n name: \"closeIfReferenceHidden\",\n enabled: true,\n phase: \"afterWrite\",\n fn({ state }) {\n const comboBox = state.elements.reference as ComboBox;\n comboBox.closeIfNotVisible();\n },\n },\n {\n name: \"offset\",\n options: {\n offset: ({ placement }) => {\n if (placement.indexOf(\"top\") > -1) {\n return [0, -parseInt(getComputedStyle(comboBox).paddingTop, 10)];\n }\n if (placement.indexOf(\"bottom\") > -1) {\n return [\n 0,\n -parseInt(getComputedStyle(comboBox).paddingBottom, 10) -\n ((\n this.shadowRoot.querySelector(\n \".validation-message-wrapper\",\n ) as HTMLElement\n )?.offsetHeight ?? 0),\n ];\n }\n return [0, 0];\n },\n },\n },\n {\n name: \"adjustWidthIfNeeded\",\n enabled: true,\n phase: \"read\",\n fn({ state }) {\n const list = state.elements.popper as VirtualList;\n list.increaseWidthOnNextRenderIfNeeded();\n },\n },\n ],\n });\n }\n }\n\n private closeIfNotVisible(): void {\n const elementFromPoint = this.elementFromMiddleOfComboBox();\n // elementFromPoint might be the list itself in Safari, thus it needs to be checked as well (Fixes: 244485)\n if (\n !this.contains(elementFromPoint) &&\n !this.shadowRoot.contains(elementFromPoint) &&\n elementFromPoint !== this._list\n ) {\n if (this.triggerOnly) {\n this.value = null;\n }\n this.opened = false;\n }\n }\n\n private elementFromMiddleOfComboBox(): Element {\n const rect = this.getBoundingClientRect();\n return document.elementFromPoint(rect.left + rect.width / 2, rect.top + rect.height / 2);\n }\n\n private handleSelection = (event: CustomEvent) => {\n const selectedItem = this._dataProvider.items[event.detail.index];\n if (!event.detail.selected) {\n // null selection is not allowed via clicking inside the dropdown\n this._list.selectedIndices = [event.detail.index];\n }\n this.comboBoxValue = { index: this._itemCache.indexOf(selectedItem), item: selectedItem };\n this.dispatchSelectionChangeEvent();\n this.opened = false;\n };\n\n private async handleOpenedStateChange(): Promise<void> {\n this.inputElement.setAttribute(\"aria-expanded\", String(this.opened));\n if (this.opened) {\n if (!this.disabled) {\n this.ensureListAndPopperInitialized();\n\n const filterChanged = (this.filterText ?? \"\") !== (this._lastRequestedFilterText ?? \"\");\n if (this.isLazyLoadConfigured && (this.items.length == 0 || filterChanged)) {\n this.requestData(0, filterChanged);\n }\n\n this.updateDropdownSizes();\n this.ownerDocument.body.appendChild(this._list);\n this.updateFocusAndSelectedIndexFromValue();\n\n window.requestAnimationFrame(() => {\n if (this._popper) {\n this._popper.update();\n }\n });\n\n window.addEventListener(\"pointerdown\", this.handleWindowPointerDown);\n\n if (!this.allowCustomValue && !this._openedByFilterTextChange) {\n this.select();\n }\n }\n this._openedByFilterTextChange = false;\n } else {\n await this._list.updateComplete;\n if (this._popper) {\n await this._popper.update;\n }\n this.ownerDocument.body.removeChild(this._list);\n window.removeEventListener(\"pointerdown\", this.handleWindowPointerDown);\n this.updateValueOnClose();\n this.clearFilter();\n this.setSelectionRange(0, 0);\n this.inputElement.removeAttribute(\"aria-activedescendant\");\n\n if (this._popper) {\n this._popper.destroy();\n this._popper = null;\n }\n }\n }\n\n private updateValueOnClose(): void {\n const oldValue = this.comboBoxValue ?? \"\";\n if (this.nullSettingDisallowed && !this.value && this.comboBoxValue) {\n this.restorePreviousSelection();\n } else if (this.value !== (this.convertToDisplayValue(null) ?? \"\")) {\n // value change only if needed\n const focusedItem = this._dataProvider.items[this._list.focusIndex] as {\n disabled?: boolean;\n };\n if (focusedItem && (focusedItem[this.displayValuePath] ?? \"\") === this.value) {\n if (focusedItem.disabled) {\n this.restorePreviousSelection();\n return;\n }\n // 1. select focused item if the input's value is the same\n this.comboBoxValue = { index: this._itemCache.indexOf(focusedItem), item: focusedItem };\n } else if (this.allowCustomValue || !this.value) {\n // 2. set as a custom or empty value\n this.comboBoxValue = this.value;\n } else {\n // 3. try to search for an identical item\n const selectedIndex = this._itemCache.findIndex(\n (item) => (item[this.displayValuePath] ?? \"\") === this.value && !item.disabled,\n );\n if (selectedIndex > -1) {\n this.comboBoxValue = { index: selectedIndex, item: this._itemCache[selectedIndex] };\n } else {\n this.restorePreviousSelection(); // Fixes C1XRTYID\n }\n }\n } else {\n // Allow selecting another item with same caption but different id\n const focusedItem = this._dataProvider.items[this._list.focusIndex] as {\n id?: string;\n disabled?: boolean;\n };\n if (focusedItem && focusedItem.id != null) {\n if (focusedItem.disabled) {\n this.restorePreviousSelection();\n return;\n }\n if (\n !this.comboBoxValue ||\n this.isCustomValue(this.comboBoxValue) ||\n this.comboBoxValue.item.id != focusedItem.id\n ) {\n this.comboBoxValue = { index: this._itemCache.indexOf(focusedItem), item: focusedItem };\n }\n }\n }\n if (oldValue !== (this.comboBoxValue ?? \"\")) {\n this.dispatchSelectionChangeEvent();\n }\n this.updateIcon(this.isCustomValue(this.comboBoxValue) ? null : this.comboBoxValue?.item);\n }\n\n private restorePreviousSelection() {\n this.updateInputValue(null);\n }\n\n private updateFocusAndSelectedIndexFromValue(): void {\n if (this.comboBoxValue && !this.isCustomValue(this.comboBoxValue) && !this._openedByFilterTextChange) {\n let index = this.comboBoxValue.index;\n if (index == -1 || this.isLazyLoadConfigured) {\n index = this.items.indexOf(this.comboBoxValue.item);\n if (index == -1) {\n const selectedId = this.comboBoxValue.item.id;\n if (selectedId != null) {\n index = this.items.findIndex((item) => item.id == selectedId);\n }\n }\n }\n this._list.focusIndex = index;\n this._list.selectedIndices = index == -1 ? [] : [index];\n } else {\n this._list.focusIndex = -1;\n this._list.selectedIndices = [];\n }\n this.updateActiveDescendant();\n }\n\n private handleWindowPointerDown = (event: PointerEvent) => {\n const contains = event.target instanceof Node && this.contains(event.target);\n if (!contains && this.opened && event.composedPath().indexOf(this._list) === -1) {\n if (this.triggerOnly) {\n this.value = null;\n }\n this.opened = false;\n }\n };\n\n private handleKeyDown = (event: KeyboardEvent) => {\n switch (event.key) {\n case \"Down\":\n case \"ArrowDown\": {\n event.preventDefault();\n this.navigateInList(+1);\n break;\n }\n case \"Up\":\n case \"ArrowUp\": {\n event.preventDefault();\n this.navigateInList(-1);\n break;\n }\n case \"Enter\": {\n if (this.opened) {\n event.preventDefault();\n event.stopPropagation();\n this.opened = false;\n }\n break;\n }\n case \"Escape\": {\n if (this.opened) {\n event.preventDefault();\n event.stopPropagation();\n if (\n this._list.selectedIndices.indexOf(this._list.focusIndex) > -1 &&\n this._dataProvider.items.length > this._list.focusIndex\n ) {\n this.opened = false;\n } else {\n this.clearFilter();\n this.updateInputValue(null);\n this.updateFocusAndSelectedIndexFromValue();\n if (!this._list.selectedIndices.includes(this._list.focusIndex)) {\n this._list.selectedIndices.push(this._list.focusIndex);\n }\n }\n }\n break;\n }\n case \"Tab\": {\n if (this.opened) {\n if (this.triggerOnly) {\n this.value = null;\n }\n this.opened = false;\n }\n break;\n }\n }\n };\n\n private navigateInList(offset: number): void {\n if (!this.opened) {\n this.opened = true;\n } else {\n if (this._list.focusIndex == null) {\n if (offset > 0) {\n this._list.focusIndex = 0;\n } else {\n this._list.focusIndex = Math.max(0, this._dataProvider.items.length - 1);\n }\n } else {\n this._list.focusIndex = Math.max(\n 0,\n Math.min(this._dataProvider.items.length - 1, this._list.focusIndex + offset),\n );\n }\n this.updateInputValue(this._dataProvider.items[this._list.focusIndex] as ItemData | any);\n this.updateActiveDescendant();\n if (!this.allowCustomValue) {\n this.select();\n }\n }\n }\n\n private updateActiveDescendant() {\n const focusedListItem = this._list && this._list.getListItem(this._list.focusIndex);\n if (focusedListItem) {\n this.inputElement.setAttribute(\"aria-activedescendant\", focusedListItem.id);\n } else {\n this.inputElement.removeAttribute(\"aria-activedescendant\");\n }\n }\n\n private updateInputValue(item: ItemData): void {\n this.updateComplete.then(() => {\n this.value = this.convertToDisplayValue(item);\n if (item) {\n this.updateIcon(item);\n } else {\n this.updateIconFromCurrentValue();\n }\n });\n }\n\n private convertToDisplayValue(item: ItemData): string {\n if (item) {\n return item[this.displayValuePath];\n } else if (this.comboBoxValue) {\n if (this.isCustomValue(this.comboBoxValue)) {\n return this.comboBoxValue;\n } else {\n return this.comboBoxValue.item[this.displayValuePath];\n }\n } else {\n return null;\n }\n }\n\n protected fireValueChange(immediate?: boolean): void {\n if (immediate) {\n if (this.filterText !== this.value) {\n const effectiveFilterChange = (this.filterText ?? \"\") !== this.value;\n this.filterText = this.value;\n this.updateIcon(null);\n if (!this.opened) {\n this._openedByFilterTextChange = true;\n this.opened = true;\n }\n if (effectiveFilterChange) {\n this.dispatchFilterChangeEvent();\n this.debouncedFilterItemsInMemory();\n }\n }\n }\n // consume both change events triggered from input, combo box provides a different API for that\n }\n\n private clearValue(): void {\n if (!this.nullSettingDisallowed) {\n this.value = null;\n this.inputElement.removeAttribute(\"aria-activedescendant\");\n if (this._list) {\n this._list.selectedIndices = [];\n }\n this.clearFilter();\n if (this.comboBoxValue) {\n this.comboBoxValue = null;\n this.dispatchSelectionChangeEvent();\n }\n this.requestUpdate();\n }\n }\n\n private clearFilter(): void {\n if (this.filterText != null) {\n this.filterText = undefined;\n this.filterItemsInMemory();\n this.dispatchFilterChangeEvent();\n this.updateIconFromCurrentValue();\n }\n }\n\n private updateDropdownSizes(): void {\n const viewportHeight = window.innerHeight || document.documentElement.clientHeight;\n const overlayMaxHeight = (viewportHeight - this.offsetHeight) * 0.5;\n Object.assign(this._list.style, {\n maxHeight: `${overlayMaxHeight}px`,\n minWidth: `${Math.max(this.offsetWidth, this.minimumOverlayWidth)}px`,\n maxWidth: `max(50vw, ${this.offsetWidth}px)`,\n });\n }\n\n private updateListId() {\n if (this.inputElement && this._list) {\n this._list.id = this.id + \"_list\";\n this.inputElement.setAttribute(\"aria-controls\", this._list.id);\n }\n }\n\n private isCustomValue(value: ComboBoxValue | string): value is string {\n return typeof value === \"string\";\n }\n\n private dispatchSelectionChangeEvent(): void {\n this.updateComplete\n .then(() => {\n this.dispatchEvent(\n new CustomEvent<ISelectionEvent>(\"selection-change\", {\n detail: {\n selection: this.comboBoxValue,\n isCustomValue: this.isCustomValue(this.comboBoxValue),\n },\n }),\n );\n if (this.triggerOnly) {\n this.comboBoxValue = null;\n } else {\n const comboBoxValue = this.comboBoxValue;\n if (this.isCustomValue(comboBoxValue)) {\n this.setFormValue(comboBoxValue);\n } else {\n this.setFormValue(comboBoxValue?.item?.caption);\n }\n }\n })\n .catch((e) => {\n console.error(\"Could not dispatch selection change event due to:\", e);\n });\n }\n\n private dispatchFilterChangeEvent(): void {\n this.dispatchEvent(\n new CustomEvent<IFilterChangeEvent>(\"filter-change\", {\n detail: { value: this.filterText },\n composed: true,\n }),\n );\n this.debouncedRequestData(0);\n }\n\n private get isLazyLoadConfigured(): boolean {\n return !!this._onDataRequest;\n }\n\n /**\n * Used only when lazy loading is configured.\n */\n private debouncedRequestData = debounce(this.requestData.bind(this), 250);\n private requestData(page: number, filterChanged?: boolean) {\n if (filterChanged == null) {\n filterChanged = (this.filterText ?? \"\") !== (this._lastRequestedFilterText ?? \"\");\n }\n if (this.isLazyLoadConfigured) {\n if (!this.opened) {\n if (filterChanged) {\n this._dataProvider.items = [];\n this._itemCache = [];\n }\n return;\n }\n if (this._lastRequestedPage == page && !filterChanged) {\n return;\n }\n if (this._pendingDataRequest) {\n this._pendingDataRequest.cancel(ComboBox.DATA_REQUEST_CANCELLED);\n }\n const cancellationPromise = new Promise<DataResponse>((_resolve, reject) => {\n this._pendingDataRequest = { cancel: reject };\n });\n this._lastRequestedPage = page;\n this._lastRequestedFilterText = this.filterText;\n this.setAttribute(\"loading\", \"\");\n Promise.race([cancellationPromise, this._onDataRequest(this._lastRequestedFilterText, page)])\n .then((dataResponse) => {\n if (this.filterText == this._lastRequestedFilterText && this._lastRequestedPage == page) {\n this._dataProvider.finalSizeIsKnown = dataResponse.finalSizeIsKnown;\n if (filterChanged) {\n this._dataProvider.items = dataResponse.items;\n this._itemCache = dataResponse.items;\n } else {\n this._dataProvider.addItems(dataResponse.items);\n this._itemCache = this._dataProvider.items;\n }\n if (this._list) {\n this._list.itemCount = this._dataProvider.items.length;\n }\n if (this._popper && this.opened) {\n if (this.comboBoxValue && !this.isCustomValue(this.comboBoxValue)) {\n const selectedItem = this.comboBoxValue.item;\n if (\n this._list.selectedIndices.length == 0 ||\n this.items[this._list.selectedIndices[0]] != selectedItem\n ) {\n let index = this.items.indexOf(selectedItem);\n if (index == -1) {\n const selectedId = selectedItem.id;\n if (selectedId != null) {\n index = this.items.findIndex((item) => item.id == selectedId);\n }\n }\n this.comboBoxValue.index = index;\n this._list.selectedIndices = index == -1 ? [] : [index];\n }\n }\n this.updateDropdownSizes();\n this._popper.update();\n }\n }\n this._pendingDataRequest = null;\n this.removeAttribute(\"loading\");\n })\n .catch((e) => {\n if (e !== ComboBox.DATA_REQUEST_CANCELLED) {\n console.error(\n `Data could not be loaded for filter \"${this._lastRequestedFilterText}\" and page number \"${page}\" due to the following error:\\n${e}`,\n );\n this._dataProvider.finalSizeIsKnown = true;\n\n if (this.items.length == 0) {\n this.opened = false;\n } else if (this._list) {\n this._list.itemCount = this.items.length;\n }\n this.removeAttribute(\"loading\");\n }\n this._pendingDataRequest = null;\n });\n }\n }\n\n private get defaultSlot(): HTMLSlotElement {\n return this.shadowRoot.querySelector(\"#default-slot\");\n }\n\n private onDefaultSlotChange(): void {\n this._declarativeItems = this.defaultSlot.assignedElements() as HTMLElement[];\n if (this._declarativeItems.length > 0) {\n this.finalSizeIsKnown = true;\n this.itemGenerator = (_data, index) => {\n return this._declarativeItems[index].cloneNode(true) as HTMLElement;\n };\n this.items = this._declarativeItems.map((item) => {\n const data = {\n caption: item.getAttribute(\"caption\"),\n description: item.getAttribute(\"description\"),\n };\n if (\"caption\" != this.displayValuePath && \"description\" != this.displayValuePath) {\n data[this.displayValuePath] =\n item[this.displayValuePath] || item.getAttribute(this.displayValuePath);\n }\n return data;\n });\n }\n }\n}\n\nComboBox.ensureDefined();\n"],"names":["toggleSvg","clearSvg","TAG_NAME","debounce","func","delay","timeout","args","idCounter","_ComboBox","_a","SDInput","filterText","item","lowerCaseFilter","generator","event","selectedItem","ListDataProvider","value","items","onDataRequest","page","css","unsafeCSS","style","html","name","oldValue","newValue","changedProperties","selectedIndex","SelectionType","iconEl","ImageTools","clearButtonTemplate","toggleButtonTemplate","filteredInMemory","index","selectedId","VirtualList","comboBox","createPopper","state","placement","elementFromPoint","rect","filterChanged","focusedItem","offset","focusedListItem","immediate","effectiveFilterChange","overlayMaxHeight","comboBoxValue","e","cancellationPromise","_resolve","reject","dataResponse","_data","data","__decorateClass","property","ComboBox"],"mappings":";;;;;;;moKAAeA,IAAA;AAAA;AAAA;AAAA,GCAAC,IAAA;AAAA;AAAA;AAAA;;;;;;ACQf,MAAMC,IAAW;AAEjB,SAASC,EAAYC,GAAiCC,GAA4B;AAC1E,MAAAC;AACJ,SAAO,YAAaC,GAAW;AAC3B,IAAID,KAAW,QACX,aAAaA,CAAO,GAExBA,IAAU,OAAO,WAAW,MAAMF,EAAK,GAAGG,CAAI,GAAGF,CAAK;AAAA,EAAA;AAE9D;AAuBA,IAAIG,IAAY;;AAuChB,MAAqBC,KAArBC,IAAA,cAAsCC,EAAQ;AAAA,EAgE1C,cAAc;AACJ,aApDV,KAAO,SAAS,IAEhB,KAAO,aAAa,IAUpB,KAAO,mBAAmB,WAInB,KAAA,KAAaD,EAAS,KAAK,MAAMF,KAEjC,KAAA,iBAAiC,CAACI,GAAYC,MAAS;AAC1D,UAAI,CAACD;AACM,eAAA;AAEL,YAAAE,IAAkBF,EAAW;AAI/B,aAHA,UAAOC,EAAK,WAAW,YAAYA,EAAK,QAAQ,YAAY,EAAE,SAASC,CAAe,KAGtF,OAAOD,EAAK,eAAe,YAAYA,EAAK,YAAY,YAAY,EAAE,SAASC,CAAe;AAAA,IAG3F,GAIX,KAAO,sBAAsB,KAQ7B,KAAQ,iBAAgCC,GACxC,KAAQ,aAAoB,IA+S5B,KAAQ,+BAA+BZ,EAAS,KAAK,oBAAoB,KAAK,IAAI,GAAG,GAAG,GA+IhF,KAAA,kBAAkB,CAACa,MAAuB;AAC9C,YAAMC,IAAe,KAAK,cAAc,MAAMD,EAAM,OAAO,KAAK;AAC5D,MAACA,EAAM,OAAO,aAEd,KAAK,MAAM,kBAAkB,CAACA,EAAM,OAAO,KAAK,IAE/C,KAAA,gBAAgB,EAAE,OAAO,KAAK,WAAW,QAAQC,CAAY,GAAG,MAAMA,KAC3E,KAAK,6BAA6B,GAClC,KAAK,SAAS;AAAA,IAAA,GAmIV,KAAA,0BAA0B,CAACD,MAAwB;AAEnD,MAAA,EADaA,EAAM,kBAAkB,QAAQ,KAAK,SAASA,EAAM,MAAM,MAC1D,KAAK,UAAUA,EAAM,eAAe,QAAQ,KAAK,KAAK,MAAM,OACrE,KAAK,gBACL,KAAK,QAAQ,OAEjB,KAAK,SAAS;AAAA,IAClB,GAGI,KAAA,gBAAgB,CAACA,MAAyB;AAC9C,cAAQA,EAAM,KAAK;AAAA,QACf,KAAK;AAAA,QACL,KAAK,aAAa;AACd,UAAAA,EAAM,eAAe,GACrB,KAAK,eAAe,CAAE;AACtB;AAAA,QACJ;AAAA,QACA,KAAK;AAAA,QACL,KAAK,WAAW;AACZ,UAAAA,EAAM,eAAe,GACrB,KAAK,eAAe,EAAE;AACtB;AAAA,QACJ;AAAA,QACA,KAAK,SAAS;AACV,UAAI,KAAK,WACLA,EAAM,eAAe,GACrBA,EAAM,gBAAgB,GACtB,KAAK,SAAS;AAElB;AAAA,QACJ;AAAA,QACA,KAAK,UAAU;AACX,UAAI,KAAK,WACLA,EAAM,eAAe,GACrBA,EAAM,gBAAgB,GAElB,KAAK,MAAM,gBAAgB,QAAQ,KAAK,MAAM,UAAU,IAAI,MAC5D,KAAK,cAAc,MAAM,SAAS,KAAK,MAAM,aAE7C,KAAK,SAAS,MAEd,KAAK,YAAY,GACjB,KAAK,iBAAiB,IAAI,GAC1B,KAAK,qCAAqC,GACrC,KAAK,MAAM,gBAAgB,SAAS,KAAK,MAAM,UAAU,KAC1D,KAAK,MAAM,gBAAgB,KAAK,KAAK,MAAM,UAAU;AAIjE;AAAA,QACJ;AAAA,QACA,KAAK,OAAO;AACR,UAAI,KAAK,WACD,KAAK,gBACL,KAAK,QAAQ,OAEjB,KAAK,SAAS;AAElB;AAAA,QACJ;AAAA,MACJ;AAAA,IAAA,GA0KJ,KAAQ,uBAAuBb,EAAS,KAAK,YAAY,KAAK,IAAI,GAAG,GAAG,GAryB/D,KAAA,gBAAgB,IAAIe,KACzB,KAAK,cAAc,mBAAmB;AAAA,EAC1C;AAAA,EAEA,IAAW,mCAA4C;AACnD,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAW,iCAAiCC,GAAgB;AAChD,YAAA;AAAA,MACJ;AAAA,IAAA,GAEJ,KAAK,cAAcA;AAAA,EACvB;AAAA,EAEA,IAAW,gBAA+B;AACtC,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAW,cAAcA,GAAsB;AAC3C,SAAK,iBAAiBA,GAClB,KAAK,UACA,KAAA,MAAM,gBAAgB,KAAK;AAAA,EAExC;AAAA,EAEA,IAAW,QAAe;AACtB,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAW,MAAMC,GAAc;AAC3B,SAAK,aAAaA,GACd,KAAK,yBACL,KAAK,cAAc,QAAQA,GAC3B,KAAK,qBAAqB,OAE1B,KAAK,SAAS,CAAC,KAAK,iBACpB,KAAK,6BAA6B,GAEtC,KAAK,oBAAoB,GACrB,KAAK,UAAU,KAAK,WACpB,KAAK,QAAQ;EAErB;AAAA,EAEA,IAAW,mBAA4B;AACnC,WAAO,KAAK,cAAc;AAAA,EAC9B;AAAA,EAEA,IAAW,iBAAiBD,GAAgB;AACxC,SAAK,cAAc,mBAAmBA;AAAA,EAC1C;AAAA,EAEO,kBAAkBE,GAAkF;AACvG,QAAI,CAACA;AACK,YAAA,IAAI,MAAM,kFAAkF;AAEtG,SAAK,cAAc,mBAAmB,IACtC,KAAK,iBAAiBA,GACjB,KAAA,cAAc,gBAAgB,CAACC,MAAiB;AAC5C,WAAA,YAAYA,GAAM,EAAK;AAAA,IAAA;AAAA,EAEpC;AAAA,EAEA,IAAW,gBAAwC;AAC/C,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAW,cAAcH,GAA+B;AACpD,SAAK,iBAAiBA,GACtB,KAAK,iBAAiB,IAAI,GAC1B,KAAK,eAAe;AAAA,EACxB;AAAA,EAEA,IAAW,gBAAwB;AAC/B,WAAI,KAAK,cAAc,KAAK,aAAa,KAAK,CAAC,KAAK,gBACzC,KAEJ,KAAK,cAAc;AAAA,EAC9B;AAAA,EAEA,IAAW,eAAuB;AAC9B,WAAO,KAAK;AAAA,EAChB;AAAA,EAEO,OAAa;AAChB,SAAK,SAAS;AAAA,EAClB;AAAA,EAEA,WAAW,SAAS;AACT,WAAA;AAAA,MACHI;AAAA,kBACMC,EAAUC,CAAK,CAAC;AAAA;AAAA,IAAA;AAAA,EAG9B;AAAA,EAEO,uBAA6B;AAChC,UAAM,qBAAqB,GACvB,KAAK,YACL,KAAK,QAAQ,WACb,KAAK,UAAU;AAAA,EAEvB;AAAA,EAEO,SAAyB;AACrB,WAAAC;AAAA,cACD,MAAM,QAAQ;AAAA,gCACI,KAAK,mBAAmB;AAAA;AAAA,EAEpD;AAAA,EAEO,yBAAyBC,GAAcC,GAAkBC,GAAwB;AAEpF,QADM,MAAA,yBAAyBF,GAAMC,GAAUC,CAAQ,GACnDD,MAAaC;AACb,cAAQF,GAAM;AAAA,QACV,KAAK,UAAU;AACX,eAAK,wBAAwB;AAC7B;AAAA,QACJ;AAAA,QACA,KAAK,eAAe;AAChB,UAAI,KAAK,UACA,KAAA,MAAM,aAAa,KAAK;AAEjC;AAAA,QACJ;AAAA,QACA,KAAK,MAAM;AACP,eAAK,aAAa;AAClB;AAAA,QACJ;AAAA,MACJ;AAAA,EAER;AAAA,EAEO,aAAaG,GAAyC;AACzD,UAAM,aAAaA,CAAiB,GAEhC,KAAK,SAAS,CAAC,KAAK,iBACpB,KAAK,6BAA6B,GAEtC,OAAO,sBAAsB,MAAM;AAC/B,WAAK,iBAAiB,GACtB,KAAK,kBAAkB,GACvB,KAAK,eAAe,GAEf,KAAA,iBAAiB,SAAS,MAAM;AAC7B,QAAC,KAAK,aACD,KAAA,SAAS,CAAC,KAAK;AAAA,MACxB,CACH,GACI,KAAA,iBAAiB,WAAW,CAACd,MAAyB;AACnD,QAAC,KAAK,YACN,KAAK,cAAcA,CAAK;AAAA,MAC5B,CACH;AAAA,IAAA,CACJ,GACI,KAAA,aAAa,aAAa,QAAQ,UAAU,GAC5C,KAAA,aAAa,aAAa,qBAAqB,MAAM;AAAA,EAC9D;AAAA,EAEQ,+BAA+B;AACnC,QAAI,KAAK,OAAO;AACN,YAAAe,IAAgB,KAAK,WAAW;AAAA,QAClC,CAAClB,OAAUA,EAAK,KAAK,gBAAgB,KAAK,QAAQ,KAAK;AAAA,MAAA;AAE3D,MAAIkB,IAAgB,KACX,KAAA,iBAAiB,EAAE,OAAOA,GAAe,MAAM,KAAK,WAAWA,CAAa,MAC1E,KAAK,mBACZ,KAAK,iBAAiB,KAAK,QAE3B,KAAK,iBAAiB,MAE1B,KAAK,eAAe,GACpB,KAAK,2BAA2B;AAAA,IACpC;AAAA,EACJ;AAAA,EAEO,QAAQD,GAAyC;AACpD,UAAM,QAAQA,CAAiB,GAC3BA,EAAkB,IAAI,UAAU,MAC5B,KAAK,WACD,KAAK,SAAS,QACd,KAAK,gBAAgB,IAElB,KAAK,SAAS,SACrB,KAAK,MAAM,UACX,KAAK,QAAQ,QAGjBA,EAAkB,IAAI,aAAa,KACnC,KAAK,eAAe,GAEpBA,EAAkB,IAAI,aAAa,KAAK,KAAK,UAC7C,KAAK,MAAM,gBAAgB,KAAK,cAAcE,EAAc,cAAcA,EAAc;AAAA,EAEhG;AAAA,EAEQ,kBAAkB;AACjB,SAAA,QAAQ,SAAS,cAAc,KAAK,GACzC,KAAK,MAAM,YAAY,gBACvB,KAAK,MAAM,OAAO;AACZ,UAAAC,IAAS,SAAS,cAAc,KAAK;AAC3C,IAAAA,EAAO,MAAM,mBAAmB,aAChCA,EAAO,MAAM,qBAAqB,UAClCA,EAAO,MAAM,iBAAiB,SAC9BA,EAAO,MAAM,SAAS,QACtBA,EAAO,MAAM,QAAQ,QAChB,KAAA,MAAM,YAAYA,CAAM,GAC7B,KAAK,MAAM,OAAO,UACb,KAAA,YAAY,KAAK,KAAK,GAC3B,KAAK,2BAA2B;AAAA,EACpC;AAAA,EAEQ,6BAA6B;;AACjC,IAAI,KAAK,cAAc,KAAK,aAAa,IACrC,KAAK,WAAW,IAAI,IAEf,KAAA,YAAWvB,IAAA,KAAK,kBAAL,gBAAAA,EAAoB,IAAI;AAAA,EAEhD;AAAA,EAEQ,WAAWG,GAAM;AACrB,QAAI,KAAK;AACL,UAAIA,MAASA,EAAK,QAAQA,EAAK,kBAAkB;AAC7C,cAAMI,IAAeJ;AAIjB,QAAAI,EAAa,cAAc,QAC3B,KAAK,MAAM,QAAQ,IACnB,KAAK,MAAM,YAAY,OAEvB,KAAK,MAAM,QAAQA,EAAa,WAAW,iBAAiB,KAAK,IACjE,KAAK,MAAM,YAAYA,EAAa,WAAW,sBAAsB,KAAK,KAEzE,KAAA,MAAM,MAAM,kBAAkBA,EAAa,qBAC3C,KAAA,MAAM,MAAM,UAAU,IAChBiB,EAAA,UAAU,KAAK,MAAM,cAAc,KAAK,GAAGrB,EAAK,MAAMA,EAAK,eAAe;AAAA,MAAA;AACzF,QAAW,KAAK,UACP,KAAA,MAAM,MAAM,UAAU;AAAA,EAGvC;AAAA,EAEQ,iBAAiB;AACrB,IAAI,KAAK,eAAgB,KAAK,iBAAiB,QAAQ,KAAK,iBAAiB,MACpE,KAAA,aAAa,aAAa,EAAE,GAC7B,KAAK,iBACA,KAAA,aAAa,MAAM,UAAU,OAGtC,KAAK,gBAAgB,WAAW;AAAA,EAExC;AAAA,EAEU,cAAc;AACpB,WAAO,MAAM,YAAY,KAAM,KAAK,iBAAiB,QAAQ,KAAK,iBAAiB;AAAA,EACvF;AAAA,EAEQ,mBAAyB;AACvB,UAAAsB,IAAsB,SAAS,cAAc,UAAU;AAC7D,IAAAA,EAAoB,YAAYlC,GAC3B,KAAA,eAAekC,EAAoB,QAAQ,YAC3C,KAAA,YAAY,KAAK,YAAY,GAElC,KAAK,aAAa,iBAAiB,SAAS,CAACnB,MAAU;AACnD,MAAAA,EAAM,eAAe,GACrBA,EAAM,gBAAgB,GACtB,KAAK,SAAS,IACd,KAAK,WAAW;AAAA,IAAA,CACnB;AAAA,EACL;AAAA,EAEQ,oBAA0B;AACxB,UAAAoB,IAAuB,SAAS,cAAc,UAAU;AAC9D,IAAAA,EAAqB,YAAYpC,GAC5B,KAAA,gBAAgBoC,EAAqB,QAAQ,YAC7C,KAAA,YAAY,KAAK,aAAa,GAEnC,KAAK,cAAc,iBAAiB,SAAS,CAACpB,MAAU;AACpD,MAAAA,EAAM,eAAe,GACrBA,EAAM,gBAAgB,GACjB,KAAA,SAAS,CAAC,KAAK,QACpB,KAAK,OAAO;AAAA,IAAA,CACf;AAAA,EACL;AAAA,EAGQ,sBAA4B;AAChC,QAAI,KAAK;AACL;AAEJ,QAAIqB,IAAmB;AAYvB,QAXI,KAAK,eACD,KAAK,kBACL,KAAK,cAAc,QAAQ,KAAK,WAAW,OAAO,CAACxB,MACxCA,EAAK,KAAK,cAAc,KAAK,OAAOA,EAAK,KAAK,cAAc,CAAC,EAAE,QAAQ,KAAK,UAAU,IAAI,EACpG,GACkBwB,IAAA,MACZ,KAAK,mBACZ,KAAK,cAAc,QAAQ,KAAK,WAAW,OAAO,CAACxB,MAAS,KAAK,eAAe,KAAK,YAAYA,CAAI,CAAC,GACnFwB,IAAA,MAGvB,CAACA;AACI,WAAA,cAAc,QAAQ,KAAK,YAC5B,KAAK,SACL,KAAK,qCAAqC;AAAA,aAEvC,KAAK;AACZ,UAAI,KAAK,iBAAiB,CAAC,KAAK,cAAc,KAAK,aAAa,GAAG;AAC/D,YAAIC,IAAQ,KAAK,cAAc,MAAM,QAAQ,KAAK,cAAc,IAAI;AACpE,YAAIA,KAAS,IAAI;AACP,gBAAAC,IAAa,KAAK,cAAc,KAAK;AAC3C,UAAIA,KAAc,SACND,IAAA,KAAK,cAAc,MAAM,UAAU,CAACzB,MAAcA,EAAK,MAAM0B,CAAU;AAAA,QAEvF;AACA,aAAK,MAAM,aAAaD,GACxB,KAAK,MAAM,kBAAkBA,KAAS,KAAK,CAAC,IAAI,CAACA,CAAK;AAAA,MAAA;AAEtD,aAAK,MAAM,aAAa;AAG5B,IAAA,KAAK,UAAU,KAAK,WACpB,KAAK,QAAQ;EAErB;AAAA,EAEQ,iCAAuC;AAoBvC,QAnBC,KAAK,UACN,KAAK,QAAQ,SAAS,cAAcE,EAAY,EAAE,GAClD,KAAK,aAAa,GACb,KAAA,MAAM,UAAU,IAAI,oBAAoB,GACxC,KAAA,MAAM,aAAa,KAAK,YACxB,KAAA,MAAM,gBAAgB,KAAK,eAChC,KAAK,MAAM,gBAAgB,KAAK,cAAcR,EAAc,cAAcA,EAAc,QACnF,KAAA,MAAM,aAAa,gBAAgB,EAAE,GACnC,OAAA,OAAO,KAAK,MAAM,OAAO;AAAA,MAC5B,QAAQ;AAAA,MACR,WAAW;AAAA;AAAA;AAAA,MAGX,YAAY;AAAA,MACZ,WAAW;AAAA,IAAA,CACd,GACD,KAAK,MAAM,iBAAiB,aAAa,KAAK,eAAe,GACxD,KAAA,cAAc,YAAY,KAAK,KAAK,IAEzC,CAAC,KAAK,SAAS;AAEf,YAAMS,IAAW;AACjB,WAAK,UAAUC,EAAa,MAAM,KAAK,OAAO;AAAA,QAC1C,WAAW;AAAA,QACX,WAAW;AAAA,UACP;AAAA,YACI,MAAM;AAAA,YACN,SAAS;AAAA,cACL,iBAAiB;AAAA,YACrB;AAAA,UACJ;AAAA,UACA;AAAA,YACI,MAAM;AAAA,YACN,SAAS;AAAA,UACb;AAAA,UACA;AAAA,YACI,MAAM;AAAA,YACN,SAAS;AAAA,YACT,OAAO;AAAA,YACP,GAAG,EAAE,OAAAC,KAAS;AAEVF,cADiBE,EAAM,SAAS,UACvB,kBAAkB;AAAA,YAC/B;AAAA,UACJ;AAAA,UACA;AAAA,YACI,MAAM;AAAA,YACN,SAAS;AAAA,cACL,QAAQ,CAAC,EAAE,WAAAC,QAAgB;;AACvB,uBAAIA,EAAU,QAAQ,KAAK,IAAI,KACpB,CAAC,GAAG,CAAC,SAAS,iBAAiBH,CAAQ,EAAE,YAAY,EAAE,CAAC,IAE/DG,EAAU,QAAQ,QAAQ,IAAI,KACvB;AAAA,kBACH;AAAA,kBACA,CAAC,SAAS,iBAAiBH,CAAQ,EAAE,eAAe,EAAE,OAE9C/B,IAAA,KAAK,WAAW;AAAA,oBACZ;AAAA,kBAAA,MADJ,gBAAAA,EAGD,iBAAgB;AAAA,gBAAA,IAGxB,CAAC,GAAG,CAAC;AAAA,cAChB;AAAA,YACJ;AAAA,UACJ;AAAA,UACA;AAAA,YACI,MAAM;AAAA,YACN,SAAS;AAAA,YACT,OAAO;AAAA,YACP,GAAG,EAAE,OAAAiC,KAAS;AAEV,cADaA,EAAM,SAAS,OACvB,kCAAkC;AAAA,YAC3C;AAAA,UACJ;AAAA,QACJ;AAAA,MAAA,CACH;AAAA,IACL;AAAA,EACJ;AAAA,EAEQ,oBAA0B;AACxB,UAAAE,IAAmB,KAAK;AAE9B,IACI,CAAC,KAAK,SAASA,CAAgB,KAC/B,CAAC,KAAK,WAAW,SAASA,CAAgB,KAC1CA,MAAqB,KAAK,UAEtB,KAAK,gBACL,KAAK,QAAQ,OAEjB,KAAK,SAAS;AAAA,EAEtB;AAAA,EAEQ,8BAAuC;AACrC,UAAAC,IAAO,KAAK;AACX,WAAA,SAAS,iBAAiBA,EAAK,OAAOA,EAAK,QAAQ,GAAGA,EAAK,MAAMA,EAAK,SAAS,CAAC;AAAA,EAC3F;AAAA,EAaA,MAAc,0BAAyC;AAEnD,QADA,KAAK,aAAa,aAAa,iBAAiB,OAAO,KAAK,MAAM,CAAC,GAC/D,KAAK,QAAQ;AACT,UAAA,CAAC,KAAK,UAAU;AAChB,aAAK,+BAA+B;AAEpC,cAAMC,KAAiB,KAAK,cAAc,SAAS,KAAK,4BAA4B;AACpF,QAAI,KAAK,yBAAyB,KAAK,MAAM,UAAU,KAAKA,MACnD,KAAA,YAAY,GAAGA,CAAa,GAGrC,KAAK,oBAAoB,GACzB,KAAK,cAAc,KAAK,YAAY,KAAK,KAAK,GAC9C,KAAK,qCAAqC,GAE1C,OAAO,sBAAsB,MAAM;AAC/B,UAAI,KAAK,WACL,KAAK,QAAQ;QACjB,CACH,GAEM,OAAA,iBAAiB,eAAe,KAAK,uBAAuB,GAE/D,CAAC,KAAK,oBAAoB,CAAC,KAAK,6BAChC,KAAK,OAAO;AAAA,MAEpB;AACA,WAAK,4BAA4B;AAAA,IAAA;AAEjC,YAAM,KAAK,MAAM,gBACb,KAAK,WACL,MAAM,KAAK,QAAQ,QAEvB,KAAK,cAAc,KAAK,YAAY,KAAK,KAAK,GACvC,OAAA,oBAAoB,eAAe,KAAK,uBAAuB,GACtE,KAAK,mBAAmB,GACxB,KAAK,YAAY,GACZ,KAAA,kBAAkB,GAAG,CAAC,GACtB,KAAA,aAAa,gBAAgB,uBAAuB,GAErD,KAAK,YACL,KAAK,QAAQ,WACb,KAAK,UAAU;AAAA,EAG3B;AAAA,EAEQ,qBAA2B;;AACzB,UAAAnB,IAAW,KAAK,iBAAiB;AACvC,QAAI,KAAK,yBAAyB,CAAC,KAAK,SAAS,KAAK;AAClD,WAAK,yBAAyB;AAAA,aACvB,KAAK,WAAW,KAAK,sBAAsB,IAAI,KAAK,KAAK;AAEhE,YAAMoB,IAAc,KAAK,cAAc,MAAM,KAAK,MAAM,UAAU;AAGlE,UAAIA,MAAgBA,EAAY,KAAK,gBAAgB,KAAK,QAAQ,KAAK,OAAO;AAC1E,YAAIA,EAAY,UAAU;AACtB,eAAK,yBAAyB;AAC9B;AAAA,QACJ;AAEK,aAAA,gBAAgB,EAAE,OAAO,KAAK,WAAW,QAAQA,CAAW,GAAG,MAAMA;MACnE,WAAA,KAAK,oBAAoB,CAAC,KAAK;AAEtC,aAAK,gBAAgB,KAAK;AAAA,WACvB;AAEG,cAAAjB,IAAgB,KAAK,WAAW;AAAA,UAClC,CAAClB,OAAUA,EAAK,KAAK,gBAAgB,KAAK,QAAQ,KAAK,SAAS,CAACA,EAAK;AAAA,QAAA;AAE1E,QAAIkB,IAAgB,KACX,KAAA,gBAAgB,EAAE,OAAOA,GAAe,MAAM,KAAK,WAAWA,CAAa,MAEhF,KAAK,yBAAyB;AAAA,MAEtC;AAAA,IAAA,OACG;AAEH,YAAMiB,IAAc,KAAK,cAAc,MAAM,KAAK,MAAM,UAAU;AAI9D,UAAAA,KAAeA,EAAY,MAAM,MAAM;AACvC,YAAIA,EAAY,UAAU;AACtB,eAAK,yBAAyB;AAC9B;AAAA,QACJ;AACA,SACI,CAAC,KAAK,iBACN,KAAK,cAAc,KAAK,aAAa,KACrC,KAAK,cAAc,KAAK,MAAMA,EAAY,QAErC,KAAA,gBAAgB,EAAE,OAAO,KAAK,WAAW,QAAQA,CAAW,GAAG,MAAMA;MAElF;AAAA,IACJ;AACI,IAAApB,OAAc,KAAK,iBAAiB,OACpC,KAAK,6BAA6B,GAEjC,KAAA,WAAW,KAAK,cAAc,KAAK,aAAa,IAAI,QAAOlB,IAAA,KAAK,kBAAL,gBAAAA,EAAoB,IAAI;AAAA,EAC5F;AAAA,EAEQ,2BAA2B;AAC/B,SAAK,iBAAiB,IAAI;AAAA,EAC9B;AAAA,EAEQ,uCAA6C;AAC7C,QAAA,KAAK,iBAAiB,CAAC,KAAK,cAAc,KAAK,aAAa,KAAK,CAAC,KAAK,2BAA2B;AAC9F,UAAA4B,IAAQ,KAAK,cAAc;AAC3B,WAAAA,KAAS,MAAM,KAAK,0BACpBA,IAAQ,KAAK,MAAM,QAAQ,KAAK,cAAc,IAAI,GAC9CA,KAAS,KAAI;AACP,cAAAC,IAAa,KAAK,cAAc,KAAK;AAC3C,QAAIA,KAAc,SACdD,IAAQ,KAAK,MAAM,UAAU,CAACzB,MAASA,EAAK,MAAM0B,CAAU;AAAA,MAEpE;AAEJ,WAAK,MAAM,aAAaD,GACxB,KAAK,MAAM,kBAAkBA,KAAS,KAAK,CAAC,IAAI,CAACA,CAAK;AAAA,IAAA;AAEtD,WAAK,MAAM,aAAa,IACnB,KAAA,MAAM,kBAAkB;AAEjC,SAAK,uBAAuB;AAAA,EAChC;AAAA,EAkEQ,eAAeW,GAAsB;AACrC,IAAC,KAAK,UAGF,KAAK,MAAM,cAAc,OACrBA,IAAS,IACT,KAAK,MAAM,aAAa,IAEnB,KAAA,MAAM,aAAa,KAAK,IAAI,GAAG,KAAK,cAAc,MAAM,SAAS,CAAC,IAGtE,KAAA,MAAM,aAAa,KAAK;AAAA,MACzB;AAAA,MACA,KAAK,IAAI,KAAK,cAAc,MAAM,SAAS,GAAG,KAAK,MAAM,aAAaA,CAAM;AAAA,IAAA,GAGpF,KAAK,iBAAiB,KAAK,cAAc,MAAM,KAAK,MAAM,UAAU,CAAmB,GACvF,KAAK,uBAAuB,GACvB,KAAK,oBACN,KAAK,OAAO,KAjBhB,KAAK,SAAS;AAAA,EAoBtB;AAAA,EAEQ,yBAAyB;AACvB,UAAAC,IAAkB,KAAK,SAAS,KAAK,MAAM,YAAY,KAAK,MAAM,UAAU;AAClF,IAAIA,IACA,KAAK,aAAa,aAAa,yBAAyBA,EAAgB,EAAE,IAErE,KAAA,aAAa,gBAAgB,uBAAuB;AAAA,EAEjE;AAAA,EAEQ,iBAAiBrC,GAAsB;AACtC,SAAA,eAAe,KAAK,MAAM;AACtB,WAAA,QAAQ,KAAK,sBAAsBA,CAAI,GACxCA,IACA,KAAK,WAAWA,CAAI,IAEpB,KAAK,2BAA2B;AAAA,IACpC,CACH;AAAA,EACL;AAAA,EAEQ,sBAAsBA,GAAwB;AAClD,WAAIA,IACOA,EAAK,KAAK,gBAAgB,IAC1B,KAAK,gBACR,KAAK,cAAc,KAAK,aAAa,IAC9B,KAAK,gBAEL,KAAK,cAAc,KAAK,KAAK,gBAAgB,IAGjD;AAAA,EAEf;AAAA,EAEU,gBAAgBsC,GAA2B;AACjD,QAAIA,KACI,KAAK,eAAe,KAAK,OAAO;AAChC,YAAMC,KAAyB,KAAK,cAAc,QAAQ,KAAK;AAC/D,WAAK,aAAa,KAAK,OACvB,KAAK,WAAW,IAAI,GACf,KAAK,WACN,KAAK,4BAA4B,IACjC,KAAK,SAAS,KAEdA,MACA,KAAK,0BAA0B,GAC/B,KAAK,6BAA6B;AAAA,IAE1C;AAAA,EAGR;AAAA,EAEQ,aAAmB;AACnB,IAAC,KAAK,0BACN,KAAK,QAAQ,MACR,KAAA,aAAa,gBAAgB,uBAAuB,GACrD,KAAK,UACA,KAAA,MAAM,kBAAkB,KAEjC,KAAK,YAAY,GACb,KAAK,kBACL,KAAK,gBAAgB,MACrB,KAAK,6BAA6B,IAEtC,KAAK,cAAc;AAAA,EAE3B;AAAA,EAEQ,cAAoB;AACpB,IAAA,KAAK,cAAc,SACnB,KAAK,aAAa,QAClB,KAAK,oBAAoB,GACzB,KAAK,0BAA0B,GAC/B,KAAK,2BAA2B;AAAA,EAExC;AAAA,EAEQ,sBAA4B;AAE1B,UAAAC,MADiB,OAAO,eAAe,SAAS,gBAAgB,gBAC3B,KAAK,gBAAgB;AACzD,WAAA,OAAO,KAAK,MAAM,OAAO;AAAA,MAC5B,WAAW,GAAGA,CAAgB;AAAA,MAC9B,UAAU,GAAG,KAAK,IAAI,KAAK,aAAa,KAAK,mBAAmB,CAAC;AAAA,MACjE,UAAU,aAAa,KAAK,WAAW;AAAA,IAAA,CAC1C;AAAA,EACL;AAAA,EAEQ,eAAe;AACf,IAAA,KAAK,gBAAgB,KAAK,UACrB,KAAA,MAAM,KAAK,KAAK,KAAK,SAC1B,KAAK,aAAa,aAAa,iBAAiB,KAAK,MAAM,EAAE;AAAA,EAErE;AAAA,EAEQ,cAAclC,GAAgD;AAClE,WAAO,OAAOA,KAAU;AAAA,EAC5B;AAAA,EAEQ,+BAAqC;AACpC,SAAA,eACA,KAAK,MAAM;;AASR,UARK,KAAA;AAAA,QACD,IAAI,YAA6B,oBAAoB;AAAA,UACjD,QAAQ;AAAA,YACJ,WAAW,KAAK;AAAA,YAChB,eAAe,KAAK,cAAc,KAAK,aAAa;AAAA,UACxD;AAAA,QAAA,CACH;AAAA,MAAA,GAED,KAAK;AACL,aAAK,gBAAgB;AAAA,WAClB;AACH,cAAMmC,IAAgB,KAAK;AACvB,QAAA,KAAK,cAAcA,CAAa,IAChC,KAAK,aAAaA,CAAa,IAE1B,KAAA,cAAa5C,IAAA4C,KAAA,gBAAAA,EAAe,SAAf,gBAAA5C,EAAqB,OAAO;AAAA,MAEtD;AAAA,IAAA,CACH,EACA,MAAM,CAAC6C,MAAM;AACF,cAAA,MAAM,qDAAqDA,CAAC;AAAA,IAAA,CACvE;AAAA,EACT;AAAA,EAEQ,4BAAkC;AACjC,SAAA;AAAA,MACD,IAAI,YAAgC,iBAAiB;AAAA,QACjD,QAAQ,EAAE,OAAO,KAAK,WAAW;AAAA,QACjC,UAAU;AAAA,MAAA,CACb;AAAA,IAAA,GAEL,KAAK,qBAAqB,CAAC;AAAA,EAC/B;AAAA,EAEA,IAAY,uBAAgC;AACjC,WAAA,CAAC,CAAC,KAAK;AAAA,EAClB;AAAA,EAMQ,YAAYjC,GAAcyB,GAAyB;AAIvD,QAHIA,KAAiB,SACjBA,KAAiB,KAAK,cAAc,SAAS,KAAK,4BAA4B,MAE9E,KAAK,sBAAsB;AACvB,UAAA,CAAC,KAAK,QAAQ;AACd,QAAIA,MACK,KAAA,cAAc,QAAQ,IAC3B,KAAK,aAAa;AAEtB;AAAA,MACJ;AACA,UAAI,KAAK,sBAAsBzB,KAAQ,CAACyB;AACpC;AAEJ,MAAI,KAAK,uBACA,KAAA,oBAAoB,OAAOrC,EAAS,sBAAsB;AAEnE,YAAM8C,IAAsB,IAAI,QAAsB,CAACC,GAAUC,MAAW;AACnE,aAAA,sBAAsB,EAAE,QAAQA,EAAO;AAAA,MAAA,CAC/C;AACD,WAAK,qBAAqBpC,GAC1B,KAAK,2BAA2B,KAAK,YAChC,KAAA,aAAa,WAAW,EAAE,GAC/B,QAAQ,KAAK,CAACkC,GAAqB,KAAK,eAAe,KAAK,0BAA0BlC,CAAI,CAAC,CAAC,EACvF,KAAK,CAACqC,MAAiB;AACpB,YAAI,KAAK,cAAc,KAAK,4BAA4B,KAAK,sBAAsBrC,MAC1E,KAAA,cAAc,mBAAmBqC,EAAa,kBAC/CZ,KACK,KAAA,cAAc,QAAQY,EAAa,OACxC,KAAK,aAAaA,EAAa,UAE1B,KAAA,cAAc,SAASA,EAAa,KAAK,GACzC,KAAA,aAAa,KAAK,cAAc,QAErC,KAAK,UACL,KAAK,MAAM,YAAY,KAAK,cAAc,MAAM,SAEhD,KAAK,WAAW,KAAK,SAAQ;AAC7B,cAAI,KAAK,iBAAiB,CAAC,KAAK,cAAc,KAAK,aAAa,GAAG;AACzD,kBAAA1C,IAAe,KAAK,cAAc;AACxC,gBACI,KAAK,MAAM,gBAAgB,UAAU,KACrC,KAAK,MAAM,KAAK,MAAM,gBAAgB,CAAC,CAAC,KAAKA,GAC/C;AACE,kBAAIqB,IAAQ,KAAK,MAAM,QAAQrB,CAAY;AAC3C,kBAAIqB,KAAS,IAAI;AACb,sBAAMC,IAAatB,EAAa;AAChC,gBAAIsB,KAAc,SACdD,IAAQ,KAAK,MAAM,UAAU,CAACzB,MAASA,EAAK,MAAM0B,CAAU;AAAA,cAEpE;AACA,mBAAK,cAAc,QAAQD,GAC3B,KAAK,MAAM,kBAAkBA,KAAS,KAAK,CAAC,IAAI,CAACA,CAAK;AAAA,YAC1D;AAAA,UACJ;AACA,eAAK,oBAAoB,GACzB,KAAK,QAAQ;QACjB;AAEJ,aAAK,sBAAsB,MAC3B,KAAK,gBAAgB,SAAS;AAAA,MAAA,CACjC,EACA,MAAM,CAACiB,MAAM;AACN,QAAAA,MAAM7C,EAAS,2BACP,QAAA;AAAA,UACJ,wCAAwC,KAAK,wBAAwB,sBAAsBY,CAAI;AAAA,EAAkCiC,CAAC;AAAA,QAAA,GAEtI,KAAK,cAAc,mBAAmB,IAElC,KAAK,MAAM,UAAU,IACrB,KAAK,SAAS,KACP,KAAK,UACP,KAAA,MAAM,YAAY,KAAK,MAAM,SAEtC,KAAK,gBAAgB,SAAS,IAElC,KAAK,sBAAsB;AAAA,MAAA,CAC9B;AAAA,IACT;AAAA,EACJ;AAAA,EAEA,IAAY,cAA+B;AAChC,WAAA,KAAK,WAAW,cAAc,eAAe;AAAA,EACxD;AAAA,EAEQ,sBAA4B;AAC3B,SAAA,oBAAoB,KAAK,YAAY,iBAAiB,GACvD,KAAK,kBAAkB,SAAS,MAChC,KAAK,mBAAmB,IACnB,KAAA,gBAAgB,CAACK,GAAOtB,MAClB,KAAK,kBAAkBA,CAAK,EAAE,UAAU,EAAI,GAEvD,KAAK,QAAQ,KAAK,kBAAkB,IAAI,CAACzB,MAAS;AAC9C,YAAMgD,IAAO;AAAA,QACT,SAAShD,EAAK,aAAa,SAAS;AAAA,QACpC,aAAaA,EAAK,aAAa,aAAa;AAAA,MAAA;AAEhD,aAAiB,KAAK,oBAAlB,aAAuD,KAAK,oBAAtB,kBACjCgD,EAAA,KAAK,gBAAgB,IACtBhD,EAAK,KAAK,gBAAgB,KAAKA,EAAK,aAAa,KAAK,gBAAgB,IAEvEgD;AAAA,IAAA,CACV;AAAA,EAET;AACJ,GAj9BInD,EAAuB,KAAaR,GACpCQ,EAAc,gBAAgB,MAAY;AACtC,EAAA8B,EAAY,cAAc,GACrB,eAAe,IAAI9B,EAAS,EAAE,KAChB,eAAA,OAAOA,EAAS,IAAIA,CAAQ;AAC/C,GAEJA,EAAO,iBAAiB,IAExBA,EAAwB,yBAAiC,uBAV7DA;AAaWoD,EAAA;AAAA,EADNC,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM;AAAA,GAZzBtD,EAaV,WAAA,UAAA,CAAA;AAEAqD,EAAA;AAAA,EADNC,EAAS,EAAE,MAAM,QAAQ,WAAW,eAAe;AAAA,GAdnCtD,EAeV,WAAA,cAAA,CAAA;AAEAqD,EAAA;AAAA,EADNC,EAAS,EAAE,MAAM,SAAS,WAAW,sBAAsB,SAAS,IAAM;AAAA,GAhB1DtD,EAiBV,WAAA,oBAAA,CAAA;AAEAqD,EAAA;AAAA,EADNC,EAAS,EAAE,MAAM,SAAS,WAAW,gBAAgB,SAAS,IAAM;AAAA,GAlBpDtD,EAmBV,WAAA,eAAA,CAAA;AAEAqD,EAAA;AAAA,EADNC,EAAS,EAAE,MAAM,SAAS,WAAW,2BAA2B,SAAS,IAAM;AAAA,GApB/DtD,EAqBV,WAAA,yBAAA,CAAA;AAEAqD,EAAA;AAAA,EADNC,EAAS,EAAE,MAAM,SAAS,WAAW,aAAa,SAAS,IAAM;AAAA,GAtBjDtD,EAuBV,WAAA,YAAA,CAAA;AAEAqD,EAAA;AAAA,EADNC,EAAS,EAAE,MAAM,QAAQ,WAAW,sBAAsB,YAAY,IAAM;AAAA,GAxB5DtD,EAyBV,WAAA,oBAAA,CAAA;AAEAqD,EAAA;AAAA,EADNC,EAAS,EAAE,MAAM,QAAQ,WAAW,mBAAmB,YAAY,IAAM;AAAA,GA1BzDtD,EA2BV,WAAA,kBAAA,CAAA;AAEAqD,EAAA;AAAA,EADNC,EAAS,EAAE,MAAM,QAAQ,WAAW,IAAM,SAAS,IAAM;AAAA,GA5BzCtD,EA6BV,WAAA,MAAA,CAAA;AA7BX,IAAqBuD,IAArBvD;AAo9BAuD,EAAS,cAAc;"}
|
|
1
|
+
{"version":3,"file":"combo-box.mjs","sources":["../toggle.svg?raw","../clear.svg?raw","../combo-box.ts"],"sourcesContent":["export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" class=\\\"toggle-button\\\" slot=\\\"suffix\\\" viewBox=\\\"0 0 16 16\\\">\\r\\n <path d=\\\"M13 4v2l-5 5-5-5v-2l5 5z\\\"/>\\r\\n</svg>\\r\\n\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" class=\\\"clear-button\\\" slot=\\\"suffix\\\" viewBox=\\\"0 0 16 16\\\">\\r\\n <path d=\\\"M12.96 4.46l-1.42-1.42-3.54 3.55-3.54-3.55-1.42 1.42 3.55 3.54-3.55 3.54 1.42 1.42 3.54-3.55 3.54 3.55 1.42-1.42-3.55-3.54 3.55-3.54z\\\"/>\\r\\n</svg>\\r\\n\"","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { unsafeCSS, PropertyValues, css, TemplateResult, html } from \"lit\";\nimport { property } from \"lit/decorators/property.js\";\nimport { createPopper, Instance as Popper } from \"@popperjs/core\";\nimport SDInput, { CustomEventMap as InputCustomEventMap } from \"@cas-smartdesign/lit-input\";\nimport VirtualList, { SelectionType, ItemGenerator, ListDataProvider } from \"@cas-smartdesign/virtual-list\";\nimport { ItemData, generator } from \"@cas-smartdesign/list-item\";\n\nconst TAG_NAME = \"sd-combo-box\";\n\nfunction debounce<T>(func: (...args: T[]) => unknown, delay: number): typeof func {\n let timeout: number;\n return function (...args: T[]) {\n if (timeout != null) {\n clearTimeout(timeout);\n }\n timeout = window.setTimeout(() => func(...args), delay);\n };\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [TAG_NAME]: ComboBox;\n }\n}\n\nimport style from \"./style.scss?inline\";\nimport toggleSvg from \"./toggle.svg?raw\";\nimport clearSvg from \"./clear.svg?raw\";\nimport ImageTools from \"@cas-smartdesign/image-tools\";\n\nexport type ComboBoxValue = {\n index: number;\n item: ItemData | any;\n};\nexport type InMemoryFilter = (filterText: string, item: any) => boolean;\nexport type DataResponse = {\n items: any[];\n finalSizeIsKnown: boolean;\n};\n\nlet idCounter = 0;\n\nexport interface ISelectionEvent {\n selection: ComboBoxValue | string;\n isCustomValue: boolean;\n}\nexport interface IFilterChangeEvent {\n value: string;\n}\n\nexport interface CustomEventMap extends InputCustomEventMap {\n \"selection-change\": CustomEvent<ISelectionEvent>;\n \"filter-change\": CustomEvent<IFilterChangeEvent>;\n}\n\nexport default interface ComboBox {\n addEventListener<K extends keyof CustomEventMap>(\n event: K,\n listener: ((this: this, ev: CustomEventMap[K]) => unknown) | null,\n options?: AddEventListenerOptions | boolean,\n ): void;\n addEventListener(\n type: string,\n callback: EventListenerOrEventListenerObject | null,\n options?: AddEventListenerOptions | boolean,\n ): void;\n removeEventListener<K extends keyof CustomEventMap>(\n type: K,\n listener: (this: this, ev: CustomEventMap[K]) => unknown,\n options?: boolean | EventListenerOptions,\n ): void;\n removeEventListener(\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | EventListenerOptions,\n ): void;\n dispatchEvent<EventType extends CustomEventMap[keyof CustomEventMap]>(event: EventType): boolean;\n}\n\nexport default class ComboBox extends SDInput {\n public static readonly ID: string = TAG_NAME;\n public static ensureDefined = (): void => {\n VirtualList.ensureDefined();\n if (!customElements.get(ComboBox.ID)) {\n customElements.define(ComboBox.ID, ComboBox);\n }\n };\n static formAssociated = true;\n\n private static readonly DATA_REQUEST_CANCELLED: string = \"cancel_data_request\";\n\n @property({ type: Boolean, reflect: true })\n public opened = false;\n @property({ type: Number, attribute: \"item-height\" })\n public itemHeight = 50;\n @property({ type: Boolean, attribute: \"allow-custom-value\", reflect: true })\n public allowCustomValue: boolean;\n @property({ type: Boolean, attribute: \"trigger-only\", reflect: true })\n public triggerOnly: boolean;\n @property({ type: Boolean, attribute: \"null-setting-disallowed\", reflect: true })\n public nullSettingDisallowed: boolean;\n @property({ type: Boolean, attribute: \"show-icon\", reflect: true })\n public showIcon: boolean;\n @property({ type: String, attribute: \"display-value-path\", noAccessor: true })\n public displayValuePath = \"caption\";\n @property({ type: String, attribute: \"filter-property\", noAccessor: true })\n public filterProperty: string;\n @property({ type: String, attribute: true, reflect: true })\n public id: string = ComboBox.ID + \"_\" + idCounter++;\n\n public inMemoryFilter: InMemoryFilter = (filterText, item) => {\n if (!filterText) {\n return true;\n }\n const lowerCaseFilter = filterText.toLowerCase();\n if (typeof item.caption == \"string\" && item.caption.toLowerCase().includes(lowerCaseFilter)) {\n return true;\n }\n if (typeof item.description == \"string\" && item.description.toLowerCase().includes(lowerCaseFilter)) {\n return true;\n }\n return false;\n };\n\n public filterText: string;\n public minimumOverlayWidth = 250;\n\n private _comboBoxValue: ComboBoxValue | string;\n private _clearButton: SVGElement;\n private _toggleButton: SVGElement;\n private _popper: Popper;\n private _list: VirtualList;\n private _dataProvider: ListDataProvider;\n private _itemGenerator: ItemGenerator = generator;\n private _itemCache: any[] = [];\n private _declarativeItems: HTMLElement[];\n private _onDataRequest: (filterText: string, page: number) => Promise<DataResponse>;\n private _pendingDataRequest: { cancel: (reason?: any) => void };\n private _openedByFilterTextChange: boolean;\n private _lastRequestedPage: number;\n private _lastRequestedFilterText: string;\n private _icon: HTMLElement;\n\n constructor() {\n super();\n this._dataProvider = new ListDataProvider();\n this._dataProvider.finalSizeIsKnown = true;\n }\n\n public get clearFilterOnLazyLoadedSelection(): boolean {\n return this.triggerOnly;\n }\n\n /**\n * @deprecated The method should not be used.\n * Use {@link ComboBox#triggerOnly} instead.\n * @param {boolean} value\n */\n public set clearFilterOnLazyLoadedSelection(value: boolean) {\n console.warn(\n \"Using clearFilterOnLazyLoadedSelection setting on a combo-box is deprecated. Use triggerOnly instead.\",\n );\n this.triggerOnly = value;\n }\n\n public get itemGenerator(): ItemGenerator {\n return this._itemGenerator;\n }\n\n public set itemGenerator(value: ItemGenerator) {\n this._itemGenerator = value;\n if (this._list) {\n this._list.itemGenerator = this._itemGenerator;\n }\n }\n\n public get items(): any[] {\n return this._itemCache;\n }\n\n public set items(items: any[]) {\n this._itemCache = items;\n if (this.isLazyLoadConfigured) {\n this._dataProvider.items = items;\n this._lastRequestedPage = null;\n }\n if (this.value && !this.comboBoxValue) {\n this.updateComboBoxValueFromValue();\n }\n this.filterItemsInMemory();\n if (this.opened && this._popper) {\n this._popper.update();\n }\n }\n\n public get finalSizeIsKnown(): boolean {\n return this._dataProvider.finalSizeIsKnown;\n }\n\n public set finalSizeIsKnown(value: boolean) {\n this._dataProvider.finalSizeIsKnown = value;\n }\n\n public configureLazyLoad(onDataRequest: (filterText: string, page: number) => Promise<DataResponse>): void {\n if (!onDataRequest) {\n throw new Error(\"It is not possible to configure lazy load without a given onDataRequest calback.\");\n }\n this._dataProvider.finalSizeIsKnown = false;\n this._onDataRequest = onDataRequest;\n this._dataProvider.onDataRequest = (page: number) => {\n this.requestData(page, false);\n };\n }\n\n public get comboBoxValue(): ComboBoxValue | string {\n return this._comboBoxValue;\n }\n\n public set comboBoxValue(value: ComboBoxValue | string) {\n this._comboBoxValue = value;\n this.updateInputValue(null);\n this.updateHasValue();\n }\n\n public get selectedIndex(): number {\n if (this.isCustomValue(this.comboBoxValue) || !this.comboBoxValue) {\n return -1;\n }\n return this.comboBoxValue.index;\n }\n\n public get displayValue(): string {\n return this.value;\n }\n\n public open(): void {\n this.opened = true;\n }\n\n static get styles() {\n return [\n css`\n ${unsafeCSS(style)}\n `,\n ];\n }\n\n public disconnectedCallback(): void {\n super.disconnectedCallback();\n if (this._popper) {\n this._popper.destroy();\n this._popper = null;\n }\n }\n\n public render(): TemplateResult {\n return html`\n ${super.render()}\n <slot @slotchange=${this.onDefaultSlotChange} id=\"default-slot\"></slot>\n `;\n }\n\n public attributeChangedCallback(name: string, oldValue: string, newValue: string): void {\n super.attributeChangedCallback(name, oldValue, newValue);\n if (oldValue !== newValue) {\n switch (name) {\n case \"opened\": {\n this.handleOpenedStateChange();\n break;\n }\n case \"item-height\": {\n if (this._list) {\n this._list.itemHeight = this.itemHeight;\n }\n break;\n }\n case \"id\": {\n this.updateListId();\n break;\n }\n }\n }\n }\n\n public firstUpdated(changedProperties: PropertyValues): void {\n super.firstUpdated(changedProperties);\n\n if (this.value && !this.comboBoxValue) {\n this.updateComboBoxValueFromValue();\n }\n window.requestAnimationFrame(() => {\n this.initClearButtton();\n this.initToggleButtton();\n this.updateHasValue();\n\n this.addEventListener(\"click\", () => {\n if (!this.disabled) {\n this.opened = !this.opened;\n }\n });\n this.addEventListener(\"keydown\", (event: KeyboardEvent) => {\n if (!this.disabled) {\n this.handleKeyDown(event);\n }\n });\n });\n this.inputElement.setAttribute(\"role\", \"combobox\");\n this.inputElement.setAttribute(\"aria-autocomplete\", \"list\");\n }\n\n private updateComboBoxValueFromValue() {\n if (this.value) {\n const selectedIndex = this._itemCache.findIndex(\n (item) => (item[this.displayValuePath] ?? \"\") === this.value,\n );\n if (selectedIndex > -1) {\n this._comboBoxValue = { index: selectedIndex, item: this._itemCache[selectedIndex] };\n } else if (this.allowCustomValue) {\n this._comboBoxValue = this.value;\n } else {\n this._comboBoxValue = null;\n }\n this.updateHasValue();\n this.updateIconFromCurrentValue();\n }\n }\n\n public updated(changedProperties: PropertyValues): void {\n super.updated(changedProperties);\n if (changedProperties.has(\"showIcon\")) {\n if (this.showIcon) {\n if (this._icon == null) {\n this.initIconWrapper();\n }\n } else if (this._icon != null) {\n this._icon.remove();\n this._icon = null;\n }\n }\n if (changedProperties.has(\"currentText\")) {\n this.updateHasValue();\n }\n if (changedProperties.has(\"triggerOnly\") && this._list) {\n this._list.selectionType = this.triggerOnly ? SelectionType.TriggerOnly : SelectionType.Single;\n }\n }\n\n private initIconWrapper() {\n this._icon = document.createElement(\"div\");\n this._icon.className = \"icon-wrapper\";\n this._icon.role = \"img\";\n const iconEl = document.createElement(\"div\");\n iconEl.style.backgroundRepeat = \"no-repeat\";\n iconEl.style.backgroundPosition = \"center\";\n iconEl.style.backgroundSize = \"cover\";\n iconEl.style.height = \"24px\";\n iconEl.style.width = \"24px\";\n this._icon.appendChild(iconEl);\n this._icon.slot = \"prefix\";\n this.appendChild(this._icon);\n this.updateIconFromCurrentValue();\n }\n\n private updateIconFromCurrentValue() {\n if (this.isCustomValue(this.comboBoxValue)) {\n this.updateIcon(null);\n } else {\n this.updateIcon(this.comboBoxValue?.item);\n }\n }\n\n private updateIcon(item) {\n if (this._icon) {\n if (item && (item.icon || item.iconPlaceholder)) {\n const selectedItem = item as {\n iconBackgroundColor?: string;\n attributes?: Record<string, string>;\n };\n if (selectedItem.attributes == null) {\n this._icon.title = \"\";\n this._icon.ariaLabel = \"\";\n } else {\n this._icon.title = selectedItem.attributes[\"icon-attr-title\"] ?? \"\";\n this._icon.ariaLabel = selectedItem.attributes[\"icon-attr-aria-label\"] ?? \"\";\n }\n this._icon.style.backgroundColor = selectedItem.iconBackgroundColor;\n this._icon.style.display = \"\";\n ImageTools.showImage(this._icon.querySelector(\"div\"), item.icon, item.iconPlaceholder);\n } else if (this._icon) {\n this._icon.style.display = \"none\";\n }\n }\n }\n\n private updateHasValue() {\n if (this.currentText || (this.comboBoxValue != null && this.comboBoxValue != \"\")) {\n this.setAttribute(\"has-value\", \"\");\n if (this._clearButton) {\n this._clearButton.style.display = \"\";\n }\n } else {\n this.removeAttribute(\"has-value\");\n }\n }\n\n protected shouldFloat() {\n return super.shouldFloat() || (this.comboBoxValue != null && this.comboBoxValue != \"\");\n }\n\n private initClearButtton(): void {\n const clearButtonTemplate = document.createElement(\"template\");\n clearButtonTemplate.innerHTML = clearSvg;\n this._clearButton = clearButtonTemplate.content.firstChild as SVGElement;\n this.appendChild(this._clearButton);\n\n this._clearButton.addEventListener(\"click\", (event) => {\n event.preventDefault();\n event.stopPropagation();\n this.opened = false;\n this.clearValue();\n });\n }\n\n private initToggleButtton(): void {\n const toggleButtonTemplate = document.createElement(\"template\");\n toggleButtonTemplate.innerHTML = toggleSvg;\n this._toggleButton = toggleButtonTemplate.content.firstChild as SVGElement;\n this.appendChild(this._toggleButton);\n\n this._toggleButton.addEventListener(\"click\", (event) => {\n event.preventDefault();\n event.stopPropagation();\n this.opened = !this.opened;\n this.select();\n });\n }\n\n private debouncedFilterItemsInMemory = debounce(this.filterItemsInMemory.bind(this), 200);\n private filterItemsInMemory(): void {\n if (this.isLazyLoadConfigured) {\n return;\n }\n let filteredInMemory = false;\n if (this.filterText) {\n if (this.filterProperty) {\n this._dataProvider.items = this._itemCache.filter((item) => {\n return item[this.filterProperty] && String(item[this.filterProperty]).indexOf(this.filterText) > -1;\n });\n filteredInMemory = true;\n } else if (this.inMemoryFilter) {\n this._dataProvider.items = this._itemCache.filter((item) => this.inMemoryFilter(this.filterText, item));\n filteredInMemory = true;\n }\n }\n if (!filteredInMemory) {\n this._dataProvider.items = this._itemCache;\n if (this._list) {\n this.updateFocusAndSelectedIndexFromValue();\n }\n } else if (this._list) {\n if (this.comboBoxValue && !this.isCustomValue(this.comboBoxValue)) {\n let index = this._dataProvider.items.indexOf(this.comboBoxValue.item);\n if (index == -1) {\n const selectedId = this.comboBoxValue.item.id;\n if (selectedId != null) {\n index = this._dataProvider.items.findIndex((item: any) => item.id == selectedId);\n }\n }\n this._list.focusIndex = index;\n this._list.selectedIndices = index == -1 ? [] : [index];\n } else {\n this._list.focusIndex = null;\n }\n }\n if (this.opened && this._popper) {\n this._popper.update();\n }\n }\n\n private ensureListAndPopperInitialized(): void {\n if (!this._list) {\n this._list = document.createElement(VirtualList.ID) as VirtualList;\n this.updateListId();\n this._list.classList.add(\"combo-box-dropdown\");\n this._list.itemHeight = this.itemHeight;\n this._list.itemGenerator = this.itemGenerator;\n this._list.selectionType = this.triggerOnly ? SelectionType.TriggerOnly : SelectionType.Single;\n this._list.setAttribute(\"focus-target\", \"\");\n Object.assign(this._list.style, {\n zIndex: \"21000\",\n boxShadow: `rgba(0, 0, 0, 0.14) 0px 2px 2px 0px,\n rgba(0, 0, 0, 0.12) 0px 1px 5px 0px,\n rgba(0, 0, 0, 0.2) 0px 3px 1px -2px`,\n background: \"white\",\n overflowY: \"auto\",\n });\n this._list.addEventListener(\"selection\", this.handleSelection);\n this._dataProvider.connectList(this._list);\n }\n if (!this._popper) {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const comboBox = this;\n this._popper = createPopper(this, this._list, {\n placement: \"bottom-start\",\n modifiers: [\n {\n name: \"computeStyles\",\n options: {\n gpuAcceleration: true,\n },\n },\n {\n name: \"hide\",\n enabled: false,\n },\n {\n name: \"closeIfReferenceHidden\",\n enabled: true,\n phase: \"afterWrite\",\n fn({ state }) {\n const comboBox = state.elements.reference as ComboBox;\n comboBox.closeIfNotVisible();\n },\n },\n {\n name: \"offset\",\n options: {\n offset: ({ placement }) => {\n if (placement.indexOf(\"top\") > -1) {\n return [0, -parseInt(getComputedStyle(comboBox).paddingTop, 10)];\n }\n if (placement.indexOf(\"bottom\") > -1) {\n return [\n 0,\n -parseInt(getComputedStyle(comboBox).paddingBottom, 10) -\n ((\n this.shadowRoot.querySelector(\n \".validation-message-wrapper\",\n ) as HTMLElement\n )?.offsetHeight ?? 0),\n ];\n }\n return [0, 0];\n },\n },\n },\n {\n name: \"adjustWidthIfNeeded\",\n enabled: true,\n phase: \"read\",\n fn({ state }) {\n const list = state.elements.popper as VirtualList;\n list.increaseWidthOnNextRenderIfNeeded();\n },\n },\n ],\n });\n }\n }\n\n private closeIfNotVisible(): void {\n const elementFromPoint = this.elementFromMiddleOfComboBox();\n // elementFromPoint might be the list itself in Safari, thus it needs to be checked as well (Fixes: 244485)\n if (\n !this.contains(elementFromPoint) &&\n !this.shadowRoot.contains(elementFromPoint) &&\n elementFromPoint !== this._list\n ) {\n if (this.triggerOnly) {\n this.value = null;\n }\n this.opened = false;\n }\n }\n\n private elementFromMiddleOfComboBox(): Element {\n const rect = this.getBoundingClientRect();\n return document.elementFromPoint(rect.left + rect.width / 2, rect.top + rect.height / 2);\n }\n\n private handleSelection = (event: CustomEvent) => {\n const selectedItem = this._dataProvider.items[event.detail.index];\n if (!event.detail.selected) {\n // null selection is not allowed via clicking inside the dropdown\n this._list.selectedIndices = [event.detail.index];\n }\n this.comboBoxValue = { index: this._itemCache.indexOf(selectedItem), item: selectedItem };\n this.dispatchSelectionChangeEvent();\n this.opened = false;\n };\n\n private async handleOpenedStateChange(): Promise<void> {\n this.inputElement.setAttribute(\"aria-expanded\", String(this.opened));\n if (this.opened) {\n if (!this.disabled) {\n this.ensureListAndPopperInitialized();\n\n const filterChanged = (this.filterText ?? \"\") !== (this._lastRequestedFilterText ?? \"\");\n if (this.isLazyLoadConfigured && (this.items.length == 0 || filterChanged)) {\n this.requestData(0, filterChanged);\n }\n\n this.updateDropdownSizes();\n this.ownerDocument.body.appendChild(this._list);\n this.updateFocusAndSelectedIndexFromValue();\n\n window.requestAnimationFrame(() => {\n if (this._popper) {\n this._popper.update();\n }\n });\n\n window.addEventListener(\"pointerdown\", this.handleWindowPointerDown);\n\n if (!this.allowCustomValue && !this._openedByFilterTextChange) {\n this.select();\n }\n }\n this._openedByFilterTextChange = false;\n } else {\n await this._list.updateComplete;\n if (this._popper) {\n await this._popper.update;\n }\n this.ownerDocument.body.removeChild(this._list);\n window.removeEventListener(\"pointerdown\", this.handleWindowPointerDown);\n this.updateValueOnClose();\n this.clearFilter();\n this.setSelectionRange(0, 0);\n this.inputElement.removeAttribute(\"aria-activedescendant\");\n\n if (this._popper) {\n this._popper.destroy();\n this._popper = null;\n }\n }\n }\n\n private updateValueOnClose(): void {\n const oldValue = this.comboBoxValue ?? \"\";\n if (this.nullSettingDisallowed && !this.value && this.comboBoxValue) {\n this.restorePreviousSelection();\n } else if (this.value !== (this.convertToDisplayValue(null) ?? \"\")) {\n // value change only if needed\n const focusedItem = this._dataProvider.items[this._list.focusIndex] as {\n disabled?: boolean;\n };\n if (focusedItem && (focusedItem[this.displayValuePath] ?? \"\") === this.value) {\n if (focusedItem.disabled) {\n this.restorePreviousSelection();\n return;\n }\n // 1. select focused item if the input's value is the same\n this.comboBoxValue = { index: this._itemCache.indexOf(focusedItem), item: focusedItem };\n } else if (this.allowCustomValue || !this.value) {\n // 2. set as a custom or empty value\n this.comboBoxValue = this.value;\n } else {\n // 3. try to search for an identical item\n const selectedIndex = this._itemCache.findIndex(\n (item) => (item[this.displayValuePath] ?? \"\") === this.value && !item.disabled,\n );\n if (selectedIndex > -1) {\n this.comboBoxValue = { index: selectedIndex, item: this._itemCache[selectedIndex] };\n } else {\n this.restorePreviousSelection(); // Fixes C1XRTYID\n }\n }\n } else {\n // Allow selecting another item with same caption but different id\n const focusedItem = this._dataProvider.items[this._list.focusIndex] as {\n id?: string;\n disabled?: boolean;\n };\n if (focusedItem && focusedItem.id != null) {\n if (focusedItem.disabled) {\n this.restorePreviousSelection();\n return;\n }\n if (\n !this.comboBoxValue ||\n this.isCustomValue(this.comboBoxValue) ||\n this.comboBoxValue.item.id != focusedItem.id\n ) {\n this.comboBoxValue = { index: this._itemCache.indexOf(focusedItem), item: focusedItem };\n }\n }\n }\n if (oldValue !== (this.comboBoxValue ?? \"\")) {\n this.dispatchSelectionChangeEvent();\n }\n this.updateIcon(this.isCustomValue(this.comboBoxValue) ? null : this.comboBoxValue?.item);\n }\n\n private restorePreviousSelection() {\n this.updateInputValue(null);\n }\n\n private updateFocusAndSelectedIndexFromValue(): void {\n if (this.comboBoxValue && !this.isCustomValue(this.comboBoxValue) && !this._openedByFilterTextChange) {\n let index = this.comboBoxValue.index;\n if (index == -1 || this.isLazyLoadConfigured) {\n index = this.items.indexOf(this.comboBoxValue.item);\n if (index == -1) {\n const selectedId = this.comboBoxValue.item.id;\n if (selectedId != null) {\n index = this.items.findIndex((item) => item.id == selectedId);\n }\n }\n }\n this._list.focusIndex = index;\n this._list.selectedIndices = index == -1 ? [] : [index];\n } else {\n this._list.focusIndex = -1;\n this._list.selectedIndices = [];\n }\n this.updateActiveDescendant();\n }\n\n private handleWindowPointerDown = (event: PointerEvent) => {\n const contains = event.target instanceof Node && this.contains(event.target);\n if (!contains && this.opened && event.composedPath().indexOf(this._list) === -1) {\n if (this.triggerOnly) {\n this.value = null;\n }\n this.opened = false;\n }\n };\n\n private handleKeyDown = (event: KeyboardEvent) => {\n switch (event.key) {\n case \"Down\":\n case \"ArrowDown\": {\n event.preventDefault();\n this.navigateInList(+1);\n break;\n }\n case \"Up\":\n case \"ArrowUp\": {\n event.preventDefault();\n this.navigateInList(-1);\n break;\n }\n case \"Enter\": {\n if (this.opened) {\n event.preventDefault();\n event.stopPropagation();\n this.opened = false;\n }\n break;\n }\n case \"Escape\": {\n if (this.opened) {\n event.preventDefault();\n event.stopPropagation();\n if (\n this._list.selectedIndices.indexOf(this._list.focusIndex) > -1 &&\n this._dataProvider.items.length > this._list.focusIndex\n ) {\n this.opened = false;\n } else {\n this.clearFilter();\n this.updateInputValue(null);\n this.updateFocusAndSelectedIndexFromValue();\n if (!this._list.selectedIndices.includes(this._list.focusIndex)) {\n this._list.selectedIndices.push(this._list.focusIndex);\n }\n }\n }\n break;\n }\n case \"Tab\": {\n if (this.opened) {\n if (this.triggerOnly) {\n this.value = null;\n }\n this.opened = false;\n }\n break;\n }\n }\n };\n\n private navigateInList(offset: number): void {\n if (!this.opened) {\n this.opened = true;\n } else {\n if (this._list.focusIndex == null) {\n if (offset > 0) {\n this._list.focusIndex = 0;\n } else {\n this._list.focusIndex = Math.max(0, this._dataProvider.items.length - 1);\n }\n } else {\n this._list.focusIndex = Math.max(\n 0,\n Math.min(this._dataProvider.items.length - 1, this._list.focusIndex + offset),\n );\n }\n this.updateInputValue(this._dataProvider.items[this._list.focusIndex] as ItemData | any);\n this.updateActiveDescendant();\n if (!this.allowCustomValue) {\n this.select();\n }\n }\n }\n\n private updateActiveDescendant() {\n const focusedListItem = this._list && this._list.getListItem(this._list.focusIndex);\n if (focusedListItem) {\n this.inputElement.setAttribute(\"aria-activedescendant\", focusedListItem.id);\n } else {\n this.inputElement.removeAttribute(\"aria-activedescendant\");\n }\n }\n\n private updateInputValue(item: ItemData): void {\n this.updateComplete.then(() => {\n this.value = this.convertToDisplayValue(item);\n if (item) {\n this.updateIcon(item);\n } else {\n this.updateIconFromCurrentValue();\n }\n });\n }\n\n private convertToDisplayValue(item: ItemData): string {\n if (item) {\n return item[this.displayValuePath];\n } else if (this.comboBoxValue) {\n if (this.isCustomValue(this.comboBoxValue)) {\n return this.comboBoxValue;\n } else {\n return this.comboBoxValue.item[this.displayValuePath];\n }\n } else {\n return null;\n }\n }\n\n protected fireValueChange(immediate?: boolean): void {\n if (immediate) {\n if (this.filterText !== this.value) {\n const effectiveFilterChange = (this.filterText ?? \"\") !== this.value;\n this.filterText = this.value;\n this.updateIcon(null);\n if (!this.opened) {\n this._openedByFilterTextChange = true;\n this.opened = true;\n }\n if (effectiveFilterChange) {\n this.dispatchFilterChangeEvent();\n this.debouncedFilterItemsInMemory();\n }\n }\n }\n // consume both change events triggered from input, combo box provides a different API for that\n }\n\n private clearValue(): void {\n if (!this.nullSettingDisallowed) {\n this.value = null;\n this.inputElement.removeAttribute(\"aria-activedescendant\");\n if (this._list) {\n this._list.selectedIndices = [];\n }\n this.clearFilter();\n if (this.comboBoxValue) {\n this.comboBoxValue = null;\n this.dispatchSelectionChangeEvent();\n }\n this.requestUpdate();\n }\n }\n\n private clearFilter(): void {\n if (this.filterText != null) {\n this.filterText = undefined;\n this.filterItemsInMemory();\n this.dispatchFilterChangeEvent();\n this.updateIconFromCurrentValue();\n }\n }\n\n private updateDropdownSizes(): void {\n const viewportHeight = window.innerHeight || document.documentElement.clientHeight;\n const overlayMaxHeight = (viewportHeight - this.offsetHeight) * 0.5;\n Object.assign(this._list.style, {\n maxHeight: `${overlayMaxHeight}px`,\n minWidth: `${Math.max(this.offsetWidth, this.minimumOverlayWidth)}px`,\n maxWidth: `max(50vw, ${this.offsetWidth}px)`,\n });\n }\n\n private updateListId() {\n if (this.inputElement && this._list) {\n this._list.id = this.id + \"_list\";\n this.inputElement.setAttribute(\"aria-controls\", this._list.id);\n }\n }\n\n private isCustomValue(value: ComboBoxValue | string): value is string {\n return typeof value === \"string\";\n }\n\n private dispatchSelectionChangeEvent(): void {\n this.updateComplete\n .then(() => {\n this.dispatchEvent(\n new CustomEvent<ISelectionEvent>(\"selection-change\", {\n detail: {\n selection: this.comboBoxValue,\n isCustomValue: this.isCustomValue(this.comboBoxValue),\n },\n }),\n );\n if (this.triggerOnly) {\n this.comboBoxValue = null;\n } else {\n const comboBoxValue = this.comboBoxValue;\n if (this.isCustomValue(comboBoxValue)) {\n this.setFormValue(comboBoxValue);\n } else {\n this.setFormValue(comboBoxValue?.item?.caption);\n }\n }\n })\n .catch((e) => {\n console.error(\"Could not dispatch selection change event due to:\", e);\n });\n }\n\n private dispatchFilterChangeEvent(): void {\n this.dispatchEvent(\n new CustomEvent<IFilterChangeEvent>(\"filter-change\", {\n detail: { value: this.filterText },\n composed: true,\n }),\n );\n this.debouncedRequestData(0);\n }\n\n private get isLazyLoadConfigured(): boolean {\n return !!this._onDataRequest;\n }\n\n /**\n * Used only when lazy loading is configured.\n */\n private debouncedRequestData = debounce(this.requestData.bind(this), 250);\n private requestData(page: number, filterChanged?: boolean) {\n if (filterChanged == null) {\n filterChanged = (this.filterText ?? \"\") !== (this._lastRequestedFilterText ?? \"\");\n }\n if (this.isLazyLoadConfigured) {\n if (!this.opened) {\n if (filterChanged) {\n this._dataProvider.items = [];\n this._itemCache = [];\n }\n return;\n }\n if (this._lastRequestedPage == page && !filterChanged) {\n return;\n }\n if (this._pendingDataRequest) {\n this._pendingDataRequest.cancel(ComboBox.DATA_REQUEST_CANCELLED);\n }\n const cancellationPromise = new Promise<DataResponse>((_resolve, reject) => {\n this._pendingDataRequest = { cancel: reject };\n });\n this._lastRequestedPage = page;\n this._lastRequestedFilterText = this.filterText;\n this.setAttribute(\"loading\", \"\");\n Promise.race([cancellationPromise, this._onDataRequest(this._lastRequestedFilterText, page)])\n .then((dataResponse) => {\n if (this.filterText == this._lastRequestedFilterText && this._lastRequestedPage == page) {\n this._dataProvider.finalSizeIsKnown = dataResponse.finalSizeIsKnown;\n if (filterChanged) {\n this._dataProvider.items = dataResponse.items;\n this._itemCache = dataResponse.items;\n } else {\n this._dataProvider.addItems(dataResponse.items);\n this._itemCache = this._dataProvider.items;\n }\n if (this._list) {\n this._list.itemCount = this._dataProvider.items.length;\n }\n if (this._popper && this.opened) {\n if (this.comboBoxValue && !this.isCustomValue(this.comboBoxValue)) {\n const selectedItem = this.comboBoxValue.item;\n if (\n this._list.selectedIndices.length == 0 ||\n this.items[this._list.selectedIndices[0]] != selectedItem\n ) {\n let index = this.items.indexOf(selectedItem);\n if (index == -1) {\n const selectedId = selectedItem.id;\n if (selectedId != null) {\n index = this.items.findIndex((item) => item.id == selectedId);\n }\n }\n this.comboBoxValue.index = index;\n this._list.selectedIndices = index == -1 ? [] : [index];\n }\n }\n this.updateDropdownSizes();\n this._popper.update();\n }\n }\n this._pendingDataRequest = null;\n this.removeAttribute(\"loading\");\n })\n .catch((e) => {\n if (e !== ComboBox.DATA_REQUEST_CANCELLED) {\n console.error(\n `Data could not be loaded for filter \"${this._lastRequestedFilterText}\" and page number \"${page}\" due to the following error:\\n${e}`,\n );\n this._dataProvider.finalSizeIsKnown = true;\n\n if (this.items.length == 0) {\n this.opened = false;\n } else if (this._list) {\n this._list.itemCount = this.items.length;\n }\n this.removeAttribute(\"loading\");\n }\n this._pendingDataRequest = null;\n });\n }\n }\n\n private get defaultSlot(): HTMLSlotElement {\n return this.shadowRoot.querySelector(\"#default-slot\");\n }\n\n private onDefaultSlotChange(): void {\n this._declarativeItems = this.defaultSlot.assignedElements() as HTMLElement[];\n if (this._declarativeItems.length > 0) {\n this.finalSizeIsKnown = true;\n this.itemGenerator = (_data, index) => {\n return this._declarativeItems[index].cloneNode(true) as HTMLElement;\n };\n this.items = this._declarativeItems.map((item) => {\n const data = {\n caption: item.getAttribute(\"caption\"),\n description: item.getAttribute(\"description\"),\n };\n if (\"caption\" != this.displayValuePath && \"description\" != this.displayValuePath) {\n data[this.displayValuePath] =\n item[this.displayValuePath] || item.getAttribute(this.displayValuePath);\n }\n return data;\n });\n }\n }\n}\n\nComboBox.ensureDefined();\n"],"names":["toggleSvg","clearSvg","TAG_NAME","debounce","func","delay","timeout","args","idCounter","_ComboBox","_a","SDInput","filterText","item","lowerCaseFilter","generator","event","selectedItem","ListDataProvider","value","items","onDataRequest","page","css","unsafeCSS","style","html","name","oldValue","newValue","changedProperties","selectedIndex","SelectionType","iconEl","ImageTools","clearButtonTemplate","toggleButtonTemplate","filteredInMemory","index","selectedId","VirtualList","comboBox","createPopper","state","placement","elementFromPoint","rect","filterChanged","focusedItem","offset","focusedListItem","immediate","effectiveFilterChange","overlayMaxHeight","comboBoxValue","e","cancellationPromise","_resolve","reject","dataResponse","_data","data","__decorateClass","property","ComboBox"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./doc.mjs";const
|
|
1
|
+
import"./doc.mjs";const s="monkey.svg",a="placeholder.svg",t=[];t.push({caption:"Item A",description:"This is A",icon:s,id:"1"});t.push({caption:"Item B",description:"This is B",icon:s,id:"2"});t.push({caption:"Item C",description:"This is C",icon:s,id:"3"});t.push({description:"Without caption",icon:s,id:"4"});t.push({icon:a,id:"5"});const l=document.querySelector("#basic-examples-container");l.querySelectorAll("sd-combo-box").forEach(e=>{e.items=t,e.addEventListener("selection-change",i=>{console.log(`Selection change for combobox #${e.id}`);const o=i.detail?.selection;o?i.detail.isCustomValue?console.log(`The entered custom value is '${o}'`):console.log(`The selected item is ${o.item.caption}`):console.log("Item is deselected")})});l.querySelectorAll(".trigger-only-example-wrapper").forEach(e=>{const i=e.querySelector("sd-combo-box[trigger-only]"),o=e.querySelector("span");i.addEventListener("selection-change",c=>{const n=c.detail.selection;if(c.detail.isCustomValue)o.textContent=n;else if(n){const r=n;o.textContent=r.item.caption}})});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{a as n}from"./doc.mjs";const a="./monkey.svg",t=[];t.push({caption:"Item A",description:"This is A",icon:a});t.push({caption:"Item B",description:"This is B",icon:a});t.push({caption:"Item C",description:"This is C",icon:a});document.querySelectorAll("#validation-examples-container sd-combo-box").forEach(e=>{e.items=t,s(e),e.addEventListener("selection-change",i=>{s(e)})});function s(e){const i=e.comboBoxValue;e.hasAttribute("long-validation-message")?(e.validationMessage="This is a long validation message that might not fit into a single line.",i&&(e.validationMessage+=` Especially if '${i.item.caption}' is selected`),e.validationLevel=n.Warn):i?(e.validationMessage=null,e.validationLevel=null):(e.validationMessage="Should not be empty",e.validationLevel=n.Error)}
|