@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,229 @@
|
|
|
1
|
+
import { constructAggregationFn } from "./aggregationFeature.types.js";
|
|
2
|
+
|
|
3
|
+
//#region src/features/aggregation/aggregationFns.ts
|
|
4
|
+
function isNumber(value) {
|
|
5
|
+
return typeof value === "number";
|
|
6
|
+
}
|
|
7
|
+
function isValidDate(value) {
|
|
8
|
+
return value instanceof Date && !Number.isNaN(value.getTime());
|
|
9
|
+
}
|
|
10
|
+
function getRangeKind(value) {
|
|
11
|
+
if (isNumber(value)) return "number";
|
|
12
|
+
if (isValidDate(value)) return "date";
|
|
13
|
+
}
|
|
14
|
+
function compareRangeValues(left, right) {
|
|
15
|
+
return (left instanceof Date ? left.getTime() : left) - (right instanceof Date ? right.getTime() : right);
|
|
16
|
+
}
|
|
17
|
+
function collectRangeValues(context) {
|
|
18
|
+
const values = [];
|
|
19
|
+
let kind;
|
|
20
|
+
for (let i = 0; i < context.rows.length; i++) {
|
|
21
|
+
const value = context.getValue(context.rows[i]);
|
|
22
|
+
const valueKind = getRangeKind(value);
|
|
23
|
+
if (!valueKind) continue;
|
|
24
|
+
kind ??= valueKind;
|
|
25
|
+
if (valueKind === kind) values.push(value);
|
|
26
|
+
}
|
|
27
|
+
return values;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Sums numeric row values. Non-number values contribute zero. As in the
|
|
31
|
+
* previous API, `NaN` is a number and therefore propagates through the sum.
|
|
32
|
+
*/
|
|
33
|
+
const aggregationFn_sum = constructAggregationFn({
|
|
34
|
+
aggregate: (context) => {
|
|
35
|
+
let sum = 0;
|
|
36
|
+
for (let i = 0; i < context.rows.length; i++) {
|
|
37
|
+
const value = context.getValue(context.rows[i]);
|
|
38
|
+
sum += typeof value === "number" ? value : 0;
|
|
39
|
+
}
|
|
40
|
+
return sum;
|
|
41
|
+
},
|
|
42
|
+
merge: ({ childResults }) => {
|
|
43
|
+
let sum = 0;
|
|
44
|
+
for (let i = 0; i < childResults.length; i++) {
|
|
45
|
+
const value = childResults[i];
|
|
46
|
+
if (isNumber(value)) sum += value;
|
|
47
|
+
}
|
|
48
|
+
return sum;
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
/**
|
|
52
|
+
* Finds the minimum numeric or Date value. Invalid value types are ignored;
|
|
53
|
+
* `NaN` preserves the legacy numeric seeding behavior.
|
|
54
|
+
*/
|
|
55
|
+
const aggregationFn_min = constructAggregationFn({
|
|
56
|
+
aggregate: (context) => {
|
|
57
|
+
const values = collectRangeValues(context);
|
|
58
|
+
let result = values[0];
|
|
59
|
+
for (let i = 1; i < values.length; i++) if (compareRangeValues(values[i], result) < 0) result = values[i];
|
|
60
|
+
return result;
|
|
61
|
+
},
|
|
62
|
+
merge: ({ childResults }) => {
|
|
63
|
+
let result;
|
|
64
|
+
let kind;
|
|
65
|
+
for (let i = 0; i < childResults.length; i++) {
|
|
66
|
+
const value = childResults[i];
|
|
67
|
+
const valueKind = getRangeKind(value);
|
|
68
|
+
if (!valueKind) continue;
|
|
69
|
+
kind ??= valueKind;
|
|
70
|
+
if (kind !== valueKind) continue;
|
|
71
|
+
if (result === void 0 || compareRangeValues(value, result) < 0) result = value;
|
|
72
|
+
}
|
|
73
|
+
return result;
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
/**
|
|
77
|
+
* Finds the maximum numeric or Date value. Invalid value types are ignored;
|
|
78
|
+
* `NaN` preserves the legacy numeric seeding behavior.
|
|
79
|
+
*/
|
|
80
|
+
const aggregationFn_max = constructAggregationFn({
|
|
81
|
+
aggregate: (context) => {
|
|
82
|
+
const values = collectRangeValues(context);
|
|
83
|
+
let result = values[0];
|
|
84
|
+
for (let i = 1; i < values.length; i++) if (compareRangeValues(values[i], result) > 0) result = values[i];
|
|
85
|
+
return result;
|
|
86
|
+
},
|
|
87
|
+
merge: ({ childResults }) => {
|
|
88
|
+
let result;
|
|
89
|
+
let kind;
|
|
90
|
+
for (let i = 0; i < childResults.length; i++) {
|
|
91
|
+
const value = childResults[i];
|
|
92
|
+
const valueKind = getRangeKind(value);
|
|
93
|
+
if (!valueKind) continue;
|
|
94
|
+
kind ??= valueKind;
|
|
95
|
+
if (kind !== valueKind) continue;
|
|
96
|
+
if (result === void 0 || compareRangeValues(value, result) > 0) result = value;
|
|
97
|
+
}
|
|
98
|
+
return result;
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
/**
|
|
102
|
+
* Finds the minimum and maximum numeric or Date values. Empty inputs return
|
|
103
|
+
* `[undefined, undefined]`, preserving the previous built-in result shape.
|
|
104
|
+
*/
|
|
105
|
+
const aggregationFn_extent = constructAggregationFn({
|
|
106
|
+
aggregate: (context) => {
|
|
107
|
+
const values = collectRangeValues(context);
|
|
108
|
+
if (!values.length) return [void 0, void 0];
|
|
109
|
+
let min = values[0];
|
|
110
|
+
let max = values[0];
|
|
111
|
+
for (let i = 1; i < values.length; i++) {
|
|
112
|
+
const value = values[i];
|
|
113
|
+
if (compareRangeValues(value, min) < 0) min = value;
|
|
114
|
+
if (compareRangeValues(value, max) > 0) max = value;
|
|
115
|
+
}
|
|
116
|
+
return [min, max];
|
|
117
|
+
},
|
|
118
|
+
merge: ({ childResults }) => {
|
|
119
|
+
let result = [void 0, void 0];
|
|
120
|
+
let kind;
|
|
121
|
+
for (let i = 0; i < childResults.length; i++) {
|
|
122
|
+
const extent = childResults[i];
|
|
123
|
+
const valueKind = getRangeKind(extent[0]);
|
|
124
|
+
if (!valueKind) continue;
|
|
125
|
+
kind ??= valueKind;
|
|
126
|
+
if (kind !== valueKind) continue;
|
|
127
|
+
if (result[0] === void 0) result = [extent[0], extent[1]];
|
|
128
|
+
else {
|
|
129
|
+
if (compareRangeValues(extent[0], result[0]) < 0) result[0] = extent[0];
|
|
130
|
+
if (compareRangeValues(extent[1], result[1]) > 0) result[1] = extent[1];
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return result;
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
/**
|
|
137
|
+
* Averages number and number-like row values. Nullish and non-numeric values
|
|
138
|
+
* are ignored; other values retain the legacy unary-plus coercion behavior.
|
|
139
|
+
*/
|
|
140
|
+
const aggregationFn_mean = constructAggregationFn({ aggregate: (context) => {
|
|
141
|
+
let count = 0;
|
|
142
|
+
let sum = 0;
|
|
143
|
+
for (let i = 0; i < context.rows.length; i++) {
|
|
144
|
+
const value = context.getValue(context.rows[i]);
|
|
145
|
+
if (value == null) continue;
|
|
146
|
+
const numberValue = typeof value === "number" ? value : +value;
|
|
147
|
+
if (!Number.isNaN(numberValue)) {
|
|
148
|
+
count++;
|
|
149
|
+
sum += numberValue;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return count ? sum / count : void 0;
|
|
153
|
+
} });
|
|
154
|
+
/**
|
|
155
|
+
* Computes the median when every row value is a number. Returns `undefined`
|
|
156
|
+
* for empty inputs or when any value is non-numeric.
|
|
157
|
+
*/
|
|
158
|
+
const aggregationFn_median = constructAggregationFn({ aggregate: (context) => {
|
|
159
|
+
if (!context.rows.length) return void 0;
|
|
160
|
+
const values = new Array(context.rows.length);
|
|
161
|
+
for (let i = 0; i < context.rows.length; i++) {
|
|
162
|
+
const value = context.getValue(context.rows[i]);
|
|
163
|
+
if (typeof value !== "number") return void 0;
|
|
164
|
+
values[i] = value;
|
|
165
|
+
}
|
|
166
|
+
values.sort((a, b) => a - b);
|
|
167
|
+
const mid = Math.floor(values.length / 2);
|
|
168
|
+
return values.length % 2 ? values[mid] : (values[mid - 1] + values[mid]) / 2;
|
|
169
|
+
} });
|
|
170
|
+
/** Collects distinct row values using JavaScript `Set` semantics. */
|
|
171
|
+
const aggregationFn_unique = constructAggregationFn({ aggregate: (context) => {
|
|
172
|
+
const values = /* @__PURE__ */ new Set();
|
|
173
|
+
for (let i = 0; i < context.rows.length; i++) values.add(context.getValue(context.rows[i]));
|
|
174
|
+
return Array.from(values);
|
|
175
|
+
} });
|
|
176
|
+
/** Counts distinct row values using JavaScript `Set` semantics. */
|
|
177
|
+
const aggregationFn_uniqueCount = constructAggregationFn({ aggregate: (context) => {
|
|
178
|
+
const values = /* @__PURE__ */ new Set();
|
|
179
|
+
for (let i = 0; i < context.rows.length; i++) values.add(context.getValue(context.rows[i]));
|
|
180
|
+
return values.size;
|
|
181
|
+
} });
|
|
182
|
+
/** Counts rows, independently of the column's values. */
|
|
183
|
+
const aggregationFn_count = constructAggregationFn({
|
|
184
|
+
aggregate: ({ rows }) => rows.length,
|
|
185
|
+
merge: ({ childResults }) => {
|
|
186
|
+
let count = 0;
|
|
187
|
+
for (let i = 0; i < childResults.length; i++) {
|
|
188
|
+
const value = childResults[i];
|
|
189
|
+
if (isNumber(value)) count += value;
|
|
190
|
+
}
|
|
191
|
+
return count;
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
/** Returns the first row's value, including a nullish value. */
|
|
195
|
+
const aggregationFn_first = constructAggregationFn({
|
|
196
|
+
aggregate: (context) => context.rows[0] ? context.getValue(context.rows[0]) : void 0,
|
|
197
|
+
merge: ({ childResults }) => childResults[0]
|
|
198
|
+
});
|
|
199
|
+
/** Returns the last row's value, including a nullish value. */
|
|
200
|
+
const aggregationFn_last = constructAggregationFn({
|
|
201
|
+
aggregate: (context) => {
|
|
202
|
+
const row = context.rows[context.rows.length - 1];
|
|
203
|
+
return row ? context.getValue(row) : void 0;
|
|
204
|
+
},
|
|
205
|
+
merge: ({ childResults }) => childResults[childResults.length - 1]
|
|
206
|
+
});
|
|
207
|
+
/**
|
|
208
|
+
* Full built-in registry. Register individual definitions for tree-shaking.
|
|
209
|
+
*
|
|
210
|
+
* @deprecated Import individual `aggregationFn_*` definitions instead for a
|
|
211
|
+
* smaller bundle. This registry remains available for compatibility.
|
|
212
|
+
*/
|
|
213
|
+
const aggregationFns = {
|
|
214
|
+
sum: aggregationFn_sum,
|
|
215
|
+
min: aggregationFn_min,
|
|
216
|
+
max: aggregationFn_max,
|
|
217
|
+
extent: aggregationFn_extent,
|
|
218
|
+
mean: aggregationFn_mean,
|
|
219
|
+
median: aggregationFn_median,
|
|
220
|
+
unique: aggregationFn_unique,
|
|
221
|
+
uniqueCount: aggregationFn_uniqueCount,
|
|
222
|
+
count: aggregationFn_count,
|
|
223
|
+
first: aggregationFn_first,
|
|
224
|
+
last: aggregationFn_last
|
|
225
|
+
};
|
|
226
|
+
|
|
227
|
+
//#endregion
|
|
228
|
+
export { aggregationFn_count, aggregationFn_extent, aggregationFn_first, aggregationFn_last, aggregationFn_max, aggregationFn_mean, aggregationFn_median, aggregationFn_min, aggregationFn_sum, aggregationFn_unique, aggregationFn_uniqueCount, aggregationFns };
|
|
229
|
+
//# sourceMappingURL=aggregationFns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aggregationFns.js","names":[],"sources":["../../../src/features/aggregation/aggregationFns.ts"],"sourcesContent":["import { constructAggregationFn } from './aggregationFeature.types'\nimport type { AggregationContext } from './aggregationFeature.types'\n\ntype RangeValue = Date | number\n\nfunction isNumber(value: unknown): value is number {\n return typeof value === 'number'\n}\n\nfunction isValidDate(value: unknown): value is Date {\n return value instanceof Date && !Number.isNaN(value.getTime())\n}\n\nfunction getRangeKind(value: unknown): 'date' | 'number' | undefined {\n if (isNumber(value)) return 'number'\n if (isValidDate(value)) return 'date'\n return undefined\n}\n\nfunction compareRangeValues(left: RangeValue, right: RangeValue) {\n const leftValue = left instanceof Date ? left.getTime() : left\n const rightValue = right instanceof Date ? right.getTime() : right\n return leftValue - rightValue\n}\n\nfunction collectRangeValues(context: AggregationContext<any, any, unknown>) {\n const values: Array<RangeValue> = []\n let kind: 'date' | 'number' | undefined\n\n for (let i = 0; i < context.rows.length; i++) {\n const value = context.getValue(context.rows[i]!)\n const valueKind = getRangeKind(value)\n if (!valueKind) continue\n kind ??= valueKind\n if (valueKind === kind) values.push(value as RangeValue)\n }\n\n return values\n}\n\n/**\n * Sums numeric row values. Non-number values contribute zero. As in the\n * previous API, `NaN` is a number and therefore propagates through the sum.\n */\nexport const aggregationFn_sum = constructAggregationFn<\n any,\n any,\n unknown,\n number\n>({\n aggregate: (context) => {\n let sum = 0\n for (let i = 0; i < context.rows.length; i++) {\n const value = context.getValue(context.rows[i]!)\n sum += typeof value === 'number' ? value : 0\n }\n return sum\n },\n merge: ({ childResults }) => {\n let sum = 0\n for (let i = 0; i < childResults.length; i++) {\n const value = childResults[i]\n if (isNumber(value)) sum += value\n }\n return sum\n },\n})\n\n/**\n * Finds the minimum numeric or Date value. Invalid value types are ignored;\n * `NaN` preserves the legacy numeric seeding behavior.\n */\nexport const aggregationFn_min = constructAggregationFn<\n any,\n any,\n unknown,\n RangeValue | undefined\n>({\n aggregate: (context) => {\n const values = collectRangeValues(context)\n let result = values[0]\n for (let i = 1; i < values.length; i++) {\n if (compareRangeValues(values[i]!, result!) < 0) result = values[i]\n }\n return result\n },\n merge: ({ childResults }) => {\n let result: RangeValue | undefined\n let kind: 'date' | 'number' | undefined\n for (let i = 0; i < childResults.length; i++) {\n const value = childResults[i]\n const valueKind = getRangeKind(value)\n if (!valueKind) continue\n kind ??= valueKind\n if (kind !== valueKind) continue\n if (result === undefined || compareRangeValues(value!, result) < 0) {\n result = value\n }\n }\n return result\n },\n})\n\n/**\n * Finds the maximum numeric or Date value. Invalid value types are ignored;\n * `NaN` preserves the legacy numeric seeding behavior.\n */\nexport const aggregationFn_max = constructAggregationFn<\n any,\n any,\n unknown,\n RangeValue | undefined\n>({\n aggregate: (context) => {\n const values = collectRangeValues(context)\n let result = values[0]\n for (let i = 1; i < values.length; i++) {\n if (compareRangeValues(values[i]!, result!) > 0) result = values[i]\n }\n return result\n },\n merge: ({ childResults }) => {\n let result: RangeValue | undefined\n let kind: 'date' | 'number' | undefined\n for (let i = 0; i < childResults.length; i++) {\n const value = childResults[i]\n const valueKind = getRangeKind(value)\n if (!valueKind) continue\n kind ??= valueKind\n if (kind !== valueKind) continue\n if (result === undefined || compareRangeValues(value!, result) > 0) {\n result = value\n }\n }\n return result\n },\n})\n\n/**\n * Finds the minimum and maximum numeric or Date values. Empty inputs return\n * `[undefined, undefined]`, preserving the previous built-in result shape.\n */\nexport const aggregationFn_extent = constructAggregationFn<\n any,\n any,\n unknown,\n [RangeValue | undefined, RangeValue | undefined]\n>({\n aggregate: (context) => {\n const values = collectRangeValues(context)\n if (!values.length) return [undefined, undefined]\n let min = values[0]!\n let max = values[0]!\n for (let i = 1; i < values.length; i++) {\n const value = values[i]!\n if (compareRangeValues(value, min) < 0) min = value\n if (compareRangeValues(value, max) > 0) max = value\n }\n return [min, max]\n },\n merge: ({ childResults }) => {\n let result: [RangeValue | undefined, RangeValue | undefined] = [\n undefined,\n undefined,\n ]\n let kind: 'date' | 'number' | undefined\n for (let i = 0; i < childResults.length; i++) {\n const extent = childResults[i]!\n const valueKind = getRangeKind(extent[0])\n if (!valueKind) continue\n kind ??= valueKind\n if (kind !== valueKind) continue\n if (result[0] === undefined) {\n result = [extent[0], extent[1]]\n } else {\n if (compareRangeValues(extent[0]!, result[0]) < 0) {\n result[0] = extent[0]\n }\n if (compareRangeValues(extent[1]!, result[1]!) > 0) {\n result[1] = extent[1]\n }\n }\n }\n return result\n },\n})\n\n/**\n * Averages number and number-like row values. Nullish and non-numeric values\n * are ignored; other values retain the legacy unary-plus coercion behavior.\n */\nexport const aggregationFn_mean = constructAggregationFn<\n any,\n any,\n unknown,\n number | undefined\n>({\n aggregate: (context) => {\n let count = 0\n let sum = 0\n for (let i = 0; i < context.rows.length; i++) {\n const value = context.getValue(context.rows[i]!)\n if (value == null) continue\n const numberValue = typeof value === 'number' ? value : +value\n if (!Number.isNaN(numberValue)) {\n count++\n sum += numberValue\n }\n }\n return count ? sum / count : undefined\n },\n})\n\n/**\n * Computes the median when every row value is a number. Returns `undefined`\n * for empty inputs or when any value is non-numeric.\n */\nexport const aggregationFn_median = constructAggregationFn<\n any,\n any,\n unknown,\n number | undefined\n>({\n aggregate: (context) => {\n if (!context.rows.length) return undefined\n const values = new Array<number>(context.rows.length)\n for (let i = 0; i < context.rows.length; i++) {\n const value = context.getValue(context.rows[i]!)\n if (typeof value !== 'number') return undefined\n values[i] = value\n }\n values.sort((a, b) => a - b)\n const mid = Math.floor(values.length / 2)\n return values.length % 2\n ? values[mid]\n : (values[mid - 1]! + values[mid]!) / 2\n },\n})\n\n/** Collects distinct row values using JavaScript `Set` semantics. */\nexport const aggregationFn_unique = constructAggregationFn<\n any,\n any,\n unknown,\n Array<unknown>\n>({\n aggregate: (context) => {\n const values = new Set<unknown>()\n for (let i = 0; i < context.rows.length; i++) {\n values.add(context.getValue(context.rows[i]!))\n }\n return Array.from(values)\n },\n})\n\n/** Counts distinct row values using JavaScript `Set` semantics. */\nexport const aggregationFn_uniqueCount = constructAggregationFn<\n any,\n any,\n unknown,\n number\n>({\n aggregate: (context) => {\n const values = new Set<unknown>()\n for (let i = 0; i < context.rows.length; i++) {\n values.add(context.getValue(context.rows[i]!))\n }\n return values.size\n },\n})\n\n/** Counts rows, independently of the column's values. */\nexport const aggregationFn_count = constructAggregationFn<\n any,\n any,\n unknown,\n number\n>({\n aggregate: ({ rows }) => rows.length,\n merge: ({ childResults }) => {\n let count = 0\n for (let i = 0; i < childResults.length; i++) {\n const value = childResults[i]\n if (isNumber(value)) count += value\n }\n return count\n },\n})\n\n/** Returns the first row's value, including a nullish value. */\nexport const aggregationFn_first = constructAggregationFn<\n any,\n any,\n unknown,\n unknown\n>({\n aggregate: (context) =>\n context.rows[0] ? context.getValue(context.rows[0]) : undefined,\n merge: ({ childResults }) => childResults[0],\n})\n\n/** Returns the last row's value, including a nullish value. */\nexport const aggregationFn_last = constructAggregationFn<\n any,\n any,\n unknown,\n unknown\n>({\n aggregate: (context) => {\n const row = context.rows[context.rows.length - 1]\n return row ? context.getValue(row) : undefined\n },\n merge: ({ childResults }) => childResults[childResults.length - 1],\n})\n\n/**\n * Full built-in registry. Register individual definitions for tree-shaking.\n *\n * @deprecated Import individual `aggregationFn_*` definitions instead for a\n * smaller bundle. This registry remains available for compatibility.\n */\nexport const aggregationFns = {\n sum: aggregationFn_sum,\n min: aggregationFn_min,\n max: aggregationFn_max,\n extent: aggregationFn_extent,\n mean: aggregationFn_mean,\n median: aggregationFn_median,\n unique: aggregationFn_unique,\n uniqueCount: aggregationFn_uniqueCount,\n count: aggregationFn_count,\n first: aggregationFn_first,\n last: aggregationFn_last,\n}\n\nexport type BuiltInAggregationFn = keyof typeof aggregationFns\n"],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
const require_utils = require('../../utils.cjs');
|
|
2
2
|
const require_columnFacetingFeature_utils = require('./columnFacetingFeature.utils.cjs');
|
|
3
|
+
const require_globalFilteringFeature_utils = require('../global-filtering/globalFilteringFeature.utils.cjs');
|
|
3
4
|
|
|
4
5
|
//#region src/features/column-faceting/createFacetedMinMaxValues.ts
|
|
5
6
|
/**
|
|
@@ -12,9 +13,10 @@ function createFacetedMinMaxValues() {
|
|
|
12
13
|
const table = _table;
|
|
13
14
|
return require_utils.tableMemo({
|
|
14
15
|
feature: "columnFacetingFeature",
|
|
15
|
-
fn: (flatRows) => _createFacetedMinMaxValues(columnId, flatRows),
|
|
16
|
+
fn: (flatRows) => _createFacetedMinMaxValues(table, columnId, flatRows),
|
|
16
17
|
fnName: "table.getFacetedMinMaxValues",
|
|
17
18
|
memoDeps: () => {
|
|
19
|
+
if (columnId === "__global__") return [require_utils.callMemoOrStaticFn(table, "getGlobalFacetedRowModel", require_columnFacetingFeature_utils.table_getGlobalFacetedRowModel).flatRows];
|
|
18
20
|
const column = table.getColumn(columnId);
|
|
19
21
|
if (!column) return [table.getPreFilteredRowModel().flatRows];
|
|
20
22
|
return [require_utils.callMemoOrStaticFn(column, "getFacetedRowModel", require_columnFacetingFeature_utils.column_getFacetedRowModel, table).flatRows];
|
|
@@ -23,13 +25,14 @@ function createFacetedMinMaxValues() {
|
|
|
23
25
|
});
|
|
24
26
|
};
|
|
25
27
|
}
|
|
26
|
-
function _createFacetedMinMaxValues(columnId, flatRows) {
|
|
28
|
+
function _createFacetedMinMaxValues(table, columnId, flatRows) {
|
|
27
29
|
if (!flatRows.length) return void 0;
|
|
30
|
+
const columnIds = columnId === "__global__" ? table.getAllLeafColumns().filter((column) => require_globalFilteringFeature_utils.column_getCanGlobalFilter(column)).map((column) => column.id) : [columnId];
|
|
28
31
|
let facetedMinValue = Number.POSITIVE_INFINITY;
|
|
29
32
|
let facetedMaxValue = Number.NEGATIVE_INFINITY;
|
|
30
33
|
let foundAny = false;
|
|
31
|
-
for (let i = 0; i < flatRows.length; i++) {
|
|
32
|
-
const value = Number(flatRows[i].getValue(
|
|
34
|
+
for (let i = 0; i < flatRows.length; i++) for (let c = 0; c < columnIds.length; c++) {
|
|
35
|
+
const value = Number(flatRows[i].getValue(columnIds[c]));
|
|
33
36
|
if (Number.isNaN(value)) continue;
|
|
34
37
|
foundAny = true;
|
|
35
38
|
if (value < facetedMinValue) facetedMinValue = value;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createFacetedMinMaxValues.cjs","names":["tableMemo","callMemoOrStaticFn","column_getFacetedRowModel"],"sources":["../../../src/features/column-faceting/createFacetedMinMaxValues.ts"],"sourcesContent":["import { callMemoOrStaticFn, tableMemo } from '../../utils'\nimport {
|
|
1
|
+
{"version":3,"file":"createFacetedMinMaxValues.cjs","names":["tableMemo","callMemoOrStaticFn","table_getGlobalFacetedRowModel","column_getFacetedRowModel","column_getCanGlobalFilter"],"sources":["../../../src/features/column-faceting/createFacetedMinMaxValues.ts"],"sourcesContent":["import { callMemoOrStaticFn, tableMemo } from '../../utils'\nimport { column_getCanGlobalFilter } from '../global-filtering/globalFilteringFeature.utils'\nimport {\n column_getFacetedRowModel,\n table_getGlobalFacetedRowModel,\n} from './columnFacetingFeature.utils'\nimport type { Row } from '../../types/Row'\nimport type { Table, Table_Internal } from '../../types/Table'\nimport type { TableFeatures } from '../../types/TableFeatures'\nimport type { RowData } from '../../types/type-utils'\n\n/**\n * Creates a memoized faceted min max values helper for faceted filtering.\n *\n * The returned function derives facet data from the table row model and relevant filter state so filter UIs can display available values.\n */\nexport function createFacetedMinMaxValues<\n TFeatures extends TableFeatures,\n TData extends RowData = any,\n>(): (\n table: Table<TFeatures, TData>,\n columnId: string,\n) => () => undefined | [number, number] {\n return (_table, columnId) => {\n const table = _table as unknown as Table_Internal<TFeatures, TData>\n return tableMemo({\n feature: 'columnFacetingFeature',\n fn: (flatRows) => _createFacetedMinMaxValues(table, columnId, flatRows),\n fnName: 'table.getFacetedMinMaxValues',\n memoDeps: () => {\n if (columnId === '__global__') {\n return [\n callMemoOrStaticFn(\n table,\n 'getGlobalFacetedRowModel',\n table_getGlobalFacetedRowModel,\n ).flatRows,\n ]\n }\n const column = table.getColumn(columnId)\n if (!column) return [table.getPreFilteredRowModel().flatRows]\n return [\n callMemoOrStaticFn(\n column,\n 'getFacetedRowModel',\n column_getFacetedRowModel,\n table,\n ).flatRows,\n ]\n },\n table,\n })\n }\n}\n\nfunction _createFacetedMinMaxValues<\n TFeatures extends TableFeatures,\n TData extends RowData = any,\n>(\n table: Table_Internal<TFeatures, TData>,\n columnId: string,\n flatRows: Array<Row<TFeatures, TData>>,\n): undefined | [number, number] {\n if (!flatRows.length) return undefined\n\n // The global context aggregates values across every column that\n // participates in global filtering\n const columnIds =\n columnId === '__global__'\n ? table\n .getAllLeafColumns()\n .filter((column) => column_getCanGlobalFilter(column))\n .map((column) => column.id)\n : [columnId]\n\n let facetedMinValue = Number.POSITIVE_INFINITY\n let facetedMaxValue = Number.NEGATIVE_INFINITY\n let foundAny = false\n\n for (let i = 0; i < flatRows.length; i++) {\n for (let c = 0; c < columnIds.length; c++) {\n const value = Number(flatRows[i]!.getValue(columnIds[c]!))\n if (Number.isNaN(value)) continue\n foundAny = true\n if (value < facetedMinValue) facetedMinValue = value\n if (value > facetedMaxValue) facetedMaxValue = value\n }\n }\n\n if (!foundAny) return undefined\n return [facetedMinValue, facetedMaxValue]\n}\n"],"mappings":";;;;;;;;;;AAgBA,SAAgB,4BAMwB;CACtC,QAAQ,QAAQ,aAAa;EAC3B,MAAM,QAAQ;EACd,OAAOA,wBAAU;GACf,SAAS;GACT,KAAK,aAAa,2BAA2B,OAAO,UAAU,QAAQ;GACtE,QAAQ;GACR,gBAAgB;IACd,IAAI,aAAa,cACf,OAAO,CACLC,iCACE,OACA,4BACAC,kEACF,CAAC,CAAC,QACJ;IAEF,MAAM,SAAS,MAAM,UAAU,QAAQ;IACvC,IAAI,CAAC,QAAQ,OAAO,CAAC,MAAM,uBAAuB,CAAC,CAAC,QAAQ;IAC5D,OAAO,CACLD,iCACE,QACA,sBACAE,+DACA,KACF,CAAC,CAAC,QACJ;GACF;GACA;EACF,CAAC;CACH;AACF;AAEA,SAAS,2BAIP,OACA,UACA,UAC8B;CAC9B,IAAI,CAAC,SAAS,QAAQ,OAAO;CAI7B,MAAM,YACJ,aAAa,eACT,MACG,kBAAkB,CAAC,CACnB,QAAQ,WAAWC,+DAA0B,MAAM,CAAC,CAAC,CACrD,KAAK,WAAW,OAAO,EAAE,IAC5B,CAAC,QAAQ;CAEf,IAAI,kBAAkB,OAAO;CAC7B,IAAI,kBAAkB,OAAO;CAC7B,IAAI,WAAW;CAEf,KAAK,IAAI,IAAI,GAAG,IAAI,SAAS,QAAQ,KACnC,KAAK,IAAI,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;EACzC,MAAM,QAAQ,OAAO,SAAS,EAAE,CAAE,SAAS,UAAU,EAAG,CAAC;EACzD,IAAI,OAAO,MAAM,KAAK,GAAG;EACzB,WAAW;EACX,IAAI,QAAQ,iBAAiB,kBAAkB;EAC/C,IAAI,QAAQ,iBAAiB,kBAAkB;CACjD;CAGF,IAAI,CAAC,UAAU,OAAO;CACtB,OAAO,CAAC,iBAAiB,eAAe;AAC1C"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { callMemoOrStaticFn, tableMemo } from "../../utils.js";
|
|
2
|
-
import { column_getFacetedRowModel } from "./columnFacetingFeature.utils.js";
|
|
2
|
+
import { column_getFacetedRowModel, table_getGlobalFacetedRowModel } from "./columnFacetingFeature.utils.js";
|
|
3
|
+
import { column_getCanGlobalFilter } from "../global-filtering/globalFilteringFeature.utils.js";
|
|
3
4
|
|
|
4
5
|
//#region src/features/column-faceting/createFacetedMinMaxValues.ts
|
|
5
6
|
/**
|
|
@@ -12,9 +13,10 @@ function createFacetedMinMaxValues() {
|
|
|
12
13
|
const table = _table;
|
|
13
14
|
return tableMemo({
|
|
14
15
|
feature: "columnFacetingFeature",
|
|
15
|
-
fn: (flatRows) => _createFacetedMinMaxValues(columnId, flatRows),
|
|
16
|
+
fn: (flatRows) => _createFacetedMinMaxValues(table, columnId, flatRows),
|
|
16
17
|
fnName: "table.getFacetedMinMaxValues",
|
|
17
18
|
memoDeps: () => {
|
|
19
|
+
if (columnId === "__global__") return [callMemoOrStaticFn(table, "getGlobalFacetedRowModel", table_getGlobalFacetedRowModel).flatRows];
|
|
18
20
|
const column = table.getColumn(columnId);
|
|
19
21
|
if (!column) return [table.getPreFilteredRowModel().flatRows];
|
|
20
22
|
return [callMemoOrStaticFn(column, "getFacetedRowModel", column_getFacetedRowModel, table).flatRows];
|
|
@@ -23,13 +25,14 @@ function createFacetedMinMaxValues() {
|
|
|
23
25
|
});
|
|
24
26
|
};
|
|
25
27
|
}
|
|
26
|
-
function _createFacetedMinMaxValues(columnId, flatRows) {
|
|
28
|
+
function _createFacetedMinMaxValues(table, columnId, flatRows) {
|
|
27
29
|
if (!flatRows.length) return void 0;
|
|
30
|
+
const columnIds = columnId === "__global__" ? table.getAllLeafColumns().filter((column) => column_getCanGlobalFilter(column)).map((column) => column.id) : [columnId];
|
|
28
31
|
let facetedMinValue = Number.POSITIVE_INFINITY;
|
|
29
32
|
let facetedMaxValue = Number.NEGATIVE_INFINITY;
|
|
30
33
|
let foundAny = false;
|
|
31
|
-
for (let i = 0; i < flatRows.length; i++) {
|
|
32
|
-
const value = Number(flatRows[i].getValue(
|
|
34
|
+
for (let i = 0; i < flatRows.length; i++) for (let c = 0; c < columnIds.length; c++) {
|
|
35
|
+
const value = Number(flatRows[i].getValue(columnIds[c]));
|
|
33
36
|
if (Number.isNaN(value)) continue;
|
|
34
37
|
foundAny = true;
|
|
35
38
|
if (value < facetedMinValue) facetedMinValue = value;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createFacetedMinMaxValues.js","names":[],"sources":["../../../src/features/column-faceting/createFacetedMinMaxValues.ts"],"sourcesContent":["import { callMemoOrStaticFn, tableMemo } from '../../utils'\nimport {
|
|
1
|
+
{"version":3,"file":"createFacetedMinMaxValues.js","names":[],"sources":["../../../src/features/column-faceting/createFacetedMinMaxValues.ts"],"sourcesContent":["import { callMemoOrStaticFn, tableMemo } from '../../utils'\nimport { column_getCanGlobalFilter } from '../global-filtering/globalFilteringFeature.utils'\nimport {\n column_getFacetedRowModel,\n table_getGlobalFacetedRowModel,\n} from './columnFacetingFeature.utils'\nimport type { Row } from '../../types/Row'\nimport type { Table, Table_Internal } from '../../types/Table'\nimport type { TableFeatures } from '../../types/TableFeatures'\nimport type { RowData } from '../../types/type-utils'\n\n/**\n * Creates a memoized faceted min max values helper for faceted filtering.\n *\n * The returned function derives facet data from the table row model and relevant filter state so filter UIs can display available values.\n */\nexport function createFacetedMinMaxValues<\n TFeatures extends TableFeatures,\n TData extends RowData = any,\n>(): (\n table: Table<TFeatures, TData>,\n columnId: string,\n) => () => undefined | [number, number] {\n return (_table, columnId) => {\n const table = _table as unknown as Table_Internal<TFeatures, TData>\n return tableMemo({\n feature: 'columnFacetingFeature',\n fn: (flatRows) => _createFacetedMinMaxValues(table, columnId, flatRows),\n fnName: 'table.getFacetedMinMaxValues',\n memoDeps: () => {\n if (columnId === '__global__') {\n return [\n callMemoOrStaticFn(\n table,\n 'getGlobalFacetedRowModel',\n table_getGlobalFacetedRowModel,\n ).flatRows,\n ]\n }\n const column = table.getColumn(columnId)\n if (!column) return [table.getPreFilteredRowModel().flatRows]\n return [\n callMemoOrStaticFn(\n column,\n 'getFacetedRowModel',\n column_getFacetedRowModel,\n table,\n ).flatRows,\n ]\n },\n table,\n })\n }\n}\n\nfunction _createFacetedMinMaxValues<\n TFeatures extends TableFeatures,\n TData extends RowData = any,\n>(\n table: Table_Internal<TFeatures, TData>,\n columnId: string,\n flatRows: Array<Row<TFeatures, TData>>,\n): undefined | [number, number] {\n if (!flatRows.length) return undefined\n\n // The global context aggregates values across every column that\n // participates in global filtering\n const columnIds =\n columnId === '__global__'\n ? table\n .getAllLeafColumns()\n .filter((column) => column_getCanGlobalFilter(column))\n .map((column) => column.id)\n : [columnId]\n\n let facetedMinValue = Number.POSITIVE_INFINITY\n let facetedMaxValue = Number.NEGATIVE_INFINITY\n let foundAny = false\n\n for (let i = 0; i < flatRows.length; i++) {\n for (let c = 0; c < columnIds.length; c++) {\n const value = Number(flatRows[i]!.getValue(columnIds[c]!))\n if (Number.isNaN(value)) continue\n foundAny = true\n if (value < facetedMinValue) facetedMinValue = value\n if (value > facetedMaxValue) facetedMaxValue = value\n }\n }\n\n if (!foundAny) return undefined\n return [facetedMinValue, facetedMaxValue]\n}\n"],"mappings":";;;;;;;;;;AAgBA,SAAgB,4BAMwB;CACtC,QAAQ,QAAQ,aAAa;EAC3B,MAAM,QAAQ;EACd,OAAO,UAAU;GACf,SAAS;GACT,KAAK,aAAa,2BAA2B,OAAO,UAAU,QAAQ;GACtE,QAAQ;GACR,gBAAgB;IACd,IAAI,aAAa,cACf,OAAO,CACL,mBACE,OACA,4BACA,8BACF,CAAC,CAAC,QACJ;IAEF,MAAM,SAAS,MAAM,UAAU,QAAQ;IACvC,IAAI,CAAC,QAAQ,OAAO,CAAC,MAAM,uBAAuB,CAAC,CAAC,QAAQ;IAC5D,OAAO,CACL,mBACE,QACA,sBACA,2BACA,KACF,CAAC,CAAC,QACJ;GACF;GACA;EACF,CAAC;CACH;AACF;AAEA,SAAS,2BAIP,OACA,UACA,UAC8B;CAC9B,IAAI,CAAC,SAAS,QAAQ,OAAO;CAI7B,MAAM,YACJ,aAAa,eACT,MACG,kBAAkB,CAAC,CACnB,QAAQ,WAAW,0BAA0B,MAAM,CAAC,CAAC,CACrD,KAAK,WAAW,OAAO,EAAE,IAC5B,CAAC,QAAQ;CAEf,IAAI,kBAAkB,OAAO;CAC7B,IAAI,kBAAkB,OAAO;CAC7B,IAAI,WAAW;CAEf,KAAK,IAAI,IAAI,GAAG,IAAI,SAAS,QAAQ,KACnC,KAAK,IAAI,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;EACzC,MAAM,QAAQ,OAAO,SAAS,EAAE,CAAE,SAAS,UAAU,EAAG,CAAC;EACzD,IAAI,OAAO,MAAM,KAAK,GAAG;EACzB,WAAW;EACX,IAAI,QAAQ,iBAAiB,kBAAkB;EAC/C,IAAI,QAAQ,iBAAiB,kBAAkB;CACjD;CAGF,IAAI,CAAC,UAAU,OAAO;CACtB,OAAO,CAAC,iBAAiB,eAAe;AAC1C"}
|
|
@@ -31,7 +31,7 @@ function _createFacetedRowModel(table, columnId, preRowModel, columnFilters, glo
|
|
|
31
31
|
const id = columnFilters[i].id;
|
|
32
32
|
if (id !== columnId) filterableIds.push(id);
|
|
33
33
|
}
|
|
34
|
-
if (globalFilter) filterableIds.push("__global__");
|
|
34
|
+
if (globalFilter && columnId !== "__global__") filterableIds.push("__global__");
|
|
35
35
|
if (!filterableIds.length) return preRowModel;
|
|
36
36
|
const filterRowsImpl = (row) => {
|
|
37
37
|
for (let i = 0; i < filterableIds.length; i++) if (row.columnFilters?.[filterableIds[i]] === false) return false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createFacetedRowModel.cjs","names":["tableMemo","filterRows"],"sources":["../../../src/features/column-faceting/createFacetedRowModel.ts"],"sourcesContent":["import { tableMemo } from '../../utils'\nimport { filterRows } from '../column-filtering/filterRowsUtils'\nimport type { Table, Table_Internal } from '../../types/Table'\nimport type {\n ColumnFiltersState,\n Row_ColumnFiltering,\n} from '../column-filtering/columnFilteringFeature.types'\nimport type { TableFeatures } from '../../types/TableFeatures'\nimport type { RowModel } from '../../core/row-models/coreRowModelsFeature.types'\nimport type { Row } from '../../types/Row'\nimport type { RowData } from '../../types/type-utils'\n\n/**\n * Creates a memoized faceted row model factory.\n *\n * The factory reads the relevant table state atoms and options, then returns a row model function used by the table row-model pipeline.\n */\nexport function createFacetedRowModel<\n TFeatures extends TableFeatures,\n TData extends RowData = any,\n>(): (\n table: Table<TFeatures, TData>,\n columnId: string,\n) => () => RowModel<TFeatures, TData> {\n return (_table, columnId) => {\n const table = _table as unknown as Table_Internal<TFeatures, TData>\n return tableMemo({\n feature: 'columnFacetingFeature',\n table,\n fnName: 'createFacetedRowModel',\n memoDeps: () => [\n table.getPreFilteredRowModel(),\n table.atoms.columnFilters?.get(),\n table.atoms.globalFilter?.get(),\n table.getFilteredRowModel(),\n ],\n fn: (preRowModel, columnFilters, globalFilter) =>\n _createFacetedRowModel(\n table,\n columnId,\n preRowModel,\n columnFilters,\n globalFilter,\n ),\n })\n }\n}\n\nfunction _createFacetedRowModel<\n TFeatures extends TableFeatures,\n TData extends RowData = any,\n>(\n table: Table_Internal<TFeatures, TData>,\n columnId: string,\n preRowModel: RowModel<TFeatures, TData>,\n columnFilters?: ColumnFiltersState,\n globalFilter?: string,\n) {\n if (!preRowModel.rows.length || (!columnFilters?.length && !globalFilter)) {\n return preRowModel\n }\n\n const filterableIds: Array<string> = []\n if (columnFilters) {\n for (let i = 0; i < columnFilters.length; i++) {\n const id = columnFilters[i]!.id\n if (id !== columnId) filterableIds.push(id)\n }\n }\n if (globalFilter)
|
|
1
|
+
{"version":3,"file":"createFacetedRowModel.cjs","names":["tableMemo","filterRows"],"sources":["../../../src/features/column-faceting/createFacetedRowModel.ts"],"sourcesContent":["import { tableMemo } from '../../utils'\nimport { filterRows } from '../column-filtering/filterRowsUtils'\nimport type { Table, Table_Internal } from '../../types/Table'\nimport type {\n ColumnFiltersState,\n Row_ColumnFiltering,\n} from '../column-filtering/columnFilteringFeature.types'\nimport type { TableFeatures } from '../../types/TableFeatures'\nimport type { RowModel } from '../../core/row-models/coreRowModelsFeature.types'\nimport type { Row } from '../../types/Row'\nimport type { RowData } from '../../types/type-utils'\n\n/**\n * Creates a memoized faceted row model factory.\n *\n * The factory reads the relevant table state atoms and options, then returns a row model function used by the table row-model pipeline.\n */\nexport function createFacetedRowModel<\n TFeatures extends TableFeatures,\n TData extends RowData = any,\n>(): (\n table: Table<TFeatures, TData>,\n columnId: string,\n) => () => RowModel<TFeatures, TData> {\n return (_table, columnId) => {\n const table = _table as unknown as Table_Internal<TFeatures, TData>\n return tableMemo({\n feature: 'columnFacetingFeature',\n table,\n fnName: 'createFacetedRowModel',\n memoDeps: () => [\n table.getPreFilteredRowModel(),\n table.atoms.columnFilters?.get(),\n table.atoms.globalFilter?.get(),\n table.getFilteredRowModel(),\n ],\n fn: (preRowModel, columnFilters, globalFilter) =>\n _createFacetedRowModel(\n table,\n columnId,\n preRowModel,\n columnFilters,\n globalFilter,\n ),\n })\n }\n}\n\nfunction _createFacetedRowModel<\n TFeatures extends TableFeatures,\n TData extends RowData = any,\n>(\n table: Table_Internal<TFeatures, TData>,\n columnId: string,\n preRowModel: RowModel<TFeatures, TData>,\n columnFilters?: ColumnFiltersState,\n globalFilter?: string,\n) {\n if (!preRowModel.rows.length || (!columnFilters?.length && !globalFilter)) {\n return preRowModel\n }\n\n const filterableIds: Array<string> = []\n if (columnFilters) {\n for (let i = 0; i < columnFilters.length; i++) {\n const id = columnFilters[i]!.id\n if (id !== columnId) filterableIds.push(id)\n }\n }\n // The global context excludes the global filter itself, mirroring how a\n // column's faceted model excludes that column's own filter\n if (globalFilter && columnId !== '__global__')\n filterableIds.push('__global__')\n\n if (!filterableIds.length) {\n return preRowModel\n }\n\n const filterRowsImpl = (\n row: Row<TFeatures, TData> & Partial<Row_ColumnFiltering<TFeatures, TData>>,\n ) => {\n // Horizontally filter rows through each column\n for (let i = 0; i < filterableIds.length; i++) {\n if (row.columnFilters?.[filterableIds[i]!] === false) {\n return false\n }\n }\n return true\n }\n\n return filterRows(preRowModel.rows, filterRowsImpl, table)\n}\n"],"mappings":";;;;;;;;;AAiBA,SAAgB,wBAMsB;CACpC,QAAQ,QAAQ,aAAa;EAC3B,MAAM,QAAQ;EACd,OAAOA,wBAAU;GACf,SAAS;GACT;GACA,QAAQ;GACR,gBAAgB;IACd,MAAM,uBAAuB;IAC7B,MAAM,MAAM,eAAe,IAAI;IAC/B,MAAM,MAAM,cAAc,IAAI;IAC9B,MAAM,oBAAoB;GAC5B;GACA,KAAK,aAAa,eAAe,iBAC/B,uBACE,OACA,UACA,aACA,eACA,YACF;EACJ,CAAC;CACH;AACF;AAEA,SAAS,uBAIP,OACA,UACA,aACA,eACA,cACA;CACA,IAAI,CAAC,YAAY,KAAK,UAAW,CAAC,eAAe,UAAU,CAAC,cAC1D,OAAO;CAGT,MAAM,gBAA+B,CAAC;CACtC,IAAI,eACF,KAAK,IAAI,IAAI,GAAG,IAAI,cAAc,QAAQ,KAAK;EAC7C,MAAM,KAAK,cAAc,EAAE,CAAE;EAC7B,IAAI,OAAO,UAAU,cAAc,KAAK,EAAE;CAC5C;CAIF,IAAI,gBAAgB,aAAa,cAC/B,cAAc,KAAK,YAAY;CAEjC,IAAI,CAAC,cAAc,QACjB,OAAO;CAGT,MAAM,kBACJ,QACG;EAEH,KAAK,IAAI,IAAI,GAAG,IAAI,cAAc,QAAQ,KACxC,IAAI,IAAI,gBAAgB,cAAc,QAAS,OAC7C,OAAO;EAGX,OAAO;CACT;CAEA,OAAOC,mCAAW,YAAY,MAAM,gBAAgB,KAAK;AAC3D"}
|
|
@@ -31,7 +31,7 @@ function _createFacetedRowModel(table, columnId, preRowModel, columnFilters, glo
|
|
|
31
31
|
const id = columnFilters[i].id;
|
|
32
32
|
if (id !== columnId) filterableIds.push(id);
|
|
33
33
|
}
|
|
34
|
-
if (globalFilter) filterableIds.push("__global__");
|
|
34
|
+
if (globalFilter && columnId !== "__global__") filterableIds.push("__global__");
|
|
35
35
|
if (!filterableIds.length) return preRowModel;
|
|
36
36
|
const filterRowsImpl = (row) => {
|
|
37
37
|
for (let i = 0; i < filterableIds.length; i++) if (row.columnFilters?.[filterableIds[i]] === false) return false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createFacetedRowModel.js","names":[],"sources":["../../../src/features/column-faceting/createFacetedRowModel.ts"],"sourcesContent":["import { tableMemo } from '../../utils'\nimport { filterRows } from '../column-filtering/filterRowsUtils'\nimport type { Table, Table_Internal } from '../../types/Table'\nimport type {\n ColumnFiltersState,\n Row_ColumnFiltering,\n} from '../column-filtering/columnFilteringFeature.types'\nimport type { TableFeatures } from '../../types/TableFeatures'\nimport type { RowModel } from '../../core/row-models/coreRowModelsFeature.types'\nimport type { Row } from '../../types/Row'\nimport type { RowData } from '../../types/type-utils'\n\n/**\n * Creates a memoized faceted row model factory.\n *\n * The factory reads the relevant table state atoms and options, then returns a row model function used by the table row-model pipeline.\n */\nexport function createFacetedRowModel<\n TFeatures extends TableFeatures,\n TData extends RowData = any,\n>(): (\n table: Table<TFeatures, TData>,\n columnId: string,\n) => () => RowModel<TFeatures, TData> {\n return (_table, columnId) => {\n const table = _table as unknown as Table_Internal<TFeatures, TData>\n return tableMemo({\n feature: 'columnFacetingFeature',\n table,\n fnName: 'createFacetedRowModel',\n memoDeps: () => [\n table.getPreFilteredRowModel(),\n table.atoms.columnFilters?.get(),\n table.atoms.globalFilter?.get(),\n table.getFilteredRowModel(),\n ],\n fn: (preRowModel, columnFilters, globalFilter) =>\n _createFacetedRowModel(\n table,\n columnId,\n preRowModel,\n columnFilters,\n globalFilter,\n ),\n })\n }\n}\n\nfunction _createFacetedRowModel<\n TFeatures extends TableFeatures,\n TData extends RowData = any,\n>(\n table: Table_Internal<TFeatures, TData>,\n columnId: string,\n preRowModel: RowModel<TFeatures, TData>,\n columnFilters?: ColumnFiltersState,\n globalFilter?: string,\n) {\n if (!preRowModel.rows.length || (!columnFilters?.length && !globalFilter)) {\n return preRowModel\n }\n\n const filterableIds: Array<string> = []\n if (columnFilters) {\n for (let i = 0; i < columnFilters.length; i++) {\n const id = columnFilters[i]!.id\n if (id !== columnId) filterableIds.push(id)\n }\n }\n if (globalFilter)
|
|
1
|
+
{"version":3,"file":"createFacetedRowModel.js","names":[],"sources":["../../../src/features/column-faceting/createFacetedRowModel.ts"],"sourcesContent":["import { tableMemo } from '../../utils'\nimport { filterRows } from '../column-filtering/filterRowsUtils'\nimport type { Table, Table_Internal } from '../../types/Table'\nimport type {\n ColumnFiltersState,\n Row_ColumnFiltering,\n} from '../column-filtering/columnFilteringFeature.types'\nimport type { TableFeatures } from '../../types/TableFeatures'\nimport type { RowModel } from '../../core/row-models/coreRowModelsFeature.types'\nimport type { Row } from '../../types/Row'\nimport type { RowData } from '../../types/type-utils'\n\n/**\n * Creates a memoized faceted row model factory.\n *\n * The factory reads the relevant table state atoms and options, then returns a row model function used by the table row-model pipeline.\n */\nexport function createFacetedRowModel<\n TFeatures extends TableFeatures,\n TData extends RowData = any,\n>(): (\n table: Table<TFeatures, TData>,\n columnId: string,\n) => () => RowModel<TFeatures, TData> {\n return (_table, columnId) => {\n const table = _table as unknown as Table_Internal<TFeatures, TData>\n return tableMemo({\n feature: 'columnFacetingFeature',\n table,\n fnName: 'createFacetedRowModel',\n memoDeps: () => [\n table.getPreFilteredRowModel(),\n table.atoms.columnFilters?.get(),\n table.atoms.globalFilter?.get(),\n table.getFilteredRowModel(),\n ],\n fn: (preRowModel, columnFilters, globalFilter) =>\n _createFacetedRowModel(\n table,\n columnId,\n preRowModel,\n columnFilters,\n globalFilter,\n ),\n })\n }\n}\n\nfunction _createFacetedRowModel<\n TFeatures extends TableFeatures,\n TData extends RowData = any,\n>(\n table: Table_Internal<TFeatures, TData>,\n columnId: string,\n preRowModel: RowModel<TFeatures, TData>,\n columnFilters?: ColumnFiltersState,\n globalFilter?: string,\n) {\n if (!preRowModel.rows.length || (!columnFilters?.length && !globalFilter)) {\n return preRowModel\n }\n\n const filterableIds: Array<string> = []\n if (columnFilters) {\n for (let i = 0; i < columnFilters.length; i++) {\n const id = columnFilters[i]!.id\n if (id !== columnId) filterableIds.push(id)\n }\n }\n // The global context excludes the global filter itself, mirroring how a\n // column's faceted model excludes that column's own filter\n if (globalFilter && columnId !== '__global__')\n filterableIds.push('__global__')\n\n if (!filterableIds.length) {\n return preRowModel\n }\n\n const filterRowsImpl = (\n row: Row<TFeatures, TData> & Partial<Row_ColumnFiltering<TFeatures, TData>>,\n ) => {\n // Horizontally filter rows through each column\n for (let i = 0; i < filterableIds.length; i++) {\n if (row.columnFilters?.[filterableIds[i]!] === false) {\n return false\n }\n }\n return true\n }\n\n return filterRows(preRowModel.rows, filterRowsImpl, table)\n}\n"],"mappings":";;;;;;;;;AAiBA,SAAgB,wBAMsB;CACpC,QAAQ,QAAQ,aAAa;EAC3B,MAAM,QAAQ;EACd,OAAO,UAAU;GACf,SAAS;GACT;GACA,QAAQ;GACR,gBAAgB;IACd,MAAM,uBAAuB;IAC7B,MAAM,MAAM,eAAe,IAAI;IAC/B,MAAM,MAAM,cAAc,IAAI;IAC9B,MAAM,oBAAoB;GAC5B;GACA,KAAK,aAAa,eAAe,iBAC/B,uBACE,OACA,UACA,aACA,eACA,YACF;EACJ,CAAC;CACH;AACF;AAEA,SAAS,uBAIP,OACA,UACA,aACA,eACA,cACA;CACA,IAAI,CAAC,YAAY,KAAK,UAAW,CAAC,eAAe,UAAU,CAAC,cAC1D,OAAO;CAGT,MAAM,gBAA+B,CAAC;CACtC,IAAI,eACF,KAAK,IAAI,IAAI,GAAG,IAAI,cAAc,QAAQ,KAAK;EAC7C,MAAM,KAAK,cAAc,EAAE,CAAE;EAC7B,IAAI,OAAO,UAAU,cAAc,KAAK,EAAE;CAC5C;CAIF,IAAI,gBAAgB,aAAa,cAC/B,cAAc,KAAK,YAAY;CAEjC,IAAI,CAAC,cAAc,QACjB,OAAO;CAGT,MAAM,kBACJ,QACG;EAEH,KAAK,IAAI,IAAI,GAAG,IAAI,cAAc,QAAQ,KACxC,IAAI,IAAI,gBAAgB,cAAc,QAAS,OAC7C,OAAO;EAGX,OAAO;CACT;CAEA,OAAO,WAAW,YAAY,MAAM,gBAAgB,KAAK;AAC3D"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
const require_utils = require('../../utils.cjs');
|
|
2
2
|
const require_columnFacetingFeature_utils = require('./columnFacetingFeature.utils.cjs');
|
|
3
|
+
const require_globalFilteringFeature_utils = require('../global-filtering/globalFilteringFeature.utils.cjs');
|
|
3
4
|
|
|
4
5
|
//#region src/features/column-faceting/createFacetedUniqueValues.ts
|
|
5
6
|
/**
|
|
@@ -15,18 +16,21 @@ function createFacetedUniqueValues() {
|
|
|
15
16
|
table,
|
|
16
17
|
fnName: "table.getFacetedUniqueValues",
|
|
17
18
|
memoDeps: () => {
|
|
19
|
+
if (columnId === "__global__") return [require_utils.callMemoOrStaticFn(table, "getGlobalFacetedRowModel", require_columnFacetingFeature_utils.table_getGlobalFacetedRowModel).flatRows];
|
|
18
20
|
const column = table.getColumn(columnId);
|
|
19
21
|
if (!column) return [table.getPreFilteredRowModel().flatRows];
|
|
20
22
|
return [require_utils.callMemoOrStaticFn(column, "getFacetedRowModel", require_columnFacetingFeature_utils.column_getFacetedRowModel, table).flatRows];
|
|
21
23
|
},
|
|
22
|
-
fn: (flatRows) => _createFacetedUniqueValues(columnId, flatRows)
|
|
24
|
+
fn: (flatRows) => _createFacetedUniqueValues(table, columnId, flatRows)
|
|
23
25
|
});
|
|
24
26
|
};
|
|
25
27
|
}
|
|
26
|
-
function _createFacetedUniqueValues(columnId, flatRows) {
|
|
28
|
+
function _createFacetedUniqueValues(table, columnId, flatRows) {
|
|
29
|
+
const columnIds = columnId === "__global__" ? table.getAllLeafColumns().filter((column) => require_globalFilteringFeature_utils.column_getCanGlobalFilter(column)).map((column) => column.id) : [columnId];
|
|
27
30
|
const facetedUniqueValues = /* @__PURE__ */ new Map();
|
|
28
|
-
for (let i = 0; i < flatRows.length; i++) {
|
|
29
|
-
const values = flatRows[i].getUniqueValues(
|
|
31
|
+
for (let i = 0; i < flatRows.length; i++) for (let c = 0; c < columnIds.length; c++) {
|
|
32
|
+
const values = flatRows[i].getUniqueValues(columnIds[c]);
|
|
33
|
+
if (!values) continue;
|
|
30
34
|
for (let j = 0; j < values.length; j++) {
|
|
31
35
|
const value = values[j];
|
|
32
36
|
const previousValue = facetedUniqueValues.get(value);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createFacetedUniqueValues.cjs","names":["tableMemo","callMemoOrStaticFn","column_getFacetedRowModel"],"sources":["../../../src/features/column-faceting/createFacetedUniqueValues.ts"],"sourcesContent":["import { callMemoOrStaticFn, tableMemo } from '../../utils'\nimport {
|
|
1
|
+
{"version":3,"file":"createFacetedUniqueValues.cjs","names":["tableMemo","callMemoOrStaticFn","table_getGlobalFacetedRowModel","column_getFacetedRowModel","column_getCanGlobalFilter"],"sources":["../../../src/features/column-faceting/createFacetedUniqueValues.ts"],"sourcesContent":["import { callMemoOrStaticFn, tableMemo } from '../../utils'\nimport { column_getCanGlobalFilter } from '../global-filtering/globalFilteringFeature.utils'\nimport {\n column_getFacetedRowModel,\n table_getGlobalFacetedRowModel,\n} from './columnFacetingFeature.utils'\nimport type { Row } from '../../types/Row'\nimport type { Table, Table_Internal } from '../../types/Table'\nimport type { TableFeatures } from '../../types/TableFeatures'\nimport type { RowData } from '../../types/type-utils'\n\n/**\n * Creates a memoized faceted unique values helper for faceted filtering.\n *\n * The returned function derives facet data from the table row model and relevant filter state so filter UIs can display available values.\n */\nexport function createFacetedUniqueValues<\n TFeatures extends TableFeatures,\n TData extends RowData = any,\n>(): (\n table: Table<TFeatures, TData>,\n columnId: string,\n) => () => Map<any, number> {\n return (_table, columnId) => {\n const table = _table as unknown as Table_Internal<TFeatures, TData>\n return tableMemo({\n feature: 'columnFacetingFeature',\n table,\n fnName: 'table.getFacetedUniqueValues',\n memoDeps: () => {\n if (columnId === '__global__') {\n return [\n callMemoOrStaticFn(\n table,\n 'getGlobalFacetedRowModel',\n table_getGlobalFacetedRowModel,\n ).flatRows,\n ]\n }\n const column = table.getColumn(columnId)\n if (!column) return [table.getPreFilteredRowModel().flatRows]\n return [\n callMemoOrStaticFn(\n column,\n 'getFacetedRowModel',\n column_getFacetedRowModel,\n table,\n ).flatRows,\n ]\n },\n fn: (flatRows) => _createFacetedUniqueValues(table, columnId, flatRows),\n })\n }\n}\n\nfunction _createFacetedUniqueValues<\n TFeatures extends TableFeatures,\n TData extends RowData = any,\n>(\n table: Table_Internal<TFeatures, TData>,\n columnId: string,\n flatRows: Array<Row<TFeatures, TData>>,\n): Map<any, number> {\n // The global context aggregates unique values across every column that\n // participates in global filtering\n const columnIds =\n columnId === '__global__'\n ? table\n .getAllLeafColumns()\n .filter((column) => column_getCanGlobalFilter(column))\n .map((column) => column.id)\n : [columnId]\n\n const facetedUniqueValues = new Map<any, number>()\n\n for (let i = 0; i < flatRows.length; i++) {\n for (let c = 0; c < columnIds.length; c++) {\n // the declared return type is Array, but rows return undefined for\n // columns without an accessor (e.g. display columns)\n const values = flatRows[i]!.getUniqueValues(columnIds[c]!) as\n | Array<unknown>\n | undefined\n if (!values) continue\n\n for (let j = 0; j < values.length; j++) {\n const value = values[j]\n const previousValue = facetedUniqueValues.get(value)\n facetedUniqueValues.set(\n value,\n previousValue === undefined ? 1 : previousValue + 1,\n )\n }\n }\n }\n\n return facetedUniqueValues\n}\n"],"mappings":";;;;;;;;;;AAgBA,SAAgB,4BAMY;CAC1B,QAAQ,QAAQ,aAAa;EAC3B,MAAM,QAAQ;EACd,OAAOA,wBAAU;GACf,SAAS;GACT;GACA,QAAQ;GACR,gBAAgB;IACd,IAAI,aAAa,cACf,OAAO,CACLC,iCACE,OACA,4BACAC,kEACF,CAAC,CAAC,QACJ;IAEF,MAAM,SAAS,MAAM,UAAU,QAAQ;IACvC,IAAI,CAAC,QAAQ,OAAO,CAAC,MAAM,uBAAuB,CAAC,CAAC,QAAQ;IAC5D,OAAO,CACLD,iCACE,QACA,sBACAE,+DACA,KACF,CAAC,CAAC,QACJ;GACF;GACA,KAAK,aAAa,2BAA2B,OAAO,UAAU,QAAQ;EACxE,CAAC;CACH;AACF;AAEA,SAAS,2BAIP,OACA,UACA,UACkB;CAGlB,MAAM,YACJ,aAAa,eACT,MACG,kBAAkB,CAAC,CACnB,QAAQ,WAAWC,+DAA0B,MAAM,CAAC,CAAC,CACrD,KAAK,WAAW,OAAO,EAAE,IAC5B,CAAC,QAAQ;CAEf,MAAM,sCAAsB,IAAI,IAAiB;CAEjD,KAAK,IAAI,IAAI,GAAG,IAAI,SAAS,QAAQ,KACnC,KAAK,IAAI,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;EAGzC,MAAM,SAAS,SAAS,EAAE,CAAE,gBAAgB,UAAU,EAAG;EAGzD,IAAI,CAAC,QAAQ;EAEb,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;GACtC,MAAM,QAAQ,OAAO;GACrB,MAAM,gBAAgB,oBAAoB,IAAI,KAAK;GACnD,oBAAoB,IAClB,OACA,kBAAkB,SAAY,IAAI,gBAAgB,CACpD;EACF;CACF;CAGF,OAAO;AACT"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { callMemoOrStaticFn, tableMemo } from "../../utils.js";
|
|
2
|
-
import { column_getFacetedRowModel } from "./columnFacetingFeature.utils.js";
|
|
2
|
+
import { column_getFacetedRowModel, table_getGlobalFacetedRowModel } from "./columnFacetingFeature.utils.js";
|
|
3
|
+
import { column_getCanGlobalFilter } from "../global-filtering/globalFilteringFeature.utils.js";
|
|
3
4
|
|
|
4
5
|
//#region src/features/column-faceting/createFacetedUniqueValues.ts
|
|
5
6
|
/**
|
|
@@ -15,18 +16,21 @@ function createFacetedUniqueValues() {
|
|
|
15
16
|
table,
|
|
16
17
|
fnName: "table.getFacetedUniqueValues",
|
|
17
18
|
memoDeps: () => {
|
|
19
|
+
if (columnId === "__global__") return [callMemoOrStaticFn(table, "getGlobalFacetedRowModel", table_getGlobalFacetedRowModel).flatRows];
|
|
18
20
|
const column = table.getColumn(columnId);
|
|
19
21
|
if (!column) return [table.getPreFilteredRowModel().flatRows];
|
|
20
22
|
return [callMemoOrStaticFn(column, "getFacetedRowModel", column_getFacetedRowModel, table).flatRows];
|
|
21
23
|
},
|
|
22
|
-
fn: (flatRows) => _createFacetedUniqueValues(columnId, flatRows)
|
|
24
|
+
fn: (flatRows) => _createFacetedUniqueValues(table, columnId, flatRows)
|
|
23
25
|
});
|
|
24
26
|
};
|
|
25
27
|
}
|
|
26
|
-
function _createFacetedUniqueValues(columnId, flatRows) {
|
|
28
|
+
function _createFacetedUniqueValues(table, columnId, flatRows) {
|
|
29
|
+
const columnIds = columnId === "__global__" ? table.getAllLeafColumns().filter((column) => column_getCanGlobalFilter(column)).map((column) => column.id) : [columnId];
|
|
27
30
|
const facetedUniqueValues = /* @__PURE__ */ new Map();
|
|
28
|
-
for (let i = 0; i < flatRows.length; i++) {
|
|
29
|
-
const values = flatRows[i].getUniqueValues(
|
|
31
|
+
for (let i = 0; i < flatRows.length; i++) for (let c = 0; c < columnIds.length; c++) {
|
|
32
|
+
const values = flatRows[i].getUniqueValues(columnIds[c]);
|
|
33
|
+
if (!values) continue;
|
|
30
34
|
for (let j = 0; j < values.length; j++) {
|
|
31
35
|
const value = values[j];
|
|
32
36
|
const previousValue = facetedUniqueValues.get(value);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createFacetedUniqueValues.js","names":[],"sources":["../../../src/features/column-faceting/createFacetedUniqueValues.ts"],"sourcesContent":["import { callMemoOrStaticFn, tableMemo } from '../../utils'\nimport {
|
|
1
|
+
{"version":3,"file":"createFacetedUniqueValues.js","names":[],"sources":["../../../src/features/column-faceting/createFacetedUniqueValues.ts"],"sourcesContent":["import { callMemoOrStaticFn, tableMemo } from '../../utils'\nimport { column_getCanGlobalFilter } from '../global-filtering/globalFilteringFeature.utils'\nimport {\n column_getFacetedRowModel,\n table_getGlobalFacetedRowModel,\n} from './columnFacetingFeature.utils'\nimport type { Row } from '../../types/Row'\nimport type { Table, Table_Internal } from '../../types/Table'\nimport type { TableFeatures } from '../../types/TableFeatures'\nimport type { RowData } from '../../types/type-utils'\n\n/**\n * Creates a memoized faceted unique values helper for faceted filtering.\n *\n * The returned function derives facet data from the table row model and relevant filter state so filter UIs can display available values.\n */\nexport function createFacetedUniqueValues<\n TFeatures extends TableFeatures,\n TData extends RowData = any,\n>(): (\n table: Table<TFeatures, TData>,\n columnId: string,\n) => () => Map<any, number> {\n return (_table, columnId) => {\n const table = _table as unknown as Table_Internal<TFeatures, TData>\n return tableMemo({\n feature: 'columnFacetingFeature',\n table,\n fnName: 'table.getFacetedUniqueValues',\n memoDeps: () => {\n if (columnId === '__global__') {\n return [\n callMemoOrStaticFn(\n table,\n 'getGlobalFacetedRowModel',\n table_getGlobalFacetedRowModel,\n ).flatRows,\n ]\n }\n const column = table.getColumn(columnId)\n if (!column) return [table.getPreFilteredRowModel().flatRows]\n return [\n callMemoOrStaticFn(\n column,\n 'getFacetedRowModel',\n column_getFacetedRowModel,\n table,\n ).flatRows,\n ]\n },\n fn: (flatRows) => _createFacetedUniqueValues(table, columnId, flatRows),\n })\n }\n}\n\nfunction _createFacetedUniqueValues<\n TFeatures extends TableFeatures,\n TData extends RowData = any,\n>(\n table: Table_Internal<TFeatures, TData>,\n columnId: string,\n flatRows: Array<Row<TFeatures, TData>>,\n): Map<any, number> {\n // The global context aggregates unique values across every column that\n // participates in global filtering\n const columnIds =\n columnId === '__global__'\n ? table\n .getAllLeafColumns()\n .filter((column) => column_getCanGlobalFilter(column))\n .map((column) => column.id)\n : [columnId]\n\n const facetedUniqueValues = new Map<any, number>()\n\n for (let i = 0; i < flatRows.length; i++) {\n for (let c = 0; c < columnIds.length; c++) {\n // the declared return type is Array, but rows return undefined for\n // columns without an accessor (e.g. display columns)\n const values = flatRows[i]!.getUniqueValues(columnIds[c]!) as\n | Array<unknown>\n | undefined\n if (!values) continue\n\n for (let j = 0; j < values.length; j++) {\n const value = values[j]\n const previousValue = facetedUniqueValues.get(value)\n facetedUniqueValues.set(\n value,\n previousValue === undefined ? 1 : previousValue + 1,\n )\n }\n }\n }\n\n return facetedUniqueValues\n}\n"],"mappings":";;;;;;;;;;AAgBA,SAAgB,4BAMY;CAC1B,QAAQ,QAAQ,aAAa;EAC3B,MAAM,QAAQ;EACd,OAAO,UAAU;GACf,SAAS;GACT;GACA,QAAQ;GACR,gBAAgB;IACd,IAAI,aAAa,cACf,OAAO,CACL,mBACE,OACA,4BACA,8BACF,CAAC,CAAC,QACJ;IAEF,MAAM,SAAS,MAAM,UAAU,QAAQ;IACvC,IAAI,CAAC,QAAQ,OAAO,CAAC,MAAM,uBAAuB,CAAC,CAAC,QAAQ;IAC5D,OAAO,CACL,mBACE,QACA,sBACA,2BACA,KACF,CAAC,CAAC,QACJ;GACF;GACA,KAAK,aAAa,2BAA2B,OAAO,UAAU,QAAQ;EACxE,CAAC;CACH;AACF;AAEA,SAAS,2BAIP,OACA,UACA,UACkB;CAGlB,MAAM,YACJ,aAAa,eACT,MACG,kBAAkB,CAAC,CACnB,QAAQ,WAAW,0BAA0B,MAAM,CAAC,CAAC,CACrD,KAAK,WAAW,OAAO,EAAE,IAC5B,CAAC,QAAQ;CAEf,MAAM,sCAAsB,IAAI,IAAiB;CAEjD,KAAK,IAAI,IAAI,GAAG,IAAI,SAAS,QAAQ,KACnC,KAAK,IAAI,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;EAGzC,MAAM,SAAS,SAAS,EAAE,CAAE,gBAAgB,UAAU,EAAG;EAGzD,IAAI,CAAC,QAAQ;EAEb,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;GACtC,MAAM,QAAQ,OAAO;GACrB,MAAM,gBAAgB,oBAAoB,IAAI,KAAK;GACnD,oBAAoB,IAClB,OACA,kBAAkB,SAAY,IAAI,gBAAgB,CACpD;EACF;CACF;CAGF,OAAO;AACT"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { CellData, OnChangeFn, RowData, TransformDataValueFn, Updater } from "../../types/type-utils.cjs";
|
|
2
|
-
import { BuiltInFilterFn } from "
|
|
2
|
+
import { BuiltInFilterFn } from "./filterFns.cjs";
|
|
3
3
|
import { Row } from "../../types/Row.cjs";
|
|
4
4
|
import { RowModel } from "../../core/row-models/coreRowModelsFeature.types.cjs";
|
|
5
5
|
import { Column } from "../../types/Column.cjs";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { CellData, OnChangeFn, RowData, TransformDataValueFn, Updater } from "../../types/type-utils.js";
|
|
2
|
-
import { BuiltInFilterFn } from "
|
|
2
|
+
import { BuiltInFilterFn } from "./filterFns.js";
|
|
3
3
|
import { Row } from "../../types/Row.js";
|
|
4
4
|
import { RowModel } from "../../core/row-models/coreRowModelsFeature.types.js";
|
|
5
5
|
import { Column } from "../../types/Column.js";
|