@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.
Files changed (75) hide show
  1. package/dist/planmagnet/PlanMagnetRoot.d.ts.map +1 -1
  2. package/dist/planmagnet/PlanMagnetRoot.js +93 -142
  3. package/dist/planmagnet/PlanMagnetRoot.js.map +1 -1
  4. package/dist/planmagnet/admin/PlanMagnetAdminRoot.d.ts.map +1 -1
  5. package/dist/planmagnet/admin/PlanMagnetAdminRoot.js +150 -149
  6. package/dist/planmagnet/admin/PlanMagnetAdminRoot.js.map +1 -1
  7. package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.d.ts.map +1 -1
  8. package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.js +180 -172
  9. package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.js.map +1 -1
  10. package/dist/planmagnet/pages/DashboardDashboardPagePage.d.ts.map +1 -1
  11. package/dist/planmagnet/pages/DashboardDashboardPagePage.js +113 -116
  12. package/dist/planmagnet/pages/DashboardDashboardPagePage.js.map +1 -1
  13. package/dist/planmagnet/pages/GoalsGoalsPagePage.d.ts.map +1 -1
  14. package/dist/planmagnet/pages/GoalsGoalsPagePage.js +59 -58
  15. package/dist/planmagnet/pages/GoalsGoalsPagePage.js.map +1 -1
  16. package/dist/planmagnet/pages/GoalsObjectiveDetailPagePage.d.ts.map +1 -1
  17. package/dist/planmagnet/pages/GoalsObjectiveDetailPagePage.js +150 -149
  18. package/dist/planmagnet/pages/GoalsObjectiveDetailPagePage.js.map +1 -1
  19. package/dist/planmagnet/pages/ProductsEditProductPagePage.d.ts.map +1 -1
  20. package/dist/planmagnet/pages/ProductsEditProductPagePage.js +108 -107
  21. package/dist/planmagnet/pages/ProductsEditProductPagePage.js.map +1 -1
  22. package/dist/planmagnet/pages/ProductsProductDetailPagePage.d.ts.map +1 -1
  23. package/dist/planmagnet/pages/ProductsProductDetailPagePage.js +93 -92
  24. package/dist/planmagnet/pages/ProductsProductDetailPagePage.js.map +1 -1
  25. package/dist/planmagnet/pages/ProductsProductsPagePage.d.ts.map +1 -1
  26. package/dist/planmagnet/pages/ProductsProductsPagePage.js +89 -87
  27. package/dist/planmagnet/pages/ProductsProductsPagePage.js.map +1 -1
  28. package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.d.ts.map +1 -1
  29. package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.js +94 -93
  30. package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.js.map +1 -1
  31. package/dist/planmagnet/pages/ProductsReleasesPagePage.d.ts.map +1 -1
  32. package/dist/planmagnet/pages/ProductsReleasesPagePage.js +57 -56
  33. package/dist/planmagnet/pages/ProductsReleasesPagePage.js.map +1 -1
  34. package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.d.ts.map +1 -1
  35. package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.js +82 -81
  36. package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.js.map +1 -1
  37. package/dist/planmagnet/pages/ProductsRoadmapsPagePage.d.ts.map +1 -1
  38. package/dist/planmagnet/pages/ProductsRoadmapsPagePage.js +72 -71
  39. package/dist/planmagnet/pages/ProductsRoadmapsPagePage.js.map +1 -1
  40. package/dist/planmagnet/pages/ProjectsActiveProjectsPagePage.d.ts.map +1 -1
  41. package/dist/planmagnet/pages/ProjectsActiveProjectsPagePage.js +38 -37
  42. package/dist/planmagnet/pages/ProjectsActiveProjectsPagePage.js.map +1 -1
  43. package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.d.ts.map +1 -1
  44. package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.js +72 -71
  45. package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.js.map +1 -1
  46. package/dist/planmagnet/pages/ProjectsMilestonesPagePage.d.ts.map +1 -1
  47. package/dist/planmagnet/pages/ProjectsMilestonesPagePage.js +47 -46
  48. package/dist/planmagnet/pages/ProjectsMilestonesPagePage.js.map +1 -1
  49. package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.d.ts.map +1 -1
  50. package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.js +120 -119
  51. package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.js.map +1 -1
  52. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.d.ts.map +1 -1
  53. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js +131 -130
  54. package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js.map +1 -1
  55. package/dist/planmagnet/pages/ProjectsProjectsPagePage.d.ts.map +1 -1
  56. package/dist/planmagnet/pages/ProjectsProjectsPagePage.js +77 -75
  57. package/dist/planmagnet/pages/ProjectsProjectsPagePage.js.map +1 -1
  58. package/dist/planmagnet/pages/ReportsReportsPagePage.d.ts.map +1 -1
  59. package/dist/planmagnet/pages/ReportsReportsPagePage.js +71 -70
  60. package/dist/planmagnet/pages/ReportsReportsPagePage.js.map +1 -1
  61. package/dist/planmagnet/pages/TeamTeamPagePage.d.ts.map +1 -1
  62. package/dist/planmagnet/pages/TeamTeamPagePage.js +58 -57
  63. package/dist/planmagnet/pages/TeamTeamPagePage.js.map +1 -1
  64. package/dist/planmagnet/pages/WorkspaceCreateWorkspacePagePage.d.ts.map +1 -1
  65. package/dist/planmagnet/pages/WorkspaceCreateWorkspacePagePage.js +81 -72
  66. package/dist/planmagnet/pages/WorkspaceCreateWorkspacePagePage.js.map +1 -1
  67. package/dist/planmagnet/pages/analytics/DeliveryHealthCards.d.ts +15 -0
  68. package/dist/planmagnet/pages/analytics/DeliveryHealthCards.d.ts.map +1 -0
  69. package/dist/planmagnet/pages/analytics/DeliveryHealthCards.js +302 -0
  70. package/dist/planmagnet/pages/analytics/DeliveryHealthCards.js.map +1 -0
  71. package/dist/planmagnet/people/People.d.ts +20 -0
  72. package/dist/planmagnet/people/People.d.ts.map +1 -0
  73. package/dist/planmagnet/people/People.js +42 -0
  74. package/dist/planmagnet/people/People.js.map +1 -0
  75. package/package.json +1 -1
