Skip to content

feat(spec,showcase): lookup record-picker authoring metadata + demo#2125

Merged
xuyushun441-sys merged 2 commits into
mainfrom
feat/lookup-picker-metadata
Jun 21, 2026
Merged

feat(spec,showcase): lookup record-picker authoring metadata + demo#2125
xuyushun441-sys merged 2 commits into
mainfrom
feat/lookup-picker-metadata

Conversation

@xuyushun441-sys

Copy link
Copy Markdown
Contributor

Why

The objectui record picker can render multi-column, scoped, and dependent lookup results, but FieldSchema exposed none of the authoring surface for it. Anything an author set (e.g. lookupColumns) was silently dropped by defineStack's Zod parse — so the picker always degraded to a single name column. This is the same class of gap the FieldSchema property-liveness audit flags (e.g. referenceFilters reaching the renderer under a different key, lookup_filters).

Companion to objectui #1860 (renderer: zero-config column derivation, i18n, accepts both key casings, applies lookupFilters in the popover).

Changes

spec — packages/spec/src/data/field.zod.ts
Add the forward record-picker props to the lookup / master_detail surface, all genuinely wired to the renderer:

  • displayField — candidate label field
  • descriptionField — secondary line in the popover
  • lookupColumns — curated picker table columns (auto-derived when omitted)
  • lookupPageSize — rows per page
  • lookupFilters — structured, picker-honoured scoping filters (the structured form of referenceFilters)
  • dependsOn — dependent / cascading lookups

They flow through Field.lookup() automatically via FieldInput. Tests assert the props survive FieldSchema.parse (the path defineStack uses) and that the builder carries them through.

showcase — examples/app-showcase

  • Account seed expanded 3 → 13 (varied industry / revenue / lifecycle incl. churned) so the picker exercises search, sort, pagination and scoping.
  • showcase_invoice.account configured with curated lookupColumns (name / industry / lifecycle / revenue), a descriptionField, and a lookupFilters rule hiding churned accounts — a rep can't invoice a churned customer.

Verification

  • packages/spec unit tests: 117 passed (incl. 2 new — props parse without being stripped; builder carries them through).
  • app-showcase typecheck: no errors in the changed files (invoice.object.ts, data/index.ts); remaining errors are pre-existing unbuilt-workspace-dep noise (connectors / objectql), unrelated to this change.
  • Renderer side proven live in feat(spec): model action-param translations (_actions.params) #1860 against this showcase.

The objectui record picker can present multi-column, scoped, dependent lookup
results, but FieldSchema exposed none of the authoring surface for it — so the
props were silently dropped by defineStack's Zod parse (cf. the FieldSchema
property-liveness audit, which flags referenceFilters reaching the renderer
under a different key). Authors had no supported way to curate or scope a picker.

spec (FieldSchema, packages/spec/src/data/field.zod.ts):
- Add forward record-picker props to the lookup/master_detail surface:
  `displayField`, `descriptionField`, `lookupColumns`, `lookupPageSize`,
  `lookupFilters` (structured, picker-honoured form of referenceFilters),
  and `dependsOn` (dependent/cascading lookups). All are genuinely wired —
  the objectui renderer reads them (camelCase + snake_case aliases). They flow
  through Field.lookup() automatically via FieldInput.
- Tests: assert the props survive FieldSchema.parse (not stripped) and that
  Field.lookup() carries them through.

showcase (examples/app-showcase):
- Expand the account seed from 3 → 13 (varied industry / revenue / lifecycle,
  incl. churned) so the picker exercises search, sort, pagination and scoping.
- Configure showcase_invoice.account with curated `lookupColumns`
  (name / industry / lifecycle / revenue), a `descriptionField`, and a
  `lookupFilters` rule that hides churned accounts — a rep can't invoice a
  churned customer. Demonstrates the new authoring surface end-to-end.

Pairs with objectui PR #1860 (renderer: auto-derive columns + i18n + accept
both key casings + apply lookupFilters in the popover).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@vercel

vercel Bot commented Jun 21, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
spec Ready Ready Preview, Comment Jun 21, 2026 1:11pm

Request Review

@github-actions

github-actions Bot commented Jun 21, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 1 package(s): @objectstack/spec.

