@sapudex/web-components 2.60.0 → 2.61.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/specs/Carousel.cy.tsx +46 -0
- package/cypress/specs/SecondaryNavigationDesktop.cy.tsx +52 -3
- package/cypress/specs/SelectBox.cy.tsx +37 -5
- package/cypress/specs/SideNavigation.cy.tsx +509 -0
- package/cypress/specs/Table.cy.tsx +90 -0
- package/cypress/support/component-imports.instrumented.ts +6 -0
- package/cypress/support/component-imports.src.ts +6 -0
- package/dist/Carousel.d.ts +1 -0
- package/dist/Carousel.js +16 -1
- package/dist/Carousel.js.map +1 -1
- package/dist/Pagination.d.ts +0 -1
- package/dist/Pagination.js +2 -2
- package/dist/Pagination.js.map +1 -1
- package/dist/SearchableListBaseTemplate.js +0 -1
- package/dist/SearchableListBaseTemplate.js.map +1 -1
- package/dist/SecondaryNavigation.d.ts +2 -1
- package/dist/SecondaryNavigation.js.map +1 -1
- package/dist/SecondaryNavigationItem.js +12 -6
- package/dist/SecondaryNavigationItem.js.map +1 -1
- package/dist/SecondaryNavigationTemplate.js +1 -2
- package/dist/SecondaryNavigationTemplate.js.map +1 -1
- package/dist/SelectBase.js +1 -1
- package/dist/SelectBase.js.map +1 -1
- package/dist/SideNavigation.d.ts +23 -0
- package/dist/SideNavigation.js +39 -0
- package/dist/SideNavigation.js.map +1 -1
- package/dist/SideNavigationItem.d.ts +10 -0
- package/dist/SideNavigationItem.js +67 -0
- package/dist/SideNavigationItem.js.map +1 -1
- package/dist/SideNavigationMobileTemplate.js +1 -1
- package/dist/SideNavigationMobileTemplate.js.map +1 -1
- package/dist/SideNavigationSubItem.d.ts +23 -0
- package/dist/SideNavigationSubItem.js +103 -0
- package/dist/SideNavigationSubItem.js.map +1 -1
- package/dist/SideNavigationSubItemTemplate.d.ts +2 -0
- package/dist/SideNavigationSubItemTemplate.js +10 -0
- package/dist/SideNavigationSubItemTemplate.js.map +1 -0
- package/dist/Table.js +1 -1
- package/dist/Table.js.map +1 -1
- package/dist/TableCell.d.ts +8 -2
- package/dist/TableCell.js +13 -11
- package/dist/TableCell.js.map +1 -1
- package/dist/TableCellBase.d.ts +2 -1
- package/dist/TableCellBase.js +9 -0
- package/dist/TableCellBase.js.map +1 -1
- package/dist/TableHeaderCell.d.ts +0 -1
- package/dist/TableHeaderCell.js +0 -4
- package/dist/TableHeaderCell.js.map +1 -1
- package/dist/TableRow.d.ts +10 -0
- package/dist/TableRow.js +23 -0
- package/dist/TableRow.js.map +1 -1
- package/dist/UploadItem.js +3 -4
- package/dist/UploadItem.js.map +1 -1
- package/dist/assets/{InputSuggestions-DyNcKgip.js → InputSuggestions-1OnUn6pM.js} +1 -1
- package/dist/assets/{ListItemStandardExpandableTextTemplate-qdKPzaOQ.js → ListItemStandardExpandableTextTemplate-CoBAMp_v.js} +1 -1
- package/dist/assets/{bundle.esm-sUYwSJOp.js → bundle.esm-BqaVWFKf.js} +233 -233
- package/dist/css/themes/AccordionSpotlight.css +1 -1
- package/dist/css/themes/Contact.css +1 -1
- package/dist/css/themes/EventRibbon.css +1 -1
- package/dist/css/themes/Feed.css +1 -1
- package/dist/css/themes/HeroBanner.css +1 -1
- package/dist/css/themes/ImageGridCloud.css +1 -1
- package/dist/css/themes/ImageGridTicker.css +1 -1
- package/dist/css/themes/ImageGridTickerItem.css +1 -1
- package/dist/css/themes/LinkList.css +1 -1
- package/dist/css/themes/MastheadCountrySelector.css +1 -1
- package/dist/css/themes/MastheadItem.css +1 -1
- package/dist/css/themes/MastheadMenu.css +1 -1
- package/dist/css/themes/MastheadMenuItem.css +1 -1
- package/dist/css/themes/MastheadMobileMenu.css +1 -1
- package/dist/css/themes/MastheadProfileMenu.css +1 -1
- package/dist/css/themes/MastheadShell.css +1 -1
- package/dist/css/themes/MessageStrip.css +1 -1
- package/dist/css/themes/Modal.css +1 -1
- package/dist/css/themes/PromoTile.css +1 -1
- package/dist/css/themes/Quote.css +1 -1
- package/dist/css/themes/Review.css +1 -1
- package/dist/css/themes/ReviewItem.css +1 -1
- package/dist/css/themes/SecondaryNavigation.css +1 -1
- package/dist/css/themes/SecondaryNavigationItem.css +1 -1
- package/dist/css/themes/SelectBase.css +1 -1
- package/dist/css/themes/SideNavigation.css +1 -1
- package/dist/css/themes/SideNavigationItem.css +1 -1
- package/dist/css/themes/SideNavigationMobile.css +1 -1
- package/dist/css/themes/SideNavigationMobileDropdown.css +1 -1
- package/dist/css/themes/SideNavigationSubItem.css +1 -1
- package/dist/css/themes/TabNavigation.css +1 -1
- package/dist/css/themes/Table.css +1 -1
- package/dist/css/themes/TableCellBase.css +1 -1
- package/dist/css/themes/Upload.css +1 -1
- package/dist/css/themes/UploadItem.css +1 -1
- package/dist/custom-elements-internal.json +155 -12
- package/dist/custom-elements.json +144 -19
- package/dist/generated/themes/AccordionSpotlight.css.d.ts +1 -1
- package/dist/generated/themes/AccordionSpotlight.css.js +1 -1
- package/dist/generated/themes/AccordionSpotlight.css.js.map +1 -1
- package/dist/generated/themes/Contact.css.d.ts +1 -1
- package/dist/generated/themes/Contact.css.js +1 -1
- package/dist/generated/themes/Contact.css.js.map +1 -1
- package/dist/generated/themes/EventRibbon.css.d.ts +1 -1
- package/dist/generated/themes/EventRibbon.css.js +1 -1
- package/dist/generated/themes/EventRibbon.css.js.map +1 -1
- package/dist/generated/themes/Feed.css.d.ts +1 -1
- package/dist/generated/themes/Feed.css.js +1 -1
- package/dist/generated/themes/Feed.css.js.map +1 -1
- package/dist/generated/themes/HeroBanner.css.d.ts +1 -1
- package/dist/generated/themes/HeroBanner.css.js +1 -1
- package/dist/generated/themes/HeroBanner.css.js.map +1 -1
- package/dist/generated/themes/ImageGridCloud.css.d.ts +1 -1
- package/dist/generated/themes/ImageGridCloud.css.js +1 -1
- package/dist/generated/themes/ImageGridCloud.css.js.map +1 -1
- package/dist/generated/themes/ImageGridTicker.css.d.ts +1 -1
- package/dist/generated/themes/ImageGridTicker.css.js +1 -1
- package/dist/generated/themes/ImageGridTicker.css.js.map +1 -1
- package/dist/generated/themes/ImageGridTickerItem.css.d.ts +1 -1
- package/dist/generated/themes/ImageGridTickerItem.css.js +1 -1
- package/dist/generated/themes/ImageGridTickerItem.css.js.map +1 -1
- package/dist/generated/themes/LinkList.css.d.ts +1 -1
- package/dist/generated/themes/LinkList.css.js +1 -1
- package/dist/generated/themes/LinkList.css.js.map +1 -1
- package/dist/generated/themes/MastheadCountrySelector.css.d.ts +1 -1
- package/dist/generated/themes/MastheadCountrySelector.css.js +1 -1
- package/dist/generated/themes/MastheadCountrySelector.css.js.map +1 -1
- package/dist/generated/themes/MastheadItem.css.d.ts +1 -1
- package/dist/generated/themes/MastheadItem.css.js +1 -1
- package/dist/generated/themes/MastheadItem.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/MastheadMenuItem.css.d.ts +1 -1
- package/dist/generated/themes/MastheadMenuItem.css.js +1 -1
- package/dist/generated/themes/MastheadMenuItem.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/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/MastheadShell.css.d.ts +1 -1
- package/dist/generated/themes/MastheadShell.css.js +1 -1
- package/dist/generated/themes/MastheadShell.css.js.map +1 -1
- package/dist/generated/themes/MessageStrip.css.d.ts +1 -1
- package/dist/generated/themes/MessageStrip.css.js +1 -1
- package/dist/generated/themes/MessageStrip.css.js.map +1 -1
- package/dist/generated/themes/Modal.css.d.ts +1 -1
- package/dist/generated/themes/Modal.css.js +1 -1
- package/dist/generated/themes/Modal.css.js.map +1 -1
- package/dist/generated/themes/PromoTile.css.d.ts +1 -1
- package/dist/generated/themes/PromoTile.css.js +1 -1
- package/dist/generated/themes/PromoTile.css.js.map +1 -1
- package/dist/generated/themes/Quote.css.d.ts +1 -1
- package/dist/generated/themes/Quote.css.js +1 -1
- package/dist/generated/themes/Quote.css.js.map +1 -1
- package/dist/generated/themes/Review.css.d.ts +1 -1
- package/dist/generated/themes/Review.css.js +1 -1
- package/dist/generated/themes/Review.css.js.map +1 -1
- package/dist/generated/themes/ReviewItem.css.d.ts +1 -1
- package/dist/generated/themes/ReviewItem.css.js +1 -1
- package/dist/generated/themes/ReviewItem.css.js.map +1 -1
- package/dist/generated/themes/SecondaryNavigation.css.d.ts +1 -1
- package/dist/generated/themes/SecondaryNavigation.css.js +1 -1
- package/dist/generated/themes/SecondaryNavigation.css.js.map +1 -1
- package/dist/generated/themes/SecondaryNavigationItem.css.d.ts +1 -1
- package/dist/generated/themes/SecondaryNavigationItem.css.js +1 -1
- package/dist/generated/themes/SecondaryNavigationItem.css.js.map +1 -1
- package/dist/generated/themes/SelectBase.css.d.ts +1 -1
- package/dist/generated/themes/SelectBase.css.js +1 -1
- package/dist/generated/themes/SelectBase.css.js.map +1 -1
- package/dist/generated/themes/SideNavigation.css.d.ts +1 -1
- package/dist/generated/themes/SideNavigation.css.js +1 -1
- package/dist/generated/themes/SideNavigation.css.js.map +1 -1
- package/dist/generated/themes/SideNavigationItem.css.d.ts +1 -1
- package/dist/generated/themes/SideNavigationItem.css.js +1 -1
- package/dist/generated/themes/SideNavigationItem.css.js.map +1 -1
- package/dist/generated/themes/SideNavigationMobile.css.d.ts +1 -1
- package/dist/generated/themes/SideNavigationMobile.css.js +1 -1
- package/dist/generated/themes/SideNavigationMobile.css.js.map +1 -1
- package/dist/generated/themes/SideNavigationMobileDropdown.css.d.ts +1 -1
- package/dist/generated/themes/SideNavigationMobileDropdown.css.js +1 -1
- package/dist/generated/themes/SideNavigationMobileDropdown.css.js.map +1 -1
- package/dist/generated/themes/SideNavigationSubItem.css.d.ts +1 -1
- package/dist/generated/themes/SideNavigationSubItem.css.js +1 -1
- package/dist/generated/themes/SideNavigationSubItem.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/generated/themes/Table.css.d.ts +1 -1
- package/dist/generated/themes/Table.css.js +1 -1
- package/dist/generated/themes/Table.css.js.map +1 -1
- package/dist/generated/themes/TableCellBase.css.d.ts +1 -1
- package/dist/generated/themes/TableCellBase.css.js +1 -1
- package/dist/generated/themes/TableCellBase.css.js.map +1 -1
- package/dist/generated/themes/Upload.css.d.ts +1 -1
- package/dist/generated/themes/Upload.css.js +1 -1
- package/dist/generated/themes/Upload.css.js.map +1 -1
- package/dist/generated/themes/UploadItem.css.d.ts +1 -1
- package/dist/generated/themes/UploadItem.css.js +1 -1
- package/dist/generated/themes/UploadItem.css.js.map +1 -1
- package/dist/types/Table.d.ts +6 -2
- package/dist/types/Table.js +7 -2
- package/dist/types/Table.js.map +1 -1
- package/dist/vscode.html-custom-data.json +44 -3
- package/dist/web-types.json +80 -6
- package/package.json +1 -1
- package/run-cypress.js +8 -1
- package/src/Carousel.ts +17 -1
- package/src/Pagination.ts +2 -3
- package/src/SearchableListBaseTemplate.tsx +0 -1
- package/src/SecondaryNavigation.ts +2 -1
- package/src/SecondaryNavigationItem.ts +14 -6
- package/src/SecondaryNavigationTemplate.tsx +4 -6
- package/src/SelectBase.ts +1 -1
- package/src/SideNavigation.ts +35 -0
- package/src/SideNavigationItem.ts +75 -0
- package/src/SideNavigationMobileTemplate.tsx +2 -1
- package/src/SideNavigationSubItem.ts +117 -1
- package/src/SideNavigationSubItemTemplate.tsx +56 -0
- package/src/Table.ts +1 -2
- package/src/TableCell.ts +9 -12
- package/src/TableCellBase.ts +10 -1
- package/src/TableHeaderCell.ts +0 -5
- package/src/TableRow.ts +20 -0
- package/src/UploadItem.ts +3 -5
- package/src/generated/themes/AccordionSpotlight.css.ts +1 -1
- package/src/generated/themes/Contact.css.ts +1 -1
- package/src/generated/themes/EventRibbon.css.ts +1 -1
- package/src/generated/themes/Feed.css.ts +1 -1
- package/src/generated/themes/HeroBanner.css.ts +1 -1
- package/src/generated/themes/ImageGridCloud.css.ts +1 -1
- package/src/generated/themes/ImageGridTicker.css.ts +1 -1
- package/src/generated/themes/ImageGridTickerItem.css.ts +1 -1
- package/src/generated/themes/LinkList.css.ts +1 -1
- package/src/generated/themes/MastheadCountrySelector.css.ts +1 -1
- package/src/generated/themes/MastheadItem.css.ts +1 -1
- package/src/generated/themes/MastheadMenu.css.ts +1 -1
- package/src/generated/themes/MastheadMenuItem.css.ts +1 -1
- package/src/generated/themes/MastheadMobileMenu.css.ts +1 -1
- package/src/generated/themes/MastheadProfileMenu.css.ts +1 -1
- package/src/generated/themes/MastheadShell.css.ts +1 -1
- package/src/generated/themes/MessageStrip.css.ts +1 -1
- package/src/generated/themes/Modal.css.ts +1 -1
- package/src/generated/themes/PromoTile.css.ts +1 -1
- package/src/generated/themes/Quote.css.ts +1 -1
- package/src/generated/themes/Review.css.ts +1 -1
- package/src/generated/themes/ReviewItem.css.ts +1 -1
- package/src/generated/themes/SecondaryNavigation.css.ts +1 -1
- package/src/generated/themes/SecondaryNavigationItem.css.ts +1 -1
- package/src/generated/themes/SelectBase.css.ts +1 -1
- package/src/generated/themes/SideNavigation.css.ts +1 -1
- package/src/generated/themes/SideNavigationItem.css.ts +1 -1
- package/src/generated/themes/SideNavigationMobile.css.ts +1 -1
- package/src/generated/themes/SideNavigationMobileDropdown.css.ts +1 -1
- package/src/generated/themes/SideNavigationSubItem.css.ts +1 -1
- package/src/generated/themes/TabNavigation.css.ts +1 -1
- package/src/generated/themes/Table.css.ts +1 -1
- package/src/generated/themes/TableCellBase.css.ts +1 -1
- package/src/generated/themes/Upload.css.ts +1 -1
- package/src/generated/themes/UploadItem.css.ts +1 -1
- package/src/themes/AccordionSpotlight.css +4 -1
- package/src/themes/Contact.css +1 -1
- package/src/themes/EventRibbon.css +4 -4
- package/src/themes/Feed.css +2 -2
- package/src/themes/HeroBanner.css +3 -3
- package/src/themes/ImageGridCloud.css +1 -1
- package/src/themes/ImageGridTicker.css +1 -1
- package/src/themes/ImageGridTickerItem.css +1 -1
- package/src/themes/LinkList.css +4 -4
- package/src/themes/MastheadCountrySelector.css +1 -1
- package/src/themes/MastheadItem.css +4 -4
- package/src/themes/MastheadMenu.css +1 -1
- package/src/themes/MastheadMenuItem.css +1 -1
- package/src/themes/MastheadMobileMenu.css +2 -2
- package/src/themes/MastheadProfileMenu.css +1 -1
- package/src/themes/MastheadShell.css +4 -4
- package/src/themes/MessageStrip.css +7 -2
- package/src/themes/Modal.css +1 -1
- package/src/themes/PromoTile.css +4 -3
- package/src/themes/Quote.css +2 -2
- package/src/themes/Review.css +2 -2
- package/src/themes/ReviewItem.css +2 -2
- package/src/themes/SecondaryNavigation.css +1 -2
- package/src/themes/SecondaryNavigationItem.css +3 -6
- package/src/themes/SelectBase.css +1 -1
- package/src/themes/SideNavigation.css +31 -8
- package/src/themes/SideNavigationItem.css +46 -18
- package/src/themes/SideNavigationMobile.css +6 -7
- package/src/themes/SideNavigationMobileDropdown.css +10 -3
- package/src/themes/SideNavigationSubItem.css +73 -17
- package/src/themes/TabNavigation.css +2 -2
- package/src/themes/Table.css +1 -1
- package/src/themes/TableCellBase.css +8 -0
- package/src/themes/Upload.css +1 -1
- package/src/themes/UploadItem.css +1 -1
- package/src/types/Table.ts +6 -2
package/src/Carousel.ts
CHANGED
|
@@ -219,6 +219,7 @@ class UDExCarousel extends UI5Element {
|
|
|
219
219
|
_autoplayMinTimeBetweenToggle = 250;
|
|
220
220
|
_autoplayManualStop = false;
|
|
221
221
|
_resizeHandler: ResizeObserverCallback;
|
|
222
|
+
_resizeRafHandle: number | null = null;
|
|
222
223
|
|
|
223
224
|
constructor() {
|
|
224
225
|
super();
|
|
@@ -238,6 +239,11 @@ class UDExCarousel extends UI5Element {
|
|
|
238
239
|
onExitDOM(): void {
|
|
239
240
|
ResizeHandler.deregister(this, this._resizeHandler);
|
|
240
241
|
|
|
242
|
+
if (this._resizeRafHandle !== null) {
|
|
243
|
+
cancelAnimationFrame(this._resizeRafHandle);
|
|
244
|
+
this._resizeRafHandle = null;
|
|
245
|
+
}
|
|
246
|
+
|
|
241
247
|
if (this._autoplayInterval) {
|
|
242
248
|
clearInterval(this._autoplayInterval);
|
|
243
249
|
}
|
|
@@ -248,7 +254,17 @@ class UDExCarousel extends UI5Element {
|
|
|
248
254
|
}
|
|
249
255
|
|
|
250
256
|
_onResize(): void {
|
|
251
|
-
this.
|
|
257
|
+
if (this._resizeRafHandle !== null) {
|
|
258
|
+
cancelAnimationFrame(this._resizeRafHandle);
|
|
259
|
+
}
|
|
260
|
+
// Defer until after the inner UI5 carousel has processed its own resize
|
|
261
|
+
// (outer element's ResizeObserver fires before inner element's, so the inner
|
|
262
|
+
// carousel's effectiveItemsPerPage and _currentPageIndex are still stale here)
|
|
263
|
+
this._resizeRafHandle = requestAnimationFrame(() => {
|
|
264
|
+
this._resizeRafHandle = null;
|
|
265
|
+
this._hasManyPages = this._carousel?.hasManyPages ?? false;
|
|
266
|
+
this._calculateDisabledButtonsState();
|
|
267
|
+
});
|
|
252
268
|
}
|
|
253
269
|
|
|
254
270
|
_autoplayLoop = () => {
|
package/src/Pagination.ts
CHANGED
|
@@ -18,6 +18,7 @@ import {
|
|
|
18
18
|
} from "./generated/i18n/i18n-defaults.js";
|
|
19
19
|
import Button from "./Button.js";
|
|
20
20
|
import translate from "./utils/translate.js";
|
|
21
|
+
import { BreakpointUtils } from "./utils/Breakpoints.js";
|
|
21
22
|
|
|
22
23
|
// Template
|
|
23
24
|
import PaginationTemplate from "./PaginationTemplate.js";
|
|
@@ -149,8 +150,6 @@ class UDExPagination extends UI5Element {
|
|
|
149
150
|
@i18n("@sapudex/web-components")
|
|
150
151
|
static i18nBundle: I18nBundle;
|
|
151
152
|
|
|
152
|
-
static readonly AUTO_DISPLAY_BREAKPOINT = 980;
|
|
153
|
-
|
|
154
153
|
_pages: Page[];
|
|
155
154
|
_visiblePages: Page[];
|
|
156
155
|
|
|
@@ -200,7 +199,7 @@ class UDExPagination extends UI5Element {
|
|
|
200
199
|
}
|
|
201
200
|
|
|
202
201
|
get _displayType(): `${UDExDisplayType}` {
|
|
203
|
-
return
|
|
202
|
+
return BreakpointUtils.isAbove("M")
|
|
204
203
|
? UDExDisplayType.desktop
|
|
205
204
|
: UDExDisplayType.mobile;
|
|
206
205
|
}
|
|
@@ -179,7 +179,6 @@ function renderListItem(
|
|
|
179
179
|
const effectiveRole = accessibleRole ?? (role !== "none" ? role : undefined) ?? "option";
|
|
180
180
|
const hostRole = activeDescendantMode ? (effectiveRole as AriaRole) : (role as AriaRole);
|
|
181
181
|
const hostAriaAttrs = activeDescendantMode ? {
|
|
182
|
-
"aria-label": "test",
|
|
183
182
|
// option role (listbox): always aria-selected; treeitem + MultiSelect: aria-checked only
|
|
184
183
|
"aria-selected": (effectiveRole !== "treeitem" || !modeMultiSelect) ? (item.selected ? "true" : "false") as string : undefined,
|
|
185
184
|
"aria-checked": (effectiveRole === "treeitem" && !!modeMultiSelect) ? (item.indeterminate ? "mixed" : (item.selected ? "true" : "false")) as string : undefined,
|
|
@@ -21,6 +21,7 @@ import { BreakpointUtils } from "./utils/Breakpoints.js";
|
|
|
21
21
|
import parseArrayFromString from "./utils/parseArrayFromString.js";
|
|
22
22
|
import AnalyticsName from "./types/AnalyticsName.js";
|
|
23
23
|
import translate from "./utils/translate.js";
|
|
24
|
+
import type { RelativeValue } from "./utils/parseRelativeUnits.js";
|
|
24
25
|
|
|
25
26
|
// Styles
|
|
26
27
|
import SecondaryNavigationCss from "./generated/themes/SecondaryNavigation.css.js";
|
|
@@ -180,7 +181,7 @@ class UDExSecondaryNavigation extends UI5Element {
|
|
|
180
181
|
* @public
|
|
181
182
|
*/
|
|
182
183
|
@property({ type: String })
|
|
183
|
-
maxDropdownHeight!:
|
|
184
|
+
maxDropdownHeight!: RelativeValue;
|
|
184
185
|
|
|
185
186
|
@property({ type: Boolean, noAttribute: true })
|
|
186
187
|
_selectedMore!: boolean;
|
|
@@ -32,6 +32,11 @@ type UDExSecondaryNavigationItemSubItemClickEventDetail = {
|
|
|
32
32
|
originalEvent: PointerEvent | KeyboardEvent
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
+
const DROPDOWN_MAX_HEIGHT_VAR = {
|
|
36
|
+
desktop: "--udex-secondary-navigation-item-dropdown-desktop-max-height",
|
|
37
|
+
mobile: "--udex-secondary-navigation-item-dropdown-mobile-max-height",
|
|
38
|
+
} as const;
|
|
39
|
+
|
|
35
40
|
/**
|
|
36
41
|
* @class
|
|
37
42
|
*
|
|
@@ -394,24 +399,27 @@ class UDExSecondaryNavigationItem extends UDExSecondaryNavigationItemBase {
|
|
|
394
399
|
setDesktopDropdownMaxHeight(): void {
|
|
395
400
|
const { top } = this.dropdown.getBoundingClientRect();
|
|
396
401
|
const maxHeight = window.innerHeight - top - DESKTOP_DROPDOWN_BOTTOM_GAP;
|
|
397
|
-
this.style.setProperty(
|
|
402
|
+
this.style.setProperty(DROPDOWN_MAX_HEIGHT_VAR.desktop, `${maxHeight}px`);
|
|
398
403
|
}
|
|
399
404
|
|
|
400
405
|
setMobileDropdownMaxHeight(): void {
|
|
401
406
|
if (!this._maxHeight || this._dropdownMaxHeightExceeds || !this.heightSatisfiesType) {
|
|
402
|
-
const
|
|
403
|
-
const
|
|
404
|
-
|
|
407
|
+
const { clientHeight } = this.shadowRoot!.querySelector(".udex-secondary-navigation__item")!;
|
|
408
|
+
const { top } = this.getBoundingClientRect();
|
|
409
|
+
const maxDropdownHeight = window.innerHeight - top - clientHeight;
|
|
410
|
+
|
|
411
|
+
this.style.setProperty(DROPDOWN_MAX_HEIGHT_VAR.mobile, `${maxDropdownHeight}px`);
|
|
405
412
|
return;
|
|
406
413
|
}
|
|
407
414
|
|
|
408
|
-
this.style.setProperty(
|
|
415
|
+
this.style.setProperty(DROPDOWN_MAX_HEIGHT_VAR.mobile, `${this._maxHeight}`);
|
|
409
416
|
}
|
|
410
417
|
|
|
411
418
|
get _dropdownMaxHeightExceeds(): boolean {
|
|
412
419
|
const normalizedHeight = parseRelativeUnits(this._maxHeight, this.dropdown);
|
|
420
|
+
const { top } = this.getBoundingClientRect();
|
|
413
421
|
const secondaryNavigationMobileTriggerHeight = this.shadowRoot!.querySelector(".udex-secondary-navigation__item")!.clientHeight;
|
|
414
|
-
return normalizedHeight >= window.innerHeight - secondaryNavigationMobileTriggerHeight;
|
|
422
|
+
return normalizedHeight >= window.innerHeight - top - secondaryNavigationMobileTriggerHeight;
|
|
415
423
|
}
|
|
416
424
|
|
|
417
425
|
get heightSatisfiesType(): boolean {
|
|
@@ -41,7 +41,7 @@ export default function SecondaryNavigationTemplate(this: UDExSecondaryNavigatio
|
|
|
41
41
|
subItems={item.items ?? []}
|
|
42
42
|
onui5-sub-item-click={this.handleSubItemClick}
|
|
43
43
|
onui5-nav-item-click={this.handleItemClick}
|
|
44
|
-
{
|
|
44
|
+
_navItemsLength={this.visibleItems.length}>
|
|
45
45
|
</UDExSecondaryNavigationItem>
|
|
46
46
|
</li>
|
|
47
47
|
))}
|
|
@@ -53,7 +53,7 @@ export default function SecondaryNavigationTemplate(this: UDExSecondaryNavigatio
|
|
|
53
53
|
onui5-nav-item-click={this.handleItemClick}
|
|
54
54
|
label={this.moreButtonText}
|
|
55
55
|
subItems={this._overflowItems}
|
|
56
|
-
{
|
|
56
|
+
_navItemsLength={this.visibleItems.length}>
|
|
57
57
|
</UDExSecondaryNavigationItem>
|
|
58
58
|
</li>
|
|
59
59
|
)}
|
|
@@ -75,10 +75,8 @@ export default function SecondaryNavigationTemplate(this: UDExSecondaryNavigatio
|
|
|
75
75
|
onui5-sub-item-click={this.handleSubItemClick}
|
|
76
76
|
onKeyDown={this.handleKeyDown}
|
|
77
77
|
subItems={this.parsedItems}
|
|
78
|
-
{
|
|
79
|
-
|
|
80
|
-
"_max-height": this.maxDropdownHeight
|
|
81
|
-
}}>
|
|
78
|
+
_maxHeight={this.maxDropdownHeight}
|
|
79
|
+
_is-mobile-menu-opener={true}>
|
|
82
80
|
{this.hasMobileButtonsSlot && (
|
|
83
81
|
<div className="udex-secondary-navigation__buttons" onClick={this.handleMobileButtonsClick}>
|
|
84
82
|
<slot name="buttons"></slot>
|
package/src/SelectBase.ts
CHANGED
|
@@ -720,7 +720,7 @@ class UDExSelectBase extends UDExSearchableListBase {
|
|
|
720
720
|
}
|
|
721
721
|
|
|
722
722
|
// Sync _selectedOption display for the first item (used when popover just opened via click).
|
|
723
|
-
if (!this._activeDescendantItem && hasItems) {
|
|
723
|
+
if (popoverOpened && !this._activeDescendantItem && hasItems) {
|
|
724
724
|
this._selectedOption = items[firstIndex].label;
|
|
725
725
|
}
|
|
726
726
|
}
|
package/src/SideNavigation.ts
CHANGED
|
@@ -6,6 +6,16 @@ import SideNavigation from "@ui5/webcomponents-fiori/dist/SideNavigation.js";
|
|
|
6
6
|
// Styles
|
|
7
7
|
import SideNavigationCss from "./generated/themes/SideNavigation.css.js";
|
|
8
8
|
|
|
9
|
+
export enum UDExSideNavigationVariant {
|
|
10
|
+
Full = "Full",
|
|
11
|
+
Content = "Content",
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export enum UDExSideNavigationPlacement {
|
|
15
|
+
Left = "Left",
|
|
16
|
+
Right = "Right",
|
|
17
|
+
}
|
|
18
|
+
|
|
9
19
|
/**
|
|
10
20
|
* @class
|
|
11
21
|
*
|
|
@@ -38,6 +48,31 @@ class UDExSideNavigation extends SideNavigation {
|
|
|
38
48
|
*/
|
|
39
49
|
@property({ type: Boolean })
|
|
40
50
|
isFixedInPlace!: boolean;
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Defines the variant of the component.
|
|
54
|
+
*
|
|
55
|
+
* @default "Full"
|
|
56
|
+
* @public
|
|
57
|
+
*/
|
|
58
|
+
@property()
|
|
59
|
+
variant: `${UDExSideNavigationVariant}` = UDExSideNavigationVariant.Full;
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Defines which side the navigation panel is on.
|
|
63
|
+
*
|
|
64
|
+
* @default "Left"
|
|
65
|
+
* @public
|
|
66
|
+
*/
|
|
67
|
+
@property()
|
|
68
|
+
placement: `${UDExSideNavigationPlacement}` = UDExSideNavigationPlacement.Left;
|
|
69
|
+
|
|
70
|
+
onBeforeRendering() {
|
|
71
|
+
super.onBeforeRendering();
|
|
72
|
+
this.querySelectorAll("[udex-side-navigation-item], [udex-side-navigation-sub-item]").forEach(item => {
|
|
73
|
+
item.setAttribute("variant", this.variant);
|
|
74
|
+
});
|
|
75
|
+
}
|
|
41
76
|
}
|
|
42
77
|
|
|
43
78
|
UDExSideNavigation.define();
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import customElement from "@ui5/webcomponents-base/dist/decorators/customElement.js";
|
|
2
2
|
import jsxRenderer from "@ui5/webcomponents-base/dist/renderer/JsxRenderer.js";
|
|
3
3
|
import SideNavigationItem from "@ui5/webcomponents-fiori/dist/SideNavigationItem.js";
|
|
4
|
+
import type SideNavigationItemBase from "@ui5/webcomponents-fiori/dist/SideNavigationItemBase.js";
|
|
5
|
+
import type SideNavigationSelectableItemBase from "@ui5/webcomponents-fiori/dist/SideNavigationSelectableItemBase.js";
|
|
6
|
+
import type UDExSideNavigationSubItem from "./SideNavigationSubItem.js";
|
|
4
7
|
|
|
5
8
|
// Styles
|
|
6
9
|
import SideNavigationItemCss from "./generated/themes/SideNavigationItem.css.js";
|
|
@@ -30,6 +33,78 @@ import { isDesktop } from "@ui5/webcomponents-base";
|
|
|
30
33
|
})
|
|
31
34
|
|
|
32
35
|
class UDExSideNavigationItem extends SideNavigationItem {
|
|
36
|
+
get _selected() {
|
|
37
|
+
if (this.sideNavCollapsed) {
|
|
38
|
+
return this.selected || this.items.some(item => item.selected);
|
|
39
|
+
}
|
|
40
|
+
return this.selected;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
get focusableItems(): Array<SideNavigationItemBase> {
|
|
44
|
+
// Recurse one level into expanded level-2 sub-items so their level-3 children join
|
|
45
|
+
// the Side Navigation's keyboard focus set (UI5's base getter is flat). Only one level
|
|
46
|
+
// of recursion is needed because the component supports at most three nesting levels.
|
|
47
|
+
if (!this.sideNavCollapsed && this.expanded) {
|
|
48
|
+
return [this, ...this.items.reduce((result, item) => {
|
|
49
|
+
return result.concat((item as UDExSideNavigationSubItem).focusableItems || [item]);
|
|
50
|
+
}, new Array<SideNavigationItemBase>())];
|
|
51
|
+
}
|
|
52
|
+
return super.focusableItems;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
get selectableItems(): Array<SideNavigationSelectableItemBase> {
|
|
56
|
+
// Recurse one level into level-2 sub-items so their level-3 children are part of the
|
|
57
|
+
// Side Navigation's selection registry (UI5's base getter is flat). Without this the
|
|
58
|
+
// selection sweep in SideNavigation._selectItem never reaches level 3, so selecting a
|
|
59
|
+
// level-3 item would not deselect items at other levels, and vice versa.
|
|
60
|
+
return this.items.reduce((result, item) => {
|
|
61
|
+
return result.concat((item as UDExSideNavigationSubItem).selectableItems || [item]);
|
|
62
|
+
}, new Array<SideNavigationSelectableItemBase>(this));
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
get allItems(): Array<SideNavigationItemBase> {
|
|
66
|
+
// Recurse one level into level-2 sub-items so level-3 children are enumerated by
|
|
67
|
+
// SideNavigation._getAllItems. That loop wires `sideNavigation` (and collapsed state)
|
|
68
|
+
// onto every item; without this, level-3 items never get `sideNavigation` set and
|
|
69
|
+
// their click handler cannot reach SideNavigation._handleItemClick to fire selection-change.
|
|
70
|
+
return this.items.reduce((result, item) => {
|
|
71
|
+
return result.concat((item as UDExSideNavigationSubItem).allItems || [item]);
|
|
72
|
+
}, new Array<SideNavigationItemBase>(this));
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
_initialExpandDone = false;
|
|
76
|
+
|
|
77
|
+
onBeforeRendering() {
|
|
78
|
+
super.onBeforeRendering();
|
|
79
|
+
// Open the group once on initial render if it contains a selected child, so the
|
|
80
|
+
// selection is visible. Do not re-apply on later renders — that would prevent the
|
|
81
|
+
// user from collapsing a group while one of its children stays selected.
|
|
82
|
+
if (!this._initialExpandDone) {
|
|
83
|
+
this._initialExpandDone = true;
|
|
84
|
+
if (!this.sideNavCollapsed && !this.expanded && this.items.some(item => item.selected)) {
|
|
85
|
+
this.expanded = true;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
_onclick(e: MouseEvent) {
|
|
91
|
+
// A grouping item (one with sub-items) toggles expand/collapse on click and
|
|
92
|
+
// never navigates — a parent with children must not have an href. Only leaf
|
|
93
|
+
// items navigate, so they fall through to the base handler.
|
|
94
|
+
if (this.hasSubItems && !this.sideNavCollapsed) {
|
|
95
|
+
e.preventDefault();
|
|
96
|
+
e.stopPropagation();
|
|
97
|
+
this.expanded = !this.expanded;
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
super._onclick(e);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
_onToggleClick(e: CustomEvent) {
|
|
104
|
+
e.preventDefault();
|
|
105
|
+
super._onToggleClick(e);
|
|
106
|
+
}
|
|
107
|
+
|
|
33
108
|
onEnterDOM() {
|
|
34
109
|
this.setAttribute("id", this._id);
|
|
35
110
|
|
|
@@ -51,7 +51,8 @@ export default function SideNavigationMobileTemplate(this: UDExSideNavigationMob
|
|
|
51
51
|
}}>
|
|
52
52
|
<UDExSideNavigation
|
|
53
53
|
ref={this._setNavItems}
|
|
54
|
-
onSelectionChange={this._handleSelectionChanged as any}
|
|
54
|
+
onSelectionChange={this._handleSelectionChanged as any}
|
|
55
|
+
{...{ "in-mobile": "" }}>
|
|
55
56
|
</UDExSideNavigation>
|
|
56
57
|
</UDExDropdown>
|
|
57
58
|
</>
|
|
@@ -1,6 +1,16 @@
|
|
|
1
1
|
import customElement from "@ui5/webcomponents-base/dist/decorators/customElement.js";
|
|
2
2
|
import jsxRenderer from "@ui5/webcomponents-base/dist/renderer/JsxRenderer.js";
|
|
3
|
+
import property from "@ui5/webcomponents-base/dist/decorators/property.js";
|
|
4
|
+
import slot from "@ui5/webcomponents-base/dist/decorators/slot-strict.js";
|
|
5
|
+
import type { DefaultSlot } from "@ui5/webcomponents-base/dist/UI5Element.js";
|
|
6
|
+
import {
|
|
7
|
+
isLeft,
|
|
8
|
+
isRight,
|
|
9
|
+
isMinus,
|
|
10
|
+
isPlus,
|
|
11
|
+
} from "@ui5/webcomponents-base/dist/Keys.js";
|
|
3
12
|
import SideNavigationSubItem from "@ui5/webcomponents-fiori/dist/SideNavigationSubItem.js";
|
|
13
|
+
import SideNavigationSubItemTemplate from "./SideNavigationSubItemTemplate.js";
|
|
4
14
|
|
|
5
15
|
// Styles
|
|
6
16
|
import SideNavigationSubItemCss from "./generated/themes/SideNavigationSubItem.css.js";
|
|
@@ -25,10 +35,116 @@ import SideNavigationSubItemCss from "./generated/themes/SideNavigationSubItem.c
|
|
|
25
35
|
@customElement({
|
|
26
36
|
tag: "udex-side-navigation-sub-item",
|
|
27
37
|
renderer: jsxRenderer,
|
|
38
|
+
template: SideNavigationSubItemTemplate,
|
|
28
39
|
styles: [SideNavigationSubItem.styles, SideNavigationSubItemCss],
|
|
40
|
+
dependencies: [UDExSideNavigationSubItem],
|
|
29
41
|
})
|
|
30
42
|
|
|
31
|
-
class UDExSideNavigationSubItem extends SideNavigationSubItem {
|
|
43
|
+
class UDExSideNavigationSubItem extends SideNavigationSubItem {
|
|
44
|
+
/**
|
|
45
|
+
* Defines whether the sub-item is expanded (shows level-3 children).
|
|
46
|
+
*
|
|
47
|
+
* @default false
|
|
48
|
+
* @public
|
|
49
|
+
*/
|
|
50
|
+
@property({ type: Boolean })
|
|
51
|
+
expanded = false;
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Defines the level-3 sub-items slotted inside this sub-item.
|
|
55
|
+
* @public
|
|
56
|
+
*/
|
|
57
|
+
@slot({ type: HTMLElement, invalidateOnChildChange: true, "default": true })
|
|
58
|
+
subItems!: DefaultSlot<UDExSideNavigationSubItem>;
|
|
59
|
+
|
|
60
|
+
get hasSubItems() {
|
|
61
|
+
return this.subItems.length > 0;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
get focusableItems(): Array<UDExSideNavigationSubItem> {
|
|
65
|
+
if (this.hasSubItems && this.expanded) {
|
|
66
|
+
return [this, ...this.subItems];
|
|
67
|
+
}
|
|
68
|
+
return [this];
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
get selectableItems(): Array<UDExSideNavigationSubItem> {
|
|
72
|
+
// Expose this level-2 sub-item plus its level-3 children so the Side Navigation's
|
|
73
|
+
// selection registry (built by UDExSideNavigationItem.selectableItems) reaches level 3.
|
|
74
|
+
return this.hasSubItems ? [this, ...this.subItems] : [this];
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
get allItems(): Array<UDExSideNavigationSubItem> {
|
|
78
|
+
// Expose this sub-item plus its level-3 children so SideNavigation._getAllItems wires
|
|
79
|
+
// `sideNavigation` and collapsed state onto level-3 items. Without it, a level-3 leaf's
|
|
80
|
+
// click handler has no `sideNavigation` reference and cannot fire selection-change.
|
|
81
|
+
return this.hasSubItems ? [this, ...this.subItems] : [this];
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
onBeforeRendering() {
|
|
85
|
+
super.onBeforeRendering();
|
|
86
|
+
this.subItems.forEach(subItem => {
|
|
87
|
+
if (!subItem.hasAttribute("nested")) { subItem.setAttribute("nested", ""); }
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
get _subGroupId(): string | undefined {
|
|
92
|
+
return this.hasSubItems ? `${this._id}-group` : undefined;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
get _subExpanded(): boolean | undefined {
|
|
96
|
+
return this.hasSubItems ? this.expanded : undefined;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
_onToggleClick(e: Event) {
|
|
100
|
+
e.stopPropagation();
|
|
101
|
+
e.preventDefault();
|
|
102
|
+
this.expanded = !this.expanded;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
_onkeydown(e: KeyboardEvent) {
|
|
106
|
+
if (this.hasSubItems && !this.sideNavCollapsed) {
|
|
107
|
+
const isRTL = this.effectiveDir === "rtl";
|
|
108
|
+
if (isLeft(e)) {
|
|
109
|
+
e.preventDefault();
|
|
110
|
+
this.expanded = isRTL;
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
if (isRight(e)) {
|
|
114
|
+
e.preventDefault();
|
|
115
|
+
this.expanded = !isRTL;
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
if (isMinus(e)) {
|
|
119
|
+
e.preventDefault();
|
|
120
|
+
this.expanded = false;
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
if (isPlus(e)) {
|
|
124
|
+
e.preventDefault();
|
|
125
|
+
this.expanded = true;
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
// Level-3 leaves fall through to the base, which activates on Enter and fires
|
|
130
|
+
// selection-change — the same behaviour as level-1 and level-2 leaves.
|
|
131
|
+
super._onkeydown(e);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
_onclick(e: MouseEvent) {
|
|
135
|
+
// A group sub-item (one with sub-items) toggles expand/collapse and never navigates —
|
|
136
|
+
// a parent with children must not have an href. A leaf (including a level-3 leaf) falls
|
|
137
|
+
// through to the base handler, which fires selection-change and navigates via its href,
|
|
138
|
+
// exactly like level-1 and level-2 leaves.
|
|
139
|
+
if (this.hasSubItems) {
|
|
140
|
+
e.preventDefault();
|
|
141
|
+
e.stopPropagation();
|
|
142
|
+
this.expanded = !this.expanded;
|
|
143
|
+
} else {
|
|
144
|
+
super._onclick(e);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
32
148
|
|
|
33
149
|
UDExSideNavigationSubItem.define();
|
|
34
150
|
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import Icon from "@ui5/webcomponents/dist/Icon.js";
|
|
2
|
+
import arrowRight from "@ui5/webcomponents-icons/dist/arrow-right.js";
|
|
3
|
+
import navRightArrow from "@ui5/webcomponents-icons/dist/navigation-right-arrow.js";
|
|
4
|
+
import navDownArrow from "@ui5/webcomponents-icons/dist/navigation-down-arrow.js";
|
|
5
|
+
import type UDExSideNavigationSubItem from "./SideNavigationSubItem.js";
|
|
6
|
+
|
|
7
|
+
export default function SideNavigationSubItemTemplate(this: UDExSideNavigationSubItem) {
|
|
8
|
+
const EffectiveTag = this._effectiveTag;
|
|
9
|
+
return (
|
|
10
|
+
<li id={this._id} class="ui5-sn-list-li" role="none">
|
|
11
|
+
<EffectiveTag
|
|
12
|
+
id={this._id}
|
|
13
|
+
data-sap-focus-ref
|
|
14
|
+
class={`ui5-sn-item ui5-sn-item-level2 ${this._classes}`}
|
|
15
|
+
role={this.ariaRole}
|
|
16
|
+
onKeyDown={this._onkeydown}
|
|
17
|
+
onKeyUp={this._onkeyup}
|
|
18
|
+
onClick={this._onclick}
|
|
19
|
+
onFocusIn={this._onfocusin}
|
|
20
|
+
tabIndex={this.effectiveTabIndex}
|
|
21
|
+
aria-current={this._ariaCurrent}
|
|
22
|
+
aria-selected={this._ariaSelected}
|
|
23
|
+
aria-label={this.accessibleName || undefined}
|
|
24
|
+
title={this._tooltip}
|
|
25
|
+
aria-disabled={this.effectiveDisabled}
|
|
26
|
+
href={this._href}
|
|
27
|
+
target={this._target}
|
|
28
|
+
aria-haspopup={this._ariaHasPopup}
|
|
29
|
+
aria-describedby={this._describedBy}
|
|
30
|
+
aria-expanded={this._subExpanded}
|
|
31
|
+
aria-owns={this._subGroupId}
|
|
32
|
+
>
|
|
33
|
+
{this.icon && <Icon class="ui5-sn-item-icon" name={this.icon} />}
|
|
34
|
+
<div class="ui5-sn-item-text" id={this._textId}>{this.text}</div>
|
|
35
|
+
{this.hasTag && (
|
|
36
|
+
<div id={this._tagId} class="ui5-sn-item-tag-slot">
|
|
37
|
+
<slot name="tag" />
|
|
38
|
+
</div>
|
|
39
|
+
)}
|
|
40
|
+
{this.hasSubItems && (
|
|
41
|
+
<Icon
|
|
42
|
+
class="ui5-sn-item-toggle-icon"
|
|
43
|
+
name={this.expanded ? navDownArrow : navRightArrow}
|
|
44
|
+
onClick={(e: Event) => this._onToggleClick(e)}
|
|
45
|
+
/>
|
|
46
|
+
)}
|
|
47
|
+
{this.isExternalLink && <Icon class="ui5-sn-item-external-link-icon" name={arrowRight} />}
|
|
48
|
+
</EffectiveTag>
|
|
49
|
+
{this.hasSubItems && (
|
|
50
|
+
<ul id={this._subGroupId} class="ui5-sn-item-ul" role="group">
|
|
51
|
+
<slot />
|
|
52
|
+
</ul>
|
|
53
|
+
)}
|
|
54
|
+
</li>
|
|
55
|
+
);
|
|
56
|
+
}
|
package/src/Table.ts
CHANGED
|
@@ -15,11 +15,10 @@ import { TABLE_NO_DATA_FOUND } from "./generated/i18n/i18n-defaults.js";
|
|
|
15
15
|
import i18n from "@ui5/webcomponents-base/dist/decorators/i18n.js";
|
|
16
16
|
import type I18nBundle from "@ui5/webcomponents-base/dist/i18nBundle.js";
|
|
17
17
|
import TableTemplate from "./TableTemplate.js";
|
|
18
|
-
|
|
18
|
+
import translate from "./utils/translate.js";
|
|
19
19
|
// Styles
|
|
20
20
|
import TableCss from "./generated/themes/Table.css.js";
|
|
21
21
|
import getEffectiveScrollbarStyle from "./utils/getEffectiveScrollbarStyle.js";
|
|
22
|
-
import translate from "./utils/translate.js";
|
|
23
22
|
|
|
24
23
|
export type TableBaseRow = UDExTableHeaderRow | UDExTableRow;
|
|
25
24
|
|
package/src/TableCell.ts
CHANGED
|
@@ -3,6 +3,7 @@ import jsxRenderer from "@ui5/webcomponents-base/renderer/JsxRenderer.js";
|
|
|
3
3
|
import property from "@ui5/webcomponents-base/dist/decorators/property.js";
|
|
4
4
|
import UDExTableCellBase from "./TableCellBase.js";
|
|
5
5
|
import TableCellTemplate from "./TableCellTemplate.js";
|
|
6
|
+
import { UDExTableCellVerticalAlign } from "./types/Table.js";
|
|
6
7
|
|
|
7
8
|
// Styles
|
|
8
9
|
import TableCellCss from "./generated/themes/TableCell.css.js";
|
|
@@ -50,18 +51,14 @@ class UDExTableCell extends UDExTableCellBase {
|
|
|
50
51
|
@property({ type: Boolean })
|
|
51
52
|
_highlighted?: boolean;
|
|
52
53
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
} else {
|
|
62
|
-
this.style.justifyContent = `var(--horizontal-align-${(this)._individualSlot})`;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
54
|
+
/**
|
|
55
|
+
* Determines the vertical alignment of the cell content.
|
|
56
|
+
*
|
|
57
|
+
* @default "Center"
|
|
58
|
+
* @public
|
|
59
|
+
*/
|
|
60
|
+
@property()
|
|
61
|
+
verticalAlign: `${UDExTableCellVerticalAlign}` = UDExTableCellVerticalAlign.Center;
|
|
65
62
|
}
|
|
66
63
|
|
|
67
64
|
UDExTableCell.define();
|
package/src/TableCellBase.ts
CHANGED
|
@@ -4,7 +4,7 @@ import customElement from "@ui5/webcomponents-base/dist/decorators/customElement
|
|
|
4
4
|
import slot from "@ui5/webcomponents-base/dist/decorators/slot-strict.js";
|
|
5
5
|
import property from "@ui5/webcomponents-base/dist/decorators/property.js";
|
|
6
6
|
import litRender from "@ui5/webcomponents-base/dist/renderer/LitRenderer.js";
|
|
7
|
-
import type UDExTableCellHorizontalAlign from "./types/Table.js";
|
|
7
|
+
import type { UDExTableCellHorizontalAlign } from "./types/Table.js";
|
|
8
8
|
|
|
9
9
|
// Styles
|
|
10
10
|
import TableCellBaseCss from "./generated/themes/TableCellBase.css.js";
|
|
@@ -62,6 +62,15 @@ abstract class UDExTableCellBase extends UI5Element {
|
|
|
62
62
|
|
|
63
63
|
onBeforeRendering() {
|
|
64
64
|
this.setAttribute("role", this.ariaRole);
|
|
65
|
+
this.setJustifyContent();
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
setJustifyContent(): void {
|
|
69
|
+
if (this.horizontalAlign) {
|
|
70
|
+
this.style.justifyContent = this.horizontalAlign;
|
|
71
|
+
} else {
|
|
72
|
+
this.style.justifyContent = `var(--horizontal-align-${this._individualSlot})`;
|
|
73
|
+
}
|
|
65
74
|
}
|
|
66
75
|
}
|
|
67
76
|
|
package/src/TableHeaderCell.ts
CHANGED
|
@@ -61,11 +61,6 @@ class UDExTableHeaderCell extends UDExTableCellBase {
|
|
|
61
61
|
|
|
62
62
|
protected ariaRole: string = "columnheader";
|
|
63
63
|
|
|
64
|
-
onBeforeRendering() {
|
|
65
|
-
super.onBeforeRendering();
|
|
66
|
-
this.style.justifyContent = `var(--horizontal-align-${this._individualSlot})`;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
64
|
get _hasIcons(): boolean {
|
|
70
65
|
return this.iconStart.length > 0 || this.iconEnd.length > 0;
|
|
71
66
|
}
|
package/src/TableRow.ts
CHANGED
|
@@ -4,6 +4,7 @@ import property from "@ui5/webcomponents-base/dist/decorators/property.js";
|
|
|
4
4
|
import UDExTableRowBase from "./TableRowBase.js";
|
|
5
5
|
import type UDExTableCell from "./TableCell.js";
|
|
6
6
|
import TableRowTemplate from "./TableRowTemplate.js";
|
|
7
|
+
import { UDExTableCellVerticalAlign } from "./types/Table.js";
|
|
7
8
|
|
|
8
9
|
/**
|
|
9
10
|
* @class
|
|
@@ -48,10 +49,21 @@ class UDExTableRow extends UDExTableRowBase {
|
|
|
48
49
|
@property({ type: Boolean })
|
|
49
50
|
highlighted?: boolean;
|
|
50
51
|
|
|
52
|
+
/**
|
|
53
|
+
* Determines the vertical alignment of all cells in the row.
|
|
54
|
+
* Applies to every cell that does not define its own verticalAlign.
|
|
55
|
+
*
|
|
56
|
+
* @default "Center"
|
|
57
|
+
* @public
|
|
58
|
+
*/
|
|
59
|
+
@property()
|
|
60
|
+
verticalAlign: `${UDExTableCellVerticalAlign}` = UDExTableCellVerticalAlign.Center;
|
|
61
|
+
|
|
51
62
|
onBeforeRendering(): void {
|
|
52
63
|
if (this.highlighted) {
|
|
53
64
|
this._setHighlightToCells();
|
|
54
65
|
}
|
|
66
|
+
this._setVerticalAlignToCells();
|
|
55
67
|
}
|
|
56
68
|
|
|
57
69
|
_setHighlightToCells(): void {
|
|
@@ -60,6 +72,14 @@ class UDExTableRow extends UDExTableRowBase {
|
|
|
60
72
|
});
|
|
61
73
|
}
|
|
62
74
|
|
|
75
|
+
_setVerticalAlignToCells(): void {
|
|
76
|
+
this.cellsInRow.forEach(cell => {
|
|
77
|
+
if (cell.verticalAlign === UDExTableCellVerticalAlign.Center) {
|
|
78
|
+
cell.verticalAlign = this.verticalAlign;
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
|
|
63
83
|
get isGroup(): boolean {
|
|
64
84
|
return false;
|
|
65
85
|
}
|