@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,16 +1,16 @@
1
1
  import { usePlanMagnetNavigate as e } from "../providers/PlanMagnetProvider.js";
2
- import { PersonName as t } from "../people/People.js";
3
- import { detailPath as n } from "../utils/rowNavigation.js";
4
- import { useEntityId as r } from "../hooks/useEntityId.js";
5
- import { SprintLifecycleActions as i, SprintWorkItemsPanel as a } from "../sprints/SprintControls.js";
6
- import { SprintDates as o } from "../sprints/SprintDates.js";
7
- import { BarChart3 as s, FolderKanban as c, Pencil as l, Users as u } from "lucide-react";
8
- import { gql as d } from "@apollo/client";
9
- import { useQuery as f } from "@apollo/client/react";
10
- import { jsx as p, jsxs as m } from "react/jsx-runtime";
11
- import { Badge as h, Button as g, Card as _, CardContent as v, CardHeader as y, CardTitle as b } from "@burdenoff/fe-libs/ui";
2
+ import { PersonAvatar as t, PersonName as n, initialsOf as r } from "../people/People.js";
3
+ import { detailPath as i } from "../utils/rowNavigation.js";
4
+ import { useEntityId as a } from "../hooks/useEntityId.js";
5
+ import { SprintLifecycleActions as o, SprintWorkItemsPanel as s } from "../sprints/SprintControls.js";
6
+ import { SprintDates as c } from "../sprints/SprintDates.js";
7
+ import { BarChart3 as l, FolderKanban as u, Pencil as d, Users as f } from "lucide-react";
8
+ import { gql as p } from "@apollo/client";
9
+ import { useQuery as m } from "@apollo/client/react";
10
+ import { jsx as h, jsxs as g } from "react/jsx-runtime";
11
+ import { Badge as _, Button as v, Card as y, CardContent as b, CardHeader as x, CardTitle as S } from "@burdenoff/fe-libs/ui";
12
12
  //#region src/planmagnet/pages/ProjectsPlanningDetailPagePage.tsx
13
- var x = d`
13
+ var C = p`
14
14
  query GetSprintDetail($id: ID!) {
15
15
  planmagnetSprint(id: $id) {
16
16
  id
@@ -49,7 +49,7 @@ var x = d`
49
49
  }
50
50
  }
51
51
  }
52
- `, S = d`
52
+ `, w = p`
53
53
  query GetSprintCapacity($sprintId: ID!) {
54
54
  planmagnetSprintCapacity(sprintId: $sprintId) {
55
55
  sprintId
@@ -69,256 +69,260 @@ var x = d`
69
69
  }
70
70
  }
