@sapudex/web-components 2.55.0 → 2.56.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 (275) hide show
  1. package/cypress/specs/HeroBanner.cy.tsx +35 -1
  2. package/cypress/specs/List.cy.tsx +63 -1
  3. package/cypress/specs/ListItem.cy.tsx +44 -0
  4. package/cypress/specs/MastheadShell.cy.tsx +39 -0
  5. package/cypress/specs/PhoneNumberField.cy.tsx +29 -1
  6. package/cypress/specs/SelectBox.cy.tsx +99 -0
  7. package/dist/CountrySelectorTemplate.js +1 -1
  8. package/dist/CountrySelectorTemplate.js.map +1 -1
  9. package/dist/FilterMenu.js +5 -1
  10. package/dist/FilterMenu.js.map +1 -1
  11. package/dist/HeroBanner.d.ts +12 -0
  12. package/dist/HeroBanner.js +54 -0
  13. package/dist/HeroBanner.js.map +1 -1
  14. package/dist/List.d.ts +5 -0
  15. package/dist/List.js +7 -0
  16. package/dist/List.js.map +1 -1
  17. package/dist/ListItem.js +5 -1
  18. package/dist/ListItem.js.map +1 -1
  19. package/dist/ListTemplate.js +1 -1
  20. package/dist/ListTemplate.js.map +1 -1
  21. package/dist/MastheadShell.d.ts +7 -0
  22. package/dist/MastheadShell.js +38 -0
  23. package/dist/MastheadShell.js.map +1 -1
  24. package/dist/PhoneNumberField.d.ts +3 -3
  25. package/dist/PhoneNumberField.js +18 -21
  26. package/dist/PhoneNumberField.js.map +1 -1
  27. package/dist/PhoneNumberFieldTemplate.d.ts +2 -0
  28. package/dist/PhoneNumberFieldTemplate.js +12 -0
  29. package/dist/PhoneNumberFieldTemplate.js.map +1 -0
  30. package/dist/Search.d.ts +2 -0
  31. package/dist/Search.js +21 -0
  32. package/dist/Search.js.map +1 -1
  33. package/dist/SearchableListBase.d.ts +4 -0
  34. package/dist/SearchableListBase.js +66 -6
  35. package/dist/SearchableListBase.js.map +1 -1
  36. package/dist/SearchableListBaseTemplate.js +1 -1
  37. package/dist/SearchableListBaseTemplate.js.map +1 -1
  38. package/dist/SelectBase.js +14 -22
  39. package/dist/SelectBase.js.map +1 -1
  40. package/dist/SelectBoxTemplate.js +1 -1
  41. package/dist/SelectBoxTemplate.js.map +1 -1
  42. package/dist/StatusMessage.d.ts +2 -2
  43. package/dist/StatusMessage.js +1 -1
  44. package/dist/StatusMessage.js.map +1 -1
  45. package/dist/TextAreaTemplate.js +1 -1
  46. package/dist/TextAreaTemplate.js.map +1 -1
  47. package/dist/TextFieldTemplate.js +1 -1
  48. package/dist/TextFieldTemplate.js.map +1 -1
  49. package/dist/Upload.js +6 -9
  50. package/dist/Upload.js.map +1 -1
  51. package/dist/UploadItem.d.ts +2 -2
  52. package/dist/UploadItem.js +6 -9
  53. package/dist/UploadItem.js.map +1 -1
  54. package/dist/UploadItemTemplate.d.ts +2 -0
  55. package/dist/UploadItemTemplate.js +14 -0
  56. package/dist/UploadItemTemplate.js.map +1 -0
  57. package/dist/UploadTemplate.d.ts +2 -0
  58. package/dist/UploadTemplate.js +11 -0
  59. package/dist/UploadTemplate.js.map +1 -0
  60. package/dist/assets/{InputSuggestions-DPiJnNLn.js → InputSuggestions-ChhTxYh4.js} +1 -1
  61. package/dist/assets/{ListItemStandardExpandableTextTemplate-B-v72jL6.js → ListItemStandardExpandableTextTemplate-Bh1HxZfH.js} +1 -1
  62. package/dist/assets/{bundle-C7Yft7IG.css → bundle-CdO3MnjQ.css} +1 -1
  63. package/dist/assets/{bundle.esm-DPppjwN7.js → bundle.esm-DCX_ohoZ.js} +253 -241
  64. package/dist/assets/messagebundle_uk-CCv57GhV.js +1 -0
  65. package/dist/css/themes/AccordionItem.css +1 -1
  66. package/dist/css/themes/AccordionSpotlight.css +1 -1
  67. package/dist/css/themes/Avatar.css +1 -1
  68. package/dist/css/themes/CountrySelector.css +1 -1
  69. package/dist/css/themes/EventRibbon.css +1 -1
  70. package/dist/css/themes/FilterMenu.css +1 -1
  71. package/dist/css/themes/HeroBanner.css +1 -1
  72. package/dist/css/themes/ImageGridTicker.css +1 -1
  73. package/dist/css/themes/ListItem.css +1 -1
  74. package/dist/css/themes/MastheadCountrySelector.css +1 -1
  75. package/dist/css/themes/MastheadItem.css +1 -1
  76. package/dist/css/themes/MastheadProfileMenu.css +1 -1
  77. package/dist/css/themes/MastheadShell.css +1 -1
  78. package/dist/css/themes/MediaPlayer.css +1 -1
  79. package/dist/css/themes/Modal.css +1 -1
  80. package/dist/css/themes/PhoneNumberField.css +1 -1
  81. package/dist/css/themes/Search.css +1 -1
  82. package/dist/css/themes/SecondaryNavigationItem.css +1 -1
  83. package/dist/css/themes/SelectBase.css +1 -1
  84. package/dist/css/themes/StepInput.css +1 -1
  85. package/dist/css/themes/TabInOverflow.css +1 -1
  86. package/dist/css/themes/TabNavigation.css +1 -1
  87. package/dist/css/themes/TableCellBase.css +1 -1
  88. package/dist/css/themes/TagGroup.css +1 -1
  89. package/dist/css/themes/TextArea.css +1 -1
  90. package/dist/css/themes/TextField.css +1 -1
  91. package/dist/css/themes/Wizard.css +1 -1
  92. package/dist/custom-elements-internal.json +1138 -117
  93. package/dist/custom-elements.json +740 -123
  94. package/dist/generated/assets/i18n/messagebundle_uk.json +1 -1
  95. package/dist/generated/themes/AccordionItem.css.d.ts +1 -1
  96. package/dist/generated/themes/AccordionItem.css.js +1 -1
  97. package/dist/generated/themes/AccordionItem.css.js.map +1 -1
  98. package/dist/generated/themes/AccordionSpotlight.css.d.ts +1 -1
  99. package/dist/generated/themes/AccordionSpotlight.css.js +1 -1
  100. package/dist/generated/themes/AccordionSpotlight.css.js.map +1 -1
  101. package/dist/generated/themes/Avatar.css.d.ts +1 -1
  102. package/dist/generated/themes/Avatar.css.js +1 -1
  103. package/dist/generated/themes/Avatar.css.js.map +1 -1
  104. package/dist/generated/themes/CountrySelector.css.d.ts +1 -1
  105. package/dist/generated/themes/CountrySelector.css.js +1 -1
  106. package/dist/generated/themes/CountrySelector.css.js.map +1 -1
  107. package/dist/generated/themes/EventRibbon.css.d.ts +1 -1
  108. package/dist/generated/themes/EventRibbon.css.js +1 -1
  109. package/dist/generated/themes/EventRibbon.css.js.map +1 -1
  110. package/dist/generated/themes/FilterMenu.css.d.ts +1 -1
  111. package/dist/generated/themes/FilterMenu.css.js +1 -1
  112. package/dist/generated/themes/FilterMenu.css.js.map +1 -1
  113. package/dist/generated/themes/HeroBanner.css.d.ts +1 -1
  114. package/dist/generated/themes/HeroBanner.css.js +1 -1
  115. package/dist/generated/themes/HeroBanner.css.js.map +1 -1
  116. package/dist/generated/themes/ImageGridTicker.css.d.ts +1 -1
  117. package/dist/generated/themes/ImageGridTicker.css.js +1 -1
  118. package/dist/generated/themes/ImageGridTicker.css.js.map +1 -1
  119. package/dist/generated/themes/ListItem.css.d.ts +1 -1
  120. package/dist/generated/themes/ListItem.css.js +1 -1
  121. package/dist/generated/themes/ListItem.css.js.map +1 -1
  122. package/dist/generated/themes/MastheadCountrySelector.css.d.ts +1 -1
  123. package/dist/generated/themes/MastheadCountrySelector.css.js +1 -1
  124. package/dist/generated/themes/MastheadCountrySelector.css.js.map +1 -1
  125. package/dist/generated/themes/MastheadItem.css.d.ts +1 -1
  126. package/dist/generated/themes/MastheadItem.css.js +1 -1
  127. package/dist/generated/themes/MastheadItem.css.js.map +1 -1
  128. package/dist/generated/themes/MastheadProfileMenu.css.d.ts +1 -1
  129. package/dist/generated/themes/MastheadProfileMenu.css.js +1 -1
  130. package/dist/generated/themes/MastheadProfileMenu.css.js.map +1 -1
  131. package/dist/generated/themes/MastheadShell.css.d.ts +1 -1
  132. package/dist/generated/themes/MastheadShell.css.js +1 -1
  133. package/dist/generated/themes/MastheadShell.css.js.map +1 -1
  134. package/dist/generated/themes/MediaPlayer.css.d.ts +1 -1
  135. package/dist/generated/themes/MediaPlayer.css.js +1 -1
  136. package/dist/generated/themes/MediaPlayer.css.js.map +1 -1
  137. package/dist/generated/themes/Modal.css.d.ts +1 -1
  138. package/dist/generated/themes/Modal.css.js +1 -1
  139. package/dist/generated/themes/Modal.css.js.map +1 -1
  140. package/dist/generated/themes/PhoneNumberField.css.d.ts +1 -1
  141. package/dist/generated/themes/PhoneNumberField.css.js +1 -1
  142. package/dist/generated/themes/PhoneNumberField.css.js.map +1 -1
  143. package/dist/generated/themes/Search.css.d.ts +1 -1
  144. package/dist/generated/themes/Search.css.js +1 -1
  145. package/dist/generated/themes/Search.css.js.map +1 -1
  146. package/dist/generated/themes/SecondaryNavigationItem.css.d.ts +1 -1
  147. package/dist/generated/themes/SecondaryNavigationItem.css.js +1 -1
  148. package/dist/generated/themes/SecondaryNavigationItem.css.js.map +1 -1
  149. package/dist/generated/themes/SelectBase.css.d.ts +1 -1
  150. package/dist/generated/themes/SelectBase.css.js +1 -1
  151. package/dist/generated/themes/SelectBase.css.js.map +1 -1
  152. package/dist/generated/themes/StepInput.css.d.ts +1 -1
  153. package/dist/generated/themes/StepInput.css.js +1 -1
  154. package/dist/generated/themes/StepInput.css.js.map +1 -1
  155. package/dist/generated/themes/TabInOverflow.css.d.ts +1 -1
  156. package/dist/generated/themes/TabInOverflow.css.js +1 -1
  157. package/dist/generated/themes/TabInOverflow.css.js.map +1 -1
  158. package/dist/generated/themes/TabNavigation.css.d.ts +1 -1
  159. package/dist/generated/themes/TabNavigation.css.js +1 -1
  160. package/dist/generated/themes/TabNavigation.css.js.map +1 -1
  161. package/dist/generated/themes/TableCellBase.css.d.ts +1 -1
  162. package/dist/generated/themes/TableCellBase.css.js +1 -1
  163. package/dist/generated/themes/TableCellBase.css.js.map +1 -1
  164. package/dist/generated/themes/TagGroup.css.d.ts +1 -1
  165. package/dist/generated/themes/TagGroup.css.js +1 -1
  166. package/dist/generated/themes/TagGroup.css.js.map +1 -1
  167. package/dist/generated/themes/TextArea.css.d.ts +1 -1
  168. package/dist/generated/themes/TextArea.css.js +1 -1
  169. package/dist/generated/themes/TextArea.css.js.map +1 -1
  170. package/dist/generated/themes/TextField.css.d.ts +1 -1
  171. package/dist/generated/themes/TextField.css.js +1 -1
  172. package/dist/generated/themes/TextField.css.js.map +1 -1
  173. package/dist/generated/themes/Wizard.css.d.ts +1 -1
  174. package/dist/generated/themes/Wizard.css.js +1 -1
  175. package/dist/generated/themes/Wizard.css.js.map +1 -1
  176. package/dist/messagebundle_uk.properties +8 -0
  177. package/dist/utils/searchBackdrop.d.ts +1 -0
  178. package/dist/utils/searchBackdrop.js +23 -0
  179. package/dist/utils/searchBackdrop.js.map +1 -0
  180. package/dist/vscode.html-custom-data.json +165 -2
  181. package/dist/web-types.json +363 -6
  182. package/package.json +1 -1
  183. package/src/CountrySelectorTemplate.tsx +2 -2
  184. package/src/FilterMenu.ts +5 -1
  185. package/src/HeroBanner.ts +66 -0
  186. package/src/List.ts +8 -0
  187. package/src/ListItem.ts +5 -1
  188. package/src/ListTemplate.tsx +1 -1
  189. package/src/MastheadShell.ts +44 -0
  190. package/src/PhoneNumberField.ts +23 -22
  191. package/src/PhoneNumberFieldTemplate.tsx +128 -0
  192. package/src/Search.ts +21 -1
  193. package/src/SearchableListBase.ts +62 -7
  194. package/src/SearchableListBaseTemplate.tsx +1 -0
  195. package/src/SelectBase.ts +14 -21
  196. package/src/SelectBoxTemplate.tsx +1 -1
  197. package/src/StatusMessage.ts +4 -3
  198. package/src/TextAreaTemplate.tsx +1 -1
  199. package/src/TextFieldTemplate.tsx +1 -1
  200. package/src/Upload.ts +7 -10
  201. package/src/UploadItem.ts +7 -9
  202. package/src/UploadItemTemplate.tsx +62 -0
  203. package/src/UploadTemplate.tsx +53 -0
  204. package/src/generated/themes/AccordionItem.css.ts +1 -1
  205. package/src/generated/themes/AccordionSpotlight.css.ts +1 -1
  206. package/src/generated/themes/Avatar.css.ts +1 -1
  207. package/src/generated/themes/CountrySelector.css.ts +1 -1
  208. package/src/generated/themes/EventRibbon.css.ts +1 -1
  209. package/src/generated/themes/FilterMenu.css.ts +1 -1
  210. package/src/generated/themes/HeroBanner.css.ts +1 -1
  211. package/src/generated/themes/ImageGridTicker.css.ts +1 -1
  212. package/src/generated/themes/ListItem.css.ts +1 -1
  213. package/src/generated/themes/MastheadCountrySelector.css.ts +1 -1
  214. package/src/generated/themes/MastheadItem.css.ts +1 -1
  215. package/src/generated/themes/MastheadProfileMenu.css.ts +1 -1
  216. package/src/generated/themes/MastheadShell.css.ts +1 -1
  217. package/src/generated/themes/MediaPlayer.css.ts +1 -1
  218. package/src/generated/themes/Modal.css.ts +1 -1
  219. package/src/generated/themes/PhoneNumberField.css.ts +1 -1
  220. package/src/generated/themes/Search.css.ts +1 -1
  221. package/src/generated/themes/SecondaryNavigationItem.css.ts +1 -1
  222. package/src/generated/themes/SelectBase.css.ts +1 -1
  223. package/src/generated/themes/StepInput.css.ts +1 -1
  224. package/src/generated/themes/TabInOverflow.css.ts +1 -1
  225. package/src/generated/themes/TabNavigation.css.ts +1 -1
  226. package/src/generated/themes/TableCellBase.css.ts +1 -1
  227. package/src/generated/themes/TagGroup.css.ts +1 -1
  228. package/src/generated/themes/TextArea.css.ts +1 -1
  229. package/src/generated/themes/TextField.css.ts +1 -1
  230. package/src/generated/themes/Wizard.css.ts +1 -1
  231. package/src/i18n/messagebundle_uk.properties +8 -0
  232. package/src/themes/AccordionItem.css +1 -1
  233. package/src/themes/AccordionSpotlight.css +1 -1
  234. package/src/themes/Avatar.css +1 -1
  235. package/src/themes/CountrySelector.css +12 -2
  236. package/src/themes/EventRibbon.css +1 -1
  237. package/src/themes/FilterMenu.css +3 -2
  238. package/src/themes/HeroBanner.css +1 -1
  239. package/src/themes/ImageGridTicker.css +1 -1
  240. package/src/themes/ListItem.css +10 -2
  241. package/src/themes/MastheadCountrySelector.css +1 -1
  242. package/src/themes/MastheadItem.css +1 -1
  243. package/src/themes/MastheadProfileMenu.css +1 -1
  244. package/src/themes/MastheadShell.css +1 -1
  245. package/src/themes/MediaPlayer.css +10 -10
  246. package/src/themes/Modal.css +5 -3
  247. package/src/themes/PhoneNumberField.css +16 -6
  248. package/src/themes/Search.css +9 -9
  249. package/src/themes/SecondaryNavigationItem.css +1 -1
  250. package/src/themes/SelectBase.css +2 -2
  251. package/src/themes/StepInput.css +1 -1
  252. package/src/themes/TabInOverflow.css +2 -2
  253. package/src/themes/TabNavigation.css +7 -7
  254. package/src/themes/TableCellBase.css +1 -1
  255. package/src/themes/TagGroup.css +1 -1
  256. package/src/themes/TextArea.css +1 -1
  257. package/src/themes/TextField.css +1 -1
  258. package/src/themes/Wizard.css +1 -1
  259. package/src/utils/searchBackdrop.ts +23 -0
  260. package/dist/assets/messagebundle_uk-GmdhsMsP.js +0 -1
  261. package/dist/generated/templates/PhoneNumberFieldTemplate.lit.d.ts +0 -3
  262. package/dist/generated/templates/PhoneNumberFieldTemplate.lit.js +0 -16
  263. package/dist/generated/templates/PhoneNumberFieldTemplate.lit.js.map +0 -1
  264. package/dist/generated/templates/UploadItemTemplate.lit.d.ts +0 -3
  265. package/dist/generated/templates/UploadItemTemplate.lit.js +0 -12
  266. package/dist/generated/templates/UploadItemTemplate.lit.js.map +0 -1
  267. package/dist/generated/templates/UploadTemplate.lit.d.ts +0 -3
  268. package/dist/generated/templates/UploadTemplate.lit.js +0 -10
  269. package/dist/generated/templates/UploadTemplate.lit.js.map +0 -1
  270. package/src/PhoneNumberField.hbs +0 -119
  271. package/src/Upload.hbs +0 -21
  272. package/src/UploadItem.hbs +0 -32
  273. package/src/generated/templates/PhoneNumberFieldTemplate.lit.ts +0 -20
  274. package/src/generated/templates/UploadItemTemplate.lit.ts +0 -16
  275. package/src/generated/templates/UploadTemplate.lit.ts +0 -14
