ng-ytl-zorro-antd
Version:
An enterprise-class UI components based on Ant Design and Angular
197 lines (172 loc) • 6.57 kB
text/typescript
import { animate, state, style, transition, trigger } from '@angular/animations';
import {
AfterViewInit, ChangeDetectorRef, Component, ContentChildren, EventEmitter, HostBinding, HostListener, Input, OnDestroy, OnInit, Output
} from '@angular/core';
import { Subject } from 'rxjs/Subject';
import { debounceTime } from 'rxjs/operators/debounceTime';
import { toBoolean } from '../util/convert';
import { NzMenuComponent } from './nz-menu.component';
export class NzSubMenuComponent implements OnInit, OnDestroy, AfterViewInit {
private _open = false;
isInDropDown = false;
level = 1;
_$mouseSubject = new Subject();
subMenus;
nzOpenChange: EventEmitter<boolean> = new EventEmitter();
set nzOpen(value: boolean) {
this._open = toBoolean(value);
}
get nzOpen(): boolean {
return this._open;
}
get subItemSelected(): boolean {
return !!this.nzMenuComponent.menuItems.find(e => e.nzSelected && e.nzSubMenuComponent === this);
}
get submenuSelected(): boolean {
return !!this.subMenus._results.find(e => e !== this && e.subItemSelected);
}
get expandState(): string {
if (this.nzOpen && this.nzMenuComponent.nzMode === 'inline') {
return 'expand';
} else if (this.nzOpen && this.nzMenuComponent.nzMode !== 'inline') {
return 'fade';
}
return null;
}
clickSubMenuTitle(): void {
if ((this.nzMenuComponent.nzMode === 'inline') && (!this.isInDropDown)) {
this.nzOpen = !this.nzOpen;
this.nzOpenChange.emit(this.nzOpen);
}
}
clickSubMenuDropDown(): void {
if (this.isInDropDown || (this.nzMenuComponent.nzMode === 'vertical') || (this.nzMenuComponent.nzMode === 'horizontal')) {
this._$mouseSubject.next(false);
this.nzOpen = false;
this.nzOpenChange.emit(this.nzOpen);
}
}
onMouseEnterEvent(e: MouseEvent): void {
if ((this.nzMenuComponent.nzMode === 'horizontal') || (this.nzMenuComponent.nzMode === 'vertical') || this.isInDropDown) {
this._$mouseSubject.next(true);
}
}
onMouseLeaveEvent(e: MouseEvent): void {
if ((this.nzMenuComponent.nzMode === 'horizontal') || (this.nzMenuComponent.nzMode === 'vertical') || this.isInDropDown) {
this._$mouseSubject.next(false);
}
}
get setDropDownSubmenuClass(): boolean {
return this.isInDropDown;
}
get setMenuSubmenuOpenClass(): boolean {
return (!this.isInDropDown) && (this.nzOpen);
}
get setDropDownVerticalClass(): boolean {
return this.isInDropDown && (this.nzMenuComponent.nzMode === 'vertical');
}
get setDropDownHorizontalClass(): boolean {
return this.isInDropDown && (this.nzMenuComponent.nzMode === 'horizontal');
}
get setMenuSubmenuClass(): boolean {
return !this.isInDropDown;
}
get setMenuSubmenuSelectedClass(): boolean {
return this.submenuSelected || this.subItemSelected;
}
get setMenuVerticalClass(): boolean {
return (!this.isInDropDown) && (this.nzMenuComponent.nzMode === 'vertical');
}
get setMenuHorizontalClass(): boolean {
return (!this.isInDropDown) && (this.nzMenuComponent.nzMode === 'horizontal');
}
get setMenuInlineClass(): boolean {
return (!this.isInDropDown) && (this.nzMenuComponent.nzMode === 'inline');
}
constructor(public nzMenuComponent: NzMenuComponent, public cd: ChangeDetectorRef) {
this.nzMenuComponent.setHasSubMenu(true);
this.nzMenuComponent.subMenus.push(this);
}
ngAfterViewInit(): void {
this.isInDropDown = this.nzMenuComponent.isInDropDown;
if (this.subMenus.length && (this.nzMenuComponent.nzMode === 'inline')) {
this.subMenus.filter(x => x !== this).forEach(menu => {
setTimeout(_ => {
menu.level = this.level + 1;
});
});
}
}
ngOnInit(): void {
this._$mouseSubject.pipe(debounceTime(300)).subscribe((data: boolean) => {
if (this.nzOpen !== data) {
this.nzOpen = data;
this.nzOpenChange.emit(this.nzOpen);
}
});
}
ngOnDestroy(): void {
this._$mouseSubject.unsubscribe();
}
}