@sapudex/web-components 2.22.0 → 2.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (170) hide show
  1. package/cypress/specs/CountrySelector.cy.tsx +158 -144
  2. package/cypress/specs/EventRibbon.cy.tsx +3 -1
  3. package/cypress/specs/SelectBox.cy.tsx +173 -206
  4. package/cypress/specs/Tag.cy.tsx +1 -1
  5. package/cypress/specs/TextField.cy.tsx +15 -0
  6. package/cypress/specs/Textarea.cy.tsx +15 -33
  7. package/dist/CountrySelector.d.ts +25 -142
  8. package/dist/CountrySelector.js +91 -268
  9. package/dist/CountrySelector.js.map +1 -1
  10. package/dist/FilterMenu.d.ts +14 -2
  11. package/dist/FilterMenu.js +11 -1
  12. package/dist/FilterMenu.js.map +1 -1
  13. package/dist/List.js +2 -3
  14. package/dist/List.js.map +1 -1
  15. package/dist/ListGroupHeaderBase.d.ts +1 -0
  16. package/dist/ListGroupHeaderBase.js +3 -0
  17. package/dist/ListGroupHeaderBase.js.map +1 -1
  18. package/dist/ListItemBase.d.ts +12 -0
  19. package/dist/ListItemBase.js +17 -2
  20. package/dist/ListItemBase.js.map +1 -1
  21. package/dist/MediaPlayer.js +2 -0
  22. package/dist/MediaPlayer.js.map +1 -1
  23. package/dist/MediaPlayerTemplate.js +4 -4
  24. package/dist/MediaPlayerTemplate.js.map +1 -1
  25. package/dist/SearchableListBase.d.ts +23 -16
  26. package/dist/SearchableListBase.js +48 -72
  27. package/dist/SearchableListBase.js.map +1 -1
  28. package/dist/SelectBase.d.ts +193 -0
  29. package/dist/SelectBase.js +428 -0
  30. package/dist/SelectBase.js.map +1 -0
  31. package/dist/SelectBox.d.ts +30 -152
  32. package/dist/SelectBox.js +139 -348
  33. package/dist/SelectBox.js.map +1 -1
  34. package/dist/TagGroup.d.ts +23 -5
  35. package/dist/TagGroup.js +37 -16
  36. package/dist/TagGroup.js.map +1 -1
  37. package/dist/TagTemplate.js +4 -2
  38. package/dist/TagTemplate.js.map +1 -1
  39. package/dist/TextArea.d.ts +1 -1
  40. package/dist/TextArea.js +5 -5
  41. package/dist/TextArea.js.map +1 -1
  42. package/dist/TextAreaTemplate.d.ts +2 -0
  43. package/dist/TextAreaTemplate.js +13 -0
  44. package/dist/TextAreaTemplate.js.map +1 -0
  45. package/dist/TextField.d.ts +29 -4
  46. package/dist/TextField.js +32 -16
  47. package/dist/TextField.js.map +1 -1
  48. package/dist/TextFieldTemplate.d.ts +2 -0
  49. package/dist/TextFieldTemplate.js +14 -0
  50. package/dist/TextFieldTemplate.js.map +1 -0
  51. package/dist/assets/{InputSuggestions-By00xQan.js → InputSuggestions-C8m6N2-d.js} +1 -1
  52. package/dist/assets/{ListItemStandardExpandableTextTemplate-BGtoxRbA.js → ListItemStandardExpandableTextTemplate-BwD5bYhw.js} +1 -1
  53. package/dist/assets/{bundle.esm-9yDdQqR5.js → bundle.esm-hGsUwmUy.js} +218 -217
  54. package/dist/css/themes/CountrySelector.css +1 -1
  55. package/dist/css/themes/EventRibbon.css +1 -1
  56. package/dist/css/themes/ListItem.css +1 -1
  57. package/dist/css/themes/MastheadItem.css +1 -1
  58. package/dist/css/themes/MastheadMobileMenu.css +1 -1
  59. package/dist/css/themes/RatingIndicator.css +1 -1
  60. package/dist/css/themes/Search.css +1 -1
  61. package/dist/css/themes/SelectBase.css +1 -0
  62. package/dist/css/themes/SelectBox.css +1 -1
  63. package/dist/css/themes/Slider.css +1 -1
  64. package/dist/css/themes/TagGroup.css +1 -1
  65. package/dist/css/themes/TextField.css +1 -1
  66. package/dist/custom-elements-internal.json +1088 -1284
  67. package/dist/custom-elements.json +284 -934
  68. package/dist/generated/templates/CountrySelectorTemplate.lit.js +3 -3
  69. package/dist/generated/templates/CountrySelectorTemplate.lit.js.map +1 -1
  70. package/dist/generated/templates/ListItemTemplate.lit.js +1 -1
  71. package/dist/generated/templates/ListItemTemplate.lit.js.map +1 -1
  72. package/dist/generated/templates/SelectBoxTemplate.lit.js +10 -9
  73. package/dist/generated/templates/SelectBoxTemplate.lit.js.map +1 -1
  74. package/dist/generated/themes/CountrySelector.css.d.ts +1 -1
  75. package/dist/generated/themes/CountrySelector.css.js +1 -1
  76. package/dist/generated/themes/CountrySelector.css.js.map +1 -1
  77. package/dist/generated/themes/EventRibbon.css.d.ts +1 -1
  78. package/dist/generated/themes/EventRibbon.css.js +1 -1
  79. package/dist/generated/themes/EventRibbon.css.js.map +1 -1
  80. package/dist/generated/themes/ListItem.css.d.ts +1 -1
  81. package/dist/generated/themes/ListItem.css.js +1 -1
  82. package/dist/generated/themes/ListItem.css.js.map +1 -1
  83. package/dist/generated/themes/MastheadItem.css.d.ts +1 -1
  84. package/dist/generated/themes/MastheadItem.css.js +1 -1
  85. package/dist/generated/themes/MastheadItem.css.js.map +1 -1
  86. package/dist/generated/themes/MastheadMobileMenu.css.d.ts +1 -1
  87. package/dist/generated/themes/MastheadMobileMenu.css.js +1 -1
  88. package/dist/generated/themes/MastheadMobileMenu.css.js.map +1 -1
  89. package/dist/generated/themes/RatingIndicator.css.d.ts +1 -1
  90. package/dist/generated/themes/RatingIndicator.css.js +1 -1
  91. package/dist/generated/themes/RatingIndicator.css.js.map +1 -1
  92. package/dist/generated/themes/Search.css.d.ts +1 -1
  93. package/dist/generated/themes/Search.css.js +1 -1
  94. package/dist/generated/themes/Search.css.js.map +1 -1
  95. package/dist/generated/themes/SelectBase.css.d.ts +2 -0
  96. package/dist/generated/themes/SelectBase.css.js +8 -0
  97. package/dist/generated/themes/SelectBase.css.js.map +1 -0
  98. package/dist/generated/themes/SelectBox.css.d.ts +1 -1
  99. package/dist/generated/themes/SelectBox.css.js +1 -1
  100. package/dist/generated/themes/SelectBox.css.js.map +1 -1
  101. package/dist/generated/themes/Slider.css.d.ts +1 -1
  102. package/dist/generated/themes/Slider.css.js +1 -1
  103. package/dist/generated/themes/Slider.css.js.map +1 -1
  104. package/dist/generated/themes/TagGroup.css.d.ts +1 -1
  105. package/dist/generated/themes/TagGroup.css.js +1 -1
  106. package/dist/generated/themes/TagGroup.css.js.map +1 -1
  107. package/dist/generated/themes/TextField.css.d.ts +1 -1
  108. package/dist/generated/themes/TextField.css.js +1 -1
  109. package/dist/generated/themes/TextField.css.js.map +1 -1
  110. package/dist/types/common.d.ts +1 -1
  111. package/dist/types/common.js +1 -1
  112. package/dist/types/common.js.map +1 -1
  113. package/dist/vscode.html-custom-data.json +23 -234
  114. package/dist/web-types.json +256 -811
  115. package/package.json +1 -1
  116. package/src/CountrySelector.hbs +6 -61
  117. package/src/CountrySelector.ts +93 -375
  118. package/src/FilterMenu.ts +13 -3
  119. package/src/List.ts +2 -3
  120. package/src/ListGroupHeaderBase.ts +4 -0
  121. package/src/ListItem.hbs +0 -1
  122. package/src/ListItemBase.ts +17 -3
  123. package/src/MediaPlayer.ts +2 -0
  124. package/src/MediaPlayerTemplate.tsx +0 -1
  125. package/src/SearchableListBase.ts +68 -83
  126. package/src/SelectBase.ts +580 -0
  127. package/src/SelectBox.hbs +118 -107
  128. package/src/SelectBox.ts +155 -445
  129. package/src/TagGroup.ts +53 -19
  130. package/src/TagTemplate.tsx +4 -2
  131. package/src/TextArea.ts +5 -5
  132. package/src/TextAreaTemplate.tsx +67 -0
  133. package/src/TextField.ts +57 -24
  134. package/src/TextFieldTemplate.tsx +90 -0
  135. package/src/generated/templates/CountrySelectorTemplate.lit.ts +2 -2
  136. package/src/generated/templates/ListItemTemplate.lit.ts +1 -1
  137. package/src/generated/templates/SelectBoxTemplate.lit.ts +10 -9
  138. package/src/generated/themes/CountrySelector.css.ts +1 -1
  139. package/src/generated/themes/EventRibbon.css.ts +1 -1
  140. package/src/generated/themes/ListItem.css.ts +1 -1
  141. package/src/generated/themes/MastheadItem.css.ts +1 -1
  142. package/src/generated/themes/MastheadMobileMenu.css.ts +1 -1
  143. package/src/generated/themes/RatingIndicator.css.ts +1 -1
  144. package/src/generated/themes/Search.css.ts +1 -1
  145. package/src/generated/themes/SelectBase.css.ts +9 -0
  146. package/src/generated/themes/SelectBox.css.ts +1 -1
  147. package/src/generated/themes/Slider.css.ts +1 -1
  148. package/src/generated/themes/TagGroup.css.ts +1 -1
  149. package/src/generated/themes/TextField.css.ts +1 -1
  150. package/src/themes/CountrySelector.css +42 -115
  151. package/src/themes/EventRibbon.css +21 -13
  152. package/src/themes/ListItem.css +6 -0
  153. package/src/themes/MastheadItem.css +0 -2
  154. package/src/themes/MastheadMobileMenu.css +2 -0
  155. package/src/themes/Search.css +0 -1
  156. package/src/themes/SelectBase.css +239 -0
  157. package/src/themes/SelectBox.css +13 -195
  158. package/src/themes/TagGroup.css +0 -1
  159. package/src/themes/TextField.css +7 -7
  160. package/src/types/common.ts +1 -1
  161. package/dist/generated/templates/TextAreaTemplate.lit.d.ts +0 -3
  162. package/dist/generated/templates/TextAreaTemplate.lit.js +0 -13
  163. package/dist/generated/templates/TextAreaTemplate.lit.js.map +0 -1
  164. package/dist/generated/templates/TextFieldTemplate.lit.d.ts +0 -3
  165. package/dist/generated/templates/TextFieldTemplate.lit.js +0 -14
  166. package/dist/generated/templates/TextFieldTemplate.lit.js.map +0 -1
  167. package/src/TextArea.hbs +0 -54
  168. package/src/TextField.hbs +0 -78
  169. package/src/generated/templates/TextAreaTemplate.lit.ts +0 -17
  170. package/src/generated/templates/TextFieldTemplate.lit.ts +0 -18
