Uh oh!
There was an error while loading. Please reload this page.
fix(plugin-dashboard): one header spelling across the table widget family; pin dashboard dimension-member labels - #5445
Merged
os-support-ai merged 2 commits intoAug 20, 2026
Conversation
…mily `ObjectDataTable`'s auto-derived columns carried a third, inline spelling of the field-key -> header convention that split camelCase but never turned `_` into a space, so `close_date` rendered as `Close_date` beside the declared and static paths' `Close Date`. One dashboard can hold all three widgets over one object, so a single key appeared under two spellings. The odd path adopts `humanizeFieldKey`, which already declares itself the single home for this convention. A bundle entry still wins; only the fallback handed to `fieldLabel` changed. Also pins the card's first defect, which no longer reproduces: dataset dimension members resolve through the picklist field's declared options and locale bundle (the analytics label net, 17.5.0). Pinned over the four dashboards the card measured, plus the property that a bar axis and a pivot header cannot disagree about one stored value. Part of #5425 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RV6yuVCxymHYE16PL9vQkE
The bar/pivot agreement pin was predicted GREEN in both legs and measured RED in the mutated one: it sequences on the translated category before comparing spellings, so it needs the bundle to get past its `waitFor` even though the property it asserts is direction-independent. Correct the header rather than re-run to fit the prediction, and name the free-form twin as the leg that is genuinely direction-independent. Part of #5425 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RV6yuVCxymHYE16PL9vQkE
Contributor
✅ Console Performance Budget
📦 Bundle Size Report
Size Limits
|
os-support-ai
marked this pull request as ready for review
August 20, 2026 21:17
Uh oh!
There was an error while loading. Please reload this page.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for freeto join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Part of #5425. Read the first section before reviewing the diff — the card's primary premise did not survive re-measurement, and this PR deliberately does not implement what the card asks for.
Verification below was run on
231698b96, the branch head.The fork: defect 1 no longer reproduces
The card was measured on 17.1.0. Re-measured on
main(17.6.0), dashboard dimension members already resolve through the backing picklist field's declared options and therefore through its translations. The analytics label net that does this shipped in 17.5.0 — objectui#4030 / PR #4324 (charts and dotted dimensions), objectui#4330 (local selects on table and pivot), objectui#4389 (the shared React glue). Every non-metric dataset dimension is routedresolveDimensionFieldMetatobuildDimensionLabelMaptorelabelDimensionswith the locale bundle applied.Measured as rendering, which is what the card asks for — a zh-CN session, the card's four widgets, the card's own member values:
NeedsAnalysisNegotiationProposalNeedsAnalysis · Negotiation · ProposalBestCaseCommitBestCase · CommitContent / Blog…WebContent / Blog · … · WebBad Timing…Price Too HighBad Timing · … · Price Too HighThe "this branch" column is the same on
origin/main— nothing here produces it. What was missing was a test stated in the card's terms, so a regression would have been silent. That is what this PR adds.Defect 2 goes with it on that surface. The card reads
NeedsAnalysison the bar axis againstNeeds Analysisin the pivot row label; today both surfaces consume the samedimensionLabelsmap and fall back to the same stored value, so one value cannot carry two spellings there. Pinned explicitly, including the free-form case where no bundle entry exists.Provenance of the two measured spellings
The card asked which function each spelling comes from. Run over the card's own stored value, the two functions
git grepsurfaces reproduce the reported pair exactly:humanizeLabelmaps[_-]to spaces and title-cases word boundaries, so a PascalCase value passes through untouched;humanizeFieldKeyalso splits camelCase. The card's diagnosis was right for 17.1.0. Neither is reachable from a dataset dimension member today.What this PR does change
The prettifier family the card pointed at survives over field keys, and there it still carried the card's defect class.
ObjectDataTablederives column headers on two paths; the declared path and the staticdata-tablehalf both usedhumanizeFieldKey, while the auto-derived path carried a third inline spelling that split camelCase but never turned_into a space. Measured, rendered, over the same object's columns:close_dateneeds_analysisunitPriceClose_dateNeeds_analysisUnit PriceClose DateNeeds AnalysisUnit PricecolumnsClose DateNeeds AnalysisUnit Pricedata-table, no columnsClose DateNeeds AnalysisUnit PriceOne dashboard can hold all three widgets over one object, so a single field key rendered under two spellings, one of them leaving a raw underscore on screen. The odd path adopts the convention
humanizeFieldKey's own docstring already declares itself the single home of, rather than the convention gaining a fourth dialect. A bundle entry still wins — only the fallback handed tofieldLabelchanged. The camelCase column is where the old spelling and the convention coincided, which is why the snake_case divergence went unnoticed; it is pinned so this is not misread as a camelCase change.Zero contract additions, as the ruling requires. No translation-schema key is added, and measure/dimension labels are untouched — that half stays deferred.
Reverse verification
Directions written before each leg ran; both legs read source directly (the root
vitest.config.mtsaliases every@object-ui/*specifier to that package'ssrc/, and the tests import../DatasetWidget/../ObjectDataTablerelatively), so nodist/is involved in either the mutated or the restored leg. Restoration was confirmed by grepping the marker back out of each file.Leg 1 — revert the
ObjectDataTablefix. Predicted: the two auto-derived assertions RED, every boundary GREEN. Measured exactly that.Leg 2 — remove the locale seam (pass
undefinedforfieldOptionLabelintoderiveDimensionLabelMaps), to show the new member pins are load-bearing rather than phantom. Predicted: the four zh-CN member pins RED, the bar/pivot agreement pin and both boundaries GREEN. Measured five red — the agreement pin went red too:That fifth failure is a sequencing dependency, not an assertion one: the pin captures the axis spelling by first waiting for the translated category, so it needs the bundle to clear its
waitForeven though the property it asserts is direction-independent. The prediction is corrected in the test file's header rather than the run being repeated to fit it, and the free-form twin below it — which agrees over a value with no options, waits on no translation, and stayed GREEN in both legs — is what shows the agreement does not rest on a bundle entry existing.Gates
scripts/pm/dispatch-gates.mjsdoes not exist in this repository (it is an objectstack-repo tool), so the family was derived from the changed paths: twoplugin-dashboardtest files, oneplugin-dashboardsource file, one changeset.Plus a manual control-byte scan over the changed files:
grep -naP '[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]'returned no matches.No test was skipped, disabled or quarantined.
Out of scope
Filed unassigned as #5444: the value-fallback prettifier
humanizeLabelhas two byte-identical copies (packages/fields,packages/plugin-charts) and disagrees with the key-fallback convention on camelCase input. It is deliberately not touched here — aligning only theplugin-chartscopy would trade a latent disagreement for a live one againstplugin-grid/plugin-gantt/plugin-detail, andpackages/fieldssits outside this card's file surface and was held by PR #5441 at the time.For the PM
This is titled
Part of #5425rather than a closing keyword on purpose: the card's own two asks are satisfied by code that already shipped, so #5425 needs re-triage rather than being closed by this merge. #5444 is a new finding and is not addressed here.Generated by Claude Code