@sapudex/web-components 2.29.0 → 2.31.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 (270) hide show
  1. package/cypress/specs/FilterMenu.cy.tsx +39 -1
  2. package/cypress/specs/List.cy.tsx +171 -0
  3. package/cypress/specs/ListItem.cy.tsx +22 -26
  4. package/cypress/specs/PromoTile.cy.tsx +10 -0
  5. package/cypress/specs/ReviewItem.cy.tsx +48 -14
  6. package/cypress/specs/SecondaryNavigationDesktop.cy.tsx +12 -12
  7. package/cypress/specs/SelectBox.cy.tsx +76 -0
  8. package/cypress/support/component-imports.instrumented.ts +4 -0
  9. package/cypress/support/component-imports.src.ts +5 -1
  10. package/dist/Avatar.d.ts +1 -0
  11. package/dist/Avatar.js +9 -0
  12. package/dist/Avatar.js.map +1 -1
  13. package/dist/Breadcrumbs.d.ts +0 -4
  14. package/dist/Breadcrumbs.js +7 -16
  15. package/dist/Breadcrumbs.js.map +1 -1
  16. package/dist/BreadcrumbsTemplate.js +1 -1
  17. package/dist/BreadcrumbsTemplate.js.map +1 -1
  18. package/dist/FilterMenu.d.ts +2 -0
  19. package/dist/FilterMenu.js +2 -0
  20. package/dist/FilterMenu.js.map +1 -1
  21. package/dist/ImageGridTickerTemplate.js +2 -1
  22. package/dist/ImageGridTickerTemplate.js.map +1 -1
  23. package/dist/List.d.ts +4 -2
  24. package/dist/List.js +45 -12
  25. package/dist/List.js.map +1 -1
  26. package/dist/ListGroupHeader.d.ts +4 -0
  27. package/dist/ListGroupHeader.js +26 -1
  28. package/dist/ListGroupHeader.js.map +1 -1
  29. package/dist/ListGroupHeaderBase.js +1 -1
  30. package/dist/ListGroupHeaderBase.js.map +1 -1
  31. package/dist/ListItem.js +1 -1
  32. package/dist/ListItem.js.map +1 -1
  33. package/dist/ListItemBase.d.ts +40 -3
  34. package/dist/ListItemBase.js +70 -9
  35. package/dist/ListItemBase.js.map +1 -1
  36. package/dist/MastheadCountrySelector.d.ts +3 -15
  37. package/dist/MastheadCountrySelector.js +28 -72
  38. package/dist/MastheadCountrySelector.js.map +1 -1
  39. package/dist/MastheadItem.d.ts +10 -2
  40. package/dist/MastheadItem.js +26 -15
  41. package/dist/MastheadItem.js.map +1 -1
  42. package/dist/MastheadMenu.d.ts +2 -2
  43. package/dist/MastheadMenu.js +9 -9
  44. package/dist/MastheadMenu.js.map +1 -1
  45. package/dist/MastheadMenuItem.d.ts +7 -0
  46. package/dist/MastheadMenuItem.js +3 -0
  47. package/dist/MastheadMenuItem.js.map +1 -1
  48. package/dist/MastheadMobileMenu.d.ts +2 -12
  49. package/dist/MastheadMobileMenu.js +31 -116
  50. package/dist/MastheadMobileMenu.js.map +1 -1
  51. package/dist/MastheadProfileMenu.js +1 -1
  52. package/dist/MastheadProfileMenu.js.map +1 -1
  53. package/dist/MastheadShell.d.ts +1 -6
  54. package/dist/MastheadShell.js +7 -44
  55. package/dist/MastheadShell.js.map +1 -1
  56. package/dist/Pagination.d.ts +14 -1
  57. package/dist/Pagination.js +40 -7
  58. package/dist/Pagination.js.map +1 -1
  59. package/dist/PromoTile.d.ts +8 -0
  60. package/dist/PromoTile.js +4 -0
  61. package/dist/PromoTile.js.map +1 -1
  62. package/dist/PromoTileTemplate.js +3 -1
  63. package/dist/PromoTileTemplate.js.map +1 -1
  64. package/dist/ReviewItem.d.ts +8 -7
  65. package/dist/ReviewItem.js +35 -36
  66. package/dist/ReviewItem.js.map +1 -1
  67. package/dist/ReviewItemTemplate.js +3 -1
  68. package/dist/ReviewItemTemplate.js.map +1 -1
  69. package/dist/SearchableListBase.d.ts +3 -0
  70. package/dist/SearchableListBase.js +37 -1
  71. package/dist/SearchableListBase.js.map +1 -1
  72. package/dist/SecondaryNavigationItem.js +7 -1
  73. package/dist/SecondaryNavigationItem.js.map +1 -1
  74. package/dist/SelectBase.js +28 -7
  75. package/dist/SelectBase.js.map +1 -1
  76. package/dist/SelectBox.js +0 -1
  77. package/dist/SelectBox.js.map +1 -1
  78. package/dist/TextField.d.ts +1 -1
  79. package/dist/TextField.js.map +1 -1
  80. package/dist/assets/{InputSuggestions-GMbG8xQ2.js → InputSuggestions-i2kFpCfC.js} +1 -1
  81. package/dist/assets/{ListItemStandardExpandableTextTemplate-IyZB_qzJ.js → ListItemStandardExpandableTextTemplate-C1ceDaxu.js} +1 -1
  82. package/dist/assets/{bundle.esm-Dg7j0PXg.js → bundle.esm-DQ3cxywT.js} +216 -216
  83. package/dist/assets/messagebundle_en-DWAgV5VH.js +1 -0
  84. package/dist/css/themes/BreadcrumbsPopover.css +1 -1
  85. package/dist/css/themes/Dropdown.css +1 -1
  86. package/dist/css/themes/FilterMenu.css +1 -1
  87. package/dist/css/themes/ImageGridTicker.css +1 -1
  88. package/dist/css/themes/Link.css +1 -1
  89. package/dist/css/themes/ListGroupHeader.css +1 -1
  90. package/dist/css/themes/ListItem.css +1 -1
  91. package/dist/css/themes/MastheadCountrySelector.css +1 -1
  92. package/dist/css/themes/MastheadItem.css +1 -1
  93. package/dist/css/themes/MastheadProfileMenu.css +1 -1
  94. package/dist/css/themes/MastheadShell.css +1 -1
  95. package/dist/css/themes/Modal.css +1 -1
  96. package/dist/css/themes/RatingIndicator.css +1 -1
  97. package/dist/css/themes/ReviewItem.css +1 -1
  98. package/dist/css/themes/SecondaryNavigation.css +1 -1
  99. package/dist/css/themes/SecondaryNavigationItem.css +1 -1
  100. package/dist/css/themes/SecondaryNavigationSubItem.css +1 -1
  101. package/dist/css/themes/Slider.css +1 -1
  102. package/dist/custom-elements-internal.json +986 -19
  103. package/dist/custom-elements.json +734 -13
  104. package/dist/generated/assets/i18n/messagebundle_en.json +1 -1
  105. package/dist/generated/i18n/i18n-defaults.d.ts +6 -1
  106. package/dist/generated/i18n/i18n-defaults.js +6 -1
  107. package/dist/generated/i18n/i18n-defaults.js.map +1 -1
  108. package/dist/generated/templates/ListGroupHeaderTemplate.lit.js +17 -10
  109. package/dist/generated/templates/ListGroupHeaderTemplate.lit.js.map +1 -1
  110. package/dist/generated/templates/ListItemTemplate.lit.js +32 -34
  111. package/dist/generated/templates/ListItemTemplate.lit.js.map +1 -1
  112. package/dist/generated/templates/MastheadCountrySelectorTemplate.lit.js +3 -3
  113. package/dist/generated/templates/MastheadCountrySelectorTemplate.lit.js.map +1 -1
  114. package/dist/generated/templates/MastheadItemTemplate.lit.js +33 -25
  115. package/dist/generated/templates/MastheadItemTemplate.lit.js.map +1 -1
  116. package/dist/generated/templates/MastheadMenuItemTemplate.lit.js +1 -1
  117. package/dist/generated/templates/MastheadMenuItemTemplate.lit.js.map +1 -1
  118. package/dist/generated/templates/MastheadMobileMenuTemplate.lit.js +5 -5
  119. package/dist/generated/templates/MastheadMobileMenuTemplate.lit.js.map +1 -1
  120. package/dist/generated/templates/MastheadShellTemplate.lit.js +9 -10
  121. package/dist/generated/templates/MastheadShellTemplate.lit.js.map +1 -1
  122. package/dist/generated/templates/SearchableListBaseTemplate.lit.js +1 -1
  123. package/dist/generated/templates/SearchableListBaseTemplate.lit.js.map +1 -1
  124. package/dist/generated/themes/BreadcrumbsPopover.css.d.ts +1 -1
  125. package/dist/generated/themes/BreadcrumbsPopover.css.js +1 -1
  126. package/dist/generated/themes/BreadcrumbsPopover.css.js.map +1 -1
  127. package/dist/generated/themes/Dropdown.css.d.ts +1 -1
  128. package/dist/generated/themes/Dropdown.css.js +1 -1
  129. package/dist/generated/themes/Dropdown.css.js.map +1 -1
  130. package/dist/generated/themes/FilterMenu.css.d.ts +1 -1
  131. package/dist/generated/themes/FilterMenu.css.js +1 -1
  132. package/dist/generated/themes/FilterMenu.css.js.map +1 -1
  133. package/dist/generated/themes/ImageGridTicker.css.d.ts +1 -1
  134. package/dist/generated/themes/ImageGridTicker.css.js +1 -1
  135. package/dist/generated/themes/ImageGridTicker.css.js.map +1 -1
  136. package/dist/generated/themes/Link.css.d.ts +1 -1
  137. package/dist/generated/themes/Link.css.js +1 -1
  138. package/dist/generated/themes/Link.css.js.map +1 -1
  139. package/dist/generated/themes/ListGroupHeader.css.d.ts +1 -1
  140. package/dist/generated/themes/ListGroupHeader.css.js +1 -1
  141. package/dist/generated/themes/ListGroupHeader.css.js.map +1 -1
  142. package/dist/generated/themes/ListItem.css.d.ts +1 -1
  143. package/dist/generated/themes/ListItem.css.js +1 -1
  144. package/dist/generated/themes/ListItem.css.js.map +1 -1
  145. package/dist/generated/themes/MastheadCountrySelector.css.d.ts +1 -1
  146. package/dist/generated/themes/MastheadCountrySelector.css.js +1 -1
  147. package/dist/generated/themes/MastheadCountrySelector.css.js.map +1 -1
  148. package/dist/generated/themes/MastheadItem.css.d.ts +1 -1
  149. package/dist/generated/themes/MastheadItem.css.js +1 -1
  150. package/dist/generated/themes/MastheadItem.css.js.map +1 -1
  151. package/dist/generated/themes/MastheadProfileMenu.css.d.ts +1 -1
  152. package/dist/generated/themes/MastheadProfileMenu.css.js +1 -1
  153. package/dist/generated/themes/MastheadProfileMenu.css.js.map +1 -1
  154. package/dist/generated/themes/MastheadShell.css.d.ts +1 -1
  155. package/dist/generated/themes/MastheadShell.css.js +1 -1
  156. package/dist/generated/themes/MastheadShell.css.js.map +1 -1
  157. package/dist/generated/themes/Modal.css.d.ts +1 -1
  158. package/dist/generated/themes/Modal.css.js +1 -1
  159. package/dist/generated/themes/Modal.css.js.map +1 -1
  160. package/dist/generated/themes/RatingIndicator.css.d.ts +1 -1
  161. package/dist/generated/themes/RatingIndicator.css.js +1 -1
  162. package/dist/generated/themes/RatingIndicator.css.js.map +1 -1
  163. package/dist/generated/themes/ReviewItem.css.d.ts +1 -1
  164. package/dist/generated/themes/ReviewItem.css.js +1 -1
  165. package/dist/generated/themes/ReviewItem.css.js.map +1 -1
  166. package/dist/generated/themes/SecondaryNavigation.css.d.ts +1 -1
  167. package/dist/generated/themes/SecondaryNavigation.css.js +1 -1
  168. package/dist/generated/themes/SecondaryNavigation.css.js.map +1 -1
  169. package/dist/generated/themes/SecondaryNavigationItem.css.d.ts +1 -1
  170. package/dist/generated/themes/SecondaryNavigationItem.css.js +1 -1
  171. package/dist/generated/themes/SecondaryNavigationItem.css.js.map +1 -1
  172. package/dist/generated/themes/SecondaryNavigationSubItem.css.d.ts +1 -1
  173. package/dist/generated/themes/SecondaryNavigationSubItem.css.js +1 -1
  174. package/dist/generated/themes/SecondaryNavigationSubItem.css.js.map +1 -1
  175. package/dist/generated/themes/Slider.css.d.ts +1 -1
  176. package/dist/generated/themes/Slider.css.js +1 -1
  177. package/dist/generated/themes/Slider.css.js.map +1 -1
  178. package/dist/messagebundle.properties +9 -0
  179. package/dist/messagebundle_en.properties +3 -0
  180. package/dist/types/List.d.ts +0 -2
  181. package/dist/types/List.js +0 -2
  182. package/dist/types/List.js.map +1 -1
  183. package/dist/types/SearchableListBase.d.ts +1 -0
  184. package/dist/types/SearchableListBase.js.map +1 -1
  185. package/dist/vscode.html-custom-data.json +144 -85
  186. package/dist/web-types.json +303 -83
  187. package/package.json +2 -1
  188. package/src/Avatar.ts +9 -0
  189. package/src/Breadcrumbs.ts +8 -20
  190. package/src/BreadcrumbsTemplate.tsx +1 -1
  191. package/src/FilterMenu.ts +4 -0
  192. package/src/ImageGridTickerTemplate.tsx +3 -1
  193. package/src/List.ts +51 -14
  194. package/src/ListGroupHeader.hbs +128 -17
  195. package/src/ListGroupHeader.ts +31 -1
  196. package/src/ListGroupHeaderBase.ts +1 -1
  197. package/src/ListItem.hbs +15 -2
  198. package/src/ListItem.ts +1 -1
  199. package/src/ListItemBase.ts +105 -7
  200. package/src/MastheadCountrySelector.hbs +6 -3
  201. package/src/MastheadCountrySelector.ts +31 -85
  202. package/src/MastheadItem.hbs +31 -23
  203. package/src/MastheadItem.ts +28 -18
  204. package/src/MastheadMenu.ts +10 -9
  205. package/src/MastheadMenuItem.hbs +1 -0
  206. package/src/MastheadMenuItem.ts +9 -0
  207. package/src/MastheadMobileMenu.hbs +5 -6
  208. package/src/MastheadMobileMenu.ts +34 -130
  209. package/src/MastheadProfileMenu.ts +1 -1
  210. package/src/MastheadShell.hbs +9 -11
  211. package/src/MastheadShell.ts +8 -50
  212. package/src/Pagination.ts +52 -8
  213. package/src/PromoTile.ts +10 -0
  214. package/src/PromoTileTemplate.tsx +4 -1
  215. package/src/ReviewItem.ts +45 -35
  216. package/src/ReviewItemTemplate.tsx +16 -14
  217. package/src/SearchableListBase.hbs +3 -0
  218. package/src/SearchableListBase.ts +52 -1
  219. package/src/SecondaryNavigationItem.ts +1 -2
  220. package/src/SelectBase.ts +33 -7
  221. package/src/SelectBox.ts +0 -1
  222. package/src/TextField.ts +1 -1
  223. package/src/generated/i18n/i18n-defaults.ts +2 -2
  224. package/src/generated/templates/ListGroupHeaderTemplate.lit.ts +17 -10
  225. package/src/generated/templates/ListItemTemplate.lit.ts +32 -34
  226. package/src/generated/templates/MastheadCountrySelectorTemplate.lit.ts +3 -3
  227. package/src/generated/templates/MastheadItemTemplate.lit.ts +33 -25
  228. package/src/generated/templates/MastheadMenuItemTemplate.lit.ts +1 -1
  229. package/src/generated/templates/MastheadMobileMenuTemplate.lit.ts +5 -5
  230. package/src/generated/templates/MastheadShellTemplate.lit.ts +9 -10
  231. package/src/generated/templates/SearchableListBaseTemplate.lit.ts +1 -1
  232. package/src/generated/themes/BreadcrumbsPopover.css.ts +1 -1
  233. package/src/generated/themes/Dropdown.css.ts +1 -1
  234. package/src/generated/themes/FilterMenu.css.ts +1 -1
  235. package/src/generated/themes/ImageGridTicker.css.ts +1 -1
  236. package/src/generated/themes/Link.css.ts +1 -1
  237. package/src/generated/themes/ListGroupHeader.css.ts +1 -1
  238. package/src/generated/themes/ListItem.css.ts +1 -1
  239. package/src/generated/themes/MastheadCountrySelector.css.ts +1 -1
  240. package/src/generated/themes/MastheadItem.css.ts +1 -1
  241. package/src/generated/themes/MastheadProfileMenu.css.ts +1 -1
  242. package/src/generated/themes/MastheadShell.css.ts +1 -1
  243. package/src/generated/themes/Modal.css.ts +1 -1
  244. package/src/generated/themes/RatingIndicator.css.ts +1 -1
  245. package/src/generated/themes/ReviewItem.css.ts +1 -1
  246. package/src/generated/themes/SecondaryNavigation.css.ts +1 -1
  247. package/src/generated/themes/SecondaryNavigationItem.css.ts +1 -1
  248. package/src/generated/themes/SecondaryNavigationSubItem.css.ts +1 -1
  249. package/src/generated/themes/Slider.css.ts +1 -1
  250. package/src/i18n/messagebundle.properties +9 -0
  251. package/src/i18n/messagebundle_en.properties +3 -0
  252. package/src/themes/BreadcrumbsPopover.css +2 -0
  253. package/src/themes/Dropdown.css +5 -1
  254. package/src/themes/FilterMenu.css +2 -2
  255. package/src/themes/ImageGridTicker.css +2 -26
  256. package/src/themes/Link.css +2 -3
  257. package/src/themes/ListGroupHeader.css +102 -15
  258. package/src/themes/ListItem.css +67 -15
  259. package/src/themes/MastheadCountrySelector.css +3 -1
  260. package/src/themes/MastheadItem.css +88 -3
  261. package/src/themes/MastheadProfileMenu.css +1 -9
  262. package/src/themes/MastheadShell.css +0 -2
  263. package/src/themes/Modal.css +2 -1
  264. package/src/themes/ReviewItem.css +18 -1
  265. package/src/themes/SecondaryNavigation.css +6 -3
  266. package/src/themes/SecondaryNavigationItem.css +11 -10
  267. package/src/themes/SecondaryNavigationSubItem.css +3 -2
  268. package/src/types/List.ts +0 -2
  269. package/src/types/SearchableListBase.ts +1 -0
  270. package/dist/assets/messagebundle_en-DfoXjU7o.js +0 -1
