Last Updated: February 20, 2026 (L3 Development — Phases 11-13 Complete, Phase 19 L1 Complete, Phase 20 Inline ViewConfigPanel) Current Version: v2.0.0 Target Version: v2.1.0 (Next Minor) Spec Alignment: @objectstack/spec v3.0.8 Bootstrap (Phase 0): ✅ Complete Phases 1-5: ✅ Complete Phase 6 (Real-Time): ✅ L2 Complete — PresenceAvatars integrated, conflict resolution wired to reconnection Phase 7 (Performance): ✅ Complete Phase 8 (PWA):
⚠️ Core complete, background sync simulated only Phase 9 (NavigationConfig): ✅ Complete Phase 10 (L1): ✅ Complete — Data Interaction Foundation Phase 11 (L1+L2+L3): ✅ L3 Complete — Split-pane, gradient coloring, formula bar, group reordering, cell range copy-paste Phase 12 (L1+L2+L3): ✅ L3 Complete — Inline related records, rich text comments, diff view, relationship graph, point-in-time restore Phase 13 (L1+L2+L3): ✅ L3 Complete — Inline quick-add editing, card templates, column widths, cross-swimlane movement Phase 14 (L1+L2): ✅ L2 Complete — Multi-file upload with validation, URL prefill Phase 15 (L1+L2): ✅ L2 Complete — Import preview with error handling, password/expiration Phase 16 (L1+L2): ✅ L2 Complete — Batch undo, persistent stack, toast UI Phase 17 (L1+L2): ✅ L2 Complete — Thread resolution, notification preferences, activity feed Phase 18 (L1+L2): ✅ L2 Complete — Conditional triggers, multi-step actions Phase 19 (L1): ✅ L1 Complete — Unified NavigationItem model, NavigationArea support, AppSidebar Area Switcher All L1 Development: ✅ Complete — All phases through 19 have L1 foundation implemented All L2 Development: ✅ Complete — All phases through 18 have L2 production features implemented Phases 11-13 L3: ✅ Complete — Grid excellence, record detail, and kanban views fully implemented through L3
The ObjectStack Console is the reference enterprise management frontend for the ObjectStack platform. It renders a fully interactive admin interface — objects, views, dashboards, reports, pages, and workflows — from JSON metadata alone, requiring zero custom pages.
"One JSON Config → Full Enterprise Console"
The Console is the canonical proof that ObjectUI's Server-Driven UI (SDUI) engine can power production-grade enterprise management software: CRMs, ERPs, project trackers, HR systems, and more — all from metadata.
| Goal | Metric | Target |
|---|---|---|
| Full SDUI | % of UI driven by JSON schema | 100% |
| Spec Compliance | @objectstack/spec v3.0.0 coverage | 100% |
| Performance | Largest Contentful Paint (LCP) | < 600ms |
| Bundle Size | Production JS (gzipped) | < 150KB |
| Test Coverage | Line coverage | > 80% |
| Accessibility | WCAG 2.1 AA compliance | 100% |
┌──────────────────────────────────────────────────────────┐
│ ObjectStack Console │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ App Shell (Layout) │ │
│ │ ┌──────────┐ ┌──────────────────────────────────┐ │ │
│ │ │ Sidebar │ │ Main Content │ │ │
│ │ │ ─────── │ │ ┌──────────────────────────┐ │ │ │
│ │ │ AppSwtch │ │ │ Header / Breadcrumbs │ │ │ │
│ │ │ NavTree │ │ ├──────────────────────────┤ │ │ │
│ │ │ UserMenu │ │ │ │ │ │ │
│ │ │ │ │ │ View Renderer │ │ │ │
│ │ │ │ │ │ (Grid/Kanban/Calendar/ │ │ │ │
│ │ │ │ │ │ Timeline/Chart/Map) │ │ │ │
│ │ │ │ │ │ │ │ │ │
│ │ │ │ │ ├──────────────────────────┤ │ │ │
│ │ │ │ │ │ CRUD Dialog / Drawer │ │ │ │
│ │ └──────────┘ │ └──────────────────────────┘ │ │ │
│ │ └──────────────────────────────────┘ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Core Infrastructure │ │
│ │ SchemaRendererProvider │ ExpressionEngine │ │
│ │ DataSource (Adapter) │ ActionRunner │ │
│ │ Plugin Registry │ Theme / Branding │ │
│ └─────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────┘
| Layer | Technology | Purpose |
|---|---|---|
| Runtime | React 19+ | Component rendering |
| Routing | React Router v7 | Multi-app SPA routing |
| Styling | Tailwind CSS 4 + Shadcn UI | Utility-first design system |
| State | Zustand + React Context | Global and scoped state |
| Data | @object-ui/data-objectstack | Server communication |
| Rendering | @object-ui/react (SchemaRenderer) | JSON → Component |
| Mocking | MSW (Mock Service Worker) | Browser-based API simulation |
| Build | Vite 6 | Development & production build |
| Testing | Vitest + React Testing Library | Unit & integration tests |
@object-ui/console
├── @object-ui/react (SchemaRenderer, hooks)
├── @object-ui/components (Shadcn primitives)
├── @object-ui/layout (AppShell, Sidebar)
├── @object-ui/types (TypeScript interfaces)
├── @object-ui/core (ActionRunner, ExpressionEvaluator)
├── @object-ui/fields (Field renderers)
├── @object-ui/data-objectstack (API adapter)
├── @object-ui/plugin-view (ObjectView)
├── @object-ui/plugin-form (ObjectForm)
├── @object-ui/plugin-grid (DataGrid)
├── @object-ui/plugin-kanban (Kanban board)
├── @object-ui/plugin-calendar(Calendar view)
├── @object-ui/plugin-gantt (Gantt chart)
├── @object-ui/plugin-charts (Chart views)
├── @object-ui/plugin-list (ListView delegation)
├── @object-ui/plugin-detail (Record detail)
├── @object-ui/plugin-dashboard(Dashboard renderer)
├── @object-ui/plugin-report (Report viewer/builder)
├── @object-ui/plugin-markdown (Markdown pages)
└── @object-ui/plugin-timeline(Timeline view)
Core Application:
- ✅ Multi-app routing (
/apps/:appName/*) - ✅ App switcher dropdown in sidebar
- ✅ Dynamic navigation tree (object, group, page, dashboard, report, url)
- ✅ Expression-based visibility for navigation items (
evaluateVisibility+ExpressionProvider) - ✅ Command palette (
⌘+K) for quick navigation - ✅ Per-app branding (logo, colors, favicon) via
AppShellbranding prop - ✅ Dark/light/system theme toggle
- ✅ Error boundary per route
- ✅ Connection status monitoring
- ✅ Keyboard shortcuts dialog
- ✅ Onboarding walkthrough
- ✅ Drag-and-drop sidebar reordering
- ✅ Favorites and recent items
Data Layer:
- ✅ Official
@object-ui/data-objectstackadapter (ObjectStackAdapter) - ✅ Auto-reconnect with exponential backoff
- ✅ Metadata caching (ETag-based)
- ✅ MSW browser-based mock server
- ✅ Runtime metadata loading via
MetadataProvider→client.meta.getItems()(replaces static config)
Object Views:
- ✅ Plugin-based ObjectView (grid, kanban, calendar, timeline, chart, map, gantt, gallery)
- ✅ View switcher (multi-view tabs, Airtable-style)
- ✅ Search, filter, sort UI
- ✅ Record drawer preview (Sheet)
- ✅ CRUD dialog (create/edit via ModalForm — unified modal form entry)
- ✅ Metadata inspector (developer tool, design mode)
- ✅ Schema-driven toolbar actions (
objectDef.actions[]) - ✅ Real-time data refresh via
useRealtimeSubscription
Pages & Dashboards:
- ✅ Dashboard renderer with chart widgets
- ✅ Report viewer with builder mode (dynamic fields from object schema)
- ✅ Custom page renderer (SchemaRenderer)
- ✅ Record detail page
- ✅ View designer page (save persisted via API)
- ✅ Search results page
Expression Engine:
- ✅
ExpressionProviderwith user/app/data context - ✅
evaluateVisibilityfor boolean, string, and template expressions - ✅ Expression-based field filtering in CRUD dialog
- ✅ Expression-based navigation item visibility (
visible,visibleOn)
Action System:
- ✅
useObjectActionshook with create/delete/navigate/refresh handlers, wired toActionRunnerviauseActionRunner - ✅
ActionRunner.execute(ActionDef)fully implemented (717 lines) with script, url, modal, flow, api, navigation action types - ✅ Toast notifications via Sonner
- ✅ Confirmation dialogs for destructive actions
- ✅ Custom toolbar actions from schema (
action.location === 'list_toolbar') dispatched through ActionRunner ⚠️ CRUD dialog inApp.tsxstill uses inlineonSuccess/onCancelcallbacks instead ofActionDef[]
Internationalization:
- ✅
@object-ui/i18nintegration withI18nProvider - ✅
useObjectTranslationhook used in components - ✅
LocaleSwitchercomponent for runtime language switching - ✅ 10 language packs (en, zh, ja, ko, de, fr, es, pt, ru, ar)
RBAC & Permissions:
- ✅
usePermissionshook from@object-ui/permissions - ✅ CRUD button gating (
can(objectName, 'create')) - ✅ Navigation item permission checks (
requiredPermissions)
Real-Time:
- ✅
useRealtimeSubscriptionfrom@object-ui/collaboration - ✅ Auto-refresh grid/views on data change events
- ✅
PresenceAvatarsintegrated into AppHeader (global) and RecordDetailView (per-record)
Mobile & PWA:
- ✅
MobileProviderwith PWA config - ✅ Responsive layout (mobile bottom tab bar, edge swipe)
- ✅ Touch-friendly touch targets (44px)
Performance:
- ✅ Code splitting via
React.lazyfor routes - ✅ Chunk splitting (vendor-react, vendor-radix, plugins-core, etc.)
- ✅ Gzip + Brotli compression
- ✅ Critical chunk preloading
- ✅ Performance dashboard (dev mode)
NavigationConfig:
- ✅ All 8 view plugins support
NavigationConfig(grid, list, view, kanban, calendar, timeline, gantt, map) - ✅
useNavigationOverlayhook +NavigationOverlaycomponent pattern - ✅ 7 navigation modes (page, drawer, modal, split, popover, new_window, none)
Testing:
- ✅ 315 test files covering core flows, plugins, hooks, and components
- ✅ MSW server-side mock for tests
- ✅ Plugin integration tests
- ✅ Expression visibility tests
- ✅ Accessibility and WCAG contrast tests
Authentication:
- ✅
AuthGuard+ConditionalAuthWrapper - ✅ Login, Register, Forgot Password pages
- ✅ System admin pages (users, orgs, roles, audit log, profile)
- ✅ System admin pages CRUD via
dataSource.find/create/delete(API integration)
| # | Gap | Status | Resolution |
|---|---|---|---|
| G1 | Expression engine not fully wired | ✅ | ExpressionProvider + evaluateVisibility wired into navigation, form fields, and CRUD dialog |
| G2 | Action system uses any types |
✅ | ActionRunner.execute(ActionDef) fully typed with 717-line implementation; useActionRunner hook in @object-ui/react |
| G3 | DataSource missing metadata API | ✅ | getView/getApp/getPage exist on adapter AND console fetches via MetadataProvider at runtime |
| G4 | No i18n support | ✅ | 10 language packs + LocaleSwitcher + useObjectTranslation |
| G5 | No RBAC integration | ✅ | usePermissions gating CRUD buttons and navigation items |
| G6 | No real-time updates | ✅ | useRealtimeSubscription auto-refreshes views; PresenceAvatars integrated into AppHeader and RecordDetailView; useConflictResolution wired to ObjectView reconnection flow |
| G7 | No offline support / PWA | MobileProvider with PWA manifest; background sync queue simulated only (no real server sync) |
|
| G8 | Bundle size 200KB+ | ✅ | Code splitting (15+ manual chunks), compression, preloading |
| G9 | NavigationConfig incomplete | ✅ | All 8 view plugins support NavigationConfig with 7 modes |
| G10 | System admin pages stub-only | ✅ | All 4 system pages wired to dataSource.find/create/delete via useAdapter() |
| G11 | Collaboration data hardcoded | ✅ | Presence/activity/comments now fetched from API; fallback to defaults when API unavailable |
| G12 | ReportBuilder uses mock fields | ✅ | availableFields derived from object schema via useMetadata().objects |
| G13 | ViewDesigner save not persisted | ✅ | handleSave calls dataSource.create/update('sys_view', config) |
| G14 | View add/edit navigates to 404 | ✅ | Fixed relative navigation in ObjectView (added { relative: 'path' } to all view designer navigate calls). Fixes #628 |
Origin: Consolidated from DEVELOPMENT_PLAN.md (10 sub-phases, Feb 7-13 2026).
These were the initial tasks to bring the console prototype to production-quality architecture.
| Sub-Phase | Description | Status | Notes |
|---|---|---|---|
| 0.1 | English-Only Codebase | ✅ Done | All Chinese strings replaced with English; i18n keys used |
| 0.2 | Plugin Registration | ✅ Done | 11 plugins registered in main.tsx |
| 0.3 | Config Alignment (defineStack()) |
✅ Done | defineStack() from spec used; as any casts removed with typed resolveDefault<ObjectStackDefinition>() helper |
| 0.4 | Data Layer Upgrade | ✅ Done | ObjectStackAdapter integrated + ConnectionStatus; metadata fetched at runtime via MetadataProvider |
| 0.5 | Schema-Driven Architecture | ✅ Done | ObjectView delegates to plugin-view with ViewSwitcher; Filter/Sort delegated to plugins |
| 0.6 | Developer Experience | ✅ Done | Shared MetadataInspector, Error Boundaries, 315 test files |
| 0.7 | MSW Runtime Fixes | ✅ Done | MSW properly integrated via startMockServer() in bootstrap; legacy workarounds cleaned up |
| 0.8 | Layout System | ✅ Done | Branding/theming via AppShell, mobile-responsive layout |
| 0.9 | Navigation & Routing | ✅ Done | Deep-links, ⌘+K command palette, expression-based visibility |
| 0.10 | Action System (Foundation) | ✅ Done | ActionRunner.execute(ActionDef) fully implemented; useActionRunner hook wired into console |
Remaining items to close Phase 0:
- Remove
as anycast inobjectstack.shared.ts— replaced with typedresolveDefault<ObjectStackDefinition>()helper andParameters<typeof defineStack>[0]
Goal: Make visible, disabled, hidden, readOnly expressions fully functional across all console components.
Status: ✅ Complete — ExpressionProvider + evaluateVisibility wired into navigation items, CRUD dialog fields, and sidebar. Expression context propagates user/app/data. Unit tests added.
| Task | Description | Status |
|---|---|---|
| 1.1 | Wire expression evaluation into ObjectView | ✅ Done (evaluateVisibility in App.tsx CRUD dialog) |
| 1.2 | Add disabled expression evaluation in CRUD Dialog fields |
✅ Done (field filtering via evaluateVisibility) |
| 1.3 | Enrich expression context with real user session data | ✅ Done (ExpressionProvider in App.tsx with auth user) |
| 1.4 | Add readOnly expression support in PageView sections |
✅ Done (via ExpressionProvider context) |
| 1.5 | Unit tests for expression evaluation in navigation | ✅ Done (ExpressionVisibility.test.tsx) |
Acceptance Criteria:
- Navigation items hide/show based on
visible: "${user.role === 'admin'}"expressions - Form fields disable based on
disabled: "${data.status === 'closed'}"expressions - All expression evaluations are covered by tests
Goal: Unify the action system and make ActionRunner production-ready with typed dispatch, toast notifications, dialog confirmations, and redirect handling.
Status: ✅ Complete — ActionRunner.execute(ActionDef) fully implemented (717 lines) with script, url, modal, flow, api, navigation action types. useActionRunner hook wires it into console via useObjectActions. Custom toolbar actions dispatch through ActionRunner. CRUD dialog migrated to ActionDef[] with crud_success and dialog_cancel handlers dispatched through ActionRunner.
| Task | Description | Status |
|---|---|---|
| 2.1 | Canonical ActionDef type | ✅ Done (fully typed ActionDef interface in ActionRunner.ts) |
| 2.2 | Type ActionRunner.execute() with ActionDef |
✅ Done (line 249: async execute(action: ActionDef): Promise<ActionResult>) |
| 2.3 | Toast action handler (Sonner) | ✅ Done (in useObjectActions) |
| 2.4 | Dialog confirmation action handler | ✅ Done (confirmText in delete flow) |
| 2.5 | Redirect result handling | ✅ Done (navigate handler in useObjectActions) |
| 2.6 | Wire action buttons into ObjectView toolbar | ✅ Done (objectDef.actions[] rendering) |
| 2.7 | Bulk action support | ✅ Done (multi-row checkbox selection in data-table + ObjectGrid selectable prop) |
| 2.8 | Custom toolbar actions from schema | ✅ Done (action.location === 'list_toolbar' dispatched via actions.execute(action)) |
| 2.9 | Migrate CRUD dialog to ActionDef[] | ✅ Done |
Goal: Add getView, getApp, getPage methods to the DataSource interface so the console can fetch UI definitions from the server instead of using static config.
Status: ✅ Complete — All three methods exist on DataSource interface and are implemented in ObjectStackAdapter with metadata caching. Console fetches metadata at runtime via MetadataProvider which calls adapter.getClient().meta.getItems(). MSW mock server intercepts these API calls during development.
| Task | Description | Status |
|---|---|---|
| 3.1 | getView(objectName, viewId) on DataSource |
✅ Done |
| 3.2 | getApp(appId) on DataSource |
✅ Done |
| 3.3 | getPage(pageId) on DataSource |
✅ Done |
| 3.4 | Implement in ObjectStackAdapter |
✅ Done (with MetadataCache) |
| 3.5 | Metadata cache layer (TTL + ETag) | ✅ Done |
| 3.6 | Console: fetch app config from server | ✅ Done (MetadataProvider calls client.meta.getItems() at runtime) |
| 3.7 | Console: fallback to static config | ✅ Done (MSW uses objectstack.shared.ts as mock data source) |
| 3.8 | MSW: mock metadata endpoints | ✅ Done |
Goal: Full internationalization support — all UI text externalized, 10+ language packs, RTL layout.
Status: ✅ Complete — @object-ui/i18n integrated with I18nProvider, 10 language packs, LocaleSwitcher component, useObjectTranslation hook used across components.
| Task | Description | Status |
|---|---|---|
| 4.1 | Integrate @object-ui/i18n package |
✅ Done (I18nProvider in main.tsx) |
| 4.2 | Extract strings to translation keys | ✅ Done (useObjectTranslation in components) |
| 4.3 | Language switcher in user menu | ✅ Done (LocaleSwitcher component) |
| 4.4 | Chinese (zh) language pack | ✅ Done (packages/i18n/src/locales/zh.ts) |
| 4.5 | Japanese (ja) language pack | ✅ Done (packages/i18n/src/locales/ja.ts) |
| 4.6 | RTL layout for Arabic | ✅ Done (ar.ts locale) |
| 4.7 | Date/number format localization | ✅ Done (via i18n utils) |
Acceptance Criteria:
- All UI text rendered via
t()translation function - Language can be switched at runtime without page reload
- RTL layout works correctly for Arabic/Hebrew
- Date formats adapt to locale (e.g., DD/MM/YYYY vs MM/DD/YYYY)
Goal: Integrate object-level, field-level, and row-level permissions into the console.
Status: @object-ui/permissions package provides usePermissions hook. Integrated into ObjectView (CRUD button gating) and AppSidebar (navigation item permission checks). Row-level security has client-side types (DataScopeManager) but no actual filtering applied (server-side enforcement assumed).
| Task | Description | Status |
|---|---|---|
| 5.1 | usePermissions hook |
✅ Done (@object-ui/permissions) |
| 5.2 | Gate app visibility in sidebar | ✅ Done |
| 5.3 | Gate navigation items by requiredPermissions |
✅ Done (AppSidebar.tsx) |
| 5.4 | Gate CRUD buttons by permissions | ✅ Done (can(objectName, 'create')) |
| 5.5 | Gate field visibility by permissions | ✅ Done (useFieldPermissions) |
| 5.6 | Row-level security | DataScopeManager types only) |
| 5.7 | Permission-denied fallback UI | ✅ Done (PermissionGuard) |
| 5.8 | Integration with ObjectStack RBAC API | ✅ Done |
| 5.9 | Admin auto-design mode (no toggle) | ✅ Done — design tools (Edit/Add View, Metadata Inspector) auto-visible for isAdmin users; non-admin users see no design entry. Fixes #628 |
Goal: Live data updates via WebSocket/SSE — when a record changes on the server, the console updates immediately.
Status: ✅ L2 Complete — @object-ui/collaboration provides useRealtimeSubscription, usePresence, and useConflictResolution. All three are integrated: auto-refresh on data changes, PresenceAvatars in AppHeader and RecordDetailView, and useConflictResolution wired into ObjectView reconnection flow with server-wins auto-resolve strategy.
| Task | Description | Status |
|---|---|---|
| 6.1 | WebSocket transport | ✅ Done (useRealtimeSubscription) |
| 6.2 | Subscribe to object change events | ✅ Done (channel: object:${name}) |
| 6.3 | Auto-refresh views on data change | ✅ Done (ObjectView.tsx refreshKey) |
| 6.4 | Presence indicators | ✅ Done (PresenceAvatars integrated into AppHeader and RecordDetailView) |
| 6.5 | Optimistic updates | TransactionManager) but no actual state application (server-side enforcement assumed) |
| 6.6 | Conflict resolution UI | ✅ Done (useConflictResolution wired to ObjectView reconnection flow with server-wins auto-resolve) |
Goal: Reduce bundle size, achieve fast LCP, and ensure smooth scrolling with large datasets.
Status: ✅ Complete — Route-based code splitting, vendor chunk splitting, Gzip + Brotli compression, critical chunk preloading, and performance dashboard.
| Task | Description | Status |
|---|---|---|
| 7.1 | Code-split plugins (lazy load) | ✅ Done (React.lazy for routes) |
| 7.2 | Virtual scrolling for grid | ✅ Done (via plugin-grid) |
| 7.3 | Memoize schema computations | ✅ Done (useMemo in ObjectView) |
| 7.4 | Tree-shake unused icons | ✅ Done (chunk splitting) |
| 7.5 | Service worker for caching | ✅ Done (PWA manifest + sw) |
| 7.6 | Skeleton loading states | ✅ Done (LoadingScreen, skeletons) |
| 7.7 | Prefetch adjacent pages | ✅ Done (critical chunk preloading) |
Goal: Make the console installable as a PWA with offline data access.
Status: MobileProvider with PWA config, manifest.json, viewport-fit=cover for notch support, responsive mobile layout. However, background sync queue only simulates server sync (no real backend integration), and conflict resolution on reconnection is not wired into the console.
| Task | Description | Status |
|---|---|---|
| 8.1 | PWA manifest and service worker | ✅ Done (manifest.json, MobileProvider, serviceWorker.ts) |
| 8.2 | Offline data storage | ✅ Done (adapter caching) |
| 8.3 | Background sync queue | useOffline.queueMutation()), but server sync is simulated only |
| 8.4 | Offline indicator in header | ✅ Done (ConnectionStatus) |
| 8.5 | Conflict resolution on reconnection | useConflictResolution) but not wired to reconnection flow in console |
Goal: Implement full ViewNavigationConfig support across all view plugins.
Status: ✅ Complete — All 8 view plugins support NavigationConfig via useNavigationOverlay hook + NavigationOverlay component pattern. All 7 navigation modes supported (page, drawer, modal, split, popover, new_window, none).
Compliant Plugins (8/8):
- ✅ plugin-grid, plugin-list, plugin-view, plugin-kanban, plugin-calendar, plugin-timeline, plugin-gantt, plugin-map
| Task | Description | Status |
|---|---|---|
| 9.1 | plugin-view uses useNavigationOverlay hook |
✅ Done |
| 9.2 | plugin-kanban NavigationConfig support | ✅ Done |
| 9.3 | plugin-calendar NavigationConfig support | ✅ Done |
| 9.4 | plugin-timeline NavigationConfig support | ✅ Done |
| 9.5 | plugin-gantt NavigationConfig support | ✅ Done |
| 9.6 | plugin-map NavigationConfig support | ✅ Done |
| 9.7 | Schema types updated | ✅ Done |
| 9.8 | Integration tests for navigation modes | ✅ Done |
| 9.9 | Documentation updated | ✅ Done |
Reference:
- Hook:
packages/react/src/hooks/useNavigationOverlay.ts - Component:
packages/components/src/custom/navigation-overlay.tsx
Goal: Implement core data interaction features required for v1.0 GA — file upload, related record lookup, export, ActionEngine, and server-driven metadata loading.
Status: ✅ L1 Complete — All v1.0 blocker features implemented and tested.
Approach: Progressive implementation with L1 (Foundation) → L2 (Production) → L3 (Excellence) maturity stages. Each feature starts with a minimal viable implementation (L1), then evolves to production-ready quality (L2), and optionally to advanced capabilities (L3).
| Maturity Level | Description | Status | Spec Compliance |
|---|---|---|---|
| L1 (Foundation) | Basic file input field with preview in forms. Single file upload with progress indicator. Accepts common file types (images, PDFs, docs). | ✅ Done | FieldMetadata type file + FileUploadField widget |
| L2 (Production) | Drag-and-drop upload zone, multi-file support, file size validation, thumbnail previews, delete uploaded files. | 🔲 Planned | FileFieldMetadata.multiple, maxSize, accept properties |
| L3 (Excellence) | Direct camera/photo capture, image cropping/editing, cloud storage integration, upload resume on failure. | 🔲 Planned | Extended FileFieldMetadata with capture, crop, storage options |
Acceptance Criteria (L1):
- FileUploadField widget renders in ObjectForm for
type: "file"fields - User can select a file from disk via file picker
- Upload progress indicator shows during file transfer
- Preview component displays uploaded file (image thumbnail or file icon)
- File URL stored in record data after successful upload
| Maturity Level | Description | Status | Spec Compliance |
|---|---|---|---|
| L1 (Foundation) | LookupField widget with DataSource-integrated search. Type-ahead search returns matching records. Selected record displayed with primary field. | ✅ Done | FieldMetadata type lookup with referenceObject property |
| L2 (Production) | Advanced search with multiple fields, record preview on hover, quick-create button for related records, multi-select lookup. | 🔲 Planned | LookupFieldMetadata.searchFields, quickCreate, multiple |
| L3 (Excellence) | Dependent lookups (filter options based on other fields), hierarchical lookups (parent-child relationships), lookup result caching. | 🔲 Planned | dependsOn filters, hierarchical mode, caching strategy |
Acceptance Criteria (L1):
- LookupField widget renders for
type: "lookup"fields - Type-ahead search queries DataSource with search term
- Search results display in dropdown with primary field text
- Selected record ID stored in form data
- Selected record name displayed in field after selection
| Maturity Level | Description | Status | Spec Compliance |
|---|---|---|---|
| L1 (Foundation) | CSV/JSON export button on Grid toolbar. Exports visible columns and current filtered/sorted data. | ✅ Done | ObjectGridSchema.exportOptions + ListViewSchema.exportOptions with csv, json formats |
| L2 (Production) | Excel (XLSX) export, PDF export with formatting, export all data (not just visible), custom column selection for export. | 🔲 Planned | exportOptions.formats: ["csv", "xlsx", "json", "pdf"] |
| L3 (Excellence) | Scheduled exports via automation, export templates with custom formatting, email export results, export to cloud storage. | 🔲 Planned | Integration with Phase 18 Automation workflows |
Acceptance Criteria (L1):
- Export button appears in Grid toolbar
- CSV export downloads file with column headers + data rows
- JSON export downloads array of record objects
- Export respects current filters and sort order
- Export includes only visible columns
| Maturity Level | Description | Status | Spec Compliance |
|---|---|---|---|
| L1 (Foundation) | Declarative ActionDef[] → ActionRunner pipeline. Replace callback-based useObjectActions with event-driven dispatch. Support core action types: navigate, create, update, delete, refresh. |
✅ Done | ActionSchema from @objectstack/spec |
| L2 (Production) | Full action type coverage: open_url, show_notification, confirm, execute_workflow, call_api. Conditional actions (enabled, visible expressions). Action chaining (sequential execution). |
🔲 Planned | Complete ActionSchema type union implementation |
| L3 (Excellence) | Custom action handlers (plugin system), action middleware (logging, analytics), undo/redo support for reversible actions. | 🔲 Planned | ActionHandler plugin interface, middleware pipeline |
Acceptance Criteria (L1):
ActionRunner.execute(ActionDef)method implemented in@object-ui/core- CRUD dialog actions defined as
ActionDef[]instead of callbacks - Navigation actions dispatch through ActionRunner
- Toast notifications triggered by action results
- Error handling with user-friendly messages
| Maturity Level | Description | Status | Spec Compliance |
|---|---|---|---|
| L1 (Foundation) | Console fetches app config from server at runtime using DataSource.getApp(), getView(), getPage() methods. Fallback to static config when server unavailable. |
✅ Done | DataSource interface metadata methods |
| L2 (Production) | Metadata caching with ETag support (already implemented in adapter), hot-reload on metadata changes, version compatibility checks. | ✅ Done (Adapter) | MetadataCache in ObjectStackAdapter |
| L3 (Excellence) | Metadata editing UI (admin console), metadata versioning and rollback, A/B testing with metadata variants. | 🔲 Planned | Advanced admin features |
Acceptance Criteria (L1):
- App.tsx fetches app config via
dataSource.getApp(appName)on mount - ObjectView resolves view definitions via
dataSource.getView(objectName, viewId) - Static
objectstack.shared.tsconfig used as fallback when server unreachable - MSW mock server returns metadata from
/api/meta/apps/:appNameendpoint - Console displays loading state during metadata fetch
Success Metrics:
- File upload works in forms with progress indicator
- Lookup field searches related records via DataSource
- Grid export button downloads CSV with current data
- All CRUD actions dispatched through ActionEngine
- Console loads app config from server (not static file)
Goal: Elevate the Grid view to Airtable-level UX with frozen columns, row grouping, conditional formatting, and Excel-like interactions.
Status: ✅ L3 Complete — All L1/L2/L3 features implemented. Split-pane mode, gradient coloring, formula bar, group reordering, and cell range copy-paste all available.
| Maturity Level | Description | Status | Spec Compliance |
|---|---|---|---|
| L1 (Foundation) | Freeze first N columns via frozenColumns prop with sticky positioning. Row height toggle: compact/medium/tall via toolbar button. |
✅ Done | GridConfig.frozenColumns: number, rowHeight: "compact" | "medium" | "tall" |
| L2 (Production) | Freeze multiple columns (user-configurable), persist frozen state per view, auto-scroll to frozen columns. | ✅ Done | GridConfig.frozenColumns array support via useCellClipboard range selection |
| L3 (Excellence) | Split-pane mode (frozen left + scrollable right), diagonal freeze (top-left corner), Excel-like freeze panes UI. | ✅ Done | SplitPaneGrid component with resizable divider and min-width constraints |
| Maturity Level | Description | Status | Spec Compliance |
|---|---|---|---|
| L1 (Foundation) | Native row grouping by single field (not just AG Grid). Expand/collapse groups. Group headers show count. | ✅ Done | ListViewSchema.groupBy: string field name |
| L2 (Production) | Multi-level grouping (nested groups), group aggregations (sum, count, avg), group sorting. | ✅ Done | useGroupedData with AggregationConfig[] parameter — computes sum/count/avg/min/max per group |
| L3 (Excellence) | Drag-and-drop group reordering, group filtering, group-level actions (bulk update group). | ✅ Done | useGroupReorder hook with native HTML5 DnD API for group section reordering |
| Maturity Level | Description | Status | Spec Compliance |
|---|---|---|---|
| L1 (Foundation) | Row background color based on field value. Simple color mapping: status === "urgent" → red background. |
✅ Done | ListViewSchema.conditionalFormatting with row-level rules |
| L2 (Production) | Complex conditional expressions, multiple rules (priority-based), cell-level formatting (not just rows). | ✅ Done | ConditionalFormattingRule.expression property with expression engine evaluation |
| L3 (Excellence) | Gradient coloring (numeric ranges), icon overlays, custom CSS class injection. | ✅ Done | useGradientColor hook maps numeric field values to Tailwind gradient classes (configurable color stops) |
| Maturity Level | Description | Status | Spec Compliance |
|---|---|---|---|
| L1 (Foundation) | Copy single cell to clipboard via Ctrl+C/Cmd+C. Cell focus via tabIndex for keyboard accessibility. | ✅ Done | Clipboard API integration |
| L2 (Production) | Copy-paste cell ranges (multi-select), paste from Excel with delimiter detection, paste into multiple cells. | ✅ Done | useCellClipboard hook with range selection, tab-separated clipboard format, Ctrl+C/V support |
| L3 (Excellence) | Formula bar for editing cell values, drag-fill (Excel-style autofill), keyboard navigation (arrows, Tab, Enter). | ✅ Done | FormulaBar component with f(x) icon, Enter/Escape editing, value confirmation |
Success Metrics:
- User can freeze first column and toggle row height
- Grid rows grouped by field with expand/collapse
- Rows conditionally colored based on status field
- Expression-based conditional formatting evaluates complex conditions
- User can copy cell value to clipboard
- Split-pane mode with resizable divider between frozen and scrollable areas
- Group aggregations (sum, count, avg, min, max) computed per group
- Gradient coloring maps numeric ranges to color scales
- Formula bar allows editing cell values with confirmation
Goal: Enhance record detail pages with prev/next navigation, related records, comments, and activity history.
Status: ✅ L3 Complete — All L1/L2/L3 features implemented. Inline related record creation, rich text comments, diff view, enhanced navigation, relationship graph, comment attachments, and point-in-time restore.
| Maturity Level | Description | Status | Spec Compliance |
|---|---|---|---|
| L1 (Foundation) | Prev/Next buttons in record detail header with position indicator (e.g., "3 of 25"). Navigate through records in current view's result set via recordNavigation schema prop. |
✅ Done | Navigation controls in DetailView via recordNavigation |
| L2 (Production) | Keyboard shortcuts (← / → arrows), preserve scroll position, show current position (e.g., "3 of 25"). | ✅ Done | Arrow key navigation with input field detection to avoid interference |
| L3 (Excellence) | Jump to first/last record, filter within navigation (search while navigating), breadcrumb trail of visited records. | ✅ Done | RecordNavigationEnhanced with First/Last buttons, search-while-navigating, Home/End keyboard shortcuts |
| Maturity Level | Description | Status | Spec Compliance |
|---|---|---|---|
| L1 (Foundation) | RelatedList component renders related records from DataSource. Display as grid or list view. | ✅ Done | RelatedListSchema with relatedObject, relationshipField |
| L2 (Production) | Inline create related record, link existing record, unlink records, filter related records. | ✅ Done | InlineCreateRelated component with Create/Link tabs, search, and compact form |
| L3 (Excellence) | Multi-level related records (nested relationships), related record preview on hover, related record graph view. | ✅ Done | RelationshipGraph SVG-based node-link graph with multi-level concentric layout and clickable nodes |
| Maturity Level | Description | Status | Spec Compliance |
|---|---|---|---|
| L1 (Foundation) | RecordComments component with add/view, timestamp, author display, avatar initials. ActivityTimeline component with field change history, type-specific icons, and color coding. |
✅ Done | CommentEntry with author, text, createdAt. ActivityEntry with type, field, oldValue, newValue. |
| L2 (Production) | Rich text comments (markdown), @mention notifications, comment reactions (emoji), edit/delete comments. | ✅ Done | RichTextCommentInput with markdown toolbar (bold/italic/list/code), @mention autocomplete, preview toggle |
| L3 (Excellence) | Threaded discussions (reply to comment), comment attachments, activity filtering (show only comments / field changes). | ✅ Done | CommentAttachment with drag-and-drop file upload, image thumbnails, file type icons, size display |
| Maturity Level | Description | Status | Spec Compliance |
|---|---|---|---|
| L1 (Foundation) | Display field change history via ActivityTimeline component. Show who changed what field and when with before/after values. |
✅ Done | ActivityEntry type with field change tracking |
| L2 (Production) | Diff view (before/after values), revert to previous version, revision timeline visualization. | ✅ Done | DiffView component with unified and side-by-side modes for string/number/boolean/json/date fields |
| L3 (Excellence) | Point-in-time restore, bulk revert multiple fields, revision approval workflow. | ✅ Done | PointInTimeRestore component with revision timeline, field change preview, snapshot viewer, two-step restore confirmation |
Success Metrics:
- Prev/Next buttons navigate through records in view
- Related records displayed below main record
- Comments posted and displayed on record
- Field change history visible in activity timeline
- Enhanced navigation with First/Last buttons and search-while-navigating
- Inline create/link related records with tabbed UI
- Rich text comments with markdown toolbar and @mention autocomplete
- Diff view shows field changes with added/removed highlighting
- Relationship graph visualizes multi-level record relationships
- Point-in-time restore allows reverting records to previous state
Goal: Close Kanban UX gaps (quick add, cover images, collapse, conditional coloring) and add advanced view features.
Status: ✅ L3 Complete — All L1/L2/L3 features implemented. Inline quick-add editing, card templates, column widths, quick-add reordering, and cross-swimlane movement.
| Maturity Level | Description | Status | Spec Compliance |
|---|---|---|---|
| L1 (Foundation) | Quick Add button at bottom of each Kanban column. Click to add card inline. Cover image field support (show image on card top). | ✅ Done | KanbanConfigSchema.quickAdd, coverImageField |
| L2 (Production) | Inline editing in quick-add (no dialog), image upload for cover field, cover image fit options (cover/contain). | ✅ Done | InlineQuickAdd component with multi-field inline form, auto-focus, Enter/Escape support |
| L3 (Excellence) | Drag to reorder quick-add, batch quick-add (add multiple cards), AI-suggested cover images. | ✅ Done | useQuickAddReorder hook with drag-to-reorder card ordering within columns |
| Maturity Level | Description | Status | Spec Compliance |
|---|---|---|---|
| L1 (Foundation) | Collapse/expand Kanban columns. Collapsed column shows count only. Card conditional coloring (border or background based on field value). | ✅ Done | KanbanConfig.allowCollapse, conditionalFormatting |
| L2 (Production) | Persist collapsed state per user, conditional column visibility (hide empty columns), card badges (priority, tags). | ✅ Done | Collapsed lanes persisted to localStorage per swimlaneField; card badges rendered from KanbanCard.badges[] |
| L3 (Excellence) | Custom column widths, horizontal scroll for many columns, column drag-to-reorder. | ✅ Done | useColumnWidths hook with per-column width overrides, min/max clamping, localStorage persistence |
| Maturity Level | Description | Status | Spec Compliance |
|---|---|---|---|
| L1 (Foundation) | Swimlanes: 2D grouping (columns + rows). Group by second field for horizontal lanes. | ✅ Done | KanbanConfig.swimlaneField property — collapsible swimlane rows with card counts |
| L2 (Production) | Card templates (predefined field values for new cards), swimlane collapse/expand, swimlane aggregations. | ✅ Done | CardTemplates component with dropdown template selection, pre-filled values for InlineQuickAdd |
| L3 (Excellence) | Multi-level swimlanes (nested grouping), swimlane drag-to-reorder, cross-swimlane card movement. | ✅ Done | useCrossSwimlaneMove hook with acceptFrom constraint validation and drag state tracking |
Success Metrics:
- Quick Add button creates cards inline at column bottom
- Cover images display on Kanban cards
- Columns can be collapsed to show count only
- Cards conditionally colored based on priority field
- Swimlanes group cards by second field (2D layout) —
swimlaneFieldproperty with collapsible rows - Inline editing in quick-add with multi-field form (no dialog)
- Card templates pre-fill field values for new cards
- Custom column widths with horizontal scroll support
- Cross-swimlane card movement with constraint validation
- Drag to reorder quick-add cards within columns
Goal: Complete FileUploadField widget, add embeddable standalone forms, and form analytics.
Status: ✅ L2 Partial — L1 foundation complete. L2: Multi-file upload with file size validation and error messages. URL prefill parameters for EmbeddableForm.
| Maturity Level | Description | Status | Spec Compliance |
|---|---|---|---|
| L1 (Foundation) | Drag-and-drop upload zone, upload progress bar, file preview (image/PDF/doc icons), delete uploaded file button. | ✅ Done | Full FileUploadField implementation |
| L2 (Production) | Multi-file upload with individual progress bars, file size/type validation with error messages, thumbnail grid for images. | ✅ Done | FileField supports multiple, maxSize validation with error display |
| L3 (Excellence) | Camera capture for mobile, image cropping/rotation, cloud storage integration (S3, Azure Blob), upload resume on network failure. | 🔲 Planned | Advanced file handling |
| Maturity Level | Description | Status | Spec Compliance |
|---|---|---|---|
| L1 (Foundation) | Standalone form URL (no authentication required). Shareable link for external submissions. Submission creates record in object. | ✅ Done | FormConfig.embeddable, /forms/:formId route |
| L2 (Production) | Prefill URL parameters (?name=John&email=...), custom thank-you page redirect, form branding (logo, colors). |
✅ Done | EmbeddableForm reads URL search params + explicit prefillParams; thankYouPage.redirectUrl with delay |
| L3 (Excellence) | Multi-page forms (wizard steps), conditional form logic (skip fields based on answers), form expiration (time-limited access). | 🔲 Planned | Advanced form features |
| Maturity Level | Description | Status | Spec Compliance |
|---|---|---|---|
| L1 (Foundation) | Submissions dashboard showing form fill rate, completion time, field drop-off. | ✅ Done | Analytics component |
| L2 (Production) | Field-level analytics (most skipped, most errored), submission heatmap (time of day), A/B testing support. | 🔲 Planned | Detailed analytics |
| L3 (Excellence) | Real-time submission monitoring, export submissions as CSV, webhook on form submit. | 🔲 Planned | Advanced monitoring |
Success Metrics:
- FileUploadField supports drag-and-drop + multi-file upload
- Standalone form URL created and shareable
- Prefill URL parameters populate form fields —
EmbeddableFormauto-readswindow.location.search - Form analytics dashboard shows submission metrics
Goal: Data import wizard, universal export across all views, shared view links, and API export endpoints.
Status: ✅ L1 Complete — CSV Import Wizard (packages/plugin-grid/src/ImportWizard.tsx) with 3-step flow (file upload, column mapping, preview & import). Universal export via ObjectGrid and ListView exportOptions. Shared View Links (packages/plugin-view/src/SharedViewLink.tsx) with token generation for read-only URLs.
| Maturity Level | Description | Status | Spec Compliance |
|---|---|---|---|
| L1 (Foundation) | Import CSV/Excel file. Map columns to fields. Validate data types. Create records on import. | ✅ Done | ImportWizard.tsx in packages/plugin-grid/src/ — 3-step wizard |
| L2 (Production) | Preview import (show first 10 rows), error handling (skip invalid rows or stop on error), update existing records (match by unique field). | ✅ Done | Preview shows 10 rows with per-row validation errors, onErrorMode prop supports 'skip' / 'stop' |
| L3 (Excellence) | Import templates (save column mappings), scheduled imports (watch folder), import rollback (undo import). | 🔲 Planned | Enterprise import features |
| Maturity Level | Description | Status | Spec Compliance |
|---|---|---|---|
| L1 (Foundation) | Export button on all view types (Grid, Kanban, Calendar, Gallery). CSV + JSON formats. Export current filtered data. | ✅ Done | ObjectGrid and ListView exportOptions |
| L2 (Production) | Excel (XLSX) with formatting, PDF export with view layout preserved, export all data (bypass pagination). | 🔲 Planned | Advanced export formats |
| L3 (Excellence) | Custom export templates, scheduled exports (daily/weekly email), export to cloud storage (S3, Google Drive). | 🔲 Planned | Enterprise export features |
| Maturity Level | Description | Status | Spec Compliance |
|---|---|---|---|
| L1 (Foundation) | Generate shareable read-only view link. Public URL (no login required). View data only (no edit/delete). | ✅ Done | SharedViewLink.tsx in packages/plugin-view/src/ with token generation |
| L2 (Production) | Password-protected shared links, expiration date for links, view-level permissions (show only certain fields). | SharedViewLink; server-side enforcement planned |
SharedViewLink with password & expiresAt options in onShare callback |
| L3 (Excellence) | Edit permissions in shared link, comment-only access, share analytics (who viewed, when). | 🔲 Planned | Collaborative sharing |
| Maturity Level | Description | Status | Spec Compliance |
|---|---|---|---|
| L1 (Foundation) | REST API endpoint for programmatic export: GET /api/export/:objectName?format=csv. Returns data in specified format. |
🔲 Planned | API export |
| L2 (Production) | GraphQL export query, webhook-triggered exports, bulk export multiple objects. | 🔲 Planned | Advanced API features |
| L3 (Excellence) | Streaming export for large datasets, incremental export (delta sync), export audit log. | 🔲 Planned | Enterprise API features |
Success Metrics:
- CSV import wizard maps columns and creates records
- Export button works on all view types (Grid, Kanban, Calendar, Gallery)
- Shared view link generated and accessible without login
- API export endpoint returns data in CSV/JSON format
Goal: Implement global undo/redo for data operations, record revision history, and time-travel debugging.
Status: ✅ L2 Complete — Global UndoManager with batch operations (pushBatch, popUndoBatch, popRedoBatch), persistent undo stack (saveToStorage/loadFromStorage), and getRedoHistory(). Toast notifications integrated via useGlobalUndo hook with Ctrl+Z/Ctrl+Shift+Z keyboard shortcuts.
| Maturity Level | Description | Status | Spec Compliance |
|---|---|---|---|
| L1 (Foundation) | Global undo/redo for CRUD operations (create, update, delete). Keyboard shortcuts: Ctrl+Z (undo), Ctrl+Shift+Z (redo). Undo stack with max size (e.g., 50 operations). | ✅ Done | UndoManager in @object-ui/core + useGlobalUndo hook in @object-ui/react |
| L2 (Production) | Undo/redo UI (toast notification on undo), batch undo (undo multiple operations at once), undo history panel (show stack). | ✅ Done | Sonner toast on undo/redo; pushBatch, popUndoBatch, popRedoBatch methods; getHistory() + getRedoHistory() for history panel |
| L3 (Excellence) | Persistent undo stack (survives page reload), undo branching (multiple undo paths), undo conflicts (merge or reject). | 🔲 Planned | Advanced undo features |
| Maturity Level | Description | Status | Spec Compliance |
|---|---|---|---|
| L1 (Foundation) | Server-side audit log tracks field changes. Display revision history in record detail page. Show who changed what and when. | 🔲 Planned | Server audit log integration |
| L2 (Production) | Diff view (side-by-side comparison), revert to previous version, revision comments (explain why change was made). | 🔲 Planned | Revision management |
| L3 (Excellence) | Revision approval workflow (changes require approval), revision export (download change history), revision notifications (alert on change). | 🔲 Planned | Enterprise revision features |
| Maturity Level | Description | Status | Spec Compliance |
|---|---|---|---|
| L1 (Foundation) | Developer tool: view operation log (all CRUD operations). Filter by object, user, date. | ✅ Done | globalUndoManager.getHistory() provides operation log |
| L2 (Production) | Replay operations (re-execute operation sequence), operation diff (compare two states), operation export (JSON log). | 🔲 Planned | Advanced debugging |
| L3 (Excellence) | Point-in-time restore (restore object to previous state), operation rollback (undo all operations after timestamp), operation migration (replay operations on different environment). | 🔲 Planned | Enterprise debugging features |
Success Metrics:
- Ctrl+Z undoes last CRUD operation (global UndoManager in @object-ui/core)
- Ctrl+Shift+Z redoes undone operation (useGlobalUndo hook with keyboard shortcuts)
- Record detail shows revision history with diffs
- Developer tool displays operation log (via
globalUndoManager.getHistory())
Goal: Add record-level comments, @mention notifications, activity feed, and threaded discussions.
Status: ✅ L2 Complete — CommentThread from @object-ui/collaboration integrated into console RecordDetailView with thread resolution (resolve/reopen), emoji reactions, and sorting. ActivityFeed sidebar with notification preference filters (toggle by activity type). Presence and activity data now fetched from API (sys_presence, sys_activity). Comments persisted via sys_comment resource. AppHeader falls back to defaults when API is unavailable.
| Maturity Level | Description | Status | Spec Compliance |
|---|---|---|---|
| L1 (Foundation) | Comments component in record detail page. Add comment (plain text), view comment list, display author + timestamp. | ✅ Done (via RecordComments in Phase 12) |
Basic comments in plugin-detail |
| L2 (Production) | Rich text comments (markdown/HTML), edit/delete own comments, comment reactions (emoji), comment sorting (newest/oldest). | ✅ Done | CommentThread has edit/delete, emoji reactions (👍❤️), sort dropdown (newest/oldest), reaction counts; integrated into RecordDetailView |
| L3 (Excellence) | Comment attachments (files, images), comment search, comment export, comment moderation (admin delete). | 🔲 Planned | Advanced comment features |
| Maturity Level | Description | Status | Spec Compliance |
|---|---|---|---|
| L1 (Foundation) | @mention autocomplete in comments. Notify mentioned user (in-app notification). Activity feed in sidebar (show recent activity). | ✅ Done | CommentThread integrated with @mention; ActivityFeed sidebar in apps/console/src/components/ActivityFeed.tsx |
| L2 (Production) | Email notifications for @mentions, notification preferences (enable/disable per activity type), mark notifications as read. | ✅ Partial | ActivityFeed has notification preference filters (toggle by type); email notifications are server-side |
| L3 (Excellence) | Notification grouping (batch similar notifications), notification snooze, notification webhook (send to Slack/Teams). | 🔲 Planned | Enterprise notifications |
| Maturity Level | Description | Status | Spec Compliance |
|---|---|---|---|
| L1 (Foundation) | Reply to comment (threaded discussion). Display thread hierarchy (indent replies). Collapse/expand threads. | ✅ Done | CommentThread with parentId-based threading integrated into console RecordDetailView |
| L2 (Production) | Thread notifications (notify on reply), thread resolution (mark as resolved), thread subscription (follow thread). | ✅ Done | CommentThread has onResolve callback; thread resolution UI (resolve/reopen button) wired into RecordDetailView |
| L3 (Excellence) | Thread export (download discussion), thread permissions (restrict replies), thread AI summary (summarize long threads). | 🔲 Planned | Advanced thread features |
Success Metrics:
- Comments posted on record detail page (via
RecordCommentsin Phase 12) - @mention triggers notification to mentioned user (CommentThread integrated into console)
- Activity feed shows recent comments and changes (ActivityFeed sidebar component)
- Threaded replies display with indentation (CommentThread integrated into console)
Goal: Visual automation builder for trigger-action workflows, leveraging ProcessDesigner from designer phase.
Status: ✅ L2 Complete — AutomationBuilder with conditional triggers (field/operator/value conditions), multi-step sequential/parallel action execution, and AutomationRunHistory. WorkflowDesigner (426 lines) and ProcessDesigner (948 lines, BPMN 2.0) registered in ComponentRegistry.
| Maturity Level | Description | Status | Spec Compliance |
|---|---|---|---|
| L1 (Foundation) | UI for configuring automations: select trigger (record created, field updated), select action (send email, update field). Save automation definition. | ✅ Done | AutomationBuilder.tsx in packages/plugin-workflow/src/ registered in ComponentRegistry |
| L2 (Production) | Conditional triggers (only when field matches value), multi-step actions (action sequence), action parameters (customize action behavior). | ✅ Done | TriggerConfig.conditionField/conditionOperator/conditionValue for field-level conditions; AutomationDefinition.executionMode ('sequential'/'parallel') for multi-step |
| L3 (Excellence) | Automation templates (pre-built workflows), automation testing (dry run), automation analytics (execution count, success rate). | 🔲 Planned | Enterprise automation features |
| Maturity Level | Description | Status | Spec Compliance |
|---|---|---|---|
| L1 (Foundation) | Leverage ProcessDesigner plugin for visual workflow design. Drag-and-drop nodes (trigger, condition, action). Connect nodes to define flow. | ProcessDesigner (948 lines) fully implemented with BPMN 2.0 nodes, auto-layout, undo/redo, minimap, but not connected to automation execution |
@object-ui/plugin-designer registered as 'process-designer' |
| L2 (Production) | Branching logic (if/else conditions), loops (repeat action), error handling (catch errors, retry). | 🔲 Planned | Advanced workflow features |
| L3 (Excellence) | Sub-workflows (call another workflow), parallel execution (run actions in parallel), workflow versioning (save versions, rollback). | 🔲 Planned | Enterprise workflow features |
| Maturity Level | Description | Status | Spec Compliance |
|---|---|---|---|
| L1 (Foundation) | Scheduled triggers (run automation daily/weekly). Webhook actions (HTTP POST on trigger). Run history (show past executions). | AutomationRunHistory component implemented; scheduled triggers and webhooks still planned |
AutomationRunHistory.tsx in packages/plugin-workflow/src/ |
| L2 (Production) | Cron expressions for complex schedules, webhook retry on failure, run history filtering (by status, date). | 🔲 Planned | Advanced execution features |
| L3 (Excellence) | Webhook signature verification, run history export, automation monitoring dashboard (execution metrics). | 🔲 Planned | Enterprise execution features |
Success Metrics:
- Automation created via UI (trigger + action) —
AutomationBuilderwith trigger-action pipeline - ProcessDesigner renders visual workflow (948-line BPMN 2.0 designer implemented)
- Scheduled trigger executes automation daily
- Webhook action sends HTTP POST on trigger
- Run history displays past automation executions (
AutomationRunHistorycomponent)
Goal: Unify the application navigation model around NavigationItem (aligned with @objectstack/spec), introduce Navigation Areas for business-domain partitioning, and deprecate the legacy MenuItem type.
Status: ✅ L1 Complete — Unified NavigationItem type, NavigationArea type, Zod validation schemas, menuItemToNavigationItem transform, AppSchema extended with navigation/areas fields, AppSidebar Area Switcher UI, Spec Compliance tests.
Reference: Issue: 统一应用与导航模型 — aligns with Salesforce Lightning App Builder and Microsoft Power Apps Site Map Designer patterns.
| Maturity Level | Description | Status | Spec Compliance |
|---|---|---|---|
| L1 (Foundation) | Define unified NavigationItem type with all navigation types (object, dashboard, page, report, url, group, separator, action). Add Zod validation. Export from @object-ui/types. Deprecate MenuItem with backward-compatible transform. |
✅ Done | NavigationItem, NavigationArea in packages/types/src/app.ts; NavigationItemSchema, NavigationAreaSchema in packages/types/src/zod/app.zod.ts |
| L2 (Production) | Migrate all Console/CLI consumers from MenuItem to NavigationItem. Remove MenuItem from internal usage. Full spec compliance test coverage. |
🔲 Planned | Deprecate AppSchema.menu in favor of AppSchema.navigation |
| L3 (Excellence) | Server-side NavigationItem validation, auto-migration tooling (CLI command to convert legacy configs). | 🔲 Planned | CLI migration tooling |
| Maturity Level | Description | Status | Spec Compliance |
|---|---|---|---|
| L1 (Foundation) | Add NavigationArea type, extend AppSchema with areas field, AppSidebar area switcher UI, resolved navigation from active area. |
✅ Done | AppSchema.areas?: NavigationArea[]; Area switcher in AppSidebar.tsx |
| L2 (Production) | URL routing update to /apps/:appName/:area/:object, CommandPalette area awareness, area-level RBAC. |
🔲 Planned | Route protocol upgrade |
| L3 (Excellence) | Area-specific branding/theming, area analytics, area templates. | 🔲 Planned | Enterprise area features |
| Maturity Level | Description | Status | Spec Compliance |
|---|---|---|---|
| L1 (Foundation) | Basic NavigationDesigner component: drag-and-drop navigation items, add from object/dashboard/page catalog. | 🔲 Planned | NavigationDesignerProps interface |
| L2 (Production) | Live preview sidebar, icon picker (Lucide), expression editor for visibility, export/import JSON. | 🔲 Planned | Visual editing features |
| L3 (Excellence) | App Manager system page, app templates/cloning, app lifecycle (active/inactive). | 🔲 Planned | Full App Manager |
Success Metrics:
- Unified
NavigationItemtype defined and exported -
NavigationAreatype defined with Zod validation -
menuItemToNavigationItemtransform function -
AppSchemaextended withnavigationandareasfields - AppSidebar Area switcher UI
- Spec compliance tests for unified model and areas (24 tests passing)
- Unit tests for types, Zod schemas, and transform (27 tests passing)
- Full consumer migration from
MenuItemtoNavigationItem - URL routing with area segment
- Visual Navigation Designer component
Re-prioritized (Feb 16, 2026): Features reorganized by progressive maturity stages (L1/L2/L3). Phases 10-18 use "shallow to deep" (由浅入深) approach for incremental development. All L1 development complete as of July 2025.
| Feature | Status | Priority | Phase |
|---|---|---|---|
| Grid view (sort, filter, search) | ✅ Done | — | — |
| Kanban board | ✅ Done | — | — |
| Calendar view | ✅ Done | — | — |
| Timeline view | ✅ Done | — | — |
| Gallery view | ✅ Done | — | — |
| Map view | ✅ Done | — | — |
| Gantt chart | ✅ Done | — | — |
| Chart view | ✅ Done | — | — |
| Inline editing (grid) | ✅ Done | — | — |
| Bulk actions (select + execute) | ✅ Done | — | Phase 2 |
| Column reordering & persistence | ✅ Done | — | Phase 7 |
| Saved filters / views | ✅ Done | — | Phase 3 |
| Export (CSV, JSON) | ✅ Done | 🎯 v1.0 Essential | Phase 10 (L1) |
| Export (Excel, PDF) | 🔲 Planned | Post v1.0 | Phase 11 (L2) |
| Frozen columns | ✅ Done | Post v1.0 | Phase 11 (L1) |
| Row grouping (native) | ✅ Done | Post v1.0 | Phase 11 (L2) |
| Conditional row coloring | ✅ Done | Post v1.0 | Phase 11 (L1) |
| Copy-paste from Excel | ✅ Done | Post v1.0 | Phase 11 (L2) |
| Import (CSV, Excel) | ✅ Done | Post v1.0 | Phase 15 (L1) |
| Feature | Status | Priority | Phase |
|---|---|---|---|
| Create/edit dialog | ✅ Done | — | — |
| Field type mapping | ✅ Done | — | — |
| Record detail page | ✅ Done | — | — |
| Record drawer (sheet) | ✅ Done | — | — |
| Form variants (tabbed, wizard, split) | ✅ Done | — | — |
| Conditional fields (dependsOn) | ✅ Done | — | — |
| Field validation | ✅ Done | — | — |
| File upload fields (basic) | ✅ Done | 🎯 v1.0 Essential | Phase 10 (L1) |
| File upload fields (complete) | ✅ Done | Post v1.0 | Phase 14 (L1) |
| Related record lookup | ✅ Done | 🎯 v1.0 Essential | Phase 10 (L1) |
| Prev/Next record navigation | ✅ Done | Post v1.0 | Phase 12 (L1) |
| Comments / Activity history | ✅ Done | Post v1.0 | Phase 12 (L1) |
| Record revision history | ✅ Done | Post v1.0 | Phase 12 (L2) |
| Embeddable form URL | ✅ Done | Post v1.0 | Phase 14 (L1) |
| Rich text editor fields | 🔲 Planned | Post v1.0 | Phase 14 (L3) |
| Audit trail (field change history) | 🔲 Planned | Post v1.0 | Phase 16 (L2) |
| Feature | Status | Priority | Phase |
|---|---|---|---|
| Dashboard renderer | ✅ Done | — | — |
| Chart widgets | ✅ Done | — | — |
| Report viewer | ✅ Done | — | — |
| Report builder | ✅ Done | — | — |
| Real-time dashboard auto-refresh | ✅ Done | — | Phase 6 |
| Report export (PDF, Excel) | 🔲 Planned | Post v1.0 | Phase 15 (L2) |
| Dashboard drag & drop layout | 🔲 Planned | Post v1.0 | Phase 15 (L3) |
| Scheduled reports (email) | 🔲 Planned | Post v1.0 | Phase 18 (L1) |
| Feature | Status | Priority | Phase |
|---|---|---|---|
| Multi-app switcher | ✅ Done | — | — |
| Recursive navigation tree | ✅ Done | — | — |
| Command palette (⌘+K) | ✅ Done | — | — |
| Expression-based visibility | ✅ Done | — | Phase 1 |
| Dark/light theme | ✅ Done | — | — |
| Per-app branding | ✅ Done | — | — |
| Breadcrumbs | ✅ Done | — | — |
| Keyboard shortcuts | ✅ Done | — | — |
| Mobile-responsive layout | ✅ Done | — | Phase 8 |
| Language switcher | ✅ Done | — | Phase 4 |
| Global search (cross-object) | ✅ Done | — | — |
| Global Undo/Redo (Ctrl+Z) | ✅ Done (global UndoManager + batch ops + persistent stack) | Post v1.0 | Phase 16 (L1+L2) |
| Notification center | ✅ Partial (ActivityFeed with filter preferences) | Post v1.0 | Phase 17 (L2) |
| Activity feed | ✅ Done | Post v1.0 | Phase 17 (L1) |
| Inline View Config Panel | ✅ Done (Airtable-style right sidebar, breadcrumb header, record count footer, responsive mobile overlay, ARIA accessibility, auto-close on view switch, full interactive editing: Switch toggles, inline title edit, ViewType select, clickable sub-editor rows, draft state with Save/Discard, real-time draft preview in main view) | Post v1.0 | Phase 20 |
| Feature | Status | Priority | Phase |
|---|---|---|---|
| Kanban Quick Add button | ✅ Done | Post v1.0 | Phase 13 (L1) |
| Kanban cover image | ✅ Done | Post v1.0 | Phase 13 (L1) |
| Kanban column collapse | ✅ Done | Post v1.0 | Phase 13 (L1) |
| Kanban card coloring | ✅ Done | Post v1.0 | Phase 13 (L1) |
| Kanban swimlanes (2D grouping) | ✅ Done | Post v1.0 | Phase 13 (L1) |
| Kanban card templates | ✅ Done | Post v1.0 | Phase 13 (L2) |
| Kanban card badges | ✅ Done | Post v1.0 | Phase 13 (L2) |
| Feature | Status | Priority | Phase |
|---|---|---|---|
| Record-level comments | ✅ Done (basic, via RecordComments) | — | Phase 12 (L1) |
| @mention notifications | ✅ Done (CommentThread integrated) | Post v1.0 | Phase 17 (L1) |
| Threaded discussions | ✅ Done (CommentThread integrated) | Post v1.0 | Phase 17 (L3) |
| Email notifications | 🔲 Planned | Post v1.0 | Phase 17 (L2) |
| Feature | Status | Priority | Phase |
|---|---|---|---|
| Automation Builder UI | ✅ Done (AutomationBuilder + conditional triggers) | Post v1.0 | Phase 18 (L1+L2) |
| Visual workflow designer | ✅ Done (ProcessDesigner, 948 LOC) | Post v1.0 | Phase 18 (L2) |
| Scheduled triggers | 🔲 Planned | Post v1.0 | Phase 18 (L1) |
| Webhook actions | 🔲 Planned | Post v1.0 | Phase 18 (L1) |
| Automation run history | ✅ Done (AutomationRunHistory) | Post v1.0 | Phase 18 (L1) |
Re-prioritized (Feb 16, 2026): Progressive maturity stages (L1/L2/L3) organize features by depth. Each phase builds incrementally from foundation to excellence.
2026 Q1 (Feb 7-13) — BOOTSTRAP COMPLETE ✅
═══════════════════════════════════════════════════════════
Phase 0: Bootstrap & Foundation ██████████████ ✅ Complete (all `as any` casts removed)
2026 Q1 (Feb-Mar) — FEATURE PHASES
═══════════════════════════════════════════════════════════
Phase 1: Expression Engine ██████████████ ✅ Complete
Phase 2: Action System ██████████████ ✅ Complete (CRUD dialog migrated to ActionDef[])
Phase 3: Metadata API ██████████████ ✅ Complete (runtime fetch via MetadataProvider)
Phase 4: Internationalization ██████████████ ✅ Complete
Phase 5: RBAC & Permissions ██████████████ ✅ Complete
Phase 6: Real-Time Updates ██████████████ ✅ L2 Complete — PresenceAvatars, conflict resolution wired to reconnection
Phase 7: Performance Optimization ██████████████ ✅ Complete
Phase 8: Offline / PWA ██████████░░░░ ⚠️ Core done, background sync simulated
Phase 9: NavigationConfig Spec ██████████████ ✅ Complete
2026 Q1-Q2 (Mar-Apr) — v1.0 DATA INTERACTION (✅ L1 Complete)
═══════════════════════════════════════════════════════════
Phase 10: Data Interaction ██████████████ ✅ File upload, Lookup, Export, ActionEngine, Server metadata
2026 Q2 (May-Jun) — v1.0 GA: GRID & RECORD DETAIL
═══════════════════════════════════════════════════════════
Phase 11: Grid Excellence ██████████████ ✅ L3 Complete: Frozen columns, Row grouping with aggregations, Conditional coloring, Copy-paste, Split-pane, Gradient, Formula bar
Phase 12: Record Detail ██████████████ ✅ L3 Complete: Navigation, Comments, Activity, Inline related, Rich text, Diff view, Graph, Point-in-time restore
2026 Q3 (Jul-Sep) — v1.1: VIEWS, FORMS & DATA PORTABILITY (✅ L1 Complete)
═══════════════════════════════════════════════════════════
Phase 13: Kanban Enhancement ██████████████ ✅ L3 Complete: Quick Add, Cover image, Column collapse, Card coloring, Inline editing, Templates, Column widths, Cross-swimlane
Phase 14: Forms & Collection ██████████████ ✅ L1 Complete: DnD FileUpload, Embeddable forms, Analytics
Phase 15: Import/Export ██████████████ ✅ L1 Complete: Import wizard, Universal export, Shared links
2026 Q4 (Oct-Dec) — v1.2: UNDO/REDO & COLLABORATION (✅ L1 Complete)
═══════════════════════════════════════════════════════════
Phase 16: Undo/Redo & Safety ██████████████ ✅ L1 Complete: Global UndoManager, useGlobalUndo hook, Ctrl+Z/Ctrl+Shift+Z
Phase 17: Collaboration ██████████████ ✅ L1 Complete: CommentThread integrated, ActivityFeed sidebar
2027 Q1+ — v2.0: AUTOMATION & WORKFLOWS (✅ L1 Complete)
═══════════════════════════════════════════════════════════
Phase 18: Automation & Workflows ██████████████ ✅ L1 Complete: AutomationBuilder, AutomationRunHistory, registered in ComponentRegistry
2027 Q1+ — v2.1: INLINE VIEW DESIGNER (✅ Complete)
═══════════════════════════════════════════════════════════
Phase 20: Inline ViewConfigPanel ██████████████ ✅ Complete: Airtable-style right sidebar, full interactive editing (Switch toggles, inline title, ViewType select, sub-editor rows, draft Save/Discard, real-time draft preview), ARIA accessibility
| Milestone | Version | Date | Description |
|---|---|---|---|
| Bootstrap | v0.5.0 | ✅ Feb 7, 2026 | 10 sub-phases: data layer, plugins, i18n, routing, DX |
| Alpha | v0.5.2 | ✅ Feb 14, 2026 | Expressions + Actions + Metadata adapter + i18n + RBAC |
| Beta | v0.8.0 | ✅ Feb 16, 2026 | ActionRunner + Server-driven metadata + Phase 10 L1 features |
| RC | v0.9.0 | ✅ Complete | Phase 0-2 complete + Phase 10-12 L1; some Phase 6/8 gaps (Presence, Sync) |
| GA v1.0 | v1.0.0 | ✅ Complete | Core data interaction + Grid excellence + Record detail (Phases 10-12) |
| v1.1 | v1.1.0 | ✅ Complete | Kanban + Forms + Import/Export (Phases 13-15); all L1 ✅ |
| v1.2 | v1.2.0 | ✅ L1 Complete | Undo/Redo + Collaboration (Phases 16-17); L1 integrated into console |
| v2.0 | v2.0.0 | ✅ L2 Complete | All L2 features: batch undo, expression formatting, conditional triggers, multi-step actions, swimlane persistence, keyboard nav, file validation, thread resolution, notification prefs |
| v2.1 | v2.1.0 | ✅ Complete | Inline ViewConfigPanel (Phase 20): Airtable-style right sidebar with full interactive editing support, backend persistence via DataSource.updateViewConfig |
Every phase must pass these gates before merging:
| Gate | Requirement |
|---|---|
| Tests | All new code has unit tests; overall coverage > 80% |
| Lint | Zero ESLint warnings |
| Build | Clean build (no TypeScript errors) |
| Bundle | No regression in bundle size (monitored by CI) |
| Accessibility | Keyboard navigation works; screen reader tested |
| Performance | No LCP regression (monitored by Lighthouse CI) |
| Security | CodeQL scan passes; no new vulnerabilities |
| Documentation | JSDoc on all public functions; Storybook stories updated |
apps/console/
├── src/
│ ├── components/ # UI Components
│ │ ├── AppHeader.tsx # Top bar with breadcrumbs, search, connection status
│ │ ├── AppSidebar.tsx # Navigation sidebar with app switcher
│ │ ├── ConsoleLayout.tsx# Root layout (AppShell wrapper)
│ │ ├── ObjectView.tsx # Object list view (wraps plugin-view)
│ │ ├── RecordDetailView.tsx # Record detail page
│ │ ├── DashboardView.tsx# Dashboard page
│ │ ├── ReportView.tsx # Report viewer/builder page
│ │ ├── PageView.tsx # Custom page renderer
│ │ ├── CommandPalette.tsx# ⌘+K command bar
│ │ ├── ConnectionStatus.tsx # API connection indicator
│ │ ├── ErrorBoundary.tsx# Error boundary wrapper
│ │ ├── LoadingScreen.tsx# Initial loading state
│ │ ├── MetadataInspector.tsx # Developer debug panel
│ │ ├── mode-toggle.tsx # Theme switcher
│ │ └── theme-provider.tsx # Theme context
│ ├── hooks/ # Custom Hooks
│ │ ├── useBranding.ts # App branding CSS injection
│ │ ├── useObjectActions.ts # CRUD action handlers
│ │ ├── useFavorites.ts # Sidebar favorites
│ │ ├── useRecentItems.ts # Recent navigation items
│ │ └── useResponsiveSidebar.ts # Mobile-responsive sidebar
│ ├── context/ # React Context Providers
│ │ └── ExpressionProvider.tsx # Expression evaluation context
│ ├── mocks/ # MSW Mock Server
│ │ ├── browser.ts # Browser worker setup
│ │ └── server.ts # Node server setup (for tests)
│ ├── locales/ # [Phase 4] i18n translations
│ │ ├── en.json
│ │ ├── zh-CN.json
│ │ └── ja-JP.json
│ ├── __tests__/ # Test Files
│ │ └── *.test.tsx
│ ├── App.tsx # Root app component
│ ├── main.tsx # Entry point (plugin registration)
│ ├── dataSource.ts # DataSource re-export
│ ├── utils.ts # Shared utilities
│ └── index.css # Global styles
├── objectstack.shared.ts # Merged config (CRM + Todo + KitchenSink)
├── objectstack.config.ts # ObjectStack compile config
├── CONSOLE_ROADMAP.md # This document
├── README.md # Quick start guide
└── package.json
All view types (grid, kanban, calendar, etc.) are rendered via the plugin system (ComponentRegistry). The console never imports view implementations directly — it uses SchemaRenderer which dispatches to registered plugins.
Rationale: This ensures the console remains a thin orchestration layer. New view types can be added by installing a plugin package, with zero console code changes.
The console supports two modes:
- Server-Driven: Fetch app/view metadata from the ObjectStack Runtime API
- Static Config: Load from
objectstack.shared.tswhen no server is available
Rationale: During development, the MSW mock server simulates the API. In production, the real server provides metadata. The static config is the fallback for offline scenarios and testing.
All visibility/disabled/hidden logic uses the Expression Engine from @object-ui/core:
// Navigation item visibility
visible: "${user.role === 'admin'}"
// Field conditional rendering
dependsOn: "status"
visibleOn: "${data.status !== 'draft'}"Rationale: Hardcoded if/else checks don't scale. Expressions let the server control what's visible without deploying new frontend code.
The console uses ObjectStackAdapter (from @object-ui/data-objectstack) which implements the DataSource interface. This means:
- The console doesn't know about HTTP, WebSocket, or REST
- Swapping backends (e.g., GraphQL, Firebase) requires only a new adapter
- Testing uses the same interface with MSW or in-memory adapters
URL structure: /apps/:appName/:objectName/view/:viewId
Each app has its own navigation tree, branding, and permissions. The sidebar and header adapt dynamically when switching apps.
| Risk | Impact | Mitigation |
|---|---|---|
| Bundle size exceeds target | Poor load times, bad UX | Code-split plugins, tree-shake icons, lazy loading |
| Expression engine performance | Slow rendering with complex expressions | Memoize evaluations, limit re-evaluation frequency |
| WebSocket reliability | Missed real-time updates | Fallback to polling, reconnect with exponential backoff |
| i18n string extraction | Missed translations, broken UI | Automated extraction tool, CI check for untranslated keys |
| RBAC complexity | Permission bugs, data leaks | Server-side enforcement as primary gate; UI is secondary |
| Spec version drift | Breaking changes from @objectstack/spec | Pin spec version, run compatibility tests on upgrade |
- Official
ObjectStackAdapterreplaces local data source - 14 plugins registered in
main.tsx -
defineStack()used for config (Zod validation pending) - All UI strings in English; i18n keys via
useObjectTranslation
- 100% of navigation items respect
visibleexpressions - ActionRunner.execute(ActionDef) fully implemented (717 lines); toolbar actions dispatch through ActionRunner
- Console fetches app config from server at runtime via
MetadataProvider→client.meta.getItems() - CRUD dialog migrated to ActionDef[] with
crud_successanddialog_cancelhandlers dispatched through ActionRunner
- 10 languages supported with runtime switching
- Permission-denied UI tested for all object operations
- Real-time grid refresh on server-side changes
- Presence indicators (PresenceAvatars) rendered in AppHeader and RecordDetailView
- Conflict resolution wired to ObjectView reconnection flow (server-wins auto-resolve)
- Optimistic updates not implemented (types only — server-side enforcement assumed)
- Code splitting (15+ manual chunks), compression, and preloading configured
- Virtual scrolling via @tanstack/react-virtual in VirtualGrid
- Critical chunk preloading for fast LCP
- Console installable as PWA (manifest.json + MobileProvider)
- Background sync queue simulates server sync only (no real backend integration)
- All 8 view plugins support NavigationConfig specification (7 modes)
-
useNavigationOverlayhook +NavigationOverlaycomponent pattern - Console ObjectView uses NavigationOverlay instead of hardcoded Sheet drawer
- Detail drawer auto-layout: multi-column support (≤3→1col, 4-10→2col, 11+→3col) with wide field auto-spanning
L1 (Foundation) — v1.0 GA Scope:
- FileUploadField widget renders with single file upload + progress
- LookupField widget searches related records via DataSource
- Grid export button downloads CSV/JSON with current data
- ActionEngine dispatches all CRUD actions from
ActionDef[] - Console fetches app config from server via
getApp()method
L2 (Production) — Post v1.0:
- Multi-file upload with drag-and-drop + validation
- Advanced lookup search with multi-select + quick-create
- Excel/PDF export with custom column selection
- Full ActionEngine coverage (all action types, chaining)
- Metadata caching with hot-reload on changes
L3 (Excellence) — Future:
- Camera capture + image cropping in FileUpload
- Dependent lookups with hierarchical relationships
- Scheduled exports via automation
- Custom action handlers plugin system
- Metadata editing UI with versioning
L1 (Foundation):
- Freeze first N columns via
frozenColumnswith sticky positioning - Row height toggle (compact/medium/tall) via toolbar button
- Native row grouping by single field (
useGroupedDatahook) - Conditional row coloring (
useRowColorhook) - Copy single cell to clipboard (Ctrl+C/Cmd+C)
L2 (Production):
- Freeze multiple columns (user-configurable)
- Multi-level row grouping with aggregations (
useGroupedDatawithAggregationConfig[]) - Complex conditional formatting with expressions (
ConditionalFormattingRule.expression) - Copy-paste cell ranges to/from Excel (
useCellClipboardwith tab-separated format)
L3 (Excellence):
- Split-pane mode with frozen columns (
SplitPaneGridwith resizable divider) - Drag-and-drop group reordering (
useGroupReorderhook) - Gradient coloring for numeric ranges (
useGradientColorhook) - Formula bar for editing cell values (
FormulaBarcomponent)
L1 (Foundation):
- Prev/Next buttons navigate through records with position indicator
- RelatedList component displays related records
-
RecordCommentscomponent with add/view, timestamp, author -
ActivityTimelinecomponent with field change history
L2 (Production):
- Keyboard shortcuts (← / →) for record navigation
- Inline create/link related records (
InlineCreateRelatedwith Create/Link tabs) - Rich text comments with @mentions (
RichTextCommentInputwith markdown toolbar) - Diff view for revision history (
DiffViewwith unified/side-by-side modes)
L3 (Excellence):
- Jump to first/last record with search-while-navigating (
RecordNavigationEnhanced) - Multi-level related records with graph view (
RelationshipGraphSVG node-link graph) - Threaded discussions with attachments (
CommentAttachmentwith drag-and-drop upload) - Point-in-time restore for records (
PointInTimeRestorewith revision timeline)
L1 (Foundation):
- Quick Add button at column bottom
- Cover image support on Kanban cards
- Column collapse/expand
- Card conditional coloring
L2 (Production):
- Inline editing in quick-add (no dialog) (
InlineQuickAddwith multi-field form) - Card templates (predefined field values) (
CardTemplatesdropdown selector) - Persist collapsed state per user (localStorage per swimlaneField)
- Card badges (priority, tags) —
KanbanCard.badges[]rendered inSortableCard
L3 (Excellence):
- Swimlanes (2D grouping by second field) —
swimlaneFieldwith collapsible rows - Drag to reorder quick-add cards (
useQuickAddReorderhook) - Custom column widths with horizontal scroll (
useColumnWidthshook with localStorage) - Cross-swimlane card movement (
useCrossSwimlaneMovehook with constraint validation)
L1 (Foundation):
- Drag-and-drop upload zone in FileUploadField
- Standalone form URL (embeddable, no auth)
- Form submissions create records
- Basic form analytics dashboard
L2 (Production):
- Multi-file upload with file size validation and error messages (
FileField.maxSize) - Prefill URL parameters populate fields (EmbeddableForm)
- Custom thank-you page redirect (EmbeddableForm)
- Field-level analytics (drop-off, errors)
L3 (Excellence):
- Camera capture for mobile uploads
- Multi-page forms (wizard steps)
- Conditional form logic (skip fields)
- Real-time submission monitoring
L1 (Foundation):
- CSV/Excel import wizard with column mapping (
ImportWizard.tsxinpackages/plugin-grid/src/) - Export button on all view types (Grid, Kanban, Calendar, Gallery) via
exportOptions - Shared read-only view link generated (
SharedViewLink.tsxinpackages/plugin-view/src/) - API export endpoint (
GET /api/export/:objectName) — server-side, out of scope for console
L2 (Production):
- Import preview (first 10 rows) with per-row error highlighting and validation
- Excel/PDF export with view layout preserved
- Password-protected shared links (UI with password input & expiration dropdown)
- GraphQL export query support
L3 (Excellence):
- Import templates (save column mappings)
- Scheduled exports (email daily/weekly)
- Edit permissions in shared links
- Streaming export for large datasets
L1 (Foundation):
- Global undo/redo (Ctrl+Z / Ctrl+Shift+Z) —
UndoManagerinpackages/core/src/actions/UndoManager.ts+useGlobalUndohook inpackages/react/src/hooks/useGlobalUndo.ts - Undo stack with max size (50 operations) — implemented in
UndoManager(configurable max history) - Server-side audit log displays field changes — server-side, out of scope for console
- Developer operation log tool —
globalUndoManager.getHistory()+getRedoHistory()provides operation log
L2 (Production):
- Undo/redo UI (toast notification via Sonner)
- Batch undo (
pushBatch,popUndoBatch,popRedoBatchmethods) - Diff view (side-by-side comparison)
- Revert to previous version
L3 (Excellence):
- Persistent undo stack (survives reload via
saveToStorage/loadFromStorage) - Undo branching (multiple paths)
- Point-in-time restore for objects
- Operation replay on different environment
L1 (Foundation):
- Record-level comments posted and displayed (via
RecordCommentsin Phase 12 L1) - @mention autocomplete in comments (
CommentThreadfrom@object-ui/collaborationintegrated into consoleRecordDetailView) - Activity feed shows recent activity (
ActivityFeedcomponent integrated intoAppHeader) - Reply to comment (threaded discussion) (
CommentThreadwithparentId-based threading integrated into consoleRecordDetailView)
L2 (Production):
- Rich text comments (markdown)
- Email notifications for @mentions — server-side
- Notification preferences (enable/disable per activity type) — ActivityFeed filter toggles
- Thread resolution (mark as resolved) —
onResolvecallback wired in RecordDetailView
L3 (Excellence):
- Comment attachments (files, images)
- Notification grouping (batch similar)
- Thread AI summary (summarize long threads)
- Thread permissions (restrict replies)
L1 (Foundation):
- Automation created via UI (trigger + action) —
AutomationBuilder.tsxregistered as'automation-builder'in ComponentRegistry - Scheduled triggers (daily/weekly) — server-side execution, out of scope for console UI
- Webhook actions (HTTP POST) — server-side execution, out of scope for console UI
- Run history displays past executions —
AutomationRunHistory.tsxregistered as'automation-run-history'in ComponentRegistry
L2 (Production):
- Visual workflow designer (ProcessDesigner, 948 lines, BPMN 2.0 with auto-layout, undo/redo, minimap)
- Conditional triggers (match field value) —
conditionField/conditionOperator/conditionValuein TriggerConfig - Multi-step actions (action sequence) —
executionMode: 'sequential' | 'parallel'with step numbering - Webhook retry on failure — server-side
L3 (Excellence):
- Sub-workflows (call another workflow)
- Parallel execution (run actions in parallel) —
executionMode: 'parallel'in AutomationDefinition - Workflow versioning (save versions, rollback)
- Automation monitoring dashboard
| Document | Location | Purpose |
|---|---|---|
| Development Plan (v0.1–v0.5) | Merged into Phase 0 above | Bootstrap phases (archived) |
| NavigationConfig Compliance Report | /tmp/navigation-config-compliance-report.md |
Spec compliance analysis for all view plugins |
| Architecture Guide | content/docs/guide/console-architecture.md |
Technical deep-dive |
| Getting Started | content/docs/guide/console.md |
User-facing docs |
| Root Roadmap | ROADMAP.md |
Full ObjectUI ecosystem roadmap |
| Term | Definition |
|---|---|
| SDUI | Server-Driven UI — the server sends JSON metadata that the client renders |
| ObjectStack | The backend platform that provides the data API and metadata |
| Console | The reference frontend application built with ObjectUI |
| Plugin | A registered component type (e.g., object-grid, object-kanban) |
| Schema | A JSON object describing what to render (e.g., { type: 'object-view', ... }) |
| Expression | A template string evaluated at runtime (e.g., "${data.age > 18}") |
| DataSource | An adapter interface for CRUD operations and metadata fetching |
| ActionRunner | The engine that executes user actions (create, delete, navigate, etc.) |
| NavigationConfig | Schema configuration defining how to navigate to detail views (page, drawer, modal, split, popover, new_window, none) |
| ViewNavigationConfig | TypeScript interface for navigation configuration — part of @objectstack/spec v3.0.0 |