Skip to content

feat(studio): listing fields, expiry and structured data (RFC-0042 step 5) - #107

Merged
Madraka merged 1 commit into
mainfrom
feat/stage3-studio
Oct 23, 2026
Merged

Madraka merged 1 commit into
mainfrom
feat/stage3-studio

Conversation

@Madraka

@Madraka Madraka commented Oct 23, 2026

Copy link
Copy Markdown
Contributor

Step 5 of RFC-0042's rollout (ADR-0044), built on #103–#106.

Collection settings: three cards (lazy, each saving only its own setting)

  • Listing fields: up to 4, ordered. A list_field_in_use error links to the pages that use the field.
  • Expiry: date and datetime fields only; unlist or hide, explained in words; grace minutes. A live count shows how many published entries are already past it. gates_unsupported explains that the site must be deployed first.
  • Structured data: a type picker, and one row per path (required first). Each row offers only sources that fit the path; enum constants come from the vocabulary. checkPreset issues show while editing, and a refused save puts its issues on the right rows. A JSON-LD preview for a chosen entry links to the Rich Results Test.
  • Read-only without site:settings.

API: GET /api/sites/:siteId/entries/:entryId/structured-data (content:read; allowed in the playground), mirroring MCP's preview_structured_data.

Collection list

  • Listing-field columns, formatted with formatFieldValue.
  • Filters (date presets upcoming / past / set / empty) and sort buttons on number and date columns.
  • State lives in the URL. While a filter or sort is set, the list is server-paged through GET /entries.

Listing pages and the page editor

  • "Create listing page" makes a draft page at the collection prefix with a contentList; with a date list field and an expiry, it defaults to "upcoming, soonest first".
  • The page editor's content list gets condition rows (only the operators each field type allows) and an order. invalid_query issues show on their row.

Labels and errors: tools.preview_structured_data, wording for the five new error codes, and the expires auto-check reason. ErrorBanner shows a 409's own wording when its code has one.

i18n: a new lazy namespace, listings. Drafts for the other 18 languages, unreviewed.

Checks

  • Studio: 1274/1274, including 17 new tests.
  • ui: 210/210.
  • api: 421/421.
  • turbo typecheck: 20/20. Design lint (396 files), size check and Biome pass.
  • Initial load: 390.0 kB gzip, +0.8 kB (budget 420). About 0.2 kB is core strings, 0.3 kB the router's URL check, and the rest a Kumo chunk split.
  • Screenshots at 1440 and 390 px.

Trade-offs and follow-ups

  • Paging is previous/next while a filter or sort is set.
  • A translation's shared fields can show empty in list columns.
  • The page-editor preview ignores where; this is the known gap in renderSectionHtml from feat(renderer): collections stage 3 in the renderer (RFC-0042 step 3) #105.
  • The "Ended (collection rule)" entry status from RFC §3.3 is not done.
  • apps/studio/src/i18n/generated/ is excluded from the size check, like the other generated folders.

Changeset: minor (cli, api).

🤖 Generated with Claude Code

…FC-0042 step 5)

- Collection settings: lazy Listing fields, Expiry and Structured data
  cards (compatible sources only, vocabulary constants, issues on their
  rows, JSON-LD preview with a Rich Results Test link, a live count of
  entries already past an expiry, gates_unsupported explained).
  Read-only without site:settings.
- API: GET /entries/:id/structured-data (content:read).
- Collection list: listing-field columns, filters and sort in the URL,
  server-paged through GET /entries.
- "Create listing page" makes a page at the collection prefix with a
  contentList; the page editor edits its where/orderBy.
- Labels for preview_structured_data, the five new error codes and the
  `expires` auto-check; 409s show their own wording.
- i18n: lazy `listings` namespace, drafts for the other languages.

Studio 1274/1274, api 421/421; initial load 390.0 kB gzip (+0.8,
budget 420); screenshots at 1440 and 390 px.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Madraka <8898640+Madraka@users.noreply.github.com>
@Madraka
Madraka merged commit 93c942a into main Oct 23, 2026
4 checks passed
@Madraka
Madraka deleted the feat/stage3-studio branch October 23, 2026 12:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant