UNPKG

@ux-aspects/ux-aspects

Version:

Open source user interface framework for building modern, responsive, mobile big data applications

101 lines 14.7 kB
import { Injectable } from '@angular/core'; import { BehaviorSubject, isObservable, Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { TreeGridState } from './tree-grid-state.class'; import * as i0 from "@angular/core"; export class TreeGridService { constructor() { /** The raw table data */ this.data$ = new BehaviorSubject([]); /** The flattened table data */ this.rows$ = new BehaviorSubject([]); /** Ensure we destroy all observables correctly */ this._onDestroy = new Subject(); this.data$.pipe(takeUntil(this._onDestroy)).subscribe(data => this.rows$.next(this.getFlattenedTree(data))); } /** Unsubscribe from all observables */ ngOnDestroy() { this._onDestroy.next(); this._onDestroy.complete(); } /** Set the expanded state of a row */ async setExpanded(item, expanded) { if (expanded) { await this.getChildren(item); this.insertChildren(item); } else { this.removeChildren(item); } } /** A function to flatten tree data */ getFlattenedTree(data, parent) { // flatten the nodes at this level return data.reduce((previous, item, index) => { item.state = new TreeGridState(parent ? parent.state.level + 1 : 0, data.length, index + 1); // Convert any child nodes const children = (item.children && item.expanded) ? this.getFlattenedTree(item.children, item) : []; // return the nodes in a flattened array return [...previous, item, ...children]; }, []); } /** Load any children dynamically */ async getChildren(item) { if (!item.children && this.loadChildren) { item.state.loading$.next(true); try { item.children = await this.getNormalizedChildren(this.loadChildren(item)); } finally { item.state.loading$.next(false); } } } /** We want to support an array, a promise and an observable. This will return all types as a promise */ async getNormalizedChildren(response) { // if it is already an observable do nothing if (isObservable(response)) { return await response.toPromise(); } // if it is a promise wrap it as an observable if (response instanceof Promise) { return await response; } // if it is an array then make it an observable return response; } /** Insert the children into the flattened tree at the correct location */ insertChildren(parent) { if (!parent.children) { return; } const rows = [...this.rows$.getValue()]; const index = rows.indexOf(parent); if (index < 0) { return; } // Skip duplicates - this could happen if an already expanded child has been inserted const uniqueChildren = parent.children.filter(child => rows.indexOf(child) === -1); const childRows = this.getFlattenedTree(uniqueChildren, parent); rows.splice(index + 1, 0, ...childRows); this.rows$.next(rows); } /** Remove all rows from the flattened tree */ removeChildren(parent) { const rows = [...this.rows$.getValue()]; const index = rows.indexOf(parent); if (index < 0) { return; } while (index + 1 < rows.length && rows[index + 1].state.level > parent.state.level) { rows.splice(index + 1, 1); } this.rows$.next(rows); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: TreeGridService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: TreeGridService }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: TreeGridService, decorators: [{ type: Injectable }], ctorParameters: () => [] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS1ncmlkLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvZGlyZWN0aXZlcy90cmVlLWdyaWQvdHJlZS1ncmlkLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUN0RCxPQUFPLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRzNDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7QUFHeEQsTUFBTSxPQUFPLGVBQWU7SUFjeEI7UUFaQSx5QkFBeUI7UUFDekIsVUFBSyxHQUFHLElBQUksZUFBZSxDQUFpQixFQUFFLENBQUMsQ0FBQztRQUVoRCwrQkFBK0I7UUFDL0IsVUFBSyxHQUFHLElBQUksZUFBZSxDQUFpQixFQUFFLENBQUMsQ0FBQztRQUtoRCxrREFBa0Q7UUFDakMsZUFBVSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFHOUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEgsQ0FBQztJQUVELHVDQUF1QztJQUN2QyxXQUFXO1FBQ1AsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFRCxzQ0FBc0M7SUFDdEMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFrQixFQUFFLFFB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QyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRW5GLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFaEUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLFNBQVMsQ0FBQyxDQUFDO1FBRXhDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFFRCw4Q0FBOEM7SUFDdEMsY0FBYyxDQUFDLE1BQW9CO1FBRXZDLE1BQU0sSUFBSSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDeEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVuQyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNaLE9BQU87UUFDWCxDQUFDO1FBRUQsT0FBTyxLQUFLLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDakYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzlCLENBQUM7UUFFRCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxQixDQUFDOytHQXZIUSxlQUFlO21IQUFmLGVBQWU7OzRGQUFmLGVBQWU7a0JBRDNCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgaXNPYnNlcnZhYmxlLCBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBUcmVlR3JpZEl0ZW0gfSBmcm9tICcuL3RyZWUtZ3JpZC1pdGVtLmludGVyZmFjZSc7XG5pbXBvcnQgeyBUcmVlR3JpZExvYWRGdW5jdGlvbiB9IGZyb20gJy4vdHJlZS1ncmlkLWxvYWQtZnVuY3Rpb24udHlwZSc7XG5pbXBvcnQgeyBUcmVlR3JpZFN0YXRlIH0gZnJvbSAnLi90cmVlLWdyaWQtc3RhdGUuY2xhc3MnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgVHJlZUdyaWRTZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcblxuICAgIC8qKiBUaGUgcmF3IHRhYmxlIGRhdGEgKi9cbiAgICBkYXRhJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VHJlZUdyaWRJdGVtW10+KFtdKTtcblxuICAgIC8qKiBUaGUgZmxhdHRlbmVkIHRhYmxlIGRhdGEgKi9cbiAgICByb3dzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VHJlZUdyaWRJdGVtW10+KFtdKTtcblxuICAgIC8qKiBUaGUgZnVuY3Rpb24gdG8gbG9hZCBjaGlsZCBpdGVtcyAqL1xuICAgIGxvYWRDaGlsZHJlbjogVHJlZUdyaWRMb2FkRnVuY3Rpb247XG5cbiAgICAvKiogRW5zdXJlIHdlIGRlc3Ryb3kgYWxsIG9ic2VydmFibGVzIGNvcnJlY3RseSAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX29uRGVzdHJveSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5kYXRhJC5waXBlKHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kpKS5zdWJzY3JpYmUoZGF0YSA9PiB0aGlzLnJvd3MkLm5leHQodGhpcy5nZXRGbGF0dGVuZWRUcmVlKGRhdGEpKSk7XG4gICAgfVxuXG4gICAgLyoqIFVuc3Vic2NyaWJlIGZyb20gYWxsIG9ic2VydmFibGVzICovXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX29uRGVzdHJveS5uZXh0KCk7XG4gICAgICAgIHRoaXMuX29uRGVzdHJveS5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIC8qKiBTZXQgdGhlIGV4cGFuZGVkIHN0YXRlIG9mIGEgcm93ICovXG4gICAgYXN5bmMgc2V0RXhwYW5kZWQoaXRlbTogVHJlZUdyaWRJdGVtLCBleHBhbmRlZDogYm9vbGVhbikge1xuICAgICAgICBpZiAoZXhwYW5kZWQpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZ2V0Q2hpbGRyZW4oaXRlbSk7XG4gICAgICAgICAgICB0aGlzLmluc2VydENoaWxkcmVuKGl0ZW0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVDaGlsZHJlbihpdGVtKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBBIGZ1bmN0aW9uIHRvIGZsYXR0ZW4gdHJlZSBkYXRhICovXG4gICAgcHJpdmF0ZSBnZXRGbGF0dGVuZWRUcmVlKGRhdGE6IFRyZWVHcmlkSXRlbVtdLCBwYXJlbnQ/OiBUcmVlR3JpZEl0ZW0pOiBUcmVlR3JpZEl0ZW1bXSB7XG4gICAgICAgIC8vIGZsYXR0ZW4gdGhlIG5vZGVzIGF0IHRoaXMgbGV2ZWxcbiAgICAgICAgcmV0dXJuIGRhdGEucmVkdWNlKChwcmV2aW91cywgaXRlbSwgaW5kZXgpID0+IHtcblxuICAgICAgICAgICAgaXRlbS5zdGF0ZSA9IG5ldyBUcmVlR3JpZFN0YXRlKHBhcmVudCA/IHBhcmVudC5zdGF0ZS5sZXZlbCArIDEgOiAwLCBkYXRhLmxlbmd0aCwgaW5kZXggKyAxKTtcblxuICAgICAgICAgICAgLy8gQ29udmVydCBhbnkgY2hpbGQgbm9kZXNcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gKGl0ZW0uY2hpbGRyZW4gJiYgaXRlbS5leHBhbmRlZCkgPyB0aGlzLmdldEZsYXR0ZW5lZFRyZWUoaXRlbS5jaGlsZHJlbiwgaXRlbSkgOiBbXTtcblxuICAgICAgICAgICAgLy8gcmV0dXJuIHRoZSBub2RlcyBpbiBhIGZsYXR0ZW5lZCBhcnJheVxuICAgICAgICAgICAgcmV0dXJuIFsuLi5wcmV2aW91cywgaXRlbSwgLi4uY2hpbGRyZW5dO1xuICAgICAgICB9LCBbXSk7XG4gICAgfVxuXG4gICAgLyoqIExvYWQgYW55IGNoaWxkcmVuIGR5bmFtaWNhbGx5ICovXG4gICAgcHJpdmF0ZSBhc3luYyBnZXRDaGlsZHJlbihpdGVtOiBUcmVlR3JpZEl0ZW0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCFpdGVtLmNoaWxkcmVuICYmIHRoaXMubG9hZENoaWxkcmVuKSB7XG4gICAgICAgICAgICBpdGVtLnN0YXRlLmxvYWRpbmckLm5leHQodHJ1ZSk7XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaXRlbS5jaGlsZHJlbiA9IGF3YWl0IHRoaXMuZ2V0Tm9ybWFsaXplZENoaWxkcmVuKHRoaXMubG9hZENoaWxkcmVuKGl0ZW0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIGl0ZW0uc3RhdGUubG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogV2Ugd2FudCB0byBzdXBwb3J0IGFuIGFycmF5LCBhIHByb21pc2UgYW5kIGFuIG9ic2VydmFibGUuIFRoaXMgd2lsbCByZXR1cm4gYWxsIHR5cGVzIGFzIGEgcHJvbWlzZSAqL1xuICAgIHByaXZhdGUgYXN5bmMgZ2V0Tm9ybWFsaXplZENoaWxkcmVuKHJlc3BvbnNlOiBUcmVlR3JpZEl0ZW1bXSB8IFByb21pc2U8VHJlZUdyaWRJdGVtW10+IHwgT2JzZXJ2YWJsZTxUcmVlR3JpZEl0ZW1bXT4pOiBQcm9taXNlPFRyZWVHcmlkSXRlbVtdPiB7XG5cbiAgICAgICAgLy8gaWYgaXQgaXMgYWxyZWFkeSBhbiBvYnNlcnZhYmxlIGRvIG5vdGhpbmdcbiAgICAgICAgaWYgKGlzT2JzZXJ2YWJsZShyZXNwb25zZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXNwb25zZS50b1Byb21pc2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIGl0IGlzIGEgcHJvbWlzZSB3cmFwIGl0IGFzIGFuIG9ic2VydmFibGVcbiAgICAgICAgaWYgKHJlc3BvbnNlIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3BvbnNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgaXQgaXMgYW4gYXJyYXkgdGhlbiBtYWtlIGl0IGFuIG9ic2VydmFibGVcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgIH1cblxuICAgIC8qKiBJbnNlcnQgdGhlIGNoaWxkcmVuIGludG8gdGhlIGZsYXR0ZW5lZCB0cmVlIGF0IHRoZSBjb3JyZWN0IGxvY2F0aW9uICovXG4gICAgcHJpdmF0ZSBpbnNlcnRDaGlsZHJlbihwYXJlbnQ6IFRyZWVHcmlkSXRlbSk6IHZvaWQge1xuICAgICAgICBpZiAoIXBhcmVudC5jaGlsZHJlbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgcm93cyA9IFsuLi50aGlzLnJvd3MkLmdldFZhbHVlKCldO1xuXG4gICAgICAgIGNvbnN0IGluZGV4ID0gcm93cy5pbmRleE9mKHBhcmVudCk7XG5cbiAgICAgICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2tpcCBkdXBsaWNhdGVzIC0gdGhpcyBjb3VsZCBoYXBwZW4gaWYgYW4gYWxyZWFkeSBleHBhbmRlZCBjaGlsZCBoYXMgYmVlbiBpbnNlcnRlZFxuICAgICAgICBjb25zdCB1bmlxdWVDaGlsZHJlbiA9IHBhcmVudC5jaGlsZHJlbi5maWx0ZXIoY2hpbGQgPT4gcm93cy5pbmRleE9mKGNoaWxkKSA9PT0gLTEpO1xuXG4gICAgICAgIGNvbnN0IGNoaWxkUm93cyA9IHRoaXMuZ2V0RmxhdHRlbmVkVHJlZSh1bmlxdWVDaGlsZHJlbiwgcGFyZW50KTtcblxuICAgICAgICByb3dzLnNwbGljZShpbmRleCArIDEsIDAsIC4uLmNoaWxkUm93cyk7XG5cbiAgICAgICAgdGhpcy5yb3dzJC5uZXh0KHJvd3MpO1xuICAgIH1cblxuICAgIC8qKiBSZW1vdmUgYWxsIHJvd3MgZnJvbSB0aGUgZmxhdHRlbmVkIHRyZWUgKi9cbiAgICBwcml2YXRlIHJlbW92ZUNoaWxkcmVuKHBhcmVudDogVHJlZUdyaWRJdGVtKTogdm9pZCB7XG5cbiAgICAgICAgY29uc3Qgcm93cyA9IFsuLi50aGlzLnJvd3MkLmdldFZhbHVlKCldO1xuICAgICAgICBjb25zdCBpbmRleCA9IHJvd3MuaW5kZXhPZihwYXJlbnQpO1xuXG4gICAgICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHdoaWxlIChpbmRleCArIDEgPCByb3dzLmxlbmd0aCAmJiByb3dzW2luZGV4ICsgMV0uc3RhdGUubGV2ZWwgPiBwYXJlbnQuc3RhdGUubGV2ZWwpIHtcbiAgICAgICAgICAgIHJvd3Muc3BsaWNlKGluZGV4ICsgMSwgMSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJvd3MkLm5leHQocm93cyk7XG4gICAgfVxufVxuIl19