@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.
Files changed (66) hide show
  1. package/dist/generated/wspace-operations.d.ts +5 -0
  2. package/dist/generated/wspace-operations.d.ts.map +1 -1
  3. package/dist/generated/wspace-types.d.ts +15 -0
  4. package/dist/generated/wspace-types.d.ts.map +1 -1
  5. package/dist/planmagnet/PlanMagnetRoot.d.ts.map +1 -1
  6. package/dist/planmagnet/PlanMagnetRoot.js +20 -11
  7. package/dist/planmagnet/PlanMagnetRoot.js.map +1 -1
  8. package/dist/planmagnet/PlanMagnetRoutes.d.ts.map +1 -1
  9. package/dist/planmagnet/PlanMagnetRoutes.js +216 -196
  10. package/dist/planmagnet/PlanMagnetRoutes.js.map +1 -1
  11. package/dist/planmagnet/controls/Pickers.d.ts +14 -0
  12. package/dist/planmagnet/controls/Pickers.d.ts.map +1 -1
  13. package/dist/planmagnet/controls/Pickers.js +97 -22
  14. package/dist/planmagnet/controls/Pickers.js.map +1 -1
  15. package/dist/planmagnet/controls/WorkItemControls.d.ts +6 -2
  16. package/dist/planmagnet/controls/WorkItemControls.d.ts.map +1 -1
  17. package/dist/planmagnet/controls/WorkItemControls.js +8 -8
  18. package/dist/planmagnet/controls/WorkItemControls.js.map +1 -1
  19. package/dist/planmagnet/pages/DashboardDashboardPagePage.d.ts.map +1 -1
  20. package/dist/planmagnet/pages/DashboardDashboardPagePage.js +11 -3
  21. package/dist/planmagnet/pages/DashboardDashboardPagePage.js.map +1 -1
  22. package/dist/planmagnet/pages/PortfoliosPortfolioDetailPagePage.d.ts.map +1 -1
  23. package/dist/planmagnet/pages/PortfoliosPortfolioDetailPagePage.js +74 -59
  24. package/dist/planmagnet/pages/PortfoliosPortfolioDetailPagePage.js.map +1 -1
  25. package/dist/planmagnet/pages/ProjectsEditProjectPagePage.d.ts.map +1 -1
  26. package/dist/planmagnet/pages/ProjectsEditProjectPagePage.js +138 -112
  27. package/dist/planmagnet/pages/ProjectsEditProjectPagePage.js.map +1 -1
  28. package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.d.ts.map +1 -1
  29. package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.js +16 -6
  30. package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.js.map +1 -1
  31. package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.d.ts.map +1 -1
  32. package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.js +7 -2
  33. package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.js.map +1 -1
  34. package/dist/planmagnet/pages/ProjectsPlanningPagePage.d.ts.map +1 -1
  35. package/dist/planmagnet/pages/ProjectsPlanningPagePage.js +76 -56
  36. package/dist/planmagnet/pages/ProjectsPlanningPagePage.js.map +1 -1
  37. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.d.ts.map +1 -1
  38. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js +241 -188
  39. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js.map +1 -1
  40. package/dist/planmagnet/pages/SprintsStartSprintPagePage.d.ts.map +1 -1
  41. package/dist/planmagnet/pages/SprintsStartSprintPagePage.js +168 -122
  42. package/dist/planmagnet/pages/SprintsStartSprintPagePage.js.map +1 -1
  43. package/dist/planmagnet/pages/TeamCreateTeamPagePage.d.ts.map +1 -1
  44. package/dist/planmagnet/pages/TeamCreateTeamPagePage.js +288 -91
  45. package/dist/planmagnet/pages/TeamCreateTeamPagePage.js.map +1 -1
  46. package/dist/planmagnet/pages/TeamTeamDetailPagePage.d.ts +2 -0
  47. package/dist/planmagnet/pages/TeamTeamDetailPagePage.d.ts.map +1 -0
  48. package/dist/planmagnet/pages/TeamTeamDetailPagePage.js +217 -0
  49. package/dist/planmagnet/pages/TeamTeamDetailPagePage.js.map +1 -0
  50. package/dist/planmagnet/pages/TeamTeamEditPagePage.d.ts +2 -0
  51. package/dist/planmagnet/pages/TeamTeamEditPagePage.d.ts.map +1 -0
  52. package/dist/planmagnet/pages/TeamTeamEditPagePage.js +211 -0
  53. package/dist/planmagnet/pages/TeamTeamEditPagePage.js.map +1 -0
  54. package/dist/planmagnet/pages/TeamTeamsListPagePage.d.ts +2 -0
  55. package/dist/planmagnet/pages/TeamTeamsListPagePage.d.ts.map +1 -0
  56. package/dist/planmagnet/pages/TeamTeamsListPagePage.js +118 -0
  57. package/dist/planmagnet/pages/TeamTeamsListPagePage.js.map +1 -0
  58. package/dist/planmagnet/sprints/SprintControls.d.ts +15 -3
  59. package/dist/planmagnet/sprints/SprintControls.d.ts.map +1 -1
  60. package/dist/planmagnet/sprints/SprintControls.js +293 -190
  61. package/dist/planmagnet/sprints/SprintControls.js.map +1 -1
  62. package/dist/planmagnet/team/TeamControls.d.ts +31 -0
  63. package/dist/planmagnet/team/TeamControls.d.ts.map +1 -0
  64. package/dist/planmagnet/team/TeamControls.js +407 -0
  65. package/dist/planmagnet/team/TeamControls.js.map +1 -0
  66. package/package.json +1 -1
@@ -1,19 +1,19 @@
1
1
  import { usePlanMagnet as e, usePlanMagnetNavigate as t } from "../providers/PlanMagnetProvider.js";
2
2
  import { PersonName as n } from "../people/People.js";
3
3
  import { workProgress as r } from "../hooks/useCounts.js";
4
- import { useEntityId as i } from "../hooks/useEntityId.js";
5
- import { enumLabel as a } from "../controls/WorkItemControls.js";
6
- import { ROW_LINK_CLASS as o, detailPath as s, rowLinkProps as c } from "../utils/rowNavigation.js";
7
- import { NewRiskDialog as l, NewTemplateFromProjectDialog as u } from "../create/CreateDialogs.js";
8
- import { ProjectHeaderActions as d } from "../controls/ProjectControls.js";
9
- import { ProjectBudgetsSummary as f } from "../budgets/ProjectBudgetsSummary.js";
10
- import { Bot as p, Calendar as m, CheckSquare as h, FolderKanban as g, LayoutTemplate as _, Route as v, ShieldAlert as y, Users as b, Zap as x } from "lucide-react";
11
- import { gql as S } from "@apollo/client";
12
- import { useQuery as C } from "@apollo/client/react";
13
- import { jsx as w, jsxs as T } from "react/jsx-runtime";
14
- import { Badge as E, Button as D, Card as O, CardContent as k, CardHeader as A, CardTitle as j } from "@burdenoff/fe-libs/ui";
4
+ import { useEntityId as ee } from "../hooks/useEntityId.js";
5
+ import { enumLabel as i } from "../controls/WorkItemControls.js";
6
+ import { ROW_LINK_CLASS as a, detailPath as o, rowLinkProps as s } from "../utils/rowNavigation.js";
7
+ import { NewRiskDialog as c, NewTemplateFromProjectDialog as l } from "../create/CreateDialogs.js";
8
+ import { ProjectHeaderActions as u } from "../controls/ProjectControls.js";
9
+ import { ProjectBudgetsSummary as d } from "../budgets/ProjectBudgetsSummary.js";
10
+ import { Bot as f, Calendar as p, CheckSquare as m, FolderKanban as h, LayoutTemplate as g, Route as _, ShieldAlert as v, Users as y, Zap as b } from "lucide-react";
11
+ import { gql as x } from "@apollo/client";
12
+ import { useQuery as S } from "@apollo/client/react";
13
+ import { jsx as C, jsxs as w } from "react/jsx-runtime";
14
+ import { Badge as T, Button as E, Card as D, CardContent as O, CardHeader as k, CardTitle as A } from "@burdenoff/fe-libs/ui";
15
15
  //#region src/planmagnet/pages/ProjectsProjectDetailPagePage.tsx
