ng-ytl-zorro-antd
Version:
An enterprise-class UI components based on Ant Design and Angular
119 lines (103 loc) • 3.65 kB
text/typescript
import {
AfterViewInit,
ChangeDetectorRef,
Component,
ElementRef,
HostBinding,
HostListener,
Input,
Optional,
Renderer2,
} from '@angular/core';
import { toBoolean } from '../util/convert';
import { NzMenuComponent } from './nz-menu.component';
import { NzSubMenuComponent } from './nz-submenu.component';
export const PADDING_BASE = 24;
export class NzMenuItemComponent implements AfterViewInit {
private _disabled = false;
private _selected = false;
level = 0;
padding = null;
isInDropDown = false;
// TODO: should be nzDisabled for consistency
set nzDisable(value: boolean) {
this._disabled = toBoolean(value);
}
get nzDisable(): boolean {
return this._disabled;
}
set nzSelected(value: boolean) {
this._selected = toBoolean(value);
if (this._selected) {
this._renderer.addClass(this.hostElement.nativeElement, this.isInDropDown ? 'ant-dropdown-menu-item-selected' : 'ant-menu-item-selected');
} else {
this._renderer.removeClass(this.hostElement.nativeElement, this.isInDropDown ? 'ant-dropdown-menu-item-selected' : 'ant-menu-item-selected');
}
}
get nzSelected(): boolean {
return this._selected;
}
/** clear all item selected status except this */
// TODO: the $event param should be removed if not require
_onClickItem(): void {
if (this.nzMenuComponent.nzClickActive && (!this.nzDisable)) {
this.nzMenuComponent.clearAllSelected();
this.nzSelected = true;
}
}
/** define host class */
get _isInDropDownClass(): boolean {
return this.isInDropDown;
}
get _isNotInDropDownClass(): boolean {
return !this.isInDropDown;
}
get setDropDownDisableClass(): boolean {
return this.isInDropDown && this.nzDisable;
}
get setMenuDisableClass(): boolean {
return (!this.isInDropDown) && this.nzDisable;
}
get setPaddingLeft(): number {
if (this.nzSubMenuComponent) {
/** if in sub menu component */
if (this.nzSubMenuComponent.nzMenuComponent.nzMode === 'inline') {
/** if host menu's mode is inline add PADDING_BASE * level padding */
return (this.nzSubMenuComponent.level + 1) * PADDING_BASE;
} else {
/** return origin padding */
return this.padding;
}
} else if (this.nzMenuComponent.hasSubMenu && (this.nzMenuComponent.nzMode === 'inline')) {
/** not in sub menu component but root menu's mode is inline and contains submenu return default padding*/
return PADDING_BASE;
} else {
return this.padding;
}
}
constructor(private _renderer: Renderer2, public cd: ChangeDetectorRef, private nzMenuComponent: NzMenuComponent, public nzSubMenuComponent: NzSubMenuComponent, private hostElement: ElementRef) {
this.nzMenuComponent.menuItems.push(this);
/** store origin padding in padding */
if (this.hostElement.nativeElement.style[ 'padding-left' ]) {
this.padding = parseInt(this.hostElement.nativeElement.style[ 'padding-left' ], 10);
}
}
ngAfterViewInit(): void {
setTimeout(_ => {
this.isInDropDown = this.nzMenuComponent.isInDropDown;
});
}
}