diff --git a/superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx b/superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx index c9e3a7b628b..f6798b79848 100644 --- a/superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx +++ b/superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx @@ -37,15 +37,17 @@ import { import { ensureIsArray, GenericDataType, + getMetricLabel, isAdhocColumn, isPhysicalColumn, QueryFormColumn, + QueryFormMetric, QueryMode, SMART_DATE_ID, t, } from '@superset-ui/core'; -import { isEmpty } from 'lodash'; +import { isEmpty, last } from 'lodash'; import { PAGE_SIZE_OPTIONS } from './consts'; import { ColorSchemeEnum } from './types'; @@ -486,51 +488,69 @@ const config: ControlPanelConfig = { return true; }, mapStateToProps(explore, _, chart) { - const timeComparisonStatus = !isEmpty( - explore?.controls?.time_compare?.value, - ); - + const timeComparisonValue = + explore?.controls?.time_compare?.value; const { colnames: _colnames, coltypes: _coltypes } = chart?.queriesResponse?.[0] ?? {}; let colnames: string[] = _colnames || []; let coltypes: GenericDataType[] = _coltypes || []; const childColumnMap: Record = {}; + const timeComparisonColumnMap: Record = {}; - if (timeComparisonStatus) { + if (!isEmpty(timeComparisonValue)) { /** * Replace numeric columns with sets of comparison columns. */ const updatedColnames: string[] = []; const updatedColtypes: GenericDataType[] = []; - colnames.forEach((colname, index) => { - if (coltypes[index] === GenericDataType.Numeric) { - const comparisonColumns = - generateComparisonColumns(colname); - comparisonColumns.forEach((name, idx) => { - updatedColnames.push(name); - updatedColtypes.push( - ...generateComparisonColumnTypes(4), - ); - - if (idx === 0 && name.startsWith('Main ')) { - childColumnMap[name] = false; - } else { - childColumnMap[name] = true; - } - }); - } else { - updatedColnames.push(colname); - updatedColtypes.push(coltypes[index]); - childColumnMap[colname] = false; - } - }); + colnames + .filter( + colname => + last(colname.split('__')) !== timeComparisonValue, + ) + .forEach((colname, index) => { + if ( + explore.form_data.metrics?.some( + metric => getMetricLabel(metric) === colname, + ) || + explore.form_data.percent_metrics?.some( + (metric: QueryFormMetric) => + getMetricLabel(metric) === colname, + ) + ) { + const comparisonColumns = + generateComparisonColumns(colname); + comparisonColumns.forEach((name, idx) => { + updatedColnames.push(name); + updatedColtypes.push( + ...generateComparisonColumnTypes(4), + ); + timeComparisonColumnMap[name] = true; + if (idx === 0 && name.startsWith('Main ')) { + childColumnMap[name] = false; + } else { + childColumnMap[name] = true; + } + }); + } else { + updatedColnames.push(colname); + updatedColtypes.push(coltypes[index]); + childColumnMap[colname] = false; + timeComparisonColumnMap[colname] = false; + } + }); colnames = updatedColnames; coltypes = updatedColtypes; } return { - columnsPropsObject: { colnames, coltypes, childColumnMap }, + columnsPropsObject: { + colnames, + coltypes, + childColumnMap, + timeComparisonColumnMap, + }, }; }, }, diff --git a/superset-frontend/src/explore/components/controls/ColumnConfigControl/ColumnConfigControl.tsx b/superset-frontend/src/explore/components/controls/ColumnConfigControl/ColumnConfigControl.tsx index a30f68d02f0..e8d67aa018f 100644 --- a/superset-frontend/src/explore/components/controls/ColumnConfigControl/ColumnConfigControl.tsx +++ b/superset-frontend/src/explore/components/controls/ColumnConfigControl/ColumnConfigControl.tsx @@ -38,6 +38,7 @@ export type ColumnConfigControlProps = colnames: string[]; coltypes: GenericDataType[]; childColumnMap?: Record; + timeComparisonColumnMap?: Record; }; configFormLayout?: ColumnConfigFormLayout; appliedColumnNames?: string[]; @@ -87,6 +88,8 @@ export default function ColumnConfigControl({ type: coltypes?.[idx], config: value?.[col] || {}, isChildColumn: columnsPropsObject?.childColumnMap?.[col] ?? false, + isTimeComparisonColumn: + columnsPropsObject?.timeComparisonColumnMap?.[col] ?? false, }; }); return configs; @@ -136,7 +139,7 @@ export default function ColumnConfigControl({ column={col} onChange={config => setColumnConfig(col.name, config as T)} configFormLayout={ - col.isChildColumn + col.isTimeComparisonColumn ? ({ [col.type ?? GenericDataType.String]: [ { diff --git a/superset-frontend/src/explore/components/controls/ColumnConfigControl/types.ts b/superset-frontend/src/explore/components/controls/ColumnConfigControl/types.ts index 5a8c4b5c393..1e2e09c9c1d 100644 --- a/superset-frontend/src/explore/components/controls/ColumnConfigControl/types.ts +++ b/superset-frontend/src/explore/components/controls/ColumnConfigControl/types.ts @@ -41,6 +41,7 @@ export type ColumnConfig = { */ export interface ColumnConfigInfo { isChildColumn: boolean; + isTimeComparisonColumn: boolean; name: string; type?: GenericDataType; config: JsonObject;