@sapudex/web-components 2.22.0 → 2.24.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 (226) 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/Checkbox.js +4 -0
  8. package/dist/Checkbox.js.map +1 -1
  9. package/dist/CountrySelector.d.ts +25 -142
  10. package/dist/CountrySelector.js +91 -268
  11. package/dist/CountrySelector.js.map +1 -1
  12. package/dist/FilterMenu.d.ts +14 -2
  13. package/dist/FilterMenu.js +11 -1
  14. package/dist/FilterMenu.js.map +1 -1
  15. package/dist/Footer.js +2 -2
  16. package/dist/Footer.js.map +1 -1
  17. package/dist/FooterTemplate.js +1 -1
  18. package/dist/FooterTemplate.js.map +1 -1
  19. package/dist/List.js +2 -3
  20. package/dist/List.js.map +1 -1
  21. package/dist/ListGroupHeaderBase.d.ts +1 -0
  22. package/dist/ListGroupHeaderBase.js +3 -0
  23. package/dist/ListGroupHeaderBase.js.map +1 -1
  24. package/dist/ListItemBase.d.ts +12 -0
  25. package/dist/ListItemBase.js +17 -2
  26. package/dist/ListItemBase.js.map +1 -1
  27. package/dist/MediaPlayer.js +4 -0
  28. package/dist/MediaPlayer.js.map +1 -1
  29. package/dist/MediaPlayerTemplate.js +4 -4
  30. package/dist/MediaPlayerTemplate.js.map +1 -1
  31. package/dist/SearchableListBase.d.ts +23 -16
  32. package/dist/SearchableListBase.js +48 -72
  33. package/dist/SearchableListBase.js.map +1 -1
  34. package/dist/SelectBase.d.ts +193 -0
  35. package/dist/SelectBase.js +428 -0
  36. package/dist/SelectBase.js.map +1 -0
  37. package/dist/SelectBox.d.ts +30 -152
  38. package/dist/SelectBox.js +139 -348
  39. package/dist/SelectBox.js.map +1 -1
  40. package/dist/TagGroup.d.ts +23 -5
  41. package/dist/TagGroup.js +37 -16
  42. package/dist/TagGroup.js.map +1 -1
  43. package/dist/TagTemplate.js +4 -2
  44. package/dist/TagTemplate.js.map +1 -1
  45. package/dist/TextArea.d.ts +1 -1
  46. package/dist/TextArea.js +5 -5
  47. package/dist/TextArea.js.map +1 -1
  48. package/dist/TextAreaTemplate.d.ts +2 -0
  49. package/dist/TextAreaTemplate.js +13 -0
  50. package/dist/TextAreaTemplate.js.map +1 -0
  51. package/dist/TextField.d.ts +29 -4
  52. package/dist/TextField.js +32 -16
  53. package/dist/TextField.js.map +1 -1
  54. package/dist/TextFieldTemplate.d.ts +2 -0
  55. package/dist/TextFieldTemplate.js +14 -0
  56. package/dist/TextFieldTemplate.js.map +1 -0
  57. package/dist/assets/{InputSuggestions-By00xQan.js → InputSuggestions-63QG0i9j.js} +1 -1
  58. package/dist/assets/{ListItemStandardExpandableTextTemplate-BGtoxRbA.js → ListItemStandardExpandableTextTemplate-B1CpqSCb.js} +1 -1
  59. package/dist/assets/{bundle.esm-9yDdQqR5.js → bundle.esm-lUYJDofa.js} +218 -217
  60. package/dist/assets/fi-BGPAljj_.js +1 -0
  61. package/dist/assets/gl-DqaooM6m.js +1 -0
  62. package/dist/assets/{video.es-DIP_dh4I.js → video.es-BDeHzm02.js} +32 -32
  63. package/dist/css/themes/Checkbox.css +1 -1
  64. package/dist/css/themes/CountrySelector.css +1 -1
  65. package/dist/css/themes/EventRibbon.css +1 -1
  66. package/dist/css/themes/Footer.css +1 -1
  67. package/dist/css/themes/ImageGridTickerItem.css +1 -1
  68. package/dist/css/themes/InputGroup.css +1 -1
  69. package/dist/css/themes/Link.css +1 -1
  70. package/dist/css/themes/ListItem.css +1 -1
  71. package/dist/css/themes/MastheadItem.css +1 -1
  72. package/dist/css/themes/MastheadMobileMenu.css +1 -1
  73. package/dist/css/themes/RadioButton.css +1 -1
  74. package/dist/css/themes/RatingIndicator.css +1 -1
  75. package/dist/css/themes/Search.css +1 -1
  76. package/dist/css/themes/SelectBase.css +1 -0
  77. package/dist/css/themes/SelectBox.css +1 -1
  78. package/dist/css/themes/Slider.css +1 -1
  79. package/dist/css/themes/StatusMessage.css +1 -1
  80. package/dist/css/themes/TagGroup.css +1 -1
  81. package/dist/css/themes/TextField.css +1 -1
  82. package/dist/custom-elements-internal.json +1088 -1284
  83. package/dist/custom-elements.json +284 -934
  84. package/dist/generated/templates/CountrySelectorTemplate.lit.js +3 -3
  85. package/dist/generated/templates/CountrySelectorTemplate.lit.js.map +1 -1
  86. package/dist/generated/templates/ListItemTemplate.lit.js +1 -1
  87. package/dist/generated/templates/ListItemTemplate.lit.js.map +1 -1
  88. package/dist/generated/templates/SelectBoxTemplate.lit.js +10 -9
  89. package/dist/generated/templates/SelectBoxTemplate.lit.js.map +1 -1
  90. package/dist/generated/themes/Checkbox.css.d.ts +1 -1
  91. package/dist/generated/themes/Checkbox.css.js +1 -1
  92. package/dist/generated/themes/Checkbox.css.js.map +1 -1
  93. package/dist/generated/themes/CountrySelector.css.d.ts +1 -1
  94. package/dist/generated/themes/CountrySelector.css.js +1 -1
  95. package/dist/generated/themes/CountrySelector.css.js.map +1 -1
  96. package/dist/generated/themes/EventRibbon.css.d.ts +1 -1
  97. package/dist/generated/themes/EventRibbon.css.js +1 -1
  98. package/dist/generated/themes/EventRibbon.css.js.map +1 -1
  99. package/dist/generated/themes/Footer.css.d.ts +1 -1
  100. package/dist/generated/themes/Footer.css.js +1 -1
  101. package/dist/generated/themes/Footer.css.js.map +1 -1
  102. package/dist/generated/themes/ImageGridTickerItem.css.d.ts +1 -1
  103. package/dist/generated/themes/ImageGridTickerItem.css.js +1 -1
  104. package/dist/generated/themes/ImageGridTickerItem.css.js.map +1 -1
  105. package/dist/generated/themes/InputGroup.css.d.ts +1 -1
  106. package/dist/generated/themes/InputGroup.css.js +1 -1
  107. package/dist/generated/themes/InputGroup.css.js.map +1 -1
  108. package/dist/generated/themes/Link.css.d.ts +1 -1
  109. package/dist/generated/themes/Link.css.js +1 -1
  110. package/dist/generated/themes/Link.css.js.map +1 -1
  111. package/dist/generated/themes/ListItem.css.d.ts +1 -1
  112. package/dist/generated/themes/ListItem.css.js +1 -1
  113. package/dist/generated/themes/ListItem.css.js.map +1 -1
  114. package/dist/generated/themes/MastheadItem.css.d.ts +1 -1
  115. package/dist/generated/themes/MastheadItem.css.js +1 -1
  116. package/dist/generated/themes/MastheadItem.css.js.map +1 -1
  117. package/dist/generated/themes/MastheadMobileMenu.css.d.ts +1 -1
  118. package/dist/generated/themes/MastheadMobileMenu.css.js +1 -1
  119. package/dist/generated/themes/MastheadMobileMenu.css.js.map +1 -1
  120. package/dist/generated/themes/RadioButton.css.d.ts +1 -1
  121. package/dist/generated/themes/RadioButton.css.js +1 -1
  122. package/dist/generated/themes/RadioButton.css.js.map +1 -1
  123. package/dist/generated/themes/RatingIndicator.css.d.ts +1 -1
  124. package/dist/generated/themes/RatingIndicator.css.js +1 -1
  125. package/dist/generated/themes/RatingIndicator.css.js.map +1 -1
  126. package/dist/generated/themes/Search.css.d.ts +1 -1
  127. package/dist/generated/themes/Search.css.js +1 -1
  128. package/dist/generated/themes/Search.css.js.map +1 -1
  129. package/dist/generated/themes/SelectBase.css.d.ts +2 -0
  130. package/dist/generated/themes/SelectBase.css.js +8 -0
  131. package/dist/generated/themes/SelectBase.css.js.map +1 -0
  132. package/dist/generated/themes/SelectBox.css.d.ts +1 -1
  133. package/dist/generated/themes/SelectBox.css.js +1 -1
  134. package/dist/generated/themes/SelectBox.css.js.map +1 -1
  135. package/dist/generated/themes/Slider.css.d.ts +1 -1
  136. package/dist/generated/themes/Slider.css.js +1 -1
  137. package/dist/generated/themes/Slider.css.js.map +1 -1
  138. package/dist/generated/themes/StatusMessage.css.d.ts +1 -1
  139. package/dist/generated/themes/StatusMessage.css.js +1 -1
  140. package/dist/generated/themes/StatusMessage.css.js.map +1 -1
  141. package/dist/generated/themes/TagGroup.css.d.ts +1 -1
  142. package/dist/generated/themes/TagGroup.css.js +1 -1
  143. package/dist/generated/themes/TagGroup.css.js.map +1 -1
  144. package/dist/generated/themes/TextField.css.d.ts +1 -1
  145. package/dist/generated/themes/TextField.css.js +1 -1
  146. package/dist/generated/themes/TextField.css.js.map +1 -1
  147. package/dist/types/common.d.ts +1 -1
  148. package/dist/types/common.js +1 -1
  149. package/dist/types/common.js.map +1 -1
  150. package/dist/vscode.html-custom-data.json +23 -234
  151. package/dist/web-types.json +256 -811
  152. package/package.json +2 -2
  153. package/src/Checkbox.ts +4 -0
  154. package/src/CountrySelector.hbs +6 -61
  155. package/src/CountrySelector.ts +93 -375
  156. package/src/FilterMenu.ts +13 -3
  157. package/src/Footer.ts +2 -2
  158. package/src/FooterTemplate.tsx +5 -4
  159. package/src/List.ts +2 -3
  160. package/src/ListGroupHeaderBase.ts +4 -0
  161. package/src/ListItem.hbs +0 -1
  162. package/src/ListItemBase.ts +17 -3
  163. package/src/MediaPlayer.ts +4 -0
  164. package/src/MediaPlayerTemplate.tsx +0 -1
  165. package/src/SearchableListBase.ts +68 -83
  166. package/src/SelectBase.ts +580 -0
  167. package/src/SelectBox.hbs +118 -107
  168. package/src/SelectBox.ts +155 -445
  169. package/src/TagGroup.ts +53 -19
  170. package/src/TagTemplate.tsx +4 -2
  171. package/src/TextArea.ts +5 -5
  172. package/src/TextAreaTemplate.tsx +67 -0
  173. package/src/TextField.ts +57 -24
  174. package/src/TextFieldTemplate.tsx +90 -0
  175. package/src/generated/templates/CountrySelectorTemplate.lit.ts +2 -2
  176. package/src/generated/templates/ListItemTemplate.lit.ts +1 -1
  177. package/src/generated/templates/SelectBoxTemplate.lit.ts +10 -9
  178. package/src/generated/themes/Checkbox.css.ts +1 -1
  179. package/src/generated/themes/CountrySelector.css.ts +1 -1
  180. package/src/generated/themes/EventRibbon.css.ts +1 -1
  181. package/src/generated/themes/Footer.css.ts +1 -1
  182. package/src/generated/themes/ImageGridTickerItem.css.ts +1 -1
  183. package/src/generated/themes/InputGroup.css.ts +1 -1
  184. package/src/generated/themes/Link.css.ts +1 -1
  185. package/src/generated/themes/ListItem.css.ts +1 -1
  186. package/src/generated/themes/MastheadItem.css.ts +1 -1
  187. package/src/generated/themes/MastheadMobileMenu.css.ts +1 -1
  188. package/src/generated/themes/RadioButton.css.ts +1 -1
  189. package/src/generated/themes/RatingIndicator.css.ts +1 -1
  190. package/src/generated/themes/Search.css.ts +1 -1
  191. package/src/generated/themes/SelectBase.css.ts +9 -0
  192. package/src/generated/themes/SelectBox.css.ts +1 -1
  193. package/src/generated/themes/Slider.css.ts +1 -1
  194. package/src/generated/themes/StatusMessage.css.ts +1 -1
  195. package/src/generated/themes/TagGroup.css.ts +1 -1
  196. package/src/generated/themes/TextField.css.ts +1 -1
  197. package/src/themes/Checkbox.css +21 -15
  198. package/src/themes/CountrySelector.css +42 -115
  199. package/src/themes/EventRibbon.css +21 -13
  200. package/src/themes/Footer.css +3 -2
  201. package/src/themes/ImageGridTickerItem.css +1 -1
  202. package/src/themes/InputGroup.css +11 -6
  203. package/src/themes/Link.css +2 -0
  204. package/src/themes/ListItem.css +6 -0
  205. package/src/themes/MastheadItem.css +0 -2
  206. package/src/themes/MastheadMobileMenu.css +2 -0
  207. package/src/themes/RadioButton.css +29 -6
  208. package/src/themes/Search.css +0 -1
  209. package/src/themes/SelectBase.css +239 -0
  210. package/src/themes/SelectBox.css +13 -195
  211. package/src/themes/StatusMessage.css +1 -2
  212. package/src/themes/TagGroup.css +0 -1
  213. package/src/themes/TextField.css +7 -7
  214. package/src/types/common.ts +1 -1
  215. package/dist/assets/fi-hYXoEotT.js +0 -1
  216. package/dist/assets/gl-eZFVp-ap.js +0 -1
  217. package/dist/generated/templates/TextAreaTemplate.lit.d.ts +0 -3
  218. package/dist/generated/templates/TextAreaTemplate.lit.js +0 -13
  219. package/dist/generated/templates/TextAreaTemplate.lit.js.map +0 -1
  220. package/dist/generated/templates/TextFieldTemplate.lit.d.ts +0 -3
  221. package/dist/generated/templates/TextFieldTemplate.lit.js +0 -14
  222. package/dist/generated/templates/TextFieldTemplate.lit.js.map +0 -1
  223. package/src/TextArea.hbs +0 -54
  224. package/src/TextField.hbs +0 -78
  225. package/src/generated/templates/TextAreaTemplate.lit.ts +0 -17
  226. 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;