@burdenoff/microfe-crewfoundry 2026.704.3 → 2026.704.5

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 (101) hide show
  1. package/dist/crewfoundry/pages/AdminAdminPagePage.js +76 -75
  2. package/dist/crewfoundry/pages/AdminAdminPagePage.js.map +1 -1
  3. package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js +118 -117
  4. package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js.map +1 -1
  5. package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.js +115 -114
  6. package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.js.map +1 -1
  7. package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js +105 -104
  8. package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js.map +1 -1
  9. package/dist/crewfoundry/pages/CommunicationsTeamsPagePage.js +52 -51
  10. package/dist/crewfoundry/pages/CommunicationsTeamsPagePage.js.map +1 -1
  11. package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js +94 -93
  12. package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js.map +1 -1
  13. package/dist/crewfoundry/pages/CompanyCompanyProfilePagePage.js +97 -96
  14. package/dist/crewfoundry/pages/CompanyCompanyProfilePagePage.js.map +1 -1
  15. package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js +68 -67
  16. package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js.map +1 -1
  17. package/dist/crewfoundry/pages/DashboardAnalyticsPagePage.js +96 -95
  18. package/dist/crewfoundry/pages/DashboardAnalyticsPagePage.js.map +1 -1
  19. package/dist/crewfoundry/pages/DashboardDashboardPagePage.js +153 -152
  20. package/dist/crewfoundry/pages/DashboardDashboardPagePage.js.map +1 -1
  21. package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js +111 -110
  22. package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js.map +1 -1
  23. package/dist/crewfoundry/pages/HiringApplicationsPagePage.js +77 -76
  24. package/dist/crewfoundry/pages/HiringApplicationsPagePage.js.map +1 -1
  25. package/dist/crewfoundry/pages/HiringCandidatesPagePage.js +80 -79
  26. package/dist/crewfoundry/pages/HiringCandidatesPagePage.js.map +1 -1
  27. package/dist/crewfoundry/pages/HiringCreateJobPagePage.js +1 -1
  28. package/dist/crewfoundry/pages/HiringCreateJobPagePage.js.map +1 -1
  29. package/dist/crewfoundry/pages/HiringInterviewsPagePage.js +102 -101
  30. package/dist/crewfoundry/pages/HiringInterviewsPagePage.js.map +1 -1
  31. package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js +126 -125
  32. package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js.map +1 -1
  33. package/dist/crewfoundry/pages/HiringJobsPagePage.js +64 -63
  34. package/dist/crewfoundry/pages/HiringJobsPagePage.js.map +1 -1
  35. package/dist/crewfoundry/pages/HrDepartmentsPagePage.js +96 -95
  36. package/dist/crewfoundry/pages/HrDepartmentsPagePage.js.map +1 -1
  37. package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js +129 -127
  38. package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js.map +1 -1
  39. package/dist/crewfoundry/pages/HrPayrollPagePage.js +118 -117
  40. package/dist/crewfoundry/pages/HrPayrollPagePage.js.map +1 -1
  41. package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js +123 -122
  42. package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js.map +1 -1
  43. package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js +1 -1
  44. package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js.map +1 -1
  45. package/dist/crewfoundry/pages/LearningCertificatesPagePage.js +1 -1
  46. package/dist/crewfoundry/pages/LearningCertificatesPagePage.js.map +1 -1
  47. package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js +77 -76
  48. package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js.map +1 -1
  49. package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js +49 -48
  50. package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js.map +1 -1
  51. package/dist/crewfoundry/pages/LearningCoursesPagePage.js +62 -61
  52. package/dist/crewfoundry/pages/LearningCoursesPagePage.js.map +1 -1
  53. package/dist/crewfoundry/pages/LearningLearningPagePage.js +72 -71
  54. package/dist/crewfoundry/pages/LearningLearningPagePage.js.map +1 -1
  55. package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js +70 -69
  56. package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js.map +1 -1
  57. package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js +57 -56
  58. package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js.map +1 -1
  59. package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js +58 -57
  60. package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js.map +1 -1
  61. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js +122 -121
  62. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js.map +1 -1
  63. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js +2 -2
  64. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js.map +1 -1
  65. package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js +70 -69
  66. package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js.map +1 -1
  67. package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js +41 -40
  68. package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js.map +1 -1
  69. package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js +65 -64
  70. package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js.map +1 -1
  71. package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js +75 -74
  72. package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js.map +1 -1
  73. package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js +4 -4
  74. package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js.map +1 -1
  75. package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js +60 -59
  76. package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js.map +1 -1
  77. package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js +53 -52
  78. package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js.map +1 -1
  79. package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js +37 -36
  80. package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js.map +1 -1
  81. package/dist/crewfoundry/pages/ProjectsCreateProjectPagePage.js +1 -1
  82. package/dist/crewfoundry/pages/ProjectsCreateProjectPagePage.js.map +1 -1
  83. package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js +126 -125
  84. package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js.map +1 -1
  85. package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js +62 -61
  86. package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js.map +1 -1
  87. package/dist/crewfoundry/pages/TeamsTeamAnalyticsPagePage.js +50 -49
  88. package/dist/crewfoundry/pages/TeamsTeamAnalyticsPagePage.js.map +1 -1
  89. package/dist/crewfoundry/pages/TeamsTeamDetailPagePage.js +72 -71
  90. package/dist/crewfoundry/pages/TeamsTeamDetailPagePage.js.map +1 -1
  91. package/dist/crewfoundry/pages/TeamsTeamDirectoryPagePage.js +40 -39
  92. package/dist/crewfoundry/pages/TeamsTeamDirectoryPagePage.js.map +1 -1
  93. package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js +134 -133
  94. package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js.map +1 -1
  95. package/dist/crewfoundry/pages/TeamsTeamsPagePage.js +60 -59
  96. package/dist/crewfoundry/pages/TeamsTeamsPagePage.js.map +1 -1
  97. package/dist/crewfoundry/store/crewfoundryStore.js +177 -146
  98. package/dist/crewfoundry/store/crewfoundryStore.js.map +1 -1
  99. package/dist/crewfoundry/utils/formatEnumLabel.js +8 -0
  100. package/dist/crewfoundry/utils/formatEnumLabel.js.map +1 -0
  101. package/package.json +1 -1
