@burdenoff/microfe-planmagnet 2026.1001.6 → 2026.1001.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/planmagnet/PlanMagnetRoutes.d.ts.map +1 -1
- package/dist/planmagnet/PlanMagnetRoutes.js +10 -6
- package/dist/planmagnet/PlanMagnetRoutes.js.map +1 -1
- package/dist/planmagnet/automation/automationRuleTypes.d.ts +31 -19
- package/dist/planmagnet/automation/automationRuleTypes.d.ts.map +1 -1
- package/dist/planmagnet/automation/automationRuleTypes.js +4 -8
- package/dist/planmagnet/automation/automationRuleTypes.js.map +1 -1
- package/dist/planmagnet/controls/FeatureControls.d.ts +18 -1
- package/dist/planmagnet/controls/FeatureControls.d.ts.map +1 -1
- package/dist/planmagnet/controls/FeatureControls.js +259 -202
- package/dist/planmagnet/controls/FeatureControls.js.map +1 -1
- package/dist/planmagnet/controls/FeedbackControls.d.ts +70 -0
- package/dist/planmagnet/controls/FeedbackControls.d.ts.map +1 -0
- package/dist/planmagnet/controls/FeedbackControls.js +153 -0
- package/dist/planmagnet/controls/FeedbackControls.js.map +1 -0
- package/dist/planmagnet/controls/SyncControls.d.ts.map +1 -1
- package/dist/planmagnet/controls/SyncControls.js +1 -0
- package/dist/planmagnet/controls/SyncControls.js.map +1 -1
- package/dist/planmagnet/controls/WebhookSubscriptionControls.d.ts +47 -0
- package/dist/planmagnet/controls/WebhookSubscriptionControls.d.ts.map +1 -0
- package/dist/planmagnet/controls/WebhookSubscriptionControls.js +542 -0
- package/dist/planmagnet/controls/WebhookSubscriptionControls.js.map +1 -0
- package/dist/planmagnet/dashboards/DashboardUI.js +7 -7
- package/dist/planmagnet/dashboards/cards/RiskSeverityCard.js +4 -4
- package/dist/planmagnet/forecast/DeliveryForecastCard.js +8 -8
- package/dist/planmagnet/forecast/ProjectOutlookCard.js +10 -10
- package/dist/planmagnet/forecast/ProjectRiskSummaryCard.js +9 -9
- package/dist/planmagnet/forecast/ResourceForecastCard.js +6 -6
- package/dist/planmagnet/integrations/syncTypes.d.ts +2 -1
- package/dist/planmagnet/integrations/syncTypes.d.ts.map +1 -1
- package/dist/planmagnet/integrations/syncTypes.js +19 -9
- package/dist/planmagnet/integrations/syncTypes.js.map +1 -1
- package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.js +8 -8
- package/dist/planmagnet/pages/DashboardDashboardPagePage.js +23 -23
- package/dist/planmagnet/pages/DocsDocDetailPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/DocsDocDetailPagePage.js +340 -248
- package/dist/planmagnet/pages/DocsDocDetailPagePage.js.map +1 -1
- package/dist/planmagnet/pages/IntegrationsSyncDetailPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/IntegrationsSyncDetailPagePage.js +172 -167
- package/dist/planmagnet/pages/IntegrationsSyncDetailPagePage.js.map +1 -1
- package/dist/planmagnet/pages/IntegrationsSyncsPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/IntegrationsSyncsPagePage.js +92 -83
- package/dist/planmagnet/pages/IntegrationsSyncsPagePage.js.map +1 -1
- package/dist/planmagnet/pages/IntegrationsWebhooksPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/IntegrationsWebhooksPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/IntegrationsWebhooksPagePage.js +175 -0
- package/dist/planmagnet/pages/IntegrationsWebhooksPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.js +151 -126
- package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProductsFeaturesPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProductsFeaturesPagePage.js +136 -129
- package/dist/planmagnet/pages/ProductsFeaturesPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProductsNewFeaturePagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProductsNewFeaturePagePage.js +149 -119
- package/dist/planmagnet/pages/ProductsNewFeaturePagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProductsProductsPagePage.js +13 -13
- package/dist/planmagnet/pages/ProjectsAtRiskPagePage.js +9 -9
- package/dist/planmagnet/pages/ProjectsBudgetsPagePage.js +8 -8
- package/dist/planmagnet/pages/ProjectsProjectsPagePage.js +12 -12
- package/dist/planmagnet/pages/ReportsReportsPagePage.js +23 -23
- package/dist/planmagnet/pages/TasksMyDashboardPagePage.js +18 -18
- package/dist/planmagnet/pages/TasksMyWorkPagePage.js +10 -10
- package/dist/planmagnet/pages/TasksTimeEntriesPagePage.js +5 -5
- package/dist/planmagnet/pages/analytics/DeliveryHealthCards.js +8 -8
- package/dist/planmagnet/pages/analytics/DeliveryKpisCard.js +6 -6
- package/dist/planmagnet/pages/analytics/MetricsCard.js +6 -6
- package/dist/planmagnet/pages/analytics/QualityMetricsCard.js +6 -6
- package/dist/planmagnet/pages/analytics/SprintDeliveryCards.js +8 -8
- package/dist/planmagnet/pages/analytics/StatusFlowCard.js +7 -7
- package/dist/planmagnet/pages/analytics/ThroughputCard.js +7 -7
- package/dist/planmagnet/pages/analytics/WorkBreakdownCard.js +7 -7
- package/dist/planmagnet/people/People.d.ts +14 -0
- package/dist/planmagnet/people/People.d.ts.map +1 -1
- package/dist/planmagnet/people/People.js +36 -22
- package/dist/planmagnet/people/People.js.map +1 -1
- package/dist/planmagnet/webhooks/webhookTypes.d.ts +54 -0
- package/dist/planmagnet/webhooks/webhookTypes.d.ts.map +1 -0
- package/dist/planmagnet/webhooks/webhookTypes.js +17 -0
- package/dist/planmagnet/webhooks/webhookTypes.js.map +1 -0
- package/package.json +1 -1
|
@@ -17,8 +17,8 @@ import { ArrowRight as y, Clock as b, Flag as x, LayoutDashboard as S, TrendingU
|
|
|
17
17
|
import { gql as w } from "@apollo/client";
|
|
18
18
|
import { useQuery as T } from "@apollo/client/react";
|
|
19
19
|
import { Fragment as E, jsx as D, jsxs as O } from "react/jsx-runtime";
|
|
20
|
-
import {
|
|
21
|
-
import {
|
|
20
|
+
import { Badge as k, Button as A, Card as j, CardContent as M, CardHeader as N, CardTitle as P } from "@burdenoff/fe-libs/ui";
|
|
21
|
+
import { useI18n as F } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
22
22
|
//#region src/planmagnet/pages/TasksMyDashboardPagePage.tsx
|
|
23
23
|
var I = w`
|
|
24
24
|
query GetMyTimeAllocation($workspaceId: ID!, $startDate: DateTime, $endDate: DateTime) {
|
|
@@ -78,7 +78,7 @@ function H({ progress: e }) {
|
|
|
78
78
|
});
|
|
79
79
|
}
|
|
80
80
|
function U({ workspaceId: e, range: t, onRangeChange: n }) {
|
|
81
|
-
let { t: r } =
|
|
81
|
+
let { t: r } = F(), { startDate: i, endDate: a } = _(t), { data: o, loading: s, error: c } = T(I, {
|
|
82
82
|
variables: {
|
|
83
83
|
workspaceId: e,
|
|
84
84
|
startDate: i,
|
|
@@ -86,11 +86,11 @@ function U({ workspaceId: e, range: t, onRangeChange: n }) {
|
|
|
86
86
|
},
|
|
87
87
|
skip: !e
|
|
88
88
|
}), l = o?.planmagnetMyTimeAllocation, u = h(t);
|
|
89
|
-
return /* @__PURE__ */ O(
|
|
89
|
+
return /* @__PURE__ */ O(j, {
|
|
90
90
|
"data-testid": "my-time-allocation",
|
|
91
|
-
children: [/* @__PURE__ */ D(
|
|
91
|
+
children: [/* @__PURE__ */ D(N, { children: /* @__PURE__ */ O("div", {
|
|
92
92
|
className: "flex flex-wrap items-center justify-between gap-2",
|
|
93
|
-
children: [/* @__PURE__ */ O(
|
|
93
|
+
children: [/* @__PURE__ */ O(P, {
|
|
94
94
|
className: "flex items-center gap-2",
|
|
95
95
|
children: [/* @__PURE__ */ D(b, { className: "h-4 w-4" }), r("planmagnet.myDashboard.timeAllocation.title", "My time allocation")]
|
|
96
96
|
}), /* @__PURE__ */ D("div", {
|
|
@@ -105,7 +105,7 @@ function U({ workspaceId: e, range: t, onRangeChange: n }) {
|
|
|
105
105
|
children: r("planmagnet.myDashboard.timeAllocation.last", "Last {{days}}d", { days: e })
|
|
106
106
|
}, e))
|
|
107
107
|
})]
|
|
108
|
-
}) }), /* @__PURE__ */ D(
|
|
108
|
+
}) }), /* @__PURE__ */ D(M, { children: s ? /* @__PURE__ */ D("p", {
|
|
109
109
|
className: "text-sm text-muted-foreground",
|
|
110
110
|
children: r("planmagnet.myDashboard.loading", "Loading…")
|
|
111
111
|
}) : c ? /* @__PURE__ */ D("p", {
|
|
@@ -155,7 +155,7 @@ function U({ workspaceId: e, range: t, onRangeChange: n }) {
|
|
|
155
155
|
});
|
|
156
156
|
}
|
|
157
157
|
function W({ workspaceId: e }) {
|
|
158
|
-
let { t } =
|
|
158
|
+
let { t } = F(), { data: n, loading: r, error: f } = T(L, {
|
|
159
159
|
variables: {
|
|
160
160
|
workspaceId: e,
|
|
161
161
|
weeks: z
|
|
@@ -166,15 +166,15 @@ function W({ workspaceId: e }) {
|
|
|
166
166
|
items: e.itemsCompleted,
|
|
167
167
|
points: e.pointsCompleted
|
|
168
168
|
})), h = p.reduce((e, t) => e + t.itemsCompleted, 0), g = p.reduce((e, t) => e + t.pointsCompleted, 0);
|
|
169
|
-
return /* @__PURE__ */ O(
|
|
169
|
+
return /* @__PURE__ */ O(j, {
|
|
170
170
|
"data-testid": "my-delivery-trend",
|
|
171
|
-
children: [/* @__PURE__ */ O(
|
|
171
|
+
children: [/* @__PURE__ */ O(N, { children: [/* @__PURE__ */ O(P, {
|
|
172
172
|
className: "flex items-center gap-2",
|
|
173
173
|
children: [/* @__PURE__ */ D(C, { className: "h-4 w-4" }), t("planmagnet.myDashboard.deliveryTrend.title", "My delivery trend")]
|
|
174
174
|
}), /* @__PURE__ */ D("p", {
|
|
175
175
|
className: "text-xs text-muted-foreground",
|
|
176
176
|
children: t("planmagnet.myDashboard.deliveryTrend.subtitle", "Items and points assigned to you that reached Done, last {{weeks}} weeks.", { weeks: z })
|
|
177
|
-
})] }), /* @__PURE__ */ D(
|
|
177
|
+
})] }), /* @__PURE__ */ D(M, { children: r ? /* @__PURE__ */ D("p", {
|
|
178
178
|
className: "text-sm text-muted-foreground",
|
|
179
179
|
children: t("planmagnet.myDashboard.loading", "Loading…")
|
|
180
180
|
}) : f ? /* @__PURE__ */ D("p", {
|
|
@@ -226,22 +226,22 @@ function W({ workspaceId: e }) {
|
|
|
226
226
|
});
|
|
227
227
|
}
|
|
228
228
|
function G({ workspaceId: e, ownerId: t }) {
|
|
229
|
-
let { t: n } =
|
|
229
|
+
let { t: n } = F(), i = r(), { data: a, loading: o, error: s } = T(R, {
|
|
230
230
|
variables: {
|
|
231
231
|
workspaceId: e,
|
|
232
232
|
filter: t ? { ownerId: t } : void 0
|
|
233
233
|
},
|
|
234
234
|
skip: !e || !t
|
|
235
235
|
}), c = a?.planmagnetObjectives.items ?? [];
|
|
236
|
-
return /* @__PURE__ */ O(
|
|
236
|
+
return /* @__PURE__ */ O(j, {
|
|
237
237
|
"data-testid": "my-goals",
|
|
238
|
-
children: [/* @__PURE__ */ O(
|
|
238
|
+
children: [/* @__PURE__ */ O(N, { children: [/* @__PURE__ */ O(P, {
|
|
239
239
|
className: "flex items-center gap-2",
|
|
240
240
|
children: [/* @__PURE__ */ D(x, { className: "h-4 w-4" }), n("planmagnet.myDashboard.goals.title", "My goals")]
|
|
241
241
|
}), /* @__PURE__ */ D("p", {
|
|
242
242
|
className: "text-xs text-muted-foreground",
|
|
243
243
|
children: n("planmagnet.myDashboard.goals.subtitle", "Objectives you own, with their progress.")
|
|
244
|
-
})] }), /* @__PURE__ */ D(
|
|
244
|
+
})] }), /* @__PURE__ */ D(M, { children: t ? o ? /* @__PURE__ */ D("p", {
|
|
245
245
|
className: "text-sm text-muted-foreground",
|
|
246
246
|
children: n("planmagnet.myDashboard.loading", "Loading…")
|
|
247
247
|
}) : s ? /* @__PURE__ */ D("p", {
|
|
@@ -262,7 +262,7 @@ function G({ workspaceId: e, ownerId: t }) {
|
|
|
262
262
|
children: [/* @__PURE__ */ D("span", {
|
|
263
263
|
className: "text-sm font-medium truncate",
|
|
264
264
|
children: e.title
|
|
265
|
-
}), /* @__PURE__ */ D(
|
|
265
|
+
}), /* @__PURE__ */ D(k, {
|
|
266
266
|
variant: "outline",
|
|
267
267
|
className: "text-xs capitalize shrink-0",
|
|
268
268
|
children: e.status.toLowerCase()
|
|
@@ -288,7 +288,7 @@ function G({ workspaceId: e, ownerId: t }) {
|
|
|
288
288
|
});
|
|
289
289
|
}
|
|
290
290
|
function K() {
|
|
291
|
-
let { workspaceId: e, currentUser: t } = n(), i = r(), { t: a } =
|
|
291
|
+
let { workspaceId: e, currentUser: t } = n(), i = r(), { t: a } = F(), [o, s] = v(() => g("30"));
|
|
292
292
|
return /* @__PURE__ */ O("div", {
|
|
293
293
|
className: "space-y-6 p-6",
|
|
294
294
|
"data-testid": "my-dashboard-page",
|
|
@@ -301,7 +301,7 @@ function K() {
|
|
|
301
301
|
}), /* @__PURE__ */ D("p", {
|
|
302
302
|
className: "text-sm text-muted-foreground",
|
|
303
303
|
children: a("planmagnet.myDashboard.subtitle", "Your own time, delivery, and goals across every project.")
|
|
304
|
-
})] }), /* @__PURE__ */ O(
|
|
304
|
+
})] }), /* @__PURE__ */ O(A, {
|
|
305
305
|
variant: "outline",
|
|
306
306
|
size: "sm",
|
|
307
307
|
onClick: () => i("/tasks/my-work-page"),
|
|
@@ -6,8 +6,8 @@ import { CalendarClock as u, ListChecks as d } from "lucide-react";
|
|
|
6
6
|
import { gql as f } from "@apollo/client";
|
|
7
7
|
import { useQuery as p } from "@apollo/client/react";
|
|
8
8
|
import { jsx as m, jsxs as h } from "react/jsx-runtime";
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
9
|
+
import { Badge as g, Card as _, CardContent as v, Switch as y } from "@burdenoff/fe-libs/ui";
|
|
10
|
+
import { useI18n as b } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
11
11
|
//#region src/planmagnet/pages/TasksMyWorkPagePage.tsx
|
|
12
12
|
var x = f`
|
|
13
13
|
query GetMyWorkItems(
|
|
@@ -66,7 +66,7 @@ function T(e, t) {
|
|
|
66
66
|
}
|
|
67
67
|
}
|
|
68
68
|
function E() {
|
|
69
|
-
let { workspaceId: f } = e(), E = t(), { t: D } =
|
|
69
|
+
let { workspaceId: f } = e(), E = t(), { t: D } = b(), [O, k] = l(!1), [A, j] = l(!1), { data: M, loading: N, error: P, fetchMore: F } = p(x, {
|
|
70
70
|
variables: {
|
|
71
71
|
workspaceId: f,
|
|
72
72
|
filter: { includeClosed: O },
|
|
@@ -122,14 +122,14 @@ function E() {
|
|
|
122
122
|
children: D("planmagnet.myWork.subtitle", "{{count}} item(s) assigned to you across every project", { count: R })
|
|
123
123
|
})] }), /* @__PURE__ */ h("label", {
|
|
124
124
|
className: "flex items-center gap-2 text-sm text-muted-foreground",
|
|
125
|
-
children: [/* @__PURE__ */ m(
|
|
125
|
+
children: [/* @__PURE__ */ m(y, {
|
|
126
126
|
checked: O,
|
|
127
127
|
onCheckedChange: k,
|
|
128
128
|
"aria-label": D("planmagnet.myWork.includeClosed", "Show completed"),
|
|
129
129
|
"data-testid": "my-work-include-closed"
|
|
130
130
|
}), D("planmagnet.myWork.includeClosed", "Show completed")]
|
|
131
131
|
})]
|
|
132
|
-
}), L.length === 0 ? /* @__PURE__ */ m(
|
|
132
|
+
}), L.length === 0 ? /* @__PURE__ */ m(_, { children: /* @__PURE__ */ h(v, {
|
|
133
133
|
className: "flex flex-col items-center gap-2 py-12 text-center",
|
|
134
134
|
children: [
|
|
135
135
|
/* @__PURE__ */ m(u, { className: "h-8 w-8 text-muted-foreground" }),
|
|
@@ -149,7 +149,7 @@ function E() {
|
|
|
149
149
|
"data-testid": `my-work-group-${e}`,
|
|
150
150
|
children: [/* @__PURE__ */ h("div", {
|
|
151
151
|
className: "flex items-center gap-2",
|
|
152
|
-
children: [/* @__PURE__ */ m(
|
|
152
|
+
children: [/* @__PURE__ */ m(g, {
|
|
153
153
|
variant: w[e],
|
|
154
154
|
children: T(D, e)
|
|
155
155
|
}), /* @__PURE__ */ h("span", {
|
|
@@ -162,9 +162,9 @@ function E() {
|
|
|
162
162
|
})]
|
|
163
163
|
}), /* @__PURE__ */ m("div", {
|
|
164
164
|
className: "space-y-2",
|
|
165
|
-
children: t.map((e) => /* @__PURE__ */ m(
|
|
165
|
+
children: t.map((e) => /* @__PURE__ */ m(_, {
|
|
166
166
|
...s(() => E(`/tasks/task-detail-page?taskId=${encodeURIComponent(e.id)}`), e.title),
|
|
167
|
-
children: /* @__PURE__ */ h(
|
|
167
|
+
children: /* @__PURE__ */ h(v, {
|
|
168
168
|
className: "flex flex-wrap items-center gap-3 p-3",
|
|
169
169
|
children: [/* @__PURE__ */ h("div", {
|
|
170
170
|
className: "min-w-[12rem] flex-1 space-y-1",
|
|
@@ -175,11 +175,11 @@ function E() {
|
|
|
175
175
|
className: "flex flex-wrap items-center gap-1.5 text-xs text-muted-foreground",
|
|
176
176
|
children: [
|
|
177
177
|
/* @__PURE__ */ m("span", { children: e.key }),
|
|
178
|
-
e.project && /* @__PURE__ */ m(
|
|
178
|
+
e.project && /* @__PURE__ */ m(g, {
|
|
179
179
|
variant: "outline",
|
|
180
180
|
children: e.project.name
|
|
181
181
|
}),
|
|
182
|
-
e.sprint && /* @__PURE__ */ m(
|
|
182
|
+
e.sprint && /* @__PURE__ */ m(g, {
|
|
183
183
|
variant: "secondary",
|
|
184
184
|
children: e.sprint.name
|
|
185
185
|
}),
|
|
@@ -8,8 +8,8 @@ import { useState as u } from "react";
|
|
|
8
8
|
import { gql as d } from "@apollo/client";
|
|
9
9
|
import { useQuery as f } from "@apollo/client/react";
|
|
10
10
|
import { jsx as p, jsxs as m } from "react/jsx-runtime";
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
11
|
+
import { Input as h } from "@burdenoff/fe-libs/ui";
|
|
12
|
+
import { useI18n as g } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
13
13
|
//#region src/planmagnet/pages/TasksTimeEntriesPagePage.tsx
|
|
14
14
|
var _ = d`
|
|
15
15
|
query TimeEntriesList(
|
|
@@ -39,7 +39,7 @@ var _ = d`
|
|
|
39
39
|
}
|
|
40
40
|
`, v = ["ALL", ...a];
|
|
41
41
|
function y() {
|
|
42
|
-
let { workspaceId: a, currentUser: d } = e(), y = t(), { t: b } =
|
|
42
|
+
let { workspaceId: a, currentUser: d } = e(), y = t(), { t: b } = g(), [x, S] = u("mine"), [C, w] = u("ALL"), [T, E] = u(""), [D, O] = u(""), k = {
|
|
43
43
|
...x === "mine" && d?.id ? { userId: d.id } : {},
|
|
44
44
|
...C === "ALL" ? {} : { status: C },
|
|
45
45
|
...T ? { dateFrom: T } : {},
|
|
@@ -90,7 +90,7 @@ function y() {
|
|
|
90
90
|
className: "text-xs text-muted-foreground",
|
|
91
91
|
children: b("planmagnet.timeEntries.from", "From")
|
|
92
92
|
}),
|
|
93
|
-
/* @__PURE__ */ p(
|
|
93
|
+
/* @__PURE__ */ p(h, {
|
|
94
94
|
id: "time-entries-from",
|
|
95
95
|
type: "date",
|
|
96
96
|
className: "h-8 w-36",
|
|
@@ -102,7 +102,7 @@ function y() {
|
|
|
102
102
|
className: "text-xs text-muted-foreground",
|
|
103
103
|
children: b("planmagnet.timeEntries.to", "To")
|
|
104
104
|
}),
|
|
105
|
-
/* @__PURE__ */ p(
|
|
105
|
+
/* @__PURE__ */ p(h, {
|
|
106
106
|
id: "time-entries-to",
|
|
107
107
|
type: "date",
|
|
108
108
|
className: "h-8 w-36",
|
|
@@ -3,8 +3,8 @@ import { Timer as i, Wallet as a } from "lucide-react";
|
|
|
3
3
|
import { gql as o } from "@apollo/client";
|
|
4
4
|
import { useQuery as s } from "@apollo/client/react";
|
|
5
5
|
import { jsx as c, jsxs as l } from "react/jsx-runtime";
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
6
|
+
import { Card as u, CardContent as d, CardHeader as f, CardTitle as p } from "@burdenoff/fe-libs/ui";
|
|
7
|
+
import { useI18n as m } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
8
8
|
//#region src/planmagnet/pages/analytics/DeliveryHealthCards.tsx
|
|
9
9
|
var h = o`
|
|
10
10
|
query GetProjectCycleTime(
|
|
@@ -79,7 +79,7 @@ function v({ label: e, value: t, hint: n }) {
|
|
|
79
79
|
});
|
|
80
80
|
}
|
|
81
81
|
function y({ workspaceId: e, projectId: t, startDate: n, endDate: r }) {
|
|
82
|
-
let { t: a } =
|
|
82
|
+
let { t: a } = m(), { data: o, loading: g, error: y } = s(h, {
|
|
83
83
|
variables: {
|
|
84
84
|
workspaceId: e,
|
|
85
85
|
projectId: t,
|
|
@@ -88,13 +88,13 @@ function y({ workspaceId: e, projectId: t, startDate: n, endDate: r }) {
|
|
|
88
88
|
},
|
|
89
89
|
skip: !e || !t
|
|
90
90
|
}), b = o?.planmagnetCycleTime, x = [...b?.items ?? []].sort((e, t) => t.cycleTimeHours - e.cycleTimeHours).slice(0, 5);
|
|
91
|
-
return /* @__PURE__ */ l(
|
|
91
|
+
return /* @__PURE__ */ l(u, { children: [/* @__PURE__ */ l(f, { children: [/* @__PURE__ */ l(p, {
|
|
92
92
|
className: "flex items-center gap-2",
|
|
93
93
|
children: [/* @__PURE__ */ c(i, { className: "h-4 w-4" }), a("planmagnet.analytics.cycleTime.title", "Cycle time")]
|
|
94
94
|
}), /* @__PURE__ */ c("p", {
|
|
95
95
|
className: "text-xs text-muted-foreground",
|
|
96
96
|
children: a("planmagnet.analytics.cycleTime.subtitle", "From first moving to In Progress (or creation) to Done, for the selected project.")
|
|
97
|
-
})] }), /* @__PURE__ */ c(
|
|
97
|
+
})] }), /* @__PURE__ */ c(d, { children: t ? g ? /* @__PURE__ */ c("p", {
|
|
98
98
|
className: "text-sm text-muted-foreground",
|
|
99
99
|
children: a("planmagnet.analytics.loading", "Loading…")
|
|
100
100
|
}) : y ? /* @__PURE__ */ l("p", {
|
|
@@ -171,7 +171,7 @@ function y({ workspaceId: e, projectId: t, startDate: n, endDate: r }) {
|
|
|
171
171
|
}) })] });
|
|
172
172
|
}
|
|
173
173
|
function b({ workspaceId: i, projectId: o }) {
|
|
174
|
-
let { t: h } =
|
|
174
|
+
let { t: h } = m(), { data: _, loading: v, error: y } = s(g, {
|
|
175
175
|
variables: {
|
|
176
176
|
workspaceId: i,
|
|
177
177
|
filter: o ? { projectId: o } : void 0
|
|
@@ -183,7 +183,7 @@ function b({ workspaceId: i, projectId: o }) {
|
|
|
183
183
|
"near-limit": h("planmagnet.analytics.budget.nearLimit", "Near limit"),
|
|
184
184
|
"over-budget": h("planmagnet.analytics.budget.over", "Over budget")
|
|
185
185
|
};
|
|
186
|
-
return /* @__PURE__ */ l(
|
|
186
|
+
return /* @__PURE__ */ l(u, { children: [/* @__PURE__ */ l(f, { children: [/* @__PURE__ */ l(p, {
|
|
187
187
|
className: "flex items-center gap-2",
|
|
188
188
|
children: [/* @__PURE__ */ c(a, { className: "h-4 w-4" }), h("planmagnet.analytics.budget.title", "Budget performance")]
|
|
189
189
|
}), /* @__PURE__ */ c("p", {
|
|
@@ -192,7 +192,7 @@ function b({ workspaceId: i, projectId: o }) {
|
|
|
192
192
|
shown: b.length,
|
|
193
193
|
total: x
|
|
194
194
|
}) : o ? h("planmagnet.analytics.budget.subtitleProject", "Spent against plan, per budget, for the selected project.") : h("planmagnet.analytics.budget.subtitle", "Spent against plan, per budget, across the workspace.")
|
|
195
|
-
})] }), /* @__PURE__ */ c(
|
|
195
|
+
})] }), /* @__PURE__ */ c(d, { children: v ? /* @__PURE__ */ c("p", {
|
|
196
196
|
className: "text-sm text-muted-foreground",
|
|
197
197
|
children: h("planmagnet.analytics.loading", "Loading…")
|
|
198
198
|
}) : y ? /* @__PURE__ */ l("p", {
|
|
@@ -3,8 +3,8 @@ import { Info as t, Target as n } from "lucide-react";
|
|
|
3
3
|
import { gql as r } from "@apollo/client";
|
|
4
4
|
import { useQuery as i } from "@apollo/client/react";
|
|
5
5
|
import { jsx as a, jsxs as o } from "react/jsx-runtime";
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
6
|
+
import { Card as s, CardContent as c, CardHeader as l, CardTitle as u } from "@burdenoff/fe-libs/ui";
|
|
7
|
+
import { useI18n as d } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
8
8
|
//#region src/planmagnet/pages/analytics/DeliveryKpisCard.tsx
|
|
9
9
|
var f = r`
|
|
10
10
|
query GetAnalyticsDeliveryKpis(
|
|
@@ -71,7 +71,7 @@ function p({ label: e, onTime: t, total: n, withoutPlan: r, rate: i, noPlanNoun:
|
|
|
71
71
|
});
|
|
72
72
|
}
|
|
73
73
|
function m({ workspaceId: r, projectId: m, startDate: h, endDate: g }) {
|
|
74
|
-
let { t: _ } =
|
|
74
|
+
let { t: _ } = d(), { data: v, loading: y, error: b } = i(f, {
|
|
75
75
|
variables: {
|
|
76
76
|
workspaceId: r,
|
|
77
77
|
projectId: m,
|
|
@@ -80,15 +80,15 @@ function m({ workspaceId: r, projectId: m, startDate: h, endDate: g }) {
|
|
|
80
80
|
},
|
|
81
81
|
skip: !r
|
|
82
82
|
}), x = v?.planmagnetDeliveryKpis, S = x?.scopeAdherence, C = S?.adherenceRate == null ? null : Math.round(S.adherenceRate * 100);
|
|
83
|
-
return /* @__PURE__ */ o(
|
|
83
|
+
return /* @__PURE__ */ o(s, {
|
|
84
84
|
"data-testid": "delivery-card",
|
|
85
|
-
children: [/* @__PURE__ */ o(
|
|
85
|
+
children: [/* @__PURE__ */ o(l, { children: [/* @__PURE__ */ o(u, {
|
|
86
86
|
className: "flex items-center gap-2",
|
|
87
87
|
children: [/* @__PURE__ */ a(n, { className: "h-4 w-4" }), _("planmagnet.analytics.delivery.kpiTitle", "Delivery")]
|
|
88
88
|
}), /* @__PURE__ */ a("p", {
|
|
89
89
|
className: "text-xs text-muted-foreground",
|
|
90
90
|
children: _("planmagnet.analytics.delivery.kpiSubtitle", "On-time delivery and scope adherence, for sprints/releases/milestones completed in the selected range.")
|
|
91
|
-
})] }), /* @__PURE__ */ a(
|
|
91
|
+
})] }), /* @__PURE__ */ a(c, { children: y ? /* @__PURE__ */ a("p", {
|
|
92
92
|
className: "text-sm text-muted-foreground",
|
|
93
93
|
children: _("planmagnet.analytics.loading", "Loading…")
|
|
94
94
|
}) : b ? /* @__PURE__ */ o("p", {
|
|
@@ -3,8 +3,8 @@ import { Activity as n, Info as r } from "lucide-react";
|
|
|
3
3
|
import { gql as i } from "@apollo/client";
|
|
4
4
|
import { useQuery as a } from "@apollo/client/react";
|
|
5
5
|
import { jsx as o, jsxs as s } from "react/jsx-runtime";
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
6
|
+
import { Card as c, CardContent as l, CardHeader as u, CardTitle as d } from "@burdenoff/fe-libs/ui";
|
|
7
|
+
import { useI18n as f } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
8
8
|
//#region src/planmagnet/pages/analytics/MetricsCard.tsx
|
|
9
9
|
var p = i`
|
|
10
10
|
query GetWorkspaceMetrics($workspaceId: ID!, $timeRange: PlanmagnetTimeRangeInput) {
|
|
@@ -69,7 +69,7 @@ function v({ metric: t }) {
|
|
|
69
69
|
});
|
|
70
70
|
}
|
|
71
71
|
function y({ workspaceId: e, projectId: t, startDate: i, endDate: h }) {
|
|
72
|
-
let { t: g } =
|
|
72
|
+
let { t: g } = f(), _ = {
|
|
73
73
|
startDate: i,
|
|
74
74
|
endDate: h
|
|
75
75
|
}, { data: y, loading: b, error: x } = a(p, {
|
|
@@ -86,15 +86,15 @@ function y({ workspaceId: e, projectId: t, startDate: i, endDate: h }) {
|
|
|
86
86
|
},
|
|
87
87
|
skip: !e || !t
|
|
88
88
|
}), T = y?.planmagnetMetrics ?? [], E = S?.planmagnetAnalytics.projectMetrics ?? [], D = S?.planmagnetAnalytics.teamMetrics ?? [], O = [...E, ...D];
|
|
89
|
-
return /* @__PURE__ */ s(
|
|
89
|
+
return /* @__PURE__ */ s(c, {
|
|
90
90
|
"data-testid": "metrics-card",
|
|
91
|
-
children: [/* @__PURE__ */ s(
|
|
91
|
+
children: [/* @__PURE__ */ s(u, { children: [/* @__PURE__ */ s(d, {
|
|
92
92
|
className: "flex items-center gap-2",
|
|
93
93
|
children: [/* @__PURE__ */ o(n, { className: "h-4 w-4" }), g("planmagnet.analytics.metrics.title", "Metrics")]
|
|
94
94
|
}), /* @__PURE__ */ o("p", {
|
|
95
95
|
className: "text-xs text-muted-foreground",
|
|
96
96
|
children: g("planmagnet.analytics.metrics.subtitle", "Workspace-wide KPIs, plus the selected project's own metrics, composed from the queries above into one generic shape.")
|
|
97
|
-
})] }), /* @__PURE__ */ s(
|
|
97
|
+
})] }), /* @__PURE__ */ s(l, {
|
|
98
98
|
className: "space-y-4",
|
|
99
99
|
children: [
|
|
100
100
|
/* @__PURE__ */ s("div", { children: [/* @__PURE__ */ o("h3", {
|
|
@@ -12,8 +12,8 @@ import { Bug as d } from "lucide-react";
|
|
|
12
12
|
import { gql as f } from "@apollo/client";
|
|
13
13
|
import { useQuery as p } from "@apollo/client/react";
|
|
14
14
|
import { Fragment as m, jsx as h, jsxs as g } from "react/jsx-runtime";
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
15
|
+
import { Card as _, CardContent as v, CardHeader as y, CardTitle as b } from "@burdenoff/fe-libs/ui";
|
|
16
|
+
import { useI18n as x } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
17
17
|
//#region src/planmagnet/pages/analytics/QualityMetricsCard.tsx
|
|
18
18
|
var S = f`
|
|
19
19
|
query GetAnalyticsQualityMetrics(
|
|
@@ -56,7 +56,7 @@ var S = f`
|
|
|
56
56
|
NONE: "var(--color-chart-axis)"
|
|
57
57
|
};
|
|
58
58
|
function T({ workspaceId: f, projectId: T, startDate: E, endDate: D }) {
|
|
59
|
-
let { t: O } =
|
|
59
|
+
let { t: O } = x(), { data: k, loading: A, error: j } = p(S, {
|
|
60
60
|
variables: {
|
|
61
61
|
workspaceId: f,
|
|
62
62
|
projectId: T,
|
|
@@ -69,15 +69,15 @@ function T({ workspaceId: f, projectId: T, startDate: E, endDate: D }) {
|
|
|
69
69
|
count: N.get(e) ?? 0,
|
|
70
70
|
fill: w[e]
|
|
71
71
|
}));
|
|
72
|
-
return /* @__PURE__ */ g(
|
|
72
|
+
return /* @__PURE__ */ g(_, {
|
|
73
73
|
"data-testid": "quality-card",
|
|
74
|
-
children: [/* @__PURE__ */ g(
|
|
74
|
+
children: [/* @__PURE__ */ g(y, { children: [/* @__PURE__ */ g(b, {
|
|
75
75
|
className: "flex items-center gap-2",
|
|
76
76
|
children: [/* @__PURE__ */ h(d, { className: "h-4 w-4" }), O("planmagnet.analytics.quality.title", "Quality")]
|
|
77
77
|
}), /* @__PURE__ */ h("p", {
|
|
78
78
|
className: "text-xs text-muted-foreground",
|
|
79
79
|
children: T ? O("planmagnet.analytics.quality.subtitleProject", "Bug and quality-gate activity for the selected project, in the selected range.") : O("planmagnet.analytics.quality.subtitle", "Bug and quality-gate activity across the workspace, in the selected range.")
|
|
80
|
-
})] }), /* @__PURE__ */ h(
|
|
80
|
+
})] }), /* @__PURE__ */ h(v, { children: A ? /* @__PURE__ */ h("p", {
|
|
81
81
|
className: "text-sm text-muted-foreground",
|
|
82
82
|
children: O("planmagnet.analytics.loading", "Loading…")
|
|
83
83
|
}) : j ? /* @__PURE__ */ g("p", {
|
|
@@ -14,8 +14,8 @@ import { BarChart3 as f, TrendingUp as p } from "lucide-react";
|
|
|
14
14
|
import { gql as m } from "@apollo/client";
|
|
15
15
|
import { useQuery as h } from "@apollo/client/react";
|
|
16
16
|
import { Fragment as g, jsx as _, jsxs as v } from "react/jsx-runtime";
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
17
|
+
import { Card as y, CardContent as b, CardHeader as x, CardTitle as S } from "@burdenoff/fe-libs/ui";
|
|
18
|
+
import { useI18n as C } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
19
19
|
//#region src/planmagnet/pages/analytics/SprintDeliveryCards.tsx
|
|
20
20
|
var w = m`
|
|
21
21
|
query DashboardSprintBurndown($workspaceId: ID!, $sprintId: ID!) {
|
|
@@ -60,7 +60,7 @@ function E(e) {
|
|
|
60
60
|
return `${t.getUTCMonth() + 1}/${t.getUTCDate()}`;
|
|
61
61
|
}
|
|
62
62
|
function D({ workspaceId: r, sprintId: i }) {
|
|
63
|
-
let { t: a } =
|
|
63
|
+
let { t: a } = C(), { data: d, loading: p, error: m } = h(w, {
|
|
64
64
|
variables: {
|
|
65
65
|
workspaceId: r,
|
|
66
66
|
sprintId: i
|
|
@@ -71,13 +71,13 @@ function D({ workspaceId: r, sprintId: i }) {
|
|
|
71
71
|
remaining: e.remainingPoints,
|
|
72
72
|
completed: e.completedPoints
|
|
73
73
|
}));
|
|
74
|
-
return /* @__PURE__ */ v(
|
|
74
|
+
return /* @__PURE__ */ v(y, { children: [/* @__PURE__ */ v(x, { children: [/* @__PURE__ */ v(S, {
|
|
75
75
|
className: "flex items-center gap-2",
|
|
76
76
|
children: [/* @__PURE__ */ _(f, { className: "h-4 w-4" }), a("planmagnet.dashboards.burndown.title", "Sprint burndown")]
|
|
77
77
|
}), /* @__PURE__ */ _("p", {
|
|
78
78
|
className: "text-xs text-muted-foreground",
|
|
79
79
|
children: a("planmagnet.dashboards.burndown.subtitle", "Remaining vs. completed story points, by day of the sprint.")
|
|
80
|
-
})] }), /* @__PURE__ */ _(
|
|
80
|
+
})] }), /* @__PURE__ */ _(b, { children: i ? p && !d ? /* @__PURE__ */ _("p", {
|
|
81
81
|
className: "text-sm text-muted-foreground",
|
|
82
82
|
children: a("planmagnet.dashboards.loading", "Loading…")
|
|
83
83
|
}) : m ? /* @__PURE__ */ v("p", {
|
|
@@ -135,7 +135,7 @@ function D({ workspaceId: r, sprintId: i }) {
|
|
|
135
135
|
}) })] });
|
|
136
136
|
}
|
|
137
137
|
function O({ workspaceId: s, projectId: u, trailingSprintCount: f = 6 }) {
|
|
138
|
-
let { t: m } =
|
|
138
|
+
let { t: m } = C(), { data: w, loading: E, error: D } = h(T, {
|
|
139
139
|
variables: {
|
|
140
140
|
workspaceId: s,
|
|
141
141
|
projectId: u,
|
|
@@ -147,13 +147,13 @@ function O({ workspaceId: s, projectId: u, trailingSprintCount: f = 6 }) {
|
|
|
147
147
|
completed: e.completedPoints,
|
|
148
148
|
planned: e.plannedPoints ?? void 0
|
|
149
149
|
})) ?? [], A = O ? Math.round(O.averageVelocity) : 0, j = O ? Math.round(O.forecastNextSprintPoints) : 0, M = O?.forecastRange ?? null, N = O?.insufficientHistory ?? !1;
|
|
150
|
-
return /* @__PURE__ */ v(
|
|
150
|
+
return /* @__PURE__ */ v(y, { children: [/* @__PURE__ */ v(x, { children: [/* @__PURE__ */ v(S, {
|
|
151
151
|
className: "flex items-center gap-2",
|
|
152
152
|
children: [/* @__PURE__ */ _(p, { className: "h-4 w-4" }), m("planmagnet.dashboards.velocity.title", "Sprint velocity")]
|
|
153
153
|
}), /* @__PURE__ */ _("p", {
|
|
154
154
|
className: "text-xs text-muted-foreground",
|
|
155
155
|
children: m("planmagnet.dashboards.velocity.subtitle", "Completed story points per sprint, across the trailing {{count}} completed sprints.", { count: f })
|
|
156
|
-
})] }), /* @__PURE__ */ _(
|
|
156
|
+
})] }), /* @__PURE__ */ _(b, { children: u ? E && !w ? /* @__PURE__ */ _("p", {
|
|
157
157
|
className: "text-sm text-muted-foreground",
|
|
158
158
|
children: m("planmagnet.dashboards.loading", "Loading…")
|
|
159
159
|
}) : D ? /* @__PURE__ */ v("p", {
|
|
@@ -9,8 +9,8 @@ import { Workflow as c } from "lucide-react";
|
|
|
9
9
|
import { gql as l } from "@apollo/client";
|
|
10
10
|
import { useQuery as u } from "@apollo/client/react";
|
|
11
11
|
import { jsx as d, jsxs as f } from "react/jsx-runtime";
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
12
|
+
import { Card as p, CardContent as m, CardHeader as h, CardTitle as g } from "@burdenoff/fe-libs/ui";
|
|
13
|
+
import { useI18n as _ } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
14
14
|
//#region src/planmagnet/pages/analytics/StatusFlowCard.tsx
|
|
15
15
|
var v = l`
|
|
16
16
|
query GetAnalyticsStatusFlow(
|
|
@@ -93,7 +93,7 @@ function w({ sourceX: e, sourceY: t, targetX: n, targetY: r, sourceControlX: i,
|
|
|
93
93
|
});
|
|
94
94
|
}
|
|
95
95
|
function T({ workspaceId: i, projectId: o, startDate: l, endDate: b }) {
|
|
96
|
-
let { t: T } =
|
|
96
|
+
let { t: T } = _(), E = s(() => x(l, b), [l, b]), { data: D, loading: O, error: k } = u(v, {
|
|
97
97
|
variables: {
|
|
98
98
|
workspaceId: i,
|
|
99
99
|
projectId: o,
|
|
@@ -102,10 +102,10 @@ function T({ workspaceId: i, projectId: o, startDate: l, endDate: b }) {
|
|
|
102
102
|
},
|
|
103
103
|
skip: !i || !o
|
|
104
104
|
}), A = D?.planmagnetStatusFlow ?? [], { nodes: j, links: M } = S(A), N = [...A].sort((e, t) => t.count - e.count);
|
|
105
|
-
return /* @__PURE__ */ f(
|
|
105
|
+
return /* @__PURE__ */ f(p, {
|
|
106
106
|
"data-testid": "status-flow-card",
|
|
107
|
-
children: [/* @__PURE__ */ f(
|
|
108
|
-
/* @__PURE__ */ f(
|
|
107
|
+
children: [/* @__PURE__ */ f(h, { children: [
|
|
108
|
+
/* @__PURE__ */ f(g, {
|
|
109
109
|
className: "flex items-center gap-2",
|
|
110
110
|
children: [/* @__PURE__ */ d(c, { className: "h-4 w-4" }), T("planmagnet.analytics.statusFlow.title", "Status flow")]
|
|
111
111
|
}),
|
|
@@ -120,7 +120,7 @@ function T({ workspaceId: i, projectId: o, startDate: l, endDate: b }) {
|
|
|
120
120
|
from: E.from.slice(0, 10)
|
|
121
121
|
})
|
|
122
122
|
})
|
|
123
|
-
] }), /* @__PURE__ */ d(
|
|
123
|
+
] }), /* @__PURE__ */ d(m, { children: o ? O && !D ? /* @__PURE__ */ d("div", {
|
|
124
124
|
className: "flex justify-center py-12",
|
|
125
125
|
children: /* @__PURE__ */ d("div", { className: "animate-spin h-6 w-6 border-2 border-primary border-t-transparent rounded-full" })
|
|
126
126
|
}) : k ? /* @__PURE__ */ d("p", {
|
|
@@ -11,8 +11,8 @@ import { BarChart3 as l } from "lucide-react";
|
|
|
11
11
|
import { gql as u } from "@apollo/client";
|
|
12
12
|
import { useQuery as d } from "@apollo/client/react";
|
|
13
13
|
import { Fragment as f, jsx as p, jsxs as m } from "react/jsx-runtime";
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
14
|
+
import { Card as h, CardContent as g, CardHeader as _, CardTitle as v } from "@burdenoff/fe-libs/ui";
|
|
15
|
+
import { useI18n as y } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
16
16
|
//#region src/planmagnet/pages/analytics/ThroughputCard.tsx
|
|
17
17
|
var b = u`
|
|
18
18
|
query GetAnalyticsThroughput(
|
|
@@ -43,7 +43,7 @@ function x(e) {
|
|
|
43
43
|
return `${t.getUTCMonth() + 1}/${t.getUTCDate()}`;
|
|
44
44
|
}
|
|
45
45
|
function S({ workspaceId: u, projectId: S, startDate: C, endDate: w }) {
|
|
46
|
-
let { t: T } =
|
|
46
|
+
let { t: T } = y(), [E, D] = c("WEEK"), { data: O, loading: k, error: A } = d(b, {
|
|
47
47
|
variables: {
|
|
48
48
|
workspaceId: u,
|
|
49
49
|
projectId: S,
|
|
@@ -57,11 +57,11 @@ function S({ workspaceId: u, projectId: S, startDate: C, endDate: w }) {
|
|
|
57
57
|
count: e.completedCount,
|
|
58
58
|
points: e.completedPoints
|
|
59
59
|
})), N = j.reduce((e, t) => e + t.completedCount, 0), P = j.reduce((e, t) => e + t.completedPoints, 0);
|
|
60
|
-
return /* @__PURE__ */ m(
|
|
60
|
+
return /* @__PURE__ */ m(h, {
|
|
61
61
|
"data-testid": "analytics-throughput",
|
|
62
|
-
children: [/* @__PURE__ */ m(
|
|
62
|
+
children: [/* @__PURE__ */ m(_, { children: [/* @__PURE__ */ m("div", {
|
|
63
63
|
className: "flex flex-wrap items-center justify-between gap-2",
|
|
64
|
-
children: [/* @__PURE__ */ m(
|
|
64
|
+
children: [/* @__PURE__ */ m(v, {
|
|
65
65
|
className: "flex items-center gap-2",
|
|
66
66
|
children: [/* @__PURE__ */ p(l, { className: "h-4 w-4" }), T("planmagnet.analytics.throughput.title", "Throughput")]
|
|
67
67
|
}), /* @__PURE__ */ p("div", {
|
|
@@ -80,7 +80,7 @@ function S({ workspaceId: u, projectId: S, startDate: C, endDate: w }) {
|
|
|
80
80
|
}), /* @__PURE__ */ p("p", {
|
|
81
81
|
className: "text-xs text-muted-foreground",
|
|
82
82
|
children: T("planmagnet.analytics.throughput.subtitle", "Work items completed per {{bucket}}, in the selected range.", { bucket: E === "DAY" ? T("planmagnet.analytics.throughput.day", "Day").toLowerCase() : T("planmagnet.analytics.throughput.week", "Week").toLowerCase() })
|
|
83
|
-
})] }), /* @__PURE__ */ p(
|
|
83
|
+
})] }), /* @__PURE__ */ p(g, { children: k && !O ? /* @__PURE__ */ p("div", {
|
|
84
84
|
className: "flex justify-center py-12",
|
|
85
85
|
children: /* @__PURE__ */ p("div", { className: "animate-spin h-6 w-6 border-2 border-primary border-t-transparent rounded-full" })
|
|
86
86
|
}) : A ? /* @__PURE__ */ p("p", {
|
|
@@ -10,8 +10,8 @@ import { LayoutGrid as c } from "lucide-react";
|
|
|
10
10
|
import { gql as l } from "@apollo/client";
|
|
11
11
|
import { useQuery as u } from "@apollo/client/react";
|
|
12
12
|
import { jsx as d, jsxs as f } from "react/jsx-runtime";
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
13
|
+
import { Card as p, CardContent as m, CardHeader as h, CardTitle as g } from "@burdenoff/fe-libs/ui";
|
|
14
|
+
import { useI18n as _ } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
15
15
|
//#region src/planmagnet/pages/analytics/WorkBreakdownCard.tsx
|
|
16
16
|
var v = l`
|
|
17
17
|
query GetAnalyticsWorkBreakdown($workspaceId: ID!, $projectIds: [ID!]) {
|
|
@@ -168,7 +168,7 @@ function T(e) {
|
|
|
168
168
|
});
|
|
169
169
|
}
|
|
170
170
|
function E({ workspaceId: a, projectId: o }) {
|
|
171
|
-
let { t: l } =
|
|
171
|
+
let { t: l } = _(), y = e(), [b, x] = s("items"), { data: S, loading: w, error: E } = u(v, {
|
|
172
172
|
variables: {
|
|
173
173
|
workspaceId: a,
|
|
174
174
|
projectIds: o ? [o] : void 0
|
|
@@ -178,11 +178,11 @@ function E({ workspaceId: a, projectId: o }) {
|
|
|
178
178
|
function M(e) {
|
|
179
179
|
y(`/tasks/task-detail-page?taskId=${encodeURIComponent(e)}`);
|
|
180
180
|
}
|
|
181
|
-
return /* @__PURE__ */ f(
|
|
181
|
+
return /* @__PURE__ */ f(p, {
|
|
182
182
|
"data-testid": "work-breakdown-card",
|
|
183
|
-
children: [/* @__PURE__ */ f(
|
|
183
|
+
children: [/* @__PURE__ */ f(h, { children: [/* @__PURE__ */ f("div", {
|
|
184
184
|
className: "flex flex-wrap items-center justify-between gap-2",
|
|
185
|
-
children: [/* @__PURE__ */ f(
|
|
185
|
+
children: [/* @__PURE__ */ f(g, {
|
|
186
186
|
className: "flex items-center gap-2",
|
|
187
187
|
children: [/* @__PURE__ */ d(c, { className: "h-4 w-4" }), l("planmagnet.analytics.workBreakdown.title", "Work breakdown")]
|
|
188
188
|
}), /* @__PURE__ */ d("div", {
|
|
@@ -201,7 +201,7 @@ function E({ workspaceId: a, projectId: o }) {
|
|
|
201
201
|
}), /* @__PURE__ */ d("p", {
|
|
202
202
|
className: "text-xs text-muted-foreground",
|
|
203
203
|
children: l("planmagnet.analytics.workBreakdown.subtitle", "Live open/done work, by project and epic — current state, not limited by the date range above.")
|
|
204
|
-
})] }), /* @__PURE__ */ d(
|
|
204
|
+
})] }), /* @__PURE__ */ d(m, { children: w && !S ? /* @__PURE__ */ d("div", {
|
|
205
205
|
className: "flex justify-center py-12",
|
|
206
206
|
children: /* @__PURE__ */ d("div", { className: "animate-spin h-6 w-6 border-2 border-primary border-t-transparent rounded-full" })
|
|
207
207
|
}) : E ? /* @__PURE__ */ d("p", {
|
|
@@ -1,6 +1,20 @@
|
|
|
1
1
|
import { ActorProfile } from '@burdenoff/fe-libs/shared';
|
|
2
2
|
import { ReactNode } from 'react';
|
|
3
3
|
|
|
4
|
+
/**
|
|
5
|
+
* CWF-15's redaction sentinel: `FeatureRequest.submittedBy`/`createdBy`/`updatedBy` and `FeatureVote.voterId`
|
|
6
|
+
* read back this literal string, instead of the real actor id, for a non-moderator caller when the record (or,
|
|
7
|
+
* for a vote, that vote) is flagged `isAnonymous`. Never a real actor id — those are workspace-member uuids —
|
|
8
|
+
* so, like the `automation:` actor ids above, it must never be sent through `useActorProfiles`: that would only
|
|
9
|
+
* ever resolve to the generic "not a member" fallback, and would burn a wasted slot in every batch lookup.
|
|
10
|
+
*/
|
|
11
|
+
export declare const ANONYMOUS_ACTOR_ID = "anonymous";
|
|
12
|
+
export declare function isAnonymousActorId(id: string | null | undefined): boolean;
|
|
13
|
+
/** The literal "Anonymous" badge CWF-15 asks for everywhere a redacted actor id would otherwise show — see
|
|
14
|
+
* `PersonName` below, which is the one place `submittedBy`/`createdBy`/`updatedBy`/`voterId` ever render. */
|
|
15
|
+
export declare function AnonymousBadge({ className }: {
|
|
16
|
+
className?: string;
|
|
17
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
4
18
|
export declare function PeopleProvider({ workspaceId, children, }: {
|
|
5
19
|
workspaceId?: string;
|
|
6
20
|
children: ReactNode;
|