@@ -68,6 +68,30 @@ const filterMenuGroup = <><UDExFilterMenu
68
68
  <a id="next-focus" href="#">Next focus</a>
69
69
  </>
70
70
 
71
+ const filterMenuGroupCollapsible = <UDExFilterMenu
72
+ id="filter-menu-group-with-search"
73
+ disable-target-overlap="true"
74
+ badge-value="2"
75
+ mode={UDExListMode.MultiSelect}
76
+ filter-name="Filter Name">
77
+ <UDExFilterMenuGroupHeader collapsible collapsed label="Programming Languages" supporting-text="Digital Builders">
78
+ <UDExFilterMenuItem label="JavaScript" supporting-text="Frontend web development"></UDExFilterMenuItem>
79
+ <UDExFilterMenuItem label="Python" supporting-text="Used in data analysis"></UDExFilterMenuItem>
80
+ <UDExFilterMenuItem label="Java" supporting-text="Building large-scale applications"></UDExFilterMenuItem>
81
+ <UDExFilterMenuItem label="Swift" supporting-text="iOS app development"></UDExFilterMenuItem>
82
+ <UDExFilterMenuItem label="C#" supporting-text="Object-oriented language"></UDExFilterMenuItem>
83
+ <UDExFilterMenuItem label="Perl" supporting-text="General-purpose scripting language"></UDExFilterMenuItem>
84
+ <UDExFilterMenuItem label="Rust" supporting-text="Focused on safety and speed"></UDExFilterMenuItem>
85
+ <UDExFilterMenuItem label="PHP" supporting-text="Server-side scripting language"></UDExFilterMenuItem>
86
+ <UDExFilterMenuItem label="Go" supporting-text="Statically typed language"></UDExFilterMenuItem>
87
+ <UDExFilterMenuItem label="Kotlin" supporting-text="For Android development"></UDExFilterMenuItem>
88
+ <UDExFilterMenuItem label="TypeScript" supporting-text="Super set of JS with static typing"></UDExFilterMenuItem>
89
+ <UDExFilterMenuItem label="Ruby" supporting-text="Readable and easy-to-use"></UDExFilterMenuItem>
90
+ <UDExFilterMenuItem label="C++" supporting-text="Efficient and flexible language"></UDExFilterMenuItem>
91
+ <UDExFilterMenuItem label="R" supporting-text="Language for statistical computing"></UDExFilterMenuItem>
92
+ </UDExFilterMenuGroupHeader>
93
+ </UDExFilterMenu>
94
+
71
95
  const filterMenuRadioGroup = <UDExFilterMenu
