Skip to content

Commit 7802a39

Browse files
authored
fix(module:cascader): display activated column correctly when reopen the popup panel (#9456)
1 parent d27ff36 commit 7802a39

File tree

2 files changed

+61
-10
lines changed

2 files changed

+61
-10
lines changed

components/cascader/cascader.component.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -677,7 +677,7 @@ export class NzCascaderComponent
677677
}
678678
if (visible) {
679679
this.cascaderService.$redraw.next();
680-
this.updateSelectedNodes(!!this.nzLoadData);
680+
this.updateSelectedNodes(true);
681681
this.scrollToActivatedOptions();
682682
} else {
683683
this.inputValue = '';

components/cascader/cascader.spec.ts

Lines changed: 60 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1455,8 +1455,8 @@ describe('cascader', () => {
14551455
cascader.nativeElement.click();
14561456
fixture.detectChanges();
14571457
expect(spy).toHaveBeenCalled();
1458-
testComponent.cascader.inputValue = 'o';
14591458
testComponent.cascader.setMenuVisible(true);
1459+
testComponent.cascader.inputValue = 'o';
14601460
fixture.detectChanges();
14611461
const itemEl1 = getItemAtColumnAndRow(1, 1)!;
14621462
expect(testComponent.cascader.inSearchingMode).toBe(true);
@@ -1524,8 +1524,8 @@ describe('cascader', () => {
15241524
fixture.detectChanges();
15251525
cascader.nativeElement.click();
15261526
fixture.detectChanges();
1527-
testComponent.cascader.inputValue = 'o';
15281527
testComponent.cascader.setMenuVisible(true);
1528+
testComponent.cascader.inputValue = 'o';
15291529
fixture.detectChanges();
15301530
const itemEl1 = getItemAtColumnAndRow(1, 1)!;
15311531
expect(testComponent.cascader.inSearchingMode).toBe(true);
@@ -1547,8 +1547,8 @@ describe('cascader', () => {
15471547
fixture.detectChanges();
15481548
cascader.nativeElement.click();
15491549
fixture.detectChanges();
1550-
testComponent.cascader.inputValue = 'o';
15511550
testComponent.cascader.setMenuVisible(true);
1551+
testComponent.cascader.inputValue = 'o';
15521552
fixture.detectChanges();
15531553
const itemEl1 = getItemAtColumnAndRow(1, 1)!;
15541554
expect(testComponent.cascader.inSearchingMode).toBe(true);
@@ -1571,8 +1571,8 @@ describe('cascader', () => {
15711571
}
15721572
} as NzShowSearchOptions;
15731573
fixture.detectChanges();
1574-
testComponent.cascader.inputValue = 'o';
15751574
testComponent.cascader.setMenuVisible(true);
1575+
testComponent.cascader.inputValue = 'o';
15761576
fixture.detectChanges();
15771577
const itemEl1 = getItemAtColumnAndRow(1, 1)!;
15781578
expect(testComponent.cascader.inSearchingMode).toBe(true);
@@ -1597,8 +1597,8 @@ describe('cascader', () => {
15971597
}
15981598
} as NzShowSearchOptions;
15991599
fixture.detectChanges();
1600-
testComponent.cascader.inputValue = 'o';
16011600
testComponent.cascader.setMenuVisible(true);
1601+
testComponent.cascader.inputValue = 'o';
16021602
fixture.detectChanges();
16031603
const itemEl1 = getItemAtColumnAndRow(1, 1)!;
16041604
expect(testComponent.cascader.inSearchingMode).toBe(true);
@@ -1617,8 +1617,8 @@ describe('cascader', () => {
16171617
it('should forbid disabled search options to be clicked', fakeAsync(() => {
16181618
testComponent.nzOptions = options4;
16191619
fixture.detectChanges();
1620-
testComponent.cascader.inputValue = 'o';
16211620
testComponent.cascader.setMenuVisible(true);
1621+
testComponent.cascader.inputValue = 'o';
16221622
fixture.detectChanges();
16231623
const itemEl1 = getItemAtColumnAndRow(1, 1)!;
16241624
expect(itemEl1.innerText).toBe('Zhejiang / Hangzhou / West Lake');
@@ -1636,8 +1636,8 @@ describe('cascader', () => {
16361636
it('should pass disabled property to children when searching', () => {
16371637
testComponent.nzOptions = options4;
16381638
fixture.detectChanges();
1639-
testComponent.cascader.inputValue = 'o';
16401639
testComponent.cascader.setMenuVisible(true);
1640+
testComponent.cascader.inputValue = 'o';
16411641
fixture.detectChanges();
16421642
expect(testComponent.cascader.cascaderService.columns[0][0].isDisabled).toBe(true);
16431643
expect(testComponent.cascader.cascaderService.columns[0][1].isDisabled).toBe(false);
@@ -1647,8 +1647,8 @@ describe('cascader', () => {
16471647
it('should support arrow in search mode', done => {
16481648
testComponent.nzOptions = options2;
16491649
fixture.detectChanges();
1650-
testComponent.cascader.inputValue = 'o';
16511650
testComponent.cascader.setMenuVisible(true);
1651+
testComponent.cascader.inputValue = 'o';
16521652
fixture.detectChanges();
16531653
const itemEl2 = getItemAtColumnAndRow(1, 2)!;
16541654
const itemEl4 = getItemAtColumnAndRow(1, 4)!;
@@ -1717,8 +1717,8 @@ describe('cascader', () => {
17171717
fixture.detectChanges();
17181718
testComponent.nzShowSearch = true;
17191719
cascader.nativeElement.click();
1720-
testComponent.cascader.inputValue = 'o';
17211720
testComponent.cascader.setMenuVisible(true);
1721+
testComponent.cascader.inputValue = 'o';
17221722
fixture.detectChanges();
17231723
let itemEl1 = getItemAtColumnAndRow(1, 1)!;
17241724
expect(testComponent.cascader.inSearchingMode).toBe(true);
@@ -1803,6 +1803,57 @@ describe('cascader', () => {
18031803
expect(testComponent.values).toEqual(['zhejiang', 'hangzhou', 'xihu']);
18041804
}));
18051805

1806+
it('should display activated column correctly after clicking outside and reopen', fakeAsync(() => {
1807+
fixture.detectChanges();
1808+
testComponent.values = ['zhejiang', 'hangzhou', 'xihu'];
1809+
// First open - should display activated columns correctly
1810+
testComponent.cascader.setMenuVisible(true);
1811+
fixture.detectChanges();
1812+
flush();
1813+
fixture.detectChanges();
1814+
expect(getAllColumns().length).toBe(3);
1815+
let itemEl1 = getItemAtColumnAndRow(1, 1)!;
1816+
let itemEl2 = getItemAtColumnAndRow(2, 1)!;
1817+
let itemEl3 = getItemAtColumnAndRow(3, 1)!;
1818+
expect(itemEl1.classList).toContain('ant-cascader-menu-item-active');
1819+
expect(itemEl2.classList).toContain('ant-cascader-menu-item-active');
1820+
expect(itemEl3.classList).toContain('ant-cascader-menu-item-active');
1821+
1822+
// Click first column option (zhejiang) - should fold the third column
1823+
itemEl1.click();
1824+
fixture.detectChanges();
1825+
flush();
1826+
fixture.detectChanges();
1827+
expect(getAllColumns().length).toBe(2);
1828+
itemEl1 = getItemAtColumnAndRow(1, 1)!;
1829+
itemEl2 = getItemAtColumnAndRow(2, 1)!;
1830+
itemEl3 = getItemAtColumnAndRow(3, 1)!;
1831+
expect(itemEl1.classList).toContain('ant-cascader-menu-item-active');
1832+
expect(itemEl2.classList).not.toContain('ant-cascader-menu-item-active');
1833+
expect(itemEl3).toBeNull();
1834+
1835+
// Click outside to close menu - value should remain unchanged
1836+
dispatchFakeEvent(document.body, 'click');
1837+
fixture.detectChanges();
1838+
flush();
1839+
fixture.detectChanges();
1840+
expect(testComponent.cascader.menuVisible).toBe(false);
1841+
expect(testComponent.values).toEqual(['zhejiang', 'hangzhou', 'xihu']);
1842+
1843+
// Reopen menu - should display activated columns correctly based on current value
1844+
testComponent.cascader.setMenuVisible(true);
1845+
fixture.detectChanges();
1846+
flush();
1847+
fixture.detectChanges();
1848+
expect(getAllColumns().length).toBe(3);
1849+
itemEl1 = getItemAtColumnAndRow(1, 1)!;
1850+
itemEl2 = getItemAtColumnAndRow(2, 1)!;
1851+
itemEl3 = getItemAtColumnAndRow(3, 1)!;
1852+
expect(itemEl1.classList).toContain('ant-cascader-menu-item-active');
1853+
expect(itemEl2.classList).toContain('ant-cascader-menu-item-active');
1854+
expect(itemEl3.classList).toContain('ant-cascader-menu-item-active');
1855+
}));
1856+
18061857
describe('should nzOpen works', () => {
18071858
beforeEach(fakeAsync(() => {
18081859
testComponent.nzOpen = true;

0 commit comments

Comments
 (0)