@empathyco/x-components
Version:
Empathy X Components
106 lines (103 loc) • 3.8 kB
JavaScript
import { isEditableNumberRangeFilter } from '@empathyco/x-types';
import { addFacetIfNotPresent } from './add-facet-if-not-present.js';
/**
* Allows selecting and deselecting a filter of {@link @empathyco/x-types#EditableNumberRangeFilter
* | EditableNumberRangeFilter}.
*
* @internal
*/
class EditableNumberRangeFilterEntity {
constructor(store) {
this.store = store;
}
static accepts(filter) {
return isEditableNumberRangeFilter(filter);
}
/**
* It sets {@link @empathyco/x-types#EditableNumberRangeFilter | EditableNumberRangeFilter} to
* false. Range values are kept to be able to update the {@link FacetsGetters.selectedFilters}
* getter accordingly (as the id is built using the range).
*
* @param filterParam - The filter to deselect.
*/
deselect(filterParam) {
const filter = filterParam;
const newFilterState = {
facetId: filter.facetId,
range: { min: filter.range.min, max: filter.range.max },
selected: false,
};
this.removePreviousFilter(filter.facetId);
this.store.commit('x/facets/mutateFilter', {
filter,
newFilterState: Object.assign(newFilterState, { id: this.getNewFilterId(newFilterState) }),
});
addFacetIfNotPresent(this.store, filter.facetId, 'EditableNumberRangeFacet');
}
/**
* It selects the {@link @empathyco/x-types#EditableNumberRangeFilter
* | EditableNumberRangeFilter}.
*
* @param filterParam - The filter to select.
* @remarks If the filter has no selected range, then filter is deselected when this
* method is called.
*/
select(filterParam) {
const filter = filterParam;
const newFilterId = this.getNewFilterId(filter);
this.removePreviousFilter(filter.facetId);
this.store.commit('x/facets/mutateFilter', {
filter,
newFilterState: {
id: newFilterId,
selected: this.isSelected(filter),
},
});
addFacetIfNotPresent(this.store, filter.facetId, 'EditableNumberRangeFacet');
}
/**
* Generates a new filter id using the range values.
*
* @param filter - The filter to generate its new id.
* @returns The new filter id.
* @internal
*/
getNewFilterId(filter) {
return `${filter.facetId}:${String(filter.range.min ?? '*')}-${String(filter.range.max ?? '*')}`;
}
/**
* It returns if the filter range min or the filter range max is not null.
*
* @param filter - The filter to determine if it is selected or not.
* @returns True if filter range min or filter range max is not null.
* @internal
*/
isSelected(filter) {
return filter.range.min !== null || filter.range.max !== null;
}
/**
* Removes the previous filter of this facet from the store, only if it exists.
*
* @param facetId - The facet to remove its only filter.
* @internal
*/
removePreviousFilter(facetId) {
const previousFilter = this.getFilterByFacet(facetId);
if (previousFilter) {
this.store.commit('x/facets/removeFilter', previousFilter);
}
}
/**
* Retrieves the filter of the given facet id from the store.
*
* @param facetId - The facet id to retrieve its filter.
* @returns The filter of the facet if it exists.
* @internal
*/
getFilterByFacet(facetId) {
// eslint-disable-next-line ts/no-unsafe-member-access,ts/no-unsafe-return
return this.store.getters['x/facets/facets'][facetId]?.filters?.[0];
}
}
export { EditableNumberRangeFilterEntity };
//# sourceMappingURL=editable-number-range-filter.entity.js.map