@@ -1,5 +1,7 @@
1
- import {UDExHeroBanner, UDExButton, UDExBreadcrumbs, UDExBreadcrumbsItem} from "../support/component-imports.js";
1
+ import {UDExHeroBanner, UDExButton, UDExBreadcrumbs, UDExBreadcrumbsItem, UDExSearch} from "../support/component-imports.js";
2
2
  import UDExButtonDesign from "../../src/types/ButtonDesign.js";
3
+ // The SearchSuggestionsPopover feature must be imported so the backdrop events are enabled.
4
+ import "../../src/features/SearchSuggestionsPopover.js";
3
5
 
4
6
  const primaryContentHeader = "Grow your business through enterprise";
5
7
  const secondaryContentHeader = "Entertain an idea";
@@ -172,3 +174,35 @@ describe("Hero Banner component", () => {
172
174
  });
173
175
  });
174
176
  });
177
+
178
+ const BACKDROP_SUGGESTION_LIST = JSON.stringify({
179
+ suggested: ["SAP HANA", "SAP BTP"],
180
+ recommended: ["What is SAP HANA"],
181
+ });
182
+
183
+ const heroBannerWithSearch = (
184
+ <UDExHeroBanner id="heroBannerSearchBackdrop">
185
+ <div slot="content">
186
+ <UDExSearch show-suggested-popover open-suggestion-popup />
187
+ </div>
188
+ </UDExHeroBanner>
189
+ );
190
+
191
+ describe("HeroBanner — search backdrop", () => {
192
+ beforeEach(() => {
193
+ cy.mount(heroBannerWithSearch);
194
+ cy.get("[udex-search]").invoke("attr", "suggestion-list", BACKDROP_SUGGESTION_LIST);
195
+ });
196
+
197
+ it("backdrop is rendered after search suggestions are opened", () => {
198
+ cy.get(".udex-search-backdrop").should("be.visible");
199
+ });
200
+
201
+ it("backdrop is not visible after search dropdown is closed", () => {
202
+ cy.get(".udex-search-backdrop").should("be.visible");
203
+ cy.get("[udex-search]").invoke("removeAttr", "open-suggestion-popup");
204
+ cy.get("[udex-search]").shadow().find("#search-input").focus();
205
+ cy.realPress("Escape");
206
+ cy.get(".udex-search-backdrop").should("not.be.visible");
207
+ });
208
+ });
@@ -421,4 +421,66 @@ describe("List component - SingleContent accessible name", () => {
421
421
  );
422
422
  cy.get("[udex-list]").shadow().find(".udex-list").should("not.have.attr", "aria-label");
423
423
  });
