@netgrif/components-core
Version:
Netgrif Application engine frontend core Angular library
123 lines • 15.3 kB
JavaScript
import { Subject } from 'rxjs';
import { EditableElementaryPredicate } from './editable-elementary-predicate';
import { IncrementingCounter } from '../../../utility/incrementing-counter';
import { Query } from '../query/query';
import { EditablePredicate } from './editable-predicate';
import { Predicate } from './predicate';
/**
* A complex, editable `Predicate`. Represents an inner node in the predicate tree, that can process changes of `Query` objects
* held by its child nodes. It can notify the parent tree node about changes to the held `Query`.
*/
export class EditableClausePredicate extends EditablePredicate {
_operator;
_bracketSubPredicateText;
_predicates;
_childUpdated$;
_childCounter;
_query;
constructor(_operator, parentNotifier, initiallyVisible = true, _bracketSubPredicateText = false) {
super(parentNotifier, initiallyVisible);
this._operator = _operator;
this._bracketSubPredicateText = _bracketSubPredicateText;
this._predicates = new Map();
this._childUpdated$ = new Subject();
this._childCounter = new IncrementingCounter();
this._query = Query.emptyQuery();
this.initializeFilterTextSegmentsGenerator();
this._childUpdated$.subscribe(() => {
this.updateQueryAndNotify();
});
}
get query() {
return this._query;
}
destroy() {
super.destroy();
this._childUpdated$.complete();
}
show() {
super.show();
this.showAll();
}
/**
* Shows the predicates with the given ids. Skips ids that don't exist.
* @param predicateIds the ids of the predicates that should be shown.
*/
showPredicates(predicateIds) {
predicateIds.forEach(id => {
if (this._predicates.has(id)) {
this._predicates.get(id).show();
}
});
}
/**
* Adds new child predicate of type {@link EditableElementaryPredicate}
* @param initiallyVisible whether the new predicate should be initially visible
*/
addNewElementaryPredicate(initiallyVisible = true) {
return this.addPredicate(new EditableElementaryPredicate(this._childUpdated$, initiallyVisible));
}
/**
* Adds new child predicate of type {@link EditableClausePredicate}
* @param operator the operator of the child clause predicate
* @param initiallyVisible whether the new predicate should be initially visible
*/
addNewClausePredicate(operator, initiallyVisible = true) {
return this.addPredicate(new EditableClausePredicate(operator, this._childUpdated$, initiallyVisible));
}
/**
* Generates an id for the new predicate, adds it into the map and updates the query
*
* If you want to add an editable predicate, use one of the other methods, so that this predicate can react to changes.
* @param predicate the new predicate
*/
addPredicate(predicate) {
const id = this._childCounter.next();
this._predicates.set(id, predicate);
this.updateQueryAndNotify();
return id;
}
removePredicate(id) {
const r = this._predicates.delete(id);
this.updateQueryAndNotify();
return r;
}
getPredicateMap() {
return this._predicates;
}
/**
* Updates the `Query` and notifies the parent.
*/
updateQueryAndNotify() {
this.updateQuery();
this.notifyParentPredicate();
}
/**
* Updates the value of the [_query]{@link ClausePredicate#_query} attribute.
*
* See [combineQueries()]{@link Query#combineQueries} for more information.
*/
updateQuery() {
this._query = Query.combineQueries(this.queries, this._operator);
}
/**
* @returns the `Array` of {@link Query} objects stored within this object's [_predicates]{@link ClausePredicate#_predicates} attribute.
*/
get queries() {
return Array.from(this._predicates.values()).map(p => p.query);
}
/**
* Sets this predicate and all its sub-predicates to visible.
*/
showAll() {
for (const p of this._predicates.values()) {
p.show();
}
}
initializeFilterTextSegmentsGenerator() {
this._filterTextSegmentsGenerator = () => {
return Predicate.combineTextSegmentsWithBooleanOperator(this._predicates.values(), this._operator, this._bracketSubPredicateText);
};
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdGFibGUtY2xhdXNlLXByZWRpY2F0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25ldGdyaWYtY29tcG9uZW50cy1jb3JlL3NyYy9saWIvc2VhcmNoL21vZGVscy9wcmVkaWNhdGUvZWRpdGFibGUtY2xhdXNlLXByZWRpY2F0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sRUFBQywyQkFBMkIsRUFBQyxNQUFNLGlDQUFpQyxDQUFDO0FBQzVFLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLHVDQUF1QyxDQUFDO0FBQzFFLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyQyxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUN2RCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBR3RDOzs7R0FHRztBQUNILE1BQU0sT0FBTyx1QkFBd0IsU0FBUSxpQkFBaUI7SUFPcEM7SUFHQTtJQVJaLFdBQVcsQ0FBeUI7SUFDcEMsY0FBYyxDQUFnQjtJQUM5QixhQUFhLENBQXNCO0lBQ25DLE1BQU0sQ0FBUTtJQUV4QixZQUFzQixTQUEwQixFQUNwQyxjQUE4QixFQUM5QixnQkFBZ0IsR0FBRyxJQUFJLEVBQ2IsMkJBQTJCLEtBQUs7UUFDbEQsS0FBSyxDQUFDLGNBQWMsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1FBSnRCLGNBQVMsR0FBVCxTQUFTLENBQWlCO1FBRzFCLDZCQUF3QixHQUF4Qix3QkFBd0IsQ0FBUTtRQUVsRCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksR0FBRyxFQUFxQixDQUFDO1FBQ2hELElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUMxQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksbUJB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O0lBQ08sT0FBTztRQUNiLEtBQUssTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUN2QyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDWjtJQUNMLENBQUM7SUFFTyxxQ0FBcUM7UUFDekMsSUFBSSxDQUFDLDRCQUE0QixHQUFHLEdBQUcsRUFBRTtZQUNyQyxPQUFPLFNBQVMsQ0FBQyxzQ0FBc0MsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxFQUM3RSxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1FBQ3ZELENBQUMsQ0FBQztJQUNOLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Qm9vbGVhbk9wZXJhdG9yfSBmcm9tICcuLi9ib29sZWFuLW9wZXJhdG9yJztcbmltcG9ydCB7U3ViamVjdH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge0VkaXRhYmxlRWxlbWVudGFyeVByZWRpY2F0ZX0gZnJvbSAnLi9lZGl0YWJsZS1lbGVtZW50YXJ5LXByZWRpY2F0ZSc7XG5pbXBvcnQge0luY3JlbWVudGluZ0NvdW50ZXJ9IGZyb20gJy4uLy4uLy4uL3V0aWxpdHkvaW5jcmVtZW50aW5nLWNvdW50ZXInO1xuaW1wb3J0IHtRdWVyeX0gZnJvbSAnLi4vcXVlcnkvcXVlcnknO1xuaW1wb3J0IHtFZGl0YWJsZVByZWRpY2F0ZX0gZnJvbSAnLi9lZGl0YWJsZS1wcmVkaWNhdGUnO1xuaW1wb3J0IHtQcmVkaWNhdGV9IGZyb20gJy4vcHJlZGljYXRlJztcblxuXG4vKipcbiAqIEEgY29tcGxleCwgZWRpdGFibGUgYFByZWRpY2F0ZWAuIFJlcHJlc2VudHMgYW4gaW5uZXIgbm9kZSBpbiB0aGUgcHJlZGljYXRlIHRyZWUsIHRoYXQgY2FuIHByb2Nlc3MgY2hhbmdlcyBvZiBgUXVlcnlgIG9iamVjdHNcbiAqIGhlbGQgYnkgaXRzIGNoaWxkIG5vZGVzLiBJdCBjYW4gbm90aWZ5IHRoZSBwYXJlbnQgdHJlZSBub2RlIGFib3V0IGNoYW5nZXMgdG8gdGhlIGhlbGQgYFF1ZXJ5YC5cbiAqL1xuZXhwb3J0IGNsYXNzIEVkaXRhYmxlQ2xhdXNlUHJlZGljYXRlIGV4dGVuZHMgRWRpdGFibGVQcmVkaWNhdGUge1xuXG4gICAgcHJvdGVjdGVkIF9wcmVkaWNhdGVzOiBNYXA8bnVtYmVyLCBQcmVkaWNhdGU+O1xuICAgIHByb3RlY3RlZCBfY2hpbGRVcGRhdGVkJDogU3ViamVjdDx2b2lkPjtcbiAgICBwcm90ZWN0ZWQgX2NoaWxkQ291bnRlcjogSW5jcmVtZW50aW5nQ291bnRlcjtcbiAgICBwcm90ZWN0ZWQgX3F1ZXJ5OiBRdWVyeTtcblxuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBfb3BlcmF0b3I6IEJvb2xlYW5PcGVyYXRvcixcbiAgICAgICAgICAgICAgICBwYXJlbnROb3RpZmllcj86IFN1YmplY3Q8dm9pZD4sXG4gICAgICAgICAgICAgICAgaW5pdGlhbGx5VmlzaWJsZSA9IHRydWUsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9icmFja2V0U3ViUHJlZGljYXRlVGV4dCA9IGZhbHNlKSB7XG4gICAgICAgIHN1cGVyKHBhcmVudE5vdGlmaWVyLCBpbml0aWFsbHlWaXNpYmxlKTtcbiAgICAgICAgdGhpcy5fcHJlZGljYXRlcyA9IG5ldyBNYXA8bnVtYmVyLCBQcmVkaWNhdGU+KCk7XG4gICAgICAgIHRoaXMuX2NoaWxkVXBkYXRlZCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICAgICAgICB0aGlzLl9jaGlsZENvdW50ZXIgPSBuZXcgSW5jcmVtZW50aW5nQ291bnRlcigpO1xuICAgICAgICB0aGlzLl9xdWVyeSA9IFF1ZXJ5LmVtcHR5UXVlcnkoKTtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplRmlsdGVyVGV4dFNlZ21lbnRzR2VuZXJhdG9yKCk7XG5cbiAgICAgICAgdGhpcy5fY2hpbGRVcGRhdGVkJC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVRdWVyeUFuZE5vdGlmeSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXQgcXVlcnkoKTogUXVlcnkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcXVlcnk7XG4gICAgfVxuXG4gICAgcHVibGljIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHN1cGVyLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5fY2hpbGRVcGRhdGVkJC5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzaG93KCkge1xuICAgICAgICBzdXBlci5zaG93KCk7XG4gICAgICAgIHRoaXMuc2hvd0FsbCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNob3dzIHRoZSBwcmVkaWNhdGVzIHdpdGggdGhlIGdpdmVuIGlkcy4gU2tpcHMgaWRzIHRoYXQgZG9uJ3QgZXhpc3QuXG4gICAgICogQHBhcmFtIHByZWRpY2F0ZUlkcyB0aGUgaWRzIG9mIHRoZSBwcmVkaWNhdGVzIHRoYXQgc2hvdWxkIGJlIHNob3duLlxuICAgICAqL1xuICAgIHB1YmxpYyBzaG93UHJlZGljYXRlcyhwcmVkaWNhdGVJZHM6IEFycmF5PG51bWJlcj4pOiB2b2lkIHtcbiAgICAgICAgcHJlZGljYXRlSWRzLmZvckVhY2goaWQgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3ByZWRpY2F0ZXMuaGFzKGlkKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3ByZWRpY2F0ZXMuZ2V0KGlkKS5zaG93KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgbmV3IGNoaWxkIHByZWRpY2F0ZSBvZiB0eXBlIHtAbGluayBFZGl0YWJsZUVsZW1lbnRhcnlQcmVkaWNhdGV9XG4gICAgICogQHBhcmFtIGluaXRpYWxseVZpc2libGUgd2hldGhlciB0aGUgbmV3IHByZWRpY2F0ZSBzaG91bGQgYmUgaW5pdGlhbGx5IHZpc2libGVcbiAgICAgKi9cbiAgICBhZGROZXdFbGVtZW50YXJ5UHJlZGljYXRlKGluaXRpYWxseVZpc2libGUgPSB0cnVlKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkUHJlZGljYXRlKG5ldyBFZGl0YWJsZUVsZW1lbnRhcnlQcmVkaWNhdGUodGhpcy5fY2hpbGRVcGRhdGVkJCwgaW5pdGlhbGx5VmlzaWJsZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgbmV3IGNoaWxkIHByZWRpY2F0ZSBvZiB0eXBlIHtAbGluayBFZGl0YWJsZUNsYXVzZVByZWRpY2F0ZX1cbiAgICAgKiBAcGFyYW0gb3BlcmF0b3IgdGhlIG9wZXJhdG9yIG9mIHRoZSBjaGlsZCBjbGF1c2UgcHJlZGljYXRlXG4gICAgICogQHBhcmFtIGluaXRpYWxseVZpc2libGUgd2hldGhlciB0aGUgbmV3IHByZWRpY2F0ZSBzaG91bGQgYmUgaW5pdGlhbGx5IHZpc2libGVcbiAgICAgKi9cbiAgICBhZGROZXdDbGF1c2VQcmVkaWNhdGUob3BlcmF0b3I6IEJvb2xlYW5PcGVyYXRvciwgaW5pdGlhbGx5VmlzaWJsZSA9IHRydWUpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRQcmVkaWNhdGUobmV3IEVkaXRhYmxlQ2xhdXNlUHJlZGljYXRlKG9wZXJhdG9yLCB0aGlzLl9jaGlsZFVwZGF0ZWQkLCBpbml0aWFsbHlWaXNpYmxlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGVzIGFuIGlkIGZvciB0aGUgbmV3IHByZWRpY2F0ZSwgYWRkcyBpdCBpbnRvIHRoZSBtYXAgYW5kIHVwZGF0ZXMgdGhlIHF1ZXJ5XG4gICAgICpcbiAgICAgKiBJZiB5b3Ugd2FudCB0byBhZGQgYW4gZWRpdGFibGUgcHJlZGljYXRlLCB1c2Ugb25lIG9mIHRoZSBvdGhlciBtZXRob2RzLCBzbyB0aGF0IHRoaXMgcHJlZGljYXRlIGNhbiByZWFjdCB0byBjaGFuZ2VzLlxuICAgICAqIEBwYXJhbSBwcmVkaWNhdGUgdGhlIG5ldyBwcmVkaWNhdGVcbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkUHJlZGljYXRlKHByZWRpY2F0ZTogUHJlZGljYXRlKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgaWQgPSB0aGlzLl9jaGlsZENvdW50ZXIubmV4dCgpO1xuICAgICAgICB0aGlzLl9wcmVkaWNhdGVzLnNldChpZCwgcHJlZGljYXRlKTtcbiAgICAgICAgdGhpcy51cGRhdGVRdWVyeUFuZE5vdGlmeSgpO1xuICAgICAgICByZXR1cm4gaWQ7XG4gICAgfVxuXG4gICAgcmVtb3ZlUHJlZGljYXRlKGlkOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgciA9IHRoaXMuX3ByZWRpY2F0ZXMuZGVsZXRlKGlkKTtcbiAgICAgICAgdGhpcy51cGRhdGVRdWVyeUFuZE5vdGlmeSgpO1xuICAgICAgICByZXR1cm4gcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UHJlZGljYXRlTWFwKCk6IE1hcDxudW1iZXIsIFByZWRpY2F0ZT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHJlZGljYXRlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSBgUXVlcnlgIGFuZCBub3RpZmllcyB0aGUgcGFyZW50LlxuICAgICAqL1xuICAgIHByb3RlY3RlZCB1cGRhdGVRdWVyeUFuZE5vdGlmeSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy51cGRhdGVRdWVyeSgpO1xuICAgICAgICB0aGlzLm5vdGlmeVBhcmVudFByZWRpY2F0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIHZhbHVlIG9mIHRoZSBbX3F1ZXJ5XXtAbGluayBDbGF1c2VQcmVkaWNhdGUjX3F1ZXJ5fSBhdHRyaWJ1dGUuXG4gICAgICpcbiAgICAgKiBTZWUgW2NvbWJpbmVRdWVyaWVzKClde0BsaW5rIFF1ZXJ5I2NvbWJpbmVRdWVyaWVzfSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgdXBkYXRlUXVlcnkoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3F1ZXJ5ID0gUXVlcnkuY29tYmluZVF1ZXJpZXModGhpcy5xdWVyaWVzLCB0aGlzLl9vcGVyYXRvcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMgdGhlIGBBcnJheWAgb2Yge0BsaW5rIFF1ZXJ5fSBvYmplY3RzIHN0b3JlZCB3aXRoaW4gdGhpcyBvYmplY3QncyBbX3ByZWRpY2F0ZXNde0BsaW5rIENsYXVzZVByZWRpY2F0ZSNfcHJlZGljYXRlc30gYXR0cmlidXRlLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXQgcXVlcmllcygpOiBBcnJheTxRdWVyeT4ge1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLl9wcmVkaWNhdGVzLnZhbHVlcygpKS5tYXAocCA9PiBwLnF1ZXJ5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoaXMgcHJlZGljYXRlIGFuZCBhbGwgaXRzIHN1Yi1wcmVkaWNhdGVzIHRvIHZpc2libGUuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHNob3dBbGwoKTogdm9pZCB7XG4gICAgICAgIGZvciAoY29uc3QgcCBvZiB0aGlzLl9wcmVkaWNhdGVzLnZhbHVlcygpKSB7XG4gICAgICAgICAgICBwLnNob3coKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdGlhbGl6ZUZpbHRlclRleHRTZWdtZW50c0dlbmVyYXRvcigpIHtcbiAgICAgICAgdGhpcy5fZmlsdGVyVGV4dFNlZ21lbnRzR2VuZXJhdG9yID0gKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIFByZWRpY2F0ZS5jb21iaW5lVGV4dFNlZ21lbnRzV2l0aEJvb2xlYW5PcGVyYXRvcih0aGlzLl9wcmVkaWNhdGVzLnZhbHVlcygpLFxuICAgICAgICAgICAgICAgIHRoaXMuX29wZXJhdG9yLCB0aGlzLl9icmFja2V0U3ViUHJlZGljYXRlVGV4dCk7XG4gICAgICAgIH07XG4gICAgfVxufVxuIl19