@sapudex/web-components 0.114.2 → 0.117.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (216) hide show
  1. package/bundle.esm.js +3 -0
  2. package/dist/Avatar.d.ts +8 -1
  3. package/dist/Avatar.js +5 -2
  4. package/dist/Avatar.js.map +1 -1
  5. package/dist/CountrySelector.d.ts +1 -0
  6. package/dist/CountrySelector.js +3 -0
  7. package/dist/CountrySelector.js.map +1 -1
  8. package/dist/FilterMenu.d.ts +14 -4
  9. package/dist/FilterMenu.js +46 -7
  10. package/dist/FilterMenu.js.map +1 -1
  11. package/dist/InputGroup.js.map +1 -1
  12. package/dist/List.d.ts +7 -0
  13. package/dist/List.js +78 -18
  14. package/dist/List.js.map +1 -1
  15. package/dist/ListItem.d.ts +0 -1
  16. package/dist/ListItem.js +0 -6
  17. package/dist/ListItem.js.map +1 -1
  18. package/dist/ListItemBase.d.ts +3 -0
  19. package/dist/ListItemBase.js +12 -0
  20. package/dist/ListItemBase.js.map +1 -1
  21. package/dist/PhoneNumberField.js.map +1 -1
  22. package/dist/Search.d.ts +3 -0
  23. package/dist/Search.js +35 -10
  24. package/dist/Search.js.map +1 -1
  25. package/dist/SecondaryNavigation.d.ts +34 -46
  26. package/dist/SecondaryNavigation.js +140 -161
  27. package/dist/SecondaryNavigation.js.map +1 -1
  28. package/dist/SecondaryNavigationItem.d.ts +101 -0
  29. package/dist/SecondaryNavigationItem.js +287 -0
  30. package/dist/SecondaryNavigationItem.js.map +1 -0
  31. package/dist/SecondaryNavigationItemBase.d.ts +68 -0
  32. package/dist/SecondaryNavigationItemBase.js +78 -0
  33. package/dist/SecondaryNavigationItemBase.js.map +1 -0
  34. package/dist/SecondaryNavigationSubItem.d.ts +52 -0
  35. package/dist/SecondaryNavigationSubItem.js +102 -0
  36. package/dist/SecondaryNavigationSubItem.js.map +1 -0
  37. package/dist/SelectBox.d.ts +1 -0
  38. package/dist/SelectBox.js +13 -1
  39. package/dist/SelectBox.js.map +1 -1
  40. package/dist/StatusBadge.d.ts +67 -0
  41. package/dist/StatusBadge.js +104 -0
  42. package/dist/StatusBadge.js.map +1 -0
  43. package/dist/Tab.js +1 -1
  44. package/dist/Tab.js.map +1 -1
  45. package/dist/assets/{bundle.esm-ab45813e.js → bundle.esm-f65ae7da.js} +187 -184
  46. package/dist/assets/messagebundle_en-7249941b.js +1 -0
  47. package/dist/css/themes/Avatar.css +1 -1
  48. package/dist/css/themes/Checkbox.css +1 -1
  49. package/dist/css/themes/CountrySelector.css +1 -1
  50. package/dist/css/themes/Dropdown.css +1 -1
  51. package/dist/css/themes/FilterMenu.css +1 -1
  52. package/dist/css/themes/HeroBanner.css +1 -1
  53. package/dist/css/themes/MediaPlayer.css +1 -1
  54. package/dist/css/themes/PhoneNumberField.css +1 -1
  55. package/dist/css/themes/RatingIndicator.css +1 -1
  56. package/dist/css/themes/Search.css +1 -1
  57. package/dist/css/themes/SecondaryNavigation.css +1 -1
  58. package/dist/css/themes/SecondaryNavigationItem.css +1 -0
  59. package/dist/css/themes/SecondaryNavigationSubItem.css +1 -0
  60. package/dist/css/themes/Slider.css +1 -1
  61. package/dist/css/themes/StatusBadge.css +1 -0
  62. package/dist/custom-elements-internal.json +604 -2
  63. package/dist/custom-elements.json +574 -2
  64. package/dist/generated/assets/i18n/messagebundle_en.json +1 -1
  65. package/dist/generated/i18n/i18n-defaults.d.ts +8 -1
  66. package/dist/generated/i18n/i18n-defaults.js +8 -1
  67. package/dist/generated/i18n/i18n-defaults.js.map +1 -1
  68. package/dist/generated/templates/CountrySelectorTemplate.lit.js +1 -1
  69. package/dist/generated/templates/CountrySelectorTemplate.lit.js.map +1 -1
  70. package/dist/generated/templates/DropdownTemplate.lit.js +1 -1
  71. package/dist/generated/templates/DropdownTemplate.lit.js.map +1 -1
  72. package/dist/generated/templates/FilterMenuTemplate.lit.js +3 -3
  73. package/dist/generated/templates/FilterMenuTemplate.lit.js.map +1 -1
  74. package/dist/generated/templates/HeroBannerTemplate.lit.js +2 -2
  75. package/dist/generated/templates/HeroBannerTemplate.lit.js.map +1 -1
  76. package/dist/generated/templates/ListGroupHeaderTemplate.lit.js +4 -4
  77. package/dist/generated/templates/ListGroupHeaderTemplate.lit.js.map +1 -1
  78. package/dist/generated/templates/ListItemTemplate.lit.js +1 -1
  79. package/dist/generated/templates/ListItemTemplate.lit.js.map +1 -1
  80. package/dist/generated/templates/ListSelectAllTemplate.lit.js +1 -1
  81. package/dist/generated/templates/ListSelectAllTemplate.lit.js.map +1 -1
  82. package/dist/generated/templates/SearchSuggestionsTemplate.lit.js +1 -1
  83. package/dist/generated/templates/SearchSuggestionsTemplate.lit.js.map +1 -1
  84. package/dist/generated/templates/SearchTemplate.lit.js +2 -2
  85. package/dist/generated/templates/SearchTemplate.lit.js.map +1 -1
  86. package/dist/generated/templates/SearchableListBaseTemplate.lit.js +2 -2
  87. package/dist/generated/templates/SearchableListBaseTemplate.lit.js.map +1 -1
  88. package/dist/generated/templates/SecondaryNavigationItemTemplate.lit.d.ts +4 -0
  89. package/dist/generated/templates/SecondaryNavigationItemTemplate.lit.js +11 -0
  90. package/dist/generated/templates/SecondaryNavigationItemTemplate.lit.js.map +1 -0
  91. package/dist/generated/templates/SecondaryNavigationSubItemTemplate.lit.d.ts +4 -0
  92. package/dist/generated/templates/SecondaryNavigationSubItemTemplate.lit.js +9 -0
  93. package/dist/generated/templates/SecondaryNavigationSubItemTemplate.lit.js.map +1 -0
  94. package/dist/generated/templates/SecondaryNavigationTemplate.lit.js +7 -10
  95. package/dist/generated/templates/SecondaryNavigationTemplate.lit.js.map +1 -1
  96. package/dist/generated/templates/SelectBoxTemplate.lit.js +1 -1
  97. package/dist/generated/templates/SelectBoxTemplate.lit.js.map +1 -1
  98. package/dist/generated/templates/StatusBadgeTemplate.lit.d.ts +4 -0
  99. package/dist/generated/templates/StatusBadgeTemplate.lit.js +5 -0
  100. package/dist/generated/templates/StatusBadgeTemplate.lit.js.map +1 -0
  101. package/dist/generated/themes/Avatar.css.js +1 -1
  102. package/dist/generated/themes/Avatar.css.js.map +1 -1
  103. package/dist/generated/themes/Checkbox.css.js +1 -1
  104. package/dist/generated/themes/Checkbox.css.js.map +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/Dropdown.css.js +1 -1
  108. package/dist/generated/themes/Dropdown.css.js.map +1 -1
  109. package/dist/generated/themes/FilterMenu.css.js +1 -1
  110. package/dist/generated/themes/FilterMenu.css.js.map +1 -1
  111. package/dist/generated/themes/HeroBanner.css.js +1 -1
  112. package/dist/generated/themes/HeroBanner.css.js.map +1 -1
  113. package/dist/generated/themes/MediaPlayer.css.js +1 -1
  114. package/dist/generated/themes/MediaPlayer.css.js.map +1 -1
  115. package/dist/generated/themes/PhoneNumberField.css.js +1 -1
  116. package/dist/generated/themes/PhoneNumberField.css.js.map +1 -1
  117. package/dist/generated/themes/RatingIndicator.css.js +1 -1
  118. package/dist/generated/themes/RatingIndicator.css.js.map +1 -1
  119. package/dist/generated/themes/Search.css.js +1 -1
  120. package/dist/generated/themes/Search.css.js.map +1 -1
  121. package/dist/generated/themes/SecondaryNavigation.css.js +1 -1
  122. package/dist/generated/themes/SecondaryNavigation.css.js.map +1 -1
  123. package/dist/generated/themes/SecondaryNavigationItem.css.d.ts +3 -0
  124. package/dist/generated/themes/SecondaryNavigationItem.css.js +9 -0
  125. package/dist/generated/themes/SecondaryNavigationItem.css.js.map +1 -0
  126. package/dist/generated/themes/SecondaryNavigationSubItem.css.d.ts +3 -0
  127. package/dist/generated/themes/SecondaryNavigationSubItem.css.js +9 -0
  128. package/dist/generated/themes/SecondaryNavigationSubItem.css.js.map +1 -0
  129. package/dist/generated/themes/Slider.css.js +1 -1
  130. package/dist/generated/themes/Slider.css.js.map +1 -1
  131. package/dist/generated/themes/StatusBadge.css.d.ts +3 -0
  132. package/dist/generated/themes/StatusBadge.css.js +9 -0
  133. package/dist/generated/themes/StatusBadge.css.js.map +1 -0
  134. package/dist/i18n/messagebundle.properties +12 -1
  135. package/dist/i18n/messagebundle_en.properties +8 -1
  136. package/dist/vscode.html-custom-data.json +131 -3
  137. package/dist/web-types.json +203 -5
  138. package/package.json +1 -1
  139. package/src/Avatar.ts +12 -3
  140. package/src/CountrySelector.hbs +2 -1
  141. package/src/CountrySelector.ts +4 -1
  142. package/src/Dropdown.hbs +0 -1
  143. package/src/FilterMenu.hbs +5 -1
  144. package/src/FilterMenu.ts +60 -10
  145. package/src/HeroBanner.hbs +24 -21
  146. package/src/InputGroup.ts +6 -5
  147. package/src/List.ts +92 -21
  148. package/src/ListGroupHeader.hbs +9 -5
  149. package/src/ListItem.hbs +2 -1
  150. package/src/ListItem.ts +0 -7
  151. package/src/ListItemBase.ts +14 -0
  152. package/src/ListSelectAll.hbs +1 -0
  153. package/src/PhoneNumberField.ts +1 -1
  154. package/src/Search.hbs +3 -2
  155. package/src/Search.ts +37 -10
  156. package/src/SearchSuggestions.hbs +1 -1
  157. package/src/SearchableListBase.hbs +2 -0
  158. package/src/SecondaryNavigation.hbs +50 -72
  159. package/src/SecondaryNavigation.ts +171 -195
  160. package/src/SecondaryNavigationItem.hbs +63 -0
  161. package/src/SecondaryNavigationItem.ts +358 -0
  162. package/src/SecondaryNavigationItemBase.ts +115 -0
  163. package/src/SecondaryNavigationSubItem.hbs +41 -0
  164. package/src/SecondaryNavigationSubItem.ts +123 -0
  165. package/src/SelectBox.hbs +1 -0
  166. package/src/SelectBox.ts +16 -1
  167. package/src/StatusBadge.hbs +9 -0
  168. package/src/StatusBadge.ts +129 -0
  169. package/src/Tab.ts +1 -1
  170. package/src/generated/i18n/i18n-defaults.ts +2 -2
  171. package/src/generated/templates/CountrySelectorTemplate.lit.ts +1 -1
  172. package/src/generated/templates/DropdownTemplate.lit.ts +1 -1
  173. package/src/generated/templates/FilterMenuTemplate.lit.ts +3 -3
  174. package/src/generated/templates/HeroBannerTemplate.lit.ts +2 -2
  175. package/src/generated/templates/ListGroupHeaderTemplate.lit.ts +4 -4
  176. package/src/generated/templates/ListItemTemplate.lit.ts +1 -1
  177. package/src/generated/templates/ListSelectAllTemplate.lit.ts +1 -1
  178. package/src/generated/templates/SearchSuggestionsTemplate.lit.ts +1 -1
  179. package/src/generated/templates/SearchTemplate.lit.ts +2 -2
  180. package/src/generated/templates/SearchableListBaseTemplate.lit.ts +2 -2
  181. package/src/generated/templates/SecondaryNavigationItemTemplate.lit.ts +16 -0
  182. package/src/generated/templates/SecondaryNavigationSubItemTemplate.lit.ts +14 -0
  183. package/src/generated/templates/SecondaryNavigationTemplate.lit.ts +7 -10
  184. package/src/generated/templates/SelectBoxTemplate.lit.ts +1 -1
  185. package/src/generated/templates/StatusBadgeTemplate.lit.ts +10 -0
  186. package/src/generated/themes/Avatar.css.ts +1 -1
  187. package/src/generated/themes/Checkbox.css.ts +1 -1
  188. package/src/generated/themes/CountrySelector.css.ts +1 -1
  189. package/src/generated/themes/Dropdown.css.ts +1 -1
  190. package/src/generated/themes/FilterMenu.css.ts +1 -1
  191. package/src/generated/themes/HeroBanner.css.ts +1 -1
  192. package/src/generated/themes/MediaPlayer.css.ts +1 -1
  193. package/src/generated/themes/PhoneNumberField.css.ts +1 -1
  194. package/src/generated/themes/RatingIndicator.css.ts +1 -1
  195. package/src/generated/themes/Search.css.ts +1 -1
  196. package/src/generated/themes/SecondaryNavigation.css.ts +1 -1
  197. package/src/generated/themes/SecondaryNavigationItem.css.ts +13 -0
  198. package/src/generated/themes/SecondaryNavigationSubItem.css.ts +13 -0
  199. package/src/generated/themes/Slider.css.ts +1 -1
  200. package/src/generated/themes/StatusBadge.css.ts +13 -0
  201. package/src/i18n/messagebundle.properties +12 -1
  202. package/src/i18n/messagebundle_en.properties +8 -1
  203. package/src/themes/Avatar.css +20 -0
  204. package/src/themes/Checkbox.css +12 -0
  205. package/src/themes/CountrySelector.css +4 -0
  206. package/src/themes/Dropdown.css +2 -0
  207. package/src/themes/FilterMenu.css +10 -0
  208. package/src/themes/HeroBanner.css +42 -6
  209. package/src/themes/MediaPlayer.css +3 -2
  210. package/src/themes/PhoneNumberField.css +4 -0
  211. package/src/themes/Search.css +11 -7
  212. package/src/themes/SecondaryNavigation.css +44 -302
  213. package/src/themes/SecondaryNavigationItem.css +220 -0
  214. package/src/themes/SecondaryNavigationSubItem.css +118 -0
  215. package/src/themes/StatusBadge.css +135 -0
  216. package/dist/assets/messagebundle_en-26cd7a92.js +0 -1