424
- });
424
+ });
425
+
426
+ // SingleContent is purely informational (no selection), so the inner list container must
427
+ // expose the generic list/listitem semantics instead of the listbox/option selection-widget
428
+ // semantics. listbox/option compute the option's accessible name from its whole subtree, which
429
+ // pulls a nested udex-button (e.g. an info icon) label into the option name AND announces it
430
+ // again when focused — a double announcement.
431
+ describe("List component - SingleContent uses list/listitem role", () => {
432
+ const innerList = () =>
433
+ cy.get("[udex-list]").shadow().find(".udex-list");
434
+
435
+ it("SingleContent: inner list container has role=\"list\" by default", () => {
436
+ cy.mount(
437
+ <UDExList mode="SingleContent" accessible-name="Info list">
438
+ <UDExListItem id="sc-item">Cloud Solution</UDExListItem>
439
+ </UDExList>
440
+ );
441
+ innerList().should("have.attr", "role", "list");
442
+ });
443
+
444
+ it("SingleContent list item: shadow [part=item] has role=\"listitem\" by default", () => {
445
+ cy.mount(
446
+ <UDExList mode="SingleContent" accessible-name="Info list">
447
+ <UDExListItem id="sc-item">Cloud Solution</UDExListItem>
448
+ </UDExList>
449
+ );
450
+ cy.get("#sc-item").shadow().find("[part=item]").should("have.attr", "role", "listitem");
451
+ });
452
+
453
+
454
+ it("SingleContent: an explicit non-listbox accessible-role is respected (not forced to \"list\")", () => {
455
+ cy.mount(
456
+ <UDExList mode="SingleContent" accessible-role="menu" accessible-name="Info list">
457
+ <UDExListItem>Cloud Solution</UDExListItem>
458
+ </UDExList>
459
+ );
460
+ innerList().should("have.attr", "role", "menu");
461
+ });
462
+ });
463
+
464
+ // The SingleContent fix must not alter the selection modes. SingleSelect / MultiSelect /
465
+ // RadioGroup lists (without collapsible group headers, so no tree pattern) still render the
466
+ // listbox/option selection-widget semantics.
467
+ describe("List component - selection modes keep listbox/option role", () => {
468
+ const listboxFixture = (mode: string) => (
469
+ <UDExList id="selection-list" mode={mode as "SingleSelect" | "MultiSelect" | "RadioGroup"}>
470
+ <UDExListItem id="selection-item">Item 1</UDExListItem>
471
+ <UDExListItem>Item 2</UDExListItem>
472
+ </UDExList>
473
+ );
474
+
475
+ ["SingleSelect", "MultiSelect", "RadioGroup"].forEach(mode => {
476
+ it(`${mode}: inner #udex-list div keeps role="listbox"`, () => {
477
+ cy.mount(listboxFixture(mode));
478
+ cy.get("#selection-list").shadow().find("#udex-list").should("have.attr", "role", "listbox");
479
+ });
480
+
481
+ it(`${mode}: list item shadow [part=item] keeps role="option"`, () => {
482
+ cy.mount(listboxFixture(mode));
483
+ cy.get("#selection-item").shadow().find("[part=item]").should("have.attr", "role", "option");
484
+ });
485
+ });
486
+ });
@@ -511,4 +511,48 @@ describe("ListItem", () => {
511
511
  .and("not.have.attr", "aria-checked");
512
512
  });
513
513
  });
514
+
515
+ // SingleContent is informational, not a selection widget, so the item's shadow
516
+ // [part=item] renders role="listitem" (not "option").
517
+ describe("SingleContent role", () => {
518
+ it("SingleContent item: [part=item] has role=\"listitem\" by default", () => {
519
+ cy.mount(<UDExListItem
520
+ id="sc-role-item"
521
+ mode={UDExListMode.SingleContent}
522
+ label="Cloud Solution">
523
+ </UDExListItem>);
524
+
525
+ cy.get("#sc-role-item").shadow()
526
+ .find("[part=item]").should("have.attr", "role", "listitem");
527
+ });
528
+
529
+ // Regression: the selection modes keep role="option" (roleItem returns the "option"
530
+ // fallback for every mode except SingleContent).
531
+ [UDExListMode.SingleSelect, UDExListMode.MultiSelect, UDExListMode.RadioGroup].forEach(mode => {
532
+ it(`${mode} item: [part=item] keeps role="option" by default`, () => {
533
+ cy.mount(<UDExListItem
534
+ id="sel-role-item"
535
+ mode={mode}
536
+ label="JavaScript">
537
+ </UDExListItem>);
538
+
539
+ cy.get("#sel-role-item").shadow()
540
+ .find("[part=item]").should("have.attr", "role", "option");
541
+ });
542
+ });
543
+
544
+ // An explicit accessible-role always wins over the SingleContent default (getter
545
+ // returns accessibleRole before falling through to the mode-based default).
546
+ it("explicit accessible-role overrides the SingleContent \"listitem\" default", () => {
547
+ cy.mount(<UDExListItem
548
+ id="sc-role-override"
549
+ accessible-role="option"
550
+ mode={UDExListMode.SingleContent}
551
+ label="Cloud Solution">
552
+ </UDExListItem>);
553
+
554
+ cy.get("#sc-role-override").shadow()
555
+ .find("[part=item]").should("have.attr", "role", "option");
556
+ });
557
+ });
514
558
  });
@@ -8,6 +8,8 @@ import {
8
8
  UDExSearch,
9
9
  } from "../support/component-imports.js";
10
10
  import { profileLoggedInUser, profileLinks, subItemsExplore, subItemsProduct } from "../fixtures/masthead-shell.js";
11
+ // The SearchSuggestionsPopover feature must be imported so the backdrop events are enabled.
12
+ import "../../src/features/SearchSuggestionsPopover.js";
11
13
 
12
14
  const logoUrl = "https://cdn.udex.services.sap.com/dds/design-tokens/assets/logos/sap-logo.svg";
13
15
  const homeUrl = "https://sap.com";
@@ -724,3 +726,40 @@ describe("MastheadShell Search-Focused", () => {
724
726
  });
725
727
  });
726
728
  });
729
+
730
+ const BACKDROP_SUGGESTION_LIST = JSON.stringify({
731
+ suggested: ["SAP HANA", "SAP BTP"],
732
+ recommended: ["What is SAP HANA"],
733
+ });
734
+
735
+ const mastheadWithSuggestionsSearch = (
736
+ <UDExMastheadShell
737
+ id="mastheadBackdropTest"
738
+ show-search-by-default
739
+ logo-url={logoUrl}
740
+ site-label="Test"
741
+ homepage-aria-label="SAP Homepage"
742
+ close-button-accessible-name="Close Search">
743
+ <UDExSearch slot="search" show-suggested-popover open-suggestion-popup />
744
+ </UDExMastheadShell>
745
+ );
746
+
747
+ describe("MastheadShell — search backdrop", () => {
748
+ beforeEach(() => {
749
+ cy.viewport(1440, 900);
750
+ cy.mount(mastheadWithSuggestionsSearch);
751
+ cy.get("[udex-search]").invoke("attr", "suggestion-list", BACKDROP_SUGGESTION_LIST);
752
+ });
753
+
754
+ it("backdrop is rendered after search suggestions are opened", () => {
755
+ cy.get(".udex-search-backdrop").should("be.visible");
756
+ });
757
+
758
+ it("backdrop is not visible after search dropdown is closed", () => {
759
+ cy.get(".udex-search-backdrop").should("be.visible");
760
+ cy.get("[udex-search]").invoke("removeAttr", "open-suggestion-popup");
761
+ cy.get("[udex-search]").shadow().find("#search-input").focus();
762
+ cy.realPress("Escape");
763
+ cy.get(".udex-search-backdrop").should("not.be.visible");
764
+ });
765
+ });
@@ -116,6 +116,34 @@ describe("PhoneNumberField", () => {
116
116
  cy.get("#default").shadow().find("udex-list-item[selected]").should("have.attr", "id", "UA")
117
117
  });
118
118
 
119
+ it("country flag is automatically updated when value is set programmatically", () => {
120
+ cy.mount(defaultPhoneNumberField)
121
+ cy.get("#default").then($el => {
122
+ ($el[0] as any).value = "+38012345678"
123
+ })
124
+ cy.get("#default").shadow().find("udex-list-item[selected]").should("have.attr", "id", "UA")
125
+ cy.get("#default").shadow().find("input").should("have.attr", "placeholder", "+380 XXXXX XXXXX")
126
+ });
127
+
128
+ it("country flag is updated when value is set programmatically after manual country selection", () => {
129
+ cy.mount(defaultPhoneNumberField)
130
+ cy.get("#default").shadow().find(".udex-phone-number-field__input-wrapper").find(".udex-phone-number-field__open-button").click().realPress("d").realPress("Enter")
131
+ cy.get("#default").shadow().find("udex-list-item[selected]").should("have.attr", "id", "DK")
132
+ cy.get("#default").then($el => {
133
+ ($el[0] as any).value = "+38012345678"
134
+ })
135
+ cy.get("#default").shadow().find("udex-list-item[selected]").should("have.attr", "id", "UA")
136
+ });
137
+
138
+ it("changing country from dropdown updates flag and resets value to new prefix", () => {
139
+ cy.mount(defaultPhoneNumberField)
140
+ cy.get("#default").shadow().find("input").type("38012345")
141
+ cy.get("#default").shadow().find("udex-list-item[selected]").should("have.attr", "id", "UA")
142
+ cy.get("#default").shadow().find(".udex-phone-number-field__input-wrapper").find(".udex-phone-number-field__open-button").click().realPress("d").realPress("Enter")
143
+ cy.get("#default").shadow().find("udex-list-item[selected]").should("have.attr", "id", "DK")
144
+ cy.get("#default").shadow().find("input").should("have.value", "+45")
145
+ });
146
+
119
147
  it("check that the maxlength and formatting is applied correctly", () => {
120
148
  cy.mount(defaultPhoneNumberField)
121
149
  cy.get("#default").shadow().find("input").type("+380123456789123456").should("have.value", "+380 12345 6789123")
@@ -192,4 +220,4 @@ describe("PhoneNumberField", () => {
192
220
  cy.get("#default").shadow().find("input").type("123-abc-456!@#").should("have.value", "+1 (234) 56")
193
221
  });
194
222
  });
195
- });
223
+ });
@@ -2494,6 +2494,105 @@ describe("SelectBox", () => {
2494
2494
  .invoke("prop", "scrollTop")
2495
2495
  .should("be.greaterThan", 0);
2496
2496
  });