@@ -1,128 +1,129 @@
1
1
  import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
2
- import { Plus as t } from "lucide-react";
3
- import { useNavigate as n } from "react-router-dom";
4
- import { jsx as r, jsxs as i } from "react/jsx-runtime";
5
- import { Badge as a, Button as o, CardContent as s, CardDescription as c, CardHeader as l, CardTitle as u, GlassCard as d, GradientText as f, IllustratedEmptyState as p, PagePurpose as m, Pagination as h } from "@burdenoff/fe-libs/ui";
6
- import { usePagination as g } from "@burdenoff/fe-libs/shared/hooks";
7
- import { useI18n as _ } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
2
+ import { formatEnumLabel as t } from "../utils/formatEnumLabel.js";
3
+ import { Plus as n } from "lucide-react";
4
+ import { useNavigate as r } from "react-router-dom";
5
+ import { jsx as i, jsxs as a } from "react/jsx-runtime";
6
+ import { Badge as o, Button as s, CardContent as c, CardDescription as l, CardHeader as u, CardTitle as d, GlassCard as f, GradientText as p, IllustratedEmptyState as m, PagePurpose as h, Pagination as g } from "@burdenoff/fe-libs/ui";
7
+ import { usePagination as _ } from "@burdenoff/fe-libs/shared/hooks";
8
+ import { useI18n as v } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
8
9
  //#region src/crewfoundry/pages/ProjectsProjectsPagePage.tsx