89 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:

  • content/docs/concepts/architecture.mdx (via @objectstack/spec)
  • content/docs/concepts/cloud-artifact-api.mdx (via packages/spec)
  • content/docs/concepts/cluster-semantics.mdx (via @objectstack/spec)
  • content/docs/concepts/design-principles.mdx (via packages/spec)
  • content/docs/concepts/implementation-status.mdx (via @objectstack/spec)
  • content/docs/concepts/index.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-driven.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-lifecycle.mdx (via packages/spec)
  • content/docs/concepts/north-star.mdx (via packages/spec)
  • content/docs/concepts/packages.mdx (via @objectstack/spec)
  • content/docs/concepts/setup-app.mdx (via @objectstack/spec)
  • content/docs/concepts/skills.mdx (via @objectstack/spec)
  • content/docs/concepts/webhook-delivery.mdx (via @objectstack/spec)
  • content/docs/getting-started/architecture.mdx (via @objectstack/spec)
  • content/docs/getting-started/cli.mdx (via @objectstack/spec)
  • content/docs/getting-started/core-concepts.mdx (via @objectstack/spec)
  • content/docs/getting-started/examples.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-start.mdx (via @objectstack/spec)
  • content/docs/guides/adding-a-metadata-type.mdx (via @objectstack/spec)
  • content/docs/guides/ai-capabilities.mdx (via @objectstack/spec)
  • content/docs/guides/airtable-dashboard-analysis.mdx (via @objectstack/spec)
  • content/docs/guides/analytics-datasets.mdx (via @objectstack/spec)
  • content/docs/guides/api-reference.mdx (via @objectstack/spec)
  • content/docs/guides/business-logic.mdx (via @objectstack/spec)
  • content/docs/guides/cheatsheets/backward-compatibility.mdx (via @objectstack/spec)
  • content/docs/guides/cheatsheets/error-catalog.mdx (via @objectstack/spec)
  • content/docs/guides/cheatsheets/field-type-gallery.mdx (via @objectstack/spec)
  • content/docs/guides/cheatsheets/field-validation-rules.mdx (via @objectstack/spec)
  • content/docs/guides/cheatsheets/permissions-matrix.mdx (via @objectstack/spec)
  • content/docs/guides/cheatsheets/protocol-diagram.mdx (via packages/spec)
  • content/docs/guides/cheatsheets/query-cheat-sheet.mdx (via @objectstack/spec)
  • content/docs/guides/cheatsheets/quick-reference.mdx (via @objectstack/spec)
  • content/docs/guides/client-sdk.mdx (via @objectstack/spec)
  • content/docs/guides/common-patterns.mdx (via @objectstack/spec)
  • content/docs/guides/contracts/auth-service.mdx (via packages/spec)
  • content/docs/guides/contracts/cache-service.mdx (via packages/spec)
  • content/docs/guides/contracts/data-engine.mdx (via @objectstack/spec)
  • content/docs/guides/contracts/index.mdx (via @objectstack/spec)
  • content/docs/guides/contracts/metadata-service.mdx (via packages/spec)
  • content/docs/guides/contracts/storage-service.mdx (via packages/spec)
  • content/docs/guides/data-modeling.mdx (via @objectstack/spec)
  • content/docs/guides/deployment-vercel.mdx (via @objectstack/spec)
  • content/docs/guides/driver-configuration.mdx (via @objectstack/spec)
  • content/docs/guides/error-handling-client.mdx (via @objectstack/spec)
  • content/docs/guides/error-handling-server.mdx (via @objectstack/spec)
  • content/docs/guides/formula.mdx (via @objectstack/spec)
  • content/docs/guides/hook-bodies.mdx (via packages/spec)
  • content/docs/guides/kernel-services.mdx (via @objectstack/spec)
  • content/docs/guides/metadata/dashboard.mdx (via @objectstack/spec)
  • content/docs/guides/metadata/field.mdx (via @objectstack/spec)
  • content/docs/guides/metadata/flow.mdx (via @objectstack/spec)
  • content/docs/guides/metadata/index.mdx (via @objectstack/spec)
  • content/docs/guides/metadata/object.mdx (via @objectstack/spec)
  • content/docs/guides/metadata/validation.mdx (via @objectstack/spec)
  • content/docs/guides/metadata/workflow.mdx (via @objectstack/spec)
  • content/docs/guides/packages.mdx (via @objectstack/spec)
  • content/docs/guides/plugin-development.mdx (via @objectstack/spec)
  • content/docs/guides/plugins.mdx (via @objectstack/spec)
  • content/docs/guides/project-scoping.mdx (via @objectstack/spec)
  • content/docs/guides/public-forms.mdx (via @objectstack/spec)
  • content/docs/guides/runtime-services/email-service.mdx (via packages/spec)
  • content/docs/guides/runtime-services/index.mdx (via packages/spec)
  • content/docs/guides/runtime-services/queue-service.mdx (via packages/spec)
  • content/docs/guides/runtime-services/sharing-service.mdx (via packages/spec)
  • content/docs/guides/runtime-services/storage-service.mdx (via packages/spec)
  • content/docs/guides/security.mdx (via @objectstack/spec)
  • content/docs/guides/seed-data.mdx (via @objectstack/spec)
  • content/docs/guides/skills.mdx (via @objectstack/spec)
  • content/docs/guides/standards.mdx (via @objectstack/spec)
  • content/docs/guides/troubleshooting.mdx (via @objectstack/spec)
  • content/docs/protocol/knowledge.mdx (via @objectstack/spec)
  • content/docs/protocol/objectos/config-resolution.mdx (via @objectstack/spec)
  • content/docs/protocol/objectos/i18n-standard.mdx (via @objectstack/spec)
  • content/docs/protocol/objectos/lifecycle.mdx (via @objectstack/spec)
  • content/docs/protocol/objectos/plugin-spec.mdx (via @objectstack/spec)
  • content/docs/protocol/objectos/runtime-capabilities.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/index.mdx (via packages/spec)
  • content/docs/protocol/objectql/query-syntax.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/schema.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/security.mdx (via packages/spec)
  • content/docs/protocol/objectql/state-machine.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/actions.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/concept.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/index.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/layout-dsl.mdx (via packages/spec)
  • content/docs/protocol/objectui/record-alert.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/widget-contract.mdx (via @objectstack/spec)
  • content/docs/releases/index.mdx (via @objectstack/spec)
  • content/docs/releases/v9.mdx (via @objectstack/spec)

Advisory only. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs origin/main → pass the list as args.docs.

The spec liveness gate requires every authorable FieldSchema property to be
classified. Mark displayField/descriptionField/lookupColumns/lookupPageSize/
lookupFilters/dependsOn as live (consumed by the objectui record picker, cited
as prose per the ledger convention) and sharpen the referenceFilters authorHint
to point at the structured lookupFilters key.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@github-actions github-actions Bot added size/m and removed size/s labels Jun 21, 2026
@xuyushun441-sys
xuyushun441-sys merged commit adac0f7 into main Jun 21, 2026
17 checks passed
@xuyushun441-sys
xuyushun441-sys deleted the feat/lookup-picker-metadata branch June 21, 2026 13:18
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants