@sapudex/web-components 2.11.0 → 2.12.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cypress/fixtures/profile-menu.ts +75 -0
- package/cypress/specs/ListItem.cy.tsx +66 -52
- package/cypress/specs/MastheadProfileMenu.cy.tsx +174 -0
- package/cypress/specs/SelectBox.cy.tsx +134 -66
- package/cypress/support/component-imports.instrumented.ts +4 -0
- package/cypress/support/component-imports.src.ts +4 -0
- package/dist/Button.d.ts +8 -0
- package/dist/Button.js +11 -0
- package/dist/Button.js.map +1 -1
- package/dist/List.d.ts +9 -2
- package/dist/List.js +19 -8
- package/dist/List.js.map +1 -1
- package/dist/ListGroupHeader.d.ts +2 -1
- package/dist/ListGroupHeader.js.map +1 -1
- package/dist/ListItem.d.ts +12 -1
- package/dist/ListItem.js +15 -1
- package/dist/ListItem.js.map +1 -1
- package/dist/ListItemBase.d.ts +10 -0
- package/dist/ListItemBase.js +31 -0
- package/dist/ListItemBase.js.map +1 -1
- package/dist/ListSelectAll.d.ts +2 -1
- package/dist/ListSelectAll.js.map +1 -1
- package/dist/MastheadItem.d.ts +2 -0
- package/dist/MastheadItem.js +6 -0
- package/dist/MastheadItem.js.map +1 -1
- package/dist/MastheadProfileMenu.d.ts +67 -3
- package/dist/MastheadProfileMenu.js +164 -10
- package/dist/MastheadProfileMenu.js.map +1 -1
- package/dist/MastheadShell.d.ts +1 -0
- package/dist/MastheadShell.js +6 -1
- package/dist/MastheadShell.js.map +1 -1
- package/dist/SearchableListBase.d.ts +16 -0
- package/dist/SearchableListBase.js +31 -1
- package/dist/SearchableListBase.js.map +1 -1
- package/dist/SelectBox.js +10 -0
- package/dist/SelectBox.js.map +1 -1
- package/dist/SelectBoxItem.d.ts +29 -0
- package/dist/SelectBoxItem.js +26 -0
- package/dist/SelectBoxItem.js.map +1 -1
- package/dist/StatusBadge.d.ts +1 -7
- package/dist/StatusBadge.js +1 -8
- package/dist/StatusBadge.js.map +1 -1
- package/dist/StepInputTemplate.js +1 -1
- package/dist/StepInputTemplate.js.map +1 -1
- package/dist/assets/{InputSuggestions-9WQMOg4t.js → InputSuggestions-CgAp8PwR.js} +1 -1
- package/dist/assets/{ListItemStandardExpandableTextTemplate-BQaMMo_n.js → ListItemStandardExpandableTextTemplate-D5HEHY33.js} +1 -1
- package/dist/assets/{bundle.esm-ZNiP-jPI.js → bundle.esm-CjcqU0ib.js} +210 -210
- package/dist/assets/messagebundle_en-PmkE-Vht.js +1 -0
- package/dist/css/themes/Button.css +1 -1
- package/dist/css/themes/ListItem.css +1 -1
- package/dist/css/themes/MastheadProfileMenu.css +1 -1
- package/dist/css/themes/RatingIndicator.css +1 -1
- package/dist/css/themes/Slider.css +1 -1
- package/dist/css/themes/StepInput.css +1 -1
- package/dist/custom-elements-internal.json +907 -123
- package/dist/custom-elements.json +738 -108
- package/dist/generated/assets/i18n/messagebundle_en.json +1 -1
- package/dist/generated/i18n/i18n-defaults.d.ts +5 -1
- package/dist/generated/i18n/i18n-defaults.js +5 -1
- package/dist/generated/i18n/i18n-defaults.js.map +1 -1
- package/dist/generated/templates/ListItemTemplate.lit.js +31 -23
- package/dist/generated/templates/ListItemTemplate.lit.js.map +1 -1
- package/dist/generated/templates/ListTemplate.lit.js +2 -2
- package/dist/generated/templates/ListTemplate.lit.js.map +1 -1
- package/dist/generated/templates/MastheadProfileMenuTemplate.lit.js +11 -6
- package/dist/generated/templates/MastheadProfileMenuTemplate.lit.js.map +1 -1
- package/dist/generated/templates/SearchableListBaseTemplate.lit.js +6 -6
- package/dist/generated/templates/SearchableListBaseTemplate.lit.js.map +1 -1
- package/dist/generated/themes/Button.css.d.ts +1 -1
- package/dist/generated/themes/Button.css.js +1 -1
- package/dist/generated/themes/Button.css.js.map +1 -1
- package/dist/generated/themes/ListItem.css.d.ts +1 -1
- package/dist/generated/themes/ListItem.css.js +1 -1
- package/dist/generated/themes/ListItem.css.js.map +1 -1
- package/dist/generated/themes/MastheadProfileMenu.css.d.ts +1 -1
- package/dist/generated/themes/MastheadProfileMenu.css.js +1 -1
- package/dist/generated/themes/MastheadProfileMenu.css.js.map +1 -1
- package/dist/generated/themes/RatingIndicator.css.d.ts +1 -1
- package/dist/generated/themes/RatingIndicator.css.js +1 -1
- package/dist/generated/themes/RatingIndicator.css.js.map +1 -1
- package/dist/generated/themes/Slider.css.d.ts +1 -1
- package/dist/generated/themes/Slider.css.js +1 -1
- package/dist/generated/themes/Slider.css.js.map +1 -1
- package/dist/generated/themes/StepInput.css.d.ts +1 -1
- package/dist/generated/themes/StepInput.css.js +1 -1
- package/dist/generated/themes/StepInput.css.js.map +1 -1
- package/dist/messagebundle.properties +4 -0
- package/dist/messagebundle_en.properties +4 -0
- package/dist/types/StatusBadgeValueState.d.ts +8 -0
- package/dist/types/StatusBadgeValueState.js +10 -0
- package/dist/types/StatusBadgeValueState.js.map +1 -0
- package/dist/vscode.html-custom-data.json +83 -16
- package/dist/web-types.json +374 -30
- package/package.json +1 -1
- package/src/Button.ts +10 -0
- package/src/List.hbs +0 -2
- package/src/List.ts +27 -8
- package/src/ListGroupHeader.ts +2 -1
- package/src/ListItem.hbs +16 -2
- package/src/ListItem.ts +29 -2
- package/src/ListItemBase.ts +42 -0
- package/src/ListSelectAll.ts +2 -1
- package/src/MastheadItem.ts +9 -0
- package/src/MastheadProfileMenu.hbs +79 -15
- package/src/MastheadProfileMenu.ts +228 -13
- package/src/MastheadShell.ts +7 -1
- package/src/SearchableListBase.hbs +18 -1
- package/src/SearchableListBase.ts +47 -1
- package/src/SelectBox.ts +11 -0
- package/src/SelectBoxItem.ts +39 -0
- package/src/StatusBadge.ts +1 -8
- package/src/StepInputTemplate.tsx +1 -1
- package/src/generated/i18n/i18n-defaults.ts +2 -2
- package/src/generated/templates/ListItemTemplate.lit.ts +31 -23
- package/src/generated/templates/ListTemplate.lit.ts +2 -2
- package/src/generated/templates/MastheadProfileMenuTemplate.lit.ts +10 -5
- package/src/generated/templates/SearchableListBaseTemplate.lit.ts +6 -6
- package/src/generated/themes/Button.css.ts +1 -1
- package/src/generated/themes/ListItem.css.ts +1 -1
- package/src/generated/themes/MastheadProfileMenu.css.ts +1 -1
- package/src/generated/themes/RatingIndicator.css.ts +1 -1
- package/src/generated/themes/Slider.css.ts +1 -1
- package/src/generated/themes/StepInput.css.ts +1 -1
- package/src/i18n/messagebundle.properties +4 -0
- package/src/i18n/messagebundle_en.properties +4 -0
- package/src/themes/Button.css +13 -0
- package/src/themes/ListItem.css +4 -9
- package/src/themes/MastheadProfileMenu.css +87 -3
- package/src/themes/StepInput.css +10 -0
- package/src/types/StatusBadgeValueState.ts +9 -0
- package/dist/assets/messagebundle_en-DwlTjyni.js +0 -1
package/package.json
CHANGED
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
|
-
* @
|
|
139
|
-
* @
|
|
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.
|
|
327
|
-
|
|
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
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
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 {
|
package/src/ListGroupHeader.ts
CHANGED
|
@@ -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 {
|
package/src/ListItemBase.ts
CHANGED
|
@@ -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";
|
package/src/ListSelectAll.ts
CHANGED
|
@@ -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;
|
package/src/MastheadItem.ts
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
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
|
-
|
|
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}}
|