@tanstack/table-core 9.0.0-beta.47 → 9.0.0-beta.49
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core/row-models/coreRowModelsFeature.types.d.cts +1 -1
- package/dist/core/row-models/coreRowModelsFeature.types.d.ts +1 -1
- package/dist/core/row-models/coreRowModelsFeature.utils.cjs +1 -1
- package/dist/core/row-models/coreRowModelsFeature.utils.cjs.map +1 -1
- package/dist/core/row-models/coreRowModelsFeature.utils.d.cts +1 -1
- package/dist/core/row-models/coreRowModelsFeature.utils.d.ts +1 -1
- package/dist/core/row-models/coreRowModelsFeature.utils.js +1 -1
- package/dist/core/row-models/coreRowModelsFeature.utils.js.map +1 -1
- package/dist/features/aggregation/aggregationFeature.cjs +38 -0
- package/dist/features/aggregation/aggregationFeature.cjs.map +1 -0
- package/dist/features/aggregation/aggregationFeature.d.cts +10 -0
- package/dist/features/aggregation/aggregationFeature.d.ts +10 -0
- package/dist/features/aggregation/aggregationFeature.js +38 -0
- package/dist/features/aggregation/aggregationFeature.js.map +1 -0
- package/dist/features/aggregation/aggregationFeature.types.cjs +13 -0
- package/dist/features/aggregation/aggregationFeature.types.cjs.map +1 -0
- package/dist/features/aggregation/aggregationFeature.types.d.cts +172 -0
- package/dist/features/aggregation/aggregationFeature.types.d.ts +172 -0
- package/dist/features/aggregation/aggregationFeature.types.js +12 -0
- package/dist/features/aggregation/aggregationFeature.types.js.map +1 -0
- package/dist/features/aggregation/aggregationFeature.utils.cjs +198 -0
- package/dist/features/aggregation/aggregationFeature.utils.cjs.map +1 -0
- package/dist/features/aggregation/aggregationFeature.utils.d.cts +33 -0
- package/dist/features/aggregation/aggregationFeature.utils.d.ts +33 -0
- package/dist/features/aggregation/aggregationFeature.utils.js +192 -0
- package/dist/features/aggregation/aggregationFeature.utils.js.map +1 -0
- package/dist/features/aggregation/aggregationFns.cjs +240 -0
- package/dist/features/aggregation/aggregationFns.cjs.map +1 -0
- package/dist/features/aggregation/aggregationFns.d.cts +67 -0
- package/dist/features/aggregation/aggregationFns.d.ts +67 -0
- package/dist/features/aggregation/aggregationFns.js +229 -0
- package/dist/features/aggregation/aggregationFns.js.map +1 -0
- package/dist/features/column-faceting/createFacetedMinMaxValues.cjs +7 -4
- package/dist/features/column-faceting/createFacetedMinMaxValues.cjs.map +1 -1
- package/dist/features/column-faceting/createFacetedMinMaxValues.js +8 -5
- package/dist/features/column-faceting/createFacetedMinMaxValues.js.map +1 -1
- package/dist/features/column-faceting/createFacetedRowModel.cjs +1 -1
- package/dist/features/column-faceting/createFacetedRowModel.cjs.map +1 -1
- package/dist/features/column-faceting/createFacetedRowModel.js +1 -1
- package/dist/features/column-faceting/createFacetedRowModel.js.map +1 -1
- package/dist/features/column-faceting/createFacetedUniqueValues.cjs +8 -4
- package/dist/features/column-faceting/createFacetedUniqueValues.cjs.map +1 -1
- package/dist/features/column-faceting/createFacetedUniqueValues.js +9 -5
- package/dist/features/column-faceting/createFacetedUniqueValues.js.map +1 -1
- package/dist/features/column-filtering/columnFilteringFeature.types.d.cts +1 -1
- package/dist/features/column-filtering/columnFilteringFeature.types.d.ts +1 -1
- package/dist/{fns → features/column-filtering}/filterFns.cjs +1 -1
- package/dist/features/column-filtering/filterFns.cjs.map +1 -0
- package/dist/{fns → features/column-filtering}/filterFns.d.cts +4 -4
- package/dist/{fns → features/column-filtering}/filterFns.d.ts +4 -4
- package/dist/{fns → features/column-filtering}/filterFns.js +1 -1
- package/dist/features/column-filtering/filterFns.js.map +1 -0
- package/dist/features/column-grouping/columnGroupingFeature.cjs +3 -12
- package/dist/features/column-grouping/columnGroupingFeature.cjs.map +1 -1
- package/dist/features/column-grouping/columnGroupingFeature.d.cts +1 -1
- package/dist/features/column-grouping/columnGroupingFeature.d.ts +1 -1
- package/dist/features/column-grouping/columnGroupingFeature.js +4 -13
- package/dist/features/column-grouping/columnGroupingFeature.js.map +1 -1
- package/dist/features/column-grouping/columnGroupingFeature.types.d.cts +6 -87
- package/dist/features/column-grouping/columnGroupingFeature.types.d.ts +6 -87
- package/dist/features/column-grouping/columnGroupingFeature.utils.cjs +0 -64
- package/dist/features/column-grouping/columnGroupingFeature.utils.cjs.map +1 -1
- package/dist/features/column-grouping/columnGroupingFeature.utils.d.cts +2 -44
- package/dist/features/column-grouping/columnGroupingFeature.utils.d.ts +2 -44
- package/dist/features/column-grouping/columnGroupingFeature.utils.js +2 -63
- package/dist/features/column-grouping/columnGroupingFeature.utils.js.map +1 -1
- package/dist/features/column-grouping/createGroupedRowModel.cjs +23 -16
- package/dist/features/column-grouping/createGroupedRowModel.cjs.map +1 -1
- package/dist/features/column-grouping/createGroupedRowModel.d.cts +2 -6
- package/dist/features/column-grouping/createGroupedRowModel.d.ts +2 -6
- package/dist/features/column-grouping/createGroupedRowModel.js +25 -18
- package/dist/features/column-grouping/createGroupedRowModel.js.map +1 -1
- package/dist/features/global-filtering/globalFilteringFeature.utils.cjs +1 -1
- package/dist/features/global-filtering/globalFilteringFeature.utils.cjs.map +1 -1
- package/dist/features/global-filtering/globalFilteringFeature.utils.js +1 -1
- package/dist/features/global-filtering/globalFilteringFeature.utils.js.map +1 -1
- package/dist/features/row-sorting/rowSortingFeature.types.d.cts +1 -1
- package/dist/features/row-sorting/rowSortingFeature.types.d.ts +1 -1
- package/dist/features/row-sorting/rowSortingFeature.utils.cjs +1 -1
- package/dist/features/row-sorting/rowSortingFeature.utils.cjs.map +1 -1
- package/dist/features/row-sorting/rowSortingFeature.utils.js +1 -1
- package/dist/features/row-sorting/rowSortingFeature.utils.js.map +1 -1
- package/dist/{fns → features/row-sorting}/sortFns.cjs +1 -1
- package/dist/{fns/sortFns.js.map → features/row-sorting/sortFns.cjs.map} +1 -1
- package/dist/{fns → features/row-sorting}/sortFns.d.cts +4 -4
- package/dist/{fns → features/row-sorting}/sortFns.d.ts +4 -4
- package/dist/{fns → features/row-sorting}/sortFns.js +1 -1
- package/dist/features/row-sorting/sortFns.js.map +1 -0
- package/dist/features/stockFeatures.cjs +2 -0
- package/dist/features/stockFeatures.cjs.map +1 -1
- package/dist/features/stockFeatures.d.cts +2 -0
- package/dist/features/stockFeatures.d.ts +2 -0
- package/dist/features/stockFeatures.js +2 -0
- package/dist/features/stockFeatures.js.map +1 -1
- package/dist/index.cjs +7 -4
- package/dist/index.d.cts +7 -5
- package/dist/index.d.ts +7 -5
- package/dist/index.js +6 -4
- package/dist/static-functions.cjs +8 -3
- package/dist/static-functions.d.cts +3 -2
- package/dist/static-functions.d.ts +3 -2
- package/dist/static-functions.js +3 -2
- package/dist/types/Cell.d.cts +3 -1
- package/dist/types/Cell.d.ts +3 -1
- package/dist/types/Column.d.cts +4 -2
- package/dist/types/Column.d.ts +4 -2
- package/dist/types/ColumnDef.d.cts +5 -3
- package/dist/types/ColumnDef.d.ts +5 -3
- package/dist/types/Row.d.cts +3 -1
- package/dist/types/Row.d.ts +3 -1
- package/dist/types/RowModel.d.cts +1 -1
- package/dist/types/RowModel.d.ts +1 -1
- package/dist/types/RowModelFns.d.cts +3 -3
- package/dist/types/RowModelFns.d.ts +3 -3
- package/dist/types/Table.d.cts +1 -1
- package/dist/types/Table.d.ts +1 -1
- package/dist/types/TableFeatures.d.cts +4 -4
- package/dist/types/TableFeatures.d.ts +4 -4
- package/dist/types/TableOptions.d.cts +5 -3
- package/dist/types/TableOptions.d.ts +5 -3
- package/dist/types/TableState.d.cts +1 -1
- package/dist/types/TableState.d.ts +1 -1
- package/dist/worker/initTableWorker.cjs.map +1 -1
- package/dist/worker/initTableWorker.js.map +1 -1
- package/package.json +1 -1
- package/skills/aggregation/SKILL.md +131 -0
- package/skills/api-not-found/SKILL.md +1 -1
- package/skills/client-vs-server/SKILL.md +1 -1
- package/skills/column-faceting/SKILL.md +1 -1
- package/skills/column-filtering/SKILL.md +1 -1
- package/skills/column-ordering/SKILL.md +1 -1
- package/skills/column-pinning/SKILL.md +1 -1
- package/skills/column-resizing/SKILL.md +1 -1
- package/skills/column-sizing/SKILL.md +1 -1
- package/skills/column-visibility/SKILL.md +1 -1
- package/skills/core/SKILL.md +1 -1
- package/skills/custom-features/SKILL.md +1 -1
- package/skills/expanding/SKILL.md +1 -1
- package/skills/global-filtering/SKILL.md +1 -1
- package/skills/grouping/SKILL.md +12 -18
- package/skills/migrate-v8-to-v9/SKILL.md +15 -2
- package/skills/pagination/SKILL.md +1 -1
- package/skills/row-pinning/SKILL.md +1 -1
- package/skills/row-selection/SKILL.md +1 -1
- package/skills/sorting/SKILL.md +1 -1
- package/skills/table-features/SKILL.md +5 -2
- package/skills/typescript/SKILL.md +1 -1
- package/src/core/row-models/coreRowModelsFeature.utils.ts +1 -1
- package/src/features/aggregation/aggregationFeature.ts +59 -0
- package/src/features/aggregation/aggregationFeature.types.ts +312 -0
- package/src/features/aggregation/aggregationFeature.utils.ts +401 -0
- package/src/features/aggregation/aggregationFns.ts +336 -0
- package/src/features/column-faceting/createFacetedMinMaxValues.ts +33 -7
- package/src/features/column-faceting/createFacetedRowModel.ts +4 -1
- package/src/features/column-faceting/createFacetedUniqueValues.ts +45 -11
- package/src/features/column-filtering/columnFilteringFeature.types.ts +1 -1
- package/src/{fns → features/column-filtering}/filterFns.ts +4 -4
- package/src/features/column-grouping/columnGroupingFeature.ts +1 -20
- package/src/features/column-grouping/columnGroupingFeature.types.ts +4 -141
- package/src/features/column-grouping/columnGroupingFeature.utils.ts +1 -122
- package/src/features/column-grouping/createGroupedRowModel.ts +32 -41
- package/src/features/global-filtering/globalFilteringFeature.utils.ts +1 -1
- package/src/features/row-sorting/rowSortingFeature.types.ts +1 -1
- package/src/features/row-sorting/rowSortingFeature.utils.ts +1 -1
- package/src/{fns → features/row-sorting}/sortFns.ts +4 -7
- package/src/features/stockFeatures.ts +3 -0
- package/src/index.ts +7 -8
- package/src/static-functions.ts +1 -0
- package/src/types/Cell.ts +2 -0
- package/src/types/Column.ts +3 -1
- package/src/types/ColumnDef.ts +6 -3
- package/src/types/Row.ts +2 -0
- package/src/types/RowModelFns.ts +3 -3
- package/src/types/TableFeatures.ts +4 -4
- package/src/types/TableOptions.ts +5 -1
- package/src/worker/initTableWorker.ts +1 -1
- package/dist/fns/aggregationFns.cjs +0 -234
- package/dist/fns/aggregationFns.cjs.map +0 -1
- package/dist/fns/aggregationFns.d.cts +0 -139
- package/dist/fns/aggregationFns.d.ts +0 -139
- package/dist/fns/aggregationFns.js +0 -221
- package/dist/fns/aggregationFns.js.map +0 -1
- package/dist/fns/filterFns.cjs.map +0 -1
- package/dist/fns/filterFns.js.map +0 -1
- package/dist/fns/sortFns.cjs.map +0 -1
- package/src/fns/aggregationFns.ts +0 -303
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filterFns.cjs","names":[],"sources":["../../../src/features/column-filtering/filterFns.ts"],"sourcesContent":["import type {\n CreatedFilterFn,\n ExtractFilterMeta,\n FilterFnDef,\n} from './columnFilteringFeature.types'\nimport type { RowData } from '../../types/type-utils'\nimport type { TableFeatures } from '../../types/TableFeatures'\nimport type { Row } from '../../types/Row'\n\n/**\n * Builds a `FilterFn` from a value-level comparator plus optional resolvers.\n *\n * The `filter` comparator receives the row's data value (already passed\n * through `resolveDataValue` when one is defined) and the filter value\n * (already passed through `resolveFilterValue` by the table). Keeping\n * normalization in the resolvers means a variant of an existing filter\n * function only has to swap the resolvers, not re-implement the comparison.\n *\n * The definition is attached to the returned function, so a variant can be\n * created by spreading a built-in filter function and overriding what differs:\n *\n * ```ts\n * const normalize = (value: unknown) =>\n * String(value ?? '')\n * .toLowerCase()\n * .normalize('NFD')\n * .replace(/\\p{Diacritic}/gu, '')\n *\n * const includesStringIgnoreDiacritics = constructFilterFn({\n * ...filterFn_includesString,\n * resolveFilterValue: normalize,\n * resolveDataValue: normalize,\n * })\n * ```\n *\n * Note: the table applies `resolveFilterValue` once per filter before any rows\n * are tested. When calling a filter function directly (outside of a table),\n * apply it yourself: `fn(row, columnId, fn.resolveFilterValue?.(value) ?? value)`.\n */\nexport function constructFilterFn<\n TFeatures extends TableFeatures = any,\n TData extends RowData = any,\n>(def: FilterFnDef<TFeatures, TData>): CreatedFilterFn<TFeatures, TData> {\n const filterFn: CreatedFilterFn<TFeatures, TData> = Object.assign(\n <TRowFeatures extends TableFeatures, TRowData extends RowData>(\n row: Row<TRowFeatures, TRowData>,\n columnId: string,\n filterValue: any,\n addMeta?: (meta: ExtractFilterMeta<TRowFeatures>) => void,\n ): boolean => {\n const rawValue = row.getValue(columnId)\n const dataValue = filterFn.resolveDataValue\n ? filterFn.resolveDataValue(rawValue)\n : rawValue\n // The def's comparator is typed against the factory's TFeatures/TData;\n // the caller's row generics are erased at this boundary.\n return filterFn.filter(\n dataValue,\n filterValue,\n row as any,\n columnId,\n addMeta as any,\n )\n },\n def,\n )\n return filterFn\n}\n\n// Basic filters\n\n/**\n * Keeps rows whose column value is strictly equal to the filter value.\n *\n * Uses JavaScript `===` comparison and auto-removes empty filter values.\n */\nexport const filterFn_equals = constructFilterFn({\n filter: (dataValue, filterValue) => dataValue === filterValue,\n autoRemove: (val: any) => testFalsy(val),\n})\n\n/**\n * Keeps rows whose column value is loosely equal to the filter value.\n *\n * Uses JavaScript `==` comparison and auto-removes empty filter values. This is\n * useful for matching string input against numeric row values.\n */\nexport const filterFn_weakEquals = constructFilterFn({\n filter: (dataValue, filterValue) => dataValue == filterValue,\n autoRemove: (val: any) => testFalsy(val),\n})\n\n// String filters\n\n/**\n * Keeps rows whose stringified column value includes the filter text.\n *\n * Matching is case-sensitive and empty filter values are auto-removed.\n */\nexport const filterFn_includesStringSensitive = constructFilterFn({\n filter: (dataValue, filterValue) => Boolean(dataValue?.includes(filterValue)),\n autoRemove: (val: any) => testFalsy(val),\n resolveFilterValue: (val: any) => String(val),\n resolveDataValue: (val: any) => (val == null ? undefined : String(val)),\n})\n\n/**\n * Keeps rows whose stringified column value includes the filter text.\n *\n * Both values are lowercased before comparison, and empty filter values are\n * auto-removed.\n */\nexport const filterFn_includesString = constructFilterFn({\n filter: (dataValue, filterValue) => Boolean(dataValue?.includes(filterValue)),\n autoRemove: (val: any) => testFalsy(val),\n resolveFilterValue: (val: any) => String(val).toLowerCase(),\n resolveDataValue: (val: any) =>\n val == null ? undefined : String(val).toLowerCase(),\n})\n\n/**\n * Keeps rows whose stringified column value equals the filter text.\n *\n * Both values are lowercased before comparison, and empty filter values are\n * auto-removed.\n */\nexport const filterFn_equalsString = constructFilterFn({\n filter: (dataValue, filterValue) => dataValue === filterValue,\n autoRemove: (val: any) => testFalsy(val),\n resolveFilterValue: (val: any) => String(val).toLowerCase(),\n resolveDataValue: (val: any) =>\n val == null ? undefined : String(val).toLowerCase(),\n})\n\n/**\n * Keeps rows whose stringified column value exactly equals the filter text.\n *\n * Matching is case-sensitive and empty filter values are auto-removed.\n */\nexport const filterFn_equalsStringSensitive = constructFilterFn({\n filter: (dataValue, filterValue) => dataValue === filterValue,\n autoRemove: (val: any) => testFalsy(val),\n resolveFilterValue: (val: any) => String(val),\n resolveDataValue: (val: any) => (val == null ? undefined : String(val)),\n})\n\n/**\n * Keeps rows whose stringified column value starts with the filter text.\n *\n * Both values are lowercased before comparison, and empty filter values are\n * auto-removed.\n */\nexport const filterFn_startsWith = constructFilterFn({\n filter: (dataValue, filterValue) =>\n Boolean(dataValue?.startsWith(filterValue)),\n autoRemove: (val: any) => testFalsy(val),\n resolveFilterValue: (val: any) => String(val).toLowerCase(),\n resolveDataValue: (val: any) =>\n val == null ? undefined : String(val).toLowerCase(),\n})\n\n/**\n * Keeps rows whose stringified column value ends with the filter text.\n *\n * Both values are lowercased before comparison, and empty filter values are\n * auto-removed.\n */\nexport const filterFn_endsWith = constructFilterFn({\n filter: (dataValue, filterValue) => Boolean(dataValue?.endsWith(filterValue)),\n autoRemove: (val: any) => testFalsy(val),\n resolveFilterValue: (val: any) => String(val).toLowerCase(),\n resolveDataValue: (val: any) =>\n val == null ? undefined : String(val).toLowerCase(),\n})\n\n// Blank filters\n\n/**\n * Keeps rows whose column value is empty.\n *\n * A value is empty when it is nullish or stringifies to whitespace only. The\n * filter value acts as an on/off flag: `false` and blank values are\n * auto-removed.\n */\nexport const filterFn_empty = constructFilterFn({\n filter: (dataValue) => testValueEmpty(dataValue),\n autoRemove: (val: any) => testFalsy(val) || val === false,\n})\n\n/**\n * Keeps rows whose column value is not empty.\n *\n * A value is empty when it is nullish or stringifies to whitespace only. The\n * filter value acts as an on/off flag: `false` and blank values are\n * auto-removed.\n */\nexport const filterFn_notEmpty = constructFilterFn({\n filter: (dataValue) => !testValueEmpty(dataValue),\n autoRemove: (val: any) => testFalsy(val) || val === false,\n})\n\n// Number filters\n\n/**\n * Keeps rows whose value is greater than the filter value.\n *\n * Numeric values are compared numerically when both sides can be coerced to\n * numbers; otherwise normalized strings are compared.\n */\nexport const filterFn_greaterThan = constructFilterFn({\n filter: (dataValue, filterValue) =>\n compareGreaterThan(dataValue, filterValue),\n autoRemove: (val: any) => testFalsy(val),\n})\n\n/**\n * Keeps rows whose value is greater than or equal to the filter value.\n *\n * Delegates to the built-in greater-than and strict-equality comparisons.\n */\nexport const filterFn_greaterThanOrEqualTo = constructFilterFn({\n filter: (dataValue, filterValue) =>\n compareGreaterThanOrEqualTo(dataValue, filterValue),\n autoRemove: (val: any) => testFalsy(val),\n})\n\n/**\n * Keeps rows whose value is less than the filter value.\n *\n * This is implemented as the inverse of greater-than-or-equal comparison.\n */\nexport const filterFn_lessThan = constructFilterFn({\n filter: (dataValue, filterValue) =>\n !compareGreaterThanOrEqualTo(dataValue, filterValue),\n autoRemove: (val: any) => testFalsy(val),\n})\n\n/**\n * Keeps rows whose value is less than or equal to the filter value.\n *\n * This is implemented as the inverse of greater-than comparison.\n */\nexport const filterFn_lessThanOrEqualTo = constructFilterFn({\n filter: (dataValue, filterValue) =>\n !compareGreaterThan(dataValue, filterValue),\n autoRemove: (val: any) => testFalsy(val),\n})\n\n// Range filters\n\n/**\n * Keeps rows whose value falls between an exclusive min/max pair.\n *\n * Blank range endpoints are treated as open-ended.\n */\nexport const filterFn_between = constructFilterFn({\n filter: (dataValue, filterValues: [unknown, unknown]) =>\n compareBetween(dataValue, filterValues, false),\n autoRemove: (val: any) =>\n testFalsy(val) ||\n (Array.isArray(val) && testFalsy(val[0]) && testFalsy(val[1])),\n})\n\n/**\n * Keeps rows whose value falls between an inclusive min/max pair.\n *\n * Blank range endpoints are treated as open-ended.\n */\nexport const filterFn_betweenInclusive = constructFilterFn({\n filter: (dataValue, filterValues: [unknown, unknown]) =>\n compareBetween(dataValue, filterValues, true),\n autoRemove: (val: any) =>\n testFalsy(val) ||\n (Array.isArray(val) && testFalsy(val[0]) && testFalsy(val[1])),\n})\n\n/**\n * Keeps rows whose numeric value is inside an inclusive `[min, max]` range.\n *\n * Filter values are normalized so blank endpoints become open-ended and\n * reversed endpoints are swapped.\n */\nexport const filterFn_inNumberRange = constructFilterFn({\n filter: (dataValue: number, filterValue: [number, number]) => {\n const [min, max] = filterValue\n return dataValue >= min && dataValue <= max\n },\n resolveFilterValue: (val: [any, any]) => {\n const [unsafeMin, unsafeMax] = val\n\n const parsedMin =\n typeof unsafeMin !== 'number' ? parseFloat(unsafeMin) : unsafeMin\n const parsedMax =\n typeof unsafeMax !== 'number' ? parseFloat(unsafeMax) : unsafeMax\n\n let min =\n unsafeMin === null || Number.isNaN(parsedMin) ? -Infinity : parsedMin\n let max =\n unsafeMax === null || Number.isNaN(parsedMax) ? Infinity : parsedMax\n\n if (min > max) {\n const temp = min\n min = max\n max = temp\n }\n\n return [min, max] as const\n },\n autoRemove: (val: any) =>\n testFalsy(val) ||\n (Array.isArray(val) && testFalsy(val[0]) && testFalsy(val[1])),\n})\n\n// Date filters\n\n/**\n * Keeps rows whose date value is inside an inclusive `[min, max]` date range.\n *\n * Row values and range endpoints may be `Date` objects, timestamps, or\n * parseable date strings. Blank or invalid endpoints become open-ended and\n * reversed endpoints are swapped. Rows without a valid date never match.\n */\nexport const filterFn_inDateRange = constructFilterFn({\n filter: (dataValue: number, filterValue: [number, number]) => {\n const [min, max] = filterValue\n return dataValue >= min && dataValue <= max\n },\n resolveFilterValue: (val: [any, any]) => {\n const [unsafeMin, unsafeMax] = val\n\n const parsedMin = toDateTimestamp(unsafeMin)\n const parsedMax = toDateTimestamp(unsafeMax)\n\n let min = Number.isNaN(parsedMin) ? -Infinity : parsedMin\n let max = Number.isNaN(parsedMax) ? Infinity : parsedMax\n\n if (min > max) {\n const temp = min\n min = max\n max = temp\n }\n\n return [min, max] as const\n },\n resolveDataValue: (val: any) => toDateTimestamp(val),\n autoRemove: (val: any) =>\n testFalsy(val) ||\n (Array.isArray(val) && testFalsy(val[0]) && testFalsy(val[1])),\n})\n\n// Array filters\n\n/**\n * Keeps rows whose scalar column value equals at least one filter value.\n */\nexport const filterFn_arrHas = constructFilterFn({\n filter: (dataValue, filterValue: Array<unknown>) => {\n for (let i = 0; i < filterValue.length; i++) {\n if (dataValue === filterValue[i]) {\n return true\n }\n }\n return false\n },\n autoRemove: (val: any) => testFalsy(val) || !val?.length,\n})\n\n/**\n * Keeps rows whose array or string column value includes at least one filter value.\n */\nexport const filterFn_arrIncludes = constructFilterFn({\n filter: (dataValue, filterValue: Array<unknown>) => {\n if (typeof dataValue !== 'string' && !Array.isArray(dataValue)) {\n return false\n }\n\n for (let i = 0; i < filterValue.length; i++) {\n if (dataValue.includes(filterValue[i] as any)) {\n return true\n }\n }\n return false\n },\n autoRemove: (val: any) => testFalsy(val) || !val?.length,\n})\n\n/**\n * Keeps rows whose array column value includes every filter value.\n */\nexport const filterFn_arrIncludesAll = constructFilterFn({\n filter: (dataValue, filterValue: Array<unknown>) => {\n if (!Array.isArray(dataValue)) return false\n for (let i = 0; i < filterValue.length; i++) {\n if (!dataValue.includes(filterValue[i])) {\n return false\n }\n }\n return true\n },\n autoRemove: (val: any) => testFalsy(val) || !val?.length,\n})\n\n/**\n * Keeps rows whose array column value includes at least one filter value.\n */\nexport const filterFn_arrIncludesSome = constructFilterFn({\n filter: (dataValue, filterValue: Array<unknown>) => {\n if (!Array.isArray(dataValue)) return false\n for (let i = 0; i < filterValue.length; i++) {\n if (dataValue.includes(filterValue[i])) {\n return true\n }\n }\n return false\n },\n autoRemove: (val: any) => testFalsy(val) || !val?.length,\n})\n\n// Export\n\n/**\n * The built-in filter function registry.\n *\n * Registering this full object opts out of tree-shaking: every built-in\n * filter function ends up in your bundle. Prefer importing the `filterFn_*`\n * functions you actually use and registering just those in the `filterFns`\n * slot, or passing them directly to the `filterFn` column option.\n *\n * @deprecated Import individual `filterFn_*` functions instead for a smaller\n * bundle. This export still works and is not going away in v9, but built-in\n * name resolution (including `filterFn: 'auto'`) only finds functions you\n * register yourself.\n */\nexport const filterFns = {\n arrIncludes: filterFn_arrIncludes,\n arrIncludesAll: filterFn_arrIncludesAll,\n arrHas: filterFn_arrHas,\n arrIncludesSome: filterFn_arrIncludesSome,\n between: filterFn_between,\n betweenInclusive: filterFn_betweenInclusive,\n empty: filterFn_empty,\n endsWith: filterFn_endsWith,\n equals: filterFn_equals,\n equalsString: filterFn_equalsString,\n equalsStringSensitive: filterFn_equalsStringSensitive,\n inDateRange: filterFn_inDateRange,\n inNumberRange: filterFn_inNumberRange,\n includesString: filterFn_includesString,\n includesStringSensitive: filterFn_includesStringSensitive,\n notEmpty: filterFn_notEmpty,\n startsWith: filterFn_startsWith,\n weakEquals: filterFn_weakEquals,\n}\n\nexport type BuiltInFilterFn = keyof typeof filterFns\n\n// Utils\n\nfunction testFalsy(val: any) {\n return val === undefined || val === null || val === ''\n}\n\nfunction testValueEmpty(dataValue: any) {\n return dataValue == null || String(dataValue).trim() === ''\n}\n\nfunction toDateTimestamp(value: any): number {\n if (value instanceof Date) {\n return value.getTime()\n }\n if (typeof value === 'number') {\n return value\n }\n // Guard nullish and blank values explicitly: `new Date(null)` is the epoch,\n // not an invalid date.\n if (value == null || value === '') {\n return NaN\n }\n return new Date(value).getTime()\n}\n\nfunction compareGreaterThan(dataValue: any, filterValue: any): boolean {\n const numericDataValue = dataValue == null ? 0 : +dataValue\n const numericFilterValue = Number(filterValue)\n\n if (!isNaN(numericFilterValue) && !isNaN(numericDataValue)) {\n return numericDataValue > numericFilterValue\n }\n\n const stringDataValue = String(dataValue ?? '')\n .toLowerCase()\n .trim()\n const stringFilterValue = String(filterValue).toLowerCase().trim()\n return stringDataValue > stringFilterValue\n}\n\nfunction compareGreaterThanOrEqualTo(dataValue: any, filterValue: any) {\n return dataValue === filterValue || compareGreaterThan(dataValue, filterValue)\n}\n\nfunction compareBetween(\n dataValue: any,\n filterValues: [unknown, unknown],\n inclusive: boolean,\n): boolean {\n const min = filterValues[0]\n const hasMin = min !== '' && min !== undefined\n if (hasMin) {\n const passesMin = inclusive\n ? compareGreaterThanOrEqualTo(dataValue, min)\n : compareGreaterThan(dataValue, min)\n if (!passesMin) {\n return false\n }\n }\n\n const max = filterValues[1]\n if (max === '' || max === undefined) {\n return true\n }\n\n if (hasMin) {\n const numericMin = Number(min)\n const numericMax = Number(max)\n if (!isNaN(numericMin) && !isNaN(numericMax) && numericMin > numericMax) {\n return true\n }\n }\n\n return inclusive\n ? !compareGreaterThan(dataValue, max)\n : !compareGreaterThanOrEqualTo(dataValue, max)\n}\n"],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { RowData } from "
|
|
2
|
-
import { CreatedFilterFn, FilterFnDef } from "
|
|
3
|
-
import { TableFeatures } from "
|
|
1
|
+
import { RowData } from "../../types/type-utils.cjs";
|
|
2
|
+
import { CreatedFilterFn, FilterFnDef } from "./columnFilteringFeature.types.cjs";
|
|
3
|
+
import { TableFeatures } from "../../types/TableFeatures.cjs";
|
|
4
4
|
|
|
5
|
-
//#region src/
|
|
5
|
+
//#region src/features/column-filtering/filterFns.d.ts
|
|
6
6
|
/**
|
|
7
7
|
* Builds a `FilterFn` from a value-level comparator plus optional resolvers.
|
|
8
8
|
*
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { RowData } from "
|
|
2
|
-
import { CreatedFilterFn, FilterFnDef } from "
|
|
3
|
-
import { TableFeatures } from "
|
|
1
|
+
import { RowData } from "../../types/type-utils.js";
|
|
2
|
+
import { CreatedFilterFn, FilterFnDef } from "./columnFilteringFeature.types.js";
|
|
3
|
+
import { TableFeatures } from "../../types/TableFeatures.js";
|
|
4
4
|
|
|
5
|
-
//#region src/
|
|
5
|
+
//#region src/features/column-filtering/filterFns.d.ts
|
|
6
6
|
/**
|
|
7
7
|
* Builds a `FilterFn` from a value-level comparator plus optional resolvers.
|
|
8
8
|
*
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filterFns.js","names":[],"sources":["../../../src/features/column-filtering/filterFns.ts"],"sourcesContent":["import type {\n CreatedFilterFn,\n ExtractFilterMeta,\n FilterFnDef,\n} from './columnFilteringFeature.types'\nimport type { RowData } from '../../types/type-utils'\nimport type { TableFeatures } from '../../types/TableFeatures'\nimport type { Row } from '../../types/Row'\n\n/**\n * Builds a `FilterFn` from a value-level comparator plus optional resolvers.\n *\n * The `filter` comparator receives the row's data value (already passed\n * through `resolveDataValue` when one is defined) and the filter value\n * (already passed through `resolveFilterValue` by the table). Keeping\n * normalization in the resolvers means a variant of an existing filter\n * function only has to swap the resolvers, not re-implement the comparison.\n *\n * The definition is attached to the returned function, so a variant can be\n * created by spreading a built-in filter function and overriding what differs:\n *\n * ```ts\n * const normalize = (value: unknown) =>\n * String(value ?? '')\n * .toLowerCase()\n * .normalize('NFD')\n * .replace(/\\p{Diacritic}/gu, '')\n *\n * const includesStringIgnoreDiacritics = constructFilterFn({\n * ...filterFn_includesString,\n * resolveFilterValue: normalize,\n * resolveDataValue: normalize,\n * })\n * ```\n *\n * Note: the table applies `resolveFilterValue` once per filter before any rows\n * are tested. When calling a filter function directly (outside of a table),\n * apply it yourself: `fn(row, columnId, fn.resolveFilterValue?.(value) ?? value)`.\n */\nexport function constructFilterFn<\n TFeatures extends TableFeatures = any,\n TData extends RowData = any,\n>(def: FilterFnDef<TFeatures, TData>): CreatedFilterFn<TFeatures, TData> {\n const filterFn: CreatedFilterFn<TFeatures, TData> = Object.assign(\n <TRowFeatures extends TableFeatures, TRowData extends RowData>(\n row: Row<TRowFeatures, TRowData>,\n columnId: string,\n filterValue: any,\n addMeta?: (meta: ExtractFilterMeta<TRowFeatures>) => void,\n ): boolean => {\n const rawValue = row.getValue(columnId)\n const dataValue = filterFn.resolveDataValue\n ? filterFn.resolveDataValue(rawValue)\n : rawValue\n // The def's comparator is typed against the factory's TFeatures/TData;\n // the caller's row generics are erased at this boundary.\n return filterFn.filter(\n dataValue,\n filterValue,\n row as any,\n columnId,\n addMeta as any,\n )\n },\n def,\n )\n return filterFn\n}\n\n// Basic filters\n\n/**\n * Keeps rows whose column value is strictly equal to the filter value.\n *\n * Uses JavaScript `===` comparison and auto-removes empty filter values.\n */\nexport const filterFn_equals = constructFilterFn({\n filter: (dataValue, filterValue) => dataValue === filterValue,\n autoRemove: (val: any) => testFalsy(val),\n})\n\n/**\n * Keeps rows whose column value is loosely equal to the filter value.\n *\n * Uses JavaScript `==` comparison and auto-removes empty filter values. This is\n * useful for matching string input against numeric row values.\n */\nexport const filterFn_weakEquals = constructFilterFn({\n filter: (dataValue, filterValue) => dataValue == filterValue,\n autoRemove: (val: any) => testFalsy(val),\n})\n\n// String filters\n\n/**\n * Keeps rows whose stringified column value includes the filter text.\n *\n * Matching is case-sensitive and empty filter values are auto-removed.\n */\nexport const filterFn_includesStringSensitive = constructFilterFn({\n filter: (dataValue, filterValue) => Boolean(dataValue?.includes(filterValue)),\n autoRemove: (val: any) => testFalsy(val),\n resolveFilterValue: (val: any) => String(val),\n resolveDataValue: (val: any) => (val == null ? undefined : String(val)),\n})\n\n/**\n * Keeps rows whose stringified column value includes the filter text.\n *\n * Both values are lowercased before comparison, and empty filter values are\n * auto-removed.\n */\nexport const filterFn_includesString = constructFilterFn({\n filter: (dataValue, filterValue) => Boolean(dataValue?.includes(filterValue)),\n autoRemove: (val: any) => testFalsy(val),\n resolveFilterValue: (val: any) => String(val).toLowerCase(),\n resolveDataValue: (val: any) =>\n val == null ? undefined : String(val).toLowerCase(),\n})\n\n/**\n * Keeps rows whose stringified column value equals the filter text.\n *\n * Both values are lowercased before comparison, and empty filter values are\n * auto-removed.\n */\nexport const filterFn_equalsString = constructFilterFn({\n filter: (dataValue, filterValue) => dataValue === filterValue,\n autoRemove: (val: any) => testFalsy(val),\n resolveFilterValue: (val: any) => String(val).toLowerCase(),\n resolveDataValue: (val: any) =>\n val == null ? undefined : String(val).toLowerCase(),\n})\n\n/**\n * Keeps rows whose stringified column value exactly equals the filter text.\n *\n * Matching is case-sensitive and empty filter values are auto-removed.\n */\nexport const filterFn_equalsStringSensitive = constructFilterFn({\n filter: (dataValue, filterValue) => dataValue === filterValue,\n autoRemove: (val: any) => testFalsy(val),\n resolveFilterValue: (val: any) => String(val),\n resolveDataValue: (val: any) => (val == null ? undefined : String(val)),\n})\n\n/**\n * Keeps rows whose stringified column value starts with the filter text.\n *\n * Both values are lowercased before comparison, and empty filter values are\n * auto-removed.\n */\nexport const filterFn_startsWith = constructFilterFn({\n filter: (dataValue, filterValue) =>\n Boolean(dataValue?.startsWith(filterValue)),\n autoRemove: (val: any) => testFalsy(val),\n resolveFilterValue: (val: any) => String(val).toLowerCase(),\n resolveDataValue: (val: any) =>\n val == null ? undefined : String(val).toLowerCase(),\n})\n\n/**\n * Keeps rows whose stringified column value ends with the filter text.\n *\n * Both values are lowercased before comparison, and empty filter values are\n * auto-removed.\n */\nexport const filterFn_endsWith = constructFilterFn({\n filter: (dataValue, filterValue) => Boolean(dataValue?.endsWith(filterValue)),\n autoRemove: (val: any) => testFalsy(val),\n resolveFilterValue: (val: any) => String(val).toLowerCase(),\n resolveDataValue: (val: any) =>\n val == null ? undefined : String(val).toLowerCase(),\n})\n\n// Blank filters\n\n/**\n * Keeps rows whose column value is empty.\n *\n * A value is empty when it is nullish or stringifies to whitespace only. The\n * filter value acts as an on/off flag: `false` and blank values are\n * auto-removed.\n */\nexport const filterFn_empty = constructFilterFn({\n filter: (dataValue) => testValueEmpty(dataValue),\n autoRemove: (val: any) => testFalsy(val) || val === false,\n})\n\n/**\n * Keeps rows whose column value is not empty.\n *\n * A value is empty when it is nullish or stringifies to whitespace only. The\n * filter value acts as an on/off flag: `false` and blank values are\n * auto-removed.\n */\nexport const filterFn_notEmpty = constructFilterFn({\n filter: (dataValue) => !testValueEmpty(dataValue),\n autoRemove: (val: any) => testFalsy(val) || val === false,\n})\n\n// Number filters\n\n/**\n * Keeps rows whose value is greater than the filter value.\n *\n * Numeric values are compared numerically when both sides can be coerced to\n * numbers; otherwise normalized strings are compared.\n */\nexport const filterFn_greaterThan = constructFilterFn({\n filter: (dataValue, filterValue) =>\n compareGreaterThan(dataValue, filterValue),\n autoRemove: (val: any) => testFalsy(val),\n})\n\n/**\n * Keeps rows whose value is greater than or equal to the filter value.\n *\n * Delegates to the built-in greater-than and strict-equality comparisons.\n */\nexport const filterFn_greaterThanOrEqualTo = constructFilterFn({\n filter: (dataValue, filterValue) =>\n compareGreaterThanOrEqualTo(dataValue, filterValue),\n autoRemove: (val: any) => testFalsy(val),\n})\n\n/**\n * Keeps rows whose value is less than the filter value.\n *\n * This is implemented as the inverse of greater-than-or-equal comparison.\n */\nexport const filterFn_lessThan = constructFilterFn({\n filter: (dataValue, filterValue) =>\n !compareGreaterThanOrEqualTo(dataValue, filterValue),\n autoRemove: (val: any) => testFalsy(val),\n})\n\n/**\n * Keeps rows whose value is less than or equal to the filter value.\n *\n * This is implemented as the inverse of greater-than comparison.\n */\nexport const filterFn_lessThanOrEqualTo = constructFilterFn({\n filter: (dataValue, filterValue) =>\n !compareGreaterThan(dataValue, filterValue),\n autoRemove: (val: any) => testFalsy(val),\n})\n\n// Range filters\n\n/**\n * Keeps rows whose value falls between an exclusive min/max pair.\n *\n * Blank range endpoints are treated as open-ended.\n */\nexport const filterFn_between = constructFilterFn({\n filter: (dataValue, filterValues: [unknown, unknown]) =>\n compareBetween(dataValue, filterValues, false),\n autoRemove: (val: any) =>\n testFalsy(val) ||\n (Array.isArray(val) && testFalsy(val[0]) && testFalsy(val[1])),\n})\n\n/**\n * Keeps rows whose value falls between an inclusive min/max pair.\n *\n * Blank range endpoints are treated as open-ended.\n */\nexport const filterFn_betweenInclusive = constructFilterFn({\n filter: (dataValue, filterValues: [unknown, unknown]) =>\n compareBetween(dataValue, filterValues, true),\n autoRemove: (val: any) =>\n testFalsy(val) ||\n (Array.isArray(val) && testFalsy(val[0]) && testFalsy(val[1])),\n})\n\n/**\n * Keeps rows whose numeric value is inside an inclusive `[min, max]` range.\n *\n * Filter values are normalized so blank endpoints become open-ended and\n * reversed endpoints are swapped.\n */\nexport const filterFn_inNumberRange = constructFilterFn({\n filter: (dataValue: number, filterValue: [number, number]) => {\n const [min, max] = filterValue\n return dataValue >= min && dataValue <= max\n },\n resolveFilterValue: (val: [any, any]) => {\n const [unsafeMin, unsafeMax] = val\n\n const parsedMin =\n typeof unsafeMin !== 'number' ? parseFloat(unsafeMin) : unsafeMin\n const parsedMax =\n typeof unsafeMax !== 'number' ? parseFloat(unsafeMax) : unsafeMax\n\n let min =\n unsafeMin === null || Number.isNaN(parsedMin) ? -Infinity : parsedMin\n let max =\n unsafeMax === null || Number.isNaN(parsedMax) ? Infinity : parsedMax\n\n if (min > max) {\n const temp = min\n min = max\n max = temp\n }\n\n return [min, max] as const\n },\n autoRemove: (val: any) =>\n testFalsy(val) ||\n (Array.isArray(val) && testFalsy(val[0]) && testFalsy(val[1])),\n})\n\n// Date filters\n\n/**\n * Keeps rows whose date value is inside an inclusive `[min, max]` date range.\n *\n * Row values and range endpoints may be `Date` objects, timestamps, or\n * parseable date strings. Blank or invalid endpoints become open-ended and\n * reversed endpoints are swapped. Rows without a valid date never match.\n */\nexport const filterFn_inDateRange = constructFilterFn({\n filter: (dataValue: number, filterValue: [number, number]) => {\n const [min, max] = filterValue\n return dataValue >= min && dataValue <= max\n },\n resolveFilterValue: (val: [any, any]) => {\n const [unsafeMin, unsafeMax] = val\n\n const parsedMin = toDateTimestamp(unsafeMin)\n const parsedMax = toDateTimestamp(unsafeMax)\n\n let min = Number.isNaN(parsedMin) ? -Infinity : parsedMin\n let max = Number.isNaN(parsedMax) ? Infinity : parsedMax\n\n if (min > max) {\n const temp = min\n min = max\n max = temp\n }\n\n return [min, max] as const\n },\n resolveDataValue: (val: any) => toDateTimestamp(val),\n autoRemove: (val: any) =>\n testFalsy(val) ||\n (Array.isArray(val) && testFalsy(val[0]) && testFalsy(val[1])),\n})\n\n// Array filters\n\n/**\n * Keeps rows whose scalar column value equals at least one filter value.\n */\nexport const filterFn_arrHas = constructFilterFn({\n filter: (dataValue, filterValue: Array<unknown>) => {\n for (let i = 0; i < filterValue.length; i++) {\n if (dataValue === filterValue[i]) {\n return true\n }\n }\n return false\n },\n autoRemove: (val: any) => testFalsy(val) || !val?.length,\n})\n\n/**\n * Keeps rows whose array or string column value includes at least one filter value.\n */\nexport const filterFn_arrIncludes = constructFilterFn({\n filter: (dataValue, filterValue: Array<unknown>) => {\n if (typeof dataValue !== 'string' && !Array.isArray(dataValue)) {\n return false\n }\n\n for (let i = 0; i < filterValue.length; i++) {\n if (dataValue.includes(filterValue[i] as any)) {\n return true\n }\n }\n return false\n },\n autoRemove: (val: any) => testFalsy(val) || !val?.length,\n})\n\n/**\n * Keeps rows whose array column value includes every filter value.\n */\nexport const filterFn_arrIncludesAll = constructFilterFn({\n filter: (dataValue, filterValue: Array<unknown>) => {\n if (!Array.isArray(dataValue)) return false\n for (let i = 0; i < filterValue.length; i++) {\n if (!dataValue.includes(filterValue[i])) {\n return false\n }\n }\n return true\n },\n autoRemove: (val: any) => testFalsy(val) || !val?.length,\n})\n\n/**\n * Keeps rows whose array column value includes at least one filter value.\n */\nexport const filterFn_arrIncludesSome = constructFilterFn({\n filter: (dataValue, filterValue: Array<unknown>) => {\n if (!Array.isArray(dataValue)) return false\n for (let i = 0; i < filterValue.length; i++) {\n if (dataValue.includes(filterValue[i])) {\n return true\n }\n }\n return false\n },\n autoRemove: (val: any) => testFalsy(val) || !val?.length,\n})\n\n// Export\n\n/**\n * The built-in filter function registry.\n *\n * Registering this full object opts out of tree-shaking: every built-in\n * filter function ends up in your bundle. Prefer importing the `filterFn_*`\n * functions you actually use and registering just those in the `filterFns`\n * slot, or passing them directly to the `filterFn` column option.\n *\n * @deprecated Import individual `filterFn_*` functions instead for a smaller\n * bundle. This export still works and is not going away in v9, but built-in\n * name resolution (including `filterFn: 'auto'`) only finds functions you\n * register yourself.\n */\nexport const filterFns = {\n arrIncludes: filterFn_arrIncludes,\n arrIncludesAll: filterFn_arrIncludesAll,\n arrHas: filterFn_arrHas,\n arrIncludesSome: filterFn_arrIncludesSome,\n between: filterFn_between,\n betweenInclusive: filterFn_betweenInclusive,\n empty: filterFn_empty,\n endsWith: filterFn_endsWith,\n equals: filterFn_equals,\n equalsString: filterFn_equalsString,\n equalsStringSensitive: filterFn_equalsStringSensitive,\n inDateRange: filterFn_inDateRange,\n inNumberRange: filterFn_inNumberRange,\n includesString: filterFn_includesString,\n includesStringSensitive: filterFn_includesStringSensitive,\n notEmpty: filterFn_notEmpty,\n startsWith: filterFn_startsWith,\n weakEquals: filterFn_weakEquals,\n}\n\nexport type BuiltInFilterFn = keyof typeof filterFns\n\n// Utils\n\nfunction testFalsy(val: any) {\n return val === undefined || val === null || val === ''\n}\n\nfunction testValueEmpty(dataValue: any) {\n return dataValue == null || String(dataValue).trim() === ''\n}\n\nfunction toDateTimestamp(value: any): number {\n if (value instanceof Date) {\n return value.getTime()\n }\n if (typeof value === 'number') {\n return value\n }\n // Guard nullish and blank values explicitly: `new Date(null)` is the epoch,\n // not an invalid date.\n if (value == null || value === '') {\n return NaN\n }\n return new Date(value).getTime()\n}\n\nfunction compareGreaterThan(dataValue: any, filterValue: any): boolean {\n const numericDataValue = dataValue == null ? 0 : +dataValue\n const numericFilterValue = Number(filterValue)\n\n if (!isNaN(numericFilterValue) && !isNaN(numericDataValue)) {\n return numericDataValue > numericFilterValue\n }\n\n const stringDataValue = String(dataValue ?? '')\n .toLowerCase()\n .trim()\n const stringFilterValue = String(filterValue).toLowerCase().trim()\n return stringDataValue > stringFilterValue\n}\n\nfunction compareGreaterThanOrEqualTo(dataValue: any, filterValue: any) {\n return dataValue === filterValue || compareGreaterThan(dataValue, filterValue)\n}\n\nfunction compareBetween(\n dataValue: any,\n filterValues: [unknown, unknown],\n inclusive: boolean,\n): boolean {\n const min = filterValues[0]\n const hasMin = min !== '' && min !== undefined\n if (hasMin) {\n const passesMin = inclusive\n ? compareGreaterThanOrEqualTo(dataValue, min)\n : compareGreaterThan(dataValue, min)\n if (!passesMin) {\n return false\n }\n }\n\n const max = filterValues[1]\n if (max === '' || max === undefined) {\n return true\n }\n\n if (hasMin) {\n const numericMin = Number(min)\n const numericMax = Number(max)\n if (!isNaN(numericMin) && !isNaN(numericMax) && numericMin > numericMax) {\n return true\n }\n }\n\n return inclusive\n ? !compareGreaterThan(dataValue, max)\n : !compareGreaterThanOrEqualTo(dataValue, max)\n}\n"],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ const require_columnGroupingFeature_utils = require('./columnGroupingFeature.uti
|
|
|
3
3
|
|
|
4
4
|
//#region src/features/column-grouping/columnGroupingFeature.ts
|
|
5
5
|
/**
|
|
6
|
-
* Feature that adds column grouping state
|
|
6
|
+
* Feature that adds column grouping state and grouped row APIs.
|
|
7
7
|
*/
|
|
8
8
|
const columnGroupingFeature = {
|
|
9
9
|
getInitialState: (initialState) => {
|
|
@@ -12,12 +12,6 @@ const columnGroupingFeature = {
|
|
|
12
12
|
...initialState
|
|
13
13
|
};
|
|
14
14
|
},
|
|
15
|
-
getDefaultColumnDef: () => {
|
|
16
|
-
return {
|
|
17
|
-
aggregatedCell: ({ getValue }) => getValue()?.toString?.() ?? null,
|
|
18
|
-
aggregationFn: "auto"
|
|
19
|
-
};
|
|
20
|
-
},
|
|
21
15
|
getDefaultTableOptions: (table) => {
|
|
22
16
|
return {
|
|
23
17
|
onGroupingChange: require_utils.makeStateUpdater("grouping", table),
|
|
@@ -27,8 +21,7 @@ const columnGroupingFeature = {
|
|
|
27
21
|
assignCellPrototype: (prototype, table) => {
|
|
28
22
|
require_utils.assignPrototypeAPIs("columnGroupingFeature", prototype, table, {
|
|
29
23
|
cell_getIsGrouped: { fn: (cell) => require_columnGroupingFeature_utils.cell_getIsGrouped(cell) },
|
|
30
|
-
cell_getIsPlaceholder: { fn: (cell) => require_columnGroupingFeature_utils.cell_getIsPlaceholder(cell) }
|
|
31
|
-
cell_getIsAggregated: { fn: (cell) => require_columnGroupingFeature_utils.cell_getIsAggregated(cell) }
|
|
24
|
+
cell_getIsPlaceholder: { fn: (cell) => require_columnGroupingFeature_utils.cell_getIsPlaceholder(cell) }
|
|
32
25
|
});
|
|
33
26
|
},
|
|
34
27
|
assignColumnPrototype: (prototype, table) => {
|
|
@@ -37,9 +30,7 @@ const columnGroupingFeature = {
|
|
|
37
30
|
column_getCanGroup: { fn: (column) => require_columnGroupingFeature_utils.column_getCanGroup(column) },
|
|
38
31
|
column_getIsGrouped: { fn: (column) => require_columnGroupingFeature_utils.column_getIsGrouped(column) },
|
|
39
32
|
column_getGroupedIndex: { fn: (column) => require_columnGroupingFeature_utils.column_getGroupedIndex(column) },
|
|
40
|
-
column_getToggleGroupingHandler: { fn: (column) => require_columnGroupingFeature_utils.column_getToggleGroupingHandler(column) }
|
|
41
|
-
column_getAutoAggregationFn: { fn: (column) => require_columnGroupingFeature_utils.column_getAutoAggregationFn(column) },
|
|
42
|
-
column_getAggregationFn: { fn: (column) => require_columnGroupingFeature_utils.column_getAggregationFn(column) }
|
|
33
|
+
column_getToggleGroupingHandler: { fn: (column) => require_columnGroupingFeature_utils.column_getToggleGroupingHandler(column) }
|
|
43
34
|
});
|
|
44
35
|
},
|
|
45
36
|
assignRowPrototype: (prototype, table) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"columnGroupingFeature.cjs","names":["getDefaultGroupingState","makeStateUpdater","cell_getIsGrouped","cell_getIsPlaceholder","
|
|
1
|
+
{"version":3,"file":"columnGroupingFeature.cjs","names":["getDefaultGroupingState","makeStateUpdater","cell_getIsGrouped","cell_getIsPlaceholder","column_toggleGrouping","column_getCanGroup","column_getIsGrouped","column_getGroupedIndex","column_getToggleGroupingHandler","row_getIsGrouped","row_getGroupingValue","makeObjectMap","table_setGrouping","table_resetGrouping"],"sources":["../../../src/features/column-grouping/columnGroupingFeature.ts"],"sourcesContent":["import {\n assignPrototypeAPIs,\n assignTableAPIs,\n makeObjectMap,\n makeStateUpdater,\n} from '../../utils'\nimport {\n cell_getIsGrouped,\n cell_getIsPlaceholder,\n column_getCanGroup,\n column_getGroupedIndex,\n column_getIsGrouped,\n column_getToggleGroupingHandler,\n column_toggleGrouping,\n getDefaultGroupingState,\n row_getGroupingValue,\n row_getIsGrouped,\n table_resetGrouping,\n table_setGrouping,\n} from './columnGroupingFeature.utils'\nimport type { TableFeature } from '../../types/TableFeatures'\n\n/**\n * Feature that adds column grouping state and grouped row APIs.\n */\nexport const columnGroupingFeature: TableFeature = {\n getInitialState: (initialState) => {\n return {\n grouping: getDefaultGroupingState(),\n ...initialState,\n }\n },\n\n getDefaultTableOptions: (table) => {\n return {\n onGroupingChange: makeStateUpdater('grouping', table),\n groupedColumnMode: 'reorder',\n }\n },\n\n assignCellPrototype: (prototype, table) => {\n assignPrototypeAPIs('columnGroupingFeature', prototype, table, {\n cell_getIsGrouped: {\n fn: (cell) => cell_getIsGrouped(cell),\n },\n cell_getIsPlaceholder: {\n fn: (cell) => cell_getIsPlaceholder(cell),\n },\n })\n },\n\n assignColumnPrototype: (prototype, table) => {\n assignPrototypeAPIs('columnGroupingFeature', prototype, table, {\n column_toggleGrouping: {\n fn: (column) => column_toggleGrouping(column),\n },\n column_getCanGroup: {\n fn: (column) => column_getCanGroup(column),\n },\n column_getIsGrouped: {\n fn: (column) => column_getIsGrouped(column),\n },\n column_getGroupedIndex: {\n fn: (column) => column_getGroupedIndex(column),\n },\n column_getToggleGroupingHandler: {\n fn: (column) => column_getToggleGroupingHandler(column),\n },\n })\n },\n\n assignRowPrototype: (prototype, table) => {\n assignPrototypeAPIs('columnGroupingFeature', prototype, table, {\n row_getIsGrouped: {\n fn: (row) => row_getIsGrouped(row),\n },\n row_getGroupingValue: {\n fn: (row, columnId) => row_getGroupingValue(row, columnId),\n },\n })\n },\n\n initRowInstanceData: (row) => {\n ;(row as any)._groupingValuesCache = makeObjectMap()\n },\n\n constructTableAPIs: (table) => {\n assignTableAPIs('columnGroupingFeature', table, {\n table_setGrouping: {\n fn: (updater) => table_setGrouping(table, updater),\n },\n table_resetGrouping: {\n fn: (defaultState) => table_resetGrouping(table, defaultState),\n },\n })\n },\n}\n"],"mappings":";;;;;;;AAyBA,MAAa,wBAAsC;CACjD,kBAAkB,iBAAiB;EACjC,OAAO;GACL,UAAUA,4DAAwB;GAClC,GAAG;EACL;CACF;CAEA,yBAAyB,UAAU;EACjC,OAAO;GACL,kBAAkBC,+BAAiB,YAAY,KAAK;GACpD,mBAAmB;EACrB;CACF;CAEA,sBAAsB,WAAW,UAAU;EACzC,kCAAoB,yBAAyB,WAAW,OAAO;GAC7D,mBAAmB,EACjB,KAAK,SAASC,sDAAkB,IAAI,EACtC;GACA,uBAAuB,EACrB,KAAK,SAASC,0DAAsB,IAAI,EAC1C;EACF,CAAC;CACH;CAEA,wBAAwB,WAAW,UAAU;EAC3C,kCAAoB,yBAAyB,WAAW,OAAO;GAC7D,uBAAuB,EACrB,KAAK,WAAWC,0DAAsB,MAAM,EAC9C;GACA,oBAAoB,EAClB,KAAK,WAAWC,uDAAmB,MAAM,EAC3C;GACA,qBAAqB,EACnB,KAAK,WAAWC,wDAAoB,MAAM,EAC5C;GACA,wBAAwB,EACtB,KAAK,WAAWC,2DAAuB,MAAM,EAC/C;GACA,iCAAiC,EAC/B,KAAK,WAAWC,oEAAgC,MAAM,EACxD;EACF,CAAC;CACH;CAEA,qBAAqB,WAAW,UAAU;EACxC,kCAAoB,yBAAyB,WAAW,OAAO;GAC7D,kBAAkB,EAChB,KAAK,QAAQC,qDAAiB,GAAG,EACnC;GACA,sBAAsB,EACpB,KAAK,KAAK,aAAaC,yDAAqB,KAAK,QAAQ,EAC3D;EACF,CAAC;CACH;CAEA,sBAAsB,QAAQ;EAC3B,AAAC,IAAY,uBAAuBC,4BAAc;CACrD;CAEA,qBAAqB,UAAU;EAC7B,8BAAgB,yBAAyB,OAAO;GAC9C,mBAAmB,EACjB,KAAK,YAAYC,sDAAkB,OAAO,OAAO,EACnD;GACA,qBAAqB,EACnB,KAAK,iBAAiBC,wDAAoB,OAAO,YAAY,EAC/D;EACF,CAAC;CACH;AACF"}
|
|
@@ -2,7 +2,7 @@ import { TableFeature } from "../../types/TableFeatures.cjs";
|
|
|
2
2
|
|
|
3
3
|
//#region src/features/column-grouping/columnGroupingFeature.d.ts
|
|
4
4
|
/**
|
|
5
|
-
* Feature that adds column grouping state
|
|
5
|
+
* Feature that adds column grouping state and grouped row APIs.
|
|
6
6
|
*/
|
|
7
7
|
declare const columnGroupingFeature: TableFeature;
|
|
8
8
|
//#endregion
|
|
@@ -2,7 +2,7 @@ import { TableFeature } from "../../types/TableFeatures.js";
|
|
|
2
2
|
|
|
3
3
|
//#region src/features/column-grouping/columnGroupingFeature.d.ts
|
|
4
4
|
/**
|
|
5
|
-
* Feature that adds column grouping state
|
|
5
|
+
* Feature that adds column grouping state and grouped row APIs.
|
|
6
6
|
*/
|
|
7
7
|
declare const columnGroupingFeature: TableFeature;
|
|
8
8
|
//#endregion
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { assignPrototypeAPIs, assignTableAPIs, makeObjectMap, makeStateUpdater } from "../../utils.js";
|
|
2
|
-
import {
|
|
2
|
+
import { cell_getIsGrouped, cell_getIsPlaceholder, column_getCanGroup, column_getGroupedIndex, column_getIsGrouped, column_getToggleGroupingHandler, column_toggleGrouping, getDefaultGroupingState, row_getGroupingValue, row_getIsGrouped, table_resetGrouping, table_setGrouping } from "./columnGroupingFeature.utils.js";
|
|
3
3
|
|
|
4
4
|
//#region src/features/column-grouping/columnGroupingFeature.ts
|
|
5
5
|
/**
|
|
6
|
-
* Feature that adds column grouping state
|
|
6
|
+
* Feature that adds column grouping state and grouped row APIs.
|
|
7
7
|
*/
|
|
8
8
|
const columnGroupingFeature = {
|
|
9
9
|
getInitialState: (initialState) => {
|
|
@@ -12,12 +12,6 @@ const columnGroupingFeature = {
|
|
|
12
12
|
...initialState
|
|
13
13
|
};
|
|
14
14
|
},
|
|
15
|
-
getDefaultColumnDef: () => {
|
|
16
|
-
return {
|
|
17
|
-
aggregatedCell: ({ getValue }) => getValue()?.toString?.() ?? null,
|
|
18
|
-
aggregationFn: "auto"
|
|
19
|
-
};
|
|
20
|
-
},
|
|
21
15
|
getDefaultTableOptions: (table) => {
|
|
22
16
|
return {
|
|
23
17
|
onGroupingChange: makeStateUpdater("grouping", table),
|
|
@@ -27,8 +21,7 @@ const columnGroupingFeature = {
|
|
|
27
21
|
assignCellPrototype: (prototype, table) => {
|
|
28
22
|
assignPrototypeAPIs("columnGroupingFeature", prototype, table, {
|
|
29
23
|
cell_getIsGrouped: { fn: (cell) => cell_getIsGrouped(cell) },
|
|
30
|
-
cell_getIsPlaceholder: { fn: (cell) => cell_getIsPlaceholder(cell) }
|
|
31
|
-
cell_getIsAggregated: { fn: (cell) => cell_getIsAggregated(cell) }
|
|
24
|
+
cell_getIsPlaceholder: { fn: (cell) => cell_getIsPlaceholder(cell) }
|
|
32
25
|
});
|
|
33
26
|
},
|
|
34
27
|
assignColumnPrototype: (prototype, table) => {
|
|
@@ -37,9 +30,7 @@ const columnGroupingFeature = {
|
|
|
37
30
|
column_getCanGroup: { fn: (column) => column_getCanGroup(column) },
|
|
38
31
|
column_getIsGrouped: { fn: (column) => column_getIsGrouped(column) },
|
|
39
32
|
column_getGroupedIndex: { fn: (column) => column_getGroupedIndex(column) },
|
|
40
|
-
column_getToggleGroupingHandler: { fn: (column) => column_getToggleGroupingHandler(column) }
|
|
41
|
-
column_getAutoAggregationFn: { fn: (column) => column_getAutoAggregationFn(column) },
|
|
42
|
-
column_getAggregationFn: { fn: (column) => column_getAggregationFn(column) }
|
|
33
|
+
column_getToggleGroupingHandler: { fn: (column) => column_getToggleGroupingHandler(column) }
|
|
43
34
|
});
|
|
44
35
|
},
|
|
45
36
|
assignRowPrototype: (prototype, table) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"columnGroupingFeature.js","names":[],"sources":["../../../src/features/column-grouping/columnGroupingFeature.ts"],"sourcesContent":["import {\n assignPrototypeAPIs,\n assignTableAPIs,\n makeObjectMap,\n makeStateUpdater,\n} from '../../utils'\nimport {\n
|
|
1
|
+
{"version":3,"file":"columnGroupingFeature.js","names":[],"sources":["../../../src/features/column-grouping/columnGroupingFeature.ts"],"sourcesContent":["import {\n assignPrototypeAPIs,\n assignTableAPIs,\n makeObjectMap,\n makeStateUpdater,\n} from '../../utils'\nimport {\n cell_getIsGrouped,\n cell_getIsPlaceholder,\n column_getCanGroup,\n column_getGroupedIndex,\n column_getIsGrouped,\n column_getToggleGroupingHandler,\n column_toggleGrouping,\n getDefaultGroupingState,\n row_getGroupingValue,\n row_getIsGrouped,\n table_resetGrouping,\n table_setGrouping,\n} from './columnGroupingFeature.utils'\nimport type { TableFeature } from '../../types/TableFeatures'\n\n/**\n * Feature that adds column grouping state and grouped row APIs.\n */\nexport const columnGroupingFeature: TableFeature = {\n getInitialState: (initialState) => {\n return {\n grouping: getDefaultGroupingState(),\n ...initialState,\n }\n },\n\n getDefaultTableOptions: (table) => {\n return {\n onGroupingChange: makeStateUpdater('grouping', table),\n groupedColumnMode: 'reorder',\n }\n },\n\n assignCellPrototype: (prototype, table) => {\n assignPrototypeAPIs('columnGroupingFeature', prototype, table, {\n cell_getIsGrouped: {\n fn: (cell) => cell_getIsGrouped(cell),\n },\n cell_getIsPlaceholder: {\n fn: (cell) => cell_getIsPlaceholder(cell),\n },\n })\n },\n\n assignColumnPrototype: (prototype, table) => {\n assignPrototypeAPIs('columnGroupingFeature', prototype, table, {\n column_toggleGrouping: {\n fn: (column) => column_toggleGrouping(column),\n },\n column_getCanGroup: {\n fn: (column) => column_getCanGroup(column),\n },\n column_getIsGrouped: {\n fn: (column) => column_getIsGrouped(column),\n },\n column_getGroupedIndex: {\n fn: (column) => column_getGroupedIndex(column),\n },\n column_getToggleGroupingHandler: {\n fn: (column) => column_getToggleGroupingHandler(column),\n },\n })\n },\n\n assignRowPrototype: (prototype, table) => {\n assignPrototypeAPIs('columnGroupingFeature', prototype, table, {\n row_getIsGrouped: {\n fn: (row) => row_getIsGrouped(row),\n },\n row_getGroupingValue: {\n fn: (row, columnId) => row_getGroupingValue(row, columnId),\n },\n })\n },\n\n initRowInstanceData: (row) => {\n ;(row as any)._groupingValuesCache = makeObjectMap()\n },\n\n constructTableAPIs: (table) => {\n assignTableAPIs('columnGroupingFeature', table, {\n table_setGrouping: {\n fn: (updater) => table_setGrouping(table, updater),\n },\n table_resetGrouping: {\n fn: (defaultState) => table_resetGrouping(table, defaultState),\n },\n })\n },\n}\n"],"mappings":";;;;;;;AAyBA,MAAa,wBAAsC;CACjD,kBAAkB,iBAAiB;EACjC,OAAO;GACL,UAAU,wBAAwB;GAClC,GAAG;EACL;CACF;CAEA,yBAAyB,UAAU;EACjC,OAAO;GACL,kBAAkB,iBAAiB,YAAY,KAAK;GACpD,mBAAmB;EACrB;CACF;CAEA,sBAAsB,WAAW,UAAU;EACzC,oBAAoB,yBAAyB,WAAW,OAAO;GAC7D,mBAAmB,EACjB,KAAK,SAAS,kBAAkB,IAAI,EACtC;GACA,uBAAuB,EACrB,KAAK,SAAS,sBAAsB,IAAI,EAC1C;EACF,CAAC;CACH;CAEA,wBAAwB,WAAW,UAAU;EAC3C,oBAAoB,yBAAyB,WAAW,OAAO;GAC7D,uBAAuB,EACrB,KAAK,WAAW,sBAAsB,MAAM,EAC9C;GACA,oBAAoB,EAClB,KAAK,WAAW,mBAAmB,MAAM,EAC3C;GACA,qBAAqB,EACnB,KAAK,WAAW,oBAAoB,MAAM,EAC5C;GACA,wBAAwB,EACtB,KAAK,WAAW,uBAAuB,MAAM,EAC/C;GACA,iCAAiC,EAC/B,KAAK,WAAW,gCAAgC,MAAM,EACxD;EACF,CAAC;CACH;CAEA,qBAAqB,WAAW,UAAU;EACxC,oBAAoB,yBAAyB,WAAW,OAAO;GAC7D,kBAAkB,EAChB,KAAK,QAAQ,iBAAiB,GAAG,EACnC;GACA,sBAAsB,EACpB,KAAK,KAAK,aAAa,qBAAqB,KAAK,QAAQ,EAC3D;EACF,CAAC;CACH;CAEA,sBAAsB,QAAQ;EAC3B,AAAC,IAAY,uBAAuB,cAAc;CACrD;CAEA,qBAAqB,UAAU;EAC7B,gBAAgB,yBAAyB,OAAO;GAC9C,mBAAmB,EACjB,KAAK,YAAY,kBAAkB,OAAO,OAAO,EACnD;GACA,qBAAqB,EACnB,KAAK,iBAAiB,oBAAoB,OAAO,YAAY,EAC/D;EACF,CAAC;CACH;AACF"}
|
|
@@ -1,83 +1,14 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { BuiltInAggregationFn } from "../../fns/aggregationFns.cjs";
|
|
3
|
-
import { ColumnDefTemplate } from "../../types/ColumnDef.cjs";
|
|
4
|
-
import { Cell } from "../../types/Cell.cjs";
|
|
1
|
+
import { OnChangeFn, RowData, Updater } from "../../types/type-utils.cjs";
|
|
5
2
|
import { Row } from "../../types/Row.cjs";
|
|
6
3
|
import { RowModel } from "../../core/row-models/coreRowModelsFeature.types.cjs";
|
|
7
|
-
import {
|
|
4
|
+
import { TableFeatures } from "../../types/TableFeatures.cjs";
|
|
8
5
|
|
|
9
6
|
//#region src/features/column-grouping/columnGroupingFeature.types.d.ts
|
|
10
7
|
type GroupingState = Array<string>;
|
|
11
8
|
interface TableState_ColumnGrouping {
|
|
12
9
|
grouping: GroupingState;
|
|
13
10
|
}
|
|
14
|
-
interface
|
|
15
|
-
aggregationFns: Record<string, AggregationFn<TFeatures, TData>>;
|
|
16
|
-
}
|
|
17
|
-
interface AggregationFns {}
|
|
18
|
-
interface AggregationFn<in out TFeatures extends TableFeatures, in out TData extends RowData> {
|
|
19
|
-
(columnId: string, leafRows: Array<Row<TFeatures, TData>>, childRows: Array<Row<TFeatures, TData>>): any;
|
|
20
|
-
/**
|
|
21
|
-
* Normalizes each row's value before it is aggregated. Only honored by
|
|
22
|
-
* aggregation functions built with `constructAggregationFn` (including the
|
|
23
|
-
* value-based built-in aggregation functions).
|
|
24
|
-
*/
|
|
25
|
-
resolveDataValue?: TransformDataValueFn;
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* The definition object accepted by `constructAggregationFn`.
|
|
29
|
-
*
|
|
30
|
-
* `aggregate` is a value-level reducer: it receives the rows' (resolved)
|
|
31
|
-
* values instead of the rows themselves, so normalization concerns stay in
|
|
32
|
-
* `resolveDataValue`.
|
|
33
|
-
*/
|
|
34
|
-
interface AggregationFnDef<in out TFeatures extends TableFeatures, in out TData extends RowData> {
|
|
35
|
-
aggregate: (values: Array<any>, rows: Array<Row<TFeatures, TData>>, columnId: string) => any;
|
|
36
|
-
/**
|
|
37
|
-
* Which of the group's rows feed the aggregation: all of its `leafRows`
|
|
38
|
-
* (the default) or its immediate `childRows`. For nested groups, child rows
|
|
39
|
-
* expose already-aggregated values, which is faster for reaggregatable
|
|
40
|
-
* computations like sums and extents.
|
|
41
|
-
*/
|
|
42
|
-
fromRows?: 'leafRows' | 'childRows';
|
|
43
|
-
resolveDataValue?: TransformDataValueFn;
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* The shape returned by `constructAggregationFn`: an `AggregationFn` with its
|
|
47
|
-
* definition attached, so variants can be built by spreading it into another
|
|
48
|
-
* `constructAggregationFn` call.
|
|
49
|
-
*
|
|
50
|
-
* The call signature is generic so a created aggregation function can be used
|
|
51
|
-
* with any table's rows, regardless of the feature set it was defined
|
|
52
|
-
* against.
|
|
53
|
-
*/
|
|
54
|
-
interface CreatedAggregationFn<in out TFeatures extends TableFeatures, in out TData extends RowData> extends AggregationFnDef<TFeatures, TData> {
|
|
55
|
-
<TRowFeatures extends TableFeatures, TRowData extends RowData>(columnId: string, leafRows: Array<Row<TRowFeatures, TRowData>>, childRows: Array<Row<TRowFeatures, TRowData>>): any;
|
|
56
|
-
}
|
|
57
|
-
type CustomAggregationFns<TFeatures extends TableFeatures, TData extends RowData> = Record<string, AggregationFn<TFeatures, TData>>;
|
|
58
|
-
/**
|
|
59
|
-
* Resolves the valid string names for `columnDef.aggregationFn` for a feature
|
|
60
|
-
* set.
|
|
61
|
-
*
|
|
62
|
-
* When the features object declares an `aggregationFns` registry
|
|
63
|
-
* (`tableFeatures({ ..., aggregationFns })`), its keys are the only valid
|
|
64
|
-
* names; a name is only assignable if an aggregation function is actually
|
|
65
|
-
* registered for it. Otherwise this falls back to the global
|
|
66
|
-
* declaration-merged `AggregationFns` interface.
|
|
67
|
-
*/
|
|
68
|
-
type ExtractAggregationFnKeys<TFeatures extends TableFeatures> = IsAny<TFeatures> extends true ? keyof AggregationFns | BuiltInAggregationFn : TFeatures extends {
|
|
69
|
-
aggregationFns: infer TAggregationFns extends object;
|
|
70
|
-
} ? Extract<keyof TAggregationFns, string> : keyof AggregationFns;
|
|
71
|
-
type AggregationFnOption<TFeatures extends TableFeatures, TData extends RowData> = 'auto' | ExtractAggregationFnKeys<TFeatures> | AggregationFn<TFeatures, TData>;
|
|
72
|
-
interface ColumnDef_ColumnGrouping<in out TFeatures extends TableFeatures, in out TData extends RowData, TValue extends CellData = CellData> {
|
|
73
|
-
/**
|
|
74
|
-
* The cell to display each row for the column if the cell is an aggregate. If a function is passed, it will be passed a props object with the context of the cell and should return the property type for your adapter (the exact type depends on the adapter being used).
|
|
75
|
-
*/
|
|
76
|
-
aggregatedCell?: ColumnDefTemplate<ReturnType<Cell<TFeatures, TData, TValue>['getContext']>>;
|
|
77
|
-
/**
|
|
78
|
-
* The resolved aggregation function for the column.
|
|
79
|
-
*/
|
|
80
|
-
aggregationFn?: AggregationFnOption<TFeatures, TData>;
|
|
11
|
+
interface ColumnDef_ColumnGrouping<in out TFeatures extends TableFeatures, in out TData extends RowData> {
|
|
81
12
|
/**
|
|
82
13
|
* Allows this column to be added to grouping state.
|
|
83
14
|
*
|
|
@@ -92,15 +23,7 @@ interface ColumnDef_ColumnGrouping<in out TFeatures extends TableFeatures, in ou
|
|
|
92
23
|
*/
|
|
93
24
|
getGroupingValue?: (originalRow: TData, index: number, row: Row<TFeatures, TData>) => any;
|
|
94
25
|
}
|
|
95
|
-
interface Column_ColumnGrouping
|
|
96
|
-
/**
|
|
97
|
-
* Returns the aggregation function for the column.
|
|
98
|
-
*/
|
|
99
|
-
getAggregationFn: () => AggregationFn<TFeatures, TData> | undefined;
|
|
100
|
-
/**
|
|
101
|
-
* Returns the automatically inferred aggregation function for the column.
|
|
102
|
-
*/
|
|
103
|
-
getAutoAggregationFn: () => AggregationFn<TFeatures, TData> | undefined;
|
|
26
|
+
interface Column_ColumnGrouping {
|
|
104
27
|
/**
|
|
105
28
|
* Checks whether this column can currently be grouped.
|
|
106
29
|
*/
|
|
@@ -142,10 +65,6 @@ interface Row_ColumnGrouping {
|
|
|
142
65
|
groupingValue?: unknown;
|
|
143
66
|
}
|
|
144
67
|
interface Cell_ColumnGrouping {
|
|
145
|
-
/**
|
|
146
|
-
* Checks whether this cell should render an aggregated value.
|
|
147
|
-
*/
|
|
148
|
-
getIsAggregated: () => boolean;
|
|
149
68
|
/**
|
|
150
69
|
* Checks whether this cell represents the active grouping column.
|
|
151
70
|
*/
|
|
@@ -194,7 +113,7 @@ interface Table_ColumnGrouping<in out _TFeatures extends TableFeatures, in out _
|
|
|
194
113
|
}
|
|
195
114
|
interface Table_RowModels_Grouped<in out TFeatures extends TableFeatures, in out TData extends RowData> {
|
|
196
115
|
/**
|
|
197
|
-
* Resolves the row model after grouping
|
|
116
|
+
* Resolves the row model after grouping has been applied.
|
|
198
117
|
*/
|
|
199
118
|
getGroupedRowModel: () => RowModel<TFeatures, TData>;
|
|
200
119
|
/**
|
|
@@ -206,5 +125,5 @@ interface CachedRowModel_Grouped<in out TFeatures extends TableFeatures, in out
|
|
|
206
125
|
groupedRowModel: () => RowModel<TFeatures, TData>;
|
|
207
126
|
}
|
|
208
127
|
//#endregion
|
|
209
|
-
export {
|
|
128
|
+
export { CachedRowModel_Grouped, Cell_ColumnGrouping, ColumnDef_ColumnGrouping, ColumnDefaultOptions, Column_ColumnGrouping, GroupingColumnMode, GroupingState, Row_ColumnGrouping, TableOptions_ColumnGrouping, TableState_ColumnGrouping, Table_ColumnGrouping, Table_RowModels_Grouped };
|
|
210
129
|
//# sourceMappingURL=columnGroupingFeature.types.d.cts.map
|
|
@@ -1,83 +1,14 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { BuiltInAggregationFn } from "../../fns/aggregationFns.js";
|
|
3
|
-
import { ColumnDefTemplate } from "../../types/ColumnDef.js";
|
|
4
|
-
import { Cell } from "../../types/Cell.js";
|
|
1
|
+
import { OnChangeFn, RowData, Updater } from "../../types/type-utils.js";
|
|
5
2
|
import { Row } from "../../types/Row.js";
|
|
6
3
|
import { RowModel } from "../../core/row-models/coreRowModelsFeature.types.js";
|
|
7
|
-
import {
|
|
4
|
+
import { TableFeatures } from "../../types/TableFeatures.js";
|
|
8
5
|
|
|
9
6
|
//#region src/features/column-grouping/columnGroupingFeature.types.d.ts
|
|
10
7
|
type GroupingState = Array<string>;
|
|
11
8
|
interface TableState_ColumnGrouping {
|
|
12
9
|
grouping: GroupingState;
|
|
13
10
|
}
|
|
14
|
-
interface
|
|
15
|
-
aggregationFns: Record<string, AggregationFn<TFeatures, TData>>;
|
|
16
|
-
}
|
|
17
|
-
interface AggregationFns {}
|
|
18
|
-
interface AggregationFn<in out TFeatures extends TableFeatures, in out TData extends RowData> {
|
|
19
|
-
(columnId: string, leafRows: Array<Row<TFeatures, TData>>, childRows: Array<Row<TFeatures, TData>>): any;
|
|
20
|
-
/**
|
|
21
|
-
* Normalizes each row's value before it is aggregated. Only honored by
|
|
22
|
-
* aggregation functions built with `constructAggregationFn` (including the
|
|
23
|
-
* value-based built-in aggregation functions).
|
|
24
|
-
*/
|
|
25
|
-
resolveDataValue?: TransformDataValueFn;
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* The definition object accepted by `constructAggregationFn`.
|
|
29
|
-
*
|
|
30
|
-
* `aggregate` is a value-level reducer: it receives the rows' (resolved)
|
|
31
|
-
* values instead of the rows themselves, so normalization concerns stay in
|
|
32
|
-
* `resolveDataValue`.
|
|
33
|
-
*/
|
|
34
|
-
interface AggregationFnDef<in out TFeatures extends TableFeatures, in out TData extends RowData> {
|
|
35
|
-
aggregate: (values: Array<any>, rows: Array<Row<TFeatures, TData>>, columnId: string) => any;
|
|
36
|
-
/**
|
|
37
|
-
* Which of the group's rows feed the aggregation: all of its `leafRows`
|
|
38
|
-
* (the default) or its immediate `childRows`. For nested groups, child rows
|
|
39
|
-
* expose already-aggregated values, which is faster for reaggregatable
|
|
40
|
-
* computations like sums and extents.
|
|
41
|
-
*/
|
|
42
|
-
fromRows?: 'leafRows' | 'childRows';
|
|
43
|
-
resolveDataValue?: TransformDataValueFn;
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* The shape returned by `constructAggregationFn`: an `AggregationFn` with its
|
|
47
|
-
* definition attached, so variants can be built by spreading it into another
|
|
48
|
-
* `constructAggregationFn` call.
|
|
49
|
-
*
|
|
50
|
-
* The call signature is generic so a created aggregation function can be used
|
|
51
|
-
* with any table's rows, regardless of the feature set it was defined
|
|
52
|
-
* against.
|
|
53
|
-
*/
|
|
54
|
-
interface CreatedAggregationFn<in out TFeatures extends TableFeatures, in out TData extends RowData> extends AggregationFnDef<TFeatures, TData> {
|
|
55
|
-
<TRowFeatures extends TableFeatures, TRowData extends RowData>(columnId: string, leafRows: Array<Row<TRowFeatures, TRowData>>, childRows: Array<Row<TRowFeatures, TRowData>>): any;
|
|
56
|
-
}
|
|
57
|
-
type CustomAggregationFns<TFeatures extends TableFeatures, TData extends RowData> = Record<string, AggregationFn<TFeatures, TData>>;
|
|
58
|
-
/**
|
|
59
|
-
* Resolves the valid string names for `columnDef.aggregationFn` for a feature
|
|
60
|
-
* set.
|
|
61
|
-
*
|
|
62
|
-
* When the features object declares an `aggregationFns` registry
|
|
63
|
-
* (`tableFeatures({ ..., aggregationFns })`), its keys are the only valid
|
|
64
|
-
* names; a name is only assignable if an aggregation function is actually
|
|
65
|
-
* registered for it. Otherwise this falls back to the global
|
|
66
|
-
* declaration-merged `AggregationFns` interface.
|
|
67
|
-
*/
|
|
68
|
-
type ExtractAggregationFnKeys<TFeatures extends TableFeatures> = IsAny<TFeatures> extends true ? keyof AggregationFns | BuiltInAggregationFn : TFeatures extends {
|
|
69
|
-
aggregationFns: infer TAggregationFns extends object;
|
|
70
|
-
} ? Extract<keyof TAggregationFns, string> : keyof AggregationFns;
|
|
71
|
-
type AggregationFnOption<TFeatures extends TableFeatures, TData extends RowData> = 'auto' | ExtractAggregationFnKeys<TFeatures> | AggregationFn<TFeatures, TData>;
|
|
72
|
-
interface ColumnDef_ColumnGrouping<in out TFeatures extends TableFeatures, in out TData extends RowData, TValue extends CellData = CellData> {
|
|
73
|
-
/**
|
|
74
|
-
* The cell to display each row for the column if the cell is an aggregate. If a function is passed, it will be passed a props object with the context of the cell and should return the property type for your adapter (the exact type depends on the adapter being used).
|
|
75
|
-
*/
|
|
76
|
-
aggregatedCell?: ColumnDefTemplate<ReturnType<Cell<TFeatures, TData, TValue>['getContext']>>;
|
|
77
|
-
/**
|
|
78
|
-
* The resolved aggregation function for the column.
|
|
79
|
-
*/
|
|
80
|
-
aggregationFn?: AggregationFnOption<TFeatures, TData>;
|
|
11
|
+
interface ColumnDef_ColumnGrouping<in out TFeatures extends TableFeatures, in out TData extends RowData> {
|
|
81
12
|
/**
|
|
82
13
|
* Allows this column to be added to grouping state.
|
|
83
14
|
*
|
|
@@ -92,15 +23,7 @@ interface ColumnDef_ColumnGrouping<in out TFeatures extends TableFeatures, in ou
|
|
|
92
23
|
*/
|
|
93
24
|
getGroupingValue?: (originalRow: TData, index: number, row: Row<TFeatures, TData>) => any;
|
|
94
25
|
}
|
|
95
|
-
interface Column_ColumnGrouping
|
|
96
|
-
/**
|
|
97
|
-
* Returns the aggregation function for the column.
|
|
98
|
-
*/
|
|
99
|
-
getAggregationFn: () => AggregationFn<TFeatures, TData> | undefined;
|
|
100
|
-
/**
|
|
101
|
-
* Returns the automatically inferred aggregation function for the column.
|
|
102
|
-
*/
|
|
103
|
-
getAutoAggregationFn: () => AggregationFn<TFeatures, TData> | undefined;
|
|
26
|
+
interface Column_ColumnGrouping {
|
|
104
27
|
/**
|
|
105
28
|
* Checks whether this column can currently be grouped.
|
|
106
29
|
*/
|
|
@@ -142,10 +65,6 @@ interface Row_ColumnGrouping {
|
|
|
142
65
|
groupingValue?: unknown;
|
|
143
66
|
}
|
|
144
67
|
interface Cell_ColumnGrouping {
|
|
145
|
-
/**
|
|
146
|
-
* Checks whether this cell should render an aggregated value.
|
|
147
|
-
*/
|
|
148
|
-
getIsAggregated: () => boolean;
|
|
149
68
|
/**
|
|
150
69
|
* Checks whether this cell represents the active grouping column.
|
|
151
70
|
*/
|
|
@@ -194,7 +113,7 @@ interface Table_ColumnGrouping<in out _TFeatures extends TableFeatures, in out _
|
|
|
194
113
|
}
|
|
195
114
|
interface Table_RowModels_Grouped<in out TFeatures extends TableFeatures, in out TData extends RowData> {
|
|
196
115
|
/**
|
|
197
|
-
* Resolves the row model after grouping
|
|
116
|
+
* Resolves the row model after grouping has been applied.
|
|
198
117
|
*/
|
|
199
118
|
getGroupedRowModel: () => RowModel<TFeatures, TData>;
|
|
200
119
|
/**
|
|
@@ -206,5 +125,5 @@ interface CachedRowModel_Grouped<in out TFeatures extends TableFeatures, in out
|
|
|
206
125
|
groupedRowModel: () => RowModel<TFeatures, TData>;
|
|
207
126
|
}
|
|
208
127
|
//#endregion
|
|
209
|
-
export {
|
|
128
|
+
export { CachedRowModel_Grouped, Cell_ColumnGrouping, ColumnDef_ColumnGrouping, ColumnDefaultOptions, Column_ColumnGrouping, GroupingColumnMode, GroupingState, Row_ColumnGrouping, TableOptions_ColumnGrouping, TableState_ColumnGrouping, Table_ColumnGrouping, Table_RowModels_Grouped };
|
|
210
129
|
//# sourceMappingURL=columnGroupingFeature.types.d.ts.map
|