Uh oh!
There was an error while loading. Please reload this page.
fix(showcase): Work Map declares its marker bindings (title/location) - #11568
Merged
Conversation
`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.os-steve
marked this pull request as ready for review
August 24, 2026 03:50
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.
Fixes#11443
The placeholder-title mechanism
TaskMapPage(showcase_task_map, "Work Map", inexamples/app-showcase/src/ui/pages/task-visualizations.pages.ts) whitelistedmapinappearance.allowedVisualizationsbut declared no field binding for it. With nothingdeclared, objectui's
defaultMapFromObjectauto-derivation fills in only{ locationField }— never a title field — and the map renderer's flat-form fallbackdefaults
titleFieldto'name'.showcase_task(task.object.ts) hastitle, notname, so every marker on the Work Map rendered a placeholder title.Placement evidence — why
sourceView, not amap:block oninterfaceConfigThe card asked for
map: { titleField: 'title', locationField: 'location' }declareddirectly on the page's
interfaceConfig. Measured against the schema before writinganything:
InterfacePageConfigSchema(packages/spec/src/ui/page.zod.ts) is a closed(
strictObject) shape whose declared keys aresource,columns,sort,filterBy,levels,sourceView,appearance,userFilters,userActions,addRecord,buttons,recordAction,showRecordCount,allowPrinting— nomap(orkanban/calendar/…)key exists at any level. Confirmed empirically:
No sibling page in
examples/**declares a per-visualization block directly oninterfaceConfigeither — none exists to follow as precedent, because the schema has nosuch slot.
The one schema-legal channel is
sourceView— andshowcase_taskalready declares theexact binding this card wants, on its own named
maplistView(
examples/app-showcase/src/ui/views/task.view.ts, landed with #9340):So the fix is one line —
sourceView: 'map'— pointing the page at that view instead ofre-declaring the binding somewhere the schema won't accept it. Verified this parses and
carries the reference:
Pin-coverage note (per triage's rider)
objectui's
InterfaceListPageresolvessourceViewagainst the source object's namedviews (
resolveSourceView) and — since objectui#5908 (confirmed merged intoobjectui'sorigin/main, commite2e8e68) — forwards the resolved view'smapblockverbatim so
ListViewmerges it over the legacyoptions.mapbag:Before that pin lands in this repo's own console (
.objectui-sha), the forwarding codeobjectui runs today does not yet read
view.mapthis way, so the authoredsourceViewreference 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 visibleonce 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'sissue also names (
defaultMapFromObject's auto-derivation never binding a title field forany interface page that whitelists
mapwithout an explicit view) is objectui-side andout 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 pagecarries
sourceView: 'map'; the referenced view still carriesmap: { titleField: 'title', locationField: 'location' }; amapblock declareddirectly on
interfaceConfigstays rejected (documents the schema boundary this fixworks around, so a future schema change either updates this pin deliberately or a
regression here is caught).
objectstack validate(@objectstack/example-showcase)@objectstack/example-showcasetypecheck(tsc --noEmit)@objectstack/example-showcasetest(vitest)pnpm check:cross-package-test-inputspnpm check:examples-live-importspnpm check:published-filespnpm check:test-source-aliaspnpm check:type-source-resolutionnode scripts/check-cross-package-test-inputs.mjspnpm check:nul-bytespnpm check:query-options-erasurepnpm check:engine-double-contractpnpm check:where-matcherpnpm check:type-check-coverage(structural half)pnpm check:type-check-debt --re-measurepackages/*closure built (@objectstack/service-knowledgehas no builtdist/in this worktree); the structural half above is clean and this package's owntypecheckalready 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/objectstackagainst the final commit (
7ac43a37d3); all matched + convention-triggered families forthis diff (new test file) are accounted for above.
Changeset
None —
skip-changesetinstead.@objectstack/example-showcaseisprivate: trueand unpublished, so an examples-only change releases nothing — same call PR #7764 made on
the same package.
Generated by Claude Code