diff --git a/frontend/src/metabase/visualizations/lib/apply_axis.js b/frontend/src/metabase/visualizations/lib/apply_axis.js index adb76d687b9c8941a1eb7eb0e86c80b56e90968f..f4344a0562cb78a3bf6d1f0e5a3d2db806861229 100644 --- a/frontend/src/metabase/visualizations/lib/apply_axis.js +++ b/frontend/src/metabase/visualizations/lib/apply_axis.js @@ -352,7 +352,10 @@ export function applyChartOrdinalXAxis( // The tolerance is arbitrarily set to one millionth of the yExtent. const TOLERANCE_TO_Y_EXTENT = 1e6; export function maybeRoundValueToZero(value, [yMin, yMax]) { - const tolerance = Math.abs(yMax - yMin) / TOLERANCE_TO_Y_EXTENT; + const tolerance = + yMin !== yMax + ? Math.abs(yMax - yMin) / TOLERANCE_TO_Y_EXTENT + : 1 / TOLERANCE_TO_Y_EXTENT; return Math.abs(value) < tolerance ? 0 : value; } @@ -490,7 +493,8 @@ export function getYValueFormatter(chart, series, yExtent) { const metricColumn = series[seriesIndex].data.cols[1]; const columnSettings = chart.settings.column(metricColumn); const columnExtent = options.extent ?? yExtent; - const roundedValue = maybeRoundValueToZero(value, columnExtent); + const roundedValue = + value === null ? "" : maybeRoundValueToZero(value, columnExtent); return formatValue(roundedValue, { ...columnSettings, ...options }); }; } diff --git a/frontend/src/metabase/visualizations/lib/apply_axis.unit.spec.js b/frontend/src/metabase/visualizations/lib/apply_axis.unit.spec.js index 331940989e62a02b52e4f639aa4128eb6013d3d1..d07be26bba9acda360403c1a125d7f26f6606534 100644 --- a/frontend/src/metabase/visualizations/lib/apply_axis.unit.spec.js +++ b/frontend/src/metabase/visualizations/lib/apply_axis.unit.spec.js @@ -61,5 +61,11 @@ describe("visualization.lib.apply_axis", () => { expect(value).toBe(0.0000000000018); }); + + it("should work on single-value charts (where minExtent === maxExtent)", () => { + const value = maybeRoundValueToZero(0.0000000000018, [0.00001, 0.00001]); + + expect(value).toBe(0); + }); }); });