@sapudex/web-components 0.111.0 → 0.117.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (334) hide show
  1. package/.npmrc +1 -2
  2. package/bundle.esm.js +4 -0
  3. package/dist/AccordionItem.d.ts +7 -0
  4. package/dist/AccordionItem.js +6 -2
  5. package/dist/AccordionItem.js.map +1 -1
  6. package/dist/Avatar.d.ts +8 -1
  7. package/dist/Avatar.js +5 -2
  8. package/dist/Avatar.js.map +1 -1
  9. package/dist/CountrySelector.d.ts +6 -7
  10. package/dist/CountrySelector.js +15 -7
  11. package/dist/CountrySelector.js.map +1 -1
  12. package/dist/Dropdown.d.ts +10 -0
  13. package/dist/Dropdown.js +10 -0
  14. package/dist/Dropdown.js.map +1 -1
  15. package/dist/FilterMenu.d.ts +14 -4
  16. package/dist/FilterMenu.js +46 -7
  17. package/dist/FilterMenu.js.map +1 -1
  18. package/dist/Footer.d.ts +40 -1
  19. package/dist/Footer.js +151 -1
  20. package/dist/Footer.js.map +1 -1
  21. package/dist/InputGroup.d.ts +75 -0
  22. package/dist/InputGroup.js +101 -0
  23. package/dist/InputGroup.js.map +1 -0
  24. package/dist/List.d.ts +7 -0
  25. package/dist/List.js +78 -18
  26. package/dist/List.js.map +1 -1
  27. package/dist/ListItem.d.ts +0 -1
  28. package/dist/ListItem.js +0 -6
  29. package/dist/ListItem.js.map +1 -1
  30. package/dist/ListItemBase.d.ts +3 -0
  31. package/dist/ListItemBase.js +12 -0
  32. package/dist/ListItemBase.js.map +1 -1
  33. package/dist/MastheadMobileMenu.d.ts +4 -1
  34. package/dist/MastheadMobileMenu.js +10 -3
  35. package/dist/MastheadMobileMenu.js.map +1 -1
  36. package/dist/PhoneNumberField.d.ts +8 -0
  37. package/dist/PhoneNumberField.js +23 -10
  38. package/dist/PhoneNumberField.js.map +1 -1
  39. package/dist/Search.d.ts +60 -1
  40. package/dist/Search.js +191 -19
  41. package/dist/Search.js.map +1 -1
  42. package/dist/SecondaryNavigation.d.ts +37 -45
  43. package/dist/SecondaryNavigation.js +148 -153
  44. package/dist/SecondaryNavigation.js.map +1 -1
  45. package/dist/SecondaryNavigationItem.d.ts +101 -0
  46. package/dist/SecondaryNavigationItem.js +287 -0
  47. package/dist/SecondaryNavigationItem.js.map +1 -0
  48. package/dist/SecondaryNavigationItemBase.d.ts +68 -0
  49. package/dist/SecondaryNavigationItemBase.js +78 -0
  50. package/dist/SecondaryNavigationItemBase.js.map +1 -0
  51. package/dist/SecondaryNavigationSubItem.d.ts +52 -0
  52. package/dist/SecondaryNavigationSubItem.js +102 -0
  53. package/dist/SecondaryNavigationSubItem.js.map +1 -0
  54. package/dist/SelectBox.d.ts +7 -0
  55. package/dist/SelectBox.js +27 -2
  56. package/dist/SelectBox.js.map +1 -1
  57. package/dist/StatusBadge.d.ts +67 -0
  58. package/dist/StatusBadge.js +104 -0
  59. package/dist/StatusBadge.js.map +1 -0
  60. package/dist/Tab.js +1 -1
  61. package/dist/Tab.js.map +1 -1
  62. package/dist/Table.d.ts +5 -5
  63. package/dist/Table.js +5 -5
  64. package/dist/Table.js.map +1 -1
  65. package/dist/Tag.d.ts +7 -1
  66. package/dist/Tag.js +6 -2
  67. package/dist/Tag.js.map +1 -1
  68. package/dist/TextArea.js.map +1 -1
  69. package/dist/assets/{bundle.esm-b7920968.js → bundle.esm-f65ae7da.js} +189 -184
  70. package/dist/assets/messagebundle_en-7249941b.js +1 -0
  71. package/dist/css/themes/AccordionItem.css +1 -1
  72. package/dist/css/themes/Avatar.css +1 -1
  73. package/dist/css/themes/Breadcrumbs.css +1 -1
  74. package/dist/css/themes/Checkbox.css +1 -1
  75. package/dist/css/themes/CountrySelector.css +1 -1
  76. package/dist/css/themes/DatePicker.css +1 -1
  77. package/dist/css/themes/Dropdown.css +1 -1
  78. package/dist/css/themes/FilterMenu.css +1 -1
  79. package/dist/css/themes/HeroBanner.css +1 -1
  80. package/dist/css/themes/InputGroup.css +1 -0
  81. package/dist/css/themes/MastheadItem.css +1 -1
  82. package/dist/css/themes/MastheadMenuItem.css +1 -1
  83. package/dist/css/themes/MastheadShell.css +1 -1
  84. package/dist/css/themes/MediaPlayer.css +1 -1
  85. package/dist/css/themes/PhoneNumberField.css +1 -1
  86. package/dist/css/themes/RatingIndicator.css +1 -1
  87. package/dist/css/themes/Search.css +1 -1
  88. package/dist/css/themes/SearchSuggestions.css +1 -1
  89. package/dist/css/themes/SecondaryNavigation.css +1 -1
  90. package/dist/css/themes/SecondaryNavigationItem.css +1 -0
  91. package/dist/css/themes/SecondaryNavigationSubItem.css +1 -0
  92. package/dist/css/themes/Slider.css +1 -1
  93. package/dist/css/themes/StatusBadge.css +1 -0
  94. package/dist/css/themes/Tag.css +1 -1
  95. package/dist/css/themes/TextField.css +1 -1
  96. package/dist/custom-elements-internal.json +1070 -116
  97. package/dist/custom-elements.json +1047 -169
  98. package/dist/features/SearchSuggestionsPopover.d.ts +3 -3
  99. package/dist/features/SearchSuggestionsPopover.js +16 -18
  100. package/dist/features/SearchSuggestionsPopover.js.map +1 -1
  101. package/dist/generated/assets/i18n/messagebundle_en.json +1 -1
  102. package/dist/generated/i18n/i18n-defaults.d.ts +8 -1
  103. package/dist/generated/i18n/i18n-defaults.js +8 -1
  104. package/dist/generated/i18n/i18n-defaults.js.map +1 -1
  105. package/dist/generated/templates/AccordionItemTemplate.lit.js +2 -1
  106. package/dist/generated/templates/AccordionItemTemplate.lit.js.map +1 -1
  107. package/dist/generated/templates/CountrySelectorTemplate.lit.js +1 -1
  108. package/dist/generated/templates/CountrySelectorTemplate.lit.js.map +1 -1
  109. package/dist/generated/templates/DropdownTemplate.lit.js +1 -1
  110. package/dist/generated/templates/DropdownTemplate.lit.js.map +1 -1
  111. package/dist/generated/templates/FilterMenuTemplate.lit.js +3 -3
  112. package/dist/generated/templates/FilterMenuTemplate.lit.js.map +1 -1
  113. package/dist/generated/templates/FooterTemplate.lit.js +15 -15
  114. package/dist/generated/templates/FooterTemplate.lit.js.map +1 -1
  115. package/dist/generated/templates/HeroBannerTemplate.lit.js +2 -2
  116. package/dist/generated/templates/HeroBannerTemplate.lit.js.map +1 -1
  117. package/dist/generated/templates/InputGroupTemplate.lit.d.ts +4 -0
  118. package/dist/generated/templates/InputGroupTemplate.lit.js +7 -0
  119. package/dist/generated/templates/InputGroupTemplate.lit.js.map +1 -0
  120. package/dist/generated/templates/ListGroupHeaderTemplate.lit.js +4 -4
  121. package/dist/generated/templates/ListGroupHeaderTemplate.lit.js.map +1 -1
  122. package/dist/generated/templates/ListItemTemplate.lit.js +1 -1
  123. package/dist/generated/templates/ListItemTemplate.lit.js.map +1 -1
  124. package/dist/generated/templates/ListSelectAllTemplate.lit.js +1 -1
  125. package/dist/generated/templates/ListSelectAllTemplate.lit.js.map +1 -1
  126. package/dist/generated/templates/MastheadMobileMenuTemplate.lit.js +15 -10
  127. package/dist/generated/templates/MastheadMobileMenuTemplate.lit.js.map +1 -1
  128. package/dist/generated/templates/MastheadProfileMenuTemplate.lit.js +1 -1
  129. package/dist/generated/templates/MastheadProfileMenuTemplate.lit.js.map +1 -1
  130. package/dist/generated/templates/SearchSuggestionsTemplate.lit.js +11 -10
  131. package/dist/generated/templates/SearchSuggestionsTemplate.lit.js.map +1 -1
  132. package/dist/generated/templates/SearchTemplate.lit.js +11 -10
  133. package/dist/generated/templates/SearchTemplate.lit.js.map +1 -1
  134. package/dist/generated/templates/SearchableListBaseTemplate.lit.js +2 -2
  135. package/dist/generated/templates/SearchableListBaseTemplate.lit.js.map +1 -1
  136. package/dist/generated/templates/SecondaryNavigationItemTemplate.lit.d.ts +4 -0
  137. package/dist/generated/templates/SecondaryNavigationItemTemplate.lit.js +11 -0
  138. package/dist/generated/templates/SecondaryNavigationItemTemplate.lit.js.map +1 -0
  139. package/dist/generated/templates/SecondaryNavigationSubItemTemplate.lit.d.ts +4 -0
  140. package/dist/generated/templates/SecondaryNavigationSubItemTemplate.lit.js +9 -0
  141. package/dist/generated/templates/SecondaryNavigationSubItemTemplate.lit.js.map +1 -0
  142. package/dist/generated/templates/SecondaryNavigationTemplate.lit.js +7 -9
  143. package/dist/generated/templates/SecondaryNavigationTemplate.lit.js.map +1 -1
  144. package/dist/generated/templates/SelectBoxTemplate.lit.js +1 -1
  145. package/dist/generated/templates/SelectBoxTemplate.lit.js.map +1 -1
  146. package/dist/generated/templates/StatusBadgeTemplate.lit.d.ts +4 -0
  147. package/dist/generated/templates/StatusBadgeTemplate.lit.js +5 -0
  148. package/dist/generated/templates/StatusBadgeTemplate.lit.js.map +1 -0
  149. package/dist/generated/themes/AccordionItem.css.js +1 -1
  150. package/dist/generated/themes/AccordionItem.css.js.map +1 -1
  151. package/dist/generated/themes/Avatar.css.js +1 -1
  152. package/dist/generated/themes/Avatar.css.js.map +1 -1
  153. package/dist/generated/themes/Breadcrumbs.css.js +1 -1
  154. package/dist/generated/themes/Breadcrumbs.css.js.map +1 -1
  155. package/dist/generated/themes/Checkbox.css.js +1 -1
  156. package/dist/generated/themes/Checkbox.css.js.map +1 -1
  157. package/dist/generated/themes/CountrySelector.css.js +1 -1
  158. package/dist/generated/themes/CountrySelector.css.js.map +1 -1
  159. package/dist/generated/themes/DatePicker.css.js +1 -1
  160. package/dist/generated/themes/DatePicker.css.js.map +1 -1
  161. package/dist/generated/themes/Dropdown.css.js +1 -1
  162. package/dist/generated/themes/Dropdown.css.js.map +1 -1
  163. package/dist/generated/themes/FilterMenu.css.js +1 -1
  164. package/dist/generated/themes/FilterMenu.css.js.map +1 -1
  165. package/dist/generated/themes/HeroBanner.css.js +1 -1
  166. package/dist/generated/themes/HeroBanner.css.js.map +1 -1
  167. package/dist/generated/themes/InputGroup.css.d.ts +3 -0
  168. package/dist/generated/themes/InputGroup.css.js +9 -0
  169. package/dist/generated/themes/InputGroup.css.js.map +1 -0
  170. package/dist/generated/themes/MastheadItem.css.js +1 -1
  171. package/dist/generated/themes/MastheadItem.css.js.map +1 -1
  172. package/dist/generated/themes/MastheadMenuItem.css.js +1 -1
  173. package/dist/generated/themes/MastheadMenuItem.css.js.map +1 -1
  174. package/dist/generated/themes/MastheadShell.css.js +1 -1
  175. package/dist/generated/themes/MastheadShell.css.js.map +1 -1
  176. package/dist/generated/themes/MediaPlayer.css.js +1 -1
  177. package/dist/generated/themes/MediaPlayer.css.js.map +1 -1
  178. package/dist/generated/themes/PhoneNumberField.css.js +1 -1
  179. package/dist/generated/themes/PhoneNumberField.css.js.map +1 -1
  180. package/dist/generated/themes/RatingIndicator.css.js +1 -1
  181. package/dist/generated/themes/RatingIndicator.css.js.map +1 -1
  182. package/dist/generated/themes/Search.css.js +1 -1
  183. package/dist/generated/themes/Search.css.js.map +1 -1
  184. package/dist/generated/themes/SearchSuggestions.css.js +1 -1
  185. package/dist/generated/themes/SearchSuggestions.css.js.map +1 -1
  186. package/dist/generated/themes/SecondaryNavigation.css.js +1 -1
  187. package/dist/generated/themes/SecondaryNavigation.css.js.map +1 -1
  188. package/dist/generated/themes/SecondaryNavigationItem.css.d.ts +3 -0
  189. package/dist/generated/themes/SecondaryNavigationItem.css.js +9 -0
  190. package/dist/generated/themes/SecondaryNavigationItem.css.js.map +1 -0
  191. package/dist/generated/themes/SecondaryNavigationSubItem.css.d.ts +3 -0
  192. package/dist/generated/themes/SecondaryNavigationSubItem.css.js +9 -0
  193. package/dist/generated/themes/SecondaryNavigationSubItem.css.js.map +1 -0
  194. package/dist/generated/themes/Slider.css.js +1 -1
  195. package/dist/generated/themes/Slider.css.js.map +1 -1
  196. package/dist/generated/themes/StatusBadge.css.d.ts +3 -0
  197. package/dist/generated/themes/StatusBadge.css.js +9 -0
  198. package/dist/generated/themes/StatusBadge.css.js.map +1 -0
  199. package/dist/generated/themes/Tag.css.js +1 -1
  200. package/dist/generated/themes/Tag.css.js.map +1 -1
  201. package/dist/generated/themes/TextField.css.js +1 -1
  202. package/dist/generated/themes/TextField.css.js.map +1 -1
  203. package/dist/i18n/messagebundle.properties +12 -1
  204. package/dist/i18n/messagebundle_en.properties +8 -1
  205. package/dist/types/callback.d.ts +2 -0
  206. package/dist/types/callback.js +2 -0
  207. package/dist/types/callback.js.map +1 -0
  208. package/dist/utils/debounce.d.ts +2 -2
  209. package/dist/utils/debounce.js.map +1 -1
  210. package/dist/utils/retryUntilSuccessful.d.ts +3 -0
  211. package/dist/utils/retryUntilSuccessful.js +21 -0
  212. package/dist/utils/retryUntilSuccessful.js.map +1 -0
  213. package/dist/vscode.html-custom-data.json +178 -14
  214. package/dist/web-types.json +406 -32
  215. package/package.json +1 -1
  216. package/src/AccordionItem.hbs +12 -1
  217. package/src/AccordionItem.ts +11 -2
  218. package/src/Avatar.ts +12 -3
  219. package/src/CountrySelector.hbs +3 -3
  220. package/src/CountrySelector.ts +22 -21
  221. package/src/Dropdown.hbs +0 -1
  222. package/src/Dropdown.ts +10 -0
  223. package/src/FilterMenu.hbs +5 -1
  224. package/src/FilterMenu.ts +60 -10
  225. package/src/Footer.hbs +154 -91
  226. package/src/Footer.ts +158 -1
  227. package/src/HeroBanner.hbs +24 -21
  228. package/src/InputGroup.hbs +20 -0
  229. package/src/InputGroup.ts +137 -0
  230. package/src/List.ts +92 -21
  231. package/src/ListGroupHeader.hbs +9 -5
  232. package/src/ListItem.hbs +2 -1
  233. package/src/ListItem.ts +0 -7
  234. package/src/ListItemBase.ts +14 -0
  235. package/src/ListSelectAll.hbs +1 -0
  236. package/src/MastheadMobileMenu.hbs +51 -28
  237. package/src/MastheadMobileMenu.ts +12 -3
  238. package/src/MastheadProfileMenu.hbs +1 -1
  239. package/src/PhoneNumberField.ts +27 -3
  240. package/src/Search.hbs +26 -3
  241. package/src/Search.ts +236 -21
  242. package/src/SearchSuggestions.hbs +47 -49
  243. package/src/SearchableListBase.hbs +2 -0
  244. package/src/SecondaryNavigation.hbs +52 -72
  245. package/src/SecondaryNavigation.ts +182 -186
  246. package/src/SecondaryNavigationItem.hbs +63 -0
  247. package/src/SecondaryNavigationItem.ts +358 -0
  248. package/src/SecondaryNavigationItemBase.ts +115 -0
  249. package/src/SecondaryNavigationSubItem.hbs +41 -0
  250. package/src/SecondaryNavigationSubItem.ts +123 -0
  251. package/src/SelectBox.hbs +1 -0
  252. package/src/SelectBox.ts +38 -1
  253. package/src/StatusBadge.hbs +9 -0
  254. package/src/StatusBadge.ts +129 -0
  255. package/src/Tab.ts +1 -1
  256. package/src/Table.ts +7 -7
  257. package/src/Tag.ts +12 -3
  258. package/src/TextArea.ts +1 -1
  259. package/src/features/SearchSuggestionsPopover.ts +18 -20
  260. package/src/generated/i18n/i18n-defaults.ts +2 -2
  261. package/src/generated/templates/AccordionItemTemplate.lit.ts +2 -1
  262. package/src/generated/templates/CountrySelectorTemplate.lit.ts +1 -1
  263. package/src/generated/templates/DropdownTemplate.lit.ts +1 -1
  264. package/src/generated/templates/FilterMenuTemplate.lit.ts +3 -3
  265. package/src/generated/templates/FooterTemplate.lit.ts +15 -15
  266. package/src/generated/templates/HeroBannerTemplate.lit.ts +2 -2
  267. package/src/generated/templates/InputGroupTemplate.lit.ts +12 -0
  268. package/src/generated/templates/ListGroupHeaderTemplate.lit.ts +4 -4
  269. package/src/generated/templates/ListItemTemplate.lit.ts +1 -1
  270. package/src/generated/templates/ListSelectAllTemplate.lit.ts +1 -1
  271. package/src/generated/templates/MastheadMobileMenuTemplate.lit.ts +15 -10
  272. package/src/generated/templates/MastheadProfileMenuTemplate.lit.ts +1 -1
  273. package/src/generated/templates/SearchSuggestionsTemplate.lit.ts +11 -10
  274. package/src/generated/templates/SearchTemplate.lit.ts +10 -9
  275. package/src/generated/templates/SearchableListBaseTemplate.lit.ts +2 -2
  276. package/src/generated/templates/SecondaryNavigationItemTemplate.lit.ts +16 -0
  277. package/src/generated/templates/SecondaryNavigationSubItemTemplate.lit.ts +14 -0
  278. package/src/generated/templates/SecondaryNavigationTemplate.lit.ts +7 -9
  279. package/src/generated/templates/SelectBoxTemplate.lit.ts +1 -1
  280. package/src/generated/templates/StatusBadgeTemplate.lit.ts +10 -0
  281. package/src/generated/themes/AccordionItem.css.ts +1 -1
  282. package/src/generated/themes/Avatar.css.ts +1 -1
  283. package/src/generated/themes/Breadcrumbs.css.ts +1 -1
  284. package/src/generated/themes/Checkbox.css.ts +1 -1
  285. package/src/generated/themes/CountrySelector.css.ts +1 -1
  286. package/src/generated/themes/DatePicker.css.ts +1 -1
  287. package/src/generated/themes/Dropdown.css.ts +1 -1
  288. package/src/generated/themes/FilterMenu.css.ts +1 -1
  289. package/src/generated/themes/HeroBanner.css.ts +1 -1
  290. package/src/generated/themes/InputGroup.css.ts +13 -0
  291. package/src/generated/themes/MastheadItem.css.ts +1 -1
  292. package/src/generated/themes/MastheadMenuItem.css.ts +1 -1
  293. package/src/generated/themes/MastheadShell.css.ts +1 -1
  294. package/src/generated/themes/MediaPlayer.css.ts +1 -1
  295. package/src/generated/themes/PhoneNumberField.css.ts +1 -1
  296. package/src/generated/themes/RatingIndicator.css.ts +1 -1
  297. package/src/generated/themes/Search.css.ts +1 -1
  298. package/src/generated/themes/SearchSuggestions.css.ts +1 -1
  299. package/src/generated/themes/SecondaryNavigation.css.ts +1 -1
  300. package/src/generated/themes/SecondaryNavigationItem.css.ts +13 -0
  301. package/src/generated/themes/SecondaryNavigationSubItem.css.ts +13 -0
  302. package/src/generated/themes/Slider.css.ts +1 -1
  303. package/src/generated/themes/StatusBadge.css.ts +13 -0
  304. package/src/generated/themes/Tag.css.ts +1 -1
  305. package/src/generated/themes/TextField.css.ts +1 -1
  306. package/src/i18n/messagebundle.properties +12 -1
  307. package/src/i18n/messagebundle_en.properties +8 -1
  308. package/src/themes/AccordionItem.css +20 -15
  309. package/src/themes/Avatar.css +20 -0
  310. package/src/themes/Breadcrumbs.css +4 -2
  311. package/src/themes/Checkbox.css +12 -0
  312. package/src/themes/CountrySelector.css +16 -1
  313. package/src/themes/DatePicker.css +1 -1
  314. package/src/themes/Dropdown.css +3 -1
  315. package/src/themes/FilterMenu.css +10 -0
  316. package/src/themes/HeroBanner.css +42 -6
  317. package/src/themes/InputGroup.css +19 -0
  318. package/src/themes/MastheadItem.css +2 -7
  319. package/src/themes/MastheadMenuItem.css +0 -4
  320. package/src/themes/MastheadShell.css +9 -10
  321. package/src/themes/MediaPlayer.css +3 -2
  322. package/src/themes/PhoneNumberField.css +17 -3
  323. package/src/themes/Search.css +168 -21
  324. package/src/themes/SearchSuggestions.css +7 -1
  325. package/src/themes/SecondaryNavigation.css +44 -302
  326. package/src/themes/SecondaryNavigationItem.css +220 -0
  327. package/src/themes/SecondaryNavigationSubItem.css +118 -0
  328. package/src/themes/StatusBadge.css +135 -0
  329. package/src/themes/Tag.css +6 -1
  330. package/src/themes/TextField.css +10 -1
  331. package/src/types/callback.ts +3 -0
  332. package/src/utils/debounce.ts +1 -1
  333. package/src/utils/retryUntilSuccessful.ts +23 -0
  334. package/dist/assets/messagebundle_en-26cd7a92.js +0 -1
@@ -6,6 +6,7 @@ import Integer from "@ui5/webcomponents-base/dist/types/Integer.js";
6
6
  import event from "@ui5/webcomponents-base/dist/decorators/event.js";
7
7
  import type I18nBundle from "@ui5/webcomponents-base/dist/i18nBundle.js";
8
8
  import { getI18nBundle } from "@ui5/webcomponents-base/dist/i18nBundle.js";
9
+ import ResizeHandler, { ResizeObserverCallback } from "@ui5/webcomponents-base/dist/delegate/ResizeHandler.js";
9
10
  import { COUNTRY_SELECT } from "./generated/i18n/i18n-defaults.js";
10
11
  import { Country, CountryListDB } from "./data/CountryListISO3166.js";
11
12
  import UDExDropdown from "./Dropdown.js";
@@ -258,6 +259,8 @@ class UDExPhoneNumberField extends UI5Element {
258
259
  previousKey!: string;
259
260
 
260
261
  static i18nBundle: I18nBundle;
262
+ _dropdown!: UDExDropdown;
263
+ _handleResizeBound: ResizeObserverCallback;
261
264
 
262
265
  static async onDefine() {
263
266
  UDExPhoneNumberField.i18nBundle = await getI18nBundle("sap-ui-webcomponents-bundle");
@@ -273,6 +276,23 @@ class UDExPhoneNumberField extends UI5Element {
273
276
 
274
277
  countriesList: ExtendedCountriesListPhoneNumberData[] = CountryListDB;
275
278
 
279
+ constructor() {
280
+ super();
281
+ this._handleResizeBound = this._handleResize.bind(this);
282
+ }
283
+
284
+ onEnterDOM(): void {
285
+ ResizeHandler.register(this, this._handleResizeBound);
286
+ }
287
+
288
+ onExitDOM(): void {
289
+ ResizeHandler.deregister(this, this._handleResizeBound);
290
+ }
291
+
292
+ onAfterRendering() {
293
+ this._dropdown = this.getDropdown();
294
+ }
295
+
276
296
  onClick(): void {
277
297
  if (this.isButtonDisabled) {
278
298
  return;
@@ -287,6 +307,10 @@ class UDExPhoneNumberField extends UI5Element {
287
307
  }
288
308
  }
289
309
 
310
+ _handleResize() {
311
+ this._dropdown.style.setProperty("--udex-dropdown-pane-width", `${this.offsetWidth}px`);
312
+ }
313
+
290
314
  handleInput(e: InputEvent) {
291
315
  this.value = (e.target as HTMLInputElement)?.value.trim();
292
316
 
@@ -309,11 +333,11 @@ class UDExPhoneNumberField extends UI5Element {
309
333
  }
310
334
 
311
335
  handleKeyDown = (e: KeyboardEvent) => {
312
- const isKeyAllowed = e.key?.match(/[\d+-]/g)
336
+ const isKeyAllowed = e.key.match(/\d/)
313
337
  || this.allowedKeys.includes(e.key)
314
338
  || e.metaKey
315
- || e.ctrlKey
316
- || (e.key === " " && this.previousKey !== " ");
339
+ || e.ctrlKey;
340
+
317
341
  if (!isKeyAllowed) {
318
342
  e.preventDefault();
319
343
  }
package/src/Search.hbs CHANGED
@@ -1,4 +1,26 @@
1
- <div class="udex-search__root">
1
+ <div class="udex-search__root {{classWithPrefix}}">
2
+ {{#if isShowSearchHomePrefix}}
3
+ <div class="udex-search__prefix">
4
+ <button type="button"
5
+ aria-haspopup="true"
6
+ aria-controls="udex-search-prefix"
7
+ class="udex-search__prefix-button"
8
+ @click="{{handleDropdownClick}}">
9
+ <span class="udex-search__prefix-label">{{labelPrefix}}</span>
10
+ <ui5-icon class="udex-search__prefix-icon" name="slim-arrow-down"></ui5-icon>
11
+ </button>
12
+ <ui5-popover
13
+ id="udex-search-prefix"
14
+ class="udex-search__prefix-popover"
15
+ hide-arrow
16
+ placement-type="Bottom"
17
+ horizontal-align="Left"
18
+ style="{{prefixPopoverStyles}}"
19
+ @after-close="{{handleAfterClosePrefixPopover}}">
20
+ <slot></slot>
21
+ </ui5-popover>
22
+ </div>
23
+ {{/if}}
2
24
  <form role="search" class="udex-search__container {{focusClasses}} {{isNotEmptyClass}}">
3
25
  {{#if labelAnimationDisabled}}
4
26
  <input
@@ -8,9 +30,10 @@
8
30
  class="udex-search__field"
9
31
  autocomplete="off"
10
32
  role="combobox"
11
- aria-controls="suggestions-popover"
33
+ aria-controls="{{getAriaControls}}"
12
34
  aria-expanded="false"
13
35
  aria-haspopup="{{showSuggestedPopover}}"
36
+ aria-label="Search"
14
37
  placeholder="{{label}}"
15
38
  .value="{{value}}"
16
39
  @input="{{handleSearchChange}}"
@@ -34,7 +57,7 @@
34
57
  autocomplete="off"
35
58
  role="combobox"
36
59
  aria-label="{{accInfo.ariaLabel}}"
37
- aria-controls="suggestions-popover"
60
+ aria-controls="{{getAriaControls}}"
38
61
  aria-expanded="false"
39
62
  aria-haspopup="{{showSuggestedPopover}}"
40
63
  .value="{{value}}"
package/src/Search.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import UI5Element, { ChangeInfo } from "@ui5/webcomponents-base/dist/UI5Element.js";
2
2
  import customElement from "@ui5/webcomponents-base/dist/decorators/customElement.js";
3
+ import slot from "@ui5/webcomponents-base/dist/decorators/slot.js";
3
4
  import property from "@ui5/webcomponents-base/dist/decorators/property.js";
4
5
  import event from "@ui5/webcomponents-base/dist/decorators/event.js";
5
6
  import Integer from "@ui5/webcomponents-base/dist/types/Integer.js";
@@ -16,11 +17,20 @@ import {
16
17
  isDown,
17
18
  isEscape,
18
19
  } from "@ui5/webcomponents-base/dist/Keys.js";
20
+ import List from "./List.js";
21
+ import ListItemBase from "./ListItemBase.js";
22
+ import "@ui5/webcomponents/dist/Icon.js";
19
23
  import "@ui5/webcomponents-icons/dist/decline.js";
20
24
  import "@ui5/webcomponents-icons/dist/search.js";
21
25
  import "@ui5/webcomponents-icons/dist/microphone.js";
26
+ import "@ui5/webcomponents-icons/dist/slim-arrow-down.js";
22
27
  import debounce from "./utils/debounce.js";
23
- import { SUGGESTED_TEXT, RECOMMENDED_TEXT, AVAILABLE_VALUES } from "./generated/i18n/i18n-defaults.js";
28
+ import {
29
+ SUGGESTED_TEXT,
30
+ RECOMMENDED_TEXT,
31
+ AVAILABLE_VALUES,
32
+ NO_MATCHES_FOUND,
33
+ } from "./generated/i18n/i18n-defaults.js";
24
34
  import type SearchInputSuggestion from "./features/SearchSuggestionsPopover.js";
25
35
 
26
36
  import SearchTemplate from "./generated/templates/SearchTemplate.lit.js";
@@ -29,9 +39,12 @@ import SearchSuggestionsTemplate from "./generated/templates/SearchSuggestionsTe
29
39
  // Styles
30
40
  import SearchCss from "./generated/themes/Search.css.js";
31
41
  import SearchSuggestionsCss from "./generated/themes/SearchSuggestions.css.js";
42
+ import retryUntilSuccessful from "./utils/retryUntilSuccessful.js";
32
43
 
33
44
  const SearchIcon: string = "sap-icon://search";
34
45
 
46
+ const SuggestionsPopoverId: string = "suggestions-popover";
47
+
35
48
  type ListItem = {
36
49
  label: string;
37
50
  icon: string;
@@ -65,7 +78,7 @@ export type SuggestionList = {
65
78
 
66
79
  export enum Mode {
67
80
  Standard = "Standard",
68
- HomeSearch = "Home Search",
81
+ HomeSearch = "Home Search"
69
82
  }
70
83
 
71
84
  /**
@@ -96,7 +109,7 @@ export enum Mode {
96
109
  staticAreaTemplate: SearchSuggestionsTemplate,
97
110
  get dependencies() {
98
111
  const Suggestion = getFeature<typeof SearchInputSuggestion>("SearchInputSuggestion");
99
- return ([Popover] as Array<typeof UI5Element>).concat(Suggestion ? Suggestion.dependencies : []);
112
+ return ([Popover] as Array<typeof UI5Element>).concat(Suggestion ? [...Suggestion.dependencies, List] : [List]);
100
113
  },
101
114
  })
102
115
 
@@ -121,6 +134,13 @@ export enum Mode {
121
134
  * @public
122
135
  */
123
136
  @event("handle-value-reset")
137
+ /**
138
+ * Fired event when the user presses escape in search field.
139
+ *
140
+ * @event sap.ui.webc.web-components.UDExSearch#handleCloseSearch
141
+ * @public
142
+ */
143
+ @event("handle-close-search")
124
144
  /**
125
145
  * Fired event when the user clicks on the item inside the popover.
126
146
  *
@@ -128,6 +148,13 @@ export enum Mode {
128
148
  * @public
129
149
  */
130
150
  @event("dropdown-item-click", { detail: { value: { type: String } } })
151
+ /**
152
+ * Fired event when the user clicks on the intem inside the prefix dropdown.
153
+ *
154
+ * @event sap.ui.webc.web-components.UDExSearch#prefixItemClick
155
+ * @public
156
+ */
157
+ @event("prefix-item-click", { detail: { item: { type: ListItemBase } } })
131
158
  class UDExSearch extends UI5Element {
132
159
  static i18nBundle: any;
133
160
  _labelActiveClassName = "udex-search__label--active";
@@ -225,6 +252,14 @@ class UDExSearch extends UI5Element {
225
252
  @property({ validator: Integer })
226
253
  _searchWidth?: number;
227
254
 
255
+ /**
256
+ * Define the label of the prefix for the dropdown.
257
+ *
258
+ * @private
259
+ */
260
+ @property({ type: String })
261
+ labelPrefix!: string;
262
+
228
263
  /**
229
264
  * Defines display the suggestion popover in the component.
230
265
  *
@@ -251,8 +286,8 @@ class UDExSearch extends UI5Element {
251
286
  * @default "Standard"
252
287
  * @public
253
288
  */
254
- @property({ type: String, defaultValue: "Standard" })
255
- mode!: "Standard" | "Home Search";
289
+ @property({ type: String, defaultValue: Mode.Standard })
290
+ mode!: Mode;
256
291
 
257
292
  /**
258
293
  * Defines open suggestion popover when clicked on the input field.
@@ -281,6 +316,15 @@ class UDExSearch extends UI5Element {
281
316
  @property()
282
317
  accessibleName!: string;
283
318
 
319
+ /**
320
+ * Defines the text if the suggestion list doesn't return results.
321
+ *
322
+ * @default "No matches found."
323
+ * @public
324
+ */
325
+ @property({ type: String, defaultValue: "No matches found." })
326
+ noResultText!: string;
327
+
284
328
  /**
285
329
  * Defines the inner stored class of the label.
286
330
  *
@@ -349,6 +393,36 @@ class UDExSearch extends UI5Element {
349
393
  @property({ type: String })
350
394
  _recommendLabel?: string;
351
395
 
396
+ /**
397
+ * The console warning shown after all unsuccessful attempts of opening SearchSuggestionsPopover component.
398
+ * @default "UdexSearchSuggestionsPopover couldn`t be opened"
399
+ */
400
+ @property({ type: String, defaultValue: "UdexSearchSuggestionsPopover couldn`t be opened" })
401
+ unsuccessfulRetryMessage: string = "UdexSearchSuggestionsPopover couldn`t be opened";
402
+
403
+ /**
404
+ * The delay before retrying to open the SerchSuggestionsPopover component.
405
+ * @default 200
406
+ */
407
+ @property({ type: Number, defaultValue: 200 })
408
+ retryDelay: number = 200;
409
+
410
+ /**
411
+ * The maximum number of attempts for opening the SearchSuggestionsPopover component.
412
+ * @default 5
413
+ */
414
+ @property({ type: Number, defaultValue: 5 })
415
+ maxRetryAttempts: number = 5;
416
+
417
+ /**
418
+ * Defines the prefix dropdown of the Search component.
419
+ *
420
+ * @slot dropdownPrefix
421
+ * @public
422
+ */
423
+ @slot({ type: HTMLElement, "default": true })
424
+ dropdownPrefix!: Array<List>;
425
+
352
426
  constructor() {
353
427
  super();
354
428
  this._handleResizeBound = this._handleResize.bind(this);
@@ -546,6 +620,67 @@ class UDExSearch extends UI5Element {
546
620
  this.fireEvent("dropdown-item-click", { value });
547
621
  }
548
622
 
623
+ handleDropdownClick() {
624
+ const dropdown = this.getPrefixPopover();
625
+
626
+ if (dropdown.opened) {
627
+ this.onClosePrefixPopover();
628
+ } else {
629
+ this.onOpenPrefixPopover();
630
+ }
631
+ }
632
+
633
+ getPrefixWrapper() {
634
+ return this.shadowRoot!.querySelector(".udex-search__prefix") as HTMLElement;
635
+ }
636
+
637
+ getPrefixPopover() {
638
+ return this.shadowRoot!.querySelector<Popover>("[ui5-popover]")!;
639
+ }
640
+
641
+ getPrefixButton() {
642
+ return this.shadowRoot!.querySelector(".udex-search__prefix-button") as HTMLElement;
643
+ }
644
+
645
+ onOpenPrefixPopover() {
646
+ if (this.dropdownPrefix.length) {
647
+ const wrapper = this.getPrefixWrapper();
648
+ const dropdown = this.getPrefixPopover();
649
+ const button = this.getPrefixButton();
650
+
651
+ dropdown.showAt(this.getPrefixButton());
652
+ dropdown.style.width = `${button.offsetWidth + 1}px`;
653
+ button.classList.add("udex-search__prefix-button--active");
654
+ wrapper.classList.add("udex-search__prefix--show-popover");
655
+ this.handleItemClick();
656
+ }
657
+ }
658
+
659
+ private handleItemClick() {
660
+ this.dropdownPrefix[0].addEventListener("item-press", (e: any) => {
661
+ const selectedItemPrefix = e.detail.item as ListItemBase;
662
+ this.labelPrefix = selectedItemPrefix.innerText;
663
+ this.fireEvent("prefix-item-click", { item: selectedItemPrefix });
664
+ this.onClosePrefixPopover();
665
+ });
666
+ }
667
+
668
+ onClosePrefixPopover() {
669
+ const dropdown = this.getPrefixPopover();
670
+
671
+ dropdown.close();
672
+ this.handleAfterClosePrefixPopover();
673
+ }
674
+
675
+ handleAfterClosePrefixPopover() {
676
+ const wrapper = this.getPrefixWrapper();
677
+ const button = this.getPrefixButton();
678
+
679
+ wrapper.classList.remove("udex-search__prefix--show-popover");
680
+ button.classList.remove("udex-search__prefix-button--active");
681
+ this.dropdownPrefix[0].removeEventListener("item-press", () => {});
682
+ }
683
+
549
684
  handleInputClick(): void {
550
685
  if (this.showPopoverWhenClickedIntoInput) {
551
686
  this.onOpenPopover();
@@ -568,8 +703,19 @@ class UDExSearch extends UI5Element {
568
703
  }
569
704
 
570
705
  onOpenPopover(): void {
571
- if (this.showSuggestedPopover && (this.suggestedList?.length || this.recommendedList?.length)) {
572
- this.Suggestion!.open();
706
+ if (this.showSuggestedPopover) {
707
+ if (!this.Suggestion) {
708
+ retryUntilSuccessful(() => this.Suggestion, this.retryDelay, this.maxRetryAttempts, this.unsuccessfulRetryMessage)
709
+ .then(() => {
710
+ this.Suggestion!.open();
711
+ })
712
+ .catch(error => {
713
+ console.warn(error.message);
714
+ });
715
+ } else {
716
+ this.Suggestion.open();
717
+ }
718
+
573
719
  this.handleClassToRoot();
574
720
  this.handleAriaExpanded();
575
721
  }
@@ -601,6 +747,14 @@ class UDExSearch extends UI5Element {
601
747
  this.enableSuggestions();
602
748
  }
603
749
 
750
+ if (this.isHomeSearchWithPrefixMode && this.dropdownPrefix.length) {
751
+ const dropdownItems = Array.from(this.dropdownPrefix[0].children) as Array<ListItemBase>;
752
+ const selectedItemIndex = dropdownItems.findIndex(listItem => listItem.selected);
753
+ const selectedItemPrefix = selectedItemIndex >= 0 ? dropdownItems[selectedItemIndex] : dropdownItems[0];
754
+
755
+ this.labelPrefix = selectedItemPrefix.innerText;
756
+ }
757
+
604
758
  this.showResetButton = !!this.value.length;
605
759
 
606
760
  if (this.value && this.labelActiveClass === "") {
@@ -616,6 +770,14 @@ class UDExSearch extends UI5Element {
616
770
  }
617
771
 
618
772
  this.labelClasses = `udex-search__label ${this.labelActiveClass} ${this.labelAnimationClass}`;
773
+
774
+ if (this.isVoiceButton) {
775
+ this.labelClasses += " udex-search__label-with-voice-icon";
776
+ }
777
+
778
+ if (this.isShowSubmitButton) {
779
+ this.labelClasses += " udex-search__label-with-search-icon";
780
+ }
619
781
  }
620
782
 
621
783
  enableSuggestions() {
@@ -628,7 +790,7 @@ class UDExSearch extends UI5Element {
628
790
  if (Suggestion) {
629
791
  this.Suggestion = new Suggestion(this);
630
792
  } else {
631
- throw new Error("You have to import '@udex/webcomponents/dist/features/SearchInputSuggestions.js' module to use udex-search suggestions");
793
+ throw new Error("You have to import '@udex/webcomponents/dist/features/SearchSuggestionsPopover.js' module to use udex-search suggestions");
632
794
  }
633
795
  }
634
796
 
@@ -636,6 +798,7 @@ class UDExSearch extends UI5Element {
636
798
  if (this.showSuggestedPopover) {
637
799
  this.handleOutsideClick();
638
800
  this.handleOpenSuggestionPopover();
801
+ this.setSearchWidth();
639
802
  }
640
803
  }
641
804
 
@@ -687,16 +850,17 @@ class UDExSearch extends UI5Element {
687
850
  this.handleEnterKey(e);
688
851
  this.handleTabKey(e);
689
852
  this.handleEscapeKey(e);
853
+ this.fireEvent("search-keydown", e);
690
854
  };
691
855
 
692
856
  handleEnterKey(e: KeyboardEvent) {
693
- if (isEnter(e) && !this.open) {
694
- e.preventDefault();
695
- this.handleSubmitValue();
696
- }
697
- if (isEnter(e) && this.open) {
698
- this.Suggestion?.onEnter(e);
699
- this.fireDropdownItemClick(this.value);
857
+ if (isEnter(e)) {
858
+ if (!this.open) {
859
+ e.preventDefault();
860
+ } else {
861
+ this.Suggestion?.onEnter(e);
862
+ this.fireDropdownItemClick(this.value);
863
+ }
700
864
  this.handleSubmitValue();
701
865
  }
702
866
  }
@@ -708,9 +872,12 @@ class UDExSearch extends UI5Element {
708
872
  }
709
873
 
710
874
  handleEscapeKey(e: KeyboardEvent) {
711
- if (isEscape(e) && this.open) {
712
- this.Suggestion?.onEscape(e);
713
- this.handleClassToRoot();
875
+ if (isEscape(e)) {
876
+ if (this.open) {
877
+ this.Suggestion?.onEscape(e);
878
+ this.handleClassToRoot();
879
+ }
880
+ this.fireEvent("handle-close-search");
714
881
  }
715
882
  }
716
883
 
@@ -720,12 +887,14 @@ class UDExSearch extends UI5Element {
720
887
  this.handlePrevTabKeyList(e);
721
888
  this.handleDownKeyList(e);
722
889
  this.handleUpKeyList(e);
890
+ this.handleEscapeKey(e);
723
891
  }
724
892
  }
725
893
 
726
894
  handleTabKeyList(e: KeyboardEvent) {
727
895
  if (isTabNext(e)) {
728
896
  this.Suggestion?.onKeyTabList(e);
897
+ this.handleClassToRoot();
729
898
  }
730
899
  }
731
900
 
@@ -771,7 +940,7 @@ class UDExSearch extends UI5Element {
771
940
 
772
941
  handleKeyDownReset(e: KeyboardEvent) {
773
942
  if (isTabPrevious(e) && this.open) {
774
- this.Suggestion?.handlePrevTabResset(e);
943
+ this.Suggestion?.handlePrevTabReset(e);
775
944
  }
776
945
  }
777
946
 
@@ -823,7 +992,15 @@ class UDExSearch extends UI5Element {
823
992
  }
824
993
 
825
994
  _handleResize() {
826
- this._searchWidth = this.offsetWidth;
995
+ this.setSearchWidth();
996
+ }
997
+
998
+ private setSearchWidth() {
999
+ const searchContainer = (this.shadowRoot?.querySelector(".udex-search__container") as HTMLElement);
1000
+
1001
+ if (searchContainer.offsetWidth !== this._searchWidth) {
1002
+ this._searchWidth = searchContainer.offsetWidth;
1003
+ }
827
1004
  }
828
1005
 
829
1006
  get popoverStyles() {
@@ -832,10 +1009,24 @@ class UDExSearch extends UI5Element {
832
1009
  };
833
1010
  }
834
1011
 
1012
+ get prefixPopoverStyles() {
1013
+ return {
1014
+ "width": this.getPrefixButton() ? `${this.getPrefixButton().offsetWidth + 1}px` : "",
1015
+ };
1016
+ }
1017
+
835
1018
  get isShowResetButton(): boolean {
836
1019
  return this.showResetButton && !!this.value.length;
837
1020
  }
838
1021
 
1022
+ get noResultMessage(): string {
1023
+ return this.noResultText || UDExSearch.i18nBundle.getText(NO_MATCHES_FOUND) as string;
1024
+ }
1025
+
1026
+ get showNoResultMessage(): boolean {
1027
+ return !this.suggestedList?.length && !this.recommendedList?.length;
1028
+ }
1029
+
839
1030
  get isShowSuggestedList(): boolean {
840
1031
  return !!this.suggestedList?.length;
841
1032
  }
@@ -848,6 +1039,14 @@ class UDExSearch extends UI5Element {
848
1039
  return !!(this.suggestedList?.length || this.recommendedList?.length);
849
1040
  }
850
1041
 
1042
+ get getAriaControls(): string {
1043
+ return this.hasPopoverContent ? this.getSuggestionsPopoverId : "";
1044
+ }
1045
+
1046
+ get getSuggestionsPopoverId(): string {
1047
+ return SuggestionsPopoverId;
1048
+ }
1049
+
851
1050
  get isShowSubmitButton(): boolean {
852
1051
  return this.showSubmitButton;
853
1052
  }
@@ -860,12 +1059,28 @@ class UDExSearch extends UI5Element {
860
1059
  return this._recommendLabel;
861
1060
  }
862
1061
 
1062
+ get isShowSearchHomePrefix(): boolean {
1063
+ return this.isHomeSearchWithPrefixMode && !!this.dropdownPrefix.length;
1064
+ }
1065
+
863
1066
  get isHomeSearchMode(): boolean {
864
1067
  return this.mode === Mode.HomeSearch;
865
1068
  }
866
1069
 
1070
+ get isHomeSearchWithPrefixMode(): boolean {
1071
+ return this.mode === Mode.HomeSearch && !!this.dropdownPrefix.length;
1072
+ }
1073
+
1074
+ get classWithPrefix(): string {
1075
+ return this.isHomeSearchWithPrefixMode ? "udex-search-prefix" : "";
1076
+ }
1077
+
867
1078
  get homeSearchPopoverClass(): string {
868
- return this.isHomeSearchMode ? "udex-search-suggestions__root--home" : "";
1079
+ return this.isHomeSearchMode || this.isHomeSearchWithPrefixMode ? "udex-search-suggestions__root--home" : "";
1080
+ }
1081
+
1082
+ get homeSearchWithPrefixPopoverClass(): string {
1083
+ return this.isHomeSearchWithPrefixMode ? "udex-search-suggestions__root--prefix" : "";
869
1084
  }
870
1085
 
871
1086
  get searchButtonActiveClass(): string {