@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.
- package/dist/generated/wspace-types.d.ts +21 -0
- package/dist/generated/wspace-types.d.ts.map +1 -1
- package/dist/planmagnet/PlanMagnetRoutes.d.ts.map +1 -1
- package/dist/planmagnet/PlanMagnetRoutes.js +67 -59
- package/dist/planmagnet/PlanMagnetRoutes.js.map +1 -1
- package/dist/planmagnet/docs/DocStatusBadge.d.ts +8 -0
- package/dist/planmagnet/docs/DocStatusBadge.d.ts.map +1 -0
- package/dist/planmagnet/docs/DocStatusBadge.js +28 -0
- package/dist/planmagnet/docs/DocStatusBadge.js.map +1 -0
- package/dist/planmagnet/pages/DocsDocDetailPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/DocsDocDetailPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/DocsDocDetailPagePage.js +410 -0
- package/dist/planmagnet/pages/DocsDocDetailPagePage.js.map +1 -0
- package/dist/planmagnet/pages/DocsDocsPagePage.d.ts +3 -0
- package/dist/planmagnet/pages/DocsDocsPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/DocsDocsPagePage.js +224 -0
- package/dist/planmagnet/pages/DocsDocsPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.js +100 -94
- package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.js.map +1 -1
- package/dist/planmagnet/pages/TasksTaskDetailPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/TasksTaskDetailPagePage.js +130 -128
- package/dist/planmagnet/pages/TasksTaskDetailPagePage.js.map +1 -1
- package/dist/planmagnet/releases/ReleaseGatesCard.d.ts +6 -0
- package/dist/planmagnet/releases/ReleaseGatesCard.d.ts.map +1 -0
- package/dist/planmagnet/releases/ReleaseGatesCard.js +173 -0
- package/dist/planmagnet/releases/ReleaseGatesCard.js.map +1 -0
- 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'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 @@
|
|
|
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"}
|