Skip to content

Commit 8aa0f35

Browse files
authored
feat: add noAutoExpand property to control items expanding (#10317)
1 parent 3229e73 commit 8aa0f35

File tree

6 files changed

+71
-27
lines changed

6 files changed

+71
-27
lines changed

packages/side-nav/src/vaadin-side-nav-item.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,11 @@ class SideNavItem extends SideNavChildrenMixin(
341341

342342
/** @private */
343343
__expandParentItems() {
344+
const sideNav = this.closest('vaadin-side-nav');
345+
if (sideNav && sideNav.noAutoExpand) {
346+
return;
347+
}
348+
344349
const parentItem = this.__getParentItem();
345350
if (parentItem) {
346351
parentItem.__expandParentItems();

packages/side-nav/src/vaadin-side-nav.d.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,15 @@ declare class SideNav extends SideNavChildrenMixin(FocusMixin(ElementMixin(Thema
127127
*/
128128
location: any;
129129

130+
/**
131+
* Whether to expand parent items of the nested matching item after initial
132+
* rendering or navigation. By default, all the parent items are expanded.
133+
* Set to true to disable this behavior.
134+
*
135+
* @attr {boolean} no-auto-expand
136+
*/
137+
noAutoExpand: boolean;
138+
130139
addEventListener<K extends keyof SideNavEventMap>(
131140
type: K,
132141
listener: (this: SideNav, ev: SideNavEventMap[K]) => void,

packages/side-nav/src/vaadin-side-nav.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,19 @@ class SideNav extends SideNavChildrenMixin(
150150
location: {
151151
observer: '__locationChanged',
152152
},
153+
154+
/**
155+
* Whether to expand parent items of the nested matching item after initial
156+
* rendering or navigation. By default, all the parent items are expanded.
157+
* Set to true to disable this behavior.
158+
*
159+
* @attr {boolean} no-auto-expand
160+
*/
161+
noAutoExpand: {
162+
type: Boolean,
163+
reflectToAttribute: true,
164+
value: false,
165+
},
153166
};
154167
}
155168

packages/side-nav/test/side-nav-item.test.js

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -196,21 +196,6 @@ describe('side-nav-item', () => {
196196
await item.updateComplete;
197197
expect(spy.calledOnce).to.be.true;
198198
});
199-
200-
it('should expand parent items when path matches', async () => {
201-
item = fixtureSync(`
202-
<vaadin-side-nav-item>
203-
<vaadin-side-nav-item slot="children">
204-
<vaadin-side-nav-item slot="children"></vaadin-side-nav-item>
205-
</vaadin-side-nav-item>
206-
</vaadin-side-nav-item>
207-
`);
208-
await nextRender();
209-
item._items[0]._items[0].path = '';
210-
await item.updateComplete;
211-
expect(item.expanded).to.be.true;
212-
expect(item._items[0].expanded).to.be.true;
213-
});
214199
});
215200

216201
describe('current item with children', () => {

packages/side-nav/test/side-nav.test.js

Lines changed: 43 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,11 @@ import '../src/vaadin-side-nav.js';
66
describe('side-nav', () => {
77
let sideNav;
88

9-
beforeEach(async () => {
10-
sideNav = fixtureSync(`
11-
<vaadin-side-nav collapsible>
12-
<span slot="label">Main menu</span>
13-
<vaadin-side-nav-item>Item 1</vaadin-side-nav-item>
14-
<vaadin-side-nav-item>Item 2</vaadin-side-nav-item>
15-
</vaadin-side-nav>
16-
`);
17-
await nextRender();
18-
});
19-
209
describe('custom element definition', () => {
2110
let tagName;
2211

2312
beforeEach(() => {
13+
sideNav = fixtureSync('<vaadin-side-nav></vaadin-side-nav>');
2414
tagName = sideNav.tagName.toLowerCase();
2515
});
2616

@@ -36,7 +26,15 @@ describe('side-nav', () => {
3626
describe('collapsing', () => {
3727
let label;
3828

39-
beforeEach(() => {
29+
beforeEach(async () => {
30+
sideNav = fixtureSync(`
31+
<vaadin-side-nav collapsible>
32+
<span slot="label">Main menu</span>
33+
<vaadin-side-nav-item>Item 1</vaadin-side-nav-item>
34+
<vaadin-side-nav-item>Item 2</vaadin-side-nav-item>
35+
</vaadin-side-nav>
36+
`);
37+
await nextRender();
4038
label = sideNav.shadowRoot.querySelector('[part="label"]');
4139
});
4240

@@ -72,4 +70,37 @@ describe('side-nav', () => {
7270
expect(spy.calledOnce).to.be.true;
7371
});
7472
});
73+
74+
describe('expanding items', () => {
75+
let items;
76+
77+
beforeEach(async () => {
78+
sideNav = fixtureSync(`
79+
<vaadin-side-nav collapsible>
80+
<vaadin-side-nav-item>
81+
<vaadin-side-nav-item slot="children">
82+
<vaadin-side-nav-item slot="children"></vaadin-side-nav-item>
83+
</vaadin-side-nav-item>
84+
</vaadin-side-nav-item>
85+
</vaadin-side-nav>
86+
`);
87+
items = sideNav.querySelectorAll('vaadin-side-nav-item');
88+
await nextRender();
89+
});
90+
91+
it('should expand parent items when path matches by default', async () => {
92+
items[2].path = '';
93+
await items[2].updateComplete;
94+
expect(items[0].expanded).to.be.true;
95+
expect(items[1].expanded).to.be.true;
96+
});
97+
98+
it('should not expand parent items when path matches if noAutoExpand is set to true', async () => {
99+
sideNav.noAutoExpand = true;
100+
items[2].path = '';
101+
await items[2].updateComplete;
102+
expect(items[0].expanded).to.be.false;
103+
expect(items[1].expanded).to.be.false;
104+
});
105+
});
75106
});

packages/side-nav/test/typings/side-nav.types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ sideNav.onNavigate = (event) => {
4343
};
4444

4545
assertType<any>(sideNav.location);
46+
assertType<boolean>(sideNav.noAutoExpand);
4647

4748
const sideNavItem: SideNavItem = document.createElement('vaadin-side-nav-item');
4849

0 commit comments

Comments
 (0)