@sapudex/web-components 2.54.0 → 2.55.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 (164) hide show
  1. package/cypress/specs/Breadcrumbs.cy.tsx +3 -1
  2. package/cypress/specs/FilterMenu.cy.tsx +34 -2
  3. package/cypress/specs/Footer.cy.tsx +59 -0
  4. package/cypress/specs/MediaPlayer.cy.tsx +58 -0
  5. package/cypress/specs/SecondaryNavigationDesktop.cy.tsx +2 -2
  6. package/cypress/specs/SelectBox.cy.tsx +74 -0
  7. package/dist/BreadcrumbsTemplate.js +1 -1
  8. package/dist/BreadcrumbsTemplate.js.map +1 -1
  9. package/dist/FilterMenu.d.ts +1 -1
  10. package/dist/FilterMenu.js +6 -6
  11. package/dist/FilterMenu.js.map +1 -1
  12. package/dist/Footer.d.ts +20 -1
  13. package/dist/Footer.js +40 -3
  14. package/dist/Footer.js.map +1 -1
  15. package/dist/FooterTemplate.js +7 -2
  16. package/dist/FooterTemplate.js.map +1 -1
  17. package/dist/List.js +6 -6
  18. package/dist/List.js.map +1 -1
  19. package/dist/ListGroupHeader.js +12 -5
  20. package/dist/ListGroupHeader.js.map +1 -1
  21. package/dist/ListGroupHeaderBase.d.ts +1 -1
  22. package/dist/ListGroupHeaderBase.js +2 -2
  23. package/dist/ListGroupHeaderBase.js.map +1 -1
  24. package/dist/ListGroupHeaderTemplate.d.ts +2 -0
  25. package/dist/ListGroupHeaderTemplate.js +33 -0
  26. package/dist/ListGroupHeaderTemplate.js.map +1 -0
  27. package/dist/ListItem.d.ts +1 -1
  28. package/dist/ListItem.js +4 -3
  29. package/dist/ListItem.js.map +1 -1
  30. package/dist/ListItemBase.d.ts +1 -0
  31. package/dist/ListItemBase.js +8 -4
  32. package/dist/ListItemBase.js.map +1 -1
  33. package/dist/ListItemTemplate.d.ts +2 -0
  34. package/dist/ListItemTemplate.js +18 -0
  35. package/dist/ListItemTemplate.js.map +1 -0
  36. package/dist/ListSelectAll.js +4 -5
  37. package/dist/ListSelectAll.js.map +1 -1
  38. package/dist/ListSelectAllTemplate.d.ts +2 -0
  39. package/dist/ListSelectAllTemplate.js +6 -0
  40. package/dist/ListSelectAllTemplate.js.map +1 -0
  41. package/dist/ListTemplate.d.ts +2 -0
  42. package/dist/ListTemplate.js +11 -0
  43. package/dist/ListTemplate.js.map +1 -0
  44. package/dist/MediaPlayer.js +6 -0
  45. package/dist/MediaPlayer.js.map +1 -1
  46. package/dist/SelectBox.js +31 -0
  47. package/dist/SelectBox.js.map +1 -1
  48. package/dist/SelectBoxTemplate.js +2 -1
  49. package/dist/SelectBoxTemplate.js.map +1 -1
  50. package/dist/assets/{InputSuggestions-CqOrRXxa.js → InputSuggestions-DPiJnNLn.js} +1 -1
  51. package/dist/assets/{ListItemStandardExpandableTextTemplate-DKUm4L2B.js → ListItemStandardExpandableTextTemplate-B-v72jL6.js} +1 -1
  52. package/dist/assets/{bundle.esm-CI60uvdr.js → bundle.esm-DPppjwN7.js} +259 -259
  53. package/dist/assets/messagebundle_en-B0P3kkb6.js +1 -0
  54. package/dist/assets/messagebundle_it-BML2SC0W.js +1 -0
  55. package/dist/assets/messagebundle_ja-zyFfZHcj.js +1 -0
  56. package/dist/assets/messagebundle_ko-BCPaSqNp.js +1 -0
  57. package/dist/assets/messagebundle_lt-DB4b6FVx.js +1 -0
  58. package/dist/assets/messagebundle_lv-tAOia5tU.js +1 -0
  59. package/dist/css/themes/Breadcrumbs.css +1 -1
  60. package/dist/css/themes/BreadcrumbsPopover.css +1 -1
  61. package/dist/css/themes/Footer.css +1 -1
  62. package/dist/css/themes/Link.css +1 -1
  63. package/dist/css/themes/ListGroupHeader.css +1 -1
  64. package/dist/custom-elements-internal.json +90 -2
  65. package/dist/custom-elements.json +76 -2
  66. package/dist/generated/assets/i18n/messagebundle_en.json +1 -1
  67. package/dist/generated/assets/i18n/messagebundle_it.json +1 -1
  68. package/dist/generated/assets/i18n/messagebundle_ja.json +1 -1
  69. package/dist/generated/assets/i18n/messagebundle_ko.json +1 -1
  70. package/dist/generated/assets/i18n/messagebundle_lt.json +1 -1
  71. package/dist/generated/assets/i18n/messagebundle_lv.json +1 -1
  72. package/dist/generated/i18n/i18n-defaults.d.ts +2 -1
  73. package/dist/generated/i18n/i18n-defaults.js +2 -1
  74. package/dist/generated/i18n/i18n-defaults.js.map +1 -1
  75. package/dist/generated/themes/Breadcrumbs.css.d.ts +1 -1
  76. package/dist/generated/themes/Breadcrumbs.css.js +1 -1
  77. package/dist/generated/themes/Breadcrumbs.css.js.map +1 -1
  78. package/dist/generated/themes/BreadcrumbsPopover.css.d.ts +1 -1
  79. package/dist/generated/themes/BreadcrumbsPopover.css.js +1 -1
  80. package/dist/generated/themes/BreadcrumbsPopover.css.js.map +1 -1
  81. package/dist/generated/themes/Footer.css.d.ts +1 -1
  82. package/dist/generated/themes/Footer.css.js +1 -1
  83. package/dist/generated/themes/Footer.css.js.map +1 -1
  84. package/dist/generated/themes/Link.css.d.ts +1 -1
  85. package/dist/generated/themes/Link.css.js +1 -1
  86. package/dist/generated/themes/Link.css.js.map +1 -1
  87. package/dist/generated/themes/ListGroupHeader.css.d.ts +1 -1
  88. package/dist/generated/themes/ListGroupHeader.css.js +1 -1
  89. package/dist/generated/themes/ListGroupHeader.css.js.map +1 -1
  90. package/dist/messagebundle.properties +1 -0
  91. package/dist/messagebundle_en.properties +1 -0
  92. package/dist/messagebundle_it.properties +123 -0
  93. package/dist/messagebundle_ja.properties +127 -1
  94. package/dist/messagebundle_ko.properties +126 -0
  95. package/dist/messagebundle_lt.properties +126 -0
  96. package/dist/messagebundle_lv.properties +9 -0
  97. package/dist/types/FooterAskJoulePosition.d.ts +5 -0
  98. package/dist/types/FooterAskJoulePosition.js +7 -0
  99. package/dist/types/FooterAskJoulePosition.js.map +1 -0
  100. package/dist/vscode.html-custom-data.json +11 -1
  101. package/dist/web-types.json +34 -3
  102. package/package.json +1 -1
  103. package/src/BreadcrumbsTemplate.tsx +12 -10
  104. package/src/FilterMenu.ts +6 -6
  105. package/src/Footer.ts +41 -3
  106. package/src/FooterTemplate.tsx +28 -4
  107. package/src/List.ts +8 -8
  108. package/src/ListGroupHeader.ts +12 -5
  109. package/src/ListGroupHeaderBase.ts +3 -3
  110. package/src/ListGroupHeaderTemplate.tsx +228 -0
  111. package/src/ListItem.ts +5 -4
  112. package/src/ListItemBase.ts +9 -4
  113. package/src/ListItemTemplate.tsx +193 -0
  114. package/src/ListSelectAll.ts +4 -5
  115. package/src/ListSelectAllTemplate.tsx +38 -0
  116. package/src/ListTemplate.tsx +60 -0
  117. package/src/MediaPlayer.ts +6 -0
  118. package/src/SelectBox.ts +34 -0
  119. package/src/SelectBoxTemplate.tsx +2 -0
  120. package/src/generated/i18n/i18n-defaults.ts +2 -2
  121. package/src/generated/themes/Breadcrumbs.css.ts +1 -1
  122. package/src/generated/themes/BreadcrumbsPopover.css.ts +1 -1
  123. package/src/generated/themes/Footer.css.ts +1 -1
  124. package/src/generated/themes/Link.css.ts +1 -1
  125. package/src/generated/themes/ListGroupHeader.css.ts +1 -1
  126. package/src/i18n/messagebundle.properties +1 -0
  127. package/src/i18n/messagebundle_en.properties +1 -0
  128. package/src/i18n/messagebundle_it.properties +123 -0
  129. package/src/i18n/messagebundle_ja.properties +127 -1
  130. package/src/i18n/messagebundle_ko.properties +126 -0
  131. package/src/i18n/messagebundle_lt.properties +126 -0
  132. package/src/i18n/messagebundle_lv.properties +9 -0
  133. package/src/themes/Breadcrumbs.css +46 -5
  134. package/src/themes/BreadcrumbsPopover.css +65 -0
  135. package/src/themes/Footer.css +98 -1
  136. package/src/themes/Link.css +127 -8
  137. package/src/themes/ListGroupHeader.css +6 -3
  138. package/src/types/FooterAskJoulePosition.ts +6 -0
  139. package/dist/assets/messagebundle_en-DoNTK1BE.js +0 -1
  140. package/dist/assets/messagebundle_it-BhrBdOd4.js +0 -1
  141. package/dist/assets/messagebundle_ja-5P5L7sQ1.js +0 -1
  142. package/dist/assets/messagebundle_ko-B9H5YQlC.js +0 -1
  143. package/dist/assets/messagebundle_lt-BJ5gr_LF.js +0 -1
  144. package/dist/assets/messagebundle_lv-D06tlATH.js +0 -1
  145. package/dist/generated/templates/ListGroupHeaderTemplate.lit.d.ts +0 -3
  146. package/dist/generated/templates/ListGroupHeaderTemplate.lit.js +0 -30
  147. package/dist/generated/templates/ListGroupHeaderTemplate.lit.js.map +0 -1
  148. package/dist/generated/templates/ListItemTemplate.lit.d.ts +0 -3
  149. package/dist/generated/templates/ListItemTemplate.lit.js +0 -49
  150. package/dist/generated/templates/ListItemTemplate.lit.js.map +0 -1
  151. package/dist/generated/templates/ListSelectAllTemplate.lit.d.ts +0 -3
  152. package/dist/generated/templates/ListSelectAllTemplate.lit.js +0 -7
  153. package/dist/generated/templates/ListSelectAllTemplate.lit.js.map +0 -1
  154. package/dist/generated/templates/ListTemplate.lit.d.ts +0 -3
  155. package/dist/generated/templates/ListTemplate.lit.js +0 -11
  156. package/dist/generated/templates/ListTemplate.lit.js.map +0 -1
  157. package/src/List.hbs +0 -38
  158. package/src/ListGroupHeader.hbs +0 -188
  159. package/src/ListItem.hbs +0 -166
  160. package/src/ListSelectAll.hbs +0 -31
  161. package/src/generated/templates/ListGroupHeaderTemplate.lit.ts +0 -34
  162. package/src/generated/templates/ListItemTemplate.lit.ts +0 -53
  163. package/src/generated/templates/ListSelectAllTemplate.lit.ts +0 -11
  164. package/src/generated/templates/ListTemplate.lit.ts +0 -15
