@tanstack/table-core
Version:
Headless UI for building powerful tables & datagrids for TS/JS.
46 lines (44 loc) • 2.08 kB
JavaScript
import { callMemoOrStaticFn, tableMemo } from "../../utils.js";
import { column_getFacetedRowModel, table_getGlobalFacetedRowModel } from "./columnFacetingFeature.utils.js";
import { column_getCanGlobalFilter } from "../global-filtering/globalFilteringFeature.utils.js";
//#region src/features/column-faceting/createFacetedMinMaxValues.ts
/**
* Creates a memoized faceted min max values helper for faceted filtering.
*
* The returned function derives facet data from the table row model and relevant filter state so filter UIs can display available values.
*/
function createFacetedMinMaxValues() {
return (_table, columnId) => {
const table = _table;
return tableMemo({
feature: "columnFacetingFeature",
fn: (flatRows) => _createFacetedMinMaxValues(table, columnId, flatRows),
fnName: "table.getFacetedMinMaxValues",
memoDeps: () => {
if (columnId === "__global__") return [callMemoOrStaticFn(table, "getGlobalFacetedRowModel", table_getGlobalFacetedRowModel).flatRows];
const column = table.getColumn(columnId);
if (!column) return [table.getPreFilteredRowModel().flatRows];
return [callMemoOrStaticFn(column, "getFacetedRowModel", column_getFacetedRowModel, table).flatRows];
},
table
});
};
}
function _createFacetedMinMaxValues(table, columnId, flatRows) {
if (!flatRows.length) return void 0;
const columnIds = columnId === "__global__" ? table.getAllLeafColumns().filter((column) => column_getCanGlobalFilter(column)).map((column) => column.id) : [columnId];
let facetedMinValue = Number.POSITIVE_INFINITY;
let facetedMaxValue = Number.NEGATIVE_INFINITY;
let foundAny = false;
for (let i = 0; i < flatRows.length; i++) for (let c = 0; c < columnIds.length; c++) {
const value = Number(flatRows[i].getValue(columnIds[c]));
if (Number.isNaN(value)) continue;
foundAny = true;
if (value < facetedMinValue) facetedMinValue = value;
if (value > facetedMaxValue) facetedMaxValue = value;
}
if (!foundAny) return void 0;
return [facetedMinValue, facetedMaxValue];
}
//#endregion
export { createFacetedMinMaxValues };