@burdenoff/microfe-planmagnet 2026.928.5 → 2026.928.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.
- package/dist/generated/wspace-operations.d.ts +5 -0
- package/dist/generated/wspace-operations.d.ts.map +1 -1
- package/dist/generated/wspace-types.d.ts +15 -0
- package/dist/generated/wspace-types.d.ts.map +1 -1
- package/dist/planmagnet/PlanMagnetRoot.d.ts.map +1 -1
- package/dist/planmagnet/PlanMagnetRoot.js +20 -11
- package/dist/planmagnet/PlanMagnetRoot.js.map +1 -1
- package/dist/planmagnet/PlanMagnetRoutes.d.ts.map +1 -1
- package/dist/planmagnet/PlanMagnetRoutes.js +216 -196
- package/dist/planmagnet/PlanMagnetRoutes.js.map +1 -1
- package/dist/planmagnet/controls/Pickers.d.ts +14 -0
- package/dist/planmagnet/controls/Pickers.d.ts.map +1 -1
- package/dist/planmagnet/controls/Pickers.js +97 -22
- package/dist/planmagnet/controls/Pickers.js.map +1 -1
- package/dist/planmagnet/controls/WorkItemControls.d.ts +6 -2
- package/dist/planmagnet/controls/WorkItemControls.d.ts.map +1 -1
- package/dist/planmagnet/controls/WorkItemControls.js +8 -8
- package/dist/planmagnet/controls/WorkItemControls.js.map +1 -1
- package/dist/planmagnet/pages/DashboardDashboardPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/DashboardDashboardPagePage.js +11 -3
- package/dist/planmagnet/pages/DashboardDashboardPagePage.js.map +1 -1
- package/dist/planmagnet/pages/PortfoliosPortfolioDetailPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/PortfoliosPortfolioDetailPagePage.js +74 -59
- package/dist/planmagnet/pages/PortfoliosPortfolioDetailPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProjectsEditProjectPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProjectsEditProjectPagePage.js +138 -112
- package/dist/planmagnet/pages/ProjectsEditProjectPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.js +16 -6
- package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.js +7 -2
- package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProjectsPlanningPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProjectsPlanningPagePage.js +76 -56
- package/dist/planmagnet/pages/ProjectsPlanningPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js +241 -188
- package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js.map +1 -1
- package/dist/planmagnet/pages/SprintsStartSprintPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/SprintsStartSprintPagePage.js +168 -122
- package/dist/planmagnet/pages/SprintsStartSprintPagePage.js.map +1 -1
- package/dist/planmagnet/pages/TeamCreateTeamPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/TeamCreateTeamPagePage.js +288 -91
- package/dist/planmagnet/pages/TeamCreateTeamPagePage.js.map +1 -1
- package/dist/planmagnet/pages/TeamTeamDetailPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/TeamTeamDetailPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/TeamTeamDetailPagePage.js +217 -0
- package/dist/planmagnet/pages/TeamTeamDetailPagePage.js.map +1 -0
- package/dist/planmagnet/pages/TeamTeamEditPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/TeamTeamEditPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/TeamTeamEditPagePage.js +211 -0
- package/dist/planmagnet/pages/TeamTeamEditPagePage.js.map +1 -0
- package/dist/planmagnet/pages/TeamTeamsListPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/TeamTeamsListPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/TeamTeamsListPagePage.js +118 -0
- package/dist/planmagnet/pages/TeamTeamsListPagePage.js.map +1 -0
- package/dist/planmagnet/sprints/SprintControls.d.ts +15 -3
- package/dist/planmagnet/sprints/SprintControls.d.ts.map +1 -1
- package/dist/planmagnet/sprints/SprintControls.js +293 -190
- package/dist/planmagnet/sprints/SprintControls.js.map +1 -1
- package/dist/planmagnet/team/TeamControls.d.ts +31 -0
- package/dist/planmagnet/team/TeamControls.d.ts.map +1 -0
- package/dist/planmagnet/team/TeamControls.js +407 -0
- package/dist/planmagnet/team/TeamControls.js.map +1 -0
- package/package.json +1 -1
|
@@ -1,16 +1,18 @@
|
|
|
1
1
|
import { usePlanMagnet as e, usePlanMagnetNavigate as t } from "../providers/PlanMagnetProvider.js";
|
|
2
2
|
import { PersonAvatar as n } from "../people/People.js";
|
|
3
3
|
import { countLabel as r, useSprintCounts as i, workProgress as a } from "../hooks/useCounts.js";
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
4
|
+
import { TeamSelect as o } from "../controls/Pickers.js";
|
|
5
|
+
import { detailPath as s } from "../utils/rowNavigation.js";
|
|
6
|
+
import { NewSprintDialog as c, SprintLifecycleActions as l } from "../sprints/SprintControls.js";
|
|
7
|
+
import { SprintDates as u } from "../sprints/SprintDates.js";
|
|
8
|
+
import { useState as d } from "react";
|
|
9
|
+
import { Users as f, Zap as p } from "lucide-react";
|
|
10
|
+
import { gql as m } from "@apollo/client";
|
|
11
|
+
import { useQuery as h } from "@apollo/client/react";
|
|
12
|
+
import { jsx as g, jsxs as _ } from "react/jsx-runtime";
|
|
13
|
+
import { Badge as v, Card as y, CardContent as b, CardHeader as x, CardTitle as S } from "@burdenoff/fe-libs/ui";
|
|
12
14
|
//#region src/planmagnet/pages/SprintsStartSprintPagePage.tsx
|
|
13
|
-
var
|
|
15
|
+
var C = m`
|
|
14
16
|
query GetSprints(
|
|
15
17
|
$workspaceId: ID!
|
|
16
18
|
$filter: PlanmagnetSprintFilter
|
|
@@ -37,6 +39,14 @@ var x = f`
|
|
|
37
39
|
changedAt
|
|
38
40
|
}
|
|
39
41
|
velocity
|
|
42
|
+
project {
|
|
43
|
+
id
|
|
44
|
+
name
|
|
45
|
+
}
|
|
46
|
+
team {
|
|
47
|
+
id
|
|
48
|
+
name
|
|
49
|
+
}
|
|
40
50
|
workItems {
|
|
41
51
|
id
|
|
42
52
|
title
|
|
@@ -49,7 +59,18 @@ var x = f`
|
|
|
49
59
|
}
|
|
50
60
|
}
|
|
51
61
|
`;
|
|
52
|
-
function
|
|
62
|
+
function w({ sprint: e }) {
|
|
63
|
+
return e.team ? /* @__PURE__ */ _(v, {
|
|
64
|
+
variant: "outline",
|
|
65
|
+
className: "text-xs",
|
|
66
|
+
children: ["Team: ", e.team.name]
|
|
67
|
+
}) : /* @__PURE__ */ _(v, {
|
|
68
|
+
variant: "outline",
|
|
69
|
+
className: "text-xs",
|
|
70
|
+
children: ["Project: ", e.project?.name ?? "Unknown"]
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
function T(e) {
|
|
53
74
|
let t = e.workItems ?? [];
|
|
54
75
|
return {
|
|
55
76
|
totalPoints: t.reduce((e, t) => e + (t.storyPoints ?? 0), 0),
|
|
@@ -60,140 +81,158 @@ function S(e) {
|
|
|
60
81
|
velocity: e.velocity
|
|
61
82
|
};
|
|
62
83
|
}
|
|
63
|
-
function
|
|
64
|
-
let { workspaceId:
|
|
84
|
+
function E() {
|
|
85
|
+
let { workspaceId: m } = e(), [E, D] = d(""), O = E ? { teamId: E } : {}, { data: k, loading: A, error: j } = h(C, {
|
|
65
86
|
variables: {
|
|
66
|
-
workspaceId:
|
|
67
|
-
pagination: { first: 50 }
|
|
87
|
+
workspaceId: m,
|
|
88
|
+
pagination: { first: 50 },
|
|
89
|
+
...E ? { filter: O } : {}
|
|
68
90
|
},
|
|
69
|
-
skip: !
|
|
70
|
-
}),
|
|
71
|
-
skip: !
|
|
91
|
+
skip: !m
|
|
92
|
+
}), M = {
|
|
93
|
+
skip: !m,
|
|
72
94
|
variables: {
|
|
73
|
-
workspaceId:
|
|
95
|
+
workspaceId: m,
|
|
74
96
|
pagination: { first: 50 }
|
|
75
97
|
}
|
|
76
|
-
}, { data:
|
|
77
|
-
...
|
|
98
|
+
}, { data: N } = h(C, {
|
|
99
|
+
...M,
|
|
78
100
|
variables: {
|
|
79
|
-
...
|
|
80
|
-
filter: {
|
|
101
|
+
...M.variables,
|
|
102
|
+
filter: {
|
|
103
|
+
status: "ACTIVE",
|
|
104
|
+
...O
|
|
105
|
+
}
|
|
81
106
|
}
|
|
82
|
-
}), { data:
|
|
83
|
-
...
|
|
107
|
+
}), { data: P } = h(C, {
|
|
108
|
+
...M,
|
|
84
109
|
variables: {
|
|
85
|
-
...
|
|
86
|
-
filter: {
|
|
110
|
+
...M.variables,
|
|
111
|
+
filter: {
|
|
112
|
+
status: "REVIEW",
|
|
113
|
+
...O
|
|
114
|
+
}
|
|
87
115
|
}
|
|
88
|
-
}),
|
|
89
|
-
return
|
|
116
|
+
}), F = i(), I = k?.planmagnetSprints?.items ?? [], L = [...N?.planmagnetSprints.items ?? [], ...P?.planmagnetSprints.items ?? []], R = I.filter((e) => e.status === "PLANNING"), z = I.filter((e) => e.status === "COMPLETED" || e.status === "CANCELLED"), B = t(), V = (e) => B(s("/projects/planning-detail-page", e));
|
|
117
|
+
return A && !k ? /* @__PURE__ */ g("div", {
|
|
90
118
|
className: "flex items-center justify-center p-12",
|
|
91
|
-
children: /* @__PURE__ */
|
|
92
|
-
}) :
|
|
119
|
+
children: /* @__PURE__ */ g("div", { className: "animate-spin h-8 w-8 border-2 border-primary border-t-transparent rounded-full" })
|
|
120
|
+
}) : j ? /* @__PURE__ */ _("div", {
|
|
93
121
|
className: "p-6 text-red-500",
|
|
94
|
-
children: ["Error: ",
|
|
95
|
-
}) : /* @__PURE__ */
|
|
122
|
+
children: ["Error: ", j.message]
|
|
123
|
+
}) : /* @__PURE__ */ _("div", {
|
|
96
124
|
className: "space-y-6 p-6",
|
|
97
125
|
children: [
|
|
98
|
-
/* @__PURE__ */
|
|
126
|
+
/* @__PURE__ */ _("div", {
|
|
99
127
|
className: "flex items-center justify-between",
|
|
100
|
-
children: [/* @__PURE__ */
|
|
128
|
+
children: [/* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("h1", {
|
|
101
129
|
className: "text-2xl font-semibold",
|
|
102
130
|
children: "Sprint Management"
|
|
103
|
-
}), /* @__PURE__ */
|
|
131
|
+
}), /* @__PURE__ */ _("p", {
|
|
104
132
|
className: "text-sm text-muted-foreground",
|
|
105
133
|
children: [
|
|
106
|
-
r(
|
|
134
|
+
r(F?.all),
|
|
107
135
|
" sprints total · ",
|
|
108
|
-
r(
|
|
136
|
+
r(F?.running),
|
|
109
137
|
" running"
|
|
110
138
|
]
|
|
111
|
-
})] }), /* @__PURE__ */
|
|
139
|
+
})] }), /* @__PURE__ */ _("div", {
|
|
140
|
+
className: "flex items-center gap-2",
|
|
141
|
+
children: [/* @__PURE__ */ g(o, {
|
|
142
|
+
value: E,
|
|
143
|
+
onChange: D,
|
|
144
|
+
noneLabel: "All teams"
|
|
145
|
+
}), /* @__PURE__ */ g(c, { onCreated: V })]
|
|
146
|
+
})]
|
|
112
147
|
}),
|
|
113
|
-
|
|
148
|
+
L.length > 0 && /* @__PURE__ */ _("div", {
|
|
114
149
|
className: "space-y-4",
|
|
115
|
-
children: [/* @__PURE__ */
|
|
150
|
+
children: [/* @__PURE__ */ g("h2", {
|
|
116
151
|
className: "text-lg font-medium",
|
|
117
152
|
children: "Active Sprints"
|
|
118
|
-
}),
|
|
119
|
-
let t =
|
|
120
|
-
return /* @__PURE__ */
|
|
153
|
+
}), L.map((e) => {
|
|
154
|
+
let t = T(e), r = e.workItems ?? [], i = a(r) ?? 0;
|
|
155
|
+
return /* @__PURE__ */ _(y, { children: [/* @__PURE__ */ g(x, {
|
|
121
156
|
className: "pb-2",
|
|
122
|
-
children: /* @__PURE__ */
|
|
157
|
+
children: /* @__PURE__ */ _("div", {
|
|
123
158
|
className: "flex items-center justify-between",
|
|
124
|
-
children: [/* @__PURE__ */
|
|
159
|
+
children: [/* @__PURE__ */ _(S, {
|
|
125
160
|
className: "text-base flex items-center gap-2",
|
|
126
|
-
children: [/* @__PURE__ */
|
|
161
|
+
children: [/* @__PURE__ */ g(p, { className: "h-4 w-4 text-primary" }), /* @__PURE__ */ g("button", {
|
|
127
162
|
type: "button",
|
|
128
163
|
className: "hover:underline text-left",
|
|
129
|
-
onClick: () =>
|
|
164
|
+
onClick: () => V(e.id),
|
|
130
165
|
children: e.name
|
|
131
166
|
})]
|
|
132
|
-
}), /* @__PURE__ */
|
|
167
|
+
}), /* @__PURE__ */ _("div", {
|
|
133
168
|
className: "flex items-start gap-2",
|
|
134
|
-
children: [
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
169
|
+
children: [
|
|
170
|
+
/* @__PURE__ */ g(w, { sprint: e }),
|
|
171
|
+
/* @__PURE__ */ g(v, { children: e.status === "REVIEW" ? "Review" : "Active" }),
|
|
172
|
+
/* @__PURE__ */ g(l, {
|
|
173
|
+
sprintId: e.id,
|
|
174
|
+
sprintName: e.name,
|
|
175
|
+
status: e.status
|
|
176
|
+
})
|
|
177
|
+
]
|
|
139
178
|
})]
|
|
140
179
|
})
|
|
141
|
-
}), /* @__PURE__ */
|
|
180
|
+
}), /* @__PURE__ */ _(b, {
|
|
142
181
|
className: "space-y-4",
|
|
143
182
|
children: [
|
|
144
|
-
/* @__PURE__ */
|
|
183
|
+
/* @__PURE__ */ g("p", {
|
|
145
184
|
className: "text-sm text-muted-foreground",
|
|
146
185
|
children: e.goal ?? ""
|
|
147
186
|
}),
|
|
148
|
-
/* @__PURE__ */
|
|
149
|
-
/* @__PURE__ */
|
|
187
|
+
/* @__PURE__ */ g(u, { sprint: e }),
|
|
188
|
+
/* @__PURE__ */ g("div", {
|
|
150
189
|
className: "flex gap-4 text-xs text-muted-foreground",
|
|
151
|
-
children: /* @__PURE__ */
|
|
190
|
+
children: /* @__PURE__ */ _("span", {
|
|
152
191
|
className: "flex items-center gap-1",
|
|
153
192
|
children: [
|
|
154
|
-
/* @__PURE__ */
|
|
193
|
+
/* @__PURE__ */ g(f, { className: "h-3 w-3" }),
|
|
155
194
|
t.teamMemberIds.length,
|
|
156
195
|
" members"
|
|
157
196
|
]
|
|
158
197
|
})
|
|
159
198
|
}),
|
|
160
|
-
/* @__PURE__ */
|
|
199
|
+
/* @__PURE__ */ _("div", {
|
|
161
200
|
className: "grid grid-cols-3 gap-4 text-center",
|
|
162
201
|
children: [
|
|
163
|
-
/* @__PURE__ */
|
|
202
|
+
/* @__PURE__ */ _("div", {
|
|
164
203
|
className: "p-3 bg-muted rounded-md",
|
|
165
|
-
children: [/* @__PURE__ */
|
|
204
|
+
children: [/* @__PURE__ */ _("p", {
|
|
166
205
|
className: "text-lg font-bold",
|
|
167
206
|
children: [
|
|
168
207
|
t.completedPoints,
|
|
169
208
|
"/",
|
|
170
209
|
t.totalPoints
|
|
171
210
|
]
|
|
172
|
-
}), /* @__PURE__ */
|
|
211
|
+
}), /* @__PURE__ */ g("p", {
|
|
173
212
|
className: "text-xs text-muted-foreground",
|
|
174
213
|
children: "Points"
|
|
175
214
|
})]
|
|
176
215
|
}),
|
|
177
|
-
/* @__PURE__ */
|
|
216
|
+
/* @__PURE__ */ _("div", {
|
|
178
217
|
className: "p-3 bg-muted rounded-md",
|
|
179
|
-
children: [/* @__PURE__ */
|
|
218
|
+
children: [/* @__PURE__ */ _("p", {
|
|
180
219
|
className: "text-lg font-bold",
|
|
181
220
|
children: [
|
|
182
221
|
t.tasksCompleted,
|
|
183
222
|
"/",
|
|
184
223
|
t.tasksTotal
|
|
185
224
|
]
|
|
186
|
-
}), /* @__PURE__ */
|
|
225
|
+
}), /* @__PURE__ */ g("p", {
|
|
187
226
|
className: "text-xs text-muted-foreground",
|
|
188
227
|
children: "Tasks"
|
|
189
228
|
})]
|
|
190
229
|
}),
|
|
191
|
-
/* @__PURE__ */
|
|
230
|
+
/* @__PURE__ */ _("div", {
|
|
192
231
|
className: "p-3 bg-muted rounded-md",
|
|
193
|
-
children: [/* @__PURE__ */
|
|
232
|
+
children: [/* @__PURE__ */ g("p", {
|
|
194
233
|
className: "text-lg font-bold",
|
|
195
234
|
children: t.velocity == null ? "—" : t.velocity
|
|
196
|
-
}), /* @__PURE__ */
|
|
235
|
+
}), /* @__PURE__ */ g("p", {
|
|
197
236
|
className: "text-xs text-muted-foreground",
|
|
198
237
|
title: "Story points done when the sprint was completed",
|
|
199
238
|
children: "Velocity"
|
|
@@ -201,48 +240,48 @@ function C() {
|
|
|
201
240
|
})
|
|
202
241
|
]
|
|
203
242
|
}),
|
|
204
|
-
/* @__PURE__ */
|
|
243
|
+
/* @__PURE__ */ _("div", { children: [/* @__PURE__ */ _("div", {
|
|
205
244
|
className: "flex justify-between text-xs mb-1",
|
|
206
|
-
children: [/* @__PURE__ */
|
|
245
|
+
children: [/* @__PURE__ */ g("span", {
|
|
207
246
|
className: "text-muted-foreground",
|
|
208
247
|
children: "Sprint Progress"
|
|
209
|
-
}), /* @__PURE__ */
|
|
248
|
+
}), /* @__PURE__ */ _("span", {
|
|
210
249
|
className: "font-medium",
|
|
211
250
|
children: [i, "%"]
|
|
212
251
|
})]
|
|
213
|
-
}), /* @__PURE__ */
|
|
252
|
+
}), /* @__PURE__ */ g("div", {
|
|
214
253
|
className: "w-full h-2 rounded-full bg-muted overflow-hidden",
|
|
215
|
-
children: /* @__PURE__ */
|
|
254
|
+
children: /* @__PURE__ */ g("div", {
|
|
216
255
|
className: "h-full bg-primary rounded-full",
|
|
217
256
|
style: { width: `${i}%` }
|
|
218
257
|
})
|
|
219
258
|
})] }),
|
|
220
|
-
r.length > 0 && /* @__PURE__ */
|
|
259
|
+
r.length > 0 && /* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("p", {
|
|
221
260
|
className: "text-xs font-medium text-muted-foreground mb-2",
|
|
222
261
|
children: "Sprint Backlog"
|
|
223
|
-
}), /* @__PURE__ */
|
|
262
|
+
}), /* @__PURE__ */ g("div", {
|
|
224
263
|
className: "space-y-1",
|
|
225
|
-
children: r.map((e) => /* @__PURE__ */
|
|
264
|
+
children: r.map((e) => /* @__PURE__ */ _("div", {
|
|
226
265
|
className: "flex items-center justify-between border rounded p-2 text-sm",
|
|
227
|
-
children: [/* @__PURE__ */
|
|
266
|
+
children: [/* @__PURE__ */ g("span", { children: e.title }), /* @__PURE__ */ _("div", {
|
|
228
267
|
className: "flex gap-1",
|
|
229
|
-
children: [/* @__PURE__ */
|
|
268
|
+
children: [/* @__PURE__ */ g(v, {
|
|
230
269
|
variant: "secondary",
|
|
231
270
|
className: "text-xs capitalize",
|
|
232
271
|
children: e.status.toLowerCase().replace("_", " ")
|
|
233
|
-
}), /* @__PURE__ */
|
|
272
|
+
}), /* @__PURE__ */ _("span", {
|
|
234
273
|
className: "text-xs text-muted-foreground",
|
|
235
274
|
children: [e.storyPoints ?? 0, "pts"]
|
|
236
275
|
})]
|
|
237
276
|
})]
|
|
238
277
|
}, e.id))
|
|
239
278
|
})] }),
|
|
240
|
-
/* @__PURE__ */
|
|
279
|
+
/* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("p", {
|
|
241
280
|
className: "text-xs font-medium text-muted-foreground mb-1",
|
|
242
281
|
children: "Team"
|
|
243
|
-
}), /* @__PURE__ */
|
|
282
|
+
}), /* @__PURE__ */ g("div", {
|
|
244
283
|
className: "flex gap-2",
|
|
245
|
-
children: t.teamMemberIds.map((e) => /* @__PURE__ */
|
|
284
|
+
children: t.teamMemberIds.map((e) => /* @__PURE__ */ g(n, {
|
|
246
285
|
id: e,
|
|
247
286
|
className: "h-7 w-7 rounded-full bg-primary/10 flex items-center justify-center text-[10px] font-medium text-primary"
|
|
248
287
|
}, e))
|
|
@@ -251,83 +290,90 @@ function C() {
|
|
|
251
290
|
})] }, e.id);
|
|
252
291
|
})]
|
|
253
292
|
}),
|
|
254
|
-
|
|
293
|
+
R.length > 0 && /* @__PURE__ */ _("div", {
|
|
255
294
|
className: "space-y-4",
|
|
256
|
-
children: [/* @__PURE__ */
|
|
295
|
+
children: [/* @__PURE__ */ g("h2", {
|
|
257
296
|
className: "text-lg font-medium",
|
|
258
297
|
children: "Planning"
|
|
259
|
-
}),
|
|
260
|
-
let t =
|
|
261
|
-
return /* @__PURE__ */
|
|
298
|
+
}), R.map((e) => {
|
|
299
|
+
let t = T(e);
|
|
300
|
+
return /* @__PURE__ */ _(y, { children: [/* @__PURE__ */ g(x, {
|
|
262
301
|
className: "pb-2",
|
|
263
|
-
children: /* @__PURE__ */
|
|
302
|
+
children: /* @__PURE__ */ _("div", {
|
|
264
303
|
className: "flex items-center justify-between",
|
|
265
|
-
children: [/* @__PURE__ */
|
|
304
|
+
children: [/* @__PURE__ */ g(S, {
|
|
266
305
|
className: "text-base",
|
|
267
|
-
children: /* @__PURE__ */
|
|
306
|
+
children: /* @__PURE__ */ g("button", {
|
|
268
307
|
type: "button",
|
|
269
308
|
className: "hover:underline text-left",
|
|
270
|
-
onClick: () =>
|
|
309
|
+
onClick: () => V(e.id),
|
|
271
310
|
children: e.name
|
|
272
311
|
})
|
|
273
|
-
}), /* @__PURE__ */
|
|
312
|
+
}), /* @__PURE__ */ _("div", {
|
|
274
313
|
className: "flex items-start gap-2",
|
|
275
|
-
children: [
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
314
|
+
children: [
|
|
315
|
+
/* @__PURE__ */ g(w, { sprint: e }),
|
|
316
|
+
/* @__PURE__ */ g(v, {
|
|
317
|
+
variant: "secondary",
|
|
318
|
+
children: "Planning"
|
|
319
|
+
}),
|
|
320
|
+
/* @__PURE__ */ g(l, {
|
|
321
|
+
sprintId: e.id,
|
|
322
|
+
sprintName: e.name,
|
|
323
|
+
status: e.status
|
|
324
|
+
})
|
|
325
|
+
]
|
|
283
326
|
})]
|
|
284
327
|
})
|
|
285
|
-
}), /* @__PURE__ */
|
|
328
|
+
}), /* @__PURE__ */ _(b, {
|
|
286
329
|
className: "space-y-2",
|
|
287
330
|
children: [
|
|
288
|
-
/* @__PURE__ */
|
|
331
|
+
/* @__PURE__ */ g("p", {
|
|
289
332
|
className: "text-sm text-muted-foreground",
|
|
290
333
|
children: e.goal ?? ""
|
|
291
334
|
}),
|
|
292
|
-
/* @__PURE__ */
|
|
293
|
-
/* @__PURE__ */
|
|
335
|
+
/* @__PURE__ */ g(u, { sprint: e }),
|
|
336
|
+
/* @__PURE__ */ _("div", {
|
|
294
337
|
className: "flex gap-4 text-xs text-muted-foreground",
|
|
295
|
-
children: [/* @__PURE__ */
|
|
338
|
+
children: [/* @__PURE__ */ _("span", { children: [t.totalPoints, " points planned"] }), /* @__PURE__ */ _("span", { children: [t.teamMemberIds.length, " members"] })]
|
|
296
339
|
})
|
|
297
340
|
]
|
|
298
341
|
})] }, e.id);
|
|
299
342
|
})]
|
|
300
343
|
}),
|
|
301
|
-
|
|
344
|
+
z.length > 0 && /* @__PURE__ */ _("div", {
|
|
302
345
|
className: "space-y-4",
|
|
303
346
|
"data-testid": "finished-sprints",
|
|
304
|
-
children: [/* @__PURE__ */
|
|
347
|
+
children: [/* @__PURE__ */ g("h2", {
|
|
305
348
|
className: "text-lg font-medium",
|
|
306
349
|
children: "Finished"
|
|
307
|
-
}),
|
|
308
|
-
let t =
|
|
309
|
-
return /* @__PURE__ */
|
|
350
|
+
}), z.map((e) => {
|
|
351
|
+
let t = T(e);
|
|
352
|
+
return /* @__PURE__ */ _(y, {
|
|
310
353
|
"data-testid": "finished-sprint",
|
|
311
|
-
children: [/* @__PURE__ */
|
|
354
|
+
children: [/* @__PURE__ */ g(x, {
|
|
312
355
|
className: "pb-2",
|
|
313
|
-
children: /* @__PURE__ */
|
|
356
|
+
children: /* @__PURE__ */ _("div", {
|
|
314
357
|
className: "flex items-center justify-between",
|
|
315
|
-
children: [/* @__PURE__ */
|
|
358
|
+
children: [/* @__PURE__ */ g(S, {
|
|
316
359
|
className: "text-base",
|
|
317
|
-
children: /* @__PURE__ */
|
|
360
|
+
children: /* @__PURE__ */ g("button", {
|
|
318
361
|
type: "button",
|
|
319
362
|
className: "hover:underline text-left",
|
|
320
|
-
onClick: () =>
|
|
363
|
+
onClick: () => V(e.id),
|
|
321
364
|
children: e.name
|
|
322
365
|
})
|
|
323
|
-
}), /* @__PURE__ */
|
|
324
|
-
|
|
325
|
-
children:
|
|
366
|
+
}), /* @__PURE__ */ _("div", {
|
|
367
|
+
className: "flex items-center gap-2",
|
|
368
|
+
children: [/* @__PURE__ */ g(w, { sprint: e }), /* @__PURE__ */ g(v, {
|
|
369
|
+
variant: "outline",
|
|
370
|
+
children: e.status === "COMPLETED" ? "Completed" : "Cancelled"
|
|
371
|
+
})]
|
|
326
372
|
})]
|
|
327
373
|
})
|
|
328
|
-
}), /* @__PURE__ */
|
|
374
|
+
}), /* @__PURE__ */ _(b, {
|
|
329
375
|
className: "space-y-2",
|
|
330
|
-
children: [/* @__PURE__ */
|
|
376
|
+
children: [/* @__PURE__ */ g(u, { sprint: e }), /* @__PURE__ */ _("p", {
|
|
331
377
|
className: "text-xs text-muted-foreground",
|
|
332
378
|
children: [
|
|
333
379
|
t.completedPoints,
|
|
@@ -344,6 +390,6 @@ function C() {
|
|
|
344
390
|
});
|
|
345
391
|
}
|
|
346
392
|
//#endregion
|
|
347
|
-
export {
|
|
393
|
+
export { E as SprintsStartSprintPagePage };
|
|
348
394
|
|
|
349
395
|
//# 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';\nimport { PersonAvatar } from '../people/People';\nimport { countLabel, useSprintCounts, workProgress } from '../hooks/useCounts';\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 | null;\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 // BOFF-7944: velocity is the server's DONE-points-at-completion, set only once the sprint is COMPLETED. It used to\n // fall back to the points done so far — a different number under the same name (the Points tile shows that).\n const velocity = sprint.velocity;\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 // Running sprints are queried by status (BOFF-7970): taken from the 50 newest sprints, a long-running sprint with\n // 50 newer ones disappeared from this page. REVIEW is still in flight, so it counts as running everywhere.\n const running = { skip: !workspaceId, variables: { workspaceId, pagination: { first: 50 } } };\n const { data: activeData } = useQuery<{ planmagnetSprints: { items: SprintNode[] } }>(\n GET_SPRINTS,\n {\n ...running,\n variables: { ...running.variables, filter: { status: 'ACTIVE' } },\n }\n );\n const { data: reviewData } = useQuery<{ planmagnetSprints: { items: SprintNode[] } }>(\n GET_SPRINTS,\n {\n ...running,\n variables: { ...running.variables, filter: { status: 'REVIEW' } },\n }\n );\n const counts = useSprintCounts();\n\n const sprints = sprintData?.planmagnetSprints?.items ?? [];\n const activeSprints = [\n ...(activeData?.planmagnetSprints.items ?? []),\n ...(reviewData?.planmagnetSprints.items ?? []),\n ];\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 {countLabel(counts?.all)} sprints total · {countLabel(counts?.running)} running\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 // Done over everything not cancelled, by tasks when nothing is estimated (BOFF-7989).\n const pctDone = workProgress(tasksForSprint) ?? 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\">\n {metrics.velocity != null ? metrics.velocity : '—'}\n </p>\n <p\n className=\"text-xs text-muted-foreground\"\n title=\"Story points done when the sprint was completed\"\n >\n Velocity\n </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
|
+
{"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 { useState } from 'react';\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';\nimport { TeamSelect } from '../controls/Pickers';\nimport { countLabel, useSprintCounts, workProgress } from '../hooks/useCounts';\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 project {\n id\n name\n }\n team {\n id\n name\n }\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 // BOFF-8044: exactly one of the two is ever set — sprint scope is PROJECT xor TEAM.\n project: { id: string; name: string } | null;\n team: { id: string; name: string } | null;\n workItems: SprintWorkItem[];\n}\n\n/** \"Team: X\" when the sprint is team-scoped, \"Project: Y\" otherwise (BOFF-8044). */\nfunction ScopeBadge({ sprint }: { sprint: SprintNode }) {\n if (sprint.team) {\n return (\n <Badge variant=\"outline\" className=\"text-xs\">\n Team: {sprint.team.name}\n </Badge>\n );\n }\n return (\n <Badge variant=\"outline\" className=\"text-xs\">\n Project: {sprint.project?.name ?? 'Unknown'}\n </Badge>\n );\n}\n\ninterface SprintMetrics {\n totalPoints: number;\n completedPoints: number;\n tasksTotal: number;\n tasksCompleted: number;\n teamMemberIds: string[];\n velocity: number | null;\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 // BOFF-7944: velocity is the server's DONE-points-at-completion, set only once the sprint is COMPLETED. It used to\n // fall back to the points done so far — a different number under the same name (the Points tile shows that).\n const velocity = sprint.velocity;\n return { totalPoints, completedPoints, tasksTotal, tasksCompleted, teamMemberIds, velocity };\n}\n\nexport function SprintsStartSprintPagePage() {\n const { workspaceId } = usePlanMagnet();\n // BOFF-8044: an optional team filter, symmetric with the already-schema-supported (but until now\n // UI-unused) projectId filter. '' means \"every team and every project\".\n const [teamFilter, setTeamFilter] = useState('');\n const teamFilterVar = teamFilter ? { teamId: teamFilter } : {};\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: {\n workspaceId,\n pagination: { first: 50 },\n ...(teamFilter ? { filter: teamFilterVar } : {}),\n },\n skip: !workspaceId,\n });\n\n // Running sprints are queried by status (BOFF-7970): taken from the 50 newest sprints, a long-running sprint with\n // 50 newer ones disappeared from this page. REVIEW is still in flight, so it counts as running everywhere.\n const running = { skip: !workspaceId, variables: { workspaceId, pagination: { first: 50 } } };\n const { data: activeData } = useQuery<{ planmagnetSprints: { items: SprintNode[] } }>(\n GET_SPRINTS,\n {\n ...running,\n variables: { ...running.variables, filter: { status: 'ACTIVE', ...teamFilterVar } },\n }\n );\n const { data: reviewData } = useQuery<{ planmagnetSprints: { items: SprintNode[] } }>(\n GET_SPRINTS,\n {\n ...running,\n variables: { ...running.variables, filter: { status: 'REVIEW', ...teamFilterVar } },\n }\n );\n const counts = useSprintCounts();\n\n const sprints = sprintData?.planmagnetSprints?.items ?? [];\n const activeSprints = [\n ...(activeData?.planmagnetSprints.items ?? []),\n ...(reviewData?.planmagnetSprints.items ?? []),\n ];\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 {countLabel(counts?.all)} sprints total · {countLabel(counts?.running)} running\n </p>\n </div>\n <div className=\"flex items-center gap-2\">\n <TeamSelect value={teamFilter} onChange={setTeamFilter} noneLabel=\"All teams\" />\n <NewSprintDialog onCreated={openSprint} />\n </div>\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 // Done over everything not cancelled, by tasks when nothing is estimated (BOFF-7989).\n const pctDone = workProgress(tasksForSprint) ?? 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 <ScopeBadge sprint={sprint} />\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\">\n {metrics.velocity != null ? metrics.velocity : '—'}\n </p>\n <p\n className=\"text-xs text-muted-foreground\"\n title=\"Story points done when the sprint was completed\"\n >\n Velocity\n </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 <ScopeBadge sprint={sprint} />\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 <div className=\"flex items-center gap-2\">\n <ScopeBadge sprint={sprint} />\n <Badge variant=\"outline\">\n {sprint.status === 'COMPLETED' ? 'Completed' : 'Cancelled'}\n </Badge>\n </div>\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":"TeamCreateTeamPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/TeamCreateTeamPagePage.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"TeamCreateTeamPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/TeamCreateTeamPagePage.tsx"],"names":[],"mappings":"AAuEA,wBAAgB,sBAAsB,4CAsWrC"}
|