@burdenoff/microfe-crewfoundry 2026.703.2 → 2026.704.1

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