@burdenoff/microfe-crewfoundry 2026.625.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 +37 -29
- package/dist/crewfoundry/pages/AdminAdminPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsAnalyticsPagePage.js +50 -42
- package/dist/crewfoundry/pages/AnalyticsAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsEmployeeAnalyticsPagePage.js +39 -31
- package/dist/crewfoundry/pages/AnalyticsEmployeeAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js +52 -44
- package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.js +46 -38
- 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 +30 -22
- 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 +86 -67
- 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 +37 -29
- package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js +29 -21
- package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyCompanyDashboardPagePage.js +25 -17
- package/dist/crewfoundry/pages/CompanyCompanyDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyCompanyProfilePagePage.js +42 -35
- 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 +41 -33
- package/dist/crewfoundry/pages/DashboardAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardDashboardPagePage.js +142 -108
- package/dist/crewfoundry/pages/DashboardDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js +177 -136
- package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardExecutiveDashboardPage.js +44 -36
- package/dist/crewfoundry/pages/DashboardExecutiveDashboardPage.js.map +1 -1
- package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.js +49 -38
- package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringApplicationsPagePage.js +26 -18
- 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 +53 -46
- package/dist/crewfoundry/pages/HiringCreateJobPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringInterviewsPagePage.js +31 -23
- package/dist/crewfoundry/pages/HiringInterviewsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js +129 -90
- package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringJobsPagePage.js +96 -85
- package/dist/crewfoundry/pages/HiringJobsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrDepartmentsPagePage.js +26 -18
- package/dist/crewfoundry/pages/HrDepartmentsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrEmployeesPagePage.js +47 -35
- package/dist/crewfoundry/pages/HrEmployeesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js +33 -25
- package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrPayrollPagePage.js +36 -28
- package/dist/crewfoundry/pages/HrPayrollPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js +27 -19
- package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js +27 -19
- 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 +111 -70
- package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js +65 -53
- package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCoursesPagePage.js +35 -19
- package/dist/crewfoundry/pages/LearningCoursesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.js +33 -25
- package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPagePage.js +26 -18
- package/dist/crewfoundry/pages/LearningLearningPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js +80 -55
- 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 +31 -23
- package/dist/crewfoundry/pages/LearningMyLearningPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js +29 -21
- package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js +35 -27
- package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js +147 -112
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js +31 -27
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js +31 -23
- 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 +75 -56
- 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 +133 -92
- package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js +93 -52
- package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsEscrowPagePage.js +28 -20
- 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 +25 -17
- 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 +41 -33
- 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 +103 -72
- 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 +28 -20
- package/dist/crewfoundry/pages/TeamsTeamAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamDetailPagePage.js +103 -62
- 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,90 +1,118 @@
|
|
|
1
1
|
import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
|
|
2
|
-
import { Calendar as t, DollarSign as n,
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
2
|
+
import { Calendar as t, DollarSign as n, FolderKanban as r, Target as i, Users as a } from "lucide-react";
|
|
3
|
+
import { useNavigate as o } from "react-router-dom";
|
|
4
|
+
import { jsx as s, jsxs as c } from "react/jsx-runtime";
|
|
5
|
+
import { Badge as l, Card as u, CardContent as d, CardHeader as f, CardTitle as p, EmphasisPanel as m, GradientText as h, IllustratedEmptyState as g, NextSteps as _, PagePurpose as v } from "@burdenoff/fe-libs/ui";
|
|
5
6
|
//#region src/crewfoundry/pages/ProjectsProjectDetailsPagePage.tsx
|
|
6
|
-
function
|
|
7
|
-
let { projects:
|
|
8
|
-
return
|
|
7
|
+
function y() {
|
|
8
|
+
let y = o(), { projects: b } = e(), x = b[1];
|
|
9
|
+
return x ? /* @__PURE__ */ c("div", {
|
|
9
10
|
className: "space-y-6 p-6 max-w-4xl",
|
|
10
11
|
children: [
|
|
11
|
-
/* @__PURE__ */
|
|
12
|
+
/* @__PURE__ */ c("div", {
|
|
12
13
|
className: "flex items-center justify-between",
|
|
13
|
-
children: [/* @__PURE__ */
|
|
14
|
+
children: [/* @__PURE__ */ c("div", { children: [/* @__PURE__ */ s("h1", {
|
|
14
15
|
className: "text-2xl font-semibold",
|
|
15
|
-
children: /* @__PURE__ */
|
|
16
|
-
}), /* @__PURE__ */
|
|
16
|
+
children: /* @__PURE__ */ s(h, { children: x.name })
|
|
17
|
+
}), /* @__PURE__ */ s("p", {
|
|
17
18
|
className: "text-sm text-text-secondary",
|
|
18
|
-
children:
|
|
19
|
-
})] }), /* @__PURE__ */
|
|
19
|
+
children: x.description
|
|
20
|
+
})] }), /* @__PURE__ */ c("div", {
|
|
20
21
|
className: "flex gap-1",
|
|
21
|
-
children: [/* @__PURE__ */
|
|
22
|
-
variant:
|
|
23
|
-
children:
|
|
24
|
-
}), /* @__PURE__ */
|
|
25
|
-
variant:
|
|
26
|
-
children:
|
|
22
|
+
children: [/* @__PURE__ */ s(l, {
|
|
23
|
+
variant: x.priority === "critical" ? "destructive" : "default",
|
|
24
|
+
children: x.priority
|
|
25
|
+
}), /* @__PURE__ */ s(l, {
|
|
26
|
+
variant: x.status === "active" ? "default" : "secondary",
|
|
27
|
+
children: x.status
|
|
27
28
|
})]
|
|
28
29
|
})]
|
|
29
30
|
}),
|
|
30
|
-
/* @__PURE__ */
|
|
31
|
+
/* @__PURE__ */ s(v, { children: "Track a single project end-to-end — progress, budget, team, and timeline in one place — so you can spot risks early and keep delivery on schedule and on budget." }),
|
|
32
|
+
/* @__PURE__ */ s(_, {
|
|
33
|
+
storageKey: "crewfoundry-project-details",
|
|
34
|
+
steps: [
|
|
35
|
+
{
|
|
36
|
+
id: "all-projects",
|
|
37
|
+
label: "View all projects",
|
|
38
|
+
description: "See how this project compares across your portfolio.",
|
|
39
|
+
icon: /* @__PURE__ */ s(r, { className: "h-4 w-4" }),
|
|
40
|
+
onClick: () => y("../../projects/projects-page")
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
id: "team",
|
|
44
|
+
label: "Check the team",
|
|
45
|
+
description: "Review who is working on this and their workload.",
|
|
46
|
+
icon: /* @__PURE__ */ s(a, { className: "h-4 w-4" }),
|
|
47
|
+
onClick: () => y("../../teams/teams-page")
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
id: "new-project",
|
|
51
|
+
label: "Start a new project",
|
|
52
|
+
description: "Kick off the next piece of work.",
|
|
53
|
+
icon: /* @__PURE__ */ s(i, { className: "h-4 w-4" }),
|
|
54
|
+
onClick: () => y("../../projects/create-project-page")
|
|
55
|
+
}
|
|
56
|
+
]
|
|
57
|
+
}),
|
|
58
|
+
/* @__PURE__ */ c("div", {
|
|
31
59
|
className: "grid gap-4 md:grid-cols-4",
|
|
32
60
|
children: [
|
|
33
|
-
/* @__PURE__ */
|
|
61
|
+
/* @__PURE__ */ s(u, { children: /* @__PURE__ */ c(d, {
|
|
34
62
|
className: "p-4 text-center",
|
|
35
63
|
children: [
|
|
36
|
-
/* @__PURE__ */
|
|
37
|
-
/* @__PURE__ */
|
|
64
|
+
/* @__PURE__ */ s(i, { className: "h-5 w-5 mx-auto text-text-secondary mb-1" }),
|
|
65
|
+
/* @__PURE__ */ c("p", {
|
|
38
66
|
className: "text-lg font-bold",
|
|
39
|
-
children: [
|
|
67
|
+
children: [x.progress, "%"]
|
|
40
68
|
}),
|
|
41
|
-
/* @__PURE__ */
|
|
69
|
+
/* @__PURE__ */ s("p", {
|
|
42
70
|
className: "text-xs text-text-secondary",
|
|
43
71
|
children: "Progress"
|
|
44
72
|
})
|
|
45
73
|
]
|
|
46
74
|
}) }),
|
|
47
|
-
/* @__PURE__ */
|
|
75
|
+
/* @__PURE__ */ s(u, { children: /* @__PURE__ */ c(d, {
|
|
48
76
|
className: "p-4 text-center",
|
|
49
77
|
children: [
|
|
50
|
-
/* @__PURE__ */
|
|
51
|
-
/* @__PURE__ */
|
|
78
|
+
/* @__PURE__ */ s(n, { className: "h-5 w-5 mx-auto text-text-secondary mb-1" }),
|
|
79
|
+
/* @__PURE__ */ c("p", {
|
|
52
80
|
className: "text-lg font-bold",
|
|
53
81
|
children: [
|
|
54
82
|
"$",
|
|
55
|
-
(
|
|
83
|
+
(x.budget / 1e3).toFixed(0),
|
|
56
84
|
"K"
|
|
57
85
|
]
|
|
58
86
|
}),
|
|
59
|
-
/* @__PURE__ */
|
|
87
|
+
/* @__PURE__ */ s("p", {
|
|
60
88
|
className: "text-xs text-text-secondary",
|
|
61
89
|
children: "Budget"
|
|
62
90
|
})
|
|
63
91
|
]
|
|
64
92
|
}) }),
|
|
65
|
-
/* @__PURE__ */
|
|
93
|
+
/* @__PURE__ */ s(u, { children: /* @__PURE__ */ c(d, {
|
|
66
94
|
className: "p-4 text-center",
|
|
67
95
|
children: [
|
|
68
|
-
/* @__PURE__ */ a
|
|
69
|
-
/* @__PURE__ */
|
|
96
|
+
/* @__PURE__ */ s(a, { className: "h-5 w-5 mx-auto text-text-secondary mb-1" }),
|
|
97
|
+
/* @__PURE__ */ s("p", {
|
|
70
98
|
className: "text-lg font-bold",
|
|
71
|
-
children:
|
|
99
|
+
children: x.teamName
|
|
72
100
|
}),
|
|
73
|
-
/* @__PURE__ */
|
|
101
|
+
/* @__PURE__ */ s("p", {
|
|
74
102
|
className: "text-xs text-text-secondary",
|
|
75
103
|
children: "Team"
|
|
76
104
|
})
|
|
77
105
|
]
|
|
78
106
|
}) }),
|
|
79
|
-
/* @__PURE__ */
|
|
107
|
+
/* @__PURE__ */ s(u, { children: /* @__PURE__ */ c(d, {
|
|
80
108
|
className: "p-4 text-center",
|
|
81
109
|
children: [
|
|
82
|
-
/* @__PURE__ */
|
|
83
|
-
/* @__PURE__ */
|
|
110
|
+
/* @__PURE__ */ s(t, { className: "h-5 w-5 mx-auto text-text-secondary mb-1" }),
|
|
111
|
+
/* @__PURE__ */ s("p", {
|
|
84
112
|
className: "text-lg font-bold",
|
|
85
|
-
children:
|
|
113
|
+
children: x.endDate
|
|
86
114
|
}),
|
|
87
|
-
/* @__PURE__ */
|
|
115
|
+
/* @__PURE__ */ s("p", {
|
|
88
116
|
className: "text-xs text-text-secondary",
|
|
89
117
|
children: "Deadline"
|
|
90
118
|
})
|
|
@@ -92,69 +120,72 @@ function m() {
|
|
|
92
120
|
}) })
|
|
93
121
|
]
|
|
94
122
|
}),
|
|
95
|
-
/* @__PURE__ */
|
|
123
|
+
/* @__PURE__ */ c(m, { children: [/* @__PURE__ */ s("div", {
|
|
124
|
+
className: "mb-2 text-lg font-semibold",
|
|
125
|
+
children: "Task Progress"
|
|
126
|
+
}), /* @__PURE__ */ c("div", {
|
|
96
127
|
className: "space-y-2",
|
|
97
|
-
children: [/* @__PURE__ */
|
|
128
|
+
children: [/* @__PURE__ */ c("div", {
|
|
98
129
|
className: "flex justify-between text-sm",
|
|
99
|
-
children: [/* @__PURE__ */
|
|
100
|
-
|
|
130
|
+
children: [/* @__PURE__ */ c("span", { children: [
|
|
131
|
+
x.completedTasks,
|
|
101
132
|
" of ",
|
|
102
|
-
|
|
133
|
+
x.tasks,
|
|
103
134
|
" tasks completed"
|
|
104
|
-
] }), /* @__PURE__ */
|
|
135
|
+
] }), /* @__PURE__ */ c("span", {
|
|
105
136
|
className: "font-medium",
|
|
106
|
-
children: [
|
|
137
|
+
children: [x.progress, "%"]
|
|
107
138
|
})]
|
|
108
|
-
}), /* @__PURE__ */
|
|
139
|
+
}), /* @__PURE__ */ s("div", {
|
|
109
140
|
className: "h-3 bg-bg-sunken rounded overflow-hidden",
|
|
110
|
-
children: /* @__PURE__ */
|
|
141
|
+
children: /* @__PURE__ */ s("div", {
|
|
111
142
|
className: "h-3 bg-action-primary-bg rounded",
|
|
112
|
-
style: { width: `${
|
|
143
|
+
style: { width: `${x.progress}%` }
|
|
113
144
|
})
|
|
114
145
|
})]
|
|
115
|
-
})
|
|
116
|
-
/* @__PURE__ */
|
|
146
|
+
})] }),
|
|
147
|
+
/* @__PURE__ */ c(u, { children: [/* @__PURE__ */ s(f, { children: /* @__PURE__ */ s(p, { children: "Budget Tracking" }) }), /* @__PURE__ */ c(d, { children: [/* @__PURE__ */ c("div", {
|
|
117
148
|
className: "space-y-2",
|
|
118
|
-
children: [/* @__PURE__ */
|
|
149
|
+
children: [/* @__PURE__ */ c("div", {
|
|
119
150
|
className: "flex justify-between text-sm",
|
|
120
|
-
children: [/* @__PURE__ */
|
|
151
|
+
children: [/* @__PURE__ */ c("span", { children: [
|
|
121
152
|
"Spent $",
|
|
122
|
-
(
|
|
153
|
+
(x.spent / 1e3).toFixed(0),
|
|
123
154
|
"K of $",
|
|
124
|
-
(
|
|
155
|
+
(x.budget / 1e3).toFixed(0),
|
|
125
156
|
"K"
|
|
126
|
-
] }), /* @__PURE__ */
|
|
157
|
+
] }), /* @__PURE__ */ c("span", {
|
|
127
158
|
className: "font-medium",
|
|
128
|
-
children: [Math.round(
|
|
159
|
+
children: [Math.round(x.spent / x.budget * 100), "%"]
|
|
129
160
|
})]
|
|
130
|
-
}), /* @__PURE__ */
|
|
161
|
+
}), /* @__PURE__ */ s("div", {
|
|
131
162
|
className: "h-3 bg-bg-sunken rounded overflow-hidden",
|
|
132
|
-
children: /* @__PURE__ */
|
|
133
|
-
className: `h-3 rounded ${
|
|
134
|
-
style: { width: `${Math.round(
|
|
163
|
+
children: /* @__PURE__ */ s("div", {
|
|
164
|
+
className: `h-3 rounded ${x.spent / x.budget > .9 ? "bg-status-error-text" : "bg-status-success-text"}`,
|
|
165
|
+
style: { width: `${Math.round(x.spent / x.budget * 100)}%` }
|
|
135
166
|
})
|
|
136
167
|
})]
|
|
137
|
-
}), /* @__PURE__ */
|
|
168
|
+
}), /* @__PURE__ */ c("div", {
|
|
138
169
|
className: "grid grid-cols-2 gap-4 mt-4 text-sm",
|
|
139
|
-
children: [/* @__PURE__ */
|
|
170
|
+
children: [/* @__PURE__ */ c("div", { children: [/* @__PURE__ */ s("p", {
|
|
140
171
|
className: "text-xs text-text-secondary",
|
|
141
172
|
children: "Manager"
|
|
142
|
-
}), /* @__PURE__ */
|
|
173
|
+
}), /* @__PURE__ */ s("p", {
|
|
143
174
|
className: "font-medium",
|
|
144
|
-
children:
|
|
145
|
-
})] }), /* @__PURE__ */
|
|
175
|
+
children: x.managerName
|
|
176
|
+
})] }), /* @__PURE__ */ c("div", { children: [/* @__PURE__ */ s("p", {
|
|
146
177
|
className: "text-xs text-text-secondary",
|
|
147
178
|
children: "Timeline"
|
|
148
|
-
}), /* @__PURE__ */
|
|
149
|
-
|
|
179
|
+
}), /* @__PURE__ */ c("p", { children: [
|
|
180
|
+
x.startDate,
|
|
150
181
|
" — ",
|
|
151
|
-
|
|
182
|
+
x.endDate
|
|
152
183
|
] })] })]
|
|
153
184
|
})] })] })
|
|
154
185
|
]
|
|
155
|
-
}) : /* @__PURE__ */
|
|
186
|
+
}) : /* @__PURE__ */ s("div", {
|
|
156
187
|
className: "p-6",
|
|
157
|
-
children: /* @__PURE__ */
|
|
188
|
+
children: /* @__PURE__ */ s(g, {
|
|
158
189
|
illustration: "empty-search",
|
|
159
190
|
title: "Project not found",
|
|
160
191
|
description: "This project is no longer available."
|
|
@@ -162,6 +193,6 @@ function m() {
|
|
|
162
193
|
});
|
|
163
194
|
}
|
|
164
195
|
//#endregion
|
|
165
|
-
export {
|
|
196
|
+
export { y as ProjectsProjectDetailsPagePage };
|
|
166
197
|
|
|
167
198
|
//# sourceMappingURL=ProjectsProjectDetailsPagePage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProjectsProjectDetailsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/ProjectsProjectDetailsPagePage.tsx"],"sourcesContent":["import {\n Badge,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n GradientText,\n IllustratedEmptyState,\n} from '@burdenoff/fe-libs/ui';\nimport { Calendar, DollarSign, Target, Users } from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\nexport function ProjectsProjectDetailsPagePage() {\n const { projects } = useCrewFoundryStore();\n const project = projects[1]; // Show second project for variety\n if (!project)\n return (\n <div className=\"p-6\">\n <IllustratedEmptyState\n illustration=\"empty-search\"\n title=\"Project not found\"\n description=\"This project is no longer available.\"\n />\n </div>\n );\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>{project.name}</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">{project.description}</p>\n </div>\n <div className=\"flex gap-1\">\n <Badge variant={project.priority === 'critical' ? 'destructive' : 'default'}>\n {project.priority}\n </Badge>\n <Badge variant={project.status === 'active' ? 'default' : 'secondary'}>\n {project.status}\n </Badge>\n </div>\n </div>\n <div className=\"grid gap-4 md:grid-cols-4\">\n <Card>\n <CardContent className=\"p-4 text-center\">\n <Target className=\"h-5 w-5 mx-auto text-text-secondary mb-1\" />\n <p className=\"text-lg font-bold\">{project.progress}%</p>\n <p className=\"text-xs text-text-secondary\">Progress</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"p-4 text-center\">\n <DollarSign className=\"h-5 w-5 mx-auto text-text-secondary mb-1\" />\n <p className=\"text-lg font-bold\">${(project.budget / 1000).toFixed(0)}K</p>\n <p className=\"text-xs text-text-secondary\">Budget</p>\n </CardContent>\n </Card>\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\">{project.teamName}</p>\n <p className=\"text-xs text-text-secondary\">Team</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\">{project.endDate}</p>\n <p className=\"text-xs text-text-secondary\">Deadline</p>\n </CardContent>\n </Card>\n </div>\n <
|
|
1
|
+
{"version":3,"file":"ProjectsProjectDetailsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/ProjectsProjectDetailsPagePage.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 { Calendar, DollarSign, FolderKanban, Target, Users } from 'lucide-react';\nimport { useNavigate } from 'react-router-dom';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\nexport function ProjectsProjectDetailsPagePage() {\n const navigate = useNavigate();\n const { projects } = useCrewFoundryStore();\n const project = projects[1]; // Show second project for variety\n if (!project)\n return (\n <div className=\"p-6\">\n <IllustratedEmptyState\n illustration=\"empty-search\"\n title=\"Project not found\"\n description=\"This project is no longer available.\"\n />\n </div>\n );\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>{project.name}</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">{project.description}</p>\n </div>\n <div className=\"flex gap-1\">\n <Badge variant={project.priority === 'critical' ? 'destructive' : 'default'}>\n {project.priority}\n </Badge>\n <Badge variant={project.status === 'active' ? 'default' : 'secondary'}>\n {project.status}\n </Badge>\n </div>\n </div>\n <PagePurpose>\n Track a single project end-to-end — progress, budget, team, and timeline in one place — so\n you can spot risks early and keep delivery on schedule and on budget.\n </PagePurpose>\n\n <NextSteps\n storageKey=\"crewfoundry-project-details\"\n steps={[\n {\n id: 'all-projects',\n label: 'View all projects',\n description: 'See how this project compares across your portfolio.',\n icon: <FolderKanban className=\"h-4 w-4\" />,\n onClick: () => navigate('../../projects/projects-page'),\n },\n {\n id: 'team',\n label: 'Check the team',\n description: 'Review who is working on this and their workload.',\n icon: <Users className=\"h-4 w-4\" />,\n onClick: () => navigate('../../teams/teams-page'),\n },\n {\n id: 'new-project',\n label: 'Start a new project',\n description: 'Kick off the next piece of work.',\n icon: <Target className=\"h-4 w-4\" />,\n onClick: () => navigate('../../projects/create-project-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 <Target className=\"h-5 w-5 mx-auto text-text-secondary mb-1\" />\n <p className=\"text-lg font-bold\">{project.progress}%</p>\n <p className=\"text-xs text-text-secondary\">Progress</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"p-4 text-center\">\n <DollarSign className=\"h-5 w-5 mx-auto text-text-secondary mb-1\" />\n <p className=\"text-lg font-bold\">${(project.budget / 1000).toFixed(0)}K</p>\n <p className=\"text-xs text-text-secondary\">Budget</p>\n </CardContent>\n </Card>\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\">{project.teamName}</p>\n <p className=\"text-xs text-text-secondary\">Team</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\">{project.endDate}</p>\n <p className=\"text-xs text-text-secondary\">Deadline</p>\n </CardContent>\n </Card>\n </div>\n <EmphasisPanel>\n <div className=\"mb-2 text-lg font-semibold\">Task Progress</div>\n <div className=\"space-y-2\">\n <div className=\"flex justify-between text-sm\">\n <span>\n {project.completedTasks} of {project.tasks} tasks completed\n </span>\n <span className=\"font-medium\">{project.progress}%</span>\n </div>\n <div className=\"h-3 bg-bg-sunken rounded overflow-hidden\">\n <div\n className=\"h-3 bg-action-primary-bg rounded\"\n style={{ width: `${project.progress}%` }}\n />\n </div>\n </div>\n </EmphasisPanel>\n <Card>\n <CardHeader>\n <CardTitle>Budget Tracking</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-2\">\n <div className=\"flex justify-between text-sm\">\n <span>\n Spent ${(project.spent / 1000).toFixed(0)}K of ${(project.budget / 1000).toFixed(0)}\n K\n </span>\n <span className=\"font-medium\">\n {Math.round((project.spent / project.budget) * 100)}%\n </span>\n </div>\n <div className=\"h-3 bg-bg-sunken rounded overflow-hidden\">\n <div\n className={`h-3 rounded ${project.spent / project.budget > 0.9 ? 'bg-status-error-text' : 'bg-status-success-text'}`}\n style={{ width: `${Math.round((project.spent / project.budget) * 100)}%` }}\n />\n </div>\n </div>\n <div className=\"grid grid-cols-2 gap-4 mt-4 text-sm\">\n <div>\n <p className=\"text-xs text-text-secondary\">Manager</p>\n <p className=\"font-medium\">{project.managerName}</p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Timeline</p>\n <p>\n {project.startDate} — {project.endDate}\n </p>\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,39 +1,55 @@
|
|
|
1
1
|
import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
|
|
2
2
|
import { Plus as t } from "lucide-react";
|
|
3
3
|
import { jsx as n, jsxs as r } from "react/jsx-runtime";
|
|
4
|
-
import { Badge as i, Button as a,
|
|
5
|
-
import { useI18n as
|
|
4
|
+
import { Badge as i, Button as a, CardContent as o, CardDescription as s, CardHeader as c, CardTitle as l, GlassCard as u, GradientText as d, IllustratedEmptyState as f, PagePurpose as p } from "@burdenoff/fe-libs/ui";
|
|
5
|
+
import { useI18n as m } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
6
6
|
//#region src/crewfoundry/pages/ProjectsProjectsPagePage.tsx
|
|
7
|
-
function
|
|
8
|
-
let { t:
|
|
9
|
-
let n =
|
|
7
|
+
function h() {
|
|
8
|
+
let { t: h } = m(), { projects: g } = e(), _ = g.filter((e) => e.status === "active"), v = (e, t) => {
|
|
9
|
+
let n = h(e);
|
|
10
10
|
return n === e ? t : n;
|
|
11
11
|
};
|
|
12
12
|
return /* @__PURE__ */ r("div", {
|
|
13
13
|
className: "space-y-6 p-6",
|
|
14
14
|
children: [/* @__PURE__ */ r("div", {
|
|
15
15
|
className: "flex items-center justify-between",
|
|
16
|
-
children: [/* @__PURE__ */ r("div", { children: [
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
16
|
+
children: [/* @__PURE__ */ r("div", { children: [
|
|
17
|
+
/* @__PURE__ */ n("h1", {
|
|
18
|
+
className: "text-2xl font-semibold",
|
|
19
|
+
children: /* @__PURE__ */ n(d, { children: v("crewfoundry.projects.title", "Projects") })
|
|
20
|
+
}),
|
|
21
|
+
/* @__PURE__ */ r("p", {
|
|
22
|
+
className: "text-sm text-text-secondary",
|
|
23
|
+
children: [
|
|
24
|
+
_.length,
|
|
25
|
+
" ",
|
|
26
|
+
v("crewfoundry.projects.summary.activeProjects", "active projects")
|
|
27
|
+
]
|
|
28
|
+
}),
|
|
29
|
+
/* @__PURE__ */ n(p, {
|
|
30
|
+
className: "mt-1",
|
|
31
|
+
children: "All your projects in one view — track status, progress, and budgets so nothing stalls and everything ships on time."
|
|
32
|
+
})
|
|
33
|
+
] }), /* @__PURE__ */ r(a, {
|
|
27
34
|
size: "sm",
|
|
28
|
-
children: [/* @__PURE__ */ n(t, { className: "h-4 w-4 mr-1" }),
|
|
35
|
+
children: [/* @__PURE__ */ n(t, { className: "h-4 w-4 mr-1" }), v("crewfoundry.projects.actions.newProject", "New Project")]
|
|
29
36
|
})]
|
|
30
37
|
}), /* @__PURE__ */ n("div", {
|
|
31
38
|
className: "grid gap-4 md:grid-cols-2 lg:grid-cols-3",
|
|
32
|
-
children:
|
|
39
|
+
children: g.length === 0 ? /* @__PURE__ */ n("div", {
|
|
40
|
+
className: "col-span-full",
|
|
41
|
+
children: /* @__PURE__ */ n(f, {
|
|
42
|
+
illustration: "empty-data",
|
|
43
|
+
title: "No projects yet",
|
|
44
|
+
description: "Create your first project to start tracking work."
|
|
45
|
+
})
|
|
46
|
+
}) : g.map((e, t) => /* @__PURE__ */ r(u, {
|
|
47
|
+
treatment: t === 0 ? "glass" : "plain",
|
|
48
|
+
glow: t === 0,
|
|
33
49
|
className: "hover:shadow-md transition-shadow cursor-pointer",
|
|
34
|
-
children: [/* @__PURE__ */ r(
|
|
50
|
+
children: [/* @__PURE__ */ r(c, { children: [/* @__PURE__ */ r("div", {
|
|
35
51
|
className: "flex items-center justify-between",
|
|
36
|
-
children: [/* @__PURE__ */ n(
|
|
52
|
+
children: [/* @__PURE__ */ n(l, {
|
|
37
53
|
className: "text-base",
|
|
38
54
|
children: e.name
|
|
39
55
|
}), /* @__PURE__ */ n(i, {
|
|
@@ -41,7 +57,7 @@ function p() {
|
|
|
41
57
|
className: "text-[10px]",
|
|
42
58
|
children: e.status
|
|
43
59
|
})]
|
|
44
|
-
}), /* @__PURE__ */ n(
|
|
60
|
+
}), /* @__PURE__ */ n(s, { children: e.description })] }), /* @__PURE__ */ r(o, { children: [
|
|
45
61
|
/* @__PURE__ */ r("div", {
|
|
46
62
|
className: "space-y-2 mb-3",
|
|
47
63
|
children: [/* @__PURE__ */ r("div", {
|
|
@@ -51,7 +67,7 @@ function p() {
|
|
|
51
67
|
"/",
|
|
52
68
|
e.tasks,
|
|
53
69
|
" ",
|
|
54
|
-
|
|
70
|
+
v("crewfoundry.projects.card.tasks", "tasks")
|
|
55
71
|
] }), /* @__PURE__ */ r("span", { children: [e.progress, "%"] })]
|
|
56
72
|
}), /* @__PURE__ */ n("div", {
|
|
57
73
|
className: "h-2 bg-bg-sunken rounded overflow-hidden",
|
|
@@ -65,23 +81,23 @@ function p() {
|
|
|
65
81
|
className: "grid grid-cols-2 gap-2 text-xs text-text-secondary",
|
|
66
82
|
children: [
|
|
67
83
|
/* @__PURE__ */ r("span", { children: [
|
|
68
|
-
|
|
84
|
+
v("crewfoundry.projects.card.team", "Team"),
|
|
69
85
|
": ",
|
|
70
86
|
e.teamName
|
|
71
87
|
] }),
|
|
72
88
|
/* @__PURE__ */ r("span", { children: [
|
|
73
|
-
|
|
89
|
+
v("crewfoundry.projects.card.manager", "Manager"),
|
|
74
90
|
": ",
|
|
75
91
|
e.managerName
|
|
76
92
|
] }),
|
|
77
93
|
/* @__PURE__ */ r("span", { children: [
|
|
78
|
-
|
|
94
|
+
v("crewfoundry.projects.card.budget", "Budget"),
|
|
79
95
|
": $",
|
|
80
96
|
(e.budget / 1e3).toFixed(0),
|
|
81
97
|
"K"
|
|
82
98
|
] }),
|
|
83
99
|
/* @__PURE__ */ r("span", { children: [
|
|
84
|
-
|
|
100
|
+
v("crewfoundry.projects.card.spent", "Spent"),
|
|
85
101
|
": $",
|
|
86
102
|
(e.spent / 1e3).toFixed(0),
|
|
87
103
|
"K"
|
|
@@ -110,6 +126,6 @@ function p() {
|
|
|
110
126
|
});
|
|
111
127
|
}
|
|
112
128
|
//#endregion
|
|
113
|
-
export {
|
|
129
|
+
export { h as ProjectsProjectsPagePage };
|
|
114
130
|
|
|
115
131
|
//# 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
|
|
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,33 +1,41 @@
|
|
|
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 } 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
36
|
/* @__PURE__ */ a(d, {
|
|
30
|
-
treatment: "
|
|
37
|
+
treatment: "glass",
|
|
38
|
+
glow: !0,
|
|
31
39
|
className: "border-border-seam",
|
|
32
40
|
children: [/* @__PURE__ */ a(l, {
|
|
33
41
|
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
@@ -37,7 +45,7 @@ function p() {
|
|
|
37
45
|
}), /* @__PURE__ */ i(r, { className: "h-4 w-4 text-text-secondary" })]
|
|
38
46
|
}), /* @__PURE__ */ i(c, { children: /* @__PURE__ */ i("div", {
|
|
39
47
|
className: "text-2xl font-bold tabular-nums",
|
|
40
|
-
children:
|
|
48
|
+
children: m.length
|
|
41
49
|
}) })]
|
|
42
50
|
}),
|
|
43
51
|
/* @__PURE__ */ a(d, {
|
|
@@ -51,7 +59,7 @@ function p() {
|
|
|
51
59
|
}), /* @__PURE__ */ i(r, { className: "h-4 w-4 text-text-secondary" })]
|
|
52
60
|
}), /* @__PURE__ */ i(c, { children: /* @__PURE__ */ i("div", {
|
|
53
61
|
className: "text-2xl font-bold tabular-nums",
|
|
54
|
-
children:
|
|
62
|
+
children: m.reduce((e, t) => e + t.memberCount, 0)
|
|
55
63
|
}) })]
|
|
56
64
|
}),
|
|
57
65
|
/* @__PURE__ */ a(d, {
|
|
@@ -65,14 +73,14 @@ function p() {
|
|
|
65
73
|
}), /* @__PURE__ */ i(n, { className: "h-4 w-4 text-text-secondary" })]
|
|
66
74
|
}), /* @__PURE__ */ i(c, { children: /* @__PURE__ */ i("div", {
|
|
67
75
|
className: "text-2xl font-bold tabular-nums",
|
|
68
|
-
children:
|
|
76
|
+
children: _.reduce((e, t) => e + t.activeProjects, 0)
|
|
69
77
|
}) })]
|
|
70
78
|
})
|
|
71
79
|
]
|
|
72
80
|
}),
|
|
73
81
|
/* @__PURE__ */ a(s, { children: [/* @__PURE__ */ i(l, { children: /* @__PURE__ */ i(u, { children: "Team Size Comparison" }) }), /* @__PURE__ */ i(c, {
|
|
74
82
|
className: "space-y-3",
|
|
75
|
-
children:
|
|
83
|
+
children: m.sort((e, t) => t.memberCount - e.memberCount).map((e) => /* @__PURE__ */ a("div", {
|
|
76
84
|
className: "flex items-center gap-3",
|
|
77
85
|
children: [
|
|
78
86
|
/* @__PURE__ */ i("span", {
|
|
@@ -83,7 +91,7 @@ function p() {
|
|
|
83
91
|
className: "flex-1 h-4 bg-bg-sunken rounded overflow-hidden",
|
|
84
92
|
children: /* @__PURE__ */ i("div", {
|
|
85
93
|
className: "h-4 bg-action-primary-bg rounded",
|
|
86
|
-
style: { width: `${Math.round(e.memberCount /
|
|
94
|
+
style: { width: `${Math.round(e.memberCount / v * 100)}%` }
|
|
87
95
|
})
|
|
88
96
|
}),
|
|
89
97
|
/* @__PURE__ */ i("span", {
|
|
@@ -111,7 +119,7 @@ function p() {
|
|
|
111
119
|
children: "Status"
|
|
112
120
|
})
|
|
113
121
|
]
|
|
114
|
-
}),
|
|
122
|
+
}), _.map((e) => /* @__PURE__ */ a("div", {
|
|
115
123
|
className: "grid grid-cols-5 gap-2 py-2 border-b last:border-0 text-sm",
|
|
116
124
|
children: [
|
|
117
125
|
/* @__PURE__ */ i("span", {
|
|
@@ -148,6 +156,6 @@ function p() {
|
|
|
148
156
|
});
|
|
149
157
|
}
|
|
150
158
|
//#endregion
|
|
151
|
-
export {
|
|
159
|
+
export { m as TeamsTeamAnalyticsPagePage };
|
|
152
160
|
|
|
153
161
|
//# sourceMappingURL=TeamsTeamAnalyticsPagePage.js.map
|