Skip to content
Snippets Groups Projects
Unverified Commit 11ac4434 authored by Aleksandr Lesnenko's avatar Aleksandr Lesnenko Committed by GitHub
Browse files

Fixes remapped columns support for the row chart type (#26845)

* fix row chart for remapped columns

* static viz remapped values
parent fde11b5e
No related branches found
No related tags found
No related merge requests found
...@@ -13,12 +13,15 @@ export interface DatasetColumn { ...@@ -13,12 +13,15 @@ export interface DatasetColumn {
display_name: string; display_name: string;
source: string; source: string;
name: string; name: string;
// FIXME: this prop does not come from API
remapped_to_column?: DatasetColumn; remapped_to_column?: DatasetColumn;
unit?: DatetimeUnit; unit?: DatetimeUnit;
field_ref?: DimensionReference; field_ref?: DimensionReference;
expression_name?: any; expression_name?: any;
base_type?: string; base_type?: string;
semantic_type?: string; semantic_type?: string;
remapped_from?: string;
remapped_to?: string;
binning_info?: { binning_info?: {
bin_width?: number; bin_width?: number;
}; };
......
...@@ -14,7 +14,10 @@ import { ...@@ -14,7 +14,10 @@ import {
import { getChartGoal } from "metabase/visualizations/lib/settings/goal"; import { getChartGoal } from "metabase/visualizations/lib/settings/goal";
import { VisualizationSettings } from "metabase-types/api"; import { VisualizationSettings } from "metabase-types/api";
import { ColorGetter } from "metabase/static-viz/lib/colors"; 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 { getTwoDimensionalChartSeries } from "metabase/visualizations/shared/utils/series";
import { import {
getAxesVisibility, getAxesVisibility,
...@@ -26,6 +29,7 @@ import { ...@@ -26,6 +29,7 @@ import {
getLabelsStaticFormatter, getLabelsStaticFormatter,
getStaticFormatters, getStaticFormatters,
} from "metabase/static-viz/lib/format"; } from "metabase/static-viz/lib/format";
import { extractRemappedColumns } from "metabase/visualizations";
import { calculateLegendRows } from "../Legend/utils"; import { calculateLegendRows } from "../Legend/utils";
import { Legend } from "../Legend"; import { Legend } from "../Legend";
...@@ -56,15 +60,18 @@ const staticTextMeasurer: TextMeasurer = (text: string, style: FontStyle) => ...@@ -56,15 +60,18 @@ const staticTextMeasurer: TextMeasurer = (text: string, style: FontStyle) =>
); );
const StaticRowChart = ({ data, settings, getColor }: StaticRowChartProps) => { const StaticRowChart = ({ data, settings, getColor }: StaticRowChartProps) => {
const remappedColumnsData = extractRemappedColumns(
data,
) as RemappingHydratedChartData;
const columnValueFormatter = getColumnValueStaticFormatter(); const columnValueFormatter = getColumnValueStaticFormatter();
const { chartColumns, series, seriesColors } = getTwoDimensionalChartSeries( const { chartColumns, series, seriesColors } = getTwoDimensionalChartSeries(
data, remappedColumnsData,
settings, settings,
columnValueFormatter, columnValueFormatter,
); );
const groupedData = getGroupedDataset( const groupedData = getGroupedDataset(
data.rows, remappedColumnsData.rows,
chartColumns, chartColumns,
columnValueFormatter, columnValueFormatter,
); );
......
...@@ -20,6 +20,7 @@ import { ...@@ -20,6 +20,7 @@ import {
import { ChartColumns } from "metabase/visualizations/lib/graph/columns"; import { ChartColumns } from "metabase/visualizations/lib/graph/columns";
import { getStackOffset } from "metabase/visualizations/lib/settings/stacking"; import { getStackOffset } from "metabase/visualizations/lib/settings/stacking";
import { getLabelsMetricColumn } from "metabase/visualizations/shared/utils/series"; import { getLabelsMetricColumn } from "metabase/visualizations/shared/utils/series";
import { RemappingHydratedDatasetColumn } from "metabase/visualizations/shared/types/data";
import { import {
isCoordinate, isCoordinate,
isDate, isDate,
...@@ -30,6 +31,17 @@ import { ...@@ -30,6 +31,17 @@ import {
import { rangeForValue } from "metabase-lib/queries/utils/range-for-value"; import { rangeForValue } from "metabase-lib/queries/utils/range-for-value";
import { getColumnKey } from "metabase-lib/queries/utils/get-column-key"; 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 = { type StaticFormattingOptions = {
column: DatasetColumn; column: DatasetColumn;
number_separators?: string; number_separators?: string;
...@@ -109,9 +121,10 @@ export const getStaticFormatters = ( ...@@ -109,9 +121,10 @@ export const getStaticFormatters = (
const yTickFormatter = (value: StringLike) => { const yTickFormatter = (value: StringLike) => {
const column = chartColumns.dimension.column; const column = chartColumns.dimension.column;
const columnSettings = settings.column_settings?.[getColumnKey(column)]; const columnSettings = settings.column_settings?.[getColumnKey(column)];
const valueToFormat = getRemappedValue(value, column);
return String( return String(
formatStaticValue(value, { formatStaticValue(valueToFormat, {
column, column,
...columnSettings, ...columnSettings,
jsx: false, jsx: false,
...@@ -140,9 +153,10 @@ export const getStaticFormatters = ( ...@@ -140,9 +153,10 @@ export const getStaticFormatters = (
const xTickFormatter = (value: NumberLike) => { const xTickFormatter = (value: NumberLike) => {
const column = metricColumn.column; const column = metricColumn.column;
const columnSettings = settings.column_settings?.[getColumnKey(column)]; const columnSettings = settings.column_settings?.[getColumnKey(column)];
const valueToFormat = getRemappedValue(value, column);
return String( return String(
formatStaticValue(value, { formatStaticValue(valueToFormat, {
column, column,
...columnSettings, ...columnSettings,
jsx: false, jsx: false,
...@@ -181,6 +195,8 @@ export const getLabelsStaticFormatter = ( ...@@ -181,6 +195,8 @@ export const getLabelsStaticFormatter = (
}; };
export const getColumnValueStaticFormatter = () => { export const getColumnValueStaticFormatter = () => {
return (value: RowValue, column: DatasetColumn) => return (value: RowValue, column: DatasetColumn) => {
String(formatStaticValue(value, { column })); const valueToFormat = getRemappedValue(value, column);
return String(formatStaticValue(valueToFormat, { column }));
};
}; };
...@@ -106,7 +106,7 @@ export function getMaxDimensionsSupported(display) { ...@@ -106,7 +106,7 @@ export function getMaxDimensionsSupported(display) {
} }
// removes columns with `remapped_from` property and adds a `remapping` to the appropriate column // 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 => ({ const cols = data.cols.map(col => ({
...col, ...col,
remapped_from_index: remapped_from_index:
......
import { import { DatasetData, VisualizationSettings } from "metabase-types/api";
DatasetColumn,
DatasetData,
VisualizationSettings,
} from "metabase-types/api";
import { isNotNull } from "metabase/core/utils/types"; 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 = { export type ColumnDescriptor = {
index: number; index: number;
column: DatasetColumn; column: RemappingHydratedDatasetColumn;
}; };
export const getColumnDescriptors = ( export const getColumnDescriptors = (
columnNames: string[], columnNames: string[],
columns: DatasetColumn[], columns: RemappingHydratedDatasetColumn[],
): ColumnDescriptor[] => { ): ColumnDescriptor[] => {
return columnNames.map(columnName => { return columnNames.map(columnName => {
const index = columns.findIndex(column => column.name === columnName); const index = columns.findIndex(column => column.name === columnName);
...@@ -58,7 +57,7 @@ export type MultipleMetricsChartColumns = { ...@@ -58,7 +57,7 @@ export type MultipleMetricsChartColumns = {
export type ChartColumns = BreakoutChartColumns | MultipleMetricsChartColumns; export type ChartColumns = BreakoutChartColumns | MultipleMetricsChartColumns;
export const getChartColumns = ( export const getChartColumns = (
data: TwoDimensionalChartData, data: RemappingHydratedChartData,
visualizationSettings: VisualizationSettings, visualizationSettings: VisualizationSettings,
): ChartColumns => { ): ChartColumns => {
const [dimension, breakout] = getColumnDescriptors( const [dimension, breakout] = getColumnDescriptors(
......
...@@ -7,6 +7,17 @@ import { ...@@ -7,6 +7,17 @@ import {
export type TwoDimensionalChartData = Pick<DatasetData, "rows" | "cols">; 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 = { export type SeriesInfo = {
metricColumn: DatasetColumn; metricColumn: DatasetColumn;
dimensionColumn: DatasetColumn; dimensionColumn: DatasetColumn;
......
...@@ -33,6 +33,7 @@ import { getTwoDimensionalChartSeries } from "metabase/visualizations/shared/uti ...@@ -33,6 +33,7 @@ import { getTwoDimensionalChartSeries } from "metabase/visualizations/shared/uti
import { getStackOffset } from "metabase/visualizations/lib/settings/stacking"; import { getStackOffset } from "metabase/visualizations/lib/settings/stacking";
import { import {
GroupedDatum, GroupedDatum,
RemappingHydratedChartData,
SeriesInfo, SeriesInfo,
} from "metabase/visualizations/shared/types/data"; } from "metabase/visualizations/shared/types/data";
import { IconProps } from "metabase/components/Icon"; import { IconProps } from "metabase/components/Icon";
...@@ -43,6 +44,7 @@ import { ...@@ -43,6 +44,7 @@ import {
} from "metabase/visualizations/lib/settings/validation"; } from "metabase/visualizations/lib/settings/validation";
import { BarData } from "metabase/visualizations/shared/components/RowChart/types"; import { BarData } from "metabase/visualizations/shared/components/RowChart/types";
import { FontStyle } from "metabase/visualizations/shared/types/measure-text"; import { FontStyle } from "metabase/visualizations/shared/types/measure-text";
import { extractRemappedColumns } from "metabase/visualizations";
import { isDimension, isMetric } from "metabase-lib/types/utils/isa"; import { isDimension, isMetric } from "metabase-lib/types/utils/isa";
import { getChartWarnings } from "./utils/warnings"; import { getChartWarnings } from "./utils/warnings";
import { import {
...@@ -124,7 +126,12 @@ const RowChartVisualization = ({ ...@@ -124,7 +126,12 @@ const RowChartVisualization = ({
const [chartSeries] = useMemo(() => { const [chartSeries] = useMemo(() => {
return isPlaceholder ? multipleSeries : rawMultipleSeries; return isPlaceholder ? multipleSeries : rawMultipleSeries;
}, [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( const { chartColumns, series, seriesColors } = useMemo(
() => getTwoDimensionalChartSeries(data, settings, formatColumnValue), () => getTwoDimensionalChartSeries(data, settings, formatColumnValue),
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment