@burdenoff/microfe-crewfoundry 2026.1013.1 → 2026.1029.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 (214) hide show
  1. package/dist/crewfoundry/CrewFoundryRoot.d.ts.map +1 -1
  2. package/dist/crewfoundry/CrewFoundryRoot.js +160 -256
  3. package/dist/crewfoundry/CrewFoundryRoot.js.map +1 -1
  4. package/dist/crewfoundry/CrewFoundryRoutes.d.ts.map +1 -1
  5. package/dist/crewfoundry/CrewFoundryRoutes.js +152 -192
  6. package/dist/crewfoundry/CrewFoundryRoutes.js.map +1 -1
  7. package/dist/crewfoundry/components/InlineError.d.ts +5 -0
  8. package/dist/crewfoundry/components/InlineError.d.ts.map +1 -0
  9. package/dist/crewfoundry/components/InlineError.js +17 -0
  10. package/dist/crewfoundry/components/InlineError.js.map +1 -0
  11. package/dist/crewfoundry/components/forms/FormModal.d.ts +25 -1
  12. package/dist/crewfoundry/components/forms/FormModal.d.ts.map +1 -1
  13. package/dist/crewfoundry/components/forms/FormModal.js +151 -136
  14. package/dist/crewfoundry/components/forms/FormModal.js.map +1 -1
  15. package/dist/crewfoundry/components/marketplace/BookServiceModal.d.ts +14 -0
  16. package/dist/crewfoundry/components/marketplace/BookServiceModal.d.ts.map +1 -0
  17. package/dist/crewfoundry/components/marketplace/BookServiceModal.js +75 -0
  18. package/dist/crewfoundry/components/marketplace/BookServiceModal.js.map +1 -0
  19. package/dist/crewfoundry/components/marketplace/MarketplaceTabs.d.ts +24 -0
  20. package/dist/crewfoundry/components/marketplace/MarketplaceTabs.d.ts.map +1 -0
  21. package/dist/crewfoundry/components/marketplace/MarketplaceTabs.js +47 -0
  22. package/dist/crewfoundry/components/marketplace/MarketplaceTabs.js.map +1 -0
  23. package/dist/crewfoundry/components/marketplace/ServiceListingModal.d.ts +12 -0
  24. package/dist/crewfoundry/components/marketplace/ServiceListingModal.d.ts.map +1 -0
  25. package/dist/crewfoundry/components/marketplace/ServiceListingModal.js +123 -0
  26. package/dist/crewfoundry/components/marketplace/ServiceListingModal.js.map +1 -0
  27. package/dist/crewfoundry/components/viz/CertificateCard.js +4 -118
  28. package/dist/crewfoundry/components/viz/PathSteps.js +3 -68
  29. package/dist/crewfoundry/components/viz/lib/geometry.js +5 -13
  30. package/dist/crewfoundry/components/viz/lib/geometry.js.map +1 -1
  31. package/dist/crewfoundry/lib/analytics.d.ts +1 -6
  32. package/dist/crewfoundry/lib/analytics.d.ts.map +1 -1
  33. package/dist/crewfoundry/lib/analytics.js +3 -18
  34. package/dist/crewfoundry/lib/analytics.js.map +1 -1
  35. package/dist/crewfoundry/lib/companyFinance.d.ts +3 -7
  36. package/dist/crewfoundry/lib/companyFinance.d.ts.map +1 -1
  37. package/dist/crewfoundry/lib/companyFinance.js +3 -8
  38. package/dist/crewfoundry/lib/companyFinance.js.map +1 -1
  39. package/dist/crewfoundry/lib/learning.d.ts +12 -0
  40. package/dist/crewfoundry/lib/learning.d.ts.map +1 -0
  41. package/dist/crewfoundry/lib/learning.js +26 -0
  42. package/dist/crewfoundry/lib/learning.js.map +1 -0
  43. package/dist/crewfoundry/lib/marketplace.d.ts +30 -0
  44. package/dist/crewfoundry/lib/marketplace.d.ts.map +1 -0
  45. package/dist/crewfoundry/lib/marketplace.js +91 -0
  46. package/dist/crewfoundry/lib/marketplace.js.map +1 -0
  47. package/dist/crewfoundry/lib/useEnsureLoaded.d.ts +7 -0
  48. package/dist/crewfoundry/lib/useEnsureLoaded.d.ts.map +1 -0
  49. package/dist/crewfoundry/lib/useEnsureLoaded.js +25 -0
  50. package/dist/crewfoundry/lib/useEnsureLoaded.js.map +1 -0
  51. package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.d.ts.map +1 -1
  52. package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js +12 -25
  53. package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js.map +1 -1
  54. package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.d.ts.map +1 -1
  55. package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.js +49 -49
  56. package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.js.map +1 -1
  57. package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.d.ts.map +1 -1
  58. package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js +145 -157
  59. package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js.map +1 -1
  60. package/dist/crewfoundry/pages/CompanyClientManagementPagePage.d.ts.map +1 -1
  61. package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js +14 -14
  62. package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js.map +1 -1
  63. package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.d.ts.map +1 -1
  64. package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js +14 -14
  65. package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js.map +1 -1
  66. package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.d.ts.map +1 -1
  67. package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.js +71 -33
  68. package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.js.map +1 -1
  69. package/dist/crewfoundry/pages/HiringCreateJobPagePage.d.ts.map +1 -1
  70. package/dist/crewfoundry/pages/HiringCreateJobPagePage.js +260 -115
  71. package/dist/crewfoundry/pages/HiringCreateJobPagePage.js.map +1 -1
  72. package/dist/crewfoundry/pages/HiringJobDetailsPagePage.d.ts.map +1 -1
  73. package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js +199 -166
  74. package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js.map +1 -1
  75. package/dist/crewfoundry/pages/HiringJobsPagePage.d.ts.map +1 -1
  76. package/dist/crewfoundry/pages/HiringJobsPagePage.js +118 -104
  77. package/dist/crewfoundry/pages/HiringJobsPagePage.js.map +1 -1
  78. package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.d.ts.map +1 -1
  79. package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js +247 -173
  80. package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js.map +1 -1
  81. package/dist/crewfoundry/pages/LearningCoursesPagePage.d.ts +12 -0
  82. package/dist/crewfoundry/pages/LearningCoursesPagePage.d.ts.map +1 -1
  83. package/dist/crewfoundry/pages/LearningCoursesPagePage.js +307 -293
  84. package/dist/crewfoundry/pages/LearningCoursesPagePage.js.map +1 -1
  85. package/dist/crewfoundry/pages/LearningEnrollmentsPagePage.d.ts +2 -0
  86. package/dist/crewfoundry/pages/LearningEnrollmentsPagePage.d.ts.map +1 -0
  87. package/dist/crewfoundry/pages/LearningEnrollmentsPagePage.js +223 -0
  88. package/dist/crewfoundry/pages/LearningEnrollmentsPagePage.js.map +1 -0
  89. package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.d.ts +4 -0
  90. package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.d.ts.map +1 -1
  91. package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.js +115 -160
  92. package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.js.map +1 -1
  93. package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.d.ts.map +1 -1
  94. package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js +165 -75
  95. package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js.map +1 -1
  96. package/dist/crewfoundry/pages/MarketplaceEscrowPagePage.d.ts +7 -0
  97. package/dist/crewfoundry/pages/MarketplaceEscrowPagePage.d.ts.map +1 -0
  98. package/dist/crewfoundry/pages/MarketplaceEscrowPagePage.js +175 -0
  99. package/dist/crewfoundry/pages/MarketplaceEscrowPagePage.js.map +1 -0
  100. package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.d.ts.map +1 -1
  101. package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js +182 -223
  102. package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js.map +1 -1
  103. package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.d.ts.map +1 -1
  104. package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js +168 -227
  105. package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js.map +1 -1
  106. package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.d.ts.map +1 -1
  107. package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js +127 -290
  108. package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js.map +1 -1
  109. package/dist/crewfoundry/store/crewfoundryStore.d.ts +139 -79
  110. package/dist/crewfoundry/store/crewfoundryStore.d.ts.map +1 -1
  111. package/dist/crewfoundry/store/crewfoundryStore.js +323 -244
  112. package/dist/crewfoundry/store/crewfoundryStore.js.map +1 -1
  113. package/dist/crewfoundry/utils/dateUtils.d.ts +52 -0
  114. package/dist/crewfoundry/utils/dateUtils.d.ts.map +1 -0
  115. package/dist/crewfoundry/utils/dateUtils.js +31 -0
  116. package/dist/crewfoundry/utils/dateUtils.js.map +1 -0
  117. package/dist/generated/global-types.d.ts +5145 -1627
  118. package/dist/generated/global-types.d.ts.map +1 -1
  119. package/dist/generated/wspace-types.d.ts +100373 -34602
  120. package/dist/generated/wspace-types.d.ts.map +1 -1
  121. package/dist/utils/pageContext.d.ts.map +1 -1
  122. package/dist/utils/pageContext.js +0 -1
  123. package/dist/utils/pageContext.js.map +1 -1
  124. package/package.json +1 -1
  125. package/dist/crewfoundry/components/viz/CertificateCard.js.map +0 -1
  126. package/dist/crewfoundry/components/viz/PathSteps.js.map +0 -1
  127. package/dist/crewfoundry/pages/CommunicationsCallsPagePage.d.ts +0 -2
  128. package/dist/crewfoundry/pages/CommunicationsCallsPagePage.d.ts.map +0 -1
  129. package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js +0 -53
  130. package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js.map +0 -1
  131. package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.d.ts +0 -2
  132. package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.d.ts.map +0 -1
  133. package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js +0 -107
  134. package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js.map +0 -1
  135. package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.d.ts +0 -2
  136. package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.d.ts.map +0 -1
  137. package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js +0 -62
  138. package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js.map +0 -1
  139. package/dist/crewfoundry/pages/LearningAssessmentsPagePage.d.ts +0 -2
  140. package/dist/crewfoundry/pages/LearningAssessmentsPagePage.d.ts.map +0 -1
  141. package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js +0 -37
  142. package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js.map +0 -1
  143. package/dist/crewfoundry/pages/LearningCertificatesPagePage.d.ts +0 -2
  144. package/dist/crewfoundry/pages/LearningCertificatesPagePage.d.ts.map +0 -1
  145. package/dist/crewfoundry/pages/LearningCertificatesPagePage.js +0 -111
  146. package/dist/crewfoundry/pages/LearningCertificatesPagePage.js.map +0 -1
  147. package/dist/crewfoundry/pages/LearningCourseLearningPagePage.d.ts +0 -2
  148. package/dist/crewfoundry/pages/LearningCourseLearningPagePage.d.ts.map +0 -1
  149. package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js +0 -309
  150. package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js.map +0 -1
  151. package/dist/crewfoundry/pages/LearningLearningPagePage.d.ts +0 -2
  152. package/dist/crewfoundry/pages/LearningLearningPagePage.d.ts.map +0 -1
  153. package/dist/crewfoundry/pages/LearningLearningPagePage.js +0 -200
  154. package/dist/crewfoundry/pages/LearningLearningPagePage.js.map +0 -1
  155. package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.d.ts +0 -2
  156. package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.d.ts.map +0 -1
  157. package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js +0 -190
  158. package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js.map +0 -1
  159. package/dist/crewfoundry/pages/LearningLearningPathsPagePage.d.ts +0 -2
  160. package/dist/crewfoundry/pages/LearningLearningPathsPagePage.d.ts.map +0 -1
  161. package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js +0 -230
  162. package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js.map +0 -1
  163. package/dist/crewfoundry/pages/LearningMyLearningPagePage.d.ts +0 -2
  164. package/dist/crewfoundry/pages/LearningMyLearningPagePage.d.ts.map +0 -1
  165. package/dist/crewfoundry/pages/LearningMyLearningPagePage.js +0 -293
  166. package/dist/crewfoundry/pages/LearningMyLearningPagePage.js.map +0 -1
  167. package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.d.ts +0 -2
  168. package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.d.ts.map +0 -1
  169. package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js +0 -163
  170. package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js.map +0 -1
  171. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.d.ts +0 -2
  172. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.d.ts.map +0 -1
  173. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js +0 -365
  174. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js.map +0 -1
  175. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.d.ts +0 -2
  176. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.d.ts.map +0 -1
  177. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js +0 -224
  178. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js.map +0 -1
  179. package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.d.ts +0 -2
  180. package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.d.ts.map +0 -1
  181. package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js +0 -180
  182. package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js.map +0 -1
  183. package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.d.ts +0 -2
  184. package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.d.ts.map +0 -1
  185. package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.js +0 -38
  186. package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.js.map +0 -1
  187. package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.d.ts +0 -2
  188. package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.d.ts.map +0 -1
  189. package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js +0 -204
  190. package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js.map +0 -1
  191. package/dist/crewfoundry/pages/PaymentsEscrowPagePage.d.ts +0 -2
  192. package/dist/crewfoundry/pages/PaymentsEscrowPagePage.d.ts.map +0 -1
  193. package/dist/crewfoundry/pages/PaymentsEscrowPagePage.js +0 -55
  194. package/dist/crewfoundry/pages/PaymentsEscrowPagePage.js.map +0 -1
  195. package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.d.ts +0 -2
  196. package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.d.ts.map +0 -1
  197. package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js +0 -335
  198. package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js.map +0 -1
  199. package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.d.ts +0 -2
  200. package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.d.ts.map +0 -1
  201. package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js +0 -160
  202. package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js.map +0 -1
  203. package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.d.ts +0 -2
  204. package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.d.ts.map +0 -1
  205. package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js +0 -80
  206. package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js.map +0 -1
  207. package/dist/crewfoundry/pages/PaymentsSecurityPagePage.d.ts +0 -2
  208. package/dist/crewfoundry/pages/PaymentsSecurityPagePage.d.ts.map +0 -1
  209. package/dist/crewfoundry/pages/PaymentsSecurityPagePage.js +0 -191
  210. package/dist/crewfoundry/pages/PaymentsSecurityPagePage.js.map +0 -1
  211. package/dist/crewfoundry/utils/courseProgress.d.ts +0 -33
  212. package/dist/crewfoundry/utils/courseProgress.d.ts.map +0 -1
  213. package/dist/crewfoundry/utils/courseProgress.js +0 -46
  214. package/dist/crewfoundry/utils/courseProgress.js.map +0 -1
