ptmdmusique icon

Redux Filter plugin

ptmdmusique | PRO | 01/25/21 08:52:48 PM UTC | 0 ⭐ | 7102 👁️ | Never ⏰ | []
TypeScript |

2.51 KB

|

None

|

0 👍

/

0 👎

filter: action((state, { dataList, defaultFilter, customFilter }) => {
      if (!customFilter && !defaultFilter) {
        throw new Error(internalErrorMessage.invalidFilterParam);
      }
 
      const filterCache = { ...state.filterCache };
      let filterResult = [...dataList];
 
      if (
        (defaultFilter && defaultFilter.filterValueList.length > 0) ||
        customFilter
      ) {
        // Filter idea:
        //  Filter based on the criteria
        //  Store the result back in the temporary storage (cache)
        //  Find the intersection of all the temporary result
        //    => The result will satisfy all the filter criteria
        filterResult = dataList.filter((entry) => {
          if (customFilter) {
            return customFilter.filterHandler(entry);
          }
 
          if (!defaultFilter) {
            throw new Error(internalErrorMessage.invalidFilterParam);
          }
 
          const { filterKey, filterValueList, filterType } = defaultFilter;
          const toCompare = lodash.get(entry, filterKey);
          if (Array.isArray(toCompare)) {
            const intersection = lodash.intersectionWith(
              toCompare,
              filterValueList,
              lodash.isEqual
            );
 
            switch (filterType) {
              case "matchSubset":
                // toCompare is the subset of filterValueList
                return intersection.length === toCompare.length;
              case "matchSuperset":
                // filterValueList is the subset of toCompare
                return intersection.length === filterValueList.length;
              case "matchExact":
                return (
                  intersection.length === toCompare.length &&
                  intersection.length === filterValueList.length
                );
              default:
              case "matchOneOf":
                return intersection.length > 0;
            }
          }
          return (
            filterValueList.findIndex((value) =>
              lodash.isEqual(toCompare, value)
            ) >= 0
          );
        });
      }
      filterCache[
        customFilter?.customKey || (defaultFilter?.filterKey as string)
      ] = filterResult;
 
      // Intersect the result of every filter by in the cache
      state.filterResult = lodash.intersectionWith(
        ...Object.values(filterCache),
        lodash.isEqual
      );
      // Reset the cache
      state.filterCache = filterCache;
    }),
  };

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