Skip to content

Commit 8a6c4f0

Browse files
authored
Merge pull request #852 from objectstack-ai/copilot/upgrade-objectstack-to-latest-yet-again
2 parents 45a10eb + f0b1c8b commit 8a6c4f0

File tree

27 files changed

+376
-279
lines changed

27 files changed

+376
-279
lines changed

ROADMAP.md

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
# ObjectUI Development Roadmap
22

3-
> **Last Updated:** February 24, 2026
3+
> **Last Updated:** February 25, 2026
44
> **Current Version:** v0.5.x
5-
> **Spec Version:** @objectstack/spec v3.0.9
6-
> **Client Version:** @objectstack/client v3.0.9
5+
> **Spec Version:** @objectstack/spec v3.0.10
6+
> **Client Version:** @objectstack/client v3.0.10
77
> **Target UX Benchmark:** 🎯 Airtable parity
88
> **Current Priority:** AppShell Navigation · Designer Interaction · View Config Live Preview Sync · Dashboard Config Panel · Airtable UX Polish · **Flow Designer ✅** · **App Creation & Editing Flow ✅** · **System Settings & App Management ✅** · **Right-Side Visual Editor Drawer ✅**
99
@@ -49,6 +49,28 @@ ObjectUI is a universal Server-Driven UI (SDUI) engine built on React + Tailwind
4949

5050
---
5151

52+
## 🔄 Spec v3.0.10 Upgrade Summary
53+
54+
> Upgraded from `@objectstack/spec v3.0.9``v3.0.10` on February 25, 2026. UI sub-export adds new Zod schemas and `ViewFilterRule` type. Dashboard widgets now require `id` field. View filters must use object format.
55+
56+
**New Protocol Capabilities (v3.0.10):**
57+
58+
| Area | What's New | Impact on ObjectUI |
59+
|------|------------|-------------------|
60+
| **UI Schemas** | `DensityModeSchema`, `ThemeModeSchema`, `WcagContrastLevelSchema` Zod schemas | Re-exported from `@object-ui/types` for runtime validation |
61+
| **View Filter Rules** | `ViewFilterRule`, `ViewFilterRuleSchema` — structured filter format `{ field, operator, value }` | All view filters migrated from tuple `['field', '=', 'value']` to object format |
62+
| **Dashboard Widgets** | `id` field now required on `DashboardWidgetSchema` | All example dashboard widgets updated with explicit `id` |
63+
| **Filter AST** | `isFilterAST`, `parseFilterAST`, `VALID_AST_OPERATORS` in data sub-export | Filter engine utilities (P2.4) |
64+
| **Multi-Tenant** | `TursoMultiTenantConfig`, `TenantResolverStrategy`, `TenantDatabaseLifecycle` | Cloud multi-tenancy (P2.4) |
65+
| **Contracts** | `IAppLifecycleService`, `IDeployPipelineService`, `IProvisioningService`, `ITenantRouter`, `ISchemaDiffService` | Cloud deployment & lifecycle (P2.4) |
66+
67+
**Breaking Changes Applied:**
68+
- All CRM view filters converted from `['field', '=', 'value']` to `[{ field, operator: '=', value }]`
69+
- All dashboard widgets (kitchen-sink, todo, CRM) given explicit `id` fields
70+
- Todo active filter converted from `[['status', '!=', 'Done']]` to `[{ field: 'status', operator: '!=', value: 'Done' }]`
71+
72+
---
73+
5274
## 🎯 P0 — Must Ship (v1.0 Blockers)
5375

5476
### P0.1 AppShell & Navigation Renderer

