@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
|
@@ -0,0 +1,509 @@
|
|
|
1
|
+
import {
|
|
2
|
+
UDExSideNavigation,
|
|
3
|
+
UDExSideNavigationItem,
|
|
4
|
+
UDExSideNavigationSubItem,
|
|
5
|
+
} from "../support/component-imports.js";
|
|
6
|
+
|
|
7
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
8
|
+
const SideNav = UDExSideNavigation as any;
|
|
9
|
+
|
|
10
|
+
describe("SideNavigation - placement property", () => {
|
|
11
|
+
describe("Host attribute reflection", () => {
|
|
12
|
+
it("reflects placement 'Left' as the default host attribute", () => {
|
|
13
|
+
cy.mount(
|
|
14
|
+
<SideNav id="side-nav">
|
|
15
|
+
<UDExSideNavigationItem text="Item 1"></UDExSideNavigationItem>
|
|
16
|
+
</SideNav>,
|
|
17
|
+
);
|
|
18
|
+
|
|
19
|
+
cy.get("[udex-side-navigation]").should("have.attr", "placement", "Left");
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
it("reflects placement 'Right' when set on the host", () => {
|
|
23
|
+
cy.mount(
|
|
24
|
+
<SideNav id="side-nav" placement="Right">
|
|
25
|
+
<UDExSideNavigationItem text="Item 1"></UDExSideNavigationItem>
|
|
26
|
+
</SideNav>,
|
|
27
|
+
);
|
|
28
|
+
|
|
29
|
+
cy.get("[udex-side-navigation]").should("have.attr", "placement", "Right");
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
describe("SideNavigation - third-level nesting", () => {
|
|
36
|
+
const mountWithThirdLevel = (subItemExpanded = false) => {
|
|
37
|
+
cy.mount(
|
|
38
|
+
<SideNav id="side-nav">
|
|
39
|
+
<UDExSideNavigationItem text="Item 1" expanded>
|
|
40
|
+
{/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}
|
|
41
|
+
<UDExSideNavigationSubItem text="Sub Item 1" {...(subItemExpanded ? { expanded: true } as any : {})}>
|
|
42
|
+
<UDExSideNavigationSubItem text="Sub Item 1.1"></UDExSideNavigationSubItem>
|
|
43
|
+
<UDExSideNavigationSubItem text="Sub Item 1.2"></UDExSideNavigationSubItem>
|
|
44
|
+
</UDExSideNavigationSubItem>
|
|
45
|
+
</UDExSideNavigationItem>
|
|
46
|
+
</SideNav>,
|
|
47
|
+
);
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
it("renders a toggle icon on a level-2 sub-item that has children", () => {
|
|
51
|
+
mountWithThirdLevel();
|
|
52
|
+
cy.get("[udex-side-navigation-sub-item]").first()
|
|
53
|
+
.shadow()
|
|
54
|
+
.find(".ui5-sn-item-toggle-icon")
|
|
55
|
+
.should("exist");
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
it("expands level-3 children when the level-2 sub-item is clicked", () => {
|
|
59
|
+
mountWithThirdLevel(false);
|
|
60
|
+
cy.get("[udex-side-navigation-sub-item]").first().shadow().find(".ui5-sn-item").click();
|
|
61
|
+
cy.get("[udex-side-navigation-sub-item]").first().should("have.attr", "expanded");
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
it("collapses level-3 children when an expanded level-2 sub-item is clicked again", () => {
|
|
65
|
+
mountWithThirdLevel(true);
|
|
66
|
+
cy.get("[udex-side-navigation-sub-item]").first().shadow().find(".ui5-sn-item").click();
|
|
67
|
+
cy.get("[udex-side-navigation-sub-item]").first().should("not.have.attr", "expanded");
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
it("sets the nested attribute on level-3 sub-items", () => {
|
|
71
|
+
mountWithThirdLevel(true);
|
|
72
|
+
cy.get("[udex-side-navigation-sub-item][nested]").should("have.length", 2);
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
// Updated: nested-item-click removed (#2822) — level-3 leaves now fire the standard
|
|
76
|
+
// bubbling selection-change on the host and gain the selected attribute, like level 1/2.
|
|
77
|
+
it("fires selection-change on the host when a leaf level-3 sub-item is clicked", () => {
|
|
78
|
+
mountWithThirdLevel(true);
|
|
79
|
+
const onSelectionChange = cy.stub().as("selectionChange");
|
|
80
|
+
cy.get("[udex-side-navigation]").then(($el) => {
|
|
81
|
+
$el[0].addEventListener("selection-change", onSelectionChange);
|
|
82
|
+
});
|
|
83
|
+
cy.get("[udex-side-navigation-sub-item][nested]").first().shadow().find(".ui5-sn-item").click();
|
|
84
|
+
cy.get("@selectionChange").should("have.been.calledOnce");
|
|
85
|
+
cy.get("[udex-side-navigation-sub-item][nested]").first().then(($leaf) => {
|
|
86
|
+
cy.get("@selectionChange").should((stub) => {
|
|
87
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
88
|
+
const detail = (stub as any).firstCall.args[0].detail;
|
|
89
|
+
expect(detail.item).to.equal($leaf[0]);
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
cy.get("[udex-side-navigation-sub-item][nested]").first().should("have.attr", "selected");
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
// Updated: nested-item-click (and its preventDefault capability) removed (#2822) —
|
|
96
|
+
// a level-3 leaf with an href now navigates natively, matching level-1/level-2 leaves.
|
|
97
|
+
it("navigates natively when a level-3 leaf with an href is clicked", () => {
|
|
98
|
+
cy.mount(
|
|
99
|
+
<SideNav id="side-nav">
|
|
100
|
+
<UDExSideNavigationItem text="Item 1" expanded>
|
|
101
|
+
{/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}
|
|
102
|
+
<UDExSideNavigationSubItem text="Sub Item 1" {...{ expanded: true } as any}>
|
|
103
|
+
<UDExSideNavigationSubItem text="Sub Item 1.1" href="#section-1"></UDExSideNavigationSubItem>
|
|
104
|
+
</UDExSideNavigationSubItem>
|
|
105
|
+
</UDExSideNavigationItem>
|
|
106
|
+
</SideNav>,
|
|
107
|
+
);
|
|
108
|
+
cy.get("[udex-side-navigation-sub-item][nested]").first().shadow().find(".ui5-sn-item").click();
|
|
109
|
+
cy.url().should("include", "section-1");
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
describe("SideNavigation - cross-level deselection (#2822)", () => {
|
|
114
|
+
// Added: the component now overrides selectableItems/allItems so the base selection
|
|
115
|
+
// sweep reaches level 3 — selecting any item deselects the previously selected item
|
|
116
|
+
// at any level, across levels.
|
|
117
|
+
const clickLeaf = (text: string) => {
|
|
118
|
+
cy.get(`[udex-side-navigation-sub-item][text="${text}"]`).shadow().find(".ui5-sn-item").click();
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
const mountTwoThirdLevelBranches = () => {
|
|
122
|
+
cy.mount(
|
|
123
|
+
<SideNav id="side-nav">
|
|
124
|
+
<UDExSideNavigationItem text="Item 1" expanded>
|
|
125
|
+
{/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}
|
|
126
|
+
<UDExSideNavigationSubItem text="Sub Item A" {...{ expanded: true } as any}>
|
|
127
|
+
<UDExSideNavigationSubItem text="Leaf A.1"></UDExSideNavigationSubItem>
|
|
128
|
+
</UDExSideNavigationSubItem>
|
|
129
|
+
{/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}
|
|
130
|
+
<UDExSideNavigationSubItem text="Sub Item B" {...{ expanded: true } as any}>
|
|
131
|
+
<UDExSideNavigationSubItem text="Leaf B.1"></UDExSideNavigationSubItem>
|
|
132
|
+
</UDExSideNavigationSubItem>
|
|
133
|
+
</UDExSideNavigationItem>
|
|
134
|
+
</SideNav>,
|
|
135
|
+
);
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
it("deselects a level-3 leaf when a different level-3 leaf under another parent is selected", () => {
|
|
139
|
+
mountTwoThirdLevelBranches();
|
|
140
|
+
clickLeaf("Leaf A.1");
|
|
141
|
+
cy.get(`[udex-side-navigation-sub-item][text="Leaf A.1"]`).should("have.attr", "selected");
|
|
142
|
+
clickLeaf("Leaf B.1");
|
|
143
|
+
cy.get(`[udex-side-navigation-sub-item][text="Leaf A.1"]`).should("not.have.attr", "selected");
|
|
144
|
+
cy.get(`[udex-side-navigation-sub-item][text="Leaf B.1"]`).should("have.attr", "selected");
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
it("deselects a level-1 leaf when a level-3 leaf is selected", () => {
|
|
148
|
+
cy.mount(
|
|
149
|
+
<SideNav id="side-nav">
|
|
150
|
+
<UDExSideNavigationItem text="L1 Leaf" href="#l1"></UDExSideNavigationItem>
|
|
151
|
+
<UDExSideNavigationItem text="Item 2" expanded>
|
|
152
|
+
{/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}
|
|
153
|
+
<UDExSideNavigationSubItem text="Sub Item A" {...{ expanded: true } as any}>
|
|
154
|
+
<UDExSideNavigationSubItem text="Leaf A.1"></UDExSideNavigationSubItem>
|
|
155
|
+
</UDExSideNavigationSubItem>
|
|
156
|
+
</UDExSideNavigationItem>
|
|
157
|
+
</SideNav>,
|
|
158
|
+
);
|
|
159
|
+
cy.get(`[udex-side-navigation-item][text="L1 Leaf"]`).shadow().find(".ui5-sn-item").click();
|
|
160
|
+
cy.get(`[udex-side-navigation-item][text="L1 Leaf"]`).should("have.attr", "selected");
|
|
161
|
+
clickLeaf("Leaf A.1");
|
|
162
|
+
cy.get(`[udex-side-navigation-item][text="L1 Leaf"]`).should("not.have.attr", "selected");
|
|
163
|
+
cy.get(`[udex-side-navigation-sub-item][text="Leaf A.1"]`).should("have.attr", "selected");
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
it("deselects a level-3 leaf when a level-2 leaf is selected", () => {
|
|
167
|
+
cy.mount(
|
|
168
|
+
<SideNav id="side-nav">
|
|
169
|
+
<UDExSideNavigationItem text="Item 1" expanded>
|
|
170
|
+
{/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}
|
|
171
|
+
<UDExSideNavigationSubItem text="Sub Item A" {...{ expanded: true } as any}>
|
|
172
|
+
<UDExSideNavigationSubItem text="Leaf A.1"></UDExSideNavigationSubItem>
|
|
173
|
+
</UDExSideNavigationSubItem>
|
|
174
|
+
<UDExSideNavigationSubItem text="L2 Leaf"></UDExSideNavigationSubItem>
|
|
175
|
+
</UDExSideNavigationItem>
|
|
176
|
+
</SideNav>,
|
|
177
|
+
);
|
|
178
|
+
clickLeaf("Leaf A.1");
|
|
179
|
+
cy.get(`[udex-side-navigation-sub-item][text="Leaf A.1"]`).should("have.attr", "selected");
|
|
180
|
+
clickLeaf("L2 Leaf");
|
|
181
|
+
cy.get(`[udex-side-navigation-sub-item][text="Leaf A.1"]`).should("not.have.attr", "selected");
|
|
182
|
+
cy.get(`[udex-side-navigation-sub-item][text="L2 Leaf"]`).should("have.attr", "selected");
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
it("moves selection to a level-3 leaf on click (sideNavigation selection wiring regression guard)", () => {
|
|
186
|
+
mountTwoThirdLevelBranches();
|
|
187
|
+
cy.get(`[udex-side-navigation-sub-item][text="Leaf A.1"]`).should("not.have.attr", "selected");
|
|
188
|
+
clickLeaf("Leaf A.1");
|
|
189
|
+
cy.get(`[udex-side-navigation-sub-item][text="Leaf A.1"]`).should("have.attr", "selected");
|
|
190
|
+
});
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
describe("SideNavigation - grouping item click toggles expand/collapse", () => {
|
|
194
|
+
// A parent item that has children toggles expand/collapse on title click and never
|
|
195
|
+
// navigates: the click is preventDefault'd + stopPropagation'd so it does not reach a
|
|
196
|
+
// host/document listener. This holds for both level-1 items and level-2 group sub-items.
|
|
197
|
+
// A parent with children must not carry an href — only leaf items navigate.
|
|
198
|
+
it("level-1 group expands on title click and does not propagate to a host listener", () => {
|
|
199
|
+
cy.mount(
|
|
200
|
+
<SideNav id="side-nav">
|
|
201
|
+
<UDExSideNavigationItem text="L1">
|
|
202
|
+
<UDExSideNavigationSubItem text="L2"></UDExSideNavigationSubItem>
|
|
203
|
+
</UDExSideNavigationItem>
|
|
204
|
+
</SideNav>,
|
|
205
|
+
);
|
|
206
|
+
const onHostClick = cy.stub().as("hostClick");
|
|
207
|
+
cy.get("[udex-side-navigation]").then(($el) => {
|
|
208
|
+
$el[0].addEventListener("click", onHostClick);
|
|
209
|
+
});
|
|
210
|
+
cy.get("[udex-side-navigation-item]").first().should("not.have.attr", "expanded");
|
|
211
|
+
cy.get("[udex-side-navigation-item]").first().shadow().find(".ui5-sn-item").first().realClick();
|
|
212
|
+
cy.get("[udex-side-navigation-item]").first().should("have.attr", "expanded");
|
|
213
|
+
cy.get("@hostClick").should("not.have.been.called");
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
it("level-1 group collapses on a second title click", () => {
|
|
217
|
+
cy.mount(
|
|
218
|
+
<SideNav id="side-nav">
|
|
219
|
+
<UDExSideNavigationItem text="L1" expanded>
|
|
220
|
+
<UDExSideNavigationSubItem text="L2"></UDExSideNavigationSubItem>
|
|
221
|
+
</UDExSideNavigationItem>
|
|
222
|
+
</SideNav>,
|
|
223
|
+
);
|
|
224
|
+
cy.get("[udex-side-navigation-item]").first().shadow().find(".ui5-sn-item").first().realClick();
|
|
225
|
+
cy.get("[udex-side-navigation-item]").first().should("not.have.attr", "expanded");
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
it("level-1 group expands when the arrow icon is clicked", () => {
|
|
229
|
+
cy.mount(
|
|
230
|
+
<SideNav id="side-nav">
|
|
231
|
+
<UDExSideNavigationItem text="L1">
|
|
232
|
+
<UDExSideNavigationSubItem text="L2"></UDExSideNavigationSubItem>
|
|
233
|
+
</UDExSideNavigationItem>
|
|
234
|
+
</SideNav>,
|
|
235
|
+
);
|
|
236
|
+
cy.get("[udex-side-navigation-item]").first().shadow().find(".ui5-sn-item-toggle-icon").realClick();
|
|
237
|
+
cy.get("[udex-side-navigation-item]").first().should("have.attr", "expanded");
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
it("level-2 group expands on title click and does not propagate to a host listener", () => {
|
|
241
|
+
cy.mount(
|
|
242
|
+
<SideNav id="side-nav">
|
|
243
|
+
<UDExSideNavigationItem text="L1" expanded>
|
|
244
|
+
<UDExSideNavigationSubItem text="L2">
|
|
245
|
+
<UDExSideNavigationSubItem text="L3"></UDExSideNavigationSubItem>
|
|
246
|
+
</UDExSideNavigationSubItem>
|
|
247
|
+
</UDExSideNavigationItem>
|
|
248
|
+
</SideNav>,
|
|
249
|
+
);
|
|
250
|
+
const onHostClick = cy.stub().as("hostClick");
|
|
251
|
+
cy.get("[udex-side-navigation]").then(($el) => {
|
|
252
|
+
$el[0].addEventListener("click", onHostClick);
|
|
253
|
+
});
|
|
254
|
+
cy.get("[udex-side-navigation-sub-item]").first().should("not.have.attr", "expanded");
|
|
255
|
+
cy.get("[udex-side-navigation-sub-item]").first().shadow().find(".ui5-sn-item").first().realClick();
|
|
256
|
+
cy.get("[udex-side-navigation-sub-item]").first().should("have.attr", "expanded");
|
|
257
|
+
cy.get("@hostClick").should("not.have.been.called");
|
|
258
|
+
});
|
|
259
|
+
|
|
260
|
+
it("level-2 group collapses on a second title click", () => {
|
|
261
|
+
cy.mount(
|
|
262
|
+
<SideNav id="side-nav">
|
|
263
|
+
<UDExSideNavigationItem text="L1" expanded>
|
|
264
|
+
{/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}
|
|
265
|
+
<UDExSideNavigationSubItem text="L2" {...({ expanded: true } as any)}>
|
|
266
|
+
<UDExSideNavigationSubItem text="L3"></UDExSideNavigationSubItem>
|
|
267
|
+
</UDExSideNavigationSubItem>
|
|
268
|
+
</UDExSideNavigationItem>
|
|
269
|
+
</SideNav>,
|
|
270
|
+
);
|
|
271
|
+
cy.get("[udex-side-navigation-sub-item]").first().shadow().find(".ui5-sn-item").first().realClick();
|
|
272
|
+
cy.get("[udex-side-navigation-sub-item]").first().should("not.have.attr", "expanded");
|
|
273
|
+
});
|
|
274
|
+
|
|
275
|
+
it("level-2 group expands when the arrow icon is clicked", () => {
|
|
276
|
+
cy.mount(
|
|
277
|
+
<SideNav id="side-nav">
|
|
278
|
+
<UDExSideNavigationItem text="L1" expanded>
|
|
279
|
+
<UDExSideNavigationSubItem text="L2">
|
|
280
|
+
<UDExSideNavigationSubItem text="L3"></UDExSideNavigationSubItem>
|
|
281
|
+
</UDExSideNavigationSubItem>
|
|
282
|
+
</UDExSideNavigationItem>
|
|
283
|
+
</SideNav>,
|
|
284
|
+
);
|
|
285
|
+
cy.get("[udex-side-navigation-sub-item]").first().shadow().find(".ui5-sn-item-toggle-icon").realClick();
|
|
286
|
+
cy.get("[udex-side-navigation-sub-item]").first().should("have.attr", "expanded");
|
|
287
|
+
});
|
|
288
|
+
});
|
|
289
|
+
|
|
290
|
+
describe("SideNavigation - third-level keyboard navigation", () => {
|
|
291
|
+
const mountExpandedThreeLevels = () => {
|
|
292
|
+
cy.mount(
|
|
293
|
+
<SideNav id="side-nav">
|
|
294
|
+
<UDExSideNavigationItem text="Item 1" expanded>
|
|
295
|
+
{/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}
|
|
296
|
+
<UDExSideNavigationSubItem text="Sub Item 1" {...{ expanded: true } as any}>
|
|
297
|
+
<UDExSideNavigationSubItem text="Sub Item 1.1"></UDExSideNavigationSubItem>
|
|
298
|
+
<UDExSideNavigationSubItem text="Sub Item 1.2"></UDExSideNavigationSubItem>
|
|
299
|
+
</UDExSideNavigationSubItem>
|
|
300
|
+
</UDExSideNavigationItem>
|
|
301
|
+
</SideNav>,
|
|
302
|
+
);
|
|
303
|
+
};
|
|
304
|
+
|
|
305
|
+
it("includes expanded level-3 items in the parent level-2 focusableItems", () => {
|
|
306
|
+
mountExpandedThreeLevels();
|
|
307
|
+
cy.get("[udex-side-navigation-sub-item]").first().then(($el) => {
|
|
308
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
309
|
+
const focusable = ($el[0] as any).focusableItems as HTMLElement[];
|
|
310
|
+
// the level-2 group itself plus its two level-3 children
|
|
311
|
+
expect(focusable).to.have.length(3);
|
|
312
|
+
expect(focusable[1].getAttribute("text")).to.equal("Sub Item 1.1");
|
|
313
|
+
expect(focusable[2].getAttribute("text")).to.equal("Sub Item 1.2");
|
|
314
|
+
});
|
|
315
|
+
});
|
|
316
|
+
|
|
317
|
+
it("excludes collapsed level-3 items from the parent level-2 focusableItems", () => {
|
|
318
|
+
cy.mount(
|
|
319
|
+
<SideNav id="side-nav">
|
|
320
|
+
<UDExSideNavigationItem text="Item 1" expanded>
|
|
321
|
+
<UDExSideNavigationSubItem text="Sub Item 1">
|
|
322
|
+
<UDExSideNavigationSubItem text="Sub Item 1.1"></UDExSideNavigationSubItem>
|
|
323
|
+
</UDExSideNavigationSubItem>
|
|
324
|
+
</UDExSideNavigationItem>
|
|
325
|
+
</SideNav>,
|
|
326
|
+
);
|
|
327
|
+
cy.get("[udex-side-navigation-sub-item]").first().then(($el) => {
|
|
328
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
329
|
+
const focusable = ($el[0] as any).focusableItems as HTMLElement[];
|
|
330
|
+
// only the group itself when collapsed
|
|
331
|
+
expect(focusable).to.have.length(1);
|
|
332
|
+
});
|
|
333
|
+
});
|
|
334
|
+
|
|
335
|
+
it("reaches a level-3 item by walking down with the ArrowDown key", () => {
|
|
336
|
+
mountExpandedThreeLevels();
|
|
337
|
+
cy.get("[udex-side-navigation-item]").first().shadow().find(".ui5-sn-item").first()
|
|
338
|
+
.then(($el) => { ($el[0] as HTMLElement).focus(); });
|
|
339
|
+
// Item 1 -> Sub Item 1 -> Sub Item 1.1
|
|
340
|
+
cy.realPress("ArrowDown");
|
|
341
|
+
cy.realPress("ArrowDown");
|
|
342
|
+
cy.focused().should(($el) => {
|
|
343
|
+
const host = ($el[0].getRootNode() as ShadowRoot).host as HTMLElement;
|
|
344
|
+
expect(host.getAttribute("text")).to.equal("Sub Item 1.1");
|
|
345
|
+
});
|
|
346
|
+
});
|
|
347
|
+
});
|
|
348
|
+
|
|
349
|
+
describe("SideNavigation - third-level expand/collapse via keyboard", () => {
|
|
350
|
+
const mountGroup = (expanded = false) => {
|
|
351
|
+
cy.mount(
|
|
352
|
+
<SideNav id="side-nav">
|
|
353
|
+
<UDExSideNavigationItem text="Item 1" expanded>
|
|
354
|
+
{/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}
|
|
355
|
+
<UDExSideNavigationSubItem text="Sub Item 1" {...(expanded ? { expanded: true } as any : {})}>
|
|
356
|
+
<UDExSideNavigationSubItem text="Sub Item 1.1"></UDExSideNavigationSubItem>
|
|
357
|
+
</UDExSideNavigationSubItem>
|
|
358
|
+
</UDExSideNavigationItem>
|
|
359
|
+
</SideNav>,
|
|
360
|
+
);
|
|
361
|
+
cy.get("[udex-side-navigation-sub-item]").first().shadow().find(".ui5-sn-item").first()
|
|
362
|
+
.then(($el) => { ($el[0] as HTMLElement).focus(); });
|
|
363
|
+
};
|
|
364
|
+
|
|
365
|
+
it("expands a collapsed group sub-item with ArrowRight", () => {
|
|
366
|
+
mountGroup(false);
|
|
367
|
+
cy.realPress("ArrowRight");
|
|
368
|
+
cy.get("[udex-side-navigation-sub-item]").first().should("have.attr", "expanded");
|
|
369
|
+
});
|
|
370
|
+
|
|
371
|
+
it("collapses an expanded group sub-item with ArrowLeft", () => {
|
|
372
|
+
mountGroup(true);
|
|
373
|
+
cy.realPress("ArrowLeft");
|
|
374
|
+
cy.get("[udex-side-navigation-sub-item]").first().should("not.have.attr", "expanded");
|
|
375
|
+
});
|
|
376
|
+
|
|
377
|
+
it("expands a collapsed group sub-item with the Plus key", () => {
|
|
378
|
+
mountGroup(false);
|
|
379
|
+
cy.realPress("+");
|
|
380
|
+
cy.get("[udex-side-navigation-sub-item]").first().should("have.attr", "expanded");
|
|
381
|
+
});
|
|
382
|
+
|
|
383
|
+
it("collapses an expanded group sub-item with the Minus key", () => {
|
|
384
|
+
mountGroup(true);
|
|
385
|
+
cy.realPress("-");
|
|
386
|
+
cy.get("[udex-side-navigation-sub-item]").first().should("not.have.attr", "expanded");
|
|
387
|
+
});
|
|
388
|
+
|
|
389
|
+
it("keeps expand/collapse working after a level-3 child is selected", () => {
|
|
390
|
+
cy.mount(
|
|
391
|
+
<SideNav id="side-nav">
|
|
392
|
+
<UDExSideNavigationItem text="Item 1" expanded>
|
|
393
|
+
{/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}
|
|
394
|
+
<UDExSideNavigationSubItem text="Sub Item 1" {...{ expanded: true } as any}>
|
|
395
|
+
{/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}
|
|
396
|
+
<UDExSideNavigationSubItem text="Sub Item 1.1" {...{ selected: true } as any}></UDExSideNavigationSubItem>
|
|
397
|
+
</UDExSideNavigationSubItem>
|
|
398
|
+
</UDExSideNavigationItem>
|
|
399
|
+
</SideNav>,
|
|
400
|
+
);
|
|
401
|
+
cy.get("[udex-side-navigation-sub-item]").first().shadow().find(".ui5-sn-item").first()
|
|
402
|
+
.then(($el) => { ($el[0] as HTMLElement).focus(); });
|
|
403
|
+
cy.realPress("ArrowLeft");
|
|
404
|
+
cy.get("[udex-side-navigation-sub-item]").first().should("not.have.attr", "expanded");
|
|
405
|
+
cy.realPress("ArrowRight");
|
|
406
|
+
cy.get("[udex-side-navigation-sub-item]").first().should("have.attr", "expanded");
|
|
407
|
+
});
|
|
408
|
+
});
|
|
409
|
+
|
|
410
|
+
describe("SideNavigation - third-level keyboard selection", () => {
|
|
411
|
+
const mountLeaf = () => {
|
|
412
|
+
cy.mount(
|
|
413
|
+
<SideNav id="side-nav">
|
|
414
|
+
<UDExSideNavigationItem text="Item 1" expanded>
|
|
415
|
+
{/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}
|
|
416
|
+
<UDExSideNavigationSubItem text="Sub Item 1" {...{ expanded: true } as any}>
|
|
417
|
+
<UDExSideNavigationSubItem text="Sub Item 1.1"></UDExSideNavigationSubItem>
|
|
418
|
+
</UDExSideNavigationSubItem>
|
|
419
|
+
</UDExSideNavigationItem>
|
|
420
|
+
</SideNav>,
|
|
421
|
+
);
|
|
422
|
+
};
|
|
423
|
+
|
|
424
|
+
// Updated: nested-item-click removed (#2822) — Enter on a focused level-3 leaf now
|
|
425
|
+
// fires the standard bubbling selection-change on the host.
|
|
426
|
+
it("fires selection-change when Enter is pressed on a focused level-3 item", () => {
|
|
427
|
+
mountLeaf();
|
|
428
|
+
const onSelectionChange = cy.stub().as("selectionChange");
|
|
429
|
+
cy.get("[udex-side-navigation]").then(($el) => {
|
|
430
|
+
$el[0].addEventListener("selection-change", onSelectionChange);
|
|
431
|
+
});
|
|
432
|
+
cy.get("[udex-side-navigation-sub-item][nested]").first().shadow().find(".ui5-sn-item").first()
|
|
433
|
+
.then(($el) => { ($el[0] as HTMLElement).focus(); });
|
|
434
|
+
cy.realPress("Enter");
|
|
435
|
+
cy.get("@selectionChange").should("have.been.calledOnce");
|
|
436
|
+
cy.get("[udex-side-navigation-sub-item][nested]").first().then(($leaf) => {
|
|
437
|
+
cy.get("@selectionChange").should((stub) => {
|
|
438
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
439
|
+
const detail = (stub as any).firstCall.args[0].detail;
|
|
440
|
+
expect(detail.item).to.equal($leaf[0]);
|
|
441
|
+
});
|
|
442
|
+
});
|
|
443
|
+
});
|
|
444
|
+
|
|
445
|
+
// Updated: nested-item-click removed (#2822) — Space on a focused level-3 leaf now
|
|
446
|
+
// fires the standard bubbling selection-change on the host.
|
|
447
|
+
it("fires selection-change when Space is pressed on a focused level-3 item", () => {
|
|
448
|
+
mountLeaf();
|
|
449
|
+
const onSelectionChange = cy.stub().as("selectionChange");
|
|
450
|
+
cy.get("[udex-side-navigation]").then(($el) => {
|
|
451
|
+
$el[0].addEventListener("selection-change", onSelectionChange);
|
|
452
|
+
});
|
|
453
|
+
cy.get("[udex-side-navigation-sub-item][nested]").first().shadow().find(".ui5-sn-item").first()
|
|
454
|
+
.then(($el) => { ($el[0] as HTMLElement).focus(); });
|
|
455
|
+
cy.realPress("Space");
|
|
456
|
+
cy.get("@selectionChange").should("have.been.calledOnce");
|
|
457
|
+
cy.get("[udex-side-navigation-sub-item][nested]").first().then(($leaf) => {
|
|
458
|
+
cy.get("@selectionChange").should((stub) => {
|
|
459
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
460
|
+
const detail = (stub as any).firstCall.args[0].detail;
|
|
461
|
+
expect(detail.item).to.equal($leaf[0]);
|
|
462
|
+
});
|
|
463
|
+
});
|
|
464
|
+
});
|
|
465
|
+
});
|
|
466
|
+
|
|
467
|
+
describe("SideNavigation - group collapse not blocked by selected child", () => {
|
|
468
|
+
it("collapses a level-1 group via ArrowLeft even when a direct child is selected", () => {
|
|
469
|
+
cy.mount(
|
|
470
|
+
<SideNav id="side-nav">
|
|
471
|
+
{/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}
|
|
472
|
+
<UDExSideNavigationItem text="L1" {...({ expanded: true } as any)}>
|
|
473
|
+
{/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}
|
|
474
|
+
<UDExSideNavigationSubItem text="L2" {...({ selected: true } as any)}></UDExSideNavigationSubItem>
|
|
475
|
+
</UDExSideNavigationItem>
|
|
476
|
+
</SideNav>,
|
|
477
|
+
);
|
|
478
|
+
cy.get("[udex-side-navigation-item]").first().shadow().find(".ui5-sn-item").first()
|
|
479
|
+
.then(($el) => { ($el[0] as HTMLElement).focus(); });
|
|
480
|
+
cy.realPress("ArrowLeft");
|
|
481
|
+
cy.get("[udex-side-navigation-item]").first().should("not.have.attr", "expanded");
|
|
482
|
+
});
|
|
483
|
+
|
|
484
|
+
it("collapses a level-1 group via click even when a direct child is selected", () => {
|
|
485
|
+
cy.mount(
|
|
486
|
+
<SideNav id="side-nav">
|
|
487
|
+
{/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}
|
|
488
|
+
<UDExSideNavigationItem text="L1" {...({ expanded: true } as any)}>
|
|
489
|
+
{/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}
|
|
490
|
+
<UDExSideNavigationSubItem text="L2" {...({ selected: true } as any)}></UDExSideNavigationSubItem>
|
|
491
|
+
</UDExSideNavigationItem>
|
|
492
|
+
</SideNav>,
|
|
493
|
+
);
|
|
494
|
+
cy.get("[udex-side-navigation-item]").first().shadow().find(".ui5-sn-item").first().realClick();
|
|
495
|
+
cy.get("[udex-side-navigation-item]").first().should("not.have.attr", "expanded");
|
|
496
|
+
});
|
|
497
|
+
|
|
498
|
+
it("opens a level-1 group on initial render when a child starts selected", () => {
|
|
499
|
+
cy.mount(
|
|
500
|
+
<SideNav id="side-nav">
|
|
501
|
+
<UDExSideNavigationItem text="L1">
|
|
502
|
+
{/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}
|
|
503
|
+
<UDExSideNavigationSubItem text="L2" {...({ selected: true } as any)}></UDExSideNavigationSubItem>
|
|
504
|
+
</UDExSideNavigationItem>
|
|
505
|
+
</SideNav>,
|
|
506
|
+
);
|
|
507
|
+
cy.get("[udex-side-navigation-item]").first().should("have.attr", "expanded");
|
|
508
|
+
});
|
|
509
|
+
});
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { UDExTable, UDExTableHeaderRow, UDExTableHeaderCell, UDExTableRow, UDExTableGroupRow, UDExTableCell, UDExButton, UDExLink, UDExRatingIndicator } from "../support/component-imports.js";
|
|
2
|
+
import { UDExTableCellVerticalAlign } from "../../src/types/Table.js";
|
|
2
3
|
|
|
3
4
|
const defaultTable = <UDExTable
|
|
4
5
|
id="table"
|
|
@@ -527,3 +528,92 @@ describe("TableGroupRow ARIA Structure", () => {
|
|
|
527
528
|
});
|
|
528
529
|
});
|
|
529
530
|
});
|
|
531
|
+
|
|
532
|
+
const cellVerticalAlignTable = <UDExTable id="cell-va-table">
|
|
533
|
+
<UDExTableHeaderRow slot="headerRow">
|
|
534
|
+
<UDExTableHeaderCell>Product</UDExTableHeaderCell>
|
|
535
|
+
<UDExTableHeaderCell>Price</UDExTableHeaderCell>
|
|
536
|
+
<UDExTableHeaderCell>Stock</UDExTableHeaderCell>
|
|
537
|
+
<UDExTableHeaderCell>Qty</UDExTableHeaderCell>
|
|
538
|
+
</UDExTableHeaderRow>
|
|
539
|
+
<UDExTableRow>
|
|
540
|
+
<UDExTableCell id="cva-cell-top" vertical-align="Top">Item</UDExTableCell>
|
|
541
|
+
<UDExTableCell id="cva-cell-bottom" vertical-align="Bottom">$100</UDExTableCell>
|
|
542
|
+
<UDExTableCell id="cva-cell-center" vertical-align="Center">5</UDExTableCell>
|
|
543
|
+
<UDExTableCell id="cva-cell-default">10</UDExTableCell>
|
|
544
|
+
</UDExTableRow>
|
|
545
|
+
</UDExTable>;
|
|
546
|
+
|
|
547
|
+
const rowVerticalAlignTable = <UDExTable id="row-va-table">
|
|
548
|
+
<UDExTableHeaderRow slot="headerRow">
|
|
549
|
+
<UDExTableHeaderCell id="rva-header">Product</UDExTableHeaderCell>
|
|
550
|
+
<UDExTableHeaderCell>Price</UDExTableHeaderCell>
|
|
551
|
+
</UDExTableHeaderRow>
|
|
552
|
+
<UDExTableRow id="rva-row-aligned" vertical-align="Top">
|
|
553
|
+
<UDExTableCell id="rva-cell-inherit">Item 1</UDExTableCell>
|
|
554
|
+
<UDExTableCell id="rva-cell-override" vertical-align="Bottom">$100</UDExTableCell>
|
|
555
|
+
<UDExTableCell id="rva-cell-explicit-center" vertical-align="Center">5</UDExTableCell>
|
|
556
|
+
</UDExTableRow>
|
|
557
|
+
<UDExTableRow id="rva-row-plain">
|
|
558
|
+
<UDExTableCell id="rva-cell-plain">Item 2</UDExTableCell>
|
|
559
|
+
<UDExTableCell>$200</UDExTableCell>
|
|
560
|
+
</UDExTableRow>
|
|
561
|
+
</UDExTable>;
|
|
562
|
+
|
|
563
|
+
describe("TableCell and TableRow verticalAlign", () => {
|
|
564
|
+
describe("cell-level (UDExTableCell)", () => {
|
|
565
|
+
beforeEach(() => {
|
|
566
|
+
cy.mount(cellVerticalAlignTable);
|
|
567
|
+
});
|
|
568
|
+
|
|
569
|
+
it("cell with vertical-align='Top' gets align-items: flex-start", () => {
|
|
570
|
+
cy.get("#cva-cell-top").should("have.css", "align-items", "flex-start");
|
|
571
|
+
});
|
|
572
|
+
|
|
573
|
+
it("cell with vertical-align='Bottom' gets align-items: flex-end", () => {
|
|
574
|
+
cy.get("#cva-cell-bottom").should("have.css", "align-items", "flex-end");
|
|
575
|
+
});
|
|
576
|
+
|
|
577
|
+
it("cell with vertical-align='Center' gets align-items: center", () => {
|
|
578
|
+
cy.get("#cva-cell-center").should("have.css", "align-items", "center");
|
|
579
|
+
});
|
|
580
|
+
|
|
581
|
+
it("cell without vertical-align defaults to align-items: center", () => {
|
|
582
|
+
cy.get("#cva-cell-default").should("have.css", "align-items", "center");
|
|
583
|
+
});
|
|
584
|
+
|
|
585
|
+
it("cell verticalAlign property defaults to 'Center'", () => {
|
|
586
|
+
cy.get("#cva-cell-default").then($cell => {
|
|
587
|
+
expect(($cell[0] as UDExTableCell).verticalAlign).to.equal(UDExTableCellVerticalAlign.Center);
|
|
588
|
+
});
|
|
589
|
+
});
|
|
590
|
+
});
|
|
591
|
+
|
|
592
|
+
describe("row-level (UDExTableRow)", () => {
|
|
593
|
+
beforeEach(() => {
|
|
594
|
+
cy.mount(rowVerticalAlignTable);
|
|
595
|
+
});
|
|
596
|
+
|
|
597
|
+
it("row vertical-align propagates to a cell without its own vertical-align", () => {
|
|
598
|
+
cy.get("#rva-cell-inherit").should("have.css", "align-items", "flex-start");
|
|
599
|
+
});
|
|
600
|
+
|
|
601
|
+
it("a cell's own vertical-align overrides the row's vertical-align", () => {
|
|
602
|
+
cy.get("#rva-cell-override").should("have.css", "align-items", "flex-end");
|
|
603
|
+
});
|
|
604
|
+
|
|
605
|
+
it("a cell in a row without vertical-align defaults to align-items: center", () => {
|
|
606
|
+
cy.get("#rva-cell-plain").should("have.css", "align-items", "center");
|
|
607
|
+
});
|
|
608
|
+
|
|
609
|
+
it("row verticalAlign property defaults to 'Center'", () => {
|
|
610
|
+
cy.get("#rva-row-plain").then($row => {
|
|
611
|
+
expect(($row[0] as UDExTableRow).verticalAlign).to.equal(UDExTableCellVerticalAlign.Center);
|
|
612
|
+
});
|
|
613
|
+
});
|
|
614
|
+
|
|
615
|
+
it("a cell left at the default 'Center' takes the aligned row's value", () => {
|
|
616
|
+
cy.get("#rva-cell-explicit-center").should("have.css", "align-items", "flex-start");
|
|
617
|
+
});
|
|
618
|
+
});
|
|
619
|
+
});
|
|
@@ -59,6 +59,9 @@ import UDExReview from "../../instrumented/Review.js";
|
|
|
59
59
|
import UDExReviewItem from "../../instrumented/ReviewItem.js";
|
|
60
60
|
import UDExSecondaryNavigation from "../../instrumented/SecondaryNavigation.js";
|
|
61
61
|
import UDExSelectBox from "../../instrumented/SelectBox.js";
|
|
62
|
+
import UDExSideNavigation from "../../instrumented/SideNavigation.js";
|
|
63
|
+
import UDExSideNavigationItem from "../../instrumented/SideNavigationItem.js";
|
|
64
|
+
import UDExSideNavigationSubItem from "../../instrumented/SideNavigationSubItem.js";
|
|
62
65
|
import UDExSelectBoxGroupHeader from "../../instrumented/SelectBoxGroupHeader.js";
|
|
63
66
|
import UDExSelectBoxItem from "../../instrumented/SelectBoxItem.js";
|
|
64
67
|
import UDExSelectBoxSelectAll from "../../instrumented/SelectBoxSelectAll.js";
|
|
@@ -151,6 +154,9 @@ export {
|
|
|
151
154
|
UDExReviewItem,
|
|
152
155
|
UDExSecondaryNavigation,
|
|
153
156
|
UDExSelectBox,
|
|
157
|
+
UDExSideNavigation,
|
|
158
|
+
UDExSideNavigationItem,
|
|
159
|
+
UDExSideNavigationSubItem,
|
|
154
160
|
UDExSelectBoxGroupHeader,
|
|
155
161
|
UDExSelectBoxItem,
|
|
156
162
|
UDExSelectBoxSelectAll,
|
|
@@ -59,6 +59,9 @@ import UDExReview from "../../src/Review.js";
|
|
|
59
59
|
import UDExReviewItem from "../../src/ReviewItem.js";
|
|
60
60
|
import UDExSecondaryNavigation from "../../src/SecondaryNavigation.js";
|
|
61
61
|
import UDExSelectBox from "../../src/SelectBox.js";
|
|
62
|
+
import UDExSideNavigation from "../../src/SideNavigation.js";
|
|
63
|
+
import UDExSideNavigationItem from "../../src/SideNavigationItem.js";
|
|
64
|
+
import UDExSideNavigationSubItem from "../../src/SideNavigationSubItem.js";
|
|
62
65
|
import UDExSelectBoxGroupHeader from "../../src/SelectBoxGroupHeader.js";
|
|
63
66
|
import UDExSelectBoxItem from "../../src/SelectBoxItem.js";
|
|
64
67
|
import UDExSelectBoxSelectAll from "../../src/SelectBoxSelectAll.js";
|
|
@@ -151,6 +154,9 @@ export {
|
|
|
151
154
|
UDExReviewItem,
|
|
152
155
|
UDExSecondaryNavigation,
|
|
153
156
|
UDExSelectBox,
|
|
157
|
+
UDExSideNavigation,
|
|
158
|
+
UDExSideNavigationItem,
|
|
159
|
+
UDExSideNavigationSubItem,
|
|
154
160
|
UDExSelectBoxGroupHeader,
|
|
155
161
|
UDExSelectBoxItem,
|
|
156
162
|
UDExSelectBoxSelectAll,
|
package/dist/Carousel.d.ts
CHANGED
|
@@ -146,6 +146,7 @@ declare class UDExCarousel extends UI5Element {
|
|
|
146
146
|
_autoplayMinTimeBetweenToggle: number;
|
|
147
147
|
_autoplayManualStop: boolean;
|
|
148
148
|
_resizeHandler: ResizeObserverCallback;
|
|
149
|
+
_resizeRafHandle: number | null;
|
|
149
150
|
constructor();
|
|
150
151
|
onAfterRendering(): void;
|
|
151
152
|
onExitDOM(): void;
|