@sapudex/web-components 2.11.0 → 2.12.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 (131) hide show
  1. package/cypress/fixtures/profile-menu.ts +75 -0
  2. package/cypress/specs/ListItem.cy.tsx +66 -52
  3. package/cypress/specs/MastheadProfileMenu.cy.tsx +174 -0
  4. package/cypress/specs/SelectBox.cy.tsx +134 -66
  5. package/cypress/support/component-imports.instrumented.ts +4 -0
  6. package/cypress/support/component-imports.src.ts +4 -0
  7. package/dist/Button.d.ts +8 -0
  8. package/dist/Button.js +11 -0
  9. package/dist/Button.js.map +1 -1
  10. package/dist/List.d.ts +9 -2
  11. package/dist/List.js +19 -8
  12. package/dist/List.js.map +1 -1
  13. package/dist/ListGroupHeader.d.ts +2 -1
  14. package/dist/ListGroupHeader.js.map +1 -1
  15. package/dist/ListItem.d.ts +12 -1
  16. package/dist/ListItem.js +15 -1
  17. package/dist/ListItem.js.map +1 -1
  18. package/dist/ListItemBase.d.ts +10 -0
  19. package/dist/ListItemBase.js +31 -0
  20. package/dist/ListItemBase.js.map +1 -1
  21. package/dist/ListSelectAll.d.ts +2 -1
  22. package/dist/ListSelectAll.js.map +1 -1
  23. package/dist/MastheadItem.d.ts +2 -0
  24. package/dist/MastheadItem.js +6 -0
  25. package/dist/MastheadItem.js.map +1 -1
  26. package/dist/MastheadProfileMenu.d.ts +67 -3
  27. package/dist/MastheadProfileMenu.js +164 -10
  28. package/dist/MastheadProfileMenu.js.map +1 -1
  29. package/dist/MastheadShell.d.ts +1 -0
  30. package/dist/MastheadShell.js +6 -1
  31. package/dist/MastheadShell.js.map +1 -1
  32. package/dist/SearchableListBase.d.ts +16 -0
  33. package/dist/SearchableListBase.js +31 -1
  34. package/dist/SearchableListBase.js.map +1 -1
  35. package/dist/SelectBox.js +10 -0
  36. package/dist/SelectBox.js.map +1 -1
  37. package/dist/SelectBoxItem.d.ts +29 -0
  38. package/dist/SelectBoxItem.js +26 -0
  39. package/dist/SelectBoxItem.js.map +1 -1
  40. package/dist/StatusBadge.d.ts +1 -7
  41. package/dist/StatusBadge.js +1 -8
  42. package/dist/StatusBadge.js.map +1 -1
  43. package/dist/StepInputTemplate.js +1 -1
  44. package/dist/StepInputTemplate.js.map +1 -1
  45. package/dist/assets/{InputSuggestions-9WQMOg4t.js → InputSuggestions-DtUQULbo.js} +1 -1
  46. package/dist/assets/{ListItemStandardExpandableTextTemplate-BQaMMo_n.js → ListItemStandardExpandableTextTemplate-B62PaSFk.js} +1 -1
  47. package/dist/assets/{bundle.esm-ZNiP-jPI.js → bundle.esm-Ba8g4ech.js} +210 -210
  48. package/dist/assets/messagebundle_en-PmkE-Vht.js +1 -0
  49. package/dist/css/themes/Button.css +1 -1
  50. package/dist/css/themes/ListItem.css +1 -1
  51. package/dist/css/themes/MastheadProfileMenu.css +1 -1
  52. package/dist/css/themes/RatingIndicator.css +1 -1
  53. package/dist/css/themes/Slider.css +1 -1
  54. package/dist/css/themes/StepInput.css +1 -1
  55. package/dist/custom-elements-internal.json +1039 -255
  56. package/dist/custom-elements.json +867 -237
  57. package/dist/generated/assets/i18n/messagebundle_en.json +1 -1
  58. package/dist/generated/i18n/i18n-defaults.d.ts +5 -1
  59. package/dist/generated/i18n/i18n-defaults.js +5 -1
  60. package/dist/generated/i18n/i18n-defaults.js.map +1 -1
  61. package/dist/generated/templates/ListItemTemplate.lit.js +31 -23
  62. package/dist/generated/templates/ListItemTemplate.lit.js.map +1 -1
  63. package/dist/generated/templates/ListTemplate.lit.js +2 -2
  64. package/dist/generated/templates/ListTemplate.lit.js.map +1 -1
  65. package/dist/generated/templates/MastheadProfileMenuTemplate.lit.js +11 -6
  66. package/dist/generated/templates/MastheadProfileMenuTemplate.lit.js.map +1 -1
  67. package/dist/generated/templates/SearchableListBaseTemplate.lit.js +6 -6
  68. package/dist/generated/templates/SearchableListBaseTemplate.lit.js.map +1 -1
  69. package/dist/generated/themes/Button.css.d.ts +1 -1
  70. package/dist/generated/themes/Button.css.js +1 -1
  71. package/dist/generated/themes/Button.css.js.map +1 -1
  72. package/dist/generated/themes/ListItem.css.d.ts +1 -1
  73. package/dist/generated/themes/ListItem.css.js +1 -1
  74. package/dist/generated/themes/ListItem.css.js.map +1 -1
  75. package/dist/generated/themes/MastheadProfileMenu.css.d.ts +1 -1
  76. package/dist/generated/themes/MastheadProfileMenu.css.js +1 -1
  77. package/dist/generated/themes/MastheadProfileMenu.css.js.map +1 -1
  78. package/dist/generated/themes/RatingIndicator.css.d.ts +1 -1
  79. package/dist/generated/themes/RatingIndicator.css.js +1 -1
  80. package/dist/generated/themes/RatingIndicator.css.js.map +1 -1
  81. package/dist/generated/themes/Slider.css.d.ts +1 -1
  82. package/dist/generated/themes/Slider.css.js +1 -1
  83. package/dist/generated/themes/Slider.css.js.map +1 -1
  84. package/dist/generated/themes/StepInput.css.d.ts +1 -1
  85. package/dist/generated/themes/StepInput.css.js +1 -1
  86. package/dist/generated/themes/StepInput.css.js.map +1 -1
  87. package/dist/messagebundle.properties +4 -0
  88. package/dist/messagebundle_en.properties +4 -0
  89. package/dist/types/StatusBadgeValueState.d.ts +8 -0
  90. package/dist/types/StatusBadgeValueState.js +10 -0
  91. package/dist/types/StatusBadgeValueState.js.map +1 -0
  92. package/dist/vscode.html-custom-data.json +83 -16
  93. package/dist/web-types.json +374 -30
  94. package/package.json +1 -1
  95. package/src/Button.ts +10 -0
  96. package/src/List.hbs +0 -2
  97. package/src/List.ts +27 -8
  98. package/src/ListGroupHeader.ts +2 -1
  99. package/src/ListItem.hbs +16 -2
  100. package/src/ListItem.ts +29 -2
  101. package/src/ListItemBase.ts +42 -0
  102. package/src/ListSelectAll.ts +2 -1
  103. package/src/MastheadItem.ts +9 -0
  104. package/src/MastheadProfileMenu.hbs +79 -15
  105. package/src/MastheadProfileMenu.ts +228 -13
  106. package/src/MastheadShell.ts +7 -1
  107. package/src/SearchableListBase.hbs +18 -1
  108. package/src/SearchableListBase.ts +47 -1
  109. package/src/SelectBox.ts +11 -0
  110. package/src/SelectBoxItem.ts +39 -0
  111. package/src/StatusBadge.ts +1 -8
  112. package/src/StepInputTemplate.tsx +1 -1
  113. package/src/generated/i18n/i18n-defaults.ts +2 -2
  114. package/src/generated/templates/ListItemTemplate.lit.ts +31 -23
  115. package/src/generated/templates/ListTemplate.lit.ts +2 -2
  116. package/src/generated/templates/MastheadProfileMenuTemplate.lit.ts +10 -5
  117. package/src/generated/templates/SearchableListBaseTemplate.lit.ts +6 -6
  118. package/src/generated/themes/Button.css.ts +1 -1
  119. package/src/generated/themes/ListItem.css.ts +1 -1
  120. package/src/generated/themes/MastheadProfileMenu.css.ts +1 -1
  121. package/src/generated/themes/RatingIndicator.css.ts +1 -1
  122. package/src/generated/themes/Slider.css.ts +1 -1
  123. package/src/generated/themes/StepInput.css.ts +1 -1
  124. package/src/i18n/messagebundle.properties +4 -0
  125. package/src/i18n/messagebundle_en.properties +4 -0
  126. package/src/themes/Button.css +13 -0
  127. package/src/themes/ListItem.css +4 -9
  128. package/src/themes/MastheadProfileMenu.css +87 -3
  129. package/src/themes/StepInput.css +10 -0
  130. package/src/types/StatusBadgeValueState.ts +9 -0
  131. package/dist/assets/messagebundle_en-DwlTjyni.js +0 -1
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "@sapudex/web-components",
4
- "version": "2.11.0",
4
+ "version": "2.12.0",
5
5
  "publishConfig": {
6
6
  "registry": "https://registry.npmjs.org/"
7
7
  },
package/src/Button.ts CHANGED
@@ -8,6 +8,7 @@ import type I18nBundle from "@ui5/webcomponents-base/dist/i18nBundle.js";
8
8
  import {
9
9
  BUTTON_ARIA_ATTENTION, BUTTON_ARIA_DEFAULT, BUTTON_ARIA_EMPHASIZED, BUTTON_ARIA_TRANSPARENT, BUTTON_ARIA_TYPE_NEGATIVE, BUTTON_ARIA_TYPE_POSITIVE, BUTTON_ARIA_TYPE_PRIMARY, BUTTON_ARIA_TYPE_SECONDARY, BUTTON_ARIA_TYPE_TERTIARY, BUTTON_ARIA_TYPE_WARNING, TOGGLED,
10
10
  } from "./generated/i18n/i18n-defaults.js";
11
+ import WrappingType from "@ui5/webcomponents/dist/types/WrappingType.js";
11
12
  import UDExButtonSize from "./types/ButtonSize.js";
12
13
  import UDExButtonDesign from "./types/ButtonDesign.js";
13
14
 
@@ -77,6 +78,15 @@ class UDExButton extends Button {
77
78
  @property({ type: Boolean })
78
79
  _ariaDisabled!: boolean;
79
80
 
81
+ /**
82
+ * Defines if button should wrap text inside
83
+ *
84
+ * @default false
85
+ * @public
86
+ */
87
+ @property({ type: String })
88
+ wrappingType: `${WrappingType}` = WrappingType.None;
89
+
80
90
  @i18n("@sapudex/web-components")
81
91
  static i18nBundle: I18nBundle;
82
92
 
package/src/List.hbs CHANGED
@@ -13,7 +13,6 @@
13
13
  class="udex-list"
14
14
  role="{{accessibleRole}}"
15
15
  aria-labelledby="{{ariaLabelledBy}}"
16
- aria-label="{{accessibleName}}"
17
16
  aria-busy="{{ariaBusy}}">
18
17
  <slot></slot>
19
18
  </div>
@@ -27,7 +26,6 @@
27
26
  class="udex-list"
28
27
  role="{{accessibleRole}}"
29
28
  aria-labelledby="{{ariaLabelledBy}}"
30
- aria-label="{{accessibleName}}"
31
29
  aria-busy="{{ariaBusy}}">
32
30
  <slot></slot>
33
31
  </div>
package/src/List.ts CHANGED
@@ -135,12 +135,21 @@ class UDExList extends UI5Element {
135
135
  /**
136
136
  * Defines the name of the UI5 Icon, that will be displayed for each item of the list.
137
137
  *
138
- * @defaultv ""
139
- * @private
138
+ * @default ""
139
+ * @public
140
140
  */
141
141
  @property({ type: String })
142
142
  itemIcon: string = "";
143
143
 
144
+ /**
145
+ * Enables tab navigation for the list.
146
+ *
147
+ * @default ""
148
+ * @public
149
+ */
150
+ @property({ type: Boolean })
151
+ tabNavigationEnabled?: boolean;
152
+
144
153
  /**
145
154
  * Slot for list items.
146
155
  *
@@ -167,6 +176,9 @@ class UDExList extends UI5Element {
167
176
  }
168
177
 
169
178
  handleKeyDown(e: KeyboardEvent): void {
179
+ if (this.tabNavigationEnabled) {
180
+ return;
181
+ }
170
182
  if (isUp(e)) {
171
183
  this.handleUpArrow(e);
172
184
  }
@@ -323,8 +335,10 @@ class UDExList extends UI5Element {
323
335
  clickedItem.selected = true;
324
336
  }
325
337
 
326
- this.resetTabIndexes();
327
- clickedItem._tabIndex = "0";
338
+ if (!this.tabNavigationEnabled) {
339
+ this.resetTabIndexes();
340
+ clickedItem._tabIndex = "0";
341
+ }
328
342
 
329
343
  this.fireDecoratorEvent("selection-change", {
330
344
  listItems: this.getItemsFromList(),
@@ -406,6 +420,10 @@ class UDExList extends UI5Element {
406
420
  }
407
421
 
408
422
  getTabIndex(index: number, item: UDExListItemBase): string {
423
+ if (this.tabNavigationEnabled) {
424
+ return "0";
425
+ }
426
+
409
427
  const isFirstItem = this.modeSelected && index === 0;
410
428
  const isFirstItemInGroupList = this.isGroupList && index === 1;
411
429
  const listGroupHeader = item.closest("[udex-list-group-header]") as UDExListGroupHeader;
@@ -433,10 +451,11 @@ class UDExList extends UI5Element {
433
451
  }
434
452
 
435
453
  get ariaLabelModeText(): string {
436
- if (this.modeSingleSelect || this.modeRadioGroup) {
437
- return UDExList.i18nBundle.getText(ARIA_LABEL_LIST_SELECTABLE);
438
- }
439
- return UDExList.i18nBundle.getText(ARIA_LABEL_LIST_MULTISELECTABLE);
454
+ const defaultText = this.modeSingleSelect || this.modeRadioGroup
455
+ ? ARIA_LABEL_LIST_SELECTABLE
456
+ : ARIA_LABEL_LIST_MULTISELECTABLE;
457
+
458
+ return this.accessibleName || UDExList.i18nBundle.getText(defaultText);
440
459
  }
441
460
 
442
461
  get ariaLabelledBy(): string {
@@ -6,6 +6,7 @@ import Icon from "@ui5/webcomponents/dist/Icon.js";
6
6
  import UDExListGroupHeaderBase from "./ListGroupHeaderBase.js";
7
7
  import ListGroupHeaderTemplate from "./generated/templates/ListGroupHeaderTemplate.lit.js";
8
8
  import { UDExListItemSize } from "./types/List.js";
9
+ import type { UDExListItemBaseEvents } from "./ListItemBase.js";
9
10
 
10
11
  // Styles
11
12
  import ListGroupHeaderCss from "./generated/themes/ListGroupHeader.css.js";
@@ -48,7 +49,7 @@ type UDExListGroupHeaderBaseHeaderPressEventDetail = {
48
49
  class UDExListGroupHeader extends UDExListGroupHeaderBase {
49
50
  eventDetails!: {
50
51
  "header-press": UDExListGroupHeaderBaseHeaderPressEventDetail,
51
- };
52
+ } & UDExListItemBaseEvents;
52
53
 
53
54
  handleHeaderPress() {
54
55
  if (!this.controlled) {
package/src/ListItem.hbs CHANGED
@@ -74,6 +74,13 @@
74
74
  shape="{{imageShape}}"
75
75
  size="{{imageSize}}"
76
76
  part="avatar">
77
+ {{#if imageBadgeState}}
78
+ <udex-status-badge
79
+ slot="badge"
80
+ value-state="{{imageBadgeState}}"
81
+ size="{{imageSize}}">
82
+ </udex-status-badge>
83
+ {{/if}}
77
84
  <img src="{{image}}" alt="{{imageAlt}}" />
78
85
  </udex-avatar>
79
86
  {{/if}}
@@ -86,6 +93,13 @@
86
93
  {{/if}}
87
94
  <slot part="content"></slot>
88
95
  </div>
96
+ {{#if additionalText}}<div class="udex-list__add-text" part="additional-text">{{additionalText}}</div>{{/if}}
97
+ {{#if hasFirstIcon}}
98
+ <slot name="firstIcon" @click={{_fireIconClickEvent}}></slot>
99
+ {{/if}}
100
+ {{#if hasSecondIcon}}
101
+ <slot name="secondIcon" @click={{_fireIconClickEvent}}></slot>
102
+ {{/if}}
89
103
  {{else}}
90
104
  <div class="udex-list__text-holder">
91
105
  <slot part="content"></slot>
@@ -93,10 +107,10 @@
93
107
  </div>
94
108
  {{#if additionalText}}<div class="udex-list__add-text" part="additional-text">{{additionalText}}</div>{{/if}}
95
109
  {{#if hasFirstIcon}}
96
- <slot name="firstIcon"></slot>
110
+ <slot name="firstIcon" @click={{_fireIconClickEvent}}></slot>
97
111
  {{/if}}
98
112
  {{#if hasSecondIcon}}
99
- <slot name="secondIcon"></slot>
113
+ <slot name="secondIcon" @click={{_fireIconClickEvent}}></slot>
100
114
  {{/if}}
101
115
  {{/if}}
102
116
  </div>
package/src/ListItem.ts CHANGED
@@ -7,10 +7,13 @@ import { isEnter, isSpace } from "@ui5/webcomponents-base/dist/Keys.js";
7
7
  import Icon from "@ui5/webcomponents/dist/Icon.js";
8
8
  import { isDesktop } from "@ui5/webcomponents-base/dist/Device.js";
9
9
  import UDExCheckbox from "./Checkbox.js";
10
+ import type { UDExListItemBaseEvents } from "./ListItemBase.js";
10
11
  import UDExListItemBase from "./ListItemBase.js";
11
12
  import type UDExListGroupHeaderBase from "./ListGroupHeaderBase.js";
12
13
  import UDExAvatar, { UDExAvatarShape, UDExAvatarSize } from "./Avatar.js";
13
14
  import UDExButton from "./Button.js";
15
+ import UDExStatusBadge from "./StatusBadge.js";
16
+ import type UDExStatusBadgeValueState from "./types/StatusBadgeValueState.js";
14
17
  import {
15
18
  UDExListItemSize, UDExListMode, UDExAdditionalTextState,
16
19
  } from "./types/List.js";
@@ -68,6 +71,7 @@ type UDExListItemItemPressEventDetail = {
68
71
  UDExButton,
69
72
  UDExRadioButton,
70
73
  UDExCheckbox,
74
+ UDExStatusBadge,
71
75
  Icon,
72
76
  ],
73
77
  })
@@ -89,7 +93,16 @@ class UDExListItem extends UDExListItemBase {
89
93
  eventDetails!: {
90
94
  "item-press": UDExListItemItemPressEventDetail,
91
95
  "item-focus": UDExListItemBaseEventDetail,
92
- };
96
+ } & UDExListItemBaseEvents;
97
+ /**
98
+ * Defines the image badge state of the component.
99
+ *
100
+ * @default ""
101
+ * @public
102
+ */
103
+ @property()
104
+ imageBadgeState?: `${UDExStatusBadgeValueState}`;
105
+
93
106
  /**
94
107
  * Defines the accessible name of the item.
95
108
  *
@@ -190,6 +203,7 @@ class UDExListItem extends UDExListItemBase {
190
203
  */
191
204
  @slot({ type: Node, "default": true })
192
205
  content!: Array<Node>;
206
+
193
207
  /**
194
208
  * Slot for first icon.
195
209
  *
@@ -198,6 +212,7 @@ class UDExListItem extends UDExListItemBase {
198
212
  */
199
213
  @slot({ type: UDExButton })
200
214
  firstIcon!: Array<UDExButton>;
215
+
201
216
  /**
202
217
  * Slot for second icon.
203
218
  *
@@ -261,6 +276,10 @@ class UDExListItem extends UDExListItemBase {
261
276
  }
262
277
 
263
278
  handleKeyDown(e: KeyboardEvent) {
279
+ if (this.firstIconElement === e.target || this.secondIconElement === e.target) {
280
+ return;
281
+ }
282
+
264
283
  if (isSpace(e)) {
265
284
  e.preventDefault();
266
285
  }
@@ -324,6 +343,14 @@ class UDExListItem extends UDExListItemBase {
324
343
  return `${listItemClass} ${groupClassName} ${this._additionalClassName} ${controlledClassName} ${largeSizeClassName}`.trim();
325
344
  }
326
345
 
346
+ get firstIconElement(): UDExButton {
347
+ return this.getSlottedNodes<UDExButton>("firstIcon")[0];
348
+ }
349
+
350
+ get secondIconElement(): UDExButton {
351
+ return this.getSlottedNodes<UDExButton>("secondIcon")[0];
352
+ }
353
+
327
354
  get hasFirstIcon(): boolean {
328
355
  return !!this.firstIcon;
329
356
  }
@@ -357,7 +384,7 @@ class UDExListItem extends UDExListItemBase {
357
384
  }
358
385
 
359
386
  get accessibleListItemName(): string {
360
- return this.accessibleName || this.label;
387
+ return this.accessibleName || this.label?.replace(/<[^>]+>/g, "");
361
388
  }
362
389
 
363
390
  get stateAccessibleName(): string {
@@ -1,9 +1,20 @@
1
1
  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
+ import event from "@ui5/webcomponents-base/dist/decorators/event-strict.js";
4
5
  import litRender from "@ui5/webcomponents-base/dist/renderer/LitRenderer.js";
5
6
  import { UDExListItemSize, UDExListMode, UDExListStyleType } from "./types/List.js";
6
7
 
8
+ type UDExListItemBaseEventDetail = {
9
+ originalEvent: PointerEvent,
10
+ item: HTMLElement,
11
+ }
12
+
13
+ export type UDExListItemBaseEvents = {
14
+ "first-icon-click": UDExListItemBaseEventDetail,
15
+ "second-icon-click": UDExListItemBaseEventDetail,
16
+ }
17
+
7
18
  /**
8
19
  * @class
9
20
  *
@@ -20,7 +31,22 @@ import { UDExListItemSize, UDExListMode, UDExListStyleType } from "./types/List.
20
31
  renderer: litRender,
21
32
  })
22
33
 
34
+ /**
35
+ * Fired event when the user click on a first icon.
36
+ *
37
+ * @public
38
+ */
39
+ @event("first-icon-click", { bubbles: true })
40
+ /**
41
+ * Fired event when the user click on a second icon.
42
+ *
43
+ * @public
44
+ */
45
+ @event("second-icon-click", { bubbles: true })
46
+
23
47
  class UDExListItemBase extends UI5Element {
48
+ eventDetails!: UDExListItemBaseEvents;
49
+
24
50
  /**
25
51
  * Defines the <code>label</code> for the item.
26
52
  *
@@ -114,6 +140,22 @@ class UDExListItemBase extends UI5Element {
114
140
  @property({ type: String })
115
141
  _tabIndex!: string;
116
142
 
143
+ _fireIconClickEvent(e: PointerEvent): void {
144
+ const target = e.target as HTMLElement;
145
+ const slot = target.getAttribute("slot");
146
+ if (slot === "firstIcon") {
147
+ this.fireDecoratorEvent("first-icon-click", {
148
+ originalEvent: e,
149
+ item: this,
150
+ });
151
+ } else if (slot === "secondIcon") {
152
+ this.fireDecoratorEvent("second-icon-click", {
153
+ originalEvent: e,
154
+ item: this,
155
+ });
156
+ }
157
+ }
158
+
117
159
  get _effectiveTabIndex(): string {
118
160
  if (this.disabled) {
119
161
  return "-1";
@@ -9,6 +9,7 @@ import { UDExListMode } from "./types/List.js";
9
9
  import { SELECT_ALL } from "./generated/i18n/i18n-defaults.js";
10
10
  import ListSelectAllTemplate from "./generated/templates/ListSelectAllTemplate.lit.js";
11
11
  import UDExListItem from "./ListItem.js";
12
+ import type { UDExListItemBaseEvents } from "./ListItemBase.js";
12
13
 
13
14
  // Styles
14
15
  import ListGroupHeaderCss from "./generated/themes/ListGroupHeader.css.js";
@@ -50,7 +51,7 @@ type UDExListSelectAllSelectAllEventDetail = {
50
51
  class UDExListSelectAll extends UDExListGroupHeaderBase {
51
52
  eventDetails!: {
52
53
  "select-all": UDExListSelectAllSelectAllEventDetail,
53
- };
54
+ } & UDExListItemBaseEvents;
54
55
 
55
56
  @i18n("@sapudex/web-components")
56
57
  static i18nBundle: I18nBundle;
@@ -23,6 +23,8 @@ import { UDExTarget } from "./types/common.js";
23
23
  import { BreakpointUtils } from "./utils/Breakpoints.js";
24
24
  import parseArrayFromString from "./utils/parseArrayFromString.js";
25
25
  import AnalyticsName from "./types/AnalyticsName.js";
26
+ import type UDExMastheadProfileMenu from "./MastheadProfileMenu.js";
27
+
26
28
  // Styles
27
29
  import MastheadItemCss from "./generated/themes/MastheadItem.css.js";
28
30
 
@@ -398,6 +400,9 @@ class UDExMastheadItem extends UI5Element implements IMastheadItem {
398
400
  }
399
401
 
400
402
  handleItemClick(e: PointerEvent): void {
403
+ if (this.isProfileBtn) {
404
+ this.profileSlot.closeIdentitiesPanel();
405
+ }
401
406
  this.handleSelectedChange();
402
407
  this.fireItemClickEvent(e);
403
408
  this.fireDropdownEvents();
@@ -626,6 +631,10 @@ class UDExMastheadItem extends UI5Element implements IMastheadItem {
626
631
  return this.accessibleName || this.innerText || (this.isProfileBtn ? UDExMastheadItem.i18nBundle.getText(PROFILE) : "");
627
632
  }
628
633
 
634
+ get profileSlot(): UDExMastheadProfileMenu {
635
+ return this.getSlottedNodes<UDExMastheadProfileMenu>("dropdown")[0];
636
+ }
637
+
629
638
  get isMobile(): boolean {
630
639
  return BreakpointUtils.isAtMost("M") || this.mastheadShell?._isMobileMode;
631
640
  }
@@ -1,4 +1,14 @@
1
- <div class="udex-masthead-profile-menu">
1
+ <div
2
+ @keydown="{{handleKeydown}}"
3
+ class="{{rootClass}}">
4
+ {{#if _openIdentities}}
5
+ {{> account-indetities}}
6
+ {{else}}
7
+ {{> account-profile}}
8
+ {{/if}}
9
+ </div>
10
+
11
+ {{#*inline "account-profile"}}
2
12
  <div class="udex-masthead-profile-menu__header">
3
13
  {{#if userData}}
4
14
  <udex-avatar
@@ -6,35 +16,89 @@
6
16
  size="L"
7
17
  initials="{{userData.avatarInitials}}">
8
18
  {{#if userData.avatarUrl}}
9
- <img src="{{userData.avatarUrl}}" alt="avatar"/>
19
+ <img src="{{userData.avatarUrl}}" alt="avatar"/>
10
20
  {{/if}}
11
21
  </udex-avatar>
12
22
  <div>
13
23
  <p class="udex-profile-menu__account-name">{{userData.name}}</p>
14
24
  <p class="udex-profile-menu__account-email">{{userData.email}}</p>
25
+ {{#if hasIdentities}}
26
+ <udex-button
27
+ @click="{{handleSwitcherClick}}"
28
+ class="udex-masthead-profile-menu__btn-switcher"
29
+ size="Large"
30
+ end-icon="slim-arrow-right"
31
+ design="Invisible">
32
+ {{switcherAccountText}}
33
+ </udex-button>
34
+ {{/if}}
15
35
  </div>
16
36
  {{/if}}
17
37
  </div>
18
38
  {{#if messageAvailable}}
19
39
  <div class="udex-masthead-profile-menu__message">
20
- <slot name="message"></slot>
40
+ <slot name="message"></slot>
21
41
  </div>
22
42
  {{/if}}
23
43
  <div class="udex-masthead-profile-menu__links">
24
44
  <udex-masthead-menu
25
- part="menu"
26
- exportparts="badge, menu-item"
27
- sub-items='{{linksList}}'
28
- @ui5-menu-item-click="{{handleProfileMenuItemClick}}">
45
+ exportparts="badge, menu-item"
46
+ part="menu"
47
+ sub-items='{{linksList}}'
48
+ @ui5-menu-item-click="{{handleProfileMenuItemClick}}">
29
49
  </udex-masthead-menu>
30
50
  {{#if logoutLink}}
31
- <div class="udex-masthead-profile-menu__actions">
32
- <udex-masthead-menu-item
33
- @click="{{handleUserLogoutItemClick}}"
34
- url="{{logoutUrl}}"
35
- label="{{logoutText}}">
36
- </udex-masthead-menu-item>
37
- </div>
51
+ <div class="udex-masthead-profile-menu__actions">
52
+ <udex-masthead-menu-item
53
+ @click="{{handleUserLogoutItemClick}}"
54
+ label="{{logoutText}}"
55
+ url="{{logoutUrl}}">
56
+ </udex-masthead-menu-item>
57
+ </div>
38
58
  {{/if}}
39
59
  </div>
40
- </div>
60
+ {{/inline}}
61
+
62
+ {{#*inline "account-indetities"}}
63
+ <div class="udex-masthead-profile-menu__header-wrap back-btn">
64
+ <udex-masthead-menu-item
65
+ class="udex-masthead-profile-menu__btn-back"
66
+ @click="{{handleSwitcherClick}}"
67
+ label="{{btnBackText}}"
68
+ type="Button"
69
+ icon-start>
70
+ </udex-masthead-menu-item>
71
+ <span class="udex-masthead-profile-menu__switcher-title">{{switcherAccountText}}</span>
72
+ </div>
73
+ <div class="udex-masthead-profile-menu__identities-list-wrap">
74
+ <span class="udex-masthead-profile-menu__identities-list-title">{{listTitleText}}</span>
75
+ {{#if identitiesList.length}}
76
+ <udex-list
77
+ class="udex-masthead-profile-menu__identities-list"
78
+ mode="SingleSelect"
79
+ accessible-name="{{listTitleText}}"
80
+ controlled>
81
+ {{#each identitiesList}}
82
+ <udex-list-item
83
+ id="{{this.idsUser}}"
84
+ class="udex-masthead-profile-menu__identities-list-item"
85
+ @ui5-item-press="{{../fireEventIdentityItemClick}}"
86
+ supporting-text="{{this.supportingText}}"
87
+ image-badge-state="{{this.statusBadge}}"
88
+ image="{{this.avatarUrl}}"
89
+ image-alt="{{this.name}}">
90
+ {{this.email}}
91
+ </udex-list-item>
92
+ {{/each}}
93
+ </udex-list>
94
+ {{/if}}
95
+ <udex-button
96
+ @click="{{fireEventAddOrRemoveAccountClick}}"
97
+ class="udex-masthead-profile-menu__add-remove-btn"
98
+ design="Primary"
99
+ end-icon="action"
100
+ size="Large">
101
+ {{addOrRemoveAccountText}}
102
+ </udex-button>
103
+ </div>
104
+ {{/inline}}