apps/console/package.json

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -63,13 +63,13 @@
6363
"@object-ui/plugin-view": "workspace:*",
6464
"@object-ui/react": "workspace:*",
6565
"@object-ui/types": "workspace:*",
66-
"@objectstack/cli": "^3.0.9",
67-
"@objectstack/client": "^3.0.9",
68-
"@objectstack/driver-memory": "^3.0.9",
69-
"@objectstack/objectql": "^3.0.9",
70-
"@objectstack/plugin-msw": "^3.0.9",
71-
"@objectstack/runtime": "^3.0.9",
72-
"@objectstack/spec": "^3.0.9",
66+
"@objectstack/cli": "^3.0.10",
67+
"@objectstack/client": "^3.0.10",
68+
"@objectstack/driver-memory": "^3.0.10",
69+
"@objectstack/objectql": "^3.0.10",
70+
"@objectstack/plugin-msw": "^3.0.10",
71+
"@objectstack/runtime": "^3.0.10",
72+
"@objectstack/spec": "^3.0.10",
7373
"@tailwindcss/postcss": "^4.1.18",
7474
"@testing-library/jest-dom": "^6.9.1",
7575
"@testing-library/react": "^16.3.2",

examples/crm/package.json

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,19 +19,19 @@
1919
},
2020
"dependencies": {
2121
"@hono/node-server": "^1.19.9",
22-
"@objectstack/core": "^3.0.9",
23-
"@objectstack/driver-memory": "^3.0.9",
24-
"@objectstack/objectql": "^3.0.9",
25-
"@objectstack/plugin-auth": "^3.0.9",
26-
"@objectstack/plugin-hono-server": "^3.0.9",
27-
"@objectstack/runtime": "^3.0.9",
28-
"@objectstack/spec": "^3.0.9",
22+
"@objectstack/core": "^3.0.10",
23+
"@objectstack/driver-memory": "^3.0.10",
24+
"@objectstack/objectql": "^3.0.10",
25+
"@objectstack/plugin-auth": "^3.0.10",
26+
"@objectstack/plugin-hono-server": "^3.0.10",
27+
"@objectstack/runtime": "^3.0.10",
28+
"@objectstack/spec": "^3.0.10",
2929
"hono": "^4.12.2",
3030
"pino": "^8.21.0",
3131
"pino-pretty": "^13.1.3"
3232
},
3333
"devDependencies": {
34-
"@objectstack/cli": "^3.0.9",
34+
"@objectstack/cli": "^3.0.10",
3535
"tsx": "^4.21.0",
3636
"typescript": "^5.9.3"
3737
}

examples/crm/src/dashboards/crm.dashboard.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ export const CrmDashboard = {
55
widgets: [
66
// --- KPI Row ---
77
{
8+
id: 'total_revenue',
89
title: 'Total Revenue',
910
type: 'metric' as const,
1011
object: 'opportunity',
@@ -17,6 +18,7 @@ export const CrmDashboard = {
1718
}
1819
},
1920
{
21+
id: 'active_deals',
2022
title: 'Active Deals',
2123
type: 'metric' as const,
2224
object: 'opportunity',
@@ -29,6 +31,7 @@ export const CrmDashboard = {
2931
}
3032
},
3133
{
34+
id: 'win_rate',
3235
title: 'Win Rate',
3336
type: 'metric' as const,
3437
object: 'opportunity',
@@ -41,6 +44,7 @@ export const CrmDashboard = {
4144
}
4245
},
4346
{
47+
id: 'avg_deal_size',
4448
title: 'Avg Deal Size',
4549
type: 'metric' as const,
4650
object: 'opportunity',
@@ -55,6 +59,7 @@ export const CrmDashboard = {
5559

5660
// --- Row 2: Charts (provider: 'object' — dynamic aggregation) ---
5761
{
62+
id: 'revenue_trends',
5863
title: 'Revenue Trends',
5964
type: 'area' as const,
6065
object: 'opportunity',
@@ -73,6 +78,7 @@ export const CrmDashboard = {
7378
},
7479
},
7580
{
81+
id: 'lead_source',
7682
title: 'Lead Source',
7783
type: 'donut' as const,
7884
object: 'opportunity',
@@ -93,6 +99,7 @@ export const CrmDashboard = {
9399

94100
// --- Row 3: More Charts (provider: 'object' — dynamic aggregation) ---
95101
{
102+
id: 'pipeline_by_stage',
96103
title: 'Pipeline by Stage',
97104
type: 'bar' as const,
98105
object: 'opportunity',
@@ -111,6 +118,7 @@ export const CrmDashboard = {
111118
},
112119
},
113120
{
121+
id: 'top_products',
114122
title: 'Top Products',
115123
type: 'bar' as const,
116124
object: 'product',
@@ -131,6 +139,7 @@ export const CrmDashboard = {
131139

132140
// --- Row 4: Table (provider: 'object' — dynamic data) ---
133141
{
142+
id: 'recent_opportunities',
134143
title: 'Recent Opportunities',
135144
type: 'table' as const,
136145
object: 'opportunity',
@@ -151,6 +160,7 @@ export const CrmDashboard = {
151160

152161
// --- Row 5: Dynamic KPI from Object Data ---
153162
{
163+
id: 'revenue_by_account',
154164
title: 'Revenue by Account',
155165
type: 'bar' as const,
156166
object: 'opportunity',
@@ -171,6 +181,7 @@ export const CrmDashboard = {
171181

172182
// --- Row 6: Additional aggregate functions (avg, max) + cross-object ---
173183
{
184+
id: 'avg_deal_by_stage',
174185
title: 'Avg Deal Size by Stage',
175186
type: 'line' as const,
176187
object: 'opportunity',
@@ -189,6 +200,7 @@ export const CrmDashboard = {
189200
},
190201
},
191202
{
203+
id: 'orders_by_status',
192204
title: 'Orders by Status',
193205
type: 'bar' as const,
194206
object: 'order',

examples/crm/src/views/account.view.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export const AccountView = {
1414
type: 'grid' as const,
1515
data: { provider: 'object' as const, object: 'account' },
1616
columns: ['name', 'industry', 'annual_revenue', 'phone', 'owner'],
17-
filter: ['type', '=', 'Customer'],
17+
filter: [{ field: 'type', operator: '=', value: 'Customer' }],
1818
sort: [{ field: 'annual_revenue', order: 'desc' as const }],
1919
},
2020
},

examples/crm/src/views/contact.view.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export const ContactView = {
1414
type: 'grid' as const,
1515
data: { provider: 'object' as const, object: 'contact' },
1616
columns: ['name', 'email', 'title', 'account', 'status'],
17-
filter: ['is_active', '=', true],
17+
filter: [{ field: 'is_active', operator: '=', value: true }],
1818
},
1919
},
2020
form: {

examples/crm/src/views/event.view.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ export const EventView = {
2626
type: 'grid' as const,
2727
data: { provider: 'object' as const, object: 'event' },
2828
columns: ['subject', 'start', 'location', 'organizer'],
29-
filter: ['type', '=', 'meeting'],
29+
filter: [{ field: 'type', operator: '=', value: 'meeting' }],
3030
sort: [{ field: 'start', order: 'asc' as const }],
3131
},
3232
},

examples/crm/src/views/order.view.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export const OrderView = {
1414
type: 'grid' as const,
1515
data: { provider: 'object' as const, object: 'order' },
1616
columns: ['name', 'customer', 'amount', 'order_date'],
17-
filter: ['status', '=', 'pending'],
17+
filter: [{ field: 'status', operator: '=', value: 'pending' }],
1818
},
1919
},
2020
form: {

examples/crm/src/views/product.view.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ export const ProductView = {
3939
{ field: 'stock', label: 'STOCK', type: 'number' as const, width: 80, align: 'right' as const },
4040
{ field: 'tags', label: 'TAGS', type: 'select' as const, width: 130 },
4141
],
42-
filter: ['is_active', '=', true],
42+
filter: [{ field: 'is_active', operator: '=', value: true }],
4343
rowHeight: 'short' as const,
4444
},
4545
},

examples/crm/src/views/user.view.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export const UserView = {
1414
type: 'grid' as const,
1515
data: { provider: 'object' as const, object: 'user' },
1616
columns: ['name', 'email', 'role', 'title'],
17-
filter: ['active', '=', true],
17+
filter: [{ field: 'active', operator: '=', value: true }],
1818
},
1919
},
2020
form: {

0 commit comments

Comments
 (0)