@sapudex/web-components 2.21.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 (319) hide show
  1. package/bundle.esm.js +2 -0
  2. package/cypress/specs/CountrySelector.cy.tsx +158 -144
  3. package/cypress/specs/EventRibbon.cy.tsx +3 -1
  4. package/cypress/specs/ImageGridCloud.cy.tsx +78 -0
  5. package/cypress/specs/ImageGridCloudItem.cy.tsx +29 -0
  6. package/cypress/specs/SelectBox.cy.tsx +173 -206
  7. package/cypress/specs/Tag.cy.tsx +1 -1
  8. package/cypress/specs/TextField.cy.tsx +15 -0
  9. package/cypress/specs/Textarea.cy.tsx +15 -33
  10. package/cypress/support/component-imports.instrumented.ts +4 -0
  11. package/cypress/support/component-imports.src.ts +4 -0
  12. package/dist/Accordion.js +1 -0
  13. package/dist/Accordion.js.map +1 -1
  14. package/dist/AccordionItem.js +2 -0
  15. package/dist/AccordionItem.js.map +1 -1
  16. package/dist/AssetsVariables.js +2 -1
  17. package/dist/AssetsVariables.js.map +1 -1
  18. package/dist/Breadcrumbs.js +5 -0
  19. package/dist/Breadcrumbs.js.map +1 -1
  20. package/dist/ContactItem.js +2 -0
  21. package/dist/ContactItem.js.map +1 -1
  22. package/dist/CountrySelector.d.ts +25 -142
  23. package/dist/CountrySelector.js +91 -267
  24. package/dist/CountrySelector.js.map +1 -1
  25. package/dist/DatePicker.js +2 -1
  26. package/dist/DatePicker.js.map +1 -1
  27. package/dist/FilterMenu.d.ts +14 -2
  28. package/dist/FilterMenu.js +13 -1
  29. package/dist/FilterMenu.js.map +1 -1
  30. package/dist/Footer.js +27 -0
  31. package/dist/Footer.js.map +1 -1
  32. package/dist/ImageGridCloud.d.ts +76 -0
  33. package/dist/ImageGridCloud.js +153 -0
  34. package/dist/ImageGridCloud.js.map +1 -0
  35. package/dist/ImageGridCloudItem.d.ts +35 -0
  36. package/dist/ImageGridCloudItem.js +49 -0
  37. package/dist/ImageGridCloudItem.js.map +1 -0
  38. package/dist/ImageGridCloudItemTemplate.d.ts +2 -0
  39. package/dist/ImageGridCloudItemTemplate.js +5 -0
  40. package/dist/ImageGridCloudItemTemplate.js.map +1 -0
  41. package/dist/ImageGridCloudTemplate.d.ts +2 -0
  42. package/dist/ImageGridCloudTemplate.js +6 -0
  43. package/dist/ImageGridCloudTemplate.js.map +1 -0
  44. package/dist/ImageGridTicker.d.ts +2 -2
  45. package/dist/ImageGridTicker.js +1 -8
  46. package/dist/ImageGridTicker.js.map +1 -1
  47. package/dist/LinkListItem.js +1 -0
  48. package/dist/LinkListItem.js.map +1 -1
  49. package/dist/List.js +5 -3
  50. package/dist/List.js.map +1 -1
  51. package/dist/ListGroupHeader.js +1 -0
  52. package/dist/ListGroupHeader.js.map +1 -1
  53. package/dist/ListGroupHeaderBase.d.ts +1 -0
  54. package/dist/ListGroupHeaderBase.js +3 -0
  55. package/dist/ListGroupHeaderBase.js.map +1 -1
  56. package/dist/ListItem.js +2 -0
  57. package/dist/ListItem.js.map +1 -1
  58. package/dist/ListItemBase.d.ts +12 -0
  59. package/dist/ListItemBase.js +21 -2
  60. package/dist/ListItemBase.js.map +1 -1
  61. package/dist/ListSelectAll.js +1 -0
  62. package/dist/ListSelectAll.js.map +1 -1
  63. package/dist/MastheadCountrySelector.js +15 -0
  64. package/dist/MastheadCountrySelector.js.map +1 -1
  65. package/dist/MastheadItem.js +10 -0
  66. package/dist/MastheadItem.js.map +1 -1
  67. package/dist/MastheadMenu.js +6 -0
  68. package/dist/MastheadMenu.js.map +1 -1
  69. package/dist/MastheadMobileMenu.js +11 -0
  70. package/dist/MastheadMobileMenu.js.map +1 -1
  71. package/dist/MastheadProfileMenu.js +11 -0
  72. package/dist/MastheadProfileMenu.js.map +1 -1
  73. package/dist/MastheadShell.js +41 -0
  74. package/dist/MastheadShell.js.map +1 -1
  75. package/dist/MediaPlayer.js +3 -0
  76. package/dist/MediaPlayer.js.map +1 -1
  77. package/dist/MediaPlayerTemplate.js +4 -4
  78. package/dist/MediaPlayerTemplate.js.map +1 -1
  79. package/dist/MediaPlayerVimeo.d.ts +3 -3
  80. package/dist/MediaPlayerVimeo.js +1 -0
  81. package/dist/MediaPlayerVimeo.js.map +1 -1
  82. package/dist/MediaPlayerYoutube.js +3 -0
  83. package/dist/MediaPlayerYoutube.js.map +1 -1
  84. package/dist/Pagination.js +1 -1
  85. package/dist/Pagination.js.map +1 -1
  86. package/dist/Search.d.ts +2 -1
  87. package/dist/Search.js +18 -3
  88. package/dist/Search.js.map +1 -1
  89. package/dist/SearchTemplate.d.ts +2 -0
  90. package/dist/SearchTemplate.js +48 -0
  91. package/dist/SearchTemplate.js.map +1 -0
  92. package/dist/SearchableListBase.d.ts +26 -16
  93. package/dist/SearchableListBase.js +58 -72
  94. package/dist/SearchableListBase.js.map +1 -1
  95. package/dist/SecondaryNavigation.js +19 -0
  96. package/dist/SecondaryNavigation.js.map +1 -1
  97. package/dist/SecondaryNavigationItem.js +6 -0
  98. package/dist/SecondaryNavigationItem.js.map +1 -1
  99. package/dist/SecondaryNavigationSubItem.js +3 -0
  100. package/dist/SecondaryNavigationSubItem.js.map +1 -1
  101. package/dist/SelectBase.d.ts +193 -0
  102. package/dist/SelectBase.js +428 -0
  103. package/dist/SelectBase.js.map +1 -0
  104. package/dist/SelectBox.d.ts +30 -152
  105. package/dist/SelectBox.js +140 -348
  106. package/dist/SelectBox.js.map +1 -1
  107. package/dist/SocialMediaButton.js +2 -0
  108. package/dist/SocialMediaButton.js.map +1 -1
  109. package/dist/StepInput.js +2 -0
  110. package/dist/StepInput.js.map +1 -1
  111. package/dist/TabNavigation.js +3 -0
  112. package/dist/TabNavigation.js.map +1 -1
  113. package/dist/Tag.js +1 -0
  114. package/dist/Tag.js.map +1 -1
  115. package/dist/TagGroup.d.ts +23 -5
  116. package/dist/TagGroup.js +40 -16
  117. package/dist/TagGroup.js.map +1 -1
  118. package/dist/TagTemplate.js +4 -2
  119. package/dist/TagTemplate.js.map +1 -1
  120. package/dist/TextArea.d.ts +1 -1
  121. package/dist/TextArea.js +5 -5
  122. package/dist/TextArea.js.map +1 -1
  123. package/dist/TextAreaTemplate.d.ts +2 -0
  124. package/dist/TextAreaTemplate.js +13 -0
  125. package/dist/TextAreaTemplate.js.map +1 -0
  126. package/dist/TextField.d.ts +29 -4
  127. package/dist/TextField.js +33 -16
  128. package/dist/TextField.js.map +1 -1
  129. package/dist/TextFieldTemplate.d.ts +2 -0
  130. package/dist/TextFieldTemplate.js +14 -0
  131. package/dist/TextFieldTemplate.js.map +1 -0
  132. package/dist/Tile.js +1 -0
  133. package/dist/Tile.js.map +1 -1
  134. package/dist/Upload.js +5 -0
  135. package/dist/Upload.js.map +1 -1
  136. package/dist/assets/{InputSuggestions-B0P5JAFd.js → InputSuggestions-C8m6N2-d.js} +1 -1
  137. package/dist/assets/{ListItemStandardExpandableTextTemplate-CFj3_UAT.js → ListItemStandardExpandableTextTemplate-BwD5bYhw.js} +1 -1
  138. package/dist/assets/{bundle.esm-BaPBMfCT.js → bundle.esm-hGsUwmUy.js} +222 -218
  139. package/dist/css/themes/CountrySelector.css +1 -1
  140. package/dist/css/themes/EventRibbon.css +1 -1
  141. package/dist/css/themes/ImageGridCloud.css +1 -0
  142. package/dist/css/themes/ImageGridCloudItem.css +1 -0
  143. package/dist/css/themes/ListItem.css +1 -1
  144. package/dist/css/themes/MastheadItem.css +1 -1
  145. package/dist/css/themes/MastheadMobileMenu.css +1 -1
  146. package/dist/css/themes/Pagination.css +1 -1
  147. package/dist/css/themes/RatingIndicator.css +1 -1
  148. package/dist/css/themes/Search.css +1 -1
  149. package/dist/css/themes/SelectBase.css +1 -0
  150. package/dist/css/themes/SelectBox.css +1 -1
  151. package/dist/css/themes/Slider.css +1 -1
  152. package/dist/css/themes/TagGroup.css +1 -1
  153. package/dist/css/themes/TextField.css +1 -1
  154. package/dist/custom-elements-internal.json +4627 -1311
  155. package/dist/custom-elements.json +1260 -1249
  156. package/dist/generated/templates/CountrySelectorTemplate.lit.js +3 -3
  157. package/dist/generated/templates/CountrySelectorTemplate.lit.js.map +1 -1
  158. package/dist/generated/templates/ListItemTemplate.lit.js +1 -1
  159. package/dist/generated/templates/ListItemTemplate.lit.js.map +1 -1
  160. package/dist/generated/templates/SelectBoxTemplate.lit.js +10 -9
  161. package/dist/generated/templates/SelectBoxTemplate.lit.js.map +1 -1
  162. package/dist/generated/themes/CountrySelector.css.d.ts +1 -1
  163. package/dist/generated/themes/CountrySelector.css.js +1 -1
  164. package/dist/generated/themes/CountrySelector.css.js.map +1 -1
  165. package/dist/generated/themes/EventRibbon.css.d.ts +1 -1
  166. package/dist/generated/themes/EventRibbon.css.js +1 -1
  167. package/dist/generated/themes/EventRibbon.css.js.map +1 -1
  168. package/dist/generated/themes/ImageGridCloud.css.d.ts +2 -0
  169. package/dist/generated/themes/ImageGridCloud.css.js +8 -0
  170. package/dist/generated/themes/ImageGridCloud.css.js.map +1 -0
  171. package/dist/generated/themes/ImageGridCloudItem.css.d.ts +2 -0
  172. package/dist/generated/themes/ImageGridCloudItem.css.js +8 -0
  173. package/dist/generated/themes/ImageGridCloudItem.css.js.map +1 -0
  174. package/dist/generated/themes/ListItem.css.d.ts +1 -1
  175. package/dist/generated/themes/ListItem.css.js +1 -1
  176. package/dist/generated/themes/ListItem.css.js.map +1 -1
  177. package/dist/generated/themes/MastheadItem.css.d.ts +1 -1
  178. package/dist/generated/themes/MastheadItem.css.js +1 -1
  179. package/dist/generated/themes/MastheadItem.css.js.map +1 -1
  180. package/dist/generated/themes/MastheadMobileMenu.css.d.ts +1 -1
  181. package/dist/generated/themes/MastheadMobileMenu.css.js +1 -1
  182. package/dist/generated/themes/MastheadMobileMenu.css.js.map +1 -1
  183. package/dist/generated/themes/Pagination.css.d.ts +1 -1
  184. package/dist/generated/themes/Pagination.css.js +1 -1
  185. package/dist/generated/themes/Pagination.css.js.map +1 -1
  186. package/dist/generated/themes/RatingIndicator.css.d.ts +1 -1
  187. package/dist/generated/themes/RatingIndicator.css.js +1 -1
  188. package/dist/generated/themes/RatingIndicator.css.js.map +1 -1
  189. package/dist/generated/themes/Search.css.d.ts +1 -1
  190. package/dist/generated/themes/Search.css.js +1 -1
  191. package/dist/generated/themes/Search.css.js.map +1 -1
  192. package/dist/generated/themes/SelectBase.css.d.ts +2 -0
  193. package/dist/generated/themes/SelectBase.css.js +8 -0
  194. package/dist/generated/themes/SelectBase.css.js.map +1 -0
  195. package/dist/generated/themes/SelectBox.css.d.ts +1 -1
  196. package/dist/generated/themes/SelectBox.css.js +1 -1
  197. package/dist/generated/themes/SelectBox.css.js.map +1 -1
  198. package/dist/generated/themes/Slider.css.d.ts +1 -1
  199. package/dist/generated/themes/Slider.css.js +1 -1
  200. package/dist/generated/themes/Slider.css.js.map +1 -1
  201. package/dist/generated/themes/TagGroup.css.d.ts +1 -1
  202. package/dist/generated/themes/TagGroup.css.js +1 -1
  203. package/dist/generated/themes/TagGroup.css.js.map +1 -1
  204. package/dist/generated/themes/TextField.css.d.ts +1 -1
  205. package/dist/generated/themes/TextField.css.js +1 -1
  206. package/dist/generated/themes/TextField.css.js.map +1 -1
  207. package/dist/types/common.d.ts +1 -1
  208. package/dist/types/common.js +1 -1
  209. package/dist/types/common.js.map +1 -1
  210. package/dist/vscode.html-custom-data.json +49 -235
  211. package/dist/web-types.json +347 -832
  212. package/package.json +1 -1
  213. package/src/Accordion.ts +1 -0
  214. package/src/AccordionItem.ts +2 -0
  215. package/src/AssetsVariables.ts +2 -1
  216. package/src/Breadcrumbs.ts +5 -0
  217. package/src/ContactItem.ts +2 -0
  218. package/src/CountrySelector.hbs +6 -61
  219. package/src/CountrySelector.ts +93 -374
  220. package/src/DatePicker.ts +2 -1
  221. package/src/FilterMenu.ts +15 -3
  222. package/src/Footer.ts +27 -0
  223. package/src/ImageGridCloud.ts +188 -0
  224. package/src/ImageGridCloudItem.ts +57 -0
  225. package/src/ImageGridCloudItemTemplate.tsx +11 -0
  226. package/src/ImageGridCloudTemplate.tsx +16 -0
  227. package/src/ImageGridTicker.ts +3 -3
  228. package/src/LinkListItem.ts +1 -0
  229. package/src/List.ts +5 -3
  230. package/src/ListGroupHeader.ts +1 -0
  231. package/src/ListGroupHeaderBase.ts +4 -0
  232. package/src/ListItem.hbs +0 -1
  233. package/src/ListItem.ts +2 -0
  234. package/src/ListItemBase.ts +21 -3
  235. package/src/ListSelectAll.ts +1 -0
  236. package/src/MastheadCountrySelector.ts +15 -0
  237. package/src/MastheadItem.ts +10 -0
  238. package/src/MastheadMenu.ts +6 -0
  239. package/src/MastheadMobileMenu.ts +11 -0
  240. package/src/MastheadProfileMenu.ts +11 -0
  241. package/src/MastheadShell.ts +41 -0
  242. package/src/MediaPlayer.ts +3 -0
  243. package/src/MediaPlayerTemplate.tsx +0 -1
  244. package/src/MediaPlayerVimeo.ts +4 -3
  245. package/src/MediaPlayerYoutube.ts +3 -0
  246. package/src/Pagination.ts +1 -1
  247. package/src/Search.ts +20 -4
  248. package/src/SearchTemplate.tsx +353 -0
  249. package/src/SearchableListBase.ts +78 -83
  250. package/src/SecondaryNavigation.ts +19 -0
  251. package/src/SecondaryNavigationItem.ts +6 -0
  252. package/src/SecondaryNavigationSubItem.ts +3 -0
  253. package/src/SelectBase.ts +580 -0
  254. package/src/SelectBox.hbs +118 -107
  255. package/src/SelectBox.ts +156 -445
  256. package/src/SocialMediaButton.ts +2 -0
  257. package/src/StepInput.ts +2 -0
  258. package/src/TabNavigation.ts +3 -0
  259. package/src/Tag.ts +1 -0
  260. package/src/TagGroup.ts +56 -19
  261. package/src/TagTemplate.tsx +4 -2
  262. package/src/TextArea.ts +5 -5
  263. package/src/TextAreaTemplate.tsx +67 -0
  264. package/src/TextField.ts +58 -24
  265. package/src/TextFieldTemplate.tsx +90 -0
  266. package/src/Tile.ts +1 -0
  267. package/src/Upload.ts +5 -0
  268. package/src/generated/templates/CountrySelectorTemplate.lit.ts +2 -2
  269. package/src/generated/templates/ListItemTemplate.lit.ts +1 -1
  270. package/src/generated/templates/SelectBoxTemplate.lit.ts +10 -9
  271. package/src/generated/themes/CountrySelector.css.ts +1 -1
  272. package/src/generated/themes/EventRibbon.css.ts +1 -1
  273. package/src/generated/themes/ImageGridCloud.css.ts +9 -0
  274. package/src/generated/themes/ImageGridCloudItem.css.ts +9 -0
  275. package/src/generated/themes/ListItem.css.ts +1 -1
  276. package/src/generated/themes/MastheadItem.css.ts +1 -1
  277. package/src/generated/themes/MastheadMobileMenu.css.ts +1 -1
  278. package/src/generated/themes/Pagination.css.ts +1 -1
  279. package/src/generated/themes/RatingIndicator.css.ts +1 -1
  280. package/src/generated/themes/Search.css.ts +1 -1
  281. package/src/generated/themes/SelectBase.css.ts +9 -0
  282. package/src/generated/themes/SelectBox.css.ts +1 -1
  283. package/src/generated/themes/Slider.css.ts +1 -1
  284. package/src/generated/themes/TagGroup.css.ts +1 -1
  285. package/src/generated/themes/TextField.css.ts +1 -1
  286. package/src/themes/CountrySelector.css +42 -115
  287. package/src/themes/EventRibbon.css +21 -13
  288. package/src/themes/ImageGridCloud.css +55 -0
  289. package/src/themes/ImageGridCloudItem.css +10 -0
  290. package/src/themes/ListItem.css +6 -0
  291. package/src/themes/MastheadItem.css +0 -2
  292. package/src/themes/MastheadMobileMenu.css +2 -0
  293. package/src/themes/Pagination.css +1 -1
  294. package/src/themes/Search.css +0 -1
  295. package/src/themes/SelectBase.css +239 -0
  296. package/src/themes/SelectBox.css +13 -195
  297. package/src/themes/TagGroup.css +0 -1
  298. package/src/themes/TextField.css +7 -7
  299. package/src/types/common.ts +1 -1
  300. package/dist/generated/templates/SearchSuggestionsTemplate.lit.d.ts +0 -3
  301. package/dist/generated/templates/SearchSuggestionsTemplate.lit.js +0 -17
  302. package/dist/generated/templates/SearchSuggestionsTemplate.lit.js.map +0 -1
  303. package/dist/generated/templates/SearchTemplate.lit.d.ts +0 -3
  304. package/dist/generated/templates/SearchTemplate.lit.js +0 -28
  305. package/dist/generated/templates/SearchTemplate.lit.js.map +0 -1
  306. package/dist/generated/templates/TextAreaTemplate.lit.d.ts +0 -3
  307. package/dist/generated/templates/TextAreaTemplate.lit.js +0 -13
  308. package/dist/generated/templates/TextAreaTemplate.lit.js.map +0 -1
  309. package/dist/generated/templates/TextFieldTemplate.lit.d.ts +0 -3
  310. package/dist/generated/templates/TextFieldTemplate.lit.js +0 -14
  311. package/dist/generated/templates/TextFieldTemplate.lit.js.map +0 -1
  312. package/src/Search.hbs +0 -155
  313. package/src/SearchSuggestions.hbs +0 -91
  314. package/src/TextArea.hbs +0 -54
  315. package/src/TextField.hbs +0 -78
  316. package/src/generated/templates/SearchSuggestionsTemplate.lit.ts +0 -21
  317. package/src/generated/templates/SearchTemplate.lit.ts +0 -32
  318. package/src/generated/templates/TextAreaTemplate.lit.ts +0 -17
  319. package/src/generated/templates/TextFieldTemplate.lit.ts +0 -18
