@burdenoff/microfe-crewfoundry 2026.703.1 → 2026.704.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/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/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/dist/crewfoundry/store/crewfoundryStore.js +35 -3
- package/dist/crewfoundry/store/crewfoundryStore.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,140 +1,90 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { jsx as o, jsxs as s } from "react/jsx-runtime";
|
|
5
|
-
import { Badge as c, Button as l, Card as u, CardContent as d, CardHeader as f, CardTitle as p, GlassCard as m, GradientText as h, PagePurpose as g } from "@burdenoff/fe-libs/ui";
|
|
1
|
+
import { Calendar as e, CheckCircle as t, Clock as n, Plus as r } from "lucide-react";
|
|
2
|
+
import { jsx as i, jsxs as a } from "react/jsx-runtime";
|
|
3
|
+
import { Button as o, Card as s, CardContent 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
4
|
//#region src/crewfoundry/pages/MarketplaceBookingManagementPagePage.tsx
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
return Number.isNaN(t.getTime()) ? "Unknown" : t.toISOString().split("T")[0];
|
|
10
|
-
};
|
|
11
|
-
function v() {
|
|
12
|
-
let { marketplaceServices: v, projects: y, teams: b } = e(), x = t(() => v.slice(0, 12).map((e, t) => {
|
|
13
|
-
let n = y[t % Math.max(y.length, 1)], r = b[t % Math.max(b.length, 1)], i = e.status === "active" ? "confirmed" : e.status === "pending" ? "pending" : "completed";
|
|
14
|
-
return {
|
|
15
|
-
id: e.id,
|
|
16
|
-
service: e.title,
|
|
17
|
-
provider: e.provider,
|
|
18
|
-
date: _(n?.startDate || e.deliveryTime),
|
|
19
|
-
time: `${String(t % 12 + 1).padStart(2, "0")}:00 ${t % 2 == 0 ? "AM" : "PM"}`,
|
|
20
|
-
duration: `${Math.max(1, Math.ceil((r?.memberCount || 4) / 4))} hours`,
|
|
21
|
-
status: i
|
|
22
|
-
};
|
|
23
|
-
}), [
|
|
24
|
-
v,
|
|
25
|
-
y,
|
|
26
|
-
b
|
|
27
|
-
]);
|
|
28
|
-
return /* @__PURE__ */ s("div", {
|
|
5
|
+
function h() {
|
|
6
|
+
return /* @__PURE__ */ a("div", {
|
|
29
7
|
className: "space-y-6 p-6",
|
|
30
8
|
children: [
|
|
31
|
-
/* @__PURE__ */
|
|
9
|
+
/* @__PURE__ */ a("div", {
|
|
32
10
|
className: "flex items-center justify-between",
|
|
33
|
-
children: [/* @__PURE__ */
|
|
34
|
-
/* @__PURE__ */
|
|
11
|
+
children: [/* @__PURE__ */ a("div", { children: [
|
|
12
|
+
/* @__PURE__ */ i("h1", {
|
|
35
13
|
className: "text-2xl font-semibold",
|
|
36
|
-
children: /* @__PURE__ */
|
|
14
|
+
children: /* @__PURE__ */ i(f, { children: "Booking Management" })
|
|
37
15
|
}),
|
|
38
|
-
/* @__PURE__ */
|
|
16
|
+
/* @__PURE__ */ i("p", {
|
|
39
17
|
className: "text-sm text-text-secondary",
|
|
40
18
|
children: "Manage service provider appointments"
|
|
41
19
|
}),
|
|
42
|
-
/* @__PURE__ */
|
|
20
|
+
/* @__PURE__ */ i(m, {
|
|
43
21
|
className: "mt-1",
|
|
44
22
|
children: "Manage your service bookings — review upcoming engagements, confirm schedules, and keep your client commitments on track."
|
|
45
23
|
})
|
|
46
|
-
] }), /* @__PURE__ */
|
|
24
|
+
] }), /* @__PURE__ */ a(o, {
|
|
47
25
|
size: "sm",
|
|
48
26
|
disabled: !0,
|
|
49
27
|
title: "Booking creation is coming soon",
|
|
50
|
-
children: [/* @__PURE__ */
|
|
28
|
+
children: [/* @__PURE__ */ i(r, { className: "mr-1 h-4 w-4" }), "New Booking · Coming soon"]
|
|
51
29
|
})]
|
|
52
30
|
}),
|
|
53
|
-
/* @__PURE__ */
|
|
31
|
+
/* @__PURE__ */ a("div", {
|
|
54
32
|
className: "grid gap-4 md:grid-cols-3",
|
|
55
33
|
children: [
|
|
56
|
-
/* @__PURE__ */
|
|
34
|
+
/* @__PURE__ */ a(d, {
|
|
57
35
|
treatment: "glass",
|
|
58
36
|
glow: !0,
|
|
59
37
|
className: "border-border-seam",
|
|
60
|
-
children: [/* @__PURE__ */
|
|
38
|
+
children: [/* @__PURE__ */ a(l, {
|
|
61
39
|
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
62
|
-
children: [/* @__PURE__ */
|
|
40
|
+
children: [/* @__PURE__ */ i(u, {
|
|
63
41
|
className: "text-sm font-medium",
|
|
64
42
|
children: "Upcoming"
|
|
65
|
-
}), /* @__PURE__ */
|
|
66
|
-
}), /* @__PURE__ */
|
|
43
|
+
}), /* @__PURE__ */ i(e, { className: "h-4 w-4 text-status-info-text" })]
|
|
44
|
+
}), /* @__PURE__ */ i(c, { children: /* @__PURE__ */ i("div", {
|
|
67
45
|
className: "text-2xl font-bold tabular-nums",
|
|
68
|
-
children:
|
|
46
|
+
children: 0
|
|
69
47
|
}) })]
|
|
70
48
|
}),
|
|
71
|
-
/* @__PURE__ */
|
|
49
|
+
/* @__PURE__ */ a(d, {
|
|
72
50
|
treatment: "metric",
|
|
73
51
|
className: "border-border-seam",
|
|
74
|
-
children: [/* @__PURE__ */
|
|
52
|
+
children: [/* @__PURE__ */ a(l, {
|
|
75
53
|
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
76
|
-
children: [/* @__PURE__ */
|
|
54
|
+
children: [/* @__PURE__ */ i(u, {
|
|
77
55
|
className: "text-sm font-medium",
|
|
78
56
|
children: "Confirmed"
|
|
79
|
-
}), /* @__PURE__ */
|
|
80
|
-
}), /* @__PURE__ */
|
|
57
|
+
}), /* @__PURE__ */ i(t, { className: "h-4 w-4 text-status-success-text" })]
|
|
58
|
+
}), /* @__PURE__ */ i(c, { children: /* @__PURE__ */ i("div", {
|
|
81
59
|
className: "text-2xl font-bold tabular-nums",
|
|
82
|
-
children:
|
|
60
|
+
children: 0
|
|
83
61
|
}) })]
|
|
84
62
|
}),
|
|
85
|
-
/* @__PURE__ */
|
|
63
|
+
/* @__PURE__ */ a(d, {
|
|
86
64
|
treatment: "metric",
|
|
87
65
|
className: "border-border-seam",
|
|
88
|
-
children: [/* @__PURE__ */
|
|
66
|
+
children: [/* @__PURE__ */ a(l, {
|
|
89
67
|
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
90
|
-
children: [/* @__PURE__ */
|
|
68
|
+
children: [/* @__PURE__ */ i(u, {
|
|
91
69
|
className: "text-sm font-medium",
|
|
92
70
|
children: "Pending"
|
|
93
|
-
}), /* @__PURE__ */
|
|
94
|
-
}), /* @__PURE__ */
|
|
71
|
+
}), /* @__PURE__ */ i(n, { className: "h-4 w-4 text-status-warning-text" })]
|
|
72
|
+
}), /* @__PURE__ */ i(c, { children: /* @__PURE__ */ i("div", {
|
|
95
73
|
className: "text-2xl font-bold tabular-nums",
|
|
96
|
-
children:
|
|
74
|
+
children: 0
|
|
97
75
|
}) })]
|
|
98
76
|
})
|
|
99
77
|
]
|
|
100
78
|
}),
|
|
101
|
-
/* @__PURE__ */ s
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
className: "text-sm font-medium",
|
|
107
|
-
children: e.service
|
|
108
|
-
}), /* @__PURE__ */ o("p", {
|
|
109
|
-
className: "text-xs text-text-secondary",
|
|
110
|
-
children: e.provider
|
|
111
|
-
})] }), /* @__PURE__ */ s("div", {
|
|
112
|
-
className: "flex items-center gap-3",
|
|
113
|
-
children: [/* @__PURE__ */ s("div", {
|
|
114
|
-
className: "text-right text-xs",
|
|
115
|
-
children: [/* @__PURE__ */ o("p", {
|
|
116
|
-
className: "font-medium",
|
|
117
|
-
children: e.date
|
|
118
|
-
}), /* @__PURE__ */ s("p", {
|
|
119
|
-
className: "text-text-secondary",
|
|
120
|
-
children: [
|
|
121
|
-
e.time,
|
|
122
|
-
" · ",
|
|
123
|
-
e.duration
|
|
124
|
-
]
|
|
125
|
-
})]
|
|
126
|
-
}), /* @__PURE__ */ o(c, {
|
|
127
|
-
variant: e.status === "confirmed" ? "default" : e.status === "completed" ? "secondary" : "outline",
|
|
128
|
-
className: "text-[10px]",
|
|
129
|
-
children: e.status
|
|
130
|
-
})]
|
|
131
|
-
})]
|
|
132
|
-
}, e.id))
|
|
133
|
-
})] })
|
|
79
|
+
/* @__PURE__ */ a(s, { children: [/* @__PURE__ */ i(l, { children: /* @__PURE__ */ i(u, { children: "All Bookings" }) }), /* @__PURE__ */ i(c, { children: /* @__PURE__ */ i(p, {
|
|
80
|
+
illustration: "empty-generic",
|
|
81
|
+
title: "No bookings yet",
|
|
82
|
+
description: "Once booking creation ships, your scheduled service appointments will appear here."
|
|
83
|
+
}) })] })
|
|
134
84
|
]
|
|
135
85
|
});
|
|
136
86
|
}
|
|
137
87
|
//#endregion
|
|
138
|
-
export {
|
|
88
|
+
export { h as MarketplaceBookingManagementPagePage };
|
|
139
89
|
|
|
140
90
|
//# sourceMappingURL=MarketplaceBookingManagementPagePage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MarketplaceBookingManagementPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/MarketplaceBookingManagementPagePage.tsx"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"MarketplaceBookingManagementPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/MarketplaceBookingManagementPagePage.tsx"],"sourcesContent":["import {\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n GlassCard,\n GradientText,\n IllustratedEmptyState,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport { Calendar, CheckCircle, Clock, Plus } from 'lucide-react';\n\nexport function MarketplaceBookingManagementPagePage() {\n // There is no booking data source or booking-creation mutation yet, so we do\n // not synthesize pseudo-bookings from unrelated services. Counts are a true\n // zero and the list shows an honest empty state until the backend ships.\n const upcomingCount = 0;\n const confirmedCount = 0;\n const pendingCount = 0;\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>Booking Management</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">Manage service provider appointments</p>\n <PagePurpose className=\"mt-1\">Manage your service bookings — review upcoming engagements, confirm schedules, and keep your client commitments on track.</PagePurpose>\n </div>\n {/* Bookings derive from marketplace services; there is no standalone\n booking-creation mutation yet, so this stays an honest disabled\n control instead of a silently-dead button. */}\n <Button size=\"sm\" disabled title=\"Booking creation is coming soon\">\n <Plus className=\"mr-1 h-4 w-4\" />\n New Booking · Coming soon\n </Button>\n </div>\n\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\">Upcoming</CardTitle>\n <Calendar className=\"h-4 w-4 text-status-info-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{upcomingCount}</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\">Confirmed</CardTitle>\n <CheckCircle className=\"h-4 w-4 text-status-success-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{confirmedCount}</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\">Pending</CardTitle>\n <Clock className=\"h-4 w-4 text-status-warning-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{pendingCount}</div>\n </CardContent>\n </GlassCard>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle>All Bookings</CardTitle>\n </CardHeader>\n <CardContent>\n <IllustratedEmptyState\n illustration=\"empty-generic\"\n title=\"No bookings yet\"\n description=\"Once booking creation ships, your scheduled service appointments will appear here.\"\n />\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":";;;;AAaA,SAAgB,IAAuC;AAQrD,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD,EAAA,UAAA;KACE,kBAAC,MAAD;MAAI,WAAU;gBACZ,kBAAC,GAAD,EAAA,UAAc,sBAAiC,CAAA;MAC5C,CAAA;KACL,kBAAC,KAAD;MAAG,WAAU;gBAA8B;MAAwC,CAAA;KACnF,kBAAC,GAAD;MAAa,WAAU;gBAAO;MAAuI,CAAA;KACjK,EAAA,CAAA,EAIN,kBAAC,GAAD;KAAQ,MAAK;KAAK,UAAA;KAAS,OAAM;eAAjC,CACE,kBAAC,GAAD,EAAM,WAAU,gBAAiB,CAAA,EAAA,4BAE1B;OACL;;GAEN,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,GAAD;MAAW,WAAU;MAAQ,MAAA;MAAK,WAAU;gBAA5C,CACE,kBAAC,GAAD;OAAY,WAAU;iBAAtB,CACE,kBAAC,GAAD;QAAW,WAAU;kBAAsB;QAAoB,CAAA,EAC/D,kBAAC,GAAD,EAAU,WAAU,iCAAkC,CAAA,CAC3C;UACb,kBAAC,GAAD,EAAA,UACE,kBAAC,OAAD;OAAK,WAAU;iBA9BH;OA8B0D,CAAA,EAC1D,CAAA,CACJ;;KACZ,kBAAC,GAAD;MAAW,WAAU;MAAS,WAAU;gBAAxC,CACE,kBAAC,GAAD;OAAY,WAAU;iBAAtB,CACE,kBAAC,GAAD;QAAW,WAAU;kBAAsB;QAAqB,CAAA,EAChE,kBAAC,GAAD,EAAa,WAAU,oCAAqC,CAAA,CACjD;UACb,kBAAC,GAAD,EAAA,UACE,kBAAC,OAAD;OAAK,WAAU;iBAtCF;OAsC0D,CAAA,EAC3D,CAAA,CACJ;;KACZ,kBAAC,GAAD;MAAW,WAAU;MAAS,WAAU;gBAAxC,CACE,kBAAC,GAAD;OAAY,WAAU;iBAAtB,CACE,kBAAC,GAAD;QAAW,WAAU;kBAAsB;QAAmB,CAAA,EAC9D,kBAAC,GAAD,EAAO,WAAU,oCAAqC,CAAA,CAC3C;UACb,kBAAC,GAAD,EAAA,UACE,kBAAC,OAAD;OAAK,WAAU;iBA9CJ;OA8C0D,CAAA,EACzD,CAAA,CACJ;;KACR;;GAEN,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAA,UAAW,gBAAwB,CAAA,EACxB,CAAA,EACb,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;IACE,cAAa;IACb,OAAM;IACN,aAAY;IACZ,CAAA,EACU,CAAA,CACT,EAAA,CAAA;GACH"}
|
|
@@ -1,122 +1,120 @@
|
|
|
1
1
|
import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
|
|
2
2
|
import { useMemo as t } from "react";
|
|
3
|
-
import {
|
|
4
|
-
import { jsx as
|
|
5
|
-
import { Badge as
|
|
3
|
+
import { DollarSign as n, TrendingUp as r, Wallet as i } from "lucide-react";
|
|
4
|
+
import { jsx as a, jsxs as o } from "react/jsx-runtime";
|
|
5
|
+
import { Badge as s, Card as c, CardContent as l, CardHeader as u, CardTitle as d, GlassCard as f, GradientText as p, PagePurpose as m } from "@burdenoff/fe-libs/ui";
|
|
6
6
|
//#region src/crewfoundry/pages/MarketplaceEarningsPagePage.tsx
|
|
7
|
-
var
|
|
7
|
+
var h = (e) => {
|
|
8
8
|
let t = new Date(e);
|
|
9
9
|
return Number.isNaN(t.getTime()) ? "N/A" : t.toLocaleString("en-US", { month: "short" });
|
|
10
|
-
},
|
|
10
|
+
}, g = (e) => {
|
|
11
11
|
let t = new Date(e);
|
|
12
12
|
return Number.isNaN(t.getTime()) ? "Unknown" : t.toISOString().split("T")[0];
|
|
13
13
|
};
|
|
14
|
-
function
|
|
15
|
-
let { invoices:
|
|
14
|
+
function _() {
|
|
15
|
+
let { invoices: _ } = e(), v = t(() => _.slice(0, 12).map((e) => ({
|
|
16
16
|
id: e.id,
|
|
17
17
|
client: e.clientName,
|
|
18
|
-
service: y[t % Math.max(y.length, 1)]?.title || "Marketplace Service",
|
|
19
18
|
amount: e.amount,
|
|
20
|
-
date:
|
|
19
|
+
date: g(e.issueDate),
|
|
21
20
|
status: e.status === "paid" ? "completed" : "pending"
|
|
22
|
-
})), [
|
|
23
|
-
let n =
|
|
21
|
+
})), [_]), y = t(() => v.slice(0, 6).map((e, t) => {
|
|
22
|
+
let n = v.filter((t) => h(t.date) === h(e.date)), r = n.reduce((e, t) => e + t.amount, 0);
|
|
24
23
|
return {
|
|
25
|
-
month:
|
|
24
|
+
month: h(e.date) || `M${t + 1}`,
|
|
26
25
|
amount: r,
|
|
27
26
|
orders: n.length
|
|
28
27
|
};
|
|
29
|
-
}), [
|
|
30
|
-
return /* @__PURE__ */
|
|
28
|
+
}), [v]), b = y.reduce((e, t) => e + t.amount, 0), x = Math.max(1, ...y.map((e) => e.amount)), S = y.reduce((e, t) => e + t.orders, 0), C = v.filter((e) => e.status === "pending").reduce((e, t) => e + t.amount, 0);
|
|
29
|
+
return /* @__PURE__ */ o("div", {
|
|
31
30
|
className: "space-y-6 p-6",
|
|
32
31
|
children: [
|
|
33
|
-
/* @__PURE__ */
|
|
34
|
-
/* @__PURE__ */
|
|
32
|
+
/* @__PURE__ */ o("div", { children: [
|
|
33
|
+
/* @__PURE__ */ a("h1", {
|
|
35
34
|
className: "text-2xl font-semibold",
|
|
36
|
-
children: /* @__PURE__ */
|
|
35
|
+
children: /* @__PURE__ */ a(p, { children: "Earnings" })
|
|
37
36
|
}),
|
|
38
|
-
/* @__PURE__ */
|
|
37
|
+
/* @__PURE__ */ a("p", {
|
|
39
38
|
className: "text-sm text-text-secondary",
|
|
40
39
|
children: "Revenue from marketplace services"
|
|
41
40
|
}),
|
|
42
|
-
/* @__PURE__ */
|
|
41
|
+
/* @__PURE__ */ a(m, {
|
|
43
42
|
className: "mt-1",
|
|
44
43
|
children: "Track what you've earned on the marketplace — payouts, pending balances, and earning trends so you always know where you stand."
|
|
45
44
|
})
|
|
46
45
|
] }),
|
|
47
|
-
/* @__PURE__ */
|
|
46
|
+
/* @__PURE__ */ o("div", {
|
|
48
47
|
className: "grid gap-4 md:grid-cols-3",
|
|
49
48
|
children: [
|
|
50
|
-
/* @__PURE__ */
|
|
49
|
+
/* @__PURE__ */ o(f, {
|
|
51
50
|
treatment: "glass",
|
|
52
51
|
glow: !0,
|
|
53
52
|
className: "border-border-seam",
|
|
54
|
-
children: [/* @__PURE__ */
|
|
53
|
+
children: [/* @__PURE__ */ o(u, {
|
|
55
54
|
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
56
|
-
children: [/* @__PURE__ */
|
|
55
|
+
children: [/* @__PURE__ */ a(d, {
|
|
57
56
|
className: "text-sm font-medium",
|
|
58
57
|
children: "Total Earnings"
|
|
59
|
-
}), /* @__PURE__ */
|
|
60
|
-
}), /* @__PURE__ */
|
|
58
|
+
}), /* @__PURE__ */ a(n, { className: "h-4 w-4 text-text-secondary" })]
|
|
59
|
+
}), /* @__PURE__ */ o(l, { children: [/* @__PURE__ */ o("div", {
|
|
61
60
|
className: "text-2xl font-bold tabular-nums",
|
|
62
|
-
children: ["$",
|
|
63
|
-
}), /* @__PURE__ */
|
|
64
|
-
className: "
|
|
61
|
+
children: ["$", b.toLocaleString()]
|
|
62
|
+
}), /* @__PURE__ */ o("p", {
|
|
63
|
+
className: "text-xs text-text-secondary",
|
|
65
64
|
children: [
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
"% from recent cycle"
|
|
65
|
+
"Across ",
|
|
66
|
+
S,
|
|
67
|
+
" paid orders"
|
|
70
68
|
]
|
|
71
69
|
})] })]
|
|
72
70
|
}),
|
|
73
|
-
/* @__PURE__ */
|
|
71
|
+
/* @__PURE__ */ o(f, {
|
|
74
72
|
treatment: "metric",
|
|
75
73
|
className: "border-border-seam",
|
|
76
|
-
children: [/* @__PURE__ */
|
|
74
|
+
children: [/* @__PURE__ */ o(u, {
|
|
77
75
|
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
78
|
-
children: [/* @__PURE__ */
|
|
76
|
+
children: [/* @__PURE__ */ a(d, {
|
|
79
77
|
className: "text-sm font-medium",
|
|
80
78
|
children: "Avg Order Value"
|
|
81
|
-
}), /* @__PURE__ */
|
|
82
|
-
}), /* @__PURE__ */
|
|
79
|
+
}), /* @__PURE__ */ a(r, { className: "h-4 w-4 text-text-secondary" })]
|
|
80
|
+
}), /* @__PURE__ */ a(l, { children: /* @__PURE__ */ o("div", {
|
|
83
81
|
className: "text-2xl font-bold tabular-nums",
|
|
84
|
-
children: ["$", Math.round(
|
|
82
|
+
children: ["$", Math.round(b / Math.max(S, 1)).toLocaleString()]
|
|
85
83
|
}) })]
|
|
86
84
|
}),
|
|
87
|
-
/* @__PURE__ */
|
|
85
|
+
/* @__PURE__ */ o(f, {
|
|
88
86
|
treatment: "metric",
|
|
89
87
|
className: "border-border-seam",
|
|
90
|
-
children: [/* @__PURE__ */
|
|
88
|
+
children: [/* @__PURE__ */ o(u, {
|
|
91
89
|
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
92
|
-
children: [/* @__PURE__ */
|
|
90
|
+
children: [/* @__PURE__ */ a(d, {
|
|
93
91
|
className: "text-sm font-medium",
|
|
94
92
|
children: "Pending"
|
|
95
|
-
}), /* @__PURE__ */
|
|
96
|
-
}), /* @__PURE__ */
|
|
93
|
+
}), /* @__PURE__ */ a(i, { className: "h-4 w-4 text-status-warning-text" })]
|
|
94
|
+
}), /* @__PURE__ */ a(l, { children: /* @__PURE__ */ o("div", {
|
|
97
95
|
className: "text-2xl font-bold tabular-nums",
|
|
98
|
-
children: ["$",
|
|
96
|
+
children: ["$", C.toLocaleString()]
|
|
99
97
|
}) })]
|
|
100
98
|
})
|
|
101
99
|
]
|
|
102
100
|
}),
|
|
103
|
-
/* @__PURE__ */
|
|
101
|
+
/* @__PURE__ */ o(c, { children: [/* @__PURE__ */ a(u, { children: /* @__PURE__ */ a(d, { children: "Earnings Trend" }) }), /* @__PURE__ */ a(l, {
|
|
104
102
|
className: "space-y-3",
|
|
105
|
-
children:
|
|
103
|
+
children: y.map((e, t) => /* @__PURE__ */ o("div", {
|
|
106
104
|
className: "flex items-center gap-3",
|
|
107
105
|
children: [
|
|
108
|
-
/* @__PURE__ */
|
|
106
|
+
/* @__PURE__ */ a("span", {
|
|
109
107
|
className: "w-10 text-sm text-text-secondary",
|
|
110
108
|
children: e.month
|
|
111
109
|
}),
|
|
112
|
-
/* @__PURE__ */
|
|
110
|
+
/* @__PURE__ */ a("div", {
|
|
113
111
|
className: "h-4 flex-1 overflow-hidden rounded bg-bg-sunken",
|
|
114
|
-
children: /* @__PURE__ */
|
|
112
|
+
children: /* @__PURE__ */ a("div", {
|
|
115
113
|
className: "h-4 rounded bg-action-primary-bg",
|
|
116
|
-
style: { width: `${Math.round(e.amount /
|
|
114
|
+
style: { width: `${Math.round(e.amount / x * 100)}%` }
|
|
117
115
|
})
|
|
118
116
|
}),
|
|
119
|
-
/* @__PURE__ */
|
|
117
|
+
/* @__PURE__ */ o("span", {
|
|
120
118
|
className: "w-16 text-right text-sm font-medium",
|
|
121
119
|
children: [
|
|
122
120
|
"$",
|
|
@@ -124,7 +122,7 @@ function v() {
|
|
|
124
122
|
"K"
|
|
125
123
|
]
|
|
126
124
|
}),
|
|
127
|
-
/* @__PURE__ */ s
|
|
125
|
+
/* @__PURE__ */ o(s, {
|
|
128
126
|
variant: "outline",
|
|
129
127
|
className: "text-[10px]",
|
|
130
128
|
children: [e.orders, " orders"]
|
|
@@ -132,26 +130,22 @@ function v() {
|
|
|
132
130
|
]
|
|
133
131
|
}, `${e.month}-${t}`))
|
|
134
132
|
})] }),
|
|
135
|
-
/* @__PURE__ */
|
|
133
|
+
/* @__PURE__ */ o(c, { children: [/* @__PURE__ */ a(u, { children: /* @__PURE__ */ a(d, { children: "Recent Payments" }) }), /* @__PURE__ */ a(l, {
|
|
136
134
|
className: "space-y-3",
|
|
137
|
-
children:
|
|
135
|
+
children: v.map((e) => /* @__PURE__ */ o("div", {
|
|
138
136
|
className: "flex items-center justify-between rounded border p-3",
|
|
139
|
-
children: [/* @__PURE__ */
|
|
137
|
+
children: [/* @__PURE__ */ o("div", { children: [/* @__PURE__ */ a("p", {
|
|
140
138
|
className: "text-sm font-medium",
|
|
141
139
|
children: e.client
|
|
142
|
-
}), /* @__PURE__ */
|
|
140
|
+
}), /* @__PURE__ */ a("p", {
|
|
143
141
|
className: "text-xs text-text-secondary",
|
|
144
|
-
children:
|
|
145
|
-
|
|
146
|
-
" · ",
|
|
147
|
-
e.date
|
|
148
|
-
]
|
|
149
|
-
})] }), /* @__PURE__ */ s("div", {
|
|
142
|
+
children: e.date
|
|
143
|
+
})] }), /* @__PURE__ */ o("div", {
|
|
150
144
|
className: "flex items-center gap-2",
|
|
151
|
-
children: [/* @__PURE__ */
|
|
145
|
+
children: [/* @__PURE__ */ o("span", {
|
|
152
146
|
className: "text-sm font-bold",
|
|
153
147
|
children: ["$", e.amount.toLocaleString()]
|
|
154
|
-
}), /* @__PURE__ */
|
|
148
|
+
}), /* @__PURE__ */ a(s, {
|
|
155
149
|
variant: e.status === "completed" ? "default" : "secondary",
|
|
156
150
|
className: "text-[10px]",
|
|
157
151
|
children: e.status
|
|
@@ -163,6 +157,6 @@ function v() {
|
|
|
163
157
|
});
|
|
164
158
|
}
|
|
165
159
|
//#endregion
|
|
166
|
-
export {
|
|
160
|
+
export { _ as MarketplaceEarningsPagePage };
|
|
167
161
|
|
|
168
162
|
//# sourceMappingURL=MarketplaceEarningsPagePage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MarketplaceEarningsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/MarketplaceEarningsPagePage.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport {\n Badge,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n GlassCard,\n GradientText,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport { ArrowUp, DollarSign, TrendingUp, Wallet } from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\ntype EarningPoint = {\n month: string;\n amount: number;\n orders: number;\n};\n\ntype PaymentItem = {\n id: string;\n client: string;\n service: string;\n amount: number;\n date: string;\n status: 'completed' | 'pending';\n};\n\nconst monthLabel = (value: string): string => {\n const parsed = new Date(value);\n if (Number.isNaN(parsed.getTime())) {\n return 'N/A';\n }\n return parsed.toLocaleString('en-US', { month: 'short' });\n};\n\nconst isoDate = (value: string): string => {\n const parsed = new Date(value);\n if (Number.isNaN(parsed.getTime())) {\n return 'Unknown';\n }\n return parsed.toISOString().split('T')[0];\n};\n\nexport function MarketplaceEarningsPagePage() {\n const { invoices, marketplaceServices, clients } = useCrewFoundryStore();\n\n const recentPayments = useMemo<PaymentItem[]>(() => {\n return invoices.slice(0, 12).map((invoice, index) => ({\n id: invoice.id,\n client: invoice.clientName,\n service:\n marketplaceServices[index % Math.max(marketplaceServices.length, 1)]?.title ||\n 'Marketplace Service',\n amount: invoice.amount,\n date: isoDate(invoice.issueDate),\n status: invoice.status === 'paid' ? 'completed' : 'pending',\n }));\n }, [invoices, marketplaceServices]);\n\n const earningsData = useMemo<EarningPoint[]>(() => {\n return recentPayments.slice(0, 6).map((payment, index) => {\n const sibling = recentPayments.filter(\n (item) => monthLabel(item.date) === monthLabel(payment.date)\n );\n const amount = sibling.reduce((sum, item) => sum + item.amount, 0);\n return {\n month: monthLabel(payment.date) || `M${index + 1}`,\n amount,\n orders: sibling.length,\n };\n });\n }, [recentPayments]);\n\n const totalEarnings = earningsData.reduce((sum, point) => sum + point.amount, 0);\n const maxEarning = Math.max(1, ...earningsData.map((point) => point.amount));\n const totalOrders = earningsData.reduce((sum, point) => sum + point.orders, 0);\n const pendingAmount = recentPayments\n .filter((payment) => payment.status === 'pending')\n .reduce((sum, payment) => sum + payment.amount, 0);\n const growthBase = clients.length > 0 ? Math.round((totalOrders / clients.length) * 100) : 0;\n\n return (\n <div className=\"space-y-6 p-6\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>Earnings</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">Revenue from marketplace services</p>\n <PagePurpose className=\"mt-1\">Track what you've earned on the marketplace — payouts, pending balances, and earning trends so you always know where you stand.</PagePurpose>\n </div>\n\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 Earnings</CardTitle>\n <DollarSign className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">${totalEarnings.toLocaleString()}</div>\n <div className=\"flex items-center text-xs text-status-success-text\">\n <ArrowUp className=\"mr-1 h-3 w-3\" />+{growthBase}% from recent cycle\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\">Avg Order Value</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 ${Math.round(totalEarnings / Math.max(totalOrders, 1)).toLocaleString()}\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\">Pending</CardTitle>\n <Wallet className=\"h-4 w-4 text-status-warning-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">${pendingAmount.toLocaleString()}</div>\n </CardContent>\n </GlassCard>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle>Earnings Trend</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {earningsData.map((earning, index) => (\n <div key={`${earning.month}-${index}`} className=\"flex items-center gap-3\">\n <span className=\"w-10 text-sm text-text-secondary\">{earning.month}</span>\n <div className=\"h-4 flex-1 overflow-hidden rounded bg-bg-sunken\">\n <div\n className=\"h-4 rounded bg-action-primary-bg\"\n style={{ width: `${Math.round((earning.amount / maxEarning) * 100)}%` }}\n />\n </div>\n <span className=\"w-16 text-right text-sm font-medium\">\n ${(earning.amount / 1000).toFixed(1)}K\n </span>\n <Badge variant=\"outline\" className=\"text-[10px]\">\n {earning.orders} orders\n </Badge>\n </div>\n ))}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>Recent Payments</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {recentPayments.map((payment) => (\n <div key={payment.id} className=\"flex items-center justify-between rounded border p-3\">\n <div>\n <p className=\"text-sm font-medium\">{payment.client}</p>\n <p className=\"text-xs text-text-secondary\">\n {payment.service} · {payment.date}\n </p>\n </div>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-bold\">${payment.amount.toLocaleString()}</span>\n <Badge\n variant={payment.status === 'completed' ? 'default' : 'secondary'}\n className=\"text-[10px]\"\n >\n {payment.status}\n </Badge>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MarketplaceEarningsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/MarketplaceEarningsPagePage.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport {\n Badge,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n GlassCard,\n GradientText,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport { DollarSign, TrendingUp, Wallet } from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\ntype EarningPoint = {\n month: string;\n amount: number;\n orders: number;\n};\n\ntype PaymentItem = {\n id: string;\n client: string;\n amount: number;\n date: string;\n status: 'completed' | 'pending';\n};\n\nconst monthLabel = (value: string): string => {\n const parsed = new Date(value);\n if (Number.isNaN(parsed.getTime())) {\n return 'N/A';\n }\n return parsed.toLocaleString('en-US', { month: 'short' });\n};\n\nconst isoDate = (value: string): string => {\n const parsed = new Date(value);\n if (Number.isNaN(parsed.getTime())) {\n return 'Unknown';\n }\n return parsed.toISOString().split('T')[0];\n};\n\nexport function MarketplaceEarningsPagePage() {\n const { invoices } = useCrewFoundryStore();\n\n const recentPayments = useMemo<PaymentItem[]>(() => {\n return invoices.slice(0, 12).map((invoice) => ({\n id: invoice.id,\n client: invoice.clientName,\n amount: invoice.amount,\n date: isoDate(invoice.issueDate),\n status: invoice.status === 'paid' ? 'completed' : 'pending',\n }));\n }, [invoices]);\n\n const earningsData = useMemo<EarningPoint[]>(() => {\n return recentPayments.slice(0, 6).map((payment, index) => {\n const sibling = recentPayments.filter(\n (item) => monthLabel(item.date) === monthLabel(payment.date)\n );\n const amount = sibling.reduce((sum, item) => sum + item.amount, 0);\n return {\n month: monthLabel(payment.date) || `M${index + 1}`,\n amount,\n orders: sibling.length,\n };\n });\n }, [recentPayments]);\n\n const totalEarnings = earningsData.reduce((sum, point) => sum + point.amount, 0);\n const maxEarning = Math.max(1, ...earningsData.map((point) => point.amount));\n const totalOrders = earningsData.reduce((sum, point) => sum + point.orders, 0);\n const pendingAmount = recentPayments\n .filter((payment) => payment.status === 'pending')\n .reduce((sum, payment) => sum + payment.amount, 0);\n\n return (\n <div className=\"space-y-6 p-6\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>Earnings</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">Revenue from marketplace services</p>\n <PagePurpose className=\"mt-1\">Track what you've earned on the marketplace — payouts, pending balances, and earning trends so you always know where you stand.</PagePurpose>\n </div>\n\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 Earnings</CardTitle>\n <DollarSign className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">${totalEarnings.toLocaleString()}</div>\n <p className=\"text-xs text-text-secondary\">Across {totalOrders} paid orders</p>\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\">Avg Order Value</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 ${Math.round(totalEarnings / Math.max(totalOrders, 1)).toLocaleString()}\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\">Pending</CardTitle>\n <Wallet className=\"h-4 w-4 text-status-warning-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">${pendingAmount.toLocaleString()}</div>\n </CardContent>\n </GlassCard>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle>Earnings Trend</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {earningsData.map((earning, index) => (\n <div key={`${earning.month}-${index}`} className=\"flex items-center gap-3\">\n <span className=\"w-10 text-sm text-text-secondary\">{earning.month}</span>\n <div className=\"h-4 flex-1 overflow-hidden rounded bg-bg-sunken\">\n <div\n className=\"h-4 rounded bg-action-primary-bg\"\n style={{ width: `${Math.round((earning.amount / maxEarning) * 100)}%` }}\n />\n </div>\n <span className=\"w-16 text-right text-sm font-medium\">\n ${(earning.amount / 1000).toFixed(1)}K\n </span>\n <Badge variant=\"outline\" className=\"text-[10px]\">\n {earning.orders} orders\n </Badge>\n </div>\n ))}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>Recent Payments</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {recentPayments.map((payment) => (\n <div key={payment.id} className=\"flex items-center justify-between rounded border p-3\">\n <div>\n <p className=\"text-sm font-medium\">{payment.client}</p>\n <p className=\"text-xs text-text-secondary\">{payment.date}</p>\n </div>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-bold\">${payment.amount.toLocaleString()}</span>\n <Badge\n variant={payment.status === 'completed' ? 'default' : 'secondary'}\n className=\"text-[10px]\"\n >\n {payment.status}\n </Badge>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
|