@knkcs/contenthub-ui 0.3.1 → 0.5.0

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/index.d.ts CHANGED
@@ -57,6 +57,19 @@ export declare interface BlockReasonsSettingsProps {
57
57
  /** The longest Blueprint accessor a check names (internal/workspaceconfig.MaxBlueprintAccessor). */
58
58
  export declare const BLUEPRINT_ACCESSOR_MAX = 200;
59
59
 
60
+ /** One Blueprint's override of the workspace's editing settings. */
61
+ export declare interface BlueprintEditingOverride {
62
+ blueprintAccessor: string;
63
+ /** null follows the workspace's. */
64
+ editingMode: EditingMode | null;
65
+ /** null follows the workspace's. */
66
+ editingBlock: boolean | null;
67
+ /** The people beside the admins; null follows the workspace's, [] is the admins alone. */
68
+ forceGroup: string[] | null;
69
+ /** What applies to the Blueprint's Content: this override over the workspace's. */
70
+ effective: EditingSettings;
71
+ }
72
+
60
73
  /** A content Blueprint, as the `BlueprintSource` port names it. */
61
74
  export declare interface BlueprintInfo {
62
75
  id: string;
@@ -155,6 +168,13 @@ export declare interface BranchEditorProps {
155
168
  /** What a Branch is for: one an editor works on, or a Carry-forward link. */
156
169
  export declare type BranchKind = "editorial" | "carry_forward";
157
170
 
171
+ /** Whether a Direct Edit's change carries forward into one later wording (#270). */
172
+ export declare interface CarryForwardAnswer {
173
+ /** The later wording: the Release a Carry-forward link carries. */
174
+ releaseId: string;
175
+ carry: boolean;
176
+ }
177
+
158
178
  /** What a Chain on Dated Content, effective on a date, would be and meet (PreviewChain). */
159
179
  export declare interface ChainPreview {
160
180
  /** The Release it would fork from; "" in a gap. */
@@ -202,6 +222,10 @@ export declare interface ChangeSet {
202
222
  * planned. Empty in a list.
203
223
  */
204
224
  plannedReleases: PlannedRelease[];
225
+ /** A Direct Edit, or one editors build; absent reads as "change_set". */
226
+ kind?: ChangeSetKind;
227
+ /** A Direct Edit's editor, an odon user id; absent or "" for any other kind. */
228
+ editorId?: string;
205
229
  }
206
230
 
207
231
  /** One Branch of a Chain, with the head a save on it names. */
@@ -243,6 +267,12 @@ export declare class ChangeSetClosedError extends Error {
243
267
  constructor(state: ChangeSetState);
244
268
  }
245
269
 
270
+ /**
271
+ * What kind of Change Set one is (ADR 0022): a Direct Edit, opened from one
272
+ * Content for one editor, or one editors build Chain by Chain.
273
+ */
274
+ export declare type ChangeSetKind = "change_set" | "direct_edit";
275
+
246
276
  /** One page of `listChangeSets`. */
247
277
  export declare interface ChangeSetList {
248
278
  changeSets: ChangeSet[];
@@ -281,6 +311,11 @@ export declare interface ChangeSetPageProps {
281
311
  onPublished?: (outcome: PublishOutcome) => void;
282
312
  /** Told after a Discard from the rail; the page stays, showing it discarded. */
283
313
  onDiscarded?: (changeSetId: string) => void;
314
+ /**
315
+ * mediahub, for a Direct Edit's media fields: a Direct Edit's page is its
316
+ * Content's fields (ADR 0022). Without it a media field offers nothing to pick.
317
+ */
318
+ mediaSource?: MediaSource_2;
284
319
  }
285
320
 
286
321
  /**
@@ -483,6 +518,8 @@ export declare interface ContentAttributes {
483
518
  block?: ContentBlock;
484
519
  /** When it was archived, ISO 8601; absent while it is not Archived. */
485
520
  archiveTime?: string;
521
+ /** Its Editing Block; absent while no open Direct Edit holds one. */
522
+ editingBlock?: EditingBlock;
486
523
  }
487
524
 
488
525
  /**
@@ -567,6 +604,10 @@ export declare interface ContenthubClient {
567
604
  assigneeId?: string;
568
605
  /** Only those with a Chain on this Content. */
569
606
  contentId?: string;
607
+ /** Only those of this kind: the index asks for "change_set", hiding Direct Edits. */
608
+ kind?: ChangeSetKind;
609
+ /** Only the Direct Edits of this odon user. */
610
+ editorId?: string;
570
611
  /** At most 200; 50 when absent. */
571
612
  pageSize?: number;
572
613
  pageToken?: string;
@@ -649,6 +690,29 @@ export declare interface ContenthubClient {
649
690
  id: string;
650
691
  reviewedHeads: Record<string, string>;
651
692
  }): Promise<PublishOutcome>;
693
+ /**
694
+ * Change validity (ADR 0022): corrects only a published Release's
695
+ * Validity Period, in one request and without a Direct Edit. It opens a
696
+ * Change Set, plans the date-only Release re-pinning the Release's
697
+ * Revision and superseding it, and publishes it with the proposals for
698
+ * the neighbouring Releases; the outcome is that Publish's. Refused as a
699
+ * whole, it leaves no Change Set behind: rejects with
700
+ * `EditingModeRefusedError` where the Content's Blueprint is "Change Sets
701
+ * only", `CoversReleaseError` (`changeSetRequired`) when the period would
702
+ * cover another Release entirely, `PublishRefusedError` with every
703
+ * blocker (an outstanding Required Check among them),
704
+ * `AccessDeniedError` for a caller who may not publish,
705
+ * `ContentBlockedError` and `InvalidInputError` for what else the service
706
+ * refuses.
707
+ */
708
+ changeValidity(input: {
709
+ releaseId: string;
710
+ validityPeriod: ValidityPeriod;
711
+ /** The Change Set's name; the service names it after the Content when absent. */
712
+ changeSetName?: string;
713
+ /** Makes a retry safe (CONTEXT.md, Idempotency Key). */
714
+ idempotencyKey?: string;
715
+ }): Promise<PublishOutcome>;
652
716
  /**
653
717
  * Merges what Main (and each dependency) gained since into every Chain
654
718
  * of the Change Set. A Branch whose merge has Conflicts, or fails its
@@ -741,6 +805,41 @@ export declare interface ContenthubClient {
741
805
  requiredCheckId: string;
742
806
  recorder: RecorderGrant;
743
807
  }): Promise<void>;
808
+ /**
809
+ * How the workspace's Content may be changed (ADR 0022): its own Editing
810
+ * Mode and Editing Block, and every per-Blueprint override with the
811
+ * values it makes effective. A workspace that never set them reads as
812
+ * "Change Sets only" without an Editing Block.
813
+ */
814
+ getEditingSettings(): Promise<WorkspaceEditingSettings>;
815
+ /**
816
+ * The editing settings in effect for the Content of the Blueprint with
817
+ * `blueprintAccessor`: its override over the workspace's, field by
818
+ * field. A host's Blueprint page reads it.
819
+ */
820
+ getEffectiveEditingSettings(blueprintAccessor: string): Promise<EffectiveEditingSettings>;
821
+ /**
822
+ * Replaces the workspace's own editing settings; admin only. It takes
823
+ * effect at once. Rejects with `AccessDeniedError` for a non-admin and
824
+ * `InvalidInputError` for what the service refuses.
825
+ */
826
+ setEditingSettings(settings: EditingSettings): Promise<EditingSettings>;
827
+ /**
828
+ * Replaces one Blueprint's override; admin only. A null field follows the
829
+ * workspace's, and at least one must be set. Rejects as
830
+ * `setEditingSettings` does.
831
+ */
832
+ setBlueprintEditingOverride(input: {
833
+ blueprintAccessor: string;
834
+ editingMode: EditingMode | null;
835
+ editingBlock: boolean | null;
836
+ /** null follows the workspace's; [] is the admins alone. */
837
+ forceGroup: string[] | null;
838
+ }): Promise<BlueprintEditingOverride>;
839
+ /** Removes one Blueprint's override, so it follows the workspace's; admin only. */
840
+ deleteBlueprintEditingOverride(input: {
841
+ blueprintAccessor: string;
842
+ }): Promise<void>;
744
843
  /** Every Collection of the workspace, by name, then id: a tree by `parentId`. */
745
844
  listCollections(): Promise<Collection[]>;
746
845
  /**
@@ -995,6 +1094,115 @@ export declare interface ContenthubClient {
995
1094
  * `ChangeSetClosedError`, and `InvalidInputError` for anything else the
996
1095
  * service refuses (a missing or needless effective date).
997
1096
  */
1097
+ /**
1098
+ * Opens a Direct Edit of a published Content for the caller (ADR 0022),
1099
+ * or answers the one the caller has open on it, with `reopened`. Answers
1100
+ * the Direct Edit and the Content as read on its Branch. Rejects with
1101
+ * `EditingModeRefusedError` where the Editing Mode is "Change Sets only",
1102
+ * `DirectEditRefusedError` where another editor's Direct Edit holds its
1103
+ * Editing Block (naming them), `ContentBlockedError`, `ContentArchivedError`,
1104
+ * and `InvalidInputError` for anything else the service refuses (a day
1105
+ * for undated Content among it).
1106
+ */
1107
+ openDirectEdit(input: {
1108
+ contentId: string;
1109
+ /**
1110
+ * Dated Content only (#270): the day the change takes effect, as
1111
+ * YYYY-MM-DD; absent is today. Its Branch forks from the Release In
1112
+ * Force that day: on today it corrects that Release, on a later day
1113
+ * it is a new wording.
1114
+ */
1115
+ effectiveOn?: string;
1116
+ /** Makes a retry safe (CONTEXT.md, Idempotency Key). */
1117
+ idempotencyKey?: string;
1118
+ }): Promise<{
1119
+ changeSet: ChangeSet;
1120
+ content: Content;
1121
+ reopened: boolean;
1122
+ }>;
1123
+ /**
1124
+ * What a Direct Edit's Publish of Dated Content would plan (#270): its
1125
+ * Release's Validity Period with `validityLastDay` as Publish takes it,
1126
+ * the Release it corrects, the date-only Releases contenthub derives and
1127
+ * the later wordings Publish asks about. Writes nothing. Rejects with
1128
+ * `CoversReleaseError` (`changeSetRequired`) when the period would cover
1129
+ * a Release entirely.
1130
+ */
1131
+ previewDirectEditPublish(input: {
1132
+ id: string;
1133
+ validityLastDay?: string;
1134
+ }): Promise<DirectEditPublishPreview>;
1135
+ /**
1136
+ * Publishes a Direct Edit at `expectedHeadId`, the head of its Branch the
1137
+ * editor saw: one Release, In Force from its Publish, carrying
1138
+ * `releaseSpec`. Rejects as `publish` does, with `ContentRefusedError`
1139
+ * for Release Spec values the Blueprint Release refuses (a required one
1140
+ * missing among them), and with `DirectEditRefusedError` for a Change
1141
+ * Set that is not a Direct Edit. On Dated Content (#270) it takes the
1142
+ * Validity Period's last day and one carry-forward answer per later
1143
+ * wording, and rejects with `CoversReleaseError` (`changeSetRequired`)
1144
+ * when the period would cover a Release entirely.
1145
+ */
1146
+ publishDirectEdit(input: {
1147
+ id: string;
1148
+ expectedHeadId: string;
1149
+ /** The Release's Release Spec values; absent is none. */
1150
+ releaseSpec?: Record<string, unknown>;
1151
+ /** Dated Content: the period's last day, "" for an open end; absent keeps the default. */
1152
+ validityLastDay?: string;
1153
+ /** Dated Content: whether the change carries into each later wording. */
1154
+ carryForward?: CarryForwardAnswer[];
1155
+ idempotencyKey?: string;
1156
+ }): Promise<PublishOutcome>;
1157
+ /**
1158
+ * Saves on a Direct Edit's Branch on top of `expectedHeadId`, as
1159
+ * `saveRevision` does, and publishes the Revision saved, as
1160
+ * `publishDirectEdit` does, in one request (ADR 0022). Refused as a
1161
+ * whole, with nothing saved: rejects as either does (`StaleHeadError`,
1162
+ * `ContentRefusedError` for the data or the Release Spec values,
1163
+ * `PublishRefusedError` with every blocker).
1164
+ */
1165
+ saveAndPublishDirectEdit(input: {
1166
+ id: string;
1167
+ expectedHeadId: string;
1168
+ data: Record<string, unknown>;
1169
+ /** Top-level field accessors; absent saves `data` as the whole Revision. */
1170
+ fieldMask?: string[];
1171
+ releaseSpec?: Record<string, unknown>;
1172
+ /** As `publishDirectEdit`'s. */
1173
+ validityLastDay?: string;
1174
+ carryForward?: CarryForwardAnswer[];
1175
+ idempotencyKey?: string;
1176
+ }): Promise<{
1177
+ content: Content;
1178
+ outcome: PublishOutcome;
1179
+ }>;
1180
+ /**
1181
+ * Discards a Direct Edit: its work is dropped, Main and the Releases stay.
1182
+ * Rejects as `discardChangeSet` does, and with `DirectEditRefusedError`
1183
+ * for a Change Set that is not a Direct Edit.
1184
+ */
1185
+ discardDirectEdit(input: {
1186
+ id: string;
1187
+ idempotencyKey?: string;
1188
+ }): Promise<ChangeSet>;
1189
+ /**
1190
+ * Forces an Editing Block (ADR 0022): hands the Direct Edit `id` holding
1191
+ * it, with its work and its Editing Block, to the caller. Answers it with
1192
+ * the caller as its editor, the Content as read on its Branch, and who
1193
+ * edited it until now. Rejects with `AccessDeniedError` outside the
1194
+ * Force Group, `DirectEditRefusedError` where the caller has a Direct
1195
+ * Edit of the Content of their own or it holds no Editing Block any more,
1196
+ * and as `discardDirectEdit` does otherwise.
1197
+ */
1198
+ forceDirectEdit(input: {
1199
+ id: string;
1200
+ idempotencyKey?: string;
1201
+ }): Promise<{
1202
+ changeSet: ChangeSet;
1203
+ content: Content;
1204
+ previousEditorId: string;
1205
+ }>;
998
1206
  startEditing(input: {
999
1207
  contentId: string;
1000
1208
  changeSetId?: string;
@@ -1119,9 +1327,11 @@ export declare const contenthubKeys: {
1119
1327
  changeSetList: (filter: {
1120
1328
  state?: string;
1121
1329
  assigneeId?: string;
1330
+ kind?: string;
1122
1331
  }) => readonly ["contenthub", "change-sets", "list", {
1123
1332
  state?: string;
1124
1333
  assigneeId?: string;
1334
+ kind?: string;
1125
1335
  }];
1126
1336
  openChangeSets: () => readonly ["contenthub", "change-sets", "list", "open-picker"];
1127
1337
  changeSet: (id: string) => readonly ["contenthub", "change-sets", "detail", string];
@@ -1131,6 +1341,8 @@ export declare const contenthubKeys: {
1131
1341
  changeSetStatuses: () => readonly ["contenthub", "change-set-statuses"];
1132
1342
  requiredChecks: () => readonly ["contenthub", "required-checks"];
1133
1343
  requiredCheckRecorders: (id: string) => readonly ["contenthub", "required-checks", "recorders", string];
1344
+ editingSettings: () => readonly ["contenthub", "editing-settings"];
1345
+ effectiveEditingSettings: (blueprintAccessor: string) => readonly ["contenthub", "editing-settings", "effective", string];
1134
1346
  collections: () => readonly ["contenthub", "collections"];
1135
1347
  collectionGrants: (id: string) => readonly ["contenthub", "collections", "grants", string];
1136
1348
  contents: () => readonly ["contenthub", "contents"];
@@ -1188,11 +1400,12 @@ export declare interface ContenthubPathsProviderProps {
1188
1400
 
1189
1401
  /**
1190
1402
  * contenthub's workspace configuration in one settings page (spec #56, story
1191
- * 107): Required Checks, Block Reasons and the Collection tree with its
1192
- * restriction and grants, each a tab chosen by `?tab=` so a host links
1403
+ * 107): Required Checks, Block Reasons, the editing settings (ADR 0022) and
1404
+ * the Collection tree with its restriction and grants, each a tab chosen by `?tab=` so a host links
1193
1405
  * straight to one.
1194
1406
  *
1195
- * Every tab is a flush DataTable whose rows are changed through Modals, so
1407
+ * Every tab is a flush DataTable whose rows are changed through Modals (the
1408
+ * editing tab heads its table with the workspace's own settings, padded), so
1196
1409
  * the body is unpadded (`bodyPadding="none"`, anker's rule for table tabs)
1197
1410
  * and there is no header Save: nothing here is a draft. Only the active tab
1198
1411
  * is mounted (nav-link tabs), so no two tabs' Modals or queries live at once.
@@ -1214,7 +1427,7 @@ export declare interface ContenthubSettingsProps {
1214
1427
  }
1215
1428
 
1216
1429
  /** The settings page's tabs, as `?tab=` names them. */
1217
- export declare type ContenthubSettingsTab = "required-checks" | "block-reasons" | "collections";
1430
+ export declare type ContenthubSettingsTab = "required-checks" | "block-reasons" | "editing" | "collections";
1218
1431
 
1219
1432
  /**
1220
1433
  * The package's translations as the one `{ namespace, resources }` export a
@@ -1235,6 +1448,7 @@ export declare const contenthubTranslations: {
1235
1448
  tabs: {
1236
1449
  requiredChecks: string;
1237
1450
  blockReasons: string;
1451
+ editing: string;
1238
1452
  collections: string;
1239
1453
  };
1240
1454
  };
@@ -1273,6 +1487,73 @@ export declare const contenthubTranslations: {
1273
1487
  failed: string;
1274
1488
  };
1275
1489
  };
1490
+ editing: {
1491
+ mode: {
1492
+ direct_edits: string;
1493
+ change_sets: string;
1494
+ both: string;
1495
+ };
1496
+ block: {
1497
+ on: string;
1498
+ off: string;
1499
+ };
1500
+ workspace: {
1501
+ title: string;
1502
+ description: string;
1503
+ edit: string;
1504
+ };
1505
+ columns: {
1506
+ blueprint: string;
1507
+ mode: string;
1508
+ block: string;
1509
+ actions: string;
1510
+ force: string;
1511
+ };
1512
+ fromWorkspace: string;
1513
+ createOverride: string;
1514
+ editOverride: string;
1515
+ removeOverride: string;
1516
+ count_one: string;
1517
+ count_other: string;
1518
+ empty: string;
1519
+ emptyHint: string;
1520
+ loadError: string;
1521
+ form: {
1522
+ workspaceTitle: string;
1523
+ createOverrideTitle: string;
1524
+ editOverrideTitle: string;
1525
+ accessor: string;
1526
+ accessorHelp: string;
1527
+ accessorRequired: string;
1528
+ accessorTooLong: string;
1529
+ accessorTaken: string;
1530
+ mode: string;
1531
+ modeHelp: string;
1532
+ modeRequired: string;
1533
+ block: string;
1534
+ blockHelp: string;
1535
+ follow: string;
1536
+ overridesNothing: string;
1537
+ save: string;
1538
+ denied: string;
1539
+ failed: string;
1540
+ force: string;
1541
+ forceHelp: string;
1542
+ forcePeople: string;
1543
+ forceNobody: string;
1544
+ forceOwn: string;
1545
+ };
1546
+ removeDialog: {
1547
+ title: string;
1548
+ message: string;
1549
+ confirm: string;
1550
+ failed: string;
1551
+ };
1552
+ force: {
1553
+ adminsOnly: string;
1554
+ adminsAnd: string;
1555
+ };
1556
+ };
1276
1557
  requiredChecks: {
1277
1558
  create: string;
1278
1559
  columns: {
@@ -1472,6 +1753,8 @@ export declare const contenthubTranslations: {
1472
1753
  assignee: string;
1473
1754
  anyone: string;
1474
1755
  me: string;
1756
+ kind: string;
1757
+ anyKind: string;
1475
1758
  };
1476
1759
  count_one: string;
1477
1760
  count_other: string;
@@ -1495,6 +1778,10 @@ export declare const contenthubTranslations: {
1495
1778
  createSubmit: string;
1496
1779
  };
1497
1780
  more: string;
1781
+ kind: {
1782
+ change_set: string;
1783
+ direct_edit: string;
1784
+ };
1498
1785
  };
1499
1786
  branch: {
1500
1787
  loading: string;
@@ -1992,6 +2279,7 @@ export declare const contenthubTranslations: {
1992
2279
  unblock: string;
1993
2280
  archive: string;
1994
2281
  unarchive: string;
2282
+ edit: string;
1995
2283
  };
1996
2284
  data: {
1997
2285
  readOnMain: string;
@@ -2012,6 +2300,7 @@ export declare const contenthubTranslations: {
2012
2300
  inForce: string;
2013
2301
  changeSet: string;
2014
2302
  proposed: string;
2303
+ actions: string;
2015
2304
  };
2016
2305
  kind: {
2017
2306
  revision: string;
@@ -2031,6 +2320,7 @@ export declare const contenthubTranslations: {
2031
2320
  proposed: string;
2032
2321
  planned: string;
2033
2322
  loadError: string;
2323
+ changeValidity: string;
2034
2324
  };
2035
2325
  revisions: {
2036
2326
  columns: {
@@ -2115,6 +2405,7 @@ export declare const contenthubTranslations: {
2115
2405
  empty: string;
2116
2406
  emptyHint: string;
2117
2407
  loadError: string;
2408
+ directEditBy: string;
2118
2409
  };
2119
2410
  filing: {
2120
2411
  title: string;
@@ -2183,6 +2474,120 @@ export declare const contenthubTranslations: {
2183
2474
  message: string;
2184
2475
  confirm: string;
2185
2476
  };
2477
+ editingBlock: {
2478
+ beingEdited: string;
2479
+ force: string;
2480
+ forceConfirm: {
2481
+ title: string;
2482
+ message: string;
2483
+ confirm: string;
2484
+ failed: string;
2485
+ denied: string;
2486
+ };
2487
+ forced: string;
2488
+ };
2489
+ directEdit: {
2490
+ unpublished: string;
2491
+ continue: string;
2492
+ };
2493
+ changeValidity: {
2494
+ title: string;
2495
+ hint: string;
2496
+ release: string;
2497
+ firstDay: string;
2498
+ firstDayHelp: string;
2499
+ firstDayRequired: string;
2500
+ lastDay: string;
2501
+ lastDayHelp: string;
2502
+ lastDayBefore: string;
2503
+ submit: string;
2504
+ done: string;
2505
+ published_one: string;
2506
+ published_other: string;
2507
+ editingMode: string;
2508
+ covers: string;
2509
+ publishRefused: string;
2510
+ denied: string;
2511
+ };
2512
+ };
2513
+ directEdit: {
2514
+ badge: string;
2515
+ loading: string;
2516
+ notFound: string;
2517
+ loadError: string;
2518
+ publish: string;
2519
+ discard: string;
2520
+ closed: {
2521
+ open: string;
2522
+ published: string;
2523
+ discarded: string;
2524
+ };
2525
+ discardConfirm: {
2526
+ title: string;
2527
+ message: string;
2528
+ failed: string;
2529
+ };
2530
+ refused_one: string;
2531
+ refused_other: string;
2532
+ refusedBecause: {
2533
+ one_branch: string;
2534
+ not_a_direct_edit: string;
2535
+ editing_blocked: string;
2536
+ not_the_editor: string;
2537
+ own_direct_edit: string;
2538
+ no_editing_block: string;
2539
+ unknown: string;
2540
+ };
2541
+ updateFromMain: string;
2542
+ resolveMerge: string;
2543
+ behind: {
2544
+ title: string;
2545
+ message: string;
2546
+ };
2547
+ pendingMerge: {
2548
+ title: string;
2549
+ message: string;
2550
+ };
2551
+ saveFirst: string;
2552
+ changeSetsOnly: string;
2553
+ saveAndPublish: string;
2554
+ publishDialog: {
2555
+ title: string;
2556
+ publishHint: string;
2557
+ saveAndPublishHint: string;
2558
+ specHint: string;
2559
+ refusedValues_one: string;
2560
+ refusedValues_other: string;
2561
+ datedPublishHint: string;
2562
+ datedSaveAndPublishHint: string;
2563
+ period: string;
2564
+ correction: string;
2565
+ newWording: string;
2566
+ firstDay: string;
2567
+ lastDay: string;
2568
+ lastDayHelp: string;
2569
+ computed: string;
2570
+ computedHint: string;
2571
+ computedRow: string;
2572
+ noComputed: string;
2573
+ carryForward: string;
2574
+ carryForwardHint: string;
2575
+ wording: string;
2576
+ wordingUntil: string;
2577
+ carryYes: string;
2578
+ carryNo: string;
2579
+ unanswered: string;
2580
+ previewFailed: string;
2581
+ covers: string;
2582
+ };
2583
+ effective: {
2584
+ title: string;
2585
+ hint: string;
2586
+ label: string;
2587
+ help: string;
2588
+ required: string;
2589
+ submit: string;
2590
+ };
2186
2591
  };
2187
2592
  };
2188
2593
  };
@@ -2198,6 +2603,7 @@ export declare const contenthubTranslations: {
2198
2603
  tabs: {
2199
2604
  requiredChecks: string;
2200
2605
  blockReasons: string;
2606
+ editing: string;
2201
2607
  collections: string;
2202
2608
  };
2203
2609
  };
@@ -2236,6 +2642,73 @@ export declare const contenthubTranslations: {
2236
2642
  failed: string;
2237
2643
  };
2238
2644
  };
2645
+ editing: {
2646
+ mode: {
2647
+ direct_edits: string;
2648
+ change_sets: string;
2649
+ both: string;
2650
+ };
2651
+ block: {
2652
+ on: string;
2653
+ off: string;
2654
+ };
2655
+ workspace: {
2656
+ title: string;
2657
+ description: string;
2658
+ edit: string;
2659
+ };
2660
+ columns: {
2661
+ blueprint: string;
2662
+ mode: string;
2663
+ block: string;
2664
+ actions: string;
2665
+ force: string;
2666
+ };
2667
+ fromWorkspace: string;
2668
+ createOverride: string;
2669
+ editOverride: string;
2670
+ removeOverride: string;
2671
+ count_one: string;
2672
+ count_other: string;
2673
+ empty: string;
2674
+ emptyHint: string;
2675
+ loadError: string;
2676
+ form: {
2677
+ workspaceTitle: string;
2678
+ createOverrideTitle: string;
2679
+ editOverrideTitle: string;
2680
+ accessor: string;
2681
+ accessorHelp: string;
2682
+ accessorRequired: string;
2683
+ accessorTooLong: string;
2684
+ accessorTaken: string;
2685
+ mode: string;
2686
+ modeHelp: string;
2687
+ modeRequired: string;
2688
+ block: string;
2689
+ blockHelp: string;
2690
+ follow: string;
2691
+ overridesNothing: string;
2692
+ save: string;
2693
+ denied: string;
2694
+ failed: string;
2695
+ force: string;
2696
+ forceHelp: string;
2697
+ forcePeople: string;
2698
+ forceNobody: string;
2699
+ forceOwn: string;
2700
+ };
2701
+ removeDialog: {
2702
+ title: string;
2703
+ message: string;
2704
+ confirm: string;
2705
+ failed: string;
2706
+ };
2707
+ force: {
2708
+ adminsOnly: string;
2709
+ adminsAnd: string;
2710
+ };
2711
+ };
2239
2712
  requiredChecks: {
2240
2713
  create: string;
2241
2714
  columns: {
@@ -2435,6 +2908,8 @@ export declare const contenthubTranslations: {
2435
2908
  assignee: string;
2436
2909
  anyone: string;
2437
2910
  me: string;
2911
+ kind: string;
2912
+ anyKind: string;
2438
2913
  };
2439
2914
  count_one: string;
2440
2915
  count_other: string;
@@ -2458,6 +2933,10 @@ export declare const contenthubTranslations: {
2458
2933
  createSubmit: string;
2459
2934
  };
2460
2935
  more: string;
2936
+ kind: {
2937
+ change_set: string;
2938
+ direct_edit: string;
2939
+ };
2461
2940
  };
2462
2941
  branch: {
2463
2942
  loading: string;
@@ -2955,6 +3434,7 @@ export declare const contenthubTranslations: {
2955
3434
  unblock: string;
2956
3435
  archive: string;
2957
3436
  unarchive: string;
3437
+ edit: string;
2958
3438
  };
2959
3439
  data: {
2960
3440
  readOnMain: string;
@@ -2975,6 +3455,7 @@ export declare const contenthubTranslations: {
2975
3455
  inForce: string;
2976
3456
  changeSet: string;
2977
3457
  proposed: string;
3458
+ actions: string;
2978
3459
  };
2979
3460
  kind: {
2980
3461
  revision: string;
@@ -2994,6 +3475,7 @@ export declare const contenthubTranslations: {
2994
3475
  proposed: string;
2995
3476
  planned: string;
2996
3477
  loadError: string;
3478
+ changeValidity: string;
2997
3479
  };
2998
3480
  revisions: {
2999
3481
  columns: {
@@ -3078,6 +3560,7 @@ export declare const contenthubTranslations: {
3078
3560
  empty: string;
3079
3561
  emptyHint: string;
3080
3562
  loadError: string;
3563
+ directEditBy: string;
3081
3564
  };
3082
3565
  filing: {
3083
3566
  title: string;
@@ -3146,6 +3629,120 @@ export declare const contenthubTranslations: {
3146
3629
  message: string;
3147
3630
  confirm: string;
3148
3631
  };
3632
+ editingBlock: {
3633
+ beingEdited: string;
3634
+ force: string;
3635
+ forceConfirm: {
3636
+ title: string;
3637
+ message: string;
3638
+ confirm: string;
3639
+ failed: string;
3640
+ denied: string;
3641
+ };
3642
+ forced: string;
3643
+ };
3644
+ directEdit: {
3645
+ unpublished: string;
3646
+ continue: string;
3647
+ };
3648
+ changeValidity: {
3649
+ title: string;
3650
+ hint: string;
3651
+ release: string;
3652
+ firstDay: string;
3653
+ firstDayHelp: string;
3654
+ firstDayRequired: string;
3655
+ lastDay: string;
3656
+ lastDayHelp: string;
3657
+ lastDayBefore: string;
3658
+ submit: string;
3659
+ done: string;
3660
+ published_one: string;
3661
+ published_other: string;
3662
+ editingMode: string;
3663
+ covers: string;
3664
+ publishRefused: string;
3665
+ denied: string;
3666
+ };
3667
+ };
3668
+ directEdit: {
3669
+ badge: string;
3670
+ loading: string;
3671
+ notFound: string;
3672
+ loadError: string;
3673
+ publish: string;
3674
+ discard: string;
3675
+ closed: {
3676
+ open: string;
3677
+ published: string;
3678
+ discarded: string;
3679
+ };
3680
+ discardConfirm: {
3681
+ title: string;
3682
+ message: string;
3683
+ failed: string;
3684
+ };
3685
+ refused_one: string;
3686
+ refused_other: string;
3687
+ refusedBecause: {
3688
+ one_branch: string;
3689
+ not_a_direct_edit: string;
3690
+ editing_blocked: string;
3691
+ not_the_editor: string;
3692
+ own_direct_edit: string;
3693
+ no_editing_block: string;
3694
+ unknown: string;
3695
+ };
3696
+ updateFromMain: string;
3697
+ resolveMerge: string;
3698
+ behind: {
3699
+ title: string;
3700
+ message: string;
3701
+ };
3702
+ pendingMerge: {
3703
+ title: string;
3704
+ message: string;
3705
+ };
3706
+ saveFirst: string;
3707
+ changeSetsOnly: string;
3708
+ saveAndPublish: string;
3709
+ publishDialog: {
3710
+ title: string;
3711
+ publishHint: string;
3712
+ saveAndPublishHint: string;
3713
+ specHint: string;
3714
+ refusedValues_one: string;
3715
+ refusedValues_other: string;
3716
+ datedPublishHint: string;
3717
+ datedSaveAndPublishHint: string;
3718
+ period: string;
3719
+ correction: string;
3720
+ newWording: string;
3721
+ firstDay: string;
3722
+ lastDay: string;
3723
+ lastDayHelp: string;
3724
+ computed: string;
3725
+ computedHint: string;
3726
+ computedRow: string;
3727
+ noComputed: string;
3728
+ carryForward: string;
3729
+ carryForwardHint: string;
3730
+ wording: string;
3731
+ wordingUntil: string;
3732
+ carryYes: string;
3733
+ carryNo: string;
3734
+ unanswered: string;
3735
+ previewFailed: string;
3736
+ covers: string;
3737
+ };
3738
+ effective: {
3739
+ title: string;
3740
+ hint: string;
3741
+ label: string;
3742
+ help: string;
3743
+ required: string;
3744
+ submit: string;
3745
+ };
3149
3746
  };
3150
3747
  };
3151
3748
  };
@@ -3228,7 +3825,11 @@ export declare interface ContentPageProps {
3228
3825
  onOpenBranch: (target: OpenBranchTarget) => void;
3229
3826
  /** Host navigation to another Content's page, from the References tab. */
3230
3827
  onOpenContent?: (target: OpenContentTarget) => void;
3231
- /** Host navigation to a Change Set's page, from the Change Sets tab. */
3828
+ /**
3829
+ * Host navigation to a Change Set's page, from the Change Sets tab, and
3830
+ * to a Direct Edit's, which `ChangeSetPage` shows: Edit is offered only
3831
+ * with it.
3832
+ */
3232
3833
  onOpenChangeSet?: (changeSetId: string) => void;
3233
3834
  }
3234
3835
 
@@ -3276,11 +3877,14 @@ export declare type CopyFrom = {
3276
3877
  /**
3277
3878
  * A plan's Validity Period would cover these Releases of its Content
3278
3879
  * entirely: nothing was planned. Supersede them, or change the dates.
3880
+ * `changeSetRequired` is set when the request could not Supersede them, as
3881
+ * Change validity can't: that decision is made in a Change Set.
3279
3882
  */
3280
3883
  export declare class CoversReleaseError extends Error {
3281
3884
  readonly contentId: string;
3282
3885
  readonly coveredReleaseIds: string[];
3283
- constructor(contentId: string, coveredReleaseIds: string[]);
3886
+ readonly changeSetRequired: boolean;
3887
+ constructor(contentId: string, coveredReleaseIds: string[], changeSetRequired?: boolean);
3284
3888
  }
3285
3889
 
3286
3890
  /** The production `ContenthubClient`, over Connect. */
@@ -3299,6 +3903,79 @@ export declare interface CreateConnectContenthubClientOptions {
3299
3903
  transport?: Transport;
3300
3904
  }
3301
3905
 
3906
+ /**
3907
+ * A Direct Edit's screen (ADR 0022, #264): the Content's fields, Save,
3908
+ * Publish and Discard, and nothing of the Change Set it is: no Chain,
3909
+ * Branch or Release tab, no rail. Saves go on its one Branch, as any save
3910
+ * does; Publish cuts its one Release. `ChangeSetPage` shows it for a Change
3911
+ * Set that is a Direct Edit, so a host needs no route of its own for it.
3912
+ */
3913
+ export declare function DirectEditPage({ client, changeSetId, mediaSource, onPublished, onDiscarded, }: DirectEditPageProps): JSX.Element;
3914
+
3915
+ export declare namespace DirectEditPage {
3916
+ var displayName: string;
3917
+ }
3918
+
3919
+ export declare interface DirectEditPageProps {
3920
+ client: ContenthubClient;
3921
+ /** The Direct Edit: a Change Set of kind "direct_edit". */
3922
+ changeSetId: string;
3923
+ /** mediahub, for media fields and images in rich text (ADR 0020). */
3924
+ mediaSource?: MediaSource_2;
3925
+ /** Told after Publish; the screen stays, showing it published. */
3926
+ onPublished?: (outcome: PublishOutcome) => void;
3927
+ /** Told after Discard; the screen stays, showing it discarded. */
3928
+ onDiscarded?: (changeSetId: string) => void;
3929
+ }
3930
+
3931
+ /**
3932
+ * What a Direct Edit's Publish of Dated Content would plan (#270), for its
3933
+ * Publish dialog: nothing of it is written.
3934
+ */
3935
+ export declare interface DirectEditPublishPreview {
3936
+ /** Its Release's Validity Period; an empty last day is an open end. */
3937
+ validityPeriod?: ValidityPeriod;
3938
+ /** The Release it corrects and Supersedes; "" for a new wording. */
3939
+ correctsReleaseId: string;
3940
+ /** The date-only Releases contenthub derives, read-only. */
3941
+ dateOnlyReleases: PlannedRelease[];
3942
+ /** The later wordings Publish asks about, by first day. */
3943
+ laterWordings: LaterWording[];
3944
+ }
3945
+
3946
+ /** Why contenthub refused a Direct Edit (`DirectEditRefusedError.reason`). */
3947
+ export declare type DirectEditRefusal =
3948
+ /** A Direct Edit takes no second Chain, Branch, dependency or Source. */
3949
+ "one_branch"
3950
+ /** The Change Set named is not a Direct Edit. */
3951
+ | "not_a_direct_edit"
3952
+ /** Another editor's Direct Edit holds the Content's Editing Block. */
3953
+ | "editing_blocked"
3954
+ /** The Direct Edit is someone else's: `editorId` names them. */
3955
+ | "not_the_editor"
3956
+ /** Force by a caller who has a Direct Edit of the Content of their own. */
3957
+ | "own_direct_edit"
3958
+ /** Force of a Direct Edit that holds no Editing Block any more. */
3959
+ | "no_editing_block"
3960
+ /** A reason this build doesn't know. */
3961
+ | "unknown";
3962
+
3963
+ /**
3964
+ * A Direct Edit was refused, or a write a Direct Edit can't take. Read from
3965
+ * the refusal's typed DirectEditRefused detail, not its text.
3966
+ */
3967
+ export declare class DirectEditRefusedError extends Error {
3968
+ readonly reason: DirectEditRefusal;
3969
+ /** The Content it is about; "" where the refusal names none. */
3970
+ readonly contentId: string;
3971
+ /**
3972
+ * For `editing_blocked`: the editor holding the Editing Block; for
3973
+ * `not_the_editor`: the Direct Edit's editor; "" otherwise.
3974
+ */
3975
+ readonly editorId: string;
3976
+ constructor(reason: DirectEditRefusal, message: string, contentId?: string, editorId?: string);
3977
+ }
3978
+
3302
3979
  /** One edge of one Revision. */
3303
3980
  export declare interface Edge {
3304
3981
  sourceContentId: string;
@@ -3317,6 +3994,68 @@ export declare interface Edge {
3317
3994
  /** What kind of edge of the Content Graph (ADR 0009). */
3318
3995
  export declare type EdgeKind = "reference" | "toc" | "include" | "exclude" | "replace" | "annotate" | "link" | "footnote" | "anchor" | "media" | "blueprint" | "unspecified";
3319
3996
 
3997
+ /**
3998
+ * The Block a Direct Edit sets on its Content (CONTEXT.md, Editing Block):
3999
+ * "being edited by" its editor. It keeps out only other editors' Direct
4000
+ * Edits, ends with its Direct Edit's Publish or Discard, and can't be
4001
+ * lifted. It is independent of `block`: a Content can hold both.
4002
+ */
4003
+ export declare interface EditingBlock {
4004
+ /** The Direct Edit's editor, an odon user id. */
4005
+ editorId: string;
4006
+ /** The Direct Edit holding it. */
4007
+ changeSetId: string;
4008
+ /** ISO 8601. */
4009
+ blockTime: string;
4010
+ }
4011
+
4012
+ /**
4013
+ * Which ways of changing a Blueprint's Content the workspace offers (ADR
4014
+ * 0022, CONTEXT.md Editing Mode): Direct Edits only, Change Sets only, or
4015
+ * both. Only "change_sets" is a rule: contenthub refuses a Direct Edit on
4016
+ * such Content.
4017
+ */
4018
+ export declare type EditingMode = "direct_edits" | "change_sets" | "both";
4019
+
4020
+ /**
4021
+ * The effective Editing Mode of the Content's Blueprint is "Change Sets
4022
+ * only" (ADR 0022): the change is made in a Change Set. Nothing was written.
4023
+ */
4024
+ export declare class EditingModeRefusedError extends Error {
4025
+ readonly contentId: string;
4026
+ readonly blueprintAccessor: string;
4027
+ /** The effective Editing Mode that refused it. */
4028
+ readonly editingMode: EditingMode;
4029
+ constructor(contentId: string, blueprintAccessor: string, editingMode?: EditingMode);
4030
+ }
4031
+
4032
+ /** The workspace's editing settings, or the ones in effect for a Blueprint. */
4033
+ export declare interface EditingSettings {
4034
+ editingMode: EditingMode;
4035
+ /** Whether opening a Direct Edit sets an Editing Block on its Content. */
4036
+ editingBlock: boolean;
4037
+ /**
4038
+ * The Force Group: who may force an Editing Block (ADR 0022). The
4039
+ * workspace's admins always may; these are the people beside them, by
4040
+ * odon user id, sorted. Empty is the admins alone.
4041
+ */
4042
+ forceGroup: string[];
4043
+ }
4044
+
4045
+ /** The editing settings in effect for one Blueprint, and which its override decides. */
4046
+ export declare interface EffectiveEditingSettings {
4047
+ effective: EditingSettings;
4048
+ editingModeOverridden: boolean;
4049
+ editingBlockOverridden: boolean;
4050
+ forceGroupOverridden: boolean;
4051
+ /**
4052
+ * Whether the caller is in the effective Force Group: an admin, or named
4053
+ * by it. It is how a screen knows to offer Force (#269); the service
4054
+ * asks the same when it is used.
4055
+ */
4056
+ callerInForceGroup: boolean;
4057
+ }
4058
+
3320
4059
  /** One field that differs between two Revisions. */
3321
4060
  export declare interface FieldChange {
3322
4061
  /** "/" and the field's accessor. */
@@ -3370,6 +4109,7 @@ export declare const i18nResources: {
3370
4109
  tabs: {
3371
4110
  requiredChecks: string;
3372
4111
  blockReasons: string;
4112
+ editing: string;
3373
4113
  collections: string;
3374
4114
  };
3375
4115
  };
@@ -3408,6 +4148,73 @@ export declare const i18nResources: {
3408
4148
  failed: string;
3409
4149
  };
3410
4150
  };
4151
+ editing: {
4152
+ mode: {
4153
+ direct_edits: string;
4154
+ change_sets: string;
4155
+ both: string;
4156
+ };
4157
+ block: {
4158
+ on: string;
4159
+ off: string;
4160
+ };
4161
+ workspace: {
4162
+ title: string;
4163
+ description: string;
4164
+ edit: string;
4165
+ };
4166
+ columns: {
4167
+ blueprint: string;
4168
+ mode: string;
4169
+ block: string;
4170
+ actions: string;
4171
+ force: string;
4172
+ };
4173
+ fromWorkspace: string;
4174
+ createOverride: string;
4175
+ editOverride: string;
4176
+ removeOverride: string;
4177
+ count_one: string;
4178
+ count_other: string;
4179
+ empty: string;
4180
+ emptyHint: string;
4181
+ loadError: string;
4182
+ form: {
4183
+ workspaceTitle: string;
4184
+ createOverrideTitle: string;
4185
+ editOverrideTitle: string;
4186
+ accessor: string;
4187
+ accessorHelp: string;
4188
+ accessorRequired: string;
4189
+ accessorTooLong: string;
4190
+ accessorTaken: string;
4191
+ mode: string;
4192
+ modeHelp: string;
4193
+ modeRequired: string;
4194
+ block: string;
4195
+ blockHelp: string;
4196
+ follow: string;
4197
+ overridesNothing: string;
4198
+ save: string;
4199
+ denied: string;
4200
+ failed: string;
4201
+ force: string;
4202
+ forceHelp: string;
4203
+ forcePeople: string;
4204
+ forceNobody: string;
4205
+ forceOwn: string;
4206
+ };
4207
+ removeDialog: {
4208
+ title: string;
4209
+ message: string;
4210
+ confirm: string;
4211
+ failed: string;
4212
+ };
4213
+ force: {
4214
+ adminsOnly: string;
4215
+ adminsAnd: string;
4216
+ };
4217
+ };
3411
4218
  requiredChecks: {
3412
4219
  create: string;
3413
4220
  columns: {
@@ -3607,6 +4414,8 @@ export declare const i18nResources: {
3607
4414
  assignee: string;
3608
4415
  anyone: string;
3609
4416
  me: string;
4417
+ kind: string;
4418
+ anyKind: string;
3610
4419
  };
3611
4420
  count_one: string;
3612
4421
  count_other: string;
@@ -3630,6 +4439,10 @@ export declare const i18nResources: {
3630
4439
  createSubmit: string;
3631
4440
  };
3632
4441
  more: string;
4442
+ kind: {
4443
+ change_set: string;
4444
+ direct_edit: string;
4445
+ };
3633
4446
  };
3634
4447
  branch: {
3635
4448
  loading: string;
@@ -4127,6 +4940,7 @@ export declare const i18nResources: {
4127
4940
  unblock: string;
4128
4941
  archive: string;
4129
4942
  unarchive: string;
4943
+ edit: string;
4130
4944
  };
4131
4945
  data: {
4132
4946
  readOnMain: string;
@@ -4147,6 +4961,7 @@ export declare const i18nResources: {
4147
4961
  inForce: string;
4148
4962
  changeSet: string;
4149
4963
  proposed: string;
4964
+ actions: string;
4150
4965
  };
4151
4966
  kind: {
4152
4967
  revision: string;
@@ -4166,6 +4981,7 @@ export declare const i18nResources: {
4166
4981
  proposed: string;
4167
4982
  planned: string;
4168
4983
  loadError: string;
4984
+ changeValidity: string;
4169
4985
  };
4170
4986
  revisions: {
4171
4987
  columns: {
@@ -4250,6 +5066,7 @@ export declare const i18nResources: {
4250
5066
  empty: string;
4251
5067
  emptyHint: string;
4252
5068
  loadError: string;
5069
+ directEditBy: string;
4253
5070
  };
4254
5071
  filing: {
4255
5072
  title: string;
@@ -4318,6 +5135,120 @@ export declare const i18nResources: {
4318
5135
  message: string;
4319
5136
  confirm: string;
4320
5137
  };
5138
+ editingBlock: {
5139
+ beingEdited: string;
5140
+ force: string;
5141
+ forceConfirm: {
5142
+ title: string;
5143
+ message: string;
5144
+ confirm: string;
5145
+ failed: string;
5146
+ denied: string;
5147
+ };
5148
+ forced: string;
5149
+ };
5150
+ directEdit: {
5151
+ unpublished: string;
5152
+ continue: string;
5153
+ };
5154
+ changeValidity: {
5155
+ title: string;
5156
+ hint: string;
5157
+ release: string;
5158
+ firstDay: string;
5159
+ firstDayHelp: string;
5160
+ firstDayRequired: string;
5161
+ lastDay: string;
5162
+ lastDayHelp: string;
5163
+ lastDayBefore: string;
5164
+ submit: string;
5165
+ done: string;
5166
+ published_one: string;
5167
+ published_other: string;
5168
+ editingMode: string;
5169
+ covers: string;
5170
+ publishRefused: string;
5171
+ denied: string;
5172
+ };
5173
+ };
5174
+ directEdit: {
5175
+ badge: string;
5176
+ loading: string;
5177
+ notFound: string;
5178
+ loadError: string;
5179
+ publish: string;
5180
+ discard: string;
5181
+ closed: {
5182
+ open: string;
5183
+ published: string;
5184
+ discarded: string;
5185
+ };
5186
+ discardConfirm: {
5187
+ title: string;
5188
+ message: string;
5189
+ failed: string;
5190
+ };
5191
+ refused_one: string;
5192
+ refused_other: string;
5193
+ refusedBecause: {
5194
+ one_branch: string;
5195
+ not_a_direct_edit: string;
5196
+ editing_blocked: string;
5197
+ not_the_editor: string;
5198
+ own_direct_edit: string;
5199
+ no_editing_block: string;
5200
+ unknown: string;
5201
+ };
5202
+ updateFromMain: string;
5203
+ resolveMerge: string;
5204
+ behind: {
5205
+ title: string;
5206
+ message: string;
5207
+ };
5208
+ pendingMerge: {
5209
+ title: string;
5210
+ message: string;
5211
+ };
5212
+ saveFirst: string;
5213
+ changeSetsOnly: string;
5214
+ saveAndPublish: string;
5215
+ publishDialog: {
5216
+ title: string;
5217
+ publishHint: string;
5218
+ saveAndPublishHint: string;
5219
+ specHint: string;
5220
+ refusedValues_one: string;
5221
+ refusedValues_other: string;
5222
+ datedPublishHint: string;
5223
+ datedSaveAndPublishHint: string;
5224
+ period: string;
5225
+ correction: string;
5226
+ newWording: string;
5227
+ firstDay: string;
5228
+ lastDay: string;
5229
+ lastDayHelp: string;
5230
+ computed: string;
5231
+ computedHint: string;
5232
+ computedRow: string;
5233
+ noComputed: string;
5234
+ carryForward: string;
5235
+ carryForwardHint: string;
5236
+ wording: string;
5237
+ wordingUntil: string;
5238
+ carryYes: string;
5239
+ carryNo: string;
5240
+ unanswered: string;
5241
+ previewFailed: string;
5242
+ covers: string;
5243
+ };
5244
+ effective: {
5245
+ title: string;
5246
+ hint: string;
5247
+ label: string;
5248
+ help: string;
5249
+ required: string;
5250
+ submit: string;
5251
+ };
4321
5252
  };
4322
5253
  };
4323
5254
  };
@@ -4333,6 +5264,7 @@ export declare const i18nResources: {
4333
5264
  tabs: {
4334
5265
  requiredChecks: string;
4335
5266
  blockReasons: string;
5267
+ editing: string;
4336
5268
  collections: string;
4337
5269
  };
4338
5270
  };
@@ -4371,6 +5303,73 @@ export declare const i18nResources: {
4371
5303
  failed: string;
4372
5304
  };
4373
5305
  };
5306
+ editing: {
5307
+ mode: {
5308
+ direct_edits: string;
5309
+ change_sets: string;
5310
+ both: string;
5311
+ };
5312
+ block: {
5313
+ on: string;
5314
+ off: string;
5315
+ };
5316
+ workspace: {
5317
+ title: string;
5318
+ description: string;
5319
+ edit: string;
5320
+ };
5321
+ columns: {
5322
+ blueprint: string;
5323
+ mode: string;
5324
+ block: string;
5325
+ actions: string;
5326
+ force: string;
5327
+ };
5328
+ fromWorkspace: string;
5329
+ createOverride: string;
5330
+ editOverride: string;
5331
+ removeOverride: string;
5332
+ count_one: string;
5333
+ count_other: string;
5334
+ empty: string;
5335
+ emptyHint: string;
5336
+ loadError: string;
5337
+ form: {
5338
+ workspaceTitle: string;
5339
+ createOverrideTitle: string;
5340
+ editOverrideTitle: string;
5341
+ accessor: string;
5342
+ accessorHelp: string;
5343
+ accessorRequired: string;
5344
+ accessorTooLong: string;
5345
+ accessorTaken: string;
5346
+ mode: string;
5347
+ modeHelp: string;
5348
+ modeRequired: string;
5349
+ block: string;
5350
+ blockHelp: string;
5351
+ follow: string;
5352
+ overridesNothing: string;
5353
+ save: string;
5354
+ denied: string;
5355
+ failed: string;
5356
+ force: string;
5357
+ forceHelp: string;
5358
+ forcePeople: string;
5359
+ forceNobody: string;
5360
+ forceOwn: string;
5361
+ };
5362
+ removeDialog: {
5363
+ title: string;
5364
+ message: string;
5365
+ confirm: string;
5366
+ failed: string;
5367
+ };
5368
+ force: {
5369
+ adminsOnly: string;
5370
+ adminsAnd: string;
5371
+ };
5372
+ };
4374
5373
  requiredChecks: {
4375
5374
  create: string;
4376
5375
  columns: {
@@ -4570,6 +5569,8 @@ export declare const i18nResources: {
4570
5569
  assignee: string;
4571
5570
  anyone: string;
4572
5571
  me: string;
5572
+ kind: string;
5573
+ anyKind: string;
4573
5574
  };
4574
5575
  count_one: string;
4575
5576
  count_other: string;
@@ -4593,6 +5594,10 @@ export declare const i18nResources: {
4593
5594
  createSubmit: string;
4594
5595
  };
4595
5596
  more: string;
5597
+ kind: {
5598
+ change_set: string;
5599
+ direct_edit: string;
5600
+ };
4596
5601
  };
4597
5602
  branch: {
4598
5603
  loading: string;
@@ -5090,6 +6095,7 @@ export declare const i18nResources: {
5090
6095
  unblock: string;
5091
6096
  archive: string;
5092
6097
  unarchive: string;
6098
+ edit: string;
5093
6099
  };
5094
6100
  data: {
5095
6101
  readOnMain: string;
@@ -5110,6 +6116,7 @@ export declare const i18nResources: {
5110
6116
  inForce: string;
5111
6117
  changeSet: string;
5112
6118
  proposed: string;
6119
+ actions: string;
5113
6120
  };
5114
6121
  kind: {
5115
6122
  revision: string;
@@ -5129,6 +6136,7 @@ export declare const i18nResources: {
5129
6136
  proposed: string;
5130
6137
  planned: string;
5131
6138
  loadError: string;
6139
+ changeValidity: string;
5132
6140
  };
5133
6141
  revisions: {
5134
6142
  columns: {
@@ -5213,6 +6221,7 @@ export declare const i18nResources: {
5213
6221
  empty: string;
5214
6222
  emptyHint: string;
5215
6223
  loadError: string;
6224
+ directEditBy: string;
5216
6225
  };
5217
6226
  filing: {
5218
6227
  title: string;
@@ -5281,6 +6290,120 @@ export declare const i18nResources: {
5281
6290
  message: string;
5282
6291
  confirm: string;
5283
6292
  };
6293
+ editingBlock: {
6294
+ beingEdited: string;
6295
+ force: string;
6296
+ forceConfirm: {
6297
+ title: string;
6298
+ message: string;
6299
+ confirm: string;
6300
+ failed: string;
6301
+ denied: string;
6302
+ };
6303
+ forced: string;
6304
+ };
6305
+ directEdit: {
6306
+ unpublished: string;
6307
+ continue: string;
6308
+ };
6309
+ changeValidity: {
6310
+ title: string;
6311
+ hint: string;
6312
+ release: string;
6313
+ firstDay: string;
6314
+ firstDayHelp: string;
6315
+ firstDayRequired: string;
6316
+ lastDay: string;
6317
+ lastDayHelp: string;
6318
+ lastDayBefore: string;
6319
+ submit: string;
6320
+ done: string;
6321
+ published_one: string;
6322
+ published_other: string;
6323
+ editingMode: string;
6324
+ covers: string;
6325
+ publishRefused: string;
6326
+ denied: string;
6327
+ };
6328
+ };
6329
+ directEdit: {
6330
+ badge: string;
6331
+ loading: string;
6332
+ notFound: string;
6333
+ loadError: string;
6334
+ publish: string;
6335
+ discard: string;
6336
+ closed: {
6337
+ open: string;
6338
+ published: string;
6339
+ discarded: string;
6340
+ };
6341
+ discardConfirm: {
6342
+ title: string;
6343
+ message: string;
6344
+ failed: string;
6345
+ };
6346
+ refused_one: string;
6347
+ refused_other: string;
6348
+ refusedBecause: {
6349
+ one_branch: string;
6350
+ not_a_direct_edit: string;
6351
+ editing_blocked: string;
6352
+ not_the_editor: string;
6353
+ own_direct_edit: string;
6354
+ no_editing_block: string;
6355
+ unknown: string;
6356
+ };
6357
+ updateFromMain: string;
6358
+ resolveMerge: string;
6359
+ behind: {
6360
+ title: string;
6361
+ message: string;
6362
+ };
6363
+ pendingMerge: {
6364
+ title: string;
6365
+ message: string;
6366
+ };
6367
+ saveFirst: string;
6368
+ changeSetsOnly: string;
6369
+ saveAndPublish: string;
6370
+ publishDialog: {
6371
+ title: string;
6372
+ publishHint: string;
6373
+ saveAndPublishHint: string;
6374
+ specHint: string;
6375
+ refusedValues_one: string;
6376
+ refusedValues_other: string;
6377
+ datedPublishHint: string;
6378
+ datedSaveAndPublishHint: string;
6379
+ period: string;
6380
+ correction: string;
6381
+ newWording: string;
6382
+ firstDay: string;
6383
+ lastDay: string;
6384
+ lastDayHelp: string;
6385
+ computed: string;
6386
+ computedHint: string;
6387
+ computedRow: string;
6388
+ noComputed: string;
6389
+ carryForward: string;
6390
+ carryForwardHint: string;
6391
+ wording: string;
6392
+ wordingUntil: string;
6393
+ carryYes: string;
6394
+ carryNo: string;
6395
+ unanswered: string;
6396
+ previewFailed: string;
6397
+ covers: string;
6398
+ };
6399
+ effective: {
6400
+ title: string;
6401
+ hint: string;
6402
+ label: string;
6403
+ help: string;
6404
+ required: string;
6405
+ submit: string;
6406
+ };
5284
6407
  };
5285
6408
  };
5286
6409
  };
@@ -5291,6 +6414,12 @@ export declare class InvalidInputError extends Error {
5291
6414
  constructor(message: string);
5292
6415
  }
5293
6416
 
6417
+ /** A later wording a Direct Edit's change may carry into (#270). */
6418
+ export declare interface LaterWording {
6419
+ releaseId: string;
6420
+ validityPeriod?: ValidityPeriod;
6421
+ }
6422
+
5294
6423
  /**
5295
6424
  * The port a host fills with mediahub (ADR 0020), in fieldkit's
5296
6425
  * media-adapter shape: a media field's picker browses and uploads through
@@ -5617,6 +6746,11 @@ export declare interface RequiredCheckRecorders {
5617
6746
  export declare interface ResolvedBlueprintRelease {
5618
6747
  /** The Blueprint's name, as the released Revision holds it; "" if it holds none. */
5619
6748
  displayName: string;
6749
+ /**
6750
+ * The Blueprint's accessor, which its editing settings are keyed by;
6751
+ * "" or absent when the Resolved Release names none.
6752
+ */
6753
+ accessor?: string;
5620
6754
  /** Whether its Content is Dated: its Releases carry a Validity Period. */
5621
6755
  dated: boolean;
5622
6756
  /** fieldkit's Resolved Spec fields, in Blueprint order. */
@@ -5803,4 +6937,10 @@ export declare class WithheldWorkError extends Error {
5803
6937
  constructor(message: string);
5804
6938
  }
5805
6939
 
6940
+ /** The workspace's editing settings and every per-Blueprint override, by accessor. */
6941
+ export declare interface WorkspaceEditingSettings {
6942
+ workspace: EditingSettings;
6943
+ overrides: BlueprintEditingOverride[];
6944
+ }
6945
+
5806
6946
  export { }