@@ -0,0 +1,228 @@
1
+ import type { AriaRole } from "@ui5/webcomponents-base/dist/types.js";
2
+ import type UDExListGroupHeader from "./ListGroupHeader.js";
3
+ import UDExListItem from "./ListItem.js";
4
+ import UDExButton from "./Button.js";
5
+ import Icon from "@ui5/webcomponents/dist/Icon.js";
6
+ import UDExButtonSize from "./types/ButtonSize.js";
7
+ import UDExButtonDesign from "./types/ButtonDesign.js";
8
+ import slimArrowRight from "@ui5/webcomponents-icons/dist/slim-arrow-right.js";
9
+
10
+ function SingleGroupHeader(this: UDExListGroupHeader) {
11
+ return (
12
+ <div class={`udex-list__group-content udex-list__group-header-wrap ${this.sizeClass}`} part="group-item">
13
+ {this.typeNumber && <span class="udex-list__number">{this.numberOfItem}.</span>}
14
+ {this.typeCircle && <span class="udex-list__circle">&#x2022;</span>}
15
+ {this.typeIcon && (
16
+ <Icon
17
+ class="udex-list__icon"
18
+ accessible-role="presentation"
19
+ aria-hidden="true"
20
+ part="icon"
21
+ name={this._icon}
22
+ />
23
+ )}
24
+ <div class="udex-list__header">
25
+ <span
26
+ id="group-heading"
27
+ class="udex-list__header-title"
28
+ {...({ innerHTML: this.label } as object)}>
29
+ </span>
30
+ {this.supportingText && (
31
+ <span class={`udex-list__supporting-text ${this.sizeClass}`}>{this.supportingText}</span>
32
+ )}
33
+ </div>
34
+ </div>
35
+ );
36
+ }
37
+
38
+ function SingleGroupHeaderCollapsible(this: UDExListGroupHeader) {
39
+ return (
40
+ <div
41
+ class={`udex-list__group-content udex-list__group-header-wrap ${this.sizeClass}`}
42
+ part="group-item"
43
+ id={`${this._id}_group-content__focusable`}
44
+ role={this.singleCollapsibleHeaderRole as AriaRole}
45
+ tabIndex={0}
46
+ onKeyDown={this.handleKeyDown}
47
+ aria-expanded={this.expanded}
48
+ aria-controls={this.ariaControlsId}
49
+ _tab-index={Number(this._effectiveTabIndex)}>
50
+ {this.typeNumber && <span class="udex-list__number">{this.numberOfItem}.</span>}
51
+ {this.typeCircle && <span class="udex-list__circle">&#x2022;</span>}
52
+ {this.typeIcon && (
53
+ <Icon
54
+ name={this._icon}
55
+ class="udex-list__icon"
56
+ accessible-role="presentation"
57
+ aria-hidden="true"
58
+ part="icon"
59
+ />
60
+ )}
61
+ <div class="udex-list__header">
62
+ <span
63
+ id="group-heading"
64
+ class="udex-list__header-title"
65
+ {...({ innerHTML: this.label } as object)}>
66
+ </span>
67
+ {this.supportingText && (
68
+ <span class={`udex-list__supporting-text ${this.sizeClass}`}>{this.supportingText}</span>
69
+ )}
70
+ </div>
71
+ <div class="udex-list__group-heading__icon-wrapper">
72
+ <UDExButton
73
+ size="Small"
74
+ design="Tertiary"
75
+ class="udex-list__group-heading__icon"
76
+ onClick={this.handleCollapseIconClick as unknown as EventListener}
77
+ tabindex={-1}
78
+ accessible-name={this.expandButtonAccessibleName}
79
+ icon={slimArrowRight}
80
+ {...({ "mode": "Interactive" } as object)}
81
+ />
82
+ </div>
83
+ </div>
84
+ );
85
+ }
86
+
87
+ function MultiOrRadioGroupHeader(this: UDExListGroupHeader) {
88
+ if (this.isNonActiveHeader) {
89
+ return (
90
+ <header id="group-heading" class="udex-list__inactive-header udex-list__group-header-wrap">
91
+ <div class="udex-list__inactive-header-content">
92
+ <span class="udex-list__header-title" {...({ innerHTML: this.label } as object)}></span>
93
+ {this.supportingText && (
94
+ <span class="udex-list__supporting-text">{this.supportingText}</span>
95
+ )}
96
+ </div>
97
+ </header>
98
+ );
99
+ }
100
+ return (
101
+ <UDExListItem
102
+ id="group-heading"
103
+ part="group-item"
104
+ role="none"
105
+ selected={this.selected}
106
+ indeterminate={this.indeterminate}
107
+ class={this.className}
108
+ mode={this.mode}
109
+ controlled={this.controlled}
110
+ onClick={this.handleHeaderPress}
111
+ onKeyDown={this.handleKeyDownPress}
112
+ type={this.type}
113
+ label={this.label}
114
+ size={this.size}
115
+ supportingText={this.supportingText}
116
+ accessible-role={this.nonCollapsibleHeaderAccessibleRole}
117
+ _additional-class-name={this._additionalClassName}
118
+ _tab-index={Number(this._effectiveTabIndex)}
119
+ _icon={this._icon}
120
+ _filtered={this._filtered}
121
+ />
122
+ );
123
+ }
124
+
125
+ function MultiOrRadioGroupHeaderCollapsible(this: UDExListGroupHeader) {
126
+ if (this.isNonActiveHeader) {
127
+ return (
128
+ <header
129
+ role="button"
130
+ id="group-heading"
131
+ class="udex-list__inactive-header udex-list__group-header-wrap"
132
+ tabIndex={Number(this._effectiveTabIndex)}
133
+ aria-expanded={this.expanded}
134
+ aria-controls={this.ariaControlsId}>
135
+ <div class="udex-list__inactive-header-content">
136
+ <span class="udex-list__header-title" {...({ innerHTML: this.label } as object)}></span>
137
+ {this.supportingText && (
138
+ <span class="udex-list__supporting-text">{this.supportingText}</span>
139
+ )}
140
+ </div>
141
+ <div class="udex-list__group-heading__icon-wrapper">
142
+ <UDExButton
143
+ class="udex-list__group-heading__icon"
144
+ size={UDExButtonSize.Small}
145
+ design={UDExButtonDesign.Tertiary}
146
+ tabindex={-1}
147
+ icon={slimArrowRight}
148
+ onClick={this.handleCollapseIconClick as EventListener}
149
+ accessible-name={this.expandButtonAccessibleName}
150
+ {...({ "mode": "Interactive" } as object)}
151
+ />
152
+ </div>
153
+ </header>
154
+ );
155
+ }
156
+ return (
157
+ <UDExListItem
158
+ id="group-heading"
159
+ part="group-item"
160
+ role="none"
161
+ aria-expanded={this.expanded}
162
+ aria-controls={this.ariaControlsId}
163
+ selected={this.selected}
164
+ indeterminate={this.indeterminate}
165
+ collapsible={this.collapsible}
166
+ collapsed={this.collapsed}
167
+ class={this.className}
168
+ mode={this.mode}
169
+ controlled={this.controlled}
170
+ onClick={this.handleHeaderPress}
171
+ onKeyDown={this.handleKeyDownPress}
172
+ type={this.type}
173
+ label={this.label}
174
+ size={this.size}
175
+ supportingText={this.supportingText}
176
+ accessible-role={this.collapsibleHeaderAccessibleRole}
177
+ onAccordionIconClick={this.handleCollapseIconClick as EventListener}
178
+ _additional-class-name={this._additionalClassName}
179
+ _tab-index={Number(this._effectiveTabIndex)}
180
+ _icon={this._icon}
181
+ _filtered={this._filtered}
182
+ />
183
+ );
184
+ }
185
+
186
+ export default function ListGroupHeaderTemplate(this: UDExListGroupHeader) {
187
+ return (
188
+ <div
189
+ part="item"
190
+ class="udex-list__group"
191
+ role={this.groupWrapperRole as AriaRole}
192
+ aria-labelledby={!this.isTreeAccessibleRole ? "group-heading" : undefined}>
193
+ {this.collapsible ? (
194
+ <div
195
+ class="udex-list__group-list"
196
+ onui5-item-press={this.getHandleGroupItemsClick}
197
+ {...({ name: "group" } as object)}>
198
+ {this.useListItemHeader
199
+ ? MultiOrRadioGroupHeaderCollapsible.call(this)
200
+ : SingleGroupHeaderCollapsible.call(this)
201
+ }
202
+ <div id={this.ariaControlsId} role={this.contentRegionRole as AriaRole} class="udex-list__group-list__content">
203
+ {this.isTreeAccessibleRole ? (
204
+ <slot></slot>
205
+ ) : (
206
+ <div role="listbox" aria-label="group">
207
+ <slot></slot>
208
+ </div>
209
+ )}
210
+ </div>
211
+ </div>
212
+ ) : (
213
+ <div
214
+ role={this.nonCollapsibleContainerRole as AriaRole}
215
+ class="udex-list__group-list"
216
+ aria-label="group"
217
+ onui5-item-press={this.getHandleGroupItemsClick}
218
+ {...({ name: "group" } as object)}>
219
+ {this.modeMultiSelectOrRadioGroup
220
+ ? MultiOrRadioGroupHeader.call(this)
221
+ : SingleGroupHeader.call(this)
222
+ }
223
+ <slot></slot>
224
+ </div>
225
+ )}
226
+ </div>
227
+ );
228
+ }
package/src/ListItem.ts CHANGED
@@ -1,8 +1,9 @@
1
1
  import customElement from "@ui5/webcomponents-base/dist/decorators/customElement.js";
2
2
  import property from "@ui5/webcomponents-base/dist/decorators/property.js";
3
+ import jsxRenderer from "@ui5/webcomponents-base/renderer/JsxRenderer.js";
4
+ import type { Slot, DefaultSlot } from "@ui5/webcomponents-base/dist/UI5Element.js";
3
5
  import slot from "@ui5/webcomponents-base/dist/decorators/slot-strict.js";
4
6
  import event from "@ui5/webcomponents-base/dist/decorators/event-strict.js";
5
- import litRender from "@ui5/webcomponents-base/dist/renderer/LitRenderer.js";
6
7
  import { isEnter, isSpace } from "@ui5/webcomponents-base/dist/Keys.js";
7
8
  import Icon from "@ui5/webcomponents/dist/Icon.js";
8
9
  import { isDesktop } from "@ui5/webcomponents-base/dist/Device.js";
@@ -24,11 +25,10 @@ import {
24
25
  } from "./generated/i18n/i18n-defaults.js";
25
26
  import translate from "./utils/translate.js";
26
27
 
27
- import ListItemTemplate from "./generated/templates/ListItemTemplate.lit.js";
28
+ import ListItemTemplate from "./ListItemTemplate.js";
28
29
 
29
30
  // Styles
30
31
  import ListItemCss from "./generated/themes/ListItem.css.js";
31
- import type { DefaultSlot, Slot } from "@ui5/webcomponents-base/dist/UI5Element.js";
32
32
 
33
33
  const listItemClass: string = "udex-list__item";
34
34
  const listItemRole: string = "option";
@@ -64,7 +64,8 @@ type UDExListItemItemPressEventDetail = {
64
64
 
65
65
  @customElement({
66
66
  tag: "udex-list-item",
67
- renderer: litRender,
67
+ languageAware: true,
68
+ renderer: jsxRenderer,
68
69
  styles: ListItemCss,
69
70
  template: ListItemTemplate,
70
71
  dependencies: [
@@ -2,7 +2,7 @@ import UI5Element from "@ui5/webcomponents-base/dist/UI5Element.js";
2
2
  import customElement from "@ui5/webcomponents-base/dist/decorators/customElement.js";
3
3
  import property from "@ui5/webcomponents-base/dist/decorators/property.js";
4
4
  import event from "@ui5/webcomponents-base/dist/decorators/event-strict.js";
5
- import litRender from "@ui5/webcomponents-base/dist/renderer/LitRenderer.js";
5
+ import jsxRenderer from "@ui5/webcomponents-base/renderer/JsxRenderer.js";
6
6
  import { UDExListItemSize, UDExListMode, UDExListStyleType } from "./types/List.js";
7
7
  import ResizeHandler from "@ui5/webcomponents-base/dist/delegate/ResizeHandler.js";
8
8
  import i18n from "@ui5/webcomponents-base/dist/decorators/i18n.js";
@@ -37,7 +37,7 @@ type UDExListItemBaseAccordionClickEventDetail = {
37
37
  * @public
38
38
  */
39
39
  @customElement({
40
- renderer: litRender,
40
+ renderer: jsxRenderer,
41
41
  })
42
42
 
43
43
  /**
@@ -261,17 +261,22 @@ class UDExListItemBase extends UI5Element {
261
261
  @i18n("@sapudex/web-components")
262
262
  static i18nBundle: I18nBundle;
263
263
 
264
- onEnterDOM() {
264
+ onAfterRendering() {
265
265
  if (!this.collapsible) {
266
266
  return;
267
267
  }
268
268
  this.contentElement = this.shadowRoot?.querySelector<HTMLElement>(".udex-list__group-list__content");
269
269
  if (this.contentElement) {
270
- ResizeHandler.register(this.contentElement, this._resizeHandler);
271
270
  this.setContentHeight();
272
271
  }
273
272
  }
274
273
 
274
+ onEnterDOM() {
275
+ if (this.contentElement && this.collapsible) {
276
+ ResizeHandler.register(this.contentElement, this._resizeHandler);
277
+ }
278
+ }
279
+
275
280
  onExitDOM(): void {
276
281
  if (this.contentElement && this.collapsible) {
277
282
  ResizeHandler.deregister(this.contentElement, this._resizeHandler);
@@ -0,0 +1,193 @@
1
+ import type { AriaRole } from "@ui5/webcomponents-base/dist/types.js";
2
+ import type UDExListItem from "./ListItem.js";
3
+ import UDExCheckbox from "./Checkbox.js";
4
+ import UDExRadioButton from "./RadioButton.js";
5
+ import Icon from "@ui5/webcomponents/dist/Icon.js";
6
+ import UDExAvatar from "./Avatar.js";
7
+ import UDExStatusBadge from "./StatusBadge.js";
8
+ import UDExRatingIndicator from "./RatingIndicator.js";
9
+ import UDExButton from "./Button.js";
10
+ import UDExButtonSize from "./types/ButtonSize.js";
11
+ import UDExButtonDesign from "./types/ButtonDesign.js";
12
+ import slimArrowRight from "@ui5/webcomponents-icons/dist/slim-arrow-right.js";
13
+
14
+ function ContentList(this: UDExListItem) {
15
+ return (
16
+ <div
17
+ class="udex-list__content-wrap"
18
+ {...({ "_id": this._id } as object)}
19
+ aria-labelledby={`${this._id}-invisibleText`}
20
+ aria-label={this.accessibleListItemName}>
21
+ {this.flag && (
22
+ <div class="udex-list__flag-wrap">
23
+ <span class="udex-list__flag" style={{ backgroundPosition: this.flagPosition }}></span>
24
+ </div>
25
+ )}
26
+ {this.typeNumber && <span class="udex-list__number">{this.numberOfItem}.</span>}
27
+ {this.typeCircle && <span class="udex-list__circle">&#x2022;</span>}
28
+ {this.typeIcon && (
29
+ <Icon
30
+ name={this._icon}
31
+ class="udex-list__icon"
32
+ accessible-role="presentation"
33
+ aria-hidden="true"
34
+ part="icon"
35
+ />
36
+ )}
37
+ {this.image && (
38
+ <UDExAvatar
39
+ class="udex-list__avatar"
40
+ part="avatar"
41
+ shape={this.imageShape}
42
+ size={this.imageSize}>
43
+ {this.imageBadgeState && (
44
+ <UDExStatusBadge
45
+ slot="badge"
46
+ value-state={this.imageBadgeState}
47
+ size={this.imageSize}
48
+ />
49
+ )}
50
+ <img src={this.image} alt={this.imageAlt} />
51
+ </UDExAvatar>
52
+ )}
53
+ <div class="udex-list__content" part="content">
54
+ {this.label ? (
55
+ <>
56
+ <div class="udex-list__text-holder">
57
+ <span part="title" {...({ innerHTML: this.label } as object)}></span>
58
+ {this.supportingText && (
59
+ <span class="udex-list__supporting-text" part="supporting">{this.supportingText}</span>
60
+ )}
61
+ <slot part="content"></slot>
62
+ {this.hasRating && (
63
+ <UDExRatingIndicator
64
+ aria-label={this.ratingAriaLabel}
65
+ value={this.rating !== undefined ? Number(this.rating) : undefined}
66
+ rating-count={this.ratingCount}
67
+ total-count={this.totalCount}
68
+ max={this.ratingMax}
69
+ display={this._displayRating}
70
+ disabled
71
+ readonly
72
+ />
73
+ )}
74
+ </div>
75
+ {this.additionalText && (
76
+ <div class="udex-list__add-text" part="additional-text">{this.additionalText}</div>
77
+ )}
78
+ <div class="udex-list__btn-wrap">
79
+ {this.hasFirstIcon && <slot name="firstIcon" onClick={this._fireIconClickEvent as EventListener}></slot>}
80
+ {this.hasSecondIcon && <slot name="secondIcon" onClick={this._fireIconClickEvent as EventListener}></slot>}
81
+ </div>
82
+ </>
83
+ ) : (
84
+ <>
85
+ <div class="udex-list__text-holder">
86
+ <slot part="content"></slot>
87
+ {this.supportingText && (
88
+ <span class="udex-list__supporting-text" part="supporting">{this.supportingText}</span>
89
+ )}
90
+ {this.hasRating && (
91
+ <UDExRatingIndicator
92
+ aria-label={this.ratingAriaLabel}
93
+ value={this.rating !== undefined ? Number(this.rating) : undefined}
94
+ rating-count={this.ratingCount}
95
+ total-count={this.totalCount}
96
+ max={this.ratingMax}
97
+ display={this._displayRating}
98
+ disabled
99
+ readonly
100
+ />
101
+ )}
102
+ </div>
103
+ {this.additionalText && (
104
+ <div class="udex-list__add-text" part="additional-text">{this.additionalText}</div>
105
+ )}
106
+ <div class="udex-list__btn-wrap">
107
+ {this.hasFirstIcon && <slot name="firstIcon" onClick={this._fireIconClickEvent as EventListener}></slot>}
108
+ {this.hasSecondIcon && <slot name="secondIcon" onClick={this._fireIconClickEvent as EventListener}></slot>}
109
+ </div>
110
+ </>
111
+ )}
112
+ {this.collapsible && (
113
+ <div class="udex-list__group-heading__icon-wrapper">
114
+ <UDExButton
115
+ class="udex-list__group-heading__icon"
116
+ size={UDExButtonSize.Small}
117
+ design={UDExButtonDesign.Tertiary}
118
+ onMouseDown={this.handleCollapseIconMouseDown}
119
+ onClick={this.handleCollapseIconClick as EventListener}
120
+ tabindex={-1}
121
+ accessible-name={this.expandButtonAccessibleName}
122
+ {...({ "mode": "Interactive" } as object)}
123
+ icon={slimArrowRight}
124
+ />
125
+ </div>
126
+ )}
127
+ </div>
128
+ <div class="hidden" id={`${this._id}-invisibleText`}>{this.accessibleListItemName}</div>
129
+ <div class="hidden" id={`${this._id}-invisibleText-describedby`}>{this.itemState}</div>
130
+ </div>
131
+ );
132
+ }
133
+
134
+ export default function ListItemTemplate(this: UDExListItem) {
135
+ return (
136
+ <>
137
+ {this.modeSelected && (
138
+ <div
139
+ part="item"
140
+ tabIndex={Number(this._effectiveTabIndex)}
141
+ aria-disabled={this._ariaDisabled}
142
+ class={this.className}
143
+ role={this.roleItem as AriaRole}
144
+ aria-checked={this.ariaCheckedValue}
145
+ aria-selected={this.ariaSelectedValue}
146
+ aria-expanded={this.ariaExpandedValue}
147
+ onFocusIn={this.handleFocusIn}
148
+ onFocusOut={this.handleFocusOut}
149
+ onClick={this.handleItemClick}
150
+ onMouseDown={this.handleMouseDown}
151
+ onMouseUp={this.handleMouseUp}
152
+ onKeyUp={this.handleKeyUp}
153
+ onKeyDown={this.handleKeyDown}
154
+ {...({ divider: this.divider, "_id": this._id } as object)}
155
+ data-selected={this.selected}
156
+ aria-describedby={this.itemDescribedBy}>
157
+ {this.modeMultiSelect && (
158
+ <UDExCheckbox
159
+ class="udex-list__checkbox"
160
+ part="checkbox"
161
+ tabindex={-1}
162
+ indeterminate={this.indeterminate}
163
+ accessible-name={`checkbox ${this.stateAccessibleName}`}
164
+ checked={this.selected}
165
+ disabled={this.disabled}
166
+ aria-hidden={this.checkboxAriaHidden ? "true" : undefined}
167
+ />
168
+ )}
169
+ {this.modeRadioGroup && (
170
+ <UDExRadioButton
171
+ class="udex-list__radio"
172
+ part="radio"
173
+ tabindex={-1}
174
+ accessible-name={`radio ${this.stateAccessibleName}`}
175
+ checked={this.selected}
176
+ disabled={this.disabled}
177
+ />
178
+ )}
179
+ {ContentList.call(this)}
180
+ </div>
181
+ )}
182
+ {this.modeSingleContent && (
183
+ <div
184
+ part="item"
185
+ role={this.roleItem as AriaRole}
186
+ aria-selected={this.selected}
187
+ class={this.className}>
188
+ {ContentList.call(this)}
189
+ </div>
190
+ )}
191
+ </>
192
+ );
193
+ }
@@ -1,14 +1,13 @@
1
1
  import customElement from "@ui5/webcomponents-base/dist/decorators/customElement.js";
2
2
  import event from "@ui5/webcomponents-base/dist/decorators/event-strict.js";
3
- import litRender from "@ui5/webcomponents-base/dist/renderer/LitRenderer.js";
3
+ import jsxRenderer from "@ui5/webcomponents-base/renderer/JsxRenderer.js";
4
4
  import i18n from "@ui5/webcomponents-base/dist/decorators/i18n.js";
5
5
  import type I18nBundle from "@ui5/webcomponents-base/dist/i18nBundle.js";
6
6
  import { isEnter, isSpace } from "@ui5/webcomponents-base/dist/Keys.js";
7
7
  import UDExListGroupHeaderBase from "./ListGroupHeaderBase.js";
8
8
  import { UDExListMode } from "./types/List.js";
9
9
  import { SELECT_ALL } from "./generated/i18n/i18n-defaults.js";
10
- import ListSelectAllTemplate from "./generated/templates/ListSelectAllTemplate.lit.js";
11
- import UDExListItem from "./ListItem.js";
10
+ import ListSelectAllTemplate from "./ListSelectAllTemplate.js";
12
11
  import type { UDExListItemBaseEvents } from "./ListItemBase.js";
13
12
  import translate from "./utils/translate.js";
14
13
 
@@ -41,10 +40,10 @@ type UDExListSelectAllSelectAllEventDetail = {
41
40
  */
42
41
  @customElement({
43
42
  tag: "udex-list-select-all",
44
- renderer: litRender,
43
+ renderer: jsxRenderer,
44
+ languageAware: true,
45
45
  styles: ListGroupHeaderCss,
46
46
  template: ListSelectAllTemplate,
47
- dependencies: [UDExListItem],
48
47
  })
49
48
  /**
50
49
  * Fired when the user clicks on the Select All header.
@@ -0,0 +1,38 @@
1
+ import type UDExListSelectAll from "./ListSelectAll.js";
2
+ import UDExListItem from "./ListItem.js";
3
+
4
+ export default function ListSelectAllTemplate(this: UDExListSelectAll) {
5
+ return (
6
+ <div
7
+ part="item"
8
+ class="udex-list__group"
9
+ role="group"
10
+ aria-labelledby="group-select-all">
11
+ <div
12
+ role="listbox"
13
+ aria-label="select-all-group"
14
+ class={this.groupListClassName}
15
+ onui5-item-press={this.handleSelectAllGroupItemsPress}>
16
+ <UDExListItem
17
+ role="group"
18
+ part="group-item"
19
+ accessible-role="option"
20
+ mode={this.multiselectMode}
21
+ onClick={this.handleSelectAllPress}
22
+ class={this.className}
23
+ selected={this.selected}
24
+ aria-current={this.selected}
25
+ indeterminate={this.indeterminate}
26
+ controlled={this.controlled}
27
+ onKeyDown={this.handleKeyDownPress}
28
+ _tab-index={Number(this._effectiveTabIndex)}
29
+ _additional-class-name={this.additionalClassName}
30
+ supportingText={this.supportingText}
31
+ divider>
32
+ {this.selectAllLabel}
33
+ </UDExListItem>
34
+ <slot></slot>
35
+ </div>
36
+ </div>
37
+ );
38
+ }
@@ -0,0 +1,60 @@
1
+ import type UDExList from "./List.js";
2
+ import type { AriaRole } from "@ui5/webcomponents-base/types.js";
3
+
4
+ export default function ListTemplate(this: UDExList) {
5
+ return (
6
+ <>
7
+ {this.modeSelected && (
8
+ <div
9
+ class="udex-list-root"
10
+ onKeyDown={this.handleKeyDown}
11
+ style={{ height: this.holderHeight }}
12
+ onui5-item-press={this.handleItemPress}
13
+ onui5-header-press={this.handleItemPress}>
14
+ <div class="udex-list__scroll-container">
15
+ {HeaderText.call(this)}
16
+ <span id={`${this._id}-mode-label`} class="udex-list__hidden-text">
17
+ {this.ariaLabelModeText}
18
+ </span>
19
+ <div
20
+ id="udex-list"
21
+ class="udex-list"
22
+ role={this.effectiveAccessibleRole as AriaRole}
23
+ aria-labelledby={this.ariaLabelledBy}
24
+ aria-multiselectable={this._listAriaMultiSelectable as "true" | undefined}
25
+ aria-busy={(this.ariaBusy ?? undefined) as "true" | "false" | undefined}>
26
+ <slot></slot>
27
+ </div>
28
+ </div>
29
+ </div>
30
+ )}
31
+ {this.modeSingleContent && (
32
+ <>
33
+ {HeaderText.call(this)}
34
+ <div
35
+ id="udex-list"
36
+ class="udex-list"
37
+ role={this.accessibleRole as AriaRole}
38
+ aria-label={this.singleContentAriaLabel}
39
+ aria-busy={(this.ariaBusy ?? undefined) as "true" | "false" | undefined}>
40
+ <slot></slot>
41
+ </div>
42
+ </>
43
+ )}
44
+ </>
45
+ );
46
+ }
47
+
48
+ function HeaderText(this: UDExList) {
49
+ if (!this.headerText) {
50
+ return null;
51
+ }
52
+ return (
53
+ <header
54
+ id={`${this._id}-mode-label`}
55
+ class="udex-list__header-text"
56
+ part="header">
57
+ {this.headerText}
58
+ </header>
59
+ );
60
+ }
@@ -371,6 +371,9 @@ class UDExMediaPlayer extends UI5Element {
371
371
  });
372
372
 
373
373
  player.on("ended", () => {
374
+ this.video25 = false;
375
+ this.video50 = false;
376
+ this.video75 = false;
374
377
  this.fireDecoratorEvent("videoComplete");
375
378
  });
376
379
 
@@ -621,6 +624,9 @@ class UDExMediaPlayer extends UI5Element {
621
624
 
622
625
  handleEmbedVideoEnded() {
623
626
  this._embedVideoStartFired = false;
627
+ this.video25 = false;
628
+ this.video50 = false;
629
+ this.video75 = false;
624
630
  this.fireDecoratorEvent("videoComplete");
625
631
  }
626
632