16
- var M = S`
16
+ var j = x`
17
17
  query GetProjectDetail($id: ID!) {
18
18
  planmagnetProject(id: $id) {
19
19
  id
@@ -74,240 +74,263 @@ var M = S`
74
74
  assigneeId
75
75
  labels
76
76
  createdAt
77
+ sprint {
78
+ id
79
+ name
80
+ status
81
+ team {
82
+ id
83
+ name
84
+ }
85
+ }
77
86
  }
78
87
  }
79
88
  }
80
- `, N = {
89
+ `, M = {
81
90
  ACTIVE: "bg-green-100 text-green-800",
82
91
  ON_HOLD: "bg-orange-100 text-orange-800",
83
92
  CANCELLED: "bg-red-100 text-red-800",
84
93
  COMPLETED: "bg-blue-100 text-blue-800",
85
94
  PLANNING: "bg-gray-100 text-gray-800",
86
95
  ARCHIVED: "bg-gray-100 text-gray-800"
87
- }, P = {
96
+ }, N = {
88
97
  CRITICAL: "bg-red-100 text-red-800",
89
98
  HIGH: "bg-orange-100 text-orange-800",
90
99
  MEDIUM: "bg-yellow-100 text-yellow-800",
91
100
  LOW: "bg-blue-100 text-blue-800",
92
101
  NEGLIGIBLE: "bg-gray-100 text-gray-800"
93
- }, F = new Set([
102
+ }, P = new Set([
94
103
  "IDENTIFIED",
95
104
  "ANALYZING",
96
105
  "MITIGATING",
97
106
  "ACCEPTED"
98
107
  ]);
99
- function I() {
100
- let S = i("projectId"), I = t(), { workspaceId: L } = e(), { data: R, loading: z, error: B } = C(M, {
101
- variables: { id: S },
102
- skip: !S
108
+ function F() {
109
+ let x = ee("projectId"), F = t(), { workspaceId: I } = e(), { data: L, loading: R, error: z } = S(j, {
110
+ variables: { id: x },
111
+ skip: !x
103
112
  });
104
- if (!S) return /* @__PURE__ */ w("div", {
113
+ if (!x) return /* @__PURE__ */ C("div", {
105
114
  className: "p-6 text-muted-foreground",
106
115
  children: "No project selected. Open one from the list."
107
116
  });
108
- if (z && !R) return /* @__PURE__ */ w("div", {
117
+ if (R && !L) return /* @__PURE__ */ C("div", {
109
118
  className: "flex items-center justify-center p-12",
110
- children: /* @__PURE__ */ w("div", { className: "animate-spin h-8 w-8 border-2 border-primary border-t-transparent rounded-full" })
119
+ children: /* @__PURE__ */ C("div", { className: "animate-spin h-8 w-8 border-2 border-primary border-t-transparent rounded-full" })
111
120
  });
112
- if (B) return /* @__PURE__ */ T("div", {
121
+ if (z) return /* @__PURE__ */ w("div", {
113
122
  className: "p-6 text-red-500",
114
- children: ["Error loading project: ", B.message]
123
+ children: ["Error loading project: ", z.message]
115
124
  });
116
- let V = R?.planmagnetProject;
117
- if (!V) return /* @__PURE__ */ w("div", {
125
+ let B = L?.planmagnetProject;
126
+ if (!B) return /* @__PURE__ */ C("div", {
118
127
  className: "p-6 text-muted-foreground",
119
128
  children: "Project not found."
120
129
  });
121
- let H = V.workItems ?? [], U = V.sprints ?? [], W = V.milestones ?? [], G = V.risks ?? [], K = G.filter((e) => F.has(e.status)), q = [...K].sort((e, t) => t.riskScore - e.riskScore).slice(0, 3), J = U.find((e) => e.status === "ACTIVE"), Y = U.filter((e) => e.status === "COMPLETED" && e.velocity != null).sort((e, t) => (t.endDate ?? "").localeCompare(e.endDate ?? ""))[0], X = r(H.map((e) => ({
130
+ let V = B.workItems ?? [], H = B.sprints ?? [], U = B.milestones ?? [], W = B.risks ?? [], G = W.filter((e) => P.has(e.status)), K = [...G].sort((e, t) => t.riskScore - e.riskScore).slice(0, 3), q = H.find((e) => e.status === "ACTIVE"), J = H.filter((e) => e.status === "COMPLETED" && e.velocity != null).sort((e, t) => (t.endDate ?? "").localeCompare(e.endDate ?? ""))[0], Y = r(V.map((e) => ({
122
131
  status: e.status,
123
132
  storyPoints: e.storyPoints
124
- }))), Z = H.filter((e) => e.status !== "CANCELLED"), Q = Z.filter((e) => e.status === "DONE").length, $ = [...H].sort((e, t) => t.createdAt.localeCompare(e.createdAt)).slice(0, 5);
125
- return /* @__PURE__ */ T("div", {
133
+ }))), X = V.filter((e) => e.status !== "CANCELLED"), Z = X.filter((e) => e.status === "DONE").length, Q = [...V].sort((e, t) => t.createdAt.localeCompare(e.createdAt)).slice(0, 5), $ = Object.values(V.reduce((e, t) => {
134
+ if (!t.sprint?.team) return e;
135
+ let n = e[t.sprint.id] ?? {
136
+ sprint: {
137
+ ...t.sprint,
138
+ team: t.sprint.team
139
+ },
140
+ items: []
141
+ };
142
+ return n.items.push({
143
+ id: t.id,
144
+ key: t.key,
145
+ title: t.title
146
+ }), e[t.sprint.id] = n, e;
147
+ }, {}));
148
+ return /* @__PURE__ */ w("div", {
126
149
  className: "space-y-6 p-6",
127
150
  children: [
128
- /* @__PURE__ */ T("div", {
151
+ /* @__PURE__ */ w("div", {
129
152
  className: "flex items-center justify-between",
130
- children: [/* @__PURE__ */ T("div", { children: [/* @__PURE__ */ T("div", {
153
+ children: [/* @__PURE__ */ w("div", { children: [/* @__PURE__ */ w("div", {
131
154
  className: "flex items-center gap-2",
132
155
  children: [
133
- /* @__PURE__ */ w(g, { className: "h-5 w-5 text-primary" }),
134
- /* @__PURE__ */ w("h1", {
156
+ /* @__PURE__ */ C(h, { className: "h-5 w-5 text-primary" }),
157
+ /* @__PURE__ */ C("h1", {
135
158
  className: "text-2xl font-semibold",
136
- children: V.name
159
+ children: B.name
137
160
  }),
138
- /* @__PURE__ */ w("span", {
139
- className: `text-xs px-2 py-0.5 rounded-full capitalize ${N[V.status] ?? "bg-gray-100"}`,
140
- children: V.status.toLowerCase().replace("_", " ")
161
+ /* @__PURE__ */ C("span", {
162
+ className: `text-xs px-2 py-0.5 rounded-full capitalize ${M[B.status] ?? "bg-gray-100"}`,
163
+ children: B.status.toLowerCase().replace("_", " ")
141
164
  })
142
165
  ]
143
- }), /* @__PURE__ */ w("p", {
166
+ }), /* @__PURE__ */ C("p", {
144
167
  className: "text-sm text-muted-foreground mt-1",
145
- children: V.description ?? "No description"
146
- })] }), /* @__PURE__ */ T("div", {
168
+ children: B.description ?? "No description"
169
+ })] }), /* @__PURE__ */ w("div", {
147
170
  className: "flex flex-col items-end gap-2",
148
171
  children: [
149
- /* @__PURE__ */ w(d, {
150
- projectId: V.id,
151
- name: V.name,
152
- status: V.status
172
+ /* @__PURE__ */ C(u, {
173
+ projectId: B.id,
174
+ name: B.name,
175
+ status: B.status
153
176
  }),
154
- /* @__PURE__ */ T("div", {
177
+ /* @__PURE__ */ w("div", {
155
178
  className: "flex items-center gap-2",
156
- children: [/* @__PURE__ */ T(D, {
179
+ children: [/* @__PURE__ */ w(E, {
157
180
  size: "sm",
158
181
  variant: "outline",
159
- onClick: () => I("/automation/automation-rules-page"),
182
+ onClick: () => F("/automation/automation-rules-page"),
160
183
  "data-testid": "project-automation-rules",
161
- children: [/* @__PURE__ */ w(p, { className: "mr-1 h-4 w-4" }), "Automation rules"]
162
- }), /* @__PURE__ */ w(u, {
163
- projectId: V.id,
164
- projectName: V.name,
165
- onCreated: (e) => I(s("/templates/edit-template-page", e)),
166
- trigger: /* @__PURE__ */ T(D, {
184
+ children: [/* @__PURE__ */ C(f, { className: "mr-1 h-4 w-4" }), "Automation rules"]
185
+ }), /* @__PURE__ */ C(l, {
186
+ projectId: B.id,
187
+ projectName: B.name,
188
+ onCreated: (e) => F(o("/templates/edit-template-page", e)),
189
+ trigger: /* @__PURE__ */ w(E, {
167
190
  size: "sm",
168
191
  variant: "outline",
169
192
  "data-testid": "project-save-as-template",
170
- children: [/* @__PURE__ */ w(_, { className: "mr-1 h-4 w-4" }), "Save as template"]
193
+ children: [/* @__PURE__ */ C(g, { className: "mr-1 h-4 w-4" }), "Save as template"]
171
194
  })
172
195
  })]
173
196
  }),
174
- /* @__PURE__ */ w(E, {
197
+ /* @__PURE__ */ C(T, {
175
198
  variant: "outline",
176
199
  className: "capitalize",
177
- children: V.methodology.toLowerCase()
200
+ children: B.methodology.toLowerCase()
178
201
  }),
179
- /* @__PURE__ */ T(D, {
202
+ /* @__PURE__ */ w(E, {
180
203
  size: "sm",
181
204
  variant: "outline",
182
- onClick: () => I(s("/projects/critical-path-page", V.id)),
183
- children: [/* @__PURE__ */ w(v, { className: "mr-1 h-4 w-4" }), "Critical path"]
205
+ onClick: () => F(o("/projects/critical-path-page", B.id)),
206
+ children: [/* @__PURE__ */ C(_, { className: "mr-1 h-4 w-4" }), "Critical path"]
184
207
  })
185
208
  ]
186
209
  })]
187
210
  }),
188
- /* @__PURE__ */ T("div", {
211
+ /* @__PURE__ */ w("div", {
189
212
  className: "grid grid-cols-2 md:grid-cols-4 gap-4",
190
213
  children: [
191
- /* @__PURE__ */ w(O, { children: /* @__PURE__ */ T(k, {
214
+ /* @__PURE__ */ C(D, { children: /* @__PURE__ */ w(O, {
192
215
  className: "pt-4",
193
- children: [/* @__PURE__ */ T("div", {
216
+ children: [/* @__PURE__ */ w("div", {
194
217
  className: "flex items-center gap-2 text-muted-foreground text-xs",
195
- children: [/* @__PURE__ */ w(h, { className: "h-4 w-4" }), "Work Items"]
196
- }), /* @__PURE__ */ T("p", {
218
+ children: [/* @__PURE__ */ C(m, { className: "h-4 w-4" }), "Work Items"]
219
+ }), /* @__PURE__ */ w("p", {
197
220
  className: "text-xl font-bold mt-1",
198
221
  children: [
199
- Q,
222
+ Z,
200
223
  "/",
201
- Z.length
224
+ X.length
202
225
  ]
203
226
  })]
204
227
  }) }),
205
- /* @__PURE__ */ w(O, { children: /* @__PURE__ */ T(k, {
228
+ /* @__PURE__ */ C(D, { children: /* @__PURE__ */ w(O, {
206
229
  className: "pt-4",
207
- children: [/* @__PURE__ */ T("div", {
230
+ children: [/* @__PURE__ */ w("div", {
208
231
  className: "flex items-center gap-2 text-muted-foreground text-xs",
209
- children: [/* @__PURE__ */ w(x, { className: "h-4 w-4" }), "Sprints"]
210
- }), /* @__PURE__ */ w("p", {
232
+ children: [/* @__PURE__ */ C(b, { className: "h-4 w-4" }), "Sprints"]
233
+ }), /* @__PURE__ */ C("p", {
211
234
  className: "text-xl font-bold mt-1",
212
- children: U.length
235
+ children: H.length
213
236
  })]
214
237
  }) }),
215
- /* @__PURE__ */ w(O, { children: /* @__PURE__ */ T(k, {
238
+ /* @__PURE__ */ C(D, { children: /* @__PURE__ */ w(O, {
216
239
  className: "pt-4",
217
- children: [/* @__PURE__ */ T("div", {
240
+ children: [/* @__PURE__ */ w("div", {
218
241
  className: "flex items-center gap-2 text-muted-foreground text-xs",
219
- children: [/* @__PURE__ */ w(m, { className: "h-4 w-4" }), "Milestones"]
220
- }), /* @__PURE__ */ w("p", {
242
+ children: [/* @__PURE__ */ C(p, { className: "h-4 w-4" }), "Milestones"]
243
+ }), /* @__PURE__ */ C("p", {
221
244
  className: "text-xl font-bold mt-1",
222
- children: W.length
245
+ children: U.length
223
246
  })]
224
247
  }) }),
225
- /* @__PURE__ */ w(O, { children: /* @__PURE__ */ T(k, {
248
+ /* @__PURE__ */ C(D, { children: /* @__PURE__ */ w(O, {
226
249
  className: "pt-4",
227
- children: [/* @__PURE__ */ T("div", {
250
+ children: [/* @__PURE__ */ w("div", {
228
251
  className: "flex items-center gap-2 text-muted-foreground text-xs",
229
- children: [/* @__PURE__ */ w(b, { className: "h-4 w-4" }), "Owner"]
230
- }), /* @__PURE__ */ w("p", {
252
+ children: [/* @__PURE__ */ C(y, { className: "h-4 w-4" }), "Owner"]
253
+ }), /* @__PURE__ */ C("p", {
231
254
  className: "text-sm font-bold mt-1 truncate",
232
- children: /* @__PURE__ */ w(n, { id: V.ownerId })
255
+ children: /* @__PURE__ */ C(n, { id: B.ownerId })
233
256
  })]
234
257
  }) })
235
258
  ]
236
259
  }),
237
- /* @__PURE__ */ T("div", {
260
+ /* @__PURE__ */ w("div", {
238
261
  className: "grid grid-cols-1 lg:grid-cols-3 gap-6",
239
- children: [/* @__PURE__ */ T("div", {
262
+ children: [/* @__PURE__ */ w("div", {
240
263
  className: "lg:col-span-2 space-y-6",
241
264
  children: [
242
- /* @__PURE__ */ T(O, { children: [/* @__PURE__ */ w(A, { children: /* @__PURE__ */ w(j, { children: "Timeline" }) }), /* @__PURE__ */ T(k, { children: [
243
- /* @__PURE__ */ T("div", {
265
+ /* @__PURE__ */ w(D, { children: [/* @__PURE__ */ C(k, { children: /* @__PURE__ */ C(A, { children: "Timeline" }) }), /* @__PURE__ */ w(O, { children: [
266
+ /* @__PURE__ */ w("div", {
244
267
  className: "flex justify-between text-sm mb-2",
245
- children: [/* @__PURE__ */ w("span", {
268
+ children: [/* @__PURE__ */ C("span", {
246
269
  className: "text-muted-foreground",
247
270
  children: "Tasks done"
248
- }), /* @__PURE__ */ w("span", {
271
+ }), /* @__PURE__ */ C("span", {
249
272
  className: "font-medium",
250
- children: X === null ? "No open tasks" : `${X}%`
273
+ children: Y === null ? "No open tasks" : `${Y}%`
251
274
  })]
252
275
  }),
253
- /* @__PURE__ */ w("div", {
276
+ /* @__PURE__ */ C("div", {
254
277
  className: "w-full h-4 rounded-full bg-muted overflow-hidden",
255
- children: /* @__PURE__ */ w("div", {
278
+ children: /* @__PURE__ */ C("div", {
256
279
  className: "h-full bg-primary rounded-full",
257
- style: { width: `${X ?? 0}%` }
280
+ style: { width: `${Y ?? 0}%` }
258
281
  })
259
282
  }),
260
- /* @__PURE__ */ T("div", {
283
+ /* @__PURE__ */ w("div", {
261
284
  className: "flex justify-between text-xs text-muted-foreground mt-2",
262
- children: [/* @__PURE__ */ w("span", { children: V.startDate ? new Date(V.startDate).toLocaleDateString() : "Not set" }), /* @__PURE__ */ w("span", { children: V.endDate ? new Date(V.endDate).toLocaleDateString() : "Not set" })]
285
+ children: [/* @__PURE__ */ C("span", { children: B.startDate ? new Date(B.startDate).toLocaleDateString() : "Not set" }), /* @__PURE__ */ C("span", { children: B.endDate ? new Date(B.endDate).toLocaleDateString() : "Not set" })]
263
286
  })
264
287
  ] })] }),
265
- J && /* @__PURE__ */ T(O, { children: [/* @__PURE__ */ w(A, { children: /* @__PURE__ */ T(j, {
288
+ q && /* @__PURE__ */ w(D, { children: [/* @__PURE__ */ C(k, { children: /* @__PURE__ */ w(A, {
266
289
  className: "flex items-center gap-2",
267
- children: [/* @__PURE__ */ w(x, { className: "h-4 w-4 text-primary" }), "Active Sprint"]
268
- }) }), /* @__PURE__ */ T(k, {
290
+ children: [/* @__PURE__ */ C(b, { className: "h-4 w-4 text-primary" }), "Active Sprint"]
291
+ }) }), /* @__PURE__ */ w(O, {
269
292
  className: "space-y-3",
270
293
  children: [
271
- /* @__PURE__ */ T("div", {
294
+ /* @__PURE__ */ w("div", {
272
295
  className: "flex justify-between",
273
- children: [/* @__PURE__ */ w("span", {
296
+ children: [/* @__PURE__ */ C("span", {
274
297
  className: "font-medium",
275
- children: J.name
276
- }), /* @__PURE__ */ w(E, { children: "Active" })]
298
+ children: q.name
299
+ }), /* @__PURE__ */ C(T, { children: "Active" })]
277
300
  }),
278
- J.goal && /* @__PURE__ */ w("p", {
301
+ q.goal && /* @__PURE__ */ C("p", {
279
302
  className: "text-sm text-muted-foreground",
280
- children: J.goal
303
+ children: q.goal
281
304
  }),
282
- /* @__PURE__ */ T("div", {
305
+ /* @__PURE__ */ w("div", {
283
306
  className: "grid grid-cols-3 gap-4 text-center",
284
307
  children: [
285
- /* @__PURE__ */ T("div", { children: [/* @__PURE__ */ T("p", {
308
+ /* @__PURE__ */ w("div", { children: [/* @__PURE__ */ w("p", {
286
309
  className: "text-lg font-semibold",
287
310
  children: [
288
- J.workItems?.filter((e) => e.status === "DONE").reduce((e, t) => e + (t.storyPoints ?? 0), 0),
311
+ q.workItems?.filter((e) => e.status === "DONE").reduce((e, t) => e + (t.storyPoints ?? 0), 0),
289
312
  "/",
290
- J.workItems?.reduce((e, t) => e + (t.storyPoints ?? 0), 0) ?? 0
313
+ q.workItems?.reduce((e, t) => e + (t.storyPoints ?? 0), 0) ?? 0
291
314
  ]
292
- }), /* @__PURE__ */ w("p", {
315
+ }), /* @__PURE__ */ C("p", {
293
316
  className: "text-xs text-muted-foreground",
294
317
  children: "Points"
295
318
  })] }),
296
- /* @__PURE__ */ T("div", { children: [/* @__PURE__ */ T("p", {
319
+ /* @__PURE__ */ w("div", { children: [/* @__PURE__ */ w("p", {
297
320
  className: "text-lg font-semibold",
298
321
  children: [
299
- J.workItems?.filter((e) => e.status === "DONE").length ?? 0,
322
+ q.workItems?.filter((e) => e.status === "DONE").length ?? 0,
300
323
  "/",
301
- J.workItems?.length ?? 0
324
+ q.workItems?.length ?? 0
302
325
  ]
303
- }), /* @__PURE__ */ w("p", {
326
+ }), /* @__PURE__ */ C("p", {
304
327
  className: "text-xs text-muted-foreground",
305
328
  children: "Tasks"
306
329
  })] }),
307
- /* @__PURE__ */ T("div", { children: [/* @__PURE__ */ w("p", {
330
+ /* @__PURE__ */ w("div", { children: [/* @__PURE__ */ C("p", {
308
331
  className: "text-lg font-semibold",
309
- children: Y ? `${Y.velocity} pts` : "—"
310
- }), /* @__PURE__ */ w("p", {
332
+ children: J ? `${J.velocity} pts` : "—"
333
+ }), /* @__PURE__ */ C("p", {
311
334
  className: "text-xs text-muted-foreground",
312
335
  children: "Velocity of the last sprint"
313
336
  })] })
@@ -315,191 +338,221 @@ function I() {
315
338
  })
316
339
  ]
317
340
  })] }),
318
- /* @__PURE__ */ T(O, { children: [/* @__PURE__ */ w(A, { children: /* @__PURE__ */ T(j, { children: [
341
+ /* @__PURE__ */ w(D, { children: [/* @__PURE__ */ C(k, { children: /* @__PURE__ */ w(A, { children: [
319
342
  "Work items (",
320
- H.length,
343
+ V.length,
321
344
  ")",
322
- H.length > 5 ? " · latest 5" : ""
323
- ] }) }), /* @__PURE__ */ T(k, {
345
+ V.length > 5 ? " · latest 5" : ""
346
+ ] }) }), /* @__PURE__ */ w(O, {
324
347
  className: "space-y-2",
325
- children: [$.map((e) => /* @__PURE__ */ T("div", {
326
- ...c(() => I(`/tasks/task-detail-page?taskId=${encodeURIComponent(e.id)}`), e.key),
327
- className: `flex items-center justify-between border rounded-md p-2.5 ${o}`,
328
- children: [/* @__PURE__ */ T("div", { children: [/* @__PURE__ */ T("p", {
348
+ children: [Q.map((e) => /* @__PURE__ */ w("div", {
349
+ ...s(() => F(`/tasks/task-detail-page?taskId=${encodeURIComponent(e.id)}`), e.key),
350
+ className: `flex items-center justify-between border rounded-md p-2.5 ${a}`,
351
+ children: [/* @__PURE__ */ w("div", { children: [/* @__PURE__ */ w("p", {
329
352
  className: "text-sm font-medium",
330
353
  children: [
331
354
  e.key,
332
355
  " ",
333
- /* @__PURE__ */ w("span", {
356
+ /* @__PURE__ */ C("span", {
334
357
  className: "font-normal",
335
358
  children: e.title
336
359
  })
337
360
  ]
338
- }), /* @__PURE__ */ w("div", {
361
+ }), /* @__PURE__ */ C("div", {
339
362
  className: "flex gap-1 mt-1",
340
- children: e.labels.map((e) => /* @__PURE__ */ w("span", {
363
+ children: e.labels.map((e) => /* @__PURE__ */ C("span", {
341
364
  className: "text-[10px] px-1.5 py-0.5 rounded bg-muted",
342
365
  children: e
343
366
  }, e))
344
- })] }), /* @__PURE__ */ T("div", {
367
+ })] }), /* @__PURE__ */ w("div", {
345
368
  className: "flex items-center gap-2",
346
- children: [/* @__PURE__ */ T("span", {
369
+ children: [/* @__PURE__ */ w("span", {
347
370
  className: "text-xs text-muted-foreground",
348
371
  children: [e.storyPoints ?? 0, " pts"]
349
- }), /* @__PURE__ */ w(E, {
372
+ }), /* @__PURE__ */ C(T, {
350
373
  variant: "secondary",
351
374
  className: "capitalize text-xs",
352
375
  children: e.status.toLowerCase().replace("_", " ")
353
376
  })]
354
377
  })]
355
- }, e.id)), H.length === 0 && /* @__PURE__ */ w("p", {
378
+ }, e.id)), V.length === 0 && /* @__PURE__ */ C("p", {
356
379
  className: "text-sm text-muted-foreground text-center py-4",
357
380
  children: "No work items yet."
358
381
  })]
359
382
  })] })
360
383
  ]
361
- }), /* @__PURE__ */ T("div", {
384
+ }), /* @__PURE__ */ w("div", {
362
385
  className: "space-y-6",
363
386
  children: [
364
- /* @__PURE__ */ w(f, {
365
- workspaceId: L,
366
- projectId: V.id
387
+ /* @__PURE__ */ C(d, {
388
+ workspaceId: I,
389
+ projectId: B.id
367
390
  }),
368
- /* @__PURE__ */ T(O, { children: [/* @__PURE__ */ w(A, { children: /* @__PURE__ */ T(j, { children: [
391
+ /* @__PURE__ */ w(D, { children: [/* @__PURE__ */ C(k, { children: /* @__PURE__ */ w(A, { children: [
369
392
  "Milestones (",
370
- W.length,
393
+ U.length,
371
394
  ")"
372
- ] }) }), /* @__PURE__ */ T(k, {
395
+ ] }) }), /* @__PURE__ */ w(O, {
373
396
  className: "space-y-3",
374
- children: [W.map((e) => /* @__PURE__ */ T("div", {
397
+ children: [U.map((e) => /* @__PURE__ */ w("div", {
375
398
  className: "border-b pb-2 last:border-0",
376
- children: [/* @__PURE__ */ T("div", {
399
+ children: [/* @__PURE__ */ w("div", {
377
400
  className: "flex justify-between",
378
- children: [/* @__PURE__ */ w("span", {
401
+ children: [/* @__PURE__ */ C("span", {
379
402
  className: "text-sm font-medium",
380
403
  children: e.name
381
- }), /* @__PURE__ */ w(E, {
404
+ }), /* @__PURE__ */ C(T, {
382
405
  variant: "outline",
383
406
  className: "text-xs capitalize",
384
407
  children: e.status.toLowerCase().replace("_", " ")
385
408
  })]
386
- }), /* @__PURE__ */ T("div", {
409
+ }), /* @__PURE__ */ w("div", {
387
410
  className: "flex items-center gap-1 text-xs text-muted-foreground mt-1",
388
- children: [/* @__PURE__ */ w(m, { className: "h-3 w-3" }), e.dueDate ? new Date(e.dueDate).toLocaleDateString() : "No due date"]
411
+ children: [/* @__PURE__ */ C(p, { className: "h-3 w-3" }), e.dueDate ? new Date(e.dueDate).toLocaleDateString() : "No due date"]
389
412
  })]
390
- }, e.id)), W.length === 0 && /* @__PURE__ */ w("p", {
413
+ }, e.id)), U.length === 0 && /* @__PURE__ */ C("p", {
391
414
  className: "text-sm text-muted-foreground text-center py-2",
392
415
  children: "No milestones."
393
416
  })]
394
417
  })] }),
395
- /* @__PURE__ */ T(O, { children: [/* @__PURE__ */ T(A, {
418
+ $.length > 0 && /* @__PURE__ */ w(D, {
419
+ "data-testid": "team-sprint-work",
420
+ children: [/* @__PURE__ */ C(k, { children: /* @__PURE__ */ w(A, {
421
+ className: "flex items-center gap-2",
422
+ children: [/* @__PURE__ */ C(y, { className: "h-4 w-4" }), "Team sprint work"]
423
+ }) }), /* @__PURE__ */ C(O, {
424
+ className: "space-y-3",
425
+ children: $.map((e) => /* @__PURE__ */ w("div", {
426
+ className: "border-b pb-2 last:border-0",
427
+ children: [/* @__PURE__ */ C("button", {
428
+ type: "button",
429
+ className: "text-sm font-medium hover:underline text-left",
430
+ onClick: () => F(o("/projects/planning-detail-page", e.sprint.id)),
431
+ children: e.sprint.name
432
+ }), /* @__PURE__ */ w("button", {
433
+ type: "button",
434
+ className: "block text-xs text-muted-foreground hover:underline",
435
+ onClick: () => F(o("/team/team-detail-page", e.sprint.team.id)),
436
+ children: [
437
+ e.items.length,
438
+ " item",
439
+ e.items.length === 1 ? "" : "s",
440
+ " · team",
441
+ " ",
442
+ e.sprint.team.name
443
+ ]
444
+ })]
445
+ }, e.sprint.id))
446
+ })]
447
+ }),
448
+ /* @__PURE__ */ w(D, { children: [/* @__PURE__ */ w(k, {
396
449
  className: "flex flex-row items-center justify-between space-y-0",
397
- children: [/* @__PURE__ */ T(j, {
450
+ children: [/* @__PURE__ */ w(A, {
398
451
  className: "flex items-center gap-2",
399
452
  children: [
400
- /* @__PURE__ */ w(y, { className: "h-4 w-4 text-primary" }),
453
+ /* @__PURE__ */ C(v, { className: "h-4 w-4 text-primary" }),
401
454
  "Risks (",
402
- K.length,
455
+ G.length,
403
456
  " open)"
404
457
  ]
405
- }), /* @__PURE__ */ w(l, {
406
- projectId: V.id,
407
- onCreated: (e) => I(s("/risks/risk-detail-page", e))
458
+ }), /* @__PURE__ */ C(c, {
459
+ projectId: B.id,
460
+ onCreated: (e) => F(o("/risks/risk-detail-page", e))
408
461
  })]
409
- }), /* @__PURE__ */ T(k, {
462
+ }), /* @__PURE__ */ w(O, {
410
463
  className: "space-y-3",
411
464
  children: [
412
- q.map((e) => /* @__PURE__ */ T("div", {
413
- ...c(() => I(s("/risks/risk-detail-page", e.id)), e.title),
414
- className: `border-b pb-2 last:border-0 ${o}`,
415
- children: [/* @__PURE__ */ T("div", {
465
+ K.map((e) => /* @__PURE__ */ w("div", {
466
+ ...s(() => F(o("/risks/risk-detail-page", e.id)), e.title),
467
+ className: `border-b pb-2 last:border-0 ${a}`,
468
+ children: [/* @__PURE__ */ w("div", {
416
469
  className: "flex justify-between gap-2",
417
- children: [/* @__PURE__ */ w("span", {
470
+ children: [/* @__PURE__ */ C("span", {
418
471
  className: "text-sm font-medium truncate",
419
472
  children: e.title
420
- }), /* @__PURE__ */ w("span", {
421
- className: `text-xs px-2 py-0.5 rounded-full shrink-0 ${P[e.severity] ?? "bg-gray-100"}`,
422
- children: a(e.severity)
473
+ }), /* @__PURE__ */ C("span", {
474
+ className: `text-xs px-2 py-0.5 rounded-full shrink-0 ${N[e.severity] ?? "bg-gray-100"}`,
475
+ children: i(e.severity)
423
476
  })]
424
- }), /* @__PURE__ */ T("div", {
477
+ }), /* @__PURE__ */ w("div", {
425
478
  className: "text-xs text-muted-foreground mt-1",
426
479
  children: [
427
480
  "Score ",
428
481
  e.riskScore,
429
482
  " · ",
430
- a(e.status)
483
+ i(e.status)
431
484
  ]
432
485
  })]
433
486
  }, e.id)),
434
- K.length === 0 && /* @__PURE__ */ w("p", {
487
+ G.length === 0 && /* @__PURE__ */ C("p", {
435
488
  className: "text-sm text-muted-foreground text-center py-2",
436
489
  children: "No open risks."
437
490
  }),
438
- /* @__PURE__ */ T("button", {
491
+ /* @__PURE__ */ w("button", {
439
492
  type: "button",
440
493
  className: "text-xs text-primary hover:underline",
441
- onClick: () => I(`/risks/risk-register-page?projectId=${encodeURIComponent(V.id)}`),
494
+ onClick: () => F(`/risks/risk-register-page?projectId=${encodeURIComponent(B.id)}`),
442
495
  children: [
443
496
  "View risk register (",
444
- G.length,
497
+ W.length,
445
498
  ") →"
446
499
  ]
447
500
  })
448
501
  ]
449
502
  })] }),
450
- /* @__PURE__ */ T(O, { children: [/* @__PURE__ */ w(A, { children: /* @__PURE__ */ w(j, { children: "Details" }) }), /* @__PURE__ */ T(k, {
503
+ /* @__PURE__ */ w(D, { children: [/* @__PURE__ */ C(k, { children: /* @__PURE__ */ C(A, { children: "Details" }) }), /* @__PURE__ */ w(O, {
451
504
  className: "space-y-2 text-sm",
452
505
  children: [
453
- /* @__PURE__ */ T("div", {
506
+ /* @__PURE__ */ w("div", {
454
507
  className: "flex justify-between",
455
- children: [/* @__PURE__ */ w("span", {
508
+ children: [/* @__PURE__ */ C("span", {
456
509
  className: "text-muted-foreground",
457
510
  children: "Owner"
458
- }), /* @__PURE__ */ w("span", { children: /* @__PURE__ */ w(n, { id: V.ownerId }) })]
511
+ }), /* @__PURE__ */ C("span", { children: /* @__PURE__ */ C(n, { id: B.ownerId }) })]
459
512
  }),
460
- /* @__PURE__ */ T("div", {
513
+ /* @__PURE__ */ w("div", {
461
514
  className: "flex justify-between",
462
- children: [/* @__PURE__ */ w("span", {
515
+ children: [/* @__PURE__ */ C("span", {
463
516
  className: "text-muted-foreground",
464
517
  children: "Key"
465
- }), /* @__PURE__ */ w("span", {
518
+ }), /* @__PURE__ */ C("span", {
466
519
  className: "font-mono",
467
- children: V.key
520
+ children: B.key
468
521
  })]
469
522
  }),
470
- /* @__PURE__ */ T("div", {
523
+ /* @__PURE__ */ w("div", {
471
524
  className: "flex justify-between",
472
- children: [/* @__PURE__ */ w("span", {
525
+ children: [/* @__PURE__ */ C("span", {
473
526
  className: "text-muted-foreground",
474
527
  children: "Methodology"
475
- }), /* @__PURE__ */ w("span", {
528
+ }), /* @__PURE__ */ C("span", {
476
529
  className: "capitalize",
477
- children: V.methodology.toLowerCase()
530
+ children: B.methodology.toLowerCase()
478
531
  })]
479
532
  }),
480
- /* @__PURE__ */ T("div", {
533
+ /* @__PURE__ */ w("div", {
481
534
  className: "flex justify-between",
482
- children: [/* @__PURE__ */ w("span", {
535
+ children: [/* @__PURE__ */ C("span", {
483
536
  className: "text-muted-foreground",
484
537
  children: "Program"
485
- }), V.program ? /* @__PURE__ */ w("button", {
538
+ }), B.program ? /* @__PURE__ */ C("button", {
486
539
  type: "button",
487
540
  className: "text-primary hover:underline underline-offset-2",
488
- onClick: () => I(s("/products/program-detail-page", V.program.id)),
489
- children: V.program.name
490
- }) : /* @__PURE__ */ w("span", {
541
+ onClick: () => F(o("/products/program-detail-page", B.program.id)),
542
+ children: B.program.name
543
+ }) : /* @__PURE__ */ C("span", {
491
544
  className: "text-muted-foreground",
492
545
  children: "No program"
493
546
  })]
494
547
  }),
495
- V.tags.length > 0 && /* @__PURE__ */ T("div", {
548
+ B.tags.length > 0 && /* @__PURE__ */ w("div", {
496
549
  className: "flex justify-between items-start",
497
- children: [/* @__PURE__ */ w("span", {
550
+ children: [/* @__PURE__ */ C("span", {
498
551
  className: "text-muted-foreground",
499
552
  children: "Tags"
500
- }), /* @__PURE__ */ w("div", {
553
+ }), /* @__PURE__ */ C("div", {
501
554
  className: "flex gap-1 flex-wrap justify-end",
502
- children: V.tags.map((e) => /* @__PURE__ */ w(E, {
555
+ children: B.tags.map((e) => /* @__PURE__ */ C(T, {
503
556
  variant: "outline",
504
557
  className: "text-xs",
505
558
  children: e
@@ -515,6 +568,6 @@ function I() {
515
568
  });
516
569
  }
517
570
  //#endregion
518
- export { I as ProjectsProjectDetailPagePage };
571
+ export { F as ProjectsProjectDetailPagePage };
519
572
 
520
573
  //# sourceMappingURL=ProjectsProjectDetailPagePage.js.map