2497
+
2498
+ const singleSelectCollapsibleGroupScrollFixture = <div style="width: 350px; position:relative;">
2499
+ <UDExSelectBox id="select-box" height="200px" label="Languages">
2500
+ <UDExSelectBoxGroupHeader label="Backend Languages" collapsible>
2501
+ <UDExSelectBoxItem label="Java"></UDExSelectBoxItem>
2502
+ <UDExSelectBoxItem label="Python"></UDExSelectBoxItem>
2503
+ <UDExSelectBoxItem label="Go"></UDExSelectBoxItem>
2504
+ <UDExSelectBoxItem label="Ruby"></UDExSelectBoxItem>
2505
+ <UDExSelectBoxItem label="Rust"></UDExSelectBoxItem>
2506
+ <UDExSelectBoxItem label="Node.js" selected></UDExSelectBoxItem>
2507
+ </UDExSelectBoxGroupHeader>
2508
+ <UDExSelectBoxGroupHeader label="Frontend Languages" collapsible>
2509
+ <UDExSelectBoxItem label="JavaScript"></UDExSelectBoxItem>
2510
+ <UDExSelectBoxItem label="TypeScript"></UDExSelectBoxItem>
2511
+ </UDExSelectBoxGroupHeader>
2512
+ </UDExSelectBox>
2513
+ </div>;
2514
+
2515
+ it("SingleSelect mode with collapsible group - selected item is scrolled into view after reopening the dropdown", () => {
2516
+ cy.mount(singleSelectCollapsibleGroupScrollFixture);
2517
+ cy.get("#select-box").shadow().find(".udex-text-field__trigger").as("trigger");
2518
+
2519
+ cy.get("@trigger").click();
2520
+ cy.get("#select-box").shadow().find(".udex-select-box__dropdown").should("have.attr", "open");
2521
+ cy.get("@trigger").click();
2522
+ cy.get("#select-box").shadow().find(".udex-select-box__dropdown").should("not.have.attr", "open");
2523
+ cy.get("@trigger").click();
2524
+ cy.get("#select-box").shadow().find(".udex-select-box__dropdown").should("have.attr", "open");
2525
+
2526
+ cy.get("#select-box").shadow()
2527
+ .find("ui5-popover").shadow()
2528
+ .find("[part=content]")
2529
+ .invoke("prop", "scrollTop")
2530
+ .should("be.greaterThan", 0);
2531
+ });
2532
+
2533
+ const collapsedGroupWithSelectionFixture = <div style="width: 350px; position:relative;">
2534
+ <UDExSelectBox id="select-box" height="200px" label="Languages">
2535
+ <UDExSelectBoxGroupHeader label="Backend Languages" collapsible collapsed>
2536
+ <UDExSelectBoxItem label="Java"></UDExSelectBoxItem>
2537
+ <UDExSelectBoxItem label="Python"></UDExSelectBoxItem>
2538
+ <UDExSelectBoxItem label="Node.js" selected></UDExSelectBoxItem>
2539
+ </UDExSelectBoxGroupHeader>
2540
+ <UDExSelectBoxGroupHeader label="Frontend Languages" collapsible>
2541
+ <UDExSelectBoxItem label="JavaScript"></UDExSelectBoxItem>
2542
+ <UDExSelectBoxItem label="TypeScript"></UDExSelectBoxItem>
2543
+ </UDExSelectBoxGroupHeader>
2544
+ </UDExSelectBox>
2545
+ </div>;
2546
+
2547
+ it("SingleSelect mode - collapsed group containing selected item is auto-expanded on dropdown open", () => {
2548
+ cy.mount(collapsedGroupWithSelectionFixture);
2549
+ cy.get("#select-box").shadow().find(".udex-text-field__trigger").click();
2550
+
2551
+ cy.get("#select-box").shadow()
2552
+ .find(".udex-select-box__dropdown")
2553
+ .should("have.attr", "open");
2554
+
2555
+ // The group that contains the selected item must be expanded (collapsed attribute removed).
2556
+ cy.get("[udex-select-box-group-header]").filter("[label='Backend Languages']")
2557
+ .should("not.have.attr", "collapsed");
2558
+
2559
+ // The rendered group header in the shadow DOM must also reflect the expanded state.
2560
+ cy.get("#select-box").shadow()
2561
+ .find("[udex-list-group-header]")
2562
+ .first()
2563
+ .should("not.have.attr", "collapsed");
2564
+ });
2565
+
2566
+ it("SingleSelect mode - manually collapsed group with selected item re-expands on next dropdown open", () => {
2567
+ cy.mount(collapsedGroupWithSelectionFixture);
2568
+
2569
+ // First open: group auto-expands.
2570
+ cy.get("#select-box").shadow().find(".udex-text-field__trigger").click();
2571
+ cy.get("#select-box").shadow().find(".udex-select-box__dropdown").should("have.attr", "open");
2572
+ cy.get("#select-box").shadow().find("[udex-list-group-header]").first().should("not.have.attr", "collapsed");
2573
+
2574
+ // Simulate user manually collapsing the group:
2575
+ // - Set collapsed on the original item so _expandCollapsedGroupsWithSelection detects it.
2576
+ // - Also set it on the rendered element in case the template re-render is async.
2577
+ cy.get("[udex-select-box-group-header]").filter("[label='Backend Languages']")
2578
+ .invoke("prop", "collapsed", true);
2579
+ cy.get("#select-box").shadow()
2580
+ .find("[udex-list-group-header]").first()
2581
+ .invoke("prop", "collapsed", true);
2582
+ cy.get("#select-box").shadow().find("[udex-list-group-header]").first().should("have.attr", "collapsed");
2583
+
2584
+ // Close the dropdown.
2585
+ cy.get("#select-box").shadow().find(".udex-text-field__trigger").click();
2586
+ cy.get("#select-box").shadow().find(".udex-select-box__dropdown").should("not.have.attr", "open");
2587
+
2588
+ // Reopen: the group must be auto-expanded again.
2589
+ cy.get("#select-box").shadow().find(".udex-text-field__trigger").click();
2590
+ cy.get("#select-box").shadow().find(".udex-select-box__dropdown").should("have.attr", "open");
2591
+ cy.get("#select-box").shadow()
2592
+ .find("[udex-list-group-header]")
2593
+ .first()
2594
+ .should("not.have.attr", "collapsed");
2595
+ });
2497
2596
  });
2498
2597
 
2499
2598
  // Tree accessibility pattern: SelectBox uses tree pattern when group headers are present.
@@ -3,6 +3,6 @@ export default function CountrySelectorTemplate() {
3
3
  if (this.hideFlagImages) {
4
4
  return _jsx(_Fragment, {});
5
5
  }
6
- return (_jsx("img", { class: "udex-text-field__image", "aria-label": this.flagAriaLabel, style: `background-position-x: ${this.selectedCountryFlagX}; background-position-y: ${this.selectedCountryFlagY}` }));
6
+ return (_jsx("span", { class: "udex-text-field__image", "aria-label": this.flagAriaLabel, style: `background-position-x: ${this.selectedCountryFlagX}; background-position-y: ${this.selectedCountryFlagY}` }));
7
7
  }
8
8
  //# sourceMappingURL=CountrySelectorTemplate.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CountrySelectorTemplate.js","sourceRoot":"","sources":["../src/CountrySelectorTemplate.tsx"],"names":[],"mappings":";AAEA,MAAM,CAAC,OAAO,UAAU,uBAAuB;IAC7C,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;QAAC,OAAO,mBAAK,CAAC;IAAC,CAAC;IAC1C,OAAO,CACL,cACE,KAAK,EAAC,wBAAwB,gBAClB,IAAI,CAAC,aAAa,EAC9B,KAAK,EAAE,0BAA0B,IAAI,CAAC,oBAAoB,4BAA4B,IAAI,CAAC,oBAAoB,EAAE,GAC7G,CACP,CAAC;AACJ,CAAC","sourcesContent":["import type UDExCountrySelector from \"./CountrySelector.js\";\n\nexport default function CountrySelectorTemplate(this: UDExCountrySelector) {\n if (this.hideFlagImages) { return <></>; }\n return (\n <img\n class=\"udex-text-field__image\"\n aria-label={this.flagAriaLabel}\n style={`background-position-x: ${this.selectedCountryFlagX}; background-position-y: ${this.selectedCountryFlagY}`}>\n </img>\n );\n}\n"]}
1
+ {"version":3,"file":"CountrySelectorTemplate.js","sourceRoot":"","sources":["../src/CountrySelectorTemplate.tsx"],"names":[],"mappings":";AAEA,MAAM,CAAC,OAAO,UAAU,uBAAuB;IAC7C,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;QAAC,OAAO,mBAAK,CAAC;IAAC,CAAC;IAC1C,OAAO,CACL,eACE,KAAK,EAAC,wBAAwB,gBAClB,IAAI,CAAC,aAAa,EAC9B,KAAK,EAAE,0BAA0B,IAAI,CAAC,oBAAoB,4BAA4B,IAAI,CAAC,oBAAoB,EAAE,GAC5G,CACR,CAAC;AACJ,CAAC","sourcesContent":["import type UDExCountrySelector from \"./CountrySelector.js\";\n\nexport default function CountrySelectorTemplate(this: UDExCountrySelector) {\n if (this.hideFlagImages) { return <></>; }\n return (\n <span\n class=\"udex-text-field__image\"\n aria-label={this.flagAriaLabel}\n style={`background-position-x: ${this.selectedCountryFlagX}; background-position-y: ${this.selectedCountryFlagY}`}>\n </span>\n );\n}\n"]}
@@ -11,6 +11,7 @@ import property from "@ui5/webcomponents-base/dist/decorators/property.js";
11
11
  import jsxRenderer from "@ui5/webcomponents-base/dist/renderer/JsxRenderer.js";
12
12
  import { isDesktop } from "@ui5/webcomponents-base/dist/Device.js";
13
13
  import { isTabPrevious, isTabNext, isEscape, isSpace, isEnter, } from "@ui5/webcomponents-base/dist/Keys.js";
14
+ import { renderFinished } from "@ui5/webcomponents-base/dist/Render.js";
14
15
  import PopupAccessibleRole from "@ui5/webcomponents/dist/types/PopupAccessibleRole.js";
15
16
  import Popover from "@ui5/webcomponents/dist/Popover.js";
16
17
  import UDExBusyIndicator from "./BusyIndicator.js";
@@ -269,7 +270,10 @@ let UDExFilterMenu = UDExFilterMenu_1 = class UDExFilterMenu extends UDExSearcha
269
270
  if (this.modeSingleSelect && !this._search) {
270
271
  this.activeItem?.focus();
271
272
  }
272
- this._handleDropdownScroll();
273
+ this._expandCollapsedGroupsWithSelection();
274
+ renderFinished().then(() => {
275
+ this._handleDropdownScroll();
276
+ }).catch(() => { });
273
277
  this.fireDecoratorEvent("after-open");
274
278
  }