package/src/FilterMenu.ts CHANGED
@@ -7,6 +7,7 @@ import "@ui5/webcomponents/dist/Icon.js";
7
7
  import "@ui5/webcomponents-icons/dist/navigation-down-arrow.js";
8
8
  import { isDesktop } from "@ui5/webcomponents-base/dist/Device.js";
9
9
  import Integer from "@ui5/webcomponents-base/dist/types/Integer.js";
10
+ import { isTabPrevious, isTabNext, isEscape } from "@ui5/webcomponents-base/dist/Keys.js";
10
11
  import PopupAccessibleRole from "@ui5/webcomponents/dist/types/PopupAccessibleRole.js";
11
12
  import UDExDropdown from "./Dropdown.js";
12
13
  import UDExList from "./List.js";
@@ -14,14 +15,15 @@ import UDExListItem from "./ListItem.js";
14
15
  import UDExListGroupHeader from "./ListGroupHeader.js";
15
16
  import UDExFilterMenuItem from "./FilterMenuItem.js";
16
17
  import UDExFilterMenuGroupHeader from "./FilterMenuGroupHeader.js";
17
- import Search from "./Search.js";
18
- import Button from "./Button.js";
18
+ import UDExSearch from "./Search.js";
19
+ import UDEButton from "./Button.js";
19
20
  import UDExSearchableListBase from "./SearchableListBase.js";
20
21
  import { PlacementType, HorizontalAlign } from "./types/Dropdown.js";
21
22
  import { ListMode } from "./types/List.js";
22
23
  import UDExFilterMenuSelectAll from "./FilterMenuSelectAll.js";
23
24
  import UDExListSelectAll from "./ListSelectAll.js";
24
25
  import UDExBadge from "./Badge.js";
26
+ import UDExListItemBase from "./ListItemBase.js";
25
27
 
26
28
  import { RESET, SHOW_RESULTS, SELECT_OPTIONS } from "./generated/i18n/i18n-defaults.js";
27
29
  import FilterMenuTemplate from "./generated/templates/FilterMenuTemplate.lit.js";
@@ -64,8 +66,8 @@ import SearchableListCss from "./generated/themes/SearchableList.css.js";
64
66
  UDExListItem,
65
67
  UDExListGroupHeader,
66
68
  UDExBadge,
67
- Search,
68
- Button,
69
+ UDExSearch,
70
+ UDEButton,
69
71
  ],
70
72
  })
71
73
 
@@ -274,11 +276,13 @@ class UDExFilterMenu extends UDExSearchableListBase {
274
276
  accessibleRole!: `${PopupAccessibleRole}`;
275
277
 
276
278
  _dropdown!: UDExDropdown;
277
- _search!: Search;
279
+ _search!: UDExSearch;
280
+ _hasFooterButtons!: boolean;
278
281
 
279
282
  onAfterRendering() {
280
283
  this._dropdown = this.getDropdown();
281
284
  this._search = this.getSearch();
285
+ this._hasFooterButtons = this.hasFooterButtons;
282
286
  }
283
287
 
284
288
  onEnterDOM(): void {
@@ -300,7 +304,7 @@ class UDExFilterMenu extends UDExSearchableListBase {
300
304
  this.onItemPress(e);
301
305
 
302
306
  if (this.modeSingleSelect) {
303
- this._dropdown.onClose();
307
+ this.onDropdownClose();
304
308
  }
305
309
  }
306
310
 
@@ -313,7 +317,7 @@ class UDExFilterMenu extends UDExSearchableListBase {
313
317
  }
314
318
 
315
319
  handleSubmitSearch() {
316
- this._dropdown.onClose();
320
+ this.onDropdownClose();
317
321
  this.onSubmitSearch();
318
322
  }
319
323
 
@@ -337,7 +341,37 @@ class UDExFilterMenu extends UDExSearchableListBase {
337
341
  }
338
342
  }
339
343
 
340
- handleTriggerClick() {
344
+ handleKeyDownList(e: KeyboardEvent) {
345
+ const isTabNextPress = isTabNext(e) && !this._hasFooterButtons;
346
+ const isTabPrevPress = isTabPrevious(e) && !this._search;
347
+
348
+ if (isTabNextPress || isTabPrevPress) {
349
+ this.onDropdownClose();
350
+ }
351
+ }
352
+
353
+ handleKeyDownSearch(e: CustomEvent) {
354
+ const keyEvent = e.detail as KeyboardEvent;
355
+ if (isTabPrevious(keyEvent) || isEscape(keyEvent)) {
356
+ this.onDropdownClose();
357
+ }
358
+ }
359
+
360
+ handleKeyDownResultBtn(e: KeyboardEvent) {
361
+ e.stopPropagation();
362
+ if (isTabNext(e) && !this.hasResetBtn) {
363
+ this.onDropdownClose();
364
+ }
365
+ }
366
+
367
+ handleKeyDownResetBtn(e: KeyboardEvent) {
368
+ e.stopPropagation();
369
+ if (isTabNext(e)) {
370
+ this.onDropdownClose();
371
+ }
372
+ }
373
+
374
+ onDropdownClose() {
341
375
  if (this._dropdown.open) {
342
376
  this._dropdown.onClose();
343
377
  }
@@ -347,8 +381,8 @@ class UDExFilterMenu extends UDExSearchableListBase {
347
381
  return this.shadowRoot!.querySelector<UDExDropdown>("udex-dropdown")!;
348
382
  }
349
383
 
350
- getSearch(): Search {
351
- return this.shadowRoot!.querySelector<Search>("udex-search")!;
384
+ getSearch(): UDExSearch {
385
+ return this.shadowRoot!.querySelector<UDExSearch>("udex-search")!;
352
386
  }
353
387
 
354
388
  _dropdownBeforeOpen() {
@@ -399,6 +433,22 @@ class UDExFilterMenu extends UDExSearchableListBase {
399
433
  return this.hideResultBtn && this.hideResetBtn;
400
434
  }
401
435
 
436
+ get hasFooterButtons(): boolean {
437
+ return (this.hasResultBtn || this.hasResetBtn) && this.modeMultiSelect;
438
+ }
439
+
440
+ get hasResultBtn(): boolean {
441
+ return !this.hideResultBtn && !this.disabledResultBtn;
442
+ }
443
+
444
+ get hasResetBtn(): boolean {
445
+ return !this.hideResetBtn;
446
+ }
447
+
448
+ getItems(): Array<UDExListItemBase> {
449
+ return this.getSlottedNodes<UDExListItemBase>("items");
450
+ }
451
+
402
452
  static get searchableListBaseTemplate() {
403
453
  return SearchableListBaseTemplate;
404
454
  }
@@ -1,27 +1,30 @@
1
1
  <div class="{{heroBannerClasses}}" part="wrapper" style="background-color: {{wrapperBackgroundColor}}">
2
- {{#if hasCustomBackgroundPicture}}
3
- <slot name="backgroundPicture"></slot>
4
- {{else if hasBackgroundImage}}
5
- <picture>
6
- <img loading="{{backgroundImageLoadingStrategy}}" src="{{backgroundImage}}" part="background-image" class="udex-hero-banner__background-image" alt="{{backgroundImageLabel}}" />
7
- </picture>
8
- {{/if}}
2
+ <div class="udex-hero-banner__container">
3
+ {{#if hasCustomBackgroundPicture}}
4
+ <slot name="backgroundPicture"></slot>
5
+ {{else if hasBackgroundImage}}
6
+ <picture>
7
+ <img loading="{{backgroundImageLoadingStrategy}}" src="{{backgroundImage}}" part="background-image" class="udex-hero-banner__background-image" alt="{{backgroundImageLabel}}" />
8
+ </picture>
9
+ {{/if}}
9
10
 
10
- {{#if hasBackgroundVideo}}
11
- <div class="udex-hero-banner__background-video-wrapper" tabindex="0" @keydown={{_handleKeydown}} >
12
- <video ?autoplay="{{shouldVideoAutoplay}}" muted loop playsinline part="background-video" class="udex-hero-banner__background-video" alt="{{backgroundVideoLabel}}">
13
- <source src="{{backgroundVideo}}" type="video/mp4" />
14
- </video>
15
- <div class="udex-hero-banner__background-video-overlay"></div>
16
- {{> hero-content}}
17
- <button class="udex-hero-banner__media-button" aria-label="Play / Pause button" role="button" @click={{_toggleMediaButton}}>
18
- <ui5-icon name={{mediaButtonIconName}}></ui5-icon>
19
- </button>
11
+ {{#if hasBackgroundVideo}}
12
+ <div class="udex-hero-banner__background-video-wrapper" tabindex="0" @keydown={{_handleKeydown}} >
13
+ <video ?autoplay="{{shouldVideoAutoplay}}" muted loop playsinline part="background-video" class="udex-hero-banner__background-video" alt="{{backgroundVideoLabel}}">
14
+ <source src="{{backgroundVideo}}" type="video/mp4" />
15
+ </video>
16
+ <div class="udex-hero-banner__background-video-overlay"></div>
17
+ {{> hero-content}}
18
+ <button class="udex-hero-banner__media-button" aria-label="Play / Pause button" role="button" @click={{_toggleMediaButton}}>
19
+ <ui5-icon name={{mediaButtonIconName}}></ui5-icon>
20
+ </button>
21
+ </div>
22
+ {{else}}
23
+ <div class="udex-hero-banner__content-container">
24
+ {{> hero-content}}
25
+ </div>
26
+ {{/if}}
20
27
  </div>
21
- {{else}}
22
- {{> hero-content}}
23
- {{/if}}
24
-
25
28
  </div>
26
29
 
27
30
  {{#*inline "hero-content"}}
package/src/InputGroup.ts CHANGED
@@ -63,7 +63,7 @@ class UDExInputGroup extends UI5Element {
63
63
  * @public
64
64
  */
65
65
  @property({ type: String })
66
- groupName?: string;
66
+ groupName?: string;
67
67
 
68
68
  /**
69
69
  * Defines the orientation of the component.
@@ -72,7 +72,7 @@ class UDExInputGroup extends UI5Element {
72
72
  * @public
73
73
  */
74
74
  @property({ type: Orientation, defaultValue: Orientation.Vertical })
75
- orientation!: `${Orientation}`;
75
+ orientation!: `${Orientation}`;
76
76
 
77
77
  /**
78
78
  * Defines the value state of the component.
@@ -81,7 +81,7 @@ class UDExInputGroup extends UI5Element {
81
81
  * @public
82
82
  */
83
83
  @property({ type: GroupValueState, defaultValue: GroupValueState.Standard })
84
- valueState!: `${GroupValueState}`;
84
+ valueState!: `${GroupValueState}`;
85
85
 
86
86
  /**
87
87
  * Defines supporting text under the Input Group.
@@ -90,7 +90,7 @@ class UDExInputGroup extends UI5Element {
90
90
  * @public
91
91
  */
92
92
  @property({ type: String })
93
- supportingText!: string;
93
+ supportingText!: string;
94
94
 
95
95
  /**
96
96
  * Slot for input elements items.
@@ -98,7 +98,8 @@ class UDExInputGroup extends UI5Element {
98
98
  * @slot
99
99
  * @public
100
100
  */
101
- @slot({ type: HTMLElement, "default": true, individualSlots: true }) items!: Array<UDExCheckbox | UDExRadioButton>;
101
+ @slot({ type: HTMLElement, "default": true, individualSlots: true })
102
+ items!: Array<UDExCheckbox | UDExRadioButton>;
102
103
 
103
104
  static i18nBundle: I18nBundle;
104
105
 
package/src/List.ts CHANGED
@@ -9,6 +9,8 @@ import {
9
9
  isDown,
10
10
  isHome,
11
11
  isEnd,
12
+ isEnter,
13
+ isSpace,
12
14
  } from "@ui5/webcomponents-base/dist/Keys.js";
13
15
  import { getI18nBundle } from "@ui5/webcomponents-base/dist/i18nBundle.js";
14
16
  import type I18nBundle from "@ui5/webcomponents-base/dist/i18nBundle.js";
@@ -154,25 +156,7 @@ class UDExList extends UI5Element {
154
156
 
155
157
  handleItemPress(e: CustomEvent) {
156
158
  const clickedItem: UDExListItemBase = e.detail.item;
157
-
158
- if (this.modeSingleSelect && !this.controlled) {
159
- this.revertSelectedItems(this.getSelectedItems());
160
- clickedItem.selected = true;
161
- }
162
-
163
- if (this.modeRadioGroup && !this.controlled) {
164
- const groupHeader = clickedItem.parentElement as UDExListGroupHeaderBase;
165
- const groupItems = groupHeader.getItems() as Array<UDExListItemBase>;
166
- this.revertSelectedItems(groupItems);
167
-
168
- clickedItem.selected = true;
169
- }
170
-
171
- this.fireEvent("selection-change", {
172
- listItems: this.getItemsFromList(),
173
- selectedItems: this.getSelectedItems(),
174
- item: clickedItem,
175
- });
159
+ this.onItemPress(clickedItem);
176
160
  }
177
161
 
178
162
  handleKeyDown(e: KeyboardEvent) {
@@ -180,6 +164,15 @@ class UDExList extends UI5Element {
180
164
  this.handleDownArrow(e);
181
165
  this.handleHomeKey(e);
182
166
  this.handleEndKey(e);
167
+ this.handleEnterOrSpace(e);
168
+ }
169
+
170
+ handleEnterOrSpace(e: KeyboardEvent) {
171
+ if (isEnter(e) || isSpace(e)) {
172
+ e.preventDefault();
173
+ const clickedItem = e.target as UDExListItemBase;
174
+ this.onItemPress(clickedItem);
175
+ }
183
176
  }
184
177
 
185
178
  handleUpArrow(e: KeyboardEvent) {
@@ -193,20 +186,28 @@ class UDExList extends UI5Element {
193
186
  const nonInteractiveHeader = items[previousSelectIndex].nonInteractive;
194
187
 
195
188
  if (nonInteractiveHeader && previousSelectIndex === 0) {
189
+ this.unsetTabIndexByIndex(items, currentSelectedIndex);
190
+ this.setTabIndexByIndex(items, lastItemIndex);
196
191
  items[lastItemIndex].focus();
197
192
  return;
198
193
  }
199
194
 
200
195
  if (nonInteractiveHeader) {
196
+ this.unsetTabIndexByIndex(items, currentSelectedIndex);
197
+ this.setTabIndexByIndex(items, previousSelectIndex - 1);
201
198
  items[previousSelectIndex - 1].focus();
202
199
  return;
203
200
  }
204
201
 
205
202
  if (isHeaderItem) {
203
+ this.unsetTabIndexByIndex(items, currentSelectedIndex);
204
+ this.setTabIndexByIndex(items, previousSelectIndex);
206
205
  this.focusHeader(items[previousSelectIndex]);
207
206
  return;
208
207
  }
209
208
 
209
+ this.unsetTabIndexByIndex(items, currentSelectedIndex);
210
+ this.setTabIndexByIndex(items, previousSelectIndex);
210
211
  items[previousSelectIndex].focus();
211
212
  }
212
213
  }
@@ -221,15 +222,21 @@ class UDExList extends UI5Element {
221
222
  const nonInteractiveHeader = items[nextSelectIndex].nonInteractive;
222
223
 
223
224
  if (nonInteractiveHeader) {
225
+ this.unsetTabIndexByIndex(items, currentSelectedIndex);
226
+ this.setTabIndexByIndex(items, nextSelectIndex + 1);
224
227
  items[nextSelectIndex + 1].focus();
225
228
  return;
226
229
  }
227
230
 
228
231
  if (isHeaderItem) {
232
+ this.unsetTabIndexByIndex(items, currentSelectedIndex);
233
+ this.setTabIndexByIndex(items, nextSelectIndex);
229
234
  this.focusHeader(items[nextSelectIndex]);
230
235
  return;
231
236
  }
232
237
 
238
+ this.unsetTabIndexByIndex(items, currentSelectedIndex);
239
+ this.setTabIndexByIndex(items, nextSelectIndex);
233
240
  items[nextSelectIndex].focus();
234
241
  }
235
242
  }
@@ -238,20 +245,27 @@ class UDExList extends UI5Element {
238
245
  if (isHome(e)) {
239
246
  e.preventDefault();
240
247
  const items = this.getKeyboardNavigationItems();
248
+ const currentSelectedIndex = this.getCurrentIndex(items, e.target as UDExListItemBase);
241
249
  const firstItem = items[0];
242
250
  const isHeaderItem = firstItem.isGroup;
243
251
  const nonInteractiveItem = firstItem.nonInteractive;
244
252
 
245
253
  if (nonInteractiveItem) {
254
+ this.unsetTabIndexByIndex(items, currentSelectedIndex);
255
+ this.setTabIndexByIndex(items, 1);
246
256
  items[1].focus();
247
257
  return;
248
258
  }
249
259
 
250
260
  if (isHeaderItem) {
261
+ this.unsetTabIndexByIndex(items, currentSelectedIndex);
262
+ this.setTabIndexByIndex(items, 0);
251
263
  this.focusHeader(items[0]);
252
264
  return;
253
265
  }
254
266
 
267
+ this.unsetTabIndexByIndex(items, currentSelectedIndex);
268
+ this.setTabIndexByIndex(items, 0);
255
269
  items[0].focus();
256
270
  }
257
271
  }
@@ -260,10 +274,37 @@ class UDExList extends UI5Element {
260
274
  if (isEnd(e)) {
261
275
  e.preventDefault();
262
276
  const items = this.getKeyboardNavigationItems();
277
+ const currentSelectedIndex = this.getCurrentIndex(items, e.target as UDExListItemBase);
278
+
279
+ this.unsetTabIndexByIndex(items, currentSelectedIndex);
280
+ this.setTabIndexByIndex(items, items.length - 1);
263
281
  items[items.length - 1].focus();
264
282
  }
265
283
  }
266
284
 
285
+ onItemPress(clickedItem :UDExListItemBase) {
286
+ if (this.modeSingleSelect && !this.controlled) {
287
+ this.revertSelectedItems(this.getSelectedItems());
288
+ clickedItem.selected = true;
289
+ }
290
+
291
+ if (this.modeRadioGroup && !this.controlled) {
292
+ const groupHeader = clickedItem.parentElement as UDExListGroupHeaderBase;
293
+ const groupItems = groupHeader.getItems() as Array<UDExListItemBase>;
294
+ this.revertSelectedItems(groupItems);
295
+ clickedItem.selected = true;
296
+ }
297
+
298
+ this.resetTabIndexes();
299
+ clickedItem._tabIndex = "0";
300
+
301
+ this.fireEvent("selection-change", {
302
+ listItems: this.getItemsFromList(),
303
+ selectedItems: this.getSelectedItems(),
304
+ item: clickedItem,
305
+ });
306
+ }
307
+
267
308
  revertSelectedItems(items: Array<UDExListItemBase>) {
268
309
  items.forEach((item: UDExListItemBase) => {
269
310
  if (!item.disabled) {
@@ -277,6 +318,14 @@ class UDExList extends UI5Element {
277
318
  header.focus();
278
319
  }
279
320
 
321
+ unsetTabIndexByIndex(items: UDExListItemBase[], index: number) {
322
+ items[index]._tabIndex = "-1";
323
+ }
324
+
325
+ setTabIndexByIndex(items: UDExListItemBase[], index: number) {
326
+ items[index]._tabIndex = "0";
327
+ }
328
+
280
329
  getItems(): Array<UDExListItemBase> {
281
330
  return this.getSlottedNodes<UDExListItemBase>("items");
282
331
  }
@@ -311,15 +360,37 @@ class UDExList extends UI5Element {
311
360
  }
312
361
 
313
362
  prepareListItemsMode() {
314
- const slottedItems = this.getItemsFromList();
315
- slottedItems.forEach(item => {
363
+ this.getItemsFromList().forEach((item, index) => {
316
364
  item.mode = this.mode;
317
365
  item.controlled = this.controlled;
318
366
  item.type = this.type;
319
367
  item._icon = this.itemIcon;
368
+ item._tabIndex = this.getTabIndex(index, item);
320
369
  });
321
370
  }
322
371
 
372
+ getTabIndex(index: number, item: UDExListItemBase): string {
373
+ if ((item.modeSingleSelect || this.modeRadioGroup) && this.isGroupList && index === 1) {
374
+ return "0";
375
+ }
376
+
377
+ if (this.modeSelected && index === 0) {
378
+ return "0";
379
+ }
380
+
381
+ return "-1";
382
+ }
383
+
384
+ resetTabIndexes() {
385
+ this.getItemsFromList().forEach(item => {
386
+ item._tabIndex = "-1";
387
+ });
388
+ }
389
+
390
+ get isGroupList(): boolean {
391
+ return this.getItemsFromList().some(item => item.isGroup);
392
+ }
393
+
323
394
  get ariaLabelModeText(): string {
324
395
  if (this.modeSingleSelect || this.modeRadioGroup) {
325
396
  return UDExList.i18nBundle.getText(ARIA_LABEL_LIST_SELECTABLE);
@@ -1,6 +1,8 @@
1
1
  <li
2
2
  part="item"
3
- class="udex-list__group">
3
+ class="udex-list__group"
4
+ role="group"
5
+ aria-labelledby="group-heading">
4
6
  <ul
5
7
  class="udex-list__group-list"
6
8
  @ui5-item-press="{{getHandleGroupItemsClick}}">
@@ -15,7 +17,7 @@
15
17
 
16
18
  {{#*inline "multi-or-radio-group-header"}}
17
19
  {{#if isNonActiveHeader}}
18
- <header class="udex-list__inactive-header" role="presentation">
20
+ <header id="group-heading" class="udex-list__inactive-header">
19
21
  <span class="udex-list__header-title">{{label}}</span>
20
22
  {{#if supportingText}}
21
23
  <span class="udex-list__supporting-text ">{{supportingText}}</span>
@@ -23,11 +25,13 @@
23
25
  </header>
24
26
  {{else}}
25
27
  <udex-list-item
28
+ id="group-heading"
26
29
  _additional-class-name="{{_additionalClassName}}"
27
30
  ?selected="{{selected}}"
31
+ _tab-index="{{_effectiveTabIndex}}"
28
32
  ?indeterminate="{{indeterminate}}"
29
33
  part="group-item"
30
- role="listitem"
34
+ role="none"
31
35
  class="{{className}}"
32
36
  mode="{{mode}}"
33
37
  ?controlled="{{controlled}}"
@@ -55,8 +59,8 @@
55
59
  part="icon">
56
60
  </ui5-icon>
57
61
  {{/if}}
58
- <div class="udex-list__header" role="presentation">
59
- <span class="udex-list__header-title">{{label}}</span>
62
+ <div class="udex-list__header">
63
+ <span id="group-heading" class="udex-list__header-title">{{label}}</span>
60
64
  {{#if supportingText}}
61
65
  <span class="udex-list__supporting-text {{sizeClass}}">{{supportingText}}</span>
62
66
  {{/if}}
package/src/ListItem.hbs CHANGED
@@ -2,7 +2,7 @@
2
2
  <li
3
3
  part="item"
4
4
  role="{{roleItem}}"
5
- tabindex="{{_tabIndex}}"
5
+ tabindex="{{_effectiveTabIndex}}"
6
6
  aria-disabled="{{_ariaDisabled}}"
7
7
  aria-labelledby="{{_accessibleNameRef}}"
8
8
  class="{{className}}"
@@ -14,6 +14,7 @@
14
14
  @focusin="{{handleFocusIn}}"
15
15
  @focusout="{{handleFocusOut}}"
16
16
  aria-selected="{{selected}}"
17
+ aria-current="{{selected}}"
17
18
  ?divider="{{divider}}"
18
19
  _id="{{this._id}}">
19
20
  {{#if modeMultiSelect}}
package/src/ListItem.ts CHANGED
@@ -371,13 +371,6 @@ class UDExListItem extends UDExListItemBase {
371
371
  return this.disabled ? true : undefined;
372
372
  }
373
373
 
374
- get _tabIndex() {
375
- if (this.disabled) {
376
- return -1;
377
- }
378
- return 0;
379
- }
380
-
381
374
  get modeSingleContent() {
382
375
  return this.mode === ListMode.SingleContent;
383
376
  }
@@ -111,6 +111,16 @@ class UDExListItemBase extends UI5Element {
111
111
  @property({ type: String, defaultValue: "" })
112
112
  _icon?: string;
113
113
 
114
+ @property({ type: String })
115
+ _tabIndex!: number | string;
116
+
117
+ get _effectiveTabIndex() {
118
+ if (this.disabled) {
119
+ return -1;
120
+ }
121
+ return this._tabIndex;
122
+ }
123
+
114
124
  get numberOfItem() {
115
125
  return [...this.parentNode!.children].indexOf(this) + 1;
116
126
  }
@@ -127,6 +137,10 @@ class UDExListItemBase extends UI5Element {
127
137
  return this.mode === ListMode.MultiSelect;
128
138
  }
129
139
 
140
+ get modeSingleSelect() {
141
+ return this.mode === ListMode.SingleSelect;
142
+ }
143
+
130
144
  get modeMultiSelectOrRadioGroup() {
131
145
  return this.modeMultiSelect || this.modeRadioGroup;
132
146
  }
@@ -6,6 +6,7 @@
6
6
  class="{{groupListClassName}}"
7
7
  @ui5-item-press="{{handleSelectAllGroupItemsPress}}">
8
8
  <udex-list-item
9
+ _tab-index="{{_effectiveTabIndex}}"
9
10
  role="list"
10
11
  _additional-class-name="{{additionalClassName}}"
11
12
  class="{{className}}"
@@ -260,7 +260,7 @@ class UDExPhoneNumberField extends UI5Element {
260
260
 
261
261
  static i18nBundle: I18nBundle;
262
262
  _dropdown!: UDExDropdown;
263
- _handleResizeBound: ResizeObserverCallback
263
+ _handleResizeBound: ResizeObserverCallback;
264
264
 
265
265
  static async onDefine() {
266
266
  UDExPhoneNumberField.i18nBundle = await getI18nBundle("sap-ui-webcomponents-bundle");
package/src/Search.hbs CHANGED
@@ -30,9 +30,10 @@
30
30
  class="udex-search__field"
31
31
  autocomplete="off"
32
32
  role="combobox"
33
- aria-controls="suggestions-popover"
33
+ aria-controls="{{getAriaControls}}"
34
34
  aria-expanded="false"
35
35
  aria-haspopup="{{showSuggestedPopover}}"
36
+ aria-label="Search"
36
37
  placeholder="{{label}}"
37
38
  .value="{{value}}"
38
39
  @input="{{handleSearchChange}}"
@@ -56,7 +57,7 @@
56
57
  autocomplete="off"
57
58
  role="combobox"
58
59
  aria-label="{{accInfo.ariaLabel}}"
59
- aria-controls="suggestions-popover"
60
+ aria-controls="{{getAriaControls}}"
60
61
  aria-expanded="false"
61
62
  aria-haspopup="{{showSuggestedPopover}}"
62
63
  .value="{{value}}"