@burdenoff/microfe-planmagnet 2026.924.2 → 2026.924.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/planmagnet/PlanMagnetRoot.d.ts.map +1 -1
- package/dist/planmagnet/PlanMagnetRoot.js +93 -142
- package/dist/planmagnet/PlanMagnetRoot.js.map +1 -1
- package/dist/planmagnet/admin/PlanMagnetAdminRoot.d.ts.map +1 -1
- package/dist/planmagnet/admin/PlanMagnetAdminRoot.js +150 -149
- package/dist/planmagnet/admin/PlanMagnetAdminRoot.js.map +1 -1
- package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.js +180 -172
- package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.js.map +1 -1
- package/dist/planmagnet/pages/DashboardDashboardPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/DashboardDashboardPagePage.js +113 -116
- package/dist/planmagnet/pages/DashboardDashboardPagePage.js.map +1 -1
- package/dist/planmagnet/pages/GoalsGoalsPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/GoalsGoalsPagePage.js +59 -58
- package/dist/planmagnet/pages/GoalsGoalsPagePage.js.map +1 -1
- package/dist/planmagnet/pages/GoalsObjectiveDetailPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/GoalsObjectiveDetailPagePage.js +150 -149
- package/dist/planmagnet/pages/GoalsObjectiveDetailPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProductsEditProductPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProductsEditProductPagePage.js +108 -107
- package/dist/planmagnet/pages/ProductsEditProductPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProductsProductDetailPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProductsProductDetailPagePage.js +93 -92
- package/dist/planmagnet/pages/ProductsProductDetailPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProductsProductsPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProductsProductsPagePage.js +89 -87
- package/dist/planmagnet/pages/ProductsProductsPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.js +94 -93
- package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProductsReleasesPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProductsReleasesPagePage.js +57 -56
- package/dist/planmagnet/pages/ProductsReleasesPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.js +82 -81
- package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProductsRoadmapsPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProductsRoadmapsPagePage.js +72 -71
- package/dist/planmagnet/pages/ProductsRoadmapsPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProjectsActiveProjectsPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProjectsActiveProjectsPagePage.js +38 -37
- package/dist/planmagnet/pages/ProjectsActiveProjectsPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.js +72 -71
- package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProjectsMilestonesPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProjectsMilestonesPagePage.js +47 -46
- package/dist/planmagnet/pages/ProjectsMilestonesPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.js +120 -119
- package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js +131 -130
- package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProjectsProjectsPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProjectsProjectsPagePage.js +77 -75
- package/dist/planmagnet/pages/ProjectsProjectsPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ReportsReportsPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ReportsReportsPagePage.js +71 -70
- package/dist/planmagnet/pages/ReportsReportsPagePage.js.map +1 -1
- package/dist/planmagnet/pages/TeamTeamPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/TeamTeamPagePage.js +58 -57
- package/dist/planmagnet/pages/TeamTeamPagePage.js.map +1 -1
- package/dist/planmagnet/pages/WorkspaceCreateWorkspacePagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/WorkspaceCreateWorkspacePagePage.js +81 -72
- package/dist/planmagnet/pages/WorkspaceCreateWorkspacePagePage.js.map +1 -1
- package/dist/planmagnet/pages/analytics/DeliveryHealthCards.d.ts +15 -0
- package/dist/planmagnet/pages/analytics/DeliveryHealthCards.d.ts.map +1 -0
- package/dist/planmagnet/pages/analytics/DeliveryHealthCards.js +302 -0
- package/dist/planmagnet/pages/analytics/DeliveryHealthCards.js.map +1 -0
- package/dist/planmagnet/people/People.d.ts +20 -0
- package/dist/planmagnet/people/People.d.ts.map +1 -0
- package/dist/planmagnet/people/People.js +42 -0
- package/dist/planmagnet/people/People.js.map +1 -0
- package/package.json +1 -1
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import { usePlanMagnet as e, usePlanMagnetNavigate as t } from "../providers/PlanMagnetProvider.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
2
|
+
import { PersonName as n } from "../people/People.js";
|
|
3
|
+
import { detailPath as r, rowLinkProps as i } from "../utils/rowNavigation.js";
|
|
4
|
+
import { CheckSquare as a, FolderKanban as o, Plus as s, TrendingUp as c, Users as l } from "lucide-react";
|
|
5
|
+
import { gql as u } from "@apollo/client";
|
|
6
|
+
import { useQuery as d } from "@apollo/client/react";
|
|
7
|
+
import { jsx as f, jsxs as p } from "react/jsx-runtime";
|
|
8
|
+
import { useI18n as m } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
9
|
+
import { Badge as h, Button as g, Card as _, CardContent as v, CardHeader as y, CardTitle as b } from "@burdenoff/fe-libs/ui";
|
|
9
10
|
//#region src/planmagnet/pages/ProjectsProjectsPagePage.tsx
|
|
10
|
-
var
|
|
11
|
+
var x = u`
|
|
11
12
|
query GetProjects($workspaceId: ID!) {
|
|
12
13
|
planmagnetProjects(workspaceId: $workspaceId, pagination: { first: 100 }) {
|
|
13
14
|
items {
|
|
@@ -26,138 +27,139 @@ var b = l`
|
|
|
26
27
|
totalCount
|
|
27
28
|
}
|
|
28
29
|
}
|
|
29
|
-
`,
|
|
30
|
+
`, S = {
|
|
30
31
|
SCRUM: "bg-blue-100 text-blue-800",
|
|
31
32
|
KANBAN: "bg-purple-100 text-purple-800",
|
|
32
33
|
WATERFALL: "bg-gray-100 text-gray-800",
|
|
33
34
|
HYBRID: "bg-teal-100 text-teal-800",
|
|
34
35
|
AGILE: "bg-indigo-100 text-indigo-800",
|
|
35
36
|
CUSTOM: "bg-amber-100 text-amber-800"
|
|
36
|
-
},
|
|
37
|
-
function
|
|
38
|
-
let
|
|
39
|
-
if (
|
|
37
|
+
}, C = (e) => e === "ACTIVE" ? "default" : "secondary";
|
|
38
|
+
function w() {
|
|
39
|
+
let u = t(), { workspaceId: w } = e(), { t: T } = m(), { data: E, loading: D, error: O } = d(x, { variables: { workspaceId: w ?? "default" } });
|
|
40
|
+
if (D) return /* @__PURE__ */ f("div", {
|
|
40
41
|
className: "flex items-center justify-center p-12",
|
|
41
|
-
children: /* @__PURE__ */
|
|
42
|
+
children: /* @__PURE__ */ f("div", { className: "animate-spin h-8 w-8 border-2 border-primary border-t-transparent rounded-full" })
|
|
42
43
|
});
|
|
43
|
-
if (
|
|
44
|
+
if (O) return /* @__PURE__ */ p("div", {
|
|
44
45
|
className: "p-6 text-red-500",
|
|
45
46
|
children: [
|
|
46
|
-
|
|
47
|
+
T("planmagnet.projects.errorLoading", "Error loading projects"),
|
|
47
48
|
": ",
|
|
48
|
-
|
|
49
|
+
O.message
|
|
49
50
|
]
|
|
50
51
|
});
|
|
51
|
-
let
|
|
52
|
-
total:
|
|
53
|
-
active:
|
|
54
|
-
completed:
|
|
55
|
-
onHold:
|
|
52
|
+
let k = E?.planmagnetProjects?.items ?? [], A = {
|
|
53
|
+
total: k.length,
|
|
54
|
+
active: k.filter((e) => e.status === "ACTIVE").length,
|
|
55
|
+
completed: k.filter((e) => e.status === "COMPLETED").length,
|
|
56
|
+
onHold: k.filter((e) => e.status === "ON_HOLD").length
|
|
56
57
|
};
|
|
57
|
-
return /* @__PURE__ */
|
|
58
|
+
return /* @__PURE__ */ p("div", {
|
|
58
59
|
className: "space-y-6 p-6",
|
|
59
60
|
children: [
|
|
60
|
-
/* @__PURE__ */
|
|
61
|
+
/* @__PURE__ */ p("div", {
|
|
61
62
|
className: "flex items-center justify-between",
|
|
62
|
-
children: [/* @__PURE__ */
|
|
63
|
+
children: [/* @__PURE__ */ p("div", { children: [/* @__PURE__ */ f("h1", {
|
|
63
64
|
className: "text-2xl font-semibold",
|
|
64
|
-
children:
|
|
65
|
-
}), /* @__PURE__ */
|
|
65
|
+
children: T("planmagnet.projects.title", "All Projects")
|
|
66
|
+
}), /* @__PURE__ */ f("p", {
|
|
66
67
|
className: "text-sm text-muted-foreground",
|
|
67
|
-
children:
|
|
68
|
-
})] }), /* @__PURE__ */
|
|
68
|
+
children: T("planmagnet.projects.subtitle", "Manage and track all projects across teams")
|
|
69
|
+
})] }), /* @__PURE__ */ p(g, {
|
|
69
70
|
size: "sm",
|
|
70
|
-
onClick: () =>
|
|
71
|
-
children: [/* @__PURE__ */
|
|
71
|
+
onClick: () => u("/projects/create-project-page"),
|
|
72
|
+
children: [/* @__PURE__ */ f(s, { className: "mr-1 h-4 w-4" }), T("planmagnet.projects.actions.newProject", "New Project")]
|
|
72
73
|
})]
|
|
73
74
|
}),
|
|
74
|
-
/* @__PURE__ */
|
|
75
|
+
/* @__PURE__ */ f("div", {
|
|
75
76
|
className: "grid grid-cols-2 md:grid-cols-4 gap-4",
|
|
76
77
|
children: [
|
|
77
78
|
{
|
|
78
|
-
label:
|
|
79
|
-
value:
|
|
80
|
-
icon:
|
|
79
|
+
label: T("planmagnet.projects.metrics.totalProjects", "Total Projects"),
|
|
80
|
+
value: A.total,
|
|
81
|
+
icon: o
|
|
81
82
|
},
|
|
82
83
|
{
|
|
83
|
-
label:
|
|
84
|
-
value:
|
|
85
|
-
icon:
|
|
84
|
+
label: T("planmagnet.projects.metrics.active", "Active"),
|
|
85
|
+
value: A.active,
|
|
86
|
+
icon: c
|
|
86
87
|
},
|
|
87
88
|
{
|
|
88
|
-
label:
|
|
89
|
-
value:
|
|
90
|
-
icon:
|
|
89
|
+
label: T("planmagnet.projects.metrics.completed", "Completed"),
|
|
90
|
+
value: A.completed,
|
|
91
|
+
icon: a
|
|
91
92
|
},
|
|
92
93
|
{
|
|
93
|
-
label:
|
|
94
|
-
value:
|
|
95
|
-
icon:
|
|
94
|
+
label: T("planmagnet.projects.metrics.onHold", "On Hold"),
|
|
95
|
+
value: A.onHold,
|
|
96
|
+
icon: c
|
|
96
97
|
}
|
|
97
|
-
].map((e) => /* @__PURE__ */
|
|
98
|
+
].map((e) => /* @__PURE__ */ f(_, { children: /* @__PURE__ */ p(v, {
|
|
98
99
|
className: "pt-4",
|
|
99
|
-
children: [/* @__PURE__ */
|
|
100
|
+
children: [/* @__PURE__ */ p("div", {
|
|
100
101
|
className: "flex items-center gap-2 text-muted-foreground text-sm",
|
|
101
|
-
children: [/* @__PURE__ */
|
|
102
|
-
}), /* @__PURE__ */
|
|
102
|
+
children: [/* @__PURE__ */ f(e.icon, { className: "h-4 w-4" }), e.label]
|
|
103
|
+
}), /* @__PURE__ */ f("p", {
|
|
103
104
|
className: "text-xl font-semibold mt-1",
|
|
104
105
|
children: e.value
|
|
105
106
|
})]
|
|
106
107
|
}) }, e.label))
|
|
107
108
|
}),
|
|
108
|
-
/* @__PURE__ */
|
|
109
|
+
/* @__PURE__ */ f("div", {
|
|
109
110
|
className: "grid grid-cols-1 md:grid-cols-2 gap-4",
|
|
110
|
-
children:
|
|
111
|
-
...
|
|
112
|
-
children: [/* @__PURE__ */
|
|
111
|
+
children: k.map((e) => /* @__PURE__ */ p(_, {
|
|
112
|
+
...i(() => u(r("/projects/project-detail-page", e.id)), e.name),
|
|
113
|
+
children: [/* @__PURE__ */ f(y, {
|
|
113
114
|
className: "pb-2",
|
|
114
|
-
children: /* @__PURE__ */
|
|
115
|
+
children: /* @__PURE__ */ p("div", {
|
|
115
116
|
className: "flex items-center justify-between",
|
|
116
|
-
children: [/* @__PURE__ */
|
|
117
|
+
children: [/* @__PURE__ */ f(b, {
|
|
117
118
|
className: "text-base",
|
|
118
119
|
children: e.name
|
|
119
|
-
}), /* @__PURE__ */
|
|
120
|
+
}), /* @__PURE__ */ f("span", {
|
|
120
121
|
className: "text-xs text-muted-foreground font-mono",
|
|
121
122
|
children: e.key
|
|
122
123
|
})]
|
|
123
124
|
})
|
|
124
|
-
}), /* @__PURE__ */
|
|
125
|
+
}), /* @__PURE__ */ p(v, {
|
|
125
126
|
className: "space-y-3",
|
|
126
127
|
children: [
|
|
127
|
-
/* @__PURE__ */
|
|
128
|
+
/* @__PURE__ */ f("p", {
|
|
128
129
|
className: "text-sm text-muted-foreground",
|
|
129
|
-
children: e.description ??
|
|
130
|
+
children: e.description ?? T("planmagnet.projects.shared.noDescription", "No description")
|
|
130
131
|
}),
|
|
131
|
-
/* @__PURE__ */
|
|
132
|
+
/* @__PURE__ */ p("div", {
|
|
132
133
|
className: "flex gap-2",
|
|
133
|
-
children: [/* @__PURE__ */
|
|
134
|
-
variant:
|
|
134
|
+
children: [/* @__PURE__ */ f(h, {
|
|
135
|
+
variant: C(e.status),
|
|
135
136
|
className: "capitalize",
|
|
136
137
|
children: e.status.toLowerCase().replace("_", " ")
|
|
137
|
-
}), /* @__PURE__ */
|
|
138
|
-
className: `text-xs px-2 py-0.5 rounded-full capitalize ${
|
|
138
|
+
}), /* @__PURE__ */ f("span", {
|
|
139
|
+
className: `text-xs px-2 py-0.5 rounded-full capitalize ${S[e.methodology] ?? "bg-gray-100"}`,
|
|
139
140
|
children: e.methodology.toLowerCase()
|
|
140
141
|
})]
|
|
141
142
|
}),
|
|
142
|
-
e.tags.length > 0 && /* @__PURE__ */
|
|
143
|
+
e.tags.length > 0 && /* @__PURE__ */ f("div", {
|
|
143
144
|
className: "flex gap-1 flex-wrap",
|
|
144
|
-
children: e.tags.map((e) => /* @__PURE__ */
|
|
145
|
+
children: e.tags.map((e) => /* @__PURE__ */ f(h, {
|
|
145
146
|
variant: "outline",
|
|
146
147
|
className: "text-xs",
|
|
147
148
|
children: e
|
|
148
149
|
}, e))
|
|
149
150
|
}),
|
|
150
|
-
/* @__PURE__ */
|
|
151
|
+
/* @__PURE__ */ p("div", {
|
|
151
152
|
className: "flex justify-between text-xs text-muted-foreground border-t pt-2",
|
|
152
|
-
children: [/* @__PURE__ */
|
|
153
|
+
children: [/* @__PURE__ */ p("span", {
|
|
153
154
|
className: "flex items-center gap-1",
|
|
154
155
|
children: [
|
|
155
|
-
/* @__PURE__ */
|
|
156
|
-
|
|
157
|
-
":
|
|
158
|
-
|
|
156
|
+
/* @__PURE__ */ f(l, { className: "h-3 w-3" }),
|
|
157
|
+
T("planmagnet.projects.shared.owner", "Owner"),
|
|
158
|
+
":",
|
|
159
|
+
" ",
|
|
160
|
+
/* @__PURE__ */ f(n, { id: e.ownerId })
|
|
159
161
|
]
|
|
160
|
-
}), /* @__PURE__ */
|
|
162
|
+
}), /* @__PURE__ */ p("span", { children: [
|
|
161
163
|
e.startDate ? new Date(e.startDate).toLocaleDateString() : "—",
|
|
162
164
|
" -",
|
|
163
165
|
" ",
|
|
@@ -168,14 +170,14 @@ function C() {
|
|
|
168
170
|
})]
|
|
169
171
|
}, e.id))
|
|
170
172
|
}),
|
|
171
|
-
|
|
173
|
+
k.length === 0 && /* @__PURE__ */ f("p", {
|
|
172
174
|
className: "text-center text-muted-foreground py-8",
|
|
173
|
-
children:
|
|
175
|
+
children: T("planmagnet.projects.empty", "No projects found.")
|
|
174
176
|
})
|
|
175
177
|
]
|
|
176
178
|
});
|
|
177
179
|
}
|
|
178
180
|
//#endregion
|
|
179
|
-
export {
|
|
181
|
+
export { w as ProjectsProjectsPagePage };
|
|
180
182
|
|
|
181
183
|
//# sourceMappingURL=ProjectsProjectsPagePage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProjectsProjectsPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/ProjectsProjectsPagePage.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, Button } from '@burdenoff/fe-libs/ui';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { FolderKanban, Plus, Users, CheckSquare, TrendingUp } from 'lucide-react';\nimport { usePlanMagnet, usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\nimport { rowLinkProps, detailPath } from '../utils/rowNavigation';\n\nconst GET_PROJECTS = gql`\n query GetProjects($workspaceId: ID!) {\n planmagnetProjects(workspaceId: $workspaceId, pagination: { first: 100 }) {\n items {\n id\n name\n key\n description\n status\n methodology\n ownerId\n startDate\n endDate\n tags\n createdAt\n }\n totalCount\n }\n }\n`;\n\nconst methodColor: Record<string, string> = {\n SCRUM: 'bg-blue-100 text-blue-800',\n KANBAN: 'bg-purple-100 text-purple-800',\n WATERFALL: 'bg-gray-100 text-gray-800',\n HYBRID: 'bg-teal-100 text-teal-800',\n AGILE: 'bg-indigo-100 text-indigo-800',\n CUSTOM: 'bg-amber-100 text-amber-800',\n};\n\nconst statusVariant = (status: string) => (status === 'ACTIVE' ? 'default' : 'secondary');\n\nexport function ProjectsProjectsPagePage() {\n const navigate = usePlanMagnetNavigate();\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_PROJECTS, {\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.projects.errorLoading', 'Error loading projects')}: {error.message}\n </div>\n );\n\n const projects = data?.planmagnetProjects?.items ?? [];\n\n const stats = {\n total: projects.length,\n active: projects.filter((p: { status: string }) => p.status === 'ACTIVE').length,\n completed: projects.filter((p: { status: string }) => p.status === 'COMPLETED').length,\n onHold: projects.filter((p: { status: string }) => p.status === 'ON_HOLD').length,\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\">\n {t('planmagnet.projects.title', 'All Projects')}\n </h1>\n <p className=\"text-sm text-muted-foreground\">\n {t('planmagnet.projects.subtitle', 'Manage and track all projects across teams')}\n </p>\n </div>\n <Button size=\"sm\" onClick={() => navigate('/projects/create-project-page')}>\n <Plus className=\"mr-1 h-4 w-4\" />\n {t('planmagnet.projects.actions.newProject', 'New Project')}\n </Button>\n </div>\n\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\n {[\n {\n label: t('planmagnet.projects.metrics.totalProjects', 'Total Projects'),\n value: stats.total,\n icon: FolderKanban,\n },\n {\n label: t('planmagnet.projects.metrics.active', 'Active'),\n value: stats.active,\n icon: TrendingUp,\n },\n {\n label: t('planmagnet.projects.metrics.completed', 'Completed'),\n value: stats.completed,\n icon: CheckSquare,\n },\n {\n label: t('planmagnet.projects.metrics.onHold', 'On Hold'),\n value: stats.onHold,\n icon: TrendingUp,\n },\n ].map((s) => (\n <Card key={s.label}>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-muted-foreground text-sm\">\n <s.icon className=\"h-4 w-4\" />\n {s.label}\n </div>\n <p className=\"text-xl font-semibold mt-1\">{s.value}</p>\n </CardContent>\n </Card>\n ))}\n </div>\n\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n {projects.map(\n (project: {\n id: string;\n name: string;\n key: string;\n description: string | null;\n status: string;\n methodology: string;\n ownerId: string;\n startDate: string | null;\n endDate: string | null;\n tags: string[];\n }) => {\n return (\n <Card\n key={project.id}\n {...rowLinkProps(\n () => navigate(detailPath('/projects/project-detail-page', project.id)),\n project.name\n )}\n >\n <CardHeader className=\"pb-2\">\n <div className=\"flex items-center justify-between\">\n <CardTitle className=\"text-base\">{project.name}</CardTitle>\n <span className=\"text-xs text-muted-foreground font-mono\">{project.key}</span>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <p className=\"text-sm text-muted-foreground\">\n {project.description ??\n t('planmagnet.projects.shared.noDescription', 'No description')}\n </p>\n <div className=\"flex gap-2\">\n <Badge variant={statusVariant(project.status)} className=\"capitalize\">\n {project.status.toLowerCase().replace('_', ' ')}\n </Badge>\n <span\n className={`text-xs px-2 py-0.5 rounded-full capitalize ${methodColor[project.methodology] ?? 'bg-gray-100'}`}\n >\n {project.methodology.toLowerCase()}\n </span>\n </div>\n {project.tags.length > 0 && (\n <div className=\"flex gap-1 flex-wrap\">\n {project.tags.map((tag: string) => (\n <Badge key={tag} variant=\"outline\" className=\"text-xs\">\n {tag}\n </Badge>\n ))}\n </div>\n )}\n <div className=\"flex justify-between text-xs text-muted-foreground border-t pt-2\">\n <span className=\"flex items-center gap-1\">\n <Users className=\"h-3 w-3\" />\n {t('planmagnet.projects.shared.owner', 'Owner')}: {project.ownerId}\n </span>\n <span>\n {project.startDate ? new Date(project.startDate).toLocaleDateString() : '—'} -{' '}\n {project.endDate ? new Date(project.endDate).toLocaleDateString() : '—'}\n </span>\n </div>\n </CardContent>\n </Card>\n );\n }\n )}\n </div>\n {projects.length === 0 && (\n <p className=\"text-center text-muted-foreground py-8\">\n {t('planmagnet.projects.empty', 'No projects found.')}\n </p>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ProjectsProjectsPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/ProjectsProjectsPagePage.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, Button } from '@burdenoff/fe-libs/ui';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { FolderKanban, Plus, Users, CheckSquare, TrendingUp } from 'lucide-react';\nimport { usePlanMagnet, usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\nimport { rowLinkProps, detailPath } from '../utils/rowNavigation';\nimport { PersonName } from '../people/People';\n\nconst GET_PROJECTS = gql`\n query GetProjects($workspaceId: ID!) {\n planmagnetProjects(workspaceId: $workspaceId, pagination: { first: 100 }) {\n items {\n id\n name\n key\n description\n status\n methodology\n ownerId\n startDate\n endDate\n tags\n createdAt\n }\n totalCount\n }\n }\n`;\n\nconst methodColor: Record<string, string> = {\n SCRUM: 'bg-blue-100 text-blue-800',\n KANBAN: 'bg-purple-100 text-purple-800',\n WATERFALL: 'bg-gray-100 text-gray-800',\n HYBRID: 'bg-teal-100 text-teal-800',\n AGILE: 'bg-indigo-100 text-indigo-800',\n CUSTOM: 'bg-amber-100 text-amber-800',\n};\n\nconst statusVariant = (status: string) => (status === 'ACTIVE' ? 'default' : 'secondary');\n\nexport function ProjectsProjectsPagePage() {\n const navigate = usePlanMagnetNavigate();\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_PROJECTS, {\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.projects.errorLoading', 'Error loading projects')}: {error.message}\n </div>\n );\n\n const projects = data?.planmagnetProjects?.items ?? [];\n\n const stats = {\n total: projects.length,\n active: projects.filter((p: { status: string }) => p.status === 'ACTIVE').length,\n completed: projects.filter((p: { status: string }) => p.status === 'COMPLETED').length,\n onHold: projects.filter((p: { status: string }) => p.status === 'ON_HOLD').length,\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\">\n {t('planmagnet.projects.title', 'All Projects')}\n </h1>\n <p className=\"text-sm text-muted-foreground\">\n {t('planmagnet.projects.subtitle', 'Manage and track all projects across teams')}\n </p>\n </div>\n <Button size=\"sm\" onClick={() => navigate('/projects/create-project-page')}>\n <Plus className=\"mr-1 h-4 w-4\" />\n {t('planmagnet.projects.actions.newProject', 'New Project')}\n </Button>\n </div>\n\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\n {[\n {\n label: t('planmagnet.projects.metrics.totalProjects', 'Total Projects'),\n value: stats.total,\n icon: FolderKanban,\n },\n {\n label: t('planmagnet.projects.metrics.active', 'Active'),\n value: stats.active,\n icon: TrendingUp,\n },\n {\n label: t('planmagnet.projects.metrics.completed', 'Completed'),\n value: stats.completed,\n icon: CheckSquare,\n },\n {\n label: t('planmagnet.projects.metrics.onHold', 'On Hold'),\n value: stats.onHold,\n icon: TrendingUp,\n },\n ].map((s) => (\n <Card key={s.label}>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-muted-foreground text-sm\">\n <s.icon className=\"h-4 w-4\" />\n {s.label}\n </div>\n <p className=\"text-xl font-semibold mt-1\">{s.value}</p>\n </CardContent>\n </Card>\n ))}\n </div>\n\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n {projects.map(\n (project: {\n id: string;\n name: string;\n key: string;\n description: string | null;\n status: string;\n methodology: string;\n ownerId: string;\n startDate: string | null;\n endDate: string | null;\n tags: string[];\n }) => {\n return (\n <Card\n key={project.id}\n {...rowLinkProps(\n () => navigate(detailPath('/projects/project-detail-page', project.id)),\n project.name\n )}\n >\n <CardHeader className=\"pb-2\">\n <div className=\"flex items-center justify-between\">\n <CardTitle className=\"text-base\">{project.name}</CardTitle>\n <span className=\"text-xs text-muted-foreground font-mono\">{project.key}</span>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <p className=\"text-sm text-muted-foreground\">\n {project.description ??\n t('planmagnet.projects.shared.noDescription', 'No description')}\n </p>\n <div className=\"flex gap-2\">\n <Badge variant={statusVariant(project.status)} className=\"capitalize\">\n {project.status.toLowerCase().replace('_', ' ')}\n </Badge>\n <span\n className={`text-xs px-2 py-0.5 rounded-full capitalize ${methodColor[project.methodology] ?? 'bg-gray-100'}`}\n >\n {project.methodology.toLowerCase()}\n </span>\n </div>\n {project.tags.length > 0 && (\n <div className=\"flex gap-1 flex-wrap\">\n {project.tags.map((tag: string) => (\n <Badge key={tag} variant=\"outline\" className=\"text-xs\">\n {tag}\n </Badge>\n ))}\n </div>\n )}\n <div className=\"flex justify-between text-xs text-muted-foreground border-t pt-2\">\n <span className=\"flex items-center gap-1\">\n <Users className=\"h-3 w-3\" />\n {t('planmagnet.projects.shared.owner', 'Owner')}:{' '}\n <PersonName id={project.ownerId} />\n </span>\n <span>\n {project.startDate ? new Date(project.startDate).toLocaleDateString() : '—'} -{' '}\n {project.endDate ? new Date(project.endDate).toLocaleDateString() : '—'}\n </span>\n </div>\n </CardContent>\n </Card>\n );\n }\n )}\n </div>\n {projects.length === 0 && (\n <p className=\"text-center text-muted-foreground py-8\">\n {t('planmagnet.projects.empty', 'No projects found.')}\n </p>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReportsReportsPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/ReportsReportsPagePage.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ReportsReportsPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/ReportsReportsPagePage.tsx"],"names":[],"mappings":"AA8FA,wBAAgB,sBAAsB,4CAwKrC"}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { usePlanMagnet as e, usePlanMagnetNavigate as t } from "../providers/PlanMagnetProvider.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
2
|
+
import { PersonName as n } from "../people/People.js";
|
|
3
|
+
import { useState as r } from "react";
|
|
4
|
+
import { BarChart3 as i, Calendar as a, Clock as o, Plus as s } from "lucide-react";
|
|
5
|
+
import { gql as c } from "@apollo/client";
|
|
6
|
+
import { useQuery as l } from "@apollo/client/react";
|
|
7
|
+
import { jsx as u, jsxs as d } from "react/jsx-runtime";
|
|
8
|
+
import { Button as f, Card as p, CardContent as m, CardHeader as h, CardTitle as g } from "@burdenoff/fe-libs/ui";
|
|
8
9
|
//#region src/planmagnet/pages/ReportsReportsPagePage.tsx
|
|
9
|
-
var
|
|
10
|
+
var _ = c`
|
|
10
11
|
query GetReportsData(
|
|
11
12
|
$workspaceId: ID!
|
|
12
13
|
$projectPagination: PlanmagnetPaginationInput
|
|
@@ -46,7 +47,7 @@ var g = s`
|
|
|
46
47
|
totalCount
|
|
47
48
|
}
|
|
48
49
|
}
|
|
49
|
-
`,
|
|
50
|
+
`, v = {
|
|
50
51
|
velocity: "bg-blue-100 text-blue-800",
|
|
51
52
|
burndown: "bg-orange-100 text-orange-800",
|
|
52
53
|
burnup: "bg-green-100 text-green-800",
|
|
@@ -55,158 +56,158 @@ var g = s`
|
|
|
55
56
|
lead_time: "bg-pink-100 text-pink-800",
|
|
56
57
|
project_status: "bg-gray-100 text-gray-800"
|
|
57
58
|
};
|
|
58
|
-
function
|
|
59
|
-
let { workspaceId:
|
|
59
|
+
function y() {
|
|
60
|
+
let { workspaceId: c, currentUser: y } = e(), b = t(), [x, S] = r("all"), { data: C, loading: w, error: T } = l(_, {
|
|
60
61
|
variables: {
|
|
61
|
-
workspaceId:
|
|
62
|
+
workspaceId: c,
|
|
62
63
|
projectPagination: { first: 100 },
|
|
63
64
|
sprintPagination: { first: 100 },
|
|
64
65
|
workItemPagination: { first: 500 }
|
|
65
66
|
},
|
|
66
|
-
skip: !
|
|
67
|
+
skip: !c
|
|
67
68
|
});
|
|
68
|
-
if (
|
|
69
|
+
if (w) return /* @__PURE__ */ u("div", {
|
|
69
70
|
className: "flex items-center justify-center p-12",
|
|
70
|
-
children: /* @__PURE__ */
|
|
71
|
+
children: /* @__PURE__ */ u("div", { className: "animate-spin h-8 w-8 border-2 border-primary border-t-transparent rounded-full" })
|
|
71
72
|
});
|
|
72
|
-
if (
|
|
73
|
+
if (T) return /* @__PURE__ */ d("div", {
|
|
73
74
|
className: "p-6 text-red-500",
|
|
74
|
-
children: ["Error: ",
|
|
75
|
+
children: ["Error: ", T.message]
|
|
75
76
|
});
|
|
76
|
-
let
|
|
77
|
-
|
|
78
|
-
let
|
|
79
|
-
...
|
|
77
|
+
let E = C?.planmagnetProjects?.items ?? [], D = C?.planmagnetSprints?.items ?? [];
|
|
78
|
+
C?.planmagnetWorkItems?.items;
|
|
79
|
+
let O = D.filter((e) => e.status === "COMPLETED"), k = D.filter((e) => e.status === "ACTIVE"), A = y?.name ?? y?.firstName ?? "System", j = [
|
|
80
|
+
...O.map((e) => ({
|
|
80
81
|
id: `velocity-${e.id}`,
|
|
81
82
|
name: `${e.name} Velocity Report`,
|
|
82
83
|
description: `Velocity analysis for ${e.name} (${e.velocity ?? 0} pts)`,
|
|
83
84
|
type: "velocity",
|
|
84
|
-
createdBy:
|
|
85
|
+
createdBy: A,
|
|
85
86
|
lastRun: e.endDate ?? "",
|
|
86
87
|
schedule: null
|
|
87
88
|
})),
|
|
88
|
-
...
|
|
89
|
+
...k.map((e) => ({
|
|
89
90
|
id: `burndown-${e.id}`,
|
|
90
91
|
name: `${e.name} Burndown`,
|
|
91
92
|
description: `Active burndown tracking for ${e.name}`,
|
|
92
93
|
type: "burndown",
|
|
93
|
-
createdBy:
|
|
94
|
+
createdBy: A,
|
|
94
95
|
lastRun: (/* @__PURE__ */ new Date()).toISOString().split("T")[0],
|
|
95
96
|
schedule: "daily"
|
|
96
97
|
})),
|
|
97
|
-
...
|
|
98
|
+
...E.filter((e) => e.status === "ACTIVE").map((e) => ({
|
|
98
99
|
id: `status-${e.id}`,
|
|
99
100
|
name: `${e.name} Status Report`,
|
|
100
101
|
description: `Project status overview for ${e.key}`,
|
|
101
102
|
type: "project_status",
|
|
102
|
-
createdBy:
|
|
103
|
+
createdBy: A,
|
|
103
104
|
lastRun: (/* @__PURE__ */ new Date()).toISOString().split("T")[0],
|
|
104
105
|
schedule: "weekly"
|
|
105
106
|
}))
|
|
106
|
-
],
|
|
107
|
-
return /* @__PURE__ */
|
|
107
|
+
], M = ["all", ...new Set(j.map((e) => e.type))], N = x === "all" ? j : j.filter((e) => e.type === x), P = j.filter((e) => e.schedule).length, F = (/* @__PURE__ */ new Date()).toISOString().split("T")[0], I = j.filter((e) => e.lastRun === F).length;
|
|
108
|
+
return /* @__PURE__ */ d("div", {
|
|
108
109
|
className: "space-y-6 p-6",
|
|
109
110
|
children: [
|
|
110
|
-
/* @__PURE__ */
|
|
111
|
+
/* @__PURE__ */ d("div", {
|
|
111
112
|
className: "flex items-center justify-between",
|
|
112
|
-
children: [/* @__PURE__ */
|
|
113
|
+
children: [/* @__PURE__ */ d("div", { children: [/* @__PURE__ */ u("h1", {
|
|
113
114
|
className: "text-2xl font-semibold",
|
|
114
115
|
children: "Reports"
|
|
115
|
-
}), /* @__PURE__ */
|
|
116
|
+
}), /* @__PURE__ */ d("p", {
|
|
116
117
|
className: "text-sm text-muted-foreground",
|
|
117
|
-
children: [
|
|
118
|
-
})] }), /* @__PURE__ */
|
|
118
|
+
children: [j.length, " reports configured"]
|
|
119
|
+
})] }), /* @__PURE__ */ d(f, {
|
|
119
120
|
size: "sm",
|
|
120
|
-
onClick: () =>
|
|
121
|
-
children: [/* @__PURE__ */
|
|
121
|
+
onClick: () => b("/reports/create-report-page"),
|
|
122
|
+
children: [/* @__PURE__ */ u(s, { className: "mr-1 h-4 w-4" }), "New Report"]
|
|
122
123
|
})]
|
|
123
124
|
}),
|
|
124
|
-
/* @__PURE__ */
|
|
125
|
+
/* @__PURE__ */ d("div", {
|
|
125
126
|
className: "grid grid-cols-3 gap-4",
|
|
126
127
|
children: [
|
|
127
|
-
/* @__PURE__ */
|
|
128
|
+
/* @__PURE__ */ u(p, { children: /* @__PURE__ */ d(m, {
|
|
128
129
|
className: "pt-4",
|
|
129
|
-
children: [/* @__PURE__ */
|
|
130
|
+
children: [/* @__PURE__ */ u("p", {
|
|
130
131
|
className: "text-xs text-muted-foreground",
|
|
131
132
|
children: "Total Reports"
|
|
132
|
-
}), /* @__PURE__ */
|
|
133
|
+
}), /* @__PURE__ */ u("p", {
|
|
133
134
|
className: "text-xl font-bold",
|
|
134
|
-
children:
|
|
135
|
+
children: j.length
|
|
135
136
|
})]
|
|
136
137
|
}) }),
|
|
137
|
-
/* @__PURE__ */
|
|
138
|
+
/* @__PURE__ */ u(p, { children: /* @__PURE__ */ d(m, {
|
|
138
139
|
className: "pt-4",
|
|
139
|
-
children: [/* @__PURE__ */
|
|
140
|
+
children: [/* @__PURE__ */ u("p", {
|
|
140
141
|
className: "text-xs text-muted-foreground",
|
|
141
142
|
children: "Scheduled"
|
|
142
|
-
}), /* @__PURE__ */
|
|
143
|
+
}), /* @__PURE__ */ u("p", {
|
|
143
144
|
className: "text-xl font-bold",
|
|
144
|
-
children:
|
|
145
|
+
children: P
|
|
145
146
|
})]
|
|
146
147
|
}) }),
|
|
147
|
-
/* @__PURE__ */
|
|
148
|
+
/* @__PURE__ */ u(p, { children: /* @__PURE__ */ d(m, {
|
|
148
149
|
className: "pt-4",
|
|
149
|
-
children: [/* @__PURE__ */
|
|
150
|
+
children: [/* @__PURE__ */ u("p", {
|
|
150
151
|
className: "text-xs text-muted-foreground",
|
|
151
152
|
children: "Run Today"
|
|
152
|
-
}), /* @__PURE__ */
|
|
153
|
+
}), /* @__PURE__ */ u("p", {
|
|
153
154
|
className: "text-xl font-bold",
|
|
154
|
-
children:
|
|
155
|
+
children: I
|
|
155
156
|
})]
|
|
156
157
|
}) })
|
|
157
158
|
]
|
|
158
159
|
}),
|
|
159
|
-
/* @__PURE__ */
|
|
160
|
+
/* @__PURE__ */ u("div", {
|
|
160
161
|
className: "flex gap-1",
|
|
161
|
-
children:
|
|
162
|
-
onClick: () =>
|
|
163
|
-
className: `px-3 py-1.5 text-sm rounded-md capitalize ${
|
|
162
|
+
children: M.map((e) => /* @__PURE__ */ u("button", {
|
|
163
|
+
onClick: () => S(e),
|
|
164
|
+
className: `px-3 py-1.5 text-sm rounded-md capitalize ${x === e ? "bg-primary text-primary-foreground" : "text-muted-foreground hover:bg-muted"}`,
|
|
164
165
|
children: e === "all" ? "All" : e.replace("_", " ")
|
|
165
166
|
}, e))
|
|
166
167
|
}),
|
|
167
|
-
/* @__PURE__ */
|
|
168
|
+
/* @__PURE__ */ d("div", {
|
|
168
169
|
className: "grid grid-cols-1 md:grid-cols-2 gap-4",
|
|
169
|
-
children: [
|
|
170
|
+
children: [N.map((e) => /* @__PURE__ */ d(p, { children: [/* @__PURE__ */ u(h, {
|
|
170
171
|
className: "pb-2",
|
|
171
|
-
children: /* @__PURE__ */
|
|
172
|
+
children: /* @__PURE__ */ d("div", {
|
|
172
173
|
className: "flex items-center justify-between",
|
|
173
|
-
children: [/* @__PURE__ */
|
|
174
|
+
children: [/* @__PURE__ */ d(g, {
|
|
174
175
|
className: "text-base flex items-center gap-2",
|
|
175
|
-
children: [/* @__PURE__ */
|
|
176
|
-
}), /* @__PURE__ */
|
|
177
|
-
className: `text-xs px-2 py-0.5 rounded-full capitalize ${
|
|
176
|
+
children: [/* @__PURE__ */ u(i, { className: "h-4 w-4 text-primary" }), e.name]
|
|
177
|
+
}), /* @__PURE__ */ u("span", {
|
|
178
|
+
className: `text-xs px-2 py-0.5 rounded-full capitalize ${v[e.type] ?? "bg-gray-100"}`,
|
|
178
179
|
children: e.type.replace("_", " ")
|
|
179
180
|
})]
|
|
180
181
|
})
|
|
181
|
-
}), /* @__PURE__ */
|
|
182
|
+
}), /* @__PURE__ */ d(m, {
|
|
182
183
|
className: "space-y-2",
|
|
183
|
-
children: [/* @__PURE__ */
|
|
184
|
+
children: [/* @__PURE__ */ u("p", {
|
|
184
185
|
className: "text-sm text-muted-foreground",
|
|
185
186
|
children: e.description
|
|
186
|
-
}), /* @__PURE__ */
|
|
187
|
+
}), /* @__PURE__ */ d("div", {
|
|
187
188
|
className: "flex gap-3 text-xs text-muted-foreground",
|
|
188
189
|
children: [
|
|
189
|
-
e.schedule && /* @__PURE__ */
|
|
190
|
+
e.schedule && /* @__PURE__ */ d("span", {
|
|
190
191
|
className: "flex items-center gap-1",
|
|
191
|
-
children: [/* @__PURE__ */
|
|
192
|
+
children: [/* @__PURE__ */ u(o, { className: "h-3 w-3" }), e.schedule]
|
|
192
193
|
}),
|
|
193
|
-
e.lastRun && /* @__PURE__ */
|
|
194
|
+
e.lastRun && /* @__PURE__ */ d("span", {
|
|
194
195
|
className: "flex items-center gap-1",
|
|
195
196
|
children: [
|
|
196
|
-
/* @__PURE__ */
|
|
197
|
+
/* @__PURE__ */ u(a, { className: "h-3 w-3" }),
|
|
197
198
|
"Last: ",
|
|
198
199
|
e.lastRun
|
|
199
200
|
]
|
|
200
201
|
}),
|
|
201
|
-
/* @__PURE__ */
|
|
202
|
+
/* @__PURE__ */ u("span", {
|
|
202
203
|
className: "flex items-center gap-1",
|
|
203
|
-
children: e.createdBy
|
|
204
|
+
children: /* @__PURE__ */ u(n, { id: e.createdBy })
|
|
204
205
|
})
|
|
205
206
|
]
|
|
206
207
|
})]
|
|
207
|
-
})] }, e.id)),
|
|
208
|
+
})] }, e.id)), N.length === 0 && /* @__PURE__ */ d("div", {
|
|
208
209
|
className: "col-span-2 text-center py-12",
|
|
209
|
-
children: [/* @__PURE__ */
|
|
210
|
+
children: [/* @__PURE__ */ u(i, { className: "h-12 w-12 text-muted-foreground mx-auto mb-3" }), /* @__PURE__ */ u("p", {
|
|
210
211
|
className: "text-sm text-muted-foreground",
|
|
211
212
|
children: "No reports found for the selected filter."
|
|
212
213
|
})]
|
|
@@ -216,6 +217,6 @@ function v() {
|
|
|
216
217
|
});
|
|
217
218
|
}
|
|
218
219
|
//#endregion
|
|
219
|
-
export {
|
|
220
|
+
export { y as ReportsReportsPagePage };
|
|
220
221
|
|
|
221
222
|
//# sourceMappingURL=ReportsReportsPagePage.js.map
|