diff --git a/frontend/src/metabase-types/api/dataset.ts b/frontend/src/metabase-types/api/dataset.ts index c9f9d00aeaf7024b65806cc7cd2fc8fe0773a369..25d903bb7ec19565595035924bda871791a3c740 100644 --- a/frontend/src/metabase-types/api/dataset.ts +++ b/frontend/src/metabase-types/api/dataset.ts @@ -13,12 +13,15 @@ export interface DatasetColumn { display_name: string; source: string; name: string; + // FIXME: this prop does not come from API remapped_to_column?: DatasetColumn; unit?: DatetimeUnit; field_ref?: DimensionReference; expression_name?: any; base_type?: string; semantic_type?: string; + remapped_from?: string; + remapped_to?: string; binning_info?: { bin_width?: number; }; diff --git a/frontend/src/metabase/static-viz/components/RowChart/RowChart.tsx b/frontend/src/metabase/static-viz/components/RowChart/RowChart.tsx index 8cb7c73b03f79075ea5319aec9a328d2599d329f..bcbbdd3cf882e8639ffd44f96d10c691db04962a 100644 --- a/frontend/src/metabase/static-viz/components/RowChart/RowChart.tsx +++ b/frontend/src/metabase/static-viz/components/RowChart/RowChart.tsx @@ -14,7 +14,10 @@ import { import { getChartGoal } from "metabase/visualizations/lib/settings/goal"; import { VisualizationSettings } from "metabase-types/api"; import { ColorGetter } from "metabase/static-viz/lib/colors"; -import { TwoDimensionalChartData } from "metabase/visualizations/shared/types/data"; +import { + RemappingHydratedChartData, + TwoDimensionalChartData, +} from "metabase/visualizations/shared/types/data"; import { getTwoDimensionalChartSeries } from "metabase/visualizations/shared/utils/series"; import { getAxesVisibility, @@ -26,6 +29,7 @@ import { getLabelsStaticFormatter, getStaticFormatters, } from "metabase/static-viz/lib/format"; +import { extractRemappedColumns } from "metabase/visualizations"; import { calculateLegendRows } from "../Legend/utils"; import { Legend } from "../Legend"; @@ -56,15 +60,18 @@ const staticTextMeasurer: TextMeasurer = (text: string, style: FontStyle) => ); const StaticRowChart = ({ data, settings, getColor }: StaticRowChartProps) => { + const remappedColumnsData = extractRemappedColumns( + data, + ) as RemappingHydratedChartData; const columnValueFormatter = getColumnValueStaticFormatter(); const { chartColumns, series, seriesColors } = getTwoDimensionalChartSeries( - data, + remappedColumnsData, settings, columnValueFormatter, ); const groupedData = getGroupedDataset( - data.rows, + remappedColumnsData.rows, chartColumns, columnValueFormatter, ); diff --git a/frontend/src/metabase/static-viz/lib/format.ts b/frontend/src/metabase/static-viz/lib/format.ts index 66d4afeee09eeb064aaddce597c3f19d30dab51d..7254ca2bd05e412a904f9a43eab5d14aedb9311f 100644 --- a/frontend/src/metabase/static-viz/lib/format.ts +++ b/frontend/src/metabase/static-viz/lib/format.ts @@ -20,6 +20,7 @@ import { import { ChartColumns } from "metabase/visualizations/lib/graph/columns"; import { getStackOffset } from "metabase/visualizations/lib/settings/stacking"; import { getLabelsMetricColumn } from "metabase/visualizations/shared/utils/series"; +import { RemappingHydratedDatasetColumn } from "metabase/visualizations/shared/types/data"; import { isCoordinate, isDate, @@ -30,6 +31,17 @@ import { import { rangeForValue } from "metabase-lib/queries/utils/range-for-value"; import { getColumnKey } from "metabase-lib/queries/utils/get-column-key"; +const getRemappedValue = ( + value: unknown, + column: RemappingHydratedDatasetColumn, +) => { + if (column.remapping instanceof Map && column.remapping.has(value)) { + return column.remapping.get(value); + } + + return value; +}; + type StaticFormattingOptions = { column: DatasetColumn; number_separators?: string; @@ -109,9 +121,10 @@ export const getStaticFormatters = ( const yTickFormatter = (value: StringLike) => { const column = chartColumns.dimension.column; const columnSettings = settings.column_settings?.[getColumnKey(column)]; + const valueToFormat = getRemappedValue(value, column); return String( - formatStaticValue(value, { + formatStaticValue(valueToFormat, { column, ...columnSettings, jsx: false, @@ -140,9 +153,10 @@ export const getStaticFormatters = ( const xTickFormatter = (value: NumberLike) => { const column = metricColumn.column; const columnSettings = settings.column_settings?.[getColumnKey(column)]; + const valueToFormat = getRemappedValue(value, column); return String( - formatStaticValue(value, { + formatStaticValue(valueToFormat, { column, ...columnSettings, jsx: false, @@ -181,6 +195,8 @@ export const getLabelsStaticFormatter = ( }; export const getColumnValueStaticFormatter = () => { - return (value: RowValue, column: DatasetColumn) => - String(formatStaticValue(value, { column })); + return (value: RowValue, column: DatasetColumn) => { + const valueToFormat = getRemappedValue(value, column); + return String(formatStaticValue(valueToFormat, { column })); + }; }; diff --git a/frontend/src/metabase/visualizations/index.js b/frontend/src/metabase/visualizations/index.js index c9455bb2cee442989b1419afd5acf83dadf15654..1cd76fd6422628acb9f9f260c3d3b10deb4b0705 100644 --- a/frontend/src/metabase/visualizations/index.js +++ b/frontend/src/metabase/visualizations/index.js @@ -106,7 +106,7 @@ export function getMaxDimensionsSupported(display) { } // removes columns with `remapped_from` property and adds a `remapping` to the appropriate column -const extractRemappedColumns = data => { +export const extractRemappedColumns = data => { const cols = data.cols.map(col => ({ ...col, remapped_from_index: diff --git a/frontend/src/metabase/visualizations/lib/graph/columns.ts b/frontend/src/metabase/visualizations/lib/graph/columns.ts index ac7f51b91f1ace697d69538afa49c0ba9e87389c..0efc5dd49aa7d023ead9391c51378caf4ce64eb7 100644 --- a/frontend/src/metabase/visualizations/lib/graph/columns.ts +++ b/frontend/src/metabase/visualizations/lib/graph/columns.ts @@ -1,19 +1,18 @@ -import { - DatasetColumn, - DatasetData, - VisualizationSettings, -} from "metabase-types/api"; +import { DatasetData, VisualizationSettings } from "metabase-types/api"; import { isNotNull } from "metabase/core/utils/types"; -import { TwoDimensionalChartData } from "metabase/visualizations/shared/types/data"; +import { + RemappingHydratedChartData, + RemappingHydratedDatasetColumn, +} from "metabase/visualizations/shared/types/data"; export type ColumnDescriptor = { index: number; - column: DatasetColumn; + column: RemappingHydratedDatasetColumn; }; export const getColumnDescriptors = ( columnNames: string[], - columns: DatasetColumn[], + columns: RemappingHydratedDatasetColumn[], ): ColumnDescriptor[] => { return columnNames.map(columnName => { const index = columns.findIndex(column => column.name === columnName); @@ -58,7 +57,7 @@ export type MultipleMetricsChartColumns = { export type ChartColumns = BreakoutChartColumns | MultipleMetricsChartColumns; export const getChartColumns = ( - data: TwoDimensionalChartData, + data: RemappingHydratedChartData, visualizationSettings: VisualizationSettings, ): ChartColumns => { const [dimension, breakout] = getColumnDescriptors( diff --git a/frontend/src/metabase/visualizations/shared/types/data.ts b/frontend/src/metabase/visualizations/shared/types/data.ts index 7c371e4b0ae32d213fdb9bea6fe8a37336ea950b..f81a7aba6e72ec788ec6d5198ece49c13b7befb5 100644 --- a/frontend/src/metabase/visualizations/shared/types/data.ts +++ b/frontend/src/metabase/visualizations/shared/types/data.ts @@ -7,6 +7,17 @@ import { export type TwoDimensionalChartData = Pick<DatasetData, "rows" | "cols">; +export type RemappingHydratedDatasetColumn = DatasetColumn & { + remapped_from_index?: number; + remapped_to_column?: DatasetColumn; + remapping?: Map<any, any>; +}; + +export type RemappingHydratedChartData = { + rows: DatasetData["rows"]; + cols: RemappingHydratedDatasetColumn[]; +}; + export type SeriesInfo = { metricColumn: DatasetColumn; dimensionColumn: DatasetColumn; diff --git a/frontend/src/metabase/visualizations/visualizations/RowChart/RowChart.tsx b/frontend/src/metabase/visualizations/visualizations/RowChart/RowChart.tsx index f17c71679b45de18c461c6801f2fc44265c5f83e..3121b16de22cf50db90777fdec5771fff0194a4a 100644 --- a/frontend/src/metabase/visualizations/visualizations/RowChart/RowChart.tsx +++ b/frontend/src/metabase/visualizations/visualizations/RowChart/RowChart.tsx @@ -33,6 +33,7 @@ import { getTwoDimensionalChartSeries } from "metabase/visualizations/shared/uti import { getStackOffset } from "metabase/visualizations/lib/settings/stacking"; import { GroupedDatum, + RemappingHydratedChartData, SeriesInfo, } from "metabase/visualizations/shared/types/data"; import { IconProps } from "metabase/components/Icon"; @@ -43,6 +44,7 @@ import { } from "metabase/visualizations/lib/settings/validation"; import { BarData } from "metabase/visualizations/shared/components/RowChart/types"; import { FontStyle } from "metabase/visualizations/shared/types/measure-text"; +import { extractRemappedColumns } from "metabase/visualizations"; import { isDimension, isMetric } from "metabase-lib/types/utils/isa"; import { getChartWarnings } from "./utils/warnings"; import { @@ -124,7 +126,12 @@ const RowChartVisualization = ({ const [chartSeries] = useMemo(() => { return isPlaceholder ? multipleSeries : rawMultipleSeries; }, [isPlaceholder, multipleSeries, rawMultipleSeries]); - const data = chartSeries.data; + + const data = useMemo( + () => + extractRemappedColumns(chartSeries.data) as RemappingHydratedChartData, + [chartSeries.data], + ); const { chartColumns, series, seriesColors } = useMemo( () => getTwoDimensionalChartSeries(data, settings, formatColumnValue),