UNPKG

@empathyco/x-components

Version:
106 lines (103 loc) 3.8 kB
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