@ux-aspects/ux-aspects
Version:
Open source user interface framework for building modern, responsive, mobile big data applications
101 lines • 14.7 kB
JavaScript
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