72
96
  id="filter-menu-radio-group"
73
97
  disable-target-overlap="true"
@@ -77,7 +101,7 @@ const filterMenuRadioGroup = <UDExFilterMenu
77
101
  <UDExFilterMenuItem label="Python"></UDExFilterMenuItem>
78
102
  <UDExFilterMenuItem label="Node.js"></UDExFilterMenuItem>
79
103
  </UDExFilterMenuGroupHeader>
80
- <UDExFilterMenuGroupHeader label="Programming Languages">
104
+ <UDExFilterMenuGroupHeader label="Programming Languages" collapsible>
81
105
  <UDExFilterMenuItem label="JavaScript" supporting-text="Frontend web development"></UDExFilterMenuItem>
82
106
  <UDExFilterMenuItem label="Python" supporting-text="Used in data analysis"></UDExFilterMenuItem>
83
107
  <UDExFilterMenuItem label="Java" supporting-text="Building large-scale applications"></UDExFilterMenuItem>
@@ -338,6 +362,20 @@ describe("Filter Menu component", () => {
338
362
  .find("udex-list-group-header")
339
363
  .should("have.attr", "selected")
340
364
  });
365
+
366
+ it('MultiSelect mode - expand collapsed items to show search result', () => {
367
+ cy.mount(filterMenuGroupCollapsible);
368
+ cy.get("[udex-filter-menu]").shadow().find(".udex-filter-menu__trigger").click();
369
+
370
+ cy.get("[udex-filter-menu]")
371
+ .shadow().find("[udex-search]")
372
+ .shadow().find(".udex-search__field")
373
+ .click().type("java");
374
+
375
+ cy.get("[udex-filter-menu]").shadow()
376
+ .find("udex-list-item").eq(0).shadow()
377
+ .find(".udex-list__item").should("not.have.attr", "collapsed");
378
+ })
341
379
  });
