@burdenoff/microfe-planmagnet 2026.925.14 → 2026.925.16

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.
Files changed (28) hide show
  1. package/dist/generated/wspace-types.d.ts +21 -0
  2. package/dist/generated/wspace-types.d.ts.map +1 -1
  3. package/dist/planmagnet/PlanMagnetRoutes.d.ts.map +1 -1
  4. package/dist/planmagnet/PlanMagnetRoutes.js +67 -59
  5. package/dist/planmagnet/PlanMagnetRoutes.js.map +1 -1
  6. package/dist/planmagnet/docs/DocStatusBadge.d.ts +8 -0
  7. package/dist/planmagnet/docs/DocStatusBadge.d.ts.map +1 -0
  8. package/dist/planmagnet/docs/DocStatusBadge.js +28 -0
  9. package/dist/planmagnet/docs/DocStatusBadge.js.map +1 -0
  10. package/dist/planmagnet/pages/DocsDocDetailPagePage.d.ts +2 -0
  11. package/dist/planmagnet/pages/DocsDocDetailPagePage.d.ts.map +1 -0
  12. package/dist/planmagnet/pages/DocsDocDetailPagePage.js +410 -0
  13. package/dist/planmagnet/pages/DocsDocDetailPagePage.js.map +1 -0
  14. package/dist/planmagnet/pages/DocsDocsPagePage.d.ts +3 -0
  15. package/dist/planmagnet/pages/DocsDocsPagePage.d.ts.map +1 -0
  16. package/dist/planmagnet/pages/DocsDocsPagePage.js +224 -0
  17. package/dist/planmagnet/pages/DocsDocsPagePage.js.map +1 -0
  18. package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.d.ts.map +1 -1
  19. package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.js +100 -94
  20. package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.js.map +1 -1
  21. package/dist/planmagnet/pages/TasksTaskDetailPagePage.d.ts.map +1 -1
  22. package/dist/planmagnet/pages/TasksTaskDetailPagePage.js +130 -128
  23. package/dist/planmagnet/pages/TasksTaskDetailPagePage.js.map +1 -1
  24. package/dist/planmagnet/releases/ReleaseGatesCard.d.ts +6 -0
  25. package/dist/planmagnet/releases/ReleaseGatesCard.d.ts.map +1 -0
  26. package/dist/planmagnet/releases/ReleaseGatesCard.js +173 -0
  27. package/dist/planmagnet/releases/ReleaseGatesCard.js.map +1 -0
  28. package/package.json +1 -1
