From d1c179fb571fbfd36e259f17223dda7d3ba1715c Mon Sep 17 00:00:00 2001 From: Dan Marshall Date: Thu, 9 Feb 2023 16:02:53 -0800 Subject: [PATCH] recalc column stats after filtering --- packages/sanddance-explorer/src/defaults.ts | 1 + packages/sanddance-explorer/src/explorer.tsx | 20 ++++++++++++++++---- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/packages/sanddance-explorer/src/defaults.ts b/packages/sanddance-explorer/src/defaults.ts index 414e983c5..cfaa02e93 100644 --- a/packages/sanddance-explorer/src/defaults.ts +++ b/packages/sanddance-explorer/src/defaults.ts @@ -53,6 +53,7 @@ export function initialExplorerState(props: Props) { totalStyle: null, facetStyle: 'wrap', filter: null, + filteredColumns: null, filteredData: null, specCapabilities: null, size: { diff --git a/packages/sanddance-explorer/src/explorer.tsx b/packages/sanddance-explorer/src/explorer.tsx index 881b70b7c..c977da9ea 100644 --- a/packages/sanddance-explorer/src/explorer.tsx +++ b/packages/sanddance-explorer/src/explorer.tsx @@ -105,6 +105,7 @@ export interface UIState { errors: string[]; autoCompleteDistinctValues: AutoCompleteDistinctValues; search: InputSearchExpressionGroup[]; + filteredColumns: SandDance.types.Column[]; filteredData: object[]; sidebarClosed: boolean; sidebarPinned: boolean; @@ -193,7 +194,15 @@ function _Explorer(_props: Props) { { label: this.historicFilterChange, omit: !this.historicFilterChange }, ); this.historicFilterChange = null; - this.setState({ filteredData, selectedItemIndex }); + const filteredColumns = filter ? this.state.dataContent.columns + .map(c => { + const column = SandDance.VegaMorphCharts.util.clone(c); + delete column.stats; + column.stats = SandDance.util.getStats(filteredData, column); + return column; + }) + : null; + this.setState({ filteredColumns, filteredData, selectedItemIndex }); if (this.state.sideTabId === SideTabId.Data && this.state.dataScopeId === DataScopeId.FilteredData) { //make sure item is active requestAnimationFrame(() => filteredData && this.silentActivation(filteredData[0])); @@ -383,6 +392,7 @@ function _Explorer(_props: Props) { ...partialInsight, }; const state: Partial = { + filteredColumns: null, filteredData: null, selectedItemIndex, search: createInputSearch(historicInsight.filter), @@ -498,6 +508,7 @@ function _Explorer(_props: Props) { dataContent, snapshots: dataContent.snapshots || this.state.snapshots, autoCompleteDistinctValues: {}, + filteredColumns: null, filteredData: null, tooltipExclusions: (optionsOrPrefs && (optionsOrPrefs as Options).tooltipExclusions) || [], selectedItemIndex, @@ -1525,9 +1536,10 @@ function _Explorer(_props: Props) { } private getColumnMapBaseProps() { - const allColumns = this.state.dataContent && this.state.dataContent.columns.filter(c => !SandDance.util.isInternalFieldName(c.name, true)); - const quantitativeColumns = allColumns && allColumns.filter(c => c.quantitative); - const categoricalColumns = allColumns && allColumns.filter(c => !c.quantitative); + const allColumns = (this.state.filteredColumns || this.state.dataContent?.columns || []) + .filter(c => !SandDance.util.isInternalFieldName(c.name, true)); + const quantitativeColumns = allColumns.filter(c => c.quantitative); + const categoricalColumns = allColumns.filter(c => !c.quantitative); const props: ColumnMapBaseProps = { changeColumnMapping: (role, columnOrRole, defaultColumn, options) => { let column: SandDance.types.Column;