@@ -1,13 +1,14 @@
1
1
  import { usePlanMagnet as e, usePlanMagnetNavigate as t } from "../providers/PlanMagnetProvider.js";
2
- import { detailPath as n, rowLinkProps as r } from "../utils/rowNavigation.js";
3
- import { CheckSquare as i, FolderKanban as a, Plus as o, TrendingUp as s, Users as c } from "lucide-react";
4
- import { gql as l } from "@apollo/client";
5
- import { useQuery as u } from "@apollo/client/react";
6
- import { jsx as d, jsxs as f } from "react/jsx-runtime";
7
- import { useI18n as p } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
8
- import { Badge as m, Button as h, Card as g, CardContent as _, CardHeader as v, CardTitle as y } from "@burdenoff/fe-libs/ui";
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 b = l`
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
- `, x = {
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
- }, S = (e) => e === "ACTIVE" ? "default" : "secondary";
37
- function C() {
38
- let l = t(), { workspaceId: C } = e(), { t: w } = p(), { data: T, loading: E, error: D } = u(b, { variables: { workspaceId: C ?? "default" } });
39
- if (E) return /* @__PURE__ */ d("div", {
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__ */ d("div", { className: "animate-spin h-8 w-8 border-2 border-primary border-t-transparent rounded-full" })
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 (D) return /* @__PURE__ */ f("div", {
44
+ if (O) return /* @__PURE__ */ p("div", {
44
45
  className: "p-6 text-red-500",
45
46
  children: [
46
- w("planmagnet.projects.errorLoading", "Error loading projects"),
47
+ T("planmagnet.projects.errorLoading", "Error loading projects"),
47
48
  ": ",
48
- D.message
49
+ O.message
49
50
  ]
50
51
  });
51
- let O = T?.planmagnetProjects?.items ?? [], k = {
52
- total: O.length,
53
- active: O.filter((e) => e.status === "ACTIVE").length,
54
- completed: O.filter((e) => e.status === "COMPLETED").length,
55
- onHold: O.filter((e) => e.status === "ON_HOLD").length
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__ */ f("div", {
58
+ return /* @__PURE__ */ p("div", {
58
59
  className: "space-y-6 p-6",
59
60
  children: [
60
- /* @__PURE__ */ f("div", {
61
+ /* @__PURE__ */ p("div", {
61
62
  className: "flex items-center justify-between",
62
- children: [/* @__PURE__ */ f("div", { children: [/* @__PURE__ */ d("h1", {
63
+ children: [/* @__PURE__ */ p("div", { children: [/* @__PURE__ */ f("h1", {
63
64
  className: "text-2xl font-semibold",
64
- children: w("planmagnet.projects.title", "All Projects")
65
- }), /* @__PURE__ */ d("p", {
65
+ children: T("planmagnet.projects.title", "All Projects")
66
+ }), /* @__PURE__ */ f("p", {
66
67
  className: "text-sm text-muted-foreground",
67
- children: w("planmagnet.projects.subtitle", "Manage and track all projects across teams")
68
- })] }), /* @__PURE__ */ f(h, {
68
+ children: T("planmagnet.projects.subtitle", "Manage and track all projects across teams")
69
+ })] }), /* @__PURE__ */ p(g, {
69
70
  size: "sm",
70
- onClick: () => l("/projects/create-project-page"),
71
- children: [/* @__PURE__ */ d(o, { className: "mr-1 h-4 w-4" }), w("planmagnet.projects.actions.newProject", "New Project")]
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__ */ d("div", {
75
+ /* @__PURE__ */ f("div", {
75
76
  className: "grid grid-cols-2 md:grid-cols-4 gap-4",
76
77
  children: [
77
78
  {
78
- label: w("planmagnet.projects.metrics.totalProjects", "Total Projects"),
79
- value: k.total,
80
- icon: a
79
+ label: T("planmagnet.projects.metrics.totalProjects", "Total Projects"),
80
+ value: A.total,
81
+ icon: o
81
82
  },
82
83
  {
83
- label: w("planmagnet.projects.metrics.active", "Active"),
84
- value: k.active,
85
- icon: s
84
+ label: T("planmagnet.projects.metrics.active", "Active"),
85
+ value: A.active,
86
+ icon: c
86
87
  },
87
88
  {
88
- label: w("planmagnet.projects.metrics.completed", "Completed"),
89
- value: k.completed,
90
- icon: i
89
+ label: T("planmagnet.projects.metrics.completed", "Completed"),
90
+ value: A.completed,
91
+ icon: a
91
92
  },
92
93
  {
93
- label: w("planmagnet.projects.metrics.onHold", "On Hold"),
94
- value: k.onHold,
95
- icon: s
94
+ label: T("planmagnet.projects.metrics.onHold", "On Hold"),
95
+ value: A.onHold,
96
+ icon: c
96
97
  }
97
- ].map((e) => /* @__PURE__ */ d(g, { children: /* @__PURE__ */ f(_, {
98
+ ].map((e) => /* @__PURE__ */ f(_, { children: /* @__PURE__ */ p(v, {
98
99
  className: "pt-4",
99
- children: [/* @__PURE__ */ f("div", {
100
+ children: [/* @__PURE__ */ p("div", {
100
101
  className: "flex items-center gap-2 text-muted-foreground text-sm",
101
- children: [/* @__PURE__ */ d(e.icon, { className: "h-4 w-4" }), e.label]
102
- }), /* @__PURE__ */ d("p", {
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__ */ d("div", {
109
+ /* @__PURE__ */ f("div", {
109
110
  className: "grid grid-cols-1 md:grid-cols-2 gap-4",
110
- children: O.map((e) => /* @__PURE__ */ f(g, {
111
- ...r(() => l(n("/projects/project-detail-page", e.id)), e.name),
112
- children: [/* @__PURE__ */ d(v, {
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__ */ f("div", {
115
+ children: /* @__PURE__ */ p("div", {
115
116
  className: "flex items-center justify-between",
116
- children: [/* @__PURE__ */ d(y, {
117
+ children: [/* @__PURE__ */ f(b, {
117
118
  className: "text-base",
118
119
  children: e.name
119
- }), /* @__PURE__ */ d("span", {
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__ */ f(_, {
125
+ }), /* @__PURE__ */ p(v, {
125
126
  className: "space-y-3",
126
127
  children: [
127
- /* @__PURE__ */ d("p", {
128
+ /* @__PURE__ */ f("p", {
128
129
  className: "text-sm text-muted-foreground",
129
- children: e.description ?? w("planmagnet.projects.shared.noDescription", "No description")
130
+ children: e.description ?? T("planmagnet.projects.shared.noDescription", "No description")
130
131
  }),
131
- /* @__PURE__ */ f("div", {
132
+ /* @__PURE__ */ p("div", {
132
133
  className: "flex gap-2",
133
- children: [/* @__PURE__ */ d(m, {
134
- variant: S(e.status),
134
+ children: [/* @__PURE__ */ f(h, {
135
+ variant: C(e.status),
135
136
  className: "capitalize",
136
137
  children: e.status.toLowerCase().replace("_", " ")
137
- }), /* @__PURE__ */ d("span", {
138
- className: `text-xs px-2 py-0.5 rounded-full capitalize ${x[e.methodology] ?? "bg-gray-100"}`,
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__ */ d("div", {
143
+ e.tags.length > 0 && /* @__PURE__ */ f("div", {
143
144
  className: "flex gap-1 flex-wrap",
144
- children: e.tags.map((e) => /* @__PURE__ */ d(m, {
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__ */ f("div", {
151
+ /* @__PURE__ */ p("div", {
151
152
  className: "flex justify-between text-xs text-muted-foreground border-t pt-2",
152
- children: [/* @__PURE__ */ f("span", {
153
+ children: [/* @__PURE__ */ p("span", {
153
154
  className: "flex items-center gap-1",
154
155
  children: [
155
- /* @__PURE__ */ d(c, { className: "h-3 w-3" }),
156
- w("planmagnet.projects.shared.owner", "Owner"),
157
- ": ",
158
- e.ownerId
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__ */ f("span", { children: [
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
- O.length === 0 && /* @__PURE__ */ d("p", {
173
+ k.length === 0 && /* @__PURE__ */ f("p", {
172
174
  className: "text-center text-muted-foreground py-8",
173
- children: w("planmagnet.projects.empty", "No projects found.")
175
+ children: T("planmagnet.projects.empty", "No projects found.")
174
176
  })
175
177
  ]
176
178
  });
177
179
  }
178
180
  //#endregion
179
- export { C as ProjectsProjectsPagePage };
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":"AA6FA,wBAAgB,sBAAsB,4CAsKrC"}
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 { useState as n } from "react";
3
- import { BarChart3 as r, Calendar as i, Clock as a, Plus as o } from "lucide-react";
4
- import { gql as s } from "@apollo/client";
5
- import { useQuery as c } from "@apollo/client/react";
6
- import { jsx as l, jsxs as u } from "react/jsx-runtime";
7
- import { Button as d, Card as f, CardContent as p, CardHeader as m, CardTitle as h } from "@burdenoff/fe-libs/ui";
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 g = s`
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 v() {
59
- let { workspaceId: s, currentUser: v } = e(), y = t(), [b, x] = n("all"), { data: S, loading: C, error: w } = c(g, {
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: s,
62
+ workspaceId: c,
62
63
  projectPagination: { first: 100 },
63
64
  sprintPagination: { first: 100 },
64
65
  workItemPagination: { first: 500 }
65
66
  },
66
- skip: !s
67
+ skip: !c
67
68
  });
68
- if (C) return /* @__PURE__ */ l("div", {
69
+ if (w) return /* @__PURE__ */ u("div", {
69
70
  className: "flex items-center justify-center p-12",
70
- children: /* @__PURE__ */ l("div", { className: "animate-spin h-8 w-8 border-2 border-primary border-t-transparent rounded-full" })
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 (w) return /* @__PURE__ */ u("div", {
73
+ if (T) return /* @__PURE__ */ d("div", {
73
74
  className: "p-6 text-red-500",
74
- children: ["Error: ", w.message]
75
+ children: ["Error: ", T.message]
75
76
  });
76
- let T = S?.planmagnetProjects?.items ?? [], E = S?.planmagnetSprints?.items ?? [];
77
- S?.planmagnetWorkItems?.items;
78
- let D = E.filter((e) => e.status === "COMPLETED"), O = E.filter((e) => e.status === "ACTIVE"), k = v?.name ?? v?.firstName ?? "System", A = [
79
- ...D.map((e) => ({
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: k,
85
+ createdBy: A,
85
86
  lastRun: e.endDate ?? "",
86
87
  schedule: null
87
88
  })),
88
- ...O.map((e) => ({
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: k,
94
+ createdBy: A,
94
95
  lastRun: (/* @__PURE__ */ new Date()).toISOString().split("T")[0],
95
96
  schedule: "daily"
96
97
  })),
97
- ...T.filter((e) => e.status === "ACTIVE").map((e) => ({
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: k,
103
+ createdBy: A,
103
104
  lastRun: (/* @__PURE__ */ new Date()).toISOString().split("T")[0],
104
105
  schedule: "weekly"
105
106
  }))
106
- ], j = ["all", ...new Set(A.map((e) => e.type))], M = b === "all" ? A : A.filter((e) => e.type === b), N = A.filter((e) => e.schedule).length, P = (/* @__PURE__ */ new Date()).toISOString().split("T")[0], F = A.filter((e) => e.lastRun === P).length;
107
- return /* @__PURE__ */ u("div", {
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__ */ u("div", {
111
+ /* @__PURE__ */ d("div", {
111
112
  className: "flex items-center justify-between",
112
- children: [/* @__PURE__ */ u("div", { children: [/* @__PURE__ */ l("h1", {
113
+ children: [/* @__PURE__ */ d("div", { children: [/* @__PURE__ */ u("h1", {
113
114
  className: "text-2xl font-semibold",
114
115
  children: "Reports"
115
- }), /* @__PURE__ */ u("p", {
116
+ }), /* @__PURE__ */ d("p", {
116
117
  className: "text-sm text-muted-foreground",
117
- children: [A.length, " reports configured"]
118
- })] }), /* @__PURE__ */ u(d, {
118
+ children: [j.length, " reports configured"]
119
+ })] }), /* @__PURE__ */ d(f, {
119
120
  size: "sm",
120
- onClick: () => y("/reports/create-report-page"),
121
- children: [/* @__PURE__ */ l(o, { className: "mr-1 h-4 w-4" }), "New Report"]
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__ */ u("div", {
125
+ /* @__PURE__ */ d("div", {
125
126
  className: "grid grid-cols-3 gap-4",
126
127
  children: [
127
- /* @__PURE__ */ l(f, { children: /* @__PURE__ */ u(p, {
128
+ /* @__PURE__ */ u(p, { children: /* @__PURE__ */ d(m, {
128
129
  className: "pt-4",
129
- children: [/* @__PURE__ */ l("p", {
130
+ children: [/* @__PURE__ */ u("p", {
130
131
  className: "text-xs text-muted-foreground",
131
132
  children: "Total Reports"
132
- }), /* @__PURE__ */ l("p", {
133
+ }), /* @__PURE__ */ u("p", {
133
134
  className: "text-xl font-bold",
134
- children: A.length
135
+ children: j.length
135
136
  })]
136
137
  }) }),
137
- /* @__PURE__ */ l(f, { children: /* @__PURE__ */ u(p, {
138
+ /* @__PURE__ */ u(p, { children: /* @__PURE__ */ d(m, {
138
139
  className: "pt-4",
139
- children: [/* @__PURE__ */ l("p", {
140
+ children: [/* @__PURE__ */ u("p", {
140
141
  className: "text-xs text-muted-foreground",
141
142
  children: "Scheduled"
142
- }), /* @__PURE__ */ l("p", {
143
+ }), /* @__PURE__ */ u("p", {
143
144
  className: "text-xl font-bold",
144
- children: N
145
+ children: P
145
146
  })]
146
147
  }) }),
147
- /* @__PURE__ */ l(f, { children: /* @__PURE__ */ u(p, {
148
+ /* @__PURE__ */ u(p, { children: /* @__PURE__ */ d(m, {
148
149
  className: "pt-4",
149
- children: [/* @__PURE__ */ l("p", {
150
+ children: [/* @__PURE__ */ u("p", {
150
151
  className: "text-xs text-muted-foreground",
151
152
  children: "Run Today"
152
- }), /* @__PURE__ */ l("p", {
153
+ }), /* @__PURE__ */ u("p", {
153
154
  className: "text-xl font-bold",
154
- children: F
155
+ children: I
155
156
  })]
156
157
  }) })
157
158
  ]
158
159
  }),
159
- /* @__PURE__ */ l("div", {
160
+ /* @__PURE__ */ u("div", {
160
161
  className: "flex gap-1",
161
- children: j.map((e) => /* @__PURE__ */ l("button", {
162
- onClick: () => x(e),
163
- className: `px-3 py-1.5 text-sm rounded-md capitalize ${b === e ? "bg-primary text-primary-foreground" : "text-muted-foreground hover:bg-muted"}`,
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__ */ u("div", {
168
+ /* @__PURE__ */ d("div", {
168
169
  className: "grid grid-cols-1 md:grid-cols-2 gap-4",
169
- children: [M.map((e) => /* @__PURE__ */ u(f, { children: [/* @__PURE__ */ l(m, {
170
+ children: [N.map((e) => /* @__PURE__ */ d(p, { children: [/* @__PURE__ */ u(h, {
170
171
  className: "pb-2",
171
- children: /* @__PURE__ */ u("div", {
172
+ children: /* @__PURE__ */ d("div", {
172
173
  className: "flex items-center justify-between",
173
- children: [/* @__PURE__ */ u(h, {
174
+ children: [/* @__PURE__ */ d(g, {
174
175
  className: "text-base flex items-center gap-2",
175
- children: [/* @__PURE__ */ l(r, { className: "h-4 w-4 text-primary" }), e.name]
176
- }), /* @__PURE__ */ l("span", {
177
- className: `text-xs px-2 py-0.5 rounded-full capitalize ${_[e.type] ?? "bg-gray-100"}`,
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__ */ u(p, {
182
+ }), /* @__PURE__ */ d(m, {
182
183
  className: "space-y-2",
183
- children: [/* @__PURE__ */ l("p", {
184
+ children: [/* @__PURE__ */ u("p", {
184
185
  className: "text-sm text-muted-foreground",
185
186
  children: e.description
186
- }), /* @__PURE__ */ u("div", {
187
+ }), /* @__PURE__ */ d("div", {
187
188
  className: "flex gap-3 text-xs text-muted-foreground",
188
189
  children: [
189
- e.schedule && /* @__PURE__ */ u("span", {
190
+ e.schedule && /* @__PURE__ */ d("span", {
190
191
  className: "flex items-center gap-1",
191
- children: [/* @__PURE__ */ l(a, { className: "h-3 w-3" }), e.schedule]
192
+ children: [/* @__PURE__ */ u(o, { className: "h-3 w-3" }), e.schedule]
192
193
  }),
193
- e.lastRun && /* @__PURE__ */ u("span", {
194
+ e.lastRun && /* @__PURE__ */ d("span", {
194
195
  className: "flex items-center gap-1",
195
196
  children: [
196
- /* @__PURE__ */ l(i, { className: "h-3 w-3" }),
197
+ /* @__PURE__ */ u(a, { className: "h-3 w-3" }),
197
198
  "Last: ",
198
199
  e.lastRun
199
200
  ]
200
201
  }),
201
- /* @__PURE__ */ l("span", {
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)), M.length === 0 && /* @__PURE__ */ u("div", {
208
+ })] }, e.id)), N.length === 0 && /* @__PURE__ */ d("div", {
208
209
  className: "col-span-2 text-center py-12",
209
- children: [/* @__PURE__ */ l(r, { className: "h-12 w-12 text-muted-foreground mx-auto mb-3" }), /* @__PURE__ */ l("p", {
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 { v as ReportsReportsPagePage };
220
+ export { y as ReportsReportsPagePage };
220
221
 
221
222
  //# sourceMappingURL=ReportsReportsPagePage.js.map