You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
feat(spec): interface pages own their view metadata directly (revise ADR-0047 iron rule)
Airtable parity: an interface (list) page now defines its data surface DIRECTLY
as metadata — columns, base filter, sort — instead of inheriting them from a
referenced object view ("sourceView"). There is no "inherit from a separate
view" concept anymore; the page IS the view definition.
Spec (packages/spec/src/ui):
- page.zod.ts — InterfacePageConfigSchema gains its own `columns`
(string[] | ListColumnSchema[]) and `sort`; `filterBy` clarified as the
always-on base filter. `sourceView` is now @deprecated, kept only as a
runtime back-compat fallback.
- page.form.ts — the inspector follows Airtable's IA: Data (Source → Columns →
Filter By → Levels) · Appearance · User filters · User actions. The
"Source View" picker is removed and replaced by a Columns field picker
(widget: field-multi, dependsOn: source). Iron-rule helptext rewritten.
Showcase migrated to the new model (define columns directly, drop sourceView):
- task-triage.page.ts, task-workbench.page.ts.
Pairs with the objectui runtime change that reads page-owned columns/sort with
a view→object fallback. Browser-verified: the page editor shows Source/Columns/
Filter By (no Source View); picking columns re-renders the preview live; both
showcase pages render their own column sets (workbench shows Estimate (h), which
the object default view omits — proving independence).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
description: 'ADR-0047 interface mode: bind a source view and curate the end-user surface — quick filters, locked visualizations, toolbar actions (Airtable Interfaces parity).',
71
+
description: 'Interface mode (Airtable parity): the page defines its own data surface directly — columns, filters, visualizations and toolbar — no inheriting from a separate view.',
72
72
collapsible: true,
73
73
// Primary content for a list page — open by default (still collapsible).
'source/sourceView bind the object view (columns, base filter and sort are inherited — the iron rule); appearance.allowedVisualizations whitelists renderers (one entry = locked); userActions toggles the toolbar.',
81
+
'The page IS the view: source picks the object, columns/filterBy are defined directly here; appearance.allowedVisualizations whitelists renderers (one entry = locked); userActions toggles the toolbar.',
82
82
// Order: common authoring controls first, rarely-used ones last.
83
83
// Explicit sub-fields so `userFilters` can use the dedicated
/** Data binding (ADR-0047: pages REFERENCE views, never restate them) */
228
229
source: z.string().optional().describe('Source object name for the page'),
229
-
sourceView: z.string().optional()
230
-
.describe('Named list view on the source object to inherit columns/filter/sort from (ADR-0047 iron rule: the page adds presentation policy only). Omit to use the object default view'),
230
+
231
+
// ADR-0047 (revised): the page carries its OWN view metadata — columns, sort
232
+
// and base filter are defined directly here (Airtable parity: there is no
233
+
// "inherit from a named view" concept). The page IS the view definition.
0 commit comments