275
279
  _focusFirstInteractiveElement() {
@@ -1 +1 @@
1
- {"version":3,"file":"FilterMenu.js","sourceRoot":"","sources":["../src/FilterMenu.ts"],"names":[],"mappings":"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","sourcesContent":["import customElement from \"@ui5/webcomponents-base/dist/decorators/customElement.js\";\nimport event from \"@ui5/webcomponents-base/dist/decorators/event-strict.js\";\nimport property from \"@ui5/webcomponents-base/dist/decorators/property.js\";\nimport jsxRenderer from \"@ui5/webcomponents-base/dist/renderer/JsxRenderer.js\";\nimport { isDesktop } from \"@ui5/webcomponents-base/dist/Device.js\";\nimport {\n isTabPrevious, isTabNext, isEscape, isSpace, isEnter,\n} from \"@ui5/webcomponents-base/dist/Keys.js\";\nimport PopupAccessibleRole from \"@ui5/webcomponents/dist/types/PopupAccessibleRole.js\";\nimport Popover from \"@ui5/webcomponents/dist/Popover.js\";\nimport UDExBusyIndicator from \"./BusyIndicator.js\";\nimport Icon from \"@ui5/webcomponents/dist/Icon.js\";\nimport IllustratedMessage from \"@ui5/webcomponents-fiori/dist/IllustratedMessage.js\";\nimport \"@ui5/webcomponents-fiori/dist/illustrations/NoSearchResults.js\";\nimport UDExList from \"./List.js\";\nimport UDExListItem from \"./ListItem.js\";\nimport UDExListGroupHeader from \"./ListGroupHeader.js\";\nimport UDExFilterMenuItem from \"./FilterMenuItem.js\";\nimport UDExFilterMenuGroupHeader from \"./FilterMenuGroupHeader.js\";\nimport type { UDExSearchKeydownEventDetail } from \"./Search.js\";\nimport UDExSearch from \"./Search.js\";\nimport UDExButton from \"./Button.js\";\nimport type { UDExSearchableListBaseEvents } from \"./SearchableListBase.js\";\nimport UDExSearchableListBase from \"./SearchableListBase.js\";\nimport { UDExPopoverPart } from \"./types/SearchableListBase.js\";\nimport { Placement, HorizontalAlign } from \"./types/Dropdown.js\";\nimport { UDExListMode } from \"./types/List.js\";\nimport UDExFilterMenuSelectAll from \"./FilterMenuSelectAll.js\";\nimport UDExListSelectAll from \"./ListSelectAll.js\";\nimport UDExBadge from \"./Badge.js\";\nimport type UDExListItemBase from \"./ListItemBase.js\";\nimport { RESET, SHOW_RESULTS, SELECT_OPTIONS } from \"./generated/i18n/i18n-defaults.js\";\nimport \"@ui5/webcomponents-icons/dist/navigation-down-arrow.js\";\nimport FilterMenuTemplate from \"./FilterMenuTemplate.js\";\nimport SearchableListBaseTemplate from \"./SearchableListBaseTemplate.js\";\nimport type UDExListGroupHeaderBase from \"./ListGroupHeaderBase.js\";\nimport translate from \"./utils/translate.js\";\n\n// Styles\nimport FilterMenuCss from \"./generated/themes/FilterMenu.css.js\";\nimport SearchableListCss from \"./generated/themes/SearchableList.css.js\";\nimport getEffectiveScrollbarStyle from \"./utils/getEffectiveScrollbarStyle.js\";\n\nexport type initialItemState = {\n id: string,\n selected: boolean,\n indeterminate?: boolean,\n collapsed?: boolean,\n _filtered?: boolean,\n}\n\ntype UDExFilterMenuResultClickEventDetail = {\n selectedItems: Array<UDExListItemBase>,\n}\n\ntype UDExFilterMenuResetClickEventDetail = {\n restoredItems: Array<UDExListItemBase>,\n}\n\n/**\n * @class\n *\n * <h3 class=\"comment-api-title\">Overview</h3>\n *\n *\n * <h3>Usage</h3>\n *\n * For the <code>udex-filter-menu</code>\n * <h3>ES6 Module Import</h3>\n *\n * <code>import \"@sapudex/web-components/dist/UDExFilterMenu.js\";</code>\n *\n * @constructor\n * @extends UDExSearchableListBase\n * @tagname udex-filter-menu\n * @public\n */\n@customElement({\n tag: \"udex-filter-menu\",\n renderer: jsxRenderer,\n styles: [FilterMenuCss, SearchableListCss, getEffectiveScrollbarStyle()],\n template: FilterMenuTemplate,\n dependencies: [\n IllustratedMessage,\n Popover,\n Icon,\n UDExBusyIndicator,\n UDExFilterMenuItem,\n UDExFilterMenuGroupHeader,\n UDExFilterMenuSelectAll,\n UDExList,\n UDExListSelectAll,\n UDExListItem,\n UDExListGroupHeader,\n UDExBadge,\n UDExSearch,\n UDExButton,\n ],\n})\n\n/**\n * Fired event when the user click on a reset button on the footer.\n *\n * @public\n * @param {Array<UDExListItemBase>} restoredItems\n */\n@event(\"reset-click\", { bubbles: true })\n\n/**\n * Fired event when the user click on a result button on the footer.\n *\n * @public\n * @param {Array<UDExListItemBase>} selectedItems\n */\n@event(\"result-click\", { bubbles: true })\n\n/**\n * Fired event when the user click on Select All header item.\n *\n * @public\n */\n@event(\"select-all\", { bubbles: true })\n\n/**\n * Fired before the dropdown pane is opened.\n *\n * @public\n */\n@event(\"before-open\", { bubbles: true })\n\n/**\n * Fired after the dropdown pane is opened.\n *\n * @public\n */\n@event(\"after-open\", { bubbles: true })\n\n/**\n * Fired before the dropdown pane is closed.\n *\n * @public\n */\n@event(\"before-close\", { bubbles: true })\n\n/**\n * Fired after the dropdown pane is closed.\n *\n * @public\n */\n@event(\"after-close\", { bubbles: true })\n\nclass UDExFilterMenu extends UDExSearchableListBase {\n eventDetails!: {\n \"result-click\": UDExFilterMenuResultClickEventDetail,\n \"reset-click\": UDExFilterMenuResetClickEventDetail,\n \"before-open\": void,\n \"after-open\": void,\n \"before-close\": void,\n \"after-close\": void,\n } & UDExSearchableListBaseEvents;\n /**\n * Determines the value of the badge.\n *\n * @public\n */\n @property({ type: Number })\n badgeValue?: number;\n\n /**\n * Determines if there is no enough space, the component can be placed\n * over the target.\n *\n * @default false\n * @public\n */\n @property({ type: Boolean })\n disableTargetOverlap?: boolean;\n\n /**\n * Determines on which side the component is placed at.\n *\n * @default \"Bottom\"\n * @public\n */\n @property()\n placement: `${Placement}` = Placement.Bottom;\n\n /**\n * Determines the horizontal alignment of the component.\n *\n * @default \"Left\"\n * @public\n */\n @property()\n horizontalAlign: `${HorizontalAlign}` = HorizontalAlign.Start;\n\n /**\n * Defines the mode of the component.\n *\n * @default \"SingleSelect\"\n * @public\n */\n @property()\n mode: `${UDExListMode}` = UDExListMode.SingleSelect;\n\n /**\n * Defines the label of the button reset in the footer.\n *\n * @default \"Reset\"\n * @public\n */\n @property()\n resetBtnLabel?: string;\n\n /**\n * Defines the label of the button result in the footer.\n *\n * @default \"Show Result\"\n * @public\n */\n @property()\n resultBtnLabel?: string;\n\n /**\n * Defines the filter name of the component.\n *\n * @default \"\"\n * @public\n */\n @property()\n filterName!: string;\n\n /**\n * Defines the filter name prefix of the component.\n *\n * @default \"\"\n * @public\n */\n @property()\n filterNamePrefix!: string;\n\n /**\n * Defines whether the component is in disabled state.\n *\n * @default false\n * @public\n */\n @property({ type: Boolean })\n disabled: boolean = false;\n\n /**\n * Defines whether the dropdown is open or not.\n *\n * @default false\n * @private\n */\n @property({ type: Boolean })\n _open: boolean = false;\n\n /**\n * Hides the result button in the footer.\n *\n * @type {boolean}\n * @default false\n * @public\n */\n @property({ type: Boolean })\n hideResultBtn: boolean = false;\n\n /**\n * Hides the reset button in the footer.\n *\n * @type {boolean}\n * @default false\n * @public\n */\n @property({ type: Boolean })\n hideResetBtn: boolean = false;\n\n /**\n * Defines the accessible ARIA name of the component.\n *\n * @default undefined\n * @public\n */\n @property()\n accessibleName?: string;\n\n /**\n * Defines id (or many ids) of the elements that contain the ARIA name of the component.\n *\n * @default \"\"\n * @public\n */\n @property()\n accessibleNameRef!: string;\n /**\n * Allows setting a custom role.\n * @default \"None\"\n * @public\n */\n @property()\n accessibleRole: `${PopupAccessibleRole}` = PopupAccessibleRole.None;\n\n /**\n * Allows setting a custom role for dropdown trigger.\n * @default \"button\"\n * @public\n */\n @property({ type: String })\n triggerAccessibleRole: string = \"button\";\n\n /**\n * Determines whether the filter should be applied.\n * @default false\n * @private\n */\n @property({ type: Boolean })\n _shouldApplyFilter: boolean = false;\n\n /**\n * Determines whether the component should be re-rendered.\n * @default false\n * @private\n */\n @property({ type: Boolean, noAttribute: true })\n _requestRender = false;\n\n _trigger!: UDExButton;\n _search!: UDExSearch | HTMLInputElement;\n _popover!: Popover;\n _breakpointSizeXS = 640;\n _initialState: Array<initialItemState> = [];\n _list!: UDExList;\n\n onEnterDOM(): void {\n if (isDesktop()) {\n this.setAttribute(\"desktop\", \"\");\n }\n }\n\n onBeforeRendering() {\n super.onBeforeRendering();\n }\n\n onAfterRendering() {\n this._search = this.getSearch();\n this._popover = this.getPopover();\n this._trigger = this.getTriggerButton();\n this._list = this.getList();\n }\n\n handleSelectAll(e:CustomEvent): void {\n this.onSelectAllHeaderPress(e);\n }\n\n handleItemPress(e:CustomEvent): void {\n this.onItemPress(e);\n\n if (this.modeSingleSelect) {\n this.onDropdownClose();\n }\n }\n\n handleHeaderPress(e:CustomEvent): void {\n this.onHeaderPress(e);\n }\n\n handleValueSearch(e:CustomEvent<{ value: string }>): void {\n this.onSearch(e.detail.value);\n }\n\n handleSubmitSearch(): void {\n this.onDropdownClose();\n this.onSubmitSearch();\n }\n\n handleResetSearch(): void {\n this.onResetSearch();\n }\n\n handleReset(): void {\n this.onDropdownClose();\n this.fireDecoratorEvent(\"reset-click\", {\n restoredItems: this.selectedItems,\n });\n this.onReset();\n }\n\n handleResult(): void {\n this._shouldApplyFilter = true;\n this.onDropdownClose();\n this.fireDecoratorEvent(\"result-click\", {\n selectedItems: this.selectedItems,\n });\n }\n\n handleKeyDownList(e: KeyboardEvent): void {\n const isTabNextPress = isTabNext(e) && !this.hasFooterButtons;\n const isTabPrevPress = isTabPrevious(e) && !this._search;\n const target = e.target as HTMLElement;\n const isSearchResetTrigger = target === this._search;\n if ((isTabNextPress && (!isSearchResetTrigger || this.isListEmpty)) || isTabPrevPress) {\n this.onDropdownClose(e);\n }\n }\n\n handleKeyDownSearch(keyEvent: CustomEvent<UDExSearchKeydownEventDetail>): void {\n const { detail: { e } } = keyEvent;\n if (isTabPrevious(e) || isEscape(e)) {\n this.onDropdownClose(e);\n }\n }\n\n handleKeyDownResultBtn(e: KeyboardEvent): void {\n e.stopPropagation();\n if (isEscape(e) || (isTabNext(e) && !this.hasResetBtn)) {\n this.onDropdownClose(e);\n }\n }\n\n handleKeyDownResetBtn(e: KeyboardEvent): void {\n e.stopPropagation();\n if (isEscape(e) || isTabNext(e)) {\n this.onDropdownClose(e);\n }\n }\n\n handleTriggerClick(): void {\n this.toggleDropdown();\n }\n\n handleTriggerKeydown(e: KeyboardEvent): void {\n if (isSpace(e) || isEnter(e)) {\n e.preventDefault();\n this.toggleDropdown();\n }\n }\n\n toggleDropdown(): void {\n this._open = !this._open;\n\n if (this._open) {\n this._trigger.classList.add(\"udex-filter-menu__trigger-active\");\n this._popover.opener = this._trigger;\n this._popover.open = true;\n } else {\n this.onDropdownClose();\n }\n }\n\n onDropdownClose(e?: KeyboardEvent): void {\n if (this._popover.open) {\n if (e && (isTabPrevious(e) || isEscape(e))) {\n e.preventDefault();\n this._popover.open = false;\n } else {\n this._popover.open = false;\n }\n }\n }\n\n _dropdownBeforeOpen(): void {\n if (this.preventPageScroll) {\n this._managePopupListeners(UDExPopoverPart.Header, \"addEventListener\");\n this._managePopupListeners(UDExPopoverPart.Footer, \"addEventListener\");\n }\n\n if (this.height) {\n this._setContentHeight();\n }\n\n this._initialState = this._getInitialState(this.items);\n this.fireDecoratorEvent(\"before-open\");\n }\n\n _dropdownAfterOpen(): void {\n const popoverLeftOffset = +this._popover.style.left.split(\"px\")[0];\n if (this._popover.offsetWidth + popoverLeftOffset < this._breakpointSizeXS) {\n this.style.setProperty(\"--udex-filter-menu-popover-left-offset\", `${this._popover.style.left}`);\n }\n if (this.modeMultiSelect) {\n this._focusFirstInteractiveElement();\n }\n if (this.modeSingleSelect && !this._search) {\n this.activeItem?.focus();\n }\n this._handleDropdownScroll();\n this.fireDecoratorEvent(\"after-open\");\n }\n\n _focusFirstInteractiveElement(): void {\n if (this.showSearch && this._search) {\n this._focusSearchInput();\n return;\n }\n\n this.focusFirstItem();\n }\n\n _focusSearchInput(): void {\n const input = this._search.shadowRoot?.querySelector(\"[id='search-input']\") as HTMLInputElement;\n input.focus();\n }\n\n _getInitialState(items: Array<UDExListItemBase | UDExListGroupHeaderBase>): Array<initialItemState> {\n return items.flatMap(item => {\n if (item.isGroup) {\n const groupState: initialItemState = {\n id: item._id,\n selected: item.selected,\n indeterminate: item.indeterminate,\n collapsed: item.collapsed,\n _filtered: item._filtered,\n };\n const subItemsState = (item as UDExListGroupHeaderBase).getItems().map(subItem => ({\n id: subItem._id,\n selected: subItem.selected,\n }));\n return [groupState, ...subItemsState];\n }\n return {\n id: item._id,\n selected: item.selected,\n };\n });\n }\n\n _setInitialListState(): void {\n this.getSlottedItems(this.items).forEach((item, index) => {\n const initialState = this._initialState[index];\n if (item._id === initialState?.id) {\n item.selected = initialState.selected;\n if (item.isGroup) {\n item.indeterminate = initialState.indeterminate;\n }\n }\n });\n }\n\n _setInitialState(): void {\n this._setInitialListState();\n this._requestRender = true;\n }\n\n _dropdownBeforeClose(): void {\n this.fireDecoratorEvent(\"before-close\");\n }\n\n _dropdownAfterClose(): void {\n if (this.preventPageScroll) {\n this._managePopupListeners(UDExPopoverPart.Header, \"removeEventListener\");\n this._managePopupListeners(UDExPopoverPart.Footer, \"removeEventListener\");\n }\n\n if (!this._shouldApplyFilter && this.modeMultiSelect && !this.modeSelectAll) {\n this._setInitialState();\n }\n\n this._shouldApplyFilter = false;\n this._open = false;\n this._trigger.classList.remove(\"udex-filter-menu__trigger-active\");\n this.fireDecoratorEvent(\"after-close\");\n }\n\n /**\n * Close the dropdown.\n * @public\n */\n close(): void {\n this.onDropdownClose();\n }\n\n get disableAllowTargetOverlap(): boolean {\n return !this.disableTargetOverlap;\n }\n\n get hasFilterNamePrefix(): boolean {\n return !!this.filterNamePrefix?.length;\n }\n\n get getResultLabelText(): string {\n return this.resultBtnLabel !== undefined && this.resultBtnLabel.length > 0 && this.resultBtnLabel ? this.resultBtnLabel : translate(UDExFilterMenu, SHOW_RESULTS);\n }\n\n get getResetLabelText(): string {\n return this.resetBtnLabel !== undefined && this.resetBtnLabel.length > 0 ? this.resetBtnLabel : translate(UDExFilterMenu, RESET);\n }\n\n get _iconAccessibleNameText(): string {\n return translate(UDExFilterMenu, SELECT_OPTIONS);\n }\n\n /**\n * FilterMenu uses the ARIA tree pattern for genuinely grouped items when:\n * - MultiSelect mode (headers/items expose aria-checked), or\n * - SingleSelect mode with at least one collapsible group\n * (headers expose aria-expanded, items expose aria-selected).\n *\n * A \"Select All\" header is NOT a hierarchical group — it is a bulk-select\n * affordance for a flat list — so it must not trigger the tree pattern.\n */\n override get isTreeStructure(): boolean {\n const groups = this._filteredItems.filter(e => e.isGroup && !(e.item as UDExListGroupHeaderBase).isSelectAllHeader);\n if (!groups.length) {\n return false;\n }\n if (this.modeMultiSelect) {\n return true;\n }\n return this.modeSingleSelect\n && groups.some(e => (e.item as UDExListGroupHeaderBase).collapsible);\n }\n\n get triggerButtonAccessibleName(): string {\n return this.accessibleName || translate(UDExFilterMenu, SELECT_OPTIONS);\n }\n\n get searchableList() {\n return SearchableListBaseTemplate.call(this);\n }\n\n static get searchableListBaseTemplate() {\n return SearchableListBaseTemplate;\n }\n\n get hideActionBar(): boolean {\n return this.hideResultBtn && this.hideResetBtn;\n }\n\n get hasFooterButtons(): boolean {\n return !!this.shadowRoot!.querySelector(\"[udex-button]\");\n }\n\n get hasResetBtn(): boolean {\n return !this.hideResetBtn;\n }\n\n get modeSelectAll(): boolean {\n return !!this.querySelector<UDExFilterMenuSelectAll>(\"[udex-filter-menu-select-all]\");\n }\n\n getTriggerButton(): UDExButton {\n return this.shadowRoot!.querySelector<UDExButton>(\"#filterMenuTrigger\")!;\n }\n\n getItems(): Array<UDExListItemBase> {\n return this.getSlottedNodes<UDExListItemBase>(\"items\");\n }\n}\n\nUDExFilterMenu.define();\n\nexport default UDExFilterMenu;\nexport type { UDExFilterMenuResetClickEventDetail, UDExFilterMenuResultClickEventDetail };\n"]}
1
+ {"version":3,"file":"FilterMenu.js","sourceRoot":"","sources":["../src/FilterMenu.ts"],"names":[],"mappings":"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","sourcesContent":["import customElement from \"@ui5/webcomponents-base/dist/decorators/customElement.js\";\nimport event from \"@ui5/webcomponents-base/dist/decorators/event-strict.js\";\nimport property from \"@ui5/webcomponents-base/dist/decorators/property.js\";\nimport jsxRenderer from \"@ui5/webcomponents-base/dist/renderer/JsxRenderer.js\";\nimport { isDesktop } from \"@ui5/webcomponents-base/dist/Device.js\";\nimport {\n isTabPrevious, isTabNext, isEscape, isSpace, isEnter,\n} from \"@ui5/webcomponents-base/dist/Keys.js\";\nimport { renderFinished } from \"@ui5/webcomponents-base/dist/Render.js\";\nimport PopupAccessibleRole from \"@ui5/webcomponents/dist/types/PopupAccessibleRole.js\";\nimport Popover from \"@ui5/webcomponents/dist/Popover.js\";\nimport UDExBusyIndicator from \"./BusyIndicator.js\";\nimport Icon from \"@ui5/webcomponents/dist/Icon.js\";\nimport IllustratedMessage from \"@ui5/webcomponents-fiori/dist/IllustratedMessage.js\";\nimport \"@ui5/webcomponents-fiori/dist/illustrations/NoSearchResults.js\";\nimport UDExList from \"./List.js\";\nimport UDExListItem from \"./ListItem.js\";\nimport UDExListGroupHeader from \"./ListGroupHeader.js\";\nimport UDExFilterMenuItem from \"./FilterMenuItem.js\";\nimport UDExFilterMenuGroupHeader from \"./FilterMenuGroupHeader.js\";\nimport type { UDExSearchKeydownEventDetail } from \"./Search.js\";\nimport UDExSearch from \"./Search.js\";\nimport UDExButton from \"./Button.js\";\nimport type { UDExSearchableListBaseEvents } from \"./SearchableListBase.js\";\nimport UDExSearchableListBase from \"./SearchableListBase.js\";\nimport { UDExPopoverPart } from \"./types/SearchableListBase.js\";\nimport { Placement, HorizontalAlign } from \"./types/Dropdown.js\";\nimport { UDExListMode } from \"./types/List.js\";\nimport UDExFilterMenuSelectAll from \"./FilterMenuSelectAll.js\";\nimport UDExListSelectAll from \"./ListSelectAll.js\";\nimport UDExBadge from \"./Badge.js\";\nimport type UDExListItemBase from \"./ListItemBase.js\";\nimport { RESET, SHOW_RESULTS, SELECT_OPTIONS } from \"./generated/i18n/i18n-defaults.js\";\nimport \"@ui5/webcomponents-icons/dist/navigation-down-arrow.js\";\nimport FilterMenuTemplate from \"./FilterMenuTemplate.js\";\nimport SearchableListBaseTemplate from \"./SearchableListBaseTemplate.js\";\nimport type UDExListGroupHeaderBase from \"./ListGroupHeaderBase.js\";\nimport translate from \"./utils/translate.js\";\n\n// Styles\nimport FilterMenuCss from \"./generated/themes/FilterMenu.css.js\";\nimport SearchableListCss from \"./generated/themes/SearchableList.css.js\";\nimport getEffectiveScrollbarStyle from \"./utils/getEffectiveScrollbarStyle.js\";\n\nexport type initialItemState = {\n id: string,\n selected: boolean,\n indeterminate?: boolean,\n collapsed?: boolean,\n _filtered?: boolean,\n}\n\ntype UDExFilterMenuResultClickEventDetail = {\n selectedItems: Array<UDExListItemBase>,\n}\n\ntype UDExFilterMenuResetClickEventDetail = {\n restoredItems: Array<UDExListItemBase>,\n}\n\n/**\n * @class\n *\n * <h3 class=\"comment-api-title\">Overview</h3>\n *\n *\n * <h3>Usage</h3>\n *\n * For the <code>udex-filter-menu</code>\n * <h3>ES6 Module Import</h3>\n *\n * <code>import \"@sapudex/web-components/dist/UDExFilterMenu.js\";</code>\n *\n * @constructor\n * @extends UDExSearchableListBase\n * @tagname udex-filter-menu\n * @public\n */\n@customElement({\n tag: \"udex-filter-menu\",\n renderer: jsxRenderer,\n styles: [FilterMenuCss, SearchableListCss, getEffectiveScrollbarStyle()],\n template: FilterMenuTemplate,\n dependencies: [\n IllustratedMessage,\n Popover,\n Icon,\n UDExBusyIndicator,\n UDExFilterMenuItem,\n UDExFilterMenuGroupHeader,\n UDExFilterMenuSelectAll,\n UDExList,\n UDExListSelectAll,\n UDExListItem,\n UDExListGroupHeader,\n UDExBadge,\n UDExSearch,\n UDExButton,\n ],\n})\n\n/**\n * Fired event when the user click on a reset button on the footer.\n *\n * @public\n * @param {Array<UDExListItemBase>} restoredItems\n */\n@event(\"reset-click\", { bubbles: true })\n\n/**\n * Fired event when the user click on a result button on the footer.\n *\n * @public\n * @param {Array<UDExListItemBase>} selectedItems\n */\n@event(\"result-click\", { bubbles: true })\n\n/**\n * Fired event when the user click on Select All header item.\n *\n * @public\n */\n@event(\"select-all\", { bubbles: true })\n\n/**\n * Fired before the dropdown pane is opened.\n *\n * @public\n */\n@event(\"before-open\", { bubbles: true })\n\n/**\n * Fired after the dropdown pane is opened.\n *\n * @public\n */\n@event(\"after-open\", { bubbles: true })\n\n/**\n * Fired before the dropdown pane is closed.\n *\n * @public\n */\n@event(\"before-close\", { bubbles: true })\n\n/**\n * Fired after the dropdown pane is closed.\n *\n * @public\n */\n@event(\"after-close\", { bubbles: true })\n\nclass UDExFilterMenu extends UDExSearchableListBase {\n eventDetails!: {\n \"result-click\": UDExFilterMenuResultClickEventDetail,\n \"reset-click\": UDExFilterMenuResetClickEventDetail,\n \"before-open\": void,\n \"after-open\": void,\n \"before-close\": void,\n \"after-close\": void,\n } & UDExSearchableListBaseEvents;\n /**\n * Determines the value of the badge.\n *\n * @public\n */\n @property({ type: Number })\n badgeValue?: number;\n\n /**\n * Determines if there is no enough space, the component can be placed\n * over the target.\n *\n * @default false\n * @public\n */\n @property({ type: Boolean })\n disableTargetOverlap?: boolean;\n\n /**\n * Determines on which side the component is placed at.\n *\n * @default \"Bottom\"\n * @public\n */\n @property()\n placement: `${Placement}` = Placement.Bottom;\n\n /**\n * Determines the horizontal alignment of the component.\n *\n * @default \"Left\"\n * @public\n */\n @property()\n horizontalAlign: `${HorizontalAlign}` = HorizontalAlign.Start;\n\n /**\n * Defines the mode of the component.\n *\n * @default \"SingleSelect\"\n * @public\n */\n @property()\n mode: `${UDExListMode}` = UDExListMode.SingleSelect;\n\n /**\n * Defines the label of the button reset in the footer.\n *\n * @default \"Reset\"\n * @public\n */\n @property()\n resetBtnLabel?: string;\n\n /**\n * Defines the label of the button result in the footer.\n *\n * @default \"Show Result\"\n * @public\n */\n @property()\n resultBtnLabel?: string;\n\n /**\n * Defines the filter name of the component.\n *\n * @default \"\"\n * @public\n */\n @property()\n filterName!: string;\n\n /**\n * Defines the filter name prefix of the component.\n *\n * @default \"\"\n * @public\n */\n @property()\n filterNamePrefix!: string;\n\n /**\n * Defines whether the component is in disabled state.\n *\n * @default false\n * @public\n */\n @property({ type: Boolean })\n disabled: boolean = false;\n\n /**\n * Defines whether the dropdown is open or not.\n *\n * @default false\n * @private\n */\n @property({ type: Boolean })\n _open: boolean = false;\n\n /**\n * Hides the result button in the footer.\n *\n * @type {boolean}\n * @default false\n * @public\n */\n @property({ type: Boolean })\n hideResultBtn: boolean = false;\n\n /**\n * Hides the reset button in the footer.\n *\n * @type {boolean}\n * @default false\n * @public\n */\n @property({ type: Boolean })\n hideResetBtn: boolean = false;\n\n /**\n * Defines the accessible ARIA name of the component.\n *\n * @default undefined\n * @public\n */\n @property()\n accessibleName?: string;\n\n /**\n * Defines id (or many ids) of the elements that contain the ARIA name of the component.\n *\n * @default \"\"\n * @public\n */\n @property()\n accessibleNameRef!: string;\n /**\n * Allows setting a custom role.\n * @default \"None\"\n * @public\n */\n @property()\n accessibleRole: `${PopupAccessibleRole}` = PopupAccessibleRole.None;\n\n /**\n * Allows setting a custom role for dropdown trigger.\n * @default \"button\"\n * @public\n */\n @property({ type: String })\n triggerAccessibleRole: string = \"button\";\n\n /**\n * Determines whether the filter should be applied.\n * @default false\n * @private\n */\n @property({ type: Boolean })\n _shouldApplyFilter: boolean = false;\n\n /**\n * Determines whether the component should be re-rendered.\n * @default false\n * @private\n */\n @property({ type: Boolean, noAttribute: true })\n _requestRender = false;\n\n _trigger!: UDExButton;\n _search!: UDExSearch | HTMLInputElement;\n _popover!: Popover;\n _breakpointSizeXS = 640;\n _initialState: Array<initialItemState> = [];\n _list!: UDExList;\n\n onEnterDOM(): void {\n if (isDesktop()) {\n this.setAttribute(\"desktop\", \"\");\n }\n }\n\n onBeforeRendering() {\n super.onBeforeRendering();\n }\n\n onAfterRendering() {\n this._search = this.getSearch();\n this._popover = this.getPopover();\n this._trigger = this.getTriggerButton();\n this._list = this.getList();\n }\n\n handleSelectAll(e:CustomEvent): void {\n this.onSelectAllHeaderPress(e);\n }\n\n handleItemPress(e:CustomEvent): void {\n this.onItemPress(e);\n\n if (this.modeSingleSelect) {\n this.onDropdownClose();\n }\n }\n\n handleHeaderPress(e:CustomEvent): void {\n this.onHeaderPress(e);\n }\n\n handleValueSearch(e:CustomEvent<{ value: string }>): void {\n this.onSearch(e.detail.value);\n }\n\n handleSubmitSearch(): void {\n this.onDropdownClose();\n this.onSubmitSearch();\n }\n\n handleResetSearch(): void {\n this.onResetSearch();\n }\n\n handleReset(): void {\n this.onDropdownClose();\n this.fireDecoratorEvent(\"reset-click\", {\n restoredItems: this.selectedItems,\n });\n this.onReset();\n }\n\n handleResult(): void {\n this._shouldApplyFilter = true;\n this.onDropdownClose();\n this.fireDecoratorEvent(\"result-click\", {\n selectedItems: this.selectedItems,\n });\n }\n\n handleKeyDownList(e: KeyboardEvent): void {\n const isTabNextPress = isTabNext(e) && !this.hasFooterButtons;\n const isTabPrevPress = isTabPrevious(e) && !this._search;\n const target = e.target as HTMLElement;\n const isSearchResetTrigger = target === this._search;\n if ((isTabNextPress && (!isSearchResetTrigger || this.isListEmpty)) || isTabPrevPress) {\n this.onDropdownClose(e);\n }\n }\n\n handleKeyDownSearch(keyEvent: CustomEvent<UDExSearchKeydownEventDetail>): void {\n const { detail: { e } } = keyEvent;\n if (isTabPrevious(e) || isEscape(e)) {\n this.onDropdownClose(e);\n }\n }\n\n handleKeyDownResultBtn(e: KeyboardEvent): void {\n e.stopPropagation();\n if (isEscape(e) || (isTabNext(e) && !this.hasResetBtn)) {\n this.onDropdownClose(e);\n }\n }\n\n handleKeyDownResetBtn(e: KeyboardEvent): void {\n e.stopPropagation();\n if (isEscape(e) || isTabNext(e)) {\n this.onDropdownClose(e);\n }\n }\n\n handleTriggerClick(): void {\n this.toggleDropdown();\n }\n\n handleTriggerKeydown(e: KeyboardEvent): void {\n if (isSpace(e) || isEnter(e)) {\n e.preventDefault();\n this.toggleDropdown();\n }\n }\n\n toggleDropdown(): void {\n this._open = !this._open;\n\n if (this._open) {\n this._trigger.classList.add(\"udex-filter-menu__trigger-active\");\n this._popover.opener = this._trigger;\n this._popover.open = true;\n } else {\n this.onDropdownClose();\n }\n }\n\n onDropdownClose(e?: KeyboardEvent): void {\n if (this._popover.open) {\n if (e && (isTabPrevious(e) || isEscape(e))) {\n e.preventDefault();\n this._popover.open = false;\n } else {\n this._popover.open = false;\n }\n }\n }\n\n _dropdownBeforeOpen(): void {\n if (this.preventPageScroll) {\n this._managePopupListeners(UDExPopoverPart.Header, \"addEventListener\");\n this._managePopupListeners(UDExPopoverPart.Footer, \"addEventListener\");\n }\n\n if (this.height) {\n this._setContentHeight();\n }\n\n this._initialState = this._getInitialState(this.items);\n this.fireDecoratorEvent(\"before-open\");\n }\n\n _dropdownAfterOpen(): void {\n const popoverLeftOffset = +this._popover.style.left.split(\"px\")[0];\n if (this._popover.offsetWidth + popoverLeftOffset < this._breakpointSizeXS) {\n this.style.setProperty(\"--udex-filter-menu-popover-left-offset\", `${this._popover.style.left}`);\n }\n if (this.modeMultiSelect) {\n this._focusFirstInteractiveElement();\n }\n if (this.modeSingleSelect && !this._search) {\n this.activeItem?.focus();\n }\n this._expandCollapsedGroupsWithSelection();\n renderFinished().then(() => {\n this._handleDropdownScroll();\n }).catch(() => {});\n this.fireDecoratorEvent(\"after-open\");\n }\n\n _focusFirstInteractiveElement(): void {\n if (this.showSearch && this._search) {\n this._focusSearchInput();\n return;\n }\n\n this.focusFirstItem();\n }\n\n _focusSearchInput(): void {\n const input = this._search.shadowRoot?.querySelector(\"[id='search-input']\") as HTMLInputElement;\n input.focus();\n }\n\n _getInitialState(items: Array<UDExListItemBase | UDExListGroupHeaderBase>): Array<initialItemState> {\n return items.flatMap(item => {\n if (item.isGroup) {\n const groupState: initialItemState = {\n id: item._id,\n selected: item.selected,\n indeterminate: item.indeterminate,\n collapsed: item.collapsed,\n _filtered: item._filtered,\n };\n const subItemsState = (item as UDExListGroupHeaderBase).getItems().map(subItem => ({\n id: subItem._id,\n selected: subItem.selected,\n }));\n return [groupState, ...subItemsState];\n }\n return {\n id: item._id,\n selected: item.selected,\n };\n });\n }\n\n _setInitialListState(): void {\n this.getSlottedItems(this.items).forEach((item, index) => {\n const initialState = this._initialState[index];\n if (item._id === initialState?.id) {\n item.selected = initialState.selected;\n if (item.isGroup) {\n item.indeterminate = initialState.indeterminate;\n }\n }\n });\n }\n\n _setInitialState(): void {\n this._setInitialListState();\n this._requestRender = true;\n }\n\n _dropdownBeforeClose(): void {\n this.fireDecoratorEvent(\"before-close\");\n }\n\n _dropdownAfterClose(): void {\n if (this.preventPageScroll) {\n this._managePopupListeners(UDExPopoverPart.Header, \"removeEventListener\");\n this._managePopupListeners(UDExPopoverPart.Footer, \"removeEventListener\");\n }\n\n if (!this._shouldApplyFilter && this.modeMultiSelect && !this.modeSelectAll) {\n this._setInitialState();\n }\n\n this._shouldApplyFilter = false;\n this._open = false;\n this._trigger.classList.remove(\"udex-filter-menu__trigger-active\");\n this.fireDecoratorEvent(\"after-close\");\n }\n\n /**\n * Close the dropdown.\n * @public\n */\n close(): void {\n this.onDropdownClose();\n }\n\n get disableAllowTargetOverlap(): boolean {\n return !this.disableTargetOverlap;\n }\n\n get hasFilterNamePrefix(): boolean {\n return !!this.filterNamePrefix?.length;\n }\n\n get getResultLabelText(): string {\n return this.resultBtnLabel !== undefined && this.resultBtnLabel.length > 0 && this.resultBtnLabel ? this.resultBtnLabel : translate(UDExFilterMenu, SHOW_RESULTS);\n }\n\n get getResetLabelText(): string {\n return this.resetBtnLabel !== undefined && this.resetBtnLabel.length > 0 ? this.resetBtnLabel : translate(UDExFilterMenu, RESET);\n }\n\n get _iconAccessibleNameText(): string {\n return translate(UDExFilterMenu, SELECT_OPTIONS);\n }\n\n /**\n * FilterMenu uses the ARIA tree pattern for genuinely grouped items when:\n * - MultiSelect mode (headers/items expose aria-checked), or\n * - SingleSelect mode with at least one collapsible group\n * (headers expose aria-expanded, items expose aria-selected).\n *\n * A \"Select All\" header is NOT a hierarchical group — it is a bulk-select\n * affordance for a flat list — so it must not trigger the tree pattern.\n */\n override get isTreeStructure(): boolean {\n const groups = this._filteredItems.filter(e => e.isGroup && !(e.item as UDExListGroupHeaderBase).isSelectAllHeader);\n if (!groups.length) {\n return false;\n }\n if (this.modeMultiSelect) {\n return true;\n }\n return this.modeSingleSelect\n && groups.some(e => (e.item as UDExListGroupHeaderBase).collapsible);\n }\n\n get triggerButtonAccessibleName(): string {\n return this.accessibleName || translate(UDExFilterMenu, SELECT_OPTIONS);\n }\n\n get searchableList() {\n return SearchableListBaseTemplate.call(this);\n }\n\n static get searchableListBaseTemplate() {\n return SearchableListBaseTemplate;\n }\n\n get hideActionBar(): boolean {\n return this.hideResultBtn && this.hideResetBtn;\n }\n\n get hasFooterButtons(): boolean {\n return !!this.shadowRoot!.querySelector(\"[udex-button]\");\n }\n\n get hasResetBtn(): boolean {\n return !this.hideResetBtn;\n }\n\n get modeSelectAll(): boolean {\n return !!this.querySelector<UDExFilterMenuSelectAll>(\"[udex-filter-menu-select-all]\");\n }\n\n getTriggerButton(): UDExButton {\n return this.shadowRoot!.querySelector<UDExButton>(\"#filterMenuTrigger\")!;\n }\n\n getItems(): Array<UDExListItemBase> {\n return this.getSlottedNodes<UDExListItemBase>(\"items\");\n }\n}\n\nUDExFilterMenu.define();\n\nexport default UDExFilterMenu;\nexport type { UDExFilterMenuResetClickEventDetail, UDExFilterMenuResultClickEventDetail };\n"]}
@@ -102,6 +102,18 @@ declare class UDExHeroBanner extends UI5Element {
102
102
  */
103
103
  breadcrumbs: Slot<UDExBreadcrumbs>;
104
104
  onEnterDOM(): void;
105
+ onExitDOM(): void;
106
+ _handleSuggestionOpenedBound: () => void;
107
+ _handleSuggestionClosedBound: () => void;
108
+ _handleBackdropScrollBound: () => void;
109
+ _bodyBackdropEl: HTMLElement | null;
110
+ private _getBackdropEl;
111
+ private _updateBackdropTop;
112
+ private _addBackdropScrollListener;
113
+ private _removeBackdropScrollListener;
114
+ private _showSearchBackdrop;
115
+ private _hideSearchBackdrop;
116
+ handleBackdropClick(): void;
105
117
  _toggleMediaButton(): void;
106
118
  _calculateMediaButtonState(): void;
107
119
  _isHTMLDivElement: (element: HTMLElement) => element is HTMLDivElement;
@@ -12,6 +12,7 @@ import jsxRenderer from "@ui5/webcomponents-base/renderer/JsxRenderer.js";
12
12
  import { isSpace } from "@ui5/webcomponents-base/dist/Keys.js";
13
13
  import Icon from "@ui5/webcomponents/dist/Icon.js";
14
14
  import HeroBannerTemplate from "./HeroBannerTemplate.js";
15
+ import ensureSearchBackdropStyles from "./utils/searchBackdrop.js";
15
16
  // Styles
16
17
  import HeroBannerCss from "./generated/themes/HeroBanner.css.js";
17
18
  export var UDExImageLoadingStrategies;
@@ -36,6 +37,7 @@ let UDExHeroBanner = class UDExHeroBanner extends UI5Element {
36
37
  * @public
37
38
  */
38
39
  this.backgroundImageLoadingStrategy = UDExImageLoadingStrategies.Eager;
40
+ this._bodyBackdropEl = null;
39
41
  this._isHTMLDivElement = (element) => {
40
42
  return element.tagName === "DIV";
41
43
  };
@@ -49,6 +51,58 @@ let UDExHeroBanner = class UDExHeroBanner extends UI5Element {
49
51
  this._calculateMediaButtonState();
50
52
  });
51
53
  }
54
+ this._handleSuggestionOpenedBound = this._showSearchBackdrop.bind(this);
55
+ this._handleSuggestionClosedBound = this._hideSearchBackdrop.bind(this);
56
+ this.addEventListener("suggestion-popover-opened", this._handleSuggestionOpenedBound);
57
+ this.addEventListener("suggestion-popover-closed", this._handleSuggestionClosedBound);
58
+ }
59
+ onExitDOM() {
60
+ this.removeEventListener("suggestion-popover-opened", this._handleSuggestionOpenedBound);
61
+ this.removeEventListener("suggestion-popover-closed", this._handleSuggestionClosedBound);
62
+ this._removeBackdropScrollListener();
63
+ this._bodyBackdropEl?.remove();
64
+ this._bodyBackdropEl = null;
65
+ }
66
+ _getBackdropEl() {
67
+ if (!this._bodyBackdropEl) {
68
+ ensureSearchBackdropStyles(this.ownerDocument);
69
+ const el = this.ownerDocument.createElement("div");
70
+ el.className = "udex-search-backdrop";
71
+ el.addEventListener("click", () => this.handleBackdropClick());
72
+ this.ownerDocument.body.appendChild(el);
73
+ this._bodyBackdropEl = el;
74
+ }
75
+ return this._bodyBackdropEl;
76
+ }
77
+ _updateBackdropTop() {
78
+ if (this._bodyBackdropEl) {
79
+ this._bodyBackdropEl.style.top = `${this.getBoundingClientRect().bottom}px`;
80
+ }
81
+ }
82
+ _addBackdropScrollListener() {
83
+ this._handleBackdropScrollBound = this._updateBackdropTop.bind(this);
84
+ window.addEventListener("scroll", this._handleBackdropScrollBound, { passive: true });
85
+ }
86
+ _removeBackdropScrollListener() {
87
+ if (this._handleBackdropScrollBound) {
88
+ window.removeEventListener("scroll", this._handleBackdropScrollBound);
89
+ }
90
+ }
91
+ _showSearchBackdrop() {
92
+ const backdrop = this._getBackdropEl();
93
+ this._updateBackdropTop();
94
+ this._addBackdropScrollListener();
95
+ backdrop.style.display = "block";
96
+ }
97
+ _hideSearchBackdrop() {
98
+ this._removeBackdropScrollListener();
99
+ if (this._bodyBackdropEl) {
100
+ this._bodyBackdropEl.style.display = "none";
101
+ }
102
+ }
103
+ handleBackdropClick() {
104
+ const search = this.querySelector("[udex-search]");
105
+ search?.onClosePopover?.();
52
106
  }
53
107
  _toggleMediaButton() {
54
108
  if (this._video?.paused) {