@@ -0,0 +1,580 @@
1
+ import property from "@ui5/webcomponents-base/dist/decorators/property.js";
2
+ import executeTemplate from "@ui5/webcomponents-base/dist/renderer/executeTemplate.js";
3
+ import {
4
+ isEscape, isDown, isUp, isHome, isEnd, isTabNext, isTabPrevious,
5
+ } from "@ui5/webcomponents-base/dist/Keys.js";
6
+ import { getAllAccessibleNameRefTexts } from "@ui5/webcomponents-base/dist/util/AccessibilityTextsHelper.js";
7
+ import type { UDExListItemBase } from "./List.js";
8
+ import type Popover from "@ui5/webcomponents/dist/Popover.js";
9
+ import type UDExList from "./List.js";
10
+ import type UDExSearch from "./Search.js";
11
+ import "@ui5/webcomponents-icons/dist/decline.js";
12
+ import "@ui5/webcomponents-icons/dist/navigation-down-arrow.js";
13
+ import { COUNTRY_SELECT } from "./generated/i18n/i18n-defaults.js";
14
+ import SearchableListBaseTemplate from "./generated/templates/SearchableListBaseTemplate.lit.js";
15
+ import CountrySelectorTemplate from "./generated/templates/CountrySelectorTemplate.lit.js";
16
+ import type { ResizeObserverCallback } from "@ui5/webcomponents-base/delegate/ResizeHandler.js";
17
+ import ResizeHandler from "@ui5/webcomponents-base/delegate/ResizeHandler.js";
18
+ import UDExSearchableListBase from "./SearchableListBase.js";
19
+ import UDExValueState from "./types/common.js";
20
+ import type { UDExSearchableListBaseEvents } from "./SearchableListBase.js";
21
+ import { getTokensCountText } from "@ui5/webcomponents/dist/Tokenizer.js";
22
+ import isLetterKey from "./utils/isLetterKeyPressed.js";
23
+
24
+ export type UDExSelectBaseEvents = {
25
+ "open": void,
26
+ "close": void,
27
+ "before-close": void,
28
+ "before-open": void,
29
+ } & UDExSearchableListBaseEvents;
30
+
31
+ /**
32
+ * @class
33
+ *
34
+ * <h3 class="comment-api-title">Overview</h3>
35
+ *
36
+ *
37
+ * <h3>Usage</h3>
38
+ *
39
+ * For the <code>udex-select-box</code>
40
+ * <h3>ES6 Module Import</h3>
41
+ *
42
+ * <code>import "@sapudex/web-components/dist/UDExSelectBox.js";</code>
43
+ *
44
+ * @constructor
45
+ * @extends UDExSearchableListBase
46
+ * @tagname udex-select-box
47
+ * @public
48
+ */
49
+
50
+ class UDExSelectBase extends UDExSearchableListBase {
51
+ eventDetails!: UDExSelectBaseEvents;
52
+
53
+ /**
54
+ * Defines whether the component is required.
55
+ *
56
+ * @default false
57
+ * @public
58
+ */
59
+ @property({ type: Boolean })
60
+ required!: boolean;
61
+
62
+ /**
63
+ * Defines whether the component is in disabled state.
64
+ *
65
+ * @default false
66
+ * @public
67
+ */
68
+ @property({ type: Boolean })
69
+ disabled!: boolean;
70
+
71
+ /**
72
+ * Defines label text for field container.
73
+ *
74
+ * @default ""
75
+ * @public
76
+ */
77
+ @property({ type: String })
78
+ label!: string;
79
+
80
+ /**
81
+ * Defines the accessible ARIA name of the component.
82
+ *
83
+ * @default undefined
84
+ * @public
85
+ */
86
+ @property()
87
+ accessibleName?: string;
88
+
89
+ /**
90
+ * Receives id (or many ids) of the elements that label the component.
91
+ * @default undefined
92
+ * @public
93
+ */
94
+ @property()
95
+ accessibleNameRef?: string;
96
+
97
+ /**
98
+ * Defines whether the component is read-only.
99
+ *
100
+ * @default false
101
+ * @public
102
+ */
103
+ @property({ type: Boolean })
104
+ readonly!: boolean;
105
+
106
+ /**
107
+ * Defines whether the component is display-only.
108
+ *
109
+ * @default false
110
+ * @public
111
+ */
112
+ @property({ type: Boolean })
113
+ displayonly!: boolean;
114
+
115
+ /**
116
+ * Defines the value state of the trigger container.
117
+ *
118
+ * @default "Standard"
119
+ * @public
120
+ */
121
+ @property()
122
+ valueState: `${UDExValueState}` = UDExValueState.Standard;
123
+
124
+ /**
125
+ * Defines supporting text under the trigger container.
126
+ *
127
+ * @default undefined
128
+ * @public
129
+ */
130
+ @property({ type: String })
131
+ supportingText?: string;
132
+
133
+ /**
134
+ * @private
135
+ */
136
+ @property({ type: String, noAttribute: true })
137
+ _direction?: string;
138
+
139
+ /**
140
+ * @default false
141
+ * @private
142
+ */
143
+ @property({ type: Boolean })
144
+ _focused!: boolean;
145
+
146
+ /**
147
+ * @default false
148
+ * @private
149
+ */
150
+ @property({ type: Boolean })
151
+ _open: boolean = false;
152
+
153
+ /**
154
+ * Defines selected option for Single Select Mode.
155
+ *
156
+ * @default undefined
157
+ * @private
158
+ */
159
+ @property()
160
+ _selectedOption!: string;
161
+
162
+ /**
163
+ * Defines if the component should reset.
164
+ *
165
+ * @default false
166
+ * @private
167
+ */
168
+ @property({ type: Boolean, noAttribute: true })
169
+ _requestRender = false;
170
+
171
+ _paneWidthVariableName = "--udex-dropdown-pane-width";
172
+ _labelBaseClass = "udex-text-field__label";
173
+ _dropdownClass = "udex-select-box__dropdown";
174
+ _listBoxRole = "listbox";
175
+ _rootClass = "udex-select-box__root";
176
+ _stickyClass = "udex-list__sticky";
177
+ _ariaAutoComplete = "list";
178
+ _trigger!: HTMLElement;
179
+ _search!: UDExSearch | HTMLInputElement;
180
+ _popover!: Popover;
181
+ _list!: UDExList;
182
+ _inputValue: string = "";
183
+ _lastSelectedItemId: string = "";
184
+ _handleResizeBound: ResizeObserverCallback;
185
+
186
+ constructor() {
187
+ super();
188
+ this._handleResizeBound = this._handleResize.bind(this);
189
+ }
190
+
191
+ onEnterDOM() {
192
+ ResizeHandler.register(this, this._handleResizeBound);
193
+ if (this.modeSingleSelect) {
194
+ this.setSelectOption();
195
+ }
196
+ }
197
+
198
+ onExitDOM() {
199
+ ResizeHandler.deregister(this, this._handleResizeBound);
200
+ }
201
+
202
+ onAfterRendering() {
203
+ this._popover = this.getPopover();
204
+ this._search = this.getSearch();
205
+ this._list = this.getList();
206
+ this._trigger = this.trigger;
207
+ this.handleDirection();
208
+
209
+ if (this._requestRender) {
210
+ this._requestRender = false;
211
+ }
212
+ }
213
+
214
+ _handleResize() {
215
+ this.updatePopoverWidth();
216
+ }
217
+
218
+ handleKeyDownDropdown(e: KeyboardEvent) {
219
+ const items = this._list?.getKeyboardNavigationItems();
220
+
221
+ if (isLetterKey(e.key)) {
222
+ this.handleLetterKeyPress(e);
223
+ return;
224
+ }
225
+
226
+ if (isTabPrevious(e) && !this.tabNavigationEnabled) {
227
+ e.preventDefault();
228
+ this._search.focus();
229
+ return;
230
+ }
231
+
232
+ if (isTabNext(e) && !this.tabNavigationEnabled) {
233
+ this.closeDropdown();
234
+ return;
235
+ }
236
+
237
+ if (isEscape(e)) {
238
+ this.handleEscKeyPress(e);
239
+ return;
240
+ }
241
+
242
+ if (!items || this.tabNavigationEnabled) {
243
+ return;
244
+ }
245
+
246
+ this.handleListNavigationKeys(e, items);
247
+ }
248
+
249
+ handleListNavigationKeys(e: KeyboardEvent, items: UDExListItemBase[]) {
250
+ const currentSelectedIndex = this._list?.getCurrentIndex(items, e.target as UDExListItemBase);
251
+ const lastItemIndex = items.length - 1;
252
+
253
+ if (isDown(e)) {
254
+ e.preventDefault();
255
+ this.handleDownKeyPress(items, currentSelectedIndex, lastItemIndex);
256
+
257
+ return;
258
+ }
259
+
260
+ if (isUp(e)) {
261
+ e.preventDefault();
262
+ this.handleUpKeyPress(items, currentSelectedIndex, lastItemIndex);
263
+
264
+ return;
265
+ }
266
+
267
+ if (isHome(e)) {
268
+ e.preventDefault();
269
+ this.handleHomeKeyPress(items);
270
+
271
+ return;
272
+ }
273
+
274
+ if (isEnd(e)) {
275
+ e.preventDefault();
276
+ this.handleEndKeyPress(items, lastItemIndex);
277
+ }
278
+ }
279
+
280
+ handleEndKeyPress(items: UDExListItemBase[], lastItemIndex: number) {
281
+ if (this.showImageFlags) {
282
+ this.handleImagePosition(items, lastItemIndex);
283
+ }
284
+
285
+ this._selectedOption = items[lastItemIndex].label;
286
+ }
287
+
288
+ handleHomeKeyPress(items: UDExListItemBase[]) {
289
+ this._selectedOption = items[0].label;
290
+
291
+ if (this.showImageFlags) {
292
+ this.handleImagePosition(items, 0);
293
+ }
294
+ }
295
+
296
+ handleDownKeyPress(items: UDExListItemBase[], currentSelectedIndex: number, lastItemIndex: number) {
297
+ const nextIndex = currentSelectedIndex + 1;
298
+ const nextSelectIndex = nextIndex > lastItemIndex ? 0 : nextIndex;
299
+ this._selectedOption = items[nextSelectIndex].label;
300
+
301
+ if (this.showImageFlags) {
302
+ this.handleImagePosition(items, nextSelectIndex);
303
+ }
304
+ }
305
+
306
+ handleUpKeyPress(items: UDExListItemBase[], currentSelectedIndex: number, lastItemIndex: number) {
307
+ const prevIndex = currentSelectedIndex - 1;
308
+ const previousSelectIndex = prevIndex < 0 ? lastItemIndex : prevIndex;
309
+ this._selectedOption = items[previousSelectIndex].label;
310
+
311
+ if (this.showImageFlags) {
312
+ this.handleImagePosition(items, previousSelectIndex);
313
+ }
314
+ }
315
+
316
+ handleLetterKeyPress(e: KeyboardEvent) {
317
+ e.stopPropagation();
318
+ e.preventDefault();
319
+ this._selectedOption = "";
320
+ this._search.value = e.key;
321
+ this._search.focus();
322
+ this.onSearch(this._search.value);
323
+ }
324
+
325
+ handleEscKeyPress(e: KeyboardEvent) {
326
+ e.preventDefault();
327
+ this.closeDropdown();
328
+ this._search.focus();
329
+
330
+ if (!this.tabNavigationEnabled) {
331
+ this._selectedOption = "";
332
+ }
333
+ }
334
+
335
+ handleItemSelection(e:CustomEvent) {
336
+ this.onItemPress(e);
337
+ const item = e.detail.item as UDExListItemBase;
338
+ this._lastSelectedItemId = this.getDataTokenId(item);
339
+ this.resetSearchState();
340
+
341
+ if (this.modeSingleSelect) {
342
+ this._search.focus();
343
+ this.closeDropdown();
344
+ }
345
+ }
346
+
347
+ onKeyDownSearch(e: KeyboardEvent) {
348
+ e.stopPropagation();
349
+ const items = this._list?.getKeyboardNavigationItems();
350
+ const hasItems = items && items.length > 0;
351
+ const popoverOpened = this._popover.open;
352
+ const isEscAndPopoverOpened = isEscape(e) && popoverOpened;
353
+ const isDownAndPopoverClosed = isDown(e) && !popoverOpened;
354
+ const isDownAndPopoverOpened = isDown(e) && popoverOpened;
355
+
356
+ if (!hasItems) {
357
+ return;
358
+ }
359
+
360
+ if (isEscAndPopoverOpened) {
361
+ return this.closeDropdown();
362
+ }
363
+
364
+ if (isDownAndPopoverClosed) {
365
+ e.preventDefault();
366
+ this.openDropdown();
367
+ this.focusFirstItem(items);
368
+ if (this.showImageFlags) {
369
+ this.handleImagePosition(items, 0);
370
+ }
371
+ return;
372
+ }
373
+
374
+ if (isDownAndPopoverOpened) {
375
+ e.preventDefault();
376
+ if (this.showImageFlags) {
377
+ this.handleImagePosition(items, 0);
378
+ }
379
+ return this.focusFirstItem(items);
380
+ }
381
+ }
382
+
383
+ focusFirstItem(items: UDExListItemBase[]): void {
384
+ this._list.setTabIndexByIndex(items, 0);
385
+ if (!this.tabNavigationEnabled) {
386
+ this._selectedOption = items[0].label;
387
+ }
388
+
389
+ if (items[0].isGroup) {
390
+ this._list.focusHeader(items[0]);
391
+ } else {
392
+ items[0].focus();
393
+ }
394
+ }
395
+
396
+ handleSearchChange(e: CustomEvent) {
397
+ const inputValue = (e.target as HTMLInputElement)?.value || "";
398
+ this._inputValue = inputValue;
399
+
400
+ if (inputValue) {
401
+ this._selectedOption = "";
402
+ }
403
+
404
+ this.onSearch(inputValue);
405
+
406
+ if (!this._popover.open) {
407
+ this.openDropdown();
408
+ }
409
+ }
410
+
411
+ handleDirection() {
412
+ const directionStyles = window.getComputedStyle(this).getPropertyValue("direction");
413
+ this._direction = directionStyles || "ltr";
414
+ }
415
+
416
+ handleDropdownBeforeClose() {
417
+ this.fireDecoratorEvent("before-close");
418
+ }
419
+
420
+ dropdownBeforeOpen() {
421
+ if (this.height) {
422
+ this._setContentHeight();
423
+ }
424
+
425
+ this.fireDecoratorEvent("before-open");
426
+ }
427
+
428
+ fireEventDropdownOpen() {
429
+ this.fireDecoratorEvent("open");
430
+ }
431
+
432
+ fireEventDropdownClose() {
433
+ this.fireDecoratorEvent("close");
434
+ }
435
+
436
+ handleButtonClick() {
437
+ if (!this.isDisabled) {
438
+ this._search.focus();
439
+
440
+ if (this._popover.open) {
441
+ this.closeDropdown();
442
+ } else {
443
+ this.openDropdown();
444
+ }
445
+ }
446
+ }
447
+
448
+ handleInputClick() {
449
+ if (!this.isDisabled) {
450
+ this._search.focus();
451
+ this.openDropdown();
452
+ }
453
+ }
454
+
455
+ openDropdown() {
456
+ this._popover.opener = this._trigger;
457
+ this._popover.open = true;
458
+ this._open = true;
459
+ }
460
+
461
+ closeDropdown() {
462
+ if (this._popover.open) {
463
+ this._open = false;
464
+ this._popover.open = false;
465
+ }
466
+ }
467
+
468
+ inputFocusIn() {
469
+ if (!this.isDisabled) {
470
+ this._focused = true;
471
+ }
472
+ }
473
+
474
+ resetSearchState() {
475
+ this._inputValue = "";
476
+ setTimeout(() => this.resetSearch(), 0);
477
+
478
+ if (this.modeSingleSelect) {
479
+ this.setSelectOption();
480
+ }
481
+ }
482
+
483
+ setSelectOption() {
484
+ this._selectedOption = this.selectedItems[0]?.label || "";
485
+ }
486
+
487
+ updatePopoverWidth() {
488
+ this._popover.style.setProperty(this._paneWidthVariableName, `${this._trigger.offsetWidth}px`);
489
+ }
490
+
491
+ handleImagePosition(items: UDExListItemBase[], index: number) {
492
+ const image = items[index].querySelector<HTMLElement>(".udex-text-field__image");
493
+ const imagePlaceholder = this.shadowRoot!.querySelector<HTMLElement>(".udex-text-field__input > .udex-text-field__image");
494
+
495
+ if (imagePlaceholder) {
496
+ imagePlaceholder.style.backgroundPosition = image?.style?.backgroundPosition || "";
497
+ }
498
+ }
499
+
500
+ get ariaDescribedbyText(): string {
501
+ if (this.modeSingleSelect) {
502
+ return this._selectedOption;
503
+ }
504
+ const tags = this.selectedItems.filter(item => !item.isGroup);
505
+ return getTokensCountText(tags.length);
506
+ }
507
+
508
+ get trigger(): HTMLElement {
509
+ return this.shadowRoot!.querySelector(".udex-text-field__wrap")!;
510
+ }
511
+
512
+ get isDisabled(): boolean {
513
+ return this.readonly || this.displayonly || this.disabled;
514
+ }
515
+
516
+ get labelClass(): string {
517
+ const baseClass = this._labelBaseClass;
518
+ const isActive = [
519
+ this._inputValue,
520
+ this._focused,
521
+ this._open,
522
+ this._selectedOption,
523
+ this.hasSelectedItems,
524
+ ].some(Boolean);
525
+ return isActive ? `${baseClass} ${baseClass}_active` : baseClass;
526
+ }
527
+
528
+ get isReadOrDisplayOnly(): boolean {
529
+ return this.readonly || this.displayonly;
530
+ }
531
+
532
+ get hasSelectedItems(): boolean {
533
+ return this.selectedItems.length > 0;
534
+ }
535
+
536
+ get additionalClassName(): string {
537
+ return this._stickyClass;
538
+ }
539
+
540
+ get accInfo(): { ariaLabel: string } {
541
+ return {
542
+ "ariaLabel": getAllAccessibleNameRefTexts(this) || this.accessibleName || this.label || UDExSelectBase.i18nBundle.getText(COUNTRY_SELECT),
543
+ };
544
+ }
545
+
546
+ get popoverId(): string {
547
+ return `${this._id}_${this._dropdownClass}`;
548
+ }
549
+
550
+ get listboxRole(): string {
551
+ return this._listBoxRole;
552
+ }
553
+
554
+ get hideDropdownSearch(): boolean {
555
+ return true;
556
+ }
557
+
558
+ get showImageFlags(): boolean {
559
+ return false;
560
+ }
561
+
562
+ get searchableList() {
563
+ this.defaultAccessibleRole = this._listBoxRole;
564
+ return executeTemplate(UDExSelectBase.searchableListBaseTemplate, this);
565
+ }
566
+
567
+ get countryFlag() {
568
+ return executeTemplate(UDExSelectBase.countryFlagTemplate, this);
569
+ }
570
+
571
+ static get countryFlagTemplate() {
572
+ return CountrySelectorTemplate;
573
+ }
574
+
575
+ static get searchableListBaseTemplate() {
576
+ return SearchableListBaseTemplate;
577
+ }
578
+ }
579
+
580
+ export default UDExSelectBase;