UNPKG

@1771technologies/lytenyte-pro

Version:

Blazingly fast headless React data grid with 100s of features.

110 lines (109 loc) 4.13 kB
import { evaluateDateFilter, evaluateNumberFilter, evaluateStringFilter, getDateFilterSettings, getNumberFilterSettings, getStringFilterSettings, } from "@1771technologies/lytenyte-shared"; import { itemsWithIdToMap } from "@1771technologies/lytenyte-shared"; export function computeFilteredRows(rows, grid, filterModel, filterInModel, quickSearch, sensitivity, isPivot) { if (!grid) return rows; const columns = isPivot ? grid.state.columnPivotColumns.get() : grid.state.columns.get(); const lookup = itemsWithIdToMap(columns); const filterEntries = [...Object.entries(filterModel), ...Object.entries(filterInModel)].filter(([key]) => { return lookup.has(key); }); if (!(filterEntries.length || quickSearch) || !grid) return rows; const filters = filterEntries.map(([key, f]) => createFilter(key, f)); const filtered = []; const base = grid.state.columnBase.get(); const nonIgnored = columns.filter((c) => !(c.quickSearchIgnore ?? base.quickSearchIgnore)); for (let r = 0; r < rows.length; r++) { const row = rows[r]; if (!filters.every((filter) => evaluateFilter(row.data, grid, filter))) continue; if (quickSearch) { const pass = nonIgnored.some((c) => { const field = `${grid.api.columnField(c, { data: row.data, kind: "leaf" })}`; if (sensitivity === "case-insensitive") return field.toLowerCase().includes(quickSearch.toLowerCase()); return field.includes(quickSearch); }); if (!pass) continue; } filtered.push(row); } return filtered; } function createFilter(id, filter) { if (filter.kind === "date") { const settings = getDateFilterSettings(filter); return { ...filter, field: id, kind: "date", settings, }; } else if (filter.kind === "number") { const settings = getNumberFilterSettings(filter); return { ...filter, field: id, kind: "number", settings, }; } else if (filter.kind === "string") { const settings = getStringFilterSettings(filter); return { ...filter, field: id, kind: "string", settings, }; } else if (filter.kind === "in") { return { ...filter, field: id, }; } else if (filter.kind === "combination") { return { ...filter, kind: "combination", filters: filter.filters.map((f) => createFilter(id, f)), }; } else if (filter.kind === "func") { return filter; } else { throw new Error(`Invalid filter provided: ${JSON.stringify(filter)}`); } } function evaluateFilter(row, grid, filter) { if (filter.kind === "date") { const fieldValue = grid.api.columnField(filter.field, { data: row, kind: "leaf" }); return evaluateDateFilter(filter, fieldValue, filter.settings); } else if (filter.kind === "string") { const fieldValue = grid.api.columnField(filter.field, { data: row, kind: "leaf" }); return evaluateStringFilter(filter, fieldValue, filter.settings); } else if (filter.kind === "number") { const fieldValue = grid.api.columnField(filter.field, { data: row, kind: "leaf" }); return evaluateNumberFilter(filter, fieldValue, filter.settings); } else if (filter.kind === "func") { return filter.func({ data: row, grid }); } else if (filter.kind === "in") { const fieldValue = grid.api.columnField(filter.field, { data: row, kind: "leaf" }); return filter.operator === "in" ? filter.value.has(fieldValue) : !filter.value.has(fieldValue); } else { if (filter.operator === "AND") return filter.filters.every((f) => evaluateFilter(row, grid, f)); else return filter.filters.some((f) => evaluateFilter(row, grid, f)); } }