@cas-smartdesign/token-selector 0.18.1 → 0.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/docs/doc.mjs +21 -29
- package/dist/token-selector-with-externals.js +27 -27
- package/dist/token-selector-with-externals.js.map +3 -3
- package/dist/token-selector.d.ts +1 -0
- package/dist/token-selector.mjs +43 -34
- package/dist/token-selector.mjs.map +1 -1
- package/package.json +5 -5
- package/readme.md +2 -0
package/dist/token-selector.d.ts
CHANGED
|
@@ -93,6 +93,7 @@ export default class TokenSelector extends LitElement {
|
|
|
93
93
|
selectOrAddItems: (items: unknown & {
|
|
94
94
|
caption?: string;
|
|
95
95
|
}[]) => number[];
|
|
96
|
+
private clearCheckedTokens;
|
|
96
97
|
removeSelectionOrActiveToken(): void;
|
|
97
98
|
private updateActiveToken;
|
|
98
99
|
private commitTokenValue;
|
package/dist/token-selector.mjs
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { LitElement as
|
|
1
|
+
import { LitElement as x, unsafeCSS as T, html as m, nothing as I } from "lit";
|
|
2
2
|
import { property as a } from "lit/decorators/property.js";
|
|
3
3
|
import "@cas-smartdesign/lit-input";
|
|
4
4
|
import S from "@cas-smartdesign/field-validation-message";
|
|
5
5
|
import { generator as _ } from "@cas-smartdesign/list-item";
|
|
6
6
|
import L from "@cas-smartdesign/popover";
|
|
7
7
|
import y from "@cas-smartdesign/virtual-list";
|
|
8
|
-
import { KeyDownDelegator as
|
|
9
|
-
import { ifDefined as
|
|
8
|
+
import { KeyDownDelegator as C } from "@cas-smartdesign/element-utils";
|
|
9
|
+
import { ifDefined as A } from "lit/directives/if-defined.js";
|
|
10
10
|
import { unsafeSVG as P } from "lit/directives/unsafe-svg.js";
|
|
11
11
|
import D from "@cas-smartdesign/image-tools";
|
|
12
12
|
class O {
|
|
@@ -27,7 +27,7 @@ class O {
|
|
|
27
27
|
this.lastRequestedStartIndex,
|
|
28
28
|
this.lastRequestedStopIndex + 1
|
|
29
29
|
);
|
|
30
|
-
}), new
|
|
30
|
+
}), new C(this._tokenList, (s, o, d) => {
|
|
31
31
|
this._tokenList.dispatchEvent(new KeyboardEvent(s.type, s)), !d && !this.isOpened && this.show();
|
|
32
32
|
}).connect(e);
|
|
33
33
|
}
|
|
@@ -67,20 +67,20 @@ class O {
|
|
|
67
67
|
return this._suggestItems[this._tokenList.focusIndex];
|
|
68
68
|
}
|
|
69
69
|
}
|
|
70
|
-
const q =
|
|
70
|
+
const q = `:host{flex-shrink:0;max-width:100%}:host([aria-checked=true]){position:relative}:host([aria-checked=true]):before{content:"";position:absolute;left:0;top:0;height:12px;width:12px;background:#1467ba url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='12'%20height='12'%20fill='none'%3e%3cpath%20stroke='%23FFF'%20stroke-width='2'%20d='M9%204%205%208%203%206'/%3e%3c/svg%3e") no-repeat center center}.container{display:flex;height:28px;background-color:var(--token-background-color, #f3f3f3);border:var(--token-focused-border, var(--token-border));box-sizing:border-box}.container .icon-wrapper{display:flex;flex-shrink:0;justify-content:center;align-items:center;width:28px;height:100%;overflow:hidden;background-color:var(--token-icon-background-color, transparent)}.container .icon-wrapper .icon{height:100%;width:100%;object-fit:contain;background-size:cover;background-repeat:no-repeat;background-position:center}.container .value{display:inline-block;align-self:center;padding:0 8px;font-family:Segoe UI,Lucida Sans,Arial,sans-serif;font-size:16px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.container .delete-button-wrapper{display:flex;align-self:center;height:16px;width:16px;padding-right:8px;opacity:.5}.container .delete-button-wrapper:hover{cursor:pointer;filter:brightness(10%);opacity:1}`, M = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16">\r
|
|
71
71
|
<path d="m3.5 12.5 9-9m-9 0 9 9" style="fill:none;stroke:#333;stroke-linecap:square;stroke-width:1.1px"/>\r
|
|
72
72
|
</svg>`;
|
|
73
|
-
var
|
|
74
|
-
for (var n = i > 1 ? void 0 : i ?
|
|
73
|
+
var $ = Object.defineProperty, R = Object.getOwnPropertyDescriptor, g = (r, e, t, i) => {
|
|
74
|
+
for (var n = i > 1 ? void 0 : i ? R(e, t) : e, s = r.length - 1, o; s >= 0; s--)
|
|
75
75
|
(o = r[s]) && (n = (i ? o(e, t, n) : o(n)) || n);
|
|
76
|
-
return i && n &&
|
|
76
|
+
return i && n && $(e, t, n), n;
|
|
77
77
|
};
|
|
78
78
|
const w = {
|
|
79
79
|
fromAttribute: (r) => r == "true",
|
|
80
80
|
toAttribute: (r) => r
|
|
81
81
|
};
|
|
82
82
|
var u;
|
|
83
|
-
const p = (u = class extends
|
|
83
|
+
const p = (u = class extends x {
|
|
84
84
|
constructor() {
|
|
85
85
|
super(...arguments), this.value = "", this.type = "", this.icon = "", this.iconPlaceholder = "", this.iconBackgroundColor = "", this._checked = !1;
|
|
86
86
|
}
|
|
@@ -110,7 +110,7 @@ const p = (u = class extends I {
|
|
|
110
110
|
${this.renderIcon()}
|
|
111
111
|
<slot name="after-icon"></slot>
|
|
112
112
|
<div class="value">${this.value}</div>
|
|
113
|
-
${this.disabled ?
|
|
113
|
+
${this.disabled ? I : m` <div class="delete-button-wrapper">${P(M)}</div> `}
|
|
114
114
|
</div>
|
|
115
115
|
`;
|
|
116
116
|
}
|
|
@@ -118,12 +118,12 @@ const p = (u = class extends I {
|
|
|
118
118
|
if (this.icon || this.iconPlaceholder) {
|
|
119
119
|
const e = this.iconBackgroundColor != null ? `--token-icon-background-color: ${this.iconBackgroundColor}` : void 0;
|
|
120
120
|
return m`
|
|
121
|
-
<div class="icon-wrapper" style="${
|
|
121
|
+
<div class="icon-wrapper" style="${A(e)}" role="img">
|
|
122
122
|
<div part="icon" class="icon"></div>
|
|
123
123
|
</div>
|
|
124
124
|
`;
|
|
125
125
|
}
|
|
126
|
-
return
|
|
126
|
+
return I;
|
|
127
127
|
}
|
|
128
128
|
updated(e) {
|
|
129
129
|
super.updated(e), (e.has("icon") || e.has("iconPlaceholder")) && (this.icon || this.iconPlaceholder) && D.showImage(this.shadowRoot.querySelector(".icon"), this.icon, this.iconPlaceholder), e.has("disabled") && !this.disabled && this.checked && (this.checked = !1);
|
|
@@ -168,7 +168,7 @@ const N = (r, e) => {
|
|
|
168
168
|
};
|
|
169
169
|
b.ensureDefined();
|
|
170
170
|
const k = "web application/json";
|
|
171
|
-
class
|
|
171
|
+
class F {
|
|
172
172
|
constructor(e, t, i) {
|
|
173
173
|
navigator.clipboard && (e.addEventListener("copy", () => {
|
|
174
174
|
t() || this.writeToClipboard(e);
|
|
@@ -204,8 +204,8 @@ class G {
|
|
|
204
204
|
}
|
|
205
205
|
}
|
|
206
206
|
}
|
|
207
|
-
const
|
|
208
|
-
class
|
|
207
|
+
const G = ":host{display:flex;contain:layout style}:host .additonal-content::slotted(*){align-self:end;flex-shrink:0}:host([drop]) ::slotted(*){pointer-events:none}:host(:not([readonly])) ::slotted(sd-token:last-of-type){max-width:calc(100% - 24px);margin-right:24px;margin-bottom:4px}:host ::slotted(sd-token){--token-border: 1px solid transparent;margin:2px}.input:focus-within ::slotted(sd-token[aria-current=true]),.container:focus-within ::slotted(sd-token[aria-current=true]){outline:2px solid #1467ba;--token-focused-border: 1px solid #fff}.container{outline:none;display:flex;flex-wrap:wrap;gap:4px;flex-grow:1;min-width:0;margin-top:auto}.container .placeholder{color:#767676;line-height:24px;align-self:flex-end}.input{flex-grow:1;min-width:0;width:100%;margin-top:auto}.input .token-wrapper{display:flex;flex-wrap:wrap;flex:1 0 auto;width:100%;gap:8px}";
|
|
208
|
+
class H {
|
|
209
209
|
constructor(e, t) {
|
|
210
210
|
this.tokenSelector = e;
|
|
211
211
|
const i = /* @__PURE__ */ new Map(), n = (s) => {
|
|
@@ -277,19 +277,19 @@ class F {
|
|
|
277
277
|
}), i.slot = "items", this.tokenSelector.appendChild(i), requestAnimationFrame(() => i.remove()), i;
|
|
278
278
|
}
|
|
279
279
|
}
|
|
280
|
-
var
|
|
281
|
-
for (var n = i > 1 ? void 0 : i ?
|
|
280
|
+
var B = Object.defineProperty, V = Object.getOwnPropertyDescriptor, h = (r, e, t, i) => {
|
|
281
|
+
for (var n = i > 1 ? void 0 : i ? V(e, t) : e, s = r.length - 1, o; s >= 0; s--)
|
|
282
282
|
(o = r[s]) && (n = (i ? o(e, t, n) : o(n)) || n);
|
|
283
|
-
return i && n &&
|
|
283
|
+
return i && n && B(e, t, n), n;
|
|
284
284
|
};
|
|
285
|
-
function
|
|
285
|
+
function K(r, e) {
|
|
286
286
|
let t;
|
|
287
287
|
return function(...i) {
|
|
288
288
|
t != null && clearTimeout(t), t = window.setTimeout(() => r(...i), e);
|
|
289
289
|
};
|
|
290
290
|
}
|
|
291
|
-
var
|
|
292
|
-
const l = (c = class extends
|
|
291
|
+
var j = /* @__PURE__ */ ((r) => (r.RemoveOnly = "remove-only", r.Multi = "multi", r))(j || {}), c;
|
|
292
|
+
const l = (c = class extends x {
|
|
293
293
|
constructor() {
|
|
294
294
|
super(...arguments), this.selectionMode = "multi", this.items = [], this.selectedIndexes = [], this._tokenGenerator = N, this._autoSuggestItemGenerator = _, this.additionalTokenCommittingKeys = [], this._activeTokenIndex = -1, this.handleInputKeyDown = (e, t) => {
|
|
295
295
|
if ((e.key === "Enter" || this.additionalTokenCommittingKeys.includes(e.key)) && t.value) {
|
|
@@ -353,10 +353,10 @@ const l = (c = class extends I {
|
|
|
353
353
|
if (n instanceof HTMLElement && (e.composedPath().indexOf(t) > -1 || n.getAttribute("popover-for") === "token-autosuggest-popover"))
|
|
354
354
|
return !0;
|
|
355
355
|
}) || this.commitTokenValue(t.value);
|
|
356
|
-
}, this.debouncedShowTokenSuggestPopover =
|
|
356
|
+
}, this.debouncedShowTokenSuggestPopover = K(this.showFilteredTokenSuggestions.bind(this), 200);
|
|
357
357
|
}
|
|
358
358
|
static get styles() {
|
|
359
|
-
return T(
|
|
359
|
+
return T(G);
|
|
360
360
|
}
|
|
361
361
|
get tokenGenerator() {
|
|
362
362
|
return this._tokenGenerator;
|
|
@@ -384,10 +384,10 @@ const l = (c = class extends I {
|
|
|
384
384
|
<slot name="items"
|
|
385
385
|
>${this.placeholder ? m`<span part="remove-only-placeholder" class="placeholder"
|
|
386
386
|
>${this.placeholder}</span
|
|
387
|
-
>` :
|
|
387
|
+
>` : I}</slot
|
|
388
388
|
>
|
|
389
389
|
</div>
|
|
390
|
-
<slot class="additonal-content" name="additional-content"></slot>` : m`
|
|
390
|
+
<slot class="additonal-content" name="additional-content" @focusin=${this.clearCheckedTokens}></slot>` : m`
|
|
391
391
|
<sd-lit-input
|
|
392
392
|
class="input"
|
|
393
393
|
.extendedPrefix=${!0}
|
|
@@ -401,23 +401,28 @@ const l = (c = class extends I {
|
|
|
401
401
|
tabindex="0"
|
|
402
402
|
><div class="token-wrapper" slot="prefix"><slot name="items"></slot></div>
|
|
403
403
|
</sd-lit-input>
|
|
404
|
-
<slot class="additonal-content" name="additional-content"></slot>
|
|
404
|
+
<slot class="additonal-content" name="additional-content" @focusin=${this.clearCheckedTokens}></slot>
|
|
405
405
|
`;
|
|
406
406
|
}
|
|
407
407
|
firstUpdated(e) {
|
|
408
408
|
super.firstUpdated(e), this.setAttribute("role", "listbox"), this.setAttribute("aria-multiselectable", "true"), this.hasAttribute("tabIndex") || (this.tabIndex = 0), this.addEventListener("focusout", (t) => {
|
|
409
409
|
const i = t.relatedTarget;
|
|
410
|
-
!this.contains(i) && !this.shadowRoot.contains(i) && this.
|
|
411
|
-
|
|
412
|
-
);
|
|
413
|
-
}), new
|
|
410
|
+
!this.contains(i) && !this.shadowRoot.contains(i) && this.clearCheckedTokens();
|
|
411
|
+
}), this.addEventListener("focusin", () => {
|
|
412
|
+
this.selectionMode == "remove-only" && this.activeTokenIndex == -1 && this.items.length > 0 && (this.activeTokenIndex = 0);
|
|
413
|
+
}), new F(
|
|
414
414
|
this,
|
|
415
415
|
() => {
|
|
416
416
|
var t;
|
|
417
417
|
return (t = this.inputElement) == null ? void 0 : t.value;
|
|
418
418
|
},
|
|
419
419
|
(t) => this.selectOrAddItems(t)
|
|
420
|
-
), new
|
|
420
|
+
), new H(this, (t) => this.selectOrAddItems(t));
|
|
421
|
+
}
|
|
422
|
+
clearCheckedTokens() {
|
|
423
|
+
this.querySelectorAll("[slot='items'][aria-checked='true']").forEach(
|
|
424
|
+
(e) => e.checked = !1
|
|
425
|
+
);
|
|
421
426
|
}
|
|
422
427
|
removeSelectionOrActiveToken() {
|
|
423
428
|
if (!this.disabled) {
|
|
@@ -433,7 +438,10 @@ const l = (c = class extends I {
|
|
|
433
438
|
}
|
|
434
439
|
updateActiveToken(e) {
|
|
435
440
|
const t = this.querySelectorAll("[slot='items']").length - 1;
|
|
436
|
-
this.activeTokenIndex == -1 ? e < 0 && (this.activeTokenIndex = t) : this.activeTokenIndex == t && e > 0 ? (this.activeTokenIndex = -1, this.focus()) : this.activeTokenIndex = Math.max(0, Math.min(t, this.activeTokenIndex + e))
|
|
441
|
+
if (this.activeTokenIndex == -1 ? e < 0 && (this.activeTokenIndex = t) : this.activeTokenIndex == t && e > 0 && this.selectionMode == "multi" ? (this.activeTokenIndex = -1, this.focus()) : this.activeTokenIndex = Math.max(0, Math.min(t, this.activeTokenIndex + e)), this.activeTokenIndex > -1 && this.scrollHeight > this.offsetHeight) {
|
|
442
|
+
const i = this.activeTokenElement;
|
|
443
|
+
i.scrollIntoViewIfNeeded ? i.scrollIntoViewIfNeeded() : i.scrollIntoView();
|
|
444
|
+
}
|
|
437
445
|
}
|
|
438
446
|
commitTokenValue(e) {
|
|
439
447
|
if (this.disabled)
|
|
@@ -492,6 +500,7 @@ const l = (c = class extends I {
|
|
|
492
500
|
updateItems() {
|
|
493
501
|
if (!this.isConnected || !this.items)
|
|
494
502
|
return;
|
|
503
|
+
this.activeTokenIndex = -1;
|
|
495
504
|
const e = this.inputElement;
|
|
496
505
|
e && (!this._tokenSuggestPopover || !this._tokenSuggestPopover.isOpened) && (e.value = ""), this.querySelectorAll("[slot='items']").forEach((n) => {
|
|
497
506
|
this.removeChild(n);
|
|
@@ -599,7 +608,7 @@ const l = (c = class extends I {
|
|
|
599
608
|
}, c.ID = "sd-token-selector", c.ensureDefined = () => {
|
|
600
609
|
b.ensureDefined(), customElements.get(c.ID) || customElements.define(c.ID, c);
|
|
601
610
|
}, c.shadowRootOptions = {
|
|
602
|
-
...
|
|
611
|
+
...x.shadowRootOptions,
|
|
603
612
|
delegatesFocus: !0
|
|
604
613
|
}, c);
|
|
605
614
|
h([
|
|
@@ -647,7 +656,7 @@ h([
|
|
|
647
656
|
], l.prototype, "caseSensitive", 2);
|
|
648
657
|
let se = l;
|
|
649
658
|
export {
|
|
650
|
-
|
|
659
|
+
j as SelectionMode,
|
|
651
660
|
se as default,
|
|
652
661
|
N as generator
|
|
653
662
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-selector.mjs","sources":["../token-suggest-popover.ts","../clear.svg?raw","../token.ts","../clipboard-extension.ts","../drag-and-drop-extension.ts","../token-selector.ts"],"sourcesContent":["import Popover from \"@cas-smartdesign/popover\";\nimport VirtualList from \"@cas-smartdesign/virtual-list\";\nimport { TokenData } from \"./token\";\nimport SDInput from \"@cas-smartdesign/lit-input\";\nimport { KeyDownDelegator } from \"@cas-smartdesign/element-utils\";\n\nexport type Filter = (searchTerm: string, allTokens: TokenData[]) => TokenData[];\n\ntype TokenSelectedCallback = (token: TokenData) => void;\n\nexport default class TokenSuggestPopover {\n private _popover?: Popover;\n private _tokenList: VirtualList;\n private _suggestItems: TokenData[];\n private lastRequestedStartIndex: number;\n private lastRequestedStopIndex: number;\n private pointerDown: boolean;\n\n public filter: Filter = (searchTerm, allTokens) => {\n if (!searchTerm) {\n return allTokens;\n }\n return allTokens.filter((t) => {\n if (t.disabled || t.deactivated) {\n return false;\n }\n return t.caption && t.caption.toLowerCase().includes(searchTerm);\n });\n };\n\n constructor(\n private inputElement: SDInput,\n private notSelectedTokensProvider: () => TokenData[],\n tokenSelectedCallback: TokenSelectedCallback,\n private initializeCallback: (popover: TokenSuggestPopover) => void,\n ) {\n VirtualList.ensureDefined();\n\n this._tokenList = new VirtualList();\n this._tokenList.style.minWidth = \"250px\";\n this._tokenList.style.maxHeight = \"49vh\";\n this._tokenList.itemHeight = 50;\n this._tokenList.addEventListener(\"pointerdown\", () => {\n this.pointerDown = true;\n window.addEventListener(\n \"pointerup\",\n () => {\n this.pointerDown = false;\n this._tokenList.increaseWidthOnNextRenderIfNeeded();\n if (!this._tokenList.isUpdatePending) {\n this._tokenList.requestUpdate();\n }\n },\n { once: true, capture: true },\n );\n });\n this._tokenList.addEventListener(\"selection\", (e: CustomEvent) => {\n const suggestIndex = e.detail.index;\n const selectedToken = this._suggestItems[suggestIndex];\n tokenSelectedCallback(selectedToken);\n this.hide();\n });\n this._tokenList.addEventListener(\"data-request\", (event) => {\n this.lastRequestedStartIndex = event.detail.startIndex;\n this.lastRequestedStopIndex = event.detail.stopIndex;\n if (!this.pointerDown) {\n this._tokenList.increaseWidthOnNextRenderIfNeeded();\n }\n this._tokenList.items = this._suggestItems.slice(\n this.lastRequestedStartIndex,\n this.lastRequestedStopIndex + 1,\n );\n });\n\n new KeyDownDelegator(this._tokenList, (event, _offset, toggleSelection) => {\n this._tokenList.dispatchEvent(new KeyboardEvent(event.type, event));\n if (!toggleSelection && !this.isOpened) {\n this.show();\n }\n }).connect(inputElement);\n }\n\n public show() {\n if (this.inputElement.effectiveDisabled) {\n return;\n }\n this.popover; // ensure init\n\n this._suggestItems = this.filterItems((this.inputElement.value || \"\").toLowerCase());\n if (this._suggestItems.length == 0) {\n this.hide();\n } else {\n this._tokenList.itemCount = this._suggestItems.length;\n this._tokenList.focusIndex = -1;\n this._tokenList.style.width = null;\n requestAnimationFrame(() => {\n if (this.lastRequestedStartIndex != null) {\n this._tokenList.increaseWidthOnNextRenderIfNeeded();\n this._tokenList.items = this._suggestItems.slice(\n this.lastRequestedStartIndex,\n this.lastRequestedStopIndex + 1,\n );\n }\n });\n\n this.popover.show();\n }\n }\n\n public refreshItems() {\n if (this.isOpened) {\n this._suggestItems = this.filterItems((this.inputElement.value || \"\").toLowerCase());\n if (this._suggestItems.length == 0) {\n this.hide();\n } else {\n this._tokenList.itemCount = this._suggestItems.length;\n this._tokenList.items = [];\n this._tokenList.style.width = null;\n }\n }\n }\n\n private filterItems(searchTerm: string): TokenData[] {\n const allTokens = this.notSelectedTokensProvider();\n return this.filter(searchTerm, allTokens);\n }\n\n public hide() {\n this._suggestItems = [];\n this._tokenList.itemCount = 0;\n this._tokenList.items = [];\n this._popover?.hide();\n }\n\n get list(): VirtualList {\n return this._tokenList;\n }\n\n get popover(): Popover {\n if (!this._popover) {\n this._popover = this.createPopover();\n this.initializeCallback(this);\n }\n return this._popover;\n }\n\n private createPopover(): Popover {\n const popover = new Popover();\n popover.setAttribute(\"trigger-type\", \"manual\");\n popover.setAttribute(\"placement\", \"bottom-start\");\n popover.setAttribute(\"modal\", \"\");\n popover.setAttribute(\"popover-for\", \"token-autosuggest-popover\");\n popover.setAttribute(\"offset\", \"-2\");\n popover.targetElement = this.inputElement;\n popover.appendChild(this._tokenList);\n return popover;\n }\n\n public get isOpened(): boolean {\n return this._popover && this._popover.hasAttribute(\"open\");\n }\n\n public get focusedSuggestToken(): TokenData {\n return this._suggestItems[this._tokenList.focusIndex];\n }\n}\n","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 16 16\\\">\\r\\n <path d=\\\"m3.5 12.5 9-9m-9 0 9 9\\\" style=\\\"fill:none;stroke:#333;stroke-linecap:square;stroke-width:1.1px\\\"/>\\r\\n</svg>\"","import {\n LitElement,\n TemplateResult,\n html,\n nothing,\n CSSResult,\n unsafeCSS,\n PropertyValues,\n ComplexAttributeConverter,\n} from \"lit\";\nimport { property } from \"lit/decorators/property.js\";\nimport { ifDefined } from \"lit/directives/if-defined.js\";\nimport { unsafeSVG } from \"lit/directives/unsafe-svg.js\";\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [Token.ID]: Token;\n }\n}\n\nimport style from \"./scss/token.scss?inline\";\nimport { default as clearSvg } from \"./clear.svg?raw\";\nimport ImageTools from \"@cas-smartdesign/image-tools\";\n\nexport interface TokenData {\n caption?: string;\n description?: string;\n type?: string;\n icon?: string;\n iconPlaceholder?: string;\n iconBackgroundColor?: string;\n disabled?: boolean;\n deactivated?: boolean;\n}\n\ntype TokenActionCallback = (tokenIndex: number) => void;\n\nconst alwaysPresentBooleanAttributeConverter = {\n fromAttribute: (value) => value == \"true\",\n toAttribute: (value) => value,\n} as ComplexAttributeConverter;\n\nexport default class Token extends LitElement {\n public static readonly ID = \"sd-token\";\n public static ensureDefined = (): void => {\n if (!customElements.get(Token.ID)) {\n customElements.define(Token.ID, Token);\n }\n };\n\n @property({ type: String, attribute: true, reflect: true })\n public value = \"\";\n @property({ type: String, attribute: true, reflect: true })\n public type = \"\";\n @property({ type: String })\n public icon = \"\";\n @property({ type: String })\n public iconPlaceholder = \"\";\n @property({ type: String })\n public iconBackgroundColor = \"\";\n @property({ converter: alwaysPresentBooleanAttributeConverter, reflect: true, attribute: \"aria-disabled\" })\n public disabled: boolean;\n @property({ converter: alwaysPresentBooleanAttributeConverter, reflect: true, attribute: \"aria-current\" })\n public current: boolean;\n\n public index: number;\n private _checked: boolean = false;\n\n private _tokenClickHandler: TokenActionCallback;\n private _tokenDeleteHandler: TokenActionCallback;\n\n static get styles(): CSSResult {\n return unsafeCSS(style);\n }\n\n public set checked(value: boolean) {\n const oldValue = this._checked;\n this._checked = !this.disabled && value;\n this.requestUpdate(\"checked\", oldValue);\n }\n\n @property({ converter: alwaysPresentBooleanAttributeConverter, reflect: true, attribute: \"aria-checked\" })\n public get checked(): boolean {\n return this._checked;\n }\n\n protected firstUpdated(changedProperties: PropertyValues): void {\n super.firstUpdated(changedProperties);\n this.tabIndex = -1;\n\n this.setAttribute(\"role\", \"option\");\n this.setAttribute(\"aria-selected\", \"true\");\n\n this.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n if (e.getModifierState(\"Control\")) {\n this.checked = !this.checked;\n } else {\n this.checked = true;\n if (this._tokenClickHandler) {\n this._tokenClickHandler(this.index);\n }\n }\n });\n\n const deleteButton = this.shadowRoot.querySelector(\".delete-button-wrapper\");\n if (deleteButton) {\n deleteButton.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n if (this._tokenDeleteHandler) {\n this._tokenDeleteHandler(this.index);\n }\n });\n }\n }\n\n public render(): TemplateResult {\n return html`\n <div class=\"container\">\n <slot name=\"before-icon\"></slot>\n ${this.renderIcon()}\n <slot name=\"after-icon\"></slot>\n <div class=\"value\">${this.value}</div>\n ${this.disabled ? nothing : html` <div class=\"delete-button-wrapper\">${unsafeSVG(clearSvg)}</div> `}\n </div>\n `;\n }\n\n private renderIcon() {\n if (this.icon || this.iconPlaceholder) {\n const iconBackgroundStyle =\n this.iconBackgroundColor != null\n ? `--token-icon-background-color: ${this.iconBackgroundColor}`\n : undefined;\n return html`\n <div class=\"icon-wrapper\" style=\"${ifDefined(iconBackgroundStyle)}\" role=\"img\">\n <div part=\"icon\" class=\"icon\"></div>\n </div>\n `;\n }\n return nothing;\n }\n\n public updated(changedProperties: PropertyValues): void {\n super.updated(changedProperties);\n if (\n (changedProperties.has(\"icon\") || changedProperties.has(\"iconPlaceholder\")) &&\n (this.icon || this.iconPlaceholder)\n ) {\n ImageTools.showImage(this.shadowRoot.querySelector(\".icon\"), this.icon, this.iconPlaceholder);\n }\n if (changedProperties.has(\"disabled\") && !this.disabled && this.checked) {\n this.checked = false;\n }\n }\n\n public setClickHandler(clickHandler: TokenActionCallback) {\n this._tokenClickHandler = clickHandler;\n }\n\n public setDeleteHandler(deleteHandler: TokenActionCallback) {\n this._tokenDeleteHandler = deleteHandler;\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport const generator = (data: TokenData, _index: number): Token => {\n const token = document.createElement(Token.ID) as Token;\n if (data) {\n token.value = data.caption;\n token.type = data.type;\n token.icon = data.icon;\n token.iconPlaceholder = data.iconPlaceholder;\n token.iconBackgroundColor = data.iconBackgroundColor;\n token.disabled = data.disabled;\n\n token.index = _index;\n }\n return token;\n};\n\nToken.ensureDefined();\n","import TokenSelector from \"./token-selector\";\nimport Token from \"./token\";\nimport SDInput from \"@cas-smartdesign/lit-input\";\n\nconst RELEVANT_MIME_TYPE = \"web application/json\";\n\nexport default class ClipboardExtension {\n constructor(\n tokenSelector: TokenSelector,\n getInputElementValue: () => string,\n pasteItems: (item: unknown[]) => void,\n ) {\n if (navigator.clipboard) {\n tokenSelector.addEventListener(\"copy\", () => {\n if (!getInputElementValue()) {\n this.writeToClipboard(tokenSelector);\n }\n });\n\n tokenSelector.addEventListener(\"cut\", () => {\n if (!getInputElementValue()) {\n tokenSelector.removeSelectionOrActiveToken();\n this.writeToClipboard(tokenSelector);\n }\n });\n\n tokenSelector.addEventListener(\"paste\", () => {\n if (!tokenSelector.disabled) {\n this.readFromClipboard(pasteItems);\n }\n });\n }\n }\n\n private writeToClipboard(tokenSelector: TokenSelector) {\n const checkedTokens = tokenSelector.querySelectorAll(\"[slot='items'][aria-checked='true']\");\n const relevantIndexes: number[] = [];\n if (checkedTokens.length > 0) {\n checkedTokens.forEach((t: Token) => relevantIndexes.push(t.index));\n } else if (tokenSelector.activeTokenIndex != -1) {\n const activeToken = tokenSelector.activeTokenElement;\n if (activeToken) {\n relevantIndexes.push(activeToken.index);\n }\n }\n if (relevantIndexes.length > 0) {\n const asJson = JSON.stringify(relevantIndexes.map((index) => tokenSelector.items[index]));\n const asBlob = new Blob([asJson], { type: RELEVANT_MIME_TYPE });\n navigator.clipboard.write([\n new ClipboardItem({\n [RELEVANT_MIME_TYPE]: asBlob,\n }),\n ]);\n }\n }\n\n private async readFromClipboard(pasteItems: (item: unknown[]) => void) {\n const clipboardItems = await navigator.clipboard.read();\n for (const clipboardItem of clipboardItems) {\n if (clipboardItem.types.includes(RELEVANT_MIME_TYPE)) {\n const blob = await clipboardItem.getType(RELEVANT_MIME_TYPE);\n const asText = await blob.text();\n const json = JSON.parse(asText);\n if (Array.isArray(json)) {\n pasteItems(json);\n }\n }\n }\n }\n}\n","import TokenSelector from \"./token-selector\";\nimport Token from \"./token\";\n\nexport default class DnDExtension {\n constructor(\n private tokenSelector: TokenSelector,\n addMatchingItems: (item: unknown[]) => number[],\n ) {\n const indexMapping = new Map();\n\n const handleGlobalDrop = (event: DragEvent) => {\n const target = event.target as HTMLElement;\n tokenSelector.removeAttribute(\"drag-source\");\n if (!tokenSelector.contains(target)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const addedIndexes = (event as any).addedIndexes as number[];\n if (addedIndexes) {\n tokenSelector.removeTokens(addedIndexes.map((i) => indexMapping.get(i)));\n }\n }\n indexMapping.clear();\n };\n\n tokenSelector.addEventListener(\"dragstart\", (event) => {\n const target = event.target;\n if (target instanceof Token) {\n if (target.disabled) {\n event.preventDefault();\n return;\n }\n tokenSelector.setAttribute(\"drag-source\", \"\");\n target.setAttribute(\"aria-checked\", \"true\");\n const checkedTokens = tokenSelector.querySelectorAll(\"[slot='items'][aria-checked='true']\");\n if (checkedTokens.length > 0) {\n const draggedItems = Array.from(checkedTokens)\n .filter((t: Token) => !t.disabled)\n .map((t: Token, index) => {\n indexMapping.set(index, t.index);\n return tokenSelector.items[t.index];\n });\n event.dataTransfer.setData(\"text/sd-token-selector\", JSON.stringify(draggedItems));\n event.dataTransfer.dropEffect = \"move\";\n event.dataTransfer.effectAllowed = \"move\";\n if (checkedTokens.length > 1) {\n const customDragImage = this.createCustomDragImage(target, draggedItems.length);\n event.dataTransfer.setDragImage(customDragImage, -14, -14);\n }\n window.addEventListener(\"drop\", handleGlobalDrop, { once: true });\n }\n }\n });\n tokenSelector.addEventListener(\"dragenter\", (event) => {\n tokenSelector.setAttribute(\"drop\", \"\");\n event.preventDefault();\n });\n tokenSelector.addEventListener(\"dragover\", (event) => event.preventDefault());\n tokenSelector.addEventListener(\"dragleave\", (event) => {\n if (event.target == tokenSelector) {\n tokenSelector.removeAttribute(\"drop\");\n }\n });\n tokenSelector.addEventListener(\"drop\", (event) => {\n tokenSelector.removeAttribute(\"drop\");\n const data = event.dataTransfer.getData(\"text/sd-token-selector\");\n if (data) {\n try {\n const asJson = JSON.parse(data);\n if (Array.isArray(asJson)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (event as any).addedIndexes = addMatchingItems(asJson);\n event.preventDefault();\n }\n } catch (ignored) {}\n }\n });\n tokenSelector.addEventListener(\"dragend\", () => {\n window.removeEventListener(\"drop\", handleGlobalDrop);\n tokenSelector.removeAttribute(\"drag-source\");\n indexMapping.clear();\n });\n }\n\n private createCustomDragImage(targetToken: Token, draggedItemsNumber: number): HTMLElement {\n let dragImage = targetToken.cloneNode(true) as HTMLElement;\n dragImage.setAttribute(\"aria-disabled\", \"true\");\n if (this.tokenSelector.tokenType) {\n (dragImage as Token).value = draggedItemsNumber + \" \" + this.tokenSelector.tokenType;\n } else {\n const counter = document.createElement(\"div\");\n counter.innerText = \"+\" + (draggedItemsNumber - 1);\n Object.assign(counter.style, {\n position: \"absolute\",\n left: \"90%\",\n top: \"75%\",\n });\n const wrapper = document.createElement(\"div\");\n wrapper.appendChild(dragImage);\n wrapper.appendChild(counter);\n dragImage = wrapper;\n }\n Object.assign(dragImage.style, {\n height: targetToken.offsetHeight,\n outline: \"none\",\n maxWidth: \"500px\",\n position: \"absolute\",\n display: \"block\",\n left: \"-99999px\",\n overflow: \"visible\",\n margin: \"1px\",\n });\n dragImage.slot = \"items\";\n this.tokenSelector.appendChild(dragImage);\n requestAnimationFrame(() => dragImage.remove());\n return dragImage;\n }\n}\n","import { LitElement, TemplateResult, html, CSSResult, unsafeCSS, PropertyValues, nothing } from \"lit\";\nimport { property } from \"lit/decorators/property.js\";\n\nimport \"@cas-smartdesign/lit-input\";\nimport SDInput, { IValueChangeEvent } from \"@cas-smartdesign/lit-input\";\nimport SDFieldValidationMessage, { ValidationLevel } from \"@cas-smartdesign/field-validation-message\";\nimport { ItemGenerator } from \"@cas-smartdesign/virtual-list\";\nimport { generator as itemGenerator } from \"@cas-smartdesign/list-item\";\n\nimport TokenSuggestPopover, { Filter } from \"./token-suggest-popover\";\nimport Token, { generator, TokenData } from \"./token\";\nimport ClipboardExtension from \"clipboard-extension\";\nimport style from \"./scss/token-selector.scss?inline\";\nimport DnDExtension from \"drag-and-drop-extension\";\n\nexport type { Filter as InMemoryFilter } from \"./token-suggest-popover\";\nexport type { TokenData } from \"./token\";\nexport { generator } from \"./token\";\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 [TokenSelector.ID]: TokenSelector;\n }\n}\n\nexport interface ITokenClickedEvent {\n index: number;\n tokenElement: Token;\n byPointerDevice: boolean;\n}\nexport interface ITokensRemovedEvent {\n removedIndices: number[];\n selectedIndices?: number[];\n}\nexport interface ITokenSelectedEvent {\n newIndices: number[];\n selectedIndices: number[];\n}\nexport interface ITokenCreatedEvent {\n value: string;\n}\n\nexport enum SelectionMode {\n RemoveOnly = \"remove-only\",\n Multi = \"multi\",\n}\n\nexport interface CustomEventMap extends HTMLElementEventMap {\n \"token-clicked\": CustomEvent<ITokenClickedEvent>;\n \"tokens-removed\": CustomEvent<ITokensRemovedEvent>;\n \"tokens-selected\": CustomEvent<ITokenSelectedEvent>;\n \"token-created\": CustomEvent<ITokenCreatedEvent>;\n \"auto-suggest-initialized\": CustomEvent;\n}\n\nexport default interface TokenSelector {\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 type TokenGenerator = (data: TokenData, index: number) => Token;\n\nexport default class TokenSelector extends LitElement {\n public static readonly ID = \"sd-token-selector\";\n public static ensureDefined = (): void => {\n Token.ensureDefined();\n if (!customElements.get(TokenSelector.ID)) {\n customElements.define(TokenSelector.ID, TokenSelector);\n }\n };\n\n @property({ type: String, attribute: \"selection-mode\", reflect: true })\n public selectionMode: SelectionMode = SelectionMode.Multi;\n @property({ type: Array, attribute: false })\n public items: TokenData[] = [];\n @property({ type: Array, attribute: false })\n public selectedIndexes: number[] = [];\n @property({ type: String, reflect: true })\n public placeholder: string;\n @property({ type: String, reflect: true, attribute: \"suggest-list-class\" })\n public suggestListClass: string;\n @property({ type: String, reflect: true, attribute: \"input-label\" })\n public inputLabel: string;\n @property({\n converter: {\n fromAttribute: (value) => value == \"true\",\n toAttribute: (value) => value,\n },\n reflect: true,\n attribute: \"aria-disabled\",\n })\n public disabled: boolean;\n @property({ type: String, attribute: true })\n public validationMessage: string;\n @property({ type: String, attribute: true })\n public validationIconSrc: string;\n @property({ converter: SDFieldValidationMessage.levelConverter, attribute: true, reflect: true })\n public validationLevel: ValidationLevel;\n @property({ type: String, reflect: true, attribute: \"token-type\" })\n public tokenType: string;\n @property({ type: Boolean, reflect: true, attribute: \"case-sensitive\" })\n public caseSensitive: boolean;\n\n public suggestionFilter: Filter;\n\n private _tokenGenerator: TokenGenerator = generator;\n private _autoSuggestItemGenerator: ItemGenerator = itemGenerator;\n\n private additionalTokenCommittingKeys: string[] = [];\n\n private _tokenSuggestPopover: TokenSuggestPopover;\n\n private cancelSearch: boolean;\n private _activeTokenIndex = -1;\n\n static get styles(): CSSResult {\n return unsafeCSS(style);\n }\n\n static shadowRootOptions: ShadowRootInit = {\n ...LitElement.shadowRootOptions,\n delegatesFocus: true,\n };\n\n public get tokenGenerator(): TokenGenerator {\n return this._tokenGenerator;\n }\n\n public set tokenGenerator(value: TokenGenerator) {\n this._tokenGenerator = value;\n this.render();\n }\n\n public get autoSuggestItemGenerator(): ItemGenerator {\n return this._autoSuggestItemGenerator;\n }\n\n public set autoSuggestItemGenerator(value: ItemGenerator) {\n this._autoSuggestItemGenerator = value;\n if (this._tokenSuggestPopover) {\n this._tokenSuggestPopover.list.itemGenerator = value;\n }\n }\n\n public setAdditionalTokenCommittingKeys(keys: string[]): void {\n this.additionalTokenCommittingKeys = keys;\n }\n\n public openSuggestions(): void {\n if (this.inputElement) {\n this.focus();\n this.tokenSuggestPopover.show();\n }\n }\n\n public focus() {\n if (this.inputElement) {\n this.inputElement.focus();\n } else {\n (this.shadowRoot.querySelector(\".container\") as HTMLElement).focus();\n }\n }\n\n public render(): TemplateResult {\n return this.selectionMode == SelectionMode.RemoveOnly\n ? html`<div class=\"container\" tabindex=\"0\">\n <slot name=\"items\"\n >${this.placeholder\n ? html`<span part=\"remove-only-placeholder\" class=\"placeholder\"\n >${this.placeholder}</span\n >`\n : nothing}</slot\n >\n </div>\n <slot class=\"additonal-content\" name=\"additional-content\"></slot>`\n : html`\n <sd-lit-input\n class=\"input\"\n .extendedPrefix=${true}\n .label=${this.inputLabel}\n .validationLevel=${this.validationLevel}\n .validationIconSrc=${this.validationIconSrc}\n .validationMessage=${this.validationMessage}\n .alwaysFloatLabel=${this.selectedIndexes.length > 0}\n .placeholder=${this.selectedIndexes.length == 0 ? this.placeholder : \"\"}\n .disabled=${this.disabled}\n tabindex=\"0\"\n ><div class=\"token-wrapper\" slot=\"prefix\"><slot name=\"items\"></slot></div>\n </sd-lit-input>\n <slot class=\"additonal-content\" name=\"additional-content\"></slot>\n `;\n }\n\n protected firstUpdated(_changedProperties: Map<string | number | symbol, unknown>): void {\n super.firstUpdated(_changedProperties);\n\n this.setAttribute(\"role\", \"listbox\");\n this.setAttribute(\"aria-multiselectable\", \"true\");\n if (!this.hasAttribute(\"tabIndex\")) {\n this.tabIndex = 0;\n }\n this.addEventListener(\"focusout\", (event) => {\n const target = event.relatedTarget as HTMLElement;\n if (!this.contains(target) && !this.shadowRoot.contains(target)) {\n this.querySelectorAll(\"[slot='items'][aria-checked='true']\").forEach(\n (checkedToken: Token) => (checkedToken.checked = false),\n );\n }\n });\n new ClipboardExtension(\n this,\n () => this.inputElement?.value,\n (items) => this.selectOrAddItems(items),\n );\n new DnDExtension(this, (items) => this.selectOrAddItems(items));\n }\n\n private handleInputKeyDown = (event: KeyboardEvent, input: SDInput) => {\n if ((event.key === \"Enter\" || this.additionalTokenCommittingKeys.includes(event.key)) && input.value) {\n event.preventDefault();\n event.stopPropagation();\n this.commitTokenValue(input.value);\n return;\n }\n\n switch (event.key) {\n case \"Escape\": {\n event.preventDefault();\n event.stopPropagation();\n this.tokenSuggestPopover.hide();\n break;\n }\n case \"Tab\": {\n this.commitTokenValue(input.value);\n this.tokenSuggestPopover.hide();\n break;\n }\n default: {\n this.handleKeyDown(event);\n }\n }\n };\n\n private handleKeyDown = (event: KeyboardEvent) => {\n switch (event.key) {\n case \"ArrowLeft\": {\n if (!this.hasInputValue) {\n this.updateActiveToken(-1);\n }\n break;\n }\n case \"ArrowRight\": {\n if (!this.hasInputValue) {\n this.updateActiveToken(1);\n }\n break;\n }\n case \"Enter\": {\n if (!this.hasInputValue && this.activeTokenIndex != -1) {\n const curEl = this.activeTokenElement;\n if (event.getModifierState(\"Control\")) {\n curEl.checked = !curEl.checked;\n } else {\n curEl.checked = true;\n this.onTokenClick(curEl, false);\n }\n if (document.activeElement != this) {\n this.focus();\n }\n }\n break;\n }\n case \"Backspace\": {\n if (!this.hasInputValue) {\n if (this.activeTokenIndex == -1) {\n this.updateActiveToken(-1);\n } else {\n this.removeSelectionOrActiveToken();\n }\n }\n break;\n }\n case \"Clear\":\n case \"Delete\": {\n this.removeSelectionOrActiveToken();\n break;\n }\n case \"a\": {\n if (!this.hasInputValue && event.getModifierState(\"Control\")) {\n this.querySelectorAll(\"[slot='items']\").forEach((item: Token) => (item.checked = true));\n event.preventDefault();\n event.stopPropagation();\n }\n break;\n }\n }\n };\n\n /**\n *\n * Called when items were given by paste or drag events to token-selector.\n * The purpose of this function is to add or create items accordingly.\n *\n * @param {unknown[]} items the pasted or dropped items\n * @return {number[]} the indexes that were added successfully\n */\n public selectOrAddItems = (items: unknown & { caption?: string }[]): number[] => {\n const addedIndexes = [];\n const newSelectedIndexes = items\n .map((item, index) => {\n const matchingIndex = item.caption == null ? -1 : this.findIndex(item);\n if (\n matchingIndex != -1 &&\n !this.items[matchingIndex].disabled &&\n !this.selectedIndexes.includes(matchingIndex)\n ) {\n addedIndexes.push(index);\n return matchingIndex;\n }\n return -1;\n })\n .filter((i) => -1 != i);\n if (newSelectedIndexes.length > 0) {\n this.handleTokenSelection(newSelectedIndexes);\n }\n return addedIndexes;\n };\n\n public removeSelectionOrActiveToken() {\n if (!this.disabled) {\n const checkedTokens = this.querySelectorAll(\"[slot='items'][aria-checked='true']\");\n if (checkedTokens.length > 0) {\n const tokensArray = Array.from(checkedTokens) as Token[];\n this.removeTokens(tokensArray.filter((t) => !t.disabled).map((t) => t.index));\n } else if (this.activeTokenIndex != -1) {\n const activeToken = this.activeTokenElement;\n if (activeToken && !activeToken.disabled) {\n this.removeTokens([activeToken.index]);\n }\n }\n }\n }\n\n private updateActiveToken(offset: number): void {\n const maxIndex = this.querySelectorAll(\"[slot='items']\").length - 1;\n if (this.activeTokenIndex == -1) {\n if (offset < 0) {\n this.activeTokenIndex = maxIndex;\n }\n } else {\n if (this.activeTokenIndex == maxIndex && offset > 0) {\n this.activeTokenIndex = -1;\n this.focus();\n } else {\n this.activeTokenIndex = Math.max(0, Math.min(maxIndex, this.activeTokenIndex + offset));\n }\n }\n }\n\n private commitTokenValue(tokenValue: string): void {\n if (this.disabled) {\n return;\n }\n\n // 'Commiting' supports three different cases:\n // 1. User navigates via arrow keys in the auto suggest list and selects an item with enter\n // 2. User enters a value that is already present as a token, so this token is 'selected'\n // 3. User enters a value that is new, so the token is 'created'\n\n if (this.tokenSuggestPopover.isOpened) {\n const focusedSuggestToken = this.tokenSuggestPopover.focusedSuggestToken;\n if (focusedSuggestToken) {\n if (!focusedSuggestToken.disabled) {\n const selectedTokenIndex = this.findIndex(focusedSuggestToken);\n this.handleTokenSelection([selectedTokenIndex]);\n this.tokenSuggestPopover.hide();\n }\n return;\n }\n }\n\n if (!tokenValue?.trim()) {\n return;\n }\n\n const tokenIndex = this.items.findIndex((item) =>\n this.caseSensitive ? item.caption == tokenValue : item.caption.toLowerCase() == tokenValue.toLowerCase(),\n );\n if (!this.selectedIndexes.includes(tokenIndex)) {\n if (tokenIndex >= 0) {\n this.handleTokenSelection([tokenIndex]);\n } else {\n this.handleTokenCreation(tokenValue);\n }\n }\n\n this.requestUpdate(\"selectedIndexes\");\n this.tokenSuggestPopover.hide();\n window.removeEventListener(\"pointerdown\", this.handleWindowPointerDown);\n }\n\n public updated(changedProperties: PropertyValues): void {\n super.updated(changedProperties);\n\n if (this._tokenSuggestPopover) {\n this.tokenSuggestPopover.list.className = this.suggestListClass || \"\";\n if (this.suggestionFilter) {\n this.tokenSuggestPopover.filter = this.suggestionFilter;\n }\n }\n\n if (changedProperties.has(\"selectionMode\")) {\n if (SelectionMode.Multi == this.selectionMode) {\n this.setAttribute(\"aria-haspopup\", \"listbox\");\n const input = this.inputElement;\n input.addEventListener(\"immediate-value-change\", (e) => this.handleInputValueChange(e));\n input.addEventListener(\"keydown\", (e) => this.handleInputKeyDown(e, input));\n window.queueMicrotask(() => this.tokenSuggestPopover); // lazy init of the popover\n } else {\n this.removeAttribute(\"aria-haspopup\");\n this.addEventListener(\"keydown\", this.handleKeyDown);\n if (this._tokenSuggestPopover) {\n this._tokenSuggestPopover.popover.remove();\n this._tokenSuggestPopover = null;\n }\n }\n }\n\n if (\n changedProperties.size == 0 ||\n changedProperties.has(\"selectionMode\") ||\n changedProperties.has(\"items\") ||\n changedProperties.has(\"selectedIndexes\") ||\n changedProperties.has(\"disabled\")\n ) {\n this.updateItems();\n }\n }\n\n private handleInputValueChange(event: CustomEvent<IValueChangeEvent>): void {\n const userInput = event.detail.value;\n if (!userInput) {\n this.tokenSuggestPopover.hide();\n this.cancelSearch = true;\n } else {\n this.activeTokenIndex = -1;\n this.cancelSearch = false;\n this.debouncedShowTokenSuggestPopover();\n window.addEventListener(\"pointerdown\", this.handleWindowPointerDown);\n }\n }\n\n private handleWindowPointerDown = (event: PointerEvent) => {\n const input = this.inputElement;\n if (!input || !input.value) return;\n\n const pointerDownOnInputOrList = event.composedPath().some((element) => {\n if (\n element instanceof HTMLElement &&\n (event.composedPath().indexOf(input) > -1 ||\n element.getAttribute(\"popover-for\") === \"token-autosuggest-popover\")\n ) {\n return true;\n }\n });\n\n if (!pointerDownOnInputOrList) {\n this.commitTokenValue(input.value);\n }\n };\n\n private debouncedShowTokenSuggestPopover = debounce(this.showFilteredTokenSuggestions.bind(this), 200);\n private showFilteredTokenSuggestions() {\n if (!this.cancelSearch && this.inputElement.value) {\n this.tokenSuggestPopover.show();\n }\n }\n\n private isTokenNotSelected(index: number): unknown {\n return !this.selectedIndexes.includes(index);\n }\n\n private get tokenSuggestPopover(): TokenSuggestPopover {\n if (!this._tokenSuggestPopover && this.inputElement) {\n this._tokenSuggestPopover = new TokenSuggestPopover(\n this.inputElement,\n () => this.items.filter((item, index) => !item.disabled && this.isTokenNotSelected(index)),\n (selectedToken) => {\n const selectedTokenIndex = this.findIndex(selectedToken);\n this.handleTokenSelection([selectedTokenIndex]);\n window.removeEventListener(\"pointerdown\", this.handleWindowPointerDown);\n },\n (suggestPopover) => {\n this.appendChild(suggestPopover.popover);\n this.dispatchEvent(new CustomEvent(\"auto-suggest-initialized\"));\n suggestPopover.popover.addEventListener(\"close\", () => {\n if (this.inputElement.value && !this.contains(document.activeElement)) {\n this.inputElement.value = \"\";\n }\n });\n },\n );\n this._tokenSuggestPopover.list.itemGenerator = this._autoSuggestItemGenerator;\n this._tokenSuggestPopover.list.className = this.suggestListClass;\n if (this.suggestionFilter) {\n this._tokenSuggestPopover.filter = this.suggestionFilter;\n }\n }\n return this._tokenSuggestPopover;\n }\n\n private updateItems(): void {\n if (!this.isConnected || !this.items) {\n return;\n }\n\n const input = this.inputElement;\n if (input && (!this._tokenSuggestPopover || !this._tokenSuggestPopover.isOpened)) {\n input.value = \"\";\n }\n\n this.querySelectorAll(\"[slot='items']\").forEach((oldItem) => {\n this.removeChild(oldItem);\n });\n\n const fragment = document.createDocumentFragment();\n\n let visibleTokens: TokenData[] = [];\n if (this.selectionMode == SelectionMode.RemoveOnly) {\n visibleTokens = this.items.map((item) => this.disableIfNeeded(item));\n } else {\n this.selectedIndexes.forEach((value) => {\n visibleTokens.push(this.disableIfNeeded(this.items[value]));\n });\n }\n\n visibleTokens.forEach((item) => {\n const token = this.tokenGenerator(item, this.findIndex(item));\n token.slot = \"items\";\n fragment.appendChild(token);\n if (!token.id) {\n token.id = window.crypto.getRandomValues(new Uint32Array(1))[0].toString(16);\n }\n\n token.setClickHandler(() => this.onTokenClick(token, true));\n token.addEventListener(\"click\", () => {\n if (document.activeElement != this) {\n this.focus();\n }\n });\n token.setDeleteHandler((tokenIndex) => this.removeTokens([tokenIndex]));\n });\n\n this.appendChild(fragment);\n if (this._tokenSuggestPopover) {\n this._tokenSuggestPopover.refreshItems();\n }\n }\n\n public removeTokens(indexes: number[]): void {\n if (this.disabled || indexes == null || indexes.length == 0) {\n return;\n }\n\n if (this.activeTokenIndex != -1 && indexes.includes(this.activeTokenElement.index)) {\n this.activeTokenIndex = -1;\n }\n if (this.selectionMode == SelectionMode.RemoveOnly) {\n this.dispatchEvent(\n new CustomEvent<ITokensRemovedEvent>(\"tokens-removed\", {\n detail: {\n removedIndices: indexes,\n },\n }),\n );\n } else {\n const matchingIndexes = indexes.filter((i) => this.selectedIndexes.includes(i));\n if (matchingIndexes.length > 0) {\n this.selectedIndexes = this.selectedIndexes.filter((i) => !matchingIndexes.includes(i));\n\n this.dispatchEvent(\n new CustomEvent<ITokensRemovedEvent>(\"tokens-removed\", {\n detail: {\n removedIndices: matchingIndexes,\n selectedIndices: [...this.selectedIndexes],\n },\n }),\n );\n }\n }\n }\n\n private onTokenClick(token: Token, byPointerDevice: boolean): void {\n let relevantIndex;\n this.querySelectorAll(\"[slot='items']\").forEach((item, i) => {\n if (token == item) {\n relevantIndex = i;\n } else {\n item.setAttribute(\"aria-checked\", \"false\");\n }\n });\n this.activeTokenIndex = relevantIndex;\n this.setAttribute(\"aria-activedescendant\", this.activeTokenElement.id);\n if (this._tokenSuggestPopover && this._tokenSuggestPopover.isOpened) {\n this._tokenSuggestPopover.hide();\n }\n this.dispatchEvent(\n new CustomEvent<ITokenClickedEvent>(\"token-clicked\", {\n detail: {\n index: token.index,\n tokenElement: token,\n byPointerDevice,\n },\n }),\n );\n }\n\n private disableIfNeeded(item: TokenData): TokenData {\n if (this.disabled) {\n return { ...item, disabled: true };\n }\n return item;\n }\n\n private handleTokenSelection(indexes: number[]) {\n this.selectedIndexes = this.selectedIndexes.concat(indexes);\n this.dispatchEvent(\n new CustomEvent<ITokenSelectedEvent>(\"tokens-selected\", {\n detail: {\n newIndices: indexes,\n selectedIndices: [...this.selectedIndexes],\n },\n }),\n );\n }\n\n private handleTokenCreation(tokenValue: string) {\n this.dispatchEvent(\n new CustomEvent(\"token-created\", {\n detail: {\n value: tokenValue,\n },\n }),\n );\n }\n\n private get inputElement(): SDInput | null {\n return this.shadowRoot.querySelector(\".input\") as SDInput;\n }\n\n public get activeTokenElement(): Token | null {\n return this.getTokenElement(this.activeTokenIndex);\n }\n\n private getTokenElement(index: number): Token | null {\n return this.querySelector(\"[slot='items']:nth-of-type(\" + (index + 1) + \")\");\n }\n\n public findIndex(token: TokenData) {\n return this.items.findIndex((item) => item.caption === token.caption);\n }\n\n public get activeTokenIndex(): number {\n return this._activeTokenIndex;\n }\n\n public set activeTokenIndex(value: number) {\n if (this._activeTokenIndex != -1) {\n const previous = this.activeTokenElement;\n if (previous) {\n previous.current = false;\n }\n }\n this._activeTokenIndex = value;\n if (value == -1) {\n this.removeAttribute(\"aria-activedescendant\");\n } else {\n const activeElement = this.activeTokenElement;\n activeElement.current = true;\n this.setAttribute(\"aria-activedescendant\", activeElement.id);\n }\n }\n\n private get hasInputValue() {\n return !!this.inputElement?.value;\n }\n}\n"],"names":["TokenSuggestPopover","inputElement","notSelectedTokensProvider","tokenSelectedCallback","initializeCallback","searchTerm","allTokens","t","VirtualList","e","suggestIndex","selectedToken","event","KeyDownDelegator","_offset","toggleSelection","_a","popover","Popover","clearSvg","alwaysPresentBooleanAttributeConverter","value","_Token","LitElement","unsafeCSS","style","oldValue","changedProperties","deleteButton","html","nothing","unsafeSVG","iconBackgroundStyle","ifDefined","ImageTools","clickHandler","deleteHandler","__decorateClass","property","Token","generator","data","_index","token","RELEVANT_MIME_TYPE","ClipboardExtension","tokenSelector","getInputElementValue","pasteItems","checkedTokens","relevantIndexes","activeToken","asJson","index","asBlob","clipboardItems","clipboardItem","asText","json","DnDExtension","addMatchingItems","indexMapping","handleGlobalDrop","target","addedIndexes","i","draggedItems","customDragImage","targetToken","draggedItemsNumber","dragImage","counter","wrapper","debounce","func","delay","timeout","args","SelectionMode","_TokenSelector","itemGenerator","input","curEl","item","items","newSelectedIndexes","matchingIndex","element","keys","_changedProperties","checkedToken","tokensArray","offset","maxIndex","tokenValue","focusedSuggestToken","selectedTokenIndex","tokenIndex","suggestPopover","oldItem","fragment","visibleTokens","indexes","matchingIndexes","byPointerDevice","relevantIndex","previous","activeElement","SDFieldValidationMessage","TokenSelector"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"token-selector.mjs","sources":["../token-suggest-popover.ts","../clear.svg?raw","../token.ts","../clipboard-extension.ts","../drag-and-drop-extension.ts","../token-selector.ts"],"sourcesContent":["import Popover from \"@cas-smartdesign/popover\";\nimport VirtualList from \"@cas-smartdesign/virtual-list\";\nimport { TokenData } from \"./token\";\nimport SDInput from \"@cas-smartdesign/lit-input\";\nimport { KeyDownDelegator } from \"@cas-smartdesign/element-utils\";\n\nexport type Filter = (searchTerm: string, allTokens: TokenData[]) => TokenData[];\n\ntype TokenSelectedCallback = (token: TokenData) => void;\n\nexport default class TokenSuggestPopover {\n private _popover?: Popover;\n private _tokenList: VirtualList;\n private _suggestItems: TokenData[];\n private lastRequestedStartIndex: number;\n private lastRequestedStopIndex: number;\n private pointerDown: boolean;\n\n public filter: Filter = (searchTerm, allTokens) => {\n if (!searchTerm) {\n return allTokens;\n }\n return allTokens.filter((t) => {\n if (t.disabled || t.deactivated) {\n return false;\n }\n return t.caption && t.caption.toLowerCase().includes(searchTerm);\n });\n };\n\n constructor(\n private inputElement: SDInput,\n private notSelectedTokensProvider: () => TokenData[],\n tokenSelectedCallback: TokenSelectedCallback,\n private initializeCallback: (popover: TokenSuggestPopover) => void,\n ) {\n VirtualList.ensureDefined();\n\n this._tokenList = new VirtualList();\n this._tokenList.style.minWidth = \"250px\";\n this._tokenList.style.maxHeight = \"49vh\";\n this._tokenList.itemHeight = 50;\n this._tokenList.addEventListener(\"pointerdown\", () => {\n this.pointerDown = true;\n window.addEventListener(\n \"pointerup\",\n () => {\n this.pointerDown = false;\n this._tokenList.increaseWidthOnNextRenderIfNeeded();\n if (!this._tokenList.isUpdatePending) {\n this._tokenList.requestUpdate();\n }\n },\n { once: true, capture: true },\n );\n });\n this._tokenList.addEventListener(\"selection\", (e: CustomEvent) => {\n const suggestIndex = e.detail.index;\n const selectedToken = this._suggestItems[suggestIndex];\n tokenSelectedCallback(selectedToken);\n this.hide();\n });\n this._tokenList.addEventListener(\"data-request\", (event) => {\n this.lastRequestedStartIndex = event.detail.startIndex;\n this.lastRequestedStopIndex = event.detail.stopIndex;\n if (!this.pointerDown) {\n this._tokenList.increaseWidthOnNextRenderIfNeeded();\n }\n this._tokenList.items = this._suggestItems.slice(\n this.lastRequestedStartIndex,\n this.lastRequestedStopIndex + 1,\n );\n });\n\n new KeyDownDelegator(this._tokenList, (event, _offset, toggleSelection) => {\n this._tokenList.dispatchEvent(new KeyboardEvent(event.type, event));\n if (!toggleSelection && !this.isOpened) {\n this.show();\n }\n }).connect(inputElement);\n }\n\n public show() {\n if (this.inputElement.effectiveDisabled) {\n return;\n }\n this.popover; // ensure init\n\n this._suggestItems = this.filterItems((this.inputElement.value || \"\").toLowerCase());\n if (this._suggestItems.length == 0) {\n this.hide();\n } else {\n this._tokenList.itemCount = this._suggestItems.length;\n this._tokenList.focusIndex = -1;\n this._tokenList.style.width = null;\n requestAnimationFrame(() => {\n if (this.lastRequestedStartIndex != null) {\n this._tokenList.increaseWidthOnNextRenderIfNeeded();\n this._tokenList.items = this._suggestItems.slice(\n this.lastRequestedStartIndex,\n this.lastRequestedStopIndex + 1,\n );\n }\n });\n\n this.popover.show();\n }\n }\n\n public refreshItems() {\n if (this.isOpened) {\n this._suggestItems = this.filterItems((this.inputElement.value || \"\").toLowerCase());\n if (this._suggestItems.length == 0) {\n this.hide();\n } else {\n this._tokenList.itemCount = this._suggestItems.length;\n this._tokenList.items = [];\n this._tokenList.style.width = null;\n }\n }\n }\n\n private filterItems(searchTerm: string): TokenData[] {\n const allTokens = this.notSelectedTokensProvider();\n return this.filter(searchTerm, allTokens);\n }\n\n public hide() {\n this._suggestItems = [];\n this._tokenList.itemCount = 0;\n this._tokenList.items = [];\n this._popover?.hide();\n }\n\n get list(): VirtualList {\n return this._tokenList;\n }\n\n get popover(): Popover {\n if (!this._popover) {\n this._popover = this.createPopover();\n this.initializeCallback(this);\n }\n return this._popover;\n }\n\n private createPopover(): Popover {\n const popover = new Popover();\n popover.setAttribute(\"trigger-type\", \"manual\");\n popover.setAttribute(\"placement\", \"bottom-start\");\n popover.setAttribute(\"modal\", \"\");\n popover.setAttribute(\"popover-for\", \"token-autosuggest-popover\");\n popover.setAttribute(\"offset\", \"-2\");\n popover.targetElement = this.inputElement;\n popover.appendChild(this._tokenList);\n return popover;\n }\n\n public get isOpened(): boolean {\n return this._popover && this._popover.hasAttribute(\"open\");\n }\n\n public get focusedSuggestToken(): TokenData {\n return this._suggestItems[this._tokenList.focusIndex];\n }\n}\n","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 16 16\\\">\\r\\n <path d=\\\"m3.5 12.5 9-9m-9 0 9 9\\\" style=\\\"fill:none;stroke:#333;stroke-linecap:square;stroke-width:1.1px\\\"/>\\r\\n</svg>\"","import {\n LitElement,\n TemplateResult,\n html,\n nothing,\n CSSResult,\n unsafeCSS,\n PropertyValues,\n ComplexAttributeConverter,\n} from \"lit\";\nimport { property } from \"lit/decorators/property.js\";\nimport { ifDefined } from \"lit/directives/if-defined.js\";\nimport { unsafeSVG } from \"lit/directives/unsafe-svg.js\";\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [Token.ID]: Token;\n }\n}\n\nimport style from \"./scss/token.scss?inline\";\nimport { default as clearSvg } from \"./clear.svg?raw\";\nimport ImageTools from \"@cas-smartdesign/image-tools\";\n\nexport interface TokenData {\n caption?: string;\n description?: string;\n type?: string;\n icon?: string;\n iconPlaceholder?: string;\n iconBackgroundColor?: string;\n disabled?: boolean;\n deactivated?: boolean;\n}\n\ntype TokenActionCallback = (tokenIndex: number) => void;\n\nconst alwaysPresentBooleanAttributeConverter = {\n fromAttribute: (value) => value == \"true\",\n toAttribute: (value) => value,\n} as ComplexAttributeConverter;\n\nexport default class Token extends LitElement {\n public static readonly ID = \"sd-token\";\n public static ensureDefined = (): void => {\n if (!customElements.get(Token.ID)) {\n customElements.define(Token.ID, Token);\n }\n };\n\n @property({ type: String, attribute: true, reflect: true })\n public value = \"\";\n @property({ type: String, attribute: true, reflect: true })\n public type = \"\";\n @property({ type: String })\n public icon = \"\";\n @property({ type: String })\n public iconPlaceholder = \"\";\n @property({ type: String })\n public iconBackgroundColor = \"\";\n @property({ converter: alwaysPresentBooleanAttributeConverter, reflect: true, attribute: \"aria-disabled\" })\n public disabled: boolean;\n @property({ converter: alwaysPresentBooleanAttributeConverter, reflect: true, attribute: \"aria-current\" })\n public current: boolean;\n\n public index: number;\n private _checked: boolean = false;\n\n private _tokenClickHandler: TokenActionCallback;\n private _tokenDeleteHandler: TokenActionCallback;\n\n static get styles(): CSSResult {\n return unsafeCSS(style);\n }\n\n public set checked(value: boolean) {\n const oldValue = this._checked;\n this._checked = !this.disabled && value;\n this.requestUpdate(\"checked\", oldValue);\n }\n\n @property({ converter: alwaysPresentBooleanAttributeConverter, reflect: true, attribute: \"aria-checked\" })\n public get checked(): boolean {\n return this._checked;\n }\n\n protected firstUpdated(changedProperties: PropertyValues): void {\n super.firstUpdated(changedProperties);\n this.tabIndex = -1;\n\n this.setAttribute(\"role\", \"option\");\n this.setAttribute(\"aria-selected\", \"true\");\n\n this.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n if (e.getModifierState(\"Control\")) {\n this.checked = !this.checked;\n } else {\n this.checked = true;\n if (this._tokenClickHandler) {\n this._tokenClickHandler(this.index);\n }\n }\n });\n\n const deleteButton = this.shadowRoot.querySelector(\".delete-button-wrapper\");\n if (deleteButton) {\n deleteButton.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n if (this._tokenDeleteHandler) {\n this._tokenDeleteHandler(this.index);\n }\n });\n }\n }\n\n public render(): TemplateResult {\n return html`\n <div class=\"container\">\n <slot name=\"before-icon\"></slot>\n ${this.renderIcon()}\n <slot name=\"after-icon\"></slot>\n <div class=\"value\">${this.value}</div>\n ${this.disabled ? nothing : html` <div class=\"delete-button-wrapper\">${unsafeSVG(clearSvg)}</div> `}\n </div>\n `;\n }\n\n private renderIcon() {\n if (this.icon || this.iconPlaceholder) {\n const iconBackgroundStyle =\n this.iconBackgroundColor != null\n ? `--token-icon-background-color: ${this.iconBackgroundColor}`\n : undefined;\n return html`\n <div class=\"icon-wrapper\" style=\"${ifDefined(iconBackgroundStyle)}\" role=\"img\">\n <div part=\"icon\" class=\"icon\"></div>\n </div>\n `;\n }\n return nothing;\n }\n\n public updated(changedProperties: PropertyValues): void {\n super.updated(changedProperties);\n if (\n (changedProperties.has(\"icon\") || changedProperties.has(\"iconPlaceholder\")) &&\n (this.icon || this.iconPlaceholder)\n ) {\n ImageTools.showImage(this.shadowRoot.querySelector(\".icon\"), this.icon, this.iconPlaceholder);\n }\n if (changedProperties.has(\"disabled\") && !this.disabled && this.checked) {\n this.checked = false;\n }\n }\n\n public setClickHandler(clickHandler: TokenActionCallback) {\n this._tokenClickHandler = clickHandler;\n }\n\n public setDeleteHandler(deleteHandler: TokenActionCallback) {\n this._tokenDeleteHandler = deleteHandler;\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport const generator = (data: TokenData, _index: number): Token => {\n const token = document.createElement(Token.ID) as Token;\n if (data) {\n token.value = data.caption;\n token.type = data.type;\n token.icon = data.icon;\n token.iconPlaceholder = data.iconPlaceholder;\n token.iconBackgroundColor = data.iconBackgroundColor;\n token.disabled = data.disabled;\n\n token.index = _index;\n }\n return token;\n};\n\nToken.ensureDefined();\n","import TokenSelector from \"./token-selector\";\nimport Token from \"./token\";\nimport SDInput from \"@cas-smartdesign/lit-input\";\n\nconst RELEVANT_MIME_TYPE = \"web application/json\";\n\nexport default class ClipboardExtension {\n constructor(\n tokenSelector: TokenSelector,\n getInputElementValue: () => string,\n pasteItems: (item: unknown[]) => void,\n ) {\n if (navigator.clipboard) {\n tokenSelector.addEventListener(\"copy\", () => {\n if (!getInputElementValue()) {\n this.writeToClipboard(tokenSelector);\n }\n });\n\n tokenSelector.addEventListener(\"cut\", () => {\n if (!getInputElementValue()) {\n tokenSelector.removeSelectionOrActiveToken();\n this.writeToClipboard(tokenSelector);\n }\n });\n\n tokenSelector.addEventListener(\"paste\", () => {\n if (!tokenSelector.disabled) {\n this.readFromClipboard(pasteItems);\n }\n });\n }\n }\n\n private writeToClipboard(tokenSelector: TokenSelector) {\n const checkedTokens = tokenSelector.querySelectorAll(\"[slot='items'][aria-checked='true']\");\n const relevantIndexes: number[] = [];\n if (checkedTokens.length > 0) {\n checkedTokens.forEach((t: Token) => relevantIndexes.push(t.index));\n } else if (tokenSelector.activeTokenIndex != -1) {\n const activeToken = tokenSelector.activeTokenElement;\n if (activeToken) {\n relevantIndexes.push(activeToken.index);\n }\n }\n if (relevantIndexes.length > 0) {\n const asJson = JSON.stringify(relevantIndexes.map((index) => tokenSelector.items[index]));\n const asBlob = new Blob([asJson], { type: RELEVANT_MIME_TYPE });\n navigator.clipboard.write([\n new ClipboardItem({\n [RELEVANT_MIME_TYPE]: asBlob,\n }),\n ]);\n }\n }\n\n private async readFromClipboard(pasteItems: (item: unknown[]) => void) {\n const clipboardItems = await navigator.clipboard.read();\n for (const clipboardItem of clipboardItems) {\n if (clipboardItem.types.includes(RELEVANT_MIME_TYPE)) {\n const blob = await clipboardItem.getType(RELEVANT_MIME_TYPE);\n const asText = await blob.text();\n const json = JSON.parse(asText);\n if (Array.isArray(json)) {\n pasteItems(json);\n }\n }\n }\n }\n}\n","import TokenSelector from \"./token-selector\";\nimport Token from \"./token\";\n\nexport default class DnDExtension {\n constructor(\n private tokenSelector: TokenSelector,\n addMatchingItems: (item: unknown[]) => number[],\n ) {\n const indexMapping = new Map();\n\n const handleGlobalDrop = (event: DragEvent) => {\n const target = event.target as HTMLElement;\n tokenSelector.removeAttribute(\"drag-source\");\n if (!tokenSelector.contains(target)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const addedIndexes = (event as any).addedIndexes as number[];\n if (addedIndexes) {\n tokenSelector.removeTokens(addedIndexes.map((i) => indexMapping.get(i)));\n }\n }\n indexMapping.clear();\n };\n\n tokenSelector.addEventListener(\"dragstart\", (event) => {\n const target = event.target;\n if (target instanceof Token) {\n if (target.disabled) {\n event.preventDefault();\n return;\n }\n tokenSelector.setAttribute(\"drag-source\", \"\");\n target.setAttribute(\"aria-checked\", \"true\");\n const checkedTokens = tokenSelector.querySelectorAll(\"[slot='items'][aria-checked='true']\");\n if (checkedTokens.length > 0) {\n const draggedItems = Array.from(checkedTokens)\n .filter((t: Token) => !t.disabled)\n .map((t: Token, index) => {\n indexMapping.set(index, t.index);\n return tokenSelector.items[t.index];\n });\n event.dataTransfer.setData(\"text/sd-token-selector\", JSON.stringify(draggedItems));\n event.dataTransfer.dropEffect = \"move\";\n event.dataTransfer.effectAllowed = \"move\";\n if (checkedTokens.length > 1) {\n const customDragImage = this.createCustomDragImage(target, draggedItems.length);\n event.dataTransfer.setDragImage(customDragImage, -14, -14);\n }\n window.addEventListener(\"drop\", handleGlobalDrop, { once: true });\n }\n }\n });\n tokenSelector.addEventListener(\"dragenter\", (event) => {\n tokenSelector.setAttribute(\"drop\", \"\");\n event.preventDefault();\n });\n tokenSelector.addEventListener(\"dragover\", (event) => event.preventDefault());\n tokenSelector.addEventListener(\"dragleave\", (event) => {\n if (event.target == tokenSelector) {\n tokenSelector.removeAttribute(\"drop\");\n }\n });\n tokenSelector.addEventListener(\"drop\", (event) => {\n tokenSelector.removeAttribute(\"drop\");\n const data = event.dataTransfer.getData(\"text/sd-token-selector\");\n if (data) {\n try {\n const asJson = JSON.parse(data);\n if (Array.isArray(asJson)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (event as any).addedIndexes = addMatchingItems(asJson);\n event.preventDefault();\n }\n } catch (ignored) {}\n }\n });\n tokenSelector.addEventListener(\"dragend\", () => {\n window.removeEventListener(\"drop\", handleGlobalDrop);\n tokenSelector.removeAttribute(\"drag-source\");\n indexMapping.clear();\n });\n }\n\n private createCustomDragImage(targetToken: Token, draggedItemsNumber: number): HTMLElement {\n let dragImage = targetToken.cloneNode(true) as HTMLElement;\n dragImage.setAttribute(\"aria-disabled\", \"true\");\n if (this.tokenSelector.tokenType) {\n (dragImage as Token).value = draggedItemsNumber + \" \" + this.tokenSelector.tokenType;\n } else {\n const counter = document.createElement(\"div\");\n counter.innerText = \"+\" + (draggedItemsNumber - 1);\n Object.assign(counter.style, {\n position: \"absolute\",\n left: \"90%\",\n top: \"75%\",\n });\n const wrapper = document.createElement(\"div\");\n wrapper.appendChild(dragImage);\n wrapper.appendChild(counter);\n dragImage = wrapper;\n }\n Object.assign(dragImage.style, {\n height: targetToken.offsetHeight,\n outline: \"none\",\n maxWidth: \"500px\",\n position: \"absolute\",\n display: \"block\",\n left: \"-99999px\",\n overflow: \"visible\",\n margin: \"1px\",\n });\n dragImage.slot = \"items\";\n this.tokenSelector.appendChild(dragImage);\n requestAnimationFrame(() => dragImage.remove());\n return dragImage;\n }\n}\n","import { LitElement, TemplateResult, html, CSSResult, unsafeCSS, PropertyValues, nothing } from \"lit\";\nimport { property } from \"lit/decorators/property.js\";\n\nimport \"@cas-smartdesign/lit-input\";\nimport SDInput, { IValueChangeEvent } from \"@cas-smartdesign/lit-input\";\nimport SDFieldValidationMessage, { ValidationLevel } from \"@cas-smartdesign/field-validation-message\";\nimport { ItemGenerator } from \"@cas-smartdesign/virtual-list\";\nimport { generator as itemGenerator } from \"@cas-smartdesign/list-item\";\n\nimport TokenSuggestPopover, { Filter } from \"./token-suggest-popover\";\nimport Token, { generator, TokenData } from \"./token\";\nimport ClipboardExtension from \"clipboard-extension\";\nimport style from \"./scss/token-selector.scss?inline\";\nimport DnDExtension from \"drag-and-drop-extension\";\n\nexport type { Filter as InMemoryFilter } from \"./token-suggest-popover\";\nexport type { TokenData } from \"./token\";\nexport { generator } from \"./token\";\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 [TokenSelector.ID]: TokenSelector;\n }\n}\n\nexport interface ITokenClickedEvent {\n index: number;\n tokenElement: Token;\n byPointerDevice: boolean;\n}\nexport interface ITokensRemovedEvent {\n removedIndices: number[];\n selectedIndices?: number[];\n}\nexport interface ITokenSelectedEvent {\n newIndices: number[];\n selectedIndices: number[];\n}\nexport interface ITokenCreatedEvent {\n value: string;\n}\n\nexport enum SelectionMode {\n RemoveOnly = \"remove-only\",\n Multi = \"multi\",\n}\n\nexport interface CustomEventMap extends HTMLElementEventMap {\n \"token-clicked\": CustomEvent<ITokenClickedEvent>;\n \"tokens-removed\": CustomEvent<ITokensRemovedEvent>;\n \"tokens-selected\": CustomEvent<ITokenSelectedEvent>;\n \"token-created\": CustomEvent<ITokenCreatedEvent>;\n \"auto-suggest-initialized\": CustomEvent;\n}\n\nexport default interface TokenSelector {\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 type TokenGenerator = (data: TokenData, index: number) => Token;\n\nexport default class TokenSelector extends LitElement {\n public static readonly ID = \"sd-token-selector\";\n public static ensureDefined = (): void => {\n Token.ensureDefined();\n if (!customElements.get(TokenSelector.ID)) {\n customElements.define(TokenSelector.ID, TokenSelector);\n }\n };\n\n @property({ type: String, attribute: \"selection-mode\", reflect: true })\n public selectionMode: SelectionMode = SelectionMode.Multi;\n @property({ type: Array, attribute: false })\n public items: TokenData[] = [];\n @property({ type: Array, attribute: false })\n public selectedIndexes: number[] = [];\n @property({ type: String, reflect: true })\n public placeholder: string;\n @property({ type: String, reflect: true, attribute: \"suggest-list-class\" })\n public suggestListClass: string;\n @property({ type: String, reflect: true, attribute: \"input-label\" })\n public inputLabel: string;\n @property({\n converter: {\n fromAttribute: (value) => value == \"true\",\n toAttribute: (value) => value,\n },\n reflect: true,\n attribute: \"aria-disabled\",\n })\n public disabled: boolean;\n @property({ type: String, attribute: true })\n public validationMessage: string;\n @property({ type: String, attribute: true })\n public validationIconSrc: string;\n @property({ converter: SDFieldValidationMessage.levelConverter, attribute: true, reflect: true })\n public validationLevel: ValidationLevel;\n @property({ type: String, reflect: true, attribute: \"token-type\" })\n public tokenType: string;\n @property({ type: Boolean, reflect: true, attribute: \"case-sensitive\" })\n public caseSensitive: boolean;\n\n public suggestionFilter: Filter;\n\n private _tokenGenerator: TokenGenerator = generator;\n private _autoSuggestItemGenerator: ItemGenerator = itemGenerator;\n\n private additionalTokenCommittingKeys: string[] = [];\n\n private _tokenSuggestPopover: TokenSuggestPopover;\n\n private cancelSearch: boolean;\n private _activeTokenIndex = -1;\n\n static get styles(): CSSResult {\n return unsafeCSS(style);\n }\n\n static shadowRootOptions: ShadowRootInit = {\n ...LitElement.shadowRootOptions,\n delegatesFocus: true,\n };\n\n public get tokenGenerator(): TokenGenerator {\n return this._tokenGenerator;\n }\n\n public set tokenGenerator(value: TokenGenerator) {\n this._tokenGenerator = value;\n this.render();\n }\n\n public get autoSuggestItemGenerator(): ItemGenerator {\n return this._autoSuggestItemGenerator;\n }\n\n public set autoSuggestItemGenerator(value: ItemGenerator) {\n this._autoSuggestItemGenerator = value;\n if (this._tokenSuggestPopover) {\n this._tokenSuggestPopover.list.itemGenerator = value;\n }\n }\n\n public setAdditionalTokenCommittingKeys(keys: string[]): void {\n this.additionalTokenCommittingKeys = keys;\n }\n\n public openSuggestions(): void {\n if (this.inputElement) {\n this.focus();\n this.tokenSuggestPopover.show();\n }\n }\n\n public focus() {\n if (this.inputElement) {\n this.inputElement.focus();\n } else {\n (this.shadowRoot.querySelector(\".container\") as HTMLElement).focus();\n }\n }\n\n public render(): TemplateResult {\n return this.selectionMode == SelectionMode.RemoveOnly\n ? html`<div class=\"container\" tabindex=\"0\">\n <slot name=\"items\"\n >${this.placeholder\n ? html`<span part=\"remove-only-placeholder\" class=\"placeholder\"\n >${this.placeholder}</span\n >`\n : nothing}</slot\n >\n </div>\n <slot class=\"additonal-content\" name=\"additional-content\" @focusin=${this.clearCheckedTokens}></slot>`\n : html`\n <sd-lit-input\n class=\"input\"\n .extendedPrefix=${true}\n .label=${this.inputLabel}\n .validationLevel=${this.validationLevel}\n .validationIconSrc=${this.validationIconSrc}\n .validationMessage=${this.validationMessage}\n .alwaysFloatLabel=${this.selectedIndexes.length > 0}\n .placeholder=${this.selectedIndexes.length == 0 ? this.placeholder : \"\"}\n .disabled=${this.disabled}\n tabindex=\"0\"\n ><div class=\"token-wrapper\" slot=\"prefix\"><slot name=\"items\"></slot></div>\n </sd-lit-input>\n <slot class=\"additonal-content\" name=\"additional-content\" @focusin=${this.clearCheckedTokens}></slot>\n `;\n }\n\n protected firstUpdated(_changedProperties: Map<string | number | symbol, unknown>): void {\n super.firstUpdated(_changedProperties);\n\n this.setAttribute(\"role\", \"listbox\");\n this.setAttribute(\"aria-multiselectable\", \"true\");\n if (!this.hasAttribute(\"tabIndex\")) {\n this.tabIndex = 0;\n }\n this.addEventListener(\"focusout\", (event) => {\n const target = event.relatedTarget as HTMLElement;\n if (!this.contains(target) && !this.shadowRoot.contains(target)) {\n this.clearCheckedTokens();\n }\n });\n this.addEventListener(\"focusin\", () => {\n if (\n this.selectionMode == SelectionMode.RemoveOnly &&\n this.activeTokenIndex == -1 &&\n this.items.length > 0\n ) {\n this.activeTokenIndex = 0;\n }\n });\n new ClipboardExtension(\n this,\n () => this.inputElement?.value,\n (items) => this.selectOrAddItems(items),\n );\n new DnDExtension(this, (items) => this.selectOrAddItems(items));\n }\n\n private handleInputKeyDown = (event: KeyboardEvent, input: SDInput) => {\n if ((event.key === \"Enter\" || this.additionalTokenCommittingKeys.includes(event.key)) && input.value) {\n event.preventDefault();\n event.stopPropagation();\n this.commitTokenValue(input.value);\n return;\n }\n\n switch (event.key) {\n case \"Escape\": {\n event.preventDefault();\n event.stopPropagation();\n this.tokenSuggestPopover.hide();\n break;\n }\n case \"Tab\": {\n this.commitTokenValue(input.value);\n this.tokenSuggestPopover.hide();\n break;\n }\n default: {\n this.handleKeyDown(event);\n }\n }\n };\n\n private handleKeyDown = (event: KeyboardEvent) => {\n switch (event.key) {\n case \"ArrowLeft\": {\n if (!this.hasInputValue) {\n this.updateActiveToken(-1);\n }\n break;\n }\n case \"ArrowRight\": {\n if (!this.hasInputValue) {\n this.updateActiveToken(1);\n }\n break;\n }\n case \"Enter\": {\n if (!this.hasInputValue && this.activeTokenIndex != -1) {\n const curEl = this.activeTokenElement;\n if (event.getModifierState(\"Control\")) {\n curEl.checked = !curEl.checked;\n } else {\n curEl.checked = true;\n this.onTokenClick(curEl, false);\n }\n if (document.activeElement != this) {\n this.focus();\n }\n }\n break;\n }\n case \"Backspace\": {\n if (!this.hasInputValue) {\n if (this.activeTokenIndex == -1) {\n this.updateActiveToken(-1);\n } else {\n this.removeSelectionOrActiveToken();\n }\n }\n break;\n }\n case \"Clear\":\n case \"Delete\": {\n this.removeSelectionOrActiveToken();\n break;\n }\n case \"a\": {\n if (!this.hasInputValue && event.getModifierState(\"Control\")) {\n this.querySelectorAll(\"[slot='items']\").forEach((item: Token) => (item.checked = true));\n event.preventDefault();\n event.stopPropagation();\n }\n break;\n }\n }\n };\n\n /**\n *\n * Called when items were given by paste or drag events to token-selector.\n * The purpose of this function is to add or create items accordingly.\n *\n * @param {unknown[]} items the pasted or dropped items\n * @return {number[]} the indexes that were added successfully\n */\n public selectOrAddItems = (items: unknown & { caption?: string }[]): number[] => {\n const addedIndexes = [];\n const newSelectedIndexes = items\n .map((item, index) => {\n const matchingIndex = item.caption == null ? -1 : this.findIndex(item);\n if (\n matchingIndex != -1 &&\n !this.items[matchingIndex].disabled &&\n !this.selectedIndexes.includes(matchingIndex)\n ) {\n addedIndexes.push(index);\n return matchingIndex;\n }\n return -1;\n })\n .filter((i) => -1 != i);\n if (newSelectedIndexes.length > 0) {\n this.handleTokenSelection(newSelectedIndexes);\n }\n return addedIndexes;\n };\n\n private clearCheckedTokens() {\n this.querySelectorAll(\"[slot='items'][aria-checked='true']\").forEach(\n (checkedToken: Token) => (checkedToken.checked = false),\n );\n }\n\n public removeSelectionOrActiveToken() {\n if (!this.disabled) {\n const checkedTokens = this.querySelectorAll(\"[slot='items'][aria-checked='true']\");\n if (checkedTokens.length > 0) {\n const tokensArray = Array.from(checkedTokens) as Token[];\n this.removeTokens(tokensArray.filter((t) => !t.disabled).map((t) => t.index));\n } else if (this.activeTokenIndex != -1) {\n const activeToken = this.activeTokenElement;\n if (activeToken && !activeToken.disabled) {\n this.removeTokens([activeToken.index]);\n }\n }\n }\n }\n\n private updateActiveToken(offset: number): void {\n const maxIndex = this.querySelectorAll(\"[slot='items']\").length - 1;\n if (this.activeTokenIndex == -1) {\n if (offset < 0) {\n this.activeTokenIndex = maxIndex;\n }\n } else {\n if (this.activeTokenIndex == maxIndex && offset > 0 && this.selectionMode == SelectionMode.Multi) {\n this.activeTokenIndex = -1;\n this.focus();\n } else {\n this.activeTokenIndex = Math.max(0, Math.min(maxIndex, this.activeTokenIndex + offset));\n }\n }\n if (this.activeTokenIndex > -1 && this.scrollHeight > this.offsetHeight) {\n const activeEl = this.activeTokenElement as HTMLElement & {\n scrollIntoViewIfNeeded?: () => void;\n };\n if (activeEl.scrollIntoViewIfNeeded) {\n activeEl.scrollIntoViewIfNeeded();\n } else {\n activeEl.scrollIntoView();\n }\n }\n }\n\n private commitTokenValue(tokenValue: string): void {\n if (this.disabled) {\n return;\n }\n\n // 'Commiting' supports three different cases:\n // 1. User navigates via arrow keys in the auto suggest list and selects an item with enter\n // 2. User enters a value that is already present as a token, so this token is 'selected'\n // 3. User enters a value that is new, so the token is 'created'\n\n if (this.tokenSuggestPopover.isOpened) {\n const focusedSuggestToken = this.tokenSuggestPopover.focusedSuggestToken;\n if (focusedSuggestToken) {\n if (!focusedSuggestToken.disabled) {\n const selectedTokenIndex = this.findIndex(focusedSuggestToken);\n this.handleTokenSelection([selectedTokenIndex]);\n this.tokenSuggestPopover.hide();\n }\n return;\n }\n }\n\n if (!tokenValue?.trim()) {\n return;\n }\n\n const tokenIndex = this.items.findIndex((item) =>\n this.caseSensitive ? item.caption == tokenValue : item.caption.toLowerCase() == tokenValue.toLowerCase(),\n );\n if (!this.selectedIndexes.includes(tokenIndex)) {\n if (tokenIndex >= 0) {\n this.handleTokenSelection([tokenIndex]);\n } else {\n this.handleTokenCreation(tokenValue);\n }\n }\n\n this.requestUpdate(\"selectedIndexes\");\n this.tokenSuggestPopover.hide();\n window.removeEventListener(\"pointerdown\", this.handleWindowPointerDown);\n }\n\n public updated(changedProperties: PropertyValues): void {\n super.updated(changedProperties);\n\n if (this._tokenSuggestPopover) {\n this.tokenSuggestPopover.list.className = this.suggestListClass || \"\";\n if (this.suggestionFilter) {\n this.tokenSuggestPopover.filter = this.suggestionFilter;\n }\n }\n\n if (changedProperties.has(\"selectionMode\")) {\n if (SelectionMode.Multi == this.selectionMode) {\n this.setAttribute(\"aria-haspopup\", \"listbox\");\n const input = this.inputElement;\n input.addEventListener(\"immediate-value-change\", (e) => this.handleInputValueChange(e));\n input.addEventListener(\"keydown\", (e) => this.handleInputKeyDown(e, input));\n window.queueMicrotask(() => this.tokenSuggestPopover); // lazy init of the popover\n } else {\n this.removeAttribute(\"aria-haspopup\");\n this.addEventListener(\"keydown\", this.handleKeyDown);\n if (this._tokenSuggestPopover) {\n this._tokenSuggestPopover.popover.remove();\n this._tokenSuggestPopover = null;\n }\n }\n }\n\n if (\n changedProperties.size == 0 ||\n changedProperties.has(\"selectionMode\") ||\n changedProperties.has(\"items\") ||\n changedProperties.has(\"selectedIndexes\") ||\n changedProperties.has(\"disabled\")\n ) {\n this.updateItems();\n }\n }\n\n private handleInputValueChange(event: CustomEvent<IValueChangeEvent>): void {\n const userInput = event.detail.value;\n if (!userInput) {\n this.tokenSuggestPopover.hide();\n this.cancelSearch = true;\n } else {\n this.activeTokenIndex = -1;\n this.cancelSearch = false;\n this.debouncedShowTokenSuggestPopover();\n window.addEventListener(\"pointerdown\", this.handleWindowPointerDown);\n }\n }\n\n private handleWindowPointerDown = (event: PointerEvent) => {\n const input = this.inputElement;\n if (!input || !input.value) return;\n\n const pointerDownOnInputOrList = event.composedPath().some((element) => {\n if (\n element instanceof HTMLElement &&\n (event.composedPath().indexOf(input) > -1 ||\n element.getAttribute(\"popover-for\") === \"token-autosuggest-popover\")\n ) {\n return true;\n }\n });\n\n if (!pointerDownOnInputOrList) {\n this.commitTokenValue(input.value);\n }\n };\n\n private debouncedShowTokenSuggestPopover = debounce(this.showFilteredTokenSuggestions.bind(this), 200);\n private showFilteredTokenSuggestions() {\n if (!this.cancelSearch && this.inputElement.value) {\n this.tokenSuggestPopover.show();\n }\n }\n\n private isTokenNotSelected(index: number): unknown {\n return !this.selectedIndexes.includes(index);\n }\n\n private get tokenSuggestPopover(): TokenSuggestPopover {\n if (!this._tokenSuggestPopover && this.inputElement) {\n this._tokenSuggestPopover = new TokenSuggestPopover(\n this.inputElement,\n () => this.items.filter((item, index) => !item.disabled && this.isTokenNotSelected(index)),\n (selectedToken) => {\n const selectedTokenIndex = this.findIndex(selectedToken);\n this.handleTokenSelection([selectedTokenIndex]);\n window.removeEventListener(\"pointerdown\", this.handleWindowPointerDown);\n },\n (suggestPopover) => {\n this.appendChild(suggestPopover.popover);\n this.dispatchEvent(new CustomEvent(\"auto-suggest-initialized\"));\n suggestPopover.popover.addEventListener(\"close\", () => {\n if (this.inputElement.value && !this.contains(document.activeElement)) {\n this.inputElement.value = \"\";\n }\n });\n },\n );\n this._tokenSuggestPopover.list.itemGenerator = this._autoSuggestItemGenerator;\n this._tokenSuggestPopover.list.className = this.suggestListClass;\n if (this.suggestionFilter) {\n this._tokenSuggestPopover.filter = this.suggestionFilter;\n }\n }\n return this._tokenSuggestPopover;\n }\n\n private updateItems(): void {\n if (!this.isConnected || !this.items) {\n return;\n }\n\n this.activeTokenIndex = -1;\n\n const input = this.inputElement;\n if (input && (!this._tokenSuggestPopover || !this._tokenSuggestPopover.isOpened)) {\n input.value = \"\";\n }\n\n this.querySelectorAll(\"[slot='items']\").forEach((oldItem) => {\n this.removeChild(oldItem);\n });\n\n const fragment = document.createDocumentFragment();\n\n let visibleTokens: TokenData[] = [];\n if (this.selectionMode == SelectionMode.RemoveOnly) {\n visibleTokens = this.items.map((item) => this.disableIfNeeded(item));\n } else {\n this.selectedIndexes.forEach((value) => {\n visibleTokens.push(this.disableIfNeeded(this.items[value]));\n });\n }\n\n visibleTokens.forEach((item) => {\n const token = this.tokenGenerator(item, this.findIndex(item));\n token.slot = \"items\";\n fragment.appendChild(token);\n if (!token.id) {\n token.id = window.crypto.getRandomValues(new Uint32Array(1))[0].toString(16);\n }\n\n token.setClickHandler(() => this.onTokenClick(token, true));\n token.addEventListener(\"click\", () => {\n if (document.activeElement != this) {\n this.focus();\n }\n });\n token.setDeleteHandler((tokenIndex) => this.removeTokens([tokenIndex]));\n });\n\n this.appendChild(fragment);\n if (this._tokenSuggestPopover) {\n this._tokenSuggestPopover.refreshItems();\n }\n }\n\n public removeTokens(indexes: number[]): void {\n if (this.disabled || indexes == null || indexes.length == 0) {\n return;\n }\n\n if (this.activeTokenIndex != -1 && indexes.includes(this.activeTokenElement.index)) {\n this.activeTokenIndex = -1;\n }\n if (this.selectionMode == SelectionMode.RemoveOnly) {\n this.dispatchEvent(\n new CustomEvent<ITokensRemovedEvent>(\"tokens-removed\", {\n detail: {\n removedIndices: indexes,\n },\n }),\n );\n } else {\n const matchingIndexes = indexes.filter((i) => this.selectedIndexes.includes(i));\n if (matchingIndexes.length > 0) {\n this.selectedIndexes = this.selectedIndexes.filter((i) => !matchingIndexes.includes(i));\n\n this.dispatchEvent(\n new CustomEvent<ITokensRemovedEvent>(\"tokens-removed\", {\n detail: {\n removedIndices: matchingIndexes,\n selectedIndices: [...this.selectedIndexes],\n },\n }),\n );\n }\n }\n }\n\n private onTokenClick(token: Token, byPointerDevice: boolean): void {\n let relevantIndex;\n this.querySelectorAll(\"[slot='items']\").forEach((item, i) => {\n if (token == item) {\n relevantIndex = i;\n } else {\n item.setAttribute(\"aria-checked\", \"false\");\n }\n });\n this.activeTokenIndex = relevantIndex;\n this.setAttribute(\"aria-activedescendant\", this.activeTokenElement.id);\n if (this._tokenSuggestPopover && this._tokenSuggestPopover.isOpened) {\n this._tokenSuggestPopover.hide();\n }\n this.dispatchEvent(\n new CustomEvent<ITokenClickedEvent>(\"token-clicked\", {\n detail: {\n index: token.index,\n tokenElement: token,\n byPointerDevice,\n },\n }),\n );\n }\n\n private disableIfNeeded(item: TokenData): TokenData {\n if (this.disabled) {\n return { ...item, disabled: true };\n }\n return item;\n }\n\n private handleTokenSelection(indexes: number[]) {\n this.selectedIndexes = this.selectedIndexes.concat(indexes);\n this.dispatchEvent(\n new CustomEvent<ITokenSelectedEvent>(\"tokens-selected\", {\n detail: {\n newIndices: indexes,\n selectedIndices: [...this.selectedIndexes],\n },\n }),\n );\n }\n\n private handleTokenCreation(tokenValue: string) {\n this.dispatchEvent(\n new CustomEvent(\"token-created\", {\n detail: {\n value: tokenValue,\n },\n }),\n );\n }\n\n private get inputElement(): SDInput | null {\n return this.shadowRoot.querySelector(\".input\") as SDInput;\n }\n\n public get activeTokenElement(): Token | null {\n return this.getTokenElement(this.activeTokenIndex);\n }\n\n private getTokenElement(index: number): Token | null {\n return this.querySelector(\"[slot='items']:nth-of-type(\" + (index + 1) + \")\");\n }\n\n public findIndex(token: TokenData) {\n return this.items.findIndex((item) => item.caption === token.caption);\n }\n\n public get activeTokenIndex(): number {\n return this._activeTokenIndex;\n }\n\n public set activeTokenIndex(value: number) {\n if (this._activeTokenIndex != -1) {\n const previous = this.activeTokenElement;\n if (previous) {\n previous.current = false;\n }\n }\n this._activeTokenIndex = value;\n if (value == -1) {\n this.removeAttribute(\"aria-activedescendant\");\n } else {\n const activeElement = this.activeTokenElement;\n activeElement.current = true;\n this.setAttribute(\"aria-activedescendant\", activeElement.id);\n }\n }\n\n private get hasInputValue() {\n return !!this.inputElement?.value;\n }\n}\n"],"names":["TokenSuggestPopover","inputElement","notSelectedTokensProvider","tokenSelectedCallback","initializeCallback","searchTerm","allTokens","t","VirtualList","e","suggestIndex","selectedToken","event","KeyDownDelegator","_offset","toggleSelection","_a","popover","Popover","clearSvg","alwaysPresentBooleanAttributeConverter","value","_Token","LitElement","unsafeCSS","style","oldValue","changedProperties","deleteButton","html","nothing","unsafeSVG","iconBackgroundStyle","ifDefined","ImageTools","clickHandler","deleteHandler","__decorateClass","property","Token","generator","data","_index","token","RELEVANT_MIME_TYPE","ClipboardExtension","tokenSelector","getInputElementValue","pasteItems","checkedTokens","relevantIndexes","activeToken","asJson","index","asBlob","clipboardItems","clipboardItem","asText","json","DnDExtension","addMatchingItems","indexMapping","handleGlobalDrop","target","addedIndexes","i","draggedItems","customDragImage","targetToken","draggedItemsNumber","dragImage","counter","wrapper","debounce","func","delay","timeout","args","SelectionMode","_TokenSelector","itemGenerator","input","curEl","item","items","newSelectedIndexes","matchingIndex","element","keys","_changedProperties","checkedToken","tokensArray","offset","maxIndex","activeEl","tokenValue","focusedSuggestToken","selectedTokenIndex","tokenIndex","suggestPopover","oldItem","fragment","visibleTokens","indexes","matchingIndexes","byPointerDevice","relevantIndex","previous","activeElement","SDFieldValidationMessage","TokenSelector"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cas-smartdesign/token-selector",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.19.0",
|
|
4
4
|
"description": "A token-selector based on LitElement",
|
|
5
5
|
"main": "dist/token-selector-with-externals.js",
|
|
6
6
|
"module": "dist/token-selector.mjs",
|
|
@@ -8,13 +8,13 @@
|
|
|
8
8
|
"types": "dist/token-selector.d.ts",
|
|
9
9
|
"dependencies": {
|
|
10
10
|
"lit": "^2.8.0",
|
|
11
|
-
"@cas-smartdesign/field-validation-message": "^5.0.2",
|
|
12
11
|
"@cas-smartdesign/element-utils": "^1.0.3",
|
|
12
|
+
"@cas-smartdesign/field-validation-message": "^5.0.2",
|
|
13
13
|
"@cas-smartdesign/image-tools": "^3.0.2",
|
|
14
|
-
"@cas-smartdesign/virtual-list": "^6.2.3",
|
|
15
14
|
"@cas-smartdesign/list-item": "^7.2.3",
|
|
16
15
|
"@cas-smartdesign/lit-input": "^7.1.5",
|
|
17
16
|
"@cas-smartdesign/popover": "^4.1.2",
|
|
17
|
+
"@cas-smartdesign/virtual-list": "^6.2.3",
|
|
18
18
|
"@cas-smartdesign/styles": "^3.6.2"
|
|
19
19
|
},
|
|
20
20
|
"files": [
|
|
@@ -26,9 +26,9 @@
|
|
|
26
26
|
"access": "public"
|
|
27
27
|
},
|
|
28
28
|
"devDependencies": {
|
|
29
|
-
"@cas-smartdesign/element-preview": "^0.2.2",
|
|
30
29
|
"@cas-smartdesign/button": "^5.0.2",
|
|
31
|
-
"@cas-smartdesign/license-generator": "^1.6.3"
|
|
30
|
+
"@cas-smartdesign/license-generator": "^1.6.3",
|
|
31
|
+
"@cas-smartdesign/element-preview": "^0.2.2"
|
|
32
32
|
},
|
|
33
33
|
"scripts": {
|
|
34
34
|
"version": "pnpm version",
|