@firestitch/filter
Version:
214 lines • 18.9 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { isString } from 'lodash-es';
import { ItemType } from '../models/filter-item';
export class QueryParams {
/**
* @param {?} _router
* @param {?} _route
* @param {?} _filterItems
*/
constructor(_router, _route, _filterItems) {
this._router = _router;
this._route = _route;
this._filterItems = _filterItems;
this._queryKeys = [];
this._queryParamsToFilter(this._route.snapshot.queryParams, this._filterItems);
}
/**
* Update query with filter values
* @param {?} filterParams
* @return {?}
*/
updateQueryParams(filterParams) {
// transform selected filter values to query string
/** @type {?} */
const newParams = this._filterToQueryParams(filterParams, this._filterItems);
// Remove empty keys
this._clearKeys(newParams);
// Store query keys
this._queryKeys = Object.keys(newParams);
// Update query
this._router.navigate([], {
replaceUrl: true,
relativeTo: this._route,
queryParams: newParams,
queryParamsHandling: 'merge'
}).then((/**
* @return {?}
*/
() => { }));
}
/**
* Transformation for selected filter values to query string
* @private
* @param {?} params
* @param {?} items
* @return {?}
*/
_filterToQueryParams(params, items) {
// selected filter keys
/** @type {?} */
const filterKeys = Object.keys(params);
return filterKeys.reduce((/**
* @param {?} acc
* @param {?} filterKey
* @return {?}
*/
(acc, filterKey) => {
// looking filter item
/** @type {?} */
const filterItem = items.find((/**
* @param {?} item
* @return {?}
*/
(item) => item.name === filterKey));
if (filterItem) {
if (filterItem.type === ItemType.Range) {
acc[filterKey] = [params[filterKey].min, params[filterKey].max].join(',');
}
else if (filterItem.isTypeSelect() && filterItem.multiple && filterItem.model && filterItem.model.length > 0) {
acc[filterKey] = filterItem.model.join(',');
}
else if (filterItem.isTypeAutocomplete()) {
acc[filterKey] = [filterItem.model.value, filterItem.model.name].join(',');
}
else if (filterItem.type === ItemType.AutoCompleteChips) {
acc[filterKey] = filterItem.model.map((/**
* @param {?} item
* @return {?}
*/
(item) => [item.value, item.name].join(','))).join(';');
}
else {
acc[filterKey] = params[filterKey];
}
}
return acc;
}), {});
}
/**
* Parse query and update filter values
* @private
* @param {?} params
* @param {?} items
* @return {?}
*/
_queryParamsToFilter(params, items) {
this._queryKeys = Object.keys(params);
return this._queryKeys.forEach((/**
* @param {?} queryKey
* @return {?}
*/
(queryKey) => {
/** @type {?} */
const filterItem = items.find((/**
* @param {?} item
* @return {?}
*/
(item) => item.name === queryKey));
if (filterItem) {
if (filterItem.type === ItemType.Select && filterItem.multiple) {
/** @type {?} */
const values = params[queryKey]
.split(',');
filterItem.parseAndSetValue(values);
}
else if (filterItem.type === ItemType.Range) {
if (params[queryKey] && isString(params[queryKey])) {
/** @type {?} */
const filterParts = params[queryKey].split(',');
filterItem.model = {
min: filterParts[0],
max: filterParts[1]
};
}
}
else if (filterItem.type === ItemType.Chips) {
/** @type {?} */
const chipIds = params[queryKey]
.split(',')
.map((/**
* @param {?} value
* @return {?}
*/
(value) => +value));
filterItem.parseAndSetValue(chipIds);
}
else if (filterItem.type === ItemType.Checkbox) {
filterItem.parseAndSetValue(params[queryKey] === 'true');
}
else if (filterItem.type === ItemType.AutoComplete) {
/** @type {?} */
const filterParts = params[queryKey].split(',');
filterItem.model = {
name: filterParts[1],
value: +filterParts[0]
};
}
else if (filterItem.type === ItemType.AutoCompleteChips) {
/** @type {?} */
const filterParts = params[queryKey].split(';');
filterItem.model = filterParts.reduce((/**
* @param {?} acc
* @param {?} value
* @return {?}
*/
(acc, value) => {
/** @type {?} */
const chipParts = value.split(',');
acc.push({
name: chipParts[1],
value: +chipParts[0],
});
return acc;
}), []);
}
else {
filterItem.parseAndSetValue(params[queryKey]);
}
}
}));
}
/**
* @private
* @param {?} params
* @return {?}
*/
_clearKeys(params) {
this._queryKeys.forEach((/**
* @param {?} key
* @return {?}
*/
(key) => {
if (!params[key]) {
params[key] = null;
}
}));
}
}
if (false) {
/**
* @type {?}
* @private
*/
QueryParams.prototype._queryKeys;
/**
* @type {?}
* @private
*/
QueryParams.prototype._router;
/**
* @type {?}
* @private
*/
QueryParams.prototype._route;
/**
* @type {?}
* @private
*/
QueryParams.prototype._filterItems;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktcGFyYW1zLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGZpcmVzdGl0Y2gvZmlsdGVyLyIsInNvdXJjZXMiOlsiYXBwL21vZGVscy9xdWVyeS1wYXJhbXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUNBLE9BQU8sRUFBYSxRQUFRLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDaEQsT0FBTyxFQUFzQixRQUFRLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUdyRSxNQUFNLE9BQU8sV0FBVzs7Ozs7O0lBR3RCLFlBQ1UsT0FBZSxFQUNmLE1BQXNCLEVBQ3RCLFlBQWtDO1FBRmxDLFlBQU8sR0FBUCxPQUFPLENBQVE7UUFDZixXQUFNLEdBQU4sTUFBTSxDQUFnQjtRQUN0QixpQkFBWSxHQUFaLFlBQVksQ0FBc0I7UUFMcEMsZUFBVSxHQUFHLEVBQUUsQ0FBQztRQU90QixJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNqRixDQUFDOzs7Ozs7SUFNTSxpQkFBaUIsQ0FBQyxZQUFZOzs7Y0FFN0IsU0FBUyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUU1RSxvQkFBb0I7UUFDcEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUUzQixtQkFBbUI7UUFDbkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRXpDLGVBQWU7UUFDZixJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUU7WUFDeEIsVUFBVSxFQUFFLElBQUk7WUFDaEIsVUFBVSxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQ3ZCLFdBQVcsRUFBRSxTQUFTO1lBQ3RCLG1CQUFtQixFQUFFLE9BQU87U0FDN0IsQ0FBQyxDQUFDLElB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aUIsRUFBRTs7MEJBQ25ELFdBQVcsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQztvQkFFL0MsVUFBVSxDQUFDLEtBQUssR0FBRyxXQUFXLENBQUMsTUFBTTs7Ozs7b0JBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUU7OzhCQUU3QyxTQUFTLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7d0JBRWxDLEdBQUcsQ0FBQyxJQUFJLENBQUM7NEJBQ1AsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7NEJBQ2xCLEtBQUssRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7eUJBQ3JCLENBQUMsQ0FBQzt3QkFFSCxPQUFPLEdBQUcsQ0FBQztvQkFDYixDQUFDLEdBQUUsRUFBRSxDQUFDLENBQUE7aUJBRVA7cUJBQU07b0JBQ0wsVUFBVSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO2lCQUMvQzthQUNGO1FBQ0gsQ0FBQyxFQUFDLENBQUM7SUFDTCxDQUFDOzs7Ozs7SUFFTyxVQUFVLENBQUMsTUFBTTtRQUN2QixJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU87Ozs7UUFBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQzlCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQ2hCLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7YUFDcEI7UUFDSCxDQUFDLEVBQUMsQ0FBQTtJQUNKLENBQUM7Q0FDRjs7Ozs7O0lBdklDLGlDQUF3Qjs7Ozs7SUFHdEIsOEJBQXVCOzs7OztJQUN2Qiw2QkFBOEI7Ozs7O0lBQzlCLG1DQUEwQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgY2xvbmVEZWVwLCBpc1N0cmluZyB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBGc0ZpbHRlckNvbmZpZ0l0ZW0sIEl0ZW1UeXBlIH0gZnJvbSAnLi4vbW9kZWxzL2ZpbHRlci1pdGVtJztcblxuXG5leHBvcnQgY2xhc3MgUXVlcnlQYXJhbXMge1xuICBwcml2YXRlIF9xdWVyeUtleXMgPSBbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9yb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIF9yb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgcHJpdmF0ZSBfZmlsdGVySXRlbXM6IEZzRmlsdGVyQ29uZmlnSXRlbVtdLFxuICApIHtcbiAgICB0aGlzLl9xdWVyeVBhcmFtc1RvRmlsdGVyKHRoaXMuX3JvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zLCB0aGlzLl9maWx0ZXJJdGVtcyk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHF1ZXJ5IHdpdGggZmlsdGVyIHZhbHVlc1xuICAgKiBAcGFyYW0gZmlsdGVyUGFyYW1zXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlUXVlcnlQYXJhbXMoZmlsdGVyUGFyYW1zKSB7XG4gICAgLy8gdHJhbnNmb3JtIHNlbGVjdGVkIGZpbHRlciB2YWx1ZXMgdG8gcXVlcnkgc3RyaW5nXG4gICAgY29uc3QgbmV3UGFyYW1zID0gdGhpcy5fZmlsdGVyVG9RdWVyeVBhcmFtcyhmaWx0ZXJQYXJhbXMsIHRoaXMuX2ZpbHRlckl0ZW1zKTtcblxuICAgIC8vIFJlbW92ZSBlbXB0eSBrZXlzXG4gICAgdGhpcy5fY2xlYXJLZXlzKG5ld1BhcmFtcyk7XG5cbiAgICAvLyBTdG9yZSBxdWVyeSBrZXlzXG4gICAgdGhpcy5fcXVlcnlLZXlzID0gT2JqZWN0LmtleXMobmV3UGFyYW1zKTtcblxuICAgIC8vIFVwZGF0ZSBxdWVyeVxuICAgIHRoaXMuX3JvdXRlci5uYXZpZ2F0ZShbXSwge1xuICAgICAgcmVwbGFjZVVybDogdHJ1ZSxcbiAgICAgIHJlbGF0aXZlVG86IHRoaXMuX3JvdXRlLFxuICAgICAgcXVlcnlQYXJhbXM6IG5ld1BhcmFtcyxcbiAgICAgIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6ICdtZXJnZSdcbiAgICB9KS50aGVuKCgpID0+IHt9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFuc2Zvcm1hdGlvbiBmb3Igc2VsZWN0ZWQgZmlsdGVyIHZhbHVlcyB0byBxdWVyeSBzdHJpbmdcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gaXRlbXNcbiAgICovXG4gIHByaXZhdGUgX2ZpbHRlclRvUXVlcnlQYXJhbXMocGFyYW1zLCBpdGVtczogRnNGaWx0ZXJDb25maWdJdGVtW10pIHtcbiAgICAvLyBzZWxlY3RlZCBmaWx0ZXIga2V5c1xuICAgIGNvbnN0IGZpbHRlcktleXMgPSBPYmplY3Qua2V5cyhwYXJhbXMpO1xuXG4gICAgcmV0dXJuIGZpbHRlcktleXMucmVkdWNlKChhY2MsIGZpbHRlcktleSkgPT4ge1xuXG4gICAgICAvLyBsb29raW5nIGZpbHRlciBpdGVtXG4gICAgICBjb25zdCBmaWx0ZXJJdGVtID0gaXRlbXMuZmluZCgoaXRlbSkgPT4gaXRlbS5uYW1lID09PSBmaWx0ZXJLZXkpO1xuXG4gICAgICBpZiAoZmlsdGVySXRlbSkge1xuICAgICAgICBpZiAoZmlsdGVySXRlbS50eXBlID09PSBJdGVtVHlwZS5SYW5nZSkge1xuICAgICAgICAgIGFjY1tmaWx0ZXJLZXldID0gW3BhcmFtc1tmaWx0ZXJLZXldLm1pbiwgcGFyYW1zW2ZpbHRlcktleV0ubWF4XS5qb2luKCcsJylcbiAgICAgICAgfSBlbHNlIGlmIChmaWx0ZXJJdGVtLmlzVHlwZVNlbGVjdCgpICYmIGZpbHRlckl0ZW0ubXVsdGlwbGUgJiYgZmlsdGVySXRlbS5tb2RlbCAmJiBmaWx0ZXJJdGVtLm1vZGVsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBhY2NbZmlsdGVyS2V5XSA9IGZpbHRlckl0ZW0ubW9kZWwuam9pbignLCcpO1xuICAgICAgICB9IGVsc2UgaWYgKGZpbHRlckl0ZW0uaXNUeXBlQXV0b2NvbXBsZXRlKCkpIHtcbiAgICAgICAgICBhY2NbZmlsdGVyS2V5XSA9IFtmaWx0ZXJJdGVtLm1vZGVsLnZhbHVlLCBmaWx0ZXJJdGVtLm1vZGVsLm5hbWVdLmpvaW4oJywnKTtcbiAgICAgICAgfSBlbHNlIGlmIChmaWx0ZXJJdGVtLnR5cGUgPT09IEl0ZW1UeXBlLkF1dG9Db21wbGV0ZUNoaXBzKSB7XG4gICAgICAgICAgYWNjW2ZpbHRlcktleV0gPSBmaWx0ZXJJdGVtLm1vZGVsLm1hcCgoaXRlbSkgPT4gW2l0ZW0udmFsdWUsIGl0ZW0ubmFtZV0uam9pbignLCcpKS5qb2luKCc7Jyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWNjW2ZpbHRlcktleV0gPSBwYXJhbXNbZmlsdGVyS2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHt9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBxdWVyeSBhbmQgdXBkYXRlIGZpbHRlciB2YWx1ZXNcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gaXRlbXNcbiAgICovXG4gIHByaXZhdGUgX3F1ZXJ5UGFyYW1zVG9GaWx0ZXIocGFyYW1zLCBpdGVtczogRnNGaWx0ZXJDb25maWdJdGVtW10pIHtcbiAgICB0aGlzLl9xdWVyeUtleXMgPSBPYmplY3Qua2V5cyhwYXJhbXMpO1xuXG4gICAgcmV0dXJuIHRoaXMuX3F1ZXJ5S2V5cy5mb3JFYWNoKChxdWVyeUtleSkgPT4ge1xuXG4gICAgICBjb25zdCBmaWx0ZXJJdGVtID0gaXRlbXMuZmluZCgoaXRlbSkgPT4gaXRlbS5uYW1lID09PSBxdWVyeUtleSk7XG5cbiAgICAgIGlmIChmaWx0ZXJJdGVtKSB7XG4gICAgICAgIGlmIChmaWx0ZXJJdGVtLnR5cGUgPT09IEl0ZW1UeXBlLlNlbGVjdCAmJiBmaWx0ZXJJdGVtLm11bHRpcGxlKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWVzID0gcGFyYW1zW3F1ZXJ5S2V5XVxuICAgICAgICAgICAgLnNwbGl0KCcsJyk7XG5cbiAgICAgICAgICBmaWx0ZXJJdGVtLnBhcnNlQW5kU2V0VmFsdWUodmFsdWVzKTtcbiAgICAgICAgfSBlbHNlIGlmIChmaWx0ZXJJdGVtLnR5cGUgPT09IEl0ZW1UeXBlLlJhbmdlKSB7XG4gICAgICAgICAgaWYgKHBhcmFtc1txdWVyeUtleV0gJiYgaXNTdHJpbmcocGFyYW1zW3F1ZXJ5S2V5XSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlclBhcnRzID0gcGFyYW1zW3F1ZXJ5S2V5XS5zcGxpdCgnLCcpO1xuICAgICAgICAgICAgZmlsdGVySXRlbS5tb2RlbCA9IHtcbiAgICAgICAgICAgICAgbWluOiBmaWx0ZXJQYXJ0c1swXSxcbiAgICAgICAgICAgICAgbWF4OiBmaWx0ZXJQYXJ0c1sxXVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZmlsdGVySXRlbS50eXBlID09PSBJdGVtVHlwZS5DaGlwcykge1xuICAgICAgICAgIGNvbnN0IGNoaXBJZHMgPSBwYXJhbXNbcXVlcnlLZXldXG4gICAgICAgICAgICAuc3BsaXQoJywnKVxuICAgICAgICAgICAgLm1hcCgodmFsdWUpID0+ICt2YWx1ZSk7XG5cbiAgICAgICAgICBmaWx0ZXJJdGVtLnBhcnNlQW5kU2V0VmFsdWUoY2hpcElkcyk7XG4gICAgICAgIH0gZWxzZSBpZiAoZmlsdGVySXRlbS50eXBlID09PSBJdGVtVHlwZS5DaGVja2JveCkge1xuICAgICAgICAgIGZpbHRlckl0ZW0ucGFyc2VBbmRTZXRWYWx1ZShwYXJhbXNbcXVlcnlLZXldID09PSAndHJ1ZScpO1xuICAgICAgICB9IGVsc2UgaWYgKGZpbHRlckl0ZW0udHlwZSA9PT0gSXRlbVR5cGUuQXV0b0NvbXBsZXRlKSB7XG4gICAgICAgICAgY29uc3QgZmlsdGVyUGFydHMgPSBwYXJhbXNbcXVlcnlLZXldLnNwbGl0KCcsJyk7XG5cbiAgICAgICAgICBmaWx0ZXJJdGVtLm1vZGVsID0ge1xuICAgICAgICAgICAgbmFtZTogZmlsdGVyUGFydHNbMV0sXG4gICAgICAgICAgICB2YWx1ZTogK2ZpbHRlclBhcnRzWzBdXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGZpbHRlckl0ZW0udHlwZSA9PT0gSXRlbVR5cGUuQXV0b0NvbXBsZXRlQ2hpcHMpIHtcbiAgICAgICAgICBjb25zdCBmaWx0ZXJQYXJ0cyA9IHBhcmFtc1txdWVyeUtleV0uc3BsaXQoJzsnKTtcblxuICAgICAgICAgIGZpbHRlckl0ZW0ubW9kZWwgPSBmaWx0ZXJQYXJ0cy5yZWR1Y2UoKGFjYywgdmFsdWUpID0+IHtcblxuICAgICAgICAgICAgY29uc3QgY2hpcFBhcnRzID0gdmFsdWUuc3BsaXQoJywnKTtcblxuICAgICAgICAgICAgYWNjLnB1c2goe1xuICAgICAgICAgICAgICBuYW1lOiBjaGlwUGFydHNbMV0sXG4gICAgICAgICAgICAgIHZhbHVlOiArY2hpcFBhcnRzWzBdLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgICAgfSwgW10pXG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaWx0ZXJJdGVtLnBhcnNlQW5kU2V0VmFsdWUocGFyYW1zW3F1ZXJ5S2V5XSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2NsZWFyS2V5cyhwYXJhbXMpIHtcbiAgICB0aGlzLl9xdWVyeUtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBpZiAoIXBhcmFtc1trZXldKSB7XG4gICAgICAgIHBhcmFtc1trZXldID0gbnVsbDtcbiAgICAgIH1cbiAgICB9KVxuICB9XG59XG4iXX0=