@burdenoff/microfe-crewfoundry 2026.703.2 → 2026.704.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/dist/crewfoundry/pages/AdminAdminPagePage.js +117 -164
  2. package/dist/crewfoundry/pages/AdminAdminPagePage.js.map +1 -1
  3. package/dist/crewfoundry/pages/AnalyticsAnalyticsPagePage.js +99 -82
  4. package/dist/crewfoundry/pages/AnalyticsAnalyticsPagePage.js.map +1 -1
  5. package/dist/crewfoundry/pages/AnalyticsEmployeeAnalyticsPagePage.js +160 -192
  6. package/dist/crewfoundry/pages/AnalyticsEmployeeAnalyticsPagePage.js.map +1 -1
  7. package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js +238 -231
  8. package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js.map +1 -1
  9. package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.js +196 -166
  10. package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.js.map +1 -1
  11. package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js +45 -147
  12. package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js.map +1 -1
  13. package/dist/crewfoundry/pages/CommunicationsDirectoryPagePage.js +20 -11
  14. package/dist/crewfoundry/pages/CommunicationsDirectoryPagePage.js.map +1 -1
  15. package/dist/crewfoundry/pages/CommunicationsFilesPagePage.js +45 -152
  16. package/dist/crewfoundry/pages/CommunicationsFilesPagePage.js.map +1 -1
  17. package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js +50 -138
  18. package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js.map +1 -1
  19. package/dist/crewfoundry/pages/CommunicationsTeamsPagePage.js +149 -67
  20. package/dist/crewfoundry/pages/CommunicationsTeamsPagePage.js.map +1 -1
  21. package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js +50 -201
  22. package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js.map +1 -1
  23. package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js +205 -136
  24. package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js.map +1 -1
  25. package/dist/crewfoundry/pages/CompanyCompanyDashboardPagePage.js +25 -31
  26. package/dist/crewfoundry/pages/CompanyCompanyDashboardPagePage.js.map +1 -1
  27. package/dist/crewfoundry/pages/CompanyCompanyProfilePagePage.js +118 -104
  28. package/dist/crewfoundry/pages/CompanyCompanyProfilePagePage.js.map +1 -1
  29. package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js +117 -58
  30. package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js.map +1 -1
  31. package/dist/crewfoundry/pages/DashboardAnalyticsPagePage.js +90 -94
  32. package/dist/crewfoundry/pages/DashboardAnalyticsPagePage.js.map +1 -1
  33. package/dist/crewfoundry/pages/DashboardDashboardPagePage.js +210 -191
  34. package/dist/crewfoundry/pages/DashboardDashboardPagePage.js.map +1 -1
  35. package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js +213 -180
  36. package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js.map +1 -1
  37. package/dist/crewfoundry/pages/DashboardExecutiveDashboardPage.js +133 -264
  38. package/dist/crewfoundry/pages/DashboardExecutiveDashboardPage.js.map +1 -1
  39. package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.js +279 -212
  40. package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.js.map +1 -1
  41. package/dist/crewfoundry/pages/HiringApplicationsPagePage.js +131 -105
  42. package/dist/crewfoundry/pages/HiringApplicationsPagePage.js.map +1 -1
  43. package/dist/crewfoundry/pages/HiringCandidatesPagePage.js +167 -148
  44. package/dist/crewfoundry/pages/HiringCandidatesPagePage.js.map +1 -1
  45. package/dist/crewfoundry/pages/HiringCreateJobPagePage.js +3 -3
  46. package/dist/crewfoundry/pages/HiringCreateJobPagePage.js.map +1 -1
  47. package/dist/crewfoundry/pages/HiringInterviewsPagePage.js +13 -5
  48. package/dist/crewfoundry/pages/HiringInterviewsPagePage.js.map +1 -1
  49. package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js +151 -152
  50. package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js.map +1 -1
  51. package/dist/crewfoundry/pages/HiringJobsPagePage.js +38 -21
  52. package/dist/crewfoundry/pages/HiringJobsPagePage.js.map +1 -1
  53. package/dist/crewfoundry/pages/HrDepartmentsPagePage.js +3 -3
  54. package/dist/crewfoundry/pages/HrDepartmentsPagePage.js.map +1 -1
  55. package/dist/crewfoundry/pages/HrEmployeesPagePage.js +134 -127
  56. package/dist/crewfoundry/pages/HrEmployeesPagePage.js.map +1 -1
  57. package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js +163 -132
  58. package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js.map +1 -1
  59. package/dist/crewfoundry/pages/HrPayrollPagePage.js +202 -160
  60. package/dist/crewfoundry/pages/HrPayrollPagePage.js.map +1 -1
  61. package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js +104 -91
  62. package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js.map +1 -1
  63. package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js +29 -147
  64. package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js.map +1 -1
  65. package/dist/crewfoundry/pages/LearningCertificatesPagePage.js +22 -106
  66. package/dist/crewfoundry/pages/LearningCertificatesPagePage.js.map +1 -1
  67. package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js +74 -74
  68. package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js.map +1 -1
  69. package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js +101 -97
  70. package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js.map +1 -1
  71. package/dist/crewfoundry/pages/LearningCoursesPagePage.js +64 -47
  72. package/dist/crewfoundry/pages/LearningCoursesPagePage.js.map +1 -1
  73. package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.js +111 -121
  74. package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.js.map +1 -1
  75. package/dist/crewfoundry/pages/LearningLearningPagePage.js +131 -110
  76. package/dist/crewfoundry/pages/LearningLearningPagePage.js.map +1 -1
  77. package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js +65 -64
  78. package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js.map +1 -1
  79. package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js +58 -43
  80. package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js.map +1 -1
  81. package/dist/crewfoundry/pages/LearningMyLearningPagePage.js +66 -82
  82. package/dist/crewfoundry/pages/LearningMyLearningPagePage.js.map +1 -1
  83. package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js +38 -88
  84. package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js.map +1 -1
  85. package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js +59 -65
  86. package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js.map +1 -1
  87. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js +209 -323
  88. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js.map +1 -1
  89. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js +175 -220
  90. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js.map +1 -1
  91. package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js +74 -59
  92. package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js.map +1 -1
  93. package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js +96 -80
  94. package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js.map +1 -1
  95. package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.js +28 -100
  96. package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.js.map +1 -1
  97. package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js +27 -20
  98. package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js.map +1 -1
  99. package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js +73 -73
  100. package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js.map +1 -1
  101. package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js +62 -56
  102. package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js.map +1 -1
  103. package/dist/crewfoundry/pages/PaymentsEscrowPagePage.js +40 -138
  104. package/dist/crewfoundry/pages/PaymentsEscrowPagePage.js.map +1 -1
  105. package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js +126 -93
  106. package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js.map +1 -1
  107. package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js +99 -77
  108. package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js.map +1 -1
  109. package/dist/crewfoundry/pages/PaymentsSecurityPagePage.js +73 -74
  110. package/dist/crewfoundry/pages/PaymentsSecurityPagePage.js.map +1 -1
  111. package/dist/crewfoundry/pages/ProjectsCreateProjectPagePage.js +1 -1
  112. package/dist/crewfoundry/pages/ProjectsCreateProjectPagePage.js.map +1 -1
  113. package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js +122 -122
  114. package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js.map +1 -1
  115. package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js +130 -113
  116. package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js.map +1 -1
  117. package/dist/crewfoundry/pages/TeamsTeamAnalyticsPagePage.js +68 -59
  118. package/dist/crewfoundry/pages/TeamsTeamAnalyticsPagePage.js.map +1 -1
  119. package/dist/crewfoundry/pages/TeamsTeamDetailPagePage.js +73 -62
  120. package/dist/crewfoundry/pages/TeamsTeamDetailPagePage.js.map +1 -1
  121. package/dist/crewfoundry/pages/TeamsTeamDirectoryPagePage.js +82 -58
  122. package/dist/crewfoundry/pages/TeamsTeamDirectoryPagePage.js.map +1 -1
  123. package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js +153 -153
  124. package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js.map +1 -1
  125. package/dist/crewfoundry/pages/TeamsTeamsPagePage.js +63 -48
  126. package/dist/crewfoundry/pages/TeamsTeamsPagePage.js.map +1 -1
  127. package/package.json +1 -1
