fix(detail+fields+app-shell): ADR-0085 #2548 follow-ups — strip title dedupe, group icon/description, currency channel, approvals Bearer#2577
Merged
Conversation
… dedupe, group icon/description, currency channel, footer/badge/i18n polish, approvals Bearer
UX follow-ups from the framework#2548 real-backend browser pass, re-verified
in a live browser (new-source console against a running showcase backend,
14/14 assertions green):
- plugin-detail synth: `deriveHighlightFields` drops the record's title field
from DECLARED highlightFields lists (new exported `resolveTitleField`,
mirroring record-details' titleCandidates) — the title is the page H1 and
repeated as a truncated first chip; filtering happens before the 4-chip cap.
app-shell's RecordDetailView synthParts (which pre-computes the list and
bypasses the derivation) applies the same filter.
- plugin-detail synth: `deriveFieldGroupDetailSections` passes the shared
derivation's group icon/description through to section descriptors; the
spec keys were silently inert on detail pages. DetailSection renders
identifier-shaped icon names as real Lucide icons via LazyIcon (emoji/text
values keep the historical text rendering).
- currency: the strip + section field enrichment now pass `currencyConfig`
through — the SPEC channel for per-field currency (`defaultCurrency`);
without it a spec-authored currency field could never render its symbol.
- plugin-detail: RecordMetaFooter falls back to actor-less labels
("Created"/"Updated") when created_by/updated_by is null — seeded/system
rows rendered a dangling "Created by · 10m ago". New detail.created/updated
keys in the plugin defaults and all six locales; zh createdBy/updatedBy
mistranslation fixed (创建人/更新人).
- fields: SelectCellRenderer badges shrink + ellipsize (inner truncate span,
max-w-full) instead of clipping mid-glyph in bounded containers, with the
full label as hover title. HeaderHighlight's hover title now prefers the
option label over the raw stored value.
- app-shell + apps/console: ALL approvals fetches (header badge poll, home
inbox, record approvals panel, console approvalsApi) attach the stored
Bearer token via a shared `bearerAuthHeaders()` util — cookie-only auth
silently lost the approvals surface on split-origin deployments where the
SameSite cookie doesn't flow.
Verification: vitest plugin-detail 212 ✓ / synth+fields 419 ✓ / i18n ✓ /
app-shell hooks+views+utils 304 ✓; turbo type-check (app-shell,
plugin-detail, fields, i18n, console) ✓; eslint 0 errors on touched files;
live-browser re-verify 14/14 (strip dedupe, $ symbols, icon+description,
label feed, approvals 200, no dangling footer, green badge, stepper
suppression intact).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016wpaFMPowSn4nAWsjeGZib
|
The latest updates on your projects. Learn more about Vercel for GitHub. |
Contributor
✅ Console Performance Budget
📦 Bundle Size Report
Size Limits
|
…truncate span SelectCellRenderer now wraps option labels in an inner `truncate` span (#2548 ellipsis fix), so findByText resolves to that span instead of the Badge element. Walk up to the closest Badge-flavored wrapper before asserting its utility classes. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016wpaFMPowSn4nAWsjeGZib
Contributor
✅ Console Performance Budget
📦 Bundle Size Report
Size Limits
|
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 free
to 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.
What
UX follow-ups surfaced by the framework#2548 real-backend browser pass (companion framework PR bumps
.objectui-shaand adds a permanent detail-shapes e2e). Every fix below was re-verified in a live browser — new-source console against a running showcase backend, 14/14 assertions green — screenshots in the framework PR thread.Highlight strip no longer repeats the record title
A declared
highlightFieldslist containing the title field rendered it as the first chip — truncated ("Zoo Group…") — directly under the identical page H1.deriveHighlightFieldsnow resolves the title via the new exportedresolveTitleField(primaryField/nameField/ deprecateddisplayNameField, else the conventional display-field names — mirroringrecord-details' titleCandidates) and filters it from declared lists before the 4-chip cap. The heuristic branch always skipped it; both branches now agree. app-shell'sRecordDetailViewsynthParts — which pre-computes the list and bypasses the derivation — applies the same filter.fieldGroups[].icon/descriptionreach detail pagesThe shared derivation (ADR-0085 §5,
deriveFieldGroupLayout) already passed them through; the detail synth dropped them — the spec keys were silently inert on detail pages (the exact ADR-0078 class).deriveFieldGroupDetailSectionsnow maps both onto section descriptors, andDetailSectionrenders identifier-shaped icon names as real Lucide icons via the existingLazyIcon(emoji/CJK text values keep the historical text rendering).Per-field currency reaches the renderers
The spec channel for a per-field currency is
currencyConfig.defaultCurrency(a barecurrencykey is designer/DB-only and stripped at parse) — but the highlight-strip and detail-section field enrichment droppedcurrencyConfig, so a spec-authored currency field could never show its symbol ("25,000,000" instead of "$25,000,000"). Both enrich sites now pass it through;resolveFieldCurrencyreads it second in its existing precedence.Record meta footer stops dangling without an actor
Seeded/system rows with
created_by: nullrendered "Created by · 10m ago". The footer now falls back to actor-less labels ("Created" / "Updated"); newdetail.created/detail.updatedkeys in the plugin defaults and all six locales — and the zhcreatedBy/updatedBymistranslation is fixed (创建人/更新人, the old 创建于/更新于 now correctly serve the actor-less variants).Select badges ellipsize instead of clipping mid-glyph
In bounded containers (highlight-strip columns, grid cells) an overlong option label was cut at the container edge ("Technolog…"). Badges now shrink (
max-w-full min-w-0) with an innertruncatespan and expose the full label as a hover title; the highlight strip's hover title also prefers the option label over the raw stored value.All approvals fetches send the Bearer token (split-origin fix)
The header badge poll (
AppHeader), home-inbox count (useHomeInbox), record approvals panel (useRecordApprovals), and the consoleapprovalsApiwere cookie-only — on split-origin deployments (custom-domain console ↔ API) where the SameSite cookie doesn't flow, the whole approvals surface silently 401'd while every dataSource call (Bearer) worked. New sharedapp-shell/utils/authToken.ts(bearerAuthHeaders(), reading@object-ui/authTokenStorage) wired into all four sites. Verified live: the approvals polls return 200 under a token-only session.Verification
primaryFieldprecedence and cap interaction; icon/description section mapping)turbo run type-check(app-shell, plugin-detail, fields, i18n, console) ✓stageField:falsesuppression intactRefs framework#2548 (follow-up plan + audit note update in the companion framework PR).
🤖 Generated with Claude Code
https://claude.ai/code/session_016wpaFMPowSn4nAWsjeGZib
Generated by Claude Code