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
feat(spec): ObjectNavItem.filters — declarative slices on the bare data surface (#2626)
Sync the framework half of objectui#2251 / objectui ADR-0055 (the
/:objectName/data parameterized bare data surface shipped in
objectui#2255):
- spec: ObjectNavItemSchema gains optional filters
(Record<string,string>, equality semantics) with JSDoc + .describe()
mirroring @object-ui/types verbatim; example added; 2 new schema
tests (accept filters + reject non-string values)
- skills/objectstack-ui: the 'Two Run Modes' section becomes three —
data mode / bare filters slice / interface page — with the decision
signals, the one-sentence generation rule, and a pointer to the
canonical objectui app-composition guide instead of a forked copy;
nav example + item-type table updated (target precedence
recordId -> filters -> viewName)
- content/docs/ui/apps.mdx: Object Navigation section documents the
three target fields and the filters example
- changeset: minor for @objectstack/spec
api-surface.json unchanged (field-level addition, no new exports).
Spec suite: 6692/6692 pass.
Claude-Session: https://claude.ai/code/session_018m3GX7EMKNPDZuee152EKK
Co-authored-by: Claude <noreply@anthropic.com>
feat(spec): `ObjectNavItem.filters` — declarative URL filter conditions targeting the parameterized bare data surface (objectui ADR-0055, objectui#2251).
6
+
7
+
An object nav item can now carry `filters: Record<string, string>` (equality semantics). The shell resolves such an entry to `/:objectName/data?filter[<field>]=<value>` — an unanchored data surface with removable filter chips — instead of a saved list view. Use it for one-off / parameterized slices (dashboard drill-throughs, "assigned to me" links); slices worth curating stay on `viewName`. Values support the same `{current_user_id}` / `{current_org_id}` template variables as `recordId`. Target precedence within `type: 'object'`: `recordId` → `filters` → `viewName`. Purely additive — items without `filters` are unaffected.
Three optional target fields refine where the entry lands (precedence: `recordId` → `filters` → `viewName`):
70
+
71
+
-`viewName` — anchor the entry to a named list view.
72
+
-`recordId` — deep-link straight to one record ("My Profile"); supports `{current_user_id}` / `{current_org_id}` template variables.
73
+
-`filters` — a one-off parameterized slice: the entry lands on the **bare data surface** (`/:objectName/data`) with each condition serialized as a removable `filter[<field>]=<value>` URL chip, not anchored to any saved view. Use it for drill-throughs and "assigned to me"-style links instead of authoring a view; values support the same template variables. The surface shows what row-level permissions allow — it is not a security feature.
'URL filter conditions — targets the /:objectName/data bare surface via filter[<field>]=<value> params instead of a saved view. Values support template vars {current_user_id}, {current_org_id}. Precedence: recordId → filters → viewName.',
|`group`|`label`, `icon`, `expanded`, `children[]`| Collapsible group of items |
458
-
|`object`|`objectName`, `viewName?`, `label`, `icon`| Link to an object list (optionally a specific view)|
462
+
|`object`|`objectName`, `viewName?`, `recordId?`, `filters?`, `label`, `icon`| Link to an object list, a named view, a record deep-link, or a `filters` slice on the bare data surface. Target precedence: `recordId` → `filters` → `viewName`|
459
463
|`dashboard`|`dashboardName`, `label`, `icon`| Link to a dashboard |
460
464
|`report`|`reportName`, `label`, `icon`| Link to a report |
461
465
|`page`|`pageName`, `label`, `icon`| Link to a custom Page (`type: 'home' | 'app_launcher' | ...`) |
0 commit comments