@elytracms/studio 0.0.78 → 0.0.79
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/app-views/default-modules.js +5 -1
- package/dist/components/app-views/default-modules.js.map +1 -1
- package/dist/components/assets/asset-thumb.js +12 -11
- package/dist/components/assets/asset-thumb.js.map +1 -1
- package/dist/components/builder/blocks-panel.d.ts +11 -5
- package/dist/components/builder/blocks-panel.js +18 -24
- package/dist/components/builder/blocks-panel.js.map +1 -1
- package/dist/components/builder/canvas-render-context.d.ts +22 -0
- package/dist/components/builder/canvas-render-context.js +65 -9
- package/dist/components/builder/canvas-render-context.js.map +1 -1
- package/dist/components/builder/reuse.d.ts +25 -0
- package/dist/components/builder/reuse.js +11 -2
- package/dist/components/builder/reuse.js.map +1 -1
- package/dist/components/cms/asset-field.js +52 -19
- package/dist/components/cms/asset-field.js.map +1 -1
- package/dist/components/cms/asset-picker-core.d.ts +40 -0
- package/dist/components/cms/asset-picker-core.js +21 -0
- package/dist/components/cms/asset-picker-core.js.map +1 -1
- package/dist/components/cms/asset-picker.d.ts +11 -2
- package/dist/components/cms/asset-picker.js +34 -13
- package/dist/components/cms/asset-picker.js.map +1 -1
- package/dist/components/cms/cell.js +2 -1
- package/dist/components/cms/cell.js.map +1 -1
- package/dist/components/cms/cms-store.d.ts +8 -1
- package/dist/components/cms/cms-store.js +8 -7
- package/dist/components/cms/cms-store.js.map +1 -1
- package/dist/components/cms/collection-table.js +7 -1
- package/dist/components/cms/collection-table.js.map +1 -1
- package/dist/components/cms/date-input-core.d.ts +64 -0
- package/dist/components/cms/date-input-core.js +78 -0
- package/dist/components/cms/date-input-core.js.map +1 -0
- package/dist/components/cms/date-input.d.ts +43 -0
- package/dist/components/cms/date-input.js +109 -0
- package/dist/components/cms/date-input.js.map +1 -0
- package/dist/components/cms/document-diff-view.js +2 -1
- package/dist/components/cms/document-diff-view.js.map +1 -1
- package/dist/components/cms/document-staging.d.ts +15 -4
- package/dist/components/cms/document-staging.js +26 -15
- package/dist/components/cms/document-staging.js.map +1 -1
- package/dist/components/cms/editable-cell.js +39 -5
- package/dist/components/cms/editable-cell.js.map +1 -1
- package/dist/components/cms/field-control.js +38 -7
- package/dist/components/cms/field-control.js.map +1 -1
- package/dist/components/cms/scalar-value-editor.js +4 -1
- package/dist/components/cms/scalar-value-editor.js.map +1 -1
- package/dist/components/cms/slug-auto-derive.d.ts +41 -0
- package/dist/components/cms/slug-auto-derive.js +14 -0
- package/dist/components/cms/slug-auto-derive.js.map +1 -0
- package/dist/components/components/transfer-dialog.js +3 -1
- package/dist/components/components/transfer-dialog.js.map +1 -1
- package/dist/components/project-session.d.ts +44 -22
- package/dist/components/project-session.js +72 -36
- package/dist/components/project-session.js.map +1 -1
- package/dist/lib/assets/asset-url.d.ts +20 -0
- package/dist/lib/assets/asset-url.js +25 -0
- package/dist/lib/assets/asset-url.js.map +1 -0
- package/dist/lib/assets/browser-blob-storage.d.ts +80 -0
- package/dist/lib/assets/browser-blob-storage.js +86 -0
- package/dist/lib/assets/browser-blob-storage.js.map +1 -0
- package/dist/lib/assets/index.d.ts +2 -0
- package/dist/lib/assets/index.js +2 -0
- package/dist/lib/assets/index.js.map +1 -1
- package/dist/lib/data/collection-content.d.ts +20 -1
- package/dist/lib/data/collection-content.js +51 -1
- package/dist/lib/data/collection-content.js.map +1 -1
- package/dist/lib/data/content-session-refresh.d.ts +74 -0
- package/dist/lib/data/content-session-refresh.js +138 -0
- package/dist/lib/data/content-session-refresh.js.map +1 -0
- package/dist/lib/data/index.d.ts +2 -0
- package/dist/lib/data/index.js +2 -0
- package/dist/lib/data/index.js.map +1 -1
- package/dist/lib/data/playground-unload-guard.d.ts +22 -0
- package/dist/lib/data/playground-unload-guard.js +73 -0
- package/dist/lib/data/playground-unload-guard.js.map +1 -0
- package/dist/lib/i18n/messages.de.js +3 -1
- package/dist/lib/i18n/messages.de.js.map +1 -1
- package/dist/lib/i18n/messages.en.d.ts +2 -0
- package/dist/lib/i18n/messages.en.js +5 -1
- package/dist/lib/i18n/messages.en.js.map +1 -1
- package/dist/lib/persistence/index.js +6 -1
- package/dist/lib/persistence/index.js.map +1 -1
- package/dist/ui/input.d.ts +8 -3
- package/dist/ui/input.js +6 -1
- package/dist/ui/input.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cms-store.js","sourceRoot":"","sources":["../../../src/components/cms/cms-store.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport type { ReactNode } from 'react'\nimport {\n createCollectionRegistry,\n createDocumentStore,\n documentKey,\n documentSchema,\n resolveDocumentTitle,\n resolveField,\n sampleDocuments,\n seedDefaults,\n sampleFilterableCollections,\n sampleLocaleConfig,\n samplePublishedKeys,\n resolveSingletonDocument,\n titleFieldOf,\n validateDocument,\n} from '@elytracms/core/cms-core'\nimport type {\n CmsDocument,\n CmsValidationIssue,\n CollectionDef,\n CollectionRegistry,\n DocumentRef,\n FieldDef,\n Locale,\n LocaleConfig,\n LocalizedString,\n RestoreScope,\n} from '@elytracms/core/cms-core'\nimport type { CmsDocumentRecord, DocumentVersionRecord } from '@elytracms/core/persistence'\nimport { translate } from '@elytracms/studio/lib/i18n'\nimport { configureStudioLocales, useStudioLocale } from '@elytracms/studio/lib/locale'\nimport { studioManifestLookup } from '@elytracms/studio/lib/registry'\nimport { resolveDeploymentCollections, resolveDeploymentRoutes } from '@elytracms/studio/lib/workspace'\nimport { validateComposition, validateRichTextEmbeds } from './cms-composition-validators'\nimport { matchesRef, removeDoc, replaceDoc, upsertDoc } from './document-ref-utils'\nimport { createRequiredContext } from '@elytracms/studio/lib/required-context'\nimport { createCmsPersister, getStudioOperations } from '@elytracms/studio/lib/operations'\nimport type {\n CmsPersister,\n OperationError,\n OperationResult,\n} from '@elytracms/studio/lib/operations'\nimport {\n ALL_VIEW_ID,\n DEFAULT_VIEW_OVERRIDE_ID,\n canonicalViewState,\n configViewIssues,\n defaultConfigViewId,\n defaultViewState,\n deprecatedDefaultFlagViewIds,\n hasDefaultViewOverride,\n pseudoColumns,\n resolveCollectionViews,\n viewStatesEqual,\n} from '@elytracms/studio/lib/cms-views'\nimport type { TableViewState } from '@elytracms/studio/lib/cms-views'\nimport { useOptionalAssets } from '../assets/assets-store'\nimport { consumeStagedDocuments } from './document-staging'\nimport { applyCellValue, commitCellEdit } from './cell-edit'\nimport type { CellCommitInput, CellCommitOutcome } from './cell-edit'\nimport { runBulkAction } from './bulk-actions'\nimport type { BulkAction, BulkReport, BulkSetField } from './bulk-actions'\nimport { cleanHiddenForPublish } from './publish-clean'\n\n/**\n * A resolved table view: a named bundle of filters (closed AD-3 vocabulary),\n * sort, and visible/ordered columns. EC-246b: named views are **config-as-code**\n * (declared in `cms/`, read live via `configViewsFor`) — the editor-owned DB\n * saved-view store (EC-169) is retired. The unnamed \"All documents\" default is\n * derived per collection; editors keep only transient in-session tweaks + Reset.\n */\nexport interface SavedView {\n id: string\n /**\n * The view label — a {@link LocalizedString} (EC-343): the built-in \"All\" default is\n * a plain translated string; a config view's name may be a `{ locale }` map, resolved\n * at the render site (`ViewTabs`) via the same `resolveLabel` path as `form.label`.\n */\n name: LocalizedString\n state: TableViewState\n}\n\nexport interface ImportReport {\n added: number\n rejected: { id: string; issues: CmsValidationIssue[] }[]\n}\n\n/**\n * A document's recorded version history plus its live pin (EC-224), as the\n * Versions inspector pane reads it. `versions` is newest-first; `publishedVersion`\n * is the recorded version currently pinned live, absent when unpublished.\n */\nexport interface DocumentVersionsView {\n versions: DocumentVersionRecord[]\n publishedVersion?: number\n}\n\nexport interface CmsStore {\n /** The project this CMS session edits (set when persistence is enabled); the asset picker scopes the real library by it (EC-152). */\n projectId?: string\n collections: readonly CollectionDef[]\n localeConfig: LocaleConfig\n /**\n * The studio's ambient active locale (EC-176): table cells, detail forms,\n * and inline edits all display and write THIS locale. Switched once via the\n * shared `LocaleSwitcher`, never per control.\n */\n activeLocale: Locale\n getCollection(id: string): CollectionDef | undefined\n documentsOf(collectionId: string): CmsDocument[]\n getDocument(ref: DocumentRef): CmsDocument | undefined\n /** Resolve a relation/asset target's display title. */\n titleOf(ref: DocumentRef): string\n saveDocument(doc: CmsDocument): void\n /**\n * Commit ONE field edit from the table (EC-168): optimistic session apply +\n * exactly one `documents.upsert` operations command, awaited. Validation\n * failures and operation rejections return a structured error (the caller\n * renders it on the cell) and leave the session rolled back.\n */\n commitFieldEdit(input: CellCommitInput): Promise<CellCommitOutcome>\n createDocument(collectionId: string): DocumentRef\n /**\n * Ensure a singleton collection's lone document exists and return its ref\n * (EC-274). Resolves the existing single document, or creates one with a normal\n * generated id (never the collection id). Idempotent. The singleton route opens\n * through this so the one document always exists to edit.\n */\n ensureSingletonDocument(collectionId: string): DocumentRef\n deleteDocument(ref: DocumentRef): void\n /**\n * Is this document currently published? Sourced from the version POINTER\n * (EC-224), not the flat `state` enum — seeded from hydration and updated by\n * {@link publishDocument}/{@link unpublishDocument}.\n */\n isPublished(ref: DocumentRef): boolean\n /**\n * The record's last-write ISO timestamp (EC-445) — the data behind the\n * `$updatedAt` list column. Seeded from hydration (connected: the persisted\n * `cmsDocuments.updatedAt`; playground: session-start for the seeded fixtures),\n * then re-stamped on the common edit paths. `undefined` for a ref the session\n * has no timestamp for. See {@link documentPublishedAt} for the publish-instant column.\n */\n documentUpdatedAt(ref: DocumentRef): string | undefined\n /**\n * The record's FIRST-publish ISO instant (EC-447) — the data behind the\n * `$publishedAt` list column. Seeded from hydration (the persisted\n * `cmsDocuments.publishedAt`), then re-stamped/cleared authoritatively on\n * publish/unpublish from the reconciled backend record (set-once on publish,\n * cleared on unpublish). `undefined` for a draft / never-published /\n * currently-unpublished ref (the column shows EmDash).\n */\n documentPublishedAt(ref: DocumentRef): string | undefined\n /**\n * Does this PUBLISHED document's working draft carry unpublished changes\n * (EC-449)? The cheap per-row signal behind the amber \"changed\" `$state` dot —\n * sourced from the materialized `cmsDocuments.hasUnpublishedChanges` (computed\n * ONCE at the write chokepoint, never per render). Seeded from hydration, then\n * re-stamped authoritatively from the returned record on save (the persister's\n * saved-record hook / the inline-edit dispatch), publish (→ false) and\n * unpublish (→ cleared). Always `false` for a draft / never-published ref.\n */\n documentHasUnpublishedChanges(ref: DocumentRef): boolean\n /**\n * Publish: snapshot the draft as a new version and pin it live (EC-224).\n * Flips published-ness optimistically, then reconciles against the backend\n * record (EC-225) so the badge can never claim a publish the backend refused\n * (e.g. blocked by publish-time field validation).\n */\n publishDocument(ref: DocumentRef): Promise<void>\n /**\n * Unpublish: clear the live version pin (EC-224). Blocked at the operations\n * layer while strict relation fields published-reference it (EC-173); the\n * optimistic flip reconciles against the backend on rejection (EC-225).\n */\n unpublishDocument(ref: DocumentRef): Promise<void>\n /**\n * Load this document's recorded version history + live pin (EC-224) for the\n * Versions inspector pane. Fixture/playground sessions (no project) have no\n * persisted history → an empty view. Failures surface as {@link persistError}.\n */\n loadDocumentVersions(ref: DocumentRef): Promise<DocumentVersionsView>\n /**\n * Restore a recorded version as the new working draft (EC-224): the operation\n * snapshots the current draft first (so the rollback is itself undoable), then\n * loads the chosen snapshot. An optional `scope` (EC-298) restores only one\n * field or block, laid over the current draft, instead of the whole document.\n * Returns the restored draft (or null on failure/fixture session) so the open\n * editor can adopt it.\n */\n restoreDocumentVersion(\n ref: DocumentRef,\n version: number,\n scope?: RestoreScope,\n ): Promise<CmsDocument | null>\n importDocuments(collectionId: string, docs: unknown[]): ImportReport\n validate(doc: CmsDocument): CmsValidationIssue[]\n isFieldReadOnly(field: FieldDef): boolean\n // Views (EC-246b): the built-in default + config-declared named views (from\n // `cms/`, read live). Shared views are code, not editor-owned DB data.\n viewsOf(collectionId: string): SavedView[]\n activeViewId(collectionId: string): string\n /** Switch views — resets the working table state to the view's state. */\n setActiveView(collectionId: string, viewId: string): void\n /** The live table state (the active view's state plus unsaved edits). */\n tableStateOf(collectionId: string): TableViewState\n /**\n * Update the working state. Always pass an updater when deriving from the\n * previous state — render-time snapshots go stale across rapid events.\n */\n setTableState(\n collectionId: string,\n update: TableViewState | ((prev: TableViewState) => TableViewState),\n ): void\n /** Does the working state diverge from the active view (\"unsaved changes\")? */\n isViewDirty(collectionId: string): boolean\n /** Discard working-state edits, back to the active view. */\n resetTableState(collectionId: string): void\n /**\n * Bulk publish/unpublish/delete (EC-169) + set-field (EC-247): one operations\n * command PER item, per-item outcomes in the report — partial failure is\n * enumerated, never silent. Only succeeded items mutate the session. A\n * `set-field` carries its `{ field, value }` payload.\n */\n runBulk(\n collectionId: string,\n ids: readonly string[],\n action: BulkAction,\n setField?: BulkSetField,\n ): Promise<BulkReport>\n /**\n * Mirror a collection into the session (e.g. an accepted AI-generated\n * schema, EC-097). Replaces by id. Session-only: persistence happens through\n * the accept flow's changeset (`schema.upsertCollection`), not here.\n */\n addCollection(def: CollectionDef): void\n /**\n * Most recent failed/denied persisted mutation (structured, from the\n * operation result). Rendered by the CMS surface — never a silent failure.\n */\n persistError: OperationError | null\n clearPersistError(): void\n /** Seed the persisted baseline now (e.g. before applying an AI changeset). */\n ensurePersistedBaseline(): Promise<void>\n /** Await all queued persisted mutations (tests, publish flows). */\n flushPersistence(): Promise<void>\n}\n\nconst { Context: CmsContext, useRequired: useCms } = createRequiredContext<CmsStore>('Cms')\n\nfunction primaryField(collection: CollectionDef): string {\n return titleFieldOf(collection)?.name ?? collection.fields[0]?.name ?? 'id'\n}\n\n/**\n * EC-316 (bug fix) — mint a fresh, COLLISION-FREE document id for `+ New`.\n *\n * `seq` is an in-memory, per-session counter (reset to 0 on every reload). A\n * document minted `new-<collection>-<n>` in a PRIOR session can already occupy\n * whatever `n` this session's counter would next reissue — the pre-fix bug:\n * `+ New` on a `post` collection that already held a (possibly published)\n * `new-post-1` handed out that SAME id again, silently opening the existing\n * document for editing instead of creating a fresh draft. Walking the counter\n * past every id already in `existingIds` makes the mint collision-free\n * regardless of what a prior session left behind.\n */\nexport function mintDocumentId(\n collectionId: string,\n seq: { current: number },\n existingIds: ReadonlySet<string>,\n): string {\n let id: string\n do {\n seq.current += 1\n id = `new-${collectionId}-${seq.current}`\n } while (existingIds.has(id))\n return id\n}\n\n/**\n * Build a fresh document for `collectionId`: a collision-free id (EC-316, via\n * {@link mintDocumentId} against every id `existingDocs` already holds for\n * this collection) and the collection's declared field defaults (EC-297, via\n * `seedDefaults`). Pure — the sensitive part of the insert sequence shared by\n * `createDocument` and `ensureSingletonDocument`'s empty branch (via the\n * private `insertNewDocument` below), factored out so it's unit-testable\n * without a `CmsProvider`.\n */\nexport function buildNewDocument(\n collectionId: string,\n registry: CollectionRegistry,\n seq: { current: number },\n existingDocs: readonly CmsDocument[],\n): CmsDocument {\n const existingIds = new Set(\n existingDocs.filter((d) => d.collection === collectionId).map((d) => d.id),\n )\n const id = mintDocumentId(collectionId, seq, existingIds)\n const collection = registry.get(collectionId)\n return { collection: collectionId, id, values: collection ? seedDefaults(collection) : {} }\n}\n\n/**\n * Does `docs` already hold a document for `collectionId`? `ensureSingletonDocument`'s\n * empty branch re-checks this INSIDE the `setDocuments` updater (against the\n * latest `prev`, not a stale snapshot) so a concurrent invocation — StrictMode's\n * double-invoked effect, or a second caller racing the same synchronous guard —\n * can never materialize a second singleton document.\n */\nexport function hasDocumentFor(docs: readonly CmsDocument[], collectionId: string): boolean {\n return docs.some((d) => d.collection === collectionId)\n}\n\n/**\n * Surface a duplicate `initial: true` across a collection's config views (EC-343/\n * EC-444) as a visible, one-time console warning — never a silent swallow. This is a\n * developer config mistake (editors can't fix config-as-code), so it takes the same\n * warn-once console channel the i18n runtime uses for config problems, not an editor\n * banner; the first-declared still seeds deterministically. Deduped per collection id.\n */\nconst warnedDuplicateDefaultCollections = new Set<string>()\nfunction warnDuplicateDefaultViews(collection: CollectionDef): void {\n if (warnedDuplicateDefaultCollections.has(collection.id)) return\n const issues = configViewIssues(collection)\n if (issues.length === 0) return\n warnedDuplicateDefaultCollections.add(collection.id)\n if (typeof console !== 'undefined') console.warn(`[views] ${issues[0]!.message}`)\n}\n\n/**\n * Surface the DEPRECATED `default: true` view flag (EC-444) as a one-time console\n * warning per collection — never silent. `default` (the view flag) is renamed to\n * `initial`; it is read as an alias for one release and removed next release. Same\n * warn-once channel as the duplicate check; deduped per collection id.\n */\nconst warnedDeprecatedDefaultCollections = new Set<string>()\nfunction warnDeprecatedDefaultFlag(collection: CollectionDef): void {\n if (warnedDeprecatedDefaultCollections.has(collection.id)) return\n const ids = deprecatedDefaultFlagViewIds(collection)\n if (ids.length === 0) return\n warnedDeprecatedDefaultCollections.add(collection.id)\n if (typeof console !== 'undefined') {\n console.warn(\n `[views] Collection \"${collection.id}\" uses the deprecated view flag \\`default\\` on ${ids.join(', ')}; rename it to \\`initial\\` (EC-444 — \\`default\\` is removed next release).`,\n )\n }\n}\n\n/** The unnamed built-in view: no filters, no sort, every field visible. */\nfunction defaultView(\n collection: CollectionDef | undefined,\n pseudo: readonly string[] = [],\n): SavedView {\n return {\n id: ALL_VIEW_ID,\n name: translate('cms.list.view.all'),\n state: collection\n ? defaultViewState(collection, pseudo)\n : { filters: [], sort: null, columns: [], hidden: [] },\n }\n}\n\n/**\n * The CMS session store (EC-141): documents and collections are optimistic,\n * synchronous session state (live validation while typing); every mutation —\n * create/save/delete/state transitions — is mirrored onto the operations\n * layer (`documents.*` / `schema.*` commands) through {@link createCmsPersister}.\n * Failed/denied commands surface as {@link CmsStore.persistError}.\n */\nexport function CmsProvider({\n children,\n projectId,\n initialCollections,\n initialDocuments,\n initialPublishedKeys,\n initialTimestamps,\n initialPublishTimestamps,\n initialChangedKeys,\n initialLocaleConfig,\n}: {\n children: ReactNode\n /** Enables persistence through the shared operations client. */\n projectId?: string\n /** Seed collections (e.g. from an imported starter kit, EC-119); defaults to the samples. */\n initialCollections?: CollectionDef[]\n initialDocuments?: CmsDocument[]\n /**\n * Published document keys from hydration (EC-224): the version pointer\n * (`publishedVersion` set). Absent (kit / fixture sessions) → the sample\n * fixtures' published set (`samplePublishedKeys`).\n */\n initialPublishedKeys?: readonly string[]\n /**\n * Per-document last-write timestamps from hydration (EC-445), keyed by\n * `documentKey` (`collection:id`) → ISO string. Backs the `$updatedAt` list column.\n * Absent (playground / kit session) → the seeded documents get a session-start\n * timestamp so the column is never blank, then re-stamped on edits.\n */\n initialTimestamps?: Record<string, string>\n /**\n * Per-document FIRST-publish instants from hydration (EC-447), keyed by\n * `documentKey` (`collection:id`) → ISO string. Backs the `$publishedAt` column.\n * UNLIKE {@link initialTimestamps} there is NO session-start fallback — an absent\n * entry is a real \"no publish date\" (EmDash); the store re-stamps/clears it\n * authoritatively on publish/unpublish. Absent (playground / kit) → empty map.\n */\n initialPublishTimestamps?: Record<string, string>\n /**\n * Document keys whose draft carries unpublished changes, from hydration\n * (EC-449, the persisted `cmsDocuments.hasUnpublishedChanges === true` set) —\n * the amber \"changed\" `$state` dot. Mirrors {@link initialPublishedKeys}; the\n * store re-stamps the set authoritatively on save/publish/unpublish from the\n * returned records. Absent (playground / kit) → empty set.\n */\n initialChangedKeys?: readonly string[]\n /** Locale config for the seeded content; defaults to the sample config. */\n initialLocaleConfig?: LocaleConfig\n}) {\n const [documents, setDocuments] = useState<CmsDocument[]>(() => {\n const seeded = (initialDocuments ?? sampleDocuments).map((d) => structuredClone(d))\n // EC-320 (0.0.44 follow-up): merge any documents STAGED by the\n // Components-view \"Use in document…\" transfer — a cross-mount handoff in\n // EVERY mode now (see document-staging.ts), not just the playground. The\n // merge rule itself stays mode-aware there: playground's seeded set is a\n // static baseline that never reflects a write (staged always wins);\n // Convex's is a fresh per-mount hydration query (staged fills gaps only,\n // dropped once the seeded set actually carries the key).\n return consumeStagedDocuments(projectId, seeded)\n })\n // Published-ness as the version POINTER (EC-224), decoupled from the flat\n // `state` enum: seeded from hydration's pointer set, or — when none is supplied\n // — the canonical sample published set for the playground. A kit's imported\n // content (`initialDocuments` without a pointer set) starts unpublished\n // (drafts) until an editor publishes it. The flat `state` is never consulted.\n const [publishedKeys, setPublishedKeys] = useState<Set<string>>(() => {\n if (initialPublishedKeys) return new Set(initialPublishedKeys)\n return new Set(initialDocuments ? [] : samplePublishedKeys)\n })\n // EC-445: per-document last-write timestamps behind the `$updatedAt` column.\n // Seeded from hydration (connected: the persisted `cmsDocuments.updatedAt`), then\n // re-stamped on the common edit paths. A seeded document with no hydrated timestamp\n // (the playground fixtures / a kit) gets a session-start stamp so the column is\n // never a wall of blanks; a fresh draft is stamped when it is created.\n const [updatedAtByKey, setUpdatedAtByKey] = useState<Map<string, string>>(() => {\n const now = new Date().toISOString()\n const map = new Map<string, string>()\n if (initialTimestamps) {\n for (const [key, value] of Object.entries(initialTimestamps)) map.set(key, value)\n }\n for (const doc of initialDocuments ?? sampleDocuments) {\n const key = documentKey(doc)\n if (!map.has(key)) map.set(key, now)\n }\n return map\n })\n const stampUpdatedAt = useCallback(\n (ref: DocumentRef, iso: string = new Date().toISOString()) => {\n setUpdatedAtByKey((prev) => {\n const next = new Map(prev)\n next.set(documentKey(ref), iso)\n return next\n })\n },\n [],\n )\n const documentUpdatedAt = useCallback(\n (ref: DocumentRef) => updatedAtByKey.get(documentKey(ref)),\n [updatedAtByKey],\n )\n // EC-447: per-document FIRST-publish instants behind the `$publishedAt` column.\n // Seeded from hydration (the persisted `cmsDocuments.publishedAt`); UNLIKE\n // `$updatedAt` there is NO session-start fallback — an absent entry is a real \"no\n // publish date\" (EmDash). The store re-stamps/clears it authoritatively on\n // publish/unpublish (the set-once + clear semantics live in the persistence spine).\n const [publishedAtByKey, setPublishedAtByKey] = useState<Map<string, string>>(() => {\n const map = new Map<string, string>()\n if (initialPublishTimestamps) {\n for (const [key, value] of Object.entries(initialPublishTimestamps)) map.set(key, value)\n }\n return map\n })\n // Adopt the AUTHORITATIVE publish instant from the reconciled record: an ISO value\n // stamps it (set-once is enforced server-side, so this only ever adopts the pinned\n // first-publish value); `undefined` CLEARS it (unpublish). Mirrors `stampUpdatedAt`\n // but supports clearing — the column shows a date iff the doc is currently published.\n const stampPublishedAt = useCallback((ref: DocumentRef, iso: string | undefined) => {\n setPublishedAtByKey((prev) => {\n const key = documentKey(ref)\n if (iso === undefined) {\n if (!prev.has(key)) return prev\n const next = new Map(prev)\n next.delete(key)\n return next\n }\n if (prev.get(key) === iso) return prev\n const next = new Map(prev)\n next.set(key, iso)\n return next\n })\n }, [])\n const documentPublishedAt = useCallback(\n (ref: DocumentRef) => publishedAtByKey.get(documentKey(ref)),\n [publishedAtByKey],\n )\n // EC-449: the documents whose draft carries unpublished changes — the amber\n // \"changed\" `$state` dot. A SET like `publishedKeys` (membership = the\n // materialized `hasUnpublishedChanges === true`); seeded from hydration, then\n // re-stamped authoritatively from returned records — the verdict is computed\n // ONCE at the write chokepoint (both adapters), never client-side per render.\n const [changedKeys, setChangedKeys] = useState<Set<string>>(\n () => new Set(initialChangedKeys ?? []),\n )\n // Adopt the authoritative flag: `true` adds the key; `false`/`undefined` (not\n // changed / cleared at unpublish / not materialized) both remove it — the dot\n // renders those identically, so the set stores no tri-state.\n const stampHasUnpublishedChanges = useCallback(\n (ref: DocumentRef, changed: boolean | undefined) => {\n setChangedKeys((prev) => {\n const key = documentKey(ref)\n if (prev.has(key) === (changed === true)) return prev\n const next = new Set(prev)\n if (changed === true) next.add(key)\n else next.delete(key)\n return next\n })\n },\n [],\n )\n const documentHasUnpublishedChanges = useCallback(\n (ref: DocumentRef) => changedKeys.has(documentKey(ref)),\n [changedKeys],\n )\n // The one adoption seam for a SAVED document record (persister queue upsert,\n // inline cell edit, bulk set-field, restore): stamp the server-computed\n // changed verdict for the record's ref. Referentially stable — the persister\n // closes over it once.\n const adoptSavedRecord = useCallback(\n (record: CmsDocumentRecord) => {\n stampHasUnpublishedChanges(\n { collection: record.document.collection, id: record.document.id },\n record.hasUnpublishedChanges,\n )\n },\n [stampHasUnpublishedChanges],\n )\n const [activeViews, setActiveViews] = useState<Record<string, string>>({})\n // The live table state per collection where it diverges from the active\n // view; absent key = exactly the active view's state (not dirty).\n const [tableStates, setTableStates] = useState<Record<string, TableViewState>>({})\n // Collections are stateful so AI-generated schemas (EC-097) can be accepted\n // into the session. The session schema IS the source the sort/filter\n // offering follows (EC-177 gap 3): hydrated sessions receive the persisted\n // schema via `initialCollections`; the fixture fallback is the canonical\n // cms-core sample schema WITH its declared `filterable` flags — no\n // session-side widenings, so the studio never offers a field the backend's\n // delivery engine would reject.\n const [collections, setCollections] = useState<CollectionDef[]>(() => [\n ...(initialCollections ?? sampleFilterableCollections),\n ])\n const [persistError, setPersistError] = useState<OperationError | null>(null)\n const seq = useRef(0)\n // EC-274: collection ids whose lone singleton document this session has already\n // created — a synchronous guard so a re-invoked effect (or StrictMode's double\n // mount) never materializes a second document under a freshly generated id.\n const ensuredSingletons = useRef<Set<string>>(new Set())\n\n // Latest session state for the persister's lazy baseline (no re-subscribing).\n const collectionsRef = useRef(collections)\n collectionsRef.current = collections\n const documentsRef = useRef(documents)\n documentsRef.current = documents\n\n const persisterRef = useRef<CmsPersister | null>(null)\n if (persisterRef.current === null && projectId !== undefined) {\n persisterRef.current = createCmsPersister({\n projectId,\n getOperations: async () => (await getStudioOperations()).operations,\n getCollections: () => collectionsRef.current,\n getDocuments: () => documentsRef.current,\n // EC-277: self-type composition static props on write (the manifest half of\n // the lens), so extraction stays schema-free. Document fields self-type via\n // the schema alone (above); the registry adds blocks/embed prop coverage.\n lookupManifest: studioManifestLookup(),\n onError: setPersistError,\n // EC-449: adopt the server-computed `hasUnpublishedChanges` verdict from\n // every queued upsert's authoritative record (saves, imports, bulk-cleaned\n // drafts) — the amber list dot follows the chokepoint, never a client guess.\n onDocumentSaved: adoptSavedRecord,\n })\n }\n\n const registry = useMemo(() => createCollectionRegistry(collections), [collections])\n const store = useMemo(() => createDocumentStore(documents), [documents])\n const localeConfig = initialLocaleConfig ?? sampleLocaleConfig\n\n // Asset existence is validated against the REAL asset library (assets live in\n // their own repository, not as CMS documents). With the ambient AssetsProvider\n // present, the oracle is the set of uploaded asset ids — but only once loaded;\n // while it loads we are optimistic so a valid upload is never transiently\n // flagged \"unknown\". With no provider (tests/fixtures), the oracle is absent\n // and asset existence falls back to the document store.\n const assetStore = useOptionalAssets()\n const assetExists = useMemo<((id: string) => boolean) | undefined>(() => {\n if (!assetStore) return undefined\n if (assetStore.status !== 'ready') return () => true\n const ids = new Set(assetStore.assets.map((asset) => asset.id))\n return (id) => ids.has(id)\n }, [assetStore])\n\n // The ambient studio locale (EC-176): this session's locale config drives\n // the switcher options; every CMS surface follows the one active locale.\n const { locale: activeLocale } = useStudioLocale()\n useEffect(() => {\n configureStudioLocales(localeConfig)\n }, [localeConfig])\n\n const getCollection = useCallback((id: string) => registry.get(id), [registry])\n\n const getDocument = useCallback(\n (ref: DocumentRef) => documents.find((d) => matchesRef(d, ref)),\n [documents],\n )\n\n const titleOf = useCallback(\n (ref: DocumentRef) => {\n const doc = documents.find((d) => matchesRef(d, ref))\n const collection = registry.get(ref.collection)\n if (!doc || !collection) return ref.id\n // EC-296/EC-242: a function `titleField` (title pattern) composes the title\n // from the document's resolved values (active locale). Only resolve the full\n // value set when a function is declared — the common string `titleField` case\n // still resolves the single title field below (primaryField === the title field).\n if (typeof collection.titleField === 'function') {\n const values: Record<string, unknown> = {}\n for (const field of collection.fields) {\n values[field.name] = resolveField(collection, doc, field.name, activeLocale, localeConfig).value\n }\n return resolveDocumentTitle(collection, values, ref.id)\n }\n // Resolve through the locale layer in the ambient active locale (EC-176)\n // with EC-018 fallback, so localized titles follow the switcher.\n const { value } = resolveField(\n collection,\n doc,\n primaryField(collection),\n activeLocale,\n localeConfig,\n )\n return typeof value === 'string' && value ? value : ref.id\n },\n [documents, registry, localeConfig, activeLocale],\n )\n\n const saveDocument = useCallback(\n (doc: CmsDocument) => {\n // Replace-or-append (upsert): a brand-new document must still land even\n // though nothing in the session matches its ref yet.\n setDocuments((prev) => upsertDoc(prev, doc))\n stampUpdatedAt(doc) // EC-445: a save bumps the $updatedAt column\n persisterRef.current?.upsertDocument(doc)\n },\n [stampUpdatedAt],\n )\n\n const commitFieldEdit = useCallback(\n (input: CellCommitInput): Promise<CellCommitOutcome> => {\n // Pure map-replace: an edit always targets a document already open in\n // the session, so a miss (already gone) is a no-op, never an append.\n const replaceWith = (doc: CmsDocument) => setDocuments((prev) => replaceDoc(prev, doc))\n const persister = persisterRef.current\n return commitCellEdit(\n {\n registry,\n documents: documentsRef.current,\n localeConfig,\n // EC-445: the optimistic apply bumps the $updatedAt column (a rollback\n // leaves it — it self-corrects on the next hydration).\n applySession: (doc) => {\n replaceWith(doc)\n stampUpdatedAt(doc)\n },\n rollbackSession: replaceWith,\n ...(persister && projectId !== undefined\n ? {\n dispatch: async (next: CmsDocument) => {\n // Make sure the persisted baseline + every queued mutation\n // landed first, then issue the commit's single command.\n await persister.ensureBaseline()\n const { operations } = await getStudioOperations()\n const result = await operations.documents.upsert({ projectId, document: next })\n // EC-449: adopt the chokepoint's changed verdict (inline edits\n // bypass the persister queue, so its hook doesn't see them).\n if (result.ok) adoptSavedRecord(result.value)\n return result\n },\n }\n : {}),\n },\n input,\n )\n },\n [registry, localeConfig, projectId, stampUpdatedAt, adoptSavedRecord],\n )\n\n // Shared insert sequence (EC-326): existingIds/mint/seedDefaults (via\n // `buildNewDocument`) + optimistic append + persist, consumed by both\n // `createDocument` (always inserts) and `ensureSingletonDocument`'s empty\n // branch (`guardExisting: true` — re-checks \"no document for this collection\n // yet\" against the LATEST `prev` inside the `setDocuments` updater, not the\n // `documentsRef.current` snapshot the caller already checked, so a\n // concurrent invocation — StrictMode's double-invoked effect — can never\n // materialize a second singleton document).\n const insertNewDocument = useCallback(\n (collectionId: string, options?: { guardExisting?: boolean }): CmsDocument => {\n const doc = buildNewDocument(collectionId, registry, seq, documentsRef.current)\n setDocuments((prev) =>\n options?.guardExisting && hasDocumentFor(prev, collectionId) ? prev : [...prev, doc],\n )\n stampUpdatedAt(doc) // EC-445: a fresh draft's $updatedAt starts at creation time\n persisterRef.current?.upsertDocument(doc)\n return doc\n },\n [registry, stampUpdatedAt],\n )\n\n const createDocument = useCallback(\n (collectionId: string): DocumentRef => {\n const doc = insertNewDocument(collectionId)\n return { collection: collectionId, id: doc.id }\n },\n [insertNewDocument],\n )\n\n // EC-274 (re-scopes EC-217): a singleton is a UI lens, not a fixed id. Resolve\n // the collection's lone document and return its ref; if none exists yet, create\n // one with a NORMAL generated id (never the collection id — no code ever names a\n // literal doc id). Idempotent under React effects/StrictMode: the create guard\n // keys on \"any document in this collection\", so a re-invocation never adds a\n // second. On drift (>1 doc) the studio routes to the list, so this defensively\n // returns the first; the empty draft persists like any create.\n const ensureSingletonDocument = useCallback(\n (collectionId: string): DocumentRef => {\n const collection = registry.get(collectionId)\n const resolution = collection\n ? resolveSingletonDocument(collection, documentsRef.current)\n : ({ kind: 'empty' } as const)\n if (resolution.kind === 'ready') {\n return { collection: collectionId, id: resolution.doc.id }\n }\n if (resolution.kind === 'drift') {\n return { collection: collectionId, id: resolution.docs[0]!.id }\n }\n // Empty: create the lone document once. The ref guard (synchronous) plus the\n // updater's \"any doc in collection\" check make this idempotent under a\n // re-invoked effect or StrictMode's double mount — never a second draft.\n const existing = documentsRef.current.find((d) => d.collection === collectionId)\n if (existing) return { collection: collectionId, id: existing.id }\n if (ensuredSingletons.current.has(collectionId)) {\n return { collection: collectionId, id: `new-${collectionId}-pending` }\n }\n ensuredSingletons.current.add(collectionId)\n // EC-316: same collision-free mint as `createDocument` (via the shared\n // `insertNewDocument` — defensive here, the singleton-empty branch only\n // runs when no document exists yet).\n const doc = insertNewDocument(collectionId, { guardExisting: true })\n return { collection: collectionId, id: doc.id }\n },\n [registry, insertNewDocument],\n )\n\n const deleteDocument = useCallback((ref: DocumentRef) => {\n setDocuments((prev) => removeDoc(prev, ref))\n persisterRef.current?.deleteDocument(ref)\n }, [])\n\n // EC-224: published-ness IS the version pointer (`publishedKeys`) — the SOLE\n // studio source of truth, read via `isPublished`. The live row stays a\n // continuous draft (Sanity model); no flat `state` mirror is maintained. Every\n // reader now consults the pointer (the table badge/$state via `isPublished`,\n // the preview engine via the pin), so the flat field is read by nothing here.\n const setPublished = useCallback((ref: DocumentRef, published: boolean) => {\n const key = documentKey(ref)\n setPublishedKeys((prev) => {\n if (prev.has(key) === published) return prev\n const next = new Set(prev)\n if (published) next.add(key)\n else next.delete(key)\n return next\n })\n }, [])\n\n const isPublished = useCallback(\n (ref: DocumentRef) => publishedKeys.has(documentKey(ref)),\n [publishedKeys],\n )\n\n // Reconcile published-ness for a ref against the AUTHORITATIVE backend record\n // (EC-225): the optimistic flip is a guess; once the queued op settles we read\n // the actual pin so the badge can never claim a state the backend refused\n // (a publish blocked by field rules, an unpublish blocked by a strict ref).\n const reconcilePublished = useCallback(\n async (ref: DocumentRef) => {\n if (projectId === undefined) return\n const { operations } = await getStudioOperations()\n const record = await operations.documents.get({ projectId, ref })\n if (record.ok) {\n setPublished(ref, record.value.publishedVersion !== undefined)\n // EC-445: publish/unpublish patches `updatedAt` — adopt the authoritative\n // value so the $updatedAt column reflects the actual write, not a guess.\n if (record.value.updatedAt) stampUpdatedAt(ref, record.value.updatedAt)\n // EC-447: adopt the authoritative `publishedAt` — set-once on the first\n // publish, absent after unpublish. Passing `undefined` CLEARS the column, so\n // an unpublish reverts $publishedAt to EmDash and a republish records fresh.\n stampPublishedAt(ref, record.value.publishedAt)\n // EC-449: adopt the authoritative changed flag — `false` after a publish\n // (the draft became the baseline), absent after an unpublish (cleared).\n stampHasUnpublishedChanges(ref, record.value.hasUnpublishedChanges)\n }\n },\n [projectId, setPublished, stampUpdatedAt, stampPublishedAt, stampHasUnpublishedChanges],\n )\n\n const publishDocument = useCallback(\n async (ref: DocumentRef) => {\n setPublished(ref, true) // optimistic\n // EC-273: no clearing here — the draft is already free of conditionally-hidden\n // values (the editor clears them on write), so the snapshot the publish op\n // pins is clean by construction.\n persisterRef.current?.publishDocument(ref)\n await persisterRef.current?.flush()\n await reconcilePublished(ref)\n },\n [setPublished, reconcilePublished],\n )\n\n const unpublishDocument = useCallback(\n async (ref: DocumentRef) => {\n setPublished(ref, false) // optimistic\n persisterRef.current?.unpublishDocument(ref)\n await persisterRef.current?.flush()\n await reconcilePublished(ref)\n },\n [setPublished, reconcilePublished],\n )\n\n const loadDocumentVersions = useCallback(\n async (ref: DocumentRef): Promise<DocumentVersionsView> => {\n // No persisted backend (fixture/playground): no recorded history.\n if (projectId === undefined) return { versions: [] }\n const { operations } = await getStudioOperations()\n const [versionsRes, recordRes] = await Promise.all([\n operations.documents.listVersions({ projectId, ref }),\n operations.documents.get({ projectId, ref }),\n ])\n if (!versionsRes.ok) {\n setPersistError(versionsRes.error)\n return { versions: [] }\n }\n // The pinned (live) version comes off the document record; a never-saved\n // doc simply has no record (and no versions) — not an error to surface.\n const publishedVersion = recordRes.ok ? recordRes.value.publishedVersion : undefined\n return {\n versions: versionsRes.value,\n ...(publishedVersion !== undefined ? { publishedVersion } : {}),\n }\n },\n [projectId],\n )\n\n const restoreDocumentVersion = useCallback(\n async (\n ref: DocumentRef,\n version: number,\n scope?: RestoreScope,\n ): Promise<CmsDocument | null> => {\n if (projectId === undefined) return null\n // Land any queued edits before the restore reads the current draft to\n // snapshot it (same ordering contract as commitFieldEdit/runBulk). This is\n // what makes a granular (field/block) restore merge over the LATEST draft.\n await persisterRef.current?.ensureBaseline()\n const { operations } = await getStudioOperations()\n const result = await operations.documents.restore({\n projectId,\n ref,\n version,\n ...(scope ? { scope } : {}),\n })\n if (!result.ok) {\n setPersistError(result.error)\n return null\n }\n const restored = result.value.document\n // Pure map-replace: a restore always targets a document already open in\n // the session.\n setDocuments((prev) => replaceDoc(prev, restored))\n // EC-449: a restore is a save-shaped write — adopt the chokepoint's fresh\n // changed verdict from the returned record (e.g. restoring a published\n // doc's draft to an older version flips the dot to amber immediately).\n adoptSavedRecord(result.value)\n return restored\n },\n [projectId, adoptSavedRecord],\n )\n\n const validate = useCallback(\n (doc: CmsDocument) =>\n validateDocument(registry, doc, {\n store,\n localeConfig,\n validateComposition,\n validateRichTextEmbeds,\n // EC-224: the EC-173 weak-reference warning sources published-ness from\n // the version pointer, so editing a published doc that references an\n // unpublished target surfaces the fallback warning again (it had gone\n // inert once the flat `state` mirror was dropped in B-3b).\n isPublished,\n assetExists,\n }),\n [registry, store, localeConfig, isPublished, assetExists],\n )\n\n const importDocuments = useCallback(\n (collectionId: string, raw: unknown[]): ImportReport => {\n const report: ImportReport = { added: 0, rejected: [] }\n // Pre-parse so intra-batch relation/asset targets resolve during validation.\n const parsedBatch: CmsDocument[] = []\n const schemaFails: { item: unknown; error: ReturnType<typeof documentSchema.safeParse> }[] =\n []\n for (const item of raw) {\n const parsed = documentSchema.safeParse({ ...(item as object), collection: collectionId })\n if (parsed.success) parsedBatch.push(parsed.data)\n else schemaFails.push({ item, error: parsed })\n }\n for (const { item, error } of schemaFails) {\n report.rejected.push({\n id: (item as { id?: string })?.id ?? translate('cms.list.import.noId'),\n issues: (error.success ? [] : error.error.issues).map((e) => ({\n code: 'invalid-field-value' as const,\n severity: 'error' as const,\n message: e.message,\n path: e.path.map((p) => (typeof p === 'symbol' ? String(p) : p)),\n })),\n })\n }\n // Validate each against existing docs PLUS the rest of the batch.\n const batchStore = createDocumentStore([...documents, ...parsedBatch])\n const accepted: CmsDocument[] = []\n for (const doc of parsedBatch) {\n const issues = validateDocument(registry, doc, { store: batchStore, localeConfig, assetExists })\n const errors = issues.filter((iss) => iss.severity === 'error')\n if (errors.length > 0) report.rejected.push({ id: doc.id, issues: errors })\n else accepted.push(doc)\n }\n if (accepted.length > 0) {\n // Replace-or-append (upsert): an imported row may be brand new to the\n // session, so each accepted document must land even with no prior\n // entry for its ref.\n setDocuments((prev) => accepted.reduce((acc, doc) => upsertDoc(acc, doc), prev))\n for (const doc of accepted) persisterRef.current?.upsertDocument(doc)\n // EC-224: imports land as the working DRAFT. Publish-ness is the version\n // pointer (`publishedKeys`), set by publishing — never carried in the\n // imported row — so an import never auto-publishes; the editor publishes\n // explicitly afterward.\n report.added = accepted.length\n }\n return report\n },\n [registry, documents, localeConfig, assetExists],\n )\n\n const isFieldReadOnly = useCallback((field: FieldDef) => field.form?.readOnly === true, [])\n\n // --- Views (EC-246b: config-as-code) --------------------------------------\n\n // EC-445: the reserved pseudo-columns a CMS collection's list surfaces. Every\n // `cmsDocuments` collection has a publish lifecycle + materialized timestamps\n // ($state + $updatedAt always apply); $url applies only where the deployment\n // resolves a delivery route for it (mirrors the live-URL column's own guard).\n const pseudoColumnsFor = useCallback(\n (collectionId: string): string[] => {\n const collection = registry.get(collectionId)\n if (!collection) return []\n const routable = resolveDeploymentRoutes().some(\n (route) => route.document?.collection === collectionId,\n )\n return pseudoColumns(collection, { publishing: true, timestamps: true, routable })\n },\n [registry],\n )\n\n const viewsOf = useCallback(\n (collectionId: string): SavedView[] => {\n // The baseline view plus the collection's config-declared views (EC-246b/EC-444).\n // Views are PRESENTATION, read live from elytra.config.ts (AD-11) — not the\n // persisted content schema the session booted from — so they reflect code\n // immediately without a re-seed (the persisted schema is only baselined on\n // first run). The EC-169 DB saved-view store is retired: shared views are\n // code, editors keep only transient in-session tweaks + Reset.\n //\n // EC-444: a config view with the reserved `id: 'default'` REPLACES the\n // synthesized \"All entries\" baseline verbatim (first tab); absent one, the\n // synthesized baseline leads. `resolveCollectionViews` owns that selection.\n const pseudo = pseudoColumnsFor(collectionId)\n const baseline = defaultView(registry.get(collectionId), pseudo)\n const configCollection = resolveDeploymentCollections().find((c) => c.id === collectionId)\n if (!configCollection) return [baseline]\n return resolveCollectionViews(configCollection, baseline, pseudo)\n },\n [registry, pseudoColumnsFor],\n )\n\n // The INITIAL active view for a collection (EC-343/EC-444): a config view flagged\n // `initial: true` seeds the first-load lens; else the baseline — the `id: 'default'`\n // override when present, else the synthesized \"All entries\" (`ALL_VIEW_ID`). Only\n // consulted before the editor has picked a view (`activeViews[id]` wins once set),\n // so transient switching + Reset are unaffected. A duplicate `initial` and any\n // deprecated `default` flag are each warned once (never silent).\n const initialViewId = useCallback((collectionId: string): string => {\n const configCollection = resolveDeploymentCollections().find((c) => c.id === collectionId)\n if (!configCollection) return ALL_VIEW_ID\n warnDuplicateDefaultViews(configCollection)\n warnDeprecatedDefaultFlag(configCollection)\n const initial = defaultConfigViewId(configCollection)\n if (initial) return initial\n return hasDefaultViewOverride(configCollection) ? DEFAULT_VIEW_OVERRIDE_ID : ALL_VIEW_ID\n }, [])\n\n const activeViewOf = useCallback(\n (collectionId: string): SavedView => {\n const id = activeViews[collectionId] ?? initialViewId(collectionId)\n return (\n viewsOf(collectionId).find((view) => view.id === id) ??\n defaultView(registry.get(collectionId), pseudoColumnsFor(collectionId))\n )\n },\n [activeViews, initialViewId, viewsOf, registry, pseudoColumnsFor],\n )\n\n const tableStateOf = useCallback(\n (collectionId: string): TableViewState =>\n tableStates[collectionId] ?? activeViewOf(collectionId).state,\n [tableStates, activeViewOf],\n )\n\n const dropTableState = useCallback((collectionId: string) => {\n setTableStates((prev) => {\n if (!(collectionId in prev)) return prev\n const next = { ...prev }\n delete next[collectionId]\n return next\n })\n }, [])\n\n const setActiveView = useCallback(\n (collectionId: string, viewId: string) => {\n setActiveViews((prev) => ({ ...prev, [collectionId]: viewId }))\n dropTableState(collectionId)\n },\n [dropTableState],\n )\n\n // --- Bulk actions (EC-169) ------------------------------------------------\n\n const runBulk = useCallback(\n async (\n collectionId: string,\n ids: readonly string[],\n action: BulkAction,\n setField?: BulkSetField,\n ): Promise<BulkReport> => {\n const collection = registry.get(collectionId)\n // A set-field needs both the field payload AND the collection def to fold\n // the value the locale-aware way — guard so a misconfigured call fails\n // loud rather than silently no-opping each item.\n if (action === 'set-field' && (!setField || !collection)) {\n return {\n action,\n ...(setField ? { setField } : {}),\n results: ids.map((id) => ({\n ref: { collection: collectionId, id },\n title: titleOf({ collection: collectionId, id }),\n ok: false,\n reason: translate('cms.list.bulk.error.invalidSetField'),\n error: { code: 'unknown', message: 'Invalid set-field request.' },\n })),\n }\n }\n // The next document for a set-field item: fold the value into the active\n // locale's bag (localized) or the shared `values` (non-localized).\n const setFieldDoc = (doc: CmsDocument): CmsDocument =>\n applyCellValue(collection!, doc, setField!.field, activeLocale, setField!.value)\n\n let dispatch:\n | ((action: BulkAction, ref: DocumentRef) => Promise<OperationResult<unknown>>)\n | undefined\n const persister = persisterRef.current\n if (persister && projectId !== undefined) {\n // Pending queued mutations + baseline land first, then one awaited\n // command per item (same ordering contract as commitFieldEdit).\n await persister.ensureBaseline()\n const { operations } = await getStudioOperations()\n dispatch = (bulkAction, ref) => {\n if (bulkAction === 'delete') return operations.documents.delete({ projectId, ref })\n if (bulkAction === 'publish') return operations.documents.publish({ projectId, ref })\n if (bulkAction === 'unpublish') return operations.documents.unpublish({ projectId, ref })\n // set-field: upsert the document carrying the new value. The write\n // path self-types it through the schema lens (EC-277); a scalar field\n // stores its scalar as-is.\n const current = documentsRef.current.find((d) => matchesRef(d, ref))\n if (!current) {\n return Promise.resolve<OperationResult<unknown>>({\n ok: false,\n error: {\n code: 'not-found',\n message: 'Document is no longer in the session.',\n entity: 'cms-document',\n key: `${ref.collection}:${ref.id}`,\n },\n })\n }\n return operations.documents\n .upsert({ projectId, document: setFieldDoc(current) })\n .then((result) => {\n // EC-449: adopt the chokepoint's changed verdict per set-field item\n // (bulk dispatch bypasses the persister queue and its hook).\n if (result.ok) adoptSavedRecord(result.value)\n return result\n })\n }\n }\n return runBulkAction(\n {\n documents: documentsRef.current,\n titleOf,\n validate: (doc) =>\n validateDocument(registry, doc, {\n store: createDocumentStore(documentsRef.current),\n localeConfig,\n // EC-225: include the composition validators so a bulk PUBLISH\n // gates blocks/richText validity the same way the detail editor\n // does — the operations-layer publish gate has no component\n // registry, so composition validity is a studio-validation invariant.\n validateComposition,\n validateRichTextEmbeds,\n assetExists,\n }),\n // EC-425: bulk publish joins the single-document clean point — the\n // SAME shared hidden-strip `doPublish` runs (EC-273 field values +\n // EC-394 component props, session registry), per item.\n ...(collection\n ? { cleanForPublish: (doc: CmsDocument) => cleanHiddenForPublish(collection, doc) }\n : {}),\n // Land a cleaned draft exactly the way the editor's publish does:\n // session apply + the persister's self-typing upsert (EC-277 manifest\n // lens), flushed so the serial queue lands the upsert BEFORE the\n // awaited publish command snapshots the stored draft.\n applyCleaned: async (_ref, cleaned) => {\n setDocuments((prev) => replaceDoc(prev, cleaned))\n const persister = persisterRef.current\n if (persister && projectId !== undefined) {\n persister.upsertDocument(cleaned)\n await persister.flush()\n }\n },\n // EC-224: a succeeded publish/unpublish moves the version pointer\n // (`publishedKeys`) via setPublished — there is no separate flat\n // `state` mirror to keep in sync (published-ness is derived from the\n // pointer set).\n // EC-449: either transition resolves the changed flag — publish writes\n // `false` (the draft became the baseline), unpublish clears it — and\n // bulk has no per-item record reconcile, so mirror that here.\n applyState: (ref, state) => {\n setPublished(ref, state === 'published')\n stampHasUnpublishedChanges(ref, false)\n },\n applyDelete: (ref) => setDocuments((prev) => removeDoc(prev, ref)),\n // EC-247: fold the new value into the session document (same\n // locale-aware path the dispatched upsert used). Not a plain\n // `replaceDoc` — the replacement is computed FROM each matched\n // document (`setFieldDoc(d)`), not a fixed value to swap in.\n applySetField: (ref) =>\n setDocuments((prev) => prev.map((d) => (matchesRef(d, ref) ? setFieldDoc(d) : d))),\n ...(dispatch ? { dispatch } : {}),\n },\n collectionId,\n ids,\n action,\n setField,\n )\n },\n [\n projectId,\n titleOf,\n registry,\n localeConfig,\n activeLocale,\n setPublished,\n assetExists,\n adoptSavedRecord,\n stampHasUnpublishedChanges,\n ],\n )\n\n const store$ = useMemo<CmsStore>(\n () => ({\n ...(projectId !== undefined ? { projectId } : {}),\n collections,\n localeConfig,\n activeLocale,\n getCollection,\n documentsOf: (collectionId) => documents.filter((d) => d.collection === collectionId),\n getDocument,\n titleOf,\n saveDocument,\n commitFieldEdit,\n createDocument,\n ensureSingletonDocument,\n deleteDocument,\n isPublished,\n documentUpdatedAt,\n documentPublishedAt,\n documentHasUnpublishedChanges,\n publishDocument,\n unpublishDocument,\n loadDocumentVersions,\n restoreDocumentVersion,\n importDocuments,\n validate,\n isFieldReadOnly,\n viewsOf,\n activeViewId: (collectionId) => activeViews[collectionId] ?? initialViewId(collectionId),\n setActiveView,\n tableStateOf,\n setTableState: (collectionId, update) =>\n setTableStates((prev) => {\n const current = prev[collectionId] ?? activeViewOf(collectionId).state\n const next = typeof update === 'function' ? update(current) : update\n return { ...prev, [collectionId]: next }\n }),\n isViewDirty: (collectionId) => {\n const working = tableStates[collectionId]\n if (working === undefined) return false\n const active = activeViewOf(collectionId).state\n const collection = registry.get(collectionId)\n if (collection === undefined) return !viewStatesEqual(working, active)\n // Compare schema-resolved forms (EC-213): a column-order reconciliation\n // or a stale `hidden` entry must not read as an unsaved edit. EC-445: the\n // pseudo-column universe must match so a reserved column never reads as a diff.\n const pseudo = pseudoColumnsFor(collectionId)\n return !viewStatesEqual(\n canonicalViewState(collection, working, pseudo),\n canonicalViewState(collection, active, pseudo),\n )\n },\n resetTableState: dropTableState,\n runBulk,\n addCollection: (def) =>\n setCollections((prev) => [...prev.filter((c) => c.id !== def.id), def]),\n persistError,\n clearPersistError: () => setPersistError(null),\n ensurePersistedBaseline: () => persisterRef.current?.ensureBaseline() ?? Promise.resolve(),\n flushPersistence: () => persisterRef.current?.flush() ?? Promise.resolve(),\n }),\n [\n projectId,\n collections,\n documents,\n localeConfig,\n activeLocale,\n getCollection,\n getDocument,\n titleOf,\n saveDocument,\n commitFieldEdit,\n createDocument,\n ensureSingletonDocument,\n deleteDocument,\n isPublished,\n documentUpdatedAt,\n documentPublishedAt,\n documentHasUnpublishedChanges,\n publishDocument,\n unpublishDocument,\n loadDocumentVersions,\n restoreDocumentVersion,\n importDocuments,\n validate,\n isFieldReadOnly,\n viewsOf,\n activeViews,\n activeViewOf,\n initialViewId,\n tableStates,\n tableStateOf,\n setActiveView,\n dropTableState,\n runBulk,\n registry,\n pseudoColumnsFor,\n persistError,\n ],\n )\n\n return <CmsContext.Provider value={store$}>{children}</CmsContext.Provider>\n}\n\nexport { useCms }\n\nexport { primaryField }\nexport type { Locale }\n"]}
|
|
1
|
+
{"version":3,"file":"cms-store.js","sourceRoot":"","sources":["../../../src/components/cms/cms-store.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport type { ReactNode } from 'react'\nimport {\n createCollectionRegistry,\n createDocumentStore,\n documentKey,\n documentSchema,\n resolveDocumentTitle,\n resolveField,\n sampleDocuments,\n seedDefaults,\n sampleFilterableCollections,\n sampleLocaleConfig,\n samplePublishedKeys,\n resolveSingletonDocument,\n titleFieldOf,\n validateDocument,\n} from '@elytracms/core/cms-core'\nimport type {\n CmsDocument,\n CmsValidationIssue,\n CollectionDef,\n CollectionRegistry,\n DocumentRef,\n FieldDef,\n Locale,\n LocaleConfig,\n LocalizedString,\n RestoreScope,\n} from '@elytracms/core/cms-core'\nimport type { CmsDocumentRecord, DocumentVersionRecord } from '@elytracms/core/persistence'\nimport { translate } from '@elytracms/studio/lib/i18n'\nimport { configureStudioLocales, useStudioLocale } from '@elytracms/studio/lib/locale'\nimport { studioManifestLookup } from '@elytracms/studio/lib/registry'\nimport { resolveDeploymentCollections, resolveDeploymentRoutes } from '@elytracms/studio/lib/workspace'\nimport { validateComposition, validateRichTextEmbeds } from './cms-composition-validators'\nimport { matchesRef, removeDoc, replaceDoc, upsertDoc } from './document-ref-utils'\nimport { createRequiredContext } from '@elytracms/studio/lib/required-context'\nimport { createCmsPersister, getStudioOperations } from '@elytracms/studio/lib/operations'\nimport type {\n CmsPersister,\n OperationError,\n OperationResult,\n} from '@elytracms/studio/lib/operations'\nimport {\n ALL_VIEW_ID,\n DEFAULT_VIEW_OVERRIDE_ID,\n canonicalViewState,\n configViewIssues,\n defaultConfigViewId,\n defaultViewState,\n deprecatedDefaultFlagViewIds,\n hasDefaultViewOverride,\n pseudoColumns,\n resolveCollectionViews,\n viewStatesEqual,\n} from '@elytracms/studio/lib/cms-views'\nimport type { TableViewState } from '@elytracms/studio/lib/cms-views'\nimport { useOptionalAssets } from '../assets/assets-store'\nimport { consumeStagedDocuments } from './document-staging'\nimport { applyCellValue, commitCellEdit } from './cell-edit'\nimport type { CellCommitInput, CellCommitOutcome } from './cell-edit'\nimport { runBulkAction } from './bulk-actions'\nimport type { BulkAction, BulkReport, BulkSetField } from './bulk-actions'\nimport { cleanHiddenForPublish } from './publish-clean'\n\n/**\n * A resolved table view: a named bundle of filters (closed AD-3 vocabulary),\n * sort, and visible/ordered columns. EC-246b: named views are **config-as-code**\n * (declared in `cms/`, read live via `configViewsFor`) — the editor-owned DB\n * saved-view store (EC-169) is retired. The unnamed \"All documents\" default is\n * derived per collection; editors keep only transient in-session tweaks + Reset.\n */\nexport interface SavedView {\n id: string\n /**\n * The view label — a {@link LocalizedString} (EC-343): the built-in \"All\" default is\n * a plain translated string; a config view's name may be a `{ locale }` map, resolved\n * at the render site (`ViewTabs`) via the same `resolveLabel` path as `form.label`.\n */\n name: LocalizedString\n state: TableViewState\n}\n\nexport interface ImportReport {\n added: number\n rejected: { id: string; issues: CmsValidationIssue[] }[]\n}\n\n/**\n * A document's recorded version history plus its live pin (EC-224), as the\n * Versions inspector pane reads it. `versions` is newest-first; `publishedVersion`\n * is the recorded version currently pinned live, absent when unpublished.\n */\nexport interface DocumentVersionsView {\n versions: DocumentVersionRecord[]\n publishedVersion?: number\n}\n\nexport interface CmsStore {\n /** The project this CMS session edits (set when persistence is enabled); the asset picker scopes the real library by it (EC-152). */\n projectId?: string\n collections: readonly CollectionDef[]\n localeConfig: LocaleConfig\n /**\n * The studio's ambient active locale (EC-176): table cells, detail forms,\n * and inline edits all display and write THIS locale. Switched once via the\n * shared `LocaleSwitcher`, never per control.\n */\n activeLocale: Locale\n getCollection(id: string): CollectionDef | undefined\n documentsOf(collectionId: string): CmsDocument[]\n getDocument(ref: DocumentRef): CmsDocument | undefined\n /** Resolve a relation/asset target's display title. */\n titleOf(ref: DocumentRef): string\n saveDocument(doc: CmsDocument): void\n /**\n * Commit ONE field edit from the table (EC-168): optimistic session apply +\n * exactly one `documents.upsert` operations command, awaited. Validation\n * failures and operation rejections return a structured error (the caller\n * renders it on the cell) and leave the session rolled back.\n */\n commitFieldEdit(input: CellCommitInput): Promise<CellCommitOutcome>\n createDocument(collectionId: string): DocumentRef\n /**\n * Ensure a singleton collection's lone document exists and return its ref\n * (EC-274). Resolves the existing single document, or creates one with a normal\n * generated id (never the collection id). Idempotent. The singleton route opens\n * through this so the one document always exists to edit.\n */\n ensureSingletonDocument(collectionId: string): DocumentRef\n deleteDocument(ref: DocumentRef): void\n /**\n * Is this document currently published? Sourced from the version POINTER\n * (EC-224), not the flat `state` enum — seeded from hydration and updated by\n * {@link publishDocument}/{@link unpublishDocument}.\n */\n isPublished(ref: DocumentRef): boolean\n /**\n * The record's last-write ISO timestamp (EC-445) — the data behind the\n * `$updatedAt` list column. Seeded from hydration (connected: the persisted\n * `cmsDocuments.updatedAt`; playground: session-start for the seeded fixtures),\n * then re-stamped on the common edit paths. `undefined` for a ref the session\n * has no timestamp for. See {@link documentPublishedAt} for the publish-instant column.\n */\n documentUpdatedAt(ref: DocumentRef): string | undefined\n /**\n * The record's FIRST-publish ISO instant (EC-447) — the data behind the\n * `$publishedAt` list column. Seeded from hydration (the persisted\n * `cmsDocuments.publishedAt`), then re-stamped/cleared authoritatively on\n * publish/unpublish from the reconciled backend record (set-once on publish,\n * cleared on unpublish). `undefined` for a draft / never-published /\n * currently-unpublished ref (the column shows EmDash).\n */\n documentPublishedAt(ref: DocumentRef): string | undefined\n /**\n * Does this PUBLISHED document's working draft carry unpublished changes\n * (EC-449)? The cheap per-row signal behind the amber \"changed\" `$state` dot —\n * sourced from the materialized `cmsDocuments.hasUnpublishedChanges` (computed\n * ONCE at the write chokepoint, never per render). Seeded from hydration, then\n * re-stamped authoritatively from the returned record on save (the persister's\n * saved-record hook / the inline-edit dispatch), publish (→ false) and\n * unpublish (→ cleared). Always `false` for a draft / never-published ref.\n */\n documentHasUnpublishedChanges(ref: DocumentRef): boolean\n /**\n * Publish: snapshot the draft as a new version and pin it live (EC-224).\n * Flips published-ness optimistically, then reconciles against the backend\n * record (EC-225) so the badge can never claim a publish the backend refused\n * (e.g. blocked by publish-time field validation).\n */\n publishDocument(ref: DocumentRef): Promise<void>\n /**\n * Unpublish: clear the live version pin (EC-224). Blocked at the operations\n * layer while strict relation fields published-reference it (EC-173); the\n * optimistic flip reconciles against the backend on rejection (EC-225).\n */\n unpublishDocument(ref: DocumentRef): Promise<void>\n /**\n * Load this document's recorded version history + live pin (EC-224) for the\n * Versions inspector pane. Fixture/playground sessions (no project) have no\n * persisted history → an empty view. Failures surface as {@link persistError}.\n */\n loadDocumentVersions(ref: DocumentRef): Promise<DocumentVersionsView>\n /**\n * Restore a recorded version as the new working draft (EC-224): the operation\n * snapshots the current draft first (so the rollback is itself undoable), then\n * loads the chosen snapshot. An optional `scope` (EC-298) restores only one\n * field or block, laid over the current draft, instead of the whole document.\n * Returns the restored draft (or null on failure/fixture session) so the open\n * editor can adopt it.\n */\n restoreDocumentVersion(\n ref: DocumentRef,\n version: number,\n scope?: RestoreScope,\n ): Promise<CmsDocument | null>\n importDocuments(collectionId: string, docs: unknown[]): ImportReport\n validate(doc: CmsDocument): CmsValidationIssue[]\n isFieldReadOnly(field: FieldDef): boolean\n // Views (EC-246b): the built-in default + config-declared named views (from\n // `cms/`, read live). Shared views are code, not editor-owned DB data.\n viewsOf(collectionId: string): SavedView[]\n activeViewId(collectionId: string): string\n /** Switch views — resets the working table state to the view's state. */\n setActiveView(collectionId: string, viewId: string): void\n /** The live table state (the active view's state plus unsaved edits). */\n tableStateOf(collectionId: string): TableViewState\n /**\n * Update the working state. Always pass an updater when deriving from the\n * previous state — render-time snapshots go stale across rapid events.\n */\n setTableState(\n collectionId: string,\n update: TableViewState | ((prev: TableViewState) => TableViewState),\n ): void\n /** Does the working state diverge from the active view (\"unsaved changes\")? */\n isViewDirty(collectionId: string): boolean\n /** Discard working-state edits, back to the active view. */\n resetTableState(collectionId: string): void\n /**\n * Bulk publish/unpublish/delete (EC-169) + set-field (EC-247): one operations\n * command PER item, per-item outcomes in the report — partial failure is\n * enumerated, never silent. Only succeeded items mutate the session. A\n * `set-field` carries its `{ field, value }` payload.\n */\n runBulk(\n collectionId: string,\n ids: readonly string[],\n action: BulkAction,\n setField?: BulkSetField,\n ): Promise<BulkReport>\n /**\n * Mirror a collection into the session (e.g. an accepted AI-generated\n * schema, EC-097). Replaces by id. Session-only: persistence happens through\n * the accept flow's changeset (`schema.upsertCollection`), not here.\n */\n addCollection(def: CollectionDef): void\n /**\n * Most recent failed/denied persisted mutation (structured, from the\n * operation result). Rendered by the CMS surface — never a silent failure.\n */\n persistError: OperationError | null\n clearPersistError(): void\n /** Seed the persisted baseline now (e.g. before applying an AI changeset). */\n ensurePersistedBaseline(): Promise<void>\n /** Await all queued persisted mutations (tests, publish flows). */\n flushPersistence(): Promise<void>\n}\n\nconst { Context: CmsContext, useRequired: useCms } = createRequiredContext<CmsStore>('Cms')\n\nfunction primaryField(collection: CollectionDef): string {\n return titleFieldOf(collection)?.name ?? collection.fields[0]?.name ?? 'id'\n}\n\n/**\n * EC-316 (bug fix) — mint a fresh, COLLISION-FREE document id for `+ New`.\n *\n * `seq` is an in-memory, per-session counter (reset to 0 on every reload). A\n * document minted `new-<collection>-<n>` in a PRIOR session can already occupy\n * whatever `n` this session's counter would next reissue — the pre-fix bug:\n * `+ New` on a `post` collection that already held a (possibly published)\n * `new-post-1` handed out that SAME id again, silently opening the existing\n * document for editing instead of creating a fresh draft. Walking the counter\n * past every id already in `existingIds` makes the mint collision-free\n * regardless of what a prior session left behind.\n */\nexport function mintDocumentId(\n collectionId: string,\n seq: { current: number },\n existingIds: ReadonlySet<string>,\n): string {\n let id: string\n do {\n seq.current += 1\n id = `new-${collectionId}-${seq.current}`\n } while (existingIds.has(id))\n return id\n}\n\n/**\n * Build a fresh document for `collectionId`: a collision-free id (EC-316, via\n * {@link mintDocumentId} against every id `existingDocs` already holds for\n * this collection) and the collection's declared field defaults (EC-297, via\n * `seedDefaults`). Pure — the sensitive part of the insert sequence shared by\n * `createDocument` and `ensureSingletonDocument`'s empty branch (via the\n * private `insertNewDocument` below), factored out so it's unit-testable\n * without a `CmsProvider`.\n */\nexport function buildNewDocument(\n collectionId: string,\n registry: CollectionRegistry,\n seq: { current: number },\n existingDocs: readonly CmsDocument[],\n): CmsDocument {\n const existingIds = new Set(\n existingDocs.filter((d) => d.collection === collectionId).map((d) => d.id),\n )\n const id = mintDocumentId(collectionId, seq, existingIds)\n const collection = registry.get(collectionId)\n return { collection: collectionId, id, values: collection ? seedDefaults(collection) : {} }\n}\n\n/**\n * Does `docs` already hold a document for `collectionId`? `ensureSingletonDocument`'s\n * empty branch re-checks this INSIDE the `setDocuments` updater (against the\n * latest `prev`, not a stale snapshot) so a concurrent invocation — StrictMode's\n * double-invoked effect, or a second caller racing the same synchronous guard —\n * can never materialize a second singleton document.\n */\nexport function hasDocumentFor(docs: readonly CmsDocument[], collectionId: string): boolean {\n return docs.some((d) => d.collection === collectionId)\n}\n\n/**\n * Surface a duplicate `initial: true` across a collection's config views (EC-343/\n * EC-444) as a visible, one-time console warning — never a silent swallow. This is a\n * developer config mistake (editors can't fix config-as-code), so it takes the same\n * warn-once console channel the i18n runtime uses for config problems, not an editor\n * banner; the first-declared still seeds deterministically. Deduped per collection id.\n */\nconst warnedDuplicateDefaultCollections = new Set<string>()\nfunction warnDuplicateDefaultViews(collection: CollectionDef): void {\n if (warnedDuplicateDefaultCollections.has(collection.id)) return\n const issues = configViewIssues(collection)\n if (issues.length === 0) return\n warnedDuplicateDefaultCollections.add(collection.id)\n if (typeof console !== 'undefined') console.warn(`[views] ${issues[0]!.message}`)\n}\n\n/**\n * Surface the DEPRECATED `default: true` view flag (EC-444) as a one-time console\n * warning per collection — never silent. `default` (the view flag) is renamed to\n * `initial`; it is read as an alias for one release and removed next release. Same\n * warn-once channel as the duplicate check; deduped per collection id.\n */\nconst warnedDeprecatedDefaultCollections = new Set<string>()\nfunction warnDeprecatedDefaultFlag(collection: CollectionDef): void {\n if (warnedDeprecatedDefaultCollections.has(collection.id)) return\n const ids = deprecatedDefaultFlagViewIds(collection)\n if (ids.length === 0) return\n warnedDeprecatedDefaultCollections.add(collection.id)\n if (typeof console !== 'undefined') {\n console.warn(\n `[views] Collection \"${collection.id}\" uses the deprecated view flag \\`default\\` on ${ids.join(', ')}; rename it to \\`initial\\` (EC-444 — \\`default\\` is removed next release).`,\n )\n }\n}\n\n/** The unnamed built-in view: no filters, no sort, every field visible. */\nfunction defaultView(\n collection: CollectionDef | undefined,\n pseudo: readonly string[] = [],\n): SavedView {\n return {\n id: ALL_VIEW_ID,\n name: translate('cms.list.view.all'),\n state: collection\n ? defaultViewState(collection, pseudo)\n : { filters: [], sort: null, columns: [], hidden: [] },\n }\n}\n\n/**\n * The CMS session store (EC-141): documents and collections are optimistic,\n * synchronous session state (live validation while typing); every mutation —\n * create/save/delete/state transitions — is mirrored onto the operations\n * layer (`documents.*` / `schema.*` commands) through {@link createCmsPersister}.\n * Failed/denied commands surface as {@link CmsStore.persistError}.\n */\nexport function CmsProvider({\n children,\n projectId,\n initialCollections,\n initialDocuments,\n initialPublishedKeys,\n initialTimestamps,\n initialPublishTimestamps,\n initialChangedKeys,\n initialLocaleConfig,\n seedReflectsWrites,\n}: {\n children: ReactNode\n /** Enables persistence through the shared operations client. */\n projectId?: string\n /**\n * Did `initialDocuments` come from a fresh persisted-state hydration (EC-461)?\n * Drives the staged-document merge rule (`consumeStagedDocuments`): a hydrated\n * seed supersedes staged entries; a static kit/fixture seed lets them win.\n * Omitted → the historical mode default (connected hydrates, playground may not).\n */\n seedReflectsWrites?: boolean\n /** Seed collections (e.g. from an imported starter kit, EC-119); defaults to the samples. */\n initialCollections?: CollectionDef[]\n initialDocuments?: CmsDocument[]\n /**\n * Published document keys from hydration (EC-224): the version pointer\n * (`publishedVersion` set). Absent (kit / fixture sessions) → the sample\n * fixtures' published set (`samplePublishedKeys`).\n */\n initialPublishedKeys?: readonly string[]\n /**\n * Per-document last-write timestamps from hydration (EC-445), keyed by\n * `documentKey` (`collection:id`) → ISO string. Backs the `$updatedAt` list column.\n * Absent (playground / kit session) → the seeded documents get a session-start\n * timestamp so the column is never blank, then re-stamped on edits.\n */\n initialTimestamps?: Record<string, string>\n /**\n * Per-document FIRST-publish instants from hydration (EC-447), keyed by\n * `documentKey` (`collection:id`) → ISO string. Backs the `$publishedAt` column.\n * UNLIKE {@link initialTimestamps} there is NO session-start fallback — an absent\n * entry is a real \"no publish date\" (EmDash); the store re-stamps/clears it\n * authoritatively on publish/unpublish. Absent (playground / kit) → empty map.\n */\n initialPublishTimestamps?: Record<string, string>\n /**\n * Document keys whose draft carries unpublished changes, from hydration\n * (EC-449, the persisted `cmsDocuments.hasUnpublishedChanges === true` set) —\n * the amber \"changed\" `$state` dot. Mirrors {@link initialPublishedKeys}; the\n * store re-stamps the set authoritatively on save/publish/unpublish from the\n * returned records. Absent (playground / kit) → empty set.\n */\n initialChangedKeys?: readonly string[]\n /** Locale config for the seeded content; defaults to the sample config. */\n initialLocaleConfig?: LocaleConfig\n}) {\n const [documents, setDocuments] = useState<CmsDocument[]>(() => {\n const seeded = (initialDocuments ?? sampleDocuments).map((d) => structuredClone(d))\n // EC-320 (0.0.44 follow-up): merge any documents STAGED by the\n // Components-view \"Use in document…\" transfer — a cross-mount handoff in\n // EVERY mode (see document-staging.ts). EC-461: the merge rule keys on the\n // seed's PROVENANCE — a hydrated seed (fresh persisted-state query, both\n // modes now) supersedes staged entries; a static kit/fixture seed lets\n // them win (they are the only cross-mount signal of a live edit there).\n return seedReflectsWrites === undefined\n ? consumeStagedDocuments(projectId, seeded)\n : consumeStagedDocuments(projectId, seeded, seedReflectsWrites)\n })\n // Published-ness as the version POINTER (EC-224), decoupled from the flat\n // `state` enum: seeded from hydration's pointer set, or — when none is supplied\n // — the canonical sample published set for the playground. A kit's imported\n // content (`initialDocuments` without a pointer set) starts unpublished\n // (drafts) until an editor publishes it. The flat `state` is never consulted.\n const [publishedKeys, setPublishedKeys] = useState<Set<string>>(() => {\n if (initialPublishedKeys) return new Set(initialPublishedKeys)\n return new Set(initialDocuments ? [] : samplePublishedKeys)\n })\n // EC-445: per-document last-write timestamps behind the `$updatedAt` column.\n // Seeded from hydration (connected: the persisted `cmsDocuments.updatedAt`), then\n // re-stamped on the common edit paths. A seeded document with no hydrated timestamp\n // (the playground fixtures / a kit) gets a session-start stamp so the column is\n // never a wall of blanks; a fresh draft is stamped when it is created.\n const [updatedAtByKey, setUpdatedAtByKey] = useState<Map<string, string>>(() => {\n const now = new Date().toISOString()\n const map = new Map<string, string>()\n if (initialTimestamps) {\n for (const [key, value] of Object.entries(initialTimestamps)) map.set(key, value)\n }\n for (const doc of initialDocuments ?? sampleDocuments) {\n const key = documentKey(doc)\n if (!map.has(key)) map.set(key, now)\n }\n return map\n })\n const stampUpdatedAt = useCallback(\n (ref: DocumentRef, iso: string = new Date().toISOString()) => {\n setUpdatedAtByKey((prev) => {\n const next = new Map(prev)\n next.set(documentKey(ref), iso)\n return next\n })\n },\n [],\n )\n const documentUpdatedAt = useCallback(\n (ref: DocumentRef) => updatedAtByKey.get(documentKey(ref)),\n [updatedAtByKey],\n )\n // EC-447: per-document FIRST-publish instants behind the `$publishedAt` column.\n // Seeded from hydration (the persisted `cmsDocuments.publishedAt`); UNLIKE\n // `$updatedAt` there is NO session-start fallback — an absent entry is a real \"no\n // publish date\" (EmDash). The store re-stamps/clears it authoritatively on\n // publish/unpublish (the set-once + clear semantics live in the persistence spine).\n const [publishedAtByKey, setPublishedAtByKey] = useState<Map<string, string>>(() => {\n const map = new Map<string, string>()\n if (initialPublishTimestamps) {\n for (const [key, value] of Object.entries(initialPublishTimestamps)) map.set(key, value)\n }\n return map\n })\n // Adopt the AUTHORITATIVE publish instant from the reconciled record: an ISO value\n // stamps it (set-once is enforced server-side, so this only ever adopts the pinned\n // first-publish value); `undefined` CLEARS it (unpublish). Mirrors `stampUpdatedAt`\n // but supports clearing — the column shows a date iff the doc is currently published.\n const stampPublishedAt = useCallback((ref: DocumentRef, iso: string | undefined) => {\n setPublishedAtByKey((prev) => {\n const key = documentKey(ref)\n if (iso === undefined) {\n if (!prev.has(key)) return prev\n const next = new Map(prev)\n next.delete(key)\n return next\n }\n if (prev.get(key) === iso) return prev\n const next = new Map(prev)\n next.set(key, iso)\n return next\n })\n }, [])\n const documentPublishedAt = useCallback(\n (ref: DocumentRef) => publishedAtByKey.get(documentKey(ref)),\n [publishedAtByKey],\n )\n // EC-449: the documents whose draft carries unpublished changes — the amber\n // \"changed\" `$state` dot. A SET like `publishedKeys` (membership = the\n // materialized `hasUnpublishedChanges === true`); seeded from hydration, then\n // re-stamped authoritatively from returned records — the verdict is computed\n // ONCE at the write chokepoint (both adapters), never client-side per render.\n const [changedKeys, setChangedKeys] = useState<Set<string>>(\n () => new Set(initialChangedKeys ?? []),\n )\n // Adopt the authoritative flag: `true` adds the key; `false`/`undefined` (not\n // changed / cleared at unpublish / not materialized) both remove it — the dot\n // renders those identically, so the set stores no tri-state.\n const stampHasUnpublishedChanges = useCallback(\n (ref: DocumentRef, changed: boolean | undefined) => {\n setChangedKeys((prev) => {\n const key = documentKey(ref)\n if (prev.has(key) === (changed === true)) return prev\n const next = new Set(prev)\n if (changed === true) next.add(key)\n else next.delete(key)\n return next\n })\n },\n [],\n )\n const documentHasUnpublishedChanges = useCallback(\n (ref: DocumentRef) => changedKeys.has(documentKey(ref)),\n [changedKeys],\n )\n // The one adoption seam for a SAVED document record (persister queue upsert,\n // inline cell edit, bulk set-field, restore): stamp the server-computed\n // changed verdict for the record's ref. Referentially stable — the persister\n // closes over it once.\n const adoptSavedRecord = useCallback(\n (record: CmsDocumentRecord) => {\n stampHasUnpublishedChanges(\n { collection: record.document.collection, id: record.document.id },\n record.hasUnpublishedChanges,\n )\n },\n [stampHasUnpublishedChanges],\n )\n const [activeViews, setActiveViews] = useState<Record<string, string>>({})\n // The live table state per collection where it diverges from the active\n // view; absent key = exactly the active view's state (not dirty).\n const [tableStates, setTableStates] = useState<Record<string, TableViewState>>({})\n // Collections are stateful so AI-generated schemas (EC-097) can be accepted\n // into the session. The session schema IS the source the sort/filter\n // offering follows (EC-177 gap 3): hydrated sessions receive the persisted\n // schema via `initialCollections`; the fixture fallback is the canonical\n // cms-core sample schema WITH its declared `filterable` flags — no\n // session-side widenings, so the studio never offers a field the backend's\n // delivery engine would reject.\n const [collections, setCollections] = useState<CollectionDef[]>(() => [\n ...(initialCollections ?? sampleFilterableCollections),\n ])\n const [persistError, setPersistError] = useState<OperationError | null>(null)\n const seq = useRef(0)\n // EC-274: collection ids whose lone singleton document this session has already\n // created — a synchronous guard so a re-invoked effect (or StrictMode's double\n // mount) never materializes a second document under a freshly generated id.\n const ensuredSingletons = useRef<Set<string>>(new Set())\n\n // Latest session state for the persister's lazy baseline (no re-subscribing).\n const collectionsRef = useRef(collections)\n collectionsRef.current = collections\n const documentsRef = useRef(documents)\n documentsRef.current = documents\n\n const persisterRef = useRef<CmsPersister | null>(null)\n if (persisterRef.current === null && projectId !== undefined) {\n persisterRef.current = createCmsPersister({\n projectId,\n getOperations: async () => (await getStudioOperations()).operations,\n getCollections: () => collectionsRef.current,\n getDocuments: () => documentsRef.current,\n // EC-277: self-type composition static props on write (the manifest half of\n // the lens), so extraction stays schema-free. Document fields self-type via\n // the schema alone (above); the registry adds blocks/embed prop coverage.\n lookupManifest: studioManifestLookup(),\n onError: setPersistError,\n // EC-449: adopt the server-computed `hasUnpublishedChanges` verdict from\n // every queued upsert's authoritative record (saves, imports, bulk-cleaned\n // drafts) — the amber list dot follows the chokepoint, never a client guess.\n onDocumentSaved: adoptSavedRecord,\n })\n }\n\n const registry = useMemo(() => createCollectionRegistry(collections), [collections])\n const store = useMemo(() => createDocumentStore(documents), [documents])\n const localeConfig = initialLocaleConfig ?? sampleLocaleConfig\n\n // Asset existence is validated against the REAL asset library (assets live in\n // their own repository, not as CMS documents). With the ambient AssetsProvider\n // present, the oracle is the set of uploaded asset ids — but only once loaded;\n // while it loads we are optimistic so a valid upload is never transiently\n // flagged \"unknown\". With no provider (tests/fixtures), the oracle is absent\n // and asset existence falls back to the document store.\n const assetStore = useOptionalAssets()\n const assetExists = useMemo<((id: string) => boolean) | undefined>(() => {\n if (!assetStore) return undefined\n if (assetStore.status !== 'ready') return () => true\n const ids = new Set(assetStore.assets.map((asset) => asset.id))\n return (id) => ids.has(id)\n }, [assetStore])\n\n // The ambient studio locale (EC-176): this session's locale config drives\n // the switcher options; every CMS surface follows the one active locale.\n const { locale: activeLocale } = useStudioLocale()\n useEffect(() => {\n configureStudioLocales(localeConfig)\n }, [localeConfig])\n\n const getCollection = useCallback((id: string) => registry.get(id), [registry])\n\n const getDocument = useCallback(\n (ref: DocumentRef) => documents.find((d) => matchesRef(d, ref)),\n [documents],\n )\n\n const titleOf = useCallback(\n (ref: DocumentRef) => {\n const doc = documents.find((d) => matchesRef(d, ref))\n const collection = registry.get(ref.collection)\n if (!doc || !collection) return ref.id\n // EC-296/EC-242: a function `titleField` (title pattern) composes the title\n // from the document's resolved values (active locale). Only resolve the full\n // value set when a function is declared — the common string `titleField` case\n // still resolves the single title field below (primaryField === the title field).\n if (typeof collection.titleField === 'function') {\n const values: Record<string, unknown> = {}\n for (const field of collection.fields) {\n values[field.name] = resolveField(collection, doc, field.name, activeLocale, localeConfig).value\n }\n return resolveDocumentTitle(collection, values, ref.id)\n }\n // Resolve through the locale layer in the ambient active locale (EC-176)\n // with EC-018 fallback, so localized titles follow the switcher.\n const { value } = resolveField(\n collection,\n doc,\n primaryField(collection),\n activeLocale,\n localeConfig,\n )\n return typeof value === 'string' && value ? value : ref.id\n },\n [documents, registry, localeConfig, activeLocale],\n )\n\n const saveDocument = useCallback(\n (doc: CmsDocument) => {\n // Replace-or-append (upsert): a brand-new document must still land even\n // though nothing in the session matches its ref yet.\n setDocuments((prev) => upsertDoc(prev, doc))\n stampUpdatedAt(doc) // EC-445: a save bumps the $updatedAt column\n persisterRef.current?.upsertDocument(doc)\n },\n [stampUpdatedAt],\n )\n\n const commitFieldEdit = useCallback(\n (input: CellCommitInput): Promise<CellCommitOutcome> => {\n // Pure map-replace: an edit always targets a document already open in\n // the session, so a miss (already gone) is a no-op, never an append.\n const replaceWith = (doc: CmsDocument) => setDocuments((prev) => replaceDoc(prev, doc))\n const persister = persisterRef.current\n return commitCellEdit(\n {\n registry,\n documents: documentsRef.current,\n localeConfig,\n // EC-445: the optimistic apply bumps the $updatedAt column (a rollback\n // leaves it — it self-corrects on the next hydration).\n applySession: (doc) => {\n replaceWith(doc)\n stampUpdatedAt(doc)\n },\n rollbackSession: replaceWith,\n ...(persister && projectId !== undefined\n ? {\n dispatch: async (next: CmsDocument) => {\n // Make sure the persisted baseline + every queued mutation\n // landed first, then issue the commit's single command.\n await persister.ensureBaseline()\n const { operations } = await getStudioOperations()\n const result = await operations.documents.upsert({ projectId, document: next })\n // EC-449: adopt the chokepoint's changed verdict (inline edits\n // bypass the persister queue, so its hook doesn't see them).\n if (result.ok) adoptSavedRecord(result.value)\n return result\n },\n }\n : {}),\n },\n input,\n )\n },\n [registry, localeConfig, projectId, stampUpdatedAt, adoptSavedRecord],\n )\n\n // Shared insert sequence (EC-326): existingIds/mint/seedDefaults (via\n // `buildNewDocument`) + optimistic append + persist, consumed by both\n // `createDocument` (always inserts) and `ensureSingletonDocument`'s empty\n // branch (`guardExisting: true` — re-checks \"no document for this collection\n // yet\" against the LATEST `prev` inside the `setDocuments` updater, not the\n // `documentsRef.current` snapshot the caller already checked, so a\n // concurrent invocation — StrictMode's double-invoked effect — can never\n // materialize a second singleton document).\n const insertNewDocument = useCallback(\n (collectionId: string, options?: { guardExisting?: boolean }): CmsDocument => {\n const doc = buildNewDocument(collectionId, registry, seq, documentsRef.current)\n setDocuments((prev) =>\n options?.guardExisting && hasDocumentFor(prev, collectionId) ? prev : [...prev, doc],\n )\n stampUpdatedAt(doc) // EC-445: a fresh draft's $updatedAt starts at creation time\n persisterRef.current?.upsertDocument(doc)\n return doc\n },\n [registry, stampUpdatedAt],\n )\n\n const createDocument = useCallback(\n (collectionId: string): DocumentRef => {\n const doc = insertNewDocument(collectionId)\n return { collection: collectionId, id: doc.id }\n },\n [insertNewDocument],\n )\n\n // EC-274 (re-scopes EC-217): a singleton is a UI lens, not a fixed id. Resolve\n // the collection's lone document and return its ref; if none exists yet, create\n // one with a NORMAL generated id (never the collection id — no code ever names a\n // literal doc id). Idempotent under React effects/StrictMode: the create guard\n // keys on \"any document in this collection\", so a re-invocation never adds a\n // second. On drift (>1 doc) the studio routes to the list, so this defensively\n // returns the first; the empty draft persists like any create.\n const ensureSingletonDocument = useCallback(\n (collectionId: string): DocumentRef => {\n const collection = registry.get(collectionId)\n const resolution = collection\n ? resolveSingletonDocument(collection, documentsRef.current)\n : ({ kind: 'empty' } as const)\n if (resolution.kind === 'ready') {\n return { collection: collectionId, id: resolution.doc.id }\n }\n if (resolution.kind === 'drift') {\n return { collection: collectionId, id: resolution.docs[0]!.id }\n }\n // Empty: create the lone document once. The ref guard (synchronous) plus the\n // updater's \"any doc in collection\" check make this idempotent under a\n // re-invoked effect or StrictMode's double mount — never a second draft.\n const existing = documentsRef.current.find((d) => d.collection === collectionId)\n if (existing) return { collection: collectionId, id: existing.id }\n if (ensuredSingletons.current.has(collectionId)) {\n return { collection: collectionId, id: `new-${collectionId}-pending` }\n }\n ensuredSingletons.current.add(collectionId)\n // EC-316: same collision-free mint as `createDocument` (via the shared\n // `insertNewDocument` — defensive here, the singleton-empty branch only\n // runs when no document exists yet).\n const doc = insertNewDocument(collectionId, { guardExisting: true })\n return { collection: collectionId, id: doc.id }\n },\n [registry, insertNewDocument],\n )\n\n const deleteDocument = useCallback((ref: DocumentRef) => {\n setDocuments((prev) => removeDoc(prev, ref))\n persisterRef.current?.deleteDocument(ref)\n }, [])\n\n // EC-224: published-ness IS the version pointer (`publishedKeys`) — the SOLE\n // studio source of truth, read via `isPublished`. The live row stays a\n // continuous draft (Sanity model); no flat `state` mirror is maintained. Every\n // reader now consults the pointer (the table badge/$state via `isPublished`,\n // the preview engine via the pin), so the flat field is read by nothing here.\n const setPublished = useCallback((ref: DocumentRef, published: boolean) => {\n const key = documentKey(ref)\n setPublishedKeys((prev) => {\n if (prev.has(key) === published) return prev\n const next = new Set(prev)\n if (published) next.add(key)\n else next.delete(key)\n return next\n })\n }, [])\n\n const isPublished = useCallback(\n (ref: DocumentRef) => publishedKeys.has(documentKey(ref)),\n [publishedKeys],\n )\n\n // Reconcile published-ness for a ref against the AUTHORITATIVE backend record\n // (EC-225): the optimistic flip is a guess; once the queued op settles we read\n // the actual pin so the badge can never claim a state the backend refused\n // (a publish blocked by field rules, an unpublish blocked by a strict ref).\n const reconcilePublished = useCallback(\n async (ref: DocumentRef) => {\n if (projectId === undefined) return\n const { operations } = await getStudioOperations()\n const record = await operations.documents.get({ projectId, ref })\n if (record.ok) {\n setPublished(ref, record.value.publishedVersion !== undefined)\n // EC-445: publish/unpublish patches `updatedAt` — adopt the authoritative\n // value so the $updatedAt column reflects the actual write, not a guess.\n if (record.value.updatedAt) stampUpdatedAt(ref, record.value.updatedAt)\n // EC-447: adopt the authoritative `publishedAt` — set-once on the first\n // publish, absent after unpublish. Passing `undefined` CLEARS the column, so\n // an unpublish reverts $publishedAt to EmDash and a republish records fresh.\n stampPublishedAt(ref, record.value.publishedAt)\n // EC-449: adopt the authoritative changed flag — `false` after a publish\n // (the draft became the baseline), absent after an unpublish (cleared).\n stampHasUnpublishedChanges(ref, record.value.hasUnpublishedChanges)\n }\n },\n [projectId, setPublished, stampUpdatedAt, stampPublishedAt, stampHasUnpublishedChanges],\n )\n\n const publishDocument = useCallback(\n async (ref: DocumentRef) => {\n setPublished(ref, true) // optimistic\n // EC-273: no clearing here — the draft is already free of conditionally-hidden\n // values (the editor clears them on write), so the snapshot the publish op\n // pins is clean by construction.\n persisterRef.current?.publishDocument(ref)\n await persisterRef.current?.flush()\n await reconcilePublished(ref)\n },\n [setPublished, reconcilePublished],\n )\n\n const unpublishDocument = useCallback(\n async (ref: DocumentRef) => {\n setPublished(ref, false) // optimistic\n persisterRef.current?.unpublishDocument(ref)\n await persisterRef.current?.flush()\n await reconcilePublished(ref)\n },\n [setPublished, reconcilePublished],\n )\n\n const loadDocumentVersions = useCallback(\n async (ref: DocumentRef): Promise<DocumentVersionsView> => {\n // No persisted backend (fixture/playground): no recorded history.\n if (projectId === undefined) return { versions: [] }\n const { operations } = await getStudioOperations()\n const [versionsRes, recordRes] = await Promise.all([\n operations.documents.listVersions({ projectId, ref }),\n operations.documents.get({ projectId, ref }),\n ])\n if (!versionsRes.ok) {\n setPersistError(versionsRes.error)\n return { versions: [] }\n }\n // The pinned (live) version comes off the document record; a never-saved\n // doc simply has no record (and no versions) — not an error to surface.\n const publishedVersion = recordRes.ok ? recordRes.value.publishedVersion : undefined\n return {\n versions: versionsRes.value,\n ...(publishedVersion !== undefined ? { publishedVersion } : {}),\n }\n },\n [projectId],\n )\n\n const restoreDocumentVersion = useCallback(\n async (\n ref: DocumentRef,\n version: number,\n scope?: RestoreScope,\n ): Promise<CmsDocument | null> => {\n if (projectId === undefined) return null\n // Land any queued edits before the restore reads the current draft to\n // snapshot it (same ordering contract as commitFieldEdit/runBulk). This is\n // what makes a granular (field/block) restore merge over the LATEST draft.\n await persisterRef.current?.ensureBaseline()\n const { operations } = await getStudioOperations()\n const result = await operations.documents.restore({\n projectId,\n ref,\n version,\n ...(scope ? { scope } : {}),\n })\n if (!result.ok) {\n setPersistError(result.error)\n return null\n }\n const restored = result.value.document\n // Pure map-replace: a restore always targets a document already open in\n // the session.\n setDocuments((prev) => replaceDoc(prev, restored))\n // EC-449: a restore is a save-shaped write — adopt the chokepoint's fresh\n // changed verdict from the returned record (e.g. restoring a published\n // doc's draft to an older version flips the dot to amber immediately).\n adoptSavedRecord(result.value)\n return restored\n },\n [projectId, adoptSavedRecord],\n )\n\n const validate = useCallback(\n (doc: CmsDocument) =>\n validateDocument(registry, doc, {\n store,\n localeConfig,\n validateComposition,\n validateRichTextEmbeds,\n // EC-224: the EC-173 weak-reference warning sources published-ness from\n // the version pointer, so editing a published doc that references an\n // unpublished target surfaces the fallback warning again (it had gone\n // inert once the flat `state` mirror was dropped in B-3b).\n isPublished,\n assetExists,\n }),\n [registry, store, localeConfig, isPublished, assetExists],\n )\n\n const importDocuments = useCallback(\n (collectionId: string, raw: unknown[]): ImportReport => {\n const report: ImportReport = { added: 0, rejected: [] }\n // Pre-parse so intra-batch relation/asset targets resolve during validation.\n const parsedBatch: CmsDocument[] = []\n const schemaFails: { item: unknown; error: ReturnType<typeof documentSchema.safeParse> }[] =\n []\n for (const item of raw) {\n const parsed = documentSchema.safeParse({ ...(item as object), collection: collectionId })\n if (parsed.success) parsedBatch.push(parsed.data)\n else schemaFails.push({ item, error: parsed })\n }\n for (const { item, error } of schemaFails) {\n report.rejected.push({\n id: (item as { id?: string })?.id ?? translate('cms.list.import.noId'),\n issues: (error.success ? [] : error.error.issues).map((e) => ({\n code: 'invalid-field-value' as const,\n severity: 'error' as const,\n message: e.message,\n path: e.path.map((p) => (typeof p === 'symbol' ? String(p) : p)),\n })),\n })\n }\n // Validate each against existing docs PLUS the rest of the batch.\n const batchStore = createDocumentStore([...documents, ...parsedBatch])\n const accepted: CmsDocument[] = []\n for (const doc of parsedBatch) {\n const issues = validateDocument(registry, doc, { store: batchStore, localeConfig, assetExists })\n const errors = issues.filter((iss) => iss.severity === 'error')\n if (errors.length > 0) report.rejected.push({ id: doc.id, issues: errors })\n else accepted.push(doc)\n }\n if (accepted.length > 0) {\n // Replace-or-append (upsert): an imported row may be brand new to the\n // session, so each accepted document must land even with no prior\n // entry for its ref.\n setDocuments((prev) => accepted.reduce((acc, doc) => upsertDoc(acc, doc), prev))\n for (const doc of accepted) persisterRef.current?.upsertDocument(doc)\n // EC-224: imports land as the working DRAFT. Publish-ness is the version\n // pointer (`publishedKeys`), set by publishing — never carried in the\n // imported row — so an import never auto-publishes; the editor publishes\n // explicitly afterward.\n report.added = accepted.length\n }\n return report\n },\n [registry, documents, localeConfig, assetExists],\n )\n\n const isFieldReadOnly = useCallback((field: FieldDef) => field.form?.readOnly === true, [])\n\n // --- Views (EC-246b: config-as-code) --------------------------------------\n\n // EC-445: the reserved pseudo-columns a CMS collection's list surfaces. Every\n // `cmsDocuments` collection has a publish lifecycle + materialized timestamps\n // ($state + $updatedAt always apply); $url applies only where the deployment\n // resolves a delivery route for it (mirrors the live-URL column's own guard).\n const pseudoColumnsFor = useCallback(\n (collectionId: string): string[] => {\n const collection = registry.get(collectionId)\n if (!collection) return []\n const routable = resolveDeploymentRoutes().some(\n (route) => route.document?.collection === collectionId,\n )\n return pseudoColumns(collection, { publishing: true, timestamps: true, routable })\n },\n [registry],\n )\n\n const viewsOf = useCallback(\n (collectionId: string): SavedView[] => {\n // The baseline view plus the collection's config-declared views (EC-246b/EC-444).\n // Views are PRESENTATION, read live from elytra.config.ts (AD-11) — not the\n // persisted content schema the session booted from — so they reflect code\n // immediately without a re-seed (the persisted schema is only baselined on\n // first run). The EC-169 DB saved-view store is retired: shared views are\n // code, editors keep only transient in-session tweaks + Reset.\n //\n // EC-444: a config view with the reserved `id: 'default'` REPLACES the\n // synthesized \"All entries\" baseline verbatim (first tab); absent one, the\n // synthesized baseline leads. `resolveCollectionViews` owns that selection.\n const pseudo = pseudoColumnsFor(collectionId)\n const baseline = defaultView(registry.get(collectionId), pseudo)\n const configCollection = resolveDeploymentCollections().find((c) => c.id === collectionId)\n if (!configCollection) return [baseline]\n return resolveCollectionViews(configCollection, baseline, pseudo)\n },\n [registry, pseudoColumnsFor],\n )\n\n // The INITIAL active view for a collection (EC-343/EC-444): a config view flagged\n // `initial: true` seeds the first-load lens; else the baseline — the `id: 'default'`\n // override when present, else the synthesized \"All entries\" (`ALL_VIEW_ID`). Only\n // consulted before the editor has picked a view (`activeViews[id]` wins once set),\n // so transient switching + Reset are unaffected. A duplicate `initial` and any\n // deprecated `default` flag are each warned once (never silent).\n const initialViewId = useCallback((collectionId: string): string => {\n const configCollection = resolveDeploymentCollections().find((c) => c.id === collectionId)\n if (!configCollection) return ALL_VIEW_ID\n warnDuplicateDefaultViews(configCollection)\n warnDeprecatedDefaultFlag(configCollection)\n const initial = defaultConfigViewId(configCollection)\n if (initial) return initial\n return hasDefaultViewOverride(configCollection) ? DEFAULT_VIEW_OVERRIDE_ID : ALL_VIEW_ID\n }, [])\n\n const activeViewOf = useCallback(\n (collectionId: string): SavedView => {\n const id = activeViews[collectionId] ?? initialViewId(collectionId)\n return (\n viewsOf(collectionId).find((view) => view.id === id) ??\n defaultView(registry.get(collectionId), pseudoColumnsFor(collectionId))\n )\n },\n [activeViews, initialViewId, viewsOf, registry, pseudoColumnsFor],\n )\n\n const tableStateOf = useCallback(\n (collectionId: string): TableViewState =>\n tableStates[collectionId] ?? activeViewOf(collectionId).state,\n [tableStates, activeViewOf],\n )\n\n const dropTableState = useCallback((collectionId: string) => {\n setTableStates((prev) => {\n if (!(collectionId in prev)) return prev\n const next = { ...prev }\n delete next[collectionId]\n return next\n })\n }, [])\n\n const setActiveView = useCallback(\n (collectionId: string, viewId: string) => {\n setActiveViews((prev) => ({ ...prev, [collectionId]: viewId }))\n dropTableState(collectionId)\n },\n [dropTableState],\n )\n\n // --- Bulk actions (EC-169) ------------------------------------------------\n\n const runBulk = useCallback(\n async (\n collectionId: string,\n ids: readonly string[],\n action: BulkAction,\n setField?: BulkSetField,\n ): Promise<BulkReport> => {\n const collection = registry.get(collectionId)\n // A set-field needs both the field payload AND the collection def to fold\n // the value the locale-aware way — guard so a misconfigured call fails\n // loud rather than silently no-opping each item.\n if (action === 'set-field' && (!setField || !collection)) {\n return {\n action,\n ...(setField ? { setField } : {}),\n results: ids.map((id) => ({\n ref: { collection: collectionId, id },\n title: titleOf({ collection: collectionId, id }),\n ok: false,\n reason: translate('cms.list.bulk.error.invalidSetField'),\n error: { code: 'unknown', message: 'Invalid set-field request.' },\n })),\n }\n }\n // The next document for a set-field item: fold the value into the active\n // locale's bag (localized) or the shared `values` (non-localized).\n const setFieldDoc = (doc: CmsDocument): CmsDocument =>\n applyCellValue(collection!, doc, setField!.field, activeLocale, setField!.value)\n\n let dispatch:\n | ((action: BulkAction, ref: DocumentRef) => Promise<OperationResult<unknown>>)\n | undefined\n const persister = persisterRef.current\n if (persister && projectId !== undefined) {\n // Pending queued mutations + baseline land first, then one awaited\n // command per item (same ordering contract as commitFieldEdit).\n await persister.ensureBaseline()\n const { operations } = await getStudioOperations()\n dispatch = (bulkAction, ref) => {\n if (bulkAction === 'delete') return operations.documents.delete({ projectId, ref })\n if (bulkAction === 'publish') return operations.documents.publish({ projectId, ref })\n if (bulkAction === 'unpublish') return operations.documents.unpublish({ projectId, ref })\n // set-field: upsert the document carrying the new value. The write\n // path self-types it through the schema lens (EC-277); a scalar field\n // stores its scalar as-is.\n const current = documentsRef.current.find((d) => matchesRef(d, ref))\n if (!current) {\n return Promise.resolve<OperationResult<unknown>>({\n ok: false,\n error: {\n code: 'not-found',\n message: 'Document is no longer in the session.',\n entity: 'cms-document',\n key: `${ref.collection}:${ref.id}`,\n },\n })\n }\n return operations.documents\n .upsert({ projectId, document: setFieldDoc(current) })\n .then((result) => {\n // EC-449: adopt the chokepoint's changed verdict per set-field item\n // (bulk dispatch bypasses the persister queue and its hook).\n if (result.ok) adoptSavedRecord(result.value)\n return result\n })\n }\n }\n return runBulkAction(\n {\n documents: documentsRef.current,\n titleOf,\n validate: (doc) =>\n validateDocument(registry, doc, {\n store: createDocumentStore(documentsRef.current),\n localeConfig,\n // EC-225: include the composition validators so a bulk PUBLISH\n // gates blocks/richText validity the same way the detail editor\n // does — the operations-layer publish gate has no component\n // registry, so composition validity is a studio-validation invariant.\n validateComposition,\n validateRichTextEmbeds,\n assetExists,\n }),\n // EC-425: bulk publish joins the single-document clean point — the\n // SAME shared hidden-strip `doPublish` runs (EC-273 field values +\n // EC-394 component props, session registry), per item.\n ...(collection\n ? { cleanForPublish: (doc: CmsDocument) => cleanHiddenForPublish(collection, doc) }\n : {}),\n // Land a cleaned draft exactly the way the editor's publish does:\n // session apply + the persister's self-typing upsert (EC-277 manifest\n // lens), flushed so the serial queue lands the upsert BEFORE the\n // awaited publish command snapshots the stored draft.\n applyCleaned: async (_ref, cleaned) => {\n setDocuments((prev) => replaceDoc(prev, cleaned))\n const persister = persisterRef.current\n if (persister && projectId !== undefined) {\n persister.upsertDocument(cleaned)\n await persister.flush()\n }\n },\n // EC-224: a succeeded publish/unpublish moves the version pointer\n // (`publishedKeys`) via setPublished — there is no separate flat\n // `state` mirror to keep in sync (published-ness is derived from the\n // pointer set).\n // EC-449: either transition resolves the changed flag — publish writes\n // `false` (the draft became the baseline), unpublish clears it — and\n // bulk has no per-item record reconcile, so mirror that here.\n applyState: (ref, state) => {\n setPublished(ref, state === 'published')\n stampHasUnpublishedChanges(ref, false)\n },\n applyDelete: (ref) => setDocuments((prev) => removeDoc(prev, ref)),\n // EC-247: fold the new value into the session document (same\n // locale-aware path the dispatched upsert used). Not a plain\n // `replaceDoc` — the replacement is computed FROM each matched\n // document (`setFieldDoc(d)`), not a fixed value to swap in.\n applySetField: (ref) =>\n setDocuments((prev) => prev.map((d) => (matchesRef(d, ref) ? setFieldDoc(d) : d))),\n ...(dispatch ? { dispatch } : {}),\n },\n collectionId,\n ids,\n action,\n setField,\n )\n },\n [\n projectId,\n titleOf,\n registry,\n localeConfig,\n activeLocale,\n setPublished,\n assetExists,\n adoptSavedRecord,\n stampHasUnpublishedChanges,\n ],\n )\n\n const store$ = useMemo<CmsStore>(\n () => ({\n ...(projectId !== undefined ? { projectId } : {}),\n collections,\n localeConfig,\n activeLocale,\n getCollection,\n documentsOf: (collectionId) => documents.filter((d) => d.collection === collectionId),\n getDocument,\n titleOf,\n saveDocument,\n commitFieldEdit,\n createDocument,\n ensureSingletonDocument,\n deleteDocument,\n isPublished,\n documentUpdatedAt,\n documentPublishedAt,\n documentHasUnpublishedChanges,\n publishDocument,\n unpublishDocument,\n loadDocumentVersions,\n restoreDocumentVersion,\n importDocuments,\n validate,\n isFieldReadOnly,\n viewsOf,\n activeViewId: (collectionId) => activeViews[collectionId] ?? initialViewId(collectionId),\n setActiveView,\n tableStateOf,\n setTableState: (collectionId, update) =>\n setTableStates((prev) => {\n const current = prev[collectionId] ?? activeViewOf(collectionId).state\n const next = typeof update === 'function' ? update(current) : update\n return { ...prev, [collectionId]: next }\n }),\n isViewDirty: (collectionId) => {\n const working = tableStates[collectionId]\n if (working === undefined) return false\n const active = activeViewOf(collectionId).state\n const collection = registry.get(collectionId)\n if (collection === undefined) return !viewStatesEqual(working, active)\n // Compare schema-resolved forms (EC-213): a column-order reconciliation\n // or a stale `hidden` entry must not read as an unsaved edit. EC-445: the\n // pseudo-column universe must match so a reserved column never reads as a diff.\n const pseudo = pseudoColumnsFor(collectionId)\n return !viewStatesEqual(\n canonicalViewState(collection, working, pseudo),\n canonicalViewState(collection, active, pseudo),\n )\n },\n resetTableState: dropTableState,\n runBulk,\n addCollection: (def) =>\n setCollections((prev) => [...prev.filter((c) => c.id !== def.id), def]),\n persistError,\n clearPersistError: () => setPersistError(null),\n ensurePersistedBaseline: () => persisterRef.current?.ensureBaseline() ?? Promise.resolve(),\n flushPersistence: () => persisterRef.current?.flush() ?? Promise.resolve(),\n }),\n [\n projectId,\n collections,\n documents,\n localeConfig,\n activeLocale,\n getCollection,\n getDocument,\n titleOf,\n saveDocument,\n commitFieldEdit,\n createDocument,\n ensureSingletonDocument,\n deleteDocument,\n isPublished,\n documentUpdatedAt,\n documentPublishedAt,\n documentHasUnpublishedChanges,\n publishDocument,\n unpublishDocument,\n loadDocumentVersions,\n restoreDocumentVersion,\n importDocuments,\n validate,\n isFieldReadOnly,\n viewsOf,\n activeViews,\n activeViewOf,\n initialViewId,\n tableStates,\n tableStateOf,\n setActiveView,\n dropTableState,\n runBulk,\n registry,\n pseudoColumnsFor,\n persistError,\n ],\n )\n\n return <CmsContext.Provider value={store$}>{children}</CmsContext.Provider>\n}\n\nexport { useCms }\n\nexport { primaryField }\nexport type { Locale }\n"]}
|
|
@@ -307,7 +307,13 @@ function DocumentsGrid({ projectId, collection, primary, primaryFieldDef, column
|
|
|
307
307
|
}
|
|
308
308
|
const field = fieldByName(name);
|
|
309
309
|
return field ? (_jsx(HeaderCell, { field: name, label: fieldLabel(field), sort: sort, onSort: onSort }, name)) : null;
|
|
310
|
-
}), hasRowActions ? (_jsx("th", { className: "px-2 py-2 text-right", children: _jsx("span", { className: "sr-only", children: translate('cms.list.rowActionsColumnLabel') }) })) : null] }) }), _jsx("tbody", { children: sortedDocs.map((doc) => (_jsxs("tr", { className: cn('group border-b border-border/60 hover:bg-muted/40', selected.has(doc.id) && 'bg-primary/5'), children: [_jsx("td", { className: "w-10 whitespace-nowrap px-3 py-2 align-middle", children: _jsx(SelectionCheckbox, { checked: selected.has(doc.id),
|
|
310
|
+
}), hasRowActions ? (_jsx("th", { className: "px-2 py-2 text-right", children: _jsx("span", { className: "sr-only", children: translate('cms.list.rowActionsColumnLabel') }) })) : null] }) }), _jsx("tbody", { children: sortedDocs.map((doc) => (_jsxs("tr", { className: cn('group border-b border-border/60 hover:bg-muted/40', selected.has(doc.id) && 'bg-primary/5'), children: [_jsx("td", { className: "w-10 whitespace-nowrap px-3 py-2 align-middle", children: _jsx(SelectionCheckbox, { checked: selected.has(doc.id),
|
|
311
|
+
// EC-463: the row's TITLE, not the internal draft key — an
|
|
312
|
+
// accessible name has to identify the thing a human (or an
|
|
313
|
+
// agent editor) sees. "Select new-docPage-1" identified nothing.
|
|
314
|
+
label: translate('cms.list.selectRow', {
|
|
315
|
+
title: source.titleOf({ collection: collectionId, id: doc.id }),
|
|
316
|
+
}), testId: `select-row-${doc.id}`, onToggle: (shift) => onToggleRow(doc.id, shift) }) }), hasStatus ? (_jsx("td", { className: "w-11 whitespace-nowrap px-2 py-2 text-center align-middle", children: _jsx(DocStateDot, { state: docStateOf(publishing.isPublished({ collection: collectionId, id: doc.id }), publishing.hasUnpublishedChanges?.({
|
|
311
317
|
collection: collectionId,
|
|
312
318
|
id: doc.id,
|
|
313
319
|
}) ?? false) }) })) : null, _jsx("td", { className: "px-3 py-2 align-middle", children: _jsx(PrimaryCell, { projectId: projectId, collection: collection, doc: doc, primary: primary, depth: depthById?.get(doc.id) ?? 0, locale: source.activeLocale, config: source.localeConfig, detailPath: source.detailPath }) }), columns.map((name) => {
|