@sapudex/web-components 2.32.1 → 2.34.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.
- package/cypress/fixtures/masthead-shell.ts +281 -0
- package/cypress/specs/Breadcrumbs.cy.tsx +196 -1
- package/cypress/specs/FilterMenu.cy.tsx +53 -0
- package/cypress/specs/ListItem.cy.tsx +48 -0
- package/cypress/specs/MastheadMenu.cy.tsx +564 -0
- package/cypress/specs/MastheadMobileMenu.cy.tsx +573 -0
- package/cypress/specs/MastheadShell.cy.tsx +645 -0
- package/cypress/specs/SecondaryNavigationDesktop.cy.tsx +289 -95
- package/cypress/specs/SecondaryNavigationMobile.cy.tsx +42 -0
- package/cypress/specs/SelectBox.cy.tsx +63 -0
- package/cypress/specs/TabNavigation.cy.tsx +431 -10
- package/cypress/support/component-imports.instrumented.ts +14 -0
- package/cypress/support/component-imports.src.ts +10 -0
- package/dist/Breadcrumbs.d.ts +12 -0
- package/dist/Breadcrumbs.js +30 -6
- package/dist/Breadcrumbs.js.map +1 -1
- package/dist/BreadcrumbsPopoverTemplate.js +10 -1
- package/dist/BreadcrumbsPopoverTemplate.js.map +1 -1
- package/dist/BreadcrumbsTemplate.js +1 -1
- package/dist/BreadcrumbsTemplate.js.map +1 -1
- package/dist/ListItem.d.ts +3 -0
- package/dist/ListItem.js +10 -1
- package/dist/ListItem.js.map +1 -1
- package/dist/ListItemBase.d.ts +29 -0
- package/dist/ListItemBase.js +22 -0
- package/dist/ListItemBase.js.map +1 -1
- package/dist/MastheadItem.d.ts +2 -1
- package/dist/MastheadItem.js.map +1 -1
- package/dist/MastheadMenu.d.ts +2 -1
- package/dist/MastheadMenu.js.map +1 -1
- package/dist/SearchableListBase.d.ts +3 -1
- package/dist/SearchableListBase.js +7 -1
- package/dist/SearchableListBase.js.map +1 -1
- package/dist/SecondaryNavigation.d.ts +1 -6
- package/dist/SecondaryNavigation.js +6 -59
- package/dist/SecondaryNavigation.js.map +1 -1
- package/dist/SecondaryNavigationItem.d.ts +5 -12
- package/dist/SecondaryNavigationItem.js +34 -65
- package/dist/SecondaryNavigationItem.js.map +1 -1
- package/dist/SecondaryNavigationItemBase.d.ts +0 -1
- package/dist/SecondaryNavigationItemBase.js +0 -4
- package/dist/SecondaryNavigationItemBase.js.map +1 -1
- package/dist/SelectBase.js +4 -2
- package/dist/SelectBase.js.map +1 -1
- package/dist/Tab.d.ts +19 -0
- package/dist/Tab.js +22 -0
- package/dist/Tab.js.map +1 -1
- package/dist/TabNavigation.d.ts +9 -1
- package/dist/TabNavigation.js +25 -7
- package/dist/TabNavigation.js.map +1 -1
- package/dist/assets/{InputSuggestions-DeXhpK0F.js → InputSuggestions-Bz7HZXUc.js} +1 -1
- package/dist/assets/{ListItemStandardExpandableTextTemplate-jMEdrC07.js → ListItemStandardExpandableTextTemplate-CjE7hAvu.js} +1 -1
- package/dist/assets/{bundle-S1uYREqT.css → bundle-JYo3bV8v.css} +1 -1
- package/dist/assets/{bundle.esm-CwJAt93x.js → bundle.esm-mAR7ytdB.js} +217 -217
- package/dist/css/themes/Breadcrumbs.css +1 -1
- package/dist/css/themes/BreadcrumbsPopover.css +1 -1
- package/dist/css/themes/ListItem.css +1 -1
- package/dist/css/themes/MastheadMenu.css +1 -1
- package/dist/css/themes/MastheadMobileMenu.css +1 -1
- package/dist/css/themes/RatingIndicator.css +1 -1
- package/dist/css/themes/Slider.css +1 -1
- package/dist/css/themes/TabNavigation.css +1 -1
- package/dist/custom-elements-internal.json +1357 -212
- package/dist/custom-elements.json +1342 -197
- package/dist/generated/templates/ListItemTemplate.lit.js +32 -28
- package/dist/generated/templates/ListItemTemplate.lit.js.map +1 -1
- package/dist/generated/templates/MastheadMenuTemplate.lit.js +8 -1
- package/dist/generated/templates/MastheadMenuTemplate.lit.js.map +1 -1
- package/dist/generated/templates/MastheadMobileMenuTemplate.lit.js +10 -4
- package/dist/generated/templates/MastheadMobileMenuTemplate.lit.js.map +1 -1
- package/dist/generated/templates/SearchableListBaseTemplate.lit.js +3 -3
- package/dist/generated/templates/SearchableListBaseTemplate.lit.js.map +1 -1
- package/dist/generated/templates/SecondaryNavigationItemTemplate.lit.js +4 -4
- package/dist/generated/templates/SecondaryNavigationItemTemplate.lit.js.map +1 -1
- package/dist/generated/templates/SecondaryNavigationSubItemTemplate.lit.js +3 -3
- package/dist/generated/templates/SecondaryNavigationSubItemTemplate.lit.js.map +1 -1
- package/dist/generated/templates/SecondaryNavigationTemplate.lit.js +5 -5
- package/dist/generated/templates/SecondaryNavigationTemplate.lit.js.map +1 -1
- package/dist/generated/templates/SelectBoxTemplate.lit.js +12 -10
- package/dist/generated/templates/SelectBoxTemplate.lit.js.map +1 -1
- package/dist/generated/templates/TabHeaderTemplate.lit.js +40 -24
- package/dist/generated/templates/TabHeaderTemplate.lit.js.map +1 -1
- package/dist/generated/templates/TabNavigationTemplate.lit.js +1 -1
- package/dist/generated/templates/TabNavigationTemplate.lit.js.map +1 -1
- package/dist/generated/themes/Breadcrumbs.css.d.ts +1 -1
- package/dist/generated/themes/Breadcrumbs.css.js +1 -1
- package/dist/generated/themes/Breadcrumbs.css.js.map +1 -1
- package/dist/generated/themes/BreadcrumbsPopover.css.d.ts +1 -1
- package/dist/generated/themes/BreadcrumbsPopover.css.js +1 -1
- package/dist/generated/themes/BreadcrumbsPopover.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/MastheadMenu.css.d.ts +1 -1
- package/dist/generated/themes/MastheadMenu.css.js +1 -1
- package/dist/generated/themes/MastheadMenu.css.js.map +1 -1
- package/dist/generated/themes/MastheadMobileMenu.css.d.ts +1 -1
- package/dist/generated/themes/MastheadMobileMenu.css.js +1 -1
- package/dist/generated/themes/MastheadMobileMenu.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/TabNavigation.css.d.ts +1 -1
- package/dist/generated/themes/TabNavigation.css.js +1 -1
- package/dist/generated/themes/TabNavigation.css.js.map +1 -1
- package/dist/vscode.html-custom-data.json +236 -1
- package/dist/web-types.json +393 -3
- package/package.json +1 -1
- package/src/Breadcrumbs.ts +26 -7
- package/src/BreadcrumbsPopoverTemplate.tsx +53 -41
- package/src/BreadcrumbsTemplate.tsx +35 -21
- package/src/ListItem.hbs +42 -14
- package/src/ListItem.ts +12 -1
- package/src/ListItemBase.ts +40 -0
- package/src/MastheadItem.ts +2 -1
- package/src/MastheadMenu.hbs +35 -0
- package/src/MastheadMenu.ts +2 -1
- package/src/MastheadMobileMenu.hbs +40 -9
- package/src/SearchableListBase.hbs +12 -0
- package/src/SearchableListBase.ts +11 -2
- package/src/SecondaryNavigation.hbs +6 -6
- package/src/SecondaryNavigation.ts +7 -66
- package/src/SecondaryNavigationItem.hbs +4 -6
- package/src/SecondaryNavigationItem.ts +40 -83
- package/src/SecondaryNavigationItemBase.ts +0 -3
- package/src/SecondaryNavigationSubItem.hbs +3 -7
- package/src/SelectBase.ts +4 -2
- package/src/SelectBox.hbs +13 -5
- package/src/Tab.ts +32 -0
- package/src/TabHeader.hbs +40 -19
- package/src/TabNavigation.hbs +5 -9
- package/src/TabNavigation.ts +25 -8
- package/src/generated/templates/ListItemTemplate.lit.ts +32 -28
- package/src/generated/templates/MastheadMenuTemplate.lit.ts +8 -1
- package/src/generated/templates/MastheadMobileMenuTemplate.lit.ts +10 -4
- package/src/generated/templates/SearchableListBaseTemplate.lit.ts +3 -3
- package/src/generated/templates/SecondaryNavigationItemTemplate.lit.ts +4 -4
- package/src/generated/templates/SecondaryNavigationSubItemTemplate.lit.ts +3 -3
- package/src/generated/templates/SecondaryNavigationTemplate.lit.ts +5 -5
- package/src/generated/templates/SelectBoxTemplate.lit.ts +12 -10
- package/src/generated/templates/TabHeaderTemplate.lit.ts +40 -24
- package/src/generated/templates/TabNavigationTemplate.lit.ts +1 -1
- package/src/generated/themes/Breadcrumbs.css.ts +1 -1
- package/src/generated/themes/BreadcrumbsPopover.css.ts +1 -1
- package/src/generated/themes/ListItem.css.ts +1 -1
- package/src/generated/themes/MastheadMenu.css.ts +1 -1
- package/src/generated/themes/MastheadMobileMenu.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/TabNavigation.css.ts +1 -1
- package/src/themes/Breadcrumbs.css +6 -0
- package/src/themes/BreadcrumbsPopover.css +12 -2
- package/src/themes/ListItem.css +12 -5
- package/src/themes/MastheadMenu.css +45 -0
- package/src/themes/MastheadMobileMenu.css +45 -0
- package/src/themes/TabNavigation.css +58 -73
|
@@ -4,6 +4,10 @@ import UDExLink from "./Link.js";
|
|
|
4
4
|
import { Placement, HorizontalAlign } from "./types/Dropdown.js";
|
|
5
5
|
|
|
6
6
|
export default function BreadcrumbsPopoverTemplate(this: Breadcrumbs) {
|
|
7
|
+
const focusableCount = this._dropdownItems.filter(i => !i._isCurrentPageItem).length;
|
|
8
|
+
const ofText = this._ofText;
|
|
9
|
+
let focusablePos = 0;
|
|
10
|
+
|
|
7
11
|
return (
|
|
8
12
|
<UDExDropdown
|
|
9
13
|
id={`udex-${this._id}-breadcrumbs__popover`}
|
|
@@ -15,47 +19,55 @@ export default function BreadcrumbsPopoverTemplate(this: Breadcrumbs) {
|
|
|
15
19
|
onKeyDown={this._handleKeydown}
|
|
16
20
|
onClose={this._afterDropdownClose}
|
|
17
21
|
onOpen={this._afterDropdownOpen}>
|
|
18
|
-
<
|
|
19
|
-
|
|
20
|
-
item
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
22
|
+
<nav className={`${this._rootClass}__popover-content`} aria-label={this._breadcrumbsAccessibleNameText}>
|
|
23
|
+
<ol>
|
|
24
|
+
{this._dropdownItems.map((item, index) => {
|
|
25
|
+
if (!item._isCurrentPageItem) { focusablePos++; }
|
|
26
|
+
const posLabel = `${item.accessibleName || item.textContent || ""}, ${focusablePos} ${ofText} ${focusableCount}`;
|
|
27
|
+
return item._isCurrentPageItem ? (
|
|
28
|
+
<li key={index} aria-hidden="true">
|
|
29
|
+
<span
|
|
30
|
+
id={`${item._id}-li`}
|
|
31
|
+
className={`${this._rootClass}__item ${this._rootClass}__item--current ${this._rootClass}__item--hidden ${this._rootClass}__item--${index}`}
|
|
32
|
+
aria-current="page"
|
|
33
|
+
accessible-name={item.accessibleName}
|
|
34
|
+
data-ui5-stable={item.stableDomRef}>
|
|
35
|
+
{item.textContent}
|
|
36
|
+
</span>
|
|
37
|
+
</li>
|
|
38
|
+
) : (
|
|
39
|
+
<li key={index}>
|
|
40
|
+
{item.icon ? (
|
|
41
|
+
<UDExLink
|
|
42
|
+
data-index={index}
|
|
43
|
+
id={`${item._id}-li`}
|
|
44
|
+
onClick={this._onDropdownLinkPress}
|
|
45
|
+
href={item.href}
|
|
46
|
+
target={item.target}
|
|
47
|
+
class={`${this._rootClass}__item ${this._rootClass}__item--with-icon ${this._rootClass}__item--hidden ${this._rootClass}__item--${index}`}
|
|
48
|
+
icon={item.icon}
|
|
49
|
+
accessibleName={posLabel}
|
|
50
|
+
data-ui5-stable={item.stableDomRef}>
|
|
51
|
+
{item.textContent}
|
|
52
|
+
</UDExLink>
|
|
53
|
+
) : (
|
|
54
|
+
<UDExLink
|
|
55
|
+
data-index={index}
|
|
56
|
+
id={`${item._id}-li`}
|
|
57
|
+
onClick={this._onDropdownLinkPress}
|
|
58
|
+
href={item.href}
|
|
59
|
+
target={item.target}
|
|
60
|
+
class={`${this._rootClass}__item ${this._rootClass}__item--hidden ${this._rootClass}__item--${index}`}
|
|
61
|
+
accessibleName={posLabel}
|
|
62
|
+
data-ui5-stable={item.stableDomRef}>
|
|
63
|
+
{item.textContent}
|
|
64
|
+
</UDExLink>
|
|
65
|
+
)}
|
|
66
|
+
</li>
|
|
67
|
+
);
|
|
68
|
+
})}
|
|
69
|
+
</ol>
|
|
70
|
+
</nav>
|
|
59
71
|
</UDExDropdown>
|
|
60
72
|
);
|
|
61
73
|
}
|
|
@@ -20,30 +20,44 @@ export default function BreadcrumbsTemplate(this: Breadcrumbs) {
|
|
|
20
20
|
onClick={this._toggleDropdown}
|
|
21
21
|
accessibleName={this._dropdownArrowAccessibleNameText}
|
|
22
22
|
accessibleRole={UDExButtonAccessibleRole.Button}
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
accessibilityAttributes={this._triggerAccessibilityAttributes}
|
|
24
|
+
icon={slimArrowDown}>
|
|
25
25
|
</UDExLink>
|
|
26
26
|
</li>
|
|
27
27
|
{this._linksData.map(linkData =>
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
28
|
+
(linkData._isCurrentPageItem && !this.showCurrentPage ? null : (
|
|
29
|
+
<li
|
|
30
|
+
role={linkData._isCurrentPageItem ? "presentation" : undefined}
|
|
31
|
+
class={`${this._rootClass}__link-wrapper ui5-breadcrumbs-link-wrapper`}
|
|
32
|
+
id={`${linkData._id}-link-wrapper`}>
|
|
33
|
+
{linkData._isCurrentPageItem ? (
|
|
34
|
+
<>
|
|
35
|
+
<span className={`${this._rootClass}__separator`} aria-hidden="true"></span>
|
|
36
|
+
<span
|
|
37
|
+
id={`${linkData._id}-link`}
|
|
38
|
+
class={`${rootClass}__item ${this._rootClass}__item--visible ${this._rootClass}__item--current-page`}
|
|
39
|
+
aria-current="page"
|
|
40
|
+
data-ui5-stable={linkData.stableDomRef}>
|
|
41
|
+
{linkData.textContent}
|
|
42
|
+
</span>
|
|
43
|
+
</>
|
|
44
|
+
) : (
|
|
45
|
+
<>
|
|
46
|
+
<span className={`${this._rootClass}__separator`} aria-hidden="true"></span>
|
|
47
|
+
<UDExLink
|
|
48
|
+
onClick={this._onLinkPress}
|
|
49
|
+
id={`${linkData._id}-link`}
|
|
50
|
+
class={`${rootClass}__item ${this._rootClass}__item--visible`}
|
|
51
|
+
href={linkData.href}
|
|
52
|
+
target={linkData.target}
|
|
53
|
+
accessibleName={linkData._accessibleNameText}
|
|
54
|
+
data-ui5-stable={linkData.stableDomRef}>
|
|
55
|
+
{linkData.textContent}
|
|
56
|
+
</UDExLink>
|
|
57
|
+
</>
|
|
58
|
+
)}
|
|
59
|
+
</li>
|
|
60
|
+
))
|
|
47
61
|
)}
|
|
48
62
|
</ol>
|
|
49
63
|
</nav>
|
package/src/ListItem.hbs
CHANGED
|
@@ -89,26 +89,54 @@
|
|
|
89
89
|
<span class="udex-list__supporting-text" part="supporting">{{supportingText}}</span>
|
|
90
90
|
{{/if}}
|
|
91
91
|
<slot part="content"></slot>
|
|
92
|
+
{{#if hasRating}}
|
|
93
|
+
<udex-rating-indicator
|
|
94
|
+
aria-label="{{ratingAriaLabel}}"
|
|
95
|
+
value="{{rating}}"
|
|
96
|
+
rating-count="{{ratingCount}}"
|
|
97
|
+
total-count="{{totalCount}}"
|
|
98
|
+
max="{{ratingMax}}"
|
|
99
|
+
display="{{_displayRating}}"
|
|
100
|
+
disabled
|
|
101
|
+
readonly>
|
|
102
|
+
</udex-rating-indicator>
|
|
103
|
+
{{/if}}
|
|
92
104
|
</div>
|
|
93
105
|
{{#if additionalText}}<div class="udex-list__add-text" part="additional-text">{{additionalText}}</div>{{/if}}
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
106
|
+
<div class="udex-list__btn-wrap">
|
|
107
|
+
{{#if hasFirstIcon}}
|
|
108
|
+
<slot name="firstIcon" @click={{_fireIconClickEvent}}></slot>
|
|
109
|
+
{{/if}}
|
|
110
|
+
{{#if hasSecondIcon}}
|
|
111
|
+
<slot name="secondIcon" @click={{_fireIconClickEvent}}></slot>
|
|
112
|
+
{{/if}}
|
|
113
|
+
</div>
|
|
100
114
|
{{else}}
|
|
101
115
|
<div class="udex-list__text-holder">
|
|
102
116
|
<slot part="content"></slot>
|
|
103
117
|
{{#if supportingText}}<span class="udex-list__supporting-text" part="supporting">{{supportingText}}</span>{{/if}}
|
|
118
|
+
{{#if hasRating}}
|
|
119
|
+
<udex-rating-indicator
|
|
120
|
+
aria-label="{{ratingAriaLabel}}"
|
|
121
|
+
value="{{rating}}"
|
|
122
|
+
rating-count="{{ratingCount}}"
|
|
123
|
+
total-count="{{totalCount}}"
|
|
124
|
+
max="{{ratingMax}}"
|
|
125
|
+
display="{{_displayRating}}"
|
|
126
|
+
disabled
|
|
127
|
+
readonly>
|
|
128
|
+
</udex-rating-indicator>
|
|
129
|
+
{{/if}}
|
|
104
130
|
</div>
|
|
105
131
|
{{#if additionalText}}<div class="udex-list__add-text" part="additional-text">{{additionalText}}</div>{{/if}}
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
132
|
+
<div class="udex-list__btn-wrap">
|
|
133
|
+
{{#if hasFirstIcon}}
|
|
134
|
+
<slot name="firstIcon" @click={{_fireIconClickEvent}}></slot>
|
|
135
|
+
{{/if}}
|
|
136
|
+
{{#if hasSecondIcon}}
|
|
137
|
+
<slot name="secondIcon" @click={{_fireIconClickEvent}}></slot>
|
|
138
|
+
{{/if}}
|
|
139
|
+
</div>
|
|
112
140
|
{{/if}}
|
|
113
141
|
{{#if collapsible}}
|
|
114
142
|
<div class="udex-list__group-heading__icon-wrapper">
|
|
@@ -126,7 +154,7 @@
|
|
|
126
154
|
</div>
|
|
127
155
|
{{/if}}
|
|
128
156
|
</div>
|
|
129
|
-
|
|
130
|
-
|
|
157
|
+
<div class="hidden" id="{{this._id}}-invisibleText">{{accessibleListItemName}}</div>
|
|
158
|
+
<div class="hidden" id="{{this._id}}-invisibleText-describedby">{{itemState}}</div>
|
|
131
159
|
</div>
|
|
132
160
|
{{/inline}}
|
package/src/ListItem.ts
CHANGED
|
@@ -13,13 +13,14 @@ import type UDExListGroupHeaderBase from "./ListGroupHeaderBase.js";
|
|
|
13
13
|
import UDExAvatar, { UDExAvatarShape, UDExAvatarSize } from "./Avatar.js";
|
|
14
14
|
import UDExButton from "./Button.js";
|
|
15
15
|
import UDExStatusBadge from "./StatusBadge.js";
|
|
16
|
+
import UDExRatingIndicator, { UDExDisplayType } from "./RatingIndicator.js";
|
|
16
17
|
import type UDExStatusBadgeValueState from "./types/StatusBadgeValueState.js";
|
|
17
18
|
import { UDExListItemSize, UDExListMode, UDExAdditionalTextState } from "./types/List.js";
|
|
18
19
|
import UDExRadioButton from "./RadioButton.js";
|
|
19
20
|
import i18n from "@ui5/webcomponents-base/dist/decorators/i18n.js";
|
|
20
21
|
import type I18nBundle from "@ui5/webcomponents-base/dist/i18nBundle.js";
|
|
21
22
|
import {
|
|
22
|
-
INDETERMINATE, SELECTED, UNSELECTED,
|
|
23
|
+
INDETERMINATE, SELECTED, UNSELECTED, RATING_INDICATOR_TEXT, RATING_COUNT_TITLE, TOTAL,
|
|
23
24
|
} from "./generated/i18n/i18n-defaults.js";
|
|
24
25
|
import translate from "./utils/translate.js";
|
|
25
26
|
|
|
@@ -71,6 +72,7 @@ type UDExListItemItemPressEventDetail = {
|
|
|
71
72
|
UDExRadioButton,
|
|
72
73
|
UDExCheckbox,
|
|
73
74
|
UDExStatusBadge,
|
|
75
|
+
UDExRatingIndicator,
|
|
74
76
|
Icon,
|
|
75
77
|
],
|
|
76
78
|
})
|
|
@@ -235,6 +237,8 @@ class UDExListItem extends UDExListItemBase {
|
|
|
235
237
|
@property({ type: String })
|
|
236
238
|
_additionalClassName!: string;
|
|
237
239
|
|
|
240
|
+
_displayRating: UDExDisplayType = UDExDisplayType.Desktop;
|
|
241
|
+
|
|
238
242
|
deactivate: () => void;
|
|
239
243
|
|
|
240
244
|
@i18n("@sapudex/web-components")
|
|
@@ -402,6 +406,13 @@ class UDExListItem extends UDExListItemBase {
|
|
|
402
406
|
get itemState(): string {
|
|
403
407
|
return this.selected ? "Selected" : "Not selected";
|
|
404
408
|
}
|
|
409
|
+
|
|
410
|
+
get ratingAriaLabel(): string {
|
|
411
|
+
const ratingText = this.ratingCount ? `${translate(UDExListItem, RATING_COUNT_TITLE)} ${this.ratingCount}` : "";
|
|
412
|
+
const totalText = this.totalCount ? `${translate(UDExListItem, TOTAL)} ${this.totalCount}` : "";
|
|
413
|
+
const ratingTitleText = translate(UDExListItem, RATING_INDICATOR_TEXT);
|
|
414
|
+
return [...[ratingText, totalText].filter(Boolean), `${ratingTitleText} ${this.rating} of ${this.ratingMax}`].join(", ");
|
|
415
|
+
}
|
|
405
416
|
}
|
|
406
417
|
|
|
407
418
|
UDExListItem.define();
|
package/src/ListItemBase.ts
CHANGED
|
@@ -70,6 +70,42 @@ type UDExListItemBaseAccordionClickEventDetail = {
|
|
|
70
70
|
class UDExListItemBase extends UI5Element {
|
|
71
71
|
eventDetails!: UDExListItemBaseEvents;
|
|
72
72
|
|
|
73
|
+
/**
|
|
74
|
+
* Defines the number of displayed rating symbols.
|
|
75
|
+
*
|
|
76
|
+
* @default 5
|
|
77
|
+
* @public
|
|
78
|
+
*/
|
|
79
|
+
@property({ type: Number })
|
|
80
|
+
ratingMax: number = 5;
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Defines the value of the rating.
|
|
84
|
+
* Use for rating indicator to represent aggregated review scores within list items
|
|
85
|
+
*
|
|
86
|
+
* @public
|
|
87
|
+
*/
|
|
88
|
+
@property({ type: String })
|
|
89
|
+
rating?: string;
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Defines the number of the rating.
|
|
93
|
+
* Use for the rating indicator
|
|
94
|
+
*
|
|
95
|
+
* @public
|
|
96
|
+
*/
|
|
97
|
+
@property({ type: String })
|
|
98
|
+
ratingCount?: string;
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* The number of total votes.
|
|
102
|
+
* Use for the rating indicator
|
|
103
|
+
*
|
|
104
|
+
* @public
|
|
105
|
+
*/
|
|
106
|
+
@property({ type: String })
|
|
107
|
+
totalCount?: string;
|
|
108
|
+
|
|
73
109
|
/**
|
|
74
110
|
* Defines the <code>label</code> for the item.
|
|
75
111
|
*
|
|
@@ -313,6 +349,10 @@ class UDExListItemBase extends UI5Element {
|
|
|
313
349
|
get expanded(): boolean {
|
|
314
350
|
return !this.collapsed;
|
|
315
351
|
}
|
|
352
|
+
|
|
353
|
+
get hasRating(): boolean {
|
|
354
|
+
return !!this.rating;
|
|
355
|
+
}
|
|
316
356
|
}
|
|
317
357
|
|
|
318
358
|
export default UDExListItemBase;
|
package/src/MastheadItem.ts
CHANGED
package/src/MastheadMenu.hbs
CHANGED
|
@@ -77,6 +77,41 @@
|
|
|
77
77
|
<li>
|
|
78
78
|
{{#if this.isDivider}}
|
|
79
79
|
<udex-divider class="udex-masthead-menu__item-divider"></udex-divider>
|
|
80
|
+
{{else if this.subItems}}
|
|
81
|
+
{{#if this.url}}
|
|
82
|
+
<udex-masthead-menu-item
|
|
83
|
+
part="menu-item"
|
|
84
|
+
accessible-role="link"
|
|
85
|
+
exportparts="menu-item"
|
|
86
|
+
@click="{{../../../handleMenuItemClick}}"
|
|
87
|
+
url="{{this.url}}"
|
|
88
|
+
label="{{this.title}}"
|
|
89
|
+
class="udex-masthead-menu__sub-category">
|
|
90
|
+
</udex-masthead-menu-item>
|
|
91
|
+
{{else}}
|
|
92
|
+
<span class="udex-masthead-menu__sub-category">{{this.title}}</span>
|
|
93
|
+
{{/if}}
|
|
94
|
+
<ul class="udex-masthead-menu__sub-list" aria-label="{{this.title}}">
|
|
95
|
+
{{#each this.subItems}}
|
|
96
|
+
<li>
|
|
97
|
+
{{#if this.isDivider}}
|
|
98
|
+
<udex-divider class="udex-masthead-menu__item-divider"></udex-divider>
|
|
99
|
+
{{else}}
|
|
100
|
+
<udex-masthead-menu-item
|
|
101
|
+
part="menu-item"
|
|
102
|
+
accessible-role="link"
|
|
103
|
+
exportparts="menu-item"
|
|
104
|
+
exportparts="badge"
|
|
105
|
+
@click="{{../../../../handleMenuItemClick}}"
|
|
106
|
+
badge="{{this.badge}}"
|
|
107
|
+
?external-link="{{this.externalLink}}"
|
|
108
|
+
url="{{this.url}}"
|
|
109
|
+
label="{{this.title}}">
|
|
110
|
+
</udex-masthead-menu-item>
|
|
111
|
+
{{/if}}
|
|
112
|
+
</li>
|
|
113
|
+
{{/each}}
|
|
114
|
+
</ul>
|
|
80
115
|
{{else}}
|
|
81
116
|
<udex-masthead-menu-item
|
|
82
117
|
part="menu-item"
|
package/src/MastheadMenu.ts
CHANGED
|
@@ -205,17 +205,48 @@
|
|
|
205
205
|
</li>
|
|
206
206
|
{{/if}}
|
|
207
207
|
{{#each _category.items}}
|
|
208
|
-
{{#if this.
|
|
208
|
+
{{#if this.subItems}}
|
|
209
209
|
<li class="udex-masthead-mobile-menu__list-item" role="none">
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
210
|
+
{{#if this.url}}
|
|
211
|
+
<udex-masthead-menu-item
|
|
212
|
+
part="menu-item"
|
|
213
|
+
@click="{{../handleMobileCategoryItemEvent}}"
|
|
214
|
+
label="{{this.title}}"
|
|
215
|
+
url="{{this.url}}"
|
|
216
|
+
class="udex-masthead-mobile-menu__sub-category"
|
|
217
|
+
third-level>
|
|
218
|
+
</udex-masthead-menu-item>
|
|
219
|
+
{{else}}
|
|
220
|
+
<span class="udex-masthead-mobile-menu__sub-category">{{this.title}}</span>
|
|
221
|
+
{{/if}}
|
|
222
|
+
<ul class="udex-masthead-mobile-menu__sub-list" aria-label="{{this.title}}">
|
|
223
|
+
{{#each this.subItems}}
|
|
224
|
+
{{#if this.url}}
|
|
225
|
+
<li class="udex-masthead-mobile-menu__list-item" role="none">
|
|
226
|
+
<udex-masthead-menu-item
|
|
227
|
+
part="menu-item"
|
|
228
|
+
@click="{{../../handleMobileCategoryItemEvent}}"
|
|
229
|
+
label="{{this.title}}"
|
|
230
|
+
url="{{this.url}}"
|
|
231
|
+
third-level>
|
|
232
|
+
</udex-masthead-menu-item>
|
|
233
|
+
</li>
|
|
234
|
+
{{/if}}
|
|
235
|
+
{{/each}}
|
|
236
|
+
</ul>
|
|
218
237
|
</li>
|
|
238
|
+
{{else}}
|
|
239
|
+
{{#if this.url}}
|
|
240
|
+
<li class="udex-masthead-mobile-menu__list-item" role="none">
|
|
241
|
+
<udex-masthead-menu-item
|
|
242
|
+
part="menu-item"
|
|
243
|
+
@click="{{../handleMobileCategoryItemEvent}}"
|
|
244
|
+
label="{{this.title}}"
|
|
245
|
+
url="{{this.url}}"
|
|
246
|
+
third-level>
|
|
247
|
+
</udex-masthead-menu-item>
|
|
248
|
+
</li>
|
|
249
|
+
{{/if}}
|
|
219
250
|
{{/if}}
|
|
220
251
|
{{/each}}
|
|
221
252
|
{{/inline}}
|
|
@@ -62,6 +62,10 @@
|
|
|
62
62
|
?divider="{{this.divider}}"
|
|
63
63
|
?disabled="{{this.disabled}}"
|
|
64
64
|
?selected="{{this.selected}}"
|
|
65
|
+
rating="{{this.rating}}"
|
|
66
|
+
total-count="{{this.totalCount}}"
|
|
67
|
+
rating-count="{{this.ratingCount}}"
|
|
68
|
+
rating-max="{{this.ratingMax}}"
|
|
65
69
|
label="{{this.label}}">
|
|
66
70
|
{{{this.innerHTML}}}
|
|
67
71
|
</udex-list-item>
|
|
@@ -99,6 +103,10 @@
|
|
|
99
103
|
?divider="{{this.divider}}"
|
|
100
104
|
?disabled="{{this.disabled}}"
|
|
101
105
|
?selected="{{this.selected}}"
|
|
106
|
+
rating="{{this.rating}}"
|
|
107
|
+
total-count="{{this.totalCount}}"
|
|
108
|
+
rating-count="{{this.ratingCount}}"
|
|
109
|
+
rating-max="{{this.ratingMax}}"
|
|
102
110
|
label="{{this.label}}">
|
|
103
111
|
{{{this.innerHTML}}}
|
|
104
112
|
</udex-list-item>
|
|
@@ -118,6 +126,10 @@
|
|
|
118
126
|
?controlled="{{this.controlled}}"
|
|
119
127
|
?divider="{{this.divider}}"
|
|
120
128
|
?selected="{{this.item.selected}}"
|
|
129
|
+
rating="{{this.item.rating}}"
|
|
130
|
+
total-count="{{this.item.totalCount}}"
|
|
131
|
+
rating-count="{{this.item.ratingCount}}"
|
|
132
|
+
rating-max="{{this.item.ratingMax}}"
|
|
121
133
|
label="{{this.item.label}}"
|
|
122
134
|
accessible-role="{{../listItemRole}}">
|
|
123
135
|
{{{this.item.innerHTML}}}
|
|
@@ -14,8 +14,9 @@ import type UDExListGroupHeaderBase from "./ListGroupHeaderBase.js";
|
|
|
14
14
|
import type UDExList from "./List.js";
|
|
15
15
|
import type UDExListItem from "./ListItem.js";
|
|
16
16
|
import type UDExFilterMenuItem from "./FilterMenuItem.js";
|
|
17
|
+
import type UDExSelectBoxItem from "./SelectBoxItem.js";
|
|
17
18
|
import { SHOW_SEARCH_AFTER_COUNT, UDExPopoverPart } from "./types/SearchableListBase.js";
|
|
18
|
-
import { NO_MATCHES_FOUND, RESULT_RETURNED } from "./generated/i18n/i18n-defaults.js";
|
|
19
|
+
import { NO_MATCHES_FOUND, RESULT_RETURNED, STARS } from "./generated/i18n/i18n-defaults.js";
|
|
19
20
|
import translate from "./utils/translate.js";
|
|
20
21
|
|
|
21
22
|
export type UDExItemFromList = UDExListItemBase | UDExListGroupHeaderBase | null | undefined;
|
|
@@ -403,6 +404,10 @@ class UDExSearchableListBase extends UI5Element {
|
|
|
403
404
|
}
|
|
404
405
|
|
|
405
406
|
checkAndUpdateLabel(item: UDExListItemBase | UDExListGroupHeaderBase, str: string): boolean {
|
|
407
|
+
if (item.ratingCount) {
|
|
408
|
+
return this.isIncludes(item.ratingCount, str);
|
|
409
|
+
}
|
|
410
|
+
|
|
406
411
|
if (!item.label) {
|
|
407
412
|
console.warn("A label property is required for the item");
|
|
408
413
|
return false;
|
|
@@ -597,7 +602,7 @@ class UDExSearchableListBase extends UI5Element {
|
|
|
597
602
|
content.style.maxHeight = this.height || "";
|
|
598
603
|
}
|
|
599
604
|
|
|
600
|
-
_setItemsModeAndControl(items: Array<UDExFilterMenuItem>) {
|
|
605
|
+
_setItemsModeAndControl(items: Array<UDExFilterMenuItem | UDExSelectBoxItem>) {
|
|
601
606
|
items.forEach(item => {
|
|
602
607
|
item.mode = this.mode;
|
|
603
608
|
item.controlled = this.isControlled;
|
|
@@ -617,6 +622,10 @@ class UDExSearchableListBase extends UI5Element {
|
|
|
617
622
|
return translate(UDExSearchableListBase, RESULT_RETURNED);
|
|
618
623
|
}
|
|
619
624
|
|
|
625
|
+
get startsText(): string {
|
|
626
|
+
return translate(UDExSearchableListBase, STARS);
|
|
627
|
+
}
|
|
628
|
+
|
|
620
629
|
get isListEmpty(): boolean {
|
|
621
630
|
return this._filteredItems.length === 0;
|
|
622
631
|
}
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
{{#if headingHref.length}}
|
|
11
11
|
<a
|
|
12
12
|
class="udex-secondary-navigation__title"
|
|
13
|
+
tabindex="0"
|
|
13
14
|
@click="{{handleHeadingClick}}"
|
|
14
15
|
href="{{headingHref}}">
|
|
15
16
|
{{heading}}
|
|
@@ -19,14 +20,12 @@
|
|
|
19
20
|
{{/if}}
|
|
20
21
|
</div>
|
|
21
22
|
{{/if}}
|
|
22
|
-
<
|
|
23
|
+
<nav class="udex-secondary-navigation__wrap">
|
|
23
24
|
<ul
|
|
24
|
-
role="menubar"
|
|
25
25
|
class="udex-secondary-navigation__list"
|
|
26
26
|
@keydown="{{handleKeyDown}}">
|
|
27
27
|
{{#each visibleItems}}
|
|
28
28
|
<li
|
|
29
|
-
role="none"
|
|
30
29
|
class="udex-secondary-navigation__list-item">
|
|
31
30
|
<udex-secondary-navigation-item
|
|
32
31
|
index="{{@index}}"
|
|
@@ -44,7 +43,6 @@
|
|
|
44
43
|
{{/each}}
|
|
45
44
|
{{#if _showMoreButton}}
|
|
46
45
|
<li
|
|
47
|
-
role="none"
|
|
48
46
|
class="udex-secondary-navigation__list-item">
|
|
49
47
|
<udex-secondary-navigation-item
|
|
50
48
|
_nav-items-length="{{visibleItems.length}}"
|
|
@@ -60,7 +58,7 @@
|
|
|
60
58
|
{{#if hasDesktopButtonsSlot}}
|
|
61
59
|
{{>buttons}}
|
|
62
60
|
{{/if}}
|
|
63
|
-
</
|
|
61
|
+
</nav>
|
|
64
62
|
</div>
|
|
65
63
|
<udex-secondary-navigation-item
|
|
66
64
|
@keydown="{{handleKeyDown}}"
|
|
@@ -75,7 +73,9 @@
|
|
|
75
73
|
_is-mobile-menu-opener
|
|
76
74
|
.subItems="{{this.parsedItems}}">
|
|
77
75
|
{{#if hasMobileButtonsSlot}}
|
|
78
|
-
{{
|
|
76
|
+
<div class="udex-secondary-navigation__buttons" @click="{{handleMobileButtonsClick}}">
|
|
77
|
+
<slot name="buttons"></slot>
|
|
78
|
+
</div>
|
|
79
79
|
{{/if}}
|
|
80
80
|
</udex-secondary-navigation-item>
|
|
81
81
|
</div>
|