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

fix static combo chart crashes when viz settings are invalid (#42669)

* fix static combo chart crashes when viz settings are invalid

* spec
parent f4010540
No related branches found
No related tags found
No related merge requests found
......@@ -633,6 +633,13 @@ LineReplaceMissingValuesZero.args = {
renderingContext,
};
export const LineChartBrokenDimensionsMetricsSettings = Template.bind({});
LineChartBrokenDimensionsMetricsSettings.args = {
rawSeries: data.lineChartBrokenDimensionsMetricsSettings as any,
dashcardSettings: {},
renderingContext,
};
export const Default = Template.bind({});
Default.args = {
rawSeries: data.messedUpAxis as any,
......
......@@ -6,14 +6,19 @@ import {
} from "metabase/visualizations/echarts/cartesian/model/series";
import type { LegacySeriesSettingsObjectKey } from "metabase/visualizations/echarts/cartesian/model/types";
import {
getAreDimensionsAndMetricsValid,
getDefaultBubbleSizeCol,
getDefaultDataLabelsFrequency,
getDefaultDimensionFilter,
getDefaultDimensions,
getDefaultGoalLabel,
getDefaultIsAutoSplitEnabled,
getDefaultIsHistogram,
getDefaultIsNumeric,
getDefaultIsTimeSeries,
getDefaultLegendIsReversed,
getDefaultMetricFilter,
getDefaultMetrics,
getDefaultShowDataLabels,
getDefaultStackDisplayValue,
getDefaultStackingValue,
......@@ -125,6 +130,35 @@ export const computeStaticComboChartSettings = (
const { card: mainCard, data: mainDataset } = rawSeries[0];
const settings = getCommonStaticVizSettings(rawSeries, dashcardSettings);
fillWithDefaultValue(
settings,
"graph._dimension_filter",
getDefaultDimensionFilter(mainCard.display),
);
fillWithDefaultValue(
settings,
"graph._metric_filter",
getDefaultMetricFilter(mainCard.display),
);
const areDimensionsAndMetricsValid = getAreDimensionsAndMetricsValid(
rawSeries,
settings,
);
fillWithDefaultValue(
settings,
"graph.dimensions",
getDefaultDimensions(rawSeries, settings),
areDimensionsAndMetricsValid,
);
fillWithDefaultValue(
settings,
"graph.metrics",
getDefaultMetrics(rawSeries),
areDimensionsAndMetricsValid,
);
const cardsColumns = getCardsColumns(rawSeries, settings);
const dimensionModel = getDimensionModel(rawSeries, cardsColumns);
const seriesModels = getCardsSeriesModels(
......
......@@ -45,6 +45,7 @@ import histogramTicks45Degrees from "./histogram-ticks-45-degrees.json";
import histogramTicks90Degrees from "./histogram-ticks-90-degrees.json";
import imageCutOff37275 from "./image-cut-off-37275.json";
import incorrectLabelYAxisSplit41285 from "./incorrect-label-y-axis-split-41285.json";
import lineChartBrokenDimensionsMetricsSettings from "./line-chart-broken-dimensions-metrics-settings.json";
import lineCustomYAxisRangeEqualsExtents from "./line-custom-y-axis-range-equals-extents.json";
import lineFullyNullDimension37902 from "./line-fully-null-dimension-37902.json";
import lineLinearXScaleUnsorted from "./line-linear-x-scale-unsorted.json";
......@@ -174,4 +175,5 @@ export const data = {
lineUnpinFromZero,
lineSettings,
lineReplaceMissingValuesZero,
lineChartBrokenDimensionsMetricsSettings,
};
......@@ -14,11 +14,7 @@ import {
} from "metabase/visualizations/lib/settings/series";
import { getOptionFromColumn } from "metabase/visualizations/lib/settings/utils";
import { dimensionIsTimeseries } from "metabase/visualizations/lib/timeseries";
import {
columnsAreValid,
preserveExistingColumnsOrder,
MAX_SERIES,
} from "metabase/visualizations/lib/utils";
import { columnsAreValid, MAX_SERIES } from "metabase/visualizations/lib/utils";
import {
getDefaultIsHistogram,
getDefaultStackingValue,
......@@ -39,15 +35,14 @@ import {
getDefaultDataLabelsFrequency,
getDefaultIsAutoSplitEnabled,
getDefaultColumns,
getDefaultDimensionFilter,
getDefaultMetricFilter,
getAreDimensionsAndMetricsValid,
getDefaultDimensions,
STACKABLE_DISPLAY_TYPES,
getDefaultMetrics,
} from "metabase/visualizations/shared/settings/cartesian-chart";
import {
isDate,
isDimension,
isMetric,
isNumeric,
isAny,
} from "metabase-lib/v1/types/utils/isa";
import { isDate, isNumeric } from "metabase-lib/v1/types/utils/isa";
export const getSeriesDisplays = (transformedSeries, settings) => {
return transformedSeries.map(single => settings.series(single).display);
......@@ -67,13 +62,11 @@ export const GRAPH_DATA_SETTINGS = {
hidden: true,
}),
"graph._dimension_filter": {
getDefault: ([{ card }]) =>
card.display === "scatter" ? isAny : isDimension,
getDefault: ([{ card }]) => getDefaultDimensionFilter(card.display),
useRawSeries: true,
},
"graph._metric_filter": {
getDefault: ([{ card }]) =>
card.display === "scatter" ? isNumeric : isMetric,
getDefault: ([{ card }]) => getDefaultMetricFilter(card.display),
useRawSeries: true,
},
"graph.dimensions": {
......@@ -86,24 +79,9 @@ export const GRAPH_DATA_SETTINGS = {
? "0.5rem"
: "1rem",
isValid: (series, vizSettings) =>
series.some(
({ card, data }) =>
columnsAreValid(
card.visualization_settings["graph.dimensions"],
data,
vizSettings["graph._dimension_filter"],
) &&
columnsAreValid(
card.visualization_settings["graph.metrics"],
data,
vizSettings["graph._metric_filter"],
),
),
getAreDimensionsAndMetricsValid(series, vizSettings),
getDefault: (series, vizSettings) =>
preserveExistingColumnsOrder(
vizSettings["graph.dimensions"] ?? [],
getDefaultColumns(series).dimensions,
),
getDefaultDimensions(series, vizSettings),
persistDefault: true,
getProps: ([{ card, data }], vizSettings) => {
const addedDimensions = vizSettings["graph.dimensions"];
......@@ -163,20 +141,8 @@ export const GRAPH_DATA_SETTINGS = {
title: t`Y-axis`,
widget: "fields",
isValid: (series, vizSettings) =>
series.some(
({ card, data }) =>
columnsAreValid(
card.visualization_settings["graph.dimensions"],
data,
vizSettings["graph._dimension_filter"],
) &&
columnsAreValid(
card.visualization_settings["graph.metrics"],
data,
vizSettings["graph._metric_filter"],
),
),
getDefault: series => getDefaultColumns(series).metrics,
getAreDimensionsAndMetricsValid(series, vizSettings),
getDefault: series => getDefaultMetrics(series),
persistDefault: true,
getProps: ([{ card, data }], vizSettings, _onChange, extra) => {
const options = data.cols
......
......@@ -5,11 +5,18 @@ import { getMaxDimensionsSupported } from "metabase/visualizations";
import { dimensionIsNumeric } from "metabase/visualizations/lib/numeric";
import { dimensionIsTimeseries } from "metabase/visualizations/lib/timeseries";
import {
columnsAreValid,
getDefaultDimensionsAndMetrics,
getFriendlyName,
preserveExistingColumnsOrder,
} from "metabase/visualizations/lib/utils";
import type { ComputedVisualizationSettings } from "metabase/visualizations/types";
import { isDimension, isMetric } from "metabase-lib/v1/types/utils/isa";
import {
isAny,
isDimension,
isMetric,
isNumeric,
} from "metabase-lib/v1/types/utils/isa";
import type {
Card,
CardDisplayType,
......@@ -19,6 +26,47 @@ import type {
SeriesOrderSetting,
} from "metabase-types/api";
export function getDefaultDimensionFilter(display: string) {
return display === "scatter" ? isAny : isDimension;
}
export function getDefaultMetricFilter(display: string) {
return display === "scatter" ? isNumeric : isMetric;
}
export function getAreDimensionsAndMetricsValid(
rawSeries: RawSeries,
settings: ComputedVisualizationSettings,
) {
return rawSeries.some(
({ card, data }) =>
columnsAreValid(
card.visualization_settings["graph.dimensions"],
data,
settings["graph._dimension_filter"],
) &&
columnsAreValid(
card.visualization_settings["graph.metrics"],
data,
settings["graph._metric_filter"],
),
);
}
export function getDefaultDimensions(
rawSeries: RawSeries,
settings: ComputedVisualizationSettings,
) {
return preserveExistingColumnsOrder(
settings["graph.dimensions"] ?? [],
getDefaultColumns(rawSeries).dimensions,
);
}
export function getDefaultMetrics(rawSeries: RawSeries) {
return getDefaultColumns(rawSeries).metrics;
}
export const STACKABLE_DISPLAY_TYPES = new Set(["area", "bar"]);
export const isStackingValueValid = (
......
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