Skip to content

Commit 15b6724

Browse files
hsuanxyzvthinkxie
authored andcommitted
feat(module:menu): support nzMenuClassName for the submenu (#3176)
* feat(module:menu): support `nzMenuClassName` for the `[nz-submenu]` * docs(module:menu): update docs
1 parent 0a3f62c commit 15b6724

5 files changed

Lines changed: 57 additions & 15 deletions

File tree

components/menu/doc/index.en-US.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ use `title` to mark the title of submenu
5353
| ----- | ----------- | ---- | ------------- |
5454
| `[nzOpen]` | whether sub menu is open or not, double binding | `boolean` | `false` |
5555
| `[nzDisabled]` | whether sub menu is disabled or not | `boolean` | `false` |
56+
| `[nzMenuClassName]` | Custom the submenu container's class name | `string` | - |
5657
| `(nzOpenChange)` | nzOpen callback | `EventEmitter<boolean>` | - |
5758

5859
### [nz-menu-group]

components/menu/doc/index.zh-CN.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ subtitle: 导航菜单
5454
| --- | --- | --- | --- |
5555
| `[nzOpen]` | 是否展开,可双向绑定 | `boolean` | `false` |
5656
| `[nzDisabled]` | 是否禁用 | `boolean` | `false` |
57+
| `[nzMenuClassName]` | 自定义子菜单容器类名 | `string` | - |
5758
| `(nzOpenChange)` | 展开回调 | `EventEmitter<boolean>` | - |
5859

5960

components/menu/nz-menu.spec.ts

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -402,6 +402,25 @@ describe('menu', () => {
402402
fixture.detectChanges();
403403
expect(subs[1].placement).toBe('rightTop');
404404
});
405+
it('should `nzMenuClassName` work', fakeAsync(() => {
406+
fixture.detectChanges();
407+
testComponent.open = true;
408+
fixture.detectChanges();
409+
expect((overlayContainerElement.querySelector('ul.submenu') as HTMLUListElement).classList).toContain(
410+
'ant-menu-sub'
411+
);
412+
}));
413+
it('should nested submenu `nzMenuClassName` work', () => {
414+
testComponent.open = true;
415+
fixture.detectChanges();
416+
const subs = testComponent.subs.toArray();
417+
subs[1].nzOpen = true;
418+
subs[1].nzSubmenuService.open$.next(true);
419+
fixture.detectChanges();
420+
expect((overlayContainerElement.querySelector('ul.nested-submenu') as HTMLUListElement).classList).toContain(
421+
'ant-menu-sub'
422+
);
423+
});
405424
});
406425
describe('inline submenu', () => {
407426
let fixture: ComponentFixture<NzTestMenuInlineComponent>;
@@ -423,6 +442,17 @@ describe('menu', () => {
423442
expect(ul.style.height).not.toBe('0px');
424443
expect(submenu.nativeElement.classList.contains('ant-menu-submenu-open')).toBe(true);
425444
}));
445+
it('should `nzMenuClassName` work', fakeAsync(() => {
446+
fixture.detectChanges();
447+
expect(submenu.nativeElement.querySelector('.ant-menu-sub').className).toContain('submenu');
448+
}));
449+
it('should `nzMenuClassName` multi class names work', fakeAsync(() => {
450+
fixture.detectChanges();
451+
testComponent.submenuClassName = 'submenu submenu-1';
452+
fixture.detectChanges();
453+
expect(submenu.nativeElement.querySelector('.ant-menu-sub').className).toContain('submenu');
454+
expect(submenu.nativeElement.querySelector('.ant-menu-sub').className).toContain('submenu-1');
455+
}));
426456
it('should disabled work', fakeAsync(() => {
427457
testComponent.disabled = true;
428458
fixture.detectChanges();
@@ -448,7 +478,7 @@ describe('menu', () => {
448478
selector: 'nz-test-menu-horizontal',
449479
template: `
450480
<ul nz-menu [nzMode]="'horizontal'">
451-
<li nz-submenu [nzOpen]="open" [style.width.px]="width">
481+
<li nz-submenu nzMenuClassName="submenu" [nzOpen]="open" [style.width.px]="width">
452482
<span title><i nz-icon type="setting"></i> Navigation Three - Submenu</span>
453483
<ul>
454484
<li nz-menu-group>
@@ -463,7 +493,7 @@ describe('menu', () => {
463493
<ul>
464494
<li nz-menu-item>Option 3</li>
465495
<li nz-menu-item>Option 4</li>
466-
<li nz-submenu [nzDisabled]="disabled">
496+
<li nz-submenu nzMenuClassName="nested-submenu" [nzDisabled]="disabled">
467497
<span title>Sub Menu</span>
468498
<ul>
469499
<li nz-menu-item #menuitem>Option 5</li>
@@ -497,7 +527,7 @@ export class NzTestMenuHorizontalComponent {
497527
selector: 'nz-test-menu-inline',
498528
template: `
499529
<ul nz-menu [nzMode]="'inline'" [nzInlineCollapsed]="collapse">
500-
<li nz-submenu [nzDisabled]="disabled">
530+
<li nz-submenu [nzMenuClassName]="submenuClassName" [nzDisabled]="disabled">
501531
<span title><i nz-icon type="mail"></i> Navigation One</span>
502532
<ul>
503533
<li nz-menu-item style="padding-left:0px;">Option 1</li>
@@ -511,6 +541,7 @@ export class NzTestMenuHorizontalComponent {
511541
export class NzTestMenuInlineComponent {
512542
disabled = false;
513543
collapse = false;
544+
submenuClassName = 'submenu';
514545
@ViewChild(NzSubMenuComponent) subsmenu: NzSubMenuComponent;
515546
@ViewChild('menuitem', { read: ElementRef }) menuitem: ElementRef;
516547
}

components/menu/nz-submenu.component.html

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,11 @@
1212
</span>
1313
<ng-template #notDropdownTpl><i class="ant-menu-submenu-arrow"></i></ng-template>
1414
</div>
15-
<ul *ngIf="nzMenuService.mode === 'inline'" [@collapseMotion]="expandState" [nzNoAnimation]="noAnimation?.nzNoAnimation" class="ant-menu ant-menu-inline ant-menu-sub">
15+
<ul *ngIf="nzMenuService.mode === 'inline'"
16+
[@collapseMotion]="expandState"
17+
[nzNoAnimation]="noAnimation?.nzNoAnimation"
18+
[ngClass]="nzMenuClassName"
19+
class="ant-menu ant-menu-inline ant-menu-sub">
1620
<ng-template [ngTemplateOutlet]="subMenuTemplate"></ng-template>
1721
</ul>
1822
<ng-template cdkConnectedOverlay
@@ -37,7 +41,8 @@
3741
[class.ant-dropdown-menu-vertical]="nzMenuService.isInDropDown"
3842
[class.ant-menu-vertical]="!nzMenuService.isInDropDown"
3943
[class.ant-dropdown-menu-sub]="nzMenuService.isInDropDown"
40-
[class.ant-menu-sub]="!nzMenuService.isInDropDown">
44+
[class.ant-menu-sub]="!nzMenuService.isInDropDown"
45+
[ngClass]="nzMenuClassName">
4146
<ng-template [ngTemplateOutlet]="subMenuTemplate"></ng-template>
4247
</ul>
4348
</div>

components/menu/nz-submenu.component.ts

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -61,22 +61,26 @@ import { NzSubmenuService } from './nz-submenu.service';
6161
]
6262
})
6363
export class NzSubMenuComponent implements OnInit, OnDestroy, AfterContentInit, OnChanges {
64+
@Input() nzMenuClassName: string;
65+
@Input() nzPaddingLeft: number;
66+
@Input() @InputBoolean() nzOpen = false;
67+
@Input() @InputBoolean() nzDisabled = false;
68+
@Output() readonly nzOpenChange: EventEmitter<boolean> = new EventEmitter();
69+
70+
@ViewChild(CdkConnectedOverlay) cdkConnectedOverlay: CdkConnectedOverlay;
71+
@ViewChild(CdkOverlayOrigin, { read: ElementRef }) cdkOverlayOrigin: ElementRef;
72+
@ContentChildren(NzSubMenuComponent, { descendants: true })
73+
listOfNzSubMenuComponent: QueryList<NzSubMenuComponent>;
74+
@ContentChildren(NzMenuItemDirective, { descendants: true })
75+
listOfNzMenuItemDirective: QueryList<NzMenuItemDirective>;
76+
6477
placement = 'rightTop';
6578
triggerWidth: number;
6679
expandState = 'collapsed';
6780
overlayPositions = [...DEFAULT_SUBMENU_POSITIONS];
81+
6882
private destroy$ = new Subject<void>();
6983
private isChildMenuSelected = false;
70-
@ContentChildren(NzSubMenuComponent, { descendants: true }) listOfNzSubMenuComponent: QueryList<NzSubMenuComponent>;
71-
@ContentChildren(NzMenuItemDirective, { descendants: true }) listOfNzMenuItemDirective: QueryList<
72-
NzMenuItemDirective
73-
>;
74-
@ViewChild(CdkConnectedOverlay) cdkConnectedOverlay: CdkConnectedOverlay;
75-
@ViewChild(CdkOverlayOrigin, { read: ElementRef }) cdkOverlayOrigin: ElementRef;
76-
@Input() nzPaddingLeft: number;
77-
@Input() @InputBoolean() nzOpen = false;
78-
@Input() @InputBoolean() nzDisabled = false;
79-
@Output() readonly nzOpenChange: EventEmitter<boolean> = new EventEmitter();
8084

8185
setOpenState(open: boolean): void {
8286
this.nzSubmenuService.setOpenState(open);

0 commit comments

Comments
 (0)