@elevasis/ui 2.70.0 → 2.72.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/api/index.js +3 -3
- package/dist/app/index.d.ts +28 -2
- package/dist/app/index.js +8 -8
- package/dist/auth/index.js +4 -4
- package/dist/charts/index.js +4 -4
- package/dist/{chunk-GZADST64.js → chunk-2454MK7P.js} +7 -7
- package/dist/{chunk-26BTE3Z4.js → chunk-753MKWFV.js} +1 -1
- package/dist/{chunk-LWYLZUUV.js → chunk-7ESZKTQG.js} +3 -3
- package/dist/{chunk-SMH6SQQE.js → chunk-A3JHFZDP.js} +1 -1
- package/dist/{chunk-MFCV4JMQ.js → chunk-AFBFSXP3.js} +4 -4
- package/dist/{chunk-TJMZUL6E.js → chunk-DJWIIPKW.js} +3 -3
- package/dist/{chunk-QDMIFD6F.js → chunk-DKVGO6RJ.js} +1 -1
- package/dist/{chunk-LY3IKYTZ.js → chunk-IMZTRDY2.js} +2 -2
- package/dist/{chunk-JA2XDMAE.js → chunk-IXBRUIYI.js} +1 -1
- package/dist/{chunk-6TT3FQEZ.js → chunk-KIDZXZM5.js} +149 -17
- package/dist/{chunk-CCZJ4OWY.js → chunk-LCHL5SM2.js} +1 -1
- package/dist/{chunk-5C62IRKS.js → chunk-LEQGGX2U.js} +4 -4
- package/dist/{chunk-NM4A63KJ.js → chunk-Q3O3WY7Q.js} +23 -7
- package/dist/{chunk-GJQF3S2Q.js → chunk-RRS2QR3W.js} +1 -1
- package/dist/{chunk-DUEGHF7A.js → chunk-SV4M2BUI.js} +4 -4
- package/dist/{chunk-AGX2CY2O.js → chunk-UZ5JO5TK.js} +1 -1
- package/dist/{chunk-C75XWBYZ.js → chunk-XZIOCB5D.js} +1 -1
- package/dist/{chunk-VDX6DL7Z.js → chunk-Z2W5VNN3.js} +1 -1
- package/dist/{chunk-XKUEO4HG.js → chunk-ZBXCEWKF.js} +3 -3
- package/dist/components/index.d.ts +61 -5
- package/dist/components/index.js +23 -23
- package/dist/components/navigation/index.js +5 -5
- package/dist/features/auth/index.d.ts +26 -0
- package/dist/features/auth/index.js +6 -6
- package/dist/features/clients/index.js +5 -5
- package/dist/features/content/index.d.ts +187 -113
- package/dist/features/content/index.js +200 -303
- package/dist/features/crm/index.d.ts +29 -2
- package/dist/features/crm/index.js +6 -6
- package/dist/features/dashboard/index.d.ts +1 -1
- package/dist/features/dashboard/index.js +6 -6
- package/dist/features/delivery/index.d.ts +26 -0
- package/dist/features/delivery/index.js +5 -5
- package/dist/features/knowledge/index.js +4 -4
- package/dist/features/lead-gen/index.d.ts +3 -2
- package/dist/features/lead-gen/index.js +6 -6
- package/dist/features/monitoring/index.d.ts +33 -3
- package/dist/features/monitoring/index.js +7 -7
- package/dist/features/monitoring/requests/index.js +5 -5
- package/dist/features/operations/index.d.ts +2 -2
- package/dist/features/operations/index.js +9 -9
- package/dist/features/settings/index.d.ts +26 -0
- package/dist/features/settings/index.js +6 -6
- package/dist/hooks/access/index.js +4 -4
- package/dist/hooks/delivery/index.d.ts +26 -0
- package/dist/hooks/delivery/index.js +2 -2
- package/dist/hooks/index.d.ts +310 -14
- package/dist/hooks/index.js +4 -4
- package/dist/hooks/operations/command-view/utils/transformCommandViewData.d.ts +1 -1
- package/dist/hooks/published.d.ts +310 -14
- package/dist/hooks/published.js +4 -4
- package/dist/initialization/index.d.ts +26 -0
- package/dist/knowledge/index.d.ts +2 -2
- package/dist/knowledge/index.js +18 -18
- package/dist/{knowledge-search-index-LP2WVSQX.js → knowledge-search-index-RZLIVWPJ.js} +5 -5
- package/dist/layout/index.js +7 -7
- package/dist/profile/index.d.ts +26 -0
- package/dist/provider/index.d.ts +28 -2
- package/dist/provider/index.js +4 -4
- package/dist/provider/published.d.ts +28 -2
- package/dist/provider/published.js +4 -4
- package/dist/supabase/index.d.ts +50 -0
- package/dist/test-utils/index.js +3 -3
- package/dist/types/index.d.ts +60 -4
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/index.js +1 -1
- package/package.json +5 -5
|
@@ -100,7 +100,7 @@ declare const OntologyScopeSchema: z.ZodDefault<z.ZodObject<{
|
|
|
100
100
|
aliases: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
101
101
|
route: z.ZodOptional<z.ZodString>;
|
|
102
102
|
}, z.core.$loose>>>>;
|
|
103
|
-
}, z.core.$
|
|
103
|
+
}, z.core.$strict>>;
|
|
104
104
|
type OntologyScope = z.infer<typeof OntologyScopeSchema>;
|
|
105
105
|
|
|
106
106
|
declare const SystemApiInterfaceSchema: z.ZodObject<{
|
|
@@ -241,6 +241,12 @@ interface ContentPipelineStepEntry {
|
|
|
241
241
|
* implements the step yet. See `ContentPipelineStepDeclarationSchema`.
|
|
242
242
|
*/
|
|
243
243
|
actionId?: string;
|
|
244
|
+
/**
|
|
245
|
+
* Per-step override of the pipeline's Workspace route. Absent on almost every
|
|
246
|
+
* step. Resolve it with `resolveContentWorkspaceRoute`, never by reading this
|
|
247
|
+
* field directly -- the fallback to the pipeline's route is the whole point.
|
|
248
|
+
*/
|
|
249
|
+
workspaceRoute?: string;
|
|
244
250
|
/** D17: the template-declared serializable field list for this step's payload. */
|
|
245
251
|
payloadFields: ContentPayloadFieldDeclaration[];
|
|
246
252
|
}
|
|
@@ -250,6 +256,12 @@ interface ContentPipelineTemplate {
|
|
|
250
256
|
label: string;
|
|
251
257
|
description?: string;
|
|
252
258
|
color?: string;
|
|
259
|
+
/**
|
|
260
|
+
* Route into the tenant's Workspace surface for this pipeline. Absent when the
|
|
261
|
+
* tenant has declared none, which is the case `ContentItemReviewPage`'s
|
|
262
|
+
* fallback action bar exists to serve. See `ContentWorkspaceRouteSchema`.
|
|
263
|
+
*/
|
|
264
|
+
workspaceRoute?: string;
|
|
253
265
|
steps: ContentPipelineStepEntry[];
|
|
254
266
|
}
|
|
255
267
|
/** One entry in a resolved `content-stage` catalog (status / pillar / platform), as returned by `getContentStageCatalog`. */
|
|
@@ -796,7 +808,7 @@ declare const OrganizationModelSchema: z.ZodObject<{
|
|
|
796
808
|
aliases: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
797
809
|
route: z.ZodOptional<z.ZodString>;
|
|
798
810
|
}, z.core.$loose>>>>;
|
|
799
|
-
}, z.core.$
|
|
811
|
+
}, z.core.$strict>>>;
|
|
800
812
|
resources: z.ZodDefault<z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
801
813
|
id: z.ZodString;
|
|
802
814
|
order: z.ZodDefault<z.ZodNumber>;
|
|
@@ -1266,9 +1278,13 @@ declare const ContentItemResponseSchema: z.ZodObject<{
|
|
|
1266
1278
|
status: z.ZodEnum<{
|
|
1267
1279
|
error: "error";
|
|
1268
1280
|
success: "success";
|
|
1281
|
+
running: "running";
|
|
1269
1282
|
no_result: "no_result";
|
|
1270
1283
|
skipped: "skipped";
|
|
1271
1284
|
}>;
|
|
1285
|
+
attemptId: z.ZodString;
|
|
1286
|
+
executionId: z.ZodNullable<z.ZodString>;
|
|
1287
|
+
attemptedAt: z.ZodString;
|
|
1272
1288
|
data: z.ZodOptional<z.ZodUnknown>;
|
|
1273
1289
|
}, z.core.$loose>>;
|
|
1274
1290
|
reviewedAt: z.ZodNullable<z.ZodString>;
|
|
@@ -1282,6 +1298,96 @@ declare const ContentItemResponseSchema: z.ZodObject<{
|
|
|
1282
1298
|
}, z.core.$strip>;
|
|
1283
1299
|
type ContentItemResponse = z.infer<typeof ContentItemResponseSchema>;
|
|
1284
1300
|
|
|
1301
|
+
/**
|
|
1302
|
+
* `deriveContentBoard` -- a pure function of `(items, pipeline, now)`. No React, no
|
|
1303
|
+
* hooks, no fetching. `content_items` has NO `step_key` column (only
|
|
1304
|
+
* `content_item_attempts` does), so an item's current step is derived from
|
|
1305
|
+
* `processingState`, whose declared shape is
|
|
1306
|
+
* `Record<stepKey, { status: 'running' | 'success' | 'no_result' | 'skipped' | 'error';
|
|
1307
|
+
* attemptId: string; executionId: string | null; attemptedAt: string; data?: unknown }>`.
|
|
1308
|
+
* `'running'` (added 2026-08-14, the step-state model) is the only in-flight value;
|
|
1309
|
+
* every other member is terminal.
|
|
1310
|
+
*
|
|
1311
|
+
* Placement rule (implemented exactly as follows):
|
|
1312
|
+
*
|
|
1313
|
+
* 1. Sort the pipeline's steps ascending by `order`. Ties break by `key` so the result
|
|
1314
|
+
* is deterministic.
|
|
1315
|
+
* 2. An item's current step is the first step in that order whose `processingState`
|
|
1316
|
+
* entry is missing, or present with a status other than `'success'`. Rationale:
|
|
1317
|
+
* `processingState` records what has run; a step recorded `'success'` is behind the
|
|
1318
|
+
* item -- `'running'` falls out of this rule unchanged: a step mid-flight is not
|
|
1319
|
+
* `'success'`, so it holds the item at that column exactly like `'error'` or
|
|
1320
|
+
* `'skipped'` already do.
|
|
1321
|
+
* 3. If every declared step has a `'success'` entry the item has finished the pipeline --
|
|
1322
|
+
* but it reaches `done` only once its review gate is cleared. When the LAST step
|
|
1323
|
+
* declares a `reviewMode` other than `'none'` and the item's `reviewedAt` is still
|
|
1324
|
+
* `null`, the item is held at that last step (`bucket: 'column'`) so the gate it has
|
|
1325
|
+
* not passed keeps counting it. Otherwise `stepKey` is `null` and the card goes in
|
|
1326
|
+
* `done`. Without the hold, a producer writing `'success'` on the final step removed
|
|
1327
|
+
* the item from every column and the gate's `waitingCount` dropped to zero with
|
|
1328
|
+
* nobody having reviewed anything -- `'success'` is the only status that advances an
|
|
1329
|
+
* item, so the gate could not survive its own producer completing.
|
|
1330
|
+
* 4. If `processingState` is empty (`{}`), the item sits at the first step -- nothing
|
|
1331
|
+
* has run yet.
|
|
1332
|
+
* 5. A card goes in `unplaced` only when `processingState` is non-empty AND none of its
|
|
1333
|
+
* keys appear in the catalog. This is the honest bucket for an item produced against
|
|
1334
|
+
* a step catalog that has since changed; unplaced items are never silently dropped
|
|
1335
|
+
* into column 1.
|
|
1336
|
+
*/
|
|
1337
|
+
interface ContentBoardCard {
|
|
1338
|
+
item: ContentItemResponse;
|
|
1339
|
+
/** Step key this item currently sits at. `null` when every declared step has succeeded. */
|
|
1340
|
+
stepKey: string | null;
|
|
1341
|
+
/** Milliseconds since `item.updatedAt`, measured against the `now` argument. */
|
|
1342
|
+
ageMs: number;
|
|
1343
|
+
/** True when this card is waiting on a person: its step's reviewMode is not 'none' and `reviewedAt` is null. */
|
|
1344
|
+
awaitingReview: boolean;
|
|
1345
|
+
}
|
|
1346
|
+
interface ContentBoardGate {
|
|
1347
|
+
/** The review mode of the step this gate follows. Never 'none' -- a 'none' step has no gate. */
|
|
1348
|
+
reviewMode: Exclude<ContentPipelineStepReviewMode, 'none'>;
|
|
1349
|
+
/** How many cards in the preceding column are awaiting review. */
|
|
1350
|
+
waitingCount: number;
|
|
1351
|
+
}
|
|
1352
|
+
interface ContentBoardColumn {
|
|
1353
|
+
step: ContentPipelineStepEntry;
|
|
1354
|
+
cards: ContentBoardCard[];
|
|
1355
|
+
/** Present when this step's reviewMode is 'live' or 'queued'. Absent on a 'none' step. */
|
|
1356
|
+
gate?: ContentBoardGate;
|
|
1357
|
+
}
|
|
1358
|
+
interface ContentBoard {
|
|
1359
|
+
columns: ContentBoardColumn[];
|
|
1360
|
+
/** Cards whose every declared step succeeded. */
|
|
1361
|
+
done: ContentBoardCard[];
|
|
1362
|
+
/** Cards whose processingState names only step keys the catalog does not declare. */
|
|
1363
|
+
unplaced: ContentBoardCard[];
|
|
1364
|
+
/** True when the pipeline declares 0 or 1 steps -- the consumer renders pick-then-review, not columns. */
|
|
1365
|
+
isCollapsed: boolean;
|
|
1366
|
+
}
|
|
1367
|
+
declare function deriveContentBoard(items: ContentItemResponse[], pipeline: ContentPipelineTemplate, now: number): ContentBoard;
|
|
1368
|
+
|
|
1369
|
+
/**
|
|
1370
|
+
* `getContentItemIdentity` -- a pure function that names a content item for display when
|
|
1371
|
+
* `title` cannot be trusted to do it. The tenant `nirvana-marketing`'s drafts have no
|
|
1372
|
+
* titles at all, so a title-first surface renders an empty or meaningless column. A
|
|
1373
|
+
* post's identity is its opening line.
|
|
1374
|
+
*
|
|
1375
|
+
* Resolution order, first non-empty wins:
|
|
1376
|
+
* 1. First non-blank line of `item.body`.
|
|
1377
|
+
* 2. The first string-valued field of `item.payload`, taken in `payloadFields`
|
|
1378
|
+
* declaration order when that argument is supplied, otherwise `Object.keys` order.
|
|
1379
|
+
* Only a non-blank string value counts.
|
|
1380
|
+
* 3. `item.title`, when non-blank.
|
|
1381
|
+
* 4. The literal `'Untitled'`.
|
|
1382
|
+
*
|
|
1383
|
+
* The resolved candidate is then normalized: runs of whitespace collapse to one space,
|
|
1384
|
+
* the result is trimmed, and anything longer than `maxLength` is truncated at the last
|
|
1385
|
+
* word boundary at or before `maxLength` with a trailing `'…'` -- never mid-word.
|
|
1386
|
+
* The source complaint this fixes is titles clipped mid-word
|
|
1387
|
+
* (`MOCK Pipeline Walk S…`).
|
|
1388
|
+
*/
|
|
1389
|
+
declare function getContentItemIdentity(item: Pick<ContentItemResponse, 'title' | 'body' | 'payload'>, payloadFields?: ContentPayloadFieldDeclaration[], maxLength?: number): string;
|
|
1390
|
+
|
|
1285
1391
|
type SystemSidebarComponent = ComponentType;
|
|
1286
1392
|
type SystemIconComponent = ComponentType<{
|
|
1287
1393
|
size?: number;
|
|
@@ -1351,7 +1457,7 @@ interface ContentPipelinesPageSlots {
|
|
|
1351
1457
|
*/
|
|
1352
1458
|
declare function ContentPipelinesPage({ headerActions }?: ContentPipelinesPageSlots): react_jsx_runtime.JSX.Element;
|
|
1353
1459
|
|
|
1354
|
-
interface
|
|
1460
|
+
interface ContentPipelineBoardPageSlots {
|
|
1355
1461
|
/** Optional content rendered after the page title. Default: nothing rendered. */
|
|
1356
1462
|
headerActions?: ReactNode;
|
|
1357
1463
|
}
|
|
@@ -1359,9 +1465,9 @@ interface ContentPipelineWorkspacePageSlots {
|
|
|
1359
1465
|
* Pipeline workspace -- tabbed via `?tab=`, matching how `LeadGenListDetailPage`
|
|
1360
1466
|
* (`../../../lead-gen/pages/list-detail/ListDetailPage.tsx`) already does it.
|
|
1361
1467
|
*/
|
|
1362
|
-
declare function
|
|
1468
|
+
declare function ContentPipelineBoardPage({ pipelineId, headerActions }: {
|
|
1363
1469
|
pipelineId: string;
|
|
1364
|
-
} &
|
|
1470
|
+
} & ContentPipelineBoardPageSlots): react_jsx_runtime.JSX.Element;
|
|
1365
1471
|
|
|
1366
1472
|
interface ContentDistributionsPageSlots {
|
|
1367
1473
|
/** Optional content rendered after the page title. Default: nothing rendered. */
|
|
@@ -1386,14 +1492,19 @@ interface ContentDistributionDetailPageSlots {
|
|
|
1386
1492
|
}
|
|
1387
1493
|
/**
|
|
1388
1494
|
* Distribution detail -- ported from `/acquisition/content/distribution/$distributionId`.
|
|
1389
|
-
*
|
|
1390
|
-
*
|
|
1391
|
-
*
|
|
1392
|
-
* `platformContent`, or `mediaUrls` and the PATCH route accepts all three plus the
|
|
1393
|
-
* general fields. Surfaces the four columns that have never been rendered anywhere:
|
|
1394
|
-
* `metrics`, `metricsUpdatedAt`, `publishMethod`, `platformPostId` -- `publishMethod` is
|
|
1395
|
-
* where D7's manual-publish state becomes visible (a row with `publishedAt` set and no
|
|
1495
|
+
* Surfaces the four columns that have never been rendered anywhere: `metrics`,
|
|
1496
|
+
* `metricsUpdatedAt`, `publishMethod`, `platformPostId` -- `publishMethod` is where D7's
|
|
1497
|
+
* manual-publish state becomes visible (a row with `publishedAt` set and no
|
|
1396
1498
|
* `platformPostId`).
|
|
1499
|
+
*
|
|
1500
|
+
* **Display-only.** This page used to be an editor: status, platform URL, checklist,
|
|
1501
|
+
* platform content, and media delete all wrote through `useUpdateContentDistribution`.
|
|
1502
|
+
* Every one of those was removed when the content System split its UI -- tenants own the
|
|
1503
|
+
* surfaces where content is operated on, the platform owns the surfaces where it is
|
|
1504
|
+
* observed, and a distribution page is an observation. `useUpdateContentDistribution` is
|
|
1505
|
+
* still exported for tenants that want to build their own editing screen; nothing shared
|
|
1506
|
+
* calls it. Do not reintroduce a write here -- the absence is the contract, and it is the
|
|
1507
|
+
* same absence that keeps `reviewItem` out of `ContentToolMap`.
|
|
1397
1508
|
*/
|
|
1398
1509
|
declare function ContentDistributionDetailPage({ distributionId, headerActions }: {
|
|
1399
1510
|
distributionId: string;
|
|
@@ -1414,8 +1525,15 @@ interface ContentPageOverrides {
|
|
|
1414
1525
|
itemReview?: ContentItemReviewPageSlots;
|
|
1415
1526
|
/** Slot props injected into `ContentPipelinesPage`. */
|
|
1416
1527
|
pipelines?: ContentPipelinesPageSlots;
|
|
1417
|
-
/**
|
|
1418
|
-
|
|
1528
|
+
/**
|
|
1529
|
+
* Slot props injected into `ContentPipelineBoardPage`.
|
|
1530
|
+
*
|
|
1531
|
+
* The key stays `pipelineWorkspace` although the page it points at was renamed to
|
|
1532
|
+
* Board on 2026-08-15 (Decision 6). It is part of the published manifest surface, so
|
|
1533
|
+
* renaming it is a second breaking change on the same minor, and unlike the page name
|
|
1534
|
+
* this one is never read by anyone looking at a sidebar. Revisit on a later minor.
|
|
1535
|
+
*/
|
|
1536
|
+
pipelineWorkspace?: ContentPipelineBoardPageSlots;
|
|
1419
1537
|
}
|
|
1420
1538
|
/**
|
|
1421
1539
|
* Extended `SystemModule` for the content feature that carries optional page overrides
|
|
@@ -1582,6 +1700,14 @@ interface ContentReviewAction {
|
|
|
1582
1700
|
* a one-click irreversible action.
|
|
1583
1701
|
*/
|
|
1584
1702
|
consequence?: 'standard' | 'irreversible';
|
|
1703
|
+
/**
|
|
1704
|
+
* Disables this action's button -- e.g. the item has no open review gate to clear.
|
|
1705
|
+
* Renders inert rather than firing a call that the server rejects. Pair with
|
|
1706
|
+
* `disabledReason` so the reviewer sees why, not just a greyed-out button.
|
|
1707
|
+
*/
|
|
1708
|
+
disabled?: boolean;
|
|
1709
|
+
/** Shown in a Tooltip over the button while `disabled` is true. */
|
|
1710
|
+
disabledReason?: string;
|
|
1585
1711
|
}
|
|
1586
1712
|
interface ReviewActionBarProps {
|
|
1587
1713
|
/**
|
|
@@ -1663,6 +1789,15 @@ interface ContentReviewCardProps {
|
|
|
1663
1789
|
onAction: (actionId: string, feedback?: string) => void;
|
|
1664
1790
|
/** True while a submitted action is in flight. Disables the action bar and the body. */
|
|
1665
1791
|
actionsPending?: boolean;
|
|
1792
|
+
/**
|
|
1793
|
+
* Render the piece without any way to change it: the body is not editable and the
|
|
1794
|
+
* alternates panel is hidden, since picking an alternate rewrites the body. Distinct
|
|
1795
|
+
* from `actionsPending`, which is a transient in-flight disable -- this one is a
|
|
1796
|
+
* statement about who owns editing. Used by the shared review page when the pipeline
|
|
1797
|
+
* declares a `workspaceRoute`, so the tenant's own screen is the only place the piece
|
|
1798
|
+
* can be changed.
|
|
1799
|
+
*/
|
|
1800
|
+
readOnly?: boolean;
|
|
1666
1801
|
}
|
|
1667
1802
|
/**
|
|
1668
1803
|
* The generic content review card. Generalizes three things that exist separately
|
|
@@ -1670,7 +1805,7 @@ interface ContentReviewCardProps {
|
|
|
1670
1805
|
* nirvana's `DraftCard`, and the attempt-lineage / processing-state surfaces that had
|
|
1671
1806
|
* no reader at all. Keyed off `reviewMode` rather than any tenant-specific vocabulary.
|
|
1672
1807
|
*/
|
|
1673
|
-
declare function ContentReviewCard({ title, body, onBodyChange, originalBody, onReset, payload, payloadFields, fidelity, checkFirst, hookOptions, closeOptions, onMoreHooks, onMoreCloses, alternatesRunning, alternatesElapsed, processingSteps, actions, onAction, actionsPending }: ContentReviewCardProps): react_jsx_runtime.JSX.Element;
|
|
1808
|
+
declare function ContentReviewCard({ title, body, onBodyChange, originalBody, onReset, payload, payloadFields, fidelity, checkFirst, hookOptions, closeOptions, onMoreHooks, onMoreCloses, alternatesRunning, alternatesElapsed, processingSteps, actions, onAction, actionsPending, readOnly }: ContentReviewCardProps): react_jsx_runtime.JSX.Element;
|
|
1674
1809
|
|
|
1675
1810
|
/** A single tenant-facing noun with singular and plural forms, e.g. `{ singular: 'Post', plural: 'Posts' }`. */
|
|
1676
1811
|
interface ContentNoun {
|
|
@@ -1785,84 +1920,6 @@ interface ContentConfig {
|
|
|
1785
1920
|
*/
|
|
1786
1921
|
declare function useContentConfig(): ContentConfig;
|
|
1787
1922
|
|
|
1788
|
-
/**
|
|
1789
|
-
* `deriveContentBoard` -- a pure function of `(items, pipeline, now)`. No React, no
|
|
1790
|
-
* hooks, no fetching. `content_items` has NO `step_key` column (only
|
|
1791
|
-
* `content_item_attempts` does), so an item's current step is derived from
|
|
1792
|
-
* `processingState`, whose declared shape is
|
|
1793
|
-
* `Record<stepKey, { status: 'success' | 'no_result' | 'skipped' | 'error'; data?: unknown }>`.
|
|
1794
|
-
*
|
|
1795
|
-
* Placement rule (implemented exactly as follows):
|
|
1796
|
-
*
|
|
1797
|
-
* 1. Sort the pipeline's steps ascending by `order`. Ties break by `key` so the result
|
|
1798
|
-
* is deterministic.
|
|
1799
|
-
* 2. An item's current step is the first step in that order whose `processingState`
|
|
1800
|
-
* entry is missing, or present with a status other than `'success'`. Rationale:
|
|
1801
|
-
* `processingState` records what has run; a step recorded `'success'` is behind the
|
|
1802
|
-
* item.
|
|
1803
|
-
* 3. If every declared step has a `'success'` entry, `stepKey` is `null` and the card
|
|
1804
|
-
* goes in `done`.
|
|
1805
|
-
* 4. If `processingState` is empty (`{}`), the item sits at the first step -- nothing
|
|
1806
|
-
* has run yet.
|
|
1807
|
-
* 5. A card goes in `unplaced` only when `processingState` is non-empty AND none of its
|
|
1808
|
-
* keys appear in the catalog. This is the honest bucket for an item produced against
|
|
1809
|
-
* a step catalog that has since changed; unplaced items are never silently dropped
|
|
1810
|
-
* into column 1.
|
|
1811
|
-
*/
|
|
1812
|
-
interface ContentBoardCard {
|
|
1813
|
-
item: ContentItemResponse;
|
|
1814
|
-
/** Step key this item currently sits at. `null` when every declared step has succeeded. */
|
|
1815
|
-
stepKey: string | null;
|
|
1816
|
-
/** Milliseconds since `item.updatedAt`, measured against the `now` argument. */
|
|
1817
|
-
ageMs: number;
|
|
1818
|
-
/** True when this card is waiting on a person: its step's reviewMode is not 'none' and `reviewedAt` is null. */
|
|
1819
|
-
awaitingReview: boolean;
|
|
1820
|
-
}
|
|
1821
|
-
interface ContentBoardGate {
|
|
1822
|
-
/** The review mode of the step this gate follows. Never 'none' -- a 'none' step has no gate. */
|
|
1823
|
-
reviewMode: Exclude<ContentPipelineStepReviewMode, 'none'>;
|
|
1824
|
-
/** How many cards in the preceding column are awaiting review. */
|
|
1825
|
-
waitingCount: number;
|
|
1826
|
-
}
|
|
1827
|
-
interface ContentBoardColumn {
|
|
1828
|
-
step: ContentPipelineStepEntry;
|
|
1829
|
-
cards: ContentBoardCard[];
|
|
1830
|
-
/** Present when this step's reviewMode is 'live' or 'queued'. Absent on a 'none' step. */
|
|
1831
|
-
gate?: ContentBoardGate;
|
|
1832
|
-
}
|
|
1833
|
-
interface ContentBoard {
|
|
1834
|
-
columns: ContentBoardColumn[];
|
|
1835
|
-
/** Cards whose every declared step succeeded. */
|
|
1836
|
-
done: ContentBoardCard[];
|
|
1837
|
-
/** Cards whose processingState names only step keys the catalog does not declare. */
|
|
1838
|
-
unplaced: ContentBoardCard[];
|
|
1839
|
-
/** True when the pipeline declares 0 or 1 steps -- the consumer renders pick-then-review, not columns. */
|
|
1840
|
-
isCollapsed: boolean;
|
|
1841
|
-
}
|
|
1842
|
-
declare function deriveContentBoard(items: ContentItemResponse[], pipeline: ContentPipelineTemplate, now: number): ContentBoard;
|
|
1843
|
-
|
|
1844
|
-
/**
|
|
1845
|
-
* `getContentItemIdentity` -- a pure function that names a content item for display when
|
|
1846
|
-
* `title` cannot be trusted to do it. The tenant `nirvana-marketing`'s drafts have no
|
|
1847
|
-
* titles at all, so a title-first surface renders an empty or meaningless column. A
|
|
1848
|
-
* post's identity is its opening line.
|
|
1849
|
-
*
|
|
1850
|
-
* Resolution order, first non-empty wins:
|
|
1851
|
-
* 1. First non-blank line of `item.body`.
|
|
1852
|
-
* 2. The first string-valued field of `item.payload`, taken in `payloadFields`
|
|
1853
|
-
* declaration order when that argument is supplied, otherwise `Object.keys` order.
|
|
1854
|
-
* Only a non-blank string value counts.
|
|
1855
|
-
* 3. `item.title`, when non-blank.
|
|
1856
|
-
* 4. The literal `'Untitled'`.
|
|
1857
|
-
*
|
|
1858
|
-
* The resolved candidate is then normalized: runs of whitespace collapse to one space,
|
|
1859
|
-
* the result is trimmed, and anything longer than `maxLength` is truncated at the last
|
|
1860
|
-
* word boundary at or before `maxLength` with a trailing `'…'` -- never mid-word.
|
|
1861
|
-
* The source complaint this fixes is titles clipped mid-word
|
|
1862
|
-
* (`MOCK Pipeline Walk S…`).
|
|
1863
|
-
*/
|
|
1864
|
-
declare function getContentItemIdentity(item: Pick<ContentItemResponse, 'title' | 'body' | 'payload'>, payloadFields?: ContentPayloadFieldDeclaration[], maxLength?: number): string;
|
|
1865
|
-
|
|
1866
1923
|
/**
|
|
1867
1924
|
* Shared nav-item shape used by feature sidebar middle components.
|
|
1868
1925
|
*
|
|
@@ -1897,19 +1954,25 @@ interface NavItem {
|
|
|
1897
1954
|
|
|
1898
1955
|
interface ContentSidebarProps {
|
|
1899
1956
|
/**
|
|
1900
|
-
* Tenant-authored
|
|
1957
|
+
* Tenant-authored operating surfaces for the `Workspace` section, forwarded to
|
|
1901
1958
|
* `ContentSidebarMiddle`. Ignored when `children` is supplied, since that replaces the
|
|
1902
|
-
* middle outright. This is the one-line path for a tenant adding its own
|
|
1959
|
+
* middle outright. This is the one-line path for a tenant adding its own screen:
|
|
1903
1960
|
*
|
|
1904
1961
|
* ```tsx
|
|
1905
|
-
* const sidebar = () => <ContentSidebar
|
|
1962
|
+
* const sidebar = () => <ContentSidebar workspaceItems={[{ label: 'Draft a Post', to: '/content/write', icon: IconPencil, exact: false }]} />
|
|
1906
1963
|
* ```
|
|
1907
1964
|
*/
|
|
1965
|
+
workspaceItems?: NavItem[];
|
|
1966
|
+
/**
|
|
1967
|
+
* @deprecated Renamed to {@link ContentSidebarProps.workspaceItems}. Kept as an alias
|
|
1968
|
+
* for one minor so the rename is non-breaking for tenants; `workspaceItems` wins when
|
|
1969
|
+
* both are passed.
|
|
1970
|
+
*/
|
|
1908
1971
|
createItems?: NavItem[];
|
|
1909
1972
|
/** Replace the default `ContentSidebarMiddle` with custom middle content. Leave unset for the default layout. */
|
|
1910
1973
|
children?: ReactNode;
|
|
1911
1974
|
}
|
|
1912
|
-
declare const ContentSidebar: ({ createItems, children }?: ContentSidebarProps) => react_jsx_runtime.JSX.Element;
|
|
1975
|
+
declare const ContentSidebar: ({ workspaceItems, createItems, children }?: ContentSidebarProps) => react_jsx_runtime.JSX.Element;
|
|
1913
1976
|
|
|
1914
1977
|
/**
|
|
1915
1978
|
* Static two-entry default, built from {@link DEFAULT_CONTENT_VOCABULARY}. Exists for
|
|
@@ -1920,14 +1983,21 @@ declare const ContentSidebar: ({ createItems, children }?: ContentSidebarProps)
|
|
|
1920
1983
|
declare const CONTENT_ITEMS: NavItem[];
|
|
1921
1984
|
interface ContentSidebarMiddleProps {
|
|
1922
1985
|
/**
|
|
1923
|
-
* Tenant-authored
|
|
1924
|
-
* pipeline nav. Empty or omitted -> the section renders its "nothing declared"
|
|
1925
|
-
* instead of nav entries; the section header itself is always present.
|
|
1986
|
+
* Tenant-authored operating surfaces, rendered under the `Workspace` section above
|
|
1987
|
+
* the pipeline nav. Empty or omitted -> the section renders its "nothing declared"
|
|
1988
|
+
* hint instead of nav entries; the section header itself is always present.
|
|
1926
1989
|
*
|
|
1927
|
-
* This is the seam for a tenant
|
|
1928
|
-
*
|
|
1929
|
-
* pipeline entries. Prefer this over {@link ContentSidebarMiddleProps.items},
|
|
1930
|
-
* replaces the pipeline list wholesale and stops tracking the tenant's vocabulary.
|
|
1990
|
+
* This is the seam for the screens where a tenant *operates* on content -- creating
|
|
1991
|
+
* it and clearing its review gates, which may well be one screen -- without having to
|
|
1992
|
+
* restate the pipeline entries. Prefer this over {@link ContentSidebarMiddleProps.items},
|
|
1993
|
+
* which replaces the pipeline list wholesale and stops tracking the tenant's vocabulary.
|
|
1994
|
+
*/
|
|
1995
|
+
workspaceItems?: NavItem[];
|
|
1996
|
+
/**
|
|
1997
|
+
* @deprecated Renamed to {@link ContentSidebarMiddleProps.workspaceItems}. Kept as an
|
|
1998
|
+
* alias for one minor so the rename is non-breaking for tenants; `workspaceItems` wins
|
|
1999
|
+
* when both are passed. The prop was named for a section that only held authoring, and
|
|
2000
|
+
* that section now holds review too.
|
|
1931
2001
|
*/
|
|
1932
2002
|
createItems?: NavItem[];
|
|
1933
2003
|
/** Override the pipeline nav items. Defaults to the two-entry nav built from the tenant's declared vocabulary. */
|
|
@@ -1936,22 +2006,26 @@ interface ContentSidebarMiddleProps {
|
|
|
1936
2006
|
/**
|
|
1937
2007
|
* The content subshell nav, in two labeled sections.
|
|
1938
2008
|
*
|
|
1939
|
-
* `
|
|
1940
|
-
* where it
|
|
1941
|
-
* tenant-specific by nature (every tenant writes a
|
|
1942
|
-
* different
|
|
1943
|
-
*
|
|
2009
|
+
* `Workspace` sits on top and is where content is *operated on* -- both made and
|
|
2010
|
+
* signed off; the pipeline section below is where it is *observed*. The split exists
|
|
2011
|
+
* because operating on content is tenant-specific by nature (every tenant writes a
|
|
2012
|
+
* different kind of thing, and reviews it against different criteria, through
|
|
2013
|
+
* different screens) while the pipeline underneath is the same shared system for all
|
|
2014
|
+
* of them.
|
|
2015
|
+
*
|
|
2016
|
+
* The section was called `Create` until 2026-08-15. It was renamed because clearing a
|
|
2017
|
+
* review gate is not creation, and the tenant screen that does one usually does both.
|
|
1944
2018
|
*
|
|
1945
2019
|
* **Both section labels are fixed platform vocabulary, not tenant-declared.** The nav
|
|
1946
2020
|
* entries inside them still are — a tenant that renames its pipelines to "Campaigns"
|
|
1947
2021
|
* gets `Content Pipeline > Campaigns`. The sections name the two halves of the System
|
|
1948
2022
|
* itself, which every tenant has; only what they contain varies.
|
|
1949
2023
|
*
|
|
1950
|
-
* There is deliberately no section header above `
|
|
2024
|
+
* There is deliberately no section header above `Workspace`: the subshell is already
|
|
1951
2025
|
* reached through the `Content` nav entry, so a third `Content` header only repeated
|
|
1952
2026
|
* what the breadcrumb and the left rail both already say.
|
|
1953
2027
|
*/
|
|
1954
|
-
declare const ContentSidebarMiddle: ({ createItems, items }?: ContentSidebarMiddleProps) => react_jsx_runtime.JSX.Element;
|
|
2028
|
+
declare const ContentSidebarMiddle: ({ workspaceItems, createItems, items }?: ContentSidebarMiddleProps) => react_jsx_runtime.JSX.Element;
|
|
1955
2029
|
|
|
1956
2030
|
interface MyReviewQueuePanelProps {
|
|
1957
2031
|
onItemClick: (itemId: string) => void;
|
|
@@ -1974,5 +2048,5 @@ interface MyReviewQueuePanelProps {
|
|
|
1974
2048
|
*/
|
|
1975
2049
|
declare function MyReviewQueuePanel({ onItemClick, onSeeAll, showSectionLabel }: MyReviewQueuePanelProps): react_jsx_runtime.JSX.Element;
|
|
1976
2050
|
|
|
1977
|
-
export { AlternatesPanel, CONTENT_ITEMS, ContentDistributionDetailPage, ContentDistributionsPage, ContentItemReviewPage, ContentItemsPage, ContentOverviewPage, ContentPipelineWorkspacePage, ContentPipelinesPage, ContentReviewCard, ContentSidebar, ContentSidebarMiddle, DEFAULT_CONTENT_VOCABULARY, MyReviewQueuePanel, PayloadBody, ProcessingStateStrip, ReviewActionBar, contentManifest, deriveContentBoard, firstLine, formatElapsed, getContentItemIdentity, lastLine, resolveContentStepResource, resolveContentVocabulary, swapFirstLine, swapLastLine, useContentConfig };
|
|
1978
|
-
export type { AlternatesPanelProps, ContentAlternateOption, ContentBoard, ContentBoardCard, ContentBoardColumn, ContentBoardGate, ContentConfig, ContentDistributionDetailPageSlots, ContentDistributionsPageSlots, ContentFidelityCheck, ContentItemReviewPageSlots, ContentItemsPageSlots, ContentNoun, ContentOverviewPageSlots, ContentPayloadField, ContentPipelineWorkspacePageSlots, ContentPipelinesPageSlots, ContentProcessingStatus, ContentProcessingStep, ContentReviewAction, ContentReviewCardProps, ContentSidebarMiddleProps, ContentSidebarProps, ContentStepResourceBinding, ContentVocabulary, MyReviewQueuePanelProps, PayloadBodyProps, ProcessingStateStripProps, ReviewActionBarProps, ReviewMode };
|
|
2051
|
+
export { AlternatesPanel, CONTENT_ITEMS, ContentDistributionDetailPage, ContentDistributionsPage, ContentItemReviewPage, ContentItemsPage, ContentOverviewPage, ContentPipelineBoardPage, ContentPipelineBoardPage as ContentPipelineWorkspacePage, ContentPipelinesPage, ContentReviewCard, ContentSidebar, ContentSidebarMiddle, DEFAULT_CONTENT_VOCABULARY, MyReviewQueuePanel, PayloadBody, ProcessingStateStrip, ReviewActionBar, contentManifest, deriveContentBoard, firstLine, formatElapsed, getContentItemIdentity, lastLine, resolveContentStepResource, resolveContentVocabulary, swapFirstLine, swapLastLine, useContentConfig };
|
|
2052
|
+
export type { AlternatesPanelProps, ContentAlternateOption, ContentBoard, ContentBoardCard, ContentBoardColumn, ContentBoardGate, ContentConfig, ContentDistributionDetailPageSlots, ContentDistributionsPageSlots, ContentFidelityCheck, ContentItemReviewPageSlots, ContentItemsPageSlots, ContentNoun, ContentOverviewPageSlots, ContentPayloadField, ContentPipelineBoardPageSlots, ContentPipelineBoardPageSlots as ContentPipelineWorkspacePageSlots, ContentPipelinesPageSlots, ContentProcessingStatus, ContentProcessingStep, ContentReviewAction, ContentReviewCardProps, ContentSidebarMiddleProps, ContentSidebarProps, ContentStepResourceBinding, ContentVocabulary, MyReviewQueuePanelProps, PayloadBodyProps, ProcessingStateStripProps, ReviewActionBarProps, ReviewMode };
|