@burdenoff/microfe-planmagnet 2026.925.6 → 2026.925.7

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.
@@ -0,0 +1,5 @@
1
+ export declare function ProjectBoard({ projectId, projectName, }: {
2
+ projectId: string;
3
+ projectName: string;
4
+ }): import("react/jsx-runtime").JSX.Element;
5
+ //# sourceMappingURL=ProjectBoard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProjectBoard.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/board/ProjectBoard.tsx"],"names":[],"mappings":"AAuLA,wBAAgB,YAAY,CAAC,EAC3B,SAAS,EACT,WAAW,GACZ,EAAE;IACD,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB,2CAiKA"}
@@ -0,0 +1,491 @@
1
+ import { usePlanMagnet as e, usePlanMagnetNavigate as t } from "../providers/PlanMagnetProvider.js";
2
+ import { PersonName as n } from "../people/People.js";
3
+ import { useState as r } from "react";
4
+ import { ChevronLeft as i, ChevronRight as a, LayoutGrid as o, Pencil as s, Plus as c } from "lucide-react";
5
+ import { gql as l } from "@apollo/client";
6
+ import { useMutation as u, useQuery as d } from "@apollo/client/react";
7
+ import { jsx as f, jsxs as p } from "react/jsx-runtime";
8
+ import { AlertDialog as m, AlertDialogAction as h, AlertDialogCancel as g, AlertDialogContent as _, AlertDialogDescription as v, AlertDialogFooter as y, AlertDialogHeader as b, AlertDialogTitle as x, AlertDialogTrigger as S, Button as C, Card as w, CardContent as T, Input as E, ResponsiveDialog as D, ResponsiveDialogContent as O, ResponsiveDialogDescription as k, ResponsiveDialogFooter as A, ResponsiveDialogHeader as j, ResponsiveDialogTitle as M, ResponsiveDialogTrigger as N } from "@burdenoff/fe-libs/ui";
9
+ //#region src/planmagnet/board/ProjectBoard.tsx
10
+ var ee = [
11
+ "BACKLOG",
12
+ "TODO",
13
+ "IN_PROGRESS",
14
+ "IN_REVIEW",
15
+ "TESTING",
16
+ "DONE",
17
+ "CANCELLED"
18
+ ], P = (e) => e.charAt(0) + e.slice(1).toLowerCase().replace(/_/g, " "), F = 100, I = l`
19
+ query ProjectBoards($workspaceId: ID!, $projectId: String) {
20
+ planmagnetBoards(
21
+ workspaceId: $workspaceId
22
+ filter: { projectId: $projectId }
23
+ pagination: { first: 20 }
24
+ ) {
25
+ items {
26
+ id
27
+ name
28
+ isDefault
29
+ }
30
+ }
31
+ }
32
+ `, L = l`
33
+ query ProjectBoard($id: ID!) {
34
+ planmagnetBoard(id: $id) {
35
+ id
36
+ name
37
+ unplacedCount
38
+ columns {
39
+ id
40
+ name
41
+ mappedStatus
42
+ wipLimit
43
+ sortOrder
44
+ cards(pagination: { first: 100 }) {
45
+ totalCount
46
+ items {
47
+ id
48
+ key
49
+ title
50
+ status
51
+ priority
52
+ storyPoints
53
+ assigneeId
54
+ }
55
+ }
56
+ }
57
+ }
58
+ }
59
+ `, R = l`
60
+ mutation ProjectBoardMoveCard($boardId: ID!, $input: PlanmagnetMoveCardInput!) {
61
+ planmagnetMoveCard(boardId: $boardId, input: $input) {
62
+ id
63
+ }
64
+ }
65
+ `, z = l`
66
+ mutation ProjectBoardCreate($input: PlanmagnetCreateBoardInput!) {
67
+ planmagnetCreateBoard(input: $input) {
68
+ id
69
+ }
70
+ }
71
+ `, B = l`
72
+ mutation ProjectBoardCreateColumn($input: PlanmagnetCreateBoardColumnInput!) {
73
+ planmagnetCreateBoardColumn(input: $input) {
74
+ id
75
+ }
76
+ }
77
+ `, V = l`
78
+ mutation ProjectBoardUpdateColumn($id: ID!, $input: PlanmagnetUpdateBoardColumnInput!) {
79
+ planmagnetUpdateBoardColumn(id: $id, input: $input) {
80
+ id
81
+ }
82
+ }
83
+ `, H = l`
84
+ mutation ProjectBoardDeleteColumn($id: ID!) {
85
+ planmagnetDeleteBoardColumn(id: $id)
86
+ }
87
+ `, U = l`
88
+ mutation ProjectBoardReorder($boardId: ID!, $input: PlanmagnetReorderColumnsInput!) {
89
+ planmagnetReorderColumns(boardId: $boardId, input: $input) {
90
+ id
91
+ }
92
+ }
93
+ `, W = [
94
+ "ProjectBoard",
95
+ "ProjectBoards",
96
+ "GetWorkItems",
97
+ "GetWorkItemCounts",
98
+ "GetDashboardData"
99
+ ], G = (e, t) => e instanceof Error ? e.message : t;
100
+ function K({ message: e }) {
101
+ return /* @__PURE__ */ f("p", {
102
+ role: "alert",
103
+ className: "text-sm text-destructive",
104
+ children: e
105
+ });
106
+ }
107
+ function q({ projectId: t, projectName: n }) {
108
+ let { workspaceId: i } = e(), [a, s] = r(null), [l, m] = r(null), { data: h, loading: g } = d(I, {
109
+ variables: {
110
+ workspaceId: i,
111
+ projectId: t
112
+ },
113
+ skip: !i
114
+ }), _ = h?.planmagnetBoards.items ?? [], v = (a && _.some((e) => e.id === a) ? a : null) ?? _.find((e) => e.isDefault)?.id ?? _[0]?.id ?? null, { data: y, loading: b } = d(L, {
115
+ variables: { id: v },
116
+ skip: !v
117
+ }), x = y?.planmagnetBoard ?? null, [S, E] = u(z, {
118
+ refetchQueries: W,
119
+ awaitRefetchQueries: !0
120
+ }), [D, O] = u(R, {
121
+ refetchQueries: W,
122
+ awaitRefetchQueries: !0
123
+ }), [k] = u(U, {
124
+ refetchQueries: W,
125
+ awaitRefetchQueries: !0
126
+ }), A = async (e, t) => {
127
+ m(null);
128
+ try {
129
+ await e();
130
+ } catch (e) {
131
+ m(G(e, t));
132
+ }
133
+ }, j = (e, t) => A(() => D({ variables: {
134
+ boardId: v,
135
+ input: {
136
+ workItemId: e,
137
+ targetColumnId: t
138
+ }
139
+ } }), "The card could not be moved."), M = (e, t) => {
140
+ if (!x) return;
141
+ let n = x.columns.map((e) => e.id), r = e + t;
142
+ if (!(r < 0 || r >= n.length)) return [n[e], n[r]] = [n[r], n[e]], A(() => k({ variables: {
143
+ boardId: v,
144
+ input: { columnIds: n }
145
+ } }), "The columns could not be reordered.");
146
+ };
147
+ return g && !h ? /* @__PURE__ */ f("p", {
148
+ className: "text-sm text-muted-foreground p-4",
149
+ children: "Loading board…"
150
+ }) : v ? /* @__PURE__ */ p("div", {
151
+ className: "space-y-3",
152
+ "data-testid": "project-board",
153
+ children: [
154
+ /* @__PURE__ */ p("div", {
155
+ className: "flex flex-wrap items-center gap-3",
156
+ children: [
157
+ _.length > 1 && /* @__PURE__ */ f("select", {
158
+ "aria-label": "Board",
159
+ className: "rounded-md border border-input bg-background px-2 py-1 text-sm",
160
+ value: v,
161
+ onChange: (e) => s(e.target.value),
162
+ children: _.map((e) => /* @__PURE__ */ f("option", {
163
+ value: e.id,
164
+ children: e.name
165
+ }, e.id))
166
+ }),
167
+ x && x.unplacedCount > 0 && /* @__PURE__ */ p("p", {
168
+ className: "text-xs text-muted-foreground",
169
+ "data-testid": "board-unplaced",
170
+ children: [
171
+ x.unplacedCount,
172
+ " work item",
173
+ x.unplacedCount === 1 ? " is" : "s are",
174
+ " not on this board: ",
175
+ x.unplacedCount === 1 ? "its status has" : "their status has",
176
+ " no column."
177
+ ]
178
+ }),
179
+ x && /* @__PURE__ */ f("div", {
180
+ className: "ml-auto",
181
+ children: /* @__PURE__ */ f(Y, { boardId: x.id })
182
+ })
183
+ ]
184
+ }),
185
+ l && /* @__PURE__ */ f(K, { message: l }),
186
+ b && !x ? /* @__PURE__ */ f("p", {
187
+ className: "text-sm text-muted-foreground p-4",
188
+ children: "Loading board…"
189
+ }) : /* @__PURE__ */ p("div", {
190
+ className: "flex gap-3 overflow-x-auto pb-2",
191
+ children: [x?.columns.map((e, t) => /* @__PURE__ */ f(J, {
192
+ boardId: x.id,
193
+ column: e,
194
+ columns: x.columns,
195
+ isFirst: t === 0,
196
+ isLast: t === x.columns.length - 1,
197
+ busy: O.loading,
198
+ onMove: j,
199
+ onShift: (e) => M(t, e)
200
+ }, e.id)), x && x.columns.length === 0 && /* @__PURE__ */ f("p", {
201
+ className: "text-sm text-muted-foreground p-4",
202
+ children: "This board has no columns. Add one to start placing work."
203
+ })]
204
+ })
205
+ ]
206
+ }) : /* @__PURE__ */ f(w, { children: /* @__PURE__ */ p(T, {
207
+ className: "p-8 text-center space-y-3",
208
+ "data-testid": "board-empty",
209
+ children: [
210
+ /* @__PURE__ */ f(o, { className: "h-8 w-8 mx-auto text-muted-foreground" }),
211
+ /* @__PURE__ */ p("p", {
212
+ className: "text-sm text-muted-foreground",
213
+ children: [n, " has no board yet."]
214
+ }),
215
+ /* @__PURE__ */ p(C, {
216
+ size: "sm",
217
+ disabled: E.loading,
218
+ onClick: () => A(() => S({ variables: { input: {
219
+ projectId: t,
220
+ name: `${n} board`,
221
+ type: "KANBAN",
222
+ isDefault: !0,
223
+ withDefaultColumns: !0
224
+ } } }), "The board could not be created."),
225
+ children: [/* @__PURE__ */ f(c, { className: "mr-1 h-4 w-4" }), E.loading ? "Creating…" : "Create board"]
226
+ }),
227
+ /* @__PURE__ */ f("p", {
228
+ className: "text-xs text-muted-foreground",
229
+ children: "Starts with one column per status: Backlog, To Do, In Progress, In Review, Testing, Done."
230
+ }),
231
+ l && /* @__PURE__ */ f(K, { message: l })
232
+ ]
233
+ }) });
234
+ }
235
+ function J({ boardId: e, column: o, columns: s, isFirst: c, isLast: l, busy: u, onMove: d, onShift: m }) {
236
+ let h = t(), [g, _] = r(!1), v = o.cards.totalCount, y = o.wipLimit != null && o.wipLimit > 0 && v >= o.wipLimit, b = v - o.cards.items.length;
237
+ return /* @__PURE__ */ p("section", {
238
+ "aria-label": `${o.name} column`,
239
+ "data-testid": `board-column-${o.name}`,
240
+ className: `min-w-[240px] w-[240px] shrink-0 rounded-md border bg-muted/30 ${g ? "ring-2 ring-primary" : ""}`,
241
+ onDragOver: (e) => {
242
+ e.preventDefault(), _(!0);
243
+ },
244
+ onDragLeave: () => _(!1),
245
+ onDrop: (e) => {
246
+ e.preventDefault(), _(!1);
247
+ let t = e.dataTransfer.getData("text/plain");
248
+ t && d(t, o.id);
249
+ },
250
+ children: [
251
+ /* @__PURE__ */ p("header", {
252
+ className: "p-2 border-b space-y-1",
253
+ children: [/* @__PURE__ */ p("div", {
254
+ className: "flex items-center justify-between gap-1",
255
+ children: [/* @__PURE__ */ f("h3", {
256
+ className: "text-sm font-medium truncate",
257
+ children: o.name
258
+ }), /* @__PURE__ */ f("span", {
259
+ "data-testid": `board-column-count-${o.name}`,
260
+ className: `text-xs rounded-full px-1.5 ${y ? "bg-status-warning-subtle text-status-warning" : "bg-muted"}`,
261
+ title: o.wipLimit ? `WIP limit ${o.wipLimit}` : void 0,
262
+ children: o.wipLimit ? `${v} / ${o.wipLimit}` : v
263
+ })]
264
+ }), /* @__PURE__ */ p("div", {
265
+ className: "flex items-center justify-between gap-1",
266
+ children: [/* @__PURE__ */ f("span", {
267
+ className: "text-[11px] text-muted-foreground",
268
+ children: o.mappedStatus ? `Sets status: ${P(o.mappedStatus)}` : "No status"
269
+ }), /* @__PURE__ */ p("span", {
270
+ className: "flex",
271
+ children: [
272
+ /* @__PURE__ */ f(C, {
273
+ size: "icon",
274
+ variant: "ghost",
275
+ className: "h-6 w-6",
276
+ "aria-label": `Move ${o.name} column left`,
277
+ disabled: c,
278
+ onClick: () => m(-1),
279
+ children: /* @__PURE__ */ f(i, { className: "h-3.5 w-3.5" })
280
+ }),
281
+ /* @__PURE__ */ f(C, {
282
+ size: "icon",
283
+ variant: "ghost",
284
+ className: "h-6 w-6",
285
+ "aria-label": `Move ${o.name} column right`,
286
+ disabled: l,
287
+ onClick: () => m(1),
288
+ children: /* @__PURE__ */ f(a, { className: "h-3.5 w-3.5" })
289
+ }),
290
+ /* @__PURE__ */ f(Y, {
291
+ boardId: e,
292
+ column: o
293
+ })
294
+ ]
295
+ })]
296
+ })]
297
+ }),
298
+ /* @__PURE__ */ p("ul", {
299
+ className: "p-2 space-y-2 min-h-[80px]",
300
+ children: [o.cards.items.map((e) => /* @__PURE__ */ p("li", {
301
+ draggable: !0,
302
+ onDragStart: (t) => {
303
+ t.dataTransfer.setData("text/plain", e.id), t.dataTransfer.effectAllowed = "move";
304
+ },
305
+ className: "rounded-md border bg-background p-2 space-y-1 cursor-grab",
306
+ "data-testid": "board-card",
307
+ children: [
308
+ /* @__PURE__ */ f("button", {
309
+ type: "button",
310
+ className: "text-left text-sm font-medium leading-tight hover:underline",
311
+ onClick: () => h(`/tasks/task-detail-page?taskId=${encodeURIComponent(e.id)}`),
312
+ children: e.title
313
+ }),
314
+ /* @__PURE__ */ p("div", {
315
+ className: "flex items-center justify-between text-[11px] text-muted-foreground",
316
+ children: [/* @__PURE__ */ f("span", { children: e.key }), /* @__PURE__ */ p("span", { children: [e.storyPoints ?? 0, " pts"] })]
317
+ }),
318
+ /* @__PURE__ */ p("div", {
319
+ className: "flex items-center justify-between gap-1 text-[11px] text-muted-foreground",
320
+ children: [/* @__PURE__ */ f("span", {
321
+ className: "truncate",
322
+ children: e.assigneeId ? /* @__PURE__ */ f(n, { id: e.assigneeId }) : "Unassigned"
323
+ }), /* @__PURE__ */ p("select", {
324
+ "aria-label": `Move ${e.key} to column`,
325
+ className: "rounded border border-input bg-background px-1 py-0.5 text-[11px]",
326
+ value: "",
327
+ disabled: u,
328
+ onChange: (t) => t.target.value && d(e.id, t.target.value),
329
+ children: [/* @__PURE__ */ f("option", {
330
+ value: "",
331
+ children: "Move…"
332
+ }), s.filter((e) => e.id !== o.id).map((e) => /* @__PURE__ */ f("option", {
333
+ value: e.id,
334
+ children: e.name
335
+ }, e.id))]
336
+ })]
337
+ })
338
+ ]
339
+ }, e.id)), v === 0 && /* @__PURE__ */ f("li", {
340
+ className: "text-xs text-muted-foreground text-center py-4",
341
+ children: "Empty"
342
+ })]
343
+ }),
344
+ b > 0 && /* @__PURE__ */ p("p", {
345
+ className: "px-2 pb-2 text-xs text-muted-foreground",
346
+ children: [
347
+ "+",
348
+ b,
349
+ " more (showing the first ",
350
+ F,
351
+ ")"
352
+ ]
353
+ })
354
+ ]
355
+ });
356
+ }
357
+ function Y({ boardId: e, column: t }) {
358
+ let n = t !== void 0, [i, a] = r(!1), [o, l] = r(t?.name ?? ""), [d, w] = r(t?.mappedStatus ?? ""), [T, F] = r(t?.wipLimit ? String(t.wipLimit) : ""), [I, L] = r(null), R = {
359
+ refetchQueries: W,
360
+ awaitRefetchQueries: !0
361
+ }, [z, U] = u(B, R), [q, J] = u(V, R), [Y, te] = u(H, R), X = U.loading || J.loading || te.loading, Z = T.trim() === "" ? null : Number(T), Q = Z !== null && (!Number.isInteger(Z) || Z < 1), ne = o.trim() !== "" && !Q && !X, re = () => {
362
+ l(t?.name ?? ""), w(t?.mappedStatus ?? ""), F(t?.wipLimit ? String(t.wipLimit) : ""), L(null);
363
+ }, ie = async () => {
364
+ L(null);
365
+ let r = {
366
+ name: o.trim(),
367
+ mappedStatus: d || null,
368
+ wipLimit: Z
369
+ };
370
+ try {
371
+ n ? await q({ variables: {
372
+ id: t.id,
373
+ input: r
374
+ } }) : await z({ variables: { input: {
375
+ boardId: e,
376
+ type: "CUSTOM",
377
+ ...r
378
+ } } }), a(!1);
379
+ } catch (e) {
380
+ L(G(e, "The column could not be saved."));
381
+ }
382
+ }, $ = n ? `column-${t.id}` : "new-column";
383
+ return /* @__PURE__ */ p(D, {
384
+ open: i,
385
+ onOpenChange: (e) => {
386
+ a(e), e && re();
387
+ },
388
+ children: [/* @__PURE__ */ f(N, {
389
+ asChild: !0,
390
+ children: n ? /* @__PURE__ */ f(C, {
391
+ size: "icon",
392
+ variant: "ghost",
393
+ className: "h-6 w-6",
394
+ "aria-label": `Edit ${t.name} column`,
395
+ children: /* @__PURE__ */ f(s, { className: "h-3.5 w-3.5" })
396
+ }) : /* @__PURE__ */ p(C, {
397
+ size: "sm",
398
+ variant: "outline",
399
+ children: [/* @__PURE__ */ f(c, { className: "mr-1 h-4 w-4" }), "Add column"]
400
+ })
401
+ }), /* @__PURE__ */ p(O, {
402
+ className: "max-w-md",
403
+ children: [
404
+ /* @__PURE__ */ p(j, { children: [/* @__PURE__ */ f(M, { children: n ? `Edit ${t.name}` : "Add column" }), /* @__PURE__ */ f(k, { children: "Moving a card into a column that sets a status changes the work item's status." })] }),
405
+ /* @__PURE__ */ p("div", {
406
+ className: "space-y-3",
407
+ children: [
408
+ /* @__PURE__ */ p("div", { children: [/* @__PURE__ */ f("label", {
409
+ htmlFor: `${$}-name`,
410
+ className: "text-sm font-medium",
411
+ children: "Name"
412
+ }), /* @__PURE__ */ f(E, {
413
+ id: `${$}-name`,
414
+ className: "mt-1",
415
+ value: o,
416
+ onChange: (e) => l(e.target.value)
417
+ })] }),
418
+ /* @__PURE__ */ p("div", { children: [/* @__PURE__ */ f("label", {
419
+ htmlFor: `${$}-status`,
420
+ className: "text-sm font-medium",
421
+ children: "Sets status"
422
+ }), /* @__PURE__ */ p("select", {
423
+ id: `${$}-status`,
424
+ className: "mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm",
425
+ value: d,
426
+ onChange: (e) => w(e.target.value),
427
+ children: [/* @__PURE__ */ f("option", {
428
+ value: "",
429
+ children: "No status (cards keep theirs)"
430
+ }), ee.map((e) => /* @__PURE__ */ f("option", {
431
+ value: e,
432
+ children: P(e)
433
+ }, e))]
434
+ })] }),
435
+ /* @__PURE__ */ p("div", { children: [
436
+ /* @__PURE__ */ f("label", {
437
+ htmlFor: `${$}-wip`,
438
+ className: "text-sm font-medium",
439
+ children: "WIP limit (blank for none)"
440
+ }),
441
+ /* @__PURE__ */ f(E, {
442
+ id: `${$}-wip`,
443
+ type: "number",
444
+ min: 1,
445
+ className: "mt-1",
446
+ value: T,
447
+ onChange: (e) => F(e.target.value)
448
+ }),
449
+ Q && /* @__PURE__ */ f(K, { message: "The WIP limit must be a whole number, 1 or more." })
450
+ ] })
451
+ ]
452
+ }),
453
+ I && /* @__PURE__ */ f(K, { message: I }),
454
+ /* @__PURE__ */ p(A, {
455
+ className: "gap-2",
456
+ children: [n && /* @__PURE__ */ p(m, { children: [/* @__PURE__ */ f(S, {
457
+ asChild: !0,
458
+ children: /* @__PURE__ */ f(C, {
459
+ variant: "outline",
460
+ disabled: X,
461
+ children: "Delete column"
462
+ })
463
+ }), /* @__PURE__ */ p(_, { children: [/* @__PURE__ */ p(b, { children: [/* @__PURE__ */ p(x, { children: [
464
+ "Delete ",
465
+ t.name,
466
+ "?"
467
+ ] }), /* @__PURE__ */ f(v, { children: "Its cards are not deleted: each goes back to the column for its status, or off the board if no column sets that status." })] }), /* @__PURE__ */ p(y, { children: [/* @__PURE__ */ f(g, { children: "Keep it" }), /* @__PURE__ */ f(h, {
468
+ className: "bg-destructive text-destructive-foreground hover:bg-destructive/90",
469
+ onClick: async () => {
470
+ try {
471
+ await Y({ variables: { id: t.id } }), a(!1);
472
+ } catch (e) {
473
+ L(G(e, "The column could not be deleted."));
474
+ }
475
+ },
476
+ children: "Delete column"
477
+ })] })] })] }), /* @__PURE__ */ f(C, {
478
+ onClick: ie,
479
+ disabled: !ne,
480
+ "data-testid": `${$}-save`,
481
+ children: X ? "Saving…" : n ? "Save" : "Add column"
482
+ })]
483
+ })
484
+ ]
485
+ })]
486
+ });
487
+ }
488
+ //#endregion
489
+ export { q as ProjectBoard };
490
+
491
+ //# sourceMappingURL=ProjectBoard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProjectBoard.js","names":[],"sources":["../../../src/planmagnet/board/ProjectBoard.tsx"],"sourcesContent":["import { useState } from 'react';\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 Input,\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n ResponsiveDialogTrigger,\n} from '@burdenoff/fe-libs/ui';\nimport { ChevronLeft, ChevronRight, LayoutGrid, Pencil, Plus } from 'lucide-react';\nimport { usePlanMagnet, usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\nimport { PersonName } from '../people/People';\n\n/**\n * A project's board (P1.2). The server owns placement: each column's `cards`\n * follow the rule in wspace-planmagnet-svc board.service.ts `columnCardsWhere`\n * (placed column, else the first column mapped to the item's status), and\n * `unplacedCount` says how many items are on no column. Moving a card into a\n * column mapped to a status changes that status on the server, and a column's\n * WIP limit is enforced there too. This component only draws and asks.\n */\n\nconst STATUSES = [\n 'BACKLOG',\n 'TODO',\n 'IN_PROGRESS',\n 'IN_REVIEW',\n 'TESTING',\n 'DONE',\n 'CANCELLED',\n] as const;\nconst statusLabel = (status: string) =>\n status.charAt(0) + status.slice(1).toLowerCase().replace(/_/g, ' ');\n\nconst CARDS_PER_COLUMN = 100;\n\nconst BOARDS = gql`\n query ProjectBoards($workspaceId: ID!, $projectId: String) {\n planmagnetBoards(\n workspaceId: $workspaceId\n filter: { projectId: $projectId }\n pagination: { first: 20 }\n ) {\n items {\n id\n name\n isDefault\n }\n }\n }\n`;\n\nconst BOARD = gql`\n query ProjectBoard($id: ID!) {\n planmagnetBoard(id: $id) {\n id\n name\n unplacedCount\n columns {\n id\n name\n mappedStatus\n wipLimit\n sortOrder\n cards(pagination: { first: 100 }) {\n totalCount\n items {\n id\n key\n title\n status\n priority\n storyPoints\n assigneeId\n }\n }\n }\n }\n }\n`;\n\nconst MOVE_CARD = gql`\n mutation ProjectBoardMoveCard($boardId: ID!, $input: PlanmagnetMoveCardInput!) {\n planmagnetMoveCard(boardId: $boardId, input: $input) {\n id\n }\n }\n`;\nconst CREATE_BOARD = gql`\n mutation ProjectBoardCreate($input: PlanmagnetCreateBoardInput!) {\n planmagnetCreateBoard(input: $input) {\n id\n }\n }\n`;\nconst CREATE_COLUMN = gql`\n mutation ProjectBoardCreateColumn($input: PlanmagnetCreateBoardColumnInput!) {\n planmagnetCreateBoardColumn(input: $input) {\n id\n }\n }\n`;\nconst UPDATE_COLUMN = gql`\n mutation ProjectBoardUpdateColumn($id: ID!, $input: PlanmagnetUpdateBoardColumnInput!) {\n planmagnetUpdateBoardColumn(id: $id, input: $input) {\n id\n }\n }\n`;\nconst DELETE_COLUMN = gql`\n mutation ProjectBoardDeleteColumn($id: ID!) {\n planmagnetDeleteBoardColumn(id: $id)\n }\n`;\nconst REORDER_COLUMNS = gql`\n mutation ProjectBoardReorder($boardId: ID!, $input: PlanmagnetReorderColumnsInput!) {\n planmagnetReorderColumns(boardId: $boardId, input: $input) {\n id\n }\n }\n`;\n\n/** Every query whose numbers a board change can move. */\nconst REFETCH = [\n 'ProjectBoard',\n 'ProjectBoards',\n 'GetWorkItems',\n 'GetWorkItemCounts',\n 'GetDashboardData',\n];\n\ninterface BoardCard {\n id: string;\n key: string;\n title: string;\n status: string;\n priority: string;\n storyPoints: number | null;\n assigneeId: string | null;\n}\n\ninterface BoardColumn {\n id: string;\n name: string;\n mappedStatus: string | null;\n wipLimit: number | null;\n sortOrder: number;\n cards: { totalCount: number; items: BoardCard[] };\n}\n\ninterface BoardData {\n id: string;\n name: string;\n unplacedCount: number;\n columns: BoardColumn[];\n}\n\nconst messageOf = (e: unknown, fallback: string) => (e instanceof Error ? e.message : fallback);\n\nfunction ErrorLine({ message }: { message: string }) {\n return (\n <p role=\"alert\" className=\"text-sm text-destructive\">\n {message}\n </p>\n );\n}\n\nexport function ProjectBoard({\n projectId,\n projectName,\n}: {\n projectId: string;\n projectName: string;\n}) {\n const { workspaceId } = usePlanMagnet();\n const [chosenBoardId, setChosenBoardId] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n const { data: boardsData, loading: boardsLoading } = useQuery<{\n planmagnetBoards: { items: Array<{ id: string; name: string; isDefault: boolean }> };\n }>(BOARDS, { variables: { workspaceId, projectId }, skip: !workspaceId });\n const boards = boardsData?.planmagnetBoards.items ?? [];\n const boardId =\n (chosenBoardId && boards.some((b) => b.id === chosenBoardId) ? chosenBoardId : null) ??\n boards.find((b) => b.isDefault)?.id ??\n boards[0]?.id ??\n null;\n\n const { data, loading } = useQuery<{ planmagnetBoard: BoardData | null }>(BOARD, {\n variables: { id: boardId },\n skip: !boardId,\n });\n const board = data?.planmagnetBoard ?? null;\n\n const [createBoard, createBoardState] = useMutation<{ planmagnetCreateBoard: { id: string } }>(\n CREATE_BOARD,\n { refetchQueries: REFETCH, awaitRefetchQueries: true }\n );\n const [moveCard, moveState] = useMutation(MOVE_CARD, {\n refetchQueries: REFETCH,\n awaitRefetchQueries: true,\n });\n const [reorder] = useMutation(REORDER_COLUMNS, {\n refetchQueries: REFETCH,\n awaitRefetchQueries: true,\n });\n\n const run = async (action: () => Promise<unknown>, fallback: string) => {\n setError(null);\n try {\n await action();\n } catch (e) {\n setError(messageOf(e, fallback));\n }\n };\n\n const move = (workItemId: string, targetColumnId: string) =>\n run(\n () => moveCard({ variables: { boardId, input: { workItemId, targetColumnId } } }),\n 'The card could not be moved.'\n );\n\n const shiftColumn = (index: number, delta: -1 | 1) => {\n if (!board) return;\n const order = board.columns.map((c) => c.id);\n const target = index + delta;\n if (target < 0 || target >= order.length) return;\n [order[index], order[target]] = [order[target], order[index]];\n return run(\n () => reorder({ variables: { boardId, input: { columnIds: order } } }),\n 'The columns could not be reordered.'\n );\n };\n\n if (boardsLoading && !boardsData) {\n return <p className=\"text-sm text-muted-foreground p-4\">Loading board…</p>;\n }\n\n if (!boardId) {\n return (\n <Card>\n <CardContent className=\"p-8 text-center space-y-3\" data-testid=\"board-empty\">\n <LayoutGrid className=\"h-8 w-8 mx-auto text-muted-foreground\" />\n <p className=\"text-sm text-muted-foreground\">{projectName} has no board yet.</p>\n <Button\n size=\"sm\"\n disabled={createBoardState.loading}\n onClick={() =>\n run(\n () =>\n createBoard({\n variables: {\n input: {\n projectId,\n name: `${projectName} board`,\n type: 'KANBAN',\n isDefault: true,\n withDefaultColumns: true,\n },\n },\n }),\n 'The board could not be created.'\n )\n }\n >\n <Plus className=\"mr-1 h-4 w-4\" />\n {createBoardState.loading ? 'Creating…' : 'Create board'}\n </Button>\n <p className=\"text-xs text-muted-foreground\">\n Starts with one column per status: Backlog, To Do, In Progress, In Review, Testing,\n Done.\n </p>\n {error && <ErrorLine message={error} />}\n </CardContent>\n </Card>\n );\n }\n\n return (\n <div className=\"space-y-3\" data-testid=\"project-board\">\n <div className=\"flex flex-wrap items-center gap-3\">\n {boards.length > 1 && (\n <select\n aria-label=\"Board\"\n className=\"rounded-md border border-input bg-background px-2 py-1 text-sm\"\n value={boardId}\n onChange={(e) => setChosenBoardId(e.target.value)}\n >\n {boards.map((b) => (\n <option key={b.id} value={b.id}>\n {b.name}\n </option>\n ))}\n </select>\n )}\n {board && board.unplacedCount > 0 && (\n <p className=\"text-xs text-muted-foreground\" data-testid=\"board-unplaced\">\n {board.unplacedCount} work item{board.unplacedCount === 1 ? ' is' : 's are'} not on this\n board: {board.unplacedCount === 1 ? 'its status has' : 'their status has'} no column.\n </p>\n )}\n {board && (\n <div className=\"ml-auto\">\n <ColumnDialog boardId={board.id} />\n </div>\n )}\n </div>\n {error && <ErrorLine message={error} />}\n {loading && !board ? (\n <p className=\"text-sm text-muted-foreground p-4\">Loading board…</p>\n ) : (\n <div className=\"flex gap-3 overflow-x-auto pb-2\">\n {board?.columns.map((column, index) => (\n <BoardColumnView\n key={column.id}\n boardId={board.id}\n column={column}\n columns={board.columns}\n isFirst={index === 0}\n isLast={index === board.columns.length - 1}\n busy={moveState.loading}\n onMove={move}\n onShift={(delta) => shiftColumn(index, delta)}\n />\n ))}\n {board && board.columns.length === 0 && (\n <p className=\"text-sm text-muted-foreground p-4\">\n This board has no columns. Add one to start placing work.\n </p>\n )}\n </div>\n )}\n </div>\n );\n}\n\nfunction BoardColumnView({\n boardId,\n column,\n columns,\n isFirst,\n isLast,\n busy,\n onMove,\n onShift,\n}: {\n boardId: string;\n column: BoardColumn;\n columns: BoardColumn[];\n isFirst: boolean;\n isLast: boolean;\n busy: boolean;\n onMove: (workItemId: string, targetColumnId: string) => void;\n onShift: (delta: -1 | 1) => void;\n}) {\n const navigate = usePlanMagnetNavigate();\n const [dragOver, setDragOver] = useState(false);\n const count = column.cards.totalCount;\n const atLimit = column.wipLimit != null && column.wipLimit > 0 && count >= column.wipLimit;\n const hidden = count - column.cards.items.length;\n\n return (\n <section\n aria-label={`${column.name} column`}\n data-testid={`board-column-${column.name}`}\n className={`min-w-[240px] w-[240px] shrink-0 rounded-md border bg-muted/30 ${dragOver ? 'ring-2 ring-primary' : ''}`}\n onDragOver={(e) => {\n e.preventDefault();\n setDragOver(true);\n }}\n onDragLeave={() => setDragOver(false)}\n onDrop={(e) => {\n e.preventDefault();\n setDragOver(false);\n const workItemId = e.dataTransfer.getData('text/plain');\n if (workItemId) onMove(workItemId, column.id);\n }}\n >\n <header className=\"p-2 border-b space-y-1\">\n <div className=\"flex items-center justify-between gap-1\">\n <h3 className=\"text-sm font-medium truncate\">{column.name}</h3>\n <span\n data-testid={`board-column-count-${column.name}`}\n className={`text-xs rounded-full px-1.5 ${atLimit ? 'bg-status-warning-subtle text-status-warning' : 'bg-muted'}`}\n title={column.wipLimit ? `WIP limit ${column.wipLimit}` : undefined}\n >\n {column.wipLimit ? `${count} / ${column.wipLimit}` : count}\n </span>\n </div>\n <div className=\"flex items-center justify-between gap-1\">\n <span className=\"text-[11px] text-muted-foreground\">\n {column.mappedStatus ? `Sets status: ${statusLabel(column.mappedStatus)}` : 'No status'}\n </span>\n <span className=\"flex\">\n <Button\n size=\"icon\"\n variant=\"ghost\"\n className=\"h-6 w-6\"\n aria-label={`Move ${column.name} column left`}\n disabled={isFirst}\n onClick={() => onShift(-1)}\n >\n <ChevronLeft className=\"h-3.5 w-3.5\" />\n </Button>\n <Button\n size=\"icon\"\n variant=\"ghost\"\n className=\"h-6 w-6\"\n aria-label={`Move ${column.name} column right`}\n disabled={isLast}\n onClick={() => onShift(1)}\n >\n <ChevronRight className=\"h-3.5 w-3.5\" />\n </Button>\n <ColumnDialog boardId={boardId} column={column} />\n </span>\n </div>\n </header>\n <ul className=\"p-2 space-y-2 min-h-[80px]\">\n {column.cards.items.map((card) => (\n <li\n key={card.id}\n draggable\n onDragStart={(e) => {\n e.dataTransfer.setData('text/plain', card.id);\n e.dataTransfer.effectAllowed = 'move';\n }}\n className=\"rounded-md border bg-background p-2 space-y-1 cursor-grab\"\n data-testid=\"board-card\"\n >\n <button\n type=\"button\"\n className=\"text-left text-sm font-medium leading-tight hover:underline\"\n onClick={() =>\n navigate(`/tasks/task-detail-page?taskId=${encodeURIComponent(card.id)}`)\n }\n >\n {card.title}\n </button>\n <div className=\"flex items-center justify-between text-[11px] text-muted-foreground\">\n <span>{card.key}</span>\n <span>{card.storyPoints ?? 0} pts</span>\n </div>\n <div className=\"flex items-center justify-between gap-1 text-[11px] text-muted-foreground\">\n <span className=\"truncate\">\n {card.assigneeId ? <PersonName id={card.assigneeId} /> : 'Unassigned'}\n </span>\n {/* The same move as drag-and-drop, for keyboard and assistive tech. */}\n <select\n aria-label={`Move ${card.key} to column`}\n className=\"rounded border border-input bg-background px-1 py-0.5 text-[11px]\"\n value=\"\"\n disabled={busy}\n onChange={(e) => e.target.value && onMove(card.id, e.target.value)}\n >\n <option value=\"\">Move…</option>\n {columns\n .filter((c) => c.id !== column.id)\n .map((c) => (\n <option key={c.id} value={c.id}>\n {c.name}\n </option>\n ))}\n </select>\n </div>\n </li>\n ))}\n {count === 0 && <li className=\"text-xs text-muted-foreground text-center py-4\">Empty</li>}\n </ul>\n {hidden > 0 && (\n <p className=\"px-2 pb-2 text-xs text-muted-foreground\">\n +{hidden} more (showing the first {CARDS_PER_COLUMN})\n </p>\n )}\n </section>\n );\n}\n\n/** Add a column (no `column`) or edit one: name, the status it sets, WIP limit; delete. */\nfunction ColumnDialog({ boardId, column }: { boardId: string; column?: BoardColumn }) {\n const editing = column !== undefined;\n const [open, setOpen] = useState(false);\n const [name, setName] = useState(column?.name ?? '');\n const [mappedStatus, setMappedStatus] = useState(column?.mappedStatus ?? '');\n const [wip, setWip] = useState(column?.wipLimit ? String(column.wipLimit) : '');\n const [error, setError] = useState<string | null>(null);\n const options = { refetchQueries: REFETCH, awaitRefetchQueries: true };\n const [create, createState] = useMutation(CREATE_COLUMN, options);\n const [update, updateState] = useMutation(UPDATE_COLUMN, options);\n const [remove, removeState] = useMutation(DELETE_COLUMN, options);\n const busy = createState.loading || updateState.loading || removeState.loading;\n\n const wipValue = wip.trim() === '' ? null : Number(wip);\n const invalidWip = wipValue !== null && (!Number.isInteger(wipValue) || wipValue < 1);\n const canSave = name.trim() !== '' && !invalidWip && !busy;\n\n const reset = () => {\n setName(column?.name ?? '');\n setMappedStatus(column?.mappedStatus ?? '');\n setWip(column?.wipLimit ? String(column.wipLimit) : '');\n setError(null);\n };\n\n const save = async () => {\n setError(null);\n const fields = {\n name: name.trim(),\n mappedStatus: mappedStatus || null,\n wipLimit: wipValue,\n };\n try {\n if (editing) {\n await update({ variables: { id: column.id, input: fields } });\n } else {\n await create({ variables: { input: { boardId, type: 'CUSTOM', ...fields } } });\n }\n setOpen(false);\n } catch (e) {\n setError(messageOf(e, 'The column could not be saved.'));\n }\n };\n\n const idPrefix = editing ? `column-${column.id}` : 'new-column';\n\n return (\n <ResponsiveDialog\n open={open}\n onOpenChange={(next) => {\n setOpen(next);\n if (next) reset();\n }}\n >\n <ResponsiveDialogTrigger asChild>\n {editing ? (\n <Button\n size=\"icon\"\n variant=\"ghost\"\n className=\"h-6 w-6\"\n aria-label={`Edit ${column.name} column`}\n >\n <Pencil className=\"h-3.5 w-3.5\" />\n </Button>\n ) : (\n <Button size=\"sm\" variant=\"outline\">\n <Plus className=\"mr-1 h-4 w-4\" />\n Add column\n </Button>\n )}\n </ResponsiveDialogTrigger>\n <ResponsiveDialogContent className=\"max-w-md\">\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>\n {editing ? `Edit ${column.name}` : 'Add column'}\n </ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Moving a card into a column that sets a status changes the work item&apos;s status.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n <div className=\"space-y-3\">\n <div>\n <label htmlFor={`${idPrefix}-name`} className=\"text-sm font-medium\">\n Name\n </label>\n <Input\n id={`${idPrefix}-name`}\n className=\"mt-1\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n />\n </div>\n <div>\n <label htmlFor={`${idPrefix}-status`} className=\"text-sm font-medium\">\n Sets status\n </label>\n <select\n id={`${idPrefix}-status`}\n className=\"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm\"\n value={mappedStatus}\n onChange={(e) => setMappedStatus(e.target.value)}\n >\n <option value=\"\">No status (cards keep theirs)</option>\n {STATUSES.map((s) => (\n <option key={s} value={s}>\n {statusLabel(s)}\n </option>\n ))}\n </select>\n </div>\n <div>\n <label htmlFor={`${idPrefix}-wip`} className=\"text-sm font-medium\">\n WIP limit (blank for none)\n </label>\n <Input\n id={`${idPrefix}-wip`}\n type=\"number\"\n min={1}\n className=\"mt-1\"\n value={wip}\n onChange={(e) => setWip(e.target.value)}\n />\n {invalidWip && <ErrorLine message=\"The WIP limit must be a whole number, 1 or more.\" />}\n </div>\n </div>\n {error && <ErrorLine message={error} />}\n <ResponsiveDialogFooter className=\"gap-2\">\n {editing && (\n <AlertDialog>\n <AlertDialogTrigger asChild>\n <Button variant=\"outline\" disabled={busy}>\n Delete column\n </Button>\n </AlertDialogTrigger>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>Delete {column.name}?</AlertDialogTitle>\n <AlertDialogDescription>\n Its cards are not deleted: each goes back to the column for its status, or off\n the board if no column sets that status.\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 try {\n await remove({ variables: { id: column.id } });\n setOpen(false);\n } catch (e) {\n setError(messageOf(e, 'The column could not be deleted.'));\n }\n }}\n >\n Delete column\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n )}\n <Button onClick={save} disabled={!canSave} data-testid={`${idPrefix}-save`}>\n {busy ? 'Saving…' : editing ? 'Save' : 'Add column'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\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":"AA2HA,wBAAgB,kBAAkB,4CAkMjC"}
1
+ {"version":3,"file":"TasksTasksPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/TasksTasksPagePage.tsx"],"names":[],"mappings":"AAuIA,wBAAgB,kBAAkB,4CAsOjC"}