@ux-aspects/ux-aspects
Version:
Open source user interface framework for building modern, responsive, mobile big data applications
51 lines • 6.62 kB
JavaScript
import { Injectable } from '@angular/core';
import { Subject } from 'rxjs';
import * as i0 from "@angular/core";
export class NavigationService {
constructor() {
/** Whether to collapse other menu items when expanding a menu item. */
this.autoCollapse = true;
/** Emit when the expanded state has changed */
this.expanded$ = new Subject();
}
ngOnDestroy() {
this.expanded$.complete();
}
/** Set the expanded state of an item */
setExpanded(source, expanded) {
if (expanded && this.autoCollapse) {
this.collapseSiblings(source);
this.expanded$.next();
}
}
/** Collapse all siblings nodes */
collapseSiblings(source) {
let siblings = this.items;
for (const item of this.items) {
const parent = this.getParent(source, item);
if (parent) {
siblings = parent.children;
break;
}
}
// collapse every sibling
siblings.filter(item => item !== source).forEach(item => this.collapseAll(item));
}
/** Collapse an item and all its children */
collapseAll(item) {
item.expanded = false;
if (item.children) {
item.children.forEach(child => this.collapseAll(child));
}
}
/** Get a nodes parent if it has one */
getParent(target, item) {
return (item.children || []).find(child => child === target) ? item : null;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: NavigationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: NavigationService }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: NavigationService, decorators: [{
type: Injectable
}] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF2aWdhdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvbmF2aWdhdGlvbi9uYXZpZ2F0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUN0RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQUkvQixNQUFNLE9BQU8saUJBQWlCO0lBRDlCO1FBTUksdUVBQXVFO1FBQ3ZFLGlCQUFZLEdBQVksSUFBSSxDQUFDO1FBRTdCLCtDQUErQztRQUMvQyxjQUFTLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztLQTBDbkM7SUF4Q0csV0FBVztRQUNQLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVELHdDQUF3QztJQUN4QyxXQUFXLENBQUMsTUFBc0IsRUFBRSxRQUFpQjtRQUNqRCxJQUFJLFFBQVEsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDaEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzlCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDMUIsQ0FBQztJQUNMLENBQUM7SUFFRCxrQ0FBa0M7SUFDMUIsZ0JBQWdCLENBQUMsTUFBc0I7UUFDM0MsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUUxQixLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUM1QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztZQUM1QyxJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUNULFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO2dCQUMzQixNQUFNO1lBQ1YsQ0FBQztRQUNMLENBQUM7UUFFRCx5QkFBeUI7UUFDekIsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksS0FBSyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDckYsQ0FBQztJQUVELDRDQUE0QztJQUNwQyxXQUFXLENBQUMsSUFBb0I7UUFDcEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDdEIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDNUQsQ0FBQztJQUNMLENBQUM7SUFFRCx1Q0FBdUM7SUFDL0IsU0FBUyxDQUFDLE1BQXNCLEVBQUUsSUFBb0I7UUFDMUQsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUMvRSxDQUFDOytHQWxEUSxpQkFBaUI7bUhBQWpCLGlCQUFpQjs7NEZBQWpCLGlCQUFpQjtrQkFEN0IsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTmF2aWdhdGlvbkl0ZW0gfSBmcm9tICcuL25hdmlnYXRpb24taXRlbS5pbnRlcmZhY2UnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgTmF2aWdhdGlvblNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuXG4gICAgLyoqIFRoZSBuYXZpZ2F0aW9uIGl0ZW1zIHRvIHBvcHVsYXRlIHRoZSBtZW51IHdpdGggKi9cbiAgICBpdGVtczogTmF2aWdhdGlvbkl0ZW1bXTtcblxuICAgIC8qKiBXaGV0aGVyIHRvIGNvbGxhcHNlIG90aGVyIG1lbnUgaXRlbXMgd2hlbiBleHBhbmRpbmcgYSBtZW51IGl0ZW0uICovXG4gICAgYXV0b0NvbGxhcHNlOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIC8qKiBFbWl0IHdoZW4gdGhlIGV4cGFuZGVkIHN0YXRlIGhhcyBjaGFuZ2VkICovXG4gICAgZXhwYW5kZWQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmV4cGFuZGVkJC5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIC8qKiBTZXQgdGhlIGV4cGFuZGVkIHN0YXRlIG9mIGFuIGl0ZW0gKi9cbiAgICBzZXRFeHBhbmRlZChzb3VyY2U6IE5hdmlnYXRpb25JdGVtLCBleHBhbmRlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBpZiAoZXhwYW5kZWQgJiYgdGhpcy5hdXRvQ29sbGFwc2UpIHtcbiAgICAgICAgICAgIHRoaXMuY29sbGFwc2VTaWJsaW5ncyhzb3VyY2UpO1xuICAgICAgICAgICAgdGhpcy5leHBhbmRlZCQubmV4dCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIENvbGxhcHNlIGFsbCBzaWJsaW5ncyBub2RlcyAqL1xuICAgIHByaXZhdGUgY29sbGFwc2VTaWJsaW5ncyhzb3VyY2U6IE5hdmlnYXRpb25JdGVtKTogdm9pZCB7XG4gICAgICAgIGxldCBzaWJsaW5ncyA9IHRoaXMuaXRlbXM7XG5cbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMuaXRlbXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuZ2V0UGFyZW50KHNvdXJjZSwgaXRlbSk7XG4gICAgICAgICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgICAgICAgICAgc2libGluZ3MgPSBwYXJlbnQuY2hpbGRyZW47XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjb2xsYXBzZSBldmVyeSBzaWJsaW5nXG4gICAgICAgIHNpYmxpbmdzLmZpbHRlcihpdGVtID0+IGl0ZW0gIT09IHNvdXJjZSkuZm9yRWFjaChpdGVtID0+IHRoaXMuY29sbGFwc2VBbGwoaXRlbSkpO1xuICAgIH1cblxuICAgIC8qKiBDb2xsYXBzZSBhbiBpdGVtIGFuZCBhbGwgaXRzIGNoaWxkcmVuICovXG4gICAgcHJpdmF0ZSBjb2xsYXBzZUFsbChpdGVtOiBOYXZpZ2F0aW9uSXRlbSk6IHZvaWQge1xuICAgICAgICBpdGVtLmV4cGFuZGVkID0gZmFsc2U7XG4gICAgICAgIGlmIChpdGVtLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICBpdGVtLmNoaWxkcmVuLmZvckVhY2goY2hpbGQgPT4gdGhpcy5jb2xsYXBzZUFsbChjaGlsZCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEdldCBhIG5vZGVzIHBhcmVudCBpZiBpdCBoYXMgb25lICovXG4gICAgcHJpdmF0ZSBnZXRQYXJlbnQodGFyZ2V0OiBOYXZpZ2F0aW9uSXRlbSwgaXRlbTogTmF2aWdhdGlvbkl0ZW0pOiBOYXZpZ2F0aW9uSXRlbSB8IG51bGwge1xuICAgICAgICByZXR1cm4gKGl0ZW0uY2hpbGRyZW4gfHwgW10pLmZpbmQoY2hpbGQgPT4gY2hpbGQgPT09IHRhcmdldCkgPyBpdGVtIDogbnVsbDtcbiAgICB9XG59XG4iXX0=