diff --git a/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.tsx b/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.tsx index 9af00bd9b06..b8592b89660 100644 --- a/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.tsx +++ b/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.tsx @@ -76,8 +76,10 @@ interface ExtraConfig { [key: string]: unknown; } +type Metric = AdhocMetric | SavedMetricType; + interface AdhocMetricEditPopoverProps { - onChange: (adhocMetric: AdhocMetric) => void; + onChange: (newMetric: Metric, oldMetric?: Metric) => void; onClose: () => void; onResize: () => void; getCurrentTab?: (tab: string) => void; @@ -216,7 +218,7 @@ export default class AdhocMetricEditPopover extends PureComponent< return adhocMetric.expressionType; } if ( - (isNewMetric || savedMetric.metric_name) && + (isNewMetric || savedMetric?.metric_name) && Array.isArray(savedMetricsOptions) && savedMetricsOptions.length > 0 ) { @@ -387,7 +389,7 @@ export default class AdhocMetricEditPopover extends PureComponent< const aggregateSelectProps = { ariaLabel: t('Select aggregate options'), placeholder: t('%s aggregates(s)', AGGREGATES_OPTIONS.length), - value: adhocMetric.aggregate || adhocMetric.inferSqlExpressionAggregate(), + value: adhocMetric.aggregate ?? adhocMetric.inferSqlExpressionAggregate() ?? undefined, onChange: this.onAggregateChange, allowClear: true, autoFocus: !!columnValue, diff --git a/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricOption.tsx b/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricOption.tsx index 265cbfda52f..250d31c4179 100644 --- a/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricOption.tsx +++ b/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricOption.tsx @@ -18,35 +18,25 @@ */ import { PureComponent } from 'react'; import PropTypes from 'prop-types'; +import { Metric } from '@superset-ui/core'; import { OptionControlLabel } from 'src/explore/components/controls/OptionControls'; import { DndItemType } from 'src/explore/components/DndItemType'; +import { Datasource } from 'src/explore/types'; +import { ISaveableDatasource } from 'src/SqlLab/components/SaveDatasetModal'; import columnType from './columnType'; import AdhocMetric from './AdhocMetric'; import savedMetricType from './savedMetricType'; import AdhocMetricPopoverTrigger from './AdhocMetricPopoverTrigger'; - -interface ColumnType { - column_name: string; - verbose_name?: string; - [key: string]: unknown; -} - -interface SavedMetricType { - metric_name: string; - verbose_name?: string; - expression?: string; - error_text?: string; - [key: string]: unknown; -} +import { savedMetricType as SavedMetricTypeDef } from './types'; interface AdhocMetricOptionProps { adhocMetric: AdhocMetric; - onMetricEdit: (metric: AdhocMetric) => void; + onMetricEdit: (newMetric: Metric, oldMetric: Metric) => void; onRemoveMetric?: (index: number) => void; - columns?: ColumnType[]; - savedMetricsOptions?: SavedMetricType[]; - savedMetric: SavedMetricType; - datasource?: Record; + columns?: { column_name: string; type: string }[]; + savedMetricsOptions?: SavedMetricTypeDef[]; + savedMetric: SavedMetricTypeDef; + datasource?: Datasource & ISaveableDatasource; onMoveLabel?: (dragIndex: number, hoverIndex: number) => void; onDropLabel?: () => void; index?: number; @@ -103,10 +93,10 @@ class AdhocMetricOption extends PureComponent { { onRemove={() => this.onRemoveMetric()} onMoveLabel={onMoveLabel} onDropLabel={onDropLabel} - index={index} + index={index ?? 0} type={type ?? DndItemType.AdhocMetricOption} withCaret={withCaret} isFunction