You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
DatasetReportChart builds its chart rows as relabelDimensions(state.rows, dimensionLabels) and forwards them straight to the chart component. Nothing on that path buckets a null dimension value, so a report chart hands the renderer a null category — the exact input #4466 measured as drawing no mark at all.
The dashboard and chart-view surfaces do not have this problem because they route through buildChartSeries (packages/core/src/utils/chart-series.ts), whose bucketNullCategories limb is where #4466 / #4497 / #4673 / #4500 were all fixed. The report chart calls none of it.
Found while implementing #4020 on the same forwarding line; out of that card's scope, so filed here.
Measured
A dataset-bound report chart over rows containing a null group, capturing the props handed to the registered chart component:
data = [{"owner":null,"n":51},{"owner":"Dev Admin","n":2}]
The null reaches the renderer verbatim. On the dashboard path the same rows arrive as the bucket label ((None), localized per #4500) and draw a bar.
Why it matters
#4466 recorded that the cost is not an empty chart but a quietly wrong one: the dominant group vanishes while the y-axis scale still accommodates it, so the chart reads as valid data. A report chart is the surface most likely to be exported or read in a background tab, where there is no second view to cross-check against.
The report renderer is also missing the collision-safe bucketing that came with #4508 (a stored value literally spelling the bucket label) and the (None) localization of #4500 — those are properties of the shared helper, so they arrive together if the path is unified rather than re-implemented.
Suggested direction
Route the report chart's rows through buildChartSeries rather than passing state.rows through, so the whole null-category family is inherited instead of re-derived. Two things to check first, which is why this is not a one-liner:
Summary
DatasetReportChartbuilds its chart rows asrelabelDimensions(state.rows, dimensionLabels)and forwards them straight to the chart component. Nothing on that path buckets anulldimension value, so a report chart hands the renderer a null category — the exact input #4466 measured as drawing no mark at all.The dashboard and chart-view surfaces do not have this problem because they route through
buildChartSeries(packages/core/src/utils/chart-series.ts), whosebucketNullCategorieslimb is where #4466 / #4497 / #4673 / #4500 were all fixed. The report chart calls none of it.Found while implementing #4020 on the same forwarding line; out of that card's scope, so filed here.
Measured
A dataset-bound report chart over rows containing a null group, capturing the props handed to the registered
chartcomponent:The null reaches the renderer verbatim. On the dashboard path the same rows arrive as the bucket label (
(None), localized per #4500) and draw a bar.Why it matters
#4466 recorded that the cost is not an empty chart but a quietly wrong one: the dominant group vanishes while the y-axis scale still accommodates it, so the chart reads as valid data. A report chart is the surface most likely to be exported or read in a background tab, where there is no second view to cross-check against.
The report renderer is also missing the collision-safe bucketing that came with #4508 (a stored value literally spelling the bucket label) and the
(None)localization of #4500 — those are properties of the shared helper, so they arrive together if the path is unified rather than re-implemented.Suggested direction
Route the report chart's rows through
buildChartSeriesrather than passingstate.rowsthrough, so the whole null-category family is inherited instead of re-derived. Two things to check first, which is why this is not a one-liner:buildChartSeriesalso DERIVES the series (one per measure, withfields[].label). The report chart plots exactly one measure and, since Report charts render the raw dataset measurenameas the axis title, ignoring the measure'slabel— the same measure on a dashboard chart resolves correctly #4020, resolves its display name through a three-level fallback that outranks the plainfields[].labelpick. The authoredchart.series[].labeloverride must survive the switch.@object-ui/coreis React-free — see thenullCategoryLabeloption and DatasetWidget renders the English '(None)' null-bucket floor in a zh app — one argument short of localized #4500), otherwise a zh console gains an English(None).Related
buildChartSeries.showLegend: falsestill draws a legend,colors/showDataLabelsare inert #4877 — the sibling gap on the same forwarding line (authored chart chrome dropped).nameas the axis title, ignoring the measure'slabel— the same measure on a dashboard chart resolves correctly #4020 — the measure display name, fixed on this line.