@burdenoff/microfe-planmagnet 2026.509.103
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/README.md +12 -0
- package/dist/dev/main.d.ts +2 -0
- package/dist/dev/main.d.ts.map +1 -0
- package/dist/generated/global-operations.d.ts +2 -0
- package/dist/generated/global-operations.d.ts.map +1 -0
- package/dist/generated/global-types.d.ts +21253 -0
- package/dist/generated/global-types.d.ts.map +1 -0
- package/dist/generated/wspace-operations.d.ts +8370 -0
- package/dist/generated/wspace-operations.d.ts.map +1 -0
- package/dist/generated/wspace-types.d.ts +4182 -0
- package/dist/generated/wspace-types.d.ts.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/node_modules/@apollo/client/errors/CombinedGraphQLErrors.js +24 -0
- package/dist/node_modules/@apollo/client/errors/CombinedGraphQLErrors.js.map +1 -0
- package/dist/node_modules/@apollo/client/errors/utils.js +16 -0
- package/dist/node_modules/@apollo/client/errors/utils.js.map +1 -0
- package/dist/planmagnet/PlanMagnetRoot.d.ts +5 -0
- package/dist/planmagnet/PlanMagnetRoot.d.ts.map +1 -0
- package/dist/planmagnet/PlanMagnetRoot.js +292 -0
- package/dist/planmagnet/PlanMagnetRoot.js.map +1 -0
- package/dist/planmagnet/PlanMagnetRoutes.d.ts +2 -0
- package/dist/planmagnet/PlanMagnetRoutes.d.ts.map +1 -0
- package/dist/planmagnet/PlanMagnetRoutes.js +211 -0
- package/dist/planmagnet/PlanMagnetRoutes.js.map +1 -0
- package/dist/planmagnet/index.d.ts +5 -0
- package/dist/planmagnet/index.d.ts.map +1 -0
- package/dist/planmagnet/index.js +3 -0
- package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.js +312 -0
- package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.js.map +1 -0
- package/dist/planmagnet/pages/CollaborationCollaborationPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/CollaborationCollaborationPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/CollaborationCollaborationPagePage.js +110 -0
- package/dist/planmagnet/pages/CollaborationCollaborationPagePage.js.map +1 -0
- package/dist/planmagnet/pages/CollaborationCreateChannelPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/CollaborationCreateChannelPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/CollaborationCreateChannelPagePage.js +96 -0
- package/dist/planmagnet/pages/CollaborationCreateChannelPagePage.js.map +1 -0
- package/dist/planmagnet/pages/CollaborationFilesPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/CollaborationFilesPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/CollaborationFilesPagePage.js +112 -0
- package/dist/planmagnet/pages/CollaborationFilesPagePage.js.map +1 -0
- package/dist/planmagnet/pages/CollaborationMessagesPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/CollaborationMessagesPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/CollaborationMessagesPagePage.js +141 -0
- package/dist/planmagnet/pages/CollaborationMessagesPagePage.js.map +1 -0
- package/dist/planmagnet/pages/CollaborationNewDiscussionPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/CollaborationNewDiscussionPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/CollaborationNewDiscussionPagePage.js +124 -0
- package/dist/planmagnet/pages/CollaborationNewDiscussionPagePage.js.map +1 -0
- package/dist/planmagnet/pages/DashboardDashboardPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/DashboardDashboardPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/DashboardDashboardPagePage.js +350 -0
- package/dist/planmagnet/pages/DashboardDashboardPagePage.js.map +1 -0
- package/dist/planmagnet/pages/MeetingsScheduleMeetingPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/MeetingsScheduleMeetingPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/MeetingsScheduleMeetingPagePage.js +290 -0
- package/dist/planmagnet/pages/MeetingsScheduleMeetingPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProductsCreateProductPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProductsCreateProductPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProductsCreateProductPagePage.js +189 -0
- package/dist/planmagnet/pages/ProductsCreateProductPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProductsCreateRoadmapPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProductsCreateRoadmapPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProductsCreateRoadmapPagePage.js +151 -0
- package/dist/planmagnet/pages/ProductsCreateRoadmapPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProductsEditProductPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProductsEditProductPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProductsEditProductPagePage.js +257 -0
- package/dist/planmagnet/pages/ProductsEditProductPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProductsEditReleasePagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProductsEditReleasePagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProductsEditReleasePagePage.js +221 -0
- package/dist/planmagnet/pages/ProductsEditReleasePagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProductsFeatureAnalyticsPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProductsFeatureAnalyticsPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProductsFeatureAnalyticsPagePage.js +284 -0
- package/dist/planmagnet/pages/ProductsFeatureAnalyticsPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.js +291 -0
- package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProductsFeaturesPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProductsFeaturesPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProductsFeaturesPagePage.js +257 -0
- package/dist/planmagnet/pages/ProductsFeaturesPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProductsNewFeaturePagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProductsNewFeaturePagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProductsNewFeaturePagePage.js +222 -0
- package/dist/planmagnet/pages/ProductsNewFeaturePagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProductsProductDetailPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProductsProductDetailPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProductsProductDetailPagePage.js +288 -0
- package/dist/planmagnet/pages/ProductsProductDetailPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProductsProductsPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProductsProductsPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProductsProductsPagePage.js +225 -0
- package/dist/planmagnet/pages/ProductsProductsPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.js +262 -0
- package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProductsReleasesPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProductsReleasesPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProductsReleasesPagePage.js +162 -0
- package/dist/planmagnet/pages/ProductsReleasesPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProductsRoadmapAnalyticsPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProductsRoadmapAnalyticsPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProductsRoadmapAnalyticsPagePage.js +342 -0
- package/dist/planmagnet/pages/ProductsRoadmapAnalyticsPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.js +233 -0
- package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProductsRoadmapsPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProductsRoadmapsPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProductsRoadmapsPagePage.js +193 -0
- package/dist/planmagnet/pages/ProductsRoadmapsPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProjectsActiveProjectsPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProjectsActiveProjectsPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProjectsActiveProjectsPagePage.js +116 -0
- package/dist/planmagnet/pages/ProjectsActiveProjectsPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProjectsCreateProjectPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProjectsCreateProjectPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProjectsCreateProjectPagePage.js +199 -0
- package/dist/planmagnet/pages/ProjectsCreateProjectPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProjectsEditProjectPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProjectsEditProjectPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProjectsEditProjectPagePage.js +197 -0
- package/dist/planmagnet/pages/ProjectsEditProjectPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.js +173 -0
- package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProjectsMilestonesPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProjectsMilestonesPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProjectsMilestonesPagePage.js +119 -0
- package/dist/planmagnet/pages/ProjectsMilestonesPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.js +257 -0
- package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.js +222 -0
- package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProjectsPlanningPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProjectsPlanningPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProjectsPlanningPagePage.js +142 -0
- package/dist/planmagnet/pages/ProjectsPlanningPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js +363 -0
- package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProjectsProjectsPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProjectsProjectsPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProjectsProjectsPagePage.js +176 -0
- package/dist/planmagnet/pages/ProjectsProjectsPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ReportsCreateReportPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ReportsCreateReportPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ReportsCreateReportPagePage.js +173 -0
- package/dist/planmagnet/pages/ReportsCreateReportPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ReportsReportsPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ReportsReportsPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ReportsReportsPagePage.js +221 -0
- package/dist/planmagnet/pages/ReportsReportsPagePage.js.map +1 -0
- package/dist/planmagnet/pages/SprintsStartSprintPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/SprintsStartSprintPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/SprintsStartSprintPagePage.js +282 -0
- package/dist/planmagnet/pages/SprintsStartSprintPagePage.js.map +1 -0
- package/dist/planmagnet/pages/TasksCreateTaskPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/TasksCreateTaskPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/TasksCreateTaskPagePage.js +227 -0
- package/dist/planmagnet/pages/TasksCreateTaskPagePage.js.map +1 -0
- package/dist/planmagnet/pages/TasksEditTaskPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/TasksEditTaskPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/TasksEditTaskPagePage.js +234 -0
- package/dist/planmagnet/pages/TasksEditTaskPagePage.js.map +1 -0
- package/dist/planmagnet/pages/TasksTaskDetailPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/TasksTaskDetailPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/TasksTaskDetailPagePage.js +232 -0
- package/dist/planmagnet/pages/TasksTaskDetailPagePage.js.map +1 -0
- package/dist/planmagnet/pages/TasksTasksPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/TasksTasksPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/TasksTasksPagePage.js +206 -0
- package/dist/planmagnet/pages/TasksTasksPagePage.js.map +1 -0
- package/dist/planmagnet/pages/TeamCreateTeamPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/TeamCreateTeamPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/TeamCreateTeamPagePage.js +138 -0
- package/dist/planmagnet/pages/TeamCreateTeamPagePage.js.map +1 -0
- package/dist/planmagnet/pages/TeamInviteMemberPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/TeamInviteMemberPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/TeamInviteMemberPagePage.js +161 -0
- package/dist/planmagnet/pages/TeamInviteMemberPagePage.js.map +1 -0
- package/dist/planmagnet/pages/TeamTeamPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/TeamTeamPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/TeamTeamPagePage.js +203 -0
- package/dist/planmagnet/pages/TeamTeamPagePage.js.map +1 -0
- package/dist/planmagnet/pages/WorkspaceCreateWorkspacePagePage.d.ts +2 -0
- package/dist/planmagnet/pages/WorkspaceCreateWorkspacePagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/WorkspaceCreateWorkspacePagePage.js +97 -0
- package/dist/planmagnet/pages/WorkspaceCreateWorkspacePagePage.js.map +1 -0
- package/dist/planmagnet/providers/PlanMagnetProvider.d.ts +31 -0
- package/dist/planmagnet/providers/PlanMagnetProvider.d.ts.map +1 -0
- package/dist/planmagnet/providers/PlanMagnetProvider.js +119 -0
- package/dist/planmagnet/providers/PlanMagnetProvider.js.map +1 -0
- package/dist/planmagnet/store/planmagnetStore.d.ts +30 -0
- package/dist/planmagnet/store/planmagnetStore.d.ts.map +1 -0
- package/dist/planmagnet/store/planmagnetStore.js +42 -0
- package/dist/planmagnet/store/planmagnetStore.js.map +1 -0
- package/dist/planmagnet/types/index.d.ts +317 -0
- package/dist/planmagnet/types/index.d.ts.map +1 -0
- package/dist/planmagnet/utils/cn.d.ts +4 -0
- package/dist/planmagnet/utils/cn.d.ts.map +1 -0
- package/dist/planmagnet/utils/navigation.d.ts +2 -0
- package/dist/planmagnet/utils/navigation.d.ts.map +1 -0
- package/dist/planmagnet/utils/navigation.js +8 -0
- package/dist/planmagnet/utils/navigation.js.map +1 -0
- package/package.json +107 -0
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
import { usePlanMagnet as e } from "../providers/PlanMagnetProvider.js";
|
|
2
|
+
import { AlertTriangle as t, ArrowUpRight as n, Calendar as r, CheckSquare as i, FolderKanban as a, LayoutDashboard as o, TrendingUp as s, Users as c, Zap as l } from "lucide-react";
|
|
3
|
+
import { gql as u } from "@apollo/client";
|
|
4
|
+
import { useQuery as d } from "@apollo/client/react";
|
|
5
|
+
import { jsx as f, jsxs as p } from "react/jsx-runtime";
|
|
6
|
+
import { useI18n as m } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
7
|
+
import { Badge as h, Card as g, CardContent as _, CardHeader as v, CardTitle as y } from "@burdenoff/fe-libs/ui";
|
|
8
|
+
//#region src/planmagnet/pages/DashboardDashboardPagePage.tsx
|
|
9
|
+
var b = u`
|
|
10
|
+
query GetDashboardData($workspaceId: ID!) {
|
|
11
|
+
planmagnetProjects(workspaceId: $workspaceId, pagination: { first: 50 }) {
|
|
12
|
+
items {
|
|
13
|
+
id
|
|
14
|
+
name
|
|
15
|
+
description
|
|
16
|
+
key
|
|
17
|
+
status
|
|
18
|
+
methodology
|
|
19
|
+
ownerId
|
|
20
|
+
startDate
|
|
21
|
+
endDate
|
|
22
|
+
tags
|
|
23
|
+
createdAt
|
|
24
|
+
}
|
|
25
|
+
totalCount
|
|
26
|
+
}
|
|
27
|
+
planmagnetSprints(workspaceId: $workspaceId, pagination: { first: 50 }) {
|
|
28
|
+
items {
|
|
29
|
+
id
|
|
30
|
+
name
|
|
31
|
+
projectId
|
|
32
|
+
status
|
|
33
|
+
startDate
|
|
34
|
+
endDate
|
|
35
|
+
goal
|
|
36
|
+
capacity
|
|
37
|
+
velocity
|
|
38
|
+
workItems {
|
|
39
|
+
id
|
|
40
|
+
status
|
|
41
|
+
storyPoints
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
totalCount
|
|
45
|
+
}
|
|
46
|
+
planmagnetMilestones(workspaceId: $workspaceId, pagination: { first: 50 }) {
|
|
47
|
+
items {
|
|
48
|
+
id
|
|
49
|
+
name
|
|
50
|
+
description
|
|
51
|
+
projectId
|
|
52
|
+
status
|
|
53
|
+
dueDate
|
|
54
|
+
ownerId
|
|
55
|
+
createdAt
|
|
56
|
+
}
|
|
57
|
+
totalCount
|
|
58
|
+
}
|
|
59
|
+
planmagnetWorkItems(workspaceId: $workspaceId, pagination: { first: 20 }) {
|
|
60
|
+
items {
|
|
61
|
+
id
|
|
62
|
+
key
|
|
63
|
+
description
|
|
64
|
+
status
|
|
65
|
+
priority
|
|
66
|
+
storyPoints
|
|
67
|
+
assigneeId
|
|
68
|
+
projectId
|
|
69
|
+
labels
|
|
70
|
+
createdAt
|
|
71
|
+
}
|
|
72
|
+
totalCount
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
`;
|
|
76
|
+
function x() {
|
|
77
|
+
let { workspaceId: u } = e(), { t: x } = m(), { data: S, loading: C, error: w } = d(b, { variables: { workspaceId: u ?? "default" } });
|
|
78
|
+
if (C) return /* @__PURE__ */ f("div", {
|
|
79
|
+
className: "flex items-center justify-center p-12",
|
|
80
|
+
children: /* @__PURE__ */ f("div", { className: "animate-spin h-8 w-8 border-2 border-primary border-t-transparent rounded-full" })
|
|
81
|
+
});
|
|
82
|
+
if (w) return /* @__PURE__ */ p("div", {
|
|
83
|
+
className: "p-6 text-red-500",
|
|
84
|
+
children: [
|
|
85
|
+
x("planmagnet.dashboard.errorLoading", "Error loading dashboard"),
|
|
86
|
+
": ",
|
|
87
|
+
w.message
|
|
88
|
+
]
|
|
89
|
+
});
|
|
90
|
+
let T = S?.planmagnetProjects?.items ?? [], E = S?.planmagnetSprints?.items ?? [], D = S?.planmagnetMilestones?.items ?? [], O = S?.planmagnetWorkItems?.items ?? [], k = T.filter((e) => e.status === "ACTIVE");
|
|
91
|
+
T.filter((e) => e.status === "COMPLETED");
|
|
92
|
+
let A = E.filter((e) => e.status === "ACTIVE"), j = D.filter((e) => e.status === "PENDING" || e.status === "IN_PROGRESS").slice(0, 4), M = O.slice(0, 5), N = [
|
|
93
|
+
{
|
|
94
|
+
label: x("planmagnet.dashboard.metrics.totalProjects.label", "Total Projects"),
|
|
95
|
+
value: String(T.length),
|
|
96
|
+
trend: `${k.length} ${x("planmagnet.dashboard.metrics.totalProjects.trend", "active")}`
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
label: x("planmagnet.dashboard.metrics.activeSprints.label", "Active Sprints"),
|
|
100
|
+
value: String(A.length),
|
|
101
|
+
trend: `${E.length} ${x("planmagnet.dashboard.metrics.activeSprints.trend", "total")}`
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
label: x("planmagnet.dashboard.metrics.workItems.label", "Work Items"),
|
|
105
|
+
value: String(S?.planmagnetWorkItems?.totalCount ?? 0),
|
|
106
|
+
trend: x("planmagnet.dashboard.metrics.workItems.trend", "across all projects")
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
label: x("planmagnet.dashboard.metrics.milestones.label", "Milestones"),
|
|
110
|
+
value: String(D.length),
|
|
111
|
+
trend: `${j.length} ${x("planmagnet.dashboard.metrics.milestones.trend", "upcoming")}`
|
|
112
|
+
}
|
|
113
|
+
];
|
|
114
|
+
return /* @__PURE__ */ p("div", {
|
|
115
|
+
className: "space-y-6 p-6",
|
|
116
|
+
children: [
|
|
117
|
+
/* @__PURE__ */ f("div", {
|
|
118
|
+
className: "flex items-center justify-between",
|
|
119
|
+
children: /* @__PURE__ */ p("div", { children: [/* @__PURE__ */ p("h1", {
|
|
120
|
+
className: "text-2xl font-semibold flex items-center gap-2",
|
|
121
|
+
children: [/* @__PURE__ */ f(o, { className: "h-6 w-6" }), x("planmagnet.dashboard.title", "Dashboard")]
|
|
122
|
+
}), /* @__PURE__ */ f("p", {
|
|
123
|
+
className: "text-sm text-muted-foreground mt-1",
|
|
124
|
+
children: x("planmagnet.dashboard.subtitle", "Welcome back! Here is your project overview.")
|
|
125
|
+
})] })
|
|
126
|
+
}),
|
|
127
|
+
/* @__PURE__ */ f("div", {
|
|
128
|
+
className: "grid gap-4 md:grid-cols-2 lg:grid-cols-4",
|
|
129
|
+
children: N.map((e) => /* @__PURE__ */ p(g, { children: [/* @__PURE__ */ p(v, {
|
|
130
|
+
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
131
|
+
children: [/* @__PURE__ */ f(y, {
|
|
132
|
+
className: "text-sm font-medium",
|
|
133
|
+
children: e.label
|
|
134
|
+
}), /* @__PURE__ */ f(s, { className: "h-4 w-4 text-muted-foreground" })]
|
|
135
|
+
}), /* @__PURE__ */ p(_, { children: [/* @__PURE__ */ f("div", {
|
|
136
|
+
className: "text-2xl font-bold",
|
|
137
|
+
children: e.value
|
|
138
|
+
}), /* @__PURE__ */ f("p", {
|
|
139
|
+
className: "text-xs text-muted-foreground",
|
|
140
|
+
children: e.trend
|
|
141
|
+
})] })] }, e.label))
|
|
142
|
+
}),
|
|
143
|
+
/* @__PURE__ */ p("div", {
|
|
144
|
+
className: "grid gap-6 lg:grid-cols-12",
|
|
145
|
+
children: [/* @__PURE__ */ p(g, {
|
|
146
|
+
className: "lg:col-span-8",
|
|
147
|
+
children: [/* @__PURE__ */ f(v, { children: /* @__PURE__ */ p(y, {
|
|
148
|
+
className: "flex items-center gap-2 text-base",
|
|
149
|
+
children: [/* @__PURE__ */ f(l, { className: "h-5 w-5 text-blue-500" }), x("planmagnet.dashboard.activeSprints.title", "Active Sprints")]
|
|
150
|
+
}) }), /* @__PURE__ */ p(_, {
|
|
151
|
+
className: "space-y-4",
|
|
152
|
+
children: [A.map((e) => {
|
|
153
|
+
let t = e.workItems.reduce((e, t) => e + (t.storyPoints ?? 0), 0), n = e.workItems.filter((e) => e.status === "DONE").reduce((e, t) => e + (t.storyPoints ?? 0), 0), r = e.workItems.length, i = e.workItems.filter((e) => e.status === "DONE").length, a = t > 0 ? Math.round(n / t * 100) : 0;
|
|
154
|
+
return /* @__PURE__ */ p("div", {
|
|
155
|
+
className: "rounded-lg border p-4",
|
|
156
|
+
children: [
|
|
157
|
+
/* @__PURE__ */ p("div", {
|
|
158
|
+
className: "flex items-center justify-between mb-2",
|
|
159
|
+
children: [/* @__PURE__ */ p("div", { children: [/* @__PURE__ */ f("p", {
|
|
160
|
+
className: "font-medium",
|
|
161
|
+
children: e.name
|
|
162
|
+
}), /* @__PURE__ */ p("p", {
|
|
163
|
+
className: "text-xs text-muted-foreground",
|
|
164
|
+
children: [
|
|
165
|
+
x("planmagnet.dashboard.shared.project", "Project"),
|
|
166
|
+
": ",
|
|
167
|
+
e.projectId
|
|
168
|
+
]
|
|
169
|
+
})] }), /* @__PURE__ */ p(h, {
|
|
170
|
+
variant: "secondary",
|
|
171
|
+
children: [
|
|
172
|
+
n,
|
|
173
|
+
"/",
|
|
174
|
+
t,
|
|
175
|
+
" ",
|
|
176
|
+
x("planmagnet.dashboard.shared.pointsShort", "pts")
|
|
177
|
+
]
|
|
178
|
+
})]
|
|
179
|
+
}),
|
|
180
|
+
/* @__PURE__ */ f("div", {
|
|
181
|
+
className: "w-full h-2 bg-muted rounded-full overflow-hidden",
|
|
182
|
+
children: /* @__PURE__ */ f("div", {
|
|
183
|
+
className: "h-full bg-primary rounded-full transition-all",
|
|
184
|
+
style: { width: `${a}%` }
|
|
185
|
+
})
|
|
186
|
+
}),
|
|
187
|
+
/* @__PURE__ */ p("div", {
|
|
188
|
+
className: "flex items-center justify-between mt-2 text-xs text-muted-foreground",
|
|
189
|
+
children: [/* @__PURE__ */ p("span", { children: [
|
|
190
|
+
i,
|
|
191
|
+
"/",
|
|
192
|
+
r,
|
|
193
|
+
" ",
|
|
194
|
+
x("planmagnet.dashboard.shared.tasks", "tasks")
|
|
195
|
+
] }), /* @__PURE__ */ p("span", { children: [
|
|
196
|
+
e.startDate ? new Date(e.startDate).toLocaleDateString() : "—",
|
|
197
|
+
" -",
|
|
198
|
+
" ",
|
|
199
|
+
e.endDate ? new Date(e.endDate).toLocaleDateString() : "—"
|
|
200
|
+
] })]
|
|
201
|
+
})
|
|
202
|
+
]
|
|
203
|
+
}, e.id);
|
|
204
|
+
}), A.length === 0 && /* @__PURE__ */ f("p", {
|
|
205
|
+
className: "text-sm text-muted-foreground text-center py-4",
|
|
206
|
+
children: x("planmagnet.dashboard.activeSprints.empty", "No active sprints.")
|
|
207
|
+
})]
|
|
208
|
+
})]
|
|
209
|
+
}), /* @__PURE__ */ p("div", {
|
|
210
|
+
className: "lg:col-span-4 space-y-6",
|
|
211
|
+
children: [T.filter((e) => e.status === "ON_HOLD").length > 0 && /* @__PURE__ */ p(g, { children: [/* @__PURE__ */ f(v, { children: /* @__PURE__ */ p(y, {
|
|
212
|
+
className: "flex items-center gap-2 text-base",
|
|
213
|
+
children: [/* @__PURE__ */ f(t, { className: "h-5 w-5 text-orange-500" }), x("planmagnet.dashboard.onHoldProjects.title", "On-Hold Projects")]
|
|
214
|
+
}) }), /* @__PURE__ */ f(_, {
|
|
215
|
+
className: "space-y-3",
|
|
216
|
+
children: T.filter((e) => e.status === "ON_HOLD").map((e) => /* @__PURE__ */ p("div", {
|
|
217
|
+
className: "flex items-center justify-between rounded border p-2",
|
|
218
|
+
children: [/* @__PURE__ */ f("div", { children: /* @__PURE__ */ f("p", {
|
|
219
|
+
className: "text-sm font-medium",
|
|
220
|
+
children: e.name
|
|
221
|
+
}) }), /* @__PURE__ */ f(h, {
|
|
222
|
+
variant: "destructive",
|
|
223
|
+
children: e.status.toLowerCase().replace("_", " ")
|
|
224
|
+
})]
|
|
225
|
+
}, e.id))
|
|
226
|
+
})] }), /* @__PURE__ */ p(g, { children: [/* @__PURE__ */ f(v, { children: /* @__PURE__ */ p(y, {
|
|
227
|
+
className: "flex items-center gap-2 text-base",
|
|
228
|
+
children: [/* @__PURE__ */ f(r, { className: "h-5 w-5 text-green-500" }), x("planmagnet.dashboard.upcomingMilestones.title", "Upcoming Milestones")]
|
|
229
|
+
}) }), /* @__PURE__ */ p(_, {
|
|
230
|
+
className: "space-y-3",
|
|
231
|
+
children: [j.map((e) => /* @__PURE__ */ p("div", {
|
|
232
|
+
className: "flex items-start gap-3 rounded border p-2",
|
|
233
|
+
children: [/* @__PURE__ */ p("div", {
|
|
234
|
+
className: "flex-1 min-w-0",
|
|
235
|
+
children: [
|
|
236
|
+
/* @__PURE__ */ f("p", {
|
|
237
|
+
className: "text-sm font-medium truncate",
|
|
238
|
+
children: e.name
|
|
239
|
+
}),
|
|
240
|
+
/* @__PURE__ */ p("p", {
|
|
241
|
+
className: "text-xs text-muted-foreground",
|
|
242
|
+
children: [
|
|
243
|
+
x("planmagnet.dashboard.shared.project", "Project"),
|
|
244
|
+
": ",
|
|
245
|
+
e.projectId
|
|
246
|
+
]
|
|
247
|
+
}),
|
|
248
|
+
/* @__PURE__ */ p("p", {
|
|
249
|
+
className: "text-xs text-muted-foreground",
|
|
250
|
+
children: [
|
|
251
|
+
x("planmagnet.dashboard.shared.due", "Due"),
|
|
252
|
+
" ",
|
|
253
|
+
e.dueDate ? new Date(e.dueDate).toLocaleDateString() : "—"
|
|
254
|
+
]
|
|
255
|
+
})
|
|
256
|
+
]
|
|
257
|
+
}), /* @__PURE__ */ f(h, {
|
|
258
|
+
variant: "secondary",
|
|
259
|
+
className: "text-xs flex-shrink-0 capitalize",
|
|
260
|
+
children: e.status.toLowerCase().replace("_", " ")
|
|
261
|
+
})]
|
|
262
|
+
}, e.id)), j.length === 0 && /* @__PURE__ */ f("p", {
|
|
263
|
+
className: "text-sm text-muted-foreground text-center py-2",
|
|
264
|
+
children: x("planmagnet.dashboard.upcomingMilestones.empty", "No upcoming milestones.")
|
|
265
|
+
})]
|
|
266
|
+
})] })]
|
|
267
|
+
})]
|
|
268
|
+
}),
|
|
269
|
+
/* @__PURE__ */ p("div", {
|
|
270
|
+
className: "grid gap-6 lg:grid-cols-2",
|
|
271
|
+
children: [/* @__PURE__ */ p(g, { children: [/* @__PURE__ */ f(v, { children: /* @__PURE__ */ p(y, {
|
|
272
|
+
className: "flex items-center gap-2 text-base",
|
|
273
|
+
children: [/* @__PURE__ */ f(i, { className: "h-5 w-5 text-purple-500" }), x("planmagnet.dashboard.recentWorkItems.title", "Recent Work Items")]
|
|
274
|
+
}) }), /* @__PURE__ */ p(_, {
|
|
275
|
+
className: "space-y-3",
|
|
276
|
+
children: [M.map((e) => /* @__PURE__ */ p("div", {
|
|
277
|
+
className: "flex items-center justify-between rounded border p-2",
|
|
278
|
+
children: [/* @__PURE__ */ p("div", {
|
|
279
|
+
className: "min-w-0 flex-1",
|
|
280
|
+
children: [/* @__PURE__ */ f("p", {
|
|
281
|
+
className: "text-sm font-medium truncate",
|
|
282
|
+
children: e.key
|
|
283
|
+
}), /* @__PURE__ */ p("p", {
|
|
284
|
+
className: "text-xs text-muted-foreground",
|
|
285
|
+
children: [
|
|
286
|
+
e.projectId,
|
|
287
|
+
" ",
|
|
288
|
+
e.assigneeId ? `\u00b7 ${e.assigneeId}` : ""
|
|
289
|
+
]
|
|
290
|
+
})]
|
|
291
|
+
}), /* @__PURE__ */ p("div", {
|
|
292
|
+
className: "flex items-center gap-2 flex-shrink-0",
|
|
293
|
+
children: [/* @__PURE__ */ p(h, {
|
|
294
|
+
variant: "outline",
|
|
295
|
+
className: "text-xs",
|
|
296
|
+
children: [
|
|
297
|
+
e.storyPoints ?? 0,
|
|
298
|
+
" ",
|
|
299
|
+
x("planmagnet.dashboard.shared.pointsShort", "pts")
|
|
300
|
+
]
|
|
301
|
+
}), /* @__PURE__ */ f(h, {
|
|
302
|
+
variant: "secondary",
|
|
303
|
+
className: "text-xs capitalize",
|
|
304
|
+
children: e.status.toLowerCase().replace("_", " ")
|
|
305
|
+
})]
|
|
306
|
+
})]
|
|
307
|
+
}, e.id)), M.length === 0 && /* @__PURE__ */ f("p", {
|
|
308
|
+
className: "text-sm text-muted-foreground text-center py-4",
|
|
309
|
+
children: x("planmagnet.dashboard.recentWorkItems.empty", "No work items yet.")
|
|
310
|
+
})]
|
|
311
|
+
})] }), /* @__PURE__ */ p(g, { children: [/* @__PURE__ */ f(v, { children: /* @__PURE__ */ p(y, {
|
|
312
|
+
className: "flex items-center gap-2 text-base",
|
|
313
|
+
children: [/* @__PURE__ */ f(a, { className: "h-5 w-5 text-cyan-500" }), x("planmagnet.dashboard.projectStatus.title", "Project Status")]
|
|
314
|
+
}) }), /* @__PURE__ */ p(_, {
|
|
315
|
+
className: "space-y-3",
|
|
316
|
+
children: [k.map((e) => /* @__PURE__ */ p("div", {
|
|
317
|
+
className: "flex items-center justify-between rounded border p-2",
|
|
318
|
+
children: [/* @__PURE__ */ p("div", {
|
|
319
|
+
className: "min-w-0 flex-1",
|
|
320
|
+
children: [/* @__PURE__ */ f("p", {
|
|
321
|
+
className: "text-sm font-medium truncate",
|
|
322
|
+
children: e.name
|
|
323
|
+
}), /* @__PURE__ */ f("p", {
|
|
324
|
+
className: "text-xs text-muted-foreground capitalize",
|
|
325
|
+
children: e.status.toLowerCase().replace("_", " ")
|
|
326
|
+
})]
|
|
327
|
+
}), /* @__PURE__ */ p("div", {
|
|
328
|
+
className: "flex items-center gap-2 ml-3 flex-shrink-0",
|
|
329
|
+
children: [
|
|
330
|
+
/* @__PURE__ */ f(c, { className: "h-3 w-3 text-muted-foreground" }),
|
|
331
|
+
/* @__PURE__ */ f("span", {
|
|
332
|
+
className: "text-xs text-muted-foreground",
|
|
333
|
+
children: e.ownerId
|
|
334
|
+
}),
|
|
335
|
+
/* @__PURE__ */ f(n, { className: "h-3 w-3 text-muted-foreground" })
|
|
336
|
+
]
|
|
337
|
+
})]
|
|
338
|
+
}, e.id)), k.length === 0 && /* @__PURE__ */ f("p", {
|
|
339
|
+
className: "text-sm text-muted-foreground text-center py-4",
|
|
340
|
+
children: x("planmagnet.dashboard.projectStatus.empty", "No active projects.")
|
|
341
|
+
})]
|
|
342
|
+
})] })]
|
|
343
|
+
})
|
|
344
|
+
]
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
//#endregion
|
|
348
|
+
export { x as DashboardDashboardPagePage };
|
|
349
|
+
|
|
350
|
+
//# sourceMappingURL=DashboardDashboardPagePage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DashboardDashboardPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/DashboardDashboardPagePage.tsx"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck\nimport { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport { Card, CardContent, CardHeader, CardTitle, Badge } from '@burdenoff/fe-libs/ui';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport {\n LayoutDashboard,\n FolderKanban,\n CheckSquare,\n Zap,\n Users,\n Calendar,\n TrendingUp,\n AlertTriangle,\n ArrowUpRight,\n} from 'lucide-react';\nimport { usePlanMagnet } from '../providers/PlanMagnetProvider';\n\nconst GET_DASHBOARD_DATA = gql`\n query GetDashboardData($workspaceId: ID!) {\n planmagnetProjects(workspaceId: $workspaceId, pagination: { first: 50 }) {\n items {\n id\n name\n description\n key\n status\n methodology\n ownerId\n startDate\n endDate\n tags\n createdAt\n }\n totalCount\n }\n planmagnetSprints(workspaceId: $workspaceId, pagination: { first: 50 }) {\n items {\n id\n name\n projectId\n status\n startDate\n endDate\n goal\n capacity\n velocity\n workItems {\n id\n status\n storyPoints\n }\n }\n totalCount\n }\n planmagnetMilestones(workspaceId: $workspaceId, pagination: { first: 50 }) {\n items {\n id\n name\n description\n projectId\n status\n dueDate\n ownerId\n createdAt\n }\n totalCount\n }\n planmagnetWorkItems(workspaceId: $workspaceId, pagination: { first: 20 }) {\n items {\n id\n key\n description\n status\n priority\n storyPoints\n assigneeId\n projectId\n labels\n createdAt\n }\n totalCount\n }\n }\n`;\n\nexport function DashboardDashboardPagePage() {\n const { workspaceId } = usePlanMagnet();\n const { t } = useI18n();\n\n const {\n data,\n loading,\n error,\n } = // eslint-disable-next-line @typescript-eslint/no-explicit-any\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n useQuery<Record<string, any>>(GET_DASHBOARD_DATA, {\n variables: { workspaceId: workspaceId ?? 'default' },\n });\n\n if (loading)\n return (\n <div className=\"flex items-center justify-center p-12\">\n <div className=\"animate-spin h-8 w-8 border-2 border-primary border-t-transparent rounded-full\" />\n </div>\n );\n if (error)\n return (\n <div className=\"p-6 text-red-500\">\n {t('planmagnet.dashboard.errorLoading', 'Error loading dashboard')}: {error.message}\n </div>\n );\n\n const projects = data?.planmagnetProjects?.items ?? [];\n const sprints = data?.planmagnetSprints?.items ?? [];\n const milestones = data?.planmagnetMilestones?.items ?? [];\n const workItems = data?.planmagnetWorkItems?.items ?? [];\n\n const activeProjects = projects.filter((p: { status: string }) => p.status === 'ACTIVE');\n const completedProjects = projects.filter((p: { status: string }) => p.status === 'COMPLETED');\n const activeSprints = sprints.filter((s: { status: string }) => s.status === 'ACTIVE');\n const upcomingMilestones = milestones\n .filter((m: { status: string }) => m.status === 'PENDING' || m.status === 'IN_PROGRESS')\n .slice(0, 4);\n const recentWorkItems = workItems.slice(0, 5);\n\n const metrics = [\n {\n label: t('planmagnet.dashboard.metrics.totalProjects.label', 'Total Projects'),\n value: String(projects.length),\n trend: `${activeProjects.length} ${t('planmagnet.dashboard.metrics.totalProjects.trend', 'active')}`,\n },\n {\n label: t('planmagnet.dashboard.metrics.activeSprints.label', 'Active Sprints'),\n value: String(activeSprints.length),\n trend: `${sprints.length} ${t('planmagnet.dashboard.metrics.activeSprints.trend', 'total')}`,\n },\n {\n label: t('planmagnet.dashboard.metrics.workItems.label', 'Work Items'),\n value: String(data?.planmagnetWorkItems?.totalCount ?? 0),\n trend: t('planmagnet.dashboard.metrics.workItems.trend', 'across all projects'),\n },\n {\n label: t('planmagnet.dashboard.metrics.milestones.label', 'Milestones'),\n value: String(milestones.length),\n trend: `${upcomingMilestones.length} ${t('planmagnet.dashboard.metrics.milestones.trend', 'upcoming')}`,\n },\n ];\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold flex items-center gap-2\">\n <LayoutDashboard className=\"h-6 w-6\" />\n {t('planmagnet.dashboard.title', 'Dashboard')}\n </h1>\n <p className=\"text-sm text-muted-foreground mt-1\">\n {t('planmagnet.dashboard.subtitle', 'Welcome back! Here is your project overview.')}\n </p>\n </div>\n </div>\n\n {/* KPI Metrics */}\n <div className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-4\">\n {metrics.map((m) => (\n <Card key={m.label}>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">{m.label}</CardTitle>\n <TrendingUp className=\"h-4 w-4 text-muted-foreground\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">{m.value}</div>\n <p className=\"text-xs text-muted-foreground\">{m.trend}</p>\n </CardContent>\n </Card>\n ))}\n </div>\n\n <div className=\"grid gap-6 lg:grid-cols-12\">\n {/* Active Sprints */}\n <Card className=\"lg:col-span-8\">\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <Zap className=\"h-5 w-5 text-blue-500\" />\n {t('planmagnet.dashboard.activeSprints.title', 'Active Sprints')}\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {activeSprints.map(\n (sprint: {\n id: string;\n name: string;\n projectId: string;\n capacity: number | null;\n velocity: number | null;\n startDate: string | null;\n endDate: string | null;\n workItems: { id: string; status: string; storyPoints: number | null }[];\n }) => {\n const totalPoints = sprint.workItems.reduce(\n (sum: number, wi: { storyPoints: number | null }) => sum + (wi.storyPoints ?? 0),\n 0\n );\n const completedPoints = sprint.workItems\n .filter((wi: { status: string }) => wi.status === 'DONE')\n .reduce(\n (sum: number, wi: { storyPoints: number | null }) =>\n sum + (wi.storyPoints ?? 0),\n 0\n );\n const totalTasks = sprint.workItems.length;\n const completedTasks = sprint.workItems.filter(\n (wi: { status: string }) => wi.status === 'DONE'\n ).length;\n const pct = totalPoints > 0 ? Math.round((completedPoints / totalPoints) * 100) : 0;\n return (\n <div key={sprint.id} className=\"rounded-lg border p-4\">\n <div className=\"flex items-center justify-between mb-2\">\n <div>\n <p className=\"font-medium\">{sprint.name}</p>\n <p className=\"text-xs text-muted-foreground\">\n {t('planmagnet.dashboard.shared.project', 'Project')}: {sprint.projectId}\n </p>\n </div>\n <Badge variant=\"secondary\">\n {completedPoints}/{totalPoints}{' '}\n {t('planmagnet.dashboard.shared.pointsShort', 'pts')}\n </Badge>\n </div>\n <div className=\"w-full h-2 bg-muted rounded-full overflow-hidden\">\n <div\n className=\"h-full bg-primary rounded-full transition-all\"\n style={{ width: `${pct}%` }}\n />\n </div>\n <div className=\"flex items-center justify-between mt-2 text-xs text-muted-foreground\">\n <span>\n {completedTasks}/{totalTasks}{' '}\n {t('planmagnet.dashboard.shared.tasks', 'tasks')}\n </span>\n <span>\n {sprint.startDate ? new Date(sprint.startDate).toLocaleDateString() : '—'} -{' '}\n {sprint.endDate ? new Date(sprint.endDate).toLocaleDateString() : '—'}\n </span>\n </div>\n </div>\n );\n }\n )}\n {activeSprints.length === 0 && (\n <p className=\"text-sm text-muted-foreground text-center py-4\">\n {t('planmagnet.dashboard.activeSprints.empty', 'No active sprints.')}\n </p>\n )}\n </CardContent>\n </Card>\n\n {/* Sidebar */}\n <div className=\"lg:col-span-4 space-y-6\">\n {/* On-Hold Projects */}\n {projects.filter((p: { status: string }) => p.status === 'ON_HOLD').length > 0 && (\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <AlertTriangle className=\"h-5 w-5 text-orange-500\" />\n {t('planmagnet.dashboard.onHoldProjects.title', 'On-Hold Projects')}\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {projects\n .filter((p: { status: string }) => p.status === 'ON_HOLD')\n .map((p: { id: string; name: string; status: string }) => (\n <div\n key={p.id}\n className=\"flex items-center justify-between rounded border p-2\"\n >\n <div>\n <p className=\"text-sm font-medium\">{p.name}</p>\n </div>\n <Badge variant=\"destructive\">\n {p.status.toLowerCase().replace('_', ' ')}\n </Badge>\n </div>\n ))}\n </CardContent>\n </Card>\n )}\n\n {/* Upcoming Milestones */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <Calendar className=\"h-5 w-5 text-green-500\" />\n {t('planmagnet.dashboard.upcomingMilestones.title', 'Upcoming Milestones')}\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {upcomingMilestones.map(\n (ms: {\n id: string;\n name: string;\n projectId: string;\n dueDate: string | null;\n status: string;\n }) => (\n <div key={ms.id} className=\"flex items-start gap-3 rounded border p-2\">\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium truncate\">{ms.name}</p>\n <p className=\"text-xs text-muted-foreground\">\n {t('planmagnet.dashboard.shared.project', 'Project')}: {ms.projectId}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n {t('planmagnet.dashboard.shared.due', 'Due')}{' '}\n {ms.dueDate ? new Date(ms.dueDate).toLocaleDateString() : '—'}\n </p>\n </div>\n <Badge variant=\"secondary\" className=\"text-xs flex-shrink-0 capitalize\">\n {ms.status.toLowerCase().replace('_', ' ')}\n </Badge>\n </div>\n )\n )}\n {upcomingMilestones.length === 0 && (\n <p className=\"text-sm text-muted-foreground text-center py-2\">\n {t('planmagnet.dashboard.upcomingMilestones.empty', 'No upcoming milestones.')}\n </p>\n )}\n </CardContent>\n </Card>\n </div>\n </div>\n\n {/* Recent Work Items & Project Status */}\n <div className=\"grid gap-6 lg:grid-cols-2\">\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <CheckSquare className=\"h-5 w-5 text-purple-500\" />\n {t('planmagnet.dashboard.recentWorkItems.title', 'Recent Work Items')}\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {recentWorkItems.map(\n (item: {\n id: string;\n key: string;\n description: string | null;\n status: string;\n storyPoints: number | null;\n assigneeId: string | null;\n projectId: string;\n }) => (\n <div key={item.id} className=\"flex items-center justify-between rounded border p-2\">\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium truncate\">{item.key}</p>\n <p className=\"text-xs text-muted-foreground\">\n {item.projectId} {item.assigneeId ? `\\u00b7 ${item.assigneeId}` : ''}\n </p>\n </div>\n <div className=\"flex items-center gap-2 flex-shrink-0\">\n <Badge variant=\"outline\" className=\"text-xs\">\n {item.storyPoints ?? 0} {t('planmagnet.dashboard.shared.pointsShort', 'pts')}\n </Badge>\n <Badge variant=\"secondary\" className=\"text-xs capitalize\">\n {item.status.toLowerCase().replace('_', ' ')}\n </Badge>\n </div>\n </div>\n )\n )}\n {recentWorkItems.length === 0 && (\n <p className=\"text-sm text-muted-foreground text-center py-4\">\n {t('planmagnet.dashboard.recentWorkItems.empty', 'No work items yet.')}\n </p>\n )}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <FolderKanban className=\"h-5 w-5 text-cyan-500\" />\n {t('planmagnet.dashboard.projectStatus.title', 'Project Status')}\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {activeProjects.map(\n (p: { id: string; name: string; status: string; ownerId: string }) => (\n <div key={p.id} className=\"flex items-center justify-between rounded border p-2\">\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium truncate\">{p.name}</p>\n <p className=\"text-xs text-muted-foreground capitalize\">\n {p.status.toLowerCase().replace('_', ' ')}\n </p>\n </div>\n <div className=\"flex items-center gap-2 ml-3 flex-shrink-0\">\n <Users className=\"h-3 w-3 text-muted-foreground\" />\n <span className=\"text-xs text-muted-foreground\">{p.ownerId}</span>\n <ArrowUpRight className=\"h-3 w-3 text-muted-foreground\" />\n </div>\n </div>\n )\n )}\n {activeProjects.length === 0 && (\n <p className=\"text-sm text-muted-foreground text-center py-4\">\n {t('planmagnet.dashboard.projectStatus.empty', 'No active projects.')}\n </p>\n )}\n </CardContent>\n </Card>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MeetingsScheduleMeetingPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/MeetingsScheduleMeetingPagePage.tsx"],"names":[],"mappings":"AAiEA,wBAAgB,+BAA+B,4CAwN9C"}
|