From 868ad9dbc3c60b9efdf4e76dde86747692960dd4 Mon Sep 17 00:00:00 2001 From: os-zhuang Date: Sat, 20 Jun 2026 12:56:44 +0800 Subject: [PATCH] feat(spec): interface base filterBy uses the unified filter-builder widget MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The page form rendered `interfaceConfig.filterBy` (the always-on base filter) as a generic `type:'repeater'`, a different and clunkier editor than the polished FilterBuilder the list toolbar uses. Switch it to `widget:'filter-builder'` with `dependsOn:'source'` so the Studio renders the same popout visual builder for the base filter as for the per-tab presets — one consistent filter UX everywhere. The widget is implemented in objectui (SchemaForm widget registry); stored format is unchanged (ViewFilterRule[]). Co-Authored-By: Claude Opus 4.8 --- packages/spec/src/ui/page.form.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/spec/src/ui/page.form.ts b/packages/spec/src/ui/page.form.ts index 76589a4b30..2d3b1de305 100644 --- a/packages/spec/src/ui/page.form.ts +++ b/packages/spec/src/ui/page.form.ts @@ -92,7 +92,7 @@ export const pageForm = defineForm({ // Columns are defined ON the page (no view inheritance). `dependsOn: // 'source'` tells the picker which object's fields to offer. { field: 'columns', widget: 'field-multi', dependsOn: 'source', helpText: 'Columns to show — defined directly on the page (blank = all object fields)' }, - { field: 'filterBy', type: 'repeater', helpText: 'Always-on base filter for the page' }, + { field: 'filterBy', widget: 'filter-builder', dependsOn: 'source', helpText: 'Always-on base filter for the page — same visual builder as the list toolbar.' }, { field: 'levels', helpText: 'Hierarchy levels to display (tree-like sources)' }, // ── Appearance ── { field: 'appearance', type: 'composite', disclosure: 'popover', helpText: 'Allowed visualizations (Grid / Kanban / Calendar / …) and description visibility' },