You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
|**View**| ✅ |🟡|🟡 Studio/ObjectUI renders authored metadata surfaces; general-purpose renderer coverage is still incomplete|
204
+
|**ListView**| ✅ |🟡|🟡 ObjectUI grid/list surfaces support per-view persistence, filters, row actions, density, galleries, and permission-aware affordances; full protocol parity is ongoing|
205
+
|**FormView**| ✅ |🟡|🟡 ObjectUI forms support live field rules (`visibleWhen` / `readonlyWhen` / `requiredWhen`), inline-grid row rules, and server-aligned required enforcement|
206
+
|**Page**| ✅ |🟡|🟡 Record-page authoring, page create flows, block canvas editing, slotted record pages, and selected page blocks are implemented in ObjectUI; full component catalogue remains in progress|
207
+
|**App**| ✅ |🟡|🟡 Navigation metadata is consumed by the console/app shell; full renderer parity remains in progress|
208
+
|**Dashboard**| ✅ |🟡|🟡 ObjectUI renders metric/chart/list/pivot/funnel/table widgets, drill-downs, type-aware cells, and dataset-bound widgets; Studio can author per-widget dataset bindings (`dataset` / `dimensions` / `values`)|
commits. The largest functional clusters were metadata-admin/Studio,
227
+
master-detail forms, reports/dashboards, record detail/related lists,
228
+
action transport, flow designer, developer/API pages, AI draft publishing,
229
+
and i18n.
230
+
- React SDK provides data hooks; the cross-surface renderer is still being
231
+
completed in ObjectUI rather than in this backend repo
221
232
222
233
---
223
234
@@ -273,7 +284,7 @@ The `auth` service in `CoreServiceName` covers both **authentication** (identity
273
284
- Client SDK supports bearer token header — but token validation requires the auth plugin
274
285
- Auth route (`/auth/*`) only appears in Discovery when the auth plugin is registered
275
286
- Fine-grained authorization (RLS, sharing, territory) is internal to the auth plugin
276
-
- **Phase-1 RBAC enforcement is live end-to-end**: REST → ObjectQL → SecurityPlugin middleware now receives a populated `ExecutionContext` (userId, tenantId, roles, permissions). Default `member_default` permission set ships a wildcard RLS rule `organization_id = current_user.organization_id` plus per-object overrides `sys_organization_self` (`id = current_user.organization_id`) and `sys_user_self` (`id = current_user.id`) for the global tables that lack an `organization_id` column. The earlier `tenantField` indirection (RLS expressions written against an abstract `tenant_id` column then rewritten to the configured physical column at compile time) was removed — the placeholder, the column name, and `RLSUserContext.organization_id` are now the same name end-to-end. The legacy `objectql.registerTenantMiddleware` (hardcoded `where.tenant_id` injection that pre-dated SecurityPlugin) has been removed; SecurityPlugin is the sole authority for tenant isolation. Verified cross-organization isolation on `pnpm dev:crm` across `sys_organization`, `sys_member`, `sys_user`, `sys_user_permission_set`, `sys_role_permission_set`. **Anonymous traffic still bypasses enforcement** until a default-deny pass lands.
287
+
- **Phase-1 RBAC enforcement is live end-to-end**: REST → ObjectQL → SecurityPlugin middleware now receives a populated `ExecutionContext` (userId, tenantId, roles, permissions). Default `member_default` permission set ships a wildcard RLS rule `organization_id = current_user.organization_id` plus per-object overrides `sys_organization_self` (`id = current_user.organization_id`) and `sys_user_self` (`id = current_user.id`) for the global tables that lack an `organization_id` column. The earlier `tenantField` indirection (RLS expressions written against an abstract `tenant_id` column then rewritten to the configured physical column at compile time) was removed — the placeholder, the column name, and `RLSUserContext.organization_id` are now the same name end-to-end. The legacy `objectql.registerTenantMiddleware` (hardcoded `where.tenant_id` injection that pre-dated SecurityPlugin) has been removed; SecurityPlugin is the sole authority for tenant isolation. Analytics now uses the same reusable read scope via `security.getReadFilter`, so dataset-bound dashboards/reports do not bypass RLS. Verified cross-organization isolation on `pnpm dev:crm` across `sys_organization`, `sys_member`, `sys_user`, `sys_user_permission_set`, `sys_role_permission_set`. **Anonymous traffic still bypasses enforcement** until a default-deny pass lands.
277
288
278
289
---
279
290
@@ -373,11 +384,19 @@ The `auth` service in `CoreServiceName` covers both **authentication** (identity
373
384
-[ ] Realtime Subscriptions
374
385
-[ ] WebSocket Support
375
386
376
-
### Phase 7: UI Layer 📋**PLANNED**
387
+
### Phase 7: UI Layer 🟡**IN PROGRESS**
377
388
-[ ] UI Renderer
378
-
-[ ] Form Builder
379
-
-[ ] List View Renderer
380
-
-[ ] Dashboard Renderer
389
+
-[x] Studio metadata-admin engine — generic metadata list/detail/edit surfaces, live preview, draft/publish/rollback, create-mode forms, server-side diagnostics, package scoping, and skew-safe curated inspectors
390
+
-[x] Form conditional rules — ObjectUI supports `visibleWhen`, `readonlyWhen`, `requiredWhen`, row-scoped inline-grid rules, and required-on-submit enforcement
391
+
-[x] Master-detail forms — inline subforms, spreadsheet-style line items, atomic batch create/edit, lookup auto-fill, line ordering, duplicate/reorder, and subtotal/tax/total stack
392
+
-[x] Record detail + related lists — derived related lists, record-page assignment, action slots, system/audit sections, and opt-in reference rail
-[x] Authorization Plugin — `@objectstack/plugin-security` enforces CRUD/FLS/RLS in the ObjectQL middleware chain; REST → ObjectQL now propagates `ExecutionContext` end-to-end (Phase-1)
392
411
-[x] Row-Level Security — default `member_default` permission set applies a wildcard `organization_id = current_user.organization_id` rule plus per-object overrides `sys_organization_self` / `sys_user_self`. The earlier `tenantField` rewrite indirection was removed: RLS column, placeholder, and `RLSUserContext.organization_id` use the same canonical name end-to-end
412
+
-[x] Analytics RLS bridge — `@objectstack/service-analytics` auto-bridges to `security.getReadFilter(object, context)` and fails closed when read-scope resolution cannot be safely applied
393
413
-[x] Multi-tenancy — verified cross-organization isolation on `pnpm dev:crm` (Alice@OrgAlpha vs. Bob@OrgBeta only see their own records across `sys_organization`, `sys_member`, `sys_user`, and `sys_*_permission_set` link tables)
394
414
-[x] Legacy `objectql.registerTenantMiddleware` removed — SecurityPlugin is now the sole tenant-isolation authority
0 commit comments