Skip to content

plugin-designer: DashboardEditor's map-valued title stays read-only on a premise the spec invalidated, and the card it defers to (#4163) is closed #5428

Description

@os-support-ai

Found while implementing #5301 (PR #5427). Not fixed there — different package, and the surface is not this card's file.

What

packages/plugin-designer/src/DashboardEditor.tsx guards its widget-title input with isAuthorableTitle, so a title stored as an inline locale map renders resolved and read-only:

value={isAuthorableTitle(widget.title) ? widget.title ?? '' : titleDisplay}
onChange={(e) =. {
if (!isAuthorableTitle(widget.title)) return;
onChange({ title: e.target.value });
}}
readOnly={!isAuthorableTitle(widget.title)}

That branch is correct and cannot lose data — this is an observation, not a defect report. The problem is its stated justification and its tracker.

The premise is stale, and the same file already contradicts it

isAuthorableTitle's doc comment says:

  • "Nothing can reach this path from stored metadata yet — I18nLabel was plain string through rc.5, so no persisted widget title can be a map — which is why the branch is safe to take without a ruling on the authoring UX."

Sixty lines above it, resolveWidgetTitle's doc comment in the same file says:

  • "@objectstack/spec 17.0.0-rc.6 widened I18nLabel from string to string | Record ... so a widget title may be an inline per-locale map."

Both cannot hold. rc.6 is the pinned version, so a persisted map title is reachable today, and the "safe without a ruling" clause has expired.

The card it defers to is closed

The comment and #4163's own Part 2 name #4163 as the home for the real answer ("a per-locale editor, a translate-this-label affordance, or a deliberate decision that Studio only ever authors the string form"). #4163 was closed as completed on 2026-08-15 while that placeholder is still in the tree, so the deferral now points at nothing. The identical placeholder in DashboardWidgetInspector that #4163 Part 2 describes is in the same position.

Why it is newly actionable

#5301's maintainer ruling (2026-08-20) settled the write-back question for the sibling surface: a save writes back only the active locale's entry and preserves the others. PR #5427 implements that as setLocalized(value, language, next) in @object-ui/i18n, co-located with pickLocalized and pinned by the pairing property. The designer's read-only branch was waiting for exactly this rule, and can now adopt it without a new design decision — an author editing in one locale gets a working input instead of a dead one.

Filed unassigned and unqueued: whether to apply the ruling to the designer surface (versus reopening #4163 for the full multi-locale editor) is a triage call, not this finding's to make.

Metadata

Metadata

Assignees

Labels

domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpm:dispatched

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions