@cas-smartdesign/token-selector 1.0.3 → 1.0.5

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.
@@ -69,6 +69,7 @@ export default class TokenSelector extends LitElement {
69
69
  private _tokenSuggestPopover;
70
70
  private cancelSearch;
71
71
  private _activeTokenIndex;
72
+ private updateItemsOnConnect;
72
73
  static get styles(): CSSResult;
73
74
  static shadowRootOptions: ShadowRootInit;
74
75
  get tokenGenerator(): TokenGenerator;
@@ -79,6 +80,7 @@ export default class TokenSelector extends LitElement {
79
80
  openSuggestions(): void;
80
81
  focus(): void;
81
82
  render(): TemplateResult;
83
+ connectedCallback(): void;
82
84
  protected firstUpdated(_changedProperties: Map<string | number | symbol, unknown>): void;
83
85
  private handleInputKeyDown;
84
86
  private handleKeyDown;
@@ -1,4 +1,4 @@
1
- import { LitElement as x, unsafeCSS as T, nothing as w, html as m } from "lit";
1
+ import { LitElement as x, unsafeCSS as T, nothing as I, html as m } from "lit";
2
2
  import { property as d } from "lit/decorators/property.js";
3
3
  import "@cas-smartdesign/lit-input";
4
4
  import S from "@cas-smartdesign/field-validation-message";
@@ -78,7 +78,7 @@ var R = Object.defineProperty, N = Object.getOwnPropertyDescriptor, f = (r, e, t
78
78
  (o = r[s]) && (n = (i ? o(e, t, n) : o(n)) || n);
79
79
  return i && n && R(e, t, n), n;
80
80
  };
81
- const I = {
81
+ const w = {
82
82
  fromAttribute: (r) => r == "true",
83
83
  toAttribute: (r) => r
84
84
  };
@@ -118,7 +118,7 @@ const p = (u = class extends x {
118
118
  ${this.renderIcon()}
119
119
  <slot name="after-icon"></slot>
120
120
  <div class="value">${this.value}</div>
121
- ${this.disabled ? w : m` <div class="delete-button-wrapper">${P($)}</div> `}
121
+ ${this.disabled ? I : m` <div class="delete-button-wrapper">${P($)}</div> `}
122
122
  </div>
123
123
  `;
124
124
  }
@@ -135,7 +135,7 @@ const p = (u = class extends x {
135
135
  </div>
136
136
  `;
137
137
  }
138
- return w;
138
+ return I;
139
139
  }
140
140
  updated(e) {
141
141
  super.updated(e), e.has("disabled") && !this.disabled && this.checked && (this.checked = !1);
@@ -165,13 +165,13 @@ f([
165
165
  d({ type: String })
166
166
  ], p.prototype, "iconBackgroundColor", 2);
167
167
  f([
168
- d({ converter: I, reflect: !0, attribute: "aria-disabled" })
168
+ d({ converter: w, reflect: !0, attribute: "aria-disabled" })
169
169
  ], p.prototype, "disabled", 2);
170
170
  f([
171
- d({ converter: I, reflect: !0, attribute: "aria-current" })
171
+ d({ converter: w, reflect: !0, attribute: "aria-current" })
172
172
  ], p.prototype, "current", 2);
173
173
  f([
174
- d({ converter: I, reflect: !0, attribute: "aria-checked" })
174
+ d({ converter: w, reflect: !0, attribute: "aria-checked" })
175
175
  ], p.prototype, "checked", 1);
176
176
  let b = p;
177
177
  const F = (r, e) => {
@@ -397,7 +397,7 @@ const l = (h = class extends x {
397
397
  <slot name="items"
398
398
  >${this.placeholder ? m`<span part="remove-only-placeholder" class="placeholder"
399
399
  >${this.placeholder}</span
400
- >` : w}</slot
400
+ >` : I}</slot
401
401
  >
402
402
  </div>
403
403
  <slot class="additonal-content" name="additional-content" @focusin=${this.clearCheckedTokens}></slot>` : m`
@@ -419,6 +419,9 @@ const l = (h = class extends x {
419
419
  <slot class="additonal-content" name="additional-content" @focusin=${this.clearCheckedTokens}></slot>
420
420
  `;
421
421
  }
422
+ connectedCallback() {
423
+ super.connectedCallback(), this.updateItemsOnConnect && (this.updateItemsOnConnect = !1, this.updateItems());
424
+ }
422
425
  firstUpdated(e) {
423
426
  super.firstUpdated(e), this.setAttribute("role", "listbox"), this.setAttribute("aria-multiselectable", "true"), !this.hasAttribute("tabIndex") && !this.disabled && (this.tabIndex = 0), this.addEventListener("focusout", (t) => {
424
427
  const i = t.relatedTarget;
@@ -514,8 +517,12 @@ const l = (h = class extends x {
514
517
  ), this._tokenSuggestPopover.list.itemGenerator = this._autoSuggestItemGenerator, this._tokenSuggestPopover.list.className = this.suggestListClass, this.suggestionFilter && (this._tokenSuggestPopover.filter = this.suggestionFilter)), this._tokenSuggestPopover;
515
518
  }
516
519
  updateItems() {
517
- if (!this.isConnected || !this.items)
520
+ if (!this.items)
521
+ return;
522
+ if (!this.isConnected) {
523
+ this.updateItemsOnConnect = !0;
518
524
  return;
525
+ }
519
526
  this.activeTokenIndex = -1;
520
527
  const e = this.inputElement;
521
528
  e && (!this._tokenSuggestPopover || !this._tokenSuggestPopover.isOpened) && (e.value = ""), this.querySelectorAll("[slot='items']").forEach((n) => {
@@ -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\nlet idCounter = 0;\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.id = \"sd_token_suggest_popover_list_\" + idCounter++;\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.ensurePopover();\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 private ensurePopover() {\n if (!this._popover) {\n this._popover = this.createPopover();\n this.initializeCallback(this);\n }\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 this.ensurePopover();\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 { placeholderDirective as placeholder } 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, withModifier?: boolean) => 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 const selection = window.getSelection();\n if (selection && selection.type == \"Range\") {\n return;\n }\n e.stopPropagation();\n const withModifier = e.getModifierState(\"Control\");\n if (!this.disabled) {\n if (withModifier) {\n this.checked = !this.checked;\n } else {\n this.checked = true;\n }\n }\n if (this._tokenClickHandler) {\n this._tokenClickHandler(this.index, withModifier);\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 ? `--sd-token-icon-background-color: ${this.iconBackgroundColor}`\n : undefined;\n return html`\n <div class=\"icon-wrapper\" style=\"${ifDefined(iconBackgroundStyle)}\" role=\"img\">\n <div\n part=\"icon\"\n class=\"icon\"\n style=\"background-image:${placeholder(this.icon, this.iconPlaceholder)}\"\n ></div>\n </div>\n `;\n }\n return nothing;\n }\n\n public updated(changedProperties: PropertyValues): void {\n super.updated(changedProperties);\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\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 const selection = window.getSelection();\n if ((!selection || selection.type != \"Range\") && !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 // empty-on-purpose\n }\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 const inputEl = this.inputElement;\n if (inputEl) {\n inputEl.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=\"${this.disabled ? -1 : 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 aria-autocomplete=\"list\"\n tabindex=\"0\"\n @focus=${(e: FocusEvent) => (e.target as HTMLElement).setAttribute(\"focused\", \"\")}\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\") && !this.disabled) {\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 !this.disabled\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 this.inputElement.removeAttribute(\"focus-visible\");\n return;\n }\n\n switch (event.key) {\n case \"Escape\": {\n if (this.tokenSuggestPopover.isOpened) {\n event.preventDefault();\n event.stopPropagation();\n this.tokenSuggestPopover.hide();\n }\n break;\n }\n case \"Tab\": {\n this.commitTokenValue(input.value);\n this.tokenSuggestPopover.hide();\n this.inputElement.removeAttribute(\"focus-visible\");\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 const withModifier = event.getModifierState(\"Control\");\n if (withModifier) {\n curEl.checked = !curEl.checked;\n } else {\n curEl.checked = true;\n }\n this.onTokenClick(curEl, false, withModifier);\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 const inputEl = this.inputElement;\n if (inputEl) {\n inputEl.removeAttribute(\"focus-visible\");\n inputEl.removeAttribute(\"focused\");\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 if (this.disabled) {\n return;\n }\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) {\n this.inputElement?.setAttribute(\"focus-visible\", \"\");\n if (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\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.hide();\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 if (changedProperties.has(\"inputLabel\")) {\n if (this.inputLabel) {\n this.setAttribute(\"aria-label\", this.inputLabel);\n } else {\n this.removeAttribute(\"aria-label\");\n }\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.inputElement.setAttribute(\"aria-controls\", suggestPopover.list.id);\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((_tokenIndex, withModifier) => this.onTokenClick(token, true, withModifier));\n token.addEventListener(\"click\", () => {\n this.inputElement?.removeAttribute(\"focus-visible\");\n const selection = window.getSelection();\n if ((!selection || selection.type != \"Range\") && 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, withModifier: boolean): void {\n let relevantIndex;\n this.querySelectorAll(\"[slot='items']\").forEach((item, i) => {\n if (token == item) {\n relevantIndex = i;\n } else if (!withModifier) {\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 if (!withModifier) {\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\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":["idCounter","TokenSuggestPopover","inputElement","notSelectedTokensProvider","tokenSelectedCallback","initializeCallback","searchTerm","allTokens","t","VirtualList","e","suggestIndex","selectedToken","event","KeyDownDelegator","_offset","toggleSelection","popover","Popover","clearSvg","alwaysPresentBooleanAttributeConverter","value","_Token","_a","LitElement","unsafeCSS","style","oldValue","changedProperties","selection","withModifier","deleteButton","html","nothing","unsafeSVG","iconBackgroundStyle","ifDefined","placeholder","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","inputEl","_changedProperties","checkedToken","tokensArray","offset","maxIndex","activeEl","tokenValue","focusedSuggestToken","selectedTokenIndex","tokenIndex","suggestPopover","oldItem","fragment","visibleTokens","_tokenIndex","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\nlet idCounter = 0;\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.id = \"sd_token_suggest_popover_list_\" + idCounter++;\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.ensurePopover();\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 private ensurePopover() {\n if (!this._popover) {\n this._popover = this.createPopover();\n this.initializeCallback(this);\n }\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 this.ensurePopover();\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 { placeholderDirective as placeholder } 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, withModifier?: boolean) => 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 const selection = window.getSelection();\n if (selection && selection.type == \"Range\") {\n return;\n }\n e.stopPropagation();\n const withModifier = e.getModifierState(\"Control\");\n if (!this.disabled) {\n if (withModifier) {\n this.checked = !this.checked;\n } else {\n this.checked = true;\n }\n }\n if (this._tokenClickHandler) {\n this._tokenClickHandler(this.index, withModifier);\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 ? `--sd-token-icon-background-color: ${this.iconBackgroundColor}`\n : undefined;\n return html`\n <div class=\"icon-wrapper\" style=\"${ifDefined(iconBackgroundStyle)}\" role=\"img\">\n <div\n part=\"icon\"\n class=\"icon\"\n style=\"background-image:${placeholder(this.icon, this.iconPlaceholder)}\"\n ></div>\n </div>\n `;\n }\n return nothing;\n }\n\n public updated(changedProperties: PropertyValues): void {\n super.updated(changedProperties);\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\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 const selection = window.getSelection();\n if ((!selection || selection.type != \"Range\") && !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 // empty-on-purpose\n }\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 private updateItemsOnConnect: boolean;\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 const inputEl = this.inputElement;\n if (inputEl) {\n inputEl.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=\"${this.disabled ? -1 : 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 aria-autocomplete=\"list\"\n tabindex=\"0\"\n @focus=${(e: FocusEvent) => (e.target as HTMLElement).setAttribute(\"focused\", \"\")}\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 public connectedCallback(): void {\n super.connectedCallback();\n if (this.updateItemsOnConnect) {\n this.updateItemsOnConnect = false;\n this.updateItems();\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\") && !this.disabled) {\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 !this.disabled\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 this.inputElement.removeAttribute(\"focus-visible\");\n return;\n }\n\n switch (event.key) {\n case \"Escape\": {\n if (this.tokenSuggestPopover.isOpened) {\n event.preventDefault();\n event.stopPropagation();\n this.tokenSuggestPopover.hide();\n }\n break;\n }\n case \"Tab\": {\n this.commitTokenValue(input.value);\n this.tokenSuggestPopover.hide();\n this.inputElement.removeAttribute(\"focus-visible\");\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 const withModifier = event.getModifierState(\"Control\");\n if (withModifier) {\n curEl.checked = !curEl.checked;\n } else {\n curEl.checked = true;\n }\n this.onTokenClick(curEl, false, withModifier);\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 const inputEl = this.inputElement;\n if (inputEl) {\n inputEl.removeAttribute(\"focus-visible\");\n inputEl.removeAttribute(\"focused\");\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 if (this.disabled) {\n return;\n }\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) {\n this.inputElement?.setAttribute(\"focus-visible\", \"\");\n if (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\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.hide();\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 if (changedProperties.has(\"inputLabel\")) {\n if (this.inputLabel) {\n this.setAttribute(\"aria-label\", this.inputLabel);\n } else {\n this.removeAttribute(\"aria-label\");\n }\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.inputElement.setAttribute(\"aria-controls\", suggestPopover.list.id);\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.items) {\n return;\n }\n if (!this.isConnected) {\n this.updateItemsOnConnect = true;\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((_tokenIndex, withModifier) => this.onTokenClick(token, true, withModifier));\n token.addEventListener(\"click\", () => {\n this.inputElement?.removeAttribute(\"focus-visible\");\n const selection = window.getSelection();\n if ((!selection || selection.type != \"Range\") && 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, withModifier: boolean): void {\n let relevantIndex;\n this.querySelectorAll(\"[slot='items']\").forEach((item, i) => {\n if (token == item) {\n relevantIndex = i;\n } else if (!withModifier) {\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 if (!withModifier) {\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\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":["idCounter","TokenSuggestPopover","inputElement","notSelectedTokensProvider","tokenSelectedCallback","initializeCallback","searchTerm","allTokens","t","VirtualList","e","suggestIndex","selectedToken","event","KeyDownDelegator","_offset","toggleSelection","popover","Popover","clearSvg","alwaysPresentBooleanAttributeConverter","value","_Token","_a","LitElement","unsafeCSS","style","oldValue","changedProperties","selection","withModifier","deleteButton","html","nothing","unsafeSVG","iconBackgroundStyle","ifDefined","placeholder","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","inputEl","_changedProperties","checkedToken","tokensArray","offset","maxIndex","activeEl","tokenValue","focusedSuggestToken","selectedTokenIndex","tokenIndex","suggestPopover","oldItem","fragment","visibleTokens","_tokenIndex","indexes","matchingIndexes","byPointerDevice","relevantIndex","previous","activeElement","SDFieldValidationMessage","TokenSelector"],"mappings":"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"}