Skip to content

fix(showcase): Work Map declares its marker bindings (title/location) - #11568

Merged
os-steve merged 1 commit into
mainfrom
claude/issue-11443-showcase-map-block
Aug 24, 2026
Merged

fix(showcase): Work Map declares its marker bindings (title/location)#11568
os-steve merged 1 commit into
mainfrom
claude/issue-11443-showcase-map-block

Conversation

@os-steve

Copy link
Copy Markdown
Collaborator

Fixes#11443

The placeholder-title mechanism

TaskMapPage (showcase_task_map, "Work Map", in
examples/app-showcase/src/ui/pages/task-visualizations.pages.ts) whitelisted map in
appearance.allowedVisualizations but declared no field binding for it. With nothing
declared, objectui's defaultMapFromObject auto-derivation fills in only
{ locationField } — never a title field — and the map renderer's flat-form fallback
defaults titleField to 'name'. showcase_task (task.object.ts) has title, not
name, so every marker on the Work Map rendered a placeholder title.

Placement evidence — why sourceView, not a map: block on interfaceConfig

The card asked for map: { titleField: 'title', locationField: 'location' } declared
directly on the page's interfaceConfig. Measured against the schema before writing
anything: InterfacePageConfigSchema (packages/spec/src/ui/page.zod.ts) is a closed
(strictObject) shape whose declared keys are source, columns, sort, filterBy,
levels, sourceView, appearance, userFilters, userActions, addRecord, buttons,
recordAction, showRecordCount, allowPrinting — no map (or kanban/calendar/…)
key exists at any level. Confirmed empirically:

PageSchema.parse({ …, interfaceConfig: { …, map: { titleField: 'title', locationField: 'location' } } })
→ ZodError: unrecognized_keys ["map"] at ["interfaceConfig"]
"Unrecognized key(s) on this interface page configuration: `map`. Until #4001 closed
this shape these were dropped silently — the page still rendered, without whatever
the key was meant to configure."

