angular-sidebar-menu
Version:
The sources for this package are in the [Angular Sidebar Menu](https://github.com/mledour/angular-sidebar-menu) repo. Please file issues and pull requests against that repo.
108 lines • 13.5 kB
JavaScript
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, HostBinding, Input, Output, ViewChildren, } from '@angular/core';
import { combineLatest, Subject } from 'rxjs';
import { filter, takeUntil } from 'rxjs/operators';
import { NodeService } from './node.service';
import { RoleService } from './role.service';
import { openCloseAnimation } from './node.animations';
import { ItemComponent } from './item.component';
import { trackByItem } from './utils';
export class NodeComponent {
constructor(nodeService, roleService, changeDetectorRef) {
this.nodeService = nodeService;
this.roleService = roleService;
this.changeDetectorRef = changeDetectorRef;
this.disable = false;
this.isActive = new EventEmitter();
this.isFiltered = new EventEmitter();
this.isOpen = false;
this.isActiveChild = false;
this.trackByItem = trackByItem;
this.onDestroy$ = new Subject();
}
get open() {
return this.isOpen;
}
ngAfterViewInit() {
this.openedNodeSubscription();
this.activeItemsSubscription();
this.filterItemsSubscription();
}
ngOnDestroy() {
this.onDestroy$.next();
this.onDestroy$.complete();
}
onNodeToggleClick() {
this.isOpen = !this.isOpen;
this.nodeService.openedNode.next({ nodeComponent: this, nodeLevel: this.level });
this.changeDetectorRef.markForCheck();
}
activeItemsSubscription() {
const isChildrenItemsActive = this.menuItemComponents.map((item) => item.isActive$);
if (isChildrenItemsActive && isChildrenItemsActive.length) {
combineLatest(isChildrenItemsActive)
.pipe(takeUntil(this.onDestroy$))
.subscribe((itemsActiveState) => {
this.isOpen = this.isActiveChild = itemsActiveState.includes(true);
this.isActive.emit(this.isOpen);
});
}
}
filterItemsSubscription() {
const isChildrenItemsFiltered = this.menuItemComponents.map((item) => item.isFiltered$);
if (isChildrenItemsFiltered && isChildrenItemsFiltered.length) {
combineLatest(isChildrenItemsFiltered)
.pipe(takeUntil(this.onDestroy$))
.subscribe((itemsFilteredState) => {
const isItemsFiltered = itemsFilteredState.includes(false) === false;
this.isFiltered.emit(isItemsFiltered);
});
}
}
openedNodeSubscription() {
this.nodeService.openedNode
.pipe(filter(() => !!this.isOpen), filter((node) => node.nodeComponent !== this), takeUntil(this.onDestroy$))
.subscribe((node) => {
if (node.nodeLevel <= this.level) {
this.isOpen = false;
this.changeDetectorRef.markForCheck();
}
});
}
}
NodeComponent.decorators = [
{ type: Component, args: [{
selector: 'asm-menu-node',
animations: [openCloseAnimation],
changeDetection: ChangeDetectionStrategy.OnPush,
template: `<ul []="isOpen">
<li *ngIf="level === 0" class="asm-menu-item">
<span class="asm-menu-node__label">{{ menuItem.label }}</span>
</li>
<ng-container *ngFor="let childItem of menuItem.children; trackBy: trackByItem">
<li
asm-menu-item
class="asm-menu-item"
*ngIf="roleService.showItem$(childItem.roles) | async"
[menuItem]="childItem"
[level]="level + 1"
[disable]="disable"
></li>
</ng-container>
</ul>`
},] }
];
NodeComponent.ctorParameters = () => [
{ type: NodeService },
{ type: RoleService },
{ type: ChangeDetectorRef }
];
NodeComponent.propDecorators = {
menuItem: [{ type: Input }],
level: [{ type: Input }],
disable: [{ type: Input }],
isActive: [{ type: Output }],
isFiltered: [{ type: Output }],
open: [{ type: HostBinding, args: ['class.asm-menu-node--open',] }],
menuItemComponents: [{ type: ViewChildren, args: [ItemComponent,] }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJyYXJ5L3NyYy9saWIvaW50ZXJuYWwvbm9kZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFDWixXQUFXLEVBQ1gsS0FBSyxFQUVMLE1BQU0sRUFFTixZQUFZLEdBQ2IsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDOUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUluRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBc0J0QyxNQUFNLE9BQU8sYUFBYTtJQW9CeEIsWUFDUyxXQUF3QixFQUN4QixXQUF3QixFQUN2QixpQkFBb0M7UUFGckMsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDdkIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQXBCckMsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUVmLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBQ3ZDLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBUW5ELFdBQU0sR0FBRyxLQUFLLENBQUM7UUFDZixrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUN0QixnQkFBVyxH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TUFBTSxHQUFHLEtBQUssQ0FBQztnQkFDcEIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFlBQVksRUFBRSxDQUFDO2FBQ3ZDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDOzs7WUF0R0YsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxlQUFlO2dCQUN6QixVQUFVLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQztnQkFDaEMsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07Z0JBQy9DLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7UUFjSjthQUNQOzs7WUF6QlEsV0FBVztZQUNYLFdBQVc7WUFqQmxCLGlCQUFpQjs7O3VCQTJDaEIsS0FBSztvQkFDTCxLQUFLO3NCQUNMLEtBQUs7dUJBRUwsTUFBTTt5QkFDTixNQUFNO21CQUVOLFdBQVcsU0FBQywyQkFBMkI7aUNBSXZDLFlBQVksU0FBQyxhQUFhIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdEJpbmRpbmcsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBWaWV3Q2hpbGRyZW4sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBjb21iaW5lTGF0ZXN0LCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgTWVudUl0ZW0gfSBmcm9tICcuLi9zaWRlYmFyLW1lbnUuaW50ZXJmYWNlJztcblxuaW1wb3J0IHsgTm9kZVNlcnZpY2UgfSBmcm9tICcuL25vZGUuc2VydmljZSc7XG5pbXBvcnQgeyBSb2xlU2VydmljZSB9IGZyb20gJy4vcm9sZS5zZXJ2aWNlJztcbmltcG9ydCB7IG9wZW5DbG9zZUFuaW1hdGlvbiB9IGZyb20gJy4vbm9kZS5hbmltYXRpb25zJztcbmltcG9ydCB7IEl0ZW1Db21wb25lbnQgfSBmcm9tICcuL2l0ZW0uY29tcG9uZW50JztcbmltcG9ydCB7IHRyYWNrQnlJdGVtIH0gZnJvbSAnLi91dGlscyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FzbS1tZW51LW5vZGUnLFxuICBhbmltYXRpb25zOiBbb3BlbkNsb3NlQW5pbWF0aW9uXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHRlbXBsYXRlOiBgPHVsIFtAb3BlbkNsb3NlXT1cImlzT3BlblwiPlxuICAgIDxsaSAqbmdJZj1cImxldmVsID09PSAwXCIgY2xhc3M9XCJhc20tbWVudS1pdGVtXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cImFzbS1tZW51LW5vZGVfX2xhYmVsXCI+e3sgbWVudUl0ZW0ubGFiZWwgfX08L3NwYW4+XG4gICAgPC9saT5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjaGlsZEl0ZW0gb2YgbWVudUl0ZW0uY2hpbGRyZW47IHRyYWNrQnk6IHRyYWNrQnlJdGVtXCI+XG4gICAgICA8bGlcbiAgICAgICAgYXNtLW1lbnUtaXRlbVxuICAgICAgICBjbGFzcz1cImFzbS1tZW51LWl0ZW1cIlxuICAgICAgICAqbmdJZj1cInJvbGVTZXJ2aWNlLnNob3dJdGVtJChjaGlsZEl0ZW0ucm9sZXMpIHwgYXN5bmNcIlxuICAgICAgICBbbWVudUl0ZW1dPVwiY2hpbGRJdGVtXCJcbiAgICAgICAgW2xldmVsXT1cImxldmVsICsgMVwiXG4gICAgICAgIFtkaXNhYmxlXT1cImRpc2FibGVcIlxuICAgICAgPjwvbGk+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvdWw+YCxcbn0pXG5leHBvcnQgY2xhc3MgTm9kZUNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIG1lbnVJdGVtITogTWVudUl0ZW07XG4gIEBJbnB1dCgpIGxldmVsITogbnVtYmVyO1xuICBASW5wdXQoKSBkaXNhYmxlID0gZmFsc2U7XG5cbiAgQE91dHB1dCgpIGlzQWN0aXZlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICBAT3V0cHV0KCkgaXNGaWx0ZXJlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFzbS1tZW51LW5vZGUtLW9wZW4nKSBnZXQgb3BlbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc09wZW47XG4gIH1cblxuICBAVmlld0NoaWxkcmVuKEl0ZW1Db21wb25lbnQpIHByaXZhdGUgbWVudUl0ZW1Db21wb25lbnRzITogUXVlcnlMaXN0PEl0ZW1Db21wb25lbnQ+O1xuXG4gIGlzT3BlbiA9IGZhbHNlO1xuICBpc0FjdGl2ZUNoaWxkID0gZmFsc2U7XG4gIHRyYWNrQnlJdGVtID0gdHJhY2tCeUl0ZW07XG5cbiAgcHJpdmF0ZSBvbkRlc3Ryb3kkID0gbmV3IFN1YmplY3QoKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgbm9kZVNlcnZpY2U6IE5vZGVTZXJ2aWNlLFxuICAgIHB1YmxpYyByb2xlU2VydmljZTogUm9sZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7fVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLm9wZW5lZE5vZGVTdWJzY3JpcHRpb24oKTtcbiAgICB0aGlzLmFjdGl2ZUl0ZW1zU3Vic2NyaXB0aW9uKCk7XG4gICAgdGhpcy5maWx0ZXJJdGVtc1N1YnNjcmlwdGlvbigpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5vbkRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLm9uRGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxuXG4gIG9uTm9kZVRvZ2dsZUNsaWNrKCk6IHZvaWQge1xuICAgIHRoaXMuaXNPcGVuID0gIXRoaXMuaXNPcGVuO1xuICAgIHRoaXMubm9kZVNlcnZpY2Uub3BlbmVkTm9kZS5uZXh0KHsgbm9kZUNvbXBvbmVudDogdGhpcywgbm9kZUxldmVsOiB0aGlzLmxldmVsIH0pO1xuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIGFjdGl2ZUl0ZW1zU3Vic2NyaXB0aW9uKCk6IHZvaWQge1xuICAgIGNvbnN0IGlzQ2hpbGRyZW5JdGVtc0FjdGl2ZSA9IHRoaXMubWVudUl0ZW1Db21wb25lbnRzLm1hcCgoaXRlbSkgPT4gaXRlbS5pc0FjdGl2ZSQpO1xuXG4gICAgaWYgKGlzQ2hpbGRyZW5JdGVtc0FjdGl2ZSAmJiBpc0NoaWxkcmVuSXRlbXNBY3RpdmUubGVuZ3RoKSB7XG4gICAgICBjb21iaW5lTGF0ZXN0KGlzQ2hpbGRyZW5JdGVtc0FjdGl2ZSlcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMub25EZXN0cm95JCkpXG4gICAgICAgIC5zdWJzY3JpYmUoKGl0ZW1zQWN0aXZlU3RhdGUpID0+IHtcbiAgICAgICAgICB0aGlzLmlzT3BlbiA9IHRoaXMuaXNBY3RpdmVDaGlsZCA9IGl0ZW1zQWN0aXZlU3RhdGUuaW5jbHVkZXModHJ1ZSk7XG4gICAgICAgICAgdGhpcy5pc0FjdGl2ZS5lbWl0KHRoaXMuaXNPcGVuKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmaWx0ZXJJdGVtc1N1YnNjcmlwdGlvbigpOiB2b2lkIHtcbiAgICBjb25zdCBpc0NoaWxkcmVuSXRlbXNGaWx0ZXJlZCA9IHRoaXMubWVudUl0ZW1Db21wb25lbnRzLm1hcCgoaXRlbSkgPT4gaXRlbS5pc0ZpbHRlcmVkJCk7XG5cbiAgICBpZiAoaXNDaGlsZHJlbkl0ZW1zRmlsdGVyZWQgJiYgaXNDaGlsZHJlbkl0ZW1zRmlsdGVyZWQubGVuZ3RoKSB7XG4gICAgICBjb21iaW5lTGF0ZXN0KGlzQ2hpbGRyZW5JdGVtc0ZpbHRlcmVkKVxuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5vbkRlc3Ryb3kkKSlcbiAgICAgICAgLnN1YnNjcmliZSgoaXRlbXNGaWx0ZXJlZFN0YXRlKSA9PiB7XG4gICAgICAgICAgY29uc3QgaXNJdGVtc0ZpbHRlcmVkID0gaXRlbXNGaWx0ZXJlZFN0YXRlLmluY2x1ZGVzKGZhbHNlKSA9PT0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5pc0ZpbHRlcmVkLmVtaXQoaXNJdGVtc0ZpbHRlcmVkKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvcGVuZWROb2RlU3Vic2NyaXB0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMubm9kZVNlcnZpY2Uub3BlbmVkTm9kZVxuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbHRlcigoKSA9PiAhIXRoaXMuaXNPcGVuKSxcbiAgICAgICAgZmlsdGVyKChub2RlKSA9PiBub2RlLm5vZGVDb21wb25lbnQgIT09IHRoaXMpLFxuICAgICAgICB0YWtlVW50aWwodGhpcy5vbkRlc3Ryb3kkKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgobm9kZSkgPT4ge1xuICAgICAgICBpZiAobm9kZS5ub2RlTGV2ZWwgPD0gdGhpcy5sZXZlbCkge1xuICAgICAgICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cbn1cbiJdfQ==