@@ -1,140 +1,90 @@
1
- import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
2
- import { useMemo as t } from "react";
3
- import { Calendar as n, CheckCircle as r, Clock as i, Plus as a } from "lucide-react";
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
- var _ = (e) => {
8
- let t = new Date(e);
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__ */ s("div", {
9
+ /* @__PURE__ */ a("div", {
32
10
  className: "flex items-center justify-between",
33
- children: [/* @__PURE__ */ s("div", { children: [
34
- /* @__PURE__ */ o("h1", {
11
+ children: [/* @__PURE__ */ a("div", { children: [
12
+ /* @__PURE__ */ i("h1", {
35
13
  className: "text-2xl font-semibold",
36
- children: /* @__PURE__ */ o(h, { children: "Booking Management" })
14
+ children: /* @__PURE__ */ i(f, { children: "Booking Management" })
37
15
  }),
38
- /* @__PURE__ */ o("p", {
16
+ /* @__PURE__ */ i("p", {
39
17
  className: "text-sm text-text-secondary",
40
18
  children: "Manage service provider appointments"
41
19
  }),
42
- /* @__PURE__ */ o(g, {
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__ */ s(l, {
24
+ ] }), /* @__PURE__ */ a(o, {
47
25
  size: "sm",
48
26
  disabled: !0,
49
27
  title: "Booking creation is coming soon",
50
- children: [/* @__PURE__ */ o(a, { className: "mr-1 h-4 w-4" }), "New Booking · Coming soon"]
28
+ children: [/* @__PURE__ */ i(r, { className: "mr-1 h-4 w-4" }), "New Booking · Coming soon"]
51
29
  })]
52
30
  }),
53
- /* @__PURE__ */ s("div", {
31
+ /* @__PURE__ */ a("div", {
54
32
  className: "grid gap-4 md:grid-cols-3",
55
33
  children: [
56
- /* @__PURE__ */ s(m, {
34
+ /* @__PURE__ */ a(d, {
57
35
  treatment: "glass",
58
36
  glow: !0,
59
37
  className: "border-border-seam",
60
- children: [/* @__PURE__ */ s(f, {
38
+ children: [/* @__PURE__ */ a(l, {
61
39
  className: "flex flex-row items-center justify-between space-y-0 pb-2",
62
- children: [/* @__PURE__ */ o(p, {
40
+ children: [/* @__PURE__ */ i(u, {
63
41
  className: "text-sm font-medium",
64
42
  children: "Upcoming"
65
- }), /* @__PURE__ */ o(n, { className: "h-4 w-4 text-status-info-text" })]
66
- }), /* @__PURE__ */ o(d, { children: /* @__PURE__ */ o("div", {
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: x.filter((e) => e.status !== "completed").length
46
+ children: 0
69
47
  }) })]
70
48
  }),
71
- /* @__PURE__ */ s(m, {
49
+ /* @__PURE__ */ a(d, {
72
50
  treatment: "metric",
73
51
  className: "border-border-seam",
74
- children: [/* @__PURE__ */ s(f, {
52
+ children: [/* @__PURE__ */ a(l, {
75
53
  className: "flex flex-row items-center justify-between space-y-0 pb-2",
76
- children: [/* @__PURE__ */ o(p, {
54
+ children: [/* @__PURE__ */ i(u, {
77
55
  className: "text-sm font-medium",
78
56
  children: "Confirmed"
79
- }), /* @__PURE__ */ o(r, { className: "h-4 w-4 text-status-success-text" })]
80
- }), /* @__PURE__ */ o(d, { children: /* @__PURE__ */ o("div", {
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: x.filter((e) => e.status === "confirmed").length
60
+ children: 0
83
61
  }) })]
84
62
  }),
85
- /* @__PURE__ */ s(m, {
63
+ /* @__PURE__ */ a(d, {
86
64
  treatment: "metric",
87
65
  className: "border-border-seam",
88
- children: [/* @__PURE__ */ s(f, {
66
+ children: [/* @__PURE__ */ a(l, {
89
67
  className: "flex flex-row items-center justify-between space-y-0 pb-2",
90
- children: [/* @__PURE__ */ o(p, {
68
+ children: [/* @__PURE__ */ i(u, {
91
69
  className: "text-sm font-medium",
92
70
  children: "Pending"
93
- }), /* @__PURE__ */ o(i, { className: "h-4 w-4 text-status-warning-text" })]
94
- }), /* @__PURE__ */ o(d, { children: /* @__PURE__ */ o("div", {
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: x.filter((e) => e.status === "pending").length
74
+ children: 0
97
75
  }) })]
98
76
  })
99
77
  ]
100
78
  }),
101
- /* @__PURE__ */ s(u, { children: [/* @__PURE__ */ o(f, { children: /* @__PURE__ */ o(p, { children: "All Bookings" }) }), /* @__PURE__ */ o(d, {
102
- className: "space-y-3",
103
- children: x.map((e) => /* @__PURE__ */ s("div", {
104
- className: "flex items-center justify-between rounded border p-4",
105
- children: [/* @__PURE__ */ s("div", { children: [/* @__PURE__ */ o("p", {
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 { v as MarketplaceBookingManagementPagePage };
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 { useMemo } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n GlassCard,\n GradientText,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport { Calendar, CheckCircle, Clock, Plus } from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\ntype Booking = {\n id: string;\n service: string;\n provider: string;\n date: string;\n time: string;\n duration: string;\n status: 'confirmed' | 'pending' | 'completed';\n};\n\nconst formatDate = (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 MarketplaceBookingManagementPagePage() {\n const { marketplaceServices, projects, teams } = useCrewFoundryStore();\n\n const bookings = useMemo<Booking[]>(() => {\n return marketplaceServices.slice(0, 12).map((service, index) => {\n const project = projects[index % Math.max(projects.length, 1)];\n const team = teams[index % Math.max(teams.length, 1)];\n const status: Booking['status'] =\n service.status === 'active'\n ? 'confirmed'\n : service.status === 'pending'\n ? 'pending'\n : 'completed';\n\n return {\n id: service.id,\n service: service.title,\n provider: service.provider,\n date: formatDate(project?.startDate || service.deliveryTime),\n time: `${String((index % 12) + 1).padStart(2, '0')}:00 ${index % 2 === 0 ? 'AM' : 'PM'}`,\n duration: `${Math.max(1, Math.ceil((team?.memberCount || 4) / 4))} hours`,\n status,\n };\n });\n }, [marketplaceServices, projects, teams]);\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\">\n {bookings.filter((booking) => booking.status !== 'completed').length}\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\">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\">\n {bookings.filter((booking) => booking.status === 'confirmed').length}\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 <Clock className=\"h-4 w-4 text-status-warning-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">\n {bookings.filter((booking) => booking.status === 'pending').length}\n </div>\n </CardContent>\n </GlassCard>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle>All Bookings</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {bookings.map((booking) => (\n <div key={booking.id} className=\"flex items-center justify-between rounded border p-4\">\n <div>\n <p className=\"text-sm font-medium\">{booking.service}</p>\n <p className=\"text-xs text-text-secondary\">{booking.provider}</p>\n </div>\n <div className=\"flex items-center gap-3\">\n <div className=\"text-right text-xs\">\n <p className=\"font-medium\">{booking.date}</p>\n <p className=\"text-text-secondary\">\n {booking.time} · {booking.duration}\n </p>\n </div>\n <Badge\n variant={\n booking.status === 'confirmed'\n ? 'default'\n : booking.status === 'completed'\n ? 'secondary'\n : 'outline'\n }\n className=\"text-[10px]\"\n >\n {booking.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":"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 { ArrowUp as n, DollarSign as r, TrendingUp as i, Wallet as a } from "lucide-react";
4
- import { jsx as o, jsxs as s } from "react/jsx-runtime";
5
- import { Badge as c, Card as l, CardContent as u, CardHeader as d, CardTitle as f, GlassCard as p, GradientText as m, PagePurpose as h } from "@burdenoff/fe-libs/ui";
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 g = (e) => {
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
- }, _ = (e) => {
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 v() {
15
- let { invoices: v, marketplaceServices: y, clients: b } = e(), x = t(() => v.slice(0, 12).map((e, t) => ({
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: _(e.issueDate),
19
+ date: g(e.issueDate),
21
20
  status: e.status === "paid" ? "completed" : "pending"
22
- })), [v, y]), S = t(() => x.slice(0, 6).map((e, t) => {
23
- let n = x.filter((t) => g(t.date) === g(e.date)), r = n.reduce((e, t) => e + t.amount, 0);
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: g(e.date) || `M${t + 1}`,
24
+ month: h(e.date) || `M${t + 1}`,
26
25
  amount: r,
27
26
  orders: n.length
28
27
  };
29
- }), [x]), C = S.reduce((e, t) => e + t.amount, 0), w = Math.max(1, ...S.map((e) => e.amount)), T = S.reduce((e, t) => e + t.orders, 0), E = x.filter((e) => e.status === "pending").reduce((e, t) => e + t.amount, 0), D = b.length > 0 ? Math.round(T / b.length * 100) : 0;
30
- return /* @__PURE__ */ s("div", {
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__ */ s("div", { children: [
34
- /* @__PURE__ */ o("h1", {
32
+ /* @__PURE__ */ o("div", { children: [
33
+ /* @__PURE__ */ a("h1", {
35
34
  className: "text-2xl font-semibold",
36
- children: /* @__PURE__ */ o(m, { children: "Earnings" })
35
+ children: /* @__PURE__ */ a(p, { children: "Earnings" })
37
36
  }),
38
- /* @__PURE__ */ o("p", {
37
+ /* @__PURE__ */ a("p", {
39
38
  className: "text-sm text-text-secondary",
40
39
  children: "Revenue from marketplace services"
41
40
  }),
42
- /* @__PURE__ */ o(h, {
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__ */ s("div", {
46
+ /* @__PURE__ */ o("div", {
48
47
  className: "grid gap-4 md:grid-cols-3",
49
48
  children: [
50
- /* @__PURE__ */ s(p, {
49
+ /* @__PURE__ */ o(f, {
51
50
  treatment: "glass",
52
51
  glow: !0,
53
52
  className: "border-border-seam",
54
- children: [/* @__PURE__ */ s(d, {
53
+ children: [/* @__PURE__ */ o(u, {
55
54
  className: "flex flex-row items-center justify-between space-y-0 pb-2",
56
- children: [/* @__PURE__ */ o(f, {
55
+ children: [/* @__PURE__ */ a(d, {
57
56
  className: "text-sm font-medium",
58
57
  children: "Total Earnings"
59
- }), /* @__PURE__ */ o(r, { className: "h-4 w-4 text-text-secondary" })]
60
- }), /* @__PURE__ */ s(u, { children: [/* @__PURE__ */ s("div", {
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: ["$", C.toLocaleString()]
63
- }), /* @__PURE__ */ s("div", {
64
- className: "flex items-center text-xs text-status-success-text",
61
+ children: ["$", b.toLocaleString()]
62
+ }), /* @__PURE__ */ o("p", {
63
+ className: "text-xs text-text-secondary",
65
64
  children: [
66
- /* @__PURE__ */ o(n, { className: "mr-1 h-3 w-3" }),
67
- "+",
68
- D,
69
- "% from recent cycle"
65
+ "Across ",
66
+ S,
67
+ " paid orders"
70
68
  ]
71
69
  })] })]
72
70
  }),
73
- /* @__PURE__ */ s(p, {
71
+ /* @__PURE__ */ o(f, {
74
72
  treatment: "metric",
75
73
  className: "border-border-seam",
76
- children: [/* @__PURE__ */ s(d, {
74
+ children: [/* @__PURE__ */ o(u, {
77
75
  className: "flex flex-row items-center justify-between space-y-0 pb-2",
78
- children: [/* @__PURE__ */ o(f, {
76
+ children: [/* @__PURE__ */ a(d, {
79
77
  className: "text-sm font-medium",
80
78
  children: "Avg Order Value"
81
- }), /* @__PURE__ */ o(i, { className: "h-4 w-4 text-text-secondary" })]
82
- }), /* @__PURE__ */ o(u, { children: /* @__PURE__ */ s("div", {
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(C / Math.max(T, 1)).toLocaleString()]
82
+ children: ["$", Math.round(b / Math.max(S, 1)).toLocaleString()]
85
83
  }) })]
86
84
  }),
87
- /* @__PURE__ */ s(p, {
85
+ /* @__PURE__ */ o(f, {
88
86
  treatment: "metric",
89
87
  className: "border-border-seam",
90
- children: [/* @__PURE__ */ s(d, {
88
+ children: [/* @__PURE__ */ o(u, {
91
89
  className: "flex flex-row items-center justify-between space-y-0 pb-2",
92
- children: [/* @__PURE__ */ o(f, {
90
+ children: [/* @__PURE__ */ a(d, {
93
91
  className: "text-sm font-medium",
94
92
  children: "Pending"
95
- }), /* @__PURE__ */ o(a, { className: "h-4 w-4 text-status-warning-text" })]
96
- }), /* @__PURE__ */ o(u, { children: /* @__PURE__ */ s("div", {
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: ["$", E.toLocaleString()]
96
+ children: ["$", C.toLocaleString()]
99
97
  }) })]
100
98
  })
101
99
  ]
102
100
  }),
103
- /* @__PURE__ */ s(l, { children: [/* @__PURE__ */ o(d, { children: /* @__PURE__ */ o(f, { children: "Earnings Trend" }) }), /* @__PURE__ */ o(u, {
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: S.map((e, t) => /* @__PURE__ */ s("div", {
103
+ children: y.map((e, t) => /* @__PURE__ */ o("div", {
106
104
  className: "flex items-center gap-3",
107
105
  children: [
108
- /* @__PURE__ */ o("span", {
106
+ /* @__PURE__ */ a("span", {
109
107
  className: "w-10 text-sm text-text-secondary",
110
108
  children: e.month
111
109
  }),
112
- /* @__PURE__ */ o("div", {
110
+ /* @__PURE__ */ a("div", {
113
111
  className: "h-4 flex-1 overflow-hidden rounded bg-bg-sunken",
114
- children: /* @__PURE__ */ o("div", {
112
+ children: /* @__PURE__ */ a("div", {
115
113
  className: "h-4 rounded bg-action-primary-bg",
116
- style: { width: `${Math.round(e.amount / w * 100)}%` }
114
+ style: { width: `${Math.round(e.amount / x * 100)}%` }
117
115
  })
118
116
  }),
119
- /* @__PURE__ */ s("span", {
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(c, {
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__ */ s(l, { children: [/* @__PURE__ */ o(d, { children: /* @__PURE__ */ o(f, { children: "Recent Payments" }) }), /* @__PURE__ */ o(u, {
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: x.map((e) => /* @__PURE__ */ s("div", {
135
+ children: v.map((e) => /* @__PURE__ */ o("div", {
138
136
  className: "flex items-center justify-between rounded border p-3",
139
- children: [/* @__PURE__ */ s("div", { children: [/* @__PURE__ */ o("p", {
137
+ children: [/* @__PURE__ */ o("div", { children: [/* @__PURE__ */ a("p", {
140
138
  className: "text-sm font-medium",
141
139
  children: e.client
142
- }), /* @__PURE__ */ s("p", {
140
+ }), /* @__PURE__ */ a("p", {
143
141
  className: "text-xs text-text-secondary",
144
- children: [
145
- e.service,
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__ */ s("span", {
145
+ children: [/* @__PURE__ */ o("span", {
152
146
  className: "text-sm font-bold",
153
147
  children: ["$", e.amount.toLocaleString()]
154
- }), /* @__PURE__ */ o(c, {
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 { v as MarketplaceEarningsPagePage };
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&apos;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&apos;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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"}