No sibling page in examples/** declares a per-visualization block directly on
interfaceConfig either — none exists to follow as precedent, because the schema has no
such slot.

The one schema-legal channel is sourceView — and showcase_task already declares the
exact binding this card wants, on its own named map listView
(examples/app-showcase/src/ui/views/task.view.ts, landed with #9340):

map: {label: 'Work Locations (Map)',type: 'map',
data,columns: ['title','location','assignee'],map: {titleField: 'title',locationField: 'location'},},

So the fix is one line — sourceView: 'map' — pointing the page at that view instead of
re-declaring the binding somewhere the schema won't accept it. Verified this parses and
carries the reference:

TaskMapPage.interfaceConfig.sourceView === 'map' ✓

Pin-coverage note (per triage's rider)

objectui's InterfaceListPage resolves sourceView against the source object's named
views (resolveSourceView) and — since objectui#5908 (confirmed merged into
objectui's origin/main, commit e2e8e68) — forwards the resolved view's map block
verbatim so ListView merges it over the legacy options.map bag:

+ // The spec's view-level `map` block (`ListMapConfigSchema`), forwarded+ // verbatim so `ListView` can merge it over the `options.map` bag below.+ ...((view as any).map ? { map: (view as any).map } : {}),

Before that pin lands in this repo's own console (.objectui-sha), the forwarding code
objectui runs today does not yet read view.map this way, so the authored sourceView
reference is harmless-but-inert against the current pin — same as before this PR,
markers still fall back to the auto-derived { locationField } only. It becomes visible
once the console pin covers objectui#5908. This is an authoring-correctness fix, not a
runtime-behavior claim; the rendered effect is a pin-coverage matter, not a blocker on
this PR.

Scope

Example-app metadata only — no packages/spec/src/** change. The broader gap this card's
issue also names (defaultMapFromObject's auto-derivation never binding a title field for
any interface page that whitelists map without an explicit view) is objectui-side and
out of scope here; it already has its own card there (objectui#5042 lineage).

Tests

Added examples/app-showcase/test/task-map-marker-title.test.ts — three pins: the page
carries sourceView: 'map'; the referenced view still carries
map: { titleField: 'title', locationField: 'location' }; a map block declared
directly on interfaceConfig stays rejected (documents the schema boundary this fix
works around, so a future schema change either updates this pin deliberately or a
regression here is caught).

CheckResult
objectstack validate (@objectstack/example-showcase)Validation passed — 24 objects, 28 pages, 6 views; only pre-existing unrelated warnings
@objectstack/example-showcasetypecheck (tsc --noEmit)clean
@objectstack/example-showcasetest (vitest)26 files / 370 tests passed (was 25/367 before this PR's new file)
pnpm check:cross-package-test-inputsOK
pnpm check:examples-live-importsOK — 0 invisible, 72 graph-visible
pnpm check:published-filesOK
pnpm check:test-source-aliasOK
pnpm check:type-source-resolutionOK
node scripts/check-cross-package-test-inputs.mjsOK
pnpm check:nul-bytesOK — 6464 files scanned, no raw control bytes
pnpm check:query-options-erasureratchet holds, no new sites
pnpm check:engine-double-contractOK — 394 pinned, no new doubles
pnpm check:where-matcherOK — 290/290 judged, none new
pnpm check:type-check-coverage (structural half)OK — no new ledger entries
pnpm check:type-check-debt --re-measurerefuses locally — pre-existing, unrelated: needs the full packages/* closure built (@objectstack/service-knowledge has no built dist/ in this worktree); the structural half above is clean and this package's own typecheck already covers the new test file, so there is no plausible mechanism for this diff to move the ratchet. CI runs this with a full build.

Gate list derived via node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack
against the final commit (7ac43a37d3); all matched + convention-triggered families for
this diff (new test file) are accounted for above.

Changeset

None — skip-changeset instead.@objectstack/example-showcase is private: true
and unpublished, so an examples-only change releases nothing — same call PR #7764 made on
the same package.


Generated by Claude Code

`TaskMapPage` (`showcase_task_map`) whitelisted `map` in
`appearance.allowedVisualizations` but declared no field binding.
`InterfacePageConfigSchema` is a CLOSED shape with no `map` key of its
own, so the binding cannot be authored directly on `interfaceConfig`
(confirmed: parse-rejected as an unrecognized key). objectui's
auto-derivation then filled in only `{ locationField }`, and the map
renderer's flat-form fallback defaults `titleField` to `'name'` —
`showcase_task` has `title`, not `name`, so every marker rendered a
placeholder title.
`showcase_task` already declares the correct binding on its own `map`
listView (task.view.ts, #9340): `map: { titleField: 'title',
locationField: 'location' }`. The page now points at it via
`sourceView: 'map'`, the one schema-legal channel that reaches it —
objectui's `InterfaceListPage` resolves `sourceView` against the
source object's named views and (since objectui#5908, merged) forwards
that view's `map` block to the renderer.
Adds a regression pin: the page carries the `sourceView` reference,
the referenced view still carries the binding, and a `map` block
declared directly on `interfaceConfig` stays rejected.
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Aug 24, 2026
@os-steve
os-steve marked this pull request as ready for review August 24, 2026 03:50
@os-steve
os-steve added this pull request to the merge queueAug 24, 2026
Merged via the queue into main with commit bcfe215Aug 24, 2026
34 checks passed
@os-steve
os-steve deleted the claude/issue-11443-showcase-map-block branch August 24, 2026 04:28
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/sskip-changesetPR has no user-facing published change; bypasses the changeset gatetests

Projects

None yet

Development

Successfully merging this pull request may close these issues.

showcase Work Map renders placeholder marker titles — the page declares no map block and showcase_task has no name field

2 participants

@os-steve@claude