342
380
 
343
381
  describe("Filter Menu group", () => {
@@ -0,0 +1,171 @@
1
+ import { UDExList, UDExListGroupHeader, UDExListItem } from "../support/component-imports.js";
2
+
3
+ const collapsibleList = <UDExList id="list-group-header-collapsible" mode="MultiSelect">
4
+ <UDExListGroupHeader collapsible id="group-header-collapsible" supporting-text="Supporting text" label="Group Header">
5
+ <UDExListItem>List Item1</UDExListItem>
6
+ <UDExListItem>List Item2</UDExListItem>
7
+ </UDExListGroupHeader>
8
+ <UDExListGroupHeader collapsible collapsed id="group-header-collapsible-collapsed" supporting-text="Supporting text" label="Group Header">
9
+ <UDExListItem>List Item1</UDExListItem>
10
+ <UDExListItem>List Item2</UDExListItem>
11
+ </UDExListGroupHeader>
12
+ </UDExList>;
13
+
14
+ const collapsibleListSingleSelect = <UDExList id="list-group-header-collapsible" mode="SingleSelect">
15
+ <UDExListGroupHeader collapsible id="group-header-collapsible" supporting-text="Supporting text" label="Group Header">
16
+ <UDExListItem>List Item1</UDExListItem>
17
+ <UDExListItem>List Item2</UDExListItem>
18
+ </UDExListGroupHeader>
19
+ <UDExListGroupHeader collapsible collapsed id="group-header-collapsible-collapsed" supporting-text="Supporting text" label="Group Header">
20
+ <UDExListItem>List Item1</UDExListItem>
21
+ <UDExListItem>List Item2</UDExListItem>
22
+ </UDExListGroupHeader>
23
+ </UDExList>;
24
+
25
+ const collapsibleListSingleContent = <UDExList id="list-group-header-collapsible" mode="SingleContent">
26
+ <UDExListGroupHeader collapsible id="group-header-collapsible" supporting-text="Supporting text" label="Group Header">
27
+ <UDExListItem>List Item1</UDExListItem>
28
+ <UDExListItem>List Item2</UDExListItem>
29
+ </UDExListGroupHeader>
30
+ <UDExListGroupHeader collapsible collapsed id="group-header-collapsible-collapsed" supporting-text="Supporting text" label="Group Header">
31
+ <UDExListItem>List Item1</UDExListItem>
32
+ <UDExListItem>List Item2</UDExListItem>
33
+ </UDExListGroupHeader>
34
+ </UDExList>;
35
+
36
+ const collapsibleListRadioGroup = <UDExList id="list-group-header-collapsible" mode="RadioGroup">
37
+ <UDExListGroupHeader collapsible id="group-header-collapsible" supporting-text="Supporting text" label="Group Header">
38
+ <UDExListItem>List Item1</UDExListItem>
39
+ <UDExListItem>List Item2</UDExListItem>
40
+ </UDExListGroupHeader>
41
+ <UDExListGroupHeader collapsible collapsed id="group-header-collapsible-collapsed" supporting-text="Supporting text" label="Group Header">
42
+ <UDExListItem>List Item1</UDExListItem>
43
+ <UDExListItem>List Item2</UDExListItem>
44
+ </UDExListGroupHeader>
45
+ </UDExList>;
46
+
47
+ describe("List component - collapsible group header", () => {
48
+ it("MultiSelect - collapse and expand the group when pressing arrow keys on grouping header", () => {
49
+ cy.mount(collapsibleList);
50
+ cy.get("#group-header-collapsible").shadow().find(".udex-list__group-header").as("grouping-header");
51
+ cy.get("@grouping-header").shadow().find('.udex-list__item').realClick();
52
+ cy.get("@grouping-header").should("have.attr", "focused", "");
53
+
54
+ cy.get("@grouping-header").realPress("ArrowLeft")
55
+ .then(() => {
56
+ cy.get("@grouping-header").should("have.attr", "collapsed", "");
57
+ cy.get("#group-header-collapsible").find("udex-list-item").eq(0).should("have.attr", "collapsed", "");
58
+ });
59
+
60
+ cy.get("@grouping-header").realPress("ArrowRight")
61
+ .then(() => {
62
+ cy.get("@grouping-header").should("not.have.attr", "collapsed");
63
+ cy.get("#group-header-collapsible").find("udex-list-item").eq(0).should("not.have.attr", "collapsed", "");
64
+ });
65
+ });
66
+
67
+ it("MultiSelect - collapses the group when clicking on grouping header arrow icon", () => {
68
+ cy.mount(collapsibleList);
69
+ cy.get("#group-header-collapsible").shadow().find(".udex-list__group-header").as("grouping-header");
70
+ // First click to collapse
71
+ cy.get("@grouping-header").shadow().find('.udex-list__group-heading__icon').realClick();
72
+ cy.get("@grouping-header").should("have.attr", "collapsed", "");
73
+ cy.get("#group-header-collapsible").find("udex-list-item").eq(0).should("have.attr", "collapsed", "");
74
+
75
+ // Second click to expand
76
+ cy.get("@grouping-header").shadow().find('.udex-list__group-heading__icon').realClick();
77
+ cy.get("@grouping-header").should("not.have.attr", "collapsed", "");
78
+ cy.get("#group-header-collapsible").find("udex-list-item").eq(0).should("not.have.attr", "collapsed", "");
79
+ });
80
+
81
+ it("MultiSelect - focus on next grouping header on arrow down when previous grouping header is collapsed", () => {
82
+ cy.mount(collapsibleList);
83
+ cy.get("#group-header-collapsible-collapsed").shadow().find(".udex-list__group-header").as("grouping-header");
84
+ cy.get("@grouping-header").shadow().find('.udex-list__item').realClick();
85
+ cy.get("@grouping-header").should("have.attr", "focused", "");
86
+
87
+ cy.get("@grouping-header").realPress("ArrowDown")
88
+ .then(() => {
89
+ cy.get("#group-header-collapsible").shadow().find(".udex-list__group-header").should("have.attr", "focused", "");
90
+ });
91
+ });
92
+
93
+ it("SingleSelect - collapse and expand the group when pressing arrow keys on grouping header", () => {
94
+ cy.mount(collapsibleListSingleSelect);
95
+ cy.get("#group-header-collapsible").shadow().find(".udex-list__group-header-wrap").as("grouping-header");
96
+ cy.get("@grouping-header").realClick();
97
+
98
+ cy.get("@grouping-header").realPress("ArrowLeft")
99
+ .then(() => {
100
+ cy.get("#group-header-collapsible").should("have.attr", "collapsed", "");
101
+ });
102
+ });
103
+
104
+ it("SingleSelect - collapses the group when clicking on grouping header arrow icon", () => {
105
+ cy.mount(collapsibleListSingleSelect);
106
+ cy.get("#group-header-collapsible").shadow().find(".udex-list__group-header-wrap").as("grouping-header");
107
+ // First click to collapse
108
+ cy.get("@grouping-header").find('.udex-list__group-heading__icon').realClick();
109
+ cy.get("#group-header-collapsible").should("have.attr", "collapsed", "");
110
+
111
+ // Second click to expand
112
+ cy.get("@grouping-header").find('.udex-list__group-heading__icon').realClick();
113
+ cy.get("#group-header-collapsible").should("not.have.attr", "collapsed", "");
114
+ });
115
+
116
+ it("SingleContent - collapse and expand the group when pressing arrow keys on grouping header", () => {
117
+ cy.mount(collapsibleListSingleContent);
118
+ cy.get("#group-header-collapsible").shadow().find(".udex-list__group-header-wrap").as("grouping-header");
119
+ cy.get("@grouping-header").realClick();
120
+
121
+ cy.get("@grouping-header").realPress("ArrowLeft")
122
+ .then(() => {
123
+ cy.get("#group-header-collapsible").should("have.attr", "collapsed", "");
124
+ });
125
+
126
+ cy.get("@grouping-header").realPress("ArrowRight")
127
+ .then(() => {
128
+ cy.get("#group-header-collapsible").should("not.have.attr", "collapsed", "");
129
+ });
130
+ });
131
+
132
+ it("SingleContent - collapses the group when clicking on grouping header arrow icon", () => {
133
+ cy.mount(collapsibleListSingleContent);
134
+ cy.get("#group-header-collapsible").shadow().find(".udex-list__group-header-wrap").as("grouping-header");
135
+ // First click to collapse
136
+ cy.get("@grouping-header").find('.udex-list__group-heading__icon').realClick();
137
+ cy.get("#group-header-collapsible").should("have.attr", "collapsed", "");
138
+
139
+ // Second click to expand
140
+ cy.get("@grouping-header").find('.udex-list__group-heading__icon').realClick();
141
+ cy.get("#group-header-collapsible").should("not.have.attr", "collapsed", "");
142
+ });
143
+
144
+ it("RadioGroup - collapse and expand the group when pressing arrow keys on grouping header", () => {
145
+ cy.mount(collapsibleListRadioGroup);
146
+ cy.get("#group-header-collapsible").shadow().find(".udex-list__group-header-wrap").as("grouping-header");
147
+ cy.get("@grouping-header").realClick();
148
+
149
+ cy.get("@grouping-header").realPress("ArrowLeft")
150
+ .then(() => {
151
+ cy.get("#group-header-collapsible").should("have.attr", "collapsed", "");
152
+ });
153
+
154
+ cy.get("@grouping-header").realPress("ArrowRight")
155
+ .then(() => {
156
+ cy.get("#group-header-collapsible").should("not.have.attr", "collapsed", "");
157
+ });
158
+ });
159
+
160
+ it("RadioGroup - collapses the group when clicking on grouping header arrow icon", () => {
161
+ cy.mount(collapsibleListRadioGroup);
162
+ cy.get("#group-header-collapsible").shadow().find(".udex-list__group-header-wrap").as("grouping-header");
163
+ // First click to collapse
164
+ cy.get("@grouping-header").find('.udex-list__group-heading__icon').realClick();
165
+ cy.get("#group-header-collapsible").should("have.attr", "collapsed", "");
166
+
167
+ // Second click to expand
168
+ cy.get("@grouping-header").find('.udex-list__group-heading__icon').realClick();
169
+ cy.get("#group-header-collapsible").should("not.have.attr", "collapsed", "");
170
+ });
171
+ });
@@ -5,7 +5,7 @@ import { UDExAvatarSize } from "../../src/Avatar.js";
5
5
  import { UDExAdditionalTextState, UDExListStyleType } from "../../src/types/List.js";
6
6
  import UDExStatusBadgeValueState from "../../dist/types/StatusBadgeValueState.js";
7
7
 
8
- const defaultListItem = <UDExListItem
8
+ const defaultListItem = <UDExListItem
9
9
  id="listItem"
10
10
  accessibleName="accessible-name"
11
11
  supportingText="Supporting text"
@@ -20,7 +20,7 @@ const defaultListItem = <UDExListItem
20
20
  Default List Item
21
21
  </UDExListItem>
22
22
 
23
- const listItemSuccess = <UDExListItem
23
+ const listItemSuccess = <UDExListItem
24
24
  id="listItemSuccess"
25
25
  accessibleName="accessible-name"
26
26
  supportingText="Supporting text"
@@ -33,7 +33,7 @@ const listItemSuccess = <UDExListItem
33
33
  Default List Item
34
34
  </UDExListItem>
35
35
 
36
- const listItemError = <UDExListItem
36
+ const listItemError = <UDExListItem
37
37
  id="listItemError"
38
38
  accessibleName="accessible-name"
39
39
  supportingText="Supporting text"
@@ -46,7 +46,7 @@ const listItemError = <UDExListItem
46
46
  Default List Item
47
47
  </UDExListItem>
48
48
 
49
- const listItemWarning = <UDExListItem
49
+ const listItemWarning = <UDExListItem
50
50
  id="listItemWarning"
51
51
  accessibleName="accessible-name"
52
52
  supportingText="Supporting text"
@@ -59,7 +59,7 @@ const listItemWarning = <UDExListItem
59
59
  Default List Item
60
60
  </UDExListItem>
61
61
 
62
- const listItemWithIcons = <UDExListItem
62
+ const listItemWithIcons = <UDExListItem
63
63
  id="listItemIcons"
64
64
  accessible-name="accessible-name"
65
65
  supporting-text="Supporting text"
@@ -80,36 +80,32 @@ describe("ListItem", () => {
80
80
  cy.get("[udex-list-item]").should("exist");
81
81
  });
82
82
  });