@@ -1 +1 @@
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\">\n Manage your service bookings — review upcoming engagements, confirm schedules, and keep\n your client commitments on track.\n </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;MAGhB,CAAA;KACV,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;iBAjCH;OAiC0D,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;iBAzCF;OAyC0D,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;iBAjDJ;OAiD0D,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
+ {"version":3,"file":"MarketplaceBookingManagementPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/MarketplaceBookingManagementPagePage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n GradientText,\n IllustratedEmptyState,\n PagePurpose,\n ResponsiveTable,\n Spinner,\n type ResponsiveTableColumn,\n} from '@burdenoff/fe-libs/ui';\nimport { useNavigate } from 'react-router';\nimport { InlineError } from '../components/InlineError';\nimport { MarketplaceTabs } from '../components/marketplace/MarketplaceTabs';\nimport { SegmentedTabs, StatCard } from '../components/viz';\nimport {\n useCrewFoundryStore,\n type CrewBooking,\n type CrewBookingStatus,\n} from '../store/crewfoundryStore';\nimport {\n BOOKING_ACTION_LABEL,\n BOOKING_STATUS_LABEL,\n allowedBookingTransitions,\n formatRate,\n} from '../lib/marketplace';\nimport { useEnsureLoaded } from '../lib/useEnsureLoaded';\nimport { formatDate } from '../utils/dateUtils';\n\ntype View = 'provider' | 'client';\n\nconst STATUS_VARIANT: Record<CrewBookingStatus, 'default' | 'secondary' | 'outline'> = {\n requested: 'outline',\n confirmed: 'default',\n completed: 'secondary',\n cancelled: 'secondary',\n};\n\nexport function MarketplaceBookingManagementPagePage() {\n const navigate = useNavigate();\n const { bookings, marketplaceLoaded, fetchMarketplace, updateBookingStatus, initParams } =\n useCrewFoundryStore();\n const loadError = useEnsureLoaded(marketplaceLoaded, fetchMarketplace);\n const [view, setView] = useState<View>('provider');\n const [actionError, setActionError] = useState<string | null>(null);\n const [pendingId, setPendingId] = useState<string | null>(null);\n\n const actorId = initParams.actorId;\n const asProvider = bookings.filter((booking) => booking.providerActorId === actorId);\n const asClient = bookings.filter((booking) => booking.clientActorId === actorId);\n const rows = view === 'provider' ? asProvider : asClient;\n const count = (list: CrewBooking[], status: CrewBookingStatus) =>\n list.filter((booking) => booking.status === status).length;\n\n const transition = async (booking: CrewBooking, status: CrewBookingStatus) => {\n setActionError(null);\n setPendingId(booking.id);\n try {\n await updateBookingStatus(booking.id, status);\n } catch (error) {\n setActionError(error instanceof Error ? error.message : 'Unable to update booking');\n } finally {\n setPendingId(null);\n }\n };\n\n const columns: ResponsiveTableColumn<CrewBooking>[] = [\n {\n key: 'service',\n header: 'Service',\n priority: 'primary',\n cell: (booking) => (\n <button\n type=\"button\"\n className=\"text-left font-medium hover:underline\"\n onClick={() =>\n navigate(\n `../marketplace/service-details-page?id=${encodeURIComponent(booking.listingId)}`\n )\n }\n >\n {booking.listingTitle}\n </button>\n ),\n },\n {\n key: 'party',\n header: view === 'provider' ? 'Booked by' : 'Provider',\n cell: (booking) => (\n <span>{view === 'provider' ? booking.clientName : booking.providerName}</span>\n ),\n },\n {\n key: 'when',\n header: 'Scheduled',\n cell: (booking) => (\n <span className=\"text-text-secondary\">\n {booking.scheduledStart\n ? `${formatDate(booking.scheduledStart)}${booking.scheduledEnd ? ` – ${formatDate(booking.scheduledEnd)}` : ''}`\n : 'Not scheduled'}\n </span>\n ),\n },\n {\n key: 'rate',\n header: 'Agreed rate',\n cell: (booking) => <span className=\"tabular-nums\">{formatRate(booking)}</span>,\n },\n {\n key: 'status',\n header: 'Status',\n cell: (booking) => (\n <Badge variant={STATUS_VARIANT[booking.status]} className=\"text-[10px]\">\n {BOOKING_STATUS_LABEL[booking.status]}\n </Badge>\n ),\n },\n {\n key: 'actions',\n header: '',\n cellClassName: 'md:text-right',\n cell: (booking) => {\n const next = allowedBookingTransitions(booking, actorId);\n if (next.length === 0) {\n return <span className=\"text-xs text-text-muted\">—</span>;\n }\n return (\n <div className=\"flex flex-wrap justify-end gap-1\">\n {next.map((status) => (\n <Button\n key={status}\n size=\"sm\"\n variant={status === 'cancelled' ? 'ghost' : 'outline'}\n disabled={pendingId === booking.id}\n onClick={() => void transition(booking, status)}\n >\n {BOOKING_ACTION_LABEL[status]}\n </Button>\n ))}\n </div>\n );\n },\n },\n ];\n\n return (\n <div className=\"space-y-6 p-6\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>Bookings</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\n {asProvider.length} for your services · {asClient.length} you made\n </p>\n <PagePurpose className=\"mt-1\">\n Confirm requests for your services, mark work completed, and keep track of the services\n you have booked from others.\n </PagePurpose>\n </div>\n\n <MarketplaceTabs value=\"bookings\" />\n\n <InlineError message={loadError ?? actionError} />\n\n <div className=\"grid gap-4 sm:grid-cols-2 xl:grid-cols-4\">\n <StatCard label=\"Requested\" value={count(rows, 'requested')} />\n <StatCard label=\"Confirmed\" value={count(rows, 'confirmed')} />\n <StatCard label=\"Completed\" value={count(rows, 'completed')} />\n <StatCard label=\"Cancelled\" value={count(rows, 'cancelled')} />\n </div>\n\n <SegmentedTabs\n aria-label=\"Booking perspective\"\n value={view}\n onChange={(id) => setView(id as View)}\n tabs={[\n { id: 'provider', label: 'Requests for my services', count: asProvider.length },\n { id: 'client', label: 'My bookings', count: asClient.length },\n ]}\n />\n\n {!marketplaceLoaded && !loadError ? (\n <div className=\"flex min-h-[240px] items-center justify-center\">\n <Spinner size=\"lg\" />\n </div>\n ) : rows.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title={view === 'provider' ? 'No booking requests yet' : \"You haven't booked anything\"}\n description={\n view === 'provider'\n ? 'Requests appear here when a colleague books one of your services.'\n : 'Browse the marketplace to book a colleague or contractor.'\n }\n action={\n <Button size=\"sm\" onClick={() => navigate('../marketplace/marketplace-page')}>\n Browse the marketplace\n </Button>\n }\n />\n ) : (\n <Card>\n <CardContent className=\"pt-6\">\n <ResponsiveTable<CrewBooking>\n data={rows}\n rowKey={(booking) => booking.id}\n columns={columns}\n />\n </CardContent>\n </Card>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;AAiCA,IAAM,IAAiF;CACrF,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACZ;AAED,SAAgB,IAAuC;CACrD,IAAM,IAAW,GAAa,EACxB,EAAE,aAAU,sBAAmB,qBAAkB,wBAAqB,kBAC1E,GAAqB,EACjB,IAAY,EAAgB,GAAmB,EAAiB,EAChE,CAAC,GAAM,KAAW,EAAe,WAAW,EAC5C,CAAC,GAAa,KAAkB,EAAwB,KAAK,EAC7D,CAAC,GAAW,KAAgB,EAAwB,KAAK,EAEzD,IAAU,EAAW,SACrB,IAAa,EAAS,QAAQ,MAAY,EAAQ,oBAAoB,EAAQ,EAC9E,IAAW,EAAS,QAAQ,MAAY,EAAQ,kBAAkB,EAAQ,EAC1E,IAAO,MAAS,aAAa,IAAa,GAC1C,KAAS,GAAqB,MAClC,EAAK,QAAQ,MAAY,EAAQ,WAAW,EAAO,CAAC,QAEhD,IAAa,OAAO,GAAsB,MAA8B;AAE5E,EADA,EAAe,KAAK,EACpB,EAAa,EAAQ,GAAG;AACxB,MAAI;AACF,SAAM,EAAoB,EAAQ,IAAI,EAAO;WACtC,GAAO;AACd,KAAe,aAAiB,QAAQ,EAAM,UAAU,2BAA2B;YAC3E;AACR,KAAa,KAAK;;IAIhB,IAAgD;EACpD;GACE,KAAK;GACL,QAAQ;GACR,UAAU;GACV,OAAO,MACL,kBAAC,UAAD;IACE,MAAK;IACL,WAAU;IACV,eACE,EACE,0CAA0C,mBAAmB,EAAQ,UAAU,GAChF;cAGF,EAAQ;IACF,CAAA;GAEZ;EACD;GACE,KAAK;GACL,QAAQ,MAAS,aAAa,cAAc;GAC5C,OAAO,MACL,kBAAC,QAAD,EAAA,UAAO,MAAS,aAAa,EAAQ,aAAa,EAAQ,cAAoB,CAAA;GAEjF;EACD;GACE,KAAK;GACL,QAAQ;GACR,OAAO,MACL,kBAAC,QAAD;IAAM,WAAU;cACb,EAAQ,iBACL,GAAG,EAAW,EAAQ,eAAe,GAAG,EAAQ,eAAe,MAAM,EAAW,EAAQ,aAAa,KAAK,OAC1G;IACC,CAAA;GAEV;EACD;GACE,KAAK;GACL,QAAQ;GACR,OAAO,MAAY,kBAAC,QAAD;IAAM,WAAU;cAAgB,EAAW,EAAQ;IAAQ,CAAA;GAC/E;EACD;GACE,KAAK;GACL,QAAQ;GACR,OAAO,MACL,kBAAC,GAAD;IAAO,SAAS,EAAe,EAAQ;IAAS,WAAU;cACvD,EAAqB,EAAQ;IACxB,CAAA;GAEX;EACD;GACE,KAAK;GACL,QAAQ;GACR,eAAe;GACf,OAAO,MAAY;IACjB,IAAM,IAAO,EAA0B,GAAS,EAAQ;AAIxD,WAHI,EAAK,WAAW,IACX,kBAAC,QAAD;KAAM,WAAU;eAA0B;KAAQ,CAAA,GAGzD,kBAAC,OAAD;KAAK,WAAU;eACZ,EAAK,KAAK,MACT,kBAAC,GAAD;MAEE,MAAK;MACL,SAAS,MAAW,cAAc,UAAU;MAC5C,UAAU,MAAc,EAAQ;MAChC,eAAe,KAAK,EAAW,GAAS,EAAO;gBAE9C,EAAqB;MACf,EAPF,EAOE,CACT;KACE,CAAA;;GAGX;EACF;AAED,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,OAAD,EAAA,UAAA;IACE,kBAAC,MAAD;KAAI,WAAU;eACZ,kBAAC,GAAD,EAAA,UAAc,YAAuB,CAAA;KAClC,CAAA;IACL,kBAAC,KAAD;KAAG,WAAU;eAAb;MACG,EAAW;MAAO;MAAsB,EAAS;MAAO;MACvD;;IACJ,kBAAC,GAAD;KAAa,WAAU;eAAO;KAGhB,CAAA;IACV,EAAA,CAAA;GAEN,kBAAC,GAAD,EAAiB,OAAM,YAAa,CAAA;GAEpC,kBAAC,GAAD,EAAa,SAAS,KAAa,GAAe,CAAA;GAElD,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,GAAD;MAAU,OAAM;MAAY,OAAO,EAAM,GAAM,YAAY;MAAI,CAAA;KAC/D,kBAAC,GAAD;MAAU,OAAM;MAAY,OAAO,EAAM,GAAM,YAAY;MAAI,CAAA;KAC/D,kBAAC,GAAD;MAAU,OAAM;MAAY,OAAO,EAAM,GAAM,YAAY;MAAI,CAAA;KAC/D,kBAAC,GAAD;MAAU,OAAM;MAAY,OAAO,EAAM,GAAM,YAAY;MAAI,CAAA;KAC3D;;GAEN,kBAAC,GAAD;IACE,cAAW;IACX,OAAO;IACP,WAAW,MAAO,EAAQ,EAAW;IACrC,MAAM,CACJ;KAAE,IAAI;KAAY,OAAO;KAA4B,OAAO,EAAW;KAAQ,EAC/E;KAAE,IAAI;KAAU,OAAO;KAAe,OAAO,EAAS;KAAQ,CAC/D;IACD,CAAA;GAED,CAAC,KAAqB,CAAC,IACtB,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,GAAD,EAAS,MAAK,MAAO,CAAA;IACjB,CAAA,GACJ,EAAK,WAAW,IAClB,kBAAC,GAAD;IACE,cAAa;IACb,OAAO,MAAS,aAAa,4BAA4B;IACzD,aACE,MAAS,aACL,sEACA;IAEN,QACE,kBAAC,GAAD;KAAQ,MAAK;KAAK,eAAe,EAAS,kCAAkC;eAAE;KAErE,CAAA;IAEX,CAAA,GAEF,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;IAAa,WAAU;cACrB,kBAAC,GAAD;KACE,MAAM;KACN,SAAS,MAAY,EAAQ;KACpB;KACT,CAAA;IACU,CAAA,EACT,CAAA;GAEL"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Escrow ledger for marketplace bookings. These rows are bookkeeping only —
3
+ * wspace-crewfoundry-svc records the amount that should be held and when it is
4
+ * released; no money is moved or held by the platform.
5
+ */
6
+ export declare function MarketplaceEscrowPagePage(): import("react").JSX.Element;
7
+ //# sourceMappingURL=MarketplaceEscrowPagePage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MarketplaceEscrowPagePage.d.ts","sourceRoot":"","sources":["../../../src/crewfoundry/pages/MarketplaceEscrowPagePage.tsx"],"names":[],"mappings":"AA2BA;;;;GAIG;AACH,wBAAgB,yBAAyB,gCAkLxC"}
@@ -0,0 +1,175 @@
1
+ import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
2
+ import { StatCard as t } from "../components/viz/StatCard.js";
3
+ import "../components/viz/index.js";
4
+ import { formatDate as n } from "../utils/dateUtils.js";
5
+ import { InlineError as r } from "../components/InlineError.js";
6
+ import { useEnsureLoaded as i } from "../lib/useEnsureLoaded.js";
7
+ import { MarketplaceTabs as a } from "../components/marketplace/MarketplaceTabs.js";
8
+ import { ESCROW_STATUS_LABEL as o, formatMoney as s, isEscrowOpen as c, sumByCurrency as l } from "../lib/marketplace.js";
9
+ import { useMemo as u, useState as d } from "react";
10
+ import { Info as f } from "lucide-react";
11
+ import { jsx as p, jsxs as m } from "react/jsx-runtime";
12
+ import { Badge as h, Button as g, Card as _, CardContent as v, GradientText as y, IllustratedEmptyState as b, PagePurpose as x, ResponsiveTable as S, Spinner as C } from "@burdenoff/fe-libs/ui";
13
+ //#region src/crewfoundry/pages/MarketplaceEscrowPagePage.tsx
14
+ var w = {
15
+ ON_BOOKING_COMPLETION: "When the booking completes",
16
+ ON_MANUAL_APPROVAL: "On manual approval"
17
+ };
18
+ function T() {
19
+ let { escrowRecords: T, escrowLoaded: E, escrowError: D, fetchEscrowRecords: O, bookings: k, marketplaceLoaded: A, fetchMarketplace: j, releaseEscrowRecord: M, cancelEscrowRecord: N } = e();
20
+ i(E, O);
21
+ let P = i(A, j), [F, I] = d(null), [L, R] = d(null), z = u(() => new Map(k.map((e) => [e.id, e])), [k]), B = T.filter((e) => c(e.status)), V = T.filter((e) => e.status === "released"), H = async (e, t) => {
22
+ I(null), R(e.id);
23
+ try {
24
+ await t(e.id);
25
+ } catch (e) {
26
+ I(e instanceof Error ? e.message : "Unable to update escrow");
27
+ } finally {
28
+ R(null);
29
+ }
30
+ };
31
+ return /* @__PURE__ */ m("div", {
32
+ className: "space-y-6 p-6",
33
+ children: [
34
+ /* @__PURE__ */ m("div", { children: [
35
+ /* @__PURE__ */ p("h1", {
36
+ className: "text-2xl font-semibold",
37
+ children: /* @__PURE__ */ p(y, { children: "Escrow Ledger" })
38
+ }),
39
+ /* @__PURE__ */ m("p", {
40
+ className: "text-sm text-text-secondary",
41
+ children: [
42
+ T.length,
43
+ " records · ",
44
+ B.length,
45
+ " awaiting release"
46
+ ]
47
+ }),
48
+ /* @__PURE__ */ p(x, {
49
+ className: "mt-1",
50
+ children: "Every marketplace booking records the agreed amount that should be held until the work is done. Release it when the work is approved, or cancel it if the booking falls through."
51
+ })
52
+ ] }),
53
+ /* @__PURE__ */ p(a, { value: "escrow" }),
54
+ /* @__PURE__ */ m("div", {
55
+ className: "flex items-start gap-2 rounded-[var(--radius-card)] border border-border-default bg-status-info-bg p-3 text-sm text-status-info-text",
56
+ children: [/* @__PURE__ */ p(f, {
57
+ className: "mt-0.5 h-4 w-4 shrink-0",
58
+ "aria-hidden": !0
59
+ }), /* @__PURE__ */ p("span", { children: "This is a bookkeeping ledger. CrewFoundry records what should be held and released; it does not collect, hold or transfer funds. Settle payments through your usual payment process." })]
60
+ }),
61
+ /* @__PURE__ */ p(r, { message: D ? `Escrow records are unavailable: ${D}. Viewing escrow requires payroll access in this workspace.` : P ?? F }),
62
+ /* @__PURE__ */ m("div", {
63
+ className: "grid gap-4 sm:grid-cols-3",
64
+ children: [
65
+ /* @__PURE__ */ p(t, {
66
+ label: "Awaiting Release",
67
+ value: l(B)
68
+ }),
69
+ /* @__PURE__ */ p(t, {
70
+ label: "Released",
71
+ value: l(V)
72
+ }),
73
+ /* @__PURE__ */ p(t, {
74
+ label: "Records",
75
+ value: T.length
76
+ })
77
+ ]
78
+ }),
79
+ E ? D ? null : T.length === 0 ? /* @__PURE__ */ p(b, {
80
+ illustration: "empty-data",
81
+ title: "No escrow records yet",
82
+ description: "An escrow record is created automatically each time a service is booked."
83
+ }) : /* @__PURE__ */ p(_, { children: /* @__PURE__ */ p(v, {
84
+ className: "pt-6",
85
+ children: /* @__PURE__ */ p(S, {
86
+ data: T,
87
+ rowKey: (e) => e.id,
88
+ columns: [
89
+ {
90
+ key: "booking",
91
+ header: "Booking",
92
+ priority: "primary",
93
+ cell: (e) => {
94
+ let t = z.get(e.bookingId);
95
+ return /* @__PURE__ */ m("div", {
96
+ className: "min-w-0",
97
+ children: [/* @__PURE__ */ p("p", {
98
+ className: "font-medium",
99
+ children: t?.listingTitle ?? "Booking"
100
+ }), t && /* @__PURE__ */ m("p", {
101
+ className: "text-xs text-text-secondary",
102
+ children: [
103
+ t.providerName,
104
+ " → ",
105
+ t.clientName
106
+ ]
107
+ })]
108
+ });
109
+ }
110
+ },
111
+ {
112
+ key: "amount",
113
+ header: "Amount",
114
+ cell: (e) => /* @__PURE__ */ p("span", {
115
+ className: "tabular-nums font-medium",
116
+ children: s(e.amount, e.currency)
117
+ })
118
+ },
119
+ {
120
+ key: "condition",
121
+ header: "Releases",
122
+ cell: (e) => /* @__PURE__ */ p("span", {
123
+ className: "text-text-secondary",
124
+ children: w[e.releaseCondition] ?? e.releaseCondition
125
+ })
126
+ },
127
+ {
128
+ key: "status",
129
+ header: "Status",
130
+ cell: (e) => /* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p(h, {
131
+ variant: c(e.status) ? "default" : "secondary",
132
+ className: "text-[10px]",
133
+ children: o[e.status]
134
+ }), e.releasedAt && /* @__PURE__ */ p("p", {
135
+ className: "mt-1 text-xs text-text-secondary",
136
+ children: n(e.releasedAt)
137
+ })] })
138
+ },
139
+ {
140
+ key: "actions",
141
+ header: "",
142
+ cellClassName: "md:text-right",
143
+ cell: (e) => c(e.status) ? /* @__PURE__ */ m("div", {
144
+ className: "flex justify-end gap-1",
145
+ children: [/* @__PURE__ */ p(g, {
146
+ size: "sm",
147
+ variant: "outline",
148
+ disabled: L === e.id,
149
+ onClick: () => void H(e, M),
150
+ children: "Release"
151
+ }), /* @__PURE__ */ p(g, {
152
+ size: "sm",
153
+ variant: "ghost",
154
+ disabled: L === e.id,
155
+ onClick: () => void H(e, N),
156
+ children: "Cancel"
157
+ })]
158
+ }) : /* @__PURE__ */ p("span", {
159
+ className: "text-xs text-text-muted",
160
+ children: "—"
161
+ })
162
+ }
163
+ ]
164
+ })
165
+ }) }) : /* @__PURE__ */ p("div", {
166
+ className: "flex min-h-[240px] items-center justify-center",
167
+ children: /* @__PURE__ */ p(C, { size: "lg" })
168
+ })
169
+ ]
170
+ });
171
+ }
172
+ //#endregion
173
+ export { T as MarketplaceEscrowPagePage };
174
+
175
+ //# sourceMappingURL=MarketplaceEscrowPagePage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MarketplaceEscrowPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/MarketplaceEscrowPagePage.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n GradientText,\n IllustratedEmptyState,\n PagePurpose,\n ResponsiveTable,\n Spinner,\n type ResponsiveTableColumn,\n} from '@burdenoff/fe-libs/ui';\nimport { Info } from 'lucide-react';\nimport { InlineError } from '../components/InlineError';\nimport { MarketplaceTabs } from '../components/marketplace/MarketplaceTabs';\nimport { StatCard } from '../components/viz';\nimport { useCrewFoundryStore, type CrewEscrowRecord } from '../store/crewfoundryStore';\nimport { ESCROW_STATUS_LABEL, formatMoney, isEscrowOpen, sumByCurrency } from '../lib/marketplace';\nimport { useEnsureLoaded } from '../lib/useEnsureLoaded';\nimport { formatDate } from '../utils/dateUtils';\n\nconst RELEASE_CONDITION_LABEL: Record<string, string> = {\n ON_BOOKING_COMPLETION: 'When the booking completes',\n ON_MANUAL_APPROVAL: 'On manual approval',\n};\n\n/**\n * Escrow ledger for marketplace bookings. These rows are bookkeeping only —\n * wspace-crewfoundry-svc records the amount that should be held and when it is\n * released; no money is moved or held by the platform.\n */\nexport function MarketplaceEscrowPagePage() {\n const {\n escrowRecords,\n escrowLoaded,\n escrowError,\n fetchEscrowRecords,\n bookings,\n marketplaceLoaded,\n fetchMarketplace,\n releaseEscrowRecord,\n cancelEscrowRecord,\n } = useCrewFoundryStore();\n useEnsureLoaded(escrowLoaded, fetchEscrowRecords);\n const marketplaceError = useEnsureLoaded(marketplaceLoaded, fetchMarketplace);\n const [actionError, setActionError] = useState<string | null>(null);\n const [pendingId, setPendingId] = useState<string | null>(null);\n\n const bookingById = useMemo(() => new Map(bookings.map((b) => [b.id, b])), [bookings]);\n const held = escrowRecords.filter((row) => isEscrowOpen(row.status));\n const released = escrowRecords.filter((row) => row.status === 'released');\n\n const run = async (row: CrewEscrowRecord, action: (id: string) => Promise<void>) => {\n setActionError(null);\n setPendingId(row.id);\n try {\n await action(row.id);\n } catch (error) {\n setActionError(error instanceof Error ? error.message : 'Unable to update escrow');\n } finally {\n setPendingId(null);\n }\n };\n\n const columns: ResponsiveTableColumn<CrewEscrowRecord>[] = [\n {\n key: 'booking',\n header: 'Booking',\n priority: 'primary',\n cell: (row) => {\n const booking = bookingById.get(row.bookingId);\n return (\n <div className=\"min-w-0\">\n <p className=\"font-medium\">{booking?.listingTitle ?? 'Booking'}</p>\n {booking && (\n <p className=\"text-xs text-text-secondary\">\n {booking.providerName} → {booking.clientName}\n </p>\n )}\n </div>\n );\n },\n },\n {\n key: 'amount',\n header: 'Amount',\n cell: (row) => (\n <span className=\"tabular-nums font-medium\">{formatMoney(row.amount, row.currency)}</span>\n ),\n },\n {\n key: 'condition',\n header: 'Releases',\n cell: (row) => (\n <span className=\"text-text-secondary\">\n {RELEASE_CONDITION_LABEL[row.releaseCondition] ?? row.releaseCondition}\n </span>\n ),\n },\n {\n key: 'status',\n header: 'Status',\n cell: (row) => (\n <div>\n <Badge\n variant={isEscrowOpen(row.status) ? 'default' : 'secondary'}\n className=\"text-[10px]\"\n >\n {ESCROW_STATUS_LABEL[row.status]}\n </Badge>\n {row.releasedAt && (\n <p className=\"mt-1 text-xs text-text-secondary\">{formatDate(row.releasedAt)}</p>\n )}\n </div>\n ),\n },\n {\n key: 'actions',\n header: '',\n cellClassName: 'md:text-right',\n cell: (row) =>\n isEscrowOpen(row.status) ? (\n <div className=\"flex justify-end gap-1\">\n <Button\n size=\"sm\"\n variant=\"outline\"\n disabled={pendingId === row.id}\n onClick={() => void run(row, releaseEscrowRecord)}\n >\n Release\n </Button>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n disabled={pendingId === row.id}\n onClick={() => void run(row, cancelEscrowRecord)}\n >\n Cancel\n </Button>\n </div>\n ) : (\n <span className=\"text-xs text-text-muted\">—</span>\n ),\n },\n ];\n\n return (\n <div className=\"space-y-6 p-6\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>Escrow Ledger</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\n {escrowRecords.length} records · {held.length} awaiting release\n </p>\n <PagePurpose className=\"mt-1\">\n Every marketplace booking records the agreed amount that should be held until the work is\n done. Release it when the work is approved, or cancel it if the booking falls through.\n </PagePurpose>\n </div>\n\n <MarketplaceTabs value=\"escrow\" />\n\n <div className=\"flex items-start gap-2 rounded-[var(--radius-card)] border border-border-default bg-status-info-bg p-3 text-sm text-status-info-text\">\n <Info className=\"mt-0.5 h-4 w-4 shrink-0\" aria-hidden />\n <span>\n This is a bookkeeping ledger. CrewFoundry records what should be held and released; it\n does not collect, hold or transfer funds. Settle payments through your usual payment\n process.\n </span>\n </div>\n\n <InlineError\n message={\n escrowError\n ? `Escrow records are unavailable: ${escrowError}. Viewing escrow requires payroll access in this workspace.`\n : (marketplaceError ?? actionError)\n }\n />\n\n <div className=\"grid gap-4 sm:grid-cols-3\">\n <StatCard label=\"Awaiting Release\" value={sumByCurrency(held)} />\n <StatCard label=\"Released\" value={sumByCurrency(released)} />\n <StatCard label=\"Records\" value={escrowRecords.length} />\n </div>\n\n {!escrowLoaded ? (\n <div className=\"flex min-h-[240px] items-center justify-center\">\n <Spinner size=\"lg\" />\n </div>\n ) : escrowError ? null : escrowRecords.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title=\"No escrow records yet\"\n description=\"An escrow record is created automatically each time a service is booked.\"\n />\n ) : (\n <Card>\n <CardContent className=\"pt-6\">\n <ResponsiveTable<CrewEscrowRecord>\n data={escrowRecords}\n rowKey={(row) => row.id}\n columns={columns}\n />\n </CardContent>\n </Card>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"MarketplaceMarketplacePagePage.d.ts","sourceRoot":"","sources":["../../../src/crewfoundry/pages/MarketplaceMarketplacePagePage.tsx"],"names":[],"mappings":"AAgDA,wBAAgB,8BAA8B,gCAsO7C"}
1
+ {"version":3,"file":"MarketplaceMarketplacePagePage.d.ts","sourceRoot":"","sources":["../../../src/crewfoundry/pages/MarketplaceMarketplacePagePage.tsx"],"names":[],"mappings":"AAiCA,wBAAgB,8BAA8B,gCA2N7C"}