@calf/angular
Version:
Angular module of Calf framework.
112 lines (111 loc) • 2.94 kB
JavaScript
import { Subject } from "rxjs";
// Data
import { FilterItem } from "./filter-item.class";
/** Filter utility */
export class Filter {
constructor() {
// Filter items
this.items = {};
// On filter change
this.changeSource = new Subject();
this.$change = this.changeSource.asObservable();
// On params
this.paramsSource = new Subject();
this.$params = this.paramsSource.asObservable();
}
/**
* Register filter
* @param name
* @param type
* @param value
* @param service
*/
register(name, type, value, service) {
this.items[name] = new FilterItem(type, value, service);
}
/**
* Remove filter
* @param name
*/
remove(name) {
delete this.items[name];
}
/**
* Check if filter is set
* @param name
*/
isSet(name) {
return name in this.items && this.items[name].isSet();
}
/**
* Check if filter is registered
* @param name
*/
isRegistered(name) {
return name in this.items;
}
/**
* Get filter value
* @param name
*/
get(name) {
// Check if filter exists
if (!this.isRegistered(name)) {
throw new Error(`Filter '${name}' not registered. Did you forget to call 'register(${name})?'`);
}
// Get value
return this.items[name].value;
}
/**
* Set value
* @param name
* @param value
* @param omit
*/
set(name, value, omit = false) {
// Check if filter exists
if (!this.isRegistered(name)) {
throw new Error(`Filter '${name}' not registered. Did you forget to call 'register(${name})?'`);
}
// Set value
this.items[name].value = value;
// Check whether to omit change
if (omit) {
return;
}
// Call on change hook
this.onChange();
}
/**
* Params
* @param params
*/
params(params) {
// Iterate filters
for (let name in this.items) {
// Check if name is in params
if (!params.has(name)) {
continue;
}
// Set filter value
this.items[name].fromParam(params.getAll(name));
}
// Emit params
this.paramsSource.next();
}
/** On change */
onChange() {
// Init extras
let extras = { queryParams: {} };
// Iterate filters
for (let name in this.items) {
// Check if item is set
if (this.items[name].isSet()) {
// Add to extras
extras.queryParams[name] = this.items[name].toParam();
}
}
// Emit change
this.changeSource.next(extras);
}
}