83
-
83
+
84
84
  describe("Basic attributes", () => {
85
85
  beforeEach(() => {
86
86
  cy.mount(defaultListItem);
87
87
  });
88
-
88
+
89
89
  it("has correct supporting text", () => {
90
90
  cy.get("#listItem").shadow().find(".udex-list__supporting-text").should("have.text", "Supporting text");
91
91
  });
92
-
92
+
93
93
  it("has correct avatar", () => {
94
94
  cy.get("#listItem").shadow().find(".udex-list__avatar").should("exist");
95
95
  });
96
-
96
+
97
97
  it("has avatar of size M", () => {
98
98
  cy.get("#listItem").shadow().find(".udex-list__avatar").should("have.attr", "size", "M");
99
99
  });
100
-
100
+
101
101
  it("has avatar of shape Square", () => {
102
102
  cy.get("#listItem").shadow().find(".udex-list__avatar").should("have.attr", "shape", "Square");
103
103
  });
104
-
104
+
105
105
  it("has avatar with alternative text", () => {
106
106
  cy.get("#listItem").shadow().find(".udex-list__avatar").find("img").should("have.attr", "alt", "Person Avatar");
107
107
  });
108
-
109
- it("renders bullet marker at the start of the item", () => {
110
- cy.get("#listItem").shadow().find(".udex-list__circle").should("exist");
111
- });
112
-
108
+
113
109
  it("has correct accessibleName", () => {
114
110
  cy.get("#listItem").shadow().find(".udex-list__content-wrap").should(($wrapper) => {
115
111
  const itemId = $wrapper.attr("_id");
@@ -126,51 +122,51 @@ describe("ListItem", () => {
126
122
  cy.get("#listItem").shadow().find("udex-status-badge").should("have.attr", "size", UDExAvatarSize.M);
127
123
  });
128
124
  });
129
-
125
+
130
126
  describe("With Icons", () => {
131
127
  beforeEach(() => {
132
128
  cy.mount(listItemWithIcons);
133
129
  });
134
-
130
+
135
131
  it("renders first and second icons when both slots are filled", () => {
136
132
  cy.get("#listItemIcons").find("udex-button").should("have.length", 2);
137
133
  });
138
-
134
+
139
135
  it("becomes selected when clicking", () => {
140
136
  cy.get("#listItemIcons").shadow().find(".udex-list__item").click();
141
137
  cy.get("#listItemIcons").should("have.attr", "selected");
142
138
  });
143
-
139
+
144
140
  it("pressing Enter sets data-selected", () => {
145
141
  cy.realPress("Enter");
146
142
  cy.get("#listItemIcons").shadow().find(".udex-list__item").should("have.attr", "data-selected");
147
143
  });
148
-
144
+
149
145
  it("pressing Space sets data-selected", () => {
150
146
  cy.realPress("Space");
151
147
  cy.get("#listItemIcons").shadow().find(".udex-list__item").should("have.attr", "data-selected");
152
148
  });
153
149
  });
154
-
150
+
155
151
  describe("Additional Text States", () => {
156
152
  it("shows Information state", () => {
157
153
  cy.mount(defaultListItem);
158
154
  cy.get("#listItem").shadow().find(".udex-list__add-text").should("have.css", "color", "rgb(0, 64, 176)");
159
155
  });
160
-
156
+
161
157
  it("shows Success state", () => {
162
158
  cy.mount(listItemSuccess);
163
159
  cy.get("#listItemSuccess").shadow().find(".udex-list__add-text").should("have.css", "color", "rgb(30, 89, 47)");
164
160
  });
165
-
161
+
166
162
  it("shows Error state", () => {
167
163
  cy.mount(listItemError);
168
164
  cy.get("#listItemError").shadow().find(".udex-list__add-text").should("have.css", "color", "rgb(132, 6, 6)");
169
165
  });
170
-
166
+
171
167
  it("shows Warning state", () => {
172
168
  cy.mount(listItemWarning);
173
169
  cy.get("#listItemWarning").shadow().find(".udex-list__add-text").should("have.css", "color", "rgb(141, 42, 0)");
174
170
  });
175
171
  });
176
- });
172
+ });
@@ -8,6 +8,7 @@ const logoUrl = "http://test.com";
8
8
  const buttonLabel = "Button";
