feat: show search filtered total (#36083)

This commit is contained in:
Kaito Watanabe
2025-12-01 16:29:23 -05:00
committed by GitHub
parent db995ad5bf
commit 6e0960c3f5
5 changed files with 185 additions and 21 deletions

View File

@@ -361,8 +361,14 @@ export default function TableChart<D extends DataRecord = DataRecord>(
comparisonColumns[0].key,
]);
const [hideComparisonKeys, setHideComparisonKeys] = useState<string[]>([]);
// recalculated totals to display when the search filter is applied (client-side pagination)
const [displayedTotals, setDisplayedTotals] = useState<D | undefined>(totals);
const theme = useTheme();
useEffect(() => {
setDisplayedTotals(totals);
}, [totals]);
// only take relevant page size options
const pageSizeOptions = useMemo(() => {
const getServerPagination = (n: number) => n <= rowCount;
@@ -1132,7 +1138,7 @@ export default function TableChart<D extends DataRecord = DataRecord>(
</th>
),
Footer: totals ? (
Footer: displayedTotals ? (
i === 0 ? (
<th key={`footer-summary-${i}`}>
<div
@@ -1157,7 +1163,9 @@ export default function TableChart<D extends DataRecord = DataRecord>(
</th>
) : (
<td key={`footer-total-${i}`} style={sharedStyle}>
<strong>{formatColumnValue(column, totals[key])[1]}</strong>
<strong>
{formatColumnValue(column, displayedTotals[key])[1]}
</strong>
</td>
)
) : undefined,
@@ -1177,7 +1185,7 @@ export default function TableChart<D extends DataRecord = DataRecord>(
getValueRange,
emitCrossFilters,
comparisonLabels,
totals,
displayedTotals,
theme,
sortDesc,
groupHeaderColumns,
@@ -1202,6 +1210,36 @@ export default function TableChart<D extends DataRecord = DataRecord>(
const [searchOptions, setSearchOptions] = useState<SearchOption[]>([]);
const handleFilteredDataChange = useCallback(
(rows: Row<D>[], searchText?: string) => {
if (!totals || serverPagination) {
return;
}
if (!searchText?.trim()) {
setDisplayedTotals(totals);
return;
}
const updatedTotals: Record<string, DataRecordValue> = { ...totals };
filteredColumnsMeta.forEach(column => {
if (column.isMetric || column.isPercentMetric) {
const aggregatedValue = rows.reduce<number>((acc, row) => {
const rawValue = row.original?.[column.key];
const numValue = Number(String(rawValue ?? '').replace(/,/g, ''));
return Number.isFinite(numValue) ? acc + numValue : acc;
}, 0);
updatedTotals[column.key] = aggregatedValue;
}
});
setDisplayedTotals(updatedTotals as D);
},
[filteredColumnsMeta, serverPagination, totals],
);
useEffect(() => {
const options = (
columns as unknown as ColumnWithLooseAccessor &
@@ -1356,6 +1394,7 @@ export default function TableChart<D extends DataRecord = DataRecord>(
manualSearch={serverPagination}
onSearchChange={debouncedSearch}
searchOptions={searchOptions}
onFilteredDataChange={handleFilteredDataChange}
/>
</Styles>
);