mirror of
https://github.com/apache/superset.git
synced 2026-04-20 00:24:38 +00:00
feat: show search filtered total (#36083)
This commit is contained in:
@@ -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>
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user