@knkcs/contenthub-ui 0.4.0 → 0.6.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,30 @@ 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
+ /**
61
+ * Why contenthub refused a Blueprint accessor a write added (ADR 0023): it
62
+ * names no Blueprint of the workspace, its Blueprint is archived, or it is
63
+ * no content Blueprint (a Title, a fieldset).
64
+ */
65
+ export declare type BlueprintAccessorRefusal = "unknown" | "archived" | "not_content";
66
+
67
+ /**
68
+ * A Required Check or editing override write named, newly, Blueprint
69
+ * accessors the workspace configuration may not name; nothing was written.
70
+ * `refused` names every one, read from the refusal's detail, never its text.
71
+ * An accessor the setting named already is never refused.
72
+ */
73
+ export declare class BlueprintAccessorsRefusedError extends InvalidInputError {
74
+ readonly refused: {
75
+ accessor: string;
76
+ reason: BlueprintAccessorRefusal;
77
+ }[];
78
+ constructor(refused: {
79
+ accessor: string;
80
+ reason: BlueprintAccessorRefusal;
81
+ }[], message?: string);
82
+ }
83
+
60
84
  /** One Blueprint's override of the workspace's editing settings. */
61
85
  export declare interface BlueprintEditingOverride {
62
86
  blueprintAccessor: string;
@@ -64,15 +88,27 @@ export declare interface BlueprintEditingOverride {
64
88
  editingMode: EditingMode | null;
65
89
  /** null follows the workspace's. */
66
90
  editingBlock: boolean | null;
91
+ /** The people beside the admins; null follows the workspace's, [] is the admins alone. */
92
+ forceGroup: string[] | null;
67
93
  /** What applies to the Blueprint's Content: this override over the workspace's. */
68
94
  effective: EditingSettings;
69
95
  }
70
96
 
71
- /** A content Blueprint, as the `BlueprintSource` port names it. */
97
+ /** A Blueprint, as the `BlueprintSource` port names it. */
72
98
  export declare interface BlueprintInfo {
73
99
  id: string;
74
100
  /** What editors call it. */
75
101
  name: string;
102
+ /**
103
+ * Its accessor, unique in the workspace for good: what workspace
104
+ * configuration names it by (ADR 0023).
105
+ */
106
+ accessor: string;
107
+ /**
108
+ * Whether it is archived. Search never offers an archived Blueprint;
109
+ * naming one by id or accessor does, marked. Absent means not archived.
110
+ */
111
+ archived?: boolean;
76
112
  }
77
113
 
78
114
  /** One page of `BlueprintSource.searchBlueprints`. */
@@ -100,8 +136,8 @@ export declare interface BlueprintReleaseInfo {
100
136
  }
101
137
 
102
138
  /**
103
- * The workspace's content Blueprints and their Releases, for New Content and
104
- * the Library's Blueprint filter. contenthub serves them itself
139
+ * The workspace's content Blueprints and their Releases, for New Content, the
140
+ * Library's Blueprint filter and the configuration that names Blueprints. contenthub serves them itself
105
141
  * (`BlueprintCatalogService`, #238): blueprinthub is its direct dependency,
106
142
  * not a port a host fills (ADR 0020 as amended), so every screen builds this
107
143
  * from its `ContenthubClient` unless a host passes its own, which only tests
@@ -109,16 +145,24 @@ export declare interface BlueprintReleaseInfo {
109
145
  */
110
146
  export declare interface BlueprintSource {
111
147
  /**
112
- * Unarchived content Blueprints whose name holds `query` (every one for
113
- * ""), by name. `signal` aborts a search the user has moved on from.
148
+ * Unarchived content Blueprints with a Release whose name holds `query`
149
+ * (every one for ""), by name; with `includeWithoutRelease`, those
150
+ * without a Release too. `signal` aborts a search the user has moved on
151
+ * from.
114
152
  */
115
153
  searchBlueprints(input: {
116
154
  query: string;
117
155
  pageToken?: string;
156
+ includeWithoutRelease?: boolean;
118
157
  signal?: AbortSignal;
119
158
  }): Promise<BlueprintPage>;
120
159
  /** The Blueprints of these ids, archived ones too; an unknown id is left out. */
121
160
  getBlueprints(ids: string[]): Promise<BlueprintInfo[]>;
161
+ /**
162
+ * The Blueprints of these accessors, archived ones too; an accessor of no
163
+ * Blueprint is left out.
164
+ */
165
+ getBlueprintsByAccessor(accessors: string[]): Promise<BlueprintInfo[]>;
122
166
  /** Every Release of a Blueprint, newest first; empty while none has been cut. */
123
167
  listReleases(blueprintId: string): Promise<BlueprintReleaseInfo[]>;
124
168
  }
@@ -166,6 +210,13 @@ export declare interface BranchEditorProps {
166
210
  /** What a Branch is for: one an editor works on, or a Carry-forward link. */
167
211
  export declare type BranchKind = "editorial" | "carry_forward";
168
212
 
213
+ /** Whether a Direct Edit's change carries forward into one later wording (#270). */
214
+ export declare interface CarryForwardAnswer {
215
+ /** The later wording: the Release a Carry-forward link carries. */
216
+ releaseId: string;
217
+ carry: boolean;
218
+ }
219
+
169
220
  /** What a Chain on Dated Content, effective on a date, would be and meet (PreviewChain). */
170
221
  export declare interface ChainPreview {
171
222
  /** The Release it would fork from; "" in a gap. */
@@ -509,6 +560,8 @@ export declare interface ContentAttributes {
509
560
  block?: ContentBlock;
510
561
  /** When it was archived, ISO 8601; absent while it is not Archived. */
511
562
  archiveTime?: string;
563
+ /** Its Editing Block; absent while no open Direct Edit holds one. */
564
+ editingBlock?: EditingBlock;
512
565
  }
513
566
 
514
567
  /**
@@ -749,11 +802,18 @@ export declare interface ContenthubClient {
749
802
  listRequiredChecks(): Promise<RequiredCheck[]>;
750
803
  /**
751
804
  * Declares a Required Check; it gates every open Change Set at once.
752
- * Rejects with `NameTakenError` when another check has the name, and
753
- * `InvalidInputError` for anything else the service refuses.
805
+ * Rejects with `NameTakenError` when another check has the name,
806
+ * `BlueprintAccessorsRefusedError` for accessors naming no content
807
+ * Blueprint taking new work, `ServiceUnavailableError` while they can't
808
+ * be checked, and `InvalidInputError` for anything else the service
809
+ * refuses.
754
810
  */
755
811
  createRequiredCheck(input: RequiredCheckInput): Promise<RequiredCheck>;
756
- /** Replaces every field of a Required Check; its id stays. Rejects as create does. */
812
+ /**
813
+ * Replaces every field of a Required Check; its id stays. Rejects as
814
+ * create does, checking only the accessors it adds: one the check names
815
+ * already passes whatever its Blueprint's state now.
816
+ */
757
817
  updateRequiredCheck(input: RequiredCheckInput & {
758
818
  id: string;
759
819
  }): Promise<RequiredCheck>;
@@ -816,12 +876,17 @@ export declare interface ContenthubClient {
816
876
  /**
817
877
  * Replaces one Blueprint's override; admin only. A null field follows the
818
878
  * workspace's, and at least one must be set. Rejects as
819
- * `setEditingSettings` does.
879
+ * `setEditingSettings` does, and adding an override with
880
+ * `BlueprintAccessorsRefusedError` for an accessor naming no content
881
+ * Blueprint taking new work, `ServiceUnavailableError` while it can't be
882
+ * checked.
820
883
  */
821
884
  setBlueprintEditingOverride(input: {
822
885
  blueprintAccessor: string;
823
886
  editingMode: EditingMode | null;
824
887
  editingBlock: boolean | null;
888
+ /** null follows the workspace's; [] is the admins alone. */
889
+ forceGroup: string[] | null;
825
890
  }): Promise<BlueprintEditingOverride>;
826
891
  /** Removes one Blueprint's override, so it follows the workspace's; admin only. */
827
892
  deleteBlueprintEditingOverride(input: {
@@ -928,12 +993,16 @@ export declare interface ContenthubClient {
928
993
  /**
929
994
  * A page of the workspace's content Blueprints Content can be made from:
930
995
  * not archived, with at least one Release, whose accessor or name holds
931
- * `query`. contenthub asks blueprinthub as the caller (#238). Rejects
932
- * with `ServiceUnavailableError` while blueprinthub gives no answer.
996
+ * `query`. With `includeWithoutRelease`, those without a Release too, for
997
+ * configuration that names a Blueprint before its first Release (ADR
998
+ * 0023); never an archived one. contenthub asks blueprinthub as the
999
+ * caller (#238). Rejects with `ServiceUnavailableError` while blueprinthub
1000
+ * gives no answer.
933
1001
  */
934
1002
  searchBlueprints(input: {
935
1003
  query: string;
936
1004
  pageToken?: string;
1005
+ includeWithoutRelease?: boolean;
937
1006
  signal?: AbortSignal;
938
1007
  }): Promise<BlueprintPage>;
939
1008
  /**
@@ -951,6 +1020,14 @@ export declare interface ContenthubClient {
951
1020
  * `ServiceUnavailableError` while blueprinthub gives no answer.
952
1021
  */
953
1022
  getBlueprints(ids: string[]): Promise<BlueprintInfo[]>;
1023
+ /**
1024
+ * Names the Blueprints of these accessors, as workspace configuration
1025
+ * names them (ADR 0023): archived ones and ones without a Release
1026
+ * included. An accessor of no Blueprint, or of one of another workspace,
1027
+ * is left out. At most `MAX_BLUEPRINT_IDS`. Rejects with
1028
+ * `ServiceUnavailableError` while blueprinthub gives no answer.
1029
+ */
1030
+ getBlueprintsByAccessor(accessors: string[]): Promise<BlueprintInfo[]>;
954
1031
  /**
955
1032
  * Creates a Content in an open Change Set, pinning a Blueprint Release,
956
1033
  * with empty data: its one Chain has one Branch, opened in the Branch
@@ -1086,11 +1163,20 @@ export declare interface ContenthubClient {
1086
1163
  * or answers the one the caller has open on it, with `reopened`. Answers
1087
1164
  * the Direct Edit and the Content as read on its Branch. Rejects with
1088
1165
  * `EditingModeRefusedError` where the Editing Mode is "Change Sets only",
1089
- * `DirectEditRefusedError` where the Content is Dated, `ContentBlockedError`, `ContentArchivedError`,
1090
- * and `InvalidInputError` for anything else the service refuses.
1166
+ * `DirectEditRefusedError` where another editor's Direct Edit holds its
1167
+ * Editing Block (naming them), `ContentBlockedError`, `ContentArchivedError`,
1168
+ * and `InvalidInputError` for anything else the service refuses (a day
1169
+ * for undated Content among it).
1091
1170
  */
1092
1171
  openDirectEdit(input: {
1093
1172
  contentId: string;
1173
+ /**
1174
+ * Dated Content only (#270): the day the change takes effect, as
1175
+ * YYYY-MM-DD; absent is today. Its Branch forks from the Release In
1176
+ * Force that day: on today it corrects that Release, on a later day
1177
+ * it is a new wording.
1178
+ */
1179
+ effectiveOn?: string;
1094
1180
  /** Makes a retry safe (CONTEXT.md, Idempotency Key). */
1095
1181
  idempotencyKey?: string;
1096
1182
  }): Promise<{
@@ -1098,17 +1184,63 @@ export declare interface ContenthubClient {
1098
1184
  content: Content;
1099
1185
  reopened: boolean;
1100
1186
  }>;
1187
+ /**
1188
+ * What a Direct Edit's Publish of Dated Content would plan (#270): its
1189
+ * Release's Validity Period with `validityLastDay` as Publish takes it,
1190
+ * the Release it corrects, the date-only Releases contenthub derives and
1191
+ * the later wordings Publish asks about. Writes nothing. Rejects with
1192
+ * `CoversReleaseError` (`changeSetRequired`) when the period would cover
1193
+ * a Release entirely.
1194
+ */
1195
+ previewDirectEditPublish(input: {
1196
+ id: string;
1197
+ validityLastDay?: string;
1198
+ }): Promise<DirectEditPublishPreview>;
1101
1199
  /**
1102
1200
  * Publishes a Direct Edit at `expectedHeadId`, the head of its Branch the
1103
- * editor saw: one Release, In Force from its Publish. Rejects as
1104
- * `publish` does, and with `DirectEditRefusedError` for a Change Set that
1105
- * is not a Direct Edit.
1201
+ * editor saw: one Release, In Force from its Publish, carrying
1202
+ * `releaseSpec`. Rejects as `publish` does, with `ContentRefusedError`
1203
+ * for Release Spec values the Blueprint Release refuses (a required one
1204
+ * missing among them), and with `DirectEditRefusedError` for a Change
1205
+ * Set that is not a Direct Edit. On Dated Content (#270) it takes the
1206
+ * Validity Period's last day and one carry-forward answer per later
1207
+ * wording, and rejects with `CoversReleaseError` (`changeSetRequired`)
1208
+ * when the period would cover a Release entirely.
1106
1209
  */
1107
1210
  publishDirectEdit(input: {
1108
1211
  id: string;
1109
1212
  expectedHeadId: string;
1213
+ /** The Release's Release Spec values; absent is none. */
1214
+ releaseSpec?: Record<string, unknown>;
1215
+ /** Dated Content: the period's last day, "" for an open end; absent keeps the default. */
1216
+ validityLastDay?: string;
1217
+ /** Dated Content: whether the change carries into each later wording. */
1218
+ carryForward?: CarryForwardAnswer[];
1110
1219
  idempotencyKey?: string;
1111
1220
  }): Promise<PublishOutcome>;
1221
+ /**
1222
+ * Saves on a Direct Edit's Branch on top of `expectedHeadId`, as
1223
+ * `saveRevision` does, and publishes the Revision saved, as
1224
+ * `publishDirectEdit` does, in one request (ADR 0022). Refused as a
1225
+ * whole, with nothing saved: rejects as either does (`StaleHeadError`,
1226
+ * `ContentRefusedError` for the data or the Release Spec values,
1227
+ * `PublishRefusedError` with every blocker).
1228
+ */
1229
+ saveAndPublishDirectEdit(input: {
1230
+ id: string;
1231
+ expectedHeadId: string;
1232
+ data: Record<string, unknown>;
1233
+ /** Top-level field accessors; absent saves `data` as the whole Revision. */
1234
+ fieldMask?: string[];
1235
+ releaseSpec?: Record<string, unknown>;
1236
+ /** As `publishDirectEdit`'s. */
1237
+ validityLastDay?: string;
1238
+ carryForward?: CarryForwardAnswer[];
1239
+ idempotencyKey?: string;
1240
+ }): Promise<{
1241
+ content: Content;
1242
+ outcome: PublishOutcome;
1243
+ }>;
1112
1244
  /**
1113
1245
  * Discards a Direct Edit: its work is dropped, Main and the Releases stay.
1114
1246
  * Rejects as `discardChangeSet` does, and with `DirectEditRefusedError`
@@ -1118,6 +1250,23 @@ export declare interface ContenthubClient {
1118
1250
  id: string;
1119
1251
  idempotencyKey?: string;
1120
1252
  }): Promise<ChangeSet>;
1253
+ /**
1254
+ * Forces an Editing Block (ADR 0022): hands the Direct Edit `id` holding
1255
+ * it, with its work and its Editing Block, to the caller. Answers it with
1256
+ * the caller as its editor, the Content as read on its Branch, and who
1257
+ * edited it until now. Rejects with `AccessDeniedError` outside the
1258
+ * Force Group, `DirectEditRefusedError` where the caller has a Direct
1259
+ * Edit of the Content of their own or it holds no Editing Block any more,
1260
+ * and as `discardDirectEdit` does otherwise.
1261
+ */
1262
+ forceDirectEdit(input: {
1263
+ id: string;
1264
+ idempotencyKey?: string;
1265
+ }): Promise<{
1266
+ changeSet: ChangeSet;
1267
+ content: Content;
1268
+ previousEditorId: string;
1269
+ }>;
1121
1270
  startEditing(input: {
1122
1271
  contentId: string;
1123
1272
  changeSetId?: string;
@@ -1278,6 +1427,7 @@ export declare const contenthubKeys: {
1278
1427
  pendingMerge: (branchId: string) => readonly ["contenthub", "pending-merge", string];
1279
1428
  blueprints: () => readonly ["contenthub", "blueprints"];
1280
1429
  blueprintNames: (ids: string[]) => readonly ["contenthub", "blueprints", "names", string[]];
1430
+ blueprintNamesByAccessor: (accessors: string[]) => readonly ["contenthub", "blueprints", "names-by-accessor", string[]];
1281
1431
  blueprintFilterOptions: () => readonly ["contenthub", "blueprints", "filter-options"];
1282
1432
  blueprintReleases: (blueprintId: string) => readonly ["contenthub", "blueprints", "releases", string];
1283
1433
  };
@@ -1325,7 +1475,7 @@ export declare interface ContenthubPathsProviderProps {
1325
1475
  * and there is no header Save: nothing here is a draft. Only the active tab
1326
1476
  * is mounted (nav-link tabs), so no two tabs' Modals or queries live at once.
1327
1477
  */
1328
- export declare function ContenthubSettings({ client }: ContenthubSettingsProps): JSX.Element;
1478
+ export declare function ContenthubSettings({ client, blueprintSource }: ContenthubSettingsProps): JSX.Element;
1329
1479
 
1330
1480
  export declare namespace ContenthubSettings {
1331
1481
  var displayName: string;
@@ -1339,6 +1489,12 @@ export declare function contenthubSettingsPath(paths: ContenthubPaths, tab?: Con
1339
1489
 
1340
1490
  export declare interface ContenthubSettingsProps {
1341
1491
  client: ContenthubClient;
1492
+ /**
1493
+ * Where the Blueprints configuration names are picked from and named;
1494
+ * contenthub's own catalogue through `client` unless given (only tests
1495
+ * need to).
1496
+ */
1497
+ blueprintSource?: BlueprintSource;
1342
1498
  }
1343
1499
 
1344
1500
  /** The settings page's tabs, as `?tab=` names them. */
@@ -1422,6 +1578,7 @@ export declare const contenthubTranslations: {
1422
1578
  mode: string;
1423
1579
  block: string;
1424
1580
  actions: string;
1581
+ force: string;
1425
1582
  };
1426
1583
  fromWorkspace: string;
1427
1584
  createOverride: string;
@@ -1436,11 +1593,10 @@ export declare const contenthubTranslations: {
1436
1593
  workspaceTitle: string;
1437
1594
  createOverrideTitle: string;
1438
1595
  editOverrideTitle: string;
1439
- accessor: string;
1440
- accessorHelp: string;
1441
- accessorRequired: string;
1442
- accessorTooLong: string;
1443
- accessorTaken: string;
1596
+ blueprint: string;
1597
+ blueprintHelp: string;
1598
+ blueprintPlaceholder: string;
1599
+ blueprintRequired: string;
1444
1600
  mode: string;
1445
1601
  modeHelp: string;
1446
1602
  modeRequired: string;
@@ -1451,6 +1607,11 @@ export declare const contenthubTranslations: {
1451
1607
  save: string;
1452
1608
  denied: string;
1453
1609
  failed: string;
1610
+ force: string;
1611
+ forceHelp: string;
1612
+ forcePeople: string;
1613
+ forceNobody: string;
1614
+ forceOwn: string;
1454
1615
  };
1455
1616
  removeDialog: {
1456
1617
  title: string;
@@ -1458,6 +1619,10 @@ export declare const contenthubTranslations: {
1458
1619
  confirm: string;
1459
1620
  failed: string;
1460
1621
  };
1622
+ force: {
1623
+ adminsOnly: string;
1624
+ adminsAnd: string;
1625
+ };
1461
1626
  };
1462
1627
  requiredChecks: {
1463
1628
  create: string;
@@ -1528,7 +1693,6 @@ export declare const contenthubTranslations: {
1528
1693
  accessors: string;
1529
1694
  accessorsHelp: string;
1530
1695
  accessorsRequired: string;
1531
- accessorTooLong: string;
1532
1696
  independentLabel: string;
1533
1697
  independentHelp: string;
1534
1698
  recorders: string;
@@ -1536,6 +1700,7 @@ export declare const contenthubTranslations: {
1536
1700
  failed: string;
1537
1701
  createSubmit: string;
1538
1702
  editSubmit: string;
1703
+ accessorsPlaceholder: string;
1539
1704
  };
1540
1705
  removeDialog: {
1541
1706
  title: string;
@@ -2379,6 +2544,18 @@ export declare const contenthubTranslations: {
2379
2544
  message: string;
2380
2545
  confirm: string;
2381
2546
  };
2547
+ editingBlock: {
2548
+ beingEdited: string;
2549
+ force: string;
2550
+ forceConfirm: {
2551
+ title: string;
2552
+ message: string;
2553
+ confirm: string;
2554
+ failed: string;
2555
+ denied: string;
2556
+ };
2557
+ forced: string;
2558
+ };
2382
2559
  directEdit: {
2383
2560
  unpublished: string;
2384
2561
  continue: string;
@@ -2423,13 +2600,77 @@ export declare const contenthubTranslations: {
2423
2600
  refused_one: string;
2424
2601
  refused_other: string;
2425
2602
  refusedBecause: {
2426
- dated_content: string;
2427
2603
  one_branch: string;
2428
2604
  not_a_direct_edit: string;
2605
+ editing_blocked: string;
2606
+ not_the_editor: string;
2607
+ own_direct_edit: string;
2608
+ no_editing_block: string;
2429
2609
  unknown: string;
2430
2610
  };
2611
+ updateFromMain: string;
2612
+ resolveMerge: string;
2613
+ behind: {
2614
+ title: string;
2615
+ message: string;
2616
+ };
2617
+ pendingMerge: {
2618
+ title: string;
2619
+ message: string;
2620
+ };
2431
2621
  saveFirst: string;
2432
2622
  changeSetsOnly: string;
2623
+ saveAndPublish: string;
2624
+ publishDialog: {
2625
+ title: string;
2626
+ publishHint: string;
2627
+ saveAndPublishHint: string;
2628
+ specHint: string;
2629
+ refusedValues_one: string;
2630
+ refusedValues_other: string;
2631
+ datedPublishHint: string;
2632
+ datedSaveAndPublishHint: string;
2633
+ period: string;
2634
+ correction: string;
2635
+ newWording: string;
2636
+ firstDay: string;
2637
+ lastDay: string;
2638
+ lastDayHelp: string;
2639
+ computed: string;
2640
+ computedHint: string;
2641
+ computedRow: string;
2642
+ noComputed: string;
2643
+ carryForward: string;
2644
+ carryForwardHint: string;
2645
+ wording: string;
2646
+ wordingUntil: string;
2647
+ carryYes: string;
2648
+ carryNo: string;
2649
+ unanswered: string;
2650
+ previewFailed: string;
2651
+ covers: string;
2652
+ };
2653
+ effective: {
2654
+ title: string;
2655
+ hint: string;
2656
+ label: string;
2657
+ help: string;
2658
+ required: string;
2659
+ submit: string;
2660
+ };
2661
+ };
2662
+ blueprintSelect: {
2663
+ archived: string;
2664
+ unknown: string;
2665
+ empty: string;
2666
+ failed: string;
2667
+ loading: string;
2668
+ refused: string;
2669
+ refusal: {
2670
+ unknown: string;
2671
+ archived: string;
2672
+ not_content: string;
2673
+ };
2433
2674
  };
2434
2675
  };
2435
2676
  };
@@ -2504,6 +2745,7 @@ export declare const contenthubTranslations: {
2504
2745
  mode: string;
2505
2746
  block: string;
2506
2747
  actions: string;
2748
+ force: string;
2507
2749
  };
2508
2750
  fromWorkspace: string;
2509
2751
  createOverride: string;
@@ -2518,11 +2760,10 @@ export declare const contenthubTranslations: {
2518
2760
  workspaceTitle: string;
2519
2761
  createOverrideTitle: string;
2520
2762
  editOverrideTitle: string;
2521
- accessor: string;
2522
- accessorHelp: string;
2523
- accessorRequired: string;
2524
- accessorTooLong: string;
2525
- accessorTaken: string;
2763
+ blueprint: string;
2764
+ blueprintHelp: string;
2765
+ blueprintPlaceholder: string;
2766
+ blueprintRequired: string;
2526
2767
  mode: string;
2527
2768
  modeHelp: string;
2528
2769
  modeRequired: string;
@@ -2533,6 +2774,11 @@ export declare const contenthubTranslations: {
2533
2774
  save: string;
2534
2775
  denied: string;
2535
2776
  failed: string;
2777
+ force: string;
2778
+ forceHelp: string;
2779
+ forcePeople: string;
2780
+ forceNobody: string;
2781
+ forceOwn: string;
2536
2782
  };
2537
2783
  removeDialog: {
2538
2784
  title: string;
@@ -2540,6 +2786,10 @@ export declare const contenthubTranslations: {
2540
2786
  confirm: string;
2541
2787
  failed: string;
2542
2788
  };
2789
+ force: {
2790
+ adminsOnly: string;
2791
+ adminsAnd: string;
2792
+ };
2543
2793
  };
2544
2794
  requiredChecks: {
2545
2795
  create: string;
@@ -2610,7 +2860,6 @@ export declare const contenthubTranslations: {
2610
2860
  accessors: string;
2611
2861
  accessorsHelp: string;
2612
2862
  accessorsRequired: string;
2613
- accessorTooLong: string;
2614
2863
  independentLabel: string;
2615
2864
  independentHelp: string;
2616
2865
  recorders: string;
@@ -2618,6 +2867,7 @@ export declare const contenthubTranslations: {
2618
2867
  failed: string;
2619
2868
  createSubmit: string;
2620
2869
  editSubmit: string;
2870
+ accessorsPlaceholder: string;
2621
2871
  };
2622
2872
  removeDialog: {
2623
2873
  title: string;
@@ -3461,6 +3711,18 @@ export declare const contenthubTranslations: {
3461
3711
  message: string;
3462
3712
  confirm: string;
3463
3713
  };
3714
+ editingBlock: {
3715
+ beingEdited: string;
3716
+ force: string;
3717
+ forceConfirm: {
3718
+ title: string;
3719
+ message: string;
3720
+ confirm: string;
3721
+ failed: string;
3722
+ denied: string;
3723
+ };
3724
+ forced: string;
3725
+ };
3464
3726
  directEdit: {
3465
3727
  unpublished: string;
3466
3728
  continue: string;
@@ -3505,13 +3767,77 @@ export declare const contenthubTranslations: {
3505
3767
  refused_one: string;
3506
3768
  refused_other: string;
3507
3769
  refusedBecause: {
3508
- dated_content: string;
3509
3770
  one_branch: string;
3510
3771
  not_a_direct_edit: string;
3772
+ editing_blocked: string;
3773
+ not_the_editor: string;
3774
+ own_direct_edit: string;
3775
+ no_editing_block: string;
3511
3776
  unknown: string;
3512
3777
  };
3778
+ updateFromMain: string;
3779
+ resolveMerge: string;
3780
+ behind: {
3781
+ title: string;
3782
+ message: string;
3783
+ };
3784
+ pendingMerge: {
3785
+ title: string;
3786
+ message: string;
3787
+ };
3513
3788
  saveFirst: string;
3514
3789
  changeSetsOnly: string;
3790
+ saveAndPublish: string;
3791
+ publishDialog: {
3792
+ title: string;
3793
+ publishHint: string;
3794
+ saveAndPublishHint: string;
3795
+ specHint: string;
3796
+ refusedValues_one: string;
3797
+ refusedValues_other: string;
3798
+ datedPublishHint: string;
3799
+ datedSaveAndPublishHint: string;
3800
+ period: string;
3801
+ correction: string;
3802
+ newWording: string;
3803
+ firstDay: string;
3804
+ lastDay: string;
3805
+ lastDayHelp: string;
3806
+ computed: string;
3807
+ computedHint: string;
3808
+ computedRow: string;
3809
+ noComputed: string;
3810
+ carryForward: string;
3811
+ carryForwardHint: string;
3812
+ wording: string;
3813
+ wordingUntil: string;
3814
+ carryYes: string;
3815
+ carryNo: string;
3816
+ unanswered: string;
3817
+ previewFailed: string;
3818
+ covers: string;
3819
+ };
3820
+ effective: {
3821
+ title: string;
3822
+ hint: string;
3823
+ label: string;
3824
+ help: string;
3825
+ required: string;
3826
+ submit: string;
3827
+ };
3828
+ };
3829
+ blueprintSelect: {
3830
+ archived: string;
3831
+ unknown: string;
3832
+ empty: string;
3833
+ failed: string;
3834
+ loading: string;
3835
+ refused: string;
3836
+ refusal: {
3837
+ unknown: string;
3838
+ archived: string;
3839
+ not_content: string;
3840
+ };
3515
3841
  };
3516
3842
  };
3517
3843
  };
@@ -3697,14 +4023,35 @@ export declare interface DirectEditPageProps {
3697
4023
  onDiscarded?: (changeSetId: string) => void;
3698
4024
  }
3699
4025
 
4026
+ /**
4027
+ * What a Direct Edit's Publish of Dated Content would plan (#270), for its
4028
+ * Publish dialog: nothing of it is written.
4029
+ */
4030
+ export declare interface DirectEditPublishPreview {
4031
+ /** Its Release's Validity Period; an empty last day is an open end. */
4032
+ validityPeriod?: ValidityPeriod;
4033
+ /** The Release it corrects and Supersedes; "" for a new wording. */
4034
+ correctsReleaseId: string;
4035
+ /** The date-only Releases contenthub derives, read-only. */
4036
+ dateOnlyReleases: PlannedRelease[];
4037
+ /** The later wordings Publish asks about, by first day. */
4038
+ laterWordings: LaterWording[];
4039
+ }
4040
+
3700
4041
  /** Why contenthub refused a Direct Edit (`DirectEditRefusedError.reason`). */
3701
4042
  export declare type DirectEditRefusal =
3702
- /** The Content is Dated, which a Direct Edit can't take yet. */
3703
- "dated_content"
3704
4043
  /** A Direct Edit takes no second Chain, Branch, dependency or Source. */
3705
- | "one_branch"
4044
+ "one_branch"
3706
4045
  /** The Change Set named is not a Direct Edit. */
3707
4046
  | "not_a_direct_edit"
4047
+ /** Another editor's Direct Edit holds the Content's Editing Block. */
4048
+ | "editing_blocked"
4049
+ /** The Direct Edit is someone else's: `editorId` names them. */
4050
+ | "not_the_editor"
4051
+ /** Force by a caller who has a Direct Edit of the Content of their own. */
4052
+ | "own_direct_edit"
4053
+ /** Force of a Direct Edit that holds no Editing Block any more. */
4054
+ | "no_editing_block"
3708
4055
  /** A reason this build doesn't know. */
3709
4056
  | "unknown";
3710
4057
 
@@ -3716,7 +4063,12 @@ export declare class DirectEditRefusedError extends Error {
3716
4063
  readonly reason: DirectEditRefusal;
3717
4064
  /** The Content it is about; "" where the refusal names none. */
3718
4065
  readonly contentId: string;
3719
- constructor(reason: DirectEditRefusal, message: string, contentId?: string);
4066
+ /**
4067
+ * For `editing_blocked`: the editor holding the Editing Block; for
4068
+ * `not_the_editor`: the Direct Edit's editor; "" otherwise.
4069
+ */
4070
+ readonly editorId: string;
4071
+ constructor(reason: DirectEditRefusal, message: string, contentId?: string, editorId?: string);
3720
4072
  }
3721
4073
 
3722
4074
  /** One edge of one Revision. */
@@ -3737,6 +4089,21 @@ export declare interface Edge {
3737
4089
  /** What kind of edge of the Content Graph (ADR 0009). */
3738
4090
  export declare type EdgeKind = "reference" | "toc" | "include" | "exclude" | "replace" | "annotate" | "link" | "footnote" | "anchor" | "media" | "blueprint" | "unspecified";
3739
4091
 
4092
+ /**
4093
+ * The Block a Direct Edit sets on its Content (CONTEXT.md, Editing Block):
4094
+ * "being edited by" its editor. It keeps out only other editors' Direct
4095
+ * Edits, ends with its Direct Edit's Publish or Discard, and can't be
4096
+ * lifted. It is independent of `block`: a Content can hold both.
4097
+ */
4098
+ export declare interface EditingBlock {
4099
+ /** The Direct Edit's editor, an odon user id. */
4100
+ editorId: string;
4101
+ /** The Direct Edit holding it. */
4102
+ changeSetId: string;
4103
+ /** ISO 8601. */
4104
+ blockTime: string;
4105
+ }
4106
+
3740
4107
  /**
3741
4108
  * Which ways of changing a Blueprint's Content the workspace offers (ADR
3742
4109
  * 0022, CONTEXT.md Editing Mode): Direct Edits only, Change Sets only, or
@@ -3762,6 +4129,12 @@ export declare interface EditingSettings {
3762
4129
  editingMode: EditingMode;
3763
4130
  /** Whether opening a Direct Edit sets an Editing Block on its Content. */
3764
4131
  editingBlock: boolean;
4132
+ /**
4133
+ * The Force Group: who may force an Editing Block (ADR 0022). The
4134
+ * workspace's admins always may; these are the people beside them, by
4135
+ * odon user id, sorted. Empty is the admins alone.
4136
+ */
4137
+ forceGroup: string[];
3765
4138
  }
3766
4139
 
3767
4140
  /** The editing settings in effect for one Blueprint, and which its override decides. */
@@ -3769,6 +4142,13 @@ export declare interface EffectiveEditingSettings {
3769
4142
  effective: EditingSettings;
3770
4143
  editingModeOverridden: boolean;
3771
4144
  editingBlockOverridden: boolean;
4145
+ forceGroupOverridden: boolean;
4146
+ /**
4147
+ * Whether the caller is in the effective Force Group: an admin, or named
4148
+ * by it. It is how a screen knows to offer Force (#269); the service
4149
+ * asks the same when it is used.
4150
+ */
4151
+ callerInForceGroup: boolean;
3772
4152
  }
3773
4153
 
3774
4154
  /** One field that differs between two Revisions. */
@@ -3883,6 +4263,7 @@ export declare const i18nResources: {
3883
4263
  mode: string;
3884
4264
  block: string;
3885
4265
  actions: string;
4266
+ force: string;
3886
4267
  };
3887
4268
  fromWorkspace: string;
3888
4269
  createOverride: string;
@@ -3897,11 +4278,10 @@ export declare const i18nResources: {
3897
4278
  workspaceTitle: string;
3898
4279
  createOverrideTitle: string;
3899
4280
  editOverrideTitle: string;
3900
- accessor: string;
3901
- accessorHelp: string;
3902
- accessorRequired: string;
3903
- accessorTooLong: string;
3904
- accessorTaken: string;
4281
+ blueprint: string;
4282
+ blueprintHelp: string;
4283
+ blueprintPlaceholder: string;
4284
+ blueprintRequired: string;
3905
4285
  mode: string;
3906
4286
  modeHelp: string;
3907
4287
  modeRequired: string;
@@ -3912,6 +4292,11 @@ export declare const i18nResources: {
3912
4292
  save: string;
3913
4293
  denied: string;
3914
4294
  failed: string;
4295
+ force: string;
4296
+ forceHelp: string;
4297
+ forcePeople: string;
4298
+ forceNobody: string;
4299
+ forceOwn: string;
3915
4300
  };
3916
4301
  removeDialog: {
3917
4302
  title: string;
@@ -3919,6 +4304,10 @@ export declare const i18nResources: {
3919
4304
  confirm: string;
3920
4305
  failed: string;
3921
4306
  };
4307
+ force: {
4308
+ adminsOnly: string;
4309
+ adminsAnd: string;
4310
+ };
3922
4311
  };
3923
4312
  requiredChecks: {
3924
4313
  create: string;
@@ -3989,7 +4378,6 @@ export declare const i18nResources: {
3989
4378
  accessors: string;
3990
4379
  accessorsHelp: string;
3991
4380
  accessorsRequired: string;
3992
- accessorTooLong: string;
3993
4381
  independentLabel: string;
3994
4382
  independentHelp: string;
3995
4383
  recorders: string;
@@ -3997,6 +4385,7 @@ export declare const i18nResources: {
3997
4385
  failed: string;
3998
4386
  createSubmit: string;
3999
4387
  editSubmit: string;
4388
+ accessorsPlaceholder: string;
4000
4389
  };
4001
4390
  removeDialog: {
4002
4391
  title: string;
@@ -4840,6 +5229,18 @@ export declare const i18nResources: {
4840
5229
  message: string;
4841
5230
  confirm: string;
4842
5231
  };
5232
+ editingBlock: {
5233
+ beingEdited: string;
5234
+ force: string;
5235
+ forceConfirm: {
5236
+ title: string;
5237
+ message: string;
5238
+ confirm: string;
5239
+ failed: string;
5240
+ denied: string;
5241
+ };
5242
+ forced: string;
5243
+ };
4843
5244
  directEdit: {
4844
5245
  unpublished: string;
4845
5246
  continue: string;
@@ -4884,13 +5285,77 @@ export declare const i18nResources: {
4884
5285
  refused_one: string;
4885
5286
  refused_other: string;
4886
5287
  refusedBecause: {
4887
- dated_content: string;
4888
5288
  one_branch: string;
4889
5289
  not_a_direct_edit: string;
5290
+ editing_blocked: string;
5291
+ not_the_editor: string;
5292
+ own_direct_edit: string;
5293
+ no_editing_block: string;
4890
5294
  unknown: string;
4891
5295
  };
5296
+ updateFromMain: string;
5297
+ resolveMerge: string;
5298
+ behind: {
5299
+ title: string;
5300
+ message: string;
5301
+ };
5302
+ pendingMerge: {
5303
+ title: string;
5304
+ message: string;
5305
+ };
4892
5306
  saveFirst: string;
4893
5307
  changeSetsOnly: string;
5308
+ saveAndPublish: string;
5309
+ publishDialog: {
5310
+ title: string;
5311
+ publishHint: string;
5312
+ saveAndPublishHint: string;
5313
+ specHint: string;
5314
+ refusedValues_one: string;
5315
+ refusedValues_other: string;
5316
+ datedPublishHint: string;
5317
+ datedSaveAndPublishHint: string;
5318
+ period: string;
5319
+ correction: string;
5320
+ newWording: string;
5321
+ firstDay: string;
5322
+ lastDay: string;
5323
+ lastDayHelp: string;
5324
+ computed: string;
5325
+ computedHint: string;
5326
+ computedRow: string;
5327
+ noComputed: string;
5328
+ carryForward: string;
5329
+ carryForwardHint: string;
5330
+ wording: string;
5331
+ wordingUntil: string;
5332
+ carryYes: string;
5333
+ carryNo: string;
5334
+ unanswered: string;
5335
+ previewFailed: string;
5336
+ covers: string;
5337
+ };
5338
+ effective: {
5339
+ title: string;
5340
+ hint: string;
5341
+ label: string;
5342
+ help: string;
5343
+ required: string;
5344
+ submit: string;
5345
+ };
5346
+ };
5347
+ blueprintSelect: {
5348
+ archived: string;
5349
+ unknown: string;
5350
+ empty: string;
5351
+ failed: string;
5352
+ loading: string;
5353
+ refused: string;
5354
+ refusal: {
5355
+ unknown: string;
5356
+ archived: string;
5357
+ not_content: string;
5358
+ };
4894
5359
  };
4895
5360
  };
4896
5361
  };
@@ -4965,6 +5430,7 @@ export declare const i18nResources: {
4965
5430
  mode: string;
4966
5431
  block: string;
4967
5432
  actions: string;
5433
+ force: string;
4968
5434
  };
4969
5435
  fromWorkspace: string;
4970
5436
  createOverride: string;
@@ -4979,11 +5445,10 @@ export declare const i18nResources: {
4979
5445
  workspaceTitle: string;
4980
5446
  createOverrideTitle: string;
4981
5447
  editOverrideTitle: string;
4982
- accessor: string;
4983
- accessorHelp: string;
4984
- accessorRequired: string;
4985
- accessorTooLong: string;
4986
- accessorTaken: string;
5448
+ blueprint: string;
5449
+ blueprintHelp: string;
5450
+ blueprintPlaceholder: string;
5451
+ blueprintRequired: string;
4987
5452
  mode: string;
4988
5453
  modeHelp: string;
4989
5454
  modeRequired: string;
@@ -4994,6 +5459,11 @@ export declare const i18nResources: {
4994
5459
  save: string;
4995
5460
  denied: string;
4996
5461
  failed: string;
5462
+ force: string;
5463
+ forceHelp: string;
5464
+ forcePeople: string;
5465
+ forceNobody: string;
5466
+ forceOwn: string;
4997
5467
  };
4998
5468
  removeDialog: {
4999
5469
  title: string;
@@ -5001,6 +5471,10 @@ export declare const i18nResources: {
5001
5471
  confirm: string;
5002
5472
  failed: string;
5003
5473
  };
5474
+ force: {
5475
+ adminsOnly: string;
5476
+ adminsAnd: string;
5477
+ };
5004
5478
  };
5005
5479
  requiredChecks: {
5006
5480
  create: string;
@@ -5071,7 +5545,6 @@ export declare const i18nResources: {
5071
5545
  accessors: string;
5072
5546
  accessorsHelp: string;
5073
5547
  accessorsRequired: string;
5074
- accessorTooLong: string;
5075
5548
  independentLabel: string;
5076
5549
  independentHelp: string;
5077
5550
  recorders: string;
@@ -5079,6 +5552,7 @@ export declare const i18nResources: {
5079
5552
  failed: string;
5080
5553
  createSubmit: string;
5081
5554
  editSubmit: string;
5555
+ accessorsPlaceholder: string;
5082
5556
  };
5083
5557
  removeDialog: {
5084
5558
  title: string;
@@ -5922,6 +6396,18 @@ export declare const i18nResources: {
5922
6396
  message: string;
5923
6397
  confirm: string;
5924
6398
  };
6399
+ editingBlock: {
6400
+ beingEdited: string;
6401
+ force: string;
6402
+ forceConfirm: {
6403
+ title: string;
6404
+ message: string;
6405
+ confirm: string;
6406
+ failed: string;
6407
+ denied: string;
6408
+ };
6409
+ forced: string;
6410
+ };
5925
6411
  directEdit: {
5926
6412
  unpublished: string;
5927
6413
  continue: string;
@@ -5966,13 +6452,77 @@ export declare const i18nResources: {
5966
6452
  refused_one: string;
5967
6453
  refused_other: string;
5968
6454
  refusedBecause: {
5969
- dated_content: string;
5970
6455
  one_branch: string;
5971
6456
  not_a_direct_edit: string;
6457
+ editing_blocked: string;
6458
+ not_the_editor: string;
6459
+ own_direct_edit: string;
6460
+ no_editing_block: string;
5972
6461
  unknown: string;
5973
6462
  };
6463
+ updateFromMain: string;
6464
+ resolveMerge: string;
6465
+ behind: {
6466
+ title: string;
6467
+ message: string;
6468
+ };
6469
+ pendingMerge: {
6470
+ title: string;
6471
+ message: string;
6472
+ };
5974
6473
  saveFirst: string;
5975
6474
  changeSetsOnly: string;
6475
+ saveAndPublish: string;
6476
+ publishDialog: {
6477
+ title: string;
6478
+ publishHint: string;
6479
+ saveAndPublishHint: string;
6480
+ specHint: string;
6481
+ refusedValues_one: string;
6482
+ refusedValues_other: string;
6483
+ datedPublishHint: string;
6484
+ datedSaveAndPublishHint: string;
6485
+ period: string;
6486
+ correction: string;
6487
+ newWording: string;
6488
+ firstDay: string;
6489
+ lastDay: string;
6490
+ lastDayHelp: string;
6491
+ computed: string;
6492
+ computedHint: string;
6493
+ computedRow: string;
6494
+ noComputed: string;
6495
+ carryForward: string;
6496
+ carryForwardHint: string;
6497
+ wording: string;
6498
+ wordingUntil: string;
6499
+ carryYes: string;
6500
+ carryNo: string;
6501
+ unanswered: string;
6502
+ previewFailed: string;
6503
+ covers: string;
6504
+ };
6505
+ effective: {
6506
+ title: string;
6507
+ hint: string;
6508
+ label: string;
6509
+ help: string;
6510
+ required: string;
6511
+ submit: string;
6512
+ };
6513
+ };
6514
+ blueprintSelect: {
6515
+ archived: string;
6516
+ unknown: string;
6517
+ empty: string;
6518
+ failed: string;
6519
+ loading: string;
6520
+ refused: string;
6521
+ refusal: {
6522
+ unknown: string;
6523
+ archived: string;
6524
+ not_content: string;
6525
+ };
5976
6526
  };
5977
6527
  };
5978
6528
  };
@@ -5983,6 +6533,12 @@ export declare class InvalidInputError extends Error {
5983
6533
  constructor(message: string);
5984
6534
  }
5985
6535
 
6536
+ /** A later wording a Direct Edit's change may carry into (#270). */
6537
+ export declare interface LaterWording {
6538
+ releaseId: string;
6539
+ validityPeriod?: ValidityPeriod;
6540
+ }
6541
+
5986
6542
  /**
5987
6543
  * The port a host fills with mediahub (ADR 0020), in fieldkit's
5988
6544
  * media-adapter shape: a media field's picker browses and uploads through
@@ -6285,8 +6841,18 @@ export declare interface RequiredCheck {
6285
6841
  export declare interface RequiredCheckInput {
6286
6842
  name: string;
6287
6843
  scope: CheckScope;
6288
- /** Blueprint accessors; empty for every Blueprint. */
6844
+ /**
6845
+ * Blueprint accessors, empty exactly when `everyBlueprint` is set. Each
6846
+ * one the write adds must name a content Blueprint of the workspace that
6847
+ * is not archived (ADR 0023).
6848
+ */
6289
6849
  blueprintAccessors: string[];
6850
+ /**
6851
+ * Applies the check to every Blueprint. A switch of its own: no accessors
6852
+ * without it is refused, so clearing the last Blueprint never widens a
6853
+ * check to every Publish.
6854
+ */
6855
+ everyBlueprint: boolean;
6290
6856
  independent: boolean;
6291
6857
  }
6292
6858