@burdenoff/microfe-crewfoundry 2026.624.1 → 2026.625.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/pages/AdminAdminPagePage.js +100 -76
- package/dist/crewfoundry/pages/AdminAdminPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsAnalyticsPagePage.js +118 -94
- package/dist/crewfoundry/pages/AnalyticsAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsEmployeeAnalyticsPagePage.js +105 -81
- package/dist/crewfoundry/pages/AnalyticsEmployeeAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js +134 -110
- package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.js +121 -97
- package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js +28 -15
- package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js +74 -54
- package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsDirectoryPagePage.js +87 -69
- package/dist/crewfoundry/pages/CommunicationsDirectoryPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsFilesPagePage.js +99 -80
- package/dist/crewfoundry/pages/CommunicationsFilesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js +87 -68
- package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsTeamsPagePage.js +31 -15
- package/dist/crewfoundry/pages/CommunicationsTeamsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js +81 -61
- package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js +71 -51
- package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyCompanyDashboardPagePage.js +82 -58
- package/dist/crewfoundry/pages/CompanyCompanyDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyCompanyProfilePagePage.js +46 -39
- package/dist/crewfoundry/pages/CompanyCompanyProfilePagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js +80 -62
- package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardAnalyticsPagePage.js +104 -80
- package/dist/crewfoundry/pages/DashboardAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardDashboardPagePage.js +219 -151
- package/dist/crewfoundry/pages/DashboardDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js +183 -142
- package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardExecutiveDashboardPage.js +121 -97
- package/dist/crewfoundry/pages/DashboardExecutiveDashboardPage.js.map +1 -1
- package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.js +57 -46
- package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringApplicationsPagePage.js +91 -67
- package/dist/crewfoundry/pages/HiringApplicationsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringCandidatesPagePage.js +112 -93
- package/dist/crewfoundry/pages/HiringCandidatesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringCreateJobPagePage.js +55 -48
- package/dist/crewfoundry/pages/HiringCreateJobPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringInterviewsPagePage.js +70 -50
- package/dist/crewfoundry/pages/HiringInterviewsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js +140 -97
- package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringJobsPagePage.js +101 -85
- package/dist/crewfoundry/pages/HiringJobsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrDepartmentsPagePage.js +68 -48
- package/dist/crewfoundry/pages/HrDepartmentsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrEmployeesPagePage.js +99 -71
- package/dist/crewfoundry/pages/HrEmployeesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js +97 -73
- package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrPayrollPagePage.js +100 -76
- package/dist/crewfoundry/pages/HrPayrollPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js +93 -69
- package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js +65 -45
- package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCertificatesPagePage.js +93 -75
- package/dist/crewfoundry/pages/LearningCertificatesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js +117 -72
- package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js +66 -54
- package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCoursesPagePage.js +36 -20
- package/dist/crewfoundry/pages/LearningCoursesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.js +90 -66
- package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPagePage.js +81 -57
- package/dist/crewfoundry/pages/LearningLearningPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js +90 -65
- package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js +33 -17
- package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningMyLearningPagePage.js +83 -59
- package/dist/crewfoundry/pages/LearningMyLearningPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js +68 -48
- package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js +80 -60
- package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js +153 -118
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js +42 -37
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js +67 -47
- package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js +104 -85
- package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.js +76 -57
- package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js +78 -60
- package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js +138 -93
- package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js +98 -53
- package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsEscrowPagePage.js +69 -49
- package/dist/crewfoundry/pages/PaymentsEscrowPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js +84 -65
- package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js +76 -52
- package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js +58 -40
- package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsSecurityPagePage.js +85 -65
- package/dist/crewfoundry/pages/PaymentsSecurityPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/ProjectsCreateProjectPagePage.js +36 -29
- package/dist/crewfoundry/pages/ProjectsCreateProjectPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js +108 -73
- package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js +43 -27
- package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamAnalyticsPagePage.js +67 -47
- package/dist/crewfoundry/pages/TeamsTeamAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamDetailPagePage.js +108 -63
- package/dist/crewfoundry/pages/TeamsTeamDetailPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamDirectoryPagePage.js +83 -64
- package/dist/crewfoundry/pages/TeamsTeamDirectoryPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js +185 -144
- package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamsPagePage.js +40 -24
- package/dist/crewfoundry/pages/TeamsTeamsPagePage.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProjectsProjectsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/ProjectsProjectsPagePage.tsx"],"sourcesContent":["import {\n Badge,\n Button,\n
|
|
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 { DollarSign, FolderKanban, Plus } from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\nexport function ProjectsProjectsPagePage() {\n const { t: translate } = useI18n();\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\">\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,66 +1,86 @@
|
|
|
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 } 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 } from "@burdenoff/fe-libs/ui";
|
|
5
5
|
//#region src/crewfoundry/pages/TeamsTeamAnalyticsPagePage.tsx
|
|
6
|
-
function
|
|
7
|
-
let { teams:
|
|
8
|
-
let t =
|
|
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;
|
|
9
9
|
return {
|
|
10
10
|
...e,
|
|
11
11
|
avgPerf: n,
|
|
12
12
|
activeProjects: i,
|
|
13
13
|
totalProjects: r.length
|
|
14
14
|
};
|
|
15
|
-
}),
|
|
15
|
+
}), v = Math.max(...m.map((e) => e.memberCount));
|
|
16
16
|
return /* @__PURE__ */ a("div", {
|
|
17
17
|
className: "space-y-6 p-6",
|
|
18
18
|
children: [
|
|
19
|
-
/* @__PURE__ */ a("div", { children: [
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
19
|
+
/* @__PURE__ */ a("div", { children: [
|
|
20
|
+
/* @__PURE__ */ i("h1", {
|
|
21
|
+
className: "text-2xl font-semibold",
|
|
22
|
+
children: /* @__PURE__ */ i(f, { children: "Team Analytics" })
|
|
23
|
+
}),
|
|
24
|
+
/* @__PURE__ */ i("p", {
|
|
25
|
+
className: "text-sm text-text-secondary",
|
|
26
|
+
children: "Performance and productivity metrics across teams"
|
|
27
|
+
}),
|
|
28
|
+
/* @__PURE__ */ i(p, {
|
|
29
|
+
className: "mt-1",
|
|
30
|
+
children: "Understand how your teams are performing — productivity, workload, and trends that help you balance and support your groups."
|
|
31
|
+
})
|
|
32
|
+
] }),
|
|
26
33
|
/* @__PURE__ */ a("div", {
|
|
27
34
|
className: "grid gap-4 md:grid-cols-3",
|
|
28
35
|
children: [
|
|
29
|
-
/* @__PURE__ */ a(
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
className: "
|
|
47
|
-
children:
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
className: "
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
36
|
+
/* @__PURE__ */ a(d, {
|
|
37
|
+
treatment: "glass",
|
|
38
|
+
glow: !0,
|
|
39
|
+
className: "border-border-seam",
|
|
40
|
+
children: [/* @__PURE__ */ a(l, {
|
|
41
|
+
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
42
|
+
children: [/* @__PURE__ */ i(u, {
|
|
43
|
+
className: "text-sm font-medium",
|
|
44
|
+
children: "Total Teams"
|
|
45
|
+
}), /* @__PURE__ */ i(r, { className: "h-4 w-4 text-text-secondary" })]
|
|
46
|
+
}), /* @__PURE__ */ i(c, { children: /* @__PURE__ */ i("div", {
|
|
47
|
+
className: "text-2xl font-bold tabular-nums",
|
|
48
|
+
children: m.length
|
|
49
|
+
}) })]
|
|
50
|
+
}),
|
|
51
|
+
/* @__PURE__ */ a(d, {
|
|
52
|
+
treatment: "metric",
|
|
53
|
+
className: "border-border-seam",
|
|
54
|
+
children: [/* @__PURE__ */ a(l, {
|
|
55
|
+
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
56
|
+
children: [/* @__PURE__ */ i(u, {
|
|
57
|
+
className: "text-sm font-medium",
|
|
58
|
+
children: "Total Members"
|
|
59
|
+
}), /* @__PURE__ */ i(r, { className: "h-4 w-4 text-text-secondary" })]
|
|
60
|
+
}), /* @__PURE__ */ i(c, { children: /* @__PURE__ */ i("div", {
|
|
61
|
+
className: "text-2xl font-bold tabular-nums",
|
|
62
|
+
children: m.reduce((e, t) => e + t.memberCount, 0)
|
|
63
|
+
}) })]
|
|
64
|
+
}),
|
|
65
|
+
/* @__PURE__ */ a(d, {
|
|
66
|
+
treatment: "metric",
|
|
67
|
+
className: "border-border-seam",
|
|
68
|
+
children: [/* @__PURE__ */ a(l, {
|
|
69
|
+
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
70
|
+
children: [/* @__PURE__ */ i(u, {
|
|
71
|
+
className: "text-sm font-medium",
|
|
72
|
+
children: "Active Projects"
|
|
73
|
+
}), /* @__PURE__ */ i(n, { className: "h-4 w-4 text-text-secondary" })]
|
|
74
|
+
}), /* @__PURE__ */ i(c, { children: /* @__PURE__ */ i("div", {
|
|
75
|
+
className: "text-2xl font-bold tabular-nums",
|
|
76
|
+
children: _.reduce((e, t) => e + t.activeProjects, 0)
|
|
77
|
+
}) })]
|
|
78
|
+
})
|
|
59
79
|
]
|
|
60
80
|
}),
|
|
61
81
|
/* @__PURE__ */ a(s, { children: [/* @__PURE__ */ i(l, { children: /* @__PURE__ */ i(u, { children: "Team Size Comparison" }) }), /* @__PURE__ */ i(c, {
|
|
62
82
|
className: "space-y-3",
|
|
63
|
-
children:
|
|
83
|
+
children: m.sort((e, t) => t.memberCount - e.memberCount).map((e) => /* @__PURE__ */ a("div", {
|
|
64
84
|
className: "flex items-center gap-3",
|
|
65
85
|
children: [
|
|
66
86
|
/* @__PURE__ */ i("span", {
|
|
@@ -71,7 +91,7 @@ function d() {
|
|
|
71
91
|
className: "flex-1 h-4 bg-bg-sunken rounded overflow-hidden",
|
|
72
92
|
children: /* @__PURE__ */ i("div", {
|
|
73
93
|
className: "h-4 bg-action-primary-bg rounded",
|
|
74
|
-
style: { width: `${Math.round(e.memberCount /
|
|
94
|
+
style: { width: `${Math.round(e.memberCount / v * 100)}%` }
|
|
75
95
|
})
|
|
76
96
|
}),
|
|
77
97
|
/* @__PURE__ */ i("span", {
|
|
@@ -99,7 +119,7 @@ function d() {
|
|
|
99
119
|
children: "Status"
|
|
100
120
|
})
|
|
101
121
|
]
|
|
102
|
-
}),
|
|
122
|
+
}), _.map((e) => /* @__PURE__ */ a("div", {
|
|
103
123
|
className: "grid grid-cols-5 gap-2 py-2 border-b last:border-0 text-sm",
|
|
104
124
|
children: [
|
|
105
125
|
/* @__PURE__ */ i("span", {
|
|
@@ -112,7 +132,7 @@ function d() {
|
|
|
112
132
|
}),
|
|
113
133
|
/* @__PURE__ */ a("div", {
|
|
114
134
|
className: "flex items-center justify-center gap-1",
|
|
115
|
-
children: [/* @__PURE__ */ i(t, { className: "h-3 w-3 text-
|
|
135
|
+
children: [/* @__PURE__ */ i(t, { className: "h-3 w-3 text-status-warning-text" }), e.avgPerf]
|
|
116
136
|
}),
|
|
117
137
|
/* @__PURE__ */ a("span", {
|
|
118
138
|
className: "text-right",
|
|
@@ -136,6 +156,6 @@ function d() {
|
|
|
136
156
|
});
|
|
137
157
|
}
|
|
138
158
|
//#endregion
|
|
139
|
-
export {
|
|
159
|
+
export { m as TeamsTeamAnalyticsPagePage };
|
|
140
160
|
|
|
141
161
|
//# 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
|
|
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 { BarChart3, 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,85 +1,123 @@
|
|
|
1
1
|
import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
2
|
+
import { BarChart3 as t, Calendar as n, FolderKanban as r, Settings as i, Star as a, Users as o } from "lucide-react";
|
|
3
|
+
import { useNavigate as s } from "react-router-dom";
|
|
4
|
+
import { Fragment as c, jsx as l, jsxs as u } from "react/jsx-runtime";
|
|
5
|
+
import { Badge as d, Card as f, CardContent as p, CardHeader as m, CardTitle as h, EmphasisPanel as g, GradientText as _, IllustratedEmptyState as v, NextSteps as y, PagePurpose as b } from "@burdenoff/fe-libs/ui";
|
|
5
6
|
//#region src/crewfoundry/pages/TeamsTeamDetailPagePage.tsx
|
|
6
|
-
function
|
|
7
|
-
let { teams:
|
|
8
|
-
if (!
|
|
9
|
-
className: "p-6
|
|
10
|
-
children:
|
|
7
|
+
function x() {
|
|
8
|
+
let x = s(), { teams: S, employees: C, projects: w } = e(), T = S[0];
|
|
9
|
+
if (!T) return /* @__PURE__ */ l("div", {
|
|
10
|
+
className: "p-6",
|
|
11
|
+
children: /* @__PURE__ */ l(v, {
|
|
12
|
+
illustration: "empty-search",
|
|
13
|
+
title: "Team not found",
|
|
14
|
+
description: "This team is no longer available."
|
|
15
|
+
})
|
|
11
16
|
});
|
|
12
|
-
let
|
|
13
|
-
return /* @__PURE__ */
|
|
17
|
+
let E = C.filter((e) => T.members.includes(e.id)), D = w.filter((e) => e.teamId === T.id);
|
|
18
|
+
return /* @__PURE__ */ u("div", {
|
|
14
19
|
className: "space-y-6 p-6 max-w-4xl",
|
|
15
20
|
children: [
|
|
16
|
-
/* @__PURE__ */
|
|
21
|
+
/* @__PURE__ */ u("div", {
|
|
17
22
|
className: "flex items-center justify-between",
|
|
18
|
-
children: [/* @__PURE__ */
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
23
|
+
children: [/* @__PURE__ */ u("div", { children: [
|
|
24
|
+
/* @__PURE__ */ l("h1", {
|
|
25
|
+
className: "text-2xl font-semibold",
|
|
26
|
+
children: /* @__PURE__ */ l(_, { children: T.name })
|
|
27
|
+
}),
|
|
28
|
+
/* @__PURE__ */ l("p", {
|
|
29
|
+
className: "text-sm text-text-secondary",
|
|
30
|
+
children: T.description
|
|
31
|
+
}),
|
|
32
|
+
/* @__PURE__ */ l(b, {
|
|
33
|
+
className: "mt-2",
|
|
34
|
+
children: "A complete view of one team — who's on it, what they're working on, and how they're performing — so you can support the group and keep its projects on track."
|
|
35
|
+
})
|
|
36
|
+
] }), /* @__PURE__ */ l(d, {
|
|
37
|
+
variant: T.status === "active" ? "default" : "secondary",
|
|
38
|
+
children: T.status
|
|
27
39
|
})]
|
|
28
40
|
}),
|
|
29
|
-
/* @__PURE__ */
|
|
41
|
+
/* @__PURE__ */ l(y, {
|
|
42
|
+
storageKey: "crewfoundry-team-details",
|
|
43
|
+
steps: [
|
|
44
|
+
{
|
|
45
|
+
id: "analytics",
|
|
46
|
+
label: "View team analytics",
|
|
47
|
+
description: "See productivity and workload trends for this team.",
|
|
48
|
+
icon: /* @__PURE__ */ l(t, { className: "h-4 w-4" }),
|
|
49
|
+
onClick: () => x("../../teams/team-analytics-page")
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
id: "settings",
|
|
53
|
+
label: "Adjust team settings",
|
|
54
|
+
description: "Manage membership, permissions, and preferences.",
|
|
55
|
+
icon: /* @__PURE__ */ l(i, { className: "h-4 w-4" }),
|
|
56
|
+
onClick: () => x("../../teams/team-settings-page")
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
id: "directory",
|
|
60
|
+
label: "Browse all teams",
|
|
61
|
+
description: "Explore how the rest of the organization is structured.",
|
|
62
|
+
icon: /* @__PURE__ */ l(o, { className: "h-4 w-4" }),
|
|
63
|
+
onClick: () => x("../../teams/team-directory-page")
|
|
64
|
+
}
|
|
65
|
+
]
|
|
66
|
+
}),
|
|
67
|
+
/* @__PURE__ */ u("div", {
|
|
30
68
|
className: "grid gap-4 md:grid-cols-4",
|
|
31
69
|
children: [
|
|
32
|
-
/* @__PURE__ */
|
|
70
|
+
/* @__PURE__ */ l(f, { children: /* @__PURE__ */ u(p, {
|
|
33
71
|
className: "p-4 text-center",
|
|
34
72
|
children: [
|
|
35
|
-
/* @__PURE__ */
|
|
36
|
-
/* @__PURE__ */
|
|
73
|
+
/* @__PURE__ */ l(o, { className: "h-5 w-5 mx-auto text-text-secondary mb-1" }),
|
|
74
|
+
/* @__PURE__ */ l("p", {
|
|
37
75
|
className: "text-lg font-bold",
|
|
38
|
-
children:
|
|
76
|
+
children: T.memberCount
|
|
39
77
|
}),
|
|
40
|
-
/* @__PURE__ */
|
|
78
|
+
/* @__PURE__ */ l("p", {
|
|
41
79
|
className: "text-xs text-text-secondary",
|
|
42
80
|
children: "Members"
|
|
43
81
|
})
|
|
44
82
|
]
|
|
45
83
|
}) }),
|
|
46
|
-
/* @__PURE__ */
|
|
84
|
+
/* @__PURE__ */ l(f, { children: /* @__PURE__ */ u(p, {
|
|
47
85
|
className: "p-4 text-center",
|
|
48
86
|
children: [
|
|
49
|
-
/* @__PURE__ */
|
|
50
|
-
/* @__PURE__ */
|
|
87
|
+
/* @__PURE__ */ l(r, { className: "h-5 w-5 mx-auto text-text-secondary mb-1" }),
|
|
88
|
+
/* @__PURE__ */ l("p", {
|
|
51
89
|
className: "text-lg font-bold",
|
|
52
|
-
children:
|
|
90
|
+
children: T.projectCount
|
|
53
91
|
}),
|
|
54
|
-
/* @__PURE__ */
|
|
92
|
+
/* @__PURE__ */ l("p", {
|
|
55
93
|
className: "text-xs text-text-secondary",
|
|
56
94
|
children: "Projects"
|
|
57
95
|
})
|
|
58
96
|
]
|
|
59
97
|
}) }),
|
|
60
|
-
/* @__PURE__ */
|
|
98
|
+
/* @__PURE__ */ l(f, { children: /* @__PURE__ */ u(p, {
|
|
61
99
|
className: "p-4 text-center",
|
|
62
100
|
children: [
|
|
63
|
-
/* @__PURE__ */ a
|
|
64
|
-
/* @__PURE__ */
|
|
101
|
+
/* @__PURE__ */ l(a, { className: "h-5 w-5 mx-auto text-status-warning-text mb-1" }),
|
|
102
|
+
/* @__PURE__ */ l("p", {
|
|
65
103
|
className: "text-lg font-bold",
|
|
66
|
-
children:
|
|
104
|
+
children: T.leadName
|
|
67
105
|
}),
|
|
68
|
-
/* @__PURE__ */
|
|
106
|
+
/* @__PURE__ */ l("p", {
|
|
69
107
|
className: "text-xs text-text-secondary",
|
|
70
108
|
children: "Lead"
|
|
71
109
|
})
|
|
72
110
|
]
|
|
73
111
|
}) }),
|
|
74
|
-
/* @__PURE__ */
|
|
112
|
+
/* @__PURE__ */ l(f, { children: /* @__PURE__ */ u(p, {
|
|
75
113
|
className: "p-4 text-center",
|
|
76
114
|
children: [
|
|
77
|
-
/* @__PURE__ */
|
|
78
|
-
/* @__PURE__ */
|
|
115
|
+
/* @__PURE__ */ l(n, { className: "h-5 w-5 mx-auto text-text-secondary mb-1" }),
|
|
116
|
+
/* @__PURE__ */ l("p", {
|
|
79
117
|
className: "text-lg font-bold",
|
|
80
|
-
children:
|
|
118
|
+
children: T.createdAt
|
|
81
119
|
}),
|
|
82
|
-
/* @__PURE__ */
|
|
120
|
+
/* @__PURE__ */ l("p", {
|
|
83
121
|
className: "text-xs text-text-secondary",
|
|
84
122
|
children: "Created"
|
|
85
123
|
})
|
|
@@ -87,24 +125,31 @@ function f() {
|
|
|
87
125
|
}) })
|
|
88
126
|
]
|
|
89
127
|
}),
|
|
90
|
-
/* @__PURE__ */
|
|
128
|
+
/* @__PURE__ */ u(g, { children: [/* @__PURE__ */ l("div", {
|
|
129
|
+
className: "mb-2 text-lg font-semibold",
|
|
130
|
+
children: "Team Members"
|
|
131
|
+
}), E.length === 0 ? /* @__PURE__ */ l(v, {
|
|
132
|
+
illustration: "empty-people",
|
|
133
|
+
title: "No members yet",
|
|
134
|
+
description: "Add people to this team to start collaborating."
|
|
135
|
+
}) : /* @__PURE__ */ u(c, { children: [/* @__PURE__ */ u("div", {
|
|
91
136
|
className: "grid grid-cols-4 gap-2 text-xs font-medium text-text-secondary border-b pb-2 mb-2",
|
|
92
137
|
children: [
|
|
93
|
-
/* @__PURE__ */
|
|
94
|
-
/* @__PURE__ */
|
|
95
|
-
/* @__PURE__ */
|
|
138
|
+
/* @__PURE__ */ l("span", { children: "Name" }),
|
|
139
|
+
/* @__PURE__ */ l("span", { children: "Position" }),
|
|
140
|
+
/* @__PURE__ */ l("span", {
|
|
96
141
|
className: "text-center",
|
|
97
142
|
children: "Performance"
|
|
98
143
|
}),
|
|
99
|
-
/* @__PURE__ */
|
|
144
|
+
/* @__PURE__ */ l("span", {
|
|
100
145
|
className: "text-center",
|
|
101
146
|
children: "Status"
|
|
102
147
|
})
|
|
103
148
|
]
|
|
104
|
-
}),
|
|
149
|
+
}), E.map((e) => /* @__PURE__ */ u("div", {
|
|
105
150
|
className: "grid grid-cols-4 gap-2 py-2 border-b last:border-0 text-sm",
|
|
106
151
|
children: [
|
|
107
|
-
/* @__PURE__ */
|
|
152
|
+
/* @__PURE__ */ u("span", {
|
|
108
153
|
className: "font-medium",
|
|
109
154
|
children: [
|
|
110
155
|
e.firstName,
|
|
@@ -112,17 +157,17 @@ function f() {
|
|
|
112
157
|
e.lastName
|
|
113
158
|
]
|
|
114
159
|
}),
|
|
115
|
-
/* @__PURE__ */
|
|
160
|
+
/* @__PURE__ */ l("span", {
|
|
116
161
|
className: "text-text-secondary",
|
|
117
162
|
children: e.position
|
|
118
163
|
}),
|
|
119
|
-
/* @__PURE__ */
|
|
164
|
+
/* @__PURE__ */ u("div", {
|
|
120
165
|
className: "text-center flex items-center justify-center gap-1",
|
|
121
|
-
children: [/* @__PURE__ */ a
|
|
166
|
+
children: [/* @__PURE__ */ l(a, { className: "h-3 w-3 text-status-warning-text" }), e.performanceScore]
|
|
122
167
|
}),
|
|
123
|
-
/* @__PURE__ */
|
|
168
|
+
/* @__PURE__ */ l("div", {
|
|
124
169
|
className: "text-center",
|
|
125
|
-
children: /* @__PURE__ */
|
|
170
|
+
children: /* @__PURE__ */ l(d, {
|
|
126
171
|
variant: e.status === "active" ? "default" : "secondary",
|
|
127
172
|
className: "text-[10px]",
|
|
128
173
|
children: e.status
|
|
@@ -130,35 +175,35 @@ function f() {
|
|
|
130
175
|
})
|
|
131
176
|
]
|
|
132
177
|
}, e.id))] })] }),
|
|
133
|
-
|
|
178
|
+
D.length > 0 && /* @__PURE__ */ u(f, { children: [/* @__PURE__ */ l(m, { children: /* @__PURE__ */ l(h, { children: "Team Projects" }) }), /* @__PURE__ */ l(p, {
|
|
134
179
|
className: "space-y-3",
|
|
135
|
-
children:
|
|
180
|
+
children: D.map((e) => /* @__PURE__ */ u("div", {
|
|
136
181
|
className: "flex items-center justify-between rounded border p-3",
|
|
137
|
-
children: [/* @__PURE__ */
|
|
182
|
+
children: [/* @__PURE__ */ u("div", { children: [/* @__PURE__ */ l("p", {
|
|
138
183
|
className: "text-sm font-medium",
|
|
139
184
|
children: e.name
|
|
140
|
-
}), /* @__PURE__ */
|
|
185
|
+
}), /* @__PURE__ */ u("p", {
|
|
141
186
|
className: "text-xs text-text-secondary",
|
|
142
187
|
children: [
|
|
143
188
|
e.startDate,
|
|
144
189
|
" — ",
|
|
145
190
|
e.endDate
|
|
146
191
|
]
|
|
147
|
-
})] }), /* @__PURE__ */
|
|
192
|
+
})] }), /* @__PURE__ */ u("div", {
|
|
148
193
|
className: "flex items-center gap-2",
|
|
149
194
|
children: [
|
|
150
|
-
/* @__PURE__ */
|
|
195
|
+
/* @__PURE__ */ l("div", {
|
|
151
196
|
className: "w-24 h-2 bg-bg-sunken rounded overflow-hidden",
|
|
152
|
-
children: /* @__PURE__ */
|
|
197
|
+
children: /* @__PURE__ */ l("div", {
|
|
153
198
|
className: "h-2 bg-action-primary-bg rounded",
|
|
154
199
|
style: { width: `${e.progress}%` }
|
|
155
200
|
})
|
|
156
201
|
}),
|
|
157
|
-
/* @__PURE__ */
|
|
202
|
+
/* @__PURE__ */ u("span", {
|
|
158
203
|
className: "text-xs",
|
|
159
204
|
children: [e.progress, "%"]
|
|
160
205
|
}),
|
|
161
|
-
/* @__PURE__ */
|
|
206
|
+
/* @__PURE__ */ l(d, {
|
|
162
207
|
variant: e.status === "active" ? "default" : "secondary",
|
|
163
208
|
className: "text-[10px]",
|
|
164
209
|
children: e.status
|
|
@@ -171,6 +216,6 @@ function f() {
|
|
|
171
216
|
});
|
|
172
217
|
}
|
|
173
218
|
//#endregion
|
|
174
|
-
export {
|
|
219
|
+
export { x as TeamsTeamDetailPagePage };
|
|
175
220
|
|
|
176
221
|
//# sourceMappingURL=TeamsTeamDetailPagePage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TeamsTeamDetailPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/TeamsTeamDetailPagePage.tsx"],"sourcesContent":["import {\n Badge,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n} from '@burdenoff/fe-libs/ui';\nimport { Calendar, FolderKanban, Star, Users } from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\nexport function TeamsTeamDetailPagePage() {\n const { teams, employees, projects } = useCrewFoundryStore();\n const team = teams[0];\n if (!team) return <div className=\"p-6 text-text-secondary\">No team found.</div>;\n const teamMembers = employees.filter((e) => team.members.includes(e.id));\n const teamProjects = projects.filter((p) => p.teamId === team.id);\n\n return (\n <div className=\"space-y-6 p-6 max-w-4xl\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold\">{team.name}</h1>\n <p className=\"text-sm text-text-secondary\">{team.description}</p>\n </div>\n <Badge variant={team.status === 'active' ? 'default' : 'secondary'}>{team.status}</Badge>\n </div>\n <div className=\"grid gap-4 md:grid-cols-4\">\n <Card>\n <CardContent className=\"p-4 text-center\">\n <Users className=\"h-5 w-5 mx-auto text-text-secondary mb-1\" />\n <p className=\"text-lg font-bold\">{team.memberCount}</p>\n <p className=\"text-xs text-text-secondary\">Members</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"p-4 text-center\">\n <FolderKanban className=\"h-5 w-5 mx-auto text-text-secondary mb-1\" />\n <p className=\"text-lg font-bold\">{team.projectCount}</p>\n <p className=\"text-xs text-text-secondary\">Projects</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"p-4 text-center\">\n <Star className=\"h-5 w-5 mx-auto text-yellow-500 mb-1\" />\n <p className=\"text-lg font-bold\">{team.leadName}</p>\n <p className=\"text-xs text-text-secondary\">Lead</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"p-4 text-center\">\n <Calendar className=\"h-5 w-5 mx-auto text-text-secondary mb-1\" />\n <p className=\"text-lg font-bold\">{team.createdAt}</p>\n <p className=\"text-xs text-text-secondary\">Created</p>\n </CardContent>\n </Card>\n </div>\n <Card>\n <CardHeader>\n <CardTitle>Team Members</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-4 gap-2 text-xs font-medium text-text-secondary border-b pb-2 mb-2\">\n <span>Name</span>\n <span>Position</span>\n <span className=\"text-center\">Performance</span>\n <span className=\"text-center\">Status</span>\n </div>\n {teamMembers.map((emp) => (\n <div\n key={emp.id}\n className=\"grid grid-cols-4 gap-2 py-2 border-b last:border-0 text-sm\"\n >\n <span className=\"font-medium\">\n {emp.firstName} {emp.lastName}\n </span>\n <span className=\"text-text-secondary\">{emp.position}</span>\n <div className=\"text-center flex items-center justify-center gap-1\">\n <Star className=\"h-3 w-3 text-yellow-500\" />\n {emp.performanceScore}\n </div>\n <div className=\"text-center\">\n <Badge\n variant={emp.status === 'active' ? 'default' : 'secondary'}\n className=\"text-[10px]\"\n >\n {emp.status}\n </Badge>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n {teamProjects.length > 0 && (\n <Card>\n <CardHeader>\n <CardTitle>Team Projects</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {teamProjects.map((p) => (\n <div key={p.id} className=\"flex items-center justify-between rounded border p-3\">\n <div>\n <p className=\"text-sm font-medium\">{p.name}</p>\n <p className=\"text-xs text-text-secondary\">\n {p.startDate} — {p.endDate}\n </p>\n </div>\n <div className=\"flex items-center gap-2\">\n <div className=\"w-24 h-2 bg-bg-sunken rounded overflow-hidden\">\n <div className=\"h-2 bg-action-primary-bg rounded\" style={{ width: `${p.progress}%` }} />\n </div>\n <span className=\"text-xs\">{p.progress}%</span>\n <Badge\n variant={p.status === 'active' ? 'default' : 'secondary'}\n className=\"text-[10px]\"\n >\n {p.status}\n </Badge>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TeamsTeamDetailPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/TeamsTeamDetailPagePage.tsx"],"sourcesContent":["import {\n Badge,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n EmphasisPanel,\n GradientText,\n IllustratedEmptyState,\n NextSteps,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport { BarChart3, Calendar, FolderKanban, Settings, Star, Users } from 'lucide-react';\nimport { useNavigate } from 'react-router-dom';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\nexport function TeamsTeamDetailPagePage() {\n const navigate = useNavigate();\n const { teams, employees, projects } = useCrewFoundryStore();\n const team = teams[0];\n if (!team)\n return (\n <div className=\"p-6\">\n <IllustratedEmptyState\n illustration=\"empty-search\"\n title=\"Team not found\"\n description=\"This team is no longer available.\"\n />\n </div>\n );\n const teamMembers = employees.filter((e) => team.members.includes(e.id));\n const teamProjects = projects.filter((p) => p.teamId === team.id);\n\n return (\n <div className=\"space-y-6 p-6 max-w-4xl\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>{team.name}</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">{team.description}</p>\n <PagePurpose className=\"mt-2\">\n A complete view of one team — who's on it, what they're working on, and how\n they're performing — so you can support the group and keep its projects on track.\n </PagePurpose>\n </div>\n <Badge variant={team.status === 'active' ? 'default' : 'secondary'}>{team.status}</Badge>\n </div>\n\n <NextSteps\n storageKey=\"crewfoundry-team-details\"\n steps={[\n {\n id: 'analytics',\n label: 'View team analytics',\n description: 'See productivity and workload trends for this team.',\n icon: <BarChart3 className=\"h-4 w-4\" />,\n onClick: () => navigate('../../teams/team-analytics-page'),\n },\n {\n id: 'settings',\n label: 'Adjust team settings',\n description: 'Manage membership, permissions, and preferences.',\n icon: <Settings className=\"h-4 w-4\" />,\n onClick: () => navigate('../../teams/team-settings-page'),\n },\n {\n id: 'directory',\n label: 'Browse all teams',\n description: 'Explore how the rest of the organization is structured.',\n icon: <Users className=\"h-4 w-4\" />,\n onClick: () => navigate('../../teams/team-directory-page'),\n },\n ]}\n />\n\n <div className=\"grid gap-4 md:grid-cols-4\">\n <Card>\n <CardContent className=\"p-4 text-center\">\n <Users className=\"h-5 w-5 mx-auto text-text-secondary mb-1\" />\n <p className=\"text-lg font-bold\">{team.memberCount}</p>\n <p className=\"text-xs text-text-secondary\">Members</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"p-4 text-center\">\n <FolderKanban className=\"h-5 w-5 mx-auto text-text-secondary mb-1\" />\n <p className=\"text-lg font-bold\">{team.projectCount}</p>\n <p className=\"text-xs text-text-secondary\">Projects</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"p-4 text-center\">\n <Star className=\"h-5 w-5 mx-auto text-status-warning-text mb-1\" />\n <p className=\"text-lg font-bold\">{team.leadName}</p>\n <p className=\"text-xs text-text-secondary\">Lead</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"p-4 text-center\">\n <Calendar className=\"h-5 w-5 mx-auto text-text-secondary mb-1\" />\n <p className=\"text-lg font-bold\">{team.createdAt}</p>\n <p className=\"text-xs text-text-secondary\">Created</p>\n </CardContent>\n </Card>\n </div>\n <EmphasisPanel>\n <div className=\"mb-2 text-lg font-semibold\">Team Members</div>\n {teamMembers.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-people\"\n title=\"No members yet\"\n description=\"Add people to this team to start collaborating.\"\n />\n ) : (\n <>\n <div className=\"grid grid-cols-4 gap-2 text-xs font-medium text-text-secondary border-b pb-2 mb-2\">\n <span>Name</span>\n <span>Position</span>\n <span className=\"text-center\">Performance</span>\n <span className=\"text-center\">Status</span>\n </div>\n {teamMembers.map((emp) => (\n <div\n key={emp.id}\n className=\"grid grid-cols-4 gap-2 py-2 border-b last:border-0 text-sm\"\n >\n <span className=\"font-medium\">\n {emp.firstName} {emp.lastName}\n </span>\n <span className=\"text-text-secondary\">{emp.position}</span>\n <div className=\"text-center flex items-center justify-center gap-1\">\n <Star className=\"h-3 w-3 text-status-warning-text\" />\n {emp.performanceScore}\n </div>\n <div className=\"text-center\">\n <Badge\n variant={emp.status === 'active' ? 'default' : 'secondary'}\n className=\"text-[10px]\"\n >\n {emp.status}\n </Badge>\n </div>\n </div>\n ))}\n </>\n )}\n </EmphasisPanel>\n {teamProjects.length > 0 && (\n <Card>\n <CardHeader>\n <CardTitle>Team Projects</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {teamProjects.map((p) => (\n <div key={p.id} className=\"flex items-center justify-between rounded border p-3\">\n <div>\n <p className=\"text-sm font-medium\">{p.name}</p>\n <p className=\"text-xs text-text-secondary\">\n {p.startDate} — {p.endDate}\n </p>\n </div>\n <div className=\"flex items-center gap-2\">\n <div className=\"w-24 h-2 bg-bg-sunken rounded overflow-hidden\">\n <div\n className=\"h-2 bg-action-primary-bg rounded\"\n style={{ width: `${p.progress}%` }}\n />\n </div>\n <span className=\"text-xs\">{p.progress}%</span>\n <Badge\n variant={p.status === 'active' ? 'default' : 'secondary'}\n className=\"text-[10px]\"\n >\n {p.status}\n </Badge>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
|