@knkcs/contenthub-ui 0.3.0 → 0.3.1

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/CHANGELOG.md CHANGED
@@ -1,5 +1,14 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.3.1](https://github.com/knkCS/contenthub/compare/contenthub-ui-v0.3.0...contenthub-ui-v0.3.1) (2026-10-13)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * **ui:** read a change set without a status as the default status ([#257](https://github.com/knkCS/contenthub/issues/257)) ([b88b157](https://github.com/knkCS/contenthub/commit/b88b1571ec98d29ec78907ced7fbdacf93509f57))
9
+ * **ui:** show each Branch of a Chain at its own head in the Branch editor ([#258](https://github.com/knkCS/contenthub/issues/258)) ([cdae1bf](https://github.com/knkCS/contenthub/commit/cdae1bf1af7b6ceb9cfc281186e42341e39b9193)), closes [#252](https://github.com/knkCS/contenthub/issues/252)
10
+ * **ui:** stop calling a Branch up to date when Update from Main left a Pending Merge ([#256](https://github.com/knkCS/contenthub/issues/256)) ([396ea42](https://github.com/knkCS/contenthub/commit/396ea42c33af27721b8bdc176cd34acf1b5cfa60))
11
+
3
12
  ## [0.3.0](https://github.com/knkCS/contenthub/compare/contenthub-ui-v0.2.0...contenthub-ui-v0.3.0) (2026-10-13)
4
13
 
5
14
 
package/README.md CHANGED
@@ -10,9 +10,9 @@ The package exports screens only, never routes:
10
10
  - `ContentPage`: one Content, read on Main or (`changeSetId`) inside the Change Set it was born in, in tabs Data (read-only, through fieldkit's read mode, loaded lazily), Releases, Revisions (with Compare), References, Change Sets and Filing. The header's one Save sets Filing (Collections, assignees) and never writes a Revision. Its rail offers Start editing, Duplicate, Repeal or Withdraw, Block or Unblock, and Archive (only once nothing is In Force today or later) or Unarchive; Start editing and Duplicate end in `onOpenBranch`, and `onOpenContent` and `onOpenChangeSet` open the rows of its References and Change Sets tabs. It needs `@knkcs/fieldkit` as a peer.
11
11
  - `ChangeSetsIndex`: the workspace's Change Sets, narrowed by state and assignee, created in a Modal; `onOpenChangeSet(id)` opens one, a new one too.
12
12
  - `ChangeSetPage`: one Change Set, its General tab (name and Source while it is open, status label, assignees, dependencies) saved from the header's one Save; its Contents tab, whose rows call `onOpenBranch({ changeSetId, contentId, branchId })`; its Releases tab (Planned Releases, proposals read-only, the Releases they cover) and its Checks tab (each Required Check's latest result, stale or not, and Record). Its rail holds Publish, Update from Main and Discard, and an About section with the readiness tile (`ValidatePublish` at the current heads), the status label and the Source; Publish opens a review that publishes exactly the heads it shows. `onPublished` and `onDiscarded` tell the host. Its leave guard needs a data router (react-router's `useBlocker`).
13
- - `BranchEditor`: one Content inside a Change Set at one Branch (`changeSetId`, `contentId`, `branchId`), its header tabs chosen by `?tab=`. The Content tab renders the Blueprint Release's form through fieldkit's `SpecForm`, with knkeditor for rich text, both loaded lazily; reference fields search contenthub, media fields use the `MediaSource` port. The forms above the tabs are the drafts (fieldkit's "Consumer-owned Save across unmounting tabs"): the Content's, and the Release tab's Planned Release (Validity Period, supersedes, Release Spec values; the Change Set's proposals beside it, read-only). The header's one Save persists every changed tab: one `SaveRevision` on the head the editor loaded, with a field mask of what changed, then `PlanRelease` or `UpdatePlannedRelease`; a refused save sends no plan, and a refused plan leaves only the Release tab changed. A moved head is refused with Reload, never merged; the leave guard needs a data router. Compare shows the head against its fork or Main, References its outgoing edges and outdated pins. The rail offers Update from Main and the merge resolution it may leave, Compare to the fork, Preview, Append a Branch (`onOpenBranch` opens it) and Drop Chain (`onDeleted` leaves), and shows the fork Release, the effective date, the Chain position and the head. It needs `@knkcs/fieldkit` (0.18), `@knkcms/knkeditor-editor` and `@knkcms/knkeditor-vocabulary` (GitHub Packages) as peers.
13
+ - `BranchEditor`: one Content inside a Change Set at one Branch (`changeSetId`, `contentId`, `branchId`), its header tabs chosen by `?tab=`. It reads the Content at that Branch's own head (`GetContent` with `branch_id`); only the Chain's last Branch is edited, and an earlier one shows read-only. The Content tab renders the Blueprint Release's form through fieldkit's `SpecForm`, with knkeditor for rich text, both loaded lazily; reference fields search contenthub, media fields use the `MediaSource` port. The forms above the tabs are the drafts (fieldkit's "Consumer-owned Save across unmounting tabs"): the Content's, and the Release tab's Planned Release (Validity Period, supersedes, Release Spec values; the Change Set's proposals beside it, read-only). The header's one Save persists every changed tab: one `SaveRevision` on the head the editor loaded, with a field mask of what changed, then `PlanRelease` or `UpdatePlannedRelease`; a refused save sends no plan, and a refused plan leaves only the Release tab changed. A moved head is refused with Reload, never merged; the leave guard needs a data router. Compare shows the head against its fork or Main, References its outgoing edges and outdated pins. The rail offers Update from Main and the merge resolution it may leave, Compare to the fork, Preview, Append a Branch (`onOpenBranch` opens it) and Drop Chain (`onDeleted` leaves), and shows the fork Release, the effective date, the Chain position and the head. It needs `@knkcs/fieldkit` (0.18), `@knkcms/knkeditor-editor` and `@knkcms/knkeditor-vocabulary` (GitHub Packages) as peers.
14
14
  - `MediaSource`, the port a host fills with mediahub, in fieldkit's media-adapter shape (ADR 0020). Without it a media field offers nothing to pick.
15
- - `StatusSource`, the port a host fills with statushub for Change Set status labels (ADR 0020). Without it the screens show the bare slug and offer no status picker.
15
+ - `StatusSource`, the port a host fills with statushub for Change Set status labels (ADR 0020). Without it the screens show the bare slug and offer no status picker. A status it answers with `isDefault` (statushub's default) is what a Change Set without a status reads as (ADR 0014 D9); a host should pass it on.
16
16
  - `BlueprintSource`: content Blueprints and their Releases, for New Content, Blueprint names and the Library's Blueprint filter, which offers the Blueprints of the listed Content too, archived ones included (#241). Not a port a host fills: contenthub serves them itself (`BlueprintCatalogService`), because blueprinthub is its direct dependency (ADR 0020 as amended, #238), so every screen reads them through its `ContenthubClient`. A host may pass its own, which only tests need. A Release contenthub refuses is offered disabled in New Content, with its reasons.
17
17
  - `ContenthubClient`, the port every screen takes, and `createConnectContenthubClient({ baseUrl, fetch })`, its Connect implementation. `baseUrl` is `""` when contenthub serves the page, the mount prefix (`/api/contenthub`) under core.
18
18
  - `ContenthubPathsProvider` and `ContenthubPaths`: where the host mounts the screens, for the breadcrumbs and links they draw. `contenthubSettings` is the settings page, whose tabs are `?tab=`; `contenthubSettingsPath(paths, tab)` builds a link to one.
@@ -1,4 +1,4 @@
1
- import { r as e } from "./content-library-v0mjVD4J.js";
1
+ import { r as e } from "./content-library-DoiD_FOJ.js";
2
2
  import { useMemo as t } from "react";
3
3
  import { jsx as n } from "react/jsx-runtime";
4
4
  import { FieldKitProvider as r, SpecForm as i } from "@knkcs/fieldkit/renderer";
@@ -83,4 +83,4 @@ function d({ client: e, changeSetId: a, branchId: o, fields: s, parts: c, labels
83
83
  //#endregion
84
84
  export { d as default };
85
85
 
86
- //# sourceMappingURL=branch-content-fields-LyF6sD2e.js.map
86
+ //# sourceMappingURL=branch-content-fields-CiAVF2F3.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"branch-content-fields-LyF6sD2e.js","names":["contentLabel","MAX_PAGE","itemOf","data","id","blueprintId","branchAdapters","wanted","page","page_size","list","client","query","blueprintIds","excluded","excludeIds","seen","items","c","start","total","ids","detail","contentId","mediaSource","file","filter","plugins","builtInFieldTypes","p","knkRichTextPlugin","BranchContentFields","adapters","useMemo","changeSetId","FieldKitProvider","SpecForm","fields","branchId"],"sources":["../src/screens/branch-adapters.ts","../src/screens/branch-content-fields.tsx"],"sourcesContent":["// fieldkit's adapters for the Branch editor (ADR 0020): references from\n// contenthub's own reads, media through the host's MediaSource port. Types\n// only from fieldkit, so this module adds nothing to the root bundle.\nimport type { FieldKitAdapters, PinTarget, ReferenceItem } from \"@knkcs/fieldkit/renderer\";\nimport type { ContenthubClient } from \"../client/contenthub-client\";\nimport type { MediaSource } from \"../types\";\nimport { contentLabel } from \"./content-library\";\n\n/** The most rows one search asks for: ListContents' own cap. */\nconst MAX_PAGE = 200;\n\n/** What a picker shows for a Content: its label, or its id when its data has none. */\nfunction itemOf(id: string, blueprintId: string, data: Record<string, unknown>): ReferenceItem {\n\treturn { id, display_name: contentLabel(data) || id, blueprint_id: blueprintId };\n}\n\n/**\n * The adapters a Branch's form gets: `reference` searches contenthub's\n * Editor Search on Main (which reads open Branch heads too, so Content born\n * in an open Change Set is found), names a referenced Content from its read\n * and offers its Releases to pin; `media` is the host's MediaSource, absent\n * when the host has none, which leaves a media field nothing to pick.\n */\nexport function branchAdapters({\n\tclient,\n\tchangeSetId,\n\tmediaSource,\n}: {\n\tclient: ContenthubClient;\n\tchangeSetId: string;\n\tmediaSource?: MediaSource;\n}): FieldKitAdapters {\n\treturn {\n\t\treference: {\n\t\t\tasync search({ query, blueprintIds, excludeIds, page, page_size }) {\n\t\t\t\tconst wanted = Math.min(MAX_PAGE, Math.max(1, page) * Math.max(1, page_size));\n\t\t\t\t// Every target Blueprint at once: the service narrows the page, so\n\t\t\t\t// it holds only what the Field may point at, and paging stays exact.\n\t\t\t\tconst list = await client.listContents({\n\t\t\t\t\tsearch: query.trim() || undefined,\n\t\t\t\t\tblueprintIds: blueprintIds.length > 0 ? blueprintIds : undefined,\n\t\t\t\t\tpageSize: wanted,\n\t\t\t\t});\n\t\t\t\tconst excluded = new Set(excludeIds ?? []);\n\t\t\t\tconst seen = new Set<string>();\n\t\t\t\tconst items: ReferenceItem[] = [];\n\t\t\t\t// A search lists a Content once per head that matched: one row each.\n\t\t\t\tfor (const c of list.contents) {\n\t\t\t\t\tif (seen.has(c.id) || excluded.has(c.id)) continue;\n\t\t\t\t\tseen.add(c.id);\n\t\t\t\t\titems.push(itemOf(c.id, c.blueprintId, c.data));\n\t\t\t\t}\n\t\t\t\tconst start = (Math.max(1, page) - 1) * page_size;\n\t\t\t\t// The total is exact on the last page; otherwise there is at least one more.\n\t\t\t\tconst total = list.nextPageToken ? items.length + 1 : items.length;\n\t\t\t\treturn { items: items.slice(start, start + page_size), total };\n\t\t\t},\n\t\t\tasync fetch(ids) {\n\t\t\t\treturn Promise.all(\n\t\t\t\t\tids.map(async (id) => {\n\t\t\t\t\t\t// Published Content reads on Main; Content born in this\n\t\t\t\t\t\t// Change Set exists only there.\n\t\t\t\t\t\tconst detail = await client\n\t\t\t\t\t\t\t.getContent({ id })\n\t\t\t\t\t\t\t.catch(() => client.getContent({ id, changeSetId }))\n\t\t\t\t\t\t\t.catch(() => undefined);\n\t\t\t\t\t\treturn detail\n\t\t\t\t\t\t\t? itemOf(id, detail.content.blueprintId, detail.content.data)\n\t\t\t\t\t\t\t: { id, display_name: id };\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t},\n\t\t\t// A Pin names a Release (the one pinning kind fieldkit has), newest first.\n\t\t\tasync listPinTargets(contentId) {\n\t\t\t\tconst timeline = await client.getTimeline(contentId);\n\t\t\t\treturn [...timeline.entries].reverse().map(\n\t\t\t\t\t(e): PinTarget => ({\n\t\t\t\t\t\tid: e.releaseId,\n\t\t\t\t\t\tlabel: `#${e.ordinal}`,\n\t\t\t\t\t\tdescription: e.validityPeriod\n\t\t\t\t\t\t\t? `${e.validityPeriod.firstDay} – ${e.validityPeriod.lastDay || \"…\"}`\n\t\t\t\t\t\t\t: e.publishTime.slice(0, 10),\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t},\n\t\t},\n\t\tmedia: mediaSource\n\t\t\t? {\n\t\t\t\t\tupload: (file) => mediaSource.upload(file),\n\t\t\t\t\tbrowse: (filter) => mediaSource.browse(filter),\n\t\t\t\t}\n\t\t\t: undefined,\n\t};\n}\n","// fieldkit's renderer with knkeditor for rich text, behind a lazily loaded\n// module: both load the first time a Branch's Content tab is shown, never\n// with the rest of the package (spec #56; branch-editor-bundle.test.ts).\nimport { FieldKitProvider, SpecForm, type SpecFormLabels } from \"@knkcs/fieldkit/renderer\";\nimport { knkRichTextPlugin } from \"@knkcs/fieldkit/rich-text\";\nimport { builtInFieldTypes, type FieldTypePlugin, type Schema } from \"@knkcs/fieldkit/schema\";\nimport { useMemo } from \"react\";\nimport type { ContenthubClient } from \"../client/contenthub-client\";\nimport type { MediaSource, ResolvedField } from \"../types\";\nimport { branchAdapters } from \"./branch-adapters\";\n\n// rich_text through knkeditor (fieldkit ADR-0026); every other type as built in.\nconst plugins: FieldTypePlugin[] = builtInFieldTypes.map((p) =>\n\tp.id === \"rich_text\" ? (knkRichTextPlugin as FieldTypePlugin) : p,\n);\n\nexport interface BranchContentFieldsProps {\n\tclient: ContenthubClient;\n\tchangeSetId: string;\n\t/** The record the form holds, so SpecForm's remembered section is this Branch's. */\n\tbranchId: string;\n\tfields: ResolvedField[];\n\t/** The Resolved Release's parts: the Text Types its rich_text fields pin. */\n\tparts: Record<string, Record<string, unknown>>;\n\tlabels: SpecFormLabels;\n\treadOnly: boolean;\n\tmediaSource?: MediaSource;\n}\n\n/**\n * The Branch's data as the Blueprint Release lays it out, editable: its\n * sections, orientation and cards as fieldkit draws them, over the form the\n * editor holds above its tabs (fieldkit's spec-form.mdx, \"A Consumer-owned\n * Save across unmounting tabs\"). SpecForm keeps no draft of its own.\n */\nexport default function BranchContentFields({\n\tclient,\n\tchangeSetId,\n\tbranchId,\n\tfields,\n\tparts,\n\tlabels,\n\treadOnly,\n\tmediaSource,\n}: BranchContentFieldsProps) {\n\tconst adapters = useMemo(\n\t\t() => branchAdapters({ client, changeSetId, mediaSource }),\n\t\t[client, changeSetId, mediaSource],\n\t);\n\treturn (\n\t\t<FieldKitProvider plugins={plugins} adapters={adapters} parts={parts}>\n\t\t\t<SpecForm\n\t\t\t\tschema={fields as unknown as Schema}\n\t\t\t\tlabels={labels}\n\t\t\t\treadOnly={readOnly}\n\t\t\t\trecordKey={branchId}\n\t\t\t/>\n\t\t</FieldKitProvider>\n\t);\n}\n"],"mappings":";;;;;;;AASA,IAAMC,IAAW;AAGjB,SAASC,EAAO,GAAY,GAAqB,GAA8C;CAC9F,OAAO;EAAE;EAAI,cAAcF,EAAaG,CAAI,KAAKC;EAAI,cAAcC;CAAY;AAChF;AASA,SAAgBC,EAAe,EAC9B,WACA,gBACA,kBAKoB;CACpB,OAAO;EACN,WAAW;GACV,MAAM,OAAO,EAAE,UAAO,iBAAc,eAAY,SAAM,gBAAa;IAClE,IAAMC,IAAS,KAAK,IAAIN,GAAU,KAAK,IAAI,GAAGO,CAAI,IAAI,KAAK,IAAI,GAAGC,CAAS,CAAC,GAGtEC,IAAO,MAAMC,EAAO,aAAa;KACtC,QAAQC,EAAM,KAAK,KAAK,KAAA;KACxB,cAAcC,EAAa,SAAS,IAAIA,IAAe,KAAA;KACvD,UAAUN;IACX,CAAC,GACKO,IAAW,IAAI,IAAIC,KAAc,CAAC,CAAC,GACnCC,oBAAO,IAAI,IAAY,GACvBC,IAAyB,CAAC;IAEhC,KAAK,IAAMC,KAAKR,EAAK,UACpB,AAAIM,EAAK,IAAIE,EAAE,EAAE,KAAKJ,EAAS,IAAII,EAAE,EAAE,MACvCF,EAAK,IAAIE,EAAE,EAAE,GACbD,EAAM,KAAKf,EAAOgB,EAAE,IAAIA,EAAE,aAAaA,EAAE,IAAI,CAAC;IAE/C,IAAMC,KAAS,KAAK,IAAI,GAAGX,CAAI,IAAI,KAAKC,GAElCW,IAAQV,EAAK,gBAAgBO,EAAM,SAAS,IAAIA,EAAM;IAC5D,OAAO;KAAE,OAAOA,EAAM,MAAME,GAAOA,IAAQV,CAAS;KAAG;IAAM;GAC9D;GACA,MAAM,MAAM,GAAK;IAChB,OAAO,QAAQ,IACdY,EAAI,IAAI,OAAO,MAAO;KAGrB,IAAMC,IAAS,MAAMX,EACnB,WAAW,EAAE,MAAG,CAAC,CAAC,CAClB,YAAYA,EAAO,WAAW;MAAE;MAAI;KAAY,CAAC,CAAC,CAAC,CACnD,YAAY,KAAA,CAAS;KACvB,OAAOW,IACJpB,EAAOE,GAAIkB,EAAO,QAAQ,aAAaA,EAAO,QAAQ,IAAI,IAC1D;MAAE;MAAI,cAAclB;KAAG;IAC3B,CAAC,CACF;GACD;GAEA,MAAM,eAAe,GAAW;IAE/B,OAAO,CAAC,IAAG,MADYO,EAAO,YAAYY,CAAS,EAAA,CAC/B,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,KACrC,OAAkB;KAClB,IAAI,EAAE;KACN,OAAO,IAAI,EAAE;KACb,aAAa,EAAE,iBACZ,GAAG,EAAE,eAAe,SAAS,KAAK,EAAE,eAAe,WAAW,QAC9D,EAAE,YAAY,MAAM,GAAG,EAAE;IAC7B,EACD;GACD;EACD;EACA,OAAOC,IACJ;GACA,SAAS,MAASA,EAAY,OAAOC,CAAI;GACzC,SAAS,MAAWD,EAAY,OAAOE,CAAM;EAC9C,IACC,KAAA;CACJ;AACD;;;ACjFA,IAAMC,IAA6BC,EAAkB,KAAK,MACzDC,EAAE,OAAO,cAAeC,IAAwCD,CACjE;AAqBA,SAAwBE,EAAoB,EAC3C,WACA,gBACA,aACA,WACA,UACA,WACA,aACA,kBAC4B;CAC5B,IAAMC,IAAWC,QACV3B,EAAe;EAAE;EAAQ;EAAa;CAAY,CAAC,GACzD;EAACK;EAAQuB;EAAaV;CAAW,CAClC;CACA,OACC,kBAACW,GAAD;EAA2B;EAAmB;EAAiB;EAC9D,UAAA,kBAACC,GAAD;GACC,QAAQC;GACA;GACE;GACV,WAAWC;EACX,CAAA;CACgB,CAAA;AAEpB"}
1
+ {"version":3,"file":"branch-content-fields-CiAVF2F3.js","names":["contentLabel","MAX_PAGE","itemOf","data","id","blueprintId","branchAdapters","wanted","page","page_size","list","client","query","blueprintIds","excluded","excludeIds","seen","items","c","start","total","ids","detail","contentId","mediaSource","file","filter","plugins","builtInFieldTypes","p","knkRichTextPlugin","BranchContentFields","adapters","useMemo","changeSetId","FieldKitProvider","SpecForm","fields","branchId"],"sources":["../src/screens/branch-adapters.ts","../src/screens/branch-content-fields.tsx"],"sourcesContent":["// fieldkit's adapters for the Branch editor (ADR 0020): references from\n// contenthub's own reads, media through the host's MediaSource port. Types\n// only from fieldkit, so this module adds nothing to the root bundle.\nimport type { FieldKitAdapters, PinTarget, ReferenceItem } from \"@knkcs/fieldkit/renderer\";\nimport type { ContenthubClient } from \"../client/contenthub-client\";\nimport type { MediaSource } from \"../types\";\nimport { contentLabel } from \"./content-library\";\n\n/** The most rows one search asks for: ListContents' own cap. */\nconst MAX_PAGE = 200;\n\n/** What a picker shows for a Content: its label, or its id when its data has none. */\nfunction itemOf(id: string, blueprintId: string, data: Record<string, unknown>): ReferenceItem {\n\treturn { id, display_name: contentLabel(data) || id, blueprint_id: blueprintId };\n}\n\n/**\n * The adapters a Branch's form gets: `reference` searches contenthub's\n * Editor Search on Main (which reads open Branch heads too, so Content born\n * in an open Change Set is found), names a referenced Content from its read\n * and offers its Releases to pin; `media` is the host's MediaSource, absent\n * when the host has none, which leaves a media field nothing to pick.\n */\nexport function branchAdapters({\n\tclient,\n\tchangeSetId,\n\tmediaSource,\n}: {\n\tclient: ContenthubClient;\n\tchangeSetId: string;\n\tmediaSource?: MediaSource;\n}): FieldKitAdapters {\n\treturn {\n\t\treference: {\n\t\t\tasync search({ query, blueprintIds, excludeIds, page, page_size }) {\n\t\t\t\tconst wanted = Math.min(MAX_PAGE, Math.max(1, page) * Math.max(1, page_size));\n\t\t\t\t// Every target Blueprint at once: the service narrows the page, so\n\t\t\t\t// it holds only what the Field may point at, and paging stays exact.\n\t\t\t\tconst list = await client.listContents({\n\t\t\t\t\tsearch: query.trim() || undefined,\n\t\t\t\t\tblueprintIds: blueprintIds.length > 0 ? blueprintIds : undefined,\n\t\t\t\t\tpageSize: wanted,\n\t\t\t\t});\n\t\t\t\tconst excluded = new Set(excludeIds ?? []);\n\t\t\t\tconst seen = new Set<string>();\n\t\t\t\tconst items: ReferenceItem[] = [];\n\t\t\t\t// A search lists a Content once per head that matched: one row each.\n\t\t\t\tfor (const c of list.contents) {\n\t\t\t\t\tif (seen.has(c.id) || excluded.has(c.id)) continue;\n\t\t\t\t\tseen.add(c.id);\n\t\t\t\t\titems.push(itemOf(c.id, c.blueprintId, c.data));\n\t\t\t\t}\n\t\t\t\tconst start = (Math.max(1, page) - 1) * page_size;\n\t\t\t\t// The total is exact on the last page; otherwise there is at least one more.\n\t\t\t\tconst total = list.nextPageToken ? items.length + 1 : items.length;\n\t\t\t\treturn { items: items.slice(start, start + page_size), total };\n\t\t\t},\n\t\t\tasync fetch(ids) {\n\t\t\t\treturn Promise.all(\n\t\t\t\t\tids.map(async (id) => {\n\t\t\t\t\t\t// Published Content reads on Main; Content born in this\n\t\t\t\t\t\t// Change Set exists only there.\n\t\t\t\t\t\tconst detail = await client\n\t\t\t\t\t\t\t.getContent({ id })\n\t\t\t\t\t\t\t.catch(() => client.getContent({ id, changeSetId }))\n\t\t\t\t\t\t\t.catch(() => undefined);\n\t\t\t\t\t\treturn detail\n\t\t\t\t\t\t\t? itemOf(id, detail.content.blueprintId, detail.content.data)\n\t\t\t\t\t\t\t: { id, display_name: id };\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t},\n\t\t\t// A Pin names a Release (the one pinning kind fieldkit has), newest first.\n\t\t\tasync listPinTargets(contentId) {\n\t\t\t\tconst timeline = await client.getTimeline(contentId);\n\t\t\t\treturn [...timeline.entries].reverse().map(\n\t\t\t\t\t(e): PinTarget => ({\n\t\t\t\t\t\tid: e.releaseId,\n\t\t\t\t\t\tlabel: `#${e.ordinal}`,\n\t\t\t\t\t\tdescription: e.validityPeriod\n\t\t\t\t\t\t\t? `${e.validityPeriod.firstDay} – ${e.validityPeriod.lastDay || \"…\"}`\n\t\t\t\t\t\t\t: e.publishTime.slice(0, 10),\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t},\n\t\t},\n\t\tmedia: mediaSource\n\t\t\t? {\n\t\t\t\t\tupload: (file) => mediaSource.upload(file),\n\t\t\t\t\tbrowse: (filter) => mediaSource.browse(filter),\n\t\t\t\t}\n\t\t\t: undefined,\n\t};\n}\n","// fieldkit's renderer with knkeditor for rich text, behind a lazily loaded\n// module: both load the first time a Branch's Content tab is shown, never\n// with the rest of the package (spec #56; branch-editor-bundle.test.ts).\nimport { FieldKitProvider, SpecForm, type SpecFormLabels } from \"@knkcs/fieldkit/renderer\";\nimport { knkRichTextPlugin } from \"@knkcs/fieldkit/rich-text\";\nimport { builtInFieldTypes, type FieldTypePlugin, type Schema } from \"@knkcs/fieldkit/schema\";\nimport { useMemo } from \"react\";\nimport type { ContenthubClient } from \"../client/contenthub-client\";\nimport type { MediaSource, ResolvedField } from \"../types\";\nimport { branchAdapters } from \"./branch-adapters\";\n\n// rich_text through knkeditor (fieldkit ADR-0026); every other type as built in.\nconst plugins: FieldTypePlugin[] = builtInFieldTypes.map((p) =>\n\tp.id === \"rich_text\" ? (knkRichTextPlugin as FieldTypePlugin) : p,\n);\n\nexport interface BranchContentFieldsProps {\n\tclient: ContenthubClient;\n\tchangeSetId: string;\n\t/** The record the form holds, so SpecForm's remembered section is this Branch's. */\n\tbranchId: string;\n\tfields: ResolvedField[];\n\t/** The Resolved Release's parts: the Text Types its rich_text fields pin. */\n\tparts: Record<string, Record<string, unknown>>;\n\tlabels: SpecFormLabels;\n\treadOnly: boolean;\n\tmediaSource?: MediaSource;\n}\n\n/**\n * The Branch's data as the Blueprint Release lays it out, editable: its\n * sections, orientation and cards as fieldkit draws them, over the form the\n * editor holds above its tabs (fieldkit's spec-form.mdx, \"A Consumer-owned\n * Save across unmounting tabs\"). SpecForm keeps no draft of its own.\n */\nexport default function BranchContentFields({\n\tclient,\n\tchangeSetId,\n\tbranchId,\n\tfields,\n\tparts,\n\tlabels,\n\treadOnly,\n\tmediaSource,\n}: BranchContentFieldsProps) {\n\tconst adapters = useMemo(\n\t\t() => branchAdapters({ client, changeSetId, mediaSource }),\n\t\t[client, changeSetId, mediaSource],\n\t);\n\treturn (\n\t\t<FieldKitProvider plugins={plugins} adapters={adapters} parts={parts}>\n\t\t\t<SpecForm\n\t\t\t\tschema={fields as unknown as Schema}\n\t\t\t\tlabels={labels}\n\t\t\t\treadOnly={readOnly}\n\t\t\t\trecordKey={branchId}\n\t\t\t/>\n\t\t</FieldKitProvider>\n\t);\n}\n"],"mappings":";;;;;;;AASA,IAAMC,IAAW;AAGjB,SAASC,EAAO,GAAY,GAAqB,GAA8C;CAC9F,OAAO;EAAE;EAAI,cAAcF,EAAaG,CAAI,KAAKC;EAAI,cAAcC;CAAY;AAChF;AASA,SAAgBC,EAAe,EAC9B,WACA,gBACA,kBAKoB;CACpB,OAAO;EACN,WAAW;GACV,MAAM,OAAO,EAAE,UAAO,iBAAc,eAAY,SAAM,gBAAa;IAClE,IAAMC,IAAS,KAAK,IAAIN,GAAU,KAAK,IAAI,GAAGO,CAAI,IAAI,KAAK,IAAI,GAAGC,CAAS,CAAC,GAGtEC,IAAO,MAAMC,EAAO,aAAa;KACtC,QAAQC,EAAM,KAAK,KAAK,KAAA;KACxB,cAAcC,EAAa,SAAS,IAAIA,IAAe,KAAA;KACvD,UAAUN;IACX,CAAC,GACKO,IAAW,IAAI,IAAIC,KAAc,CAAC,CAAC,GACnCC,oBAAO,IAAI,IAAY,GACvBC,IAAyB,CAAC;IAEhC,KAAK,IAAMC,KAAKR,EAAK,UACpB,AAAIM,EAAK,IAAIE,EAAE,EAAE,KAAKJ,EAAS,IAAII,EAAE,EAAE,MACvCF,EAAK,IAAIE,EAAE,EAAE,GACbD,EAAM,KAAKf,EAAOgB,EAAE,IAAIA,EAAE,aAAaA,EAAE,IAAI,CAAC;IAE/C,IAAMC,KAAS,KAAK,IAAI,GAAGX,CAAI,IAAI,KAAKC,GAElCW,IAAQV,EAAK,gBAAgBO,EAAM,SAAS,IAAIA,EAAM;IAC5D,OAAO;KAAE,OAAOA,EAAM,MAAME,GAAOA,IAAQV,CAAS;KAAG;IAAM;GAC9D;GACA,MAAM,MAAM,GAAK;IAChB,OAAO,QAAQ,IACdY,EAAI,IAAI,OAAO,MAAO;KAGrB,IAAMC,IAAS,MAAMX,EACnB,WAAW,EAAE,MAAG,CAAC,CAAC,CAClB,YAAYA,EAAO,WAAW;MAAE;MAAI;KAAY,CAAC,CAAC,CAAC,CACnD,YAAY,KAAA,CAAS;KACvB,OAAOW,IACJpB,EAAOE,GAAIkB,EAAO,QAAQ,aAAaA,EAAO,QAAQ,IAAI,IAC1D;MAAE;MAAI,cAAclB;KAAG;IAC3B,CAAC,CACF;GACD;GAEA,MAAM,eAAe,GAAW;IAE/B,OAAO,CAAC,IAAG,MADYO,EAAO,YAAYY,CAAS,EAAA,CAC/B,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,KACrC,OAAkB;KAClB,IAAI,EAAE;KACN,OAAO,IAAI,EAAE;KACb,aAAa,EAAE,iBACZ,GAAG,EAAE,eAAe,SAAS,KAAK,EAAE,eAAe,WAAW,QAC9D,EAAE,YAAY,MAAM,GAAG,EAAE;IAC7B,EACD;GACD;EACD;EACA,OAAOC,IACJ;GACA,SAAS,MAASA,EAAY,OAAOC,CAAI;GACzC,SAAS,MAAWD,EAAY,OAAOE,CAAM;EAC9C,IACC,KAAA;CACJ;AACD;;;ACjFA,IAAMC,IAA6BC,EAAkB,KAAK,MACzDC,EAAE,OAAO,cAAeC,IAAwCD,CACjE;AAqBA,SAAwBE,EAAoB,EAC3C,WACA,gBACA,aACA,WACA,UACA,WACA,aACA,kBAC4B;CAC5B,IAAMC,IAAWC,QACV3B,EAAe;EAAE;EAAQ;EAAa;CAAY,CAAC,GACzD;EAACK;EAAQuB;EAAaV;CAAW,CAClC;CACA,OACC,kBAACW,GAAD;EAA2B;EAAmB;EAAiB;EAC9D,UAAA,kBAACC,GAAD;GACC,QAAQC;GACA;GACE;GACV,WAAWC;EACX,CAAA;CACgB,CAAA;AAEpB"}
@@ -64,6 +64,11 @@ var W = {
64
64
  "read",
65
65
  t
66
66
  ],
67
+ contentBranchRead: (e, t, n) => [
68
+ ...W.contentRead(e, t),
69
+ "branch",
70
+ n
71
+ ],
67
72
  contentTimeline: (e) => [...W.content(e), "timeline"],
68
73
  contentRevisions: (e, t) => [
69
74
  ...W.content(e),
@@ -532,7 +537,7 @@ var W = {
532
537
  failed: "Die Kette konnte nicht entfernt werden. Bitte erneut versuchen."
533
538
  }
534
539
  },
535
- changeSet: /* @__PURE__ */ JSON.parse("{\"loading\":\"Change Set wird geladen\",\"unavailable\":\"Change Set nicht verfügbar\",\"notFound\":\"Dieses Change Set gibt es nicht.\",\"loadError\":\"Das Change Set konnte nicht geladen werden.\",\"tabs\":{\"general\":\"Allgemein\",\"contents\":\"Inhalte\",\"releases\":\"Releases\",\"checks\":\"Prüfungen\"},\"save\":\"Speichern\",\"saveChanged_one\":\"Speichern · {{count}} Tab geändert\",\"saveChanged_other\":\"Speichern · {{count}} Tabs geändert\",\"saved\":\"Gespeichert.\",\"refused\":{\"transition\":\"Der Status kann nicht von {{from}} zu {{to}} wechseln.\",\"staleStatus\":\"Inzwischen hat jemand den Status auf {{current}} gesetzt. Wähle erneut und speichere.\",\"closed\":\"Dieses Change Set ist geschlossen: Es wurde inzwischen veröffentlicht oder verworfen.\",\"invalid\":\"Die Änderung wurde abgelehnt.\",\"failed\":\"Die Änderungen konnten nicht gespeichert werden. Versuche es erneut.\",\"guarded\":\"Du darfst den Status nicht von {{from}} zu {{to}} wechseln.\",\"unavailable\":\"Change-Set-Status können gerade nicht geprüft werden. Speichere gleich noch einmal.\"},\"leave\":{\"title\":\"Mit ungespeicherten Änderungen verlassen?\",\"message\":\"Deine Änderungen an diesem Change Set sind noch nicht gespeichert. Trotzdem verlassen?\",\"confirm\":\"Verlassen\",\"cancel\":\"Bleiben\"},\"general\":{\"about\":\"Überblick\",\"name\":\"Name\",\"source\":\"Quelle\",\"noSource\":\"Keine\",\"state\":\"Zustand\",\"createdBy\":\"Angelegt von\",\"frozenHint\":\"Name und Quelle ändern sich nicht mehr: Das Change Set ist abgeschlossen.\",\"work\":\"Arbeit\",\"status\":\"Status\",\"noStatus\":\"Kein Status\",\"statusHelp\":\"Wo die Arbeit steht. Er entscheidet nie, ob das Change Set veröffentlicht werden kann.\",\"statusFrozen\":\"Eingefroren: Das Change Set ist geschlossen.\",\"assignees\":\"Zuständig\",\"assigneesHelp\":\"Wer gerade daran arbeitet.\",\"nobody\":\"Niemand\",\"dependencies\":\"Hängt ab von\",\"dependenciesHelp\":\"Offene Change Sets, auf denen dieses aufbaut. Es kann erst nach ihnen veröffentlicht werden.\",\"dependenciesClosed\":\"Abhängigkeiten ändern sich nicht mehr, sobald ein Change Set geschlossen ist.\",\"noDependencies\":\"Keine Abhängigkeiten\"},\"contents\":{\"columns\":{\"content\":\"Content\",\"branches\":\"Branches\",\"born\":\"Herkunft\"},\"branch\":\"Branch\",\"branches\":\"Branches\",\"bornHere\":\"Hier angelegt\",\"onMain\":\"Veröffentlicht\",\"empty\":\"Noch kein Content in diesem Change Set\",\"emptyHint\":\"Beginne, einen Content in diesem Change Set zu bearbeiten, dann erscheint seine Chain hier.\"},\"rail\":{\"eyebrow\":\"Change Set\",\"actions\":\"Aktionen\",\"publish\":\"Veröffentlichen\",\"updateFromMain\":\"Aus Main aktualisieren\",\"discard\":\"Verwerfen\",\"about\":\"Überblick\",\"blockers_one\":\"Hindernis\",\"blockers_other\":\"Hindernisse\",\"readiness\":\"Bereit zur Veröffentlichung\",\"ready\":\"Bereit\",\"unknownReadiness\":\"Unbekannt\",\"status\":\"Status\",\"noStatus\":\"Kein Status\",\"state\":\"Zustand\",\"source\":\"Quelle\",\"noSource\":\"Keine Quelle\"},\"review\":{\"title\":\"{{name}} veröffentlichen\",\"checking\":\"Prüfe, was die Veröffentlichung täte …\",\"loadError\":\"Die Prüfung konnte nicht laufen. Schließe sie und versuche es erneut.\",\"headsTitle\":\"Geprüfte Stände\",\"headsHint\":\"Veröffentlicht werden genau diese Stände. Ändert sich einer davor, wird die Veröffentlichung abgelehnt und nichts geschrieben.\",\"headLine\":\"{{content}} · Branch {{branch}} auf {{head}}\",\"noHeads\":\"Keine Branches: es entstehen nur Releases ohne Branch.\",\"blockersTitle_one\":\"{{count}} Hindernis\",\"blockersTitle_other\":\"{{count}} Hindernisse\",\"blockersHint\":\"Behebe jedes davon und prüfe dann erneut.\",\"ready\":\"Nichts steht dieser Veröffentlichung im Weg.\",\"releasesTitle\":\"Entstehende Releases\",\"noReleases\":\"Es entsteht kein Release.\",\"releaseLine\":\"{{content}} · {{kind}} · {{period}}\",\"publish\":\"Veröffentlichen\",\"again\":\"Erneut prüfen\",\"refused\":\"Die Veröffentlichung wurde abgelehnt. Nichts wurde geschrieben.\",\"closed\":\"Dieses Change Set wurde inzwischen veröffentlicht oder verworfen.\",\"withheld\":\"Dieses Change Set enthält Arbeit, die du nicht sehen kannst. Nur wer alle seine Inhalte sieht, kann es veröffentlichen.\",\"failed\":\"Die Veröffentlichung ist fehlgeschlagen. Versuche es erneut.\",\"published\":\"Veröffentlicht.\",\"alreadyPublished\":\"Es ist mit diesen Ständen bereits veröffentlicht.\",\"openContent\":\"{{content}} öffnen\"},\"blockers\":{\"moved_head\":\"{{content}}: Branch {{branch}} ist seit der Prüfung von {{expected}} auf {{current}} weitergegangen.\",\"moved_head_unreviewed\":\"{{content}}: Branch {{branch}} auf {{current}} war nicht Teil der Prüfung.\",\"moved_head_gone\":\"Branch {{branch}} wurde geprüft, gehört aber nicht mehr zu diesem Change Set.\",\"unplanned_branch\":\"{{content}}: Branch {{branch}} hat kein geplantes Release; die Veröffentlichung würde ihn beenden, ohne ihn zu releasen.\",\"several_branches\":\"{{content}} ist undatierter Content auf mehr als einem Branch; er wird auf genau einem bearbeitet.\",\"behind_base\":\"{{content}}: Branch {{branch}} liegt hinter {{current}}, zuletzt übernommen wurde {{expected}}. Aus Main aktualisieren.\",\"superseded_release\":\"{{content}}: Das geplante Release {{release}} ersetzt {{overlaps}}, das bereits ersetzt ist.\",\"overlapping_periods\":\"{{content}}: Der Gültigkeitszeitraum von {{release}} überschneidet sich mit dem von {{overlaps}}. Ersetze es oder ändere die Daten.\",\"covers_release\":\"{{content}}: Der Gültigkeitszeitraum von {{release}} deckt Release {{covered}} vollständig ab. Ersetze es oder ändere die Daten.\",\"pending_merge\":\"{{content}}: Branch {{branch}} hat einen offenen Merge. Löse ihn im Branch-Editor auf oder brich ihn ab.\",\"nothing_in_force\":\"{{content}}: Die Aufhebung {{release}} findet nichts mehr in Kraft, das sie aufheben könnte.\",\"withdrawal_with_chain\":\"{{content}} wird in diesem Change Set zugleich aufgehoben ({{release}}) und bearbeitet. Entferne eines davon.\",\"dated_changed\":\"{{content}} ist datierter Content geworden, nachdem {{release}} undatiert geplant wurde. Entferne die Chain und beginne sie mit Datum neu.\",\"unpublished_dependency\":\"Es hängt von Change Set {{dependency}} ab, das noch offen ist. Veröffentliche es zuerst oder entferne die Abhängigkeit.\",\"discarded_dependency\":\"Es hängt von Change Set {{dependency}} ab, das verworfen wurde. Entferne die Abhängigkeit und aktualisiere dann aus Main.\",\"dangling_pin\":\"{{content}}: Der Wert an {{path}} verweist auf Release {{release}} von {{target}}, das es nicht geben wird.\",\"second_toc_parent\":\"{{content}} stünde im Inhaltsverzeichnis von {{parents}}; es kann nur in einem stehen.\",\"missing_asset\":\"{{content}}: Der Wert an {{path}} zeigt Asset {{asset}}, das es nicht gibt.\",\"media_unavailable\":\"MediaHub ist für diesen Workspace nicht verfügbar.\",\"missing_required_field\":\"{{content}}: Das Pflichtfeld {{path}} ist in {{revision}} leer. Fülle es im Branch-Editor aus.\",\"outstanding_check\":\"{{check}} hat kein bestandenes oder erlassenes Ergebnis auf den aktuellen Ständen.\",\"outstanding_check_on\":\"{{check}} hat kein bestandenes oder erlassenes Ergebnis für {{content}} ({{subject}}).\",\"unknown\":\"Blockiert: {{code}}.\"},\"releases\":{\"planned\":\"Geplante Releases\",\"columns\":{\"content\":\"Content\",\"kind\":\"Art\",\"period\":\"Gültigkeitszeitraum\",\"pins\":\"Verweist auf\",\"origin\":\"Herkunft\"},\"kind\":{\"revision\":\"Revision\",\"date_only\":\"Nur Datum\",\"repeal\":\"Aufhebung\",\"withdrawal\":\"Rücknahme\"},\"openEnd\":\"offen\",\"undated\":\"Undatiert\",\"period\":\"{{first}} – {{last}}\",\"branchHead\":\"Stand von Branch {{branch}}\",\"revision\":\"Revision {{revision}}\",\"plannedByHand\":\"Geplant\",\"proposed\":\"Vorgeschlagen für {{release}}\",\"splitFrom\":\"Setzt {{release}} fort\",\"withheld\":\"Zurückgehalten: ein Plan ersetzt, was es trägt\",\"proposedHint\":\"Vorschläge folgen aus den geplanten Gültigkeitszeiträumen und werden mit jedem Plan neu berechnet; sie sind nicht bearbeitbar.\",\"empty\":\"Noch keine geplanten Releases\",\"emptyHint\":\"Plane ein Release auf einem Branch im Branch-Editor, dann erscheint hier, was die Veröffentlichung erzeugt.\",\"covered\":\"Abgedeckte Releases\",\"coveredHint\":\"Veröffentlichte Releases, die ein Plan abdeckt: Die Veröffentlichung ersetzt die, die ein Plan nennt, und wird für die übrigen abgelehnt, bis ein Plan sie ersetzt oder sich die Daten ändern.\",\"coveredColumns\":{\"release\":\"Release\",\"by\":\"Abgedeckt von\",\"outcome\":\"Bei Veröffentlichung\"},\"superseded\":\"Ersetzt\",\"blocks\":\"Verhindert die Veröffentlichung\",\"noCovered\":\"Kein veröffentlichtes Release ist abgedeckt.\"},\"checks\":{\"columns\":{\"check\":\"Pflichtprüfung\",\"on\":\"Für\",\"latest\":\"Letztes Ergebnis\",\"standing\":\"Stand\",\"actions\":\"Aktionen\"},\"wholeChangeSet\":\"Das ganze Change Set\",\"onBranch\":\"{{content}} · Branch {{branch}}\",\"onRelease\":\"{{content}} · Release {{release}}\",\"none\":\"Noch kein Ergebnis\",\"latest\":\"{{outcome}} von {{who}}\",\"outcome\":{\"passed\":\"Bestanden\",\"failed\":\"Nicht bestanden\",\"waived\":\"Erlassen\"},\"cleared\":\"Erfüllt\",\"stale\":\"Veraltet: seitdem gespeichert\",\"outstanding\":\"Ausstehend\",\"record\":\"Ergebnis erfassen\",\"independent\":\"Unabhängig\",\"empty\":\"Keine Pflichtprüfung gilt\",\"emptyHint\":\"Die Pflichtprüfungen des Workspaces sperren die Veröffentlichung des Contents, den sie nennen. Keine davon gilt für dieses Change Set.\",\"loadError\":\"Die Prüfergebnisse konnten nicht geladen werden.\",\"form\":{\"title\":\"Ergebnis von {{check}} erfassen\",\"on\":\"Für {{subject}}, auf den Ständen, die du jetzt siehst.\",\"outcome\":\"Ergebnis\",\"note\":\"Notiz\",\"noteHelp\":\"Warum, bei einem Erlass; sonst optional.\",\"noteRequired\":\"Ein Erlass braucht eine Notiz mit dem Grund.\",\"noteTooLong\":\"Höchstens {{max}} Zeichen.\",\"submit\":\"Erfassen\",\"stale\":\"Seit dem Öffnen hat jemand gespeichert. Schließe den Dialog, sieh erneut hin und erfasse auf den neuen Ständen.\",\"denied\":\"Du darfst dieses Ergebnis nicht erfassen.\",\"closed\":\"Dieses Change Set ist geschlossen und nimmt keine Ergebnisse mehr an.\",\"failed\":\"Das Ergebnis konnte nicht erfasst werden. Versuche es erneut.\"}},\"update\":{\"title\":\"Aus Main aktualisieren\",\"message\":\"Übernimm, was Main und die Abhängigkeiten dieses Change Sets seitdem hinzugewonnen haben, in jede Chain. Wie jedes Speichern macht das bisherige Prüfergebnisse veraltet.\",\"confirm\":\"Aktualisieren\",\"close\":\"Schließen\",\"done\":\"Aktualisiert.\",\"merged_one\":\"{{count}} Branch hat einen Merge übernommen.\",\"merged_other\":\"{{count}} Branches haben einen Merge übernommen.\",\"nothingMerged\":\"Nichts zu übernehmen: jeder Branch ist aktuell.\",\"pendingTitle\":\"Mit offenem Merge, im Branch-Editor aufzulösen:\",\"pendingLine\":\"{{content}} · Branch {{branch}}\",\"closed\":\"Dieses Change Set ist geschlossen.\",\"withheld\":\"Dieses Change Set enthält Arbeit, die du nicht sehen kannst. Nur wer alle seine Inhalte sieht, kann es als Ganzes aktualisieren.\",\"failed\":\"Die Aktualisierung ist fehlgeschlagen. Versuche es erneut.\"},\"discard\":{\"title\":\"Change Set verwerfen\",\"message\":\"„{{name}}“ verwerfen? Seine Branches enden, und darin angelegter Content verschwindet. Das kann nicht rückgängig gemacht werden.\",\"confirm\":\"Verwerfen\",\"closed\":\"Dieses Change Set ist bereits geschlossen.\",\"withheld\":\"Dieses Change Set enthält Arbeit, die du nicht sehen kannst. Nur wer alle seine Inhalte sieht, kann es verwerfen.\",\"failed\":\"Das Change Set konnte nicht verworfen werden. Versuche es erneut.\"}}"),
540
+ changeSet: /* @__PURE__ */ JSON.parse("{\"loading\":\"Change Set wird geladen\",\"unavailable\":\"Change Set nicht verfügbar\",\"notFound\":\"Dieses Change Set gibt es nicht.\",\"loadError\":\"Das Change Set konnte nicht geladen werden.\",\"tabs\":{\"general\":\"Allgemein\",\"contents\":\"Inhalte\",\"releases\":\"Releases\",\"checks\":\"Prüfungen\"},\"save\":\"Speichern\",\"saveChanged_one\":\"Speichern · {{count}} Tab geändert\",\"saveChanged_other\":\"Speichern · {{count}} Tabs geändert\",\"saved\":\"Gespeichert.\",\"refused\":{\"transition\":\"Der Status kann nicht von {{from}} zu {{to}} wechseln.\",\"staleStatus\":\"Inzwischen hat jemand den Status auf {{current}} gesetzt. Wähle erneut und speichere.\",\"closed\":\"Dieses Change Set ist geschlossen: Es wurde inzwischen veröffentlicht oder verworfen.\",\"invalid\":\"Die Änderung wurde abgelehnt.\",\"failed\":\"Die Änderungen konnten nicht gespeichert werden. Versuche es erneut.\",\"guarded\":\"Du darfst den Status nicht von {{from}} zu {{to}} wechseln.\",\"unavailable\":\"Change-Set-Status können gerade nicht geprüft werden. Speichere gleich noch einmal.\"},\"leave\":{\"title\":\"Mit ungespeicherten Änderungen verlassen?\",\"message\":\"Deine Änderungen an diesem Change Set sind noch nicht gespeichert. Trotzdem verlassen?\",\"confirm\":\"Verlassen\",\"cancel\":\"Bleiben\"},\"general\":{\"about\":\"Überblick\",\"name\":\"Name\",\"source\":\"Quelle\",\"noSource\":\"Keine\",\"state\":\"Zustand\",\"createdBy\":\"Angelegt von\",\"frozenHint\":\"Name und Quelle ändern sich nicht mehr: Das Change Set ist abgeschlossen.\",\"work\":\"Arbeit\",\"status\":\"Status\",\"noStatus\":\"Kein Status\",\"statusHelp\":\"Wo die Arbeit steht. Er entscheidet nie, ob das Change Set veröffentlicht werden kann.\",\"statusFrozen\":\"Eingefroren: Das Change Set ist geschlossen.\",\"assignees\":\"Zuständig\",\"assigneesHelp\":\"Wer gerade daran arbeitet.\",\"nobody\":\"Niemand\",\"dependencies\":\"Hängt ab von\",\"dependenciesHelp\":\"Offene Change Sets, auf denen dieses aufbaut. Es kann erst nach ihnen veröffentlicht werden.\",\"dependenciesClosed\":\"Abhängigkeiten ändern sich nicht mehr, sobald ein Change Set geschlossen ist.\",\"noDependencies\":\"Keine Abhängigkeiten\"},\"contents\":{\"columns\":{\"content\":\"Content\",\"branches\":\"Branches\",\"born\":\"Herkunft\"},\"branch\":\"Branch\",\"branches\":\"Branches\",\"bornHere\":\"Hier angelegt\",\"onMain\":\"Veröffentlicht\",\"empty\":\"Noch kein Content in diesem Change Set\",\"emptyHint\":\"Beginne, einen Content in diesem Change Set zu bearbeiten, dann erscheint seine Chain hier.\"},\"rail\":{\"eyebrow\":\"Change Set\",\"actions\":\"Aktionen\",\"publish\":\"Veröffentlichen\",\"updateFromMain\":\"Aus Main aktualisieren\",\"discard\":\"Verwerfen\",\"about\":\"Überblick\",\"blockers_one\":\"Hindernis\",\"blockers_other\":\"Hindernisse\",\"readiness\":\"Bereit zur Veröffentlichung\",\"ready\":\"Bereit\",\"unknownReadiness\":\"Unbekannt\",\"status\":\"Status\",\"noStatus\":\"Kein Status\",\"state\":\"Zustand\",\"source\":\"Quelle\",\"noSource\":\"Keine Quelle\"},\"review\":{\"title\":\"{{name}} veröffentlichen\",\"checking\":\"Prüfe, was die Veröffentlichung täte …\",\"loadError\":\"Die Prüfung konnte nicht laufen. Schließe sie und versuche es erneut.\",\"headsTitle\":\"Geprüfte Stände\",\"headsHint\":\"Veröffentlicht werden genau diese Stände. Ändert sich einer davor, wird die Veröffentlichung abgelehnt und nichts geschrieben.\",\"headLine\":\"{{content}} · Branch {{branch}} auf {{head}}\",\"noHeads\":\"Keine Branches: es entstehen nur Releases ohne Branch.\",\"blockersTitle_one\":\"{{count}} Hindernis\",\"blockersTitle_other\":\"{{count}} Hindernisse\",\"blockersHint\":\"Behebe jedes davon und prüfe dann erneut.\",\"ready\":\"Nichts steht dieser Veröffentlichung im Weg.\",\"releasesTitle\":\"Entstehende Releases\",\"noReleases\":\"Es entsteht kein Release.\",\"releaseLine\":\"{{content}} · {{kind}} · {{period}}\",\"publish\":\"Veröffentlichen\",\"again\":\"Erneut prüfen\",\"refused\":\"Die Veröffentlichung wurde abgelehnt. Nichts wurde geschrieben.\",\"closed\":\"Dieses Change Set wurde inzwischen veröffentlicht oder verworfen.\",\"withheld\":\"Dieses Change Set enthält Arbeit, die du nicht sehen kannst. Nur wer alle seine Inhalte sieht, kann es veröffentlichen.\",\"failed\":\"Die Veröffentlichung ist fehlgeschlagen. Versuche es erneut.\",\"published\":\"Veröffentlicht.\",\"alreadyPublished\":\"Es ist mit diesen Ständen bereits veröffentlicht.\",\"openContent\":\"{{content}} öffnen\"},\"blockers\":{\"moved_head\":\"{{content}}: Branch {{branch}} ist seit der Prüfung von {{expected}} auf {{current}} weitergegangen.\",\"moved_head_unreviewed\":\"{{content}}: Branch {{branch}} auf {{current}} war nicht Teil der Prüfung.\",\"moved_head_gone\":\"Branch {{branch}} wurde geprüft, gehört aber nicht mehr zu diesem Change Set.\",\"unplanned_branch\":\"{{content}}: Branch {{branch}} hat kein geplantes Release; die Veröffentlichung würde ihn beenden, ohne ihn zu releasen.\",\"several_branches\":\"{{content}} ist undatierter Content auf mehr als einem Branch; er wird auf genau einem bearbeitet.\",\"behind_base\":\"{{content}}: Branch {{branch}} liegt hinter {{current}}, zuletzt übernommen wurde {{expected}}. Aus Main aktualisieren.\",\"superseded_release\":\"{{content}}: Das geplante Release {{release}} ersetzt {{overlaps}}, das bereits ersetzt ist.\",\"overlapping_periods\":\"{{content}}: Der Gültigkeitszeitraum von {{release}} überschneidet sich mit dem von {{overlaps}}. Ersetze es oder ändere die Daten.\",\"covers_release\":\"{{content}}: Der Gültigkeitszeitraum von {{release}} deckt Release {{covered}} vollständig ab. Ersetze es oder ändere die Daten.\",\"pending_merge\":\"{{content}}: Branch {{branch}} hat einen offenen Merge. Löse ihn im Branch-Editor auf oder brich ihn ab.\",\"nothing_in_force\":\"{{content}}: Die Aufhebung {{release}} findet nichts mehr in Kraft, das sie aufheben könnte.\",\"withdrawal_with_chain\":\"{{content}} wird in diesem Change Set zugleich aufgehoben ({{release}}) und bearbeitet. Entferne eines davon.\",\"dated_changed\":\"{{content}} ist datierter Content geworden, nachdem {{release}} undatiert geplant wurde. Entferne die Chain und beginne sie mit Datum neu.\",\"unpublished_dependency\":\"Es hängt von Change Set {{dependency}} ab, das noch offen ist. Veröffentliche es zuerst oder entferne die Abhängigkeit.\",\"discarded_dependency\":\"Es hängt von Change Set {{dependency}} ab, das verworfen wurde. Entferne die Abhängigkeit und aktualisiere dann aus Main.\",\"dangling_pin\":\"{{content}}: Der Wert an {{path}} verweist auf Release {{release}} von {{target}}, das es nicht geben wird.\",\"second_toc_parent\":\"{{content}} stünde im Inhaltsverzeichnis von {{parents}}; es kann nur in einem stehen.\",\"missing_asset\":\"{{content}}: Der Wert an {{path}} zeigt Asset {{asset}}, das es nicht gibt.\",\"media_unavailable\":\"MediaHub ist für diesen Workspace nicht verfügbar.\",\"missing_required_field\":\"{{content}}: Das Pflichtfeld {{path}} ist in {{revision}} leer. Fülle es im Branch-Editor aus.\",\"outstanding_check\":\"{{check}} hat kein bestandenes oder erlassenes Ergebnis auf den aktuellen Ständen.\",\"outstanding_check_on\":\"{{check}} hat kein bestandenes oder erlassenes Ergebnis für {{content}} ({{subject}}).\",\"unknown\":\"Blockiert: {{code}}.\"},\"releases\":{\"planned\":\"Geplante Releases\",\"columns\":{\"content\":\"Content\",\"kind\":\"Art\",\"period\":\"Gültigkeitszeitraum\",\"pins\":\"Verweist auf\",\"origin\":\"Herkunft\"},\"kind\":{\"revision\":\"Revision\",\"date_only\":\"Nur Datum\",\"repeal\":\"Aufhebung\",\"withdrawal\":\"Rücknahme\"},\"openEnd\":\"offen\",\"undated\":\"Undatiert\",\"period\":\"{{first}} – {{last}}\",\"branchHead\":\"Stand von Branch {{branch}}\",\"revision\":\"Revision {{revision}}\",\"plannedByHand\":\"Geplant\",\"proposed\":\"Vorgeschlagen für {{release}}\",\"splitFrom\":\"Setzt {{release}} fort\",\"withheld\":\"Zurückgehalten: ein Plan ersetzt, was es trägt\",\"proposedHint\":\"Vorschläge folgen aus den geplanten Gültigkeitszeiträumen und werden mit jedem Plan neu berechnet; sie sind nicht bearbeitbar.\",\"empty\":\"Noch keine geplanten Releases\",\"emptyHint\":\"Plane ein Release auf einem Branch im Branch-Editor, dann erscheint hier, was die Veröffentlichung erzeugt.\",\"covered\":\"Abgedeckte Releases\",\"coveredHint\":\"Veröffentlichte Releases, die ein Plan abdeckt: Die Veröffentlichung ersetzt die, die ein Plan nennt, und wird für die übrigen abgelehnt, bis ein Plan sie ersetzt oder sich die Daten ändern.\",\"coveredColumns\":{\"release\":\"Release\",\"by\":\"Abgedeckt von\",\"outcome\":\"Bei Veröffentlichung\"},\"superseded\":\"Ersetzt\",\"blocks\":\"Verhindert die Veröffentlichung\",\"noCovered\":\"Kein veröffentlichtes Release ist abgedeckt.\"},\"checks\":{\"columns\":{\"check\":\"Pflichtprüfung\",\"on\":\"Für\",\"latest\":\"Letztes Ergebnis\",\"standing\":\"Stand\",\"actions\":\"Aktionen\"},\"wholeChangeSet\":\"Das ganze Change Set\",\"onBranch\":\"{{content}} · Branch {{branch}}\",\"onRelease\":\"{{content}} · Release {{release}}\",\"none\":\"Noch kein Ergebnis\",\"latest\":\"{{outcome}} von {{who}}\",\"outcome\":{\"passed\":\"Bestanden\",\"failed\":\"Nicht bestanden\",\"waived\":\"Erlassen\"},\"cleared\":\"Erfüllt\",\"stale\":\"Veraltet: seitdem gespeichert\",\"outstanding\":\"Ausstehend\",\"record\":\"Ergebnis erfassen\",\"independent\":\"Unabhängig\",\"empty\":\"Keine Pflichtprüfung gilt\",\"emptyHint\":\"Die Pflichtprüfungen des Workspaces sperren die Veröffentlichung des Contents, den sie nennen. Keine davon gilt für dieses Change Set.\",\"loadError\":\"Die Prüfergebnisse konnten nicht geladen werden.\",\"form\":{\"title\":\"Ergebnis von {{check}} erfassen\",\"on\":\"Für {{subject}}, auf den Ständen, die du jetzt siehst.\",\"outcome\":\"Ergebnis\",\"note\":\"Notiz\",\"noteHelp\":\"Warum, bei einem Erlass; sonst optional.\",\"noteRequired\":\"Ein Erlass braucht eine Notiz mit dem Grund.\",\"noteTooLong\":\"Höchstens {{max}} Zeichen.\",\"submit\":\"Erfassen\",\"stale\":\"Seit dem Öffnen hat jemand gespeichert. Schließe den Dialog, sieh erneut hin und erfasse auf den neuen Ständen.\",\"denied\":\"Du darfst dieses Ergebnis nicht erfassen.\",\"closed\":\"Dieses Change Set ist geschlossen und nimmt keine Ergebnisse mehr an.\",\"failed\":\"Das Ergebnis konnte nicht erfasst werden. Versuche es erneut.\"}},\"update\":{\"title\":\"Aus Main aktualisieren\",\"message\":\"Übernimm, was Main und die Abhängigkeiten dieses Change Sets seitdem hinzugewonnen haben, in jede Chain. Wie jedes Speichern macht das bisherige Prüfergebnisse veraltet.\",\"confirm\":\"Aktualisieren\",\"close\":\"Schließen\",\"done\":\"Aktualisiert.\",\"merged_one\":\"{{count}} Branch hat einen Merge übernommen.\",\"merged_other\":\"{{count}} Branches haben einen Merge übernommen.\",\"nothingMerged\":\"Nichts zu übernehmen: jeder Branch ist aktuell.\",\"stopped_one\":\"Der Merge ist bei {{count}} Branch angehalten.\",\"stopped_other\":\"Der Merge ist bei {{count}} Branches angehalten.\",\"noneMerged\":\"Kein Branch hat einen Merge übernommen.\",\"pendingTitle\":\"Mit offenem Merge, im Branch-Editor aufzulösen:\",\"pendingLine\":\"{{content}} · Branch {{branch}}\",\"closed\":\"Dieses Change Set ist geschlossen.\",\"withheld\":\"Dieses Change Set enthält Arbeit, die du nicht sehen kannst. Nur wer alle seine Inhalte sieht, kann es als Ganzes aktualisieren.\",\"failed\":\"Die Aktualisierung ist fehlgeschlagen. Versuche es erneut.\"},\"discard\":{\"title\":\"Change Set verwerfen\",\"message\":\"„{{name}}“ verwerfen? Seine Branches enden, und darin angelegter Content verschwindet. Das kann nicht rückgängig gemacht werden.\",\"confirm\":\"Verwerfen\",\"closed\":\"Dieses Change Set ist bereits geschlossen.\",\"withheld\":\"Dieses Change Set enthält Arbeit, die du nicht sehen kannst. Nur wer alle seine Inhalte sieht, kann es verwerfen.\",\"failed\":\"Das Change Set konnte nicht verworfen werden. Versuche es erneut.\"}}"),
536
541
  library: {
537
542
  title: "Inhalte",
538
543
  collections: "Sammlungen",
@@ -1473,6 +1478,9 @@ var W = {
1473
1478
  merged_one: "{{count}} Branch took in a merge.",
1474
1479
  merged_other: "{{count}} Branches took in a merge.",
1475
1480
  nothingMerged: "Nothing to take in: every Branch is up to date.",
1481
+ stopped_one: "The merge stopped on {{count}} Branch.",
1482
+ stopped_other: "The merge stopped on {{count}} Branches.",
1483
+ noneMerged: "No Branch took in a merge.",
1476
1484
  pendingTitle: "Left with a Pending Merge, to resolve in the Branch editor:",
1477
1485
  pendingLine: "{{content}} · Branch {{branch}}",
1478
1486
  closed: "This Change Set is closed.",
@@ -2538,4 +2546,4 @@ Pe.displayName = "ContentLibrary";
2538
2546
  //#endregion
2539
2547
  export { xe as a, _e as c, K as d, pe as f, Ce as i, ge as l, W as m, Pe as n, Se as o, q as p, Ne as r, be as s, Me as t, he as u };
2540
2548
 
2541
- //# sourceMappingURL=content-library-v0mjVD4J.js.map
2549
+ //# sourceMappingURL=content-library-DoiD_FOJ.js.map