From aecd4f3fa910ed9b75fb6c10eb8a363654096423 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 22 Feb 2026 02:54:02 +0000 Subject: [PATCH 1/2] Initial plan From e98f7ef6db09dcf5520a09d336a3618d2cb0f66a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 22 Feb 2026 03:08:51 +0000 Subject: [PATCH 2/2] docs: update ROADMAP.md with view config live preview sync gap analysis (P1.8.1) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ref: #711 โ€” ViewConfigPanel real-time sync gaps for non-grid views - Revise live preview item from [x] to [ ] (partially complete) with detailed gap annotations - Add P1.8.1 section: per-view-type config propagation matrix, root causes, 7-phase remediation plan - Update Executive Summary with View Config Live Preview Sync as active priority - Add risk entries for dependency chain breakage and NamedListView type gaps - Update footer status line to include P1.8.1 Co-authored-by: hotlong <50353452+hotlong@users.noreply.github.com> --- ROADMAP.md | 99 ++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 88 insertions(+), 11 deletions(-) diff --git a/ROADMAP.md b/ROADMAP.md index 489ac0798..6d90c20bd 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -5,7 +5,7 @@ > **Spec Version:** @objectstack/spec v3.0.8 > **Client Version:** @objectstack/client v3.0.8 > **Target UX Benchmark:** ๐ŸŽฏ Airtable parity -> **Current Priority:** AppShell Navigation ยท Designer Interaction ยท Dashboard Config Panel ยท Airtable UX Polish +> **Current Priority:** AppShell Navigation ยท Designer Interaction ยท View Config Live Preview Sync ยท Dashboard Config Panel ยท Airtable UX Polish --- @@ -18,9 +18,10 @@ ObjectUI is a universal Server-Driven UI (SDUI) engine built on React + Tailwind **What Remains:** The gap to **Airtable-level UX** is primarily in: 1. ~~**AppShell** โ€” No dynamic navigation renderer from spec JSON (last P0 blocker)~~ โœ… Complete 2. **Designer Interaction** โ€” ViewDesigner and DataModelDesigner have undo/redo, field type selectors, inline editing, Ctrl+S save, column drag-to-reorder with dnd-kit โœ… -3. **Dashboard Config Panel** โ€” Airtable-style right-side configuration panel for dashboards (data source, layout, widget properties, sub-editors, type definitions) -4. **Console Advanced Polish** โ€” Remaining upgrades for forms, import/export, automation, comments -5. **PWA Sync** โ€” Background sync is simulated only +3. **View Config Live Preview Sync** โ€” Config panel changes sync in real-time for Grid, but `showSort`/`showSearch`/`showFilters`/`striped`/`bordered` not yet propagated to Kanban/Calendar/Timeline/Gallery/Map/Gantt (see P1.8.1) +4. **Dashboard Config Panel** โ€” Airtable-style right-side configuration panel for dashboards (data source, layout, widget properties, sub-editors, type definitions) +5. **Console Advanced Polish** โ€” Remaining upgrades for forms, import/export, automation, comments +6. **PWA Sync** โ€” Background sync is simulated only --- @@ -138,14 +139,88 @@ ObjectUI is a universal Server-Driven UI (SDUI) engine built on React + Tailwind - [x] User actions section: Edit records inline, Add/delete records inline, Click into record details - [x] Calendar endDateField support - [x] i18n for all 11 locales (en, zh, ja, de, fr, es, ar, ru, pt, ko) -- [x] **Live preview: ViewConfigPanel changes sync in real-time to all list types (Grid/Kanban/Calendar/Timeline/Gallery/Map)** - - `showSort` added to `ObjectViewSchema` and propagated through plugin-view - - Appearance properties (`rowHeight`, `densityMode`, `color`, etc.) flow through `renderListView` schema - - `gridSchema` in plugin-view includes `striped`/`bordered` from active view config - - Plugin `renderContent` passes `rowHeight`, `densityMode`, `groupBy` to `renderListView` schema - - All `useMemo` dependency arrays expanded to cover full view config +- [ ] **Live preview: ViewConfigPanel changes sync in real-time to all list types (Grid/Kanban/Calendar/Timeline/Gallery/Map)** _(partially complete โ€” see P1.8.1 gap analysis below)_ + - โœ… `showSort` added to `ObjectViewSchema` and propagated through plugin-view (Grid only) + - โœ… Appearance properties (`rowHeight`, `densityMode`) flow through `renderListView` schema for all view types + - โœ… `gridSchema` in plugin-view includes `striped`/`bordered` from active view config (Grid only) + - โœ… Plugin `renderContent` passes `rowHeight`, `densityMode`, `groupBy` to `renderListView` schema + - โœ… `useMemo` dependency arrays expanded to cover full view config + - โš ๏ธ `showSort`/`showSearch`/`showFilters` only wired to Grid โ€” not propagated to Kanban/Calendar/Timeline/Gallery/Map/Gantt + - โš ๏ธ `striped`/`bordered` only applied via `gridSchema` โ€” not passed to non-grid views through `renderListView` + - โš ๏ธ `generateViewSchema` sets `showSearch: false` unconditionally for all non-grid types + - โš ๏ธ Console `renderListView` callback does not pass `showSort`/`showSearch`/`showFilters`/`striped`/`bordered` to `fullSchema` + - โš ๏ธ No per-view-type integration tests verifying config properties reach non-grid renderers - [ ] Conditional formatting rules +### P1.8.1 Live Preview โ€” Gap Analysis & Phased Remediation + +> **Ref:** Issue [#711](https://github.com/objectstack-ai/objectui/issues/711) โ€” Right-side view config panel changes not syncing in real-time to all list types. + +**Current Config Property Propagation Matrix:** + +| Property | Grid | Kanban | Calendar | Timeline | Gallery | Map | Gantt | +|----------|:----:|:------:|:--------:|:--------:|:-------:|:---:|:-----:| +| `showSearch` | โœ… | โŒ | โŒ | โŒ | โŒ | โŒ | โŒ | +| `showSort` | โœ… | โŒ | โŒ | โŒ | โŒ | โŒ | โŒ | +| `showFilters` | โœ… | โŒ | โŒ | โŒ | โŒ | โŒ | โŒ | +| `rowHeight` | โœ… | โœ… | โœ… | โœ… | โœ… | โœ… | โœ… | +| `densityMode` | โœ… | โœ… | โœ… | โœ… | โœ… | โœ… | โœ… | +| `striped` | โœ… | โŒ | โŒ | โŒ | โŒ | โŒ | โŒ | +| `bordered` | โœ… | โŒ | โŒ | โŒ | โŒ | โŒ | โŒ | +| `groupBy` | N/A | โœ… | N/A | N/A | N/A | N/A | N/A | +| `color` | โœ… | โŒ | โŒ | โŒ | โŒ | โŒ | โŒ | +| Type-specific options | โœ… | โœ… | โœ… | โœ… | โœ… | โœ… | โœ… | + +**Root Causes:** +1. **`generateViewSchema` (plugin-view):** Hardcodes `showSearch: false` for non-grid views; does not propagate `showSort`/`showFilters`/`striped`/`bordered`/`color` from `activeView` +2. **Console `renderListView`:** Omits `showSort`/`showSearch`/`showFilters`/`striped`/`bordered` from the `fullSchema` passed to `ListView` +3. **`NamedListView` type:** Does not declare `showSearch`/`showSort`/`showFilters`/`striped`/`bordered`/`color` as first-class properties +4. **No per-view-type integration tests:** Tests verify config reaches the `ViewConfigPanel` switch, but not that non-grid renderers actually receive and apply the properties + +**Phase 1 โ€” Grid/Table View (baseline, already complete):** +- [x] `gridSchema` includes `striped`/`bordered` from `activeView` +- [x] `showSort`/`showSearch`/`showFilters` passed via `ObjectViewSchema` +- [x] `useMemo` dependency arrays cover all grid config + +**Phase 2 โ€” Kanban Live Preview:** +- [ ] Propagate `showSort`/`showSearch`/`showFilters` through `generateViewSchema` kanban branch +- [ ] Pass `color`/`striped`/`bordered` in `renderContent` โ†’ `renderListView` for kanban +- [ ] Ensure `groupBy` config changes reflect immediately (currently โœ… via `renderListView`) +- [ ] Add integration test: ViewConfigPanel kanban config change โ†’ Kanban renderer receives updated props + +**Phase 3 โ€” Calendar Live Preview:** +- [ ] Propagate `showSort`/`showSearch`/`showFilters` through `generateViewSchema` calendar branch +- [ ] Pass `filter`/`sort`/appearance properties to calendar renderer in real-time +- [ ] Verify `startDateField`/`endDateField` config changes trigger re-render via `useMemo` deps +- [ ] Add integration test: ViewConfigPanel calendar config change โ†’ Calendar renderer receives updated props + +**Phase 4 โ€” Timeline/Gantt Live Preview:** +- [ ] Propagate `showSort`/`showSearch`/`showFilters` through `generateViewSchema` timeline/gantt branches +- [ ] Pass appearance properties (`color`, `striped`, `bordered`) through `renderListView` schema +- [ ] Ensure `dateField`/`startDateField`/`endDateField` config changes trigger re-render +- [ ] Add integration tests for timeline and gantt config sync + +**Phase 5 โ€” Gallery & Map Live Preview:** +- [ ] Propagate `showSort`/`showSearch`/`showFilters` through `generateViewSchema` gallery/map branches +- [ ] Pass appearance properties through `renderListView` schema for gallery/map +- [ ] Ensure gallery `imageField`/`titleField` and map `locationField`/`zoom`/`center` config changes trigger re-render +- [ ] Add integration tests for gallery and map config sync + +**Phase 6 โ€” Data Flow & Dependency Refactor:** +- [ ] Add `showSearch`/`showSort`/`showFilters`/`striped`/`bordered`/`color` to `NamedListView` type in `@object-ui/types` +- [ ] Update Console `renderListView` to pass all config properties in `fullSchema` +- [ ] Audit all `useMemo`/`useEffect` dependency arrays in `plugin-view/ObjectView.tsx` for missing `activeView` sub-properties +- [ ] Remove hardcoded `showSearch: false` from `generateViewSchema` โ€” use `activeView.showSearch ?? schema.showSearch` instead + +**Phase 7 โ€” End-to-End Integration Tests:** +- [ ] Per-view-type test: Grid config sync (showSort, showSearch, showFilters, striped, bordered) +- [ ] Per-view-type test: Kanban config sync (groupBy, color, showSearch) +- [ ] Per-view-type test: Calendar config sync (startDateField, endDateField, showFilters) +- [ ] Per-view-type test: Timeline/Gantt config sync (dateField, appearance) +- [ ] Per-view-type test: Gallery config sync (imageField, titleField, appearance) +- [ ] Per-view-type test: Map config sync (locationField, zoom, center, appearance) +- [ ] Cross-view-type test: Switch view type in ViewConfigPanel โ†’ verify config properties transfer correctly + ### P1.10 Console โ€” Dashboard Config Panel > Airtable-style right-side configuration panel for dashboards. Phased rollout from shared infrastructure to full type-safe editing. @@ -301,6 +376,8 @@ ObjectUI is a universal Server-Driven UI (SDUI) engine built on React + Tailwind | Airtable UX bar is high | Focus on Grid + Kanban + Form triad first; defer Gallery/Timeline polish | | PWA real sync complexity | Keep simulated sync as fallback; real sync behind feature flag | | Performance regression | Performance budgets in CI, 10K-record benchmarks | +| View config live preview dependency chain breakage | `generateViewSchema` hardcodes non-grid defaults; per-view-type integration tests required (see P1.8.1) | +| Config property type gaps (`NamedListView` missing fields) | Add first-class properties to `@object-ui/types`; use Zod schema to validate at runtime | --- @@ -312,6 +389,6 @@ ObjectUI is a universal Server-Driven UI (SDUI) engine built on React + Tailwind --- -**Roadmap Status:** ๐ŸŽฏ Active โ€” AppShell ยท Designer Interaction ยท Dashboard Config Panel ยท Airtable UX Parity +**Roadmap Status:** ๐ŸŽฏ Active โ€” AppShell ยท Designer Interaction ยท View Config Live Preview Sync (P1.8.1) ยท Dashboard Config Panel ยท Airtable UX Parity **Next Review:** March 15, 2026 **Contact:** hello@objectui.org | https://github.com/objectstack-ai/objectui