71
71
  `;
72
- function C() {
73
- let d = r("sprintId"), C = e(), { data: w, loading: T, error: E } = f(x, {
74
- variables: { id: d },
75
- skip: !d
76
- }), { data: D } = f(S, {
77
- variables: { sprintId: d },
78
- skip: !d
72
+ function T() {
73
+ let p = a("sprintId"), T = e(), { data: E, loading: D, error: O } = m(C, {
74
+ variables: { id: p },
75
+ skip: !p
76
+ }), { data: k } = m(w, {
77
+ variables: { sprintId: p },
78
+ skip: !p
79
79
  });
80
- if (!d) return /* @__PURE__ */ p("div", {
80
+ if (!p) return /* @__PURE__ */ h("div", {
81
81
  className: "p-6 text-muted-foreground",
82
82
  children: "No planning session selected. Open one from the list."
83
83
  });
84
- if (T && !w) return /* @__PURE__ */ p("div", {
84
+ if (D && !E) return /* @__PURE__ */ h("div", {
85
85
  className: "flex items-center justify-center p-12",
86
- children: /* @__PURE__ */ p("div", { className: "animate-spin h-8 w-8 border-2 border-primary border-t-transparent rounded-full" })
86
+ children: /* @__PURE__ */ h("div", { className: "animate-spin h-8 w-8 border-2 border-primary border-t-transparent rounded-full" })
87
87
  });
88
- if (E) return /* @__PURE__ */ m("div", {
88
+ if (O) return /* @__PURE__ */ g("div", {
89
89
  className: "p-6 text-red-500",
90
- children: ["Error loading planning session: ", E.message]
90
+ children: ["Error loading planning session: ", O.message]
91
91
  });
92
- let O = w?.planmagnetSprint;
93
- if (!O) return /* @__PURE__ */ p("div", {
92
+ let A = E?.planmagnetSprint;
93
+ if (!A) return /* @__PURE__ */ h("div", {
94
94
  className: "p-6 text-muted-foreground",
95
95
  children: "Planning session not found."
96
96
  });
97
- let k = D?.planmagnetSprintCapacity, A = {};
98
- for (let e of k?.members ?? []) A[e.actorId] = {
97
+ let j = k?.planmagnetSprintCapacity, M = {};
98
+ for (let e of j?.members ?? []) M[e.actorId] = {
99
99
  employeeName: e.employeeName,
100
100
  allocatedHours: e.allocatedHours,
101
101
  billableHours: e.billableHours,
102
102
  utilizationPercent: e.utilizationPercent
103
103
  };
104
- let j = O.workItems ?? [], M = j.reduce((e, t) => e + (t.storyPoints ?? 0), 0);
105
- j.filter((e) => e.status === "DONE").reduce((e, t) => e + (t.storyPoints ?? 0), 0);
106
- let N = O.capacity ?? M, P = N > 0 ? Math.round(M / N * 100) : 0, F = N - M, I = [...new Set(j.map((e) => e.assigneeId).filter(Boolean))];
107
- return /* @__PURE__ */ m("div", {
104
+ let N = A.workItems ?? [], P = N.reduce((e, t) => e + (t.storyPoints ?? 0), 0);
105
+ N.filter((e) => e.status === "DONE").reduce((e, t) => e + (t.storyPoints ?? 0), 0);
106
+ let F = A.capacity ?? P, I = F > 0 ? Math.round(P / F * 100) : 0, L = F - P, R = [...new Set(N.map((e) => e.assigneeId).filter(Boolean))];
107
+ return /* @__PURE__ */ g("div", {
108
108
  className: "space-y-6 p-6",
109
- children: [/* @__PURE__ */ m("div", {
109
+ children: [/* @__PURE__ */ g("div", {
110
110
  className: "flex items-center justify-between",
111
- children: [/* @__PURE__ */ m("div", { children: [
112
- /* @__PURE__ */ p("h1", {
111
+ children: [/* @__PURE__ */ g("div", { children: [
112
+ /* @__PURE__ */ h("h1", {
113
113
  className: "text-2xl font-semibold",
114
- children: O.name
114
+ children: A.name
115
115
  }),
116
- /* @__PURE__ */ p("p", {
116
+ /* @__PURE__ */ h("p", {
117
117
  className: "text-sm text-muted-foreground",
118
- children: O.project?.name ?? "Unknown project"
118
+ children: A.project?.name ?? "Unknown project"
119
119
  }),
120
- /* @__PURE__ */ p("div", {
120
+ /* @__PURE__ */ h("div", {
121
121
  className: "mt-1",
122
- children: /* @__PURE__ */ p(o, { sprint: O })
122
+ children: /* @__PURE__ */ h(c, { sprint: A })
123
123
  })
124
- ] }), /* @__PURE__ */ m("div", {
124
+ ] }), /* @__PURE__ */ g("div", {
125
125
  className: "flex items-start gap-3",
126
126
  children: [
127
- /* @__PURE__ */ p(h, {
127
+ /* @__PURE__ */ h(_, {
128
128
  className: "capitalize",
129
- children: O.status.toLowerCase().replace("_", " ")
129
+ children: A.status.toLowerCase().replace("_", " ")
130
130
  }),
131
- O.status !== "COMPLETED" && O.status !== "CANCELLED" && /* @__PURE__ */ m(g, {
131
+ A.status !== "COMPLETED" && A.status !== "CANCELLED" && /* @__PURE__ */ g(v, {
132
132
  size: "sm",
133
133
  variant: "outline",
134
- onClick: () => C(n("/projects/planning-edit-page", O.id)),
134
+ onClick: () => T(i("/projects/planning-edit-page", A.id)),
135
135
  "data-testid": "sprint-edit",
136
- children: [/* @__PURE__ */ p(l, { className: "mr-1 h-4 w-4" }), " Edit"]
136
+ children: [/* @__PURE__ */ h(d, { className: "mr-1 h-4 w-4" }), " Edit"]
137
137
  }),
138
- /* @__PURE__ */ p(i, {
139
- sprintId: O.id,
140
- sprintName: O.name,
141
- status: O.status
138
+ /* @__PURE__ */ h(o, {
139
+ sprintId: A.id,
140
+ sprintName: A.name,
141
+ status: A.status
142
142
  })
143
143
  ]
144
144
  })]
145
- }), /* @__PURE__ */ m("div", {
145
+ }), /* @__PURE__ */ g("div", {
146
146
  className: "grid grid-cols-1 lg:grid-cols-3 gap-6",
147
- children: [/* @__PURE__ */ m("div", {
147
+ children: [/* @__PURE__ */ g("div", {
148
148
  className: "lg:col-span-2 space-y-6",
149
149
  children: [
150
- /* @__PURE__ */ m(_, { children: [/* @__PURE__ */ p(y, { children: /* @__PURE__ */ p(b, { children: "Capacity Allocation" }) }), /* @__PURE__ */ m(v, {
150
+ /* @__PURE__ */ g(y, { children: [/* @__PURE__ */ h(x, { children: /* @__PURE__ */ h(S, { children: "Capacity Allocation" }) }), /* @__PURE__ */ g(b, {
151
151
  className: "space-y-4",
152
- children: [/* @__PURE__ */ m("div", {
152
+ children: [/* @__PURE__ */ g("div", {
153
153
  className: "grid grid-cols-3 gap-4 text-center",
154
154
  children: [
155
- /* @__PURE__ */ m("div", {
155
+ /* @__PURE__ */ g("div", {
156
156
  className: "p-4 bg-muted rounded-md",
157
- children: [/* @__PURE__ */ p("p", {
157
+ children: [/* @__PURE__ */ h("p", {
158
158
  className: "text-2xl font-bold",
159
- children: N
160
- }), /* @__PURE__ */ p("p", {
159
+ children: F
160
+ }), /* @__PURE__ */ h("p", {
161
161
  className: "text-xs text-muted-foreground",
162
162
  children: "Capacity"
163
163
  })]
164
164
  }),
165
- /* @__PURE__ */ m("div", {
165
+ /* @__PURE__ */ g("div", {
166
166
  className: "p-4 bg-primary/10 rounded-md",
167
- children: [/* @__PURE__ */ p("p", {
167
+ children: [/* @__PURE__ */ h("p", {
168
168
  className: "text-2xl font-bold text-primary",
169
- children: M
170
- }), /* @__PURE__ */ p("p", {
169
+ children: P
170
+ }), /* @__PURE__ */ h("p", {
171
171
  className: "text-xs text-muted-foreground",
172
172
  children: "Allocated"
173
173
  })]
174
174
  }),
175
- /* @__PURE__ */ m("div", {
175
+ /* @__PURE__ */ g("div", {
176
176
  className: "p-4 bg-muted rounded-md",
177
- children: [/* @__PURE__ */ p("p", {
177
+ children: [/* @__PURE__ */ h("p", {
178
178
  className: "text-2xl font-bold",
179
- children: F > 0 ? F : 0
180
- }), /* @__PURE__ */ p("p", {
179
+ children: L > 0 ? L : 0
180
+ }), /* @__PURE__ */ h("p", {
181
181
  className: "text-xs text-muted-foreground",
182
182
  children: "Remaining"
183
183
  })]
184
184
  })
185
185
  ]
186
- }), /* @__PURE__ */ m("div", { children: [/* @__PURE__ */ m("div", {
186
+ }), /* @__PURE__ */ g("div", { children: [/* @__PURE__ */ g("div", {
187
187
  className: "flex justify-between text-sm mb-2",
188
- children: [/* @__PURE__ */ p("span", {
188
+ children: [/* @__PURE__ */ h("span", {
189
189
  className: "text-muted-foreground",
190
190
  children: "Utilization"
191
- }), /* @__PURE__ */ m("span", {
191
+ }), /* @__PURE__ */ g("span", {
192
192
  className: "font-medium",
193
- children: [P, "%"]
193
+ children: [I, "%"]
194
194
  })]
195
- }), /* @__PURE__ */ p("div", {
195
+ }), /* @__PURE__ */ h("div", {
196
196
  className: "w-full h-4 rounded-full bg-muted overflow-hidden",
197
- children: /* @__PURE__ */ p("div", {
198
- className: `h-full rounded-full ${P > 90 ? "bg-red-400" : "bg-green-400"}`,
199
- style: { width: `${Math.min(P, 100)}%` }
197
+ children: /* @__PURE__ */ h("div", {
198
+ className: `h-full rounded-full ${I > 90 ? "bg-red-400" : "bg-green-400"}`,
199
+ style: { width: `${Math.min(I, 100)}%` }
200
200
  })
201
201
  })] })]
202
202
  })] }),
203
- /* @__PURE__ */ m(_, { children: [/* @__PURE__ */ p(y, { children: /* @__PURE__ */ p(b, { children: "Work Items" }) }), /* @__PURE__ */ p(v, { children: /* @__PURE__ */ p(a, {
204
- sprintId: O.id,
205
- projectId: O.projectId,
206
- status: O.status,
207
- items: j
203
+ /* @__PURE__ */ g(y, { children: [/* @__PURE__ */ h(x, { children: /* @__PURE__ */ h(S, { children: "Work Items" }) }), /* @__PURE__ */ h(b, { children: /* @__PURE__ */ h(s, {
204
+ sprintId: A.id,
205
+ projectId: A.projectId,
206
+ status: A.status,
207
+ items: N
208
208
  }) })] }),
209
- /* @__PURE__ */ m(_, { children: [/* @__PURE__ */ p(y, { children: /* @__PURE__ */ m(b, { children: [
209
+ /* @__PURE__ */ g(y, { children: [/* @__PURE__ */ h(x, { children: /* @__PURE__ */ g(S, { children: [
210
210
  "Team Members (",
211
- I.length,
211
+ R.length,
212
212
  ")"
213
- ] }) }), /* @__PURE__ */ m(v, { children: [
214
- /* @__PURE__ */ m("div", {
213
+ ] }) }), /* @__PURE__ */ g(b, { children: [
214
+ /* @__PURE__ */ g("div", {
215
215
  className: "grid grid-cols-2 gap-3",
216
- children: [I.map((e) => {
217
- let n = A[e];
218
- return /* @__PURE__ */ m("div", {
216
+ children: [R.map((e) => {
217
+ let i = M[e];
218
+ return /* @__PURE__ */ g("div", {
219
219
  className: "flex items-center gap-2 border rounded-md p-2.5",
220
- children: [/* @__PURE__ */ p("div", {
220
+ children: [i?.employeeName ? /* @__PURE__ */ h("span", {
221
221
  className: "h-8 w-8 rounded-full bg-primary/10 flex items-center justify-center text-xs font-medium text-primary",
222
- children: e.slice(0, 2).toUpperCase()
223
- }), /* @__PURE__ */ m("div", {
222
+ title: i.employeeName,
223
+ children: r(i.employeeName) || "?"
224
+ }) : /* @__PURE__ */ h(t, {
225
+ id: e,
226
+ className: "h-8 w-8 rounded-full bg-primary/10 flex items-center justify-center text-xs font-medium text-primary"
227
+ }), /* @__PURE__ */ g("div", {
224
228
  className: "min-w-0",
225
- children: [/* @__PURE__ */ p("span", {
229
+ children: [/* @__PURE__ */ h("span", {
226
230
  className: "text-sm truncate block",
227
- children: n?.employeeName ?? /* @__PURE__ */ p(t, { id: e })
228
- }), n && /* @__PURE__ */ m("span", {
231
+ children: i?.employeeName ?? /* @__PURE__ */ h(n, { id: e })
232
+ }), i && /* @__PURE__ */ g("span", {
229
233
  className: "text-xs text-muted-foreground",
230
234
  children: [
231
- n.allocatedHours,
235
+ i.allocatedHours,
232
236
  "h allocated (",
233
- n.billableHours,
237
+ i.billableHours,
234
238
  "h billable)",
235
- n.utilizationPercent != null && ` · ${n.utilizationPercent}% util`
239
+ i.utilizationPercent != null && ` · ${i.utilizationPercent}% util`
236
240
  ]
237
241
  })]
238
242
  })]
239
243
  }, e);
240
- }), I.length === 0 && /* @__PURE__ */ p("p", {
244
+ }), R.length === 0 && /* @__PURE__ */ h("p", {
241
245
  className: "text-sm text-muted-foreground col-span-2 text-center py-4",
242
246
  children: "No team members assigned."
243
247
  })]
244
248
  }),
245
- k?.crewfoundryUnavailable && I.length > 0 && /* @__PURE__ */ p("p", {
249
+ j?.crewfoundryUnavailable && R.length > 0 && /* @__PURE__ */ h("p", {
246
250
  className: "text-xs text-muted-foreground mt-3 border-t pt-3",
247
251
  children: "Workforce allocation from CrewFoundry is unavailable for this workspace — no CrewFoundry module provisioned yet."
248
252
  }),
249
- !k?.crewfoundryUnavailable && (k?.unmatchedAssigneeIds?.length ?? 0) > 0 && /* @__PURE__ */ m("p", {
253
+ !j?.crewfoundryUnavailable && (j?.unmatchedAssigneeIds?.length ?? 0) > 0 && /* @__PURE__ */ g("p", {
250
254
  className: "text-xs text-muted-foreground mt-3 border-t pt-3",
251
- children: [k.unmatchedAssigneeIds.length, " assignee(s) have no matching CrewFoundry employee record — allocation hours shown only for matched employees."]
255
+ children: [j.unmatchedAssigneeIds.length, " assignee(s) have no matching CrewFoundry employee record — allocation hours shown only for matched employees."]
252
256
  })
253
257
  ] })] })
254
258
  ]
255
- }), /* @__PURE__ */ m(_, { children: [/* @__PURE__ */ p(y, { children: /* @__PURE__ */ p(b, { children: "Session Info" }) }), /* @__PURE__ */ m(v, {
259
+ }), /* @__PURE__ */ g(y, { children: [/* @__PURE__ */ h(x, { children: /* @__PURE__ */ h(S, { children: "Session Info" }) }), /* @__PURE__ */ g(b, {
256
260
  className: "space-y-3 text-sm",
257
261
  children: [
258
- /* @__PURE__ */ m("div", {
262
+ /* @__PURE__ */ g("div", {
259
263
  className: "flex items-center gap-2",
260
264
  children: [
261
- /* @__PURE__ */ p(c, { className: "h-4 w-4 text-muted-foreground" }),
262
- /* @__PURE__ */ p("span", {
265
+ /* @__PURE__ */ h(u, { className: "h-4 w-4 text-muted-foreground" }),
266
+ /* @__PURE__ */ h("span", {
263
267
  className: "text-muted-foreground",
264
268
  children: "Project:"
265
269
  }),
266
- /* @__PURE__ */ p("span", {
270
+ /* @__PURE__ */ h("span", {
267
271
  className: "font-medium",
268
- children: O.project?.name ?? "Unknown project"
272
+ children: A.project?.name ?? "Unknown project"
269
273
  })
270
274
  ]
271
275
  }),
272
- /* @__PURE__ */ m("div", {
276
+ /* @__PURE__ */ g("div", {
273
277
  className: "flex items-center gap-2",
274
278
  children: [
275
- /* @__PURE__ */ p(u, { className: "h-4 w-4 text-muted-foreground" }),
276
- /* @__PURE__ */ p("span", {
279
+ /* @__PURE__ */ h(f, { className: "h-4 w-4 text-muted-foreground" }),
280
+ /* @__PURE__ */ h("span", {
277
281
  className: "text-muted-foreground",
278
282
  children: "Assignees:"
279
283
  }),
280
- /* @__PURE__ */ p("span", {
284
+ /* @__PURE__ */ h("span", {
281
285
  className: "font-medium",
282
- children: I.length
286
+ children: R.length
283
287
  })
284
288
  ]
285
289
  }),
286
- /* @__PURE__ */ m("div", {
290
+ /* @__PURE__ */ g("div", {
287
291
  className: "flex items-center gap-2",
288
292
  children: [
289
- /* @__PURE__ */ p(s, { className: "h-4 w-4 text-muted-foreground" }),
290
- /* @__PURE__ */ p("span", {
293
+ /* @__PURE__ */ h(l, { className: "h-4 w-4 text-muted-foreground" }),
294
+ /* @__PURE__ */ h("span", {
291
295
  className: "text-muted-foreground",
292
296
  children: "Capacity:"
293
297
  }),
294
- /* @__PURE__ */ m("span", {
298
+ /* @__PURE__ */ g("span", {
295
299
  className: "font-medium",
296
- children: [N, " pts"]
300
+ children: [F, " pts"]
297
301
  })
298
302
  ]
299
303
  }),
300
- O.velocity != null && /* @__PURE__ */ m("div", {
304
+ A.velocity != null && /* @__PURE__ */ g("div", {
301
305
  className: "flex items-center gap-2",
302
306
  children: [
303
- /* @__PURE__ */ p(s, { className: "h-4 w-4 text-muted-foreground" }),
304
- /* @__PURE__ */ p("span", {
307
+ /* @__PURE__ */ h(l, { className: "h-4 w-4 text-muted-foreground" }),
308
+ /* @__PURE__ */ h("span", {
305
309
  className: "text-muted-foreground",
306
310
  children: "Velocity:"
307
311
  }),
308
- /* @__PURE__ */ m("span", {
312
+ /* @__PURE__ */ g("span", {
309
313
  className: "font-medium",
310
- children: [O.velocity, " pts"]
314
+ children: [A.velocity, " pts"]
311
315
  })
312
316
  ]
313
317
  }),
314
- O.goal && /* @__PURE__ */ m("div", {
318
+ A.goal && /* @__PURE__ */ g("div", {
315
319
  className: "border-t pt-3 mt-3",
316
- children: [/* @__PURE__ */ p("p", {
320
+ children: [/* @__PURE__ */ h("p", {
317
321
  className: "text-muted-foreground text-xs mb-1",
318
322
  children: "Goal"
319
- }), /* @__PURE__ */ p("p", {
323
+ }), /* @__PURE__ */ h("p", {
320
324
  className: "text-sm",
321
- children: O.goal
325
+ children: A.goal
322
326
  })]
323
327
  })
324
328
  ]
@@ -327,6 +331,6 @@ function C() {
327
331
  });
328
332
  }
329
333
  //#endregion
330
- export { C as ProjectsPlanningDetailPagePage };
334
+ export { T as ProjectsPlanningDetailPagePage };
331
335
 
332
336
  //# sourceMappingURL=ProjectsPlanningDetailPagePage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ProjectsPlanningDetailPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/ProjectsPlanningDetailPagePage.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, Button } from '@burdenoff/fe-libs/ui';\nimport { Users, BarChart3, FolderKanban, Pencil } from 'lucide-react';\nimport { useEntityId } from '../hooks/useEntityId';\nimport { usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\nimport { detailPath } from '../utils/rowNavigation';\nimport { PersonName } from '../people/People';\nimport { SprintLifecycleActions, SprintWorkItemsPanel } from '../sprints/SprintControls';\nimport { SprintDates } from '../sprints/SprintDates';\n\nconst GET_SPRINT_DETAIL = gql`\n query GetSprintDetail($id: ID!) {\n planmagnetSprint(id: $id) {\n id\n name\n projectId\n project {\n id\n name\n }\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 goal\n capacity\n velocity\n workItems {\n id\n key\n title\n status\n storyPoints\n assigneeId\n priority\n }\n }\n }\n`;\n\n// Real cross-layer CrewFoundry workforce capacity (BOFF-4444). Fails open on\n// the backend — an unreachable/unprovisioned CrewFoundry never blocks this\n// page, it just yields crewfoundryUnavailable: true, handled below.\nconst GET_SPRINT_CAPACITY = gql`\n query GetSprintCapacity($sprintId: ID!) {\n planmagnetSprintCapacity(sprintId: $sprintId) {\n sprintId\n crewfoundryUnavailable\n unmatchedAssigneeIds\n members {\n actorId\n employeeName\n department\n position\n allocatedHours\n billableHours\n utilizationPercent\n assignedStoryPoints\n assignedWorkItemCount\n }\n }\n }\n`;\n\nexport function ProjectsPlanningDetailPagePage() {\n const sprintId = useEntityId('sprintId');\n const navigate = usePlanMagnetNavigate();\n\n const {\n data,\n loading,\n error,\n } = // eslint-disable-next-line @typescript-eslint/no-explicit-any\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n useQuery<Record<string, any>>(GET_SPRINT_DETAIL, {\n variables: { id: sprintId },\n skip: !sprintId,\n });\n\n // Real cross-layer CrewFoundry capacity (BOFF-4444) — called unconditionally\n // (with `skip`) to keep hook order stable across the loading/error/loaded\n // renders above.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const { data: capacityData } = useQuery<Record<string, any>>(GET_SPRINT_CAPACITY, {\n variables: { sprintId },\n skip: !sprintId,\n });\n\n if (!sprintId)\n return (\n <div className=\"p-6 text-muted-foreground\">\n No planning session selected. Open one from the list.\n </div>\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 (loading && !data)\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 if (error)\n return <div className=\"p-6 text-red-500\">Error loading planning session: {error.message}</div>;\n\n const sprint = data?.planmagnetSprint;\n if (!sprint) return <div className=\"p-6 text-muted-foreground\">Planning session not found.</div>;\n\n const capacity = capacityData?.planmagnetSprintCapacity;\n const allocationByAssignee: Record<\n string,\n {\n employeeName: string;\n allocatedHours: number;\n billableHours: number;\n utilizationPercent: number | null;\n }\n > = {};\n for (const member of capacity?.members ?? []) {\n allocationByAssignee[member.actorId] = {\n employeeName: member.employeeName,\n allocatedHours: member.allocatedHours,\n billableHours: member.billableHours,\n utilizationPercent: member.utilizationPercent,\n };\n }\n\n const workItems = sprint.workItems ?? [];\n const totalPoints = workItems.reduce(\n (sum: number, wi: { storyPoints: number | null }) => sum + (wi.storyPoints ?? 0),\n 0\n );\n const completedPoints = workItems\n .filter((wi: { status: string }) => wi.status === 'DONE')\n .reduce((sum: number, wi: { storyPoints: number | null }) => sum + (wi.storyPoints ?? 0), 0);\n const allocatedCapacity = sprint.capacity ?? totalPoints;\n const capPct = allocatedCapacity > 0 ? Math.round((totalPoints / allocatedCapacity) * 100) : 0;\n const remaining = allocatedCapacity - totalPoints;\n\n // Derive unique assignees from work items\n const uniqueAssignees = [\n ...new Set(\n workItems\n .map((wi: { assigneeId: string | null }) => wi.assigneeId)\n .filter(Boolean) as string[]\n ),\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.name}</h1>\n <p className=\"text-sm text-muted-foreground\">\n {sprint.project?.name ?? 'Unknown project'}\n </p>\n <div className=\"mt-1\">\n <SprintDates sprint={sprint} />\n </div>\n </div>\n <div className=\"flex items-start gap-3\">\n <Badge className=\"capitalize\">{sprint.status.toLowerCase().replace('_', ' ')}</Badge>\n {/* The edit page existed but nothing linked to it, so a sprint's\n name, planned dates, goal and capacity could not be changed from\n the UI (BOFF-7954). Finished sprints are not edited here. */}\n {sprint.status !== 'COMPLETED' && sprint.status !== 'CANCELLED' && (\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => navigate(detailPath('/projects/planning-edit-page', sprint.id))}\n data-testid=\"sprint-edit\"\n >\n <Pencil className=\"mr-1 h-4 w-4\" /> Edit\n </Button>\n )}\n <SprintLifecycleActions\n sprintId={sprint.id}\n sprintName={sprint.name}\n status={sprint.status}\n />\n </div>\n </div>\n <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-6\">\n <div className=\"lg:col-span-2 space-y-6\">\n <Card>\n <CardHeader>\n <CardTitle>Capacity Allocation</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"grid grid-cols-3 gap-4 text-center\">\n <div className=\"p-4 bg-muted rounded-md\">\n <p className=\"text-2xl font-bold\">{allocatedCapacity}</p>\n <p className=\"text-xs text-muted-foreground\">Capacity</p>\n </div>\n <div className=\"p-4 bg-primary/10 rounded-md\">\n <p className=\"text-2xl font-bold text-primary\">{totalPoints}</p>\n <p className=\"text-xs text-muted-foreground\">Allocated</p>\n </div>\n <div className=\"p-4 bg-muted rounded-md\">\n <p className=\"text-2xl font-bold\">{remaining > 0 ? remaining : 0}</p>\n <p className=\"text-xs text-muted-foreground\">Remaining</p>\n </div>\n </div>\n <div>\n <div className=\"flex justify-between text-sm mb-2\">\n <span className=\"text-muted-foreground\">Utilization</span>\n <span className=\"font-medium\">{capPct}%</span>\n </div>\n <div className=\"w-full h-4 rounded-full bg-muted overflow-hidden\">\n <div\n className={`h-full rounded-full ${capPct > 90 ? 'bg-red-400' : 'bg-green-400'}`}\n style={{ width: `${Math.min(capPct, 100)}%` }}\n />\n </div>\n </div>\n </CardContent>\n </Card>\n <Card>\n <CardHeader>\n <CardTitle>Work Items</CardTitle>\n </CardHeader>\n <CardContent>\n <SprintWorkItemsPanel\n sprintId={sprint.id}\n projectId={sprint.projectId}\n status={sprint.status}\n items={workItems}\n />\n </CardContent>\n </Card>\n <Card>\n <CardHeader>\n <CardTitle>Team Members ({uniqueAssignees.length})</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-2 gap-3\">\n {uniqueAssignees.map((assigneeId: string) => {\n const workforce = allocationByAssignee[assigneeId];\n return (\n <div\n key={assigneeId}\n className=\"flex items-center gap-2 border rounded-md p-2.5\"\n >\n <div className=\"h-8 w-8 rounded-full bg-primary/10 flex items-center justify-center text-xs font-medium text-primary\">\n {assigneeId.slice(0, 2).toUpperCase()}\n </div>\n <div className=\"min-w-0\">\n <span className=\"text-sm truncate block\">\n {workforce?.employeeName ?? <PersonName id={assigneeId} />}\n </span>\n {workforce && (\n <span className=\"text-xs text-muted-foreground\">\n {workforce.allocatedHours}h allocated ({workforce.billableHours}h\n billable)\n {workforce.utilizationPercent != null &&\n ` · ${workforce.utilizationPercent}% util`}\n </span>\n )}\n </div>\n </div>\n );\n })}\n {uniqueAssignees.length === 0 && (\n <p className=\"text-sm text-muted-foreground col-span-2 text-center py-4\">\n No team members assigned.\n </p>\n )}\n </div>\n {/* Real cross-layer CrewFoundry workforce allocation (BOFF-4444). */}\n {capacity?.crewfoundryUnavailable && uniqueAssignees.length > 0 && (\n <p className=\"text-xs text-muted-foreground mt-3 border-t pt-3\">\n Workforce allocation from CrewFoundry is unavailable for this workspace — no\n CrewFoundry module provisioned yet.\n </p>\n )}\n {!capacity?.crewfoundryUnavailable &&\n (capacity?.unmatchedAssigneeIds?.length ?? 0) > 0 && (\n <p className=\"text-xs text-muted-foreground mt-3 border-t pt-3\">\n {capacity.unmatchedAssigneeIds.length} assignee(s) have no matching CrewFoundry\n employee record — allocation hours shown only for matched employees.\n </p>\n )}\n </CardContent>\n </Card>\n </div>\n <Card>\n <CardHeader>\n <CardTitle>Session Info</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3 text-sm\">\n <div className=\"flex items-center gap-2\">\n <FolderKanban className=\"h-4 w-4 text-muted-foreground\" />\n <span className=\"text-muted-foreground\">Project:</span>\n <span className=\"font-medium\">{sprint.project?.name ?? 'Unknown project'}</span>\n </div>\n <div className=\"flex items-center gap-2\">\n <Users className=\"h-4 w-4 text-muted-foreground\" />\n <span className=\"text-muted-foreground\">Assignees:</span>\n <span className=\"font-medium\">{uniqueAssignees.length}</span>\n </div>\n <div className=\"flex items-center gap-2\">\n <BarChart3 className=\"h-4 w-4 text-muted-foreground\" />\n <span className=\"text-muted-foreground\">Capacity:</span>\n <span className=\"font-medium\">{allocatedCapacity} pts</span>\n </div>\n {sprint.velocity != null && (\n <div className=\"flex items-center gap-2\">\n <BarChart3 className=\"h-4 w-4 text-muted-foreground\" />\n <span className=\"text-muted-foreground\">Velocity:</span>\n <span className=\"font-medium\">{sprint.velocity} pts</span>\n </div>\n )}\n {sprint.goal && (\n <div className=\"border-t pt-3 mt-3\">\n <p className=\"text-muted-foreground text-xs mb-1\">Goal</p>\n <p className=\"text-sm\">{sprint.goal}</p>\n </div>\n )}\n </CardContent>\n </Card>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ProjectsPlanningDetailPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/ProjectsPlanningDetailPagePage.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, Button } from '@burdenoff/fe-libs/ui';\nimport { Users, BarChart3, FolderKanban, Pencil } from 'lucide-react';\nimport { useEntityId } from '../hooks/useEntityId';\nimport { usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\nimport { detailPath } from '../utils/rowNavigation';\nimport { PersonAvatar, PersonName, initialsOf } from '../people/People';\nimport { SprintLifecycleActions, SprintWorkItemsPanel } from '../sprints/SprintControls';\nimport { SprintDates } from '../sprints/SprintDates';\n\nconst GET_SPRINT_DETAIL = gql`\n query GetSprintDetail($id: ID!) {\n planmagnetSprint(id: $id) {\n id\n name\n projectId\n project {\n id\n name\n }\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 goal\n capacity\n velocity\n workItems {\n id\n key\n title\n status\n storyPoints\n assigneeId\n priority\n }\n }\n }\n`;\n\n// Real cross-layer CrewFoundry workforce capacity (BOFF-4444). Fails open on\n// the backend — an unreachable/unprovisioned CrewFoundry never blocks this\n// page, it just yields crewfoundryUnavailable: true, handled below.\nconst GET_SPRINT_CAPACITY = gql`\n query GetSprintCapacity($sprintId: ID!) {\n planmagnetSprintCapacity(sprintId: $sprintId) {\n sprintId\n crewfoundryUnavailable\n unmatchedAssigneeIds\n members {\n actorId\n employeeName\n department\n position\n allocatedHours\n billableHours\n utilizationPercent\n assignedStoryPoints\n assignedWorkItemCount\n }\n }\n }\n`;\n\nexport function ProjectsPlanningDetailPagePage() {\n const sprintId = useEntityId('sprintId');\n const navigate = usePlanMagnetNavigate();\n\n const {\n data,\n loading,\n error,\n } = // eslint-disable-next-line @typescript-eslint/no-explicit-any\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n useQuery<Record<string, any>>(GET_SPRINT_DETAIL, {\n variables: { id: sprintId },\n skip: !sprintId,\n });\n\n // Real cross-layer CrewFoundry capacity (BOFF-4444) — called unconditionally\n // (with `skip`) to keep hook order stable across the loading/error/loaded\n // renders above.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const { data: capacityData } = useQuery<Record<string, any>>(GET_SPRINT_CAPACITY, {\n variables: { sprintId },\n skip: !sprintId,\n });\n\n if (!sprintId)\n return (\n <div className=\"p-6 text-muted-foreground\">\n No planning session selected. Open one from the list.\n </div>\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 (loading && !data)\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 if (error)\n return <div className=\"p-6 text-red-500\">Error loading planning session: {error.message}</div>;\n\n const sprint = data?.planmagnetSprint;\n if (!sprint) return <div className=\"p-6 text-muted-foreground\">Planning session not found.</div>;\n\n const capacity = capacityData?.planmagnetSprintCapacity;\n const allocationByAssignee: Record<\n string,\n {\n employeeName: string;\n allocatedHours: number;\n billableHours: number;\n utilizationPercent: number | null;\n }\n > = {};\n for (const member of capacity?.members ?? []) {\n allocationByAssignee[member.actorId] = {\n employeeName: member.employeeName,\n allocatedHours: member.allocatedHours,\n billableHours: member.billableHours,\n utilizationPercent: member.utilizationPercent,\n };\n }\n\n const workItems = sprint.workItems ?? [];\n const totalPoints = workItems.reduce(\n (sum: number, wi: { storyPoints: number | null }) => sum + (wi.storyPoints ?? 0),\n 0\n );\n const completedPoints = workItems\n .filter((wi: { status: string }) => wi.status === 'DONE')\n .reduce((sum: number, wi: { storyPoints: number | null }) => sum + (wi.storyPoints ?? 0), 0);\n const allocatedCapacity = sprint.capacity ?? totalPoints;\n const capPct = allocatedCapacity > 0 ? Math.round((totalPoints / allocatedCapacity) * 100) : 0;\n const remaining = allocatedCapacity - totalPoints;\n\n // Derive unique assignees from work items\n const uniqueAssignees = [\n ...new Set(\n workItems\n .map((wi: { assigneeId: string | null }) => wi.assigneeId)\n .filter(Boolean) as string[]\n ),\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.name}</h1>\n <p className=\"text-sm text-muted-foreground\">\n {sprint.project?.name ?? 'Unknown project'}\n </p>\n <div className=\"mt-1\">\n <SprintDates sprint={sprint} />\n </div>\n </div>\n <div className=\"flex items-start gap-3\">\n <Badge className=\"capitalize\">{sprint.status.toLowerCase().replace('_', ' ')}</Badge>\n {/* The edit page existed but nothing linked to it, so a sprint's\n name, planned dates, goal and capacity could not be changed from\n the UI (BOFF-7954). Finished sprints are not edited here. */}\n {sprint.status !== 'COMPLETED' && sprint.status !== 'CANCELLED' && (\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => navigate(detailPath('/projects/planning-edit-page', sprint.id))}\n data-testid=\"sprint-edit\"\n >\n <Pencil className=\"mr-1 h-4 w-4\" /> Edit\n </Button>\n )}\n <SprintLifecycleActions\n sprintId={sprint.id}\n sprintName={sprint.name}\n status={sprint.status}\n />\n </div>\n </div>\n <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-6\">\n <div className=\"lg:col-span-2 space-y-6\">\n <Card>\n <CardHeader>\n <CardTitle>Capacity Allocation</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"grid grid-cols-3 gap-4 text-center\">\n <div className=\"p-4 bg-muted rounded-md\">\n <p className=\"text-2xl font-bold\">{allocatedCapacity}</p>\n <p className=\"text-xs text-muted-foreground\">Capacity</p>\n </div>\n <div className=\"p-4 bg-primary/10 rounded-md\">\n <p className=\"text-2xl font-bold text-primary\">{totalPoints}</p>\n <p className=\"text-xs text-muted-foreground\">Allocated</p>\n </div>\n <div className=\"p-4 bg-muted rounded-md\">\n <p className=\"text-2xl font-bold\">{remaining > 0 ? remaining : 0}</p>\n <p className=\"text-xs text-muted-foreground\">Remaining</p>\n </div>\n </div>\n <div>\n <div className=\"flex justify-between text-sm mb-2\">\n <span className=\"text-muted-foreground\">Utilization</span>\n <span className=\"font-medium\">{capPct}%</span>\n </div>\n <div className=\"w-full h-4 rounded-full bg-muted overflow-hidden\">\n <div\n className={`h-full rounded-full ${capPct > 90 ? 'bg-red-400' : 'bg-green-400'}`}\n style={{ width: `${Math.min(capPct, 100)}%` }}\n />\n </div>\n </div>\n </CardContent>\n </Card>\n <Card>\n <CardHeader>\n <CardTitle>Work Items</CardTitle>\n </CardHeader>\n <CardContent>\n <SprintWorkItemsPanel\n sprintId={sprint.id}\n projectId={sprint.projectId}\n status={sprint.status}\n items={workItems}\n />\n </CardContent>\n </Card>\n <Card>\n <CardHeader>\n <CardTitle>Team Members ({uniqueAssignees.length})</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-2 gap-3\">\n {uniqueAssignees.map((assigneeId: string) => {\n const workforce = allocationByAssignee[assigneeId];\n return (\n <div\n key={assigneeId}\n className=\"flex items-center gap-2 border rounded-md p-2.5\"\n >\n {/* Initials from the name shown next to them, not from the UUID (BOFF-8000). */}\n {workforce?.employeeName ? (\n <span\n className=\"h-8 w-8 rounded-full bg-primary/10 flex items-center justify-center text-xs font-medium text-primary\"\n title={workforce.employeeName}\n >\n {initialsOf(workforce.employeeName) || '?'}\n </span>\n ) : (\n <PersonAvatar\n id={assigneeId}\n className=\"h-8 w-8 rounded-full bg-primary/10 flex items-center justify-center text-xs font-medium text-primary\"\n />\n )}\n <div className=\"min-w-0\">\n <span className=\"text-sm truncate block\">\n {workforce?.employeeName ?? <PersonName id={assigneeId} />}\n </span>\n {workforce && (\n <span className=\"text-xs text-muted-foreground\">\n {workforce.allocatedHours}h allocated ({workforce.billableHours}h\n billable)\n {workforce.utilizationPercent != null &&\n ` · ${workforce.utilizationPercent}% util`}\n </span>\n )}\n </div>\n </div>\n );\n })}\n {uniqueAssignees.length === 0 && (\n <p className=\"text-sm text-muted-foreground col-span-2 text-center py-4\">\n No team members assigned.\n </p>\n )}\n </div>\n {/* Real cross-layer CrewFoundry workforce allocation (BOFF-4444). */}\n {capacity?.crewfoundryUnavailable && uniqueAssignees.length > 0 && (\n <p className=\"text-xs text-muted-foreground mt-3 border-t pt-3\">\n Workforce allocation from CrewFoundry is unavailable for this workspace — no\n CrewFoundry module provisioned yet.\n </p>\n )}\n {!capacity?.crewfoundryUnavailable &&\n (capacity?.unmatchedAssigneeIds?.length ?? 0) > 0 && (\n <p className=\"text-xs text-muted-foreground mt-3 border-t pt-3\">\n {capacity.unmatchedAssigneeIds.length} assignee(s) have no matching CrewFoundry\n employee record — allocation hours shown only for matched employees.\n </p>\n )}\n </CardContent>\n </Card>\n </div>\n <Card>\n <CardHeader>\n <CardTitle>Session Info</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3 text-sm\">\n <div className=\"flex items-center gap-2\">\n <FolderKanban className=\"h-4 w-4 text-muted-foreground\" />\n <span className=\"text-muted-foreground\">Project:</span>\n <span className=\"font-medium\">{sprint.project?.name ?? 'Unknown project'}</span>\n </div>\n <div className=\"flex items-center gap-2\">\n <Users className=\"h-4 w-4 text-muted-foreground\" />\n <span className=\"text-muted-foreground\">Assignees:</span>\n <span className=\"font-medium\">{uniqueAssignees.length}</span>\n </div>\n <div className=\"flex items-center gap-2\">\n <BarChart3 className=\"h-4 w-4 text-muted-foreground\" />\n <span className=\"text-muted-foreground\">Capacity:</span>\n <span className=\"font-medium\">{allocatedCapacity} pts</span>\n </div>\n {sprint.velocity != null && (\n <div className=\"flex items-center gap-2\">\n <BarChart3 className=\"h-4 w-4 text-muted-foreground\" />\n <span className=\"text-muted-foreground\">Velocity:</span>\n <span className=\"font-medium\">{sprint.velocity} pts</span>\n </div>\n )}\n {sprint.goal && (\n <div className=\"border-t pt-3 mt-3\">\n <p className=\"text-muted-foreground text-xs mb-1\">Goal</p>\n <p className=\"text-sm\">{sprint.goal}</p>\n </div>\n )}\n </CardContent>\n </Card>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ProjectsPlanningEditPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/ProjectsPlanningEditPagePage.tsx"],"names":[],"mappings":"AAgDA,wBAAgB,4BAA4B,4CAwP3C"}
1
+ {"version":3,"file":"ProjectsPlanningEditPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/ProjectsPlanningEditPagePage.tsx"],"names":[],"mappings":"AAiDA,wBAAgB,4BAA4B,4CA8P3C"}