9
9
  const design = "Tertiary";
10
10
  const colorScheme = "Grey9";
11
+ const gradient = "linear-gradient(135deg, var(--udexColorBlue10) 0%,var(--udexColorBlue11) 100%)";
11
12
  const promoTile = <UDExPromoTile>Text</UDExPromoTile>;
12
13
  const simplePromoTile = <UDExPromoTile eyebrow={eyebrow} header={header}>Text</UDExPromoTile>;
13
14
  const iconPromoTile = <UDExPromoTile icon={iconName} image-label={imageLabel}>Text</UDExPromoTile>;
@@ -23,6 +24,7 @@ const pictogramPromoTile = <UDExPromoTile button={buttonLabel}>
23
24
  />
24
25
  </UDExPromoTile>;
25
26
  const darkPromoTile = <UDExPromoTile color-scheme={colorScheme} button={buttonLabel}>Text</UDExPromoTile>;
27
+ const gradientPromoTile = <UDExPromoTile background-gradient={gradient} button={buttonLabel}>Text</UDExPromoTile>;
26
28
 
27
29
  describe("Promo Tile", () => {
28
30
  it("renders simple promo tile", () => {
@@ -86,6 +88,14 @@ describe("Promo Tile", () => {
86
88
  cy.get("[udex-promo-tile]").shadow().find(".udex-promo-tile__container").should("have.class", "udex-promo-tile--dark");
87
89
  cy.get("[udex-promo-tile]").shadow().find("[udex-button]").should("have.attr", "design", "Secondary");
88
90
  });
91
+
92
+ it("renders promo tile with gradient", () => {
93
+ cy.mount(gradientPromoTile);
94
+ cy.get("[udex-promo-tile]").shadow().find(".udex-promo-tile__container")
95
+ .should("have.attr", "style")
96
+ .and("include", gradient)
97
+ .and("include", "rgb(255, 255, 255)");
98
+ });
89
99
  });
90
100
 
91
101
  describe("Promo Tile - CTA button", () => {
@@ -4,7 +4,9 @@ const defaultReviewItem = <UDExReviewItem
4
4
  id="review-item"
5
5
  rating={4}
6
6
  reviewTitle="Review title"
7
- text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris tincidunt mauris id aliquet consectetur. Nulla euismod ligula id ante feugiat ornare. Mauris enim velit, sodales eget lectus at, tristique condimentum sapien. Integer quam lacus, faucibus in lacus ut, ullamcorper dictum lacus. In ac lectus congue, blandit quam non, congue ante. Suspendisse sem mauris, tempor dignissim nisl facilisis, vulputate tincidunt turpis. In egestas nisl ut sollicitudin rutrum.">
7
+ text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris tincidunt mauris id aliquet consectetur. Nulla euismod ligula id ante feugiat ornare. Mauris enim velit, sodales eget lectus at, tristique condimentum sapien. Integer quam lacus, faucibus in lacus ut, ullamcorper dictum lacus. In ac lectus congue, blandit quam non, congue ante. Suspendisse sem mauris, tempor dignissim nisl facilisis, vulputate tincidunt turpis. In egestas nisl ut sollicitudin rutrum.
8
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris tincidunt mauris id aliquet consectetur. Nulla euismod ligula id ante feugiat ornare. Mauris enim velit, sodales eget lectus at, tristique condimentum sapien. Integer quam lacus, faucibus in lacus ut, ullamcorper dictum lacus. In ac lectus congue, blandit quam non, congue ante. Suspendisse sem mauris, tempor dignissim nisl facilisis, vulputate tincidunt turpis. In egestas nisl ut sollicitudin rutrum.
9
+ ">
8
10
  <span slot="date">Jan 7, 2025</span>
9
11
  <span slot="author">John Ford, Job Title, Company, Inc.</span>
10
12
  </UDExReviewItem>
@@ -19,6 +21,33 @@ const reviewItemWithTopRating = <UDExReviewItem
19
21
  <span slot="author">John Ford, Job Title, Company, Inc.</span>
20
22
  </UDExReviewItem>
21
23
 
24
+ const reviewItemWithTCustomContent = <UDExReviewItem
25
+ id="review-item-content"
26
+ rating={4}
27
+ reviewTitle="Review title"
28
+ showRatingTop>
29
+ <div slot="content">
30
+ <div class="truncatable-content">
31
+ <h4>AI agents that truly understand your business</h4>
32
+ <p>Amplify the impact of all your teams with Joule's AI agents that use their unique understanding
33
+ of your business context to offer expertise to perform complex processes across your business.
34
+ Reliable insights and the right business context enable Joule to act as an AI agent orchestrator,
35
+ triggering more impactful actions throughout your teams' workflows. And with SAP's agent builder,
36
+ you can scale endlessly as teams create and deploy custom AI agents tailored to their business needs.</p>
37
+ <h4>AI agents that truly understand your business</h4>
38
+ <p>SAP Business Data Cloud brings together the world's most comprehensive and mission-critical
39
+ data with the leading data platform to deliver transformational insights across all lines of business.</p>
40
+ <h4>Connect processes and empower teams with modular Cloud ERP applications</h4>
41
+ <p>Seamlessly connect your entire business value chain, from order to cash, procure to pay,
42
+ design to operate, hire to retire, and record to report, all tailored for industry nuances.
43
+ Power end-to-end processes with the most comprehensive and integrated portfolio of applications
44
+ with embedded AI capabilities.</p>
45
+ </div>
46
+ </div>
47
+ <span slot="date">Jan 7, 2025</span>
48
+ <span slot="author">John Ford, Job Title, Company, Inc.</span>
49
+ </UDExReviewItem>
50
+
22
51
 
23
52
  describe("ReviewItem", () => {
24
53
  it("renders correctly", () => {
@@ -27,47 +56,52 @@ describe("ReviewItem", () => {
27
56
  });
28
57
 
29
58
  it("shows review expander", () => {
30
- cy.mount(defaultReviewItem)
59
+ cy.mount(defaultReviewItem);
31
60
  cy.get("#review-item").shadow().find("#reviewExpander").should("be.visible")
32
61
  });
33
62
 
34
63
  it("review expander has correct text before clicking", () => {
35
- cy.mount(defaultReviewItem)
36
- const SUPPORTING_TEXT_TEST_VALUE = "Read more";
64
+ cy.mount(defaultReviewItem);
65
+ const SUPPORTING_TEXT_TEST_VALUE = "Show more";
37
66
  cy.get("#review-item").shadow().find("#reviewExpander").should("have.text", SUPPORTING_TEXT_TEST_VALUE)
38
67
  });
39
68
 
40
69
  it("renders rating on top when specified", () => {
41
- cy.mount(reviewItemWithTopRating)
70
+ cy.mount(reviewItemWithTopRating);
42
71
  cy.get("#review-item-top").shadow().find(".udex-review-item__rating-top").should("be.visible")
43
72
  });
44
73
 
74
+ it("renders custom content", () => {
75
+ cy.mount(reviewItemWithTCustomContent);
76
+ cy.get("#review-item-content").find(".truncatable-content").should("be.visible")
77
+ });
78
+
45
79
  it("renders rating on top on mobile", () => {
46
- cy.viewport(640, 640)
47
- cy.mount(defaultReviewItem)
80
+ cy.viewport(640, 640);
81
+ cy.mount(defaultReviewItem);
48
82
  cy.get("#review-item").shadow().find(".udex-review-item").then($container => {
49
- const styles = window.getComputedStyle($container[0])
50
- expect(styles.flexDirection).eqls("column")
83
+ const styles = window.getComputedStyle($container[0]);
84
+ expect(styles.flexDirection).eqls("column");
51
85
  })
52
86
  });
53
87
 
54
88
  it("review expander has correct text after clicking on expander", () => {
55
- cy.mount(defaultReviewItem)
56
- const SUPPORTING_TEXT_TEST_VALUE = "Read less";
89
+ cy.mount(defaultReviewItem);
90
+ const SUPPORTING_TEXT_TEST_VALUE = "Show less";
57
91
  cy.get("#review-item").shadow().find("#reviewExpander").click().should("have.text", SUPPORTING_TEXT_TEST_VALUE)
58
92
  });
59
93
 
60
94
  it("has maximum rating when the upper limit is exceeded", () => {
61
95
  cy.mount(<UDExReviewItem rating={500} text="Lorem ipsum dolor sit amet, consectetur adipiscing elit"></UDExReviewItem>)
62
96
  cy.get("[udex-review-item]").shadow().find("udex-rating-indicator").then($rating => {
63
- expect($rating.attr("value")).eqls("5")
97
+ expect($rating.attr("value")).eqls("5");
64
98
  })
65
99
  });
66
100
 
67
101
  it("has minimum rating when the lower limit is exceeded", () => {
68
102
  cy.mount(<UDExReviewItem rating={-500} text="Lorem ipsum dolor sit amet, consectetur adipiscing elit"></UDExReviewItem>)
69
103
  cy.get("[udex-review-item]").shadow().find("udex-rating-indicator").then($rating => {
70
- expect($rating.attr("value")).eqls("0")
104
+ expect($rating.attr("value")).eqls("0");
71
105
  })
72
106
  });
73
- })
107
+ })
@@ -262,27 +262,27 @@ describe("Desktop", () => {
262
262
  cy.get("#secondary-nav-without-breadcrumbs").shadow().find("div").first().should("have.attr", "class", rootClass)
263
263
  });
264
264
 
265
- describe("Direction atributes", () => {
265
+ describe("Direction attributes", () => {
266
266
  beforeEach(() => {
267
267
  cy.mount(secondaryNavigationWithoutBreadcrumbs)
268
268
  cy.viewport(1080, 640);
269
269
  })
270
270
 
271
- xit("has the attr \"data-horizontal-align=`right`\" when doesn't fit", () => {
272
- const moreNavItem = cy.get("#secondary-nav-without-breadcrumbs").shadow().find("[udex-secondary-navigation-item]").eq(5);
273
- moreNavItem.click();
274
- moreNavItem.shadow().find(".udex-secondary-navigation__dropdown", { timeout: 1000 })
275
- .should("have.attr", "data-horizontal-align", "right")
271
+ it("has the attr \"data-horizontal-align=`right`\" when doesn't fit", () => {
272
+ cy.get("#secondary-nav-without-breadcrumbs").shadow().find("[udex-secondary-navigation-item]").eq(5).click();
273
+ cy.get("#secondary-nav-without-breadcrumbs").shadow().find("[udex-secondary-navigation-item]").eq(5)
274
+ .shadow().find(".udex-secondary-navigation__dropdown", { timeout: 5000 })
275
+ .should("be.visible")
276
+ .should("have.attr", "data-horizontal-align", "right")
276
277
  });
277
278
 
278
279
  it("has the attr \"data-horizontal-align=`left`\" when doesn't fit in the \"rtl\" mode", () => {
279
280
  cy.get("body").invoke("attr", "dir", "rtl");
280
- const moreNavItem = cy.get("#secondary-nav-without-breadcrumbs").shadow().find("[udex-secondary-navigation-item]").eq(5);
281
- moreNavItem.
282
- click()
283
- .shadow()
284
- .find(".udex-secondary-navigation__dropdown")
285
- .should("have.attr", "data-horizontal-align", "left")
281
+ cy.get("#secondary-nav-without-breadcrumbs").shadow().find("[udex-secondary-navigation-item]").eq(5).click();
282
+ cy.get("#secondary-nav-without-breadcrumbs").shadow().find("[udex-secondary-navigation-item]").eq(5)
283
+ .shadow()
284
+ .find(".udex-secondary-navigation__dropdown")
285
+ .should("have.attr", "data-horizontal-align", "left")
286
286
  });
287
287
  })
288
288
 
@@ -25,6 +25,17 @@ const fullComponent = <UDExSelectBox
25
25
  <UDExSelectBoxItem label="R" supportingText="Language for statistical computing"></UDExSelectBoxItem>
26
26
  </UDExSelectBox>
27
27
 
28
+
29
+ const groupHeaderCollapsible = <div style="width: 350px; position:relative;"><UDExSelectBox
30
+ id="select-box"
31
+ mode={UDExListMode.MultiSelect}
32
+ label="Programming languages">
33
+ <UDExSelectBoxGroupHeader label="Programming Languages" collapsible>
34
+ <UDExSelectBoxItem label="JavaScript" supportingText="Frontend web development"></UDExSelectBoxItem>
35
+ <UDExSelectBoxItem label="Python" supportingText="Used in data analysis"></UDExSelectBoxItem>
36
+ </UDExSelectBoxGroupHeader>
37
+ </UDExSelectBox></div>
38
+
28
39
  const multiSelect = <div style="width: 350px; position:relative;">
29
40
  <a id="previous-focus" href="#">Previous focusable element</a>
30
41
  <UDExSelectBox
@@ -590,6 +601,71 @@ describe("SelectBox", () => {
590
601
  .find(".udex-list__inactive-header")
591
602
  .should("exist")
592
603
  });
604
+
605
+ it("MultiSelect mode - arrow keys navigate items when group header is nonInteractive", () => {
606
+ cy.mount(groupHeader);
607
+ cy.get("udex-select-box-group-header")
608
+ .then($el => {
609
+ const select = $el as any;
610
+ select[0].nonInteractive = true;
611
+ });
612
+
613
+ cy.get("#select-box").shadow().find(".udex-text-field__search").click();
614
+ cy.realPress("ArrowDown");
615
+
616
+ cy.get("#select-box").shadow()
617
+ .find("udex-list-item").eq(0)
618
+ .should("be.focused");
619
+
620
+ cy.realPress("ArrowDown");
621
+
622
+ cy.get("#select-box").shadow()
623
+ .find("udex-list-item").eq(1)
624
+ .should("be.focused");
625
+
626
+ cy.realPress("ArrowUp");
627
+
628
+ cy.get("#select-box").shadow()
629
+ .find("udex-list-item").eq(0)
630
+ .should("be.focused");
631
+ });
632
+
633
+ it("MultiSelect mode - arrow keys navigate through collapsible group header and its items", () => {
634
+ cy.mount(groupHeaderCollapsible);
635
+
636
+ cy.get("#select-box").shadow().find(".udex-text-field__search").click();
637
+ cy.realPress("ArrowDown");
638
+
639
+ cy.get("#select-box").shadow()
640
+ .find("udex-list-group-header").shadow()
641
+ .find(".udex-list__group-header-wrap")
642
+ .should("be.focused");
643
+
644
+ cy.realPress("ArrowDown");
645
+
646
+ cy.get("#select-box").shadow()
647
+ .find("udex-list-item").eq(0)
648
+ .should("be.focused");
649
+
650
+ cy.realPress("ArrowDown");
651
+
652
+ cy.get("#select-box").shadow()
653
+ .find("udex-list-item").eq(1)
654
+ .should("be.focused");
655
+
656
+ cy.realPress("ArrowUp");
657
+
658
+ cy.get("#select-box").shadow()
659
+ .find("udex-list-item").eq(0)
660
+ .should("be.focused");
661
+
662
+ cy.realPress("ArrowUp");
663
+
664
+ cy.get("#select-box").shadow()
665
+ .find("udex-list-group-header").shadow()
666
+ .find(".udex-list__group-header-wrap")
667
+ .should("be.focused");
668
+ });
593
669
  });
594
670
 
595
671
  describe("Select Box focus tests", () => {