@burdenoff/microfe-planmagnet 2026.925.6 → 2026.925.8
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 +17 -0
- package/dist/generated/wspace-types.d.ts.map +1 -1
- package/dist/planmagnet/board/ProjectBoard.d.ts +5 -0
- package/dist/planmagnet/board/ProjectBoard.d.ts.map +1 -0
- package/dist/planmagnet/board/ProjectBoard.js +492 -0
- package/dist/planmagnet/board/ProjectBoard.js.map +1 -0
- package/dist/planmagnet/create/CreateDialogs.d.ts.map +1 -1
- package/dist/planmagnet/create/CreateDialogs.js +118 -117
- package/dist/planmagnet/create/CreateDialogs.js.map +1 -1
- package/dist/planmagnet/pages/GoalsCreateObjectivePagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/GoalsCreateObjectivePagePage.js.map +1 -1
- package/dist/planmagnet/pages/GoalsObjectiveDetailPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/GoalsObjectiveDetailPagePage.js +322 -280
- package/dist/planmagnet/pages/GoalsObjectiveDetailPagePage.js.map +1 -1
- package/dist/planmagnet/pages/TasksCreateTaskPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/TasksCreateTaskPagePage.js.map +1 -1
- package/dist/planmagnet/pages/TasksEditTaskPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/TasksEditTaskPagePage.js.map +1 -1
- package/dist/planmagnet/pages/TasksTaskDetailPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/TasksTaskDetailPagePage.js +147 -126
- package/dist/planmagnet/pages/TasksTaskDetailPagePage.js.map +1 -1
- package/dist/planmagnet/pages/TasksTasksPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/TasksTasksPagePage.js +129 -93
- package/dist/planmagnet/pages/TasksTasksPagePage.js.map +1 -1
- package/dist/planmagnet/sprints/SprintControls.d.ts.map +1 -1
- package/dist/planmagnet/sprints/SprintControls.js +202 -201
- package/dist/planmagnet/sprints/SprintControls.js.map +1 -1
- package/dist/planmagnet/utils/mutationResult.d.ts +16 -0
- package/dist/planmagnet/utils/mutationResult.d.ts.map +1 -0
- package/dist/planmagnet/utils/mutationResult.js +10 -0
- package/dist/planmagnet/utils/mutationResult.js.map +1 -0
- package/package.json +3 -2
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import { usePlanMagnet as e } from "../providers/PlanMagnetProvider.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
2
|
+
import { throwOnError as t } from "../utils/mutationResult.js";
|
|
3
|
+
import { MarkdownEditor as n } from "../../components/MarkdownEditor.js";
|
|
4
|
+
import { useState as r } from "react";
|
|
5
|
+
import { FileText as i, Plus as a, X as o } from "lucide-react";
|
|
6
|
+
import { gql as s } from "@apollo/client";
|
|
7
|
+
import { useMutation as c, useQuery as l } from "@apollo/client/react";
|
|
8
|
+
import { jsx as u, jsxs as d } from "react/jsx-runtime";
|
|
9
|
+
import { Badge as f, Button as p, Card as m, CardContent as h, CardHeader as g, CardTitle as _, Input as v } from "@burdenoff/fe-libs/ui";
|
|
9
10
|
//#region src/planmagnet/pages/TasksTaskDetailPagePage.tsx
|
|
10
|
-
var
|
|
11
|
+
var y = s`
|
|
11
12
|
query GetWorkItemDetail($workItemId: ID!) {
|
|
12
13
|
planmagnetWorkItem(id: $workItemId) {
|
|
13
14
|
id
|
|
@@ -29,7 +30,7 @@ var v = o`
|
|
|
29
30
|
updatedAt
|
|
30
31
|
}
|
|
31
32
|
}
|
|
32
|
-
`,
|
|
33
|
+
`, b = s`
|
|
33
34
|
query GetWorkItemDocs($workItemId: ID!) {
|
|
34
35
|
planmagnetWorkItemDocs(workItemId: $workItemId) {
|
|
35
36
|
id
|
|
@@ -39,28 +40,28 @@ var v = o`
|
|
|
39
40
|
updatedAt
|
|
40
41
|
}
|
|
41
42
|
}
|
|
42
|
-
`,
|
|
43
|
+
`, x = s`
|
|
43
44
|
mutation CreateDocForWorkItem($input: PlanmagnetCreateDocInput!) {
|
|
44
45
|
planmagnetCreateDoc(input: $input) {
|
|
45
46
|
id
|
|
46
47
|
}
|
|
47
48
|
}
|
|
48
|
-
`,
|
|
49
|
+
`, S = s`
|
|
49
50
|
mutation LinkDocToWorkItem($docId: ID!, $workItemId: ID!) {
|
|
50
51
|
planmagnetLinkDocToWorkItem(docId: $docId, workItemId: $workItemId) {
|
|
51
52
|
id
|
|
52
53
|
}
|
|
53
54
|
}
|
|
54
|
-
`,
|
|
55
|
+
`, C = s`
|
|
55
56
|
mutation UnlinkDocFromWorkItem($docId: ID!, $workItemId: ID!) {
|
|
56
57
|
planmagnetUnlinkDocFromWorkItem(docId: $docId, workItemId: $workItemId)
|
|
57
58
|
}
|
|
58
|
-
`,
|
|
59
|
+
`, w = {
|
|
59
60
|
LOW: "bg-gray-100 text-gray-800",
|
|
60
61
|
MEDIUM: "bg-blue-100 text-blue-800",
|
|
61
62
|
HIGH: "bg-orange-100 text-orange-800",
|
|
62
63
|
CRITICAL: "bg-red-100 text-red-800"
|
|
63
|
-
},
|
|
64
|
+
}, T = {
|
|
64
65
|
BACKLOG: "bg-gray-100 text-gray-800",
|
|
65
66
|
TODO: "bg-blue-100 text-blue-800",
|
|
66
67
|
IN_PROGRESS: "bg-yellow-100 text-yellow-800",
|
|
@@ -69,137 +70,157 @@ var v = o`
|
|
|
69
70
|
BLOCKED: "bg-red-100 text-red-800",
|
|
70
71
|
TESTING: "bg-teal-100 text-teal-800",
|
|
71
72
|
CANCELLED: "bg-gray-100 text-gray-800"
|
|
72
|
-
},
|
|
73
|
+
}, E = {
|
|
73
74
|
DRAFT: "bg-gray-100 text-gray-800",
|
|
74
75
|
PUBLISHED: "bg-green-100 text-green-800",
|
|
75
76
|
ARCHIVED: "bg-gray-100 text-gray-500"
|
|
76
77
|
};
|
|
77
|
-
function
|
|
78
|
-
let [
|
|
78
|
+
function D({ workItemId: e }) {
|
|
79
|
+
let [s, f] = r(!1), [y, w] = r(""), [T, D] = r(""), { data: O, loading: k, error: A, refetch: j } = l(b, {
|
|
79
80
|
variables: { workItemId: e },
|
|
80
81
|
skip: !e
|
|
81
|
-
}), [
|
|
82
|
-
if (!
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
82
|
+
}), [M, { loading: N }] = c(x), [P] = c(S), [F, { loading: I }] = c(C), [L, R] = r(null), z = O?.planmagnetWorkItemDocs ?? [], B = async () => {
|
|
83
|
+
if (!(!y.trim() || !T.trim())) {
|
|
84
|
+
R(null);
|
|
85
|
+
try {
|
|
86
|
+
let n = (await t(M({ variables: { input: {
|
|
87
|
+
title: y.trim(),
|
|
88
|
+
content: T.trim()
|
|
89
|
+
} } }))).data?.planmagnetCreateDoc?.id;
|
|
90
|
+
n && await t(P({ variables: {
|
|
91
|
+
docId: n,
|
|
92
|
+
workItemId: e
|
|
93
|
+
} }));
|
|
94
|
+
} catch (e) {
|
|
95
|
+
R(e instanceof Error ? e.message : "The doc could not be saved.");
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
w(""), D(""), f(!1), j();
|
|
99
|
+
}
|
|
100
|
+
}, V = async (n) => {
|
|
101
|
+
R(null);
|
|
102
|
+
try {
|
|
103
|
+
await t(F({ variables: {
|
|
104
|
+
docId: n,
|
|
105
|
+
workItemId: e
|
|
106
|
+
} }));
|
|
107
|
+
} catch (e) {
|
|
108
|
+
R(e instanceof Error ? e.message : "The doc could not be unlinked.");
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
j();
|
|
96
112
|
};
|
|
97
|
-
return /* @__PURE__ */
|
|
113
|
+
return /* @__PURE__ */ d(m, { children: [/* @__PURE__ */ d(g, {
|
|
98
114
|
className: "flex flex-row items-center justify-between space-y-0",
|
|
99
|
-
children: [/* @__PURE__ */
|
|
115
|
+
children: [/* @__PURE__ */ u(_, { children: "Linked Docs" }), !s && /* @__PURE__ */ d(p, {
|
|
100
116
|
size: "sm",
|
|
101
117
|
variant: "outline",
|
|
102
|
-
onClick: () =>
|
|
103
|
-
children: [/* @__PURE__ */
|
|
118
|
+
onClick: () => f(!0),
|
|
119
|
+
children: [/* @__PURE__ */ u(a, { className: "h-4 w-4 mr-1" }), "New Doc"]
|
|
104
120
|
})]
|
|
105
|
-
}), /* @__PURE__ */
|
|
121
|
+
}), /* @__PURE__ */ d(h, {
|
|
106
122
|
className: "space-y-4",
|
|
107
123
|
children: [
|
|
108
|
-
|
|
124
|
+
s && /* @__PURE__ */ d("div", {
|
|
109
125
|
className: "space-y-3 rounded-md border border-input p-3",
|
|
110
126
|
children: [
|
|
111
|
-
/* @__PURE__ */
|
|
127
|
+
/* @__PURE__ */ u(v, {
|
|
112
128
|
placeholder: "Doc title",
|
|
113
|
-
value:
|
|
114
|
-
onChange: (e) =>
|
|
129
|
+
value: y,
|
|
130
|
+
onChange: (e) => w(e.target.value)
|
|
115
131
|
}),
|
|
116
|
-
/* @__PURE__ */
|
|
117
|
-
value:
|
|
118
|
-
onChange:
|
|
132
|
+
/* @__PURE__ */ u(n, {
|
|
133
|
+
value: T,
|
|
134
|
+
onChange: D,
|
|
119
135
|
placeholder: "Write the spec/doc content...",
|
|
120
136
|
minHeight: 140
|
|
121
137
|
}),
|
|
122
|
-
/* @__PURE__ */
|
|
138
|
+
/* @__PURE__ */ d("div", {
|
|
123
139
|
className: "flex gap-2 justify-end",
|
|
124
|
-
children: [/* @__PURE__ */
|
|
140
|
+
children: [/* @__PURE__ */ u(p, {
|
|
125
141
|
size: "sm",
|
|
126
142
|
variant: "ghost",
|
|
127
143
|
onClick: () => {
|
|
128
|
-
|
|
144
|
+
f(!1), w(""), D("");
|
|
129
145
|
},
|
|
130
146
|
children: "Cancel"
|
|
131
|
-
}), /* @__PURE__ */
|
|
147
|
+
}), /* @__PURE__ */ u(p, {
|
|
132
148
|
size: "sm",
|
|
133
|
-
disabled:
|
|
134
|
-
onClick:
|
|
135
|
-
children:
|
|
149
|
+
disabled: N || !y.trim() || !T.trim(),
|
|
150
|
+
onClick: B,
|
|
151
|
+
children: N ? "Creating..." : "Create & Link"
|
|
136
152
|
})]
|
|
137
153
|
})
|
|
138
154
|
]
|
|
139
155
|
}),
|
|
140
|
-
|
|
156
|
+
k && /* @__PURE__ */ u("p", {
|
|
141
157
|
className: "text-sm text-muted-foreground",
|
|
142
158
|
children: "Loading docs..."
|
|
143
159
|
}),
|
|
144
|
-
|
|
160
|
+
A && /* @__PURE__ */ d("p", {
|
|
145
161
|
className: "text-sm text-red-500",
|
|
146
|
-
children: ["Error: ",
|
|
162
|
+
children: ["Error: ", A.message]
|
|
163
|
+
}),
|
|
164
|
+
L && /* @__PURE__ */ u("p", {
|
|
165
|
+
role: "alert",
|
|
166
|
+
className: "text-sm text-destructive",
|
|
167
|
+
children: L
|
|
147
168
|
}),
|
|
148
|
-
!
|
|
169
|
+
!k && !A && z.length === 0 && !s && /* @__PURE__ */ u("p", {
|
|
149
170
|
className: "text-sm text-muted-foreground",
|
|
150
171
|
children: "No docs linked to this work item yet."
|
|
151
172
|
}),
|
|
152
|
-
|
|
173
|
+
z.map((e) => /* @__PURE__ */ d("div", {
|
|
153
174
|
className: "flex items-center justify-between gap-3 rounded-md border border-input p-3",
|
|
154
|
-
children: [/* @__PURE__ */
|
|
175
|
+
children: [/* @__PURE__ */ d("div", {
|
|
155
176
|
className: "flex items-center gap-2 min-w-0",
|
|
156
|
-
children: [/* @__PURE__ */
|
|
177
|
+
children: [/* @__PURE__ */ u(i, { className: "h-4 w-4 text-muted-foreground shrink-0" }), /* @__PURE__ */ d("div", {
|
|
157
178
|
className: "min-w-0",
|
|
158
|
-
children: [/* @__PURE__ */
|
|
179
|
+
children: [/* @__PURE__ */ u("p", {
|
|
159
180
|
className: "text-sm font-medium truncate",
|
|
160
181
|
children: e.title
|
|
161
|
-
}), /* @__PURE__ */
|
|
182
|
+
}), /* @__PURE__ */ d("p", {
|
|
162
183
|
className: "text-xs text-muted-foreground",
|
|
163
184
|
children: ["v", e.version]
|
|
164
185
|
})]
|
|
165
186
|
})]
|
|
166
|
-
}), /* @__PURE__ */
|
|
187
|
+
}), /* @__PURE__ */ d("div", {
|
|
167
188
|
className: "flex items-center gap-2 shrink-0",
|
|
168
|
-
children: [/* @__PURE__ */
|
|
169
|
-
className: `text-xs px-2 py-0.5 rounded-full capitalize ${
|
|
189
|
+
children: [/* @__PURE__ */ u("span", {
|
|
190
|
+
className: `text-xs px-2 py-0.5 rounded-full capitalize ${E[e.status] ?? ""}`,
|
|
170
191
|
children: e.status.toLowerCase()
|
|
171
|
-
}), /* @__PURE__ */
|
|
192
|
+
}), /* @__PURE__ */ u(p, {
|
|
172
193
|
size: "icon",
|
|
173
194
|
variant: "ghost",
|
|
174
|
-
disabled:
|
|
175
|
-
onClick: () =>
|
|
195
|
+
disabled: I,
|
|
196
|
+
onClick: () => V(e.id),
|
|
176
197
|
"aria-label": `Unlink ${e.title}`,
|
|
177
|
-
children: /* @__PURE__ */
|
|
198
|
+
children: /* @__PURE__ */ u(o, { className: "h-4 w-4" })
|
|
178
199
|
})]
|
|
179
200
|
})]
|
|
180
201
|
}, e.id))
|
|
181
202
|
]
|
|
182
203
|
})] });
|
|
183
204
|
}
|
|
184
|
-
function
|
|
185
|
-
let { workspaceId: t } = e(), n = new URLSearchParams(window.location.search).get("taskId") ?? "", { data: r, loading: i, error: a } =
|
|
205
|
+
function O() {
|
|
206
|
+
let { workspaceId: t } = e(), n = new URLSearchParams(window.location.search).get("taskId") ?? "", { data: r, loading: i, error: a } = l(y, {
|
|
186
207
|
variables: { workItemId: n },
|
|
187
208
|
skip: !t || !n
|
|
188
209
|
});
|
|
189
|
-
if (i) return /* @__PURE__ */
|
|
210
|
+
if (i) return /* @__PURE__ */ u("div", {
|
|
190
211
|
className: "flex items-center justify-center p-12",
|
|
191
|
-
children: /* @__PURE__ */
|
|
212
|
+
children: /* @__PURE__ */ u("div", { className: "animate-spin h-8 w-8 border-2 border-primary border-t-transparent rounded-full" })
|
|
192
213
|
});
|
|
193
|
-
if (a) return /* @__PURE__ */
|
|
214
|
+
if (a) return /* @__PURE__ */ d("div", {
|
|
194
215
|
className: "p-6 text-red-500",
|
|
195
216
|
children: ["Error: ", a.message]
|
|
196
217
|
});
|
|
197
218
|
let o = r?.planmagnetWorkItem;
|
|
198
|
-
if (!o) return /* @__PURE__ */
|
|
219
|
+
if (!o) return /* @__PURE__ */ u("div", {
|
|
199
220
|
className: "p-6 text-muted-foreground",
|
|
200
221
|
children: "Task not found."
|
|
201
222
|
});
|
|
202
|
-
let s = o.status.toLowerCase().replace("_", " "),
|
|
223
|
+
let s = o.status.toLowerCase().replace("_", " "), c = [
|
|
203
224
|
{
|
|
204
225
|
action: "Task created",
|
|
205
226
|
by: o.reporterId ?? "Unknown",
|
|
@@ -216,41 +237,41 @@ function D() {
|
|
|
216
237
|
at: o.updatedAt
|
|
217
238
|
}
|
|
218
239
|
];
|
|
219
|
-
return /* @__PURE__ */
|
|
240
|
+
return /* @__PURE__ */ d("div", {
|
|
220
241
|
className: "space-y-6 p-6",
|
|
221
|
-
children: [/* @__PURE__ */
|
|
242
|
+
children: [/* @__PURE__ */ d("div", { children: [/* @__PURE__ */ u("h1", {
|
|
222
243
|
className: "text-2xl font-semibold",
|
|
223
244
|
children: o.title
|
|
224
|
-
}), /* @__PURE__ */
|
|
245
|
+
}), /* @__PURE__ */ d("p", {
|
|
225
246
|
className: "text-sm text-muted-foreground",
|
|
226
247
|
children: [
|
|
227
248
|
o.key,
|
|
228
249
|
" · ",
|
|
229
250
|
o.type.toLowerCase()
|
|
230
251
|
]
|
|
231
|
-
})] }), /* @__PURE__ */
|
|
252
|
+
})] }), /* @__PURE__ */ d("div", {
|
|
232
253
|
className: "grid grid-cols-1 lg:grid-cols-3 gap-6",
|
|
233
|
-
children: [/* @__PURE__ */
|
|
254
|
+
children: [/* @__PURE__ */ d("div", {
|
|
234
255
|
className: "lg:col-span-2 space-y-6",
|
|
235
256
|
children: [
|
|
236
|
-
/* @__PURE__ */
|
|
257
|
+
/* @__PURE__ */ d(m, { children: [/* @__PURE__ */ u(g, { children: /* @__PURE__ */ u(_, { children: "Description" }) }), /* @__PURE__ */ u(h, { children: /* @__PURE__ */ u("p", {
|
|
237
258
|
className: "text-sm",
|
|
238
259
|
children: o.description ?? "No description provided."
|
|
239
260
|
}) })] }),
|
|
240
|
-
/* @__PURE__ */
|
|
241
|
-
/* @__PURE__ */
|
|
261
|
+
/* @__PURE__ */ u(D, { workItemId: o.id }),
|
|
262
|
+
/* @__PURE__ */ d(m, { children: [/* @__PURE__ */ u(g, { children: /* @__PURE__ */ u(_, { children: "Activity" }) }), /* @__PURE__ */ u(h, { children: /* @__PURE__ */ u("div", {
|
|
242
263
|
className: "space-y-3",
|
|
243
|
-
children:
|
|
264
|
+
children: c.map((e, t) => /* @__PURE__ */ d("div", {
|
|
244
265
|
className: "flex gap-3",
|
|
245
|
-
children: [/* @__PURE__ */
|
|
266
|
+
children: [/* @__PURE__ */ d("div", {
|
|
246
267
|
className: "flex flex-col items-center",
|
|
247
|
-
children: [/* @__PURE__ */
|
|
248
|
-
}), /* @__PURE__ */
|
|
268
|
+
children: [/* @__PURE__ */ u("div", { className: "h-2.5 w-2.5 rounded-full bg-primary mt-1.5" }), t < c.length - 1 && /* @__PURE__ */ u("div", { className: "w-px flex-1 bg-border" })]
|
|
269
|
+
}), /* @__PURE__ */ d("div", {
|
|
249
270
|
className: "pb-3",
|
|
250
|
-
children: [/* @__PURE__ */
|
|
271
|
+
children: [/* @__PURE__ */ u("p", {
|
|
251
272
|
className: "text-sm",
|
|
252
273
|
children: e.action
|
|
253
|
-
}), /* @__PURE__ */
|
|
274
|
+
}), /* @__PURE__ */ d("p", {
|
|
254
275
|
className: "text-xs text-muted-foreground",
|
|
255
276
|
children: [
|
|
256
277
|
e.by,
|
|
@@ -262,100 +283,100 @@ function D() {
|
|
|
262
283
|
}, t))
|
|
263
284
|
}) })] })
|
|
264
285
|
]
|
|
265
|
-
}), /* @__PURE__ */
|
|
286
|
+
}), /* @__PURE__ */ u("div", {
|
|
266
287
|
className: "space-y-6",
|
|
267
|
-
children: /* @__PURE__ */
|
|
288
|
+
children: /* @__PURE__ */ d(m, { children: [/* @__PURE__ */ u(g, { children: /* @__PURE__ */ u(_, { children: "Details" }) }), /* @__PURE__ */ d(h, {
|
|
268
289
|
className: "space-y-3 text-sm",
|
|
269
290
|
children: [
|
|
270
|
-
/* @__PURE__ */
|
|
291
|
+
/* @__PURE__ */ d("div", {
|
|
271
292
|
className: "flex justify-between",
|
|
272
|
-
children: [/* @__PURE__ */
|
|
293
|
+
children: [/* @__PURE__ */ u("span", {
|
|
273
294
|
className: "text-muted-foreground",
|
|
274
295
|
children: "Status"
|
|
275
|
-
}), /* @__PURE__ */
|
|
276
|
-
className: `text-xs px-2 py-0.5 rounded-full capitalize ${
|
|
296
|
+
}), /* @__PURE__ */ u("span", {
|
|
297
|
+
className: `text-xs px-2 py-0.5 rounded-full capitalize ${T[o.status] ?? ""}`,
|
|
277
298
|
children: s
|
|
278
299
|
})]
|
|
279
300
|
}),
|
|
280
|
-
/* @__PURE__ */
|
|
301
|
+
/* @__PURE__ */ d("div", {
|
|
281
302
|
className: "flex justify-between",
|
|
282
|
-
children: [/* @__PURE__ */
|
|
303
|
+
children: [/* @__PURE__ */ u("span", {
|
|
283
304
|
className: "text-muted-foreground",
|
|
284
305
|
children: "Priority"
|
|
285
|
-
}), /* @__PURE__ */
|
|
286
|
-
className: `text-xs px-2 py-0.5 rounded-full capitalize ${
|
|
306
|
+
}), /* @__PURE__ */ u("span", {
|
|
307
|
+
className: `text-xs px-2 py-0.5 rounded-full capitalize ${w[o.priority] ?? ""}`,
|
|
287
308
|
children: o.priority.toLowerCase()
|
|
288
309
|
})]
|
|
289
310
|
}),
|
|
290
|
-
/* @__PURE__ */
|
|
311
|
+
/* @__PURE__ */ d("div", {
|
|
291
312
|
className: "flex justify-between",
|
|
292
|
-
children: [/* @__PURE__ */
|
|
313
|
+
children: [/* @__PURE__ */ u("span", {
|
|
293
314
|
className: "text-muted-foreground",
|
|
294
315
|
children: "Type"
|
|
295
|
-
}), /* @__PURE__ */
|
|
316
|
+
}), /* @__PURE__ */ u(f, {
|
|
296
317
|
variant: "outline",
|
|
297
318
|
className: "capitalize",
|
|
298
319
|
children: o.type.toLowerCase()
|
|
299
320
|
})]
|
|
300
321
|
}),
|
|
301
|
-
/* @__PURE__ */
|
|
322
|
+
/* @__PURE__ */ d("div", {
|
|
302
323
|
className: "flex justify-between",
|
|
303
|
-
children: [/* @__PURE__ */
|
|
324
|
+
children: [/* @__PURE__ */ u("span", {
|
|
304
325
|
className: "text-muted-foreground",
|
|
305
326
|
children: "Story Points"
|
|
306
|
-
}), /* @__PURE__ */
|
|
327
|
+
}), /* @__PURE__ */ u("span", {
|
|
307
328
|
className: "font-medium",
|
|
308
329
|
children: o.storyPoints ?? 0
|
|
309
330
|
})]
|
|
310
331
|
}),
|
|
311
|
-
/* @__PURE__ */
|
|
332
|
+
/* @__PURE__ */ d("div", {
|
|
312
333
|
className: "flex justify-between",
|
|
313
|
-
children: [/* @__PURE__ */
|
|
334
|
+
children: [/* @__PURE__ */ u("span", {
|
|
314
335
|
className: "text-muted-foreground",
|
|
315
336
|
children: "Assignee"
|
|
316
|
-
}), /* @__PURE__ */
|
|
337
|
+
}), /* @__PURE__ */ u("span", { children: o.assigneeId ?? "Unassigned" })]
|
|
317
338
|
}),
|
|
318
|
-
/* @__PURE__ */
|
|
339
|
+
/* @__PURE__ */ d("div", {
|
|
319
340
|
className: "flex justify-between",
|
|
320
|
-
children: [/* @__PURE__ */
|
|
341
|
+
children: [/* @__PURE__ */ u("span", {
|
|
321
342
|
className: "text-muted-foreground",
|
|
322
343
|
children: "Reporter"
|
|
323
|
-
}), /* @__PURE__ */
|
|
344
|
+
}), /* @__PURE__ */ u("span", { children: o.reporterId ?? "Unknown" })]
|
|
324
345
|
}),
|
|
325
|
-
/* @__PURE__ */
|
|
346
|
+
/* @__PURE__ */ d("div", {
|
|
326
347
|
className: "flex justify-between",
|
|
327
|
-
children: [/* @__PURE__ */
|
|
348
|
+
children: [/* @__PURE__ */ u("span", {
|
|
328
349
|
className: "text-muted-foreground",
|
|
329
350
|
children: "Key"
|
|
330
|
-
}), /* @__PURE__ */
|
|
351
|
+
}), /* @__PURE__ */ u("span", { children: o.key })]
|
|
331
352
|
}),
|
|
332
|
-
/* @__PURE__ */
|
|
353
|
+
/* @__PURE__ */ d("div", {
|
|
333
354
|
className: "flex justify-between",
|
|
334
|
-
children: [/* @__PURE__ */
|
|
355
|
+
children: [/* @__PURE__ */ u("span", {
|
|
335
356
|
className: "text-muted-foreground",
|
|
336
357
|
children: "Due Date"
|
|
337
|
-
}), /* @__PURE__ */
|
|
358
|
+
}), /* @__PURE__ */ u("span", { children: o.dueDate ?? "Not set" })]
|
|
338
359
|
}),
|
|
339
|
-
/* @__PURE__ */
|
|
360
|
+
/* @__PURE__ */ d("div", {
|
|
340
361
|
className: "flex justify-between",
|
|
341
|
-
children: [/* @__PURE__ */
|
|
362
|
+
children: [/* @__PURE__ */ u("span", {
|
|
342
363
|
className: "text-muted-foreground",
|
|
343
364
|
children: "Created"
|
|
344
|
-
}), /* @__PURE__ */
|
|
365
|
+
}), /* @__PURE__ */ u("span", { children: o.createdAt })]
|
|
345
366
|
}),
|
|
346
|
-
/* @__PURE__ */
|
|
367
|
+
/* @__PURE__ */ d("div", {
|
|
347
368
|
className: "flex justify-between",
|
|
348
|
-
children: [/* @__PURE__ */
|
|
369
|
+
children: [/* @__PURE__ */ u("span", {
|
|
349
370
|
className: "text-muted-foreground",
|
|
350
371
|
children: "Updated"
|
|
351
|
-
}), /* @__PURE__ */
|
|
372
|
+
}), /* @__PURE__ */ u("span", { children: o.updatedAt })]
|
|
352
373
|
}),
|
|
353
|
-
/* @__PURE__ */
|
|
374
|
+
/* @__PURE__ */ d("div", { children: [/* @__PURE__ */ u("span", {
|
|
354
375
|
className: "text-muted-foreground text-xs",
|
|
355
376
|
children: "Labels"
|
|
356
|
-
}), /* @__PURE__ */
|
|
377
|
+
}), /* @__PURE__ */ u("div", {
|
|
357
378
|
className: "flex gap-1 mt-1 flex-wrap",
|
|
358
|
-
children: (o.labels ?? []).map((e) => /* @__PURE__ */
|
|
379
|
+
children: (o.labels ?? []).map((e) => /* @__PURE__ */ u("span", {
|
|
359
380
|
className: "text-xs px-2 py-0.5 rounded bg-muted",
|
|
360
381
|
children: e
|
|
361
382
|
}, e))
|
|
@@ -367,6 +388,6 @@ function D() {
|
|
|
367
388
|
});
|
|
368
389
|
}
|
|
369
390
|
//#endregion
|
|
370
|
-
export {
|
|
391
|
+
export { O as TasksTaskDetailPagePage };
|
|
371
392
|
|
|
372
393
|
//# sourceMappingURL=TasksTaskDetailPagePage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TasksTaskDetailPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/TasksTaskDetailPagePage.tsx"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck\nimport { useState } from 'react';\nimport { gql } from '@apollo/client';\nimport { useMutation, useQuery } from '@apollo/client/react';\nimport {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n Badge,\n Button,\n Input,\n} from '@burdenoff/fe-libs/ui';\nimport { FileText, Plus, X } from 'lucide-react';\nimport { MarkdownEditor } from '#src/components/MarkdownEditor';\nimport { usePlanMagnet } from '../providers/PlanMagnetProvider';\n\nconst GET_WORK_ITEM = gql`\n query GetWorkItemDetail($workItemId: ID!) {\n planmagnetWorkItem(id: $workItemId) {\n id\n title\n description\n type\n status\n priority\n key\n assigneeId\n reporterId\n sprintId\n storyPoints\n estimateMinutes\n dueDate\n labels\n tags\n createdAt\n updatedAt\n }\n }\n`;\n\nconst GET_WORK_ITEM_DOCS = gql`\n query GetWorkItemDocs($workItemId: ID!) {\n planmagnetWorkItemDocs(workItemId: $workItemId) {\n id\n title\n status\n version\n updatedAt\n }\n }\n`;\n\nconst CREATE_DOC = gql`\n mutation CreateDocForWorkItem($input: PlanmagnetCreateDocInput!) {\n planmagnetCreateDoc(input: $input) {\n id\n }\n }\n`;\n\nconst LINK_DOC_TO_WORK_ITEM = gql`\n mutation LinkDocToWorkItem($docId: ID!, $workItemId: ID!) {\n planmagnetLinkDocToWorkItem(docId: $docId, workItemId: $workItemId) {\n id\n }\n }\n`;\n\nconst UNLINK_DOC_FROM_WORK_ITEM = gql`\n mutation UnlinkDocFromWorkItem($docId: ID!, $workItemId: ID!) {\n planmagnetUnlinkDocFromWorkItem(docId: $docId, workItemId: $workItemId)\n }\n`;\n\ninterface WorkItemNode {\n id: string;\n title: string;\n description: string | null;\n type: string;\n status: string;\n priority: string;\n key: string;\n assigneeId: string | null;\n reporterId: string | null;\n sprintId: string | null;\n storyPoints: number | null;\n estimateMinutes: number | null;\n dueDate: string | null;\n labels: string[];\n tags: string[];\n createdAt: string;\n updatedAt: string;\n}\n\ninterface WorkItemDocNode {\n id: string;\n title: string;\n status: string;\n version: number;\n updatedAt: string;\n}\n\nconst priorityColor: Record<string, string> = {\n LOW: 'bg-gray-100 text-gray-800',\n MEDIUM: 'bg-blue-100 text-blue-800',\n HIGH: 'bg-orange-100 text-orange-800',\n CRITICAL: 'bg-red-100 text-red-800',\n};\n\nconst statusColor: Record<string, string> = {\n BACKLOG: 'bg-gray-100 text-gray-800',\n TODO: 'bg-blue-100 text-blue-800',\n IN_PROGRESS: 'bg-yellow-100 text-yellow-800',\n IN_REVIEW: 'bg-purple-100 text-purple-800',\n DONE: 'bg-green-100 text-green-800',\n BLOCKED: 'bg-red-100 text-red-800',\n TESTING: 'bg-teal-100 text-teal-800',\n CANCELLED: 'bg-gray-100 text-gray-800',\n};\n\nconst docStatusColor: Record<string, string> = {\n DRAFT: 'bg-gray-100 text-gray-800',\n PUBLISHED: 'bg-green-100 text-green-800',\n ARCHIVED: 'bg-gray-100 text-gray-500',\n};\n\n/**\n * Linked-docs panel (BOFF-4443): create a doc and link it to this work item\n * in one action, view currently-linked docs, and unlink one. Reads/writes go\n * through the real planmagnetWorkItemDocs / planmagnetCreateDoc /\n * planmagnetLinkDocToWorkItem / planmagnetUnlinkDocFromWorkItem GraphQL\n * fields — no fabricated data. Full doc editing (revisions, revert) lives on\n * a dedicated doc detail view; this panel is scoped to linking.\n */\nfunction LinkedDocsPanel({ workItemId }: { workItemId: string }) {\n const [isComposing, setIsComposing] = useState(false);\n const [newTitle, setNewTitle] = useState('');\n const [newContent, setNewContent] = useState('');\n\n const { data, loading, error, refetch } = useQuery<{\n planmagnetWorkItemDocs: WorkItemDocNode[];\n }>(GET_WORK_ITEM_DOCS, {\n variables: { workItemId },\n skip: !workItemId,\n });\n\n const [createDoc, { loading: creating }] = useMutation(CREATE_DOC);\n const [linkDoc] = useMutation(LINK_DOC_TO_WORK_ITEM);\n const [unlinkDoc, { loading: unlinking }] = useMutation(UNLINK_DOC_FROM_WORK_ITEM);\n\n const docs = data?.planmagnetWorkItemDocs ?? [];\n\n const handleCreateAndLink = async () => {\n if (!newTitle.trim() || !newContent.trim()) return;\n const result = await createDoc({\n variables: { input: { title: newTitle.trim(), content: newContent.trim() } },\n });\n const docId = result.data?.planmagnetCreateDoc?.id;\n if (docId) {\n await linkDoc({ variables: { docId, workItemId } });\n }\n setNewTitle('');\n setNewContent('');\n setIsComposing(false);\n void refetch();\n };\n\n const handleUnlink = async (docId: string) => {\n await unlinkDoc({ variables: { docId, workItemId } });\n void refetch();\n };\n\n return (\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0\">\n <CardTitle>Linked Docs</CardTitle>\n {!isComposing && (\n <Button size=\"sm\" variant=\"outline\" onClick={() => setIsComposing(true)}>\n <Plus className=\"h-4 w-4 mr-1\" />\n New Doc\n </Button>\n )}\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {isComposing && (\n <div className=\"space-y-3 rounded-md border border-input p-3\">\n <Input\n placeholder=\"Doc title\"\n value={newTitle}\n onChange={(e) => setNewTitle(e.target.value)}\n />\n <MarkdownEditor\n value={newContent}\n onChange={setNewContent}\n placeholder=\"Write the spec/doc content...\"\n minHeight={140}\n />\n <div className=\"flex gap-2 justify-end\">\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => {\n setIsComposing(false);\n setNewTitle('');\n setNewContent('');\n }}\n >\n Cancel\n </Button>\n <Button\n size=\"sm\"\n disabled={creating || !newTitle.trim() || !newContent.trim()}\n onClick={handleCreateAndLink}\n >\n {creating ? 'Creating...' : 'Create & Link'}\n </Button>\n </div>\n </div>\n )}\n\n {loading && <p className=\"text-sm text-muted-foreground\">Loading docs...</p>}\n {error && <p className=\"text-sm text-red-500\">Error: {error.message}</p>}\n {!loading && !error && docs.length === 0 && !isComposing && (\n <p className=\"text-sm text-muted-foreground\">No docs linked to this work item yet.</p>\n )}\n {docs.map((doc) => (\n <div\n key={doc.id}\n className=\"flex items-center justify-between gap-3 rounded-md border border-input p-3\"\n >\n <div className=\"flex items-center gap-2 min-w-0\">\n <FileText className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium truncate\">{doc.title}</p>\n <p className=\"text-xs text-muted-foreground\">v{doc.version}</p>\n </div>\n </div>\n <div className=\"flex items-center gap-2 shrink-0\">\n <span\n className={`text-xs px-2 py-0.5 rounded-full capitalize ${docStatusColor[doc.status] ?? ''}`}\n >\n {doc.status.toLowerCase()}\n </span>\n <Button\n size=\"icon\"\n variant=\"ghost\"\n disabled={unlinking}\n onClick={() => handleUnlink(doc.id)}\n aria-label={`Unlink ${doc.title}`}\n >\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n );\n}\n\nexport function TasksTaskDetailPagePage() {\n const { workspaceId } = usePlanMagnet();\n\n // In a real app, workItemId comes from route params.\n const workItemId = new URLSearchParams(window.location.search).get('taskId') ?? '';\n\n const { data, loading, error } = useQuery<{\n planmagnetWorkItem: WorkItemNode;\n }>(GET_WORK_ITEM, {\n variables: { workItemId },\n skip: !workspaceId || !workItemId,\n });\n\n if (loading) {\n return (\n <div className=\"flex items-center justify-center p-12\">\n <div className=\"animate-spin h-8 w-8 border-2 border-primary border-t-transparent rounded-full\" />\n </div>\n );\n }\n\n if (error) {\n return <div className=\"p-6 text-red-500\">Error: {error.message}</div>;\n }\n\n const task = data?.planmagnetWorkItem;\n if (!task) return <div className=\"p-6 text-muted-foreground\">Task not found.</div>;\n\n const statusDisplay = task.status.toLowerCase().replace('_', ' ');\n\n const activityLog = [\n { action: 'Task created', by: task.reporterId ?? 'Unknown', at: task.createdAt },\n {\n action: `Assigned to ${task.assigneeId ?? 'Unassigned'}`,\n by: task.reporterId ?? 'Unknown',\n at: task.createdAt,\n },\n {\n action: `Status changed to ${statusDisplay}`,\n by: task.assigneeId ?? 'Unknown',\n at: task.updatedAt,\n },\n ];\n\n return (\n <div className=\"space-y-6 p-6\">\n <div>\n <h1 className=\"text-2xl font-semibold\">{task.title}</h1>\n <p className=\"text-sm text-muted-foreground\">\n {task.key} · {task.type.toLowerCase()}\n </p>\n </div>\n <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-6\">\n <div className=\"lg:col-span-2 space-y-6\">\n <Card>\n <CardHeader>\n <CardTitle>Description</CardTitle>\n </CardHeader>\n <CardContent>\n <p className=\"text-sm\">{task.description ?? 'No description provided.'}</p>\n </CardContent>\n </Card>\n <LinkedDocsPanel workItemId={task.id} />\n <Card>\n <CardHeader>\n <CardTitle>Activity</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-3\">\n {activityLog.map((a, i) => (\n <div key={i} className=\"flex gap-3\">\n <div className=\"flex flex-col items-center\">\n <div className=\"h-2.5 w-2.5 rounded-full bg-primary mt-1.5\" />\n {i < activityLog.length - 1 && <div className=\"w-px flex-1 bg-border\" />}\n </div>\n <div className=\"pb-3\">\n <p className=\"text-sm\">{a.action}</p>\n <p className=\"text-xs text-muted-foreground\">\n {a.by} · {a.at}\n </p>\n </div>\n </div>\n ))}\n </div>\n </CardContent>\n </Card>\n </div>\n <div className=\"space-y-6\">\n <Card>\n <CardHeader>\n <CardTitle>Details</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3 text-sm\">\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Status</span>\n <span\n className={`text-xs px-2 py-0.5 rounded-full capitalize ${statusColor[task.status] ?? ''}`}\n >\n {statusDisplay}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Priority</span>\n <span\n className={`text-xs px-2 py-0.5 rounded-full capitalize ${priorityColor[task.priority] ?? ''}`}\n >\n {task.priority.toLowerCase()}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Type</span>\n <Badge variant=\"outline\" className=\"capitalize\">\n {task.type.toLowerCase()}\n </Badge>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Story Points</span>\n <span className=\"font-medium\">{task.storyPoints ?? 0}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Assignee</span>\n <span>{task.assigneeId ?? 'Unassigned'}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Reporter</span>\n <span>{task.reporterId ?? 'Unknown'}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Key</span>\n <span>{task.key}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Due Date</span>\n <span>{task.dueDate ?? 'Not set'}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Created</span>\n <span>{task.createdAt}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Updated</span>\n <span>{task.updatedAt}</span>\n </div>\n <div>\n <span className=\"text-muted-foreground text-xs\">Labels</span>\n <div className=\"flex gap-1 mt-1 flex-wrap\">\n {(task.labels ?? []).map((l) => (\n <span key={l} className=\"text-xs px-2 py-0.5 rounded bg-muted\">\n {l}\n </span>\n ))}\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TasksTaskDetailPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/TasksTaskDetailPagePage.tsx"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck\nimport { useState } from 'react';\nimport { throwOnError } from '../utils/mutationResult';\nimport { gql } from '@apollo/client';\nimport { useMutation, useQuery } from '@apollo/client/react';\nimport {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n Badge,\n Button,\n Input,\n} from '@burdenoff/fe-libs/ui';\nimport { FileText, Plus, X } from 'lucide-react';\nimport { MarkdownEditor } from '#src/components/MarkdownEditor';\nimport { usePlanMagnet } from '../providers/PlanMagnetProvider';\n\nconst GET_WORK_ITEM = gql`\n query GetWorkItemDetail($workItemId: ID!) {\n planmagnetWorkItem(id: $workItemId) {\n id\n title\n description\n type\n status\n priority\n key\n assigneeId\n reporterId\n sprintId\n storyPoints\n estimateMinutes\n dueDate\n labels\n tags\n createdAt\n updatedAt\n }\n }\n`;\n\nconst GET_WORK_ITEM_DOCS = gql`\n query GetWorkItemDocs($workItemId: ID!) {\n planmagnetWorkItemDocs(workItemId: $workItemId) {\n id\n title\n status\n version\n updatedAt\n }\n }\n`;\n\nconst CREATE_DOC = gql`\n mutation CreateDocForWorkItem($input: PlanmagnetCreateDocInput!) {\n planmagnetCreateDoc(input: $input) {\n id\n }\n }\n`;\n\nconst LINK_DOC_TO_WORK_ITEM = gql`\n mutation LinkDocToWorkItem($docId: ID!, $workItemId: ID!) {\n planmagnetLinkDocToWorkItem(docId: $docId, workItemId: $workItemId) {\n id\n }\n }\n`;\n\nconst UNLINK_DOC_FROM_WORK_ITEM = gql`\n mutation UnlinkDocFromWorkItem($docId: ID!, $workItemId: ID!) {\n planmagnetUnlinkDocFromWorkItem(docId: $docId, workItemId: $workItemId)\n }\n`;\n\ninterface WorkItemNode {\n id: string;\n title: string;\n description: string | null;\n type: string;\n status: string;\n priority: string;\n key: string;\n assigneeId: string | null;\n reporterId: string | null;\n sprintId: string | null;\n storyPoints: number | null;\n estimateMinutes: number | null;\n dueDate: string | null;\n labels: string[];\n tags: string[];\n createdAt: string;\n updatedAt: string;\n}\n\ninterface WorkItemDocNode {\n id: string;\n title: string;\n status: string;\n version: number;\n updatedAt: string;\n}\n\nconst priorityColor: Record<string, string> = {\n LOW: 'bg-gray-100 text-gray-800',\n MEDIUM: 'bg-blue-100 text-blue-800',\n HIGH: 'bg-orange-100 text-orange-800',\n CRITICAL: 'bg-red-100 text-red-800',\n};\n\nconst statusColor: Record<string, string> = {\n BACKLOG: 'bg-gray-100 text-gray-800',\n TODO: 'bg-blue-100 text-blue-800',\n IN_PROGRESS: 'bg-yellow-100 text-yellow-800',\n IN_REVIEW: 'bg-purple-100 text-purple-800',\n DONE: 'bg-green-100 text-green-800',\n BLOCKED: 'bg-red-100 text-red-800',\n TESTING: 'bg-teal-100 text-teal-800',\n CANCELLED: 'bg-gray-100 text-gray-800',\n};\n\nconst docStatusColor: Record<string, string> = {\n DRAFT: 'bg-gray-100 text-gray-800',\n PUBLISHED: 'bg-green-100 text-green-800',\n ARCHIVED: 'bg-gray-100 text-gray-500',\n};\n\n/**\n * Linked-docs panel (BOFF-4443): create a doc and link it to this work item\n * in one action, view currently-linked docs, and unlink one. Reads/writes go\n * through the real planmagnetWorkItemDocs / planmagnetCreateDoc /\n * planmagnetLinkDocToWorkItem / planmagnetUnlinkDocFromWorkItem GraphQL\n * fields — no fabricated data. Full doc editing (revisions, revert) lives on\n * a dedicated doc detail view; this panel is scoped to linking.\n */\nfunction LinkedDocsPanel({ workItemId }: { workItemId: string }) {\n const [isComposing, setIsComposing] = useState(false);\n const [newTitle, setNewTitle] = useState('');\n const [newContent, setNewContent] = useState('');\n\n const { data, loading, error, refetch } = useQuery<{\n planmagnetWorkItemDocs: WorkItemDocNode[];\n }>(GET_WORK_ITEM_DOCS, {\n variables: { workItemId },\n skip: !workItemId,\n });\n\n const [createDoc, { loading: creating }] = useMutation(CREATE_DOC);\n const [linkDoc] = useMutation(LINK_DOC_TO_WORK_ITEM);\n const [unlinkDoc, { loading: unlinking }] = useMutation(UNLINK_DOC_FROM_WORK_ITEM);\n // A refused mutation resolves with { error } (fe-libs errorPolicy 'all');\n // the composer used to clear itself as if the doc had been saved.\n const [actionError, setActionError] = useState<string | null>(null);\n\n const docs = data?.planmagnetWorkItemDocs ?? [];\n\n const handleCreateAndLink = async () => {\n if (!newTitle.trim() || !newContent.trim()) return;\n setActionError(null);\n try {\n const result = await throwOnError(\n createDoc({ variables: { input: { title: newTitle.trim(), content: newContent.trim() } } })\n );\n const docId = result.data?.planmagnetCreateDoc?.id;\n if (docId) {\n await throwOnError(linkDoc({ variables: { docId, workItemId } }));\n }\n } catch (e) {\n setActionError(e instanceof Error ? e.message : 'The doc could not be saved.');\n return;\n }\n setNewTitle('');\n setNewContent('');\n setIsComposing(false);\n void refetch();\n };\n\n const handleUnlink = async (docId: string) => {\n setActionError(null);\n try {\n await throwOnError(unlinkDoc({ variables: { docId, workItemId } }));\n } catch (e) {\n setActionError(e instanceof Error ? e.message : 'The doc could not be unlinked.');\n return;\n }\n void refetch();\n };\n\n return (\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0\">\n <CardTitle>Linked Docs</CardTitle>\n {!isComposing && (\n <Button size=\"sm\" variant=\"outline\" onClick={() => setIsComposing(true)}>\n <Plus className=\"h-4 w-4 mr-1\" />\n New Doc\n </Button>\n )}\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {isComposing && (\n <div className=\"space-y-3 rounded-md border border-input p-3\">\n <Input\n placeholder=\"Doc title\"\n value={newTitle}\n onChange={(e) => setNewTitle(e.target.value)}\n />\n <MarkdownEditor\n value={newContent}\n onChange={setNewContent}\n placeholder=\"Write the spec/doc content...\"\n minHeight={140}\n />\n <div className=\"flex gap-2 justify-end\">\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => {\n setIsComposing(false);\n setNewTitle('');\n setNewContent('');\n }}\n >\n Cancel\n </Button>\n <Button\n size=\"sm\"\n disabled={creating || !newTitle.trim() || !newContent.trim()}\n onClick={handleCreateAndLink}\n >\n {creating ? 'Creating...' : 'Create & Link'}\n </Button>\n </div>\n </div>\n )}\n\n {loading && <p className=\"text-sm text-muted-foreground\">Loading docs...</p>}\n {error && <p className=\"text-sm text-red-500\">Error: {error.message}</p>}\n {actionError && (\n <p role=\"alert\" className=\"text-sm text-destructive\">\n {actionError}\n </p>\n )}\n {!loading && !error && docs.length === 0 && !isComposing && (\n <p className=\"text-sm text-muted-foreground\">No docs linked to this work item yet.</p>\n )}\n {docs.map((doc) => (\n <div\n key={doc.id}\n className=\"flex items-center justify-between gap-3 rounded-md border border-input p-3\"\n >\n <div className=\"flex items-center gap-2 min-w-0\">\n <FileText className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium truncate\">{doc.title}</p>\n <p className=\"text-xs text-muted-foreground\">v{doc.version}</p>\n </div>\n </div>\n <div className=\"flex items-center gap-2 shrink-0\">\n <span\n className={`text-xs px-2 py-0.5 rounded-full capitalize ${docStatusColor[doc.status] ?? ''}`}\n >\n {doc.status.toLowerCase()}\n </span>\n <Button\n size=\"icon\"\n variant=\"ghost\"\n disabled={unlinking}\n onClick={() => handleUnlink(doc.id)}\n aria-label={`Unlink ${doc.title}`}\n >\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n );\n}\n\nexport function TasksTaskDetailPagePage() {\n const { workspaceId } = usePlanMagnet();\n\n // In a real app, workItemId comes from route params.\n const workItemId = new URLSearchParams(window.location.search).get('taskId') ?? '';\n\n const { data, loading, error } = useQuery<{\n planmagnetWorkItem: WorkItemNode;\n }>(GET_WORK_ITEM, {\n variables: { workItemId },\n skip: !workspaceId || !workItemId,\n });\n\n if (loading) {\n return (\n <div className=\"flex items-center justify-center p-12\">\n <div className=\"animate-spin h-8 w-8 border-2 border-primary border-t-transparent rounded-full\" />\n </div>\n );\n }\n\n if (error) {\n return <div className=\"p-6 text-red-500\">Error: {error.message}</div>;\n }\n\n const task = data?.planmagnetWorkItem;\n if (!task) return <div className=\"p-6 text-muted-foreground\">Task not found.</div>;\n\n const statusDisplay = task.status.toLowerCase().replace('_', ' ');\n\n const activityLog = [\n { action: 'Task created', by: task.reporterId ?? 'Unknown', at: task.createdAt },\n {\n action: `Assigned to ${task.assigneeId ?? 'Unassigned'}`,\n by: task.reporterId ?? 'Unknown',\n at: task.createdAt,\n },\n {\n action: `Status changed to ${statusDisplay}`,\n by: task.assigneeId ?? 'Unknown',\n at: task.updatedAt,\n },\n ];\n\n return (\n <div className=\"space-y-6 p-6\">\n <div>\n <h1 className=\"text-2xl font-semibold\">{task.title}</h1>\n <p className=\"text-sm text-muted-foreground\">\n {task.key} · {task.type.toLowerCase()}\n </p>\n </div>\n <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-6\">\n <div className=\"lg:col-span-2 space-y-6\">\n <Card>\n <CardHeader>\n <CardTitle>Description</CardTitle>\n </CardHeader>\n <CardContent>\n <p className=\"text-sm\">{task.description ?? 'No description provided.'}</p>\n </CardContent>\n </Card>\n <LinkedDocsPanel workItemId={task.id} />\n <Card>\n <CardHeader>\n <CardTitle>Activity</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-3\">\n {activityLog.map((a, i) => (\n <div key={i} className=\"flex gap-3\">\n <div className=\"flex flex-col items-center\">\n <div className=\"h-2.5 w-2.5 rounded-full bg-primary mt-1.5\" />\n {i < activityLog.length - 1 && <div className=\"w-px flex-1 bg-border\" />}\n </div>\n <div className=\"pb-3\">\n <p className=\"text-sm\">{a.action}</p>\n <p className=\"text-xs text-muted-foreground\">\n {a.by} · {a.at}\n </p>\n </div>\n </div>\n ))}\n </div>\n </CardContent>\n </Card>\n </div>\n <div className=\"space-y-6\">\n <Card>\n <CardHeader>\n <CardTitle>Details</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3 text-sm\">\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Status</span>\n <span\n className={`text-xs px-2 py-0.5 rounded-full capitalize ${statusColor[task.status] ?? ''}`}\n >\n {statusDisplay}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Priority</span>\n <span\n className={`text-xs px-2 py-0.5 rounded-full capitalize ${priorityColor[task.priority] ?? ''}`}\n >\n {task.priority.toLowerCase()}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Type</span>\n <Badge variant=\"outline\" className=\"capitalize\">\n {task.type.toLowerCase()}\n </Badge>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Story Points</span>\n <span className=\"font-medium\">{task.storyPoints ?? 0}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Assignee</span>\n <span>{task.assigneeId ?? 'Unassigned'}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Reporter</span>\n <span>{task.reporterId ?? 'Unknown'}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Key</span>\n <span>{task.key}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Due Date</span>\n <span>{task.dueDate ?? 'Not set'}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Created</span>\n <span>{task.createdAt}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Updated</span>\n <span>{task.updatedAt}</span>\n </div>\n <div>\n <span className=\"text-muted-foreground text-xs\">Labels</span>\n <div className=\"flex gap-1 mt-1 flex-wrap\">\n {(task.labels ?? []).map((l) => (\n <span key={l} className=\"text-xs px-2 py-0.5 rounded bg-muted\">\n {l}\n </span>\n ))}\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TasksTasksPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/TasksTasksPagePage.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"TasksTasksPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/TasksTasksPagePage.tsx"],"names":[],"mappings":"AAuIA,wBAAgB,kBAAkB,4CAsOjC"}
|