@ux-aspects/ux-aspects
Version:
Open source user interface framework for building modern, responsive, mobile big data applications
85 lines • 9.69 kB
JavaScript
import { Injectable } from '@angular/core';
import { BehaviorSubject, Subject } from 'rxjs';
import * as i0 from "@angular/core";
export class SearchBuilderService {
constructor() {
this.query = {};
this.queryChange = new Subject();
this.validationChange = new BehaviorSubject(true);
this._componentId = 0;
this._components = [];
this._validation = {};
}
/**
* Add a component to the internal list of components
*/
registerComponent(component) {
// ensure there are no components with a matching name
if (this._components.find(cmp => cmp.name === component.name)) {
throw new Error(`Search builder components must have a unique name. The name ${component.name} has already been used.`);
}
// if unique then add the component to the list
this._components.push(component);
}
/**
* Bulk registration of components
* (Just a helper method)
*/
registerComponents(components) {
components.forEach(component => this.registerComponent(component));
}
/**
* Get a registered component class
*/
getComponent(name) {
// find the component
const component = this._components.find(cmp => cmp.name === name);
// if there is no match throw an exception
if (!component) {
throw new Error(`No search build component with the name ${name} exists`);
}
// ensure config is defined - at least to an empty object
component.config = component.config || {};
return component;
}
/**
* Update the internal search query state
* note that the query will be immutable
*/
setQuery(query) {
this.query = Object.assign({}, query);
}
/**
* Return the current query state
*/
getQuery() {
return this.query;
}
/**
* Trigger the observable to indicate the query has been updated
*/
queryHasChanged() {
this.queryChange.next(this.query);
}
/**
* Store the validation state of the query
*/
setValid(id, valid) {
// store the state for this specific component
this._validation[id] = valid;
// evaluate the entire validation state
this.validationChange.next(!Object.keys(this._validation).some(key => !this._validation[key]));
}
/**
* Generate a unique id for each component
*/
generateComponentId() {
return this._componentId++;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: SearchBuilderService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: SearchBuilderService }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: SearchBuilderService, decorators: [{
type: Injectable
}] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLWJ1aWxkZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3NlYXJjaC1idWlsZGVyL3NlYXJjaC1idWlsZGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQzs7QUFLaEQsTUFBTSxPQUFPLG9CQUFvQjtJQURqQztRQUdFLFVBQUssR0FBdUIsRUFBRSxDQUFDO1FBQy9CLGdCQUFXLEdBQWdDLElBQUksT0FBTyxFQUFzQixDQUFDO1FBQzdFLHFCQUFnQixHQUE2QixJQUFJLGVBQWUsQ0FBVSxJQUFJLENBQUMsQ0FBQztRQUV4RSxpQkFBWSxHQUFXLENBQUMsQ0FBQztRQUNoQixnQkFBVyxHQUF1QyxFQUFFLENBQUM7UUFDOUQsZ0JBQVcsR0FBK0IsRUFBRSxDQUFDO0tBbUZ0RDtJQWpGQzs7T0FFRztJQUNILGlCQUFpQixDQUFDLFNBQTJDO1FBRTNELHNEQUFzRDtRQUN0RCxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUM5RCxNQUFNLElBQUksS0FBSyxDQUFDLCtEQUErRCxTQUFTLENBQUMsSUFBSSx5QkFBeUIsQ0FBQyxDQUFDO1FBQzFILENBQUM7UUFFRCwrQ0FBK0M7UUFDL0MsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVEOzs7T0FHRztJQUNILGtCQUFrQixDQUFDLFVBQThDO1FBQy9ELFVBQVUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRUQ7O09BRUc7SUFDSCxZQUFZLENBQUMsSUFBWTtRQUV2QixxQkFBcUI7UUFDckIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDO1FBRWxFLDBDQUEwQztRQUMxQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDZixNQUFNLElBQUksS0FBSyxDQUFDLDJDQUEyQyxJQUFJLFNBQVMsQ0FBQyxDQUFDO1FBQzVFLENBQUM7UUFFRCx5REFBeUQ7UUFDekQsU0FBUyxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQztRQUUxQyxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsUUFBUSxDQUFDLEtBQXlCO1FBQ2hDLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxlQUFlO1FBQ2IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRDs7T0FFRztJQUNILFFBQVEsQ0FBQyxFQUFVLEVBQUUsS0FBYztRQUVqQyw4Q0FBOEM7UUFDOUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUM7UUFFN0IsdUNBQXVDO1FBQ3ZDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pHLENBQUM7SUFFRDs7T0FFRztJQUNILG1CQUFtQjtRQUNqQixPQUFPLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUM3QixDQUFDOytHQTFGVSxvQkFBb0I7bUhBQXBCLG9CQUFvQjs7NEZBQXBCLG9CQUFvQjtrQkFEaEMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgU2VhcmNoQnVpbGRlckNvbXBvbmVudERlZmluaXRpb24gfSBmcm9tICcuL2ludGVyZmFjZXMvY29tcG9uZW50LWRlZmluaXRpb24uaW50ZXJmYWNlJztcbmltcG9ydCB7IFNlYXJjaEJ1aWxkZXJRdWVyeSB9IGZyb20gJy4vaW50ZXJmYWNlcy9xdWVyeS5pbnRlcmZhY2UnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgU2VhcmNoQnVpbGRlclNlcnZpY2Uge1xuXG4gIHF1ZXJ5OiBTZWFyY2hCdWlsZGVyUXVlcnkgPSB7fTtcbiAgcXVlcnlDaGFuZ2U6IFN1YmplY3Q8U2VhcmNoQnVpbGRlclF1ZXJ5PiA9IG5ldyBTdWJqZWN0PFNlYXJjaEJ1aWxkZXJRdWVyeT4oKTtcbiAgdmFsaWRhdGlvbkNoYW5nZTogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPih0cnVlKTtcblxuICBwcml2YXRlIF9jb21wb25lbnRJZDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSByZWFkb25seSBfY29tcG9uZW50czogU2VhcmNoQnVpbGRlckNvbXBvbmVudERlZmluaXRpb25bXSA9IFtdO1xuICBwcml2YXRlIF92YWxpZGF0aW9uOiB7IFtrZXk6IG51bWJlcl06IGJvb2xlYW4gfSA9IHt9O1xuXG4gIC8qKlxuICAgKiBBZGQgYSBjb21wb25lbnQgdG8gdGhlIGludGVybmFsIGxpc3Qgb2YgY29tcG9uZW50c1xuICAgKi9cbiAgcmVnaXN0ZXJDb21wb25lbnQoY29tcG9uZW50OiBTZWFyY2hCdWlsZGVyQ29tcG9uZW50RGVmaW5pdGlvbik6IHZvaWQge1xuXG4gICAgLy8gZW5zdXJlIHRoZXJlIGFyZSBubyBjb21wb25lbnRzIHdpdGggYSBtYXRjaGluZyBuYW1lXG4gICAgaWYgKHRoaXMuX2NvbXBvbmVudHMuZmluZChjbXAgPT4gY21wLm5hbWUgPT09IGNvbXBvbmVudC5uYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTZWFyY2ggYnVpbGRlciBjb21wb25lbnRzIG11c3QgaGF2ZSBhIHVuaXF1ZSBuYW1lLiBUaGUgbmFtZSAke2NvbXBvbmVudC5uYW1lfSBoYXMgYWxyZWFkeSBiZWVuIHVzZWQuYCk7XG4gICAgfVxuXG4gICAgLy8gaWYgdW5pcXVlIHRoZW4gYWRkIHRoZSBjb21wb25lbnQgdG8gdGhlIGxpc3RcbiAgICB0aGlzLl9jb21wb25lbnRzLnB1c2goY29tcG9uZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWxrIHJlZ2lzdHJhdGlvbiBvZiBjb21wb25lbnRzXG4gICAqIChKdXN0IGEgaGVscGVyIG1ldGhvZClcbiAgICovXG4gIHJlZ2lzdGVyQ29tcG9uZW50cyhjb21wb25lbnRzOiBTZWFyY2hCdWlsZGVyQ29tcG9uZW50RGVmaW5pdGlvbltdKTogdm9pZCB7XG4gICAgY29tcG9uZW50cy5mb3JFYWNoKGNvbXBvbmVudCA9PiB0aGlzLnJlZ2lzdGVyQ29tcG9uZW50KGNvbXBvbmVudCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHJlZ2lzdGVyZWQgY29tcG9uZW50IGNsYXNzXG4gICAqL1xuICBnZXRDb21wb25lbnQobmFtZTogc3RyaW5nKTogU2VhcmNoQnVpbGRlckNvbXBvbmVudERlZmluaXRpb24ge1xuXG4gICAgLy8gZmluZCB0aGUgY29tcG9uZW50XG4gICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5fY29tcG9uZW50cy5maW5kKGNtcCA9PiBjbXAubmFtZSA9PT0gbmFtZSk7XG5cbiAgICAvLyBpZiB0aGVyZSBpcyBubyBtYXRjaCB0aHJvdyBhbiBleGNlcHRpb25cbiAgICBpZiAoIWNvbXBvbmVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBzZWFyY2ggYnVpbGQgY29tcG9uZW50IHdpdGggdGhlIG5hbWUgJHtuYW1lfSBleGlzdHNgKTtcbiAgICB9XG5cbiAgICAvLyBlbnN1cmUgY29uZmlnIGlzIGRlZmluZWQgLSBhdCBsZWFzdCB0byBhbiBlbXB0eSBvYmplY3RcbiAgICBjb21wb25lbnQuY29uZmlnID0gY29tcG9uZW50LmNvbmZpZyB8fCB7fTtcblxuICAgIHJldHVybiBjb21wb25lbnQ7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHRoZSBpbnRlcm5hbCBzZWFyY2ggcXVlcnkgc3RhdGVcbiAgICogbm90ZSB0aGF0IHRoZSBxdWVyeSB3aWxsIGJlIGltbXV0YWJsZVxuICAgKi9cbiAgc2V0UXVlcnkocXVlcnk6IFNlYXJjaEJ1aWxkZXJRdWVyeSk6IHZvaWQge1xuICAgIHRoaXMucXVlcnkgPSBPYmplY3QuYXNzaWduKHt9LCBxdWVyeSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBjdXJyZW50IHF1ZXJ5IHN0YXRlXG4gICAqL1xuICBnZXRRdWVyeSgpOiBTZWFyY2hCdWlsZGVyUXVlcnkge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXIgdGhlIG9ic2VydmFibGUgdG8gaW5kaWNhdGUgdGhlIHF1ZXJ5IGhhcyBiZWVuIHVwZGF0ZWRcbiAgICovXG4gIHF1ZXJ5SGFzQ2hhbmdlZCgpOiB2b2lkIHtcbiAgICB0aGlzLnF1ZXJ5Q2hhbmdlLm5leHQodGhpcy5xdWVyeSk7XG4gIH1cblxuICAvKipcbiAgICogU3RvcmUgdGhlIHZhbGlkYXRpb24gc3RhdGUgb2YgdGhlIHF1ZXJ5XG4gICAqL1xuICBzZXRWYWxpZChpZDogbnVtYmVyLCB2YWxpZDogYm9vbGVhbik6IHZvaWQge1xuXG4gICAgLy8gc3RvcmUgdGhlIHN0YXRlIGZvciB0aGlzIHNwZWNpZmljIGNvbXBvbmVudFxuICAgIHRoaXMuX3ZhbGlkYXRpb25baWRdID0gdmFsaWQ7XG5cbiAgICAvLyBldmFsdWF0ZSB0aGUgZW50aXJlIHZhbGlkYXRpb24gc3RhdGVcbiAgICB0aGlzLnZhbGlkYXRpb25DaGFuZ2UubmV4dCghT2JqZWN0LmtleXModGhpcy5fdmFsaWRhdGlvbikuc29tZShrZXkgPT4gIXRoaXMuX3ZhbGlkYXRpb25ba2V5XSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGEgdW5pcXVlIGlkIGZvciBlYWNoIGNvbXBvbmVudFxuICAgKi9cbiAgZ2VuZXJhdGVDb21wb25lbnRJZCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9jb21wb25lbnRJZCsrO1xuICB9XG59XG4iXX0=