@burdenoff/microfe-crewfoundry 2026.703.2 → 2026.704.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/crewfoundry/components/forms/FormModal.js.map +1 -1
- package/dist/crewfoundry/pages/AdminAdminPagePage.js +117 -164
- package/dist/crewfoundry/pages/AdminAdminPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsAnalyticsPagePage.js +99 -82
- package/dist/crewfoundry/pages/AnalyticsAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsEmployeeAnalyticsPagePage.js +160 -192
- package/dist/crewfoundry/pages/AnalyticsEmployeeAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js +238 -231
- package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.js +196 -166
- package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js +45 -147
- package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsDirectoryPagePage.js +20 -11
- package/dist/crewfoundry/pages/CommunicationsDirectoryPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsFilesPagePage.js +45 -152
- package/dist/crewfoundry/pages/CommunicationsFilesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js +50 -138
- package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsTeamsPagePage.js +149 -67
- package/dist/crewfoundry/pages/CommunicationsTeamsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js +50 -201
- package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js +205 -136
- package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyCompanyDashboardPagePage.js +25 -31
- package/dist/crewfoundry/pages/CompanyCompanyDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyCompanyProfilePagePage.js +118 -104
- package/dist/crewfoundry/pages/CompanyCompanyProfilePagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js +117 -58
- package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardAnalyticsPagePage.js +90 -94
- package/dist/crewfoundry/pages/DashboardAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardDashboardPagePage.js +210 -191
- package/dist/crewfoundry/pages/DashboardDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js +213 -180
- package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardExecutiveDashboardPage.js +133 -264
- package/dist/crewfoundry/pages/DashboardExecutiveDashboardPage.js.map +1 -1
- package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.js +279 -212
- package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringApplicationsPagePage.js +131 -105
- package/dist/crewfoundry/pages/HiringApplicationsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringCandidatesPagePage.js +167 -148
- package/dist/crewfoundry/pages/HiringCandidatesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringCreateJobPagePage.js +3 -3
- package/dist/crewfoundry/pages/HiringCreateJobPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringInterviewsPagePage.js +13 -5
- package/dist/crewfoundry/pages/HiringInterviewsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js +151 -152
- package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringJobsPagePage.js +38 -21
- package/dist/crewfoundry/pages/HiringJobsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrDepartmentsPagePage.js +3 -3
- package/dist/crewfoundry/pages/HrDepartmentsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrEmployeesPagePage.js +134 -127
- package/dist/crewfoundry/pages/HrEmployeesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js +163 -132
- package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrPayrollPagePage.js +202 -160
- package/dist/crewfoundry/pages/HrPayrollPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js +104 -91
- package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js +29 -147
- package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCertificatesPagePage.js +22 -106
- package/dist/crewfoundry/pages/LearningCertificatesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js +74 -74
- package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js +101 -97
- package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCoursesPagePage.js +64 -47
- package/dist/crewfoundry/pages/LearningCoursesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.js +111 -121
- package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPagePage.js +131 -110
- package/dist/crewfoundry/pages/LearningLearningPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js +65 -64
- package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js +58 -43
- package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningMyLearningPagePage.js +66 -82
- package/dist/crewfoundry/pages/LearningMyLearningPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js +38 -88
- package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js +59 -65
- package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js +209 -323
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js +175 -220
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js +74 -59
- package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js +96 -80
- package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.js +28 -100
- package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js +27 -20
- package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js +73 -73
- package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js +62 -56
- package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsEscrowPagePage.js +40 -138
- package/dist/crewfoundry/pages/PaymentsEscrowPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js +126 -93
- package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js +99 -77
- package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsSecurityPagePage.js +73 -74
- package/dist/crewfoundry/pages/PaymentsSecurityPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/ProjectsCreateProjectPagePage.js +1 -1
- package/dist/crewfoundry/pages/ProjectsCreateProjectPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js +122 -122
- package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js +130 -113
- package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamAnalyticsPagePage.js +68 -59
- package/dist/crewfoundry/pages/TeamsTeamAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamDetailPagePage.js +73 -62
- package/dist/crewfoundry/pages/TeamsTeamDetailPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamDirectoryPagePage.js +82 -58
- package/dist/crewfoundry/pages/TeamsTeamDirectoryPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js +153 -153
- package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamsPagePage.js +63 -48
- package/dist/crewfoundry/pages/TeamsTeamsPagePage.js.map +1 -1
- 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 {
|
|
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
|
|
9
|
-
let { t:
|
|
10
|
-
let n =
|
|
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: [
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
/* @__PURE__ */
|
|
19
|
-
|
|
20
|
-
|
|
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("
|
|
83
|
-
className: "
|
|
24
|
+
/* @__PURE__ */ i("p", {
|
|
25
|
+
className: "text-sm text-text-secondary",
|
|
84
26
|
children: [
|
|
85
|
-
|
|
86
|
-
|
|
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__ */
|
|
110
|
-
className: "
|
|
111
|
-
children:
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
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
|
-
|
|
120
|
-
|
|
121
|
-
|
|
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
|
-
|
|
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 {
|
|
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\"
|
|
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,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
|
|
7
|
-
let { teams:
|
|
8
|
-
let t =
|
|
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
|
-
|
|
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
|
-
}),
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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 /
|
|
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__ */
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
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
|
-
|
|
159
|
+
}
|
|
160
|
+
],
|
|
161
|
+
data: v,
|
|
162
|
+
rowKey: (e) => e.id
|
|
163
|
+
}) })] })
|
|
155
164
|
]
|
|
156
165
|
});
|
|
157
166
|
}
|
|
158
167
|
//#endregion
|
|
159
|
-
export {
|
|
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 {
|
|
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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"}
|