|
| 1 | +# ObjectUI Roadmap |
| 2 | + |
| 3 | +> Aligning ObjectUI with `@objectstack/spec` UI Protocol |
| 4 | +
|
| 5 | +## Current Status |
| 6 | + |
| 7 | +**Version:** v0.5.x |
| 8 | +**Spec Version:** @objectstack/spec v1.0.11 |
| 9 | +**Overall Spec Coverage:** ~75% |
| 10 | + |
| 11 | +## Package Maturity Matrix |
| 12 | + |
| 13 | +| Package | Status | Spec Coverage | Notes | |
| 14 | +|---------|--------|--------------|-------| |
| 15 | +| @object-ui/types | ✅ Complete | 100% | Full spec re-export + local types | |
| 16 | +| @object-ui/core | ✅ Complete | 95% | Registry, Plugin, Expression, Action, Validation | |
| 17 | +| @object-ui/components | ✅ Complete | 100% | 80+ renderers, 50 Shadcn primitives | |
| 18 | +| @object-ui/fields | ✅ Complete | 95% | 36 widgets, 20+ cell renderers | |
| 19 | +| @object-ui/layout | 🟡 Partial | 60% | Basic layouts, missing responsive grid | |
| 20 | +| @object-ui/react | ✅ Complete | 100% | SchemaRenderer, hooks, providers | |
| 21 | +| @object-ui/plugin-form | 🟡 Partial | 30% | Only `simple` form, missing 5 variants | |
| 22 | +| @object-ui/plugin-grid | ✅ Complete | 95% | Full ListView support | |
| 23 | +| @object-ui/plugin-aggrid | ✅ Complete | 100% | AG Grid integration | |
| 24 | +| @object-ui/plugin-kanban | ✅ Complete | 100% | Kanban board | |
| 25 | +| @object-ui/plugin-calendar | ✅ Complete | 100% | Calendar view | |
| 26 | +| @object-ui/plugin-gantt | ✅ Complete | 100% | Gantt chart | |
| 27 | +| @object-ui/plugin-charts | ✅ Complete | 100% | 7 chart types | |
| 28 | +| @object-ui/plugin-dashboard | ✅ Complete | 100% | Dashboard layout | |
| 29 | +| @object-ui/plugin-detail | ✅ Complete | 100% | Record detail view | |
| 30 | +| @object-ui/plugin-list | ✅ Complete | 100% | List with view switching | |
| 31 | +| @object-ui/plugin-view | 🟡 Partial | 50% | Basic container only | |
| 32 | +| @object-ui/plugin-object | ⚪ Prebuilt | N/A | No source, has dist | |
| 33 | +| @object-ui/plugin-report | 🟡 Partial | 60% | Basic report rendering | |
| 34 | +| @object-ui/plugin-timeline | ✅ Complete | 100% | 3 timeline variants | |
| 35 | +| @object-ui/plugin-map | ✅ Complete | 100% | Map view | |
| 36 | +| @object-ui/plugin-editor | ✅ Complete | 100% | Monaco editor | |
| 37 | +| @object-ui/plugin-markdown | ✅ Complete | 100% | Markdown rendering | |
| 38 | +| @object-ui/plugin-chatbot | ✅ Complete | 100% | Chat interface | |
| 39 | +| @object-ui/data-objectql | ⚪ Prebuilt | N/A | No source, has dist | |
| 40 | +| @object-ui/data-objectstack | ✅ Complete | 100% | Full DataSource adapter | |
| 41 | +| @object-ui/runner | ✅ Complete | 100% | App runner | |
| 42 | +| @object-ui/cli | ✅ Complete | 100% | 15 commands | |
| 43 | + |
| 44 | +--- |
| 45 | + |
| 46 | +## Gap Analysis |
| 47 | + |
| 48 | +### 🔴 Critical Gaps (High Priority) |
| 49 | + |
| 50 | +#### 1. Form Variants (plugin-form) |
| 51 | + |
| 52 | +**Spec Requirement:** |
| 53 | +```typescript |
| 54 | +FormView.type: 'simple' | 'tabbed' | 'wizard' | 'split' | 'drawer' | 'modal' |
| 55 | +``` |
| 56 | + |
| 57 | +**Current State:** Only `simple` form implemented. |
| 58 | + |
| 59 | +**Missing Features:** |
| 60 | +- [ ] Tabbed Form - Fields organized in tab groups |
| 61 | +- [ ] Wizard Form - Multi-step form with navigation |
| 62 | +- [ ] Split Form - Side-by-side panels |
| 63 | +- [ ] Drawer Form - Slide-out form panel |
| 64 | +- [ ] Modal Form - Dialog-based form |
| 65 | +- [ ] Section/Group support (collapsible, columns per section) |
| 66 | +- [ ] FormField.colSpan support |
| 67 | +- [ ] FormField.dependsOn (field dependencies) |
| 68 | +- [ ] FormField.widget (custom widget override) |
| 69 | + |
| 70 | +--- |
| 71 | + |
| 72 | +#### 2. Action System Runtime |
| 73 | + |
| 74 | +**Spec Requirement:** |
| 75 | +```typescript |
| 76 | +Action.type: 'script' | 'url' | 'modal' | 'flow' | 'api' |
| 77 | +Action.locations: ('list_toolbar' | 'list_item' | 'record_header' | 'record_more' | 'record_related' | 'global_nav')[] |
| 78 | +Action.component: 'action:button' | 'action:icon' | 'action:menu' | 'action:group' |
| 79 | +Action.params: ActionParam[] |
| 80 | +``` |
| 81 | + |
| 82 | +**Current State:** ActionRunner only handles `api` (partially) and `navigation`. |
| 83 | + |
| 84 | +**Missing Features:** |
| 85 | +- [ ] `script` action type - Execute client-side code |
| 86 | +- [ ] `modal` action type - Open modal dialog |
| 87 | +- [ ] `flow` action type - Trigger automation workflow |
| 88 | +- [ ] `api` action type - Full HttpRequest support (headers, body, method) |
| 89 | +- [ ] Action location-based rendering (toolbar, item, header, etc.) |
| 90 | +- [ ] Action component variants (button, icon, menu, group) |
| 91 | +- [ ] ActionParam UI collection (before execution) |
| 92 | +- [ ] successMessage display |
| 93 | +- [ ] refreshAfter behavior |
| 94 | + |
| 95 | +--- |
| 96 | + |
| 97 | +#### 3. NavigationConfig |
| 98 | + |
| 99 | +**Spec Requirement:** |
| 100 | +```typescript |
| 101 | +NavigationConfig: { |
| 102 | + mode: 'page' | 'drawer' | 'modal' | 'split' | 'popover' | 'new_window' | 'none' |
| 103 | + view?: string |
| 104 | + preventNavigation?: boolean |
| 105 | + openNewTab?: boolean |
| 106 | +} |
| 107 | +``` |
| 108 | + |
| 109 | +**Current State:** Not implemented. No TypeScript interface in @object-ui/types. |
| 110 | + |
| 111 | +**Missing Features:** |
| 112 | +- [ ] Add NavigationConfig to @object-ui/types |
| 113 | +- [ ] Implement in plugin-grid (row click behavior) |
| 114 | +- [ ] Implement in plugin-list (item click behavior) |
| 115 | +- [ ] Implement in plugin-detail (related list navigation) |
| 116 | +- [ ] Drawer navigation mode |
| 117 | +- [ ] Modal navigation mode |
| 118 | +- [ ] Split view navigation mode |
| 119 | +- [ ] Popover preview mode |
| 120 | + |
| 121 | +--- |
| 122 | + |
| 123 | +### 🟡 Medium Priority Gaps |
| 124 | + |
| 125 | +#### 4. ListColumn Extensions |
| 126 | + |
| 127 | +**Spec Requirement:** |
| 128 | +```typescript |
| 129 | +ListColumn.link: boolean // Primary navigation column |
| 130 | +ListColumn.action: string // Associated action ID |
| 131 | +``` |
| 132 | + |
| 133 | +**Current State:** Not in types, not rendered. |
| 134 | + |
| 135 | +**Tasks:** |
| 136 | +- [ ] Add `link` and `action` to ListColumnSchema |
| 137 | +- [ ] Render link columns with navigation behavior |
| 138 | +- [ ] Render action columns with ActionRunner integration |
| 139 | + |
| 140 | +--- |
| 141 | + |
| 142 | +#### 5. Page System |
| 143 | + |
| 144 | +**Spec Requirement:** |
| 145 | +```typescript |
| 146 | +Page: { |
| 147 | + type: 'record' | 'home' | 'app' | 'utility' |
| 148 | + variables: PageVariable[] |
| 149 | + template: string |
| 150 | + object?: string |
| 151 | + regions: PageRegion[] |
| 152 | +} |
| 153 | +``` |
| 154 | + |
| 155 | +**Current State:** Basic PageSchema exists but missing type differentiation. |
| 156 | + |
| 157 | +**Tasks:** |
| 158 | +- [ ] Add Page.type to PageSchema |
| 159 | +- [ ] Add Page.variables support (page-level state) |
| 160 | +- [ ] Add Page.template support (layout templates) |
| 161 | +- [ ] Add Page.object binding |
| 162 | +- [ ] PageRenderer type-aware rendering (record vs home vs app vs utility) |
| 163 | +- [ ] PageVariable initialization and context injection |
| 164 | + |
| 165 | +--- |
| 166 | + |
| 167 | +#### 6. Widget System (WidgetManifest) |
| 168 | + |
| 169 | +**Spec Requirement:** |
| 170 | +```typescript |
| 171 | +WidgetManifest: { |
| 172 | + lifecycle: { onMount, onUpdate, onUnmount, ... } |
| 173 | + events: WidgetEvent[] |
| 174 | + properties: WidgetProperty[] |
| 175 | + implementation: 'npm' | 'remote' | 'inline' |
| 176 | +} |
| 177 | +``` |
| 178 | + |
| 179 | +**Current State:** Not implemented. Static ComponentRegistry only. |
| 180 | + |
| 181 | +**Tasks:** |
| 182 | +- [ ] Add WidgetManifest types to @object-ui/types |
| 183 | +- [ ] Implement dynamic widget loading (npm, remote, inline) |
| 184 | +- [ ] Widget lifecycle hooks |
| 185 | +- [ ] Widget property validation |
| 186 | +- [ ] Widget event system |
| 187 | + |
| 188 | +--- |
| 189 | + |
| 190 | +#### 7. Theme System Alignment |
| 191 | + |
| 192 | +**Spec Requirement:** Full theme schema with ColorPalette, Typography, Spacing, BorderRadius, Shadow, Breakpoints, Animation, ZIndex. |
| 193 | + |
| 194 | +**Current State:** Simplified ThemeDefinition, missing half the spec. |
| 195 | + |
| 196 | +**Tasks:** |
| 197 | +- [ ] Add Shadow, Breakpoints, Animation, ZIndex to ThemeDefinition |
| 198 | +- [ ] Align ColorPalette with spec (surface, textSecondary, primaryLight/Dark) |
| 199 | +- [ ] Add ThemeProvider to @object-ui/react or @object-ui/layout |
| 200 | +- [ ] Theme inheritance (extends) |
| 201 | +- [ ] Branding (logo, darkLogo, favicon) |
| 202 | + |
| 203 | +--- |
| 204 | + |
| 205 | +#### 8. ViewData API Provider |
| 206 | + |
| 207 | +**Spec Requirement:** |
| 208 | +```typescript |
| 209 | +{ provider: 'api', read?: HttpRequest, write?: HttpRequest } |
| 210 | +``` |
| 211 | + |
| 212 | +**Current State:** Type defined but not fully implemented in plugin-form. |
| 213 | + |
| 214 | +**Tasks:** |
| 215 | +- [ ] Full HttpRequest support (method, url, headers, body) |
| 216 | +- [ ] API read integration in plugin-form |
| 217 | +- [ ] API write integration in plugin-form |
| 218 | +- [ ] Error handling and loading states |
| 219 | + |
| 220 | +--- |
| 221 | + |
| 222 | +### 🟢 Low Priority / Future |
| 223 | + |
| 224 | +#### 9. Expression System Enhancements |
| 225 | + |
| 226 | +- [ ] Formula functions (SUM, AVG, TODAY, NOW, IF, etc.) |
| 227 | +- [ ] Standardized context protocol (data, record, user, form) |
| 228 | + |
| 229 | +#### 10. Report System |
| 230 | + |
| 231 | +- [ ] Report export (PDF, Excel) |
| 232 | +- [ ] Report scheduling |
| 233 | +- [ ] Aggregation formula engine |
| 234 | + |
| 235 | +#### 11. Layout System |
| 236 | + |
| 237 | +- [ ] Responsive grid layout |
| 238 | +- [ ] Multi-column layout components |
| 239 | +- [ ] Layout templates |
| 240 | + |
| 241 | +--- |
| 242 | + |
| 243 | +## Implementation Phases |
| 244 | + |
| 245 | +### Phase 1: Form Variants (v0.6.0) |
| 246 | + |
| 247 | +**Timeline:** 2-3 weeks |
| 248 | + |
| 249 | +**Scope:** |
| 250 | +1. Refactor ObjectForm to support FormView.type |
| 251 | +2. Implement TabbedForm component |
| 252 | +3. Implement WizardForm component |
| 253 | +4. Add section/group support |
| 254 | +5. Add FormField.colSpan, dependsOn, widget |
| 255 | + |
| 256 | +**Deliverables:** |
| 257 | +- [ ] packages/plugin-form/src/TabbedForm.tsx |
| 258 | +- [ ] packages/plugin-form/src/WizardForm.tsx |
| 259 | +- [ ] packages/plugin-form/src/FormSection.tsx |
| 260 | +- [ ] Updated ObjectForm with type routing |
| 261 | + |
| 262 | +--- |
| 263 | + |
| 264 | +### Phase 2: Action System (v0.7.0) |
| 265 | + |
| 266 | +**Timeline:** 2-3 weeks |
| 267 | + |
| 268 | +**Scope:** |
| 269 | +1. Extend ActionRunner for all action types |
| 270 | +2. Implement action location-based rendering |
| 271 | +3. Add ActionButton, ActionMenu, ActionGroup components |
| 272 | +4. ActionParam collection UI |
| 273 | + |
| 274 | +**Deliverables:** |
| 275 | +- [ ] packages/core/src/action/handlers/ (script, modal, flow, api) |
| 276 | +- [ ] packages/components/src/custom/action-button.tsx |
| 277 | +- [ ] packages/components/src/custom/action-menu.tsx |
| 278 | +- [ ] ActionLocationRenderer utility |
| 279 | + |
| 280 | +--- |
| 281 | + |
| 282 | +### Phase 3: Navigation System (v0.8.0) |
| 283 | + |
| 284 | +**Timeline:** 1-2 weeks |
| 285 | + |
| 286 | +**Scope:** |
| 287 | +1. Add NavigationConfig to types |
| 288 | +2. Implement all navigation modes in grid/list/detail plugins |
| 289 | +3. Create NavigationProvider for centralized control |
| 290 | + |
| 291 | +**Deliverables:** |
| 292 | +- [ ] packages/types/src/navigation.ts |
| 293 | +- [ ] packages/react/src/NavigationProvider.tsx |
| 294 | +- [ ] Updated plugin-grid, plugin-list, plugin-detail |
| 295 | + |
| 296 | +--- |
| 297 | + |
| 298 | +### Phase 4: Page & Theme (v0.9.0) |
| 299 | + |
| 300 | +**Timeline:** 2 weeks |
| 301 | + |
| 302 | +**Scope:** |
| 303 | +1. Full Page system implementation |
| 304 | +2. Theme system alignment with spec |
| 305 | +3. ThemeProvider for runtime theming |
| 306 | + |
| 307 | +**Deliverables:** |
| 308 | +- [ ] packages/types/src/page.ts (enhanced) |
| 309 | +- [ ] packages/types/src/theme.ts (aligned) |
| 310 | +- [ ] packages/layout/src/PageRenderer.tsx |
| 311 | +- [ ] packages/react/src/ThemeProvider.tsx |
| 312 | + |
| 313 | +--- |
| 314 | + |
| 315 | +### Phase 5: Widget System & Polish (v1.0.0) |
| 316 | + |
| 317 | +**Timeline:** 2-3 weeks |
| 318 | + |
| 319 | +**Scope:** |
| 320 | +1. WidgetManifest implementation |
| 321 | +2. Dynamic widget loading |
| 322 | +3. Documentation completion |
| 323 | +4. Full spec compliance audit |
| 324 | + |
| 325 | +**Deliverables:** |
| 326 | +- [ ] packages/core/src/widget/ (loader, lifecycle, registry) |
| 327 | +- [ ] Full documentation update |
| 328 | +- [ ] Spec compliance test suite |
| 329 | + |
| 330 | +--- |
| 331 | + |
| 332 | +## Success Metrics |
| 333 | + |
| 334 | +- [ ] All `@objectstack/spec/ui` types have corresponding runtime implementations |
| 335 | +- [ ] All 6 form variants working with examples |
| 336 | +- [ ] All 5 action types executable |
| 337 | +- [ ] All 7 navigation modes functional |
| 338 | +- [ ] 100% spec coverage in automated tests |
| 339 | +- [ ] Complete Storybook examples for all components |
| 340 | + |
| 341 | +--- |
| 342 | + |
| 343 | +## Contributing |
| 344 | + |
| 345 | +See [CONTRIBUTING.md](./CONTRIBUTING.md) for development guidelines. |
| 346 | + |
| 347 | +When implementing spec features: |
| 348 | +1. Reference the Zod schema in `@objectstack/spec/ui` |
| 349 | +2. Update types in `@object-ui/types` first |
| 350 | +3. Implement in appropriate package |
| 351 | +4. Add Storybook story |
| 352 | +5. Update documentation in `content/docs/` |
0 commit comments