@@ -0,0 +1,410 @@
1
+ import { usePlanMagnetNavigate as e } from "../providers/PlanMagnetProvider.js";
2
+ import { PersonName as t } from "../people/People.js";
3
+ import { MarkdownEditor as n } from "../../components/MarkdownEditor.js";
4
+ import { throwOnError as ee } from "../utils/mutationResult.js";
5
+ import { DOC_STATUSES as te, DocStatusBadge as ne } from "../docs/DocStatusBadge.js";
6
+ import { useState as r } from "react";
7
+ import { ArrowLeft as re, History as ie, Link2 as ae, X as oe } from "lucide-react";
8
+ import { useSearchParams as se } from "react-router";
9
+ import { gql as i } from "@apollo/client";
10
+ import { useMutation as a, useQuery as ce } from "@apollo/client/react";
11
+ import { jsx as o, jsxs as s } from "react/jsx-runtime";
12
+ import { AlertDialog as c, AlertDialogAction as l, AlertDialogCancel as u, AlertDialogContent as d, AlertDialogDescription as f, AlertDialogFooter as p, AlertDialogHeader as m, AlertDialogTitle as h, AlertDialogTrigger as g, Button as _, Card as v, CardContent as y, CardHeader as b, CardTitle as x, Input as S } from "@burdenoff/fe-libs/ui";
13
+ import { Markdown as C } from "@burdenoff/fe-libs/shared/components";
14
+ //#region src/planmagnet/pages/DocsDocDetailPagePage.tsx
15
+ var le = i`
16
+ query DocDetail($id: ID!) {
17
+ planmagnetDoc(id: $id) {
18
+ id
19
+ title
20
+ content
21
+ status
22
+ version
23
+ createdBy
24
+ createdAt
25
+ updatedBy
26
+ updatedAt
27
+ revisions {
28
+ id
29
+ version
30
+ title
31
+ content
32
+ changeNote
33
+ createdBy
34
+ createdAt
35
+ }
36
+ linkedWorkItems {
37
+ id
38
+ key
39
+ title
40
+ }
41
+ }
42
+ }
43
+ `, ue = i`
44
+ mutation DocUpdate($id: ID!, $input: PlanmagnetUpdateDocInput!) {
45
+ planmagnetUpdateDoc(id: $id, input: $input) {
46
+ id
47
+ version
48
+ status
49
+ }
50
+ }
51
+ `, w = i`
52
+ mutation DocRevert($id: ID!, $toVersion: Int!, $expectedVersion: Int) {
53
+ planmagnetRevertDoc(id: $id, toVersion: $toVersion, expectedVersion: $expectedVersion) {
54
+ id
55
+ version
56
+ }
57
+ }
58
+ `, T = i`
59
+ mutation DocDelete($id: ID!) {
60
+ planmagnetDeleteDoc(id: $id)
61
+ }
62
+ `, E = i`
63
+ mutation DocUnlinkWorkItem($docId: ID!, $workItemId: ID!) {
64
+ planmagnetUnlinkDocFromWorkItem(docId: $docId, workItemId: $workItemId)
65
+ }
66
+ `, de = (e, t) => e instanceof Error ? e.message : t, D = (e) => new Date(e).toLocaleString();
67
+ function O() {
68
+ let [i] = se(), O = i.get("docId") ?? "", k = e(), [A, j] = r(!1), [M, N] = r(""), [P, F] = r(""), [I, L] = r(""), [R, z] = r(null), [B, V] = r(null), [H, fe] = r(null), { data: U, loading: pe, error: W, refetch: me } = ce(le, {
69
+ variables: { id: O },
70
+ skip: !O,
71
+ fetchPolicy: "cache-and-network"
72
+ }), G = {
73
+ refetchQueries: ["DocDetail"],
74
+ awaitRefetchQueries: !0
75
+ }, [K, q] = a(ue, G), [he, ge] = a(w, G), [_e, ve] = a(T, { refetchQueries: ["DocsList"] }), [J, ye] = a(E, G), Y = U?.planmagnetDoc, X = q.loading || ge.loading || ve.loading, Z = async (e, t) => {
76
+ z(null);
77
+ try {
78
+ return await ee(e()), !0;
79
+ } catch (e) {
80
+ return z(de(e, t)), await me(), !1;
81
+ }
82
+ };
83
+ if (!O) return /* @__PURE__ */ o("div", {
84
+ className: "p-6 text-sm text-muted-foreground",
85
+ children: "No doc selected."
86
+ });
87
+ if (pe && !U) return /* @__PURE__ */ o("div", {
88
+ className: "p-6 text-sm text-muted-foreground",
89
+ children: "Loading doc…"
90
+ });
91
+ if (W && !Y) return /* @__PURE__ */ s("p", {
92
+ role: "alert",
93
+ className: "p-6 text-sm text-destructive",
94
+ children: ["The doc could not be loaded: ", W.message]
95
+ });
96
+ if (!Y) return /* @__PURE__ */ s("div", {
97
+ className: "space-y-3 p-6",
98
+ children: [/* @__PURE__ */ o("p", {
99
+ className: "text-sm text-muted-foreground",
100
+ children: "This doc does not exist in this workspace, or it was deleted."
101
+ }), /* @__PURE__ */ o(_, {
102
+ size: "sm",
103
+ variant: "outline",
104
+ onClick: () => k("/docs/docs-page"),
105
+ children: "Back to docs"
106
+ })]
107
+ });
108
+ let be = () => {
109
+ N(Y.title), F(Y.content), L(""), z(null), fe(Y.version), j(!0);
110
+ }, xe = async () => {
111
+ await Z(() => K({ variables: {
112
+ id: Y.id,
113
+ input: {
114
+ title: M.trim(),
115
+ content: P,
116
+ ...I.trim() ? { changeNote: I.trim() } : {},
117
+ expectedVersion: H
118
+ }
119
+ } }), "The doc could not be saved.") && j(!1);
120
+ }, Q = [...Y.revisions].sort((e, t) => t.version - e.version), $ = B === null ? null : Q.find((e) => e.version === B);
121
+ return /* @__PURE__ */ s("div", {
122
+ className: "space-y-6 p-6",
123
+ "data-testid": "doc-detail",
124
+ children: [
125
+ /* @__PURE__ */ s(_, {
126
+ size: "sm",
127
+ variant: "ghost",
128
+ onClick: () => k("/docs/docs-page"),
129
+ children: [/* @__PURE__ */ o(re, { className: "mr-1 h-4 w-4" }), "All docs"]
130
+ }),
131
+ /* @__PURE__ */ s("div", {
132
+ className: "flex flex-wrap items-start justify-between gap-3",
133
+ children: [/* @__PURE__ */ s("div", {
134
+ className: "min-w-0 space-y-1",
135
+ children: [/* @__PURE__ */ o("h1", {
136
+ className: "text-2xl font-semibold break-words",
137
+ "data-testid": "doc-title",
138
+ children: Y.title
139
+ }), /* @__PURE__ */ s("p", {
140
+ className: "text-xs text-muted-foreground",
141
+ children: [
142
+ /* @__PURE__ */ o(ne, { status: Y.status }),
143
+ " · version ",
144
+ Y.version,
145
+ " · updated",
146
+ " ",
147
+ D(Y.updatedAt),
148
+ " by ",
149
+ /* @__PURE__ */ o(t, { id: Y.updatedBy ?? Y.createdBy })
150
+ ]
151
+ })]
152
+ }), !A && /* @__PURE__ */ s("div", {
153
+ className: "flex flex-wrap gap-2",
154
+ children: [
155
+ te.filter((e) => e !== Y.status).map((e) => /* @__PURE__ */ o(_, {
156
+ size: "sm",
157
+ variant: "outline",
158
+ disabled: X,
159
+ onClick: () => Z(() => K({ variables: {
160
+ id: Y.id,
161
+ input: {
162
+ status: e,
163
+ expectedVersion: Y.version
164
+ }
165
+ } }), "The status could not be changed."),
166
+ children: e === "PUBLISHED" ? "Publish" : e === "ARCHIVED" ? "Archive" : "Back to draft"
167
+ }, e)),
168
+ /* @__PURE__ */ o(_, {
169
+ size: "sm",
170
+ onClick: be,
171
+ "data-testid": "doc-edit",
172
+ children: "Edit"
173
+ }),
174
+ /* @__PURE__ */ s(c, { children: [/* @__PURE__ */ o(g, {
175
+ asChild: !0,
176
+ children: /* @__PURE__ */ o(_, {
177
+ size: "sm",
178
+ variant: "outline",
179
+ disabled: X,
180
+ children: "Delete"
181
+ })
182
+ }), /* @__PURE__ */ s(d, { children: [/* @__PURE__ */ s(m, { children: [/* @__PURE__ */ s(h, { children: [
183
+ "Delete “",
184
+ Y.title,
185
+ "”?"
186
+ ] }), /* @__PURE__ */ s(f, { children: [
187
+ "The doc and its history are removed for everyone, and it is unlinked from",
188
+ " ",
189
+ Y.linkedWorkItems.length,
190
+ " work item",
191
+ Y.linkedWorkItems.length === 1 ? "" : "s",
192
+ "."
193
+ ] })] }), /* @__PURE__ */ s(p, { children: [/* @__PURE__ */ o(u, { children: "Keep it" }), /* @__PURE__ */ o(l, {
194
+ className: "bg-destructive text-destructive-foreground hover:bg-destructive/90",
195
+ onClick: async () => {
196
+ await Z(() => _e({ variables: { id: Y.id } }), "The doc could not be deleted.") && k("/docs/docs-page");
197
+ },
198
+ children: "Delete"
199
+ })] })] })] })
200
+ ]
201
+ })]
202
+ }),
203
+ R && /* @__PURE__ */ o("p", {
204
+ role: "alert",
205
+ className: "text-sm text-destructive",
206
+ "data-testid": "doc-error",
207
+ children: R
208
+ }),
209
+ A && H !== Y.version && /* @__PURE__ */ s("p", {
210
+ className: "text-sm text-status-warning-text",
211
+ "data-testid": "doc-moved-on",
212
+ children: [
213
+ "Someone saved version ",
214
+ Y.version,
215
+ " after you started editing version ",
216
+ H,
217
+ ". Your text is kept below; copy what you need, then discard and edit the latest."
218
+ ]
219
+ }),
220
+ A ? /* @__PURE__ */ o(v, { children: /* @__PURE__ */ s(y, {
221
+ className: "space-y-3 pt-6",
222
+ children: [
223
+ /* @__PURE__ */ o(S, {
224
+ "aria-label": "Doc title",
225
+ value: M,
226
+ onChange: (e) => N(e.target.value)
227
+ }),
228
+ /* @__PURE__ */ o(n, {
229
+ value: P,
230
+ onChange: F,
231
+ minHeight: 240
232
+ }),
233
+ /* @__PURE__ */ o(S, {
234
+ "aria-label": "Change note",
235
+ placeholder: "What changed? (optional, shown in the history)",
236
+ value: I,
237
+ onChange: (e) => L(e.target.value)
238
+ }),
239
+ /* @__PURE__ */ s("div", {
240
+ className: "flex justify-end gap-2",
241
+ children: [/* @__PURE__ */ o(_, {
242
+ size: "sm",
243
+ variant: "ghost",
244
+ onClick: () => {
245
+ j(!1), z(null);
246
+ },
247
+ children: H === Y.version ? "Cancel" : "Discard my edits"
248
+ }), /* @__PURE__ */ o(_, {
249
+ size: "sm",
250
+ onClick: xe,
251
+ disabled: q.loading || H !== Y.version,
252
+ "data-testid": "doc-save",
253
+ children: q.loading ? "Saving…" : "Save new version"
254
+ })]
255
+ })
256
+ ]
257
+ }) }) : /* @__PURE__ */ o(v, { children: /* @__PURE__ */ o(y, {
258
+ className: "prose prose-sm max-w-none pt-6 dark:prose-invert",
259
+ children: Y.content.trim() ? /* @__PURE__ */ o(C, { children: Y.content }) : /* @__PURE__ */ o("p", {
260
+ className: "text-sm text-muted-foreground",
261
+ children: "This doc is empty."
262
+ })
263
+ }) }),
264
+ /* @__PURE__ */ s("div", {
265
+ className: "grid grid-cols-1 gap-6 lg:grid-cols-2",
266
+ children: [/* @__PURE__ */ s(v, {
267
+ "data-testid": "doc-history",
268
+ children: [/* @__PURE__ */ o(b, { children: /* @__PURE__ */ s(x, {
269
+ className: "flex items-center gap-2",
270
+ children: [
271
+ /* @__PURE__ */ o(ie, { className: "h-4 w-4" }),
272
+ " History (",
273
+ Q.length,
274
+ ")"
275
+ ]
276
+ }) }), /* @__PURE__ */ s(y, {
277
+ className: "space-y-2",
278
+ children: [/* @__PURE__ */ o("ol", {
279
+ className: "space-y-2",
280
+ children: Q.map((e) => {
281
+ let n = e.version === Y.version;
282
+ return /* @__PURE__ */ s("li", {
283
+ className: "space-y-1 rounded-md border p-2",
284
+ "data-testid": "doc-revision",
285
+ children: [/* @__PURE__ */ s("div", {
286
+ className: "flex flex-wrap items-center justify-between gap-2",
287
+ children: [/* @__PURE__ */ s("span", {
288
+ className: "text-sm font-medium",
289
+ children: [
290
+ "Version ",
291
+ e.version,
292
+ n ? " (current)" : ""
293
+ ]
294
+ }), /* @__PURE__ */ s("span", {
295
+ className: "flex gap-1",
296
+ children: [/* @__PURE__ */ o(_, {
297
+ size: "sm",
298
+ variant: "ghost",
299
+ className: "h-7 text-xs",
300
+ "aria-expanded": B === e.version,
301
+ onClick: () => V(B === e.version ? null : e.version),
302
+ children: B === e.version ? "Hide" : "View"
303
+ }), !n && !A && /* @__PURE__ */ s(c, { children: [/* @__PURE__ */ o(g, {
304
+ asChild: !0,
305
+ children: /* @__PURE__ */ o(_, {
306
+ size: "sm",
307
+ variant: "outline",
308
+ className: "h-7 text-xs",
309
+ disabled: X,
310
+ "data-testid": "doc-restore",
311
+ children: "Restore"
312
+ })
313
+ }), /* @__PURE__ */ s(d, { children: [/* @__PURE__ */ s(m, { children: [/* @__PURE__ */ s(h, { children: [
314
+ "Restore version ",
315
+ e.version,
316
+ "?"
317
+ ] }), /* @__PURE__ */ s(f, { children: [
318
+ "Its title and text become version ",
319
+ Y.version + 1,
320
+ ". Nothing is deleted: version ",
321
+ Y.version,
322
+ " stays in the history."
323
+ ] })] }), /* @__PURE__ */ s(p, { children: [/* @__PURE__ */ o(u, { children: "Cancel" }), /* @__PURE__ */ o(l, {
324
+ onClick: () => Z(() => he({ variables: {
325
+ id: Y.id,
326
+ toVersion: e.version,
327
+ expectedVersion: Y.version
328
+ } }), "The version could not be restored."),
329
+ children: "Restore"
330
+ })] })] })] })]
331
+ })]
332
+ }), /* @__PURE__ */ s("p", {
333
+ className: "text-xs text-muted-foreground",
334
+ children: [
335
+ D(e.createdAt),
336
+ " · ",
337
+ /* @__PURE__ */ o(t, { id: e.createdBy }),
338
+ e.changeNote ? ` · ${e.changeNote}` : ""
339
+ ]
340
+ })]
341
+ }, e.id);
342
+ })
343
+ }), $ && /* @__PURE__ */ s("div", {
344
+ className: "space-y-1 rounded-md border bg-muted/40 p-3",
345
+ "data-testid": "doc-revision-view",
346
+ children: [/* @__PURE__ */ s("p", {
347
+ className: "text-sm font-medium",
348
+ children: [
349
+ "Version ",
350
+ $.version,
351
+ ": ",
352
+ $.title
353
+ ]
354
+ }), /* @__PURE__ */ o("div", {
355
+ className: "prose prose-sm max-w-none dark:prose-invert",
356
+ children: /* @__PURE__ */ o(C, { children: $.content })
357
+ })]
358
+ })]
359
+ })]
360
+ }), /* @__PURE__ */ s(v, {
361
+ "data-testid": "doc-linked-items",
362
+ children: [/* @__PURE__ */ o(b, { children: /* @__PURE__ */ s(x, {
363
+ className: "flex items-center gap-2",
364
+ children: [
365
+ /* @__PURE__ */ o(ae, { className: "h-4 w-4" }),
366
+ " Linked work items (",
367
+ Y.linkedWorkItems.length,
368
+ ")"
369
+ ]
370
+ }) }), /* @__PURE__ */ s(y, {
371
+ className: "space-y-2",
372
+ children: [Y.linkedWorkItems.length === 0 && /* @__PURE__ */ o("p", {
373
+ className: "text-sm text-muted-foreground",
374
+ children: "Not linked to any work item. Link docs from a task's “Linked Docs” panel."
375
+ }), Y.linkedWorkItems.map((e) => /* @__PURE__ */ s("div", {
376
+ className: "flex items-center justify-between gap-2 rounded-md border p-2",
377
+ children: [/* @__PURE__ */ s("button", {
378
+ type: "button",
379
+ className: "min-w-0 truncate text-left text-sm hover:underline",
380
+ onClick: () => k(`/tasks/task-detail-page?taskId=${encodeURIComponent(e.id)}`),
381
+ children: [
382
+ /* @__PURE__ */ o("span", {
383
+ className: "text-muted-foreground",
384
+ children: e.key
385
+ }),
386
+ " ",
387
+ e.title
388
+ ]
389
+ }), /* @__PURE__ */ o(_, {
390
+ size: "icon",
391
+ variant: "ghost",
392
+ disabled: ye.loading,
393
+ "aria-label": `Unlink ${e.title}`,
394
+ onClick: () => Z(() => J({ variables: {
395
+ docId: Y.id,
396
+ workItemId: e.id
397
+ } }), "The work item could not be unlinked."),
398
+ children: /* @__PURE__ */ o(oe, { className: "h-4 w-4" })
399
+ })]
400
+ }, e.id))]
401
+ })]
402
+ })]
403
+ })
404
+ ]
405
+ });
406
+ }
407
+ //#endregion
408
+ export { O as DocsDocDetailPagePage };
409
+
410
+ //# sourceMappingURL=DocsDocDetailPagePage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DocsDocDetailPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/DocsDocDetailPagePage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { useSearchParams } from 'react-router';\nimport { gql } from '@apollo/client';\nimport { useMutation, useQuery } from '@apollo/client/react';\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n AlertDialogTrigger,\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n Input,\n} from '@burdenoff/fe-libs/ui';\nimport { Markdown } from '@burdenoff/fe-libs/shared/components';\nimport { ArrowLeft, History, Link2, X } from 'lucide-react';\nimport { MarkdownEditor } from '#src/components/MarkdownEditor';\nimport { usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\nimport { PersonName } from '../people/People';\nimport { throwOnError } from '../utils/mutationResult';\nimport { DOC_STATUSES, DocStatusBadge, type DocStatus } from '../docs/DocStatusBadge';\n\n/**\n * One doc (P1.4): read it, edit it with a change note, publish or archive it,\n * browse its history and restore an older version, see and unlink the work\n * items it is attached to, and delete it.\n *\n * Every write carries `expectedVersion` — the version on screen — so a save\n * over someone else's newer edit is refused with the reason, and the editor\n * keeps the unsaved text rather than overwriting theirs.\n */\n\nconst DOC = gql`\n query DocDetail($id: ID!) {\n planmagnetDoc(id: $id) {\n id\n title\n content\n status\n version\n createdBy\n createdAt\n updatedBy\n updatedAt\n revisions {\n id\n version\n title\n content\n changeNote\n createdBy\n createdAt\n }\n linkedWorkItems {\n id\n key\n title\n }\n }\n }\n`;\nconst UPDATE = gql`\n mutation DocUpdate($id: ID!, $input: PlanmagnetUpdateDocInput!) {\n planmagnetUpdateDoc(id: $id, input: $input) {\n id\n version\n status\n }\n }\n`;\nconst REVERT = gql`\n mutation DocRevert($id: ID!, $toVersion: Int!, $expectedVersion: Int) {\n planmagnetRevertDoc(id: $id, toVersion: $toVersion, expectedVersion: $expectedVersion) {\n id\n version\n }\n }\n`;\nconst DELETE = gql`\n mutation DocDelete($id: ID!) {\n planmagnetDeleteDoc(id: $id)\n }\n`;\nconst UNLINK = gql`\n mutation DocUnlinkWorkItem($docId: ID!, $workItemId: ID!) {\n planmagnetUnlinkDocFromWorkItem(docId: $docId, workItemId: $workItemId)\n }\n`;\n\ninterface Revision {\n id: string;\n version: number;\n title: string;\n content: string;\n changeNote: string | null;\n createdBy: string;\n createdAt: string;\n}\n\ninterface Doc {\n id: string;\n title: string;\n content: string;\n status: string;\n version: number;\n createdBy: string;\n createdAt: string;\n updatedBy: string | null;\n updatedAt: string;\n revisions: Revision[];\n linkedWorkItems: { id: string; key: string; title: string }[];\n}\n\nconst messageOf = (e: unknown, fallback: string) => (e instanceof Error ? e.message : fallback);\nconst when = (iso: string) => new Date(iso).toLocaleString();\n\nexport function DocsDocDetailPagePage() {\n const [params] = useSearchParams();\n const docId = params.get('docId') ?? '';\n const navigate = usePlanMagnetNavigate();\n const [editing, setEditing] = useState(false);\n const [title, setTitle] = useState('');\n const [content, setContent] = useState('');\n const [changeNote, setChangeNote] = useState('');\n const [error, setError] = useState<string | null>(null);\n const [viewing, setViewing] = useState<number | null>(null);\n // The version the editor started from — not the one on screen now, which a\n // refetch after someone else's save may already have moved past.\n const [editBase, setEditBase] = useState<number | null>(null);\n\n const {\n data,\n loading,\n error: loadError,\n refetch,\n } = useQuery<{ planmagnetDoc: Doc | null }>(DOC, {\n variables: { id: docId },\n skip: !docId,\n // Cached copies go stale here: a deleted doc, or someone else's newer version.\n fetchPolicy: 'cache-and-network',\n });\n const after = { refetchQueries: ['DocDetail'], awaitRefetchQueries: true };\n const [update, updateState] = useMutation(UPDATE, after);\n const [revert, revertState] = useMutation(REVERT, after);\n const [remove, removeState] = useMutation(DELETE, { refetchQueries: ['DocsList'] });\n const [unlink, unlinkState] = useMutation(UNLINK, after);\n\n const doc = data?.planmagnetDoc;\n const busy = updateState.loading || revertState.loading || removeState.loading;\n\n // Refusals are panel-level: a refused write refetches, and anything the\n // refetch re-renders must not take the reason with it.\n const run = async (action: () => Promise<{ error?: unknown }>, fallback: string) => {\n setError(null);\n try {\n await throwOnError(action());\n return true;\n } catch (e) {\n setError(messageOf(e, fallback));\n // A refusal because the doc moved on: show the current version, but\n // leave the editor's text alone so nothing typed is lost.\n await refetch();\n return false;\n }\n };\n\n if (!docId) {\n return <div className=\"p-6 text-sm text-muted-foreground\">No doc selected.</div>;\n }\n if (loading && !data) {\n return <div className=\"p-6 text-sm text-muted-foreground\">Loading doc…</div>;\n }\n if (loadError && !doc) {\n return (\n <p role=\"alert\" className=\"p-6 text-sm text-destructive\">\n The doc could not be loaded: {loadError.message}\n </p>\n );\n }\n if (!doc) {\n return (\n <div className=\"space-y-3 p-6\">\n <p className=\"text-sm text-muted-foreground\">\n This doc does not exist in this workspace, or it was deleted.\n </p>\n <Button size=\"sm\" variant=\"outline\" onClick={() => navigate('/docs/docs-page')}>\n Back to docs\n </Button>\n </div>\n );\n }\n\n const startEditing = () => {\n setTitle(doc.title);\n setContent(doc.content);\n setChangeNote('');\n setError(null);\n setEditBase(doc.version);\n setEditing(true);\n };\n const save = async () => {\n const saved = await run(\n () =>\n update({\n variables: {\n id: doc.id,\n input: {\n title: title.trim(),\n content,\n ...(changeNote.trim() ? { changeNote: changeNote.trim() } : {}),\n expectedVersion: editBase,\n },\n },\n }),\n 'The doc could not be saved.'\n );\n if (saved) setEditing(false);\n };\n\n const revisions = [...doc.revisions].sort((a, b) => b.version - a.version);\n const shown = viewing === null ? null : revisions.find((r) => r.version === viewing);\n\n return (\n <div className=\"space-y-6 p-6\" data-testid=\"doc-detail\">\n <Button size=\"sm\" variant=\"ghost\" onClick={() => navigate('/docs/docs-page')}>\n <ArrowLeft className=\"mr-1 h-4 w-4\" />\n All docs\n </Button>\n\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div className=\"min-w-0 space-y-1\">\n <h1 className=\"text-2xl font-semibold break-words\" data-testid=\"doc-title\">\n {doc.title}\n </h1>\n <p className=\"text-xs text-muted-foreground\">\n <DocStatusBadge status={doc.status} /> · version {doc.version} · updated{' '}\n {when(doc.updatedAt)} by <PersonName id={doc.updatedBy ?? doc.createdBy} />\n </p>\n </div>\n {!editing && (\n <div className=\"flex flex-wrap gap-2\">\n {DOC_STATUSES.filter((s) => s !== doc.status).map((s: DocStatus) => (\n <Button\n key={s}\n size=\"sm\"\n variant=\"outline\"\n disabled={busy}\n onClick={() =>\n run(\n () =>\n update({\n variables: {\n id: doc.id,\n input: { status: s, expectedVersion: doc.version },\n },\n }),\n 'The status could not be changed.'\n )\n }\n >\n {s === 'PUBLISHED' ? 'Publish' : s === 'ARCHIVED' ? 'Archive' : 'Back to draft'}\n </Button>\n ))}\n <Button size=\"sm\" onClick={startEditing} data-testid=\"doc-edit\">\n Edit\n </Button>\n <AlertDialog>\n <AlertDialogTrigger asChild>\n <Button size=\"sm\" variant=\"outline\" disabled={busy}>\n Delete\n </Button>\n </AlertDialogTrigger>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>Delete “{doc.title}”?</AlertDialogTitle>\n <AlertDialogDescription>\n The doc and its history are removed for everyone, and it is unlinked from{' '}\n {doc.linkedWorkItems.length} work item\n {doc.linkedWorkItems.length === 1 ? '' : 's'}.\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel>Keep it</AlertDialogCancel>\n <AlertDialogAction\n className=\"bg-destructive text-destructive-foreground hover:bg-destructive/90\"\n onClick={async () => {\n const deleted = await run(\n () => remove({ variables: { id: doc.id } }),\n 'The doc could not be deleted.'\n );\n if (deleted) navigate('/docs/docs-page');\n }}\n >\n Delete\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </div>\n )}\n </div>\n\n {error && (\n <p role=\"alert\" className=\"text-sm text-destructive\" data-testid=\"doc-error\">\n {error}\n </p>\n )}\n {editing && editBase !== doc.version && (\n <p className=\"text-sm text-status-warning-text\" data-testid=\"doc-moved-on\">\n Someone saved version {doc.version} after you started editing version {editBase}. Your\n text is kept below; copy what you need, then discard and edit the latest.\n </p>\n )}\n\n {editing ? (\n <Card>\n <CardContent className=\"space-y-3 pt-6\">\n <Input\n aria-label=\"Doc title\"\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n />\n <MarkdownEditor value={content} onChange={setContent} minHeight={240} />\n <Input\n aria-label=\"Change note\"\n placeholder=\"What changed? (optional, shown in the history)\"\n value={changeNote}\n onChange={(e) => setChangeNote(e.target.value)}\n />\n <div className=\"flex justify-end gap-2\">\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => {\n setEditing(false);\n setError(null);\n }}\n >\n {editBase !== doc.version ? 'Discard my edits' : 'Cancel'}\n </Button>\n <Button\n size=\"sm\"\n onClick={save}\n disabled={updateState.loading || editBase !== doc.version}\n data-testid=\"doc-save\"\n >\n {updateState.loading ? 'Saving…' : 'Save new version'}\n </Button>\n </div>\n </CardContent>\n </Card>\n ) : (\n <Card>\n <CardContent className=\"prose prose-sm max-w-none pt-6 dark:prose-invert\">\n {doc.content.trim() ? (\n <Markdown>{doc.content}</Markdown>\n ) : (\n <p className=\"text-sm text-muted-foreground\">This doc is empty.</p>\n )}\n </CardContent>\n </Card>\n )}\n\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-2\">\n <Card data-testid=\"doc-history\">\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <History className=\"h-4 w-4\" /> History ({revisions.length})\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-2\">\n <ol className=\"space-y-2\">\n {revisions.map((rev) => {\n const current = rev.version === doc.version;\n return (\n <li\n key={rev.id}\n className=\"space-y-1 rounded-md border p-2\"\n data-testid=\"doc-revision\"\n >\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <span className=\"text-sm font-medium\">\n Version {rev.version}\n {current ? ' (current)' : ''}\n </span>\n <span className=\"flex gap-1\">\n <Button\n size=\"sm\"\n variant=\"ghost\"\n className=\"h-7 text-xs\"\n aria-expanded={viewing === rev.version}\n onClick={() => setViewing(viewing === rev.version ? null : rev.version)}\n >\n {viewing === rev.version ? 'Hide' : 'View'}\n </Button>\n {!current && !editing && (\n <AlertDialog>\n <AlertDialogTrigger asChild>\n <Button\n size=\"sm\"\n variant=\"outline\"\n className=\"h-7 text-xs\"\n disabled={busy}\n data-testid=\"doc-restore\"\n >\n Restore\n </Button>\n </AlertDialogTrigger>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>Restore version {rev.version}?</AlertDialogTitle>\n <AlertDialogDescription>\n Its title and text become version {doc.version + 1}. Nothing is\n deleted: version {doc.version} stays in the history.\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel>Cancel</AlertDialogCancel>\n <AlertDialogAction\n onClick={() =>\n run(\n () =>\n revert({\n variables: {\n id: doc.id,\n toVersion: rev.version,\n expectedVersion: doc.version,\n },\n }),\n 'The version could not be restored.'\n )\n }\n >\n Restore\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n )}\n </span>\n </div>\n <p className=\"text-xs text-muted-foreground\">\n {when(rev.createdAt)} · <PersonName id={rev.createdBy} />\n {rev.changeNote ? ` · ${rev.changeNote}` : ''}\n </p>\n </li>\n );\n })}\n </ol>\n {shown && (\n <div\n className=\"space-y-1 rounded-md border bg-muted/40 p-3\"\n data-testid=\"doc-revision-view\"\n >\n <p className=\"text-sm font-medium\">\n Version {shown.version}: {shown.title}\n </p>\n <div className=\"prose prose-sm max-w-none dark:prose-invert\">\n <Markdown>{shown.content}</Markdown>\n </div>\n </div>\n )}\n </CardContent>\n </Card>\n\n <Card data-testid=\"doc-linked-items\">\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Link2 className=\"h-4 w-4\" /> Linked work items ({doc.linkedWorkItems.length})\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-2\">\n {doc.linkedWorkItems.length === 0 && (\n <p className=\"text-sm text-muted-foreground\">\n Not linked to any work item. Link docs from a task&apos;s “Linked Docs” panel.\n </p>\n )}\n {doc.linkedWorkItems.map((item) => (\n <div\n key={item.id}\n className=\"flex items-center justify-between gap-2 rounded-md border p-2\"\n >\n <button\n type=\"button\"\n className=\"min-w-0 truncate text-left text-sm hover:underline\"\n onClick={() =>\n navigate(`/tasks/task-detail-page?taskId=${encodeURIComponent(item.id)}`)\n }\n >\n <span className=\"text-muted-foreground\">{item.key}</span> {item.title}\n </button>\n <Button\n size=\"icon\"\n variant=\"ghost\"\n disabled={unlinkState.loading}\n aria-label={`Unlink ${item.title}`}\n onClick={() =>\n run(\n () => unlink({ variables: { docId: doc.id, workItemId: item.id } }),\n 'The work item could not be unlinked.'\n )\n }\n >\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare const docDetailPath: (id: string) => string;
2
+ export declare function DocsDocsPagePage(): import("react/jsx-runtime").JSX.Element;
3
+ //# sourceMappingURL=DocsDocsPagePage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DocsDocsPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/DocsDocsPagePage.tsx"],"names":[],"mappings":"AA2EA,eAAO,MAAM,aAAa,GAAI,IAAI,MAAM,WACiB,CAAC;AAE1D,wBAAgB,gBAAgB,4CA0M/B"}