@@ -74,9 +74,28 @@ type UDExSecondaryNavigationHeadingClickEventDetail = {
74
74
  *
75
75
  * @allowPreventDefault
76
76
  * @public
77
+ * @param {Event} originalEvent The original event object
78
+ * @param {NavItem} clickedItem The clicked item
79
+ * @param {number} clickedIndex The index of the clicked item
80
+ * @param {boolean} isMobile Indicates whether the click happened on mobile
81
+ * @param {AnalyticsName} analyticsName The analytics name for the clicked item
82
+ * @param {HTMLElement} sourceNode The source node of the clicked item
83
+ *
77
84
  */
78
85
  @event("item-click", { cancelable: true, bubbles: true })
79
86
 
87
+ /**
88
+ * The event is triggered on user interaction with a secondary navigation heading
89
+ *
90
+ * @allowPreventDefault
91
+ * @public
92
+ * @param {Event} originalEvent The original event object
93
+ * @param {AnalyticsName} analyticsName The analytics name for the heading
94
+ * @param {HTMLElement} sourceNode The source node of the heading
95
+ *
96
+ */
97
+ @event("heading-click", { cancelable: true, bubbles: true })
98
+
80
99
  class UDExSecondaryNavigation extends UI5Element {
81
100
  eventDetails!: {
82
101
  "item-click": UDExSecondaryNavigationClickEventDetail,
@@ -64,6 +64,9 @@ type UDExSecondaryNavigationItemSubItemClickEventDetail = {
64
64
  *
65
65
  * @allowPreventDefault
66
66
  * @public
67
+ * @param {Event} originalEvent the original event object
68
+ * @param {HTMLElement} item the clicked item
69
+ * @param {number} index the index of the clicked item
67
70
  */
68
71
  @event("nav-item-click", { bubbles: true, cancelable: true })
69
72
 
@@ -72,6 +75,9 @@ type UDExSecondaryNavigationItemSubItemClickEventDetail = {
72
75
  *
73
76
  * @allowPreventDefault
74
77
  * @public
78
+ * @param {Event} originalEvent the original event object
79
+ * @param {NavItem} item the clicked sub item
80
+ * @param {number} index the index of the clicked sub item
75
81
  */
76
82
  @event("sub-item-click", { bubbles: true, cancelable: true })
77
83
 
@@ -55,6 +55,8 @@ type UDExSecondaryNavigationSubItemBackClickEventDetail = {
55
55
  *
56
56
  * @allowPreventDefault
57
57
  * @public
58
+ * @param {PointerEvent} originalEvent the original event object
59
+ * @param {UDExSecondaryNavigationSubItem} item the clicked item
58
60
  */
59
61
  @event("sub-item-click", { bubbles: true, cancelable: true })
60
62
 
@@ -63,6 +65,7 @@ type UDExSecondaryNavigationSubItemBackClickEventDetail = {
63
65
  *
64
66
  * @allowPreventDefault
65
67
  * @public
68
+ * @param {PointerEvent} originalEvent the original event object
66
69
  */
67
70
  @event("back-item-click", { bubbles: true, cancelable: true })
68
71
 
@@ -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;