Skip to content

Commit 6ca68e4

Browse files
os-zhuangclaude
andcommitted
feat(app-shell): interface pages read page-owned columns/sort (revise ADR-0047)
Airtable parity: an interface (list) page now carries its own view metadata instead of inheriting everything from a referenced source view. InterfaceListPage resolves data semantics with the precedence: page's own config → legacy sourceView view (back-compat) → object default - columns: cfg.columns ?? resolvedView.columns ?? defaultColumnsFromObject - sort: cfg.sort ?? view.sort - filterBy stays the page's always-on base filter on top. Pairs with the spec change (InterfacePageConfig gains columns/sort; sourceView deprecated; page editor drops the Source View picker for a Columns picker). Existing pages with a sourceView keep working via the fallback. Browser-verified against the live showcase: editing Columns in the page editor re-renders the preview live; task-triage / task-workbench render their own column sets (workbench shows Estimate (h), absent from the object default view). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1 parent b199c24 commit 6ca68e4

1 file changed

Lines changed: 15 additions & 8 deletions

File tree

packages/app-shell/src/views/InterfaceListPage.tsx

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -232,26 +232,33 @@ export function InterfaceListPage({ page, className }: InterfaceListPageProps) {
232232
const gallery =
233233
view.gallery ?? (allowedSet.has('gallery') ? defaultGalleryFromObject(objectDef) : undefined);
234234

235-
// Inherited data semantics (the iron rule: all from the view) + the
236-
// page's own always-on criteria (`filterBy`).
235+
// Data semantics — ADR-0047 (revised): the PAGE owns its view metadata.
236+
// Precedence everywhere: the page's own config → legacy sourceView view
237+
// (back-compat) → a sensible default derived from the object.
237238
const filters = [
238239
...(Array.isArray(view.filter) ? view.filter : []),
239240
...(Array.isArray(cfg.filterBy) ? cfg.filterBy : []),
240241
];
241242

242-
// Columns: the referenced view's, else a sensible default derived from
243-
// the object (compactLayout / business fields). Some backends serve the
244-
// default view hollow (columns live only in named views), so without
245-
// this fallback the grid would render just the row-number column.
246-
const columns = hasColumns(view) ? view.columns : defaultColumnsFromObject(objectDef);
243+
// Columns: the page's own `columns` win; else the legacy referenced view's;
244+
// else a default from the object so the grid never renders just the
245+
// row-number column.
246+
const columns = hasColumns(cfg)
247+
? (cfg.columns as any)
248+
: hasColumns(view)
249+
? view.columns
250+
: defaultColumnsFromObject(objectDef);
251+
252+
// Sort: the page's own first, then the legacy view's.
253+
const sort = Array.isArray(cfg.sort) && cfg.sort.length ? cfg.sort : view.sort;
247254

248255
return {
249256
type: 'list-view' as const,
250257
objectName: objectDef.name,
251258
viewType: (allowed[0] ?? view.type ?? 'grid'),
252259
fields: columns,
253260
...(filters.length ? { filters } : {}),
254-
...(view.sort?.length ? { sort: view.sort } : {}),
261+
...(sort?.length ? { sort } : {}),
255262
grouping: view.grouping,
256263
rowColor: view.rowColor,
257264
pagination: view.pagination,

0 commit comments

Comments
 (0)