@sapudex/web-components 2.2.0 → 2.3.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 (176) hide show
  1. package/bundle.esm.js +1 -0
  2. package/cypress/fixtures/event-ribbon-links.ts +5 -0
  3. package/cypress/specs/Accordion.cy.tsx +1 -2
  4. package/cypress/specs/AccordionItem.cy.tsx +1 -1
  5. package/cypress/specs/Avatar.cy.tsx +1 -1
  6. package/cypress/specs/AvatarGroup.cy.tsx +1 -2
  7. package/cypress/specs/Badge.cy.tsx +1 -1
  8. package/cypress/specs/CountrySelector.cy.tsx +10 -4
  9. package/cypress/specs/EventRibbon.cy.tsx +110 -0
  10. package/cypress/specs/Footer.cy.tsx +1 -1
  11. package/cypress/specs/ListItem.cy.tsx +1 -1
  12. package/cypress/specs/PhoneNumberField.cy.tsx +4 -2
  13. package/cypress/specs/Review.cy.tsx +1 -3
  14. package/cypress/specs/ReviewItem.cy.tsx +1 -1
  15. package/cypress/specs/SecondaryNavigationDesktop.cy.tsx +123 -116
  16. package/cypress/specs/SecondaryNavigationMobile.cy.tsx +27 -38
  17. package/cypress/specs/SelectBox.cy.tsx +93 -88
  18. package/cypress/specs/Slider.cy.tsx +1 -1
  19. package/cypress/specs/StatusBadge.cy.tsx +1 -1
  20. package/cypress/specs/StatusMessage.cy.tsx +1 -1
  21. package/cypress/specs/Switch.cy.tsx +1 -2
  22. package/cypress/specs/Table.cy.tsx +1 -9
  23. package/cypress/specs/Tag.cy.tsx +1 -1
  24. package/cypress/specs/TagGroup.cy.tsx +1 -2
  25. package/cypress/specs/TextField.cy.tsx +1 -1
  26. package/cypress/specs/Textarea.cy.tsx +1 -1
  27. package/cypress/specs/Toast.cy.tsx +1 -1
  28. package/cypress/specs/Tooltip.cy.tsx +1 -2
  29. package/cypress/specs/TruncatedText.cy.tsx +2 -1
  30. package/cypress/specs/Upload.cy.tsx +1 -2
  31. package/cypress/specs/UploadItem.cy.tsx +1 -1
  32. package/cypress/specs/Wizard.cy.tsx +7 -4
  33. package/cypress/support/component-imports.instrumented.ts +91 -0
  34. package/cypress/support/component-imports.src.ts +91 -0
  35. package/cypress/support/component.ts +1 -1
  36. package/cypress.config.ts +6 -0
  37. package/dist/AssetsVariables.js +4 -0
  38. package/dist/AssetsVariables.js.map +1 -1
  39. package/dist/Button.d.ts +7 -0
  40. package/dist/Button.js +3 -0
  41. package/dist/Button.js.map +1 -1
  42. package/dist/CountrySelector.d.ts +2 -2
  43. package/dist/CountrySelector.js +3 -1
  44. package/dist/CountrySelector.js.map +1 -1
  45. package/dist/DatePicker.js +2 -1
  46. package/dist/DatePicker.js.map +1 -1
  47. package/dist/EventRibbon.d.ts +80 -0
  48. package/dist/EventRibbon.js +111 -0
  49. package/dist/EventRibbon.js.map +1 -0
  50. package/dist/EventRibbonTemplate.d.ts +2 -0
  51. package/dist/EventRibbonTemplate.js +7 -0
  52. package/dist/EventRibbonTemplate.js.map +1 -0
  53. package/dist/HeroBanner.d.ts +1 -1
  54. package/dist/MastheadShell.d.ts +4 -1
  55. package/dist/MastheadShell.js +21 -5
  56. package/dist/MastheadShell.js.map +1 -1
  57. package/dist/Pagination.d.ts +17 -3
  58. package/dist/Pagination.js +33 -31
  59. package/dist/Pagination.js.map +1 -1
  60. package/dist/PhoneNumberField.d.ts +5 -5
  61. package/dist/PhoneNumberField.js +1 -1
  62. package/dist/PhoneNumberField.js.map +1 -1
  63. package/dist/SearchableListBase.d.ts +9 -0
  64. package/dist/SearchableListBase.js +10 -2
  65. package/dist/SearchableListBase.js.map +1 -1
  66. package/dist/TextField.d.ts +7 -0
  67. package/dist/TextField.js +3 -0
  68. package/dist/TextField.js.map +1 -1
  69. package/dist/Wizard.d.ts +20 -1
  70. package/dist/Wizard.js +22 -9
  71. package/dist/Wizard.js.map +1 -1
  72. package/dist/WizardTemplate.js +1 -1
  73. package/dist/WizardTemplate.js.map +1 -1
  74. package/dist/assets/{InputSuggestions-KGCQrV_T.js → InputSuggestions-BgbbJ4tc.js} +1 -1
  75. package/dist/assets/{ListItemStandardExpandableTextTemplate-D4zLIdLd.js → ListItemStandardExpandableTextTemplate-onAnn1Tj.js} +1 -1
  76. package/dist/assets/{bundle.esm-Diw1zQ-o.js → bundle.esm-CwUfibNQ.js} +228 -223
  77. package/dist/css/themes/Button.css +1 -1
  78. package/dist/css/themes/DatePickerPopover.css +1 -1
  79. package/dist/css/themes/EventRibbon.css +1 -0
  80. package/dist/css/themes/MastheadCountrySelector.css +1 -1
  81. package/dist/css/themes/MastheadItem.css +1 -1
  82. package/dist/css/themes/MastheadShell.css +1 -1
  83. package/dist/css/themes/Modal.css +1 -1
  84. package/dist/css/themes/Pagination.css +1 -1
  85. package/dist/css/themes/RatingIndicator.css +1 -1
  86. package/dist/css/themes/Slider.css +1 -1
  87. package/dist/css/themes/TextField.css +1 -1
  88. package/dist/custom-elements-internal.json +342 -0
  89. package/dist/custom-elements.json +341 -0
  90. package/dist/data/CountryListISO3166.d.ts +13 -4
  91. package/dist/data/CountryListISO3166.js +8 -0
  92. package/dist/data/CountryListISO3166.js.map +1 -1
  93. package/dist/generated/templates/PaginationTemplate.lit.js +1 -1
  94. package/dist/generated/templates/PaginationTemplate.lit.js.map +1 -1
  95. package/dist/generated/templates/PhoneNumberFieldTemplate.lit.js +2 -2
  96. package/dist/generated/templates/PhoneNumberFieldTemplate.lit.js.map +1 -1
  97. package/dist/generated/themes/Button.css.d.ts +1 -1
  98. package/dist/generated/themes/Button.css.js +1 -1
  99. package/dist/generated/themes/Button.css.js.map +1 -1
  100. package/dist/generated/themes/DatePickerPopover.css.d.ts +1 -1
  101. package/dist/generated/themes/DatePickerPopover.css.js +1 -1
  102. package/dist/generated/themes/DatePickerPopover.css.js.map +1 -1
  103. package/dist/generated/themes/EventRibbon.css.d.ts +2 -0
  104. package/dist/generated/themes/EventRibbon.css.js +8 -0
  105. package/dist/generated/themes/EventRibbon.css.js.map +1 -0
  106. package/dist/generated/themes/MastheadCountrySelector.css.d.ts +1 -1
  107. package/dist/generated/themes/MastheadCountrySelector.css.js +1 -1
  108. package/dist/generated/themes/MastheadCountrySelector.css.js.map +1 -1
  109. package/dist/generated/themes/MastheadItem.css.d.ts +1 -1
  110. package/dist/generated/themes/MastheadItem.css.js +1 -1
  111. package/dist/generated/themes/MastheadItem.css.js.map +1 -1
  112. package/dist/generated/themes/MastheadShell.css.d.ts +1 -1
  113. package/dist/generated/themes/MastheadShell.css.js +1 -1
  114. package/dist/generated/themes/MastheadShell.css.js.map +1 -1
  115. package/dist/generated/themes/Modal.css.d.ts +1 -1
  116. package/dist/generated/themes/Modal.css.js +1 -1
  117. package/dist/generated/themes/Modal.css.js.map +1 -1
  118. package/dist/generated/themes/Pagination.css.d.ts +1 -1
  119. package/dist/generated/themes/Pagination.css.js +1 -1
  120. package/dist/generated/themes/Pagination.css.js.map +1 -1
  121. package/dist/generated/themes/RatingIndicator.css.d.ts +1 -1
  122. package/dist/generated/themes/RatingIndicator.css.js +1 -1
  123. package/dist/generated/themes/RatingIndicator.css.js.map +1 -1
  124. package/dist/generated/themes/Slider.css.d.ts +1 -1
  125. package/dist/generated/themes/Slider.css.js +1 -1
  126. package/dist/generated/themes/Slider.css.js.map +1 -1
  127. package/dist/generated/themes/TextField.css.d.ts +1 -1
  128. package/dist/generated/themes/TextField.css.js +1 -1
  129. package/dist/generated/themes/TextField.css.js.map +1 -1
  130. package/dist/types/EventRibbon.d.ts +37 -0
  131. package/dist/types/EventRibbon.js +43 -0
  132. package/dist/types/EventRibbon.js.map +1 -0
  133. package/dist/vscode.html-custom-data.json +99 -0
  134. package/dist/web-types.json +150 -1
  135. package/filter-coverage.js +58 -0
  136. package/package.json +7 -2
  137. package/src/AssetsVariables.ts +4 -0
  138. package/src/Button.ts +9 -0
  139. package/src/CountrySelector.ts +5 -3
  140. package/src/DatePicker.ts +2 -1
  141. package/src/EventRibbon.ts +143 -0
  142. package/src/EventRibbonTemplate.tsx +18 -0
  143. package/src/MastheadShell.ts +25 -5
  144. package/src/Pagination.hbs +7 -3
  145. package/src/Pagination.ts +48 -31
  146. package/src/PhoneNumberField.hbs +1 -1
  147. package/src/PhoneNumberField.ts +7 -2
  148. package/src/SearchableListBase.ts +18 -2
  149. package/src/TextField.ts +9 -0
  150. package/src/Wizard.ts +39 -11
  151. package/src/WizardTemplate.tsx +5 -1
  152. package/src/data/CountryListISO3166.ts +10 -2
  153. package/src/generated/templates/PaginationTemplate.lit.ts +1 -1
  154. package/src/generated/templates/PhoneNumberFieldTemplate.lit.ts +1 -1
  155. package/src/generated/themes/Button.css.ts +1 -1
  156. package/src/generated/themes/DatePickerPopover.css.ts +1 -1
  157. package/src/generated/themes/EventRibbon.css.ts +9 -0
  158. package/src/generated/themes/MastheadCountrySelector.css.ts +1 -1
  159. package/src/generated/themes/MastheadItem.css.ts +1 -1
  160. package/src/generated/themes/MastheadShell.css.ts +1 -1
  161. package/src/generated/themes/Modal.css.ts +1 -1
  162. package/src/generated/themes/Pagination.css.ts +1 -1
  163. package/src/generated/themes/RatingIndicator.css.ts +1 -1
  164. package/src/generated/themes/Slider.css.ts +1 -1
  165. package/src/generated/themes/TextField.css.ts +1 -1
  166. package/src/themes/Button.css +69 -27
  167. package/src/themes/DatePickerPopover.css +64 -6
  168. package/src/themes/EventRibbon.css +411 -0
  169. package/src/themes/MastheadCountrySelector.css +8 -5
  170. package/src/themes/MastheadItem.css +12 -4
  171. package/src/themes/MastheadShell.css +3 -1
  172. package/src/themes/Modal.css +4 -0
  173. package/src/themes/Pagination.css +19 -0
  174. package/src/themes/TextField.css +2 -13
  175. package/src/types/EventRibbon.ts +51 -0
  176. package/swap-component-imports.js +18 -0
@@ -3,13 +3,15 @@
3
3
  <ul class="udex-pagination__list">
4
4
  <li class="udex-pagination__item--prev udex-pagination__item">
5
5
  <udex-button
6
- ?disabled="{{prevButtonDisabled}}"
6
+ aria-disabled="{{effectivePrevButtonDisabled}}"
7
+ ?_aria-disabled="{{_prevButtonPseudoDisabled}}"
7
8
  accessible-name="{{previousPageAccessibleName}}"
8
9
  tooltip="{{previousBtnTooltip}}"
9
10
  size="Large"
10
11
  icon="navigation-left-arrow"
11
12
  design="Tertiary"
12
13
  @click="{{setPrevPage}}"
14
+ @focusout="{{handlePrevFocusOut}}"
13
15
  ></udex-button>
14
16
  </li>
15
17
  {{#if typeFull}}
@@ -17,7 +19,7 @@
17
19
  <li class="udex-pagination__item">
18
20
  <a class="udex-pagination__page" href="#"
19
21
  aria-label="{{accessibleName}}"
20
- @click="{{../onPageClick}}"
22
+ @click="{{../onPageClick}}"
21
23
  ?active="{{active}}"
22
24
  aria-current="{{ariaCurrent}}"
23
25
  index="{{index}}">
@@ -35,13 +37,15 @@
35
37
  {{/if}}
36
38
  <li class="udex-pagination__item--next udex-pagination__item">
37
39
  <udex-button
38
- ?disabled="{{nextButtonDisbled}}"
40
+ aria-disabled="{{effectiveNextButtonDisabled}}"
41
+ ?_aria-disabled="{{_nextButtonPseudoDisabled}}"
39
42
  tooltip="{{nextBtnTooltip}}"
40
43
  accessible-name="{{nextPageAccessibleName}}"
41
44
  size="Large"
42
45
  icon="navigation-right-arrow"
43
46
  design="Tertiary"
44
47
  @click="{{setNextPage}}"
48
+ @focusout="{{handleNextFocusOut}}"
45
49
  ></udex-button>
46
50
  </li>
47
51
  </ul>
package/src/Pagination.ts CHANGED
@@ -16,6 +16,7 @@ import {
16
16
  PREVIOUS_PAGE,
17
17
  NEXT_PAGE,
18
18
  CURRENT_PAGE,
19
+ DISABLED,
19
20
  } from "./generated/i18n/i18n-defaults.js";
20
21
  import Button from "./Button.js";
21
22
  import "@ui5/webcomponents/dist/Icon.js";
@@ -124,6 +125,22 @@ class UDExPagination extends UI5Element {
124
125
  @property({ type: String })
125
126
  _direction?: string;
126
127
 
128
+ /**
129
+ * Defines if the previous button is in pseudo-disabled.
130
+ *
131
+ * @private
132
+ */
133
+ @property({ type: Boolean })
134
+ _nextButtonPseudoDisabled!: boolean;
135
+
136
+ /**
137
+ * Defines if the previous button is in pseudo-disabled.
138
+ *
139
+ * @private
140
+ */
141
+ @property({ type: Boolean })
142
+ _prevButtonPseudoDisabled!: boolean;
143
+
127
144
  @i18n("@sapudex/web-components")
128
145
  static i18nBundle: I18nBundle;
129
146
 
@@ -159,7 +176,7 @@ class UDExPagination extends UI5Element {
159
176
  this.setupPages(this.pages);
160
177
  }
161
178
 
162
- get nextButtonDisbled(): boolean {
179
+ get nextButtonDisabled(): boolean {
163
180
  return this.currentPageIndex + 1 === this.pages;
164
181
  }
165
182
 
@@ -230,8 +247,12 @@ class UDExPagination extends UI5Element {
230
247
  }
231
248
 
232
249
  get previousPageAccessibleName(): string {
233
- if (this.currentPageIndex === 0) { return UDExPagination.i18nBundle.getText(PREVIOUS_PAGE); }
234
- return `${UDExPagination.i18nBundle.getText(CURRENT_PAGE)} ${this.currentPageIndex + 1}. ${UDExPagination.i18nBundle.getText(PREVIOUS_PAGE)}. ${this.activatePageAccessibleText} ${this.currentPageIndex}`;
250
+ const currentPageText = `${UDExPagination.i18nBundle.getText(CURRENT_PAGE)} ${this.currentPageIndex + 1}.`;
251
+ if (this._prevButtonPseudoDisabled || this.prevButtonDisabled) {
252
+ const effectiveDisabledText = this._prevButtonPseudoDisabled ? `${UDExPagination.i18nBundle.getText(DISABLED)}` : "";
253
+ return `${currentPageText} ${UDExPagination.i18nBundle.getText(PREVIOUS_PAGE)} ${effectiveDisabledText}`;
254
+ }
255
+ return `${currentPageText} ${UDExPagination.i18nBundle.getText(PREVIOUS_PAGE)}. ${this.activatePageAccessibleText} ${this.currentPageIndex}`;
235
256
  }
236
257
 
237
258
  get previousBtnTooltip(): string {
@@ -239,12 +260,16 @@ class UDExPagination extends UI5Element {
239
260
  }
240
261
 
241
262
  get nextPageAccessibleName(): string {
242
- if (this.pages && this.currentPageIndex === (this.pages - 1)) { return UDExPagination.i18nBundle.getText(NEXT_PAGE); }
243
- return `${UDExPagination.i18nBundle.getText(CURRENT_PAGE)} ${this.currentPageIndex + 1}. ${UDExPagination.i18nBundle.getText(NEXT_PAGE)}. ${this.activatePageAccessibleText} ${this.currentPageIndex + 2}`;
263
+ const currentPageText = `${UDExPagination.i18nBundle.getText(CURRENT_PAGE)} ${this.currentPageIndex + 1}.`;
264
+ if (this._nextButtonPseudoDisabled || this.nextButtonDisabled) {
265
+ const effectiveDisabledText = this._nextButtonPseudoDisabled ? `${UDExPagination.i18nBundle.getText(DISABLED)}` : "";
266
+ return `${currentPageText} ${UDExPagination.i18nBundle.getText(NEXT_PAGE)} ${effectiveDisabledText}`;
267
+ }
268
+ return `${currentPageText} ${UDExPagination.i18nBundle.getText(NEXT_PAGE)}. ${this.activatePageAccessibleText} ${this.currentPageIndex + 2}`;
244
269
  }
245
270
 
246
271
  get nextBtnTooltip(): string {
247
- return !this.nextButtonDisbled ? `${UDExPagination.i18nBundle.getText(NEXT_PAGE)}` : "";
272
+ return !this.nextButtonDisabled ? `${UDExPagination.i18nBundle.getText(NEXT_PAGE)}` : "";
248
273
  }
249
274
 
250
275
  get pagination(): Page[] {
@@ -297,46 +322,38 @@ class UDExPagination extends UI5Element {
297
322
  this.currentPageIndex = currentPage + 1;
298
323
  this._pageFocusedManually = false;
299
324
 
325
+ this._nextButtonPseudoDisabled = this.currentPageIndex === (this.pages - 1);
326
+
300
327
  this.emitChangeEvent();
301
328
  }
302
329
 
303
- setPrevPage(e: Event): void {
304
- e.preventDefault();
305
- const currentPage = this.currentPageIndex ?? 1;
306
- if (this.pages && currentPage <= 0) {
307
- return;
308
- }
309
- this.currentPageIndex -= 1;
310
- this._pageFocusedManually = false;
311
-
312
- this.emitChangeEvent();
330
+ get effectiveNextButtonDisabled(): boolean {
331
+ return !this._nextButtonPseudoDisabled && this.nextButtonDisabled;
313
332
  }
314
333
 
315
- setFirstPage(e: Event): void {
316
- e.preventDefault();
317
- const currentPage = this.currentPageIndex ?? 1;
318
- if (currentPage === 0) {
319
- return;
320
- }
334
+ get effectivePrevButtonDisabled(): boolean {
335
+ return !this._prevButtonPseudoDisabled && this.prevButtonDisabled;
336
+ }
321
337
 
322
- this._firstPageIndex = 0;
323
- this._lastPageIndex = this.displayNumber;
338
+ handlePrevFocusOut(): void {
339
+ this._prevButtonPseudoDisabled = false;
340
+ }
324
341
 
325
- this.currentPageIndex = 0;
326
- this.emitChangeEvent();
342
+ handleNextFocusOut(): void {
343
+ this._nextButtonPseudoDisabled = false;
327
344
  }
328
345
 
329
- setLastPage(e: Event): void {
346
+ setPrevPage(e: Event): void {
330
347
  e.preventDefault();
331
348
  const currentPage = this.currentPageIndex ?? 1;
332
- if (!this.pages || currentPage >= this.pages - 1) {
349
+ if (this.pages && currentPage <= 0) {
333
350
  return;
334
351
  }
352
+ this.currentPageIndex -= 1;
353
+ this._pageFocusedManually = false;
335
354
 
336
- this._firstPageIndex = this.pages - this.displayNumber;
337
- this._lastPageIndex = this.pages;
355
+ this._prevButtonPseudoDisabled = this.currentPageIndex === 0;
338
356
 
339
- this.currentPageIndex = this._lastPageIndex - 1;
340
357
  this.emitChangeEvent();
341
358
  }
342
359
 
@@ -64,7 +64,7 @@
64
64
  <img
65
65
  class="udex-phone-number-field__flag"
66
66
  aria-label="{{selectedCountryName}}"
67
- style="{{selectedFlagBackgroundPosition}}">
67
+ style="background-position-x: {{selectedFlagBackgroundPosition.x}}; background-position-y: {{selectedFlagBackgroundPosition.y}}">
68
68
  </div>
69
69
  </udex-button>
70
70
  {{/unless}}
@@ -44,6 +44,11 @@ export enum UDExPhoneNumberFieldValueState {
44
44
  Success = "Success",
45
45
  }
46
46
 
47
+ export type BackgroundPosition = {
48
+ x?: string,
49
+ y?: string,
50
+ };
51
+
47
52
  const initialPlaceholder: string = "+X XXX-XXX-XXXX";
48
53
  /**
49
54
  * Maximum number of possible digits based on international standard https://en.wikipedia.org/wiki/E.164
@@ -564,7 +569,7 @@ class UDExPhoneNumberField extends UI5Element {
564
569
  || this.updatedCountriesList[0]?.countryName;
565
570
  }
566
571
 
567
- get selectedFlagBackgroundPosition() {
572
+ get selectedFlagBackgroundPosition(): BackgroundPosition {
568
573
  if (!this.countryIso) {
569
574
  return {};
570
575
  }
@@ -575,7 +580,7 @@ class UDExPhoneNumberField extends UI5Element {
575
580
  return {};
576
581
  }
577
582
 
578
- return { "backgroundPosition": `${selectedCountry.flagX} ${selectedCountry.flagY}` };
583
+ return { x: selectedCountry?.flagX, y: selectedCountry?.flagY };
579
584
  }
580
585
 
581
586
  get ariaInvalid(): string | null {
@@ -97,6 +97,15 @@ class UDExSearchableListBase extends UI5Element {
97
97
  @property({ type: Boolean })
98
98
  busy?: boolean;
99
99
 
100
+ /**
101
+ * Defines if the search input is visible.
102
+ *
103
+ * @default false
104
+ * @public
105
+ */
106
+ @property({ type: Boolean })
107
+ showSearchInput!: boolean;
108
+
100
109
  /**
101
110
  * Defines the delay in milliseconds, after which the busy indicator will show up for this component.
102
111
  *
@@ -502,8 +511,15 @@ class UDExSearchableListBase extends UI5Element {
502
511
  }
503
512
 
504
513
  get showSearch(): boolean {
505
- const items = this.getSlottedItems(this.items).filter(({ isGroup }) => !isGroup);
506
- return items.length > SHOW_SEARCH_AFTER_COUNT && !this.modeRadioGroup;
514
+ return this.showSearchInput || (this.isSearchActive && !this.modeRadioGroup);
515
+ }
516
+
517
+ get isSearchActive(): boolean {
518
+ return this.nonGroupItems.length > SHOW_SEARCH_AFTER_COUNT;
519
+ }
520
+
521
+ get nonGroupItems(): Array<UDExListItemBase> {
522
+ return this.getSlottedItems(this.items).filter(item => !item.isGroup);
507
523
  }
508
524
 
509
525
  get roleForGroupList(): string {
package/src/TextField.ts CHANGED
@@ -224,6 +224,15 @@ class UDExTextField extends UI5Element {
224
224
  @property({ type: Boolean })
225
225
  active!: boolean;
226
226
 
227
+ /**
228
+ * Defines if dropdown associated with text-field trigger has opened dropdown. It indicates active state of control button.
229
+ *
230
+ * @default false
231
+ * @public
232
+ */
233
+ @property({ type: Boolean })
234
+ iconActive!: boolean;
235
+
227
236
  /**
228
237
  * Defines the behaviour of autocomplete.
229
238
  * @default "off"
package/src/Wizard.ts CHANGED
@@ -85,6 +85,30 @@ class UDExWizard extends UI5Wizard {
85
85
  @property({ type: Boolean })
86
86
  indeterminate!: boolean;
87
87
 
88
+ /**
89
+ * Defines aria-label of the wizard, read by screen readers with the first step.
90
+ *
91
+ * @public
92
+ */
93
+ @property({ type: String })
94
+ accessibleName!: string;
95
+
96
+ /**
97
+ * Defines the title of the current step.
98
+ *
99
+ * @private
100
+ */
101
+ @property({ type: String })
102
+ _currentStepTitle?: string;
103
+
104
+ /**
105
+ * Defines the subtitle of the current step.
106
+ *
107
+ * @private
108
+ */
109
+ @property({ type: String })
110
+ _currentStepSubTitle?: string;
111
+
88
112
  /**
89
113
  * Defines the current breakpoint.
90
114
  *
@@ -115,10 +139,6 @@ class UDExWizard extends UI5Wizard {
115
139
  ResizeHandler.deregister(this, this._handleResizeBound);
116
140
  }
117
141
 
118
- onAfterRendering(): void {
119
- this._calcCurrentBreakpoint();
120
- }
121
-
122
142
  _adjustHeaderOverflow = () => {
123
143
  const tabs = this.stepsInHeaderDOM;
124
144
  tabs.forEach(step => {
@@ -168,13 +188,9 @@ class UDExWizard extends UI5Wizard {
168
188
  return this.steps.map((step, idx) => {
169
189
  const pos = idx + 1;
170
190
  const hideSeparator = idx === stepsCount - 1 && !this.indeterminate;
171
- const stepStateText = step.disabled
172
- ? this.inactiveStepText
173
- : this.activeStepText;
174
- const ariaLabel = (
175
- step.titleText
176
- ? `${pos} ${step.titleText} ${stepStateText}`
177
- : `${this.navStepDefaultHeading} ${pos} ${stepStateText}`
191
+ const ariaLabel = (`${idx === 0 ? this.effectiveAccessibleName : ""} ${step.titleText
192
+ ? `${pos} ${step.titleText}`
193
+ : `${this.navStepDefaultHeading} ${pos}`}`
178
194
  ).trim();
179
195
  const isAfterCurrent = idx > selectedStepIndex;
180
196
  accInfo = {
@@ -209,6 +225,18 @@ class UDExWizard extends UI5Wizard {
209
225
  this._calcCurrentBreakpoint();
210
226
  }
211
227
 
228
+ onAfterRendering(): void {
229
+ this.attachStepsResizeObserver();
230
+ this._calcCurrentBreakpoint();
231
+ this.previouslySelectedStepIndex = this.selectedStepIndex;
232
+ this._currentStepTitle = this._steps[this.selectedStepIndex].titleText;
233
+ this._currentStepSubTitle = this._steps[this.selectedStepIndex].subtitleText;
234
+ }
235
+
236
+ get effectiveAccessibleName(): string {
237
+ return this.accessibleName || this.ariaLabelText;
238
+ }
239
+
212
240
  get slottedSteps(): UDExWizardStep[] {
213
241
  return this.getSlottedNodes("steps");
214
242
  }
@@ -5,9 +5,13 @@ export default function WizardTemplate(this: UDExWizard) {
5
5
  return (
6
6
  <div
7
7
  class={this.classes.root}
8
- aria-label={this.ariaLabelText}
8
+ aria-label={this.effectiveAccessibleName}
9
9
  role="region"
10
10
  part="ui5-wiz-root">
11
+ <div role="alert" class="ui5-hidden-text">
12
+ {this._currentStepTitle && <div>{this._currentStepTitle}</div>}
13
+ {this._currentStepSubTitle && <div>{this._currentStepSubTitle}</div>}
14
+ </div>
11
15
  <nav class="ui5-wiz-nav" part="navigator" aria-label={this.navAriaLabelText} tabindex={-1}>
12
16
  <div class="ui5-wiz-nav-list" role="list" aria-label={this.listAriaLabelText} aria-describedby="wiz-nav-descr">
13
17
  {this.stepsInfo.map(headerStep =>
@@ -5,8 +5,8 @@ export type Country = {
5
5
  countryName: string,
6
6
  localName?: string,
7
7
  phonePrefix: string;
8
- flagX: string;
9
- flagY: string;
8
+ flagX?: string;
9
+ flagY?: string;
10
10
  }
11
11
 
12
12
  export const CountryListDB = [
@@ -40,6 +40,14 @@ export const CountryListDB = [
40
40
  "flagX": "-1800px",
41
41
  "flagY": "0px",
42
42
  },
43
+ {
44
+ "locKey": "COUNTRY_AQ",
45
+ "iso": "AQ",
46
+ "phoneFmt": " XX XXXX",
47
+ "countryName": "Antarctica",
48
+ "localName": "Antarctica",
49
+ "phonePrefix": "+672",
50
+ },
43
51
  {
44
52
  "locKey": "COUNTRY_AS",
45
53
  "iso": "AS",
@@ -6,7 +6,7 @@ import type Pagination from "../../Pagination.js";
6
6
  import type { ClassMapValue } from "@ui5/webcomponents-base/dist/types.js";
7
7
 
8
8
  function block0 (this: Pagination, context: UI5Element, tags: string[], suffix: string | undefined) { return html`${ this.pages ? block1.call(this, context, tags, suffix) : undefined } `;}
9
- function block1 (this: Pagination, context: UI5Element, tags: string[], suffix: string | undefined) { return suffix ? html`<nav class="${ifDefined(this.paginationClass)}" role="navigation" aria-label="${ifDefined(this.paginationAccessibleName)}"><ul class="udex-pagination__list"><li class="udex-pagination__item--prev udex-pagination__item"><${scopeTag("udex-button", tags, suffix)} ?disabled="${this.prevButtonDisabled}" accessible-name="${ifDefined(this.previousPageAccessibleName)}" tooltip="${ifDefined(this.previousBtnTooltip)}" size="Large" icon="navigation-left-arrow" design="Tertiary" @click="${this.setPrevPage}"></${scopeTag("udex-button", tags, suffix)}></li>${ this.typeFull ? block2.call(this, context, tags, suffix) : undefined }${ this.typeShort ? block4.call(this, context, tags, suffix) : undefined }<li class="udex-pagination__item--next udex-pagination__item"><${scopeTag("udex-button", tags, suffix)} ?disabled="${this.nextButtonDisbled}" tooltip="${ifDefined(this.nextBtnTooltip)}" accessible-name="${ifDefined(this.nextPageAccessibleName)}" size="Large" icon="navigation-right-arrow" design="Tertiary" @click="${this.setNextPage}"></${scopeTag("udex-button", tags, suffix)}></li></ul></nav>` : html`<nav class="${ifDefined(this.paginationClass)}" role="navigation" aria-label="${ifDefined(this.paginationAccessibleName)}"><ul class="udex-pagination__list"><li class="udex-pagination__item--prev udex-pagination__item"><udex-button ?disabled="${this.prevButtonDisabled}" accessible-name="${ifDefined(this.previousPageAccessibleName)}" tooltip="${ifDefined(this.previousBtnTooltip)}" size="Large" icon="navigation-left-arrow" design="Tertiary" @click="${this.setPrevPage}"></udex-button></li>${ this.typeFull ? block2.call(this, context, tags, suffix) : undefined }${ this.typeShort ? block4.call(this, context, tags, suffix) : undefined }<li class="udex-pagination__item--next udex-pagination__item"><udex-button ?disabled="${this.nextButtonDisbled}" tooltip="${ifDefined(this.nextBtnTooltip)}" accessible-name="${ifDefined(this.nextPageAccessibleName)}" size="Large" icon="navigation-right-arrow" design="Tertiary" @click="${this.setNextPage}"></udex-button></li></ul></nav>`;}
9
+ function block1 (this: Pagination, context: UI5Element, tags: string[], suffix: string | undefined) { return suffix ? html`<nav class="${ifDefined(this.paginationClass)}" role="navigation" aria-label="${ifDefined(this.paginationAccessibleName)}"><ul class="udex-pagination__list"><li class="udex-pagination__item--prev udex-pagination__item"><${scopeTag("udex-button", tags, suffix)} aria-disabled="${ifDefined(this.effectivePrevButtonDisabled)}" ?_aria-disabled="${ifDefined(this._prevButtonPseudoDisabled)}" accessible-name="${ifDefined(this.previousPageAccessibleName)}" tooltip="${ifDefined(this.previousBtnTooltip)}" size="Large" icon="navigation-left-arrow" design="Tertiary" @click="${this.setPrevPage}" @focusout="${this.handlePrevFocusOut}"></${scopeTag("udex-button", tags, suffix)}></li>${ this.typeFull ? block2.call(this, context, tags, suffix) : undefined }${ this.typeShort ? block4.call(this, context, tags, suffix) : undefined }<li class="udex-pagination__item--next udex-pagination__item"><${scopeTag("udex-button", tags, suffix)} aria-disabled="${ifDefined(this.effectiveNextButtonDisabled)}" ?_aria-disabled="${ifDefined(this._nextButtonPseudoDisabled)}" tooltip="${ifDefined(this.nextBtnTooltip)}" accessible-name="${ifDefined(this.nextPageAccessibleName)}" size="Large" icon="navigation-right-arrow" design="Tertiary" @click="${this.setNextPage}" @focusout="${this.handleNextFocusOut}"></${scopeTag("udex-button", tags, suffix)}></li></ul></nav>` : html`<nav class="${ifDefined(this.paginationClass)}" role="navigation" aria-label="${ifDefined(this.paginationAccessibleName)}"><ul class="udex-pagination__list"><li class="udex-pagination__item--prev udex-pagination__item"><udex-button aria-disabled="${ifDefined(this.effectivePrevButtonDisabled)}" ?_aria-disabled="${ifDefined(this._prevButtonPseudoDisabled)}" accessible-name="${ifDefined(this.previousPageAccessibleName)}" tooltip="${ifDefined(this.previousBtnTooltip)}" size="Large" icon="navigation-left-arrow" design="Tertiary" @click="${this.setPrevPage}" @focusout="${this.handlePrevFocusOut}"></udex-button></li>${ this.typeFull ? block2.call(this, context, tags, suffix) : undefined }${ this.typeShort ? block4.call(this, context, tags, suffix) : undefined }<li class="udex-pagination__item--next udex-pagination__item"><udex-button aria-disabled="${ifDefined(this.effectiveNextButtonDisabled)}" ?_aria-disabled="${ifDefined(this._nextButtonPseudoDisabled)}" tooltip="${ifDefined(this.nextBtnTooltip)}" accessible-name="${ifDefined(this.nextPageAccessibleName)}" size="Large" icon="navigation-right-arrow" design="Tertiary" @click="${this.setNextPage}" @focusout="${this.handleNextFocusOut}"></udex-button></li></ul></nav>`;}
10
10
  function block2 (this: Pagination, context: UI5Element, tags: string[], suffix: string | undefined) { return html`${ repeat(this.pagination, (item, index) => (item as typeof item & {_id?: any})._id || index, (item, index: number) => block3.call(this, context, tags, suffix, item, index)) }`;}
11
11
  function block3 (this: Pagination, context: UI5Element, tags: string[], suffix: string | undefined, item: any, index: number) { return html`<li class="udex-pagination__item"><a class="udex-pagination__page" href="#" aria-label="${ifDefined(item.accessibleName)}" @click="${this.onPageClick}" ?active="${item.active}" aria-current="${ifDefined(item.ariaCurrent)}" index="${ifDefined(item.index)}"><span class="udex-pagination__page--value">${ifDefined(item.value)}</span></a></li>`;}
12
12
  function block4 (this: Pagination, context: UI5Element, tags: string[], suffix: string | undefined) { return html`<li class="udex-pagination__item udex-pagination__item--short" tabindex="-1" aria-label="${ifDefined(this.paginationShortAccessibleName)}"><span class="udex-pagination__item--short-value">${ifDefined(this.shortTextStart)}</span><span class="udex-pagination__item--short-separator">${ifDefined(this.shortTextSeparator)}</span><span class="udex-pagination__item--short-value">${ifDefined(this.shortTextEnd)}</span></li>`;}
@@ -10,7 +10,7 @@ function block1 (this: PhoneNumberField, context: UI5Element, tags: string[], su
10
10
  function block2 (this: PhoneNumberField, context: UI5Element, tags: string[], suffix: string | undefined) { return html` * `;}
11
11
  function block3 (this: PhoneNumberField, context: UI5Element, tags: string[], suffix: string | undefined, item: any, index: number) { return suffix ? html`<${scopeTag("udex-list-item", tags, suffix)} id="${ifDefined(item.iso)}" ?selected="${item.selected}"><div class="udex-phone-number-field__dropdown-list-item"><div class="udex-phone-number-field__flag" style="background-position-x: ${ifDefined(item.flagX)}; background-position-y: ${ifDefined(item.flagY)}"></div><span class="udex-phone-number-field__country-name">${ifDefined(item.countryName)}${ item.localName ? block4.call(this, context, tags, suffix, item, index) : undefined }${ifDefined(item.phonePrefix)}</span></div></${scopeTag("udex-list-item", tags, suffix)}>` : html`<udex-list-item id="${ifDefined(item.iso)}" ?selected="${item.selected}"><div class="udex-phone-number-field__dropdown-list-item"><div class="udex-phone-number-field__flag" style="background-position-x: ${ifDefined(item.flagX)}; background-position-y: ${ifDefined(item.flagY)}"></div><span class="udex-phone-number-field__country-name">${ifDefined(item.countryName)}${ item.localName ? block4.call(this, context, tags, suffix, item, index) : undefined }${ifDefined(item.phonePrefix)}</span></div></udex-list-item>`;}
12
12
  function block4 (this: PhoneNumberField, context: UI5Element, tags: string[], suffix: string | undefined, item: any, index: number) { return html` (${ifDefined(item.localName)}) `;}
13
- function block5 (this: PhoneNumberField, context: UI5Element, tags: string[], suffix: string | undefined) { return suffix ? html`<${scopeTag("udex-button", tags, suffix)} id="udex-${ifDefined(this._id)}-phone-number__opener" class="udex-phone-number-field__open-button" size="Large" end-icon="${ifDefined(this.buttonIcon)}" design="Tertiary" ?disabled="${this.isButtonDisabled}" aria-haspopup="true" accessible-name-ref="${ifDefined(this._id)}-countrySelectorAriaLabel ${ifDefined(this.ariaDescribedById)}" aria-label="${ifDefined(this.countrySelectorAriaLabel)}" aria-expanded="${ifDefined(this._dropdownExpanded)}" aria-controls="${ifDefined(this._id)}_dropdown-menu" role="combobox" @click="${this.openDropdown}"><div class="udex-phone-number-field__open-button-text">${ifDefined(this.selectedCountryName)}${ifDefined(this.selectedPhonePrefix)}</div><div class="udex-phone-number-field__button-content"><img class="udex-phone-number-field__flag" aria-label="${ifDefined(this.selectedCountryName)}" style="${styleMap(this.selectedFlagBackgroundPosition)}"></div></${scopeTag("udex-button", tags, suffix)}>` : html`<udex-button id="udex-${ifDefined(this._id)}-phone-number__opener" class="udex-phone-number-field__open-button" size="Large" end-icon="${ifDefined(this.buttonIcon)}" design="Tertiary" ?disabled="${this.isButtonDisabled}" aria-haspopup="true" accessible-name-ref="${ifDefined(this._id)}-countrySelectorAriaLabel ${ifDefined(this.ariaDescribedById)}" aria-label="${ifDefined(this.countrySelectorAriaLabel)}" aria-expanded="${ifDefined(this._dropdownExpanded)}" aria-controls="${ifDefined(this._id)}_dropdown-menu" role="combobox" @click="${this.openDropdown}"><div class="udex-phone-number-field__open-button-text">${ifDefined(this.selectedCountryName)}${ifDefined(this.selectedPhonePrefix)}</div><div class="udex-phone-number-field__button-content"><img class="udex-phone-number-field__flag" aria-label="${ifDefined(this.selectedCountryName)}" style="${styleMap(this.selectedFlagBackgroundPosition)}"></div></udex-button>`;}
13
+ function block5 (this: PhoneNumberField, context: UI5Element, tags: string[], suffix: string | undefined) { return suffix ? html`<${scopeTag("udex-button", tags, suffix)} id="udex-${ifDefined(this._id)}-phone-number__opener" class="udex-phone-number-field__open-button" size="Large" end-icon="${ifDefined(this.buttonIcon)}" design="Tertiary" ?disabled="${this.isButtonDisabled}" aria-haspopup="true" accessible-name-ref="${ifDefined(this._id)}-countrySelectorAriaLabel ${ifDefined(this.ariaDescribedById)}" aria-label="${ifDefined(this.countrySelectorAriaLabel)}" aria-expanded="${ifDefined(this._dropdownExpanded)}" aria-controls="${ifDefined(this._id)}_dropdown-menu" role="combobox" @click="${this.openDropdown}"><div class="udex-phone-number-field__open-button-text">${ifDefined(this.selectedCountryName)}${ifDefined(this.selectedPhonePrefix)}</div><div class="udex-phone-number-field__button-content"><img class="udex-phone-number-field__flag" aria-label="${ifDefined(this.selectedCountryName)}" style="background-position-x: ${ifDefined(this.selectedFlagBackgroundPosition.x)}; background-position-y: ${ifDefined(this.selectedFlagBackgroundPosition.y)}"></div></${scopeTag("udex-button", tags, suffix)}>` : html`<udex-button id="udex-${ifDefined(this._id)}-phone-number__opener" class="udex-phone-number-field__open-button" size="Large" end-icon="${ifDefined(this.buttonIcon)}" design="Tertiary" ?disabled="${this.isButtonDisabled}" aria-haspopup="true" accessible-name-ref="${ifDefined(this._id)}-countrySelectorAriaLabel ${ifDefined(this.ariaDescribedById)}" aria-label="${ifDefined(this.countrySelectorAriaLabel)}" aria-expanded="${ifDefined(this._dropdownExpanded)}" aria-controls="${ifDefined(this._id)}_dropdown-menu" role="combobox" @click="${this.openDropdown}"><div class="udex-phone-number-field__open-button-text">${ifDefined(this.selectedCountryName)}${ifDefined(this.selectedPhonePrefix)}</div><div class="udex-phone-number-field__button-content"><img class="udex-phone-number-field__flag" aria-label="${ifDefined(this.selectedCountryName)}" style="background-position-x: ${ifDefined(this.selectedFlagBackgroundPosition.x)}; background-position-y: ${ifDefined(this.selectedFlagBackgroundPosition.y)}"></div></udex-button>`;}
14
14
  function block6 (this: PhoneNumberField, context: UI5Element, tags: string[], suffix: string | undefined) { return suffix ? html`<${scopeTag("udex-status-message", tags, suffix)} ?disabled="${this.disabled}" supporting-text="${ifDefined(this.supportingText)}" value-state="${ifDefined(this.valueState)}"></${scopeTag("udex-status-message", tags, suffix)}>` : html`<udex-status-message ?disabled="${this.disabled}" supporting-text="${ifDefined(this.supportingText)}" value-state="${ifDefined(this.valueState)}"></udex-status-message>`;}
15
15
  function block7 (this: PhoneNumberField, context: UI5Element, tags: string[], suffix: string | undefined) { return html`<span id="${ifDefined(this._id)}-supportingTextDesc" class="hidden-text">${ifDefined(this.supportingText)}</span>`;}
16
16
  function block8 (this: PhoneNumberField, context: UI5Element, tags: string[], suffix: string | undefined) { return html`<span id="${ifDefined(this._id)}-valueStateDesc" class="hidden-text">${ifDefined(this.valueStateText)}</span>`;}