@deskwork/studio 0.14.1 → 0.16.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/components/scrapbook-item.d.ts +20 -0
- package/dist/components/scrapbook-item.d.ts.map +1 -1
- package/dist/components/scrapbook-item.js +21 -2
- package/dist/components/scrapbook-item.js.map +1 -1
- package/dist/pages/dashboard/affordances.d.ts.map +1 -1
- package/dist/pages/dashboard/affordances.js +13 -1
- package/dist/pages/dashboard/affordances.js.map +1 -1
- package/dist/pages/dashboard/affordances.ts +13 -1
- package/dist/pages/dashboard/press-queue.d.ts +16 -0
- package/dist/pages/dashboard/press-queue.d.ts.map +1 -0
- package/dist/pages/dashboard/press-queue.js +91 -0
- package/dist/pages/dashboard/press-queue.js.map +1 -0
- package/dist/pages/dashboard/press-queue.ts +112 -0
- package/dist/pages/dashboard.d.ts.map +1 -1
- package/dist/pages/dashboard.js +2 -0
- package/dist/pages/dashboard.js.map +1 -1
- package/dist/pages/dashboard.ts +2 -0
- package/dist/pages/entry-review/decision-strip.d.ts.map +1 -1
- package/dist/pages/entry-review/decision-strip.js +10 -2
- package/dist/pages/entry-review/decision-strip.js.map +1 -1
- package/dist/pages/entry-review/index.d.ts.map +1 -1
- package/dist/pages/entry-review/index.js +7 -4
- package/dist/pages/entry-review/index.js.map +1 -1
- package/dist/pages/help.js +11 -11
- package/dist/pages/help.js.map +1 -1
- package/dist/pages/help.ts +11 -11
- package/dist/pages/review-scrapbook-drawer.d.ts.map +1 -1
- package/dist/pages/review-scrapbook-drawer.js +10 -1
- package/dist/pages/review-scrapbook-drawer.js.map +1 -1
- package/dist/pages/review-scrapbook-drawer.ts +11 -1
- package/dist/pages/scrapbook/dispatch.d.ts +50 -0
- package/dist/pages/scrapbook/dispatch.d.ts.map +1 -0
- package/dist/pages/scrapbook/dispatch.js +104 -0
- package/dist/pages/scrapbook/dispatch.js.map +1 -0
- package/dist/pages/scrapbook/image-readers.d.ts +24 -0
- package/dist/pages/scrapbook/image-readers.d.ts.map +1 -0
- package/dist/pages/scrapbook/image-readers.js +135 -0
- package/dist/pages/scrapbook/image-readers.js.map +1 -0
- package/dist/pages/scrapbook/index.d.ts +21 -0
- package/dist/pages/scrapbook/index.d.ts.map +1 -0
- package/dist/pages/scrapbook/index.js +96 -0
- package/dist/pages/scrapbook/index.js.map +1 -0
- package/dist/pages/scrapbook/render.d.ts +68 -0
- package/dist/pages/scrapbook/render.d.ts.map +1 -0
- package/dist/pages/scrapbook/render.js +315 -0
- package/dist/pages/scrapbook/render.js.map +1 -0
- package/dist/pages/scrapbook/text-helpers.d.ts +40 -0
- package/dist/pages/scrapbook/text-helpers.d.ts.map +1 -0
- package/dist/pages/scrapbook/text-helpers.js +92 -0
- package/dist/pages/scrapbook/text-helpers.js.map +1 -0
- package/dist/pages/scrapbook/types.d.ts +26 -0
- package/dist/pages/scrapbook/types.d.ts.map +1 -0
- package/dist/pages/scrapbook/types.js +12 -0
- package/dist/pages/scrapbook/types.js.map +1 -0
- package/dist/pages/scrapbook.d.ts +8 -8
- package/dist/pages/scrapbook.d.ts.map +1 -1
- package/dist/pages/scrapbook.js +8 -600
- package/dist/pages/scrapbook.js.map +1 -1
- package/dist/pages/scrapbook.ts +11 -660
- package/dist/routes/api.d.ts.map +1 -1
- package/dist/routes/api.js +102 -140
- package/dist/routes/api.js.map +1 -1
- package/dist/routes/entry-annotation-body.d.ts +29 -0
- package/dist/routes/entry-annotation-body.d.ts.map +1 -1
- package/dist/routes/entry-annotation-body.js +80 -0
- package/dist/routes/entry-annotation-body.js.map +1 -1
- package/dist/routes/scrapbook-file.d.ts +17 -9
- package/dist/routes/scrapbook-file.d.ts.map +1 -1
- package/dist/routes/scrapbook-file.js +48 -15
- package/dist/routes/scrapbook-file.js.map +1 -1
- package/dist/routes/scrapbook-mutation-dispatch.d.ts +29 -0
- package/dist/routes/scrapbook-mutation-dispatch.d.ts.map +1 -0
- package/dist/routes/scrapbook-mutation-dispatch.js +63 -0
- package/dist/routes/scrapbook-mutation-dispatch.js.map +1 -0
- package/dist/routes/scrapbook-mutation-envelope.d.ts +93 -0
- package/dist/routes/scrapbook-mutation-envelope.d.ts.map +1 -0
- package/dist/routes/scrapbook-mutation-envelope.js +147 -0
- package/dist/routes/scrapbook-mutation-envelope.js.map +1 -0
- package/dist/routes/scrapbook-mutations.d.ts +25 -7
- package/dist/routes/scrapbook-mutations.d.ts.map +1 -1
- package/dist/routes/scrapbook-mutations.js +67 -92
- package/dist/routes/scrapbook-mutations.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +16 -2
- package/dist/server.js.map +1 -1
- package/package.json +2 -2
|
@@ -52,6 +52,16 @@ export interface ScrapbookAddress {
|
|
|
52
52
|
* viewer uses in its URL.
|
|
53
53
|
*/
|
|
54
54
|
path: string;
|
|
55
|
+
/**
|
|
56
|
+
* Optional UUID of the calendar entry whose scrapbook this addresses.
|
|
57
|
+
* When present, the standalone-viewer URL appends `?entryId=<uuid>` so
|
|
58
|
+
* the server resolves the listing via `scrapbookDirForEntry` —
|
|
59
|
+
* symmetric to the mutation API's entry-aware addressing (#191/#205).
|
|
60
|
+
*
|
|
61
|
+
* Falls back to slug-template addressing when absent (legacy callers
|
|
62
|
+
* and ad-hoc / organizational paths that aren't tracked entries).
|
|
63
|
+
*/
|
|
64
|
+
entryId?: string;
|
|
55
65
|
}
|
|
56
66
|
/**
|
|
57
67
|
* Read the first slice of a text/JSON scrapbook file for inline
|
|
@@ -79,6 +89,11 @@ export interface ScrapbookItemRendererOptions {
|
|
|
79
89
|
* read-only binary endpoint. The endpoint is read-only by design —
|
|
80
90
|
* Phase 16's image / PDF previews need a stable URL, but full
|
|
81
91
|
* scrapbook CRUD remains in the standalone viewer's surface.
|
|
92
|
+
*
|
|
93
|
+
* When `address.entryId` is present, sends `entryId=<uuid>` so the
|
|
94
|
+
* server resolves via the entry's sidecar (entry-aware addressing —
|
|
95
|
+
* #205, symmetric to the mutation API). Slug-template addressing
|
|
96
|
+
* (`path=`) is the fallback when no entry id is available.
|
|
82
97
|
*/
|
|
83
98
|
export declare function scrapbookFileUrl(address: ScrapbookAddress, filename: string, opts?: {
|
|
84
99
|
secret?: boolean;
|
|
@@ -86,6 +101,11 @@ export declare function scrapbookFileUrl(address: ScrapbookAddress, filename: st
|
|
|
86
101
|
/**
|
|
87
102
|
* Build the URL to the standalone scrapbook viewer for an address —
|
|
88
103
|
* the operator's "open scrapbook" jumping-off point.
|
|
104
|
+
*
|
|
105
|
+
* When `address.entryId` is present, appends `?entryId=<uuid>` so the
|
|
106
|
+
* server route resolves the listing via `scrapbookDirForEntry`
|
|
107
|
+
* (entry-aware addressing — #205). Slug-only fallback is preserved
|
|
108
|
+
* when no entry id is available.
|
|
89
109
|
*/
|
|
90
110
|
export declare function scrapbookViewerUrl(address: ScrapbookAddress): string;
|
|
91
111
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scrapbook-item.d.ts","sourceRoot":"","sources":["../../src/components/scrapbook-item.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAEH,OAAO,EAGL,KAAK,aAAa,EAEnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAgB,KAAK,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAM9D,gDAAgD;AAChD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,IAAI,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"scrapbook-item.d.ts","sourceRoot":"","sources":["../../src/components/scrapbook-item.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAEH,OAAO,EAGL,KAAK,aAAa,EAEnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAgB,KAAK,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAM9D,gDAAgD;AAChD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,IAAI,EAAE,MAAM,CAAC;IACb;;;;;;;;OAQG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAC7B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,KACb,MAAM,GAAG,IAAI,CAAC;AAEnB,MAAM,WAAW,4BAA4B;IAC3C;;;;OAIG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,gBAAgB,CAAC;CACxC;AASD;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,gBAAgB,EACzB,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GAC9B,MAAM,CAYR;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAQpE;AA+DD;;;;;;;;;GASG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,gBAAgB,EACzB,IAAI,EAAE,aAAa,EACnB,IAAI,GAAE,4BAAiC,GACtC,OAAO,CA8DT;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAMT"}
|
|
@@ -53,13 +53,23 @@ const TEXT_PREVIEW_LINES = 8;
|
|
|
53
53
|
* read-only binary endpoint. The endpoint is read-only by design —
|
|
54
54
|
* Phase 16's image / PDF previews need a stable URL, but full
|
|
55
55
|
* scrapbook CRUD remains in the standalone viewer's surface.
|
|
56
|
+
*
|
|
57
|
+
* When `address.entryId` is present, sends `entryId=<uuid>` so the
|
|
58
|
+
* server resolves via the entry's sidecar (entry-aware addressing —
|
|
59
|
+
* #205, symmetric to the mutation API). Slug-template addressing
|
|
60
|
+
* (`path=`) is the fallback when no entry id is available.
|
|
56
61
|
*/
|
|
57
62
|
export function scrapbookFileUrl(address, filename, opts = {}) {
|
|
58
63
|
const params = new URLSearchParams({
|
|
59
64
|
site: address.site,
|
|
60
|
-
path: address.path,
|
|
61
65
|
name: filename,
|
|
62
66
|
});
|
|
67
|
+
if (address.entryId !== undefined && address.entryId.length > 0) {
|
|
68
|
+
params.set('entryId', address.entryId);
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
params.set('path', address.path);
|
|
72
|
+
}
|
|
63
73
|
if (opts.secret)
|
|
64
74
|
params.set('secret', '1');
|
|
65
75
|
return `/api/dev/scrapbook-file?${params.toString()}`;
|
|
@@ -67,11 +77,20 @@ export function scrapbookFileUrl(address, filename, opts = {}) {
|
|
|
67
77
|
/**
|
|
68
78
|
* Build the URL to the standalone scrapbook viewer for an address —
|
|
69
79
|
* the operator's "open scrapbook" jumping-off point.
|
|
80
|
+
*
|
|
81
|
+
* When `address.entryId` is present, appends `?entryId=<uuid>` so the
|
|
82
|
+
* server route resolves the listing via `scrapbookDirForEntry`
|
|
83
|
+
* (entry-aware addressing — #205). Slug-only fallback is preserved
|
|
84
|
+
* when no entry id is available.
|
|
70
85
|
*/
|
|
71
86
|
export function scrapbookViewerUrl(address) {
|
|
72
87
|
// The path is already kebab-case + slash-separated; encodeURI keeps
|
|
73
88
|
// the slashes literal while escaping anything else (defensive).
|
|
74
|
-
|
|
89
|
+
const base = `/dev/scrapbook/${address.site}/${encodeURI(address.path)}`;
|
|
90
|
+
if (address.entryId !== undefined && address.entryId.length > 0) {
|
|
91
|
+
return `${base}?entryId=${encodeURIComponent(address.entryId)}`;
|
|
92
|
+
}
|
|
93
|
+
return base;
|
|
75
94
|
}
|
|
76
95
|
// ---------------------------------------------------------------------------
|
|
77
96
|
// Per-kind preview detection
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scrapbook-item.js","sourceRoot":"","sources":["../../src/components/scrapbook-item.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAEH,OAAO,EACL,kBAAkB,EAClB,UAAU,GAGX,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAgB,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"scrapbook-item.js","sourceRoot":"","sources":["../../src/components/scrapbook-item.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"affordances.d.ts","sourceRoot":"","sources":["../../../src/pages/dashboard/affordances.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAgB,KAAK,OAAO,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"affordances.d.ts","sourceRoot":"","sources":["../../../src/pages/dashboard/affordances.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAgB,KAAK,OAAO,EAAE,MAAM,YAAY,CAAC;AAExD,OAAO,KAAK,EAAE,KAAK,EAAS,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAQ7E;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,WAAW,GAAG,SAAS,GAAG,OAAO,CAK9E;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAE7D;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAkD3E"}
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
* universal-verb skills are the canonical action path.
|
|
9
9
|
*/
|
|
10
10
|
import { html, unsafe } from "../html.js";
|
|
11
|
+
import { scrapbookViewerUrl } from "../../components/scrapbook-item.js";
|
|
11
12
|
const REVIEW_STATE_LABEL = {
|
|
12
13
|
'in-review': 'in review',
|
|
13
14
|
iterating: 'iterating',
|
|
@@ -62,7 +63,18 @@ export function renderRowActions(entry, defaultSite) {
|
|
|
62
63
|
// primary value is the dashboard ↔ scrapbook entry point existing at
|
|
63
64
|
// all, and most projects have a single site). Slug already contains
|
|
64
65
|
// any hierarchical path segments.
|
|
65
|
-
|
|
66
|
+
//
|
|
67
|
+
// #205: thread the entry's UUID through `scrapbookViewerUrl` so the
|
|
68
|
+
// standalone viewer's server route resolves the listing via
|
|
69
|
+
// `scrapbookDirForEntry` for entries whose on-disk path doesn't match
|
|
70
|
+
// the slug template (e.g. feature-doc layouts under
|
|
71
|
+
// `docs/<version>/<status>/<slug>/`). Falls back to slug-template
|
|
72
|
+
// addressing for entries without an id binding.
|
|
73
|
+
const scrapLink = scrapbookViewerUrl({
|
|
74
|
+
site: defaultSite,
|
|
75
|
+
path: entry.slug,
|
|
76
|
+
entryId: entry.uuid,
|
|
77
|
+
});
|
|
66
78
|
if (isLinearActiveStage(stage)) {
|
|
67
79
|
buttons.push(html `<a class="er-btn er-btn-small" href="${reviewLink}"
|
|
68
80
|
title="open the review surface for ${entry.slug}">open →</a>`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"affordances.js","sourceRoot":"","sources":["../../../src/pages/dashboard/affordances.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,EAAgB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"affordances.js","sourceRoot":"","sources":["../../../src/pages/dashboard/affordances.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
11
|
import { html, unsafe, type RawHtml } from '../html.ts';
|
|
12
|
+
import { scrapbookViewerUrl } from '../../components/scrapbook-item.ts';
|
|
12
13
|
import type { Entry, Stage, ReviewState } from '@deskwork/core/schema/entry';
|
|
13
14
|
|
|
14
15
|
const REVIEW_STATE_LABEL: Record<ReviewState, string> = {
|
|
@@ -68,7 +69,18 @@ export function renderRowActions(entry: Entry, defaultSite: string): RawHtml {
|
|
|
68
69
|
// primary value is the dashboard ↔ scrapbook entry point existing at
|
|
69
70
|
// all, and most projects have a single site). Slug already contains
|
|
70
71
|
// any hierarchical path segments.
|
|
71
|
-
|
|
72
|
+
//
|
|
73
|
+
// #205: thread the entry's UUID through `scrapbookViewerUrl` so the
|
|
74
|
+
// standalone viewer's server route resolves the listing via
|
|
75
|
+
// `scrapbookDirForEntry` for entries whose on-disk path doesn't match
|
|
76
|
+
// the slug template (e.g. feature-doc layouts under
|
|
77
|
+
// `docs/<version>/<status>/<slug>/`). Falls back to slug-template
|
|
78
|
+
// addressing for entries without an id binding.
|
|
79
|
+
const scrapLink = scrapbookViewerUrl({
|
|
80
|
+
site: defaultSite,
|
|
81
|
+
path: entry.slug,
|
|
82
|
+
entryId: entry.uuid,
|
|
83
|
+
});
|
|
72
84
|
|
|
73
85
|
if (isLinearActiveStage(stage)) {
|
|
74
86
|
buttons.push(html`<a class="er-btn er-btn-small" href="${reviewLink}"
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Press-queue sidebar — the dashboard's right column.
|
|
3
|
+
*
|
|
4
|
+
* "Press-check" gravity: at the press, the operator wants to know what
|
|
5
|
+
* needs their eyes RIGHT NOW, separately from the at-a-glance pipeline
|
|
6
|
+
* view on the left. This panel surfaces every entry in active review
|
|
7
|
+
* (`reviewState === 'in-review'`), longest-waiting first, with a soft
|
|
8
|
+
* empty state when the press is quiet.
|
|
9
|
+
*
|
|
10
|
+
* Closes the long-empty right column the dashboard's `.er-layout` grid
|
|
11
|
+
* has been declaring since the surface shipped (#158 child concern).
|
|
12
|
+
*/
|
|
13
|
+
import { type RawHtml } from '../html.ts';
|
|
14
|
+
import type { Entry } from '@deskwork/core/schema/entry';
|
|
15
|
+
export declare function renderPressQueue(entries: readonly Entry[], defaultSite: string, now: Date): RawHtml;
|
|
16
|
+
//# sourceMappingURL=press-queue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"press-queue.d.ts","sourceRoot":"","sources":["../../../src/pages/dashboard/press-queue.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAgB,KAAK,OAAO,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,KAAK,EAAE,KAAK,EAAS,MAAM,6BAA6B,CAAC;AAsEhE,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,SAAS,KAAK,EAAE,EACzB,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,IAAI,GACR,OAAO,CAuBT"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Press-queue sidebar — the dashboard's right column.
|
|
3
|
+
*
|
|
4
|
+
* "Press-check" gravity: at the press, the operator wants to know what
|
|
5
|
+
* needs their eyes RIGHT NOW, separately from the at-a-glance pipeline
|
|
6
|
+
* view on the left. This panel surfaces every entry in active review
|
|
7
|
+
* (`reviewState === 'in-review'`), longest-waiting first, with a soft
|
|
8
|
+
* empty state when the press is quiet.
|
|
9
|
+
*
|
|
10
|
+
* Closes the long-empty right column the dashboard's `.er-layout` grid
|
|
11
|
+
* has been declaring since the surface shipped (#158 child concern).
|
|
12
|
+
*/
|
|
13
|
+
import { html, unsafe } from "../html.js";
|
|
14
|
+
import { formatRelativeTime } from '@deskwork/core/scrapbook';
|
|
15
|
+
const STAGE_ORNAMENTS = {
|
|
16
|
+
Ideas: '◇',
|
|
17
|
+
Planned: '§',
|
|
18
|
+
Outlining: '⊹',
|
|
19
|
+
Drafting: '✎',
|
|
20
|
+
Final: '※',
|
|
21
|
+
Published: '✓',
|
|
22
|
+
Blocked: '⊘',
|
|
23
|
+
Cancelled: '✗',
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Filter the dashboard's entries to those currently in review and
|
|
27
|
+
* sort longest-waiting first. The "longest waiting" axis is `updatedAt`
|
|
28
|
+
* — every iterate / review-state-change writes to it, so the entry
|
|
29
|
+
* whose updatedAt is oldest is the one the operator has been ignoring
|
|
30
|
+
* longest.
|
|
31
|
+
*/
|
|
32
|
+
function selectAwaitingItems(entries, now) {
|
|
33
|
+
const items = [];
|
|
34
|
+
for (const entry of entries) {
|
|
35
|
+
if (entry.reviewState !== 'in-review')
|
|
36
|
+
continue;
|
|
37
|
+
const updatedAt = new Date(entry.updatedAt).getTime();
|
|
38
|
+
items.push({ entry, waitedMs: now.getTime() - updatedAt });
|
|
39
|
+
}
|
|
40
|
+
items.sort((a, b) => b.waitedMs - a.waitedMs);
|
|
41
|
+
return items;
|
|
42
|
+
}
|
|
43
|
+
function renderItem(item, defaultSite, now) {
|
|
44
|
+
const { entry } = item;
|
|
45
|
+
void defaultSite;
|
|
46
|
+
const reviewLink = `/dev/editorial-review/entry/${entry.uuid}`;
|
|
47
|
+
return unsafe(html `
|
|
48
|
+
<li class="er-press-queue__item" data-stage="${entry.currentStage}">
|
|
49
|
+
<a class="er-press-queue__link" href="${reviewLink}">
|
|
50
|
+
<span class="er-press-queue__ornament" aria-hidden="true">${STAGE_ORNAMENTS[entry.currentStage]}</span>
|
|
51
|
+
<span class="er-press-queue__body">
|
|
52
|
+
<span class="er-press-queue__slug">${entry.slug}</span>
|
|
53
|
+
<span class="er-press-queue__meta">
|
|
54
|
+
<span class="er-press-queue__stage">${entry.currentStage}</span>
|
|
55
|
+
<span class="er-press-queue__sep" aria-hidden="true">·</span>
|
|
56
|
+
<span class="er-press-queue__waited">${formatRelativeTime(entry.updatedAt, now)}</span>
|
|
57
|
+
</span>
|
|
58
|
+
</span>
|
|
59
|
+
</a>
|
|
60
|
+
</li>`);
|
|
61
|
+
}
|
|
62
|
+
function renderEmptyState() {
|
|
63
|
+
return unsafe(html `
|
|
64
|
+
<div class="er-press-queue__empty">
|
|
65
|
+
<span class="er-press-queue__empty-mark" aria-hidden="true">※</span>
|
|
66
|
+
<p class="er-press-queue__empty-line">The press is quiet.</p>
|
|
67
|
+
<p class="er-press-queue__empty-hint">Nothing in review.</p>
|
|
68
|
+
</div>`);
|
|
69
|
+
}
|
|
70
|
+
export function renderPressQueue(entries, defaultSite, now) {
|
|
71
|
+
const items = selectAwaitingItems(entries, now);
|
|
72
|
+
const body = items.length === 0
|
|
73
|
+
? renderEmptyState()
|
|
74
|
+
: unsafe(html `
|
|
75
|
+
<ol class="er-press-queue__list">
|
|
76
|
+
${unsafe(items
|
|
77
|
+
.map((item) => renderItem(item, defaultSite, now).__raw)
|
|
78
|
+
.join('\n'))}
|
|
79
|
+
</ol>`);
|
|
80
|
+
return unsafe(html `
|
|
81
|
+
<aside class="er-press-queue${items.length === 0 ? ' er-press-queue--empty' : ''}"
|
|
82
|
+
aria-label="Awaiting your eyes">
|
|
83
|
+
<header class="er-press-queue__head">
|
|
84
|
+
<p class="er-press-queue__kicker">Press queue</p>
|
|
85
|
+
<h2 class="er-press-queue__title">Awaiting your <em>eyes</em></h2>
|
|
86
|
+
<p class="er-press-queue__count">№ ${items.length}</p>
|
|
87
|
+
</header>
|
|
88
|
+
${body}
|
|
89
|
+
</aside>`);
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=press-queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"press-queue.js","sourceRoot":"","sources":["../../../src/pages/dashboard/press-queue.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,EAAgB,MAAM,YAAY,CAAC;AAExD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE9D,MAAM,eAAe,GAA0B;IAC7C,KAAK,EAAE,GAAG;IACV,OAAO,EAAE,GAAG;IACZ,SAAS,EAAE,GAAG;IACd,QAAQ,EAAE,GAAG;IACb,KAAK,EAAE,GAAG;IACV,SAAS,EAAE,GAAG;IACd,OAAO,EAAE,GAAG;IACZ,SAAS,EAAE,GAAG;CACf,CAAC;AAOF;;;;;;GAMG;AACH,SAAS,mBAAmB,CAAC,OAAyB,EAAE,GAAS;IAC/D,MAAM,KAAK,GAAmB,EAAE,CAAC;IACjC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,KAAK,CAAC,WAAW,KAAK,WAAW;YAAE,SAAS;QAChD,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;QACtD,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,SAAS,EAAE,CAAC,CAAC;IAC7D,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC9C,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,UAAU,CACjB,IAAkB,EAClB,WAAmB,EACnB,GAAS;IAET,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IACvB,KAAK,WAAW,CAAC;IACjB,MAAM,UAAU,GAAG,+BAA+B,KAAK,CAAC,IAAI,EAAE,CAAC;IAC/D,OAAO,MAAM,CAAC,IAAI,CAAA;mDAC+B,KAAK,CAAC,YAAY;8CACvB,UAAU;oEACY,eAAe,CAAC,KAAK,CAAC,YAAY,CAAC;;+CAExD,KAAK,CAAC,IAAI;;kDAEP,KAAK,CAAC,YAAY;;mDAEjB,kBAAkB,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,CAAC;;;;UAIjF,CAAC,CAAC;AACZ,CAAC;AAED,SAAS,gBAAgB;IACvB,OAAO,MAAM,CAAC,IAAI,CAAA;;;;;WAKT,CAAC,CAAC;AACb,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,OAAyB,EACzB,WAAmB,EACnB,GAAS;IAET,MAAM,KAAK,GAAG,mBAAmB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAChD,MAAM,IAAI,GACR,KAAK,CAAC,MAAM,KAAK,CAAC;QAChB,CAAC,CAAC,gBAAgB,EAAE;QACpB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAA;;cAEL,MAAM,CACN,KAAK;aACF,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC;aACvD,IAAI,CAAC,IAAI,CAAC,CACd;gBACG,CAAC,CAAC;IAChB,OAAO,MAAM,CAAC,IAAI,CAAA;kCACc,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,EAAE;;;;;6CAKvC,KAAK,CAAC,MAAM;;QAEjD,IAAI;aACC,CAAC,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Press-queue sidebar — the dashboard's right column.
|
|
3
|
+
*
|
|
4
|
+
* "Press-check" gravity: at the press, the operator wants to know what
|
|
5
|
+
* needs their eyes RIGHT NOW, separately from the at-a-glance pipeline
|
|
6
|
+
* view on the left. This panel surfaces every entry in active review
|
|
7
|
+
* (`reviewState === 'in-review'`), longest-waiting first, with a soft
|
|
8
|
+
* empty state when the press is quiet.
|
|
9
|
+
*
|
|
10
|
+
* Closes the long-empty right column the dashboard's `.er-layout` grid
|
|
11
|
+
* has been declaring since the surface shipped (#158 child concern).
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { html, unsafe, type RawHtml } from '../html.ts';
|
|
15
|
+
import type { Entry, Stage } from '@deskwork/core/schema/entry';
|
|
16
|
+
import { formatRelativeTime } from '@deskwork/core/scrapbook';
|
|
17
|
+
|
|
18
|
+
const STAGE_ORNAMENTS: Record<Stage, string> = {
|
|
19
|
+
Ideas: '◇',
|
|
20
|
+
Planned: '§',
|
|
21
|
+
Outlining: '⊹',
|
|
22
|
+
Drafting: '✎',
|
|
23
|
+
Final: '※',
|
|
24
|
+
Published: '✓',
|
|
25
|
+
Blocked: '⊘',
|
|
26
|
+
Cancelled: '✗',
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
interface AwaitingItem {
|
|
30
|
+
readonly entry: Entry;
|
|
31
|
+
readonly waitedMs: number;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Filter the dashboard's entries to those currently in review and
|
|
36
|
+
* sort longest-waiting first. The "longest waiting" axis is `updatedAt`
|
|
37
|
+
* — every iterate / review-state-change writes to it, so the entry
|
|
38
|
+
* whose updatedAt is oldest is the one the operator has been ignoring
|
|
39
|
+
* longest.
|
|
40
|
+
*/
|
|
41
|
+
function selectAwaitingItems(entries: readonly Entry[], now: Date): AwaitingItem[] {
|
|
42
|
+
const items: AwaitingItem[] = [];
|
|
43
|
+
for (const entry of entries) {
|
|
44
|
+
if (entry.reviewState !== 'in-review') continue;
|
|
45
|
+
const updatedAt = new Date(entry.updatedAt).getTime();
|
|
46
|
+
items.push({ entry, waitedMs: now.getTime() - updatedAt });
|
|
47
|
+
}
|
|
48
|
+
items.sort((a, b) => b.waitedMs - a.waitedMs);
|
|
49
|
+
return items;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function renderItem(
|
|
53
|
+
item: AwaitingItem,
|
|
54
|
+
defaultSite: string,
|
|
55
|
+
now: Date,
|
|
56
|
+
): RawHtml {
|
|
57
|
+
const { entry } = item;
|
|
58
|
+
void defaultSite;
|
|
59
|
+
const reviewLink = `/dev/editorial-review/entry/${entry.uuid}`;
|
|
60
|
+
return unsafe(html`
|
|
61
|
+
<li class="er-press-queue__item" data-stage="${entry.currentStage}">
|
|
62
|
+
<a class="er-press-queue__link" href="${reviewLink}">
|
|
63
|
+
<span class="er-press-queue__ornament" aria-hidden="true">${STAGE_ORNAMENTS[entry.currentStage]}</span>
|
|
64
|
+
<span class="er-press-queue__body">
|
|
65
|
+
<span class="er-press-queue__slug">${entry.slug}</span>
|
|
66
|
+
<span class="er-press-queue__meta">
|
|
67
|
+
<span class="er-press-queue__stage">${entry.currentStage}</span>
|
|
68
|
+
<span class="er-press-queue__sep" aria-hidden="true">·</span>
|
|
69
|
+
<span class="er-press-queue__waited">${formatRelativeTime(entry.updatedAt, now)}</span>
|
|
70
|
+
</span>
|
|
71
|
+
</span>
|
|
72
|
+
</a>
|
|
73
|
+
</li>`);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function renderEmptyState(): RawHtml {
|
|
77
|
+
return unsafe(html`
|
|
78
|
+
<div class="er-press-queue__empty">
|
|
79
|
+
<span class="er-press-queue__empty-mark" aria-hidden="true">※</span>
|
|
80
|
+
<p class="er-press-queue__empty-line">The press is quiet.</p>
|
|
81
|
+
<p class="er-press-queue__empty-hint">Nothing in review.</p>
|
|
82
|
+
</div>`);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export function renderPressQueue(
|
|
86
|
+
entries: readonly Entry[],
|
|
87
|
+
defaultSite: string,
|
|
88
|
+
now: Date,
|
|
89
|
+
): RawHtml {
|
|
90
|
+
const items = selectAwaitingItems(entries, now);
|
|
91
|
+
const body =
|
|
92
|
+
items.length === 0
|
|
93
|
+
? renderEmptyState()
|
|
94
|
+
: unsafe(html`
|
|
95
|
+
<ol class="er-press-queue__list">
|
|
96
|
+
${unsafe(
|
|
97
|
+
items
|
|
98
|
+
.map((item) => renderItem(item, defaultSite, now).__raw)
|
|
99
|
+
.join('\n'),
|
|
100
|
+
)}
|
|
101
|
+
</ol>`);
|
|
102
|
+
return unsafe(html`
|
|
103
|
+
<aside class="er-press-queue${items.length === 0 ? ' er-press-queue--empty' : ''}"
|
|
104
|
+
aria-label="Awaiting your eyes">
|
|
105
|
+
<header class="er-press-queue__head">
|
|
106
|
+
<p class="er-press-queue__kicker">Press queue</p>
|
|
107
|
+
<h2 class="er-press-queue__title">Awaiting your <em>eyes</em></h2>
|
|
108
|
+
<p class="er-press-queue__count">№ ${items.length}</p>
|
|
109
|
+
</header>
|
|
110
|
+
${body}
|
|
111
|
+
</aside>`);
|
|
112
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../src/pages/dashboard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../src/pages/dashboard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAWtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAEjE;;;;;GAKG;AACH,MAAM,MAAM,oBAAoB,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,YAAY,CAAC;AAElE;;;GAGG;AACH,wBAAsB,eAAe,CACnC,GAAG,EAAE,aAAa,EAClB,QAAQ,CAAC,EAAE,oBAAoB,GAC9B,OAAO,CAAC,MAAM,CAAC,CAwCjB"}
|
package/dist/pages/dashboard.js
CHANGED
|
@@ -30,6 +30,7 @@ import { renderEditorialFolio } from "./chrome.js";
|
|
|
30
30
|
import { loadDashboardData, DASHBOARD_STAGE_ORDER } from "./dashboard/data.js";
|
|
31
31
|
import { renderStageSection, renderDistributionPlaceholder, } from "./dashboard/section.js";
|
|
32
32
|
import { renderHeader, renderFilterStrip } from "./dashboard/header.js";
|
|
33
|
+
import { renderPressQueue } from "./dashboard/press-queue.js";
|
|
33
34
|
/**
|
|
34
35
|
* Render the studio dashboard. Async because sidecar reads hit disk;
|
|
35
36
|
* the route handler in server.ts awaits the result before sending it.
|
|
@@ -54,6 +55,7 @@ export async function renderDashboard(ctx, getIndex) {
|
|
|
54
55
|
${unsafe(stageSections)}
|
|
55
56
|
${renderDistributionPlaceholder()}
|
|
56
57
|
</div>
|
|
58
|
+
${renderPressQueue(data.entries, defaultSite, now)}
|
|
57
59
|
</div>
|
|
58
60
|
</main>
|
|
59
61
|
<div class="er-toast" data-toast hidden></div>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/pages/dashboard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAGH,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EACL,kBAAkB,EAClB,6BAA6B,GAC9B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/pages/dashboard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAGH,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EACL,kBAAkB,EAClB,6BAA6B,GAC9B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAW9D;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,GAAkB,EAClB,QAA+B;IAE/B,iEAAiE;IACjE,KAAK,QAAQ,CAAC;IAEd,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACtD,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;IAE7C,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC;IAC3C,MAAM,aAAa,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACxD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAC7C,OAAO,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,KAAK,CAAC;IAC9D,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,IAAI,GAAG,IAAI,CAAA;IACf,oBAAoB,CAAC,WAAW,EAAE,aAAa,CAAC;IAChD,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC;;MAEtC,iBAAiB,EAAE;;;UAGf,MAAM,CAAC,aAAa,CAAC;UACrB,6BAA6B,EAAE;;QAEjC,gBAAgB,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,CAAC;;;;oEAIY,CAAC;IAEnE,OAAO,MAAM,CAAC;QACZ,KAAK,EAAE,mBAAmB;QAC1B,QAAQ,EAAE;YACR,kCAAkC;YAClC,+BAA+B;YAC/B,kCAAkC;SACnC;QACD,SAAS,EAAE,yBAAyB;QACpC,QAAQ,EAAE,IAAI;QACd,aAAa,EAAE,CAAC,yBAAyB,CAAC;KAC3C,CAAC,CAAC;AACL,CAAC"}
|
package/dist/pages/dashboard.ts
CHANGED
|
@@ -35,6 +35,7 @@ import {
|
|
|
35
35
|
renderDistributionPlaceholder,
|
|
36
36
|
} from './dashboard/section.ts';
|
|
37
37
|
import { renderHeader, renderFilterStrip } from './dashboard/header.ts';
|
|
38
|
+
import { renderPressQueue } from './dashboard/press-queue.ts';
|
|
38
39
|
import type { ContentIndex } from '@deskwork/core/content-index';
|
|
39
40
|
|
|
40
41
|
/**
|
|
@@ -75,6 +76,7 @@ export async function renderDashboard(
|
|
|
75
76
|
${unsafe(stageSections)}
|
|
76
77
|
${renderDistributionPlaceholder()}
|
|
77
78
|
</div>
|
|
79
|
+
${renderPressQueue(data.entries, defaultSite, now)}
|
|
78
80
|
</div>
|
|
79
81
|
</main>
|
|
80
82
|
<div class="er-toast" data-toast hidden></div>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decision-strip.d.ts","sourceRoot":"","sources":["../../../src/pages/entry-review/decision-strip.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAgB,KAAK,OAAO,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"decision-strip.d.ts","sourceRoot":"","sources":["../../../src/pages/entry-review/decision-strip.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAgB,KAAK,OAAO,EAAE,MAAM,YAAY,CAAC;AAiKxD,UAAU,oBAAoB;IAC5B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC;;yDAEqD;IACrD,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAC9B;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAMvE"}
|
|
@@ -46,11 +46,19 @@ function renderEditToggle() {
|
|
|
46
46
|
return html `<button class="er-btn er-btn-small" data-action="toggle-edit" type="button">Edit</button><span class="er-edit-mode-label" data-mode="preview">preview</span>`;
|
|
47
47
|
}
|
|
48
48
|
function renderInductPicker(entry) {
|
|
49
|
-
|
|
49
|
+
// #189: induct-to client handler builds `/deskwork:induct <slug> --to <Stage>`
|
|
50
|
+
// from the dataset; it needs the slug, not the uuid, for the skill command.
|
|
51
|
+
// First option is a blank placeholder so the operator's selection always
|
|
52
|
+
// produces a `change` event (selecting the already-selected option doesn't
|
|
53
|
+
// fire `change`).
|
|
54
|
+
const options = [
|
|
55
|
+
unsafe(html `<option value="">— pick a stage —</option>`),
|
|
56
|
+
...STAGE_PICKER_OPTIONS.map((s) => unsafe(html `<option value="${s}">${s}</option>`)),
|
|
57
|
+
];
|
|
50
58
|
return html `
|
|
51
59
|
<label class="er-entry-control er-entry-control--induct">
|
|
52
60
|
<span class="er-entry-control-label">Induct to</span>
|
|
53
|
-
<select name="induct-to" data-entry-uuid="${entry.uuid}">
|
|
61
|
+
<select name="induct-to" data-entry-uuid="${entry.uuid}" data-entry-slug="${entry.slug}">
|
|
54
62
|
${options}
|
|
55
63
|
</select>
|
|
56
64
|
</label>`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decision-strip.js","sourceRoot":"","sources":["../../../src/pages/entry-review/decision-strip.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAIH,OAAO,EAAE,IAAI,EAAE,MAAM,EAAgB,MAAM,YAAY,CAAC;AAExD,MAAM,gBAAgB,GACpB,yDAAyD,CAAC;AAC5D,MAAM,cAAc,GAAG,wCAAwC,gBAAgB,EAAE,CAAC;AAElF,MAAM,kBAAkB,GACtB,wEAAwE,CAAC;AAE3E,MAAM,oBAAoB,GAAG;IAC3B,OAAO;IACP,SAAS;IACT,WAAW;IACX,UAAU;IACV,OAAO;CACC,CAAC;AAEX;;;;GAIG;AACH,SAAS,gBAAgB,CAAC,UAAkB,EAAE,MAAuB;IACnE,OAAO,IAAI,CAAA,uCAAuC,MAAM,CAAC,UAAU,CAAC,wCAAwC,MAAM,cAAc,MAAM,uBAAuB,CAAC;AAChK,CAAC;AAED,SAAS,gBAAgB;IACvB,qEAAqE;IACrE,8DAA8D;IAC9D,OAAO,IAAI,CAAA,8JAA8J,CAAC;AAC5K,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAY;IACtC,MAAM,OAAO,GAAG,oBAAoB,CAAC,GAAG,
|
|
1
|
+
{"version":3,"file":"decision-strip.js","sourceRoot":"","sources":["../../../src/pages/entry-review/decision-strip.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/pages/entry-review/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAQH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAMjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAezD,MAAM,MAAM,sBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,YAAY,CAAC;AAEpE,MAAM,WAAW,gBAAgB;IAC/B;oDACgD;IAChD,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC;;;mDAG+C;IAC/C,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,GAAG,GAAG,GAAG,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/pages/entry-review/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAQH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAMjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAezD,MAAM,MAAM,sBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,YAAY,CAAC;AAEpE,MAAM,WAAW,gBAAgB;IAC/B;oDACgD;IAChD,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC;;;mDAG+C;IAC/C,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,GAAG,GAAG,GAAG,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAqGD;;;;GAIG;AACH,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,aAAa,EAClB,OAAO,EAAE,MAAM,EACf,KAAK,GAAE,gBAAqB,EAC5B,QAAQ,CAAC,EAAE,sBAAsB,GAChC,OAAO,CAAC,iBAAiB,CAAC,CA0H5B"}
|
|
@@ -53,11 +53,11 @@ function stringField(v) {
|
|
|
53
53
|
* contentKind switch — the entry-keyed surface is always longform-shaped
|
|
54
54
|
* (shortform stays on its own retirement track).
|
|
55
55
|
*/
|
|
56
|
-
async function prepareRender(markdown) {
|
|
56
|
+
async function prepareRender(markdown, renderCtx) {
|
|
57
57
|
const parsed = parseDraftFrontmatter(markdown);
|
|
58
58
|
const fm = parsed.frontmatter;
|
|
59
59
|
const split = splitOutline(parsed.body);
|
|
60
|
-
const bodyHtml = await renderMarkdownToHtml(split.body);
|
|
60
|
+
const bodyHtml = await renderMarkdownToHtml(split.body, renderCtx);
|
|
61
61
|
// Inject the description as a dek after the body's first <h1>.
|
|
62
62
|
const description = stringField(fm.description);
|
|
63
63
|
const dekHtml = description
|
|
@@ -68,7 +68,7 @@ async function prepareRender(markdown) {
|
|
|
68
68
|
? bodyHtml.slice(0, h1Close + 5) + dekHtml + bodyHtml.slice(h1Close + 5)
|
|
69
69
|
: dekHtml + bodyHtml;
|
|
70
70
|
const outlineHtml = split.outline
|
|
71
|
-
? await renderMarkdownToHtml(split.outline)
|
|
71
|
+
? await renderMarkdownToHtml(split.outline, renderCtx)
|
|
72
72
|
: '';
|
|
73
73
|
return { fm, bodyHtml: renderedHtml, outlineHtml };
|
|
74
74
|
}
|
|
@@ -122,7 +122,10 @@ export async function renderEntryReviewPage(ctx, entryId, query = {}, getIndex)
|
|
|
122
122
|
const reason = err instanceof Error ? err.message : String(err);
|
|
123
123
|
return { status: 404, html: renderEntryNotFound(entryId, reason) };
|
|
124
124
|
}
|
|
125
|
-
const { fm, bodyHtml, outlineHtml } = await prepareRender(data.markdown
|
|
125
|
+
const { fm, bodyHtml, outlineHtml } = await prepareRender(data.markdown, {
|
|
126
|
+
entryId: data.entry.uuid,
|
|
127
|
+
site: data.site,
|
|
128
|
+
});
|
|
126
129
|
const affordances = getAffordances(data.entry);
|
|
127
130
|
const state = buildState(data);
|
|
128
131
|
const titleField = stringField(fm.title) ?? `Draft: ${data.entry.slug}`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/pages/entry-review/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EACL,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAE5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAElE,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAEhE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAgB,MAAM,YAAY,CAAC;AAC3E,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAwB,MAAM,WAAW,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AA0BrD,SAAS,WAAW,CAAC,CAAU;IAC7B,OAAO,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC/C,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,aAAa,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/pages/entry-review/index.ts"],"names":[],"mappings":"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"}
|