9
- function v() {
10
- let { t: v } = _(), y = n(), { projects: b } = e(), x = b.filter((e) => e.status === "active"), { page: S, pageSize: C, setPage: w } = g({ initialPageSize: 12 }), T = (e, t) => {
11
- let n = v(e);
10
+ function y() {
11
+ let { t: y } = v(), b = r(), { projects: x } = e(), S = x.filter((e) => e.status === "active"), { page: C, pageSize: w, setPage: T } = _({ initialPageSize: 12 }), E = (e, t) => {
12
+ let n = y(e);
12
13
  return n === e ? t : n;
13
- }, E = b.slice((S - 1) * C, (S - 1) * C + C), D = (e) => y(`../../projects/project-details-page?id=${encodeURIComponent(e.id)}`);
14
- return /* @__PURE__ */ i("div", {
14
+ }, D = x.slice((C - 1) * w, (C - 1) * w + w), O = (e) => b(`../projects/project-details-page?id=${encodeURIComponent(e.id)}`);
15
+ return /* @__PURE__ */ a("div", {
15
16
  className: "space-y-6 p-6",
16
17
  children: [
17
- /* @__PURE__ */ i("div", {
18
+ /* @__PURE__ */ a("div", {
18
19
  className: "flex items-center justify-between",
19
- children: [/* @__PURE__ */ i("div", { children: [
20
- /* @__PURE__ */ r("h1", {
20
+ children: [/* @__PURE__ */ a("div", { children: [
21
+ /* @__PURE__ */ i("h1", {
21
22
  className: "text-2xl font-semibold",
22
- children: /* @__PURE__ */ r(f, { children: T("crewfoundry.projects.title", "Projects") })
23
+ children: /* @__PURE__ */ i(p, { children: E("crewfoundry.projects.title", "Projects") })
23
24
  }),
24
- /* @__PURE__ */ i("p", {
25
+ /* @__PURE__ */ a("p", {
25
26
  className: "text-sm text-text-secondary",
26
27
  children: [
27
- x.length,
28
+ S.length,
28
29
  " ",
29
- T("crewfoundry.projects.summary.activeProjects", "active projects")
30
+ E("crewfoundry.projects.summary.activeProjects", "active projects")
30
31
  ]
31
32
  }),
32
- /* @__PURE__ */ r(m, {
33
+ /* @__PURE__ */ i(h, {
33
34
  className: "mt-1",
34
35
  children: "All your projects in one view — track status, progress, and budgets so nothing stalls and everything ships on time."
35
36
  })
36
- ] }), /* @__PURE__ */ i(o, {
37
+ ] }), /* @__PURE__ */ a(s, {
37
38
  size: "sm",
38
- onClick: () => y("../../projects/create-project-page"),
39
- children: [/* @__PURE__ */ r(t, { className: "h-4 w-4 mr-1" }), T("crewfoundry.projects.actions.newProject", "New Project")]
39
+ onClick: () => b("../projects/create-project-page"),
40
+ children: [/* @__PURE__ */ i(n, { className: "h-4 w-4 mr-1" }), E("crewfoundry.projects.actions.newProject", "New Project")]
40
41
  })]
41
42
  }),
42
- /* @__PURE__ */ r("div", {
43
+ /* @__PURE__ */ i("div", {
43
44
  className: "grid gap-4 md:grid-cols-2 lg:grid-cols-3",
44
- children: b.length === 0 ? /* @__PURE__ */ r("div", {
45
+ children: x.length === 0 ? /* @__PURE__ */ i("div", {
45
46
  className: "col-span-full",
46
- children: /* @__PURE__ */ r(p, {
47
+ children: /* @__PURE__ */ i(m, {
47
48
  illustration: "empty-data",
48
49
  title: "No projects yet",
49
50
  description: "Create your first project to start tracking work."
50
51
  })
51
- }) : E.map((e, t) => /* @__PURE__ */ i(d, {
52
- treatment: t === 0 && S === 1 ? "glass" : "plain",
53
- glow: t === 0 && S === 1,
52
+ }) : D.map((e, n) => /* @__PURE__ */ a(f, {
53
+ treatment: n === 0 && C === 1 ? "glass" : "plain",
54
+ glow: n === 0 && C === 1,
54
55
  role: "button",
55
56
  tabIndex: 0,
56
57
  "aria-label": `Open ${e.name} project detail`,
57
- onClick: () => D(e),
58
+ onClick: () => O(e),
58
59
  onKeyDown: (t) => {
59
- (t.key === "Enter" || t.key === " ") && (t.preventDefault(), D(e));
60
+ (t.key === "Enter" || t.key === " ") && (t.preventDefault(), O(e));
60
61
  },
61
62
  className: "hover:shadow-md transition-shadow cursor-pointer focus-visible:outline-none focus-visible:shadow-[var(--shadow-focus)]",
62
- children: [/* @__PURE__ */ i(l, { children: [/* @__PURE__ */ i("div", {
63
+ children: [/* @__PURE__ */ a(u, { children: [/* @__PURE__ */ a("div", {
63
64
  className: "flex items-center justify-between",
64
- children: [/* @__PURE__ */ r(u, {
65
+ children: [/* @__PURE__ */ i(d, {
65
66
  className: "text-base",
66
67
  children: e.name
67
- }), /* @__PURE__ */ r(a, {
68
+ }), /* @__PURE__ */ i(o, {
68
69
  variant: e.status === "active" ? "default" : e.status === "completed" ? "secondary" : "outline",
69
70
  className: "text-[10px]",
70
- children: e.status
71
+ children: t(e.status)
71
72
  })]
72
- }), /* @__PURE__ */ r(c, { children: e.description })] }), /* @__PURE__ */ i(s, { children: [
73
- /* @__PURE__ */ i("div", {
73
+ }), /* @__PURE__ */ i(l, { children: e.description })] }), /* @__PURE__ */ a(c, { children: [
74
+ /* @__PURE__ */ a("div", {
74
75
  className: "space-y-2 mb-3",
75
- children: [/* @__PURE__ */ i("div", {
76
+ children: [/* @__PURE__ */ a("div", {
76
77
  className: "flex justify-between text-xs",
77
- children: [/* @__PURE__ */ i("span", { children: [
78
+ children: [/* @__PURE__ */ a("span", { children: [
78
79
  e.completedTasks,
79
80
  "/",
80
81
  e.tasks,
81
82
  " ",
82
- T("crewfoundry.projects.card.tasks", "tasks")
83
- ] }), /* @__PURE__ */ i("span", { children: [e.progress, "%"] })]
84
- }), /* @__PURE__ */ r("div", {
83
+ E("crewfoundry.projects.card.tasks", "tasks")
84
+ ] }), /* @__PURE__ */ a("span", { children: [e.progress, "%"] })]
85
+ }), /* @__PURE__ */ i("div", {
85
86
  className: "h-2 bg-bg-sunken rounded overflow-hidden",
86
- children: /* @__PURE__ */ r("div", {
87
+ children: /* @__PURE__ */ i("div", {
87
88
  className: "h-2 bg-action-primary-bg rounded",
88
89
  style: { width: `${e.progress}%` }
89
90
  })
90
91
  })]
91
92
  }),
92
- /* @__PURE__ */ i("div", {
93
+ /* @__PURE__ */ a("div", {
93
94
  className: "grid grid-cols-2 gap-2 text-xs text-text-secondary",
94
95
  children: [
95
- /* @__PURE__ */ i("span", { children: [
96
- T("crewfoundry.projects.card.team", "Team"),
96
+ /* @__PURE__ */ a("span", { children: [
97
+ E("crewfoundry.projects.card.team", "Team"),
97
98
  ": ",
98
99
  e.teamName
99
100
  ] }),
100
- /* @__PURE__ */ i("span", { children: [
101
- T("crewfoundry.projects.card.manager", "Manager"),
101
+ /* @__PURE__ */ a("span", { children: [
102
+ E("crewfoundry.projects.card.manager", "Manager"),
102
103
  ": ",
103
104
  e.managerName
104
105
  ] }),
105
- /* @__PURE__ */ i("span", { children: [
106
- T("crewfoundry.projects.card.budget", "Budget"),
106
+ /* @__PURE__ */ a("span", { children: [
107
+ E("crewfoundry.projects.card.budget", "Budget"),
107
108
  ": $",
108
109
  (e.budget / 1e3).toFixed(0),
109
110
  "K"
110
111
  ] }),
111
- /* @__PURE__ */ i("span", { children: [
112
- T("crewfoundry.projects.card.spent", "Spent"),
112
+ /* @__PURE__ */ a("span", { children: [
113
+ E("crewfoundry.projects.card.spent", "Spent"),
113
114
  ": $",
114
115
  (e.spent / 1e3).toFixed(0),
115
116
  "K"
116
117
  ] })
117
118
  ]
118
119
  }),
119
- /* @__PURE__ */ i("div", {
120
+ /* @__PURE__ */ a("div", {
120
121
  className: "flex gap-1 mt-2",
121
- children: [/* @__PURE__ */ r(a, {
122
+ children: [/* @__PURE__ */ i(o, {
122
123
  variant: e.priority === "critical" ? "destructive" : e.priority === "high" ? "default" : "secondary",
123
124
  className: "text-[10px]",
124
- children: e.priority
125
- }), /* @__PURE__ */ i(a, {
125
+ children: t(e.priority)
126
+ }), /* @__PURE__ */ a(o, {
126
127
  variant: "outline",
127
128
  className: "text-[10px]",
128
129
  children: [
@@ -135,16 +136,16 @@ function v() {
135
136
  ] })]
136
137
  }, e.id))
137
138
  }),
138
- b.length > C && /* @__PURE__ */ r(h, {
139
- page: S,
140
- pageSize: C,
141
- totalItems: b.length,
142
- onPageChange: w
139
+ x.length > w && /* @__PURE__ */ i(g, {
140
+ page: C,
141
+ pageSize: w,
142
+ totalItems: x.length,
143
+ onPageChange: T
143
144
  })
144
145
  ]
145
146
  });
146
147
  }
147
148
  //#endregion
148
- export { v as ProjectsProjectsPagePage };
149
+ export { y as ProjectsProjectsPagePage };
149
150
 
150
151
  //# sourceMappingURL=ProjectsProjectsPagePage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ProjectsProjectsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/ProjectsProjectsPagePage.tsx"],"sourcesContent":["import {\n Badge,\n Button,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n GlassCard,\n GradientText,\n IllustratedEmptyState,\n PagePurpose,\n Pagination,\n} from '@burdenoff/fe-libs/ui';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { usePagination } from '@burdenoff/fe-libs/shared/hooks';\nimport { Plus } from 'lucide-react';\nimport { useNavigate } from 'react-router-dom';\nimport { useCrewFoundryStore, type Project } from '../store/crewfoundryStore';\n\nexport function ProjectsProjectsPagePage() {\n const { t: translate } = useI18n();\n const navigate = useNavigate();\n const { projects } = useCrewFoundryStore();\n const activeProjects = projects.filter((p) => p.status === 'active');\n const { page, pageSize, setPage } = usePagination({ initialPageSize: 12 });\n const t = (key: string, fallback: string) => {\n const value = translate(key);\n return value === key ? fallback : value;\n };\n\n const pageProjects = projects.slice((page - 1) * pageSize, (page - 1) * pageSize + pageSize);\n\n const openProject = (project: Project) =>\n navigate(`../../projects/project-details-page?id=${encodeURIComponent(project.id)}`);\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 <GradientText>{t('crewfoundry.projects.title', 'Projects')}</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\n {activeProjects.length}{' '}\n {t('crewfoundry.projects.summary.activeProjects', 'active projects')}\n </p>\n <PagePurpose className=\"mt-1\">\n All your projects in one view — track status, progress, and budgets so nothing stalls\n and everything ships on time.\n </PagePurpose>\n </div>\n <Button size=\"sm\" onClick={() => navigate('../../projects/create-project-page')}>\n <Plus className=\"h-4 w-4 mr-1\" />\n {t('crewfoundry.projects.actions.newProject', 'New Project')}\n </Button>\n </div>\n <div className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-3\">\n {projects.length === 0 ? (\n <div className=\"col-span-full\">\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title=\"No projects yet\"\n description=\"Create your first project to start tracking work.\"\n />\n </div>\n ) : (\n pageProjects.map((project, _idx) => (\n <GlassCard\n key={project.id}\n treatment={_idx === 0 && page === 1 ? 'glass' : 'plain'}\n glow={_idx === 0 && page === 1}\n role=\"button\"\n tabIndex={0}\n aria-label={`Open ${project.name} project detail`}\n onClick={() => openProject(project)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n openProject(project);\n }\n }}\n className=\"hover:shadow-md transition-shadow cursor-pointer focus-visible:outline-none focus-visible:shadow-[var(--shadow-focus)]\"\n >\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <CardTitle className=\"text-base\">{project.name}</CardTitle>\n <Badge\n variant={\n project.status === 'active'\n ? 'default'\n : project.status === 'completed'\n ? 'secondary'\n : 'outline'\n }\n className=\"text-[10px]\"\n >\n {project.status}\n </Badge>\n </div>\n <CardDescription>{project.description}</CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-2 mb-3\">\n <div className=\"flex justify-between text-xs\">\n <span>\n {project.completedTasks}/{project.tasks}{' '}\n {t('crewfoundry.projects.card.tasks', 'tasks')}\n </span>\n <span>{project.progress}%</span>\n </div>\n <div className=\"h-2 bg-bg-sunken rounded overflow-hidden\">\n <div\n className=\"h-2 bg-action-primary-bg rounded\"\n style={{ width: `${project.progress}%` }}\n />\n </div>\n </div>\n <div className=\"grid grid-cols-2 gap-2 text-xs text-text-secondary\">\n <span>\n {t('crewfoundry.projects.card.team', 'Team')}: {project.teamName}\n </span>\n <span>\n {t('crewfoundry.projects.card.manager', 'Manager')}: {project.managerName}\n </span>\n <span>\n {t('crewfoundry.projects.card.budget', 'Budget')}: $\n {(project.budget / 1000).toFixed(0)}K\n </span>\n <span>\n {t('crewfoundry.projects.card.spent', 'Spent')}: $\n {(project.spent / 1000).toFixed(0)}K\n </span>\n </div>\n <div className=\"flex gap-1 mt-2\">\n <Badge\n variant={\n project.priority === 'critical'\n ? 'destructive'\n : project.priority === 'high'\n ? 'default'\n : 'secondary'\n }\n className=\"text-[10px]\"\n >\n {project.priority}\n </Badge>\n <Badge variant=\"outline\" className=\"text-[10px]\">\n {project.startDate} — {project.endDate}\n </Badge>\n </div>\n </CardContent>\n </GlassCard>\n ))\n )}\n </div>\n\n {projects.length > pageSize && (\n <Pagination\n page={page}\n pageSize={pageSize}\n totalItems={projects.length}\n onPageChange={setPage}\n />\n )}\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ProjectsProjectsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/ProjectsProjectsPagePage.tsx"],"sourcesContent":["import {\n Badge,\n Button,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n GlassCard,\n GradientText,\n IllustratedEmptyState,\n PagePurpose,\n Pagination,\n} from '@burdenoff/fe-libs/ui';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { usePagination } from '@burdenoff/fe-libs/shared/hooks';\nimport { Plus } from 'lucide-react';\nimport { useNavigate } from 'react-router-dom';\nimport { useCrewFoundryStore, type Project } from '../store/crewfoundryStore';\nimport { formatEnumLabel } from '../utils/formatEnumLabel';\n\nexport function ProjectsProjectsPagePage() {\n const { t: translate } = useI18n();\n const navigate = useNavigate();\n const { projects } = useCrewFoundryStore();\n const activeProjects = projects.filter((p) => p.status === 'active');\n const { page, pageSize, setPage } = usePagination({ initialPageSize: 12 });\n const t = (key: string, fallback: string) => {\n const value = translate(key);\n return value === key ? fallback : value;\n };\n\n const pageProjects = projects.slice((page - 1) * pageSize, (page - 1) * pageSize + pageSize);\n\n const openProject = (project: Project) =>\n navigate(`../projects/project-details-page?id=${encodeURIComponent(project.id)}`);\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 <GradientText>{t('crewfoundry.projects.title', 'Projects')}</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\n {activeProjects.length}{' '}\n {t('crewfoundry.projects.summary.activeProjects', 'active projects')}\n </p>\n <PagePurpose className=\"mt-1\">\n All your projects in one view — track status, progress, and budgets so nothing stalls\n and everything ships on time.\n </PagePurpose>\n </div>\n <Button size=\"sm\" onClick={() => navigate('../projects/create-project-page')}>\n <Plus className=\"h-4 w-4 mr-1\" />\n {t('crewfoundry.projects.actions.newProject', 'New Project')}\n </Button>\n </div>\n <div className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-3\">\n {projects.length === 0 ? (\n <div className=\"col-span-full\">\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title=\"No projects yet\"\n description=\"Create your first project to start tracking work.\"\n />\n </div>\n ) : (\n pageProjects.map((project, _idx) => (\n <GlassCard\n key={project.id}\n treatment={_idx === 0 && page === 1 ? 'glass' : 'plain'}\n glow={_idx === 0 && page === 1}\n role=\"button\"\n tabIndex={0}\n aria-label={`Open ${project.name} project detail`}\n onClick={() => openProject(project)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n openProject(project);\n }\n }}\n className=\"hover:shadow-md transition-shadow cursor-pointer focus-visible:outline-none focus-visible:shadow-[var(--shadow-focus)]\"\n >\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <CardTitle className=\"text-base\">{project.name}</CardTitle>\n <Badge\n variant={\n project.status === 'active'\n ? 'default'\n : project.status === 'completed'\n ? 'secondary'\n : 'outline'\n }\n className=\"text-[10px]\"\n >\n {formatEnumLabel(project.status)}\n </Badge>\n </div>\n <CardDescription>{project.description}</CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-2 mb-3\">\n <div className=\"flex justify-between text-xs\">\n <span>\n {project.completedTasks}/{project.tasks}{' '}\n {t('crewfoundry.projects.card.tasks', 'tasks')}\n </span>\n <span>{project.progress}%</span>\n </div>\n <div className=\"h-2 bg-bg-sunken rounded overflow-hidden\">\n <div\n className=\"h-2 bg-action-primary-bg rounded\"\n style={{ width: `${project.progress}%` }}\n />\n </div>\n </div>\n <div className=\"grid grid-cols-2 gap-2 text-xs text-text-secondary\">\n <span>\n {t('crewfoundry.projects.card.team', 'Team')}: {project.teamName}\n </span>\n <span>\n {t('crewfoundry.projects.card.manager', 'Manager')}: {project.managerName}\n </span>\n <span>\n {t('crewfoundry.projects.card.budget', 'Budget')}: $\n {(project.budget / 1000).toFixed(0)}K\n </span>\n <span>\n {t('crewfoundry.projects.card.spent', 'Spent')}: $\n {(project.spent / 1000).toFixed(0)}K\n </span>\n </div>\n <div className=\"flex gap-1 mt-2\">\n <Badge\n variant={\n project.priority === 'critical'\n ? 'destructive'\n : project.priority === 'high'\n ? 'default'\n : 'secondary'\n }\n className=\"text-[10px]\"\n >\n {formatEnumLabel(project.priority)}\n </Badge>\n <Badge variant=\"outline\" className=\"text-[10px]\">\n {project.startDate} — {project.endDate}\n </Badge>\n </div>\n </CardContent>\n </GlassCard>\n ))\n )}\n </div>\n\n {projects.length > pageSize && (\n <Pagination\n page={page}\n pageSize={pageSize}\n totalItems={projects.length}\n onPageChange={setPage}\n />\n )}\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1,11 +1,12 @@
1
1
  import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
2
- import { Star as t, TrendingUp as n, Users as r } from "lucide-react";
3
- import { jsx as i, jsxs as a } from "react/jsx-runtime";
4
- import { Badge as o, Card as s, CardContent as c, CardHeader as l, CardTitle as u, GlassCard as d, GradientText as f, PagePurpose as p, ResponsiveTable as m } from "@burdenoff/fe-libs/ui";
2
+ import { formatEnumLabel as t } from "../utils/formatEnumLabel.js";
3
+ import { Star as n, TrendingUp as r, Users as i } from "lucide-react";
4
+ import { jsx as a, jsxs as o } from "react/jsx-runtime";
5
+ import { Badge as s, Card as c, CardContent as l, CardHeader as u, CardTitle as d, GlassCard as f, GradientText as p, PagePurpose as m, ResponsiveTable as h } from "@burdenoff/fe-libs/ui";
5
6
  //#region src/crewfoundry/pages/TeamsTeamAnalyticsPagePage.tsx
6
- function h() {
7
- let { teams: h, employees: g, projects: _ } = e(), v = h.map((e) => {
8
- let t = g.filter((t) => e.members.includes(t.id)), n = t.length > 0 ? (t.reduce((e, t) => e + t.performanceScore, 0) / t.length).toFixed(1) : "0", r = _.filter((t) => t.teamId === e.id), i = r.filter((e) => e.status === "active").length;
7
+ function g() {
8
+ let { teams: g, employees: _, projects: v } = e(), y = g.map((e) => {
9
+ let t = _.filter((t) => e.members.includes(t.id)), n = t.length > 0 ? (t.reduce((e, t) => e + t.performanceScore, 0) / t.length).toFixed(1) : "0", r = v.filter((t) => t.teamId === e.id), i = r.filter((e) => e.status === "active").length;
9
10
  return {
10
11
  id: e.id,
11
12
  name: e.name,
@@ -16,102 +17,102 @@ function h() {
16
17
  activeProjects: i,
17
18
  totalProjects: r.length
18
19
  };
19
- }), y = [...h].sort((e, t) => t.memberCount - e.memberCount), b = h.length ? Math.max(...h.map((e) => e.memberCount)) : 0;
20
- return /* @__PURE__ */ a("div", {
20
+ }), b = [...g].sort((e, t) => t.memberCount - e.memberCount), x = g.length ? Math.max(...g.map((e) => e.memberCount)) : 0;
21
+ return /* @__PURE__ */ o("div", {
21
22
  className: "space-y-6 p-6",
22
23
  children: [
23
- /* @__PURE__ */ a("div", { children: [
24
- /* @__PURE__ */ i("h1", {
24
+ /* @__PURE__ */ o("div", { children: [
25
+ /* @__PURE__ */ a("h1", {
25
26
  className: "text-2xl font-semibold",
26
- children: /* @__PURE__ */ i(f, { children: "Team Analytics" })
27
+ children: /* @__PURE__ */ a(p, { children: "Team Analytics" })
27
28
  }),
28
- /* @__PURE__ */ i("p", {
29
+ /* @__PURE__ */ a("p", {
29
30
  className: "text-sm text-text-secondary",
30
31
  children: "Performance and productivity metrics across teams"
31
32
  }),
32
- /* @__PURE__ */ i(p, {
33
+ /* @__PURE__ */ a(m, {
33
34
  className: "mt-1",
34
35
  children: "Understand how your teams are performing — productivity, workload, and trends that help you balance and support your groups."
35
36
  })
36
37
  ] }),
37
- /* @__PURE__ */ a("div", {
38
+ /* @__PURE__ */ o("div", {
38
39
  className: "grid gap-4 md:grid-cols-3",
39
40
  children: [
40
- /* @__PURE__ */ a(d, {
41
+ /* @__PURE__ */ o(f, {
41
42
  treatment: "glass",
42
43
  glow: !0,
43
44
  className: "border-border-seam",
44
- children: [/* @__PURE__ */ a(l, {
45
+ children: [/* @__PURE__ */ o(u, {
45
46
  className: "flex flex-row items-center justify-between space-y-0 pb-2",
46
- children: [/* @__PURE__ */ i(u, {
47
+ children: [/* @__PURE__ */ a(d, {
47
48
  className: "text-sm font-medium",
48
49
  children: "Total Teams"
49
- }), /* @__PURE__ */ i(r, { className: "h-4 w-4 text-text-secondary" })]
50
- }), /* @__PURE__ */ i(c, { children: /* @__PURE__ */ i("div", {
50
+ }), /* @__PURE__ */ a(i, { className: "h-4 w-4 text-text-secondary" })]
51
+ }), /* @__PURE__ */ a(l, { children: /* @__PURE__ */ a("div", {
51
52
  className: "text-2xl font-bold tabular-nums",
52
- children: h.length
53
+ children: g.length
53
54
  }) })]
54
55
  }),
55
- /* @__PURE__ */ a(d, {
56
+ /* @__PURE__ */ o(f, {
56
57
  treatment: "metric",
57
58
  className: "border-border-seam",
58
- children: [/* @__PURE__ */ a(l, {
59
+ children: [/* @__PURE__ */ o(u, {
59
60
  className: "flex flex-row items-center justify-between space-y-0 pb-2",
60
- children: [/* @__PURE__ */ i(u, {
61
+ children: [/* @__PURE__ */ a(d, {
61
62
  className: "text-sm font-medium",
62
63
  children: "Total Members"
63
- }), /* @__PURE__ */ i(r, { className: "h-4 w-4 text-text-secondary" })]
64
- }), /* @__PURE__ */ i(c, { children: /* @__PURE__ */ i("div", {
64
+ }), /* @__PURE__ */ a(i, { className: "h-4 w-4 text-text-secondary" })]
65
+ }), /* @__PURE__ */ a(l, { children: /* @__PURE__ */ a("div", {
65
66
  className: "text-2xl font-bold tabular-nums",
66
- children: h.reduce((e, t) => e + t.memberCount, 0)
67
+ children: g.reduce((e, t) => e + t.memberCount, 0)
67
68
  }) })]
68
69
  }),
69
- /* @__PURE__ */ a(d, {
70
+ /* @__PURE__ */ o(f, {
70
71
  treatment: "metric",
71
72
  className: "border-border-seam",
72
- children: [/* @__PURE__ */ a(l, {
73
+ children: [/* @__PURE__ */ o(u, {
73
74
  className: "flex flex-row items-center justify-between space-y-0 pb-2",
74
- children: [/* @__PURE__ */ i(u, {
75
+ children: [/* @__PURE__ */ a(d, {
75
76
  className: "text-sm font-medium",
76
77
  children: "Active Projects"
77
- }), /* @__PURE__ */ i(n, { className: "h-4 w-4 text-text-secondary" })]
78
- }), /* @__PURE__ */ i(c, { children: /* @__PURE__ */ i("div", {
78
+ }), /* @__PURE__ */ a(r, { className: "h-4 w-4 text-text-secondary" })]
79
+ }), /* @__PURE__ */ a(l, { children: /* @__PURE__ */ a("div", {
79
80
  className: "text-2xl font-bold tabular-nums",
80
- children: v.reduce((e, t) => e + t.activeProjects, 0)
81
+ children: y.reduce((e, t) => e + t.activeProjects, 0)
81
82
  }) })]
82
83
  })
83
84
  ]
84
85
  }),
85
- /* @__PURE__ */ a(s, { children: [/* @__PURE__ */ i(l, { children: /* @__PURE__ */ i(u, { children: "Team Size Comparison" }) }), /* @__PURE__ */ i(c, {
86
+ /* @__PURE__ */ o(c, { children: [/* @__PURE__ */ a(u, { children: /* @__PURE__ */ a(d, { children: "Team Size Comparison" }) }), /* @__PURE__ */ a(l, {
86
87
  className: "space-y-3",
87
- children: y.map((e) => /* @__PURE__ */ a("div", {
88
+ children: b.map((e) => /* @__PURE__ */ o("div", {
88
89
  className: "flex items-center gap-3",
89
90
  children: [
90
- /* @__PURE__ */ i("span", {
91
+ /* @__PURE__ */ a("span", {
91
92
  className: "w-40 text-sm font-medium truncate",
92
93
  children: e.name
93
94
  }),
94
- /* @__PURE__ */ i("div", {
95
+ /* @__PURE__ */ a("div", {
95
96
  className: "flex-1 h-4 bg-bg-sunken rounded overflow-hidden",
96
- children: /* @__PURE__ */ i("div", {
97
+ children: /* @__PURE__ */ a("div", {
97
98
  className: "h-4 bg-action-primary-bg rounded",
98
- style: { width: `${b > 0 ? Math.round(e.memberCount / b * 100) : 0}%` }
99
+ style: { width: `${x > 0 ? Math.round(e.memberCount / x * 100) : 0}%` }
99
100
  })
100
101
  }),
101
- /* @__PURE__ */ i("span", {
102
+ /* @__PURE__ */ a("span", {
102
103
  className: "text-sm font-medium w-8 text-right",
103
104
  children: e.memberCount
104
105
  })
105
106
  ]
106
107
  }, e.id))
107
108
  })] }),
108
- /* @__PURE__ */ a(s, { children: [/* @__PURE__ */ i(l, { children: /* @__PURE__ */ i(u, { children: "Team Performance Overview" }) }), /* @__PURE__ */ i(c, { children: /* @__PURE__ */ i(m, {
109
+ /* @__PURE__ */ o(c, { children: [/* @__PURE__ */ a(u, { children: /* @__PURE__ */ a(d, { children: "Team Performance Overview" }) }), /* @__PURE__ */ a(l, { children: /* @__PURE__ */ a(h, {
109
110
  columns: [
110
111
  {
111
112
  key: "name",
112
113
  header: "Team",
113
114
  priority: "primary",
114
- cell: (e) => /* @__PURE__ */ i("span", {
115
+ cell: (e) => /* @__PURE__ */ a("span", {
115
116
  className: "font-medium text-text-primary",
116
117
  children: e.name
117
118
  })
@@ -120,7 +121,7 @@ function h() {
120
121
  key: "department",
121
122
  header: "Department",
122
123
  priority: "secondary",
123
- cell: (e) => /* @__PURE__ */ i("span", {
124
+ cell: (e) => /* @__PURE__ */ a("span", {
124
125
  className: "text-text-secondary",
125
126
  children: e.department
126
127
  })
@@ -129,16 +130,16 @@ function h() {
129
130
  key: "avgPerf",
130
131
  header: "Avg Performance",
131
132
  priority: "secondary",
132
- cell: (e) => /* @__PURE__ */ a("span", {
133
+ cell: (e) => /* @__PURE__ */ o("span", {
133
134
  className: "flex items-center gap-1 md:justify-center",
134
- children: [/* @__PURE__ */ i(t, { className: "h-3 w-3 text-status-warning-text" }), e.avgPerf]
135
+ children: [/* @__PURE__ */ a(n, { className: "h-3 w-3 text-status-warning-text" }), e.avgPerf]
135
136
  })
136
137
  },
137
138
  {
138
139
  key: "projects",
139
140
  header: "Active Projects",
140
141
  priority: "secondary",
141
- cell: (e) => /* @__PURE__ */ a("span", {
142
+ cell: (e) => /* @__PURE__ */ o("span", {
142
143
  className: "md:text-right md:block",
143
144
  children: [
144
145
  e.activeProjects,
@@ -151,20 +152,20 @@ function h() {
151
152
  key: "status",
152
153
  header: "Status",
153
154
  priority: "primary",
154
- cell: (e) => /* @__PURE__ */ i(o, {
155
+ cell: (e) => /* @__PURE__ */ a(s, {
155
156
  variant: e.status === "active" ? "default" : "secondary",
156
157
  className: "text-[10px]",
157
- children: e.status
158
+ children: t(e.status)
158
159
  })
159
160
  }
160
161
  ],
161
- data: v,
162
+ data: y,
162
163
  rowKey: (e) => e.id
163
164
  }) })] })
164
165
  ]
165
166
  });
166
167
  }
167
168
  //#endregion
168
- export { h as TeamsTeamAnalyticsPagePage };
169
+ export { g as TeamsTeamAnalyticsPagePage };
169
170
 
170
171
  //# sourceMappingURL=TeamsTeamAnalyticsPagePage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TeamsTeamAnalyticsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/TeamsTeamAnalyticsPagePage.tsx"],"sourcesContent":["import {\n Badge,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n GlassCard,\n GradientText,\n PagePurpose,\n ResponsiveTable,\n type ResponsiveTableColumn,\n} from '@burdenoff/fe-libs/ui';\nimport { Star, TrendingUp, Users } from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\ninterface TeamMetricRow {\n id: string;\n name: string;\n department: string;\n status: string;\n memberCount: number;\n avgPerf: string;\n activeProjects: number;\n totalProjects: number;\n}\n\nexport function TeamsTeamAnalyticsPagePage() {\n const { teams, employees, projects } = useCrewFoundryStore();\n\n const teamMetrics: TeamMetricRow[] = teams.map((t) => {\n const members = employees.filter((e) => t.members.includes(e.id));\n const avgPerf =\n members.length > 0\n ? (members.reduce((s, m) => s + m.performanceScore, 0) / members.length).toFixed(1)\n : '0';\n const teamProjects = projects.filter((p) => p.teamId === t.id);\n const activeProj = teamProjects.filter((p) => p.status === 'active').length;\n return {\n id: t.id,\n name: t.name,\n department: t.department,\n status: t.status,\n memberCount: t.memberCount,\n avgPerf,\n activeProjects: activeProj,\n totalProjects: teamProjects.length,\n };\n });\n\n const sizeComparison = [...teams].sort((a, b) => b.memberCount - a.memberCount);\n const maxMembers = teams.length ? Math.max(...teams.map((t) => t.memberCount)) : 0;\n\n const performanceColumns: ResponsiveTableColumn<TeamMetricRow>[] = [\n {\n key: 'name',\n header: 'Team',\n priority: 'primary',\n cell: (t) => <span className=\"font-medium text-text-primary\">{t.name}</span>,\n },\n {\n key: 'department',\n header: 'Department',\n priority: 'secondary',\n cell: (t) => <span className=\"text-text-secondary\">{t.department}</span>,\n },\n {\n key: 'avgPerf',\n header: 'Avg Performance',\n priority: 'secondary',\n cell: (t) => (\n <span className=\"flex items-center gap-1 md:justify-center\">\n <Star className=\"h-3 w-3 text-status-warning-text\" />\n {t.avgPerf}\n </span>\n ),\n },\n {\n key: 'projects',\n header: 'Active Projects',\n priority: 'secondary',\n cell: (t) => (\n <span className=\"md:text-right md:block\">\n {t.activeProjects}/{t.totalProjects}\n </span>\n ),\n },\n {\n key: 'status',\n header: 'Status',\n priority: 'primary',\n cell: (t) => (\n <Badge variant={t.status === 'active' ? 'default' : 'secondary'} className=\"text-[10px]\">\n {t.status}\n </Badge>\n ),\n },\n ];\n\n return (\n <div className=\"space-y-6 p-6\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>Team Analytics</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\n Performance and productivity metrics across teams\n </p>\n <PagePurpose className=\"mt-1\">\n Understand how your teams are performing — productivity, workload, and trends that help\n you balance and support your groups.\n </PagePurpose>\n </div>\n <div className=\"grid gap-4 md:grid-cols-3\">\n <GlassCard treatment=\"glass\" glow className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Total Teams</CardTitle>\n <Users className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{teams.length}</div>\n </CardContent>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Total Members</CardTitle>\n <Users className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">\n {teams.reduce((s, t) => s + t.memberCount, 0)}\n </div>\n </CardContent>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Active Projects</CardTitle>\n <TrendingUp className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">\n {teamMetrics.reduce((s, t) => s + t.activeProjects, 0)}\n </div>\n </CardContent>\n </GlassCard>\n </div>\n <Card>\n <CardHeader>\n <CardTitle>Team Size Comparison</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {sizeComparison.map((t) => (\n <div key={t.id} className=\"flex items-center gap-3\">\n <span className=\"w-40 text-sm font-medium truncate\">{t.name}</span>\n <div className=\"flex-1 h-4 bg-bg-sunken rounded overflow-hidden\">\n <div\n className=\"h-4 bg-action-primary-bg rounded\"\n style={{\n width: `${maxMembers > 0 ? Math.round((t.memberCount / maxMembers) * 100) : 0}%`,\n }}\n />\n </div>\n <span className=\"text-sm font-medium w-8 text-right\">{t.memberCount}</span>\n </div>\n ))}\n </CardContent>\n </Card>\n <Card>\n <CardHeader>\n <CardTitle>Team Performance Overview</CardTitle>\n </CardHeader>\n <CardContent>\n <ResponsiveTable columns={performanceColumns} data={teamMetrics} rowKey={(t) => t.id} />\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"TeamsTeamAnalyticsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/TeamsTeamAnalyticsPagePage.tsx"],"sourcesContent":["import {\n Badge,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n GlassCard,\n GradientText,\n PagePurpose,\n ResponsiveTable,\n type ResponsiveTableColumn,\n} from '@burdenoff/fe-libs/ui';\nimport { Star, TrendingUp, Users } from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\nimport { formatEnumLabel } from '../utils/formatEnumLabel';\n\ninterface TeamMetricRow {\n id: string;\n name: string;\n department: string;\n status: string;\n memberCount: number;\n avgPerf: string;\n activeProjects: number;\n totalProjects: number;\n}\n\nexport function TeamsTeamAnalyticsPagePage() {\n const { teams, employees, projects } = useCrewFoundryStore();\n\n const teamMetrics: TeamMetricRow[] = teams.map((t) => {\n const members = employees.filter((e) => t.members.includes(e.id));\n const avgPerf =\n members.length > 0\n ? (members.reduce((s, m) => s + m.performanceScore, 0) / members.length).toFixed(1)\n : '0';\n const teamProjects = projects.filter((p) => p.teamId === t.id);\n const activeProj = teamProjects.filter((p) => p.status === 'active').length;\n return {\n id: t.id,\n name: t.name,\n department: t.department,\n status: t.status,\n memberCount: t.memberCount,\n avgPerf,\n activeProjects: activeProj,\n totalProjects: teamProjects.length,\n };\n });\n\n const sizeComparison = [...teams].sort((a, b) => b.memberCount - a.memberCount);\n const maxMembers = teams.length ? Math.max(...teams.map((t) => t.memberCount)) : 0;\n\n const performanceColumns: ResponsiveTableColumn<TeamMetricRow>[] = [\n {\n key: 'name',\n header: 'Team',\n priority: 'primary',\n cell: (t) => <span className=\"font-medium text-text-primary\">{t.name}</span>,\n },\n {\n key: 'department',\n header: 'Department',\n priority: 'secondary',\n cell: (t) => <span className=\"text-text-secondary\">{t.department}</span>,\n },\n {\n key: 'avgPerf',\n header: 'Avg Performance',\n priority: 'secondary',\n cell: (t) => (\n <span className=\"flex items-center gap-1 md:justify-center\">\n <Star className=\"h-3 w-3 text-status-warning-text\" />\n {t.avgPerf}\n </span>\n ),\n },\n {\n key: 'projects',\n header: 'Active Projects',\n priority: 'secondary',\n cell: (t) => (\n <span className=\"md:text-right md:block\">\n {t.activeProjects}/{t.totalProjects}\n </span>\n ),\n },\n {\n key: 'status',\n header: 'Status',\n priority: 'primary',\n cell: (t) => (\n <Badge variant={t.status === 'active' ? 'default' : 'secondary'} className=\"text-[10px]\">\n {formatEnumLabel(t.status)}\n </Badge>\n ),\n },\n ];\n\n return (\n <div className=\"space-y-6 p-6\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>Team Analytics</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\n Performance and productivity metrics across teams\n </p>\n <PagePurpose className=\"mt-1\">\n Understand how your teams are performing — productivity, workload, and trends that help\n you balance and support your groups.\n </PagePurpose>\n </div>\n <div className=\"grid gap-4 md:grid-cols-3\">\n <GlassCard treatment=\"glass\" glow className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Total Teams</CardTitle>\n <Users className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{teams.length}</div>\n </CardContent>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Total Members</CardTitle>\n <Users className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">\n {teams.reduce((s, t) => s + t.memberCount, 0)}\n </div>\n </CardContent>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Active Projects</CardTitle>\n <TrendingUp className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">\n {teamMetrics.reduce((s, t) => s + t.activeProjects, 0)}\n </div>\n </CardContent>\n </GlassCard>\n </div>\n <Card>\n <CardHeader>\n <CardTitle>Team Size Comparison</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {sizeComparison.map((t) => (\n <div key={t.id} className=\"flex items-center gap-3\">\n <span className=\"w-40 text-sm font-medium truncate\">{t.name}</span>\n <div className=\"flex-1 h-4 bg-bg-sunken rounded overflow-hidden\">\n <div\n className=\"h-4 bg-action-primary-bg rounded\"\n style={{\n width: `${maxMembers > 0 ? Math.round((t.memberCount / maxMembers) * 100) : 0}%`,\n }}\n />\n </div>\n <span className=\"text-sm font-medium w-8 text-right\">{t.memberCount}</span>\n </div>\n ))}\n </CardContent>\n </Card>\n <Card>\n <CardHeader>\n <CardTitle>Team Performance Overview</CardTitle>\n </CardHeader>\n <CardContent>\n <ResponsiveTable columns={performanceColumns} data={teamMetrics} rowKey={(t) => t.id} />\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}