This is an automated email from the ASF dual-hosted git repository. beto pushed a commit to branch dbt-metricflow in repository https://gitbox.apache.org/repos/asf/superset.git
commit 1d82e85a557d4cc19fa2906bc021b64285315acf Author: Beto Dealmeida <[email protected]> AuthorDate: Thu Jul 17 18:31:03 2025 -0400 More charts --- .../src/shared-controls/dndControls.tsx | 70 +++++++++++++++++----- .../controls/SemanticLayerVerification.tsx | 56 +++++++++++++++++ 2 files changed, 112 insertions(+), 14 deletions(-) diff --git a/superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx b/superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx index 10001a954c..4604d49d4c 100644 --- a/superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx +++ b/superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/dndControls.tsx @@ -270,8 +270,8 @@ export const dndColumnsControl = enhanceControlWithSemanticLayer( 'columns', ); -export const dndSeriesControl: typeof dndGroupByControl = { - ...dndGroupByControl, +const baseDndSeriesControl: typeof baseDndGroupByControl = { + ...baseDndGroupByControl, label: t('Dimension'), multi: false, default: null, @@ -281,8 +281,14 @@ export const dndSeriesControl: typeof dndGroupByControl = { ), }; -export const dndEntityControl: typeof dndGroupByControl = { - ...dndGroupByControl, +export const dndSeriesControl = enhanceControlWithSemanticLayer( + baseDndSeriesControl, + 'series', + 'columns', +); + +const baseDndEntityControl: typeof baseDndGroupByControl = { + ...baseDndGroupByControl, label: t('Entity'), default: null, multi: false, @@ -290,6 +296,12 @@ export const dndEntityControl: typeof dndGroupByControl = { description: t('This defines the element to be plotted on the chart'), }; +export const dndEntityControl = enhanceControlWithSemanticLayer( + baseDndEntityControl, + 'entity', + 'columns', +); + export const dndAdhocFilterControl: SharedControlConfig< 'DndFilterSelect' | 'AdhocFilterControl' > = { @@ -399,15 +411,21 @@ export const dndSortByControl: SharedControlConfig< }), }; -export const dndSizeControl: typeof dndAdhocMetricControl = { - ...dndAdhocMetricControl, +const baseDndSizeControl: typeof baseDndAdhocMetricControl = { + ...baseDndAdhocMetricControl, label: t('Bubble Size'), description: t('Metric used to calculate bubble size'), default: null, }; -export const dndXControl: typeof dndAdhocMetricControl = { - ...dndAdhocMetricControl, +export const dndSizeControl = enhanceControlWithSemanticLayer( + baseDndSizeControl, + 'size', + 'metrics', +); + +const baseDndXControl: typeof baseDndAdhocMetricControl = { + ...baseDndAdhocMetricControl, label: t('X Axis'), description: t( "The dataset column/metric that returns the values on your chart's x-axis.", @@ -415,8 +433,14 @@ export const dndXControl: typeof dndAdhocMetricControl = { default: null, }; -export const dndYControl: typeof dndAdhocMetricControl = { - ...dndAdhocMetricControl, +export const dndXControl = enhanceControlWithSemanticLayer( + baseDndXControl, + 'x', + 'metrics', +); + +const baseDndYControl: typeof baseDndAdhocMetricControl = { + ...baseDndAdhocMetricControl, label: t('Y Axis'), description: t( "The dataset column/metric that returns the values on your chart's y-axis.", @@ -424,14 +448,26 @@ export const dndYControl: typeof dndAdhocMetricControl = { default: null, }; -export const dndSecondaryMetricControl: typeof dndAdhocMetricControl = { - ...dndAdhocMetricControl, +export const dndYControl = enhanceControlWithSemanticLayer( + baseDndYControl, + 'y', + 'metrics', +); + +const baseDndSecondaryMetricControl: typeof baseDndAdhocMetricControl = { + ...baseDndAdhocMetricControl, label: t('Color Metric'), default: null, validators: [], description: t('A metric to use for color'), }; +export const dndSecondaryMetricControl = enhanceControlWithSemanticLayer( + baseDndSecondaryMetricControl, + 'secondary_metric', + 'metrics', +); + export const dndGranularitySqlaControl: typeof dndSeriesControl = { ...dndSeriesControl, ...temporalColumnMixin, @@ -452,7 +488,13 @@ export const dndGranularitySqlaControl: typeof dndSeriesControl = { valueKey: 'column_name', }; -export const dndXAxisControl: typeof dndGroupByControl = { - ...dndGroupByControl, +const baseDndXAxisControl: typeof baseDndGroupByControl = { + ...baseDndGroupByControl, ...xAxisMixin, }; + +export const dndXAxisControl = enhanceControlWithSemanticLayer( + baseDndXAxisControl, + 'x_axis', + 'columns', +); diff --git a/superset-frontend/src/explore/components/controls/SemanticLayerVerification.tsx b/superset-frontend/src/explore/components/controls/SemanticLayerVerification.tsx index 303d22af3f..3ef71373dd 100644 --- a/superset-frontend/src/explore/components/controls/SemanticLayerVerification.tsx +++ b/superset-frontend/src/explore/components/controls/SemanticLayerVerification.tsx @@ -47,6 +47,34 @@ export function collectQueryFields(formData: any): { : [formData.columns]), ); } + if (formData.series_columns) { + dimensions.push( + ...(Array.isArray(formData.series_columns) + ? formData.series_columns + : [formData.series_columns]), + ); + } + if (formData.series) { + dimensions.push( + ...(Array.isArray(formData.series) + ? formData.series + : [formData.series]), + ); + } + if (formData.entity) { + dimensions.push( + ...(Array.isArray(formData.entity) + ? formData.entity + : [formData.entity]), + ); + } + if (formData.x_axis) { + dimensions.push( + ...(Array.isArray(formData.x_axis) + ? formData.x_axis + : [formData.x_axis]), + ); + } // Extract metrics from various field types if (formData.metrics) { @@ -59,6 +87,9 @@ export function collectQueryFields(formData: any): { if (formData.metric) { metrics.push(formData.metric); } + if (formData.metric_2) { + metrics.push(formData.metric_2); + } if (formData.percent_metrics) { metrics.push( ...(Array.isArray(formData.percent_metrics) @@ -66,6 +97,21 @@ export function collectQueryFields(formData: any): { : [formData.percent_metrics]), ); } + if (formData.timeseries_limit_metric) { + metrics.push(formData.timeseries_limit_metric); + } + if (formData.x) { + metrics.push(formData.x); + } + if (formData.y) { + metrics.push(formData.y); + } + if (formData.size) { + metrics.push(formData.size); + } + if (formData.secondary_metric) { + metrics.push(formData.secondary_metric); + } // Filter out null/undefined values and convert objects to strings if needed const cleanDimensions = dimensions @@ -456,12 +502,22 @@ export function createSemanticLayerOnChange( * Get list of control fields that should trigger re-rendering */ export const SEMANTIC_LAYER_CONTROL_FIELDS = [ + // Metric controls 'metrics', 'metric', 'metric_2', 'percent_metrics', 'timeseries_limit_metric', + 'x', + 'y', + 'size', + 'secondary_metric', + + // Dimension controls 'groupby', 'columns', 'series_columns', + 'series', + 'entity', + 'x_axis', ];
