@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,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
|
|
5
|
-
import { enumLabel as
|
|
6
|
-
import { ROW_LINK_CLASS as
|
|
7
|
-
import { NewRiskDialog as
|
|
8
|
-
import { ProjectHeaderActions as
|
|
9
|
-
import { ProjectBudgetsSummary as
|
|
10
|
-
import { Bot as
|
|
11
|
-
import { gql as
|
|
12
|
-
import { useQuery as
|
|
13
|
-
import { jsx as
|
|
14
|
-
import { Badge as
|
|
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
|
|
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
|
-
`,
|
|
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
|
-
},
|
|
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
|
-
},
|
|
102
|
+
}, P = new Set([
|
|
94
103
|
"IDENTIFIED",
|
|
95
104
|
"ANALYZING",
|
|
96
105
|
"MITIGATING",
|
|
97
106
|
"ACCEPTED"
|
|
98
107
|
]);
|
|
99
|
-
function
|
|
100
|
-
let
|
|
101
|
-
variables: { id:
|
|
102
|
-
skip: !
|
|
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 (!
|
|
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 (
|
|
117
|
+
if (R && !L) return /* @__PURE__ */ C("div", {
|
|
109
118
|
className: "flex items-center justify-center p-12",
|
|
110
|
-
children: /* @__PURE__ */
|
|
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 (
|
|
121
|
+
if (z) return /* @__PURE__ */ w("div", {
|
|
113
122
|
className: "p-6 text-red-500",
|
|
114
|
-
children: ["Error loading project: ",
|
|
123
|
+
children: ["Error loading project: ", z.message]
|
|
115
124
|
});
|
|
116
|
-
let
|
|
117
|
-
if (!
|
|
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
|
|
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
|
-
}))),
|
|
125
|
-
|
|
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__ */
|
|
151
|
+
/* @__PURE__ */ w("div", {
|
|
129
152
|
className: "flex items-center justify-between",
|
|
130
|
-
children: [/* @__PURE__ */
|
|
153
|
+
children: [/* @__PURE__ */ w("div", { children: [/* @__PURE__ */ w("div", {
|
|
131
154
|
className: "flex items-center gap-2",
|
|
132
155
|
children: [
|
|
133
|
-
/* @__PURE__ */
|
|
134
|
-
/* @__PURE__ */
|
|
156
|
+
/* @__PURE__ */ C(h, { className: "h-5 w-5 text-primary" }),
|
|
157
|
+
/* @__PURE__ */ C("h1", {
|
|
135
158
|
className: "text-2xl font-semibold",
|
|
136
|
-
children:
|
|
159
|
+
children: B.name
|
|
137
160
|
}),
|
|
138
|
-
/* @__PURE__ */
|
|
139
|
-
className: `text-xs px-2 py-0.5 rounded-full capitalize ${
|
|
140
|
-
children:
|
|
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__ */
|
|
166
|
+
}), /* @__PURE__ */ C("p", {
|
|
144
167
|
className: "text-sm text-muted-foreground mt-1",
|
|
145
|
-
children:
|
|
146
|
-
})] }), /* @__PURE__ */
|
|
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__ */
|
|
150
|
-
projectId:
|
|
151
|
-
name:
|
|
152
|
-
status:
|
|
172
|
+
/* @__PURE__ */ C(u, {
|
|
173
|
+
projectId: B.id,
|
|
174
|
+
name: B.name,
|
|
175
|
+
status: B.status
|
|
153
176
|
}),
|
|
154
|
-
/* @__PURE__ */
|
|
177
|
+
/* @__PURE__ */ w("div", {
|
|
155
178
|
className: "flex items-center gap-2",
|
|
156
|
-
children: [/* @__PURE__ */
|
|
179
|
+
children: [/* @__PURE__ */ w(E, {
|
|
157
180
|
size: "sm",
|
|
158
181
|
variant: "outline",
|
|
159
|
-
onClick: () =>
|
|
182
|
+
onClick: () => F("/automation/automation-rules-page"),
|
|
160
183
|
"data-testid": "project-automation-rules",
|
|
161
|
-
children: [/* @__PURE__ */
|
|
162
|
-
}), /* @__PURE__ */
|
|
163
|
-
projectId:
|
|
164
|
-
projectName:
|
|
165
|
-
onCreated: (e) =>
|
|
166
|
-
trigger: /* @__PURE__ */
|
|
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__ */
|
|
193
|
+
children: [/* @__PURE__ */ C(g, { className: "mr-1 h-4 w-4" }), "Save as template"]
|
|
171
194
|
})
|
|
172
195
|
})]
|
|
173
196
|
}),
|
|
174
|
-
/* @__PURE__ */
|
|
197
|
+
/* @__PURE__ */ C(T, {
|
|
175
198
|
variant: "outline",
|
|
176
199
|
className: "capitalize",
|
|
177
|
-
children:
|
|
200
|
+
children: B.methodology.toLowerCase()
|
|
178
201
|
}),
|
|
179
|
-
/* @__PURE__ */
|
|
202
|
+
/* @__PURE__ */ w(E, {
|
|
180
203
|
size: "sm",
|
|
181
204
|
variant: "outline",
|
|
182
|
-
onClick: () =>
|
|
183
|
-
children: [/* @__PURE__ */
|
|
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__ */
|
|
211
|
+
/* @__PURE__ */ w("div", {
|
|
189
212
|
className: "grid grid-cols-2 md:grid-cols-4 gap-4",
|
|
190
213
|
children: [
|
|
191
|
-
/* @__PURE__ */
|
|
214
|
+
/* @__PURE__ */ C(D, { children: /* @__PURE__ */ w(O, {
|
|
192
215
|
className: "pt-4",
|
|
193
|
-
children: [/* @__PURE__ */
|
|
216
|
+
children: [/* @__PURE__ */ w("div", {
|
|
194
217
|
className: "flex items-center gap-2 text-muted-foreground text-xs",
|
|
195
|
-
children: [/* @__PURE__ */
|
|
196
|
-
}), /* @__PURE__ */
|
|
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
|
-
|
|
222
|
+
Z,
|
|
200
223
|
"/",
|
|
201
|
-
|
|
224
|
+
X.length
|
|
202
225
|
]
|
|
203
226
|
})]
|
|
204
227
|
}) }),
|
|
205
|
-
/* @__PURE__ */
|
|
228
|
+
/* @__PURE__ */ C(D, { children: /* @__PURE__ */ w(O, {
|
|
206
229
|
className: "pt-4",
|
|
207
|
-
children: [/* @__PURE__ */
|
|
230
|
+
children: [/* @__PURE__ */ w("div", {
|
|
208
231
|
className: "flex items-center gap-2 text-muted-foreground text-xs",
|
|
209
|
-
children: [/* @__PURE__ */
|
|
210
|
-
}), /* @__PURE__ */
|
|
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:
|
|
235
|
+
children: H.length
|
|
213
236
|
})]
|
|
214
237
|
}) }),
|
|
215
|
-
/* @__PURE__ */
|
|
238
|
+
/* @__PURE__ */ C(D, { children: /* @__PURE__ */ w(O, {
|
|
216
239
|
className: "pt-4",
|
|
217
|
-
children: [/* @__PURE__ */
|
|
240
|
+
children: [/* @__PURE__ */ w("div", {
|
|
218
241
|
className: "flex items-center gap-2 text-muted-foreground text-xs",
|
|
219
|
-
children: [/* @__PURE__ */
|
|
220
|
-
}), /* @__PURE__ */
|
|
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:
|
|
245
|
+
children: U.length
|
|
223
246
|
})]
|
|
224
247
|
}) }),
|
|
225
|
-
/* @__PURE__ */
|
|
248
|
+
/* @__PURE__ */ C(D, { children: /* @__PURE__ */ w(O, {
|
|
226
249
|
className: "pt-4",
|
|
227
|
-
children: [/* @__PURE__ */
|
|
250
|
+
children: [/* @__PURE__ */ w("div", {
|
|
228
251
|
className: "flex items-center gap-2 text-muted-foreground text-xs",
|
|
229
|
-
children: [/* @__PURE__ */
|
|
230
|
-
}), /* @__PURE__ */
|
|
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__ */
|
|
255
|
+
children: /* @__PURE__ */ C(n, { id: B.ownerId })
|
|
233
256
|
})]
|
|
234
257
|
}) })
|
|
235
258
|
]
|
|
236
259
|
}),
|
|
237
|
-
/* @__PURE__ */
|
|
260
|
+
/* @__PURE__ */ w("div", {
|
|
238
261
|
className: "grid grid-cols-1 lg:grid-cols-3 gap-6",
|
|
239
|
-
children: [/* @__PURE__ */
|
|
262
|
+
children: [/* @__PURE__ */ w("div", {
|
|
240
263
|
className: "lg:col-span-2 space-y-6",
|
|
241
264
|
children: [
|
|
242
|
-
/* @__PURE__ */
|
|
243
|
-
/* @__PURE__ */
|
|
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__ */
|
|
268
|
+
children: [/* @__PURE__ */ C("span", {
|
|
246
269
|
className: "text-muted-foreground",
|
|
247
270
|
children: "Tasks done"
|
|
248
|
-
}), /* @__PURE__ */
|
|
271
|
+
}), /* @__PURE__ */ C("span", {
|
|
249
272
|
className: "font-medium",
|
|
250
|
-
children:
|
|
273
|
+
children: Y === null ? "No open tasks" : `${Y}%`
|
|
251
274
|
})]
|
|
252
275
|
}),
|
|
253
|
-
/* @__PURE__ */
|
|
276
|
+
/* @__PURE__ */ C("div", {
|
|
254
277
|
className: "w-full h-4 rounded-full bg-muted overflow-hidden",
|
|
255
|
-
children: /* @__PURE__ */
|
|
278
|
+
children: /* @__PURE__ */ C("div", {
|
|
256
279
|
className: "h-full bg-primary rounded-full",
|
|
257
|
-
style: { width: `${
|
|
280
|
+
style: { width: `${Y ?? 0}%` }
|
|
258
281
|
})
|
|
259
282
|
}),
|
|
260
|
-
/* @__PURE__ */
|
|
283
|
+
/* @__PURE__ */ w("div", {
|
|
261
284
|
className: "flex justify-between text-xs text-muted-foreground mt-2",
|
|
262
|
-
children: [/* @__PURE__ */
|
|
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
|
-
|
|
288
|
+
q && /* @__PURE__ */ w(D, { children: [/* @__PURE__ */ C(k, { children: /* @__PURE__ */ w(A, {
|
|
266
289
|
className: "flex items-center gap-2",
|
|
267
|
-
children: [/* @__PURE__ */
|
|
268
|
-
}) }), /* @__PURE__ */
|
|
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__ */
|
|
294
|
+
/* @__PURE__ */ w("div", {
|
|
272
295
|
className: "flex justify-between",
|
|
273
|
-
children: [/* @__PURE__ */
|
|
296
|
+
children: [/* @__PURE__ */ C("span", {
|
|
274
297
|
className: "font-medium",
|
|
275
|
-
children:
|
|
276
|
-
}), /* @__PURE__ */
|
|
298
|
+
children: q.name
|
|
299
|
+
}), /* @__PURE__ */ C(T, { children: "Active" })]
|
|
277
300
|
}),
|
|
278
|
-
|
|
301
|
+
q.goal && /* @__PURE__ */ C("p", {
|
|
279
302
|
className: "text-sm text-muted-foreground",
|
|
280
|
-
children:
|
|
303
|
+
children: q.goal
|
|
281
304
|
}),
|
|
282
|
-
/* @__PURE__ */
|
|
305
|
+
/* @__PURE__ */ w("div", {
|
|
283
306
|
className: "grid grid-cols-3 gap-4 text-center",
|
|
284
307
|
children: [
|
|
285
|
-
/* @__PURE__ */
|
|
308
|
+
/* @__PURE__ */ w("div", { children: [/* @__PURE__ */ w("p", {
|
|
286
309
|
className: "text-lg font-semibold",
|
|
287
310
|
children: [
|
|
288
|
-
|
|
311
|
+
q.workItems?.filter((e) => e.status === "DONE").reduce((e, t) => e + (t.storyPoints ?? 0), 0),
|
|
289
312
|
"/",
|
|
290
|
-
|
|
313
|
+
q.workItems?.reduce((e, t) => e + (t.storyPoints ?? 0), 0) ?? 0
|
|
291
314
|
]
|
|
292
|
-
}), /* @__PURE__ */
|
|
315
|
+
}), /* @__PURE__ */ C("p", {
|
|
293
316
|
className: "text-xs text-muted-foreground",
|
|
294
317
|
children: "Points"
|
|
295
318
|
})] }),
|
|
296
|
-
/* @__PURE__ */
|
|
319
|
+
/* @__PURE__ */ w("div", { children: [/* @__PURE__ */ w("p", {
|
|
297
320
|
className: "text-lg font-semibold",
|
|
298
321
|
children: [
|
|
299
|
-
|
|
322
|
+
q.workItems?.filter((e) => e.status === "DONE").length ?? 0,
|
|
300
323
|
"/",
|
|
301
|
-
|
|
324
|
+
q.workItems?.length ?? 0
|
|
302
325
|
]
|
|
303
|
-
}), /* @__PURE__ */
|
|
326
|
+
}), /* @__PURE__ */ C("p", {
|
|
304
327
|
className: "text-xs text-muted-foreground",
|
|
305
328
|
children: "Tasks"
|
|
306
329
|
})] }),
|
|
307
|
-
/* @__PURE__ */
|
|
330
|
+
/* @__PURE__ */ w("div", { children: [/* @__PURE__ */ C("p", {
|
|
308
331
|
className: "text-lg font-semibold",
|
|
309
|
-
children:
|
|
310
|
-
}), /* @__PURE__ */
|
|
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__ */
|
|
341
|
+
/* @__PURE__ */ w(D, { children: [/* @__PURE__ */ C(k, { children: /* @__PURE__ */ w(A, { children: [
|
|
319
342
|
"Work items (",
|
|
320
|
-
|
|
343
|
+
V.length,
|
|
321
344
|
")",
|
|
322
|
-
|
|
323
|
-
] }) }), /* @__PURE__ */
|
|
345
|
+
V.length > 5 ? " · latest 5" : ""
|
|
346
|
+
] }) }), /* @__PURE__ */ w(O, {
|
|
324
347
|
className: "space-y-2",
|
|
325
|
-
children: [
|
|
326
|
-
...
|
|
327
|
-
className: `flex items-center justify-between border rounded-md p-2.5 ${
|
|
328
|
-
children: [/* @__PURE__ */
|
|
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__ */
|
|
356
|
+
/* @__PURE__ */ C("span", {
|
|
334
357
|
className: "font-normal",
|
|
335
358
|
children: e.title
|
|
336
359
|
})
|
|
337
360
|
]
|
|
338
|
-
}), /* @__PURE__ */
|
|
361
|
+
}), /* @__PURE__ */ C("div", {
|
|
339
362
|
className: "flex gap-1 mt-1",
|
|
340
|
-
children: e.labels.map((e) => /* @__PURE__ */
|
|
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__ */
|
|
367
|
+
})] }), /* @__PURE__ */ w("div", {
|
|
345
368
|
className: "flex items-center gap-2",
|
|
346
|
-
children: [/* @__PURE__ */
|
|
369
|
+
children: [/* @__PURE__ */ w("span", {
|
|
347
370
|
className: "text-xs text-muted-foreground",
|
|
348
371
|
children: [e.storyPoints ?? 0, " pts"]
|
|
349
|
-
}), /* @__PURE__ */
|
|
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)),
|
|
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__ */
|
|
384
|
+
}), /* @__PURE__ */ w("div", {
|
|
362
385
|
className: "space-y-6",
|
|
363
386
|
children: [
|
|
364
|
-
/* @__PURE__ */
|
|
365
|
-
workspaceId:
|
|
366
|
-
projectId:
|
|
387
|
+
/* @__PURE__ */ C(d, {
|
|
388
|
+
workspaceId: I,
|
|
389
|
+
projectId: B.id
|
|
367
390
|
}),
|
|
368
|
-
/* @__PURE__ */
|
|
391
|
+
/* @__PURE__ */ w(D, { children: [/* @__PURE__ */ C(k, { children: /* @__PURE__ */ w(A, { children: [
|
|
369
392
|
"Milestones (",
|
|
370
|
-
|
|
393
|
+
U.length,
|
|
371
394
|
")"
|
|
372
|
-
] }) }), /* @__PURE__ */
|
|
395
|
+
] }) }), /* @__PURE__ */ w(O, {
|
|
373
396
|
className: "space-y-3",
|
|
374
|
-
children: [
|
|
397
|
+
children: [U.map((e) => /* @__PURE__ */ w("div", {
|
|
375
398
|
className: "border-b pb-2 last:border-0",
|
|
376
|
-
children: [/* @__PURE__ */
|
|
399
|
+
children: [/* @__PURE__ */ w("div", {
|
|
377
400
|
className: "flex justify-between",
|
|
378
|
-
children: [/* @__PURE__ */
|
|
401
|
+
children: [/* @__PURE__ */ C("span", {
|
|
379
402
|
className: "text-sm font-medium",
|
|
380
403
|
children: e.name
|
|
381
|
-
}), /* @__PURE__ */
|
|
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__ */
|
|
409
|
+
}), /* @__PURE__ */ w("div", {
|
|
387
410
|
className: "flex items-center gap-1 text-xs text-muted-foreground mt-1",
|
|
388
|
-
children: [/* @__PURE__ */
|
|
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)),
|
|
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
|
-
|
|
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__ */
|
|
450
|
+
children: [/* @__PURE__ */ w(A, {
|
|
398
451
|
className: "flex items-center gap-2",
|
|
399
452
|
children: [
|
|
400
|
-
/* @__PURE__ */
|
|
453
|
+
/* @__PURE__ */ C(v, { className: "h-4 w-4 text-primary" }),
|
|
401
454
|
"Risks (",
|
|
402
|
-
|
|
455
|
+
G.length,
|
|
403
456
|
" open)"
|
|
404
457
|
]
|
|
405
|
-
}), /* @__PURE__ */
|
|
406
|
-
projectId:
|
|
407
|
-
onCreated: (e) =>
|
|
458
|
+
}), /* @__PURE__ */ C(c, {
|
|
459
|
+
projectId: B.id,
|
|
460
|
+
onCreated: (e) => F(o("/risks/risk-detail-page", e))
|
|
408
461
|
})]
|
|
409
|
-
}), /* @__PURE__ */
|
|
462
|
+
}), /* @__PURE__ */ w(O, {
|
|
410
463
|
className: "space-y-3",
|
|
411
464
|
children: [
|
|
412
|
-
|
|
413
|
-
...
|
|
414
|
-
className: `border-b pb-2 last:border-0 ${
|
|
415
|
-
children: [/* @__PURE__ */
|
|
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__ */
|
|
470
|
+
children: [/* @__PURE__ */ C("span", {
|
|
418
471
|
className: "text-sm font-medium truncate",
|
|
419
472
|
children: e.title
|
|
420
|
-
}), /* @__PURE__ */
|
|
421
|
-
className: `text-xs px-2 py-0.5 rounded-full shrink-0 ${
|
|
422
|
-
children:
|
|
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__ */
|
|
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
|
-
|
|
483
|
+
i(e.status)
|
|
431
484
|
]
|
|
432
485
|
})]
|
|
433
486
|
}, e.id)),
|
|
434
|
-
|
|
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__ */
|
|
491
|
+
/* @__PURE__ */ w("button", {
|
|
439
492
|
type: "button",
|
|
440
493
|
className: "text-xs text-primary hover:underline",
|
|
441
|
-
onClick: () =>
|
|
494
|
+
onClick: () => F(`/risks/risk-register-page?projectId=${encodeURIComponent(B.id)}`),
|
|
442
495
|
children: [
|
|
443
496
|
"View risk register (",
|
|
444
|
-
|
|
497
|
+
W.length,
|
|
445
498
|
") →"
|
|
446
499
|
]
|
|
447
500
|
})
|
|
448
501
|
]
|
|
449
502
|
})] }),
|
|
450
|
-
/* @__PURE__ */
|
|
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__ */
|
|
506
|
+
/* @__PURE__ */ w("div", {
|
|
454
507
|
className: "flex justify-between",
|
|
455
|
-
children: [/* @__PURE__ */
|
|
508
|
+
children: [/* @__PURE__ */ C("span", {
|
|
456
509
|
className: "text-muted-foreground",
|
|
457
510
|
children: "Owner"
|
|
458
|
-
}), /* @__PURE__ */
|
|
511
|
+
}), /* @__PURE__ */ C("span", { children: /* @__PURE__ */ C(n, { id: B.ownerId }) })]
|
|
459
512
|
}),
|
|
460
|
-
/* @__PURE__ */
|
|
513
|
+
/* @__PURE__ */ w("div", {
|
|
461
514
|
className: "flex justify-between",
|
|
462
|
-
children: [/* @__PURE__ */
|
|
515
|
+
children: [/* @__PURE__ */ C("span", {
|
|
463
516
|
className: "text-muted-foreground",
|
|
464
517
|
children: "Key"
|
|
465
|
-
}), /* @__PURE__ */
|
|
518
|
+
}), /* @__PURE__ */ C("span", {
|
|
466
519
|
className: "font-mono",
|
|
467
|
-
children:
|
|
520
|
+
children: B.key
|
|
468
521
|
})]
|
|
469
522
|
}),
|
|
470
|
-
/* @__PURE__ */
|
|
523
|
+
/* @__PURE__ */ w("div", {
|
|
471
524
|
className: "flex justify-between",
|
|
472
|
-
children: [/* @__PURE__ */
|
|
525
|
+
children: [/* @__PURE__ */ C("span", {
|
|
473
526
|
className: "text-muted-foreground",
|
|
474
527
|
children: "Methodology"
|
|
475
|
-
}), /* @__PURE__ */
|
|
528
|
+
}), /* @__PURE__ */ C("span", {
|
|
476
529
|
className: "capitalize",
|
|
477
|
-
children:
|
|
530
|
+
children: B.methodology.toLowerCase()
|
|
478
531
|
})]
|
|
479
532
|
}),
|
|
480
|
-
/* @__PURE__ */
|
|
533
|
+
/* @__PURE__ */ w("div", {
|
|
481
534
|
className: "flex justify-between",
|
|
482
|
-
children: [/* @__PURE__ */
|
|
535
|
+
children: [/* @__PURE__ */ C("span", {
|
|
483
536
|
className: "text-muted-foreground",
|
|
484
537
|
children: "Program"
|
|
485
|
-
}),
|
|
538
|
+
}), B.program ? /* @__PURE__ */ C("button", {
|
|
486
539
|
type: "button",
|
|
487
540
|
className: "text-primary hover:underline underline-offset-2",
|
|
488
|
-
onClick: () =>
|
|
489
|
-
children:
|
|
490
|
-
}) : /* @__PURE__ */
|
|
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
|
-
|
|
548
|
+
B.tags.length > 0 && /* @__PURE__ */ w("div", {
|
|
496
549
|
className: "flex justify-between items-start",
|
|
497
|
-
children: [/* @__PURE__ */
|
|
550
|
+
children: [/* @__PURE__ */ C("span", {
|
|
498
551
|
className: "text-muted-foreground",
|
|
499
552
|
children: "Tags"
|
|
500
|
-
}), /* @__PURE__ */
|
|
553
|
+
}), /* @__PURE__ */ C("div", {
|
|
501
554
|
className: "flex gap-1 flex-wrap justify-end",
|
|
502
|
-
children:
|
|
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 {
|
|
571
|
+
export { F as ProjectsProjectDetailPagePage };
|
|
519
572
|
|
|
520
573
|
//# sourceMappingURL=ProjectsProjectDetailPagePage.js.map
|