@burdenoff/microfe-planmagnet 2026.926.2 → 2026.927.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/dist/planmagnet/pages/DashboardDashboardPagePage.d.ts.map +1 -1
  2. package/dist/planmagnet/pages/DashboardDashboardPagePage.js +14 -4
  3. package/dist/planmagnet/pages/DashboardDashboardPagePage.js.map +1 -1
  4. package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.d.ts.map +1 -1
  5. package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.js +102 -100
  6. package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.js.map +1 -1
  7. package/dist/planmagnet/pages/ProductsFeaturesPagePage.d.ts.map +1 -1
  8. package/dist/planmagnet/pages/ProductsFeaturesPagePage.js +95 -94
  9. package/dist/planmagnet/pages/ProductsFeaturesPagePage.js.map +1 -1
  10. package/dist/planmagnet/pages/ProductsProductDetailPagePage.d.ts.map +1 -1
  11. package/dist/planmagnet/pages/ProductsProductDetailPagePage.js +1 -1
  12. package/dist/planmagnet/pages/ProductsProductDetailPagePage.js.map +1 -1
  13. package/dist/planmagnet/pages/ProjectsEditProjectPagePage.d.ts.map +1 -1
  14. package/dist/planmagnet/pages/ProjectsEditProjectPagePage.js +97 -93
  15. package/dist/planmagnet/pages/ProjectsEditProjectPagePage.js.map +1 -1
  16. package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.d.ts.map +1 -1
  17. package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.js +84 -73
  18. package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.js.map +1 -1
  19. package/dist/planmagnet/pages/ProjectsMilestonesPagePage.d.ts.map +1 -1
  20. package/dist/planmagnet/pages/ProjectsMilestonesPagePage.js +13 -8
  21. package/dist/planmagnet/pages/ProjectsMilestonesPagePage.js.map +1 -1
  22. package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.d.ts.map +1 -1
  23. package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.js +129 -125
  24. package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.js.map +1 -1
  25. package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.d.ts.map +1 -1
  26. package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.js +112 -109
  27. package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.js.map +1 -1
  28. package/dist/planmagnet/pages/ReportsReportsPagePage.d.ts.map +1 -1
  29. package/dist/planmagnet/pages/ReportsReportsPagePage.js +72 -83
  30. package/dist/planmagnet/pages/ReportsReportsPagePage.js.map +1 -1
  31. package/dist/planmagnet/pages/SprintsStartSprintPagePage.d.ts.map +1 -1
  32. package/dist/planmagnet/pages/SprintsStartSprintPagePage.js +103 -103
  33. package/dist/planmagnet/pages/SprintsStartSprintPagePage.js.map +1 -1
  34. package/dist/planmagnet/pages/TasksEditTaskPagePage.d.ts.map +1 -1
  35. package/dist/planmagnet/pages/TasksEditTaskPagePage.js +101 -99
  36. package/dist/planmagnet/pages/TasksEditTaskPagePage.js.map +1 -1
  37. package/dist/planmagnet/pages/TasksTaskDetailPagePage.d.ts.map +1 -1
  38. package/dist/planmagnet/pages/TasksTaskDetailPagePage.js +127 -125
  39. package/dist/planmagnet/pages/TasksTaskDetailPagePage.js.map +1 -1
  40. package/dist/planmagnet/pages/TasksTasksPagePage.d.ts.map +1 -1
  41. package/dist/planmagnet/pages/TasksTasksPagePage.js +8 -11
  42. package/dist/planmagnet/pages/TasksTasksPagePage.js.map +1 -1
  43. package/dist/planmagnet/pages/TeamTeamPagePage.d.ts.map +1 -1
  44. package/dist/planmagnet/pages/TeamTeamPagePage.js +67 -68
  45. package/dist/planmagnet/pages/TeamTeamPagePage.js.map +1 -1
  46. package/dist/planmagnet/pages/WorkspaceCreateWorkspacePagePage.d.ts.map +1 -1
  47. package/dist/planmagnet/pages/WorkspaceCreateWorkspacePagePage.js +1 -5
  48. package/dist/planmagnet/pages/WorkspaceCreateWorkspacePagePage.js.map +1 -1
  49. package/dist/planmagnet/people/People.d.ts +18 -0
  50. package/dist/planmagnet/people/People.d.ts.map +1 -1
  51. package/dist/planmagnet/people/People.js +26 -12
  52. package/dist/planmagnet/people/People.js.map +1 -1
  53. package/package.json +1 -1
@@ -1,14 +1,15 @@
1
1
  import { usePlanMagnet as e, usePlanMagnetNavigate as t } from "../providers/PlanMagnetProvider.js";
2
- import { detailPath as n } from "../utils/rowNavigation.js";
3
- import { NewSprintDialog as r, SprintLifecycleActions as i } from "../sprints/SprintControls.js";
4
- import { SprintDates as a } from "../sprints/SprintDates.js";
5
- import { Users as o, Zap as s } from "lucide-react";
6
- import { gql as c } from "@apollo/client";
7
- import { useQuery as l } from "@apollo/client/react";
8
- import { jsx as u, jsxs as d } from "react/jsx-runtime";
9
- import { Badge as f, Card as p, CardContent as m, CardHeader as h, CardTitle as g } from "@burdenoff/fe-libs/ui";
2
+ import { PersonAvatar as n } from "../people/People.js";
3
+ import { detailPath as r } from "../utils/rowNavigation.js";
4
+ import { NewSprintDialog as i, SprintLifecycleActions as a } from "../sprints/SprintControls.js";
5
+ import { SprintDates as o } from "../sprints/SprintDates.js";
6
+ import { Users as s, Zap as c } from "lucide-react";
7
+ import { gql as l } from "@apollo/client";
8
+ import { useQuery as u } from "@apollo/client/react";
9
+ import { jsx as d, jsxs as f } from "react/jsx-runtime";
10
+ import { Badge as p, Card as m, CardContent as h, CardHeader as g, CardTitle as _ } from "@burdenoff/fe-libs/ui";
10
11
  //#region src/planmagnet/pages/SprintsStartSprintPagePage.tsx
11
- var _ = c`
12
+ var v = l`
12
13
  query GetSprints(
13
14
  $workspaceId: ID!
14
15
  $filter: PlanmagnetSprintFilter
@@ -47,7 +48,7 @@ var _ = c`
47
48
  }
48
49
  }
49
50
  `;
50
- function v(e) {
51
+ function y(e) {
51
52
  let t = e.workItems ?? [], n = t.reduce((e, t) => e + (t.storyPoints ?? 0), 0), r = t.filter((e) => e.status === "DONE").reduce((e, t) => e + (t.storyPoints ?? 0), 0);
52
53
  return {
53
54
  totalPoints: n,
@@ -58,256 +59,255 @@ function v(e) {
58
59
  velocity: e.velocity ?? r
59
60
  };
60
61
  }
61
- function y() {
62
- let { workspaceId: c } = e(), { data: y, loading: b, error: x } = l(_, {
62
+ function b() {
63
+ let { workspaceId: l } = e(), { data: b, loading: x, error: S } = u(v, {
63
64
  variables: {
64
- workspaceId: c,
65
+ workspaceId: l,
65
66
  pagination: { first: 50 }
66
67
  },
67
- skip: !c
68
- }), S = y?.planmagnetSprints?.items ?? [], C = S.filter((e) => e.status === "ACTIVE" || e.status === "REVIEW"), w = S.filter((e) => e.status === "PLANNING"), T = S.filter((e) => e.status === "COMPLETED" || e.status === "CANCELLED"), E = t(), D = (e) => E(n("/projects/planning-detail-page", e));
69
- return b && !y ? /* @__PURE__ */ u("div", {
68
+ skip: !l
69
+ }), C = b?.planmagnetSprints?.items ?? [], w = C.filter((e) => e.status === "ACTIVE" || e.status === "REVIEW"), T = C.filter((e) => e.status === "PLANNING"), E = C.filter((e) => e.status === "COMPLETED" || e.status === "CANCELLED"), D = t(), O = (e) => D(r("/projects/planning-detail-page", e));
70
+ return x && !b ? /* @__PURE__ */ d("div", {
70
71
  className: "flex items-center justify-center p-12",
71
- children: /* @__PURE__ */ u("div", { className: "animate-spin h-8 w-8 border-2 border-primary border-t-transparent rounded-full" })
72
- }) : x ? /* @__PURE__ */ d("div", {
72
+ children: /* @__PURE__ */ d("div", { className: "animate-spin h-8 w-8 border-2 border-primary border-t-transparent rounded-full" })
73
+ }) : S ? /* @__PURE__ */ f("div", {
73
74
  className: "p-6 text-red-500",
74
- children: ["Error: ", x.message]
75
- }) : /* @__PURE__ */ d("div", {
75
+ children: ["Error: ", S.message]
76
+ }) : /* @__PURE__ */ f("div", {
76
77
  className: "space-y-6 p-6",
77
78
  children: [
78
- /* @__PURE__ */ d("div", {
79
+ /* @__PURE__ */ f("div", {
79
80
  className: "flex items-center justify-between",
80
- children: [/* @__PURE__ */ d("div", { children: [/* @__PURE__ */ u("h1", {
81
+ children: [/* @__PURE__ */ f("div", { children: [/* @__PURE__ */ d("h1", {
81
82
  className: "text-2xl font-semibold",
82
83
  children: "Sprint Management"
83
- }), /* @__PURE__ */ d("p", {
84
+ }), /* @__PURE__ */ f("p", {
84
85
  className: "text-sm text-muted-foreground",
85
86
  children: [
86
- S.length,
87
- " sprints total · ",
88
87
  C.length,
88
+ " sprints total · ",
89
+ w.length,
89
90
  " active"
90
91
  ]
91
- })] }), /* @__PURE__ */ u(r, { onCreated: D })]
92
+ })] }), /* @__PURE__ */ d(i, { onCreated: O })]
92
93
  }),
93
- C.length > 0 && /* @__PURE__ */ d("div", {
94
+ w.length > 0 && /* @__PURE__ */ f("div", {
94
95
  className: "space-y-4",
95
- children: [/* @__PURE__ */ u("h2", {
96
+ children: [/* @__PURE__ */ d("h2", {
96
97
  className: "text-lg font-medium",
97
98
  children: "Active Sprints"
98
- }), C.map((e) => {
99
- let t = v(e), n = e.workItems ?? [], r = t.totalPoints > 0 ? Math.round(t.completedPoints / t.totalPoints * 100) : 0;
100
- return /* @__PURE__ */ d(p, { children: [/* @__PURE__ */ u(h, {
99
+ }), w.map((e) => {
100
+ let t = y(e), r = e.workItems ?? [], i = t.totalPoints > 0 ? Math.round(t.completedPoints / t.totalPoints * 100) : 0;
101
+ return /* @__PURE__ */ f(m, { children: [/* @__PURE__ */ d(g, {
101
102
  className: "pb-2",
102
- children: /* @__PURE__ */ d("div", {
103
+ children: /* @__PURE__ */ f("div", {
103
104
  className: "flex items-center justify-between",
104
- children: [/* @__PURE__ */ d(g, {
105
+ children: [/* @__PURE__ */ f(_, {
105
106
  className: "text-base flex items-center gap-2",
106
- children: [/* @__PURE__ */ u(s, { className: "h-4 w-4 text-primary" }), /* @__PURE__ */ u("button", {
107
+ children: [/* @__PURE__ */ d(c, { className: "h-4 w-4 text-primary" }), /* @__PURE__ */ d("button", {
107
108
  type: "button",
108
109
  className: "hover:underline text-left",
109
- onClick: () => D(e.id),
110
+ onClick: () => O(e.id),
110
111
  children: e.name
111
112
  })]
112
- }), /* @__PURE__ */ d("div", {
113
+ }), /* @__PURE__ */ f("div", {
113
114
  className: "flex items-start gap-2",
114
- children: [/* @__PURE__ */ u(f, { children: e.status === "REVIEW" ? "Review" : "Active" }), /* @__PURE__ */ u(i, {
115
+ children: [/* @__PURE__ */ d(p, { children: e.status === "REVIEW" ? "Review" : "Active" }), /* @__PURE__ */ d(a, {
115
116
  sprintId: e.id,
116
117
  sprintName: e.name,
117
118
  status: e.status
118
119
  })]
119
120
  })]
120
121
  })
121
- }), /* @__PURE__ */ d(m, {
122
+ }), /* @__PURE__ */ f(h, {
122
123
  className: "space-y-4",
123
124
  children: [
124
- /* @__PURE__ */ u("p", {
125
+ /* @__PURE__ */ d("p", {
125
126
  className: "text-sm text-muted-foreground",
126
127
  children: e.goal ?? ""
127
128
  }),
128
- /* @__PURE__ */ u(a, { sprint: e }),
129
- /* @__PURE__ */ u("div", {
129
+ /* @__PURE__ */ d(o, { sprint: e }),
130
+ /* @__PURE__ */ d("div", {
130
131
  className: "flex gap-4 text-xs text-muted-foreground",
131
- children: /* @__PURE__ */ d("span", {
132
+ children: /* @__PURE__ */ f("span", {
132
133
  className: "flex items-center gap-1",
133
134
  children: [
134
- /* @__PURE__ */ u(o, { className: "h-3 w-3" }),
135
+ /* @__PURE__ */ d(s, { className: "h-3 w-3" }),
135
136
  t.teamMemberIds.length,
136
137
  " members"
137
138
  ]
138
139
  })
139
140
  }),
140
- /* @__PURE__ */ d("div", {
141
+ /* @__PURE__ */ f("div", {
141
142
  className: "grid grid-cols-3 gap-4 text-center",
142
143
  children: [
143
- /* @__PURE__ */ d("div", {
144
+ /* @__PURE__ */ f("div", {
144
145
  className: "p-3 bg-muted rounded-md",
145
- children: [/* @__PURE__ */ d("p", {
146
+ children: [/* @__PURE__ */ f("p", {
146
147
  className: "text-lg font-bold",
147
148
  children: [
148
149
  t.completedPoints,
149
150
  "/",
150
151
  t.totalPoints
151
152
  ]
152
- }), /* @__PURE__ */ u("p", {
153
+ }), /* @__PURE__ */ d("p", {
153
154
  className: "text-xs text-muted-foreground",
154
155
  children: "Points"
155
156
  })]
156
157
  }),
157
- /* @__PURE__ */ d("div", {
158
+ /* @__PURE__ */ f("div", {
158
159
  className: "p-3 bg-muted rounded-md",
159
- children: [/* @__PURE__ */ d("p", {
160
+ children: [/* @__PURE__ */ f("p", {
160
161
  className: "text-lg font-bold",
161
162
  children: [
162
163
  t.tasksCompleted,
163
164
  "/",
164
165
  t.tasksTotal
165
166
  ]
166
- }), /* @__PURE__ */ u("p", {
167
+ }), /* @__PURE__ */ d("p", {
167
168
  className: "text-xs text-muted-foreground",
168
169
  children: "Tasks"
169
170
  })]
170
171
  }),
171
- /* @__PURE__ */ d("div", {
172
+ /* @__PURE__ */ f("div", {
172
173
  className: "p-3 bg-muted rounded-md",
173
- children: [/* @__PURE__ */ u("p", {
174
+ children: [/* @__PURE__ */ d("p", {
174
175
  className: "text-lg font-bold",
175
176
  children: t.velocity
176
- }), /* @__PURE__ */ u("p", {
177
+ }), /* @__PURE__ */ d("p", {
177
178
  className: "text-xs text-muted-foreground",
178
179
  children: "Velocity"
179
180
  })]
180
181
  })
181
182
  ]
182
183
  }),
183
- /* @__PURE__ */ d("div", { children: [/* @__PURE__ */ d("div", {
184
+ /* @__PURE__ */ f("div", { children: [/* @__PURE__ */ f("div", {
184
185
  className: "flex justify-between text-xs mb-1",
185
- children: [/* @__PURE__ */ u("span", {
186
+ children: [/* @__PURE__ */ d("span", {
186
187
  className: "text-muted-foreground",
187
188
  children: "Sprint Progress"
188
- }), /* @__PURE__ */ d("span", {
189
+ }), /* @__PURE__ */ f("span", {
189
190
  className: "font-medium",
190
- children: [r, "%"]
191
+ children: [i, "%"]
191
192
  })]
192
- }), /* @__PURE__ */ u("div", {
193
+ }), /* @__PURE__ */ d("div", {
193
194
  className: "w-full h-2 rounded-full bg-muted overflow-hidden",
194
- children: /* @__PURE__ */ u("div", {
195
+ children: /* @__PURE__ */ d("div", {
195
196
  className: "h-full bg-primary rounded-full",
196
- style: { width: `${r}%` }
197
+ style: { width: `${i}%` }
197
198
  })
198
199
  })] }),
199
- n.length > 0 && /* @__PURE__ */ d("div", { children: [/* @__PURE__ */ u("p", {
200
+ r.length > 0 && /* @__PURE__ */ f("div", { children: [/* @__PURE__ */ d("p", {
200
201
  className: "text-xs font-medium text-muted-foreground mb-2",
201
202
  children: "Sprint Backlog"
202
- }), /* @__PURE__ */ u("div", {
203
+ }), /* @__PURE__ */ d("div", {
203
204
  className: "space-y-1",
204
- children: n.map((e) => /* @__PURE__ */ d("div", {
205
+ children: r.map((e) => /* @__PURE__ */ f("div", {
205
206
  className: "flex items-center justify-between border rounded p-2 text-sm",
206
- children: [/* @__PURE__ */ u("span", { children: e.title }), /* @__PURE__ */ d("div", {
207
+ children: [/* @__PURE__ */ d("span", { children: e.title }), /* @__PURE__ */ f("div", {
207
208
  className: "flex gap-1",
208
- children: [/* @__PURE__ */ u(f, {
209
+ children: [/* @__PURE__ */ d(p, {
209
210
  variant: "secondary",
210
211
  className: "text-xs capitalize",
211
212
  children: e.status.toLowerCase().replace("_", " ")
212
- }), /* @__PURE__ */ d("span", {
213
+ }), /* @__PURE__ */ f("span", {
213
214
  className: "text-xs text-muted-foreground",
214
215
  children: [e.storyPoints ?? 0, "pts"]
215
216
  })]
216
217
  })]
217
218
  }, e.id))
218
219
  })] }),
219
- /* @__PURE__ */ d("div", { children: [/* @__PURE__ */ u("p", {
220
+ /* @__PURE__ */ f("div", { children: [/* @__PURE__ */ d("p", {
220
221
  className: "text-xs font-medium text-muted-foreground mb-1",
221
222
  children: "Team"
222
- }), /* @__PURE__ */ u("div", {
223
+ }), /* @__PURE__ */ d("div", {
223
224
  className: "flex gap-2",
224
- children: t.teamMemberIds.map((e) => /* @__PURE__ */ u("div", {
225
- className: "h-7 w-7 rounded-full bg-primary/10 flex items-center justify-center text-[10px] font-medium text-primary",
226
- title: e,
227
- children: e.slice(0, 2).toUpperCase()
225
+ children: t.teamMemberIds.map((e) => /* @__PURE__ */ d(n, {
226
+ id: e,
227
+ className: "h-7 w-7 rounded-full bg-primary/10 flex items-center justify-center text-[10px] font-medium text-primary"
228
228
  }, e))
229
229
  })] })
230
230
  ]
231
231
  })] }, e.id);
232
232
  })]
233
233
  }),
234
- w.length > 0 && /* @__PURE__ */ d("div", {
234
+ T.length > 0 && /* @__PURE__ */ f("div", {
235
235
  className: "space-y-4",
236
- children: [/* @__PURE__ */ u("h2", {
236
+ children: [/* @__PURE__ */ d("h2", {
237
237
  className: "text-lg font-medium",
238
238
  children: "Planning"
239
- }), w.map((e) => {
240
- let t = v(e);
241
- return /* @__PURE__ */ d(p, { children: [/* @__PURE__ */ u(h, {
239
+ }), T.map((e) => {
240
+ let t = y(e);
241
+ return /* @__PURE__ */ f(m, { children: [/* @__PURE__ */ d(g, {
242
242
  className: "pb-2",
243
- children: /* @__PURE__ */ d("div", {
243
+ children: /* @__PURE__ */ f("div", {
244
244
  className: "flex items-center justify-between",
245
- children: [/* @__PURE__ */ u(g, {
245
+ children: [/* @__PURE__ */ d(_, {
246
246
  className: "text-base",
247
- children: /* @__PURE__ */ u("button", {
247
+ children: /* @__PURE__ */ d("button", {
248
248
  type: "button",
249
249
  className: "hover:underline text-left",
250
- onClick: () => D(e.id),
250
+ onClick: () => O(e.id),
251
251
  children: e.name
252
252
  })
253
- }), /* @__PURE__ */ d("div", {
253
+ }), /* @__PURE__ */ f("div", {
254
254
  className: "flex items-start gap-2",
255
- children: [/* @__PURE__ */ u(f, {
255
+ children: [/* @__PURE__ */ d(p, {
256
256
  variant: "secondary",
257
257
  children: "Planning"
258
- }), /* @__PURE__ */ u(i, {
258
+ }), /* @__PURE__ */ d(a, {
259
259
  sprintId: e.id,
260
260
  sprintName: e.name,
261
261
  status: e.status
262
262
  })]
263
263
  })]
264
264
  })
265
- }), /* @__PURE__ */ d(m, {
265
+ }), /* @__PURE__ */ f(h, {
266
266
  className: "space-y-2",
267
267
  children: [
268
- /* @__PURE__ */ u("p", {
268
+ /* @__PURE__ */ d("p", {
269
269
  className: "text-sm text-muted-foreground",
270
270
  children: e.goal ?? ""
271
271
  }),
272
- /* @__PURE__ */ u(a, { sprint: e }),
273
- /* @__PURE__ */ d("div", {
272
+ /* @__PURE__ */ d(o, { sprint: e }),
273
+ /* @__PURE__ */ f("div", {
274
274
  className: "flex gap-4 text-xs text-muted-foreground",
275
- children: [/* @__PURE__ */ d("span", { children: [t.totalPoints, " points planned"] }), /* @__PURE__ */ d("span", { children: [t.teamMemberIds.length, " members"] })]
275
+ children: [/* @__PURE__ */ f("span", { children: [t.totalPoints, " points planned"] }), /* @__PURE__ */ f("span", { children: [t.teamMemberIds.length, " members"] })]
276
276
  })
277
277
  ]
278
278
  })] }, e.id);
279
279
  })]
280
280
  }),
281
- T.length > 0 && /* @__PURE__ */ d("div", {
281
+ E.length > 0 && /* @__PURE__ */ f("div", {
282
282
  className: "space-y-4",
283
283
  "data-testid": "finished-sprints",
284
- children: [/* @__PURE__ */ u("h2", {
284
+ children: [/* @__PURE__ */ d("h2", {
285
285
  className: "text-lg font-medium",
286
286
  children: "Finished"
287
- }), T.map((e) => {
288
- let t = v(e);
289
- return /* @__PURE__ */ d(p, {
287
+ }), E.map((e) => {
288
+ let t = y(e);
289
+ return /* @__PURE__ */ f(m, {
290
290
  "data-testid": "finished-sprint",
291
- children: [/* @__PURE__ */ u(h, {
291
+ children: [/* @__PURE__ */ d(g, {
292
292
  className: "pb-2",
293
- children: /* @__PURE__ */ d("div", {
293
+ children: /* @__PURE__ */ f("div", {
294
294
  className: "flex items-center justify-between",
295
- children: [/* @__PURE__ */ u(g, {
295
+ children: [/* @__PURE__ */ d(_, {
296
296
  className: "text-base",
297
- children: /* @__PURE__ */ u("button", {
297
+ children: /* @__PURE__ */ d("button", {
298
298
  type: "button",
299
299
  className: "hover:underline text-left",
300
- onClick: () => D(e.id),
300
+ onClick: () => O(e.id),
301
301
  children: e.name
302
302
  })
303
- }), /* @__PURE__ */ u(f, {
303
+ }), /* @__PURE__ */ d(p, {
304
304
  variant: "outline",
305
305
  children: e.status === "COMPLETED" ? "Completed" : "Cancelled"
306
306
  })]
307
307
  })
308
- }), /* @__PURE__ */ d(m, {
308
+ }), /* @__PURE__ */ f(h, {
309
309
  className: "space-y-2",
310
- children: [/* @__PURE__ */ u(a, { sprint: e }), /* @__PURE__ */ d("p", {
310
+ children: [/* @__PURE__ */ d(o, { sprint: e }), /* @__PURE__ */ f("p", {
311
311
  className: "text-xs text-muted-foreground",
312
312
  children: [
313
313
  t.completedPoints,
@@ -324,6 +324,6 @@ function y() {
324
324
  });
325
325
  }
326
326
  //#endregion
327
- export { y as SprintsStartSprintPagePage };
327
+ export { b as SprintsStartSprintPagePage };
328
328
 
329
329
  //# sourceMappingURL=SprintsStartSprintPagePage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SprintsStartSprintPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/SprintsStartSprintPagePage.tsx"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck\nimport { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport { Card, CardContent, CardHeader, CardTitle, Badge } from '@burdenoff/fe-libs/ui';\nimport { Zap, Users } from 'lucide-react';\nimport { usePlanMagnet, usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\nimport { detailPath } from '../utils/rowNavigation';\nimport { NewSprintDialog, SprintLifecycleActions } from '../sprints/SprintControls';\nimport { SprintDates, type SprintPlanChange } from '../sprints/SprintDates';\n\nconst GET_SPRINTS = gql`\n query GetSprints(\n $workspaceId: ID!\n $filter: PlanmagnetSprintFilter\n $pagination: PlanmagnetPaginationInput\n ) {\n planmagnetSprints(workspaceId: $workspaceId, filter: $filter, pagination: $pagination) {\n items {\n id\n name\n goal\n status\n startDate\n endDate\n startedAt\n completedAt\n baselineStartDate\n baselineEndDate\n planChanges {\n field\n fromValue\n toValue\n sprintStatus\n changedBy\n changedAt\n }\n velocity\n workItems {\n id\n title\n status\n storyPoints\n assigneeId\n }\n }\n totalCount\n }\n }\n`;\n\ninterface SprintWorkItem {\n id: string;\n title: string;\n status: string;\n storyPoints: number | null;\n assigneeId: string | null;\n}\n\ninterface SprintNode {\n id: string;\n name: string;\n goal: string | null;\n status: string;\n startDate: string | null;\n endDate: string | null;\n startedAt: string | null;\n completedAt: string | null;\n baselineStartDate: string | null;\n baselineEndDate: string | null;\n planChanges: SprintPlanChange[];\n velocity: number | null;\n workItems: SprintWorkItem[];\n}\n\ninterface SprintMetrics {\n totalPoints: number;\n completedPoints: number;\n tasksTotal: number;\n tasksCompleted: number;\n teamMemberIds: string[];\n velocity: number;\n}\n\nfunction deriveSprintMetrics(sprint: SprintNode): SprintMetrics {\n const items = sprint.workItems ?? [];\n const totalPoints = items.reduce((sum, w) => sum + (w.storyPoints ?? 0), 0);\n const completedPoints = items\n .filter((w) => w.status === 'DONE')\n .reduce((sum, w) => sum + (w.storyPoints ?? 0), 0);\n const tasksTotal = items.length;\n const tasksCompleted = items.filter((w) => w.status === 'DONE').length;\n const teamMemberIds = Array.from(\n new Set(items.map((w) => w.assigneeId).filter((id): id is string => Boolean(id)))\n );\n const velocity = sprint.velocity ?? completedPoints;\n return { totalPoints, completedPoints, tasksTotal, tasksCompleted, teamMemberIds, velocity };\n}\n\nexport function SprintsStartSprintPagePage() {\n const { workspaceId } = usePlanMagnet();\n\n const {\n data: sprintData,\n loading: sprintsLoading,\n error: sprintsError,\n } = useQuery<{\n planmagnetSprints: { items: SprintNode[]; totalCount: number };\n }>(GET_SPRINTS, {\n variables: { workspaceId, pagination: { first: 50 } },\n skip: !workspaceId,\n });\n\n const sprints = sprintData?.planmagnetSprints?.items ?? [];\n // REVIEW is still in flight (it can be completed or cancelled), so it\n // belongs with the active sprints rather than vanishing from this page.\n const activeSprints = sprints.filter((s) => s.status === 'ACTIVE' || s.status === 'REVIEW');\n const planningSprints = sprints.filter((s) => s.status === 'PLANNING');\n // Finished sprints used to vanish from this page, so \"did we finish on\n // time?\" had nowhere to be answered (BOFF-7918).\n const finishedSprints = sprints.filter(\n (s) => s.status === 'COMPLETED' || s.status === 'CANCELLED'\n );\n\n const navigate = usePlanMagnetNavigate();\n const openSprint = (id: string) => navigate(detailPath('/projects/planning-detail-page', id));\n\n // Only before the first load: a refetch after a sprint action must not blank\n // the page (it unmounted the controls mid-action).\n if (sprintsLoading && !sprintData) {\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 (sprintsError) {\n return <div className=\"p-6 text-red-500\">Error: {sprintsError.message}</div>;\n }\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold\">Sprint Management</h1>\n <p className=\"text-sm text-muted-foreground\">\n {sprints.length} sprints total &middot; {activeSprints.length} active\n </p>\n </div>\n <NewSprintDialog onCreated={openSprint} />\n </div>\n\n {activeSprints.length > 0 && (\n <div className=\"space-y-4\">\n <h2 className=\"text-lg font-medium\">Active Sprints</h2>\n {activeSprints.map((sprint) => {\n const metrics = deriveSprintMetrics(sprint);\n const tasksForSprint = sprint.workItems ?? [];\n const pctDone =\n metrics.totalPoints > 0\n ? Math.round((metrics.completedPoints / metrics.totalPoints) * 100)\n : 0;\n return (\n <Card key={sprint.id}>\n <CardHeader className=\"pb-2\">\n <div className=\"flex items-center justify-between\">\n <CardTitle className=\"text-base flex items-center gap-2\">\n <Zap className=\"h-4 w-4 text-primary\" />\n <button\n type=\"button\"\n className=\"hover:underline text-left\"\n onClick={() => openSprint(sprint.id)}\n >\n {sprint.name}\n </button>\n </CardTitle>\n <div className=\"flex items-start gap-2\">\n <Badge>{sprint.status === 'REVIEW' ? 'Review' : 'Active'}</Badge>\n <SprintLifecycleActions\n sprintId={sprint.id}\n sprintName={sprint.name}\n status={sprint.status}\n />\n </div>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <p className=\"text-sm text-muted-foreground\">{sprint.goal ?? ''}</p>\n <SprintDates sprint={sprint} />\n <div className=\"flex gap-4 text-xs text-muted-foreground\">\n <span className=\"flex items-center gap-1\">\n <Users className=\"h-3 w-3\" />\n {metrics.teamMemberIds.length} members\n </span>\n </div>\n <div className=\"grid grid-cols-3 gap-4 text-center\">\n <div className=\"p-3 bg-muted rounded-md\">\n <p className=\"text-lg font-bold\">\n {metrics.completedPoints}/{metrics.totalPoints}\n </p>\n <p className=\"text-xs text-muted-foreground\">Points</p>\n </div>\n <div className=\"p-3 bg-muted rounded-md\">\n <p className=\"text-lg font-bold\">\n {metrics.tasksCompleted}/{metrics.tasksTotal}\n </p>\n <p className=\"text-xs text-muted-foreground\">Tasks</p>\n </div>\n <div className=\"p-3 bg-muted rounded-md\">\n <p className=\"text-lg font-bold\">{metrics.velocity}</p>\n <p className=\"text-xs text-muted-foreground\">Velocity</p>\n </div>\n </div>\n <div>\n <div className=\"flex justify-between text-xs mb-1\">\n <span className=\"text-muted-foreground\">Sprint Progress</span>\n <span className=\"font-medium\">{pctDone}%</span>\n </div>\n <div className=\"w-full h-2 rounded-full bg-muted overflow-hidden\">\n <div\n className=\"h-full bg-primary rounded-full\"\n style={{ width: `${pctDone}%` }}\n />\n </div>\n </div>\n {tasksForSprint.length > 0 && (\n <div>\n <p className=\"text-xs font-medium text-muted-foreground mb-2\">\n Sprint Backlog\n </p>\n <div className=\"space-y-1\">\n {tasksForSprint.map((t) => (\n <div\n key={t.id}\n className=\"flex items-center justify-between border rounded p-2 text-sm\"\n >\n <span>{t.title}</span>\n <div className=\"flex gap-1\">\n <Badge variant=\"secondary\" className=\"text-xs capitalize\">\n {t.status.toLowerCase().replace('_', ' ')}\n </Badge>\n <span className=\"text-xs text-muted-foreground\">\n {t.storyPoints ?? 0}pts\n </span>\n </div>\n </div>\n ))}\n </div>\n </div>\n )}\n <div>\n <p className=\"text-xs font-medium text-muted-foreground mb-1\">Team</p>\n <div className=\"flex gap-2\">\n {metrics.teamMemberIds.map((memberId) => (\n <div\n key={memberId}\n className=\"h-7 w-7 rounded-full bg-primary/10 flex items-center justify-center text-[10px] font-medium text-primary\"\n title={memberId}\n >\n {memberId.slice(0, 2).toUpperCase()}\n </div>\n ))}\n </div>\n </div>\n </CardContent>\n </Card>\n );\n })}\n </div>\n )}\n\n {planningSprints.length > 0 && (\n <div className=\"space-y-4\">\n <h2 className=\"text-lg font-medium\">Planning</h2>\n {planningSprints.map((sprint) => {\n const metrics = deriveSprintMetrics(sprint);\n return (\n <Card key={sprint.id}>\n <CardHeader className=\"pb-2\">\n <div className=\"flex items-center justify-between\">\n <CardTitle className=\"text-base\">\n <button\n type=\"button\"\n className=\"hover:underline text-left\"\n onClick={() => openSprint(sprint.id)}\n >\n {sprint.name}\n </button>\n </CardTitle>\n <div className=\"flex items-start gap-2\">\n <Badge variant=\"secondary\">Planning</Badge>\n <SprintLifecycleActions\n sprintId={sprint.id}\n sprintName={sprint.name}\n status={sprint.status}\n />\n </div>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-2\">\n <p className=\"text-sm text-muted-foreground\">{sprint.goal ?? ''}</p>\n <SprintDates sprint={sprint} />\n <div className=\"flex gap-4 text-xs text-muted-foreground\">\n <span>{metrics.totalPoints} points planned</span>\n <span>{metrics.teamMemberIds.length} members</span>\n </div>\n </CardContent>\n </Card>\n );\n })}\n </div>\n )}\n\n {finishedSprints.length > 0 && (\n <div className=\"space-y-4\" data-testid=\"finished-sprints\">\n <h2 className=\"text-lg font-medium\">Finished</h2>\n {finishedSprints.map((sprint) => {\n const metrics = deriveSprintMetrics(sprint);\n return (\n <Card key={sprint.id} data-testid=\"finished-sprint\">\n <CardHeader className=\"pb-2\">\n <div className=\"flex items-center justify-between\">\n <CardTitle className=\"text-base\">\n <button\n type=\"button\"\n className=\"hover:underline text-left\"\n onClick={() => openSprint(sprint.id)}\n >\n {sprint.name}\n </button>\n </CardTitle>\n <Badge variant=\"outline\">\n {sprint.status === 'COMPLETED' ? 'Completed' : 'Cancelled'}\n </Badge>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-2\">\n <SprintDates sprint={sprint} />\n <p className=\"text-xs text-muted-foreground\">\n {metrics.completedPoints}/{metrics.totalPoints} points done\n </p>\n </CardContent>\n </Card>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"SprintsStartSprintPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/SprintsStartSprintPagePage.tsx"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck\nimport { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport { Card, CardContent, CardHeader, CardTitle, Badge } from '@burdenoff/fe-libs/ui';\nimport { Zap, Users } from 'lucide-react';\nimport { usePlanMagnet, usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\nimport { detailPath } from '../utils/rowNavigation';\nimport { NewSprintDialog, SprintLifecycleActions } from '../sprints/SprintControls';\nimport { SprintDates, type SprintPlanChange } from '../sprints/SprintDates';\nimport { PersonAvatar } from '../people/People';\n\nconst GET_SPRINTS = gql`\n query GetSprints(\n $workspaceId: ID!\n $filter: PlanmagnetSprintFilter\n $pagination: PlanmagnetPaginationInput\n ) {\n planmagnetSprints(workspaceId: $workspaceId, filter: $filter, pagination: $pagination) {\n items {\n id\n name\n goal\n status\n startDate\n endDate\n startedAt\n completedAt\n baselineStartDate\n baselineEndDate\n planChanges {\n field\n fromValue\n toValue\n sprintStatus\n changedBy\n changedAt\n }\n velocity\n workItems {\n id\n title\n status\n storyPoints\n assigneeId\n }\n }\n totalCount\n }\n }\n`;\n\ninterface SprintWorkItem {\n id: string;\n title: string;\n status: string;\n storyPoints: number | null;\n assigneeId: string | null;\n}\n\ninterface SprintNode {\n id: string;\n name: string;\n goal: string | null;\n status: string;\n startDate: string | null;\n endDate: string | null;\n startedAt: string | null;\n completedAt: string | null;\n baselineStartDate: string | null;\n baselineEndDate: string | null;\n planChanges: SprintPlanChange[];\n velocity: number | null;\n workItems: SprintWorkItem[];\n}\n\ninterface SprintMetrics {\n totalPoints: number;\n completedPoints: number;\n tasksTotal: number;\n tasksCompleted: number;\n teamMemberIds: string[];\n velocity: number;\n}\n\nfunction deriveSprintMetrics(sprint: SprintNode): SprintMetrics {\n const items = sprint.workItems ?? [];\n const totalPoints = items.reduce((sum, w) => sum + (w.storyPoints ?? 0), 0);\n const completedPoints = items\n .filter((w) => w.status === 'DONE')\n .reduce((sum, w) => sum + (w.storyPoints ?? 0), 0);\n const tasksTotal = items.length;\n const tasksCompleted = items.filter((w) => w.status === 'DONE').length;\n const teamMemberIds = Array.from(\n new Set(items.map((w) => w.assigneeId).filter((id): id is string => Boolean(id)))\n );\n const velocity = sprint.velocity ?? completedPoints;\n return { totalPoints, completedPoints, tasksTotal, tasksCompleted, teamMemberIds, velocity };\n}\n\nexport function SprintsStartSprintPagePage() {\n const { workspaceId } = usePlanMagnet();\n\n const {\n data: sprintData,\n loading: sprintsLoading,\n error: sprintsError,\n } = useQuery<{\n planmagnetSprints: { items: SprintNode[]; totalCount: number };\n }>(GET_SPRINTS, {\n variables: { workspaceId, pagination: { first: 50 } },\n skip: !workspaceId,\n });\n\n const sprints = sprintData?.planmagnetSprints?.items ?? [];\n // REVIEW is still in flight (it can be completed or cancelled), so it\n // belongs with the active sprints rather than vanishing from this page.\n const activeSprints = sprints.filter((s) => s.status === 'ACTIVE' || s.status === 'REVIEW');\n const planningSprints = sprints.filter((s) => s.status === 'PLANNING');\n // Finished sprints used to vanish from this page, so \"did we finish on\n // time?\" had nowhere to be answered (BOFF-7918).\n const finishedSprints = sprints.filter(\n (s) => s.status === 'COMPLETED' || s.status === 'CANCELLED'\n );\n\n const navigate = usePlanMagnetNavigate();\n const openSprint = (id: string) => navigate(detailPath('/projects/planning-detail-page', id));\n\n // Only before the first load: a refetch after a sprint action must not blank\n // the page (it unmounted the controls mid-action).\n if (sprintsLoading && !sprintData) {\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 (sprintsError) {\n return <div className=\"p-6 text-red-500\">Error: {sprintsError.message}</div>;\n }\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold\">Sprint Management</h1>\n <p className=\"text-sm text-muted-foreground\">\n {sprints.length} sprints total &middot; {activeSprints.length} active\n </p>\n </div>\n <NewSprintDialog onCreated={openSprint} />\n </div>\n\n {activeSprints.length > 0 && (\n <div className=\"space-y-4\">\n <h2 className=\"text-lg font-medium\">Active Sprints</h2>\n {activeSprints.map((sprint) => {\n const metrics = deriveSprintMetrics(sprint);\n const tasksForSprint = sprint.workItems ?? [];\n const pctDone =\n metrics.totalPoints > 0\n ? Math.round((metrics.completedPoints / metrics.totalPoints) * 100)\n : 0;\n return (\n <Card key={sprint.id}>\n <CardHeader className=\"pb-2\">\n <div className=\"flex items-center justify-between\">\n <CardTitle className=\"text-base flex items-center gap-2\">\n <Zap className=\"h-4 w-4 text-primary\" />\n <button\n type=\"button\"\n className=\"hover:underline text-left\"\n onClick={() => openSprint(sprint.id)}\n >\n {sprint.name}\n </button>\n </CardTitle>\n <div className=\"flex items-start gap-2\">\n <Badge>{sprint.status === 'REVIEW' ? 'Review' : 'Active'}</Badge>\n <SprintLifecycleActions\n sprintId={sprint.id}\n sprintName={sprint.name}\n status={sprint.status}\n />\n </div>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <p className=\"text-sm text-muted-foreground\">{sprint.goal ?? ''}</p>\n <SprintDates sprint={sprint} />\n <div className=\"flex gap-4 text-xs text-muted-foreground\">\n <span className=\"flex items-center gap-1\">\n <Users className=\"h-3 w-3\" />\n {metrics.teamMemberIds.length} members\n </span>\n </div>\n <div className=\"grid grid-cols-3 gap-4 text-center\">\n <div className=\"p-3 bg-muted rounded-md\">\n <p className=\"text-lg font-bold\">\n {metrics.completedPoints}/{metrics.totalPoints}\n </p>\n <p className=\"text-xs text-muted-foreground\">Points</p>\n </div>\n <div className=\"p-3 bg-muted rounded-md\">\n <p className=\"text-lg font-bold\">\n {metrics.tasksCompleted}/{metrics.tasksTotal}\n </p>\n <p className=\"text-xs text-muted-foreground\">Tasks</p>\n </div>\n <div className=\"p-3 bg-muted rounded-md\">\n <p className=\"text-lg font-bold\">{metrics.velocity}</p>\n <p className=\"text-xs text-muted-foreground\">Velocity</p>\n </div>\n </div>\n <div>\n <div className=\"flex justify-between text-xs mb-1\">\n <span className=\"text-muted-foreground\">Sprint Progress</span>\n <span className=\"font-medium\">{pctDone}%</span>\n </div>\n <div className=\"w-full h-2 rounded-full bg-muted overflow-hidden\">\n <div\n className=\"h-full bg-primary rounded-full\"\n style={{ width: `${pctDone}%` }}\n />\n </div>\n </div>\n {tasksForSprint.length > 0 && (\n <div>\n <p className=\"text-xs font-medium text-muted-foreground mb-2\">\n Sprint Backlog\n </p>\n <div className=\"space-y-1\">\n {tasksForSprint.map((t) => (\n <div\n key={t.id}\n className=\"flex items-center justify-between border rounded p-2 text-sm\"\n >\n <span>{t.title}</span>\n <div className=\"flex gap-1\">\n <Badge variant=\"secondary\" className=\"text-xs capitalize\">\n {t.status.toLowerCase().replace('_', ' ')}\n </Badge>\n <span className=\"text-xs text-muted-foreground\">\n {t.storyPoints ?? 0}pts\n </span>\n </div>\n </div>\n ))}\n </div>\n </div>\n )}\n <div>\n <p className=\"text-xs font-medium text-muted-foreground mb-1\">Team</p>\n <div className=\"flex gap-2\">\n {/* Initials and tooltip from the person's resolved name; these were two characters of the\n user UUID with the full UUID as the tooltip (BOFF-7977). */}\n {metrics.teamMemberIds.map((memberId) => (\n <PersonAvatar\n key={memberId}\n id={memberId}\n className=\"h-7 w-7 rounded-full bg-primary/10 flex items-center justify-center text-[10px] font-medium text-primary\"\n />\n ))}\n </div>\n </div>\n </CardContent>\n </Card>\n );\n })}\n </div>\n )}\n\n {planningSprints.length > 0 && (\n <div className=\"space-y-4\">\n <h2 className=\"text-lg font-medium\">Planning</h2>\n {planningSprints.map((sprint) => {\n const metrics = deriveSprintMetrics(sprint);\n return (\n <Card key={sprint.id}>\n <CardHeader className=\"pb-2\">\n <div className=\"flex items-center justify-between\">\n <CardTitle className=\"text-base\">\n <button\n type=\"button\"\n className=\"hover:underline text-left\"\n onClick={() => openSprint(sprint.id)}\n >\n {sprint.name}\n </button>\n </CardTitle>\n <div className=\"flex items-start gap-2\">\n <Badge variant=\"secondary\">Planning</Badge>\n <SprintLifecycleActions\n sprintId={sprint.id}\n sprintName={sprint.name}\n status={sprint.status}\n />\n </div>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-2\">\n <p className=\"text-sm text-muted-foreground\">{sprint.goal ?? ''}</p>\n <SprintDates sprint={sprint} />\n <div className=\"flex gap-4 text-xs text-muted-foreground\">\n <span>{metrics.totalPoints} points planned</span>\n <span>{metrics.teamMemberIds.length} members</span>\n </div>\n </CardContent>\n </Card>\n );\n })}\n </div>\n )}\n\n {finishedSprints.length > 0 && (\n <div className=\"space-y-4\" data-testid=\"finished-sprints\">\n <h2 className=\"text-lg font-medium\">Finished</h2>\n {finishedSprints.map((sprint) => {\n const metrics = deriveSprintMetrics(sprint);\n return (\n <Card key={sprint.id} data-testid=\"finished-sprint\">\n <CardHeader className=\"pb-2\">\n <div className=\"flex items-center justify-between\">\n <CardTitle className=\"text-base\">\n <button\n type=\"button\"\n className=\"hover:underline text-left\"\n onClick={() => openSprint(sprint.id)}\n >\n {sprint.name}\n </button>\n </CardTitle>\n <Badge variant=\"outline\">\n {sprint.status === 'COMPLETED' ? 'Completed' : 'Cancelled'}\n </Badge>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-2\">\n <SprintDates sprint={sprint} />\n <p className=\"text-xs text-muted-foreground\">\n {metrics.completedPoints}/{metrics.totalPoints} points done\n </p>\n </CardContent>\n </Card>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"TasksEditTaskPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/TasksEditTaskPagePage.tsx"],"names":[],"mappings":"AA+DA,wBAAgB,qBAAqB,4CA0MpC"}
1
+ {"version":3,"file":"TasksEditTaskPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/TasksEditTaskPagePage.tsx"],"names":[],"mappings":"AA+DA,wBAAgB,qBAAqB,4CAkNpC"}