@burdenoff/microfe-planmagnet 2026.1001.1 → 2026.1001.3
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 +163 -150
- package/dist/planmagnet/PlanMagnetRoot.js.map +1 -1
- package/dist/planmagnet/PlanMagnetRoutes.d.ts.map +1 -1
- package/dist/planmagnet/PlanMagnetRoutes.js +124 -108
- package/dist/planmagnet/PlanMagnetRoutes.js.map +1 -1
- package/dist/planmagnet/comments/CommentThread.js +36 -36
- package/dist/planmagnet/comments/RoadmapComments.js +21 -21
- package/dist/planmagnet/controls/AutomationRuleControls.js +24 -24
- package/dist/planmagnet/controls/FeatureControls.js +60 -60
- package/dist/planmagnet/controls/MilestoneControls.d.ts +2 -0
- package/dist/planmagnet/controls/MilestoneControls.d.ts.map +1 -1
- package/dist/planmagnet/controls/MilestoneControls.js +89 -72
- package/dist/planmagnet/controls/MilestoneControls.js.map +1 -1
- package/dist/planmagnet/controls/SyncControls.js +59 -59
- package/dist/planmagnet/discussion/WorkItemDiscussionPanel.js +15 -15
- package/dist/planmagnet/docs/DocSuggestionsPanel.js +12 -12
- package/dist/planmagnet/docs/DocVersionCompare.js +3 -3
- package/dist/planmagnet/forecast/DeliveryForecastCard.d.ts +12 -0
- package/dist/planmagnet/forecast/DeliveryForecastCard.d.ts.map +1 -0
- package/dist/planmagnet/forecast/DeliveryForecastCard.js +208 -0
- package/dist/planmagnet/forecast/DeliveryForecastCard.js.map +1 -0
- package/dist/planmagnet/forecast/ProjectOutlookCard.d.ts +5 -0
- package/dist/planmagnet/forecast/ProjectOutlookCard.d.ts.map +1 -0
- package/dist/planmagnet/forecast/ProjectOutlookCard.js +190 -0
- package/dist/planmagnet/forecast/ProjectOutlookCard.js.map +1 -0
- package/dist/planmagnet/forecast/ProjectRiskSummaryCard.d.ts +5 -0
- package/dist/planmagnet/forecast/ProjectRiskSummaryCard.d.ts.map +1 -0
- package/dist/planmagnet/forecast/ProjectRiskSummaryCard.js +99 -0
- package/dist/planmagnet/forecast/ProjectRiskSummaryCard.js.map +1 -0
- package/dist/planmagnet/forecast/ResourceForecastCard.d.ts +8 -0
- package/dist/planmagnet/forecast/ResourceForecastCard.d.ts.map +1 -0
- package/dist/planmagnet/forecast/ResourceForecastCard.js +185 -0
- package/dist/planmagnet/forecast/ResourceForecastCard.js.map +1 -0
- package/dist/planmagnet/forecast/riskFlags.d.ts +35 -0
- package/dist/planmagnet/forecast/riskFlags.d.ts.map +1 -0
- package/dist/planmagnet/forecast/riskFlags.js +37 -0
- package/dist/planmagnet/forecast/riskFlags.js.map +1 -0
- package/dist/planmagnet/meetings/MeetingActionItemsPanel.d.ts +17 -0
- package/dist/planmagnet/meetings/MeetingActionItemsPanel.d.ts.map +1 -0
- package/dist/planmagnet/meetings/MeetingActionItemsPanel.js +218 -0
- package/dist/planmagnet/meetings/MeetingActionItemsPanel.js.map +1 -0
- package/dist/planmagnet/meetings/MeetingsCard.d.ts +7 -0
- package/dist/planmagnet/meetings/MeetingsCard.d.ts.map +1 -0
- package/dist/planmagnet/meetings/MeetingsCard.js +108 -0
- package/dist/planmagnet/meetings/MeetingsCard.js.map +1 -0
- package/dist/planmagnet/meetings/ScheduleCeremoniesDialog.d.ts +9 -0
- package/dist/planmagnet/meetings/ScheduleCeremoniesDialog.d.ts.map +1 -0
- package/dist/planmagnet/meetings/ScheduleCeremoniesDialog.js +232 -0
- package/dist/planmagnet/meetings/ScheduleCeremoniesDialog.js.map +1 -0
- package/dist/planmagnet/meetings/ScheduleMeetingDialog.d.ts +19 -0
- package/dist/planmagnet/meetings/ScheduleMeetingDialog.d.ts.map +1 -0
- package/dist/planmagnet/meetings/ScheduleMeetingDialog.js +226 -0
- package/dist/planmagnet/meetings/ScheduleMeetingDialog.js.map +1 -0
- package/dist/planmagnet/meetings/UnlinkMeetingDialog.d.ts +14 -0
- package/dist/planmagnet/meetings/UnlinkMeetingDialog.d.ts.map +1 -0
- package/dist/planmagnet/meetings/UnlinkMeetingDialog.js +81 -0
- package/dist/planmagnet/meetings/UnlinkMeetingDialog.js.map +1 -0
- package/dist/planmagnet/meetings/meetingActions.d.ts +57 -0
- package/dist/planmagnet/meetings/meetingActions.d.ts.map +1 -0
- package/dist/planmagnet/meetings/meetingActions.js +51 -0
- package/dist/planmagnet/meetings/meetingActions.js.map +1 -0
- package/dist/planmagnet/meetings/meetingGraphql.d.ts +29 -0
- package/dist/planmagnet/meetings/meetingGraphql.d.ts.map +1 -0
- package/dist/planmagnet/meetings/meetingGraphql.js +166 -0
- package/dist/planmagnet/meetings/meetingGraphql.js.map +1 -0
- package/dist/planmagnet/meetings/meetingModel.d.ts +74 -0
- package/dist/planmagnet/meetings/meetingModel.d.ts.map +1 -0
- package/dist/planmagnet/meetings/meetingModel.js +88 -0
- package/dist/planmagnet/meetings/meetingModel.js.map +1 -0
- package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.js +216 -182
- package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.js.map +1 -1
- package/dist/planmagnet/pages/AutomationAutomationRuleDetailPagePage.js +11 -11
- package/dist/planmagnet/pages/AutomationCreateAutomationRulePagePage.js +4 -4
- package/dist/planmagnet/pages/DocsDocDetailPagePage.js +163 -163
- package/dist/planmagnet/pages/DocsDocDetailPagePage.js.map +1 -1
- package/dist/planmagnet/pages/IntegrationsNewSyncPagePage.js +165 -165
- package/dist/planmagnet/pages/IntegrationsNewSyncPagePage.js.map +1 -1
- package/dist/planmagnet/pages/MeetingsMeetingDetailPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/MeetingsMeetingDetailPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/MeetingsMeetingDetailPagePage.js +197 -0
- package/dist/planmagnet/pages/MeetingsMeetingDetailPagePage.js.map +1 -0
- package/dist/planmagnet/pages/MeetingsMeetingsPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/MeetingsMeetingsPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/MeetingsMeetingsPagePage.js +173 -0
- package/dist/planmagnet/pages/MeetingsMeetingsPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProjectsAtRiskPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProjectsAtRiskPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProjectsAtRiskPagePage.js +234 -0
- package/dist/planmagnet/pages/ProjectsAtRiskPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProjectsMilestonesPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProjectsMilestonesPagePage.js +73 -52
- 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 +205 -190
- 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 +211 -182
- package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ReportsReportPagePage.js +22 -22
- package/dist/planmagnet/pages/ReportsReportPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ReportsReportsPagePage.js +21 -21
- package/dist/planmagnet/pages/TeamTeamDetailPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/TeamTeamDetailPagePage.js +88 -83
- package/dist/planmagnet/pages/TeamTeamDetailPagePage.js.map +1 -1
- package/dist/planmagnet/pages/analytics/SprintDeliveryCards.d.ts.map +1 -1
- package/dist/planmagnet/pages/analytics/SprintDeliveryCards.js +139 -112
- package/dist/planmagnet/pages/analytics/SprintDeliveryCards.js.map +1 -1
- package/dist/planmagnet/pages/analytics/StatusFlowCard.js +21 -21
- package/dist/planmagnet/product/ProductControls.js +91 -91
- package/dist/planmagnet/reports/SchedulesPanel.js +33 -33
- package/dist/planmagnet/reports/ShareDialog.js +76 -76
- package/dist/planmagnet/reports/ShareDialog.js.map +1 -1
- package/dist/planmagnet/reports/sharedReportRoute.d.ts +3 -2
- package/dist/planmagnet/reports/sharedReportRoute.d.ts.map +1 -1
- package/dist/planmagnet/reports/sharedReportRoute.js.map +1 -1
- package/dist/planmagnet/roadmaps/RoadmapControls.js +60 -60
- package/dist/planmagnet/roadmaps/RoadmapNowNextLater.js +30 -30
- package/dist/planmagnet/roadmaps/RoadmapReviewPanel.js +21 -21
- package/dist/planmagnet/roadmaps/RoadmapVersionsPanel.js +22 -22
- package/package.json +1 -1
|
@@ -2,34 +2,36 @@ import { usePlanMagnet as e } from "../providers/PlanMagnetProvider.js";
|
|
|
2
2
|
import { Legend as t } from "../../node_modules/recharts/es6/component/Legend.js";
|
|
3
3
|
import { Tooltip as n } from "../../node_modules/recharts/es6/component/Tooltip.js";
|
|
4
4
|
import { ResponsiveContainer as r } from "../../node_modules/recharts/es6/component/ResponsiveContainer.js";
|
|
5
|
-
import { Bar as
|
|
6
|
-
import { ReferenceLine as
|
|
7
|
-
import {
|
|
5
|
+
import { Bar as i } from "../../node_modules/recharts/es6/cartesian/Bar.js";
|
|
6
|
+
import { ReferenceLine as ee } from "../../node_modules/recharts/es6/cartesian/ReferenceLine.js";
|
|
7
|
+
import { ReferenceArea as te } from "../../node_modules/recharts/es6/cartesian/ReferenceArea.js";
|
|
8
|
+
import { CartesianGrid as a } from "../../node_modules/recharts/es6/cartesian/CartesianGrid.js";
|
|
8
9
|
import { Line as ne } from "../../node_modules/recharts/es6/cartesian/Line.js";
|
|
9
10
|
import { Area as re } from "../../node_modules/recharts/es6/cartesian/Area.js";
|
|
10
|
-
import { XAxis as
|
|
11
|
-
import { YAxis as
|
|
11
|
+
import { XAxis as o } from "../../node_modules/recharts/es6/cartesian/XAxis.js";
|
|
12
|
+
import { YAxis as s } from "../../node_modules/recharts/es6/cartesian/YAxis.js";
|
|
12
13
|
import { LineChart as ie } from "../../node_modules/recharts/es6/chart/LineChart.js";
|
|
13
14
|
import { BarChart as ae } from "../../node_modules/recharts/es6/chart/BarChart.js";
|
|
14
15
|
import { AreaChart as oe } from "../../node_modules/recharts/es6/chart/AreaChart.js";
|
|
15
|
-
import { countLabel as
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
19
|
-
import {
|
|
20
|
-
import {
|
|
21
|
-
import {
|
|
22
|
-
import {
|
|
16
|
+
import { countLabel as c, useProjectCounts as se, useSprintCounts as ce } from "../hooks/useCounts.js";
|
|
17
|
+
import { DeliveryForecastCard as le } from "../forecast/DeliveryForecastCard.js";
|
|
18
|
+
import { BudgetPerformanceCard as ue, CycleTimeCard as de } from "./analytics/DeliveryHealthCards.js";
|
|
19
|
+
import { QualityMetricsCard as fe } from "./analytics/QualityMetricsCard.js";
|
|
20
|
+
import { DeliveryKpisCard as pe } from "./analytics/DeliveryKpisCard.js";
|
|
21
|
+
import { ThroughputCard as me } from "./analytics/ThroughputCard.js";
|
|
22
|
+
import { StatusFlowCard as he } from "./analytics/StatusFlowCard.js";
|
|
23
|
+
import { WorkBreakdownCard as ge } from "./analytics/WorkBreakdownCard.js";
|
|
24
|
+
import { activePreset as _e, isValidRange as l, presetRange as ve, scopeToProjectId as ye, toRangeVariables as be } from "./analytics/analyticsRange.js";
|
|
23
25
|
import { useState as u } from "react";
|
|
24
|
-
import { BarChart3 as
|
|
25
|
-
import { useSearchParams as
|
|
26
|
+
import { BarChart3 as xe, FolderKanban as Se, Target as Ce, TrendingUp as we, Zap as Te } from "lucide-react";
|
|
27
|
+
import { useSearchParams as Ee } from "react-router";
|
|
26
28
|
import { gql as d } from "@apollo/client";
|
|
27
29
|
import { useQuery as f } from "@apollo/client/react";
|
|
28
|
-
import { Fragment as
|
|
29
|
-
import { useI18n as
|
|
30
|
-
import { Badge as
|
|
30
|
+
import { Fragment as De, jsx as p, jsxs as m } from "react/jsx-runtime";
|
|
31
|
+
import { useI18n as Oe } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
32
|
+
import { Badge as ke, Card as h, CardContent as g, CardHeader as _, CardTitle as v, Input as y, Select as b, SelectContent as x, SelectItem as S, SelectTrigger as C, SelectValue as w } from "@burdenoff/fe-libs/ui";
|
|
31
33
|
//#region src/planmagnet/pages/AnalyticsAnalyticsPagePage.tsx
|
|
32
|
-
var
|
|
34
|
+
var Ae = d`
|
|
33
35
|
query AnalyticsProjectSprints($workspaceId: ID!, $projectId: String) {
|
|
34
36
|
planmagnetSprints(
|
|
35
37
|
workspaceId: $workspaceId
|
|
@@ -45,7 +47,7 @@ var Oe = d`
|
|
|
45
47
|
}
|
|
46
48
|
}
|
|
47
49
|
}
|
|
48
|
-
`,
|
|
50
|
+
`, je = d`
|
|
49
51
|
query AnalyticsMilestoneRisk($workspaceId: ID!, $yesterday: DateTime) {
|
|
50
52
|
missed: planmagnetMilestones(
|
|
51
53
|
workspaceId: $workspaceId
|
|
@@ -62,7 +64,7 @@ var Oe = d`
|
|
|
62
64
|
totalCount
|
|
63
65
|
}
|
|
64
66
|
}
|
|
65
|
-
`,
|
|
67
|
+
`, Me = d`
|
|
66
68
|
query GetAnalyticsWorkItemCounts($workspaceId: ID!) {
|
|
67
69
|
planmagnetWorkItemCounts(workspaceId: $workspaceId) {
|
|
68
70
|
total
|
|
@@ -80,7 +82,7 @@ var Oe = d`
|
|
|
80
82
|
}
|
|
81
83
|
}
|
|
82
84
|
}
|
|
83
|
-
`,
|
|
85
|
+
`, Ne = d`
|
|
84
86
|
query GetAnalyticsData($workspaceId: ID!, $projectPagination: PlanmagnetPaginationInput) {
|
|
85
87
|
planmagnetProjects(workspaceId: $workspaceId, pagination: $projectPagination) {
|
|
86
88
|
items {
|
|
@@ -95,7 +97,7 @@ var Oe = d`
|
|
|
95
97
|
totalCount
|
|
96
98
|
}
|
|
97
99
|
}
|
|
98
|
-
`,
|
|
100
|
+
`, Pe = d`
|
|
99
101
|
query GetSprintBurndown($workspaceId: ID!, $sprintId: ID!) {
|
|
100
102
|
planmagnetSprintBurndown(workspaceId: $workspaceId, sprintId: $sprintId) {
|
|
101
103
|
sprintId
|
|
@@ -112,7 +114,7 @@ var Oe = d`
|
|
|
112
114
|
}
|
|
113
115
|
}
|
|
114
116
|
}
|
|
115
|
-
`,
|
|
117
|
+
`, Fe = d`
|
|
116
118
|
query GetVelocity($workspaceId: ID!, $projectId: ID!, $trailingSprintCount: Int) {
|
|
117
119
|
planmagnetVelocity(
|
|
118
120
|
workspaceId: $workspaceId
|
|
@@ -122,6 +124,11 @@ var Oe = d`
|
|
|
122
124
|
projectId
|
|
123
125
|
averageVelocity
|
|
124
126
|
forecastNextSprintPoints
|
|
127
|
+
forecastRange {
|
|
128
|
+
p15
|
|
129
|
+
p85
|
|
130
|
+
}
|
|
131
|
+
insufficientHistory
|
|
125
132
|
sprints {
|
|
126
133
|
sprintId
|
|
127
134
|
sprintName
|
|
@@ -132,7 +139,7 @@ var Oe = d`
|
|
|
132
139
|
}
|
|
133
140
|
}
|
|
134
141
|
}
|
|
135
|
-
`,
|
|
142
|
+
`, Ie = d`
|
|
136
143
|
query GetCumulativeFlow(
|
|
137
144
|
$workspaceId: ID!
|
|
138
145
|
$projectId: ID!
|
|
@@ -171,20 +178,20 @@ function E(e) {
|
|
|
171
178
|
return `${t.getUTCMonth() + 1}/${t.getUTCDate()}`;
|
|
172
179
|
}
|
|
173
180
|
function D() {
|
|
174
|
-
let { workspaceId: d } = e(), { t: D } =
|
|
181
|
+
let { workspaceId: d } = e(), { t: D } = Oe(), [Le, O] = u(""), [k, Re] = Ee(), A = k.get("from"), j = k.get("to"), [M, N] = u(() => A && j && l(A, j) ? {
|
|
175
182
|
from: A,
|
|
176
183
|
to: j
|
|
177
|
-
} :
|
|
178
|
-
function
|
|
179
|
-
N(e),
|
|
184
|
+
} : ve("30")), [ze, Be] = u(M), [P, Ve] = u(k.get("project") || "all"), F = ye(P), He = _e(M), Ue = l(M.from, M.to), We = Ue ? null : D("planmagnet.analytics.range.invalid", "\"From\" must be on or before \"To\".");
|
|
185
|
+
function I(e, t) {
|
|
186
|
+
N(e), l(e.from, e.to) && Be(e);
|
|
180
187
|
let n = new URLSearchParams(k);
|
|
181
|
-
n.set("from", e.from), n.set("to", e.to), t === "all" ? n.delete("project") : n.set("project", t),
|
|
188
|
+
n.set("from", e.from), n.set("to", e.to), t === "all" ? n.delete("project") : n.set("project", t), Re(n, { replace: !0 });
|
|
182
189
|
}
|
|
183
|
-
function
|
|
184
|
-
|
|
190
|
+
function Ge(e) {
|
|
191
|
+
I(ve(e), P);
|
|
185
192
|
}
|
|
186
|
-
function
|
|
187
|
-
e && M.to &&
|
|
193
|
+
function Ke(e) {
|
|
194
|
+
e && M.to && l(e, M.to) ? I({
|
|
188
195
|
from: e,
|
|
189
196
|
to: M.to
|
|
190
197
|
}, P) : N((t) => ({
|
|
@@ -192,8 +199,8 @@ function D() {
|
|
|
192
199
|
from: e
|
|
193
200
|
}));
|
|
194
201
|
}
|
|
195
|
-
function
|
|
196
|
-
e && M.from &&
|
|
202
|
+
function qe(e) {
|
|
203
|
+
e && M.from && l(M.from, e) ? I({
|
|
197
204
|
from: M.from,
|
|
198
205
|
to: e
|
|
199
206
|
}, P) : N((t) => ({
|
|
@@ -201,98 +208,98 @@ function D() {
|
|
|
201
208
|
to: e
|
|
202
209
|
}));
|
|
203
210
|
}
|
|
204
|
-
function
|
|
205
|
-
|
|
211
|
+
function Je(e) {
|
|
212
|
+
Ve(e), O(""), I(M, e);
|
|
206
213
|
}
|
|
207
|
-
let { startDate:
|
|
214
|
+
let { startDate: L, endDate: R } = be(Ue ? M : ze), { data: Ye, loading: Xe, error: Ze } = f(Ne, {
|
|
208
215
|
variables: {
|
|
209
216
|
workspaceId: d,
|
|
210
217
|
projectPagination: { first: 100 }
|
|
211
218
|
},
|
|
212
219
|
skip: !d
|
|
213
|
-
}), { data:
|
|
220
|
+
}), { data: Qe } = f(Me, {
|
|
214
221
|
variables: { workspaceId: d },
|
|
215
222
|
skip: !d
|
|
216
|
-
}),
|
|
223
|
+
}), z = Qe?.planmagnetWorkItemCounts, $e = se(), et = ce(), [tt] = u(() => (/* @__PURE__ */ new Date(Date.now() - 864e5)).toISOString().slice(0, 10)), { data: B } = f(je, {
|
|
217
224
|
variables: {
|
|
218
225
|
workspaceId: d,
|
|
219
|
-
yesterday:
|
|
226
|
+
yesterday: tt
|
|
220
227
|
},
|
|
221
228
|
skip: !d
|
|
222
|
-
}),
|
|
229
|
+
}), V = Ye?.planmagnetProjects?.items ?? [], H = F || V[0]?.id || "", { data: nt } = f(Ae, {
|
|
223
230
|
variables: {
|
|
224
231
|
workspaceId: d,
|
|
225
|
-
projectId:
|
|
232
|
+
projectId: H
|
|
226
233
|
},
|
|
227
|
-
skip: !d || !
|
|
228
|
-
}),
|
|
234
|
+
skip: !d || !H
|
|
235
|
+
}), U = nt?.planmagnetSprints.items ?? [], rt = U.filter((e) => e.status === "COMPLETED").sort((e, t) => (t.completedAt ?? t.endDate ?? "").localeCompare(e.completedAt ?? e.endDate ?? ""))[0], it = U.find((e) => e.status === "ACTIVE" || e.status === "REVIEW") ?? rt ?? U[0], W = Le || it?.id || "", G = V.find((e) => e.id === H)?.name ?? "", { data: at, loading: ot } = f(Pe, {
|
|
229
236
|
variables: {
|
|
230
237
|
workspaceId: d,
|
|
231
|
-
sprintId:
|
|
238
|
+
sprintId: W
|
|
232
239
|
},
|
|
233
|
-
skip: !d || !
|
|
234
|
-
}), { data:
|
|
240
|
+
skip: !d || !W
|
|
241
|
+
}), { data: st, loading: ct } = f(Fe, {
|
|
235
242
|
variables: {
|
|
236
243
|
workspaceId: d,
|
|
237
|
-
projectId:
|
|
244
|
+
projectId: H,
|
|
238
245
|
trailingSprintCount: 6
|
|
239
246
|
},
|
|
240
|
-
skip: !d || !
|
|
241
|
-
}), { data:
|
|
247
|
+
skip: !d || !H
|
|
248
|
+
}), { data: lt, loading: ut } = f(Ie, {
|
|
242
249
|
variables: {
|
|
243
250
|
workspaceId: d,
|
|
244
|
-
projectId:
|
|
245
|
-
startDate:
|
|
246
|
-
endDate:
|
|
251
|
+
projectId: H,
|
|
252
|
+
startDate: L,
|
|
253
|
+
endDate: R
|
|
247
254
|
},
|
|
248
|
-
skip: !d || !
|
|
255
|
+
skip: !d || !H
|
|
249
256
|
});
|
|
250
|
-
if (
|
|
257
|
+
if (Xe && !Ye) return /* @__PURE__ */ p("div", {
|
|
251
258
|
className: "flex items-center justify-center p-12",
|
|
252
259
|
children: /* @__PURE__ */ p("div", { className: "animate-spin h-8 w-8 border-2 border-primary border-t-transparent rounded-full" })
|
|
253
260
|
});
|
|
254
|
-
if (
|
|
261
|
+
if (Ze) return /* @__PURE__ */ m("div", {
|
|
255
262
|
className: "p-6 text-red-500",
|
|
256
263
|
children: [
|
|
257
264
|
D("planmagnet.analytics.errorLoading", "Error loading analytics"),
|
|
258
265
|
": ",
|
|
259
|
-
|
|
266
|
+
Ze.message
|
|
260
267
|
]
|
|
261
268
|
});
|
|
262
|
-
let
|
|
263
|
-
let t =
|
|
269
|
+
let K = (e) => z?.byStatus.find((t) => t.status === e), q = K("CANCELLED")?.count ?? 0, dt = z ? K("DONE")?.count ?? 0 : null, J = z ? z.total : null, Y = z ? z.blocked : null, ft = z ? z.points : null, pt = z ? K("DONE")?.points ?? 0 : null, mt = (e) => {
|
|
270
|
+
let t = z?.byProject.filter((t) => t.projectId === e) ?? [], n = t.filter((e) => e.status !== "CANCELLED").reduce((e, t) => e + t.count, 0), r = t.filter((e) => e.status === "DONE").reduce((e, t) => e + t.count, 0);
|
|
264
271
|
return n > 0 ? Math.round(r / n * 100) : 0;
|
|
265
|
-
},
|
|
272
|
+
}, ht = et?.running ?? null, gt = B ? B.missed.totalCount + B.overdue.totalCount : null, _t = $e?.active ?? null, vt = J != null && dt != null && J - q > 0 ? Math.round(dt / (J - q) * 100) : null, yt = (at?.planmagnetSprintBurndown)?.points.map((e) => ({
|
|
266
273
|
day: E(e.date),
|
|
267
274
|
remaining: e.remainingPoints,
|
|
268
275
|
completed: e.completedPoints
|
|
269
|
-
})) ?? [], X =
|
|
276
|
+
})) ?? [], X = st?.planmagnetVelocity, Z = X?.sprints.map((e) => ({
|
|
270
277
|
name: e.sprintName,
|
|
271
278
|
completed: e.completedPoints,
|
|
272
279
|
planned: e.plannedPoints ?? void 0
|
|
273
|
-
})) ?? [],
|
|
280
|
+
})) ?? [], bt = X ? Math.round(X.averageVelocity) : 0, xt = X ? Math.round(X.forecastNextSprintPoints) : 0, Q = X?.forecastRange ?? null, St = X?.insufficientHistory ?? !1, Ct = lt?.planmagnetCumulativeFlow, wt = Array.from(new Set(Ct?.points.flatMap((e) => e.statuses.map((e) => e.status)) ?? [])), $ = Ct?.points.map((e) => {
|
|
274
281
|
let t = { day: E(e.date) };
|
|
275
282
|
for (let n of e.statuses) t[n.status] = n.count;
|
|
276
283
|
return t;
|
|
277
|
-
}) ?? [],
|
|
284
|
+
}) ?? [], Tt = [
|
|
278
285
|
{
|
|
279
286
|
label: D("planmagnet.analytics.metrics.totalWorkItems.label", "Total Work Items"),
|
|
280
|
-
value:
|
|
281
|
-
trend: `${
|
|
287
|
+
value: c(J),
|
|
288
|
+
trend: `${c(vt)}% ${D("planmagnet.analytics.metrics.totalWorkItems.trend", "completed")}`
|
|
282
289
|
},
|
|
283
290
|
{
|
|
284
291
|
label: D("planmagnet.analytics.metrics.storyPoints.label", "Story Points"),
|
|
285
|
-
value:
|
|
286
|
-
trend: `${
|
|
292
|
+
value: c(ft),
|
|
293
|
+
trend: `${c(pt)} ${D("planmagnet.analytics.metrics.storyPoints.trend", "completed")}`
|
|
287
294
|
},
|
|
288
295
|
{
|
|
289
296
|
label: D("planmagnet.analytics.metrics.activeProjects.label", "Active Projects"),
|
|
290
|
-
value:
|
|
291
|
-
trend: `${
|
|
297
|
+
value: c(_t),
|
|
298
|
+
trend: `${c($e?.all)} ${D("planmagnet.analytics.metrics.activeProjects.trend", "total")}`
|
|
292
299
|
},
|
|
293
300
|
{
|
|
294
301
|
label: D("planmagnet.analytics.metrics.blockedItems.label", "Blocked Items"),
|
|
295
|
-
value:
|
|
302
|
+
value: c(Y),
|
|
296
303
|
trend: Y == null ? "" : Y > 0 ? D("planmagnet.analytics.metrics.blockedItems.attention", "Needs attention") : D("planmagnet.analytics.metrics.blockedItems.clear", "All clear")
|
|
297
304
|
}
|
|
298
305
|
];
|
|
@@ -323,9 +330,9 @@ function D() {
|
|
|
323
330
|
"90"
|
|
324
331
|
].map((e) => /* @__PURE__ */ p("button", {
|
|
325
332
|
type: "button",
|
|
326
|
-
"aria-pressed":
|
|
327
|
-
onClick: () =>
|
|
328
|
-
className: `px-2.5 py-1 text-xs rounded ${
|
|
333
|
+
"aria-pressed": He === e,
|
|
334
|
+
onClick: () => Ge(e),
|
|
335
|
+
className: `px-2.5 py-1 text-xs rounded ${He === e ? "bg-primary text-primary-foreground" : "text-muted-foreground hover:bg-muted"}`,
|
|
329
336
|
children: D("planmagnet.analytics.range.last", "Last {{days}} days", { days: e })
|
|
330
337
|
}, e))
|
|
331
338
|
}),
|
|
@@ -343,7 +350,7 @@ function D() {
|
|
|
343
350
|
className: "h-8 w-36",
|
|
344
351
|
value: M.from,
|
|
345
352
|
max: M.to,
|
|
346
|
-
onChange: (e) =>
|
|
353
|
+
onChange: (e) => Ke(e.target.value)
|
|
347
354
|
}),
|
|
348
355
|
/* @__PURE__ */ p("span", {
|
|
349
356
|
className: "text-muted-foreground text-sm",
|
|
@@ -360,19 +367,19 @@ function D() {
|
|
|
360
367
|
className: "h-8 w-36",
|
|
361
368
|
value: M.to,
|
|
362
369
|
min: M.from,
|
|
363
|
-
onChange: (e) =>
|
|
370
|
+
onChange: (e) => qe(e.target.value)
|
|
364
371
|
})
|
|
365
372
|
]
|
|
366
373
|
}),
|
|
367
|
-
|
|
374
|
+
We && /* @__PURE__ */ p("p", {
|
|
368
375
|
role: "alert",
|
|
369
376
|
className: "text-xs text-status-error-text",
|
|
370
|
-
children:
|
|
377
|
+
children: We
|
|
371
378
|
})
|
|
372
379
|
]
|
|
373
380
|
}), /* @__PURE__ */ m(b, {
|
|
374
381
|
value: P,
|
|
375
|
-
onValueChange:
|
|
382
|
+
onValueChange: Je,
|
|
376
383
|
children: [/* @__PURE__ */ p(C, {
|
|
377
384
|
className: "h-8 w-56",
|
|
378
385
|
"data-testid": "analytics-project",
|
|
@@ -380,7 +387,7 @@ function D() {
|
|
|
380
387
|
}), /* @__PURE__ */ m(x, { children: [/* @__PURE__ */ p(S, {
|
|
381
388
|
value: "all",
|
|
382
389
|
children: D("planmagnet.analytics.range.allProjects", "All projects")
|
|
383
|
-
}),
|
|
390
|
+
}), V.map((e) => /* @__PURE__ */ p(S, {
|
|
384
391
|
value: e.id,
|
|
385
392
|
children: e.name
|
|
386
393
|
}, e.id))] })]
|
|
@@ -388,7 +395,7 @@ function D() {
|
|
|
388
395
|
}),
|
|
389
396
|
/* @__PURE__ */ p("div", {
|
|
390
397
|
className: "grid grid-cols-2 md:grid-cols-4 gap-4",
|
|
391
|
-
children:
|
|
398
|
+
children: Tt.map((e) => /* @__PURE__ */ p(h, { children: /* @__PURE__ */ m(g, {
|
|
392
399
|
className: "pt-4",
|
|
393
400
|
children: [
|
|
394
401
|
/* @__PURE__ */ p("p", {
|
|
@@ -413,20 +420,20 @@ function D() {
|
|
|
413
420
|
className: "pt-4",
|
|
414
421
|
children: [/* @__PURE__ */ m("div", {
|
|
415
422
|
className: "flex items-center gap-2 text-muted-foreground text-xs",
|
|
416
|
-
children: [/* @__PURE__ */ p(
|
|
423
|
+
children: [/* @__PURE__ */ p(Se, { className: "h-4 w-4" }), D("planmagnet.analytics.summary.activeProjects", "Active Projects")]
|
|
417
424
|
}), /* @__PURE__ */ p("p", {
|
|
418
425
|
className: "text-xl font-bold mt-1",
|
|
419
|
-
children:
|
|
426
|
+
children: c(_t)
|
|
420
427
|
})]
|
|
421
428
|
}) }),
|
|
422
429
|
/* @__PURE__ */ p(h, { children: /* @__PURE__ */ m(g, {
|
|
423
430
|
className: "pt-4",
|
|
424
431
|
children: [/* @__PURE__ */ m("div", {
|
|
425
432
|
className: "flex items-center gap-2 text-muted-foreground text-xs",
|
|
426
|
-
children: [/* @__PURE__ */ p(
|
|
433
|
+
children: [/* @__PURE__ */ p(Te, { className: "h-4 w-4" }), D("planmagnet.analytics.summary.activeSprints", "Active Sprints")]
|
|
427
434
|
}), /* @__PURE__ */ p("p", {
|
|
428
435
|
className: "text-xl font-bold mt-1",
|
|
429
|
-
children:
|
|
436
|
+
children: c(ht)
|
|
430
437
|
})]
|
|
431
438
|
}) }),
|
|
432
439
|
/* @__PURE__ */ p(h, { children: /* @__PURE__ */ m(g, {
|
|
@@ -434,16 +441,16 @@ function D() {
|
|
|
434
441
|
children: [
|
|
435
442
|
/* @__PURE__ */ m("div", {
|
|
436
443
|
className: "flex items-center gap-2 text-muted-foreground text-xs",
|
|
437
|
-
children: [/* @__PURE__ */ p(
|
|
444
|
+
children: [/* @__PURE__ */ p(we, { className: "h-4 w-4" }), D("planmagnet.analytics.summary.avgVelocity", "Avg Velocity")]
|
|
438
445
|
}),
|
|
439
446
|
/* @__PURE__ */ p("p", {
|
|
440
447
|
className: "text-xs text-muted-foreground truncate",
|
|
441
|
-
children:
|
|
448
|
+
children: G || "—"
|
|
442
449
|
}),
|
|
443
450
|
/* @__PURE__ */ m("p", {
|
|
444
451
|
className: "text-xl font-bold mt-1",
|
|
445
452
|
children: [
|
|
446
|
-
|
|
453
|
+
bt,
|
|
447
454
|
" ",
|
|
448
455
|
D("planmagnet.analytics.summary.pointsShort", "pts")
|
|
449
456
|
]
|
|
@@ -454,11 +461,11 @@ function D() {
|
|
|
454
461
|
className: "pt-4",
|
|
455
462
|
children: [/* @__PURE__ */ m("div", {
|
|
456
463
|
className: "flex items-center gap-2 text-muted-foreground text-xs",
|
|
457
|
-
children: [/* @__PURE__ */ p(
|
|
464
|
+
children: [/* @__PURE__ */ p(Ce, { className: "h-4 w-4" }), D("planmagnet.analytics.summary.atRisk", "At Risk")]
|
|
458
465
|
}), /* @__PURE__ */ m("p", {
|
|
459
466
|
className: "text-xl font-bold mt-1",
|
|
460
467
|
children: [
|
|
461
|
-
|
|
468
|
+
c(gt),
|
|
462
469
|
" ",
|
|
463
470
|
D("planmagnet.analytics.summary.milestones", "milestones")
|
|
464
471
|
]
|
|
@@ -473,16 +480,16 @@ function D() {
|
|
|
473
480
|
children: D("planmagnet.analytics.delivery.title", "Sprint Delivery Analytics")
|
|
474
481
|
}), /* @__PURE__ */ p("p", {
|
|
475
482
|
className: "text-xs text-muted-foreground",
|
|
476
|
-
children: D("planmagnet.analytics.delivery.forProject", "For {{project}}", { project:
|
|
483
|
+
children: D("planmagnet.analytics.delivery.forProject", "For {{project}}", { project: G || D("planmagnet.analytics.delivery.noProject", "no project") })
|
|
477
484
|
})] }), /* @__PURE__ */ p("div", {
|
|
478
485
|
className: "flex gap-2 sm:ml-auto",
|
|
479
486
|
children: /* @__PURE__ */ m(b, {
|
|
480
|
-
value:
|
|
487
|
+
value: W,
|
|
481
488
|
onValueChange: O,
|
|
482
489
|
children: [/* @__PURE__ */ p(C, {
|
|
483
490
|
className: "h-8 w-48",
|
|
484
491
|
children: /* @__PURE__ */ p(w, { placeholder: D("planmagnet.analytics.delivery.sprintPlaceholder", "Select sprint") })
|
|
485
|
-
}), /* @__PURE__ */ p(x, { children:
|
|
492
|
+
}), /* @__PURE__ */ p(x, { children: U.map((e) => /* @__PURE__ */ p(S, {
|
|
486
493
|
value: e.id,
|
|
487
494
|
children: e.name
|
|
488
495
|
}, e.id)) })]
|
|
@@ -493,25 +500,25 @@ function D() {
|
|
|
493
500
|
className: "grid grid-cols-1 lg:grid-cols-2 gap-6",
|
|
494
501
|
children: [/* @__PURE__ */ m(h, { children: [/* @__PURE__ */ p(_, { children: /* @__PURE__ */ m(v, {
|
|
495
502
|
className: "flex items-center gap-2",
|
|
496
|
-
children: [/* @__PURE__ */ p(
|
|
497
|
-
}) }), /* @__PURE__ */ p(g, { children:
|
|
503
|
+
children: [/* @__PURE__ */ p(xe, { className: "h-4 w-4" }), D("planmagnet.analytics.burndown.title", "Sprint Burndown")]
|
|
504
|
+
}) }), /* @__PURE__ */ p(g, { children: ot ? /* @__PURE__ */ p("div", {
|
|
498
505
|
className: "flex justify-center py-12",
|
|
499
506
|
children: /* @__PURE__ */ p("div", { className: "animate-spin h-6 w-6 border-2 border-primary border-t-transparent rounded-full" })
|
|
500
|
-
}) :
|
|
507
|
+
}) : yt.length > 0 ? /* @__PURE__ */ p(r, {
|
|
501
508
|
width: "100%",
|
|
502
509
|
height: 220,
|
|
503
510
|
children: /* @__PURE__ */ m(ie, {
|
|
504
|
-
data:
|
|
511
|
+
data: yt,
|
|
505
512
|
children: [
|
|
506
|
-
/* @__PURE__ */ p(
|
|
513
|
+
/* @__PURE__ */ p(a, {
|
|
507
514
|
strokeDasharray: "3 3",
|
|
508
515
|
opacity: .2
|
|
509
516
|
}),
|
|
510
|
-
/* @__PURE__ */ p(
|
|
517
|
+
/* @__PURE__ */ p(o, {
|
|
511
518
|
dataKey: "day",
|
|
512
519
|
tick: { fontSize: 11 }
|
|
513
520
|
}),
|
|
514
|
-
/* @__PURE__ */ p(
|
|
521
|
+
/* @__PURE__ */ p(s, {
|
|
515
522
|
tick: { fontSize: 11 },
|
|
516
523
|
allowDecimals: !1
|
|
517
524
|
}),
|
|
@@ -541,7 +548,7 @@ function D() {
|
|
|
541
548
|
}) })] }), /* @__PURE__ */ m(h, { children: [/* @__PURE__ */ p(_, { children: /* @__PURE__ */ m(v, {
|
|
542
549
|
className: "flex items-center gap-2",
|
|
543
550
|
children: [
|
|
544
|
-
/* @__PURE__ */ p(
|
|
551
|
+
/* @__PURE__ */ p(we, { className: "h-4 w-4" }),
|
|
545
552
|
D("planmagnet.analytics.velocity.title", "Sprint Velocity"),
|
|
546
553
|
" (",
|
|
547
554
|
Z.length,
|
|
@@ -549,69 +556,96 @@ function D() {
|
|
|
549
556
|
D("planmagnet.analytics.velocity.sprints", "Sprints"),
|
|
550
557
|
")"
|
|
551
558
|
]
|
|
552
|
-
}) }), /* @__PURE__ */ p(g, { children:
|
|
559
|
+
}) }), /* @__PURE__ */ p(g, { children: ct ? /* @__PURE__ */ p("div", {
|
|
553
560
|
className: "flex justify-center py-12",
|
|
554
561
|
children: /* @__PURE__ */ p("div", { className: "animate-spin h-6 w-6 border-2 border-primary border-t-transparent rounded-full" })
|
|
555
|
-
}) : Z.length > 0 ? /* @__PURE__ */ m(
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
562
|
+
}) : Z.length > 0 ? /* @__PURE__ */ m(De, { children: [
|
|
563
|
+
/* @__PURE__ */ p(r, {
|
|
564
|
+
width: "100%",
|
|
565
|
+
height: 190,
|
|
566
|
+
children: /* @__PURE__ */ m(ae, {
|
|
567
|
+
data: Z,
|
|
568
|
+
children: [
|
|
569
|
+
/* @__PURE__ */ p(a, {
|
|
570
|
+
strokeDasharray: "3 3",
|
|
571
|
+
opacity: .2
|
|
572
|
+
}),
|
|
573
|
+
/* @__PURE__ */ p(o, {
|
|
574
|
+
dataKey: "name",
|
|
575
|
+
tick: { fontSize: 11 }
|
|
576
|
+
}),
|
|
577
|
+
/* @__PURE__ */ p(s, {
|
|
578
|
+
tick: { fontSize: 11 },
|
|
579
|
+
allowDecimals: !1
|
|
580
|
+
}),
|
|
581
|
+
/* @__PURE__ */ p(n, {}),
|
|
582
|
+
/* @__PURE__ */ p(t, { wrapperStyle: { fontSize: 12 } }),
|
|
583
|
+
Q && /* @__PURE__ */ p(te, {
|
|
584
|
+
y1: Q.p15,
|
|
585
|
+
y2: Q.p85,
|
|
586
|
+
fill: "var(--color-chart-2)",
|
|
587
|
+
fillOpacity: .12,
|
|
588
|
+
stroke: "none"
|
|
589
|
+
}),
|
|
590
|
+
/* @__PURE__ */ p(i, {
|
|
591
|
+
dataKey: "planned",
|
|
592
|
+
name: D("planmagnet.analytics.velocity.planned", "Planned"),
|
|
593
|
+
fill: "#cbd5e1"
|
|
594
|
+
}),
|
|
595
|
+
/* @__PURE__ */ p(i, {
|
|
596
|
+
dataKey: "completed",
|
|
597
|
+
name: D("planmagnet.analytics.velocity.completed", "Completed"),
|
|
598
|
+
fill: "#6366f1"
|
|
599
|
+
}),
|
|
600
|
+
/* @__PURE__ */ p(ee, {
|
|
601
|
+
y: bt,
|
|
602
|
+
stroke: "#22c55e",
|
|
603
|
+
strokeDasharray: "4 4",
|
|
604
|
+
label: {
|
|
605
|
+
value: D("planmagnet.analytics.velocity.avgLabel", "avg"),
|
|
606
|
+
fontSize: 10,
|
|
607
|
+
position: "right"
|
|
608
|
+
}
|
|
609
|
+
})
|
|
610
|
+
]
|
|
611
|
+
})
|
|
612
|
+
}),
|
|
613
|
+
/* @__PURE__ */ m("p", {
|
|
614
|
+
className: "text-xs text-muted-foreground text-center mt-2",
|
|
615
|
+
children: [Z.length === 1 ? D("planmagnet.analytics.velocity.trailingAverageOne", "Median of the last completed sprint: {{points}} pts per sprint", { points: xt }) : D("planmagnet.analytics.velocity.trailingAverage", "Median of the last {{count}} completed sprints: {{points}} pts per sprint", {
|
|
616
|
+
points: xt,
|
|
617
|
+
count: Z.length
|
|
618
|
+
}), Q && ` · ${D("planmagnet.analytics.velocity.range", "likely range (p15–p85): {{low}}–{{high}} pts", {
|
|
619
|
+
low: Math.round(Q.p15),
|
|
620
|
+
high: Math.round(Q.p85)
|
|
621
|
+
})}`]
|
|
622
|
+
}),
|
|
623
|
+
St && /* @__PURE__ */ p("p", {
|
|
624
|
+
className: "text-xs text-status-warning-text text-center mt-1",
|
|
625
|
+
children: D("planmagnet.analytics.velocity.insufficientHistory", "Fewer than 3 sprints with completed points — this forecast is low-confidence.")
|
|
626
|
+
}),
|
|
627
|
+
/* @__PURE__ */ p("p", {
|
|
628
|
+
className: "text-xs text-muted-foreground text-center mt-1",
|
|
629
|
+
children: D("planmagnet.analytics.velocity.methodLabel", "Statistical forecast (not AI-generated).")
|
|
602
630
|
})
|
|
603
|
-
|
|
631
|
+
] }) : /* @__PURE__ */ p("p", {
|
|
604
632
|
className: "text-sm text-muted-foreground py-8 text-center",
|
|
605
633
|
children: D("planmagnet.analytics.velocity.empty", "No completed sprints yet for this project")
|
|
606
634
|
}) })] })]
|
|
607
635
|
}),
|
|
636
|
+
/* @__PURE__ */ p(le, {
|
|
637
|
+
workspaceId: d,
|
|
638
|
+
projectId: H,
|
|
639
|
+
sprintId: W || void 0,
|
|
640
|
+
sprintName: U.find((e) => e.id === W)?.name
|
|
641
|
+
}),
|
|
608
642
|
/* @__PURE__ */ m(h, { children: [/* @__PURE__ */ m(_, { children: [/* @__PURE__ */ m(v, {
|
|
609
643
|
className: "flex items-center gap-2",
|
|
610
|
-
children: [/* @__PURE__ */ p(
|
|
644
|
+
children: [/* @__PURE__ */ p(xe, { className: "h-4 w-4" }), D("planmagnet.analytics.cfd.title", "Cumulative Flow Diagram")]
|
|
611
645
|
}), /* @__PURE__ */ p("p", {
|
|
612
646
|
className: "text-xs text-muted-foreground",
|
|
613
|
-
children: D("planmagnet.analytics.cfd.subtitle", "Selected date range, for {{project}}.", { project:
|
|
614
|
-
})] }), /* @__PURE__ */ p(g, { children:
|
|
647
|
+
children: D("planmagnet.analytics.cfd.subtitle", "Selected date range, for {{project}}.", { project: G || D("planmagnet.analytics.delivery.noProject", "no project") })
|
|
648
|
+
})] }), /* @__PURE__ */ p(g, { children: ut ? /* @__PURE__ */ p("div", {
|
|
615
649
|
className: "flex justify-center py-12",
|
|
616
650
|
children: /* @__PURE__ */ p("div", { className: "animate-spin h-6 w-6 border-2 border-primary border-t-transparent rounded-full" })
|
|
617
651
|
}) : $.length > 0 ? /* @__PURE__ */ p(r, {
|
|
@@ -620,21 +654,21 @@ function D() {
|
|
|
620
654
|
children: /* @__PURE__ */ m(oe, {
|
|
621
655
|
data: $,
|
|
622
656
|
children: [
|
|
623
|
-
/* @__PURE__ */ p(
|
|
657
|
+
/* @__PURE__ */ p(a, {
|
|
624
658
|
strokeDasharray: "3 3",
|
|
625
659
|
opacity: .2
|
|
626
660
|
}),
|
|
627
|
-
/* @__PURE__ */ p(
|
|
661
|
+
/* @__PURE__ */ p(o, {
|
|
628
662
|
dataKey: "day",
|
|
629
663
|
tick: { fontSize: 11 }
|
|
630
664
|
}),
|
|
631
|
-
/* @__PURE__ */ p(
|
|
665
|
+
/* @__PURE__ */ p(s, {
|
|
632
666
|
tick: { fontSize: 11 },
|
|
633
667
|
allowDecimals: !1
|
|
634
668
|
}),
|
|
635
669
|
/* @__PURE__ */ p(n, {}),
|
|
636
670
|
/* @__PURE__ */ p(t, { wrapperStyle: { fontSize: 12 } }),
|
|
637
|
-
|
|
671
|
+
wt.map((e) => /* @__PURE__ */ p(re, {
|
|
638
672
|
type: "monotone",
|
|
639
673
|
dataKey: e,
|
|
640
674
|
name: e.toLowerCase().replace("_", " "),
|
|
@@ -649,34 +683,34 @@ function D() {
|
|
|
649
683
|
className: "text-sm text-muted-foreground py-8 text-center",
|
|
650
684
|
children: D("planmagnet.analytics.cfd.empty", "No work items found for this project")
|
|
651
685
|
}) })] }),
|
|
652
|
-
/* @__PURE__ */ p(
|
|
686
|
+
/* @__PURE__ */ p(me, {
|
|
653
687
|
workspaceId: d,
|
|
654
|
-
projectId:
|
|
655
|
-
startDate:
|
|
656
|
-
endDate:
|
|
688
|
+
projectId: H,
|
|
689
|
+
startDate: L,
|
|
690
|
+
endDate: R
|
|
657
691
|
}),
|
|
658
692
|
/* @__PURE__ */ m("div", {
|
|
659
693
|
className: "grid grid-cols-1 lg:grid-cols-2 gap-6",
|
|
660
|
-
children: [/* @__PURE__ */ p(
|
|
694
|
+
children: [/* @__PURE__ */ p(fe, {
|
|
661
695
|
workspaceId: d,
|
|
662
696
|
projectId: F,
|
|
663
|
-
startDate:
|
|
664
|
-
endDate:
|
|
665
|
-
}), /* @__PURE__ */ p(
|
|
697
|
+
startDate: L,
|
|
698
|
+
endDate: R
|
|
699
|
+
}), /* @__PURE__ */ p(pe, {
|
|
666
700
|
workspaceId: d,
|
|
667
701
|
projectId: F,
|
|
668
|
-
startDate:
|
|
669
|
-
endDate:
|
|
702
|
+
startDate: L,
|
|
703
|
+
endDate: R
|
|
670
704
|
})]
|
|
671
705
|
}),
|
|
672
706
|
/* @__PURE__ */ m("div", {
|
|
673
707
|
className: "grid grid-cols-1 lg:grid-cols-2 gap-6",
|
|
674
|
-
children: [/* @__PURE__ */ p(
|
|
708
|
+
children: [/* @__PURE__ */ p(de, {
|
|
675
709
|
workspaceId: d,
|
|
676
|
-
projectId:
|
|
677
|
-
startDate:
|
|
678
|
-
endDate:
|
|
679
|
-
}), /* @__PURE__ */ p(
|
|
710
|
+
projectId: H,
|
|
711
|
+
startDate: L,
|
|
712
|
+
endDate: R
|
|
713
|
+
}), /* @__PURE__ */ p(ue, {
|
|
680
714
|
workspaceId: d,
|
|
681
715
|
projectId: F
|
|
682
716
|
})]
|
|
@@ -687,20 +721,20 @@ function D() {
|
|
|
687
721
|
}) }),
|
|
688
722
|
/* @__PURE__ */ m("div", {
|
|
689
723
|
className: "grid grid-cols-1 lg:grid-cols-2 gap-6",
|
|
690
|
-
children: [/* @__PURE__ */ p(
|
|
724
|
+
children: [/* @__PURE__ */ p(he, {
|
|
691
725
|
workspaceId: d,
|
|
692
|
-
projectId:
|
|
693
|
-
startDate:
|
|
694
|
-
endDate:
|
|
695
|
-
}), /* @__PURE__ */ p(
|
|
726
|
+
projectId: H,
|
|
727
|
+
startDate: L,
|
|
728
|
+
endDate: R
|
|
729
|
+
}), /* @__PURE__ */ p(ge, {
|
|
696
730
|
workspaceId: d,
|
|
697
731
|
projectId: F
|
|
698
732
|
})]
|
|
699
733
|
}),
|
|
700
734
|
/* @__PURE__ */ m(h, { children: [/* @__PURE__ */ p(_, { children: /* @__PURE__ */ p(v, { children: D("planmagnet.analytics.projectHealth.title", "Project Health") }) }), /* @__PURE__ */ p(g, { children: /* @__PURE__ */ m("div", {
|
|
701
735
|
className: "space-y-3",
|
|
702
|
-
children: [
|
|
703
|
-
let t =
|
|
736
|
+
children: [V.filter((e) => e.status === "ACTIVE").map((e) => {
|
|
737
|
+
let t = mt(e.id), n = e.endDate && new Date(e.endDate) < /* @__PURE__ */ new Date() && t < 100 ? "at_risk" : t >= 75 ? "on_track" : "in_progress";
|
|
704
738
|
return /* @__PURE__ */ m("div", {
|
|
705
739
|
className: "flex items-center gap-4",
|
|
706
740
|
children: [
|
|
@@ -722,14 +756,14 @@ function D() {
|
|
|
722
756
|
className: "text-sm w-12 text-right",
|
|
723
757
|
children: [t, "%"]
|
|
724
758
|
}),
|
|
725
|
-
/* @__PURE__ */ p(
|
|
759
|
+
/* @__PURE__ */ p(ke, {
|
|
726
760
|
variant: "outline",
|
|
727
761
|
className: "capitalize text-xs w-20 justify-center",
|
|
728
762
|
children: n.replace("_", " ")
|
|
729
763
|
})
|
|
730
764
|
]
|
|
731
765
|
}, e.id);
|
|
732
|
-
}),
|
|
766
|
+
}), V.filter((e) => e.status === "ACTIVE").length === 0 && /* @__PURE__ */ p("p", {
|
|
733
767
|
className: "text-sm text-muted-foreground text-center py-4",
|
|
734
768
|
children: D("planmagnet.analytics.projectHealth.empty", "No active projects found")
|
|
735
769
|
})]
|