@burdenoff/microfe-planmagnet 2026.924.2 → 2026.924.4
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/planmagnet/PlanMagnetRoot.d.ts.map +1 -1
- package/dist/planmagnet/PlanMagnetRoot.js +93 -142
- package/dist/planmagnet/PlanMagnetRoot.js.map +1 -1
- package/dist/planmagnet/admin/PlanMagnetAdminRoot.d.ts.map +1 -1
- package/dist/planmagnet/admin/PlanMagnetAdminRoot.js +150 -149
- package/dist/planmagnet/admin/PlanMagnetAdminRoot.js.map +1 -1
- package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.js +180 -172
- package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.js.map +1 -1
- package/dist/planmagnet/pages/DashboardDashboardPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/DashboardDashboardPagePage.js +113 -116
- package/dist/planmagnet/pages/DashboardDashboardPagePage.js.map +1 -1
- package/dist/planmagnet/pages/GoalsGoalsPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/GoalsGoalsPagePage.js +59 -58
- package/dist/planmagnet/pages/GoalsGoalsPagePage.js.map +1 -1
- package/dist/planmagnet/pages/GoalsObjectiveDetailPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/GoalsObjectiveDetailPagePage.js +150 -149
- package/dist/planmagnet/pages/GoalsObjectiveDetailPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProductsEditProductPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProductsEditProductPagePage.js +108 -107
- package/dist/planmagnet/pages/ProductsEditProductPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProductsProductDetailPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProductsProductDetailPagePage.js +93 -92
- package/dist/planmagnet/pages/ProductsProductDetailPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProductsProductsPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProductsProductsPagePage.js +89 -87
- package/dist/planmagnet/pages/ProductsProductsPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.js +94 -93
- package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProductsReleasesPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProductsReleasesPagePage.js +57 -56
- package/dist/planmagnet/pages/ProductsReleasesPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.js +82 -81
- package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProductsRoadmapsPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProductsRoadmapsPagePage.js +72 -71
- package/dist/planmagnet/pages/ProductsRoadmapsPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProjectsActiveProjectsPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProjectsActiveProjectsPagePage.js +38 -37
- package/dist/planmagnet/pages/ProjectsActiveProjectsPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.js +72 -71
- package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProjectsMilestonesPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProjectsMilestonesPagePage.js +47 -46
- package/dist/planmagnet/pages/ProjectsMilestonesPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.js +120 -119
- package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js +131 -130
- package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProjectsProjectsPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProjectsProjectsPagePage.js +77 -75
- package/dist/planmagnet/pages/ProjectsProjectsPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ReportsReportsPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ReportsReportsPagePage.js +71 -70
- package/dist/planmagnet/pages/ReportsReportsPagePage.js.map +1 -1
- package/dist/planmagnet/pages/TeamTeamPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/TeamTeamPagePage.js +58 -57
- package/dist/planmagnet/pages/TeamTeamPagePage.js.map +1 -1
- package/dist/planmagnet/pages/WorkspaceCreateWorkspacePagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/WorkspaceCreateWorkspacePagePage.js +81 -72
- package/dist/planmagnet/pages/WorkspaceCreateWorkspacePagePage.js.map +1 -1
- package/dist/planmagnet/pages/analytics/DeliveryHealthCards.d.ts +15 -0
- package/dist/planmagnet/pages/analytics/DeliveryHealthCards.d.ts.map +1 -0
- package/dist/planmagnet/pages/analytics/DeliveryHealthCards.js +302 -0
- package/dist/planmagnet/pages/analytics/DeliveryHealthCards.js.map +1 -0
- package/dist/planmagnet/people/People.d.ts +20 -0
- package/dist/planmagnet/people/People.d.ts.map +1 -0
- package/dist/planmagnet/people/People.js +42 -0
- package/dist/planmagnet/people/People.js.map +1 -0
- package/package.json +1 -1
|
@@ -6,21 +6,22 @@ import { Bar as i } from "../../node_modules/recharts/es6/cartesian/Bar.js";
|
|
|
6
6
|
import { ReferenceLine as ee } from "../../node_modules/recharts/es6/cartesian/ReferenceLine.js";
|
|
7
7
|
import { CartesianGrid as a } from "../../node_modules/recharts/es6/cartesian/CartesianGrid.js";
|
|
8
8
|
import { Line as o } from "../../node_modules/recharts/es6/cartesian/Line.js";
|
|
9
|
-
import { Area as
|
|
10
|
-
import { XAxis as
|
|
11
|
-
import { YAxis as
|
|
12
|
-
import { LineChart as
|
|
13
|
-
import { BarChart as
|
|
14
|
-
import { AreaChart as
|
|
9
|
+
import { Area as te } from "../../node_modules/recharts/es6/cartesian/Area.js";
|
|
10
|
+
import { XAxis as s } from "../../node_modules/recharts/es6/cartesian/XAxis.js";
|
|
11
|
+
import { YAxis as c } from "../../node_modules/recharts/es6/cartesian/YAxis.js";
|
|
12
|
+
import { LineChart as ne } from "../../node_modules/recharts/es6/chart/LineChart.js";
|
|
13
|
+
import { BarChart as re } from "../../node_modules/recharts/es6/chart/BarChart.js";
|
|
14
|
+
import { AreaChart as ie } from "../../node_modules/recharts/es6/chart/AreaChart.js";
|
|
15
|
+
import { BudgetPerformanceCard as l, CycleTimeCard as u } from "./analytics/DeliveryHealthCards.js";
|
|
15
16
|
import { useState as d } from "react";
|
|
16
|
-
import { BarChart3 as f, FolderKanban as
|
|
17
|
-
import { gql as
|
|
18
|
-
import { useQuery as
|
|
19
|
-
import { Fragment as
|
|
17
|
+
import { BarChart3 as f, FolderKanban as p, Target as m, TrendingUp as h, Zap as ae } from "lucide-react";
|
|
18
|
+
import { gql as g } from "@apollo/client";
|
|
19
|
+
import { useQuery as _ } from "@apollo/client/react";
|
|
20
|
+
import { Fragment as v, jsx as y, jsxs as b } from "react/jsx-runtime";
|
|
20
21
|
import { useI18n as oe } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
21
|
-
import { Badge as se, Card as
|
|
22
|
+
import { Badge as se, Card as x, CardContent as S, CardHeader as C, CardTitle as w, Select as T, SelectContent as E, SelectItem as D, SelectTrigger as O, SelectValue as k } from "@burdenoff/fe-libs/ui";
|
|
22
23
|
//#region src/planmagnet/pages/AnalyticsAnalyticsPagePage.tsx
|
|
23
|
-
var
|
|
24
|
+
var A = g`
|
|
24
25
|
query GetAnalyticsData(
|
|
25
26
|
$workspaceId: ID!
|
|
26
27
|
$projectPagination: PlanmagnetPaginationInput
|
|
@@ -73,7 +74,7 @@ var ce = h`
|
|
|
73
74
|
totalCount
|
|
74
75
|
}
|
|
75
76
|
}
|
|
76
|
-
`,
|
|
77
|
+
`, j = g`
|
|
77
78
|
query GetSprintBurndown($workspaceId: ID!, $sprintId: ID!) {
|
|
78
79
|
planmagnetSprintBurndown(workspaceId: $workspaceId, sprintId: $sprintId) {
|
|
79
80
|
sprintId
|
|
@@ -90,7 +91,7 @@ var ce = h`
|
|
|
90
91
|
}
|
|
91
92
|
}
|
|
92
93
|
}
|
|
93
|
-
`,
|
|
94
|
+
`, ce = g`
|
|
94
95
|
query GetVelocity($workspaceId: ID!, $projectId: ID!, $trailingSprintCount: Int) {
|
|
95
96
|
planmagnetVelocity(
|
|
96
97
|
workspaceId: $workspaceId
|
|
@@ -110,7 +111,7 @@ var ce = h`
|
|
|
110
111
|
}
|
|
111
112
|
}
|
|
112
113
|
}
|
|
113
|
-
`,
|
|
114
|
+
`, le = g`
|
|
114
115
|
query GetCumulativeFlow($workspaceId: ID!, $projectId: ID!) {
|
|
115
116
|
planmagnetCumulativeFlow(workspaceId: $workspaceId, projectId: $projectId) {
|
|
116
117
|
projectId
|
|
@@ -125,7 +126,7 @@ var ce = h`
|
|
|
125
126
|
}
|
|
126
127
|
}
|
|
127
128
|
}
|
|
128
|
-
`,
|
|
129
|
+
`, M = {
|
|
129
130
|
BACKLOG: "#9ca3af",
|
|
130
131
|
TODO: "#60a5fa",
|
|
131
132
|
IN_PROGRESS: "#fbbf24",
|
|
@@ -134,396 +135,403 @@ var ce = h`
|
|
|
134
135
|
DONE: "#4ade80",
|
|
135
136
|
CANCELLED: "#f87171"
|
|
136
137
|
};
|
|
137
|
-
function
|
|
138
|
+
function N(e) {
|
|
138
139
|
let t = new Date(e);
|
|
139
140
|
return `${t.getUTCMonth() + 1}/${t.getUTCDate()}`;
|
|
140
141
|
}
|
|
141
|
-
function
|
|
142
|
-
let { workspaceId:
|
|
142
|
+
function P() {
|
|
143
|
+
let { workspaceId: g } = e(), { t: P } = oe(), [ue, de] = d(""), [fe, F] = d(""), { data: I, loading: L, error: R } = _(A, {
|
|
143
144
|
variables: {
|
|
144
|
-
workspaceId:
|
|
145
|
+
workspaceId: g,
|
|
145
146
|
projectPagination: { first: 100 },
|
|
146
147
|
workItemPagination: { first: 500 },
|
|
147
148
|
sprintPagination: { first: 100 },
|
|
148
149
|
milestonePagination: { first: 100 }
|
|
149
150
|
},
|
|
150
|
-
skip: !
|
|
151
|
-
}),
|
|
151
|
+
skip: !g
|
|
152
|
+
}), z = I?.planmagnetProjects?.items ?? [], B = I?.planmagnetWorkItems?.items ?? [], V = I?.planmagnetSprints?.items ?? [], pe = I?.planmagnetMilestones?.items ?? [], H = ue || z[0]?.id || "", U = V.filter((e) => e.projectId === H), W = fe || U[0]?.id || "", { data: me, loading: he } = _(j, {
|
|
152
153
|
variables: {
|
|
153
|
-
workspaceId:
|
|
154
|
-
sprintId:
|
|
154
|
+
workspaceId: g,
|
|
155
|
+
sprintId: W
|
|
155
156
|
},
|
|
156
|
-
skip: !
|
|
157
|
-
}), { data:
|
|
157
|
+
skip: !g || !W
|
|
158
|
+
}), { data: ge, loading: _e } = _(ce, {
|
|
158
159
|
variables: {
|
|
159
|
-
workspaceId:
|
|
160
|
-
projectId:
|
|
160
|
+
workspaceId: g,
|
|
161
|
+
projectId: H,
|
|
161
162
|
trailingSprintCount: 6
|
|
162
163
|
},
|
|
163
|
-
skip: !
|
|
164
|
-
}), { data:
|
|
164
|
+
skip: !g || !H
|
|
165
|
+
}), { data: ve, loading: ye } = _(le, {
|
|
165
166
|
variables: {
|
|
166
|
-
workspaceId:
|
|
167
|
-
projectId:
|
|
167
|
+
workspaceId: g,
|
|
168
|
+
projectId: H
|
|
168
169
|
},
|
|
169
|
-
skip: !
|
|
170
|
+
skip: !g || !H
|
|
170
171
|
});
|
|
171
|
-
if (
|
|
172
|
+
if (L) return /* @__PURE__ */ y("div", {
|
|
172
173
|
className: "flex items-center justify-center p-12",
|
|
173
|
-
children: /* @__PURE__ */
|
|
174
|
+
children: /* @__PURE__ */ y("div", { className: "animate-spin h-8 w-8 border-2 border-primary border-t-transparent rounded-full" })
|
|
174
175
|
});
|
|
175
|
-
if (
|
|
176
|
+
if (R) return /* @__PURE__ */ b("div", {
|
|
176
177
|
className: "p-6 text-red-500",
|
|
177
178
|
children: [
|
|
178
|
-
|
|
179
|
+
P("planmagnet.analytics.errorLoading", "Error loading analytics"),
|
|
179
180
|
": ",
|
|
180
|
-
|
|
181
|
+
R.message
|
|
181
182
|
]
|
|
182
183
|
});
|
|
183
|
-
let
|
|
184
|
-
day:
|
|
184
|
+
let G = B.length, be = B.filter((e) => e.status === "DONE").length, K = B.filter((e) => e.status === "BLOCKED").length, xe = B.reduce((e, t) => e + (t.storyPoints ?? 0), 0), Se = B.filter((e) => e.status === "DONE").reduce((e, t) => e + (t.storyPoints ?? 0), 0), Ce = V.filter((e) => e.status === "ACTIVE").length, we = pe.filter((e) => e.status === "AT_RISK" || e.status === "OVERDUE").length, q = z.filter((e) => e.status === "ACTIVE").length, Te = G > 0 ? Math.round(be / G * 100) : 0, J = (me?.planmagnetSprintBurndown)?.points.map((e) => ({
|
|
185
|
+
day: N(e.date),
|
|
185
186
|
remaining: e.remainingPoints,
|
|
186
187
|
completed: e.completedPoints
|
|
187
|
-
})) ?? [], Y =
|
|
188
|
+
})) ?? [], Y = ge?.planmagnetVelocity, X = Y?.sprints.map((e) => ({
|
|
188
189
|
name: e.sprintName,
|
|
189
190
|
completed: e.completedPoints,
|
|
190
191
|
planned: e.plannedPoints ?? void 0
|
|
191
|
-
})) ?? [], Z = Y ? Math.round(Y.averageVelocity) : 0,
|
|
192
|
-
let t = { day:
|
|
192
|
+
})) ?? [], Z = Y ? Math.round(Y.averageVelocity) : 0, Ee = Y ? Math.round(Y.forecastNextSprintPoints) : 0, Q = ve?.planmagnetCumulativeFlow, De = Array.from(new Set(Q?.points.flatMap((e) => e.statuses.map((e) => e.status)) ?? [])), $ = Q?.points.map((e) => {
|
|
193
|
+
let t = { day: N(e.date) };
|
|
193
194
|
for (let n of e.statuses) t[n.status] = n.count;
|
|
194
195
|
return t;
|
|
195
|
-
}) ?? [],
|
|
196
|
+
}) ?? [], Oe = [
|
|
196
197
|
{
|
|
197
|
-
label:
|
|
198
|
-
value: String(
|
|
199
|
-
trend: `${
|
|
198
|
+
label: P("planmagnet.analytics.metrics.totalWorkItems.label", "Total Work Items"),
|
|
199
|
+
value: String(G),
|
|
200
|
+
trend: `${Te}% ${P("planmagnet.analytics.metrics.totalWorkItems.trend", "completed")}`
|
|
200
201
|
},
|
|
201
202
|
{
|
|
202
|
-
label:
|
|
203
|
-
value: String(
|
|
204
|
-
trend: `${
|
|
203
|
+
label: P("planmagnet.analytics.metrics.storyPoints.label", "Story Points"),
|
|
204
|
+
value: String(xe),
|
|
205
|
+
trend: `${Se} ${P("planmagnet.analytics.metrics.storyPoints.trend", "completed")}`
|
|
205
206
|
},
|
|
206
207
|
{
|
|
207
|
-
label:
|
|
208
|
+
label: P("planmagnet.analytics.metrics.activeProjects.label", "Active Projects"),
|
|
208
209
|
value: String(q),
|
|
209
|
-
trend: `${
|
|
210
|
+
trend: `${z.length} ${P("planmagnet.analytics.metrics.activeProjects.trend", "total")}`
|
|
210
211
|
},
|
|
211
212
|
{
|
|
212
|
-
label:
|
|
213
|
-
value: String(
|
|
214
|
-
trend:
|
|
213
|
+
label: P("planmagnet.analytics.metrics.blockedItems.label", "Blocked Items"),
|
|
214
|
+
value: String(K),
|
|
215
|
+
trend: K > 0 ? P("planmagnet.analytics.metrics.blockedItems.attention", "Needs attention") : P("planmagnet.analytics.metrics.blockedItems.clear", "All clear")
|
|
215
216
|
}
|
|
216
217
|
];
|
|
217
|
-
return /* @__PURE__ */
|
|
218
|
+
return /* @__PURE__ */ b("div", {
|
|
218
219
|
className: "space-y-6 p-6",
|
|
219
220
|
children: [
|
|
220
|
-
/* @__PURE__ */
|
|
221
|
+
/* @__PURE__ */ b("div", { children: [/* @__PURE__ */ y("h1", {
|
|
221
222
|
className: "text-2xl font-semibold",
|
|
222
|
-
children:
|
|
223
|
-
}), /* @__PURE__ */
|
|
223
|
+
children: P("planmagnet.analytics.title", "Analytics Dashboard")
|
|
224
|
+
}), /* @__PURE__ */ y("p", {
|
|
224
225
|
className: "text-sm text-muted-foreground",
|
|
225
|
-
children:
|
|
226
|
+
children: P("planmagnet.analytics.subtitle", "Overview of project health and team performance")
|
|
226
227
|
})] }),
|
|
227
|
-
/* @__PURE__ */
|
|
228
|
+
/* @__PURE__ */ y("div", {
|
|
228
229
|
className: "grid grid-cols-2 md:grid-cols-4 gap-4",
|
|
229
|
-
children:
|
|
230
|
+
children: Oe.map((e) => /* @__PURE__ */ y(x, { children: /* @__PURE__ */ b(S, {
|
|
230
231
|
className: "pt-4",
|
|
231
232
|
children: [
|
|
232
|
-
/* @__PURE__ */
|
|
233
|
+
/* @__PURE__ */ y("p", {
|
|
233
234
|
className: "text-xs text-muted-foreground",
|
|
234
235
|
children: e.label
|
|
235
236
|
}),
|
|
236
|
-
/* @__PURE__ */
|
|
237
|
+
/* @__PURE__ */ y("p", {
|
|
237
238
|
className: "text-xl font-bold mt-1",
|
|
238
239
|
children: e.value
|
|
239
240
|
}),
|
|
240
|
-
/* @__PURE__ */
|
|
241
|
+
/* @__PURE__ */ y("p", {
|
|
241
242
|
className: "text-xs text-green-600 mt-1",
|
|
242
243
|
children: e.trend
|
|
243
244
|
})
|
|
244
245
|
]
|
|
245
246
|
}) }, e.label))
|
|
246
247
|
}),
|
|
247
|
-
/* @__PURE__ */
|
|
248
|
+
/* @__PURE__ */ b("div", {
|
|
248
249
|
className: "grid grid-cols-2 md:grid-cols-4 gap-4",
|
|
249
250
|
children: [
|
|
250
|
-
/* @__PURE__ */
|
|
251
|
+
/* @__PURE__ */ y(x, { children: /* @__PURE__ */ b(S, {
|
|
251
252
|
className: "pt-4",
|
|
252
|
-
children: [/* @__PURE__ */
|
|
253
|
+
children: [/* @__PURE__ */ b("div", {
|
|
253
254
|
className: "flex items-center gap-2 text-muted-foreground text-xs",
|
|
254
|
-
children: [/* @__PURE__ */
|
|
255
|
-
}), /* @__PURE__ */
|
|
255
|
+
children: [/* @__PURE__ */ y(p, { className: "h-4 w-4" }), P("planmagnet.analytics.summary.activeProjects", "Active Projects")]
|
|
256
|
+
}), /* @__PURE__ */ y("p", {
|
|
256
257
|
className: "text-xl font-bold mt-1",
|
|
257
258
|
children: q
|
|
258
259
|
})]
|
|
259
260
|
}) }),
|
|
260
|
-
/* @__PURE__ */
|
|
261
|
+
/* @__PURE__ */ y(x, { children: /* @__PURE__ */ b(S, {
|
|
261
262
|
className: "pt-4",
|
|
262
|
-
children: [/* @__PURE__ */
|
|
263
|
+
children: [/* @__PURE__ */ b("div", {
|
|
263
264
|
className: "flex items-center gap-2 text-muted-foreground text-xs",
|
|
264
|
-
children: [/* @__PURE__ */
|
|
265
|
-
}), /* @__PURE__ */
|
|
265
|
+
children: [/* @__PURE__ */ y(ae, { className: "h-4 w-4" }), P("planmagnet.analytics.summary.activeSprints", "Active Sprints")]
|
|
266
|
+
}), /* @__PURE__ */ y("p", {
|
|
266
267
|
className: "text-xl font-bold mt-1",
|
|
267
|
-
children:
|
|
268
|
+
children: Ce
|
|
268
269
|
})]
|
|
269
270
|
}) }),
|
|
270
|
-
/* @__PURE__ */
|
|
271
|
+
/* @__PURE__ */ y(x, { children: /* @__PURE__ */ b(S, {
|
|
271
272
|
className: "pt-4",
|
|
272
|
-
children: [/* @__PURE__ */
|
|
273
|
+
children: [/* @__PURE__ */ b("div", {
|
|
273
274
|
className: "flex items-center gap-2 text-muted-foreground text-xs",
|
|
274
|
-
children: [/* @__PURE__ */
|
|
275
|
-
}), /* @__PURE__ */
|
|
275
|
+
children: [/* @__PURE__ */ y(h, { className: "h-4 w-4" }), P("planmagnet.analytics.summary.avgVelocity", "Avg Velocity")]
|
|
276
|
+
}), /* @__PURE__ */ b("p", {
|
|
276
277
|
className: "text-xl font-bold mt-1",
|
|
277
278
|
children: [
|
|
278
279
|
Z,
|
|
279
280
|
" ",
|
|
280
|
-
|
|
281
|
+
P("planmagnet.analytics.summary.pointsShort", "pts")
|
|
281
282
|
]
|
|
282
283
|
})]
|
|
283
284
|
}) }),
|
|
284
|
-
/* @__PURE__ */
|
|
285
|
+
/* @__PURE__ */ y(x, { children: /* @__PURE__ */ b(S, {
|
|
285
286
|
className: "pt-4",
|
|
286
|
-
children: [/* @__PURE__ */
|
|
287
|
+
children: [/* @__PURE__ */ b("div", {
|
|
287
288
|
className: "flex items-center gap-2 text-muted-foreground text-xs",
|
|
288
|
-
children: [/* @__PURE__ */
|
|
289
|
-
}), /* @__PURE__ */
|
|
289
|
+
children: [/* @__PURE__ */ y(m, { className: "h-4 w-4" }), P("planmagnet.analytics.summary.atRisk", "At Risk")]
|
|
290
|
+
}), /* @__PURE__ */ b("p", {
|
|
290
291
|
className: "text-xl font-bold mt-1",
|
|
291
292
|
children: [
|
|
292
|
-
|
|
293
|
+
we,
|
|
293
294
|
" ",
|
|
294
|
-
|
|
295
|
+
P("planmagnet.analytics.summary.milestones", "milestones")
|
|
295
296
|
]
|
|
296
297
|
})]
|
|
297
298
|
}) })
|
|
298
299
|
]
|
|
299
300
|
}),
|
|
300
|
-
/* @__PURE__ */
|
|
301
|
+
/* @__PURE__ */ b("div", {
|
|
301
302
|
className: "flex flex-col sm:flex-row gap-3 items-start sm:items-center",
|
|
302
|
-
children: [/* @__PURE__ */
|
|
303
|
+
children: [/* @__PURE__ */ y("h2", {
|
|
303
304
|
className: "text-lg font-semibold",
|
|
304
|
-
children:
|
|
305
|
-
}), /* @__PURE__ */
|
|
305
|
+
children: P("planmagnet.analytics.delivery.title", "Sprint Delivery Analytics")
|
|
306
|
+
}), /* @__PURE__ */ b("div", {
|
|
306
307
|
className: "flex gap-2 sm:ml-auto",
|
|
307
|
-
children: [/* @__PURE__ */
|
|
308
|
-
value:
|
|
308
|
+
children: [/* @__PURE__ */ b(T, {
|
|
309
|
+
value: H,
|
|
309
310
|
onValueChange: (e) => {
|
|
310
|
-
de(e),
|
|
311
|
+
de(e), F("");
|
|
311
312
|
},
|
|
312
|
-
children: [/* @__PURE__ */
|
|
313
|
+
children: [/* @__PURE__ */ y(O, {
|
|
313
314
|
className: "h-8 w-48",
|
|
314
|
-
children: /* @__PURE__ */
|
|
315
|
-
}), /* @__PURE__ */
|
|
315
|
+
children: /* @__PURE__ */ y(k, { placeholder: P("planmagnet.analytics.delivery.projectPlaceholder", "Select project") })
|
|
316
|
+
}), /* @__PURE__ */ y(E, { children: z.map((e) => /* @__PURE__ */ y(D, {
|
|
316
317
|
value: e.id,
|
|
317
318
|
children: e.name
|
|
318
319
|
}, e.id)) })]
|
|
319
|
-
}), /* @__PURE__ */
|
|
320
|
-
value:
|
|
321
|
-
onValueChange:
|
|
322
|
-
children: [/* @__PURE__ */
|
|
320
|
+
}), /* @__PURE__ */ b(T, {
|
|
321
|
+
value: W,
|
|
322
|
+
onValueChange: F,
|
|
323
|
+
children: [/* @__PURE__ */ y(O, {
|
|
323
324
|
className: "h-8 w-48",
|
|
324
|
-
children: /* @__PURE__ */
|
|
325
|
-
}), /* @__PURE__ */
|
|
325
|
+
children: /* @__PURE__ */ y(k, { placeholder: P("planmagnet.analytics.delivery.sprintPlaceholder", "Select sprint") })
|
|
326
|
+
}), /* @__PURE__ */ y(E, { children: U.map((e) => /* @__PURE__ */ y(D, {
|
|
326
327
|
value: e.id,
|
|
327
328
|
children: e.name
|
|
328
329
|
}, e.id)) })]
|
|
329
330
|
})]
|
|
330
331
|
})]
|
|
331
332
|
}),
|
|
332
|
-
/* @__PURE__ */
|
|
333
|
+
/* @__PURE__ */ b("div", {
|
|
333
334
|
className: "grid grid-cols-1 lg:grid-cols-2 gap-6",
|
|
334
|
-
children: [/* @__PURE__ */
|
|
335
|
+
children: [/* @__PURE__ */ b(x, { children: [/* @__PURE__ */ y(C, { children: /* @__PURE__ */ b(w, {
|
|
335
336
|
className: "flex items-center gap-2",
|
|
336
|
-
children: [/* @__PURE__ */
|
|
337
|
-
}) }), /* @__PURE__ */
|
|
337
|
+
children: [/* @__PURE__ */ y(f, { className: "h-4 w-4" }), P("planmagnet.analytics.burndown.title", "Sprint Burndown")]
|
|
338
|
+
}) }), /* @__PURE__ */ y(S, { children: he ? /* @__PURE__ */ y("div", {
|
|
338
339
|
className: "flex justify-center py-12",
|
|
339
|
-
children: /* @__PURE__ */
|
|
340
|
-
}) : J.length > 0 ? /* @__PURE__ */
|
|
340
|
+
children: /* @__PURE__ */ y("div", { className: "animate-spin h-6 w-6 border-2 border-primary border-t-transparent rounded-full" })
|
|
341
|
+
}) : J.length > 0 ? /* @__PURE__ */ y(r, {
|
|
341
342
|
width: "100%",
|
|
342
343
|
height: 220,
|
|
343
|
-
children: /* @__PURE__ */
|
|
344
|
+
children: /* @__PURE__ */ b(ne, {
|
|
344
345
|
data: J,
|
|
345
346
|
children: [
|
|
346
|
-
/* @__PURE__ */
|
|
347
|
+
/* @__PURE__ */ y(a, {
|
|
347
348
|
strokeDasharray: "3 3",
|
|
348
349
|
opacity: .2
|
|
349
350
|
}),
|
|
350
|
-
/* @__PURE__ */
|
|
351
|
+
/* @__PURE__ */ y(s, {
|
|
351
352
|
dataKey: "day",
|
|
352
353
|
tick: { fontSize: 11 }
|
|
353
354
|
}),
|
|
354
|
-
/* @__PURE__ */
|
|
355
|
+
/* @__PURE__ */ y(c, {
|
|
355
356
|
tick: { fontSize: 11 },
|
|
356
357
|
allowDecimals: !1
|
|
357
358
|
}),
|
|
358
|
-
/* @__PURE__ */
|
|
359
|
-
/* @__PURE__ */
|
|
360
|
-
/* @__PURE__ */
|
|
359
|
+
/* @__PURE__ */ y(n, {}),
|
|
360
|
+
/* @__PURE__ */ y(t, { wrapperStyle: { fontSize: 12 } }),
|
|
361
|
+
/* @__PURE__ */ y(o, {
|
|
361
362
|
type: "monotone",
|
|
362
363
|
dataKey: "remaining",
|
|
363
|
-
name:
|
|
364
|
+
name: P("planmagnet.analytics.burndown.remaining", "Remaining points"),
|
|
364
365
|
stroke: "#f59e0b",
|
|
365
366
|
strokeWidth: 2,
|
|
366
367
|
dot: { r: 2 }
|
|
367
368
|
}),
|
|
368
|
-
/* @__PURE__ */
|
|
369
|
+
/* @__PURE__ */ y(o, {
|
|
369
370
|
type: "monotone",
|
|
370
371
|
dataKey: "completed",
|
|
371
|
-
name:
|
|
372
|
+
name: P("planmagnet.analytics.burndown.completed", "Completed points"),
|
|
372
373
|
stroke: "#22c55e",
|
|
373
374
|
strokeWidth: 2,
|
|
374
375
|
dot: { r: 2 }
|
|
375
376
|
})
|
|
376
377
|
]
|
|
377
378
|
})
|
|
378
|
-
}) : /* @__PURE__ */
|
|
379
|
+
}) : /* @__PURE__ */ y("p", {
|
|
379
380
|
className: "text-sm text-muted-foreground py-8 text-center",
|
|
380
|
-
children:
|
|
381
|
-
}) })] }), /* @__PURE__ */
|
|
381
|
+
children: P("planmagnet.analytics.burndown.empty", "No sprint selected, or the sprint has no work items yet")
|
|
382
|
+
}) })] }), /* @__PURE__ */ b(x, { children: [/* @__PURE__ */ y(C, { children: /* @__PURE__ */ b(w, {
|
|
382
383
|
className: "flex items-center gap-2",
|
|
383
384
|
children: [
|
|
384
|
-
/* @__PURE__ */
|
|
385
|
-
|
|
385
|
+
/* @__PURE__ */ y(h, { className: "h-4 w-4" }),
|
|
386
|
+
P("planmagnet.analytics.velocity.title", "Sprint Velocity"),
|
|
386
387
|
" (",
|
|
387
388
|
X.length,
|
|
388
389
|
" ",
|
|
389
|
-
|
|
390
|
+
P("planmagnet.analytics.velocity.sprints", "Sprints"),
|
|
390
391
|
")"
|
|
391
392
|
]
|
|
392
|
-
}) }), /* @__PURE__ */
|
|
393
|
+
}) }), /* @__PURE__ */ y(S, { children: _e ? /* @__PURE__ */ y("div", {
|
|
393
394
|
className: "flex justify-center py-12",
|
|
394
|
-
children: /* @__PURE__ */
|
|
395
|
-
}) : X.length > 0 ? /* @__PURE__ */ v
|
|
395
|
+
children: /* @__PURE__ */ y("div", { className: "animate-spin h-6 w-6 border-2 border-primary border-t-transparent rounded-full" })
|
|
396
|
+
}) : X.length > 0 ? /* @__PURE__ */ b(v, { children: [/* @__PURE__ */ y(r, {
|
|
396
397
|
width: "100%",
|
|
397
398
|
height: 190,
|
|
398
|
-
children: /* @__PURE__ */
|
|
399
|
+
children: /* @__PURE__ */ b(re, {
|
|
399
400
|
data: X,
|
|
400
401
|
children: [
|
|
401
|
-
/* @__PURE__ */
|
|
402
|
+
/* @__PURE__ */ y(a, {
|
|
402
403
|
strokeDasharray: "3 3",
|
|
403
404
|
opacity: .2
|
|
404
405
|
}),
|
|
405
|
-
/* @__PURE__ */
|
|
406
|
+
/* @__PURE__ */ y(s, {
|
|
406
407
|
dataKey: "name",
|
|
407
408
|
tick: { fontSize: 11 }
|
|
408
409
|
}),
|
|
409
|
-
/* @__PURE__ */
|
|
410
|
+
/* @__PURE__ */ y(c, {
|
|
410
411
|
tick: { fontSize: 11 },
|
|
411
412
|
allowDecimals: !1
|
|
412
413
|
}),
|
|
413
|
-
/* @__PURE__ */
|
|
414
|
-
/* @__PURE__ */
|
|
415
|
-
/* @__PURE__ */
|
|
414
|
+
/* @__PURE__ */ y(n, {}),
|
|
415
|
+
/* @__PURE__ */ y(t, { wrapperStyle: { fontSize: 12 } }),
|
|
416
|
+
/* @__PURE__ */ y(i, {
|
|
416
417
|
dataKey: "planned",
|
|
417
|
-
name:
|
|
418
|
+
name: P("planmagnet.analytics.velocity.planned", "Planned"),
|
|
418
419
|
fill: "#cbd5e1"
|
|
419
420
|
}),
|
|
420
|
-
/* @__PURE__ */
|
|
421
|
+
/* @__PURE__ */ y(i, {
|
|
421
422
|
dataKey: "completed",
|
|
422
|
-
name:
|
|
423
|
+
name: P("planmagnet.analytics.velocity.completed", "Completed"),
|
|
423
424
|
fill: "#6366f1"
|
|
424
425
|
}),
|
|
425
|
-
/* @__PURE__ */
|
|
426
|
+
/* @__PURE__ */ y(ee, {
|
|
426
427
|
y: Z,
|
|
427
428
|
stroke: "#22c55e",
|
|
428
429
|
strokeDasharray: "4 4",
|
|
429
430
|
label: {
|
|
430
|
-
value:
|
|
431
|
+
value: P("planmagnet.analytics.velocity.avgLabel", "avg"),
|
|
431
432
|
fontSize: 10,
|
|
432
433
|
position: "right"
|
|
433
434
|
}
|
|
434
435
|
})
|
|
435
436
|
]
|
|
436
437
|
})
|
|
437
|
-
}), /* @__PURE__ */
|
|
438
|
+
}), /* @__PURE__ */ y("p", {
|
|
438
439
|
className: "text-xs text-muted-foreground text-center mt-2",
|
|
439
|
-
children:
|
|
440
|
-
})] }) : /* @__PURE__ */
|
|
440
|
+
children: P("planmagnet.analytics.velocity.forecast", "Forecast for next sprint: {{points}} pts (trailing average)", { points: Ee })
|
|
441
|
+
})] }) : /* @__PURE__ */ y("p", {
|
|
441
442
|
className: "text-sm text-muted-foreground py-8 text-center",
|
|
442
|
-
children:
|
|
443
|
+
children: P("planmagnet.analytics.velocity.empty", "No completed sprints yet for this project")
|
|
443
444
|
}) })] })]
|
|
444
445
|
}),
|
|
445
|
-
/* @__PURE__ */
|
|
446
|
+
/* @__PURE__ */ b(x, { children: [/* @__PURE__ */ y(C, { children: /* @__PURE__ */ b(w, {
|
|
446
447
|
className: "flex items-center gap-2",
|
|
447
|
-
children: [/* @__PURE__ */
|
|
448
|
-
}) }), /* @__PURE__ */
|
|
448
|
+
children: [/* @__PURE__ */ y(f, { className: "h-4 w-4" }), P("planmagnet.analytics.cfd.title", "Cumulative Flow Diagram")]
|
|
449
|
+
}) }), /* @__PURE__ */ y(S, { children: ye ? /* @__PURE__ */ y("div", {
|
|
449
450
|
className: "flex justify-center py-12",
|
|
450
|
-
children: /* @__PURE__ */
|
|
451
|
-
}) : $.length > 0 ? /* @__PURE__ */
|
|
451
|
+
children: /* @__PURE__ */ y("div", { className: "animate-spin h-6 w-6 border-2 border-primary border-t-transparent rounded-full" })
|
|
452
|
+
}) : $.length > 0 ? /* @__PURE__ */ y(r, {
|
|
452
453
|
width: "100%",
|
|
453
454
|
height: 260,
|
|
454
|
-
children: /* @__PURE__ */
|
|
455
|
+
children: /* @__PURE__ */ b(ie, {
|
|
455
456
|
data: $,
|
|
456
457
|
children: [
|
|
457
|
-
/* @__PURE__ */
|
|
458
|
+
/* @__PURE__ */ y(a, {
|
|
458
459
|
strokeDasharray: "3 3",
|
|
459
460
|
opacity: .2
|
|
460
461
|
}),
|
|
461
|
-
/* @__PURE__ */
|
|
462
|
+
/* @__PURE__ */ y(s, {
|
|
462
463
|
dataKey: "day",
|
|
463
464
|
tick: { fontSize: 11 }
|
|
464
465
|
}),
|
|
465
|
-
/* @__PURE__ */
|
|
466
|
+
/* @__PURE__ */ y(c, {
|
|
466
467
|
tick: { fontSize: 11 },
|
|
467
468
|
allowDecimals: !1
|
|
468
469
|
}),
|
|
469
|
-
/* @__PURE__ */
|
|
470
|
-
/* @__PURE__ */
|
|
471
|
-
|
|
470
|
+
/* @__PURE__ */ y(n, {}),
|
|
471
|
+
/* @__PURE__ */ y(t, { wrapperStyle: { fontSize: 12 } }),
|
|
472
|
+
De.map((e) => /* @__PURE__ */ y(te, {
|
|
472
473
|
type: "monotone",
|
|
473
474
|
dataKey: e,
|
|
474
475
|
name: e.toLowerCase().replace("_", " "),
|
|
475
476
|
stackId: "cfd",
|
|
476
|
-
stroke:
|
|
477
|
-
fill:
|
|
477
|
+
stroke: M[e] ?? "#a3a3a3",
|
|
478
|
+
fill: M[e] ?? "#a3a3a3",
|
|
478
479
|
fillOpacity: .7
|
|
479
480
|
}, e))
|
|
480
481
|
]
|
|
481
482
|
})
|
|
482
|
-
}) : /* @__PURE__ */
|
|
483
|
+
}) : /* @__PURE__ */ y("p", {
|
|
483
484
|
className: "text-sm text-muted-foreground py-8 text-center",
|
|
484
|
-
children:
|
|
485
|
+
children: P("planmagnet.analytics.cfd.empty", "No work items found for this project")
|
|
485
486
|
}) })] }),
|
|
486
|
-
/* @__PURE__ */
|
|
487
|
+
/* @__PURE__ */ b("div", {
|
|
488
|
+
className: "grid grid-cols-1 lg:grid-cols-2 gap-6",
|
|
489
|
+
children: [/* @__PURE__ */ y(u, {
|
|
490
|
+
workspaceId: g,
|
|
491
|
+
projectId: H
|
|
492
|
+
}), /* @__PURE__ */ y(l, { workspaceId: g })]
|
|
493
|
+
}),
|
|
494
|
+
/* @__PURE__ */ b(x, { children: [/* @__PURE__ */ y(C, { children: /* @__PURE__ */ y(w, { children: P("planmagnet.analytics.projectHealth.title", "Project Health") }) }), /* @__PURE__ */ y(S, { children: /* @__PURE__ */ b("div", {
|
|
487
495
|
className: "space-y-3",
|
|
488
|
-
children: [
|
|
489
|
-
let t =
|
|
490
|
-
return /* @__PURE__ */
|
|
496
|
+
children: [z.filter((e) => e.status === "ACTIVE").map((e) => {
|
|
497
|
+
let t = B.filter((e) => e.assigneeId != null), n = t.filter((e) => e.status === "DONE").length, r = t.length > 0 ? Math.round(n / t.length * 100) : 0, i = e.endDate && new Date(e.endDate) < /* @__PURE__ */ new Date() && r < 100 ? "at_risk" : r >= 75 ? "on_track" : "in_progress";
|
|
498
|
+
return /* @__PURE__ */ b("div", {
|
|
491
499
|
className: "flex items-center gap-4",
|
|
492
500
|
children: [
|
|
493
|
-
/* @__PURE__ */
|
|
501
|
+
/* @__PURE__ */ y("span", {
|
|
494
502
|
className: "text-sm font-medium w-40 truncate",
|
|
495
503
|
children: e.name
|
|
496
504
|
}),
|
|
497
|
-
/* @__PURE__ */
|
|
505
|
+
/* @__PURE__ */ y("div", {
|
|
498
506
|
className: "flex-1",
|
|
499
|
-
children: /* @__PURE__ */
|
|
507
|
+
children: /* @__PURE__ */ y("div", {
|
|
500
508
|
className: "w-full h-2 rounded-full bg-muted overflow-hidden",
|
|
501
|
-
children: /* @__PURE__ */
|
|
509
|
+
children: /* @__PURE__ */ y("div", {
|
|
502
510
|
className: `h-full rounded-full ${i === "at_risk" ? "bg-orange-400" : i === "on_track" ? "bg-green-400" : "bg-blue-400"}`,
|
|
503
511
|
style: { width: `${r}%` }
|
|
504
512
|
})
|
|
505
513
|
})
|
|
506
514
|
}),
|
|
507
|
-
/* @__PURE__ */
|
|
515
|
+
/* @__PURE__ */ b("span", {
|
|
508
516
|
className: "text-sm w-12 text-right",
|
|
509
517
|
children: [r, "%"]
|
|
510
518
|
}),
|
|
511
|
-
/* @__PURE__ */
|
|
519
|
+
/* @__PURE__ */ y(se, {
|
|
512
520
|
variant: "outline",
|
|
513
521
|
className: "capitalize text-xs w-20 justify-center",
|
|
514
522
|
children: i.replace("_", " ")
|
|
515
523
|
})
|
|
516
524
|
]
|
|
517
525
|
}, e.id);
|
|
518
|
-
}),
|
|
526
|
+
}), z.filter((e) => e.status === "ACTIVE").length === 0 && /* @__PURE__ */ y("p", {
|
|
519
527
|
className: "text-sm text-muted-foreground text-center py-4",
|
|
520
|
-
children:
|
|
528
|
+
children: P("planmagnet.analytics.projectHealth.empty", "No active projects found")
|
|
521
529
|
})]
|
|
522
530
|
}) })] })
|
|
523
531
|
]
|
|
524
532
|
});
|
|
525
533
|
}
|
|
526
534
|
//#endregion
|
|
527
|
-
export {
|
|
535
|
+
export { P as AnalyticsAnalyticsPagePage };
|
|
528
536
|
|
|
529
537
|
//# sourceMappingURL=AnalyticsAnalyticsPagePage.js.map
|