@cas-smartdesign/token-selector 0.15.0 → 0.16.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -11,18 +11,11 @@ import { unsafeSVG as P } from "lit/directives/unsafe-svg.js";
11
11
  import L from "@cas-smartdesign/image-tools";
12
12
  class D {
13
13
  constructor(e, t, i, s) {
14
- this.inputElement = e, this.notSelectedTokensProvider = t, this.initializeCallback = s, this.filter = (n, o) => {
15
- if (!n)
16
- return !0;
17
- if (o.disabled || o.deactivated)
18
- return !1;
19
- if (o.caption && o.caption.toLowerCase().includes(n))
20
- return !0;
21
- }, I.ensureDefined(), this._tokenList = new I(), this._tokenList.style.minWidth = "250px", this._tokenList.addEventListener("selection", (n) => {
22
- const o = n.detail.index, c = this._suggestItems[o];
23
- i(c), this.hide();
24
- }), new C(this._tokenList, (n, o, c) => {
25
- this._tokenList.dispatchEvent(new KeyboardEvent(n.type, n)), !c && !this.isOpened && this.show();
14
+ this.inputElement = e, this.notSelectedTokensProvider = t, this.initializeCallback = s, this.filter = (n, r) => n ? r.filter((l) => l.disabled || l.deactivated ? !1 : l.caption && l.caption.toLowerCase().includes(n)) : r, I.ensureDefined(), this._tokenList = new I(), this._tokenList.style.minWidth = "250px", this._tokenList.addEventListener("selection", (n) => {
15
+ const r = n.detail.index, l = this._suggestItems[r];
16
+ i(l), this.hide();
17
+ }), new C(this._tokenList, (n, r, l) => {
18
+ this._tokenList.dispatchEvent(new KeyboardEvent(n.type, n)), !l && !this.isOpened && this.show();
26
19
  }).connect(e);
27
20
  }
28
21
  show() {
@@ -35,7 +28,7 @@ class D {
35
28
  }
36
29
  filterItems(e) {
37
30
  const t = this.notSelectedTokensProvider();
38
- return e ? t.filter((i) => this.filter(e, i)) : t;
31
+ return this.filter(e, t);
39
32
  }
40
33
  hide() {
41
34
  var e;
@@ -61,14 +54,14 @@ class D {
61
54
  const O = ":host{flex-shrink:0;max-width:100%}.container{display:flex;height:28px;background-color:var(--token-background-color, #f3f3f3);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
62
55
  <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
63
56
  </svg>`;
64
- var $ = Object.defineProperty, q = Object.getOwnPropertyDescriptor, g = (r, e, t, i) => {
65
- for (var s = i > 1 ? void 0 : i ? q(e, t) : e, n = r.length - 1, o; n >= 0; n--)
66
- (o = r[n]) && (s = (i ? o(e, t, s) : o(s)) || s);
57
+ var $ = Object.defineProperty, q = Object.getOwnPropertyDescriptor, g = (o, e, t, i) => {
58
+ for (var s = i > 1 ? void 0 : i ? q(e, t) : e, n = o.length - 1, r; n >= 0; n--)
59
+ (r = o[n]) && (s = (i ? r(e, t, s) : r(s)) || s);
67
60
  return i && s && $(e, t, s), s;
68
61
  };
69
62
  const x = {
70
- fromAttribute: (r) => r == "true",
71
- toAttribute: (r) => r
63
+ fromAttribute: (o) => o == "true",
64
+ toAttribute: (o) => o
72
65
  };
73
66
  var u;
74
67
  const p = (u = class extends b {
@@ -153,9 +146,9 @@ g([
153
146
  a({ converter: x, reflect: !0, attribute: "aria-checked" })
154
147
  ], p.prototype, "checked", 1);
155
148
  let k = p;
156
- const G = (r, e) => {
149
+ const G = (o, e) => {
157
150
  const t = document.createElement(k.ID);
158
- return r && (t.value = r.caption, t.type = r.type, t.icon = r.icon, t.iconPlaceholder = r.iconPlaceholder, t.iconBackgroundColor = r.iconBackgroundColor, t.disabled = r.disabled, t.index = e), t;
151
+ return o && (t.value = o.caption, t.type = o.type, t.icon = o.icon, t.iconPlaceholder = o.iconPlaceholder, t.iconBackgroundColor = o.iconBackgroundColor, t.disabled = o.disabled, t.index = e), t;
159
152
  };
160
153
  k.ensureDefined();
161
154
  const m = "web application/json";
@@ -178,7 +171,7 @@ class B {
178
171
  s && i.push(s.index);
179
172
  }
180
173
  if (i.length > 0) {
181
- const s = JSON.stringify(i.map((o) => e.items[o])), n = new Blob([s], { type: m });
174
+ const s = JSON.stringify(i.map((r) => e.items[r])), n = new Blob([s], { type: m });
182
175
  navigator.clipboard.write([
183
176
  new ClipboardItem({
184
177
  [m]: n
@@ -190,33 +183,33 @@ class B {
190
183
  const t = await navigator.clipboard.read();
191
184
  for (const i of t)
192
185
  if (i.types.includes(m)) {
193
- const n = await (await i.getType(m)).text(), o = JSON.parse(n);
194
- Array.isArray(o) && e(o);
186
+ const n = await (await i.getType(m)).text(), r = JSON.parse(n);
187
+ Array.isArray(r) && e(r);
195
188
  }
196
189
  }
197
190
  }
198
- const F = ":host{display:flex;align-items:flex-end}: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){margin-right:24px;margin-bottom:4px}.container{display:flex;flex-wrap:wrap;gap:8px;flex-grow:1;min-width:0}.container .placeholder{color:#767676;line-height:24px;align-self:flex-end}.input{flex-grow:1;min-width:0;width:100%}.input .token-wrapper{display:flex;flex-wrap:wrap;flex:1 0 auto;width:100%;gap:8px}";
191
+ const F = ":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){margin-right:24px;margin-bottom:4px}.container{display:flex;flex-wrap:wrap;gap:8px;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}";
199
192
  class H {
200
193
  constructor(e, t) {
201
194
  this.tokenSelector = e;
202
195
  let i = [];
203
196
  const s = (n) => {
204
- const o = n.target;
205
- e.contains(o) || e.removeTokens(i), i = [];
197
+ const r = n.target;
198
+ e.contains(r) || e.removeTokens(i), i = [];
206
199
  };
207
200
  e.addEventListener("dragstart", (n) => {
208
- const o = n.target;
209
- if (o instanceof k) {
210
- if (o.disabled) {
201
+ const r = n.target;
202
+ if (r instanceof k) {
203
+ if (r.disabled) {
211
204
  n.preventDefault();
212
205
  return;
213
206
  }
214
- o.setAttribute("aria-checked", "true");
215
- const c = e.querySelectorAll("[slot='items'][aria-checked='true']");
216
- if (c.length > 0) {
217
- const y = Array.from(c).filter((f) => !f.disabled).map((f) => (i.push(f.index), e.items[f.index]));
218
- if (n.dataTransfer.setData("text/plain", JSON.stringify(y)), n.dataTransfer.dropEffect = "move", n.dataTransfer.effectAllowed = "move", c.length > 1) {
219
- const f = this.createCustomDragImage(o, y.length);
207
+ r.setAttribute("aria-checked", "true");
208
+ const l = e.querySelectorAll("[slot='items'][aria-checked='true']");
209
+ if (l.length > 0) {
210
+ const y = Array.from(l).filter((f) => !f.disabled).map((f) => (i.push(f.index), e.items[f.index]));
211
+ if (n.dataTransfer.setData("text/plain", JSON.stringify(y)), n.dataTransfer.dropEffect = "move", n.dataTransfer.effectAllowed = "move", l.length > 1) {
212
+ const f = this.createCustomDragImage(r, y.length);
220
213
  n.dataTransfer.setDragImage(f, -14, -14);
221
214
  }
222
215
  window.addEventListener("drop", s, { capture: !0, once: !0 });
@@ -228,11 +221,11 @@ class H {
228
221
  n.target == e && e.removeAttribute("drop");
229
222
  }), e.addEventListener("drop", (n) => {
230
223
  e.removeAttribute("drop");
231
- const o = n.dataTransfer.getData("text/plain");
232
- if (o)
224
+ const r = n.dataTransfer.getData("text/plain");
225
+ if (r)
233
226
  try {
234
- const c = JSON.parse(o);
235
- Array.isArray(c) && (t(c), n.preventDefault());
227
+ const l = JSON.parse(r);
228
+ Array.isArray(l) && (t(l), n.preventDefault());
236
229
  } catch {
237
230
  }
238
231
  }), e.addEventListener("dragend", () => {
@@ -265,19 +258,19 @@ class H {
265
258
  }), i.slot = "items", this.tokenSelector.appendChild(i), requestAnimationFrame(() => i.remove()), i;
266
259
  }
267
260
  }
268
- var N = Object.defineProperty, j = Object.getOwnPropertyDescriptor, d = (r, e, t, i) => {
269
- for (var s = i > 1 ? void 0 : i ? j(e, t) : e, n = r.length - 1, o; n >= 0; n--)
270
- (o = r[n]) && (s = (i ? o(e, t, s) : o(s)) || s);
261
+ var N = Object.defineProperty, j = Object.getOwnPropertyDescriptor, c = (o, e, t, i) => {
262
+ for (var s = i > 1 ? void 0 : i ? j(e, t) : e, n = o.length - 1, r; n >= 0; n--)
263
+ (r = o[n]) && (s = (i ? r(e, t, s) : r(s)) || s);
271
264
  return i && s && N(e, t, s), s;
272
265
  };
273
- function K(r, e) {
266
+ function K(o, e) {
274
267
  let t;
275
268
  return function(...i) {
276
- t != null && clearTimeout(t), t = window.setTimeout(() => r(...i), e);
269
+ t != null && clearTimeout(t), t = window.setTimeout(() => o(...i), e);
277
270
  };
278
271
  }
279
- var R = /* @__PURE__ */ ((r) => (r.RemoveOnly = "remove-only", r.Multi = "multi", r))(R || {}), h;
280
- const l = (h = class extends b {
272
+ var R = /* @__PURE__ */ ((o) => (o.RemoveOnly = "remove-only", o.Multi = "multi", o))(R || {}), h;
273
+ const d = (h = class extends b {
281
274
  constructor() {
282
275
  super(...arguments), this.selectionMode = "multi", this.items = [], this.selectedIndexes = [], this._tokenGenerator = G, this._autoSuggestItemGenerator = S, this.additionalTokenCommittingKeys = [], this._activeTokenIndex = -1, this.handleInputKeyDown = (e, t) => {
283
276
  if ((e.key === "Enter" || this.additionalTokenCommittingKeys.includes(e.key)) && t.value) {
@@ -493,7 +486,7 @@ const l = (h = class extends b {
493
486
  const n = this.tokenGenerator(s, this.findIndex(s));
494
487
  n.slot = "items", t.appendChild(n), n.id || (n.id = window.crypto.getRandomValues(new Uint32Array(1))[0].toString(16)), n.setClickHandler(() => this.onTokenClick(n, !0)), n.addEventListener("click", () => {
495
488
  document.activeElement != this && this.focus();
496
- }), n.setDeleteHandler((o) => this.removeTokens([o]));
489
+ }), n.setDeleteHandler((r) => this.removeTokens([r]));
497
490
  }), this.appendChild(t), this._tokenSuggestPopover && this._tokenSuggestPopover.refreshItems();
498
491
  }
499
492
  removeTokens(e) {
@@ -585,50 +578,50 @@ const l = (h = class extends b {
585
578
  ...b.shadowRootOptions,
586
579
  delegatesFocus: !0
587
580
  }, h);
588
- d([
581
+ c([
589
582
  a({ type: String, attribute: "selection-mode", reflect: !0 })
590
- ], l.prototype, "selectionMode", 2);
591
- d([
583
+ ], d.prototype, "selectionMode", 2);
584
+ c([
592
585
  a({ type: Array, attribute: !1 })
593
- ], l.prototype, "items", 2);
594
- d([
586
+ ], d.prototype, "items", 2);
587
+ c([
595
588
  a({ type: Array, attribute: !1 })
596
- ], l.prototype, "selectedIndexes", 2);
597
- d([
589
+ ], d.prototype, "selectedIndexes", 2);
590
+ c([
598
591
  a({ type: String, reflect: !0 })
599
- ], l.prototype, "placeholder", 2);
600
- d([
592
+ ], d.prototype, "placeholder", 2);
593
+ c([
601
594
  a({ type: String, reflect: !0, attribute: "suggest-list-class" })
602
- ], l.prototype, "suggestListClass", 2);
603
- d([
595
+ ], d.prototype, "suggestListClass", 2);
596
+ c([
604
597
  a({ type: String, reflect: !0, attribute: "input-label" })
605
- ], l.prototype, "inputLabel", 2);
606
- d([
598
+ ], d.prototype, "inputLabel", 2);
599
+ c([
607
600
  a({
608
601
  converter: {
609
- fromAttribute: (r) => r == "true",
610
- toAttribute: (r) => r
602
+ fromAttribute: (o) => o == "true",
603
+ toAttribute: (o) => o
611
604
  },
612
605
  reflect: !0,
613
606
  attribute: "aria-disabled"
614
607
  })
615
- ], l.prototype, "disabled", 2);
616
- d([
608
+ ], d.prototype, "disabled", 2);
609
+ c([
617
610
  a({ type: String, attribute: !0 })
618
- ], l.prototype, "validationMessage", 2);
619
- d([
611
+ ], d.prototype, "validationMessage", 2);
612
+ c([
620
613
  a({ type: String, attribute: !0 })
621
- ], l.prototype, "validationIconSrc", 2);
622
- d([
614
+ ], d.prototype, "validationIconSrc", 2);
615
+ c([
623
616
  a({ converter: E.levelConverter, attribute: !0, reflect: !0 })
624
- ], l.prototype, "validationLevel", 2);
625
- d([
617
+ ], d.prototype, "validationLevel", 2);
618
+ c([
626
619
  a({ type: String, reflect: !0, attribute: "token-type" })
627
- ], l.prototype, "tokenType", 2);
628
- d([
620
+ ], d.prototype, "tokenType", 2);
621
+ c([
629
622
  a({ type: Boolean, reflect: !0, attribute: "case-sensitive" })
630
- ], l.prototype, "caseSensitive", 2);
631
- let ie = l;
623
+ ], d.prototype, "caseSensitive", 2);
624
+ let ie = d;
632
625
  export {
633
626
  R as SelectionMode,
634
627
  ie as default,
@@ -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 List from \"@cas-smartdesign/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, item: TokenData) => boolean;\n\ntype TokenSelectedCallback = (token: TokenData) => void;\n\nexport default class TokenSuggestPopover {\n private _popover?: Popover;\n private _tokenList: List;\n private _suggestItems: TokenData[];\n\n public filter: Filter = (searchTerm, item) => {\n if (!searchTerm) {\n return true;\n }\n if (item.disabled || item.deactivated) {\n return false;\n }\n if (item.caption && item.caption.toLowerCase().includes(searchTerm)) {\n return true;\n }\n };\n\n constructor(\n private inputElement: SDInput,\n private notSelectedTokensProvider: () => TokenData[],\n tokenSelectedCallback: TokenSelectedCallback,\n private initializeCallback: (popover: TokenSuggestPopover) => void,\n ) {\n List.ensureDefined();\n\n this._tokenList = new List();\n this._tokenList.style.minWidth = \"250px\";\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\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.items = this._suggestItems.map((token) => ({ ...token, contentMode: \"text\" }));\n this._tokenList.focusIndex = -1;\n\n Object.assign(this._tokenList.style, {\n minWidth: `${Math.max(this.popover.targetElement.offsetWidth, 250)}px`,\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.items = this._suggestItems.map((token) => ({ ...token, contentMode: \"text\" }));\n }\n }\n }\n\n private filterItems(searchTerm: string): TokenData[] {\n const allTokens = this.notSelectedTokensProvider();\n if (!searchTerm) {\n return allTokens;\n }\n return allTokens.filter((token) => this.filter(searchTerm, token));\n }\n\n public hide() {\n this._suggestItems = [];\n this._tokenList.items = [];\n this._popover?.hide();\n }\n\n get list(): List {\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 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[]) => void,\n ) {\n let draggedIndexes = [];\n\n const handleGlobalDrop = (event: DragEvent) => {\n const target = event.target as HTMLElement;\n if (!tokenSelector.contains(target)) {\n tokenSelector.removeTokens(draggedIndexes);\n }\n draggedIndexes = [];\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 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) => {\n draggedIndexes.push(t.index);\n return tokenSelector.items[t.index];\n });\n event.dataTransfer.setData(\"text/plain\", 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, { capture: true, 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/plain\");\n if (data) {\n try {\n const asJson = JSON.parse(data);\n if (Array.isArray(asJson)) {\n addMatchingItems(asJson);\n event.preventDefault();\n }\n } catch (ignored) {}\n }\n });\n tokenSelector.addEventListener(\"dragend\", () => {\n window.removeEventListener(\"drop\", handleGlobalDrop);\n draggedIndexes = [];\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/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.addMatchingItems(items),\n );\n new DnDExtension(this, (items) => this.addMatchingItems(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 private addMatchingItems(items: unknown & { caption?: string }[]) {\n const newSelectedIndexes = items\n .map((item) => {\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 return matchingIndex;\n }\n return -1;\n })\n .filter((i) => -1 != i);\n if (newSelectedIndexes.length > 0) {\n this.handleTokenSelection(newSelectedIndexes);\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) {\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(tokenIndexes: number[]): void {\n if (this.disabled) {\n return;\n }\n if (this.activeTokenIndex != -1 && tokenIndexes.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: tokenIndexes,\n },\n }),\n );\n } else {\n this.selectedIndexes = this.selectedIndexes.filter((i) => !tokenIndexes.includes(i));\n\n this.dispatchEvent(\n new CustomEvent<ITokensRemovedEvent>(\"tokens-removed\", {\n detail: {\n removedIndices: tokenIndexes,\n selectedIndices: [...this.selectedIndexes],\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 private 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","item","List","e","suggestIndex","selectedToken","KeyDownDelegator","event","_offset","toggleSelection","token","allTokens","_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","RELEVANT_MIME_TYPE","ClipboardExtension","tokenSelector","getInputElementValue","pasteItems","checkedTokens","relevantIndexes","t","activeToken","asJson","index","asBlob","clipboardItems","clipboardItem","asText","json","DnDExtension","addMatchingItems","draggedIndexes","handleGlobalDrop","target","draggedItems","customDragImage","targetToken","draggedItemsNumber","dragImage","counter","wrapper","debounce","func","delay","timeout","args","SelectionMode","_TokenSelector","itemGenerator","input","curEl","element","keys","_changedProperties","checkedToken","items","newSelectedIndexes","matchingIndex","tokensArray","offset","maxIndex","tokenValue","focusedSuggestToken","selectedTokenIndex","tokenIndex","suggestPopover","oldItem","fragment","visibleTokens","tokenIndexes","i","byPointerDevice","relevantIndex","indexes","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 List from \"@cas-smartdesign/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: List;\n private _suggestItems: TokenData[];\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 List.ensureDefined();\n\n this._tokenList = new List();\n this._tokenList.style.minWidth = \"250px\";\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\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.items = this._suggestItems.map((token) => ({ ...token, contentMode: \"text\" }));\n this._tokenList.focusIndex = -1;\n\n Object.assign(this._tokenList.style, {\n minWidth: `${Math.max(this.popover.targetElement.offsetWidth, 250)}px`,\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.items = this._suggestItems.map((token) => ({ ...token, contentMode: \"text\" }));\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.items = [];\n this._popover?.hide();\n }\n\n get list(): List {\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 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[]) => void,\n ) {\n let draggedIndexes = [];\n\n const handleGlobalDrop = (event: DragEvent) => {\n const target = event.target as HTMLElement;\n if (!tokenSelector.contains(target)) {\n tokenSelector.removeTokens(draggedIndexes);\n }\n draggedIndexes = [];\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 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) => {\n draggedIndexes.push(t.index);\n return tokenSelector.items[t.index];\n });\n event.dataTransfer.setData(\"text/plain\", 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, { capture: true, 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/plain\");\n if (data) {\n try {\n const asJson = JSON.parse(data);\n if (Array.isArray(asJson)) {\n addMatchingItems(asJson);\n event.preventDefault();\n }\n } catch (ignored) {}\n }\n });\n tokenSelector.addEventListener(\"dragend\", () => {\n window.removeEventListener(\"drop\", handleGlobalDrop);\n draggedIndexes = [];\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/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.addMatchingItems(items),\n );\n new DnDExtension(this, (items) => this.addMatchingItems(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 private addMatchingItems(items: unknown & { caption?: string }[]) {\n const newSelectedIndexes = items\n .map((item) => {\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 return matchingIndex;\n }\n return -1;\n })\n .filter((i) => -1 != i);\n if (newSelectedIndexes.length > 0) {\n this.handleTokenSelection(newSelectedIndexes);\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) {\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(tokenIndexes: number[]): void {\n if (this.disabled) {\n return;\n }\n if (this.activeTokenIndex != -1 && tokenIndexes.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: tokenIndexes,\n },\n }),\n );\n } else {\n this.selectedIndexes = this.selectedIndexes.filter((i) => !tokenIndexes.includes(i));\n\n this.dispatchEvent(\n new CustomEvent<ITokensRemovedEvent>(\"tokens-removed\", {\n detail: {\n removedIndices: tokenIndexes,\n selectedIndices: [...this.selectedIndexes],\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 private 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","List","e","suggestIndex","selectedToken","KeyDownDelegator","event","_offset","toggleSelection","token","_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","RELEVANT_MIME_TYPE","ClipboardExtension","tokenSelector","getInputElementValue","pasteItems","checkedTokens","relevantIndexes","activeToken","asJson","index","asBlob","clipboardItems","clipboardItem","asText","json","DnDExtension","addMatchingItems","draggedIndexes","handleGlobalDrop","target","draggedItems","customDragImage","targetToken","draggedItemsNumber","dragImage","counter","wrapper","debounce","func","delay","timeout","args","SelectionMode","_TokenSelector","itemGenerator","input","curEl","item","element","keys","_changedProperties","checkedToken","items","newSelectedIndexes","matchingIndex","tokensArray","offset","maxIndex","tokenValue","focusedSuggestToken","selectedTokenIndex","tokenIndex","suggestPopover","oldItem","fragment","visibleTokens","tokenIndexes","i","byPointerDevice","relevantIndex","indexes","previous","activeElement","SDFieldValidationMessage","TokenSelector"],"mappings":"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"}
@@ -2,7 +2,7 @@ import Popover from "@cas-smartdesign/popover";
2
2
  import List from "@cas-smartdesign/list";
3
3
  import { TokenData } from "./token";
4
4
  import SDInput from "@cas-smartdesign/lit-input";
5
- export type Filter = (searchTerm: string, item: TokenData) => boolean;
5
+ export type Filter = (searchTerm: string, allTokens: TokenData[]) => TokenData[];
6
6
  type TokenSelectedCallback = (token: TokenData) => void;
7
7
  export default class TokenSuggestPopover {
8
8
  private inputElement;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cas-smartdesign/token-selector",
3
- "version": "0.15.0",
3
+ "version": "0.16.1",
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",
@@ -26,9 +26,9 @@
26
26
  "access": "public"
27
27
  },
28
28
  "devDependencies": {
29
+ "@cas-smartdesign/element-preview": "^0.2.1",
29
30
  "@cas-smartdesign/button": "^5.0.1",
30
- "@cas-smartdesign/license-generator": "^1.6.1",
31
- "@cas-smartdesign/element-preview": "^0.2.1"
31
+ "@cas-smartdesign/license-generator": "^1.6.2"
32
32
  },
33
33
  "scripts": {
34
34
  "version": "pnpm version",
package/readme.md CHANGED
@@ -58,7 +58,7 @@ _`Note: This is a preview version of the sd-token-selector element. Some feature
58
58
  - Reflects the `token-type` attribute.
59
59
  - `caseSensitive` : **boolean (default = null)**
60
60
  - Reflects the `case-sensitive` attribute.
61
- - `suggestionFilter`: **Function (searchTerm: string, item: TokenData) => boolean**
61
+ - `suggestionFilter`: **Function (searchTerm: string, allTokens: TokenData[]) => TokenData[]**
62
62
  - A custom filter function can be passed to override the default caption based search of suggestions.
63
63
 
64
64
  In addition it allows to inject elements with slot named `additional-content` that is shown right after the tokens part.