diff --git a/.changeset/29951-skills-placed-actions-drawn.md b/.changeset/29951-skills-placed-actions-drawn.md new file mode 100644 index 00000000000..49fd6156d74 --- /dev/null +++ b/.changeset/29951-skills-placed-actions-drawn.md @@ -0,0 +1,11 @@ +--- +'@objectstack/skills': patch +--- + +docs(skills): `objectstack-ui` no longer says `page:header`'s `placedActions: true` is not drawn, and an eval exercises it (#29951) + +Clause-②: no +Metadata-protocol: none + +- `rules/pages.md`: the component catalogue's `page:header` row says `placedActions: true` draws every placed action, read live. The console's header renderer reads the key since #29951's ui half, so the "not drawn yet" qualifier #30018 wrote is dropped. +- `evals/record-page.json`: a third case asks for a custom full record page whose header shows every action packages place on the object; the expected answer keeps the page and its tab strip and sets `placedActions: true` on the `page:header` node, with no `actions` id list beside it. diff --git a/skills/objectstack-ui/evals/README.md b/skills/objectstack-ui/evals/README.md index 581d755d9cb..31776cf9f62 100644 --- a/skills/objectstack-ui/evals/README.md +++ b/skills/objectstack-ui/evals/README.md @@ -10,9 +10,10 @@ view / page / dashboard / report metadata. must escalate to a stored field or app code, and when an ad-hoc in-page `` needs no dataset at all. - `record-page.json` — the record page as the object declares it: a child - table placed first by `relatedList: 'primary'` (no page file), and + table placed first by `relatedList: 'primary'` (no page file), `navigation: { mode: 'page' }` on the list view with the reader's own - open choice left out of metadata. + open choice left out of metadata, and `placedActions: true` on a full + page's `page:header` so packaged header actions draw without an id list. - `report-period-export.json` — a non-`joined` report's `dateRange` (one `type: 'date'` dataset dimension) and `exportOptions` (csv / xlsx under the base object's `allowExport` permission). diff --git a/skills/objectstack-ui/evals/record-page.json b/skills/objectstack-ui/evals/record-page.json index b28933b93ea..92c49e23429 100644 --- a/skills/objectstack-ui/evals/record-page.json +++ b/skills/objectstack-ui/evals/record-page.json @@ -35,6 +35,22 @@ "definePage" ] } + }, + { + "id": 3, + "prompt": "Our account record page is a custom `kind: 'full'` page with its own tab strip. Installed packages keep adding header actions to `account` (an 'Open in billing' link, for one), and none of them ever shows in the page header. Make the header show every action placed on the account's header, including ones a package adds later, without us listing ids.", + "expected_output": "Keep the `kind: 'full'` page and its tab strip, and set `placedActions: true` on its `page:header` node: `{ type: 'page:header', properties: { placedActions: true } }`. The header then draws every action of `account` whose `locations` include `record_header` or `record_more`, read live, so a package's action appears without a page edit. No `actions` id list beside it: an authored list is the whole set, and `placedActions: true` beside one is refused. Not a return to a `slotted` page and never a `slots.tabs`.", + "files": [], + "assertions": { + "must_contain": [ + "placedActions: true", + "page:header" + ], + "must_not_contain": [ + "slots.tabs", + "actions: ['" + ] + } } ] } diff --git a/skills/objectstack-ui/rules/pages.md b/skills/objectstack-ui/rules/pages.md index ef5c2c21cea..68fbee9cca2 100644 --- a/skills/objectstack-ui/rules/pages.md +++ b/skills/objectstack-ui/rules/pages.md @@ -43,7 +43,7 @@ A `slotted` record page has no `tabs` slot — see [Record Page](./record-page.m | `type` | Use | |:---------------------|:----| -| `page:header` | `title` / `subtitle` templates + `actions` (ids of the bound object's actions, never action nodes) or `placedActions: true` (all placed; not drawn yet) | +| `page:header` | `title` / `subtitle` templates + `actions` (ids of the bound object's actions, never action nodes) or `placedActions: true` (all placed, read live) | | `page:card` | Bordered/un-bordered card with `children: Component[]` (plus an optional `footer: Component[]` slot) | | `flex` | Generic styleable box (`properties.children`) — the workhorse for custom layout; style via `responsiveStyles` (see Styling below) | | `element:text` | Text node — `properties.content`; style via `responsiveStyles` |