@burdenoff/microfe-crewfoundry 2026.1013.2 → 2026.1029.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (198) 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/marketplace/BookServiceModal.d.ts +14 -0
  12. package/dist/crewfoundry/components/marketplace/BookServiceModal.d.ts.map +1 -0
  13. package/dist/crewfoundry/components/marketplace/BookServiceModal.js +75 -0
  14. package/dist/crewfoundry/components/marketplace/BookServiceModal.js.map +1 -0
  15. package/dist/crewfoundry/components/marketplace/MarketplaceTabs.d.ts +24 -0
  16. package/dist/crewfoundry/components/marketplace/MarketplaceTabs.d.ts.map +1 -0
  17. package/dist/crewfoundry/components/marketplace/MarketplaceTabs.js +47 -0
  18. package/dist/crewfoundry/components/marketplace/MarketplaceTabs.js.map +1 -0
  19. package/dist/crewfoundry/components/marketplace/ServiceListingModal.d.ts +12 -0
  20. package/dist/crewfoundry/components/marketplace/ServiceListingModal.d.ts.map +1 -0
  21. package/dist/crewfoundry/components/marketplace/ServiceListingModal.js +123 -0
  22. package/dist/crewfoundry/components/marketplace/ServiceListingModal.js.map +1 -0
  23. package/dist/crewfoundry/components/viz/CertificateCard.js +4 -118
  24. package/dist/crewfoundry/components/viz/PathSteps.js +3 -68
  25. package/dist/crewfoundry/components/viz/lib/geometry.js +5 -13
  26. package/dist/crewfoundry/components/viz/lib/geometry.js.map +1 -1
  27. package/dist/crewfoundry/lib/analytics.d.ts +1 -6
  28. package/dist/crewfoundry/lib/analytics.d.ts.map +1 -1
  29. package/dist/crewfoundry/lib/analytics.js +3 -18
  30. package/dist/crewfoundry/lib/analytics.js.map +1 -1
  31. package/dist/crewfoundry/lib/companyFinance.d.ts +3 -7
  32. package/dist/crewfoundry/lib/companyFinance.d.ts.map +1 -1
  33. package/dist/crewfoundry/lib/companyFinance.js +3 -8
  34. package/dist/crewfoundry/lib/companyFinance.js.map +1 -1
  35. package/dist/crewfoundry/lib/learning.d.ts +12 -0
  36. package/dist/crewfoundry/lib/learning.d.ts.map +1 -0
  37. package/dist/crewfoundry/lib/learning.js +26 -0
  38. package/dist/crewfoundry/lib/learning.js.map +1 -0
  39. package/dist/crewfoundry/lib/marketplace.d.ts +30 -0
  40. package/dist/crewfoundry/lib/marketplace.d.ts.map +1 -0
  41. package/dist/crewfoundry/lib/marketplace.js +91 -0
  42. package/dist/crewfoundry/lib/marketplace.js.map +1 -0
  43. package/dist/crewfoundry/lib/useEnsureLoaded.d.ts +7 -0
  44. package/dist/crewfoundry/lib/useEnsureLoaded.d.ts.map +1 -0
  45. package/dist/crewfoundry/lib/useEnsureLoaded.js +25 -0
  46. package/dist/crewfoundry/lib/useEnsureLoaded.js.map +1 -0
  47. package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.d.ts.map +1 -1
  48. package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js +12 -25
  49. package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js.map +1 -1
  50. package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.d.ts.map +1 -1
  51. package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js +145 -157
  52. package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js.map +1 -1
  53. package/dist/crewfoundry/pages/CompanyClientManagementPagePage.d.ts.map +1 -1
  54. package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js +14 -14
  55. package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js.map +1 -1
  56. package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.d.ts.map +1 -1
  57. package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js +14 -14
  58. package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js.map +1 -1
  59. package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.d.ts.map +1 -1
  60. package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.js +71 -33
  61. package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.js.map +1 -1
  62. package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.d.ts.map +1 -1
  63. package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js +247 -173
  64. package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js.map +1 -1
  65. package/dist/crewfoundry/pages/LearningCoursesPagePage.d.ts +12 -0
  66. package/dist/crewfoundry/pages/LearningCoursesPagePage.d.ts.map +1 -1
  67. package/dist/crewfoundry/pages/LearningCoursesPagePage.js +307 -293
  68. package/dist/crewfoundry/pages/LearningCoursesPagePage.js.map +1 -1
  69. package/dist/crewfoundry/pages/LearningEnrollmentsPagePage.d.ts +2 -0
  70. package/dist/crewfoundry/pages/LearningEnrollmentsPagePage.d.ts.map +1 -0
  71. package/dist/crewfoundry/pages/LearningEnrollmentsPagePage.js +223 -0
  72. package/dist/crewfoundry/pages/LearningEnrollmentsPagePage.js.map +1 -0
  73. package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.d.ts +4 -0
  74. package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.d.ts.map +1 -1
  75. package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.js +115 -160
  76. package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.js.map +1 -1
  77. package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.d.ts.map +1 -1
  78. package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js +165 -75
  79. package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js.map +1 -1
  80. package/dist/crewfoundry/pages/MarketplaceEscrowPagePage.d.ts +7 -0
  81. package/dist/crewfoundry/pages/MarketplaceEscrowPagePage.d.ts.map +1 -0
  82. package/dist/crewfoundry/pages/MarketplaceEscrowPagePage.js +175 -0
  83. package/dist/crewfoundry/pages/MarketplaceEscrowPagePage.js.map +1 -0
  84. package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.d.ts.map +1 -1
  85. package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js +182 -223
  86. package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js.map +1 -1
  87. package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.d.ts.map +1 -1
  88. package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js +168 -227
  89. package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js.map +1 -1
  90. package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.d.ts.map +1 -1
  91. package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js +127 -290
  92. package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js.map +1 -1
  93. package/dist/crewfoundry/store/crewfoundryStore.d.ts +138 -78
  94. package/dist/crewfoundry/store/crewfoundryStore.d.ts.map +1 -1
  95. package/dist/crewfoundry/store/crewfoundryStore.js +338 -244
  96. package/dist/crewfoundry/store/crewfoundryStore.js.map +1 -1
  97. package/dist/crewfoundry/utils/dateUtils.d.ts +5 -0
  98. package/dist/crewfoundry/utils/dateUtils.d.ts.map +1 -1
  99. package/dist/crewfoundry/utils/dateUtils.js +10 -1
  100. package/dist/crewfoundry/utils/dateUtils.js.map +1 -1
  101. package/dist/generated/global-types.d.ts +5145 -1627
  102. package/dist/generated/global-types.d.ts.map +1 -1
  103. package/dist/generated/wspace-types.d.ts +100373 -34602
  104. package/dist/generated/wspace-types.d.ts.map +1 -1
  105. package/dist/utils/pageContext.d.ts.map +1 -1
  106. package/dist/utils/pageContext.js +0 -1
  107. package/dist/utils/pageContext.js.map +1 -1
  108. package/package.json +1 -1
  109. package/dist/crewfoundry/components/viz/CertificateCard.js.map +0 -1
  110. package/dist/crewfoundry/components/viz/PathSteps.js.map +0 -1
  111. package/dist/crewfoundry/pages/CommunicationsCallsPagePage.d.ts +0 -2
  112. package/dist/crewfoundry/pages/CommunicationsCallsPagePage.d.ts.map +0 -1
  113. package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js +0 -53
  114. package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js.map +0 -1
  115. package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.d.ts +0 -2
  116. package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.d.ts.map +0 -1
  117. package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js +0 -107
  118. package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js.map +0 -1
  119. package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.d.ts +0 -2
  120. package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.d.ts.map +0 -1
  121. package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js +0 -62
  122. package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js.map +0 -1
  123. package/dist/crewfoundry/pages/LearningAssessmentsPagePage.d.ts +0 -2
  124. package/dist/crewfoundry/pages/LearningAssessmentsPagePage.d.ts.map +0 -1
  125. package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js +0 -37
  126. package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js.map +0 -1
  127. package/dist/crewfoundry/pages/LearningCertificatesPagePage.d.ts +0 -2
  128. package/dist/crewfoundry/pages/LearningCertificatesPagePage.d.ts.map +0 -1
  129. package/dist/crewfoundry/pages/LearningCertificatesPagePage.js +0 -111
  130. package/dist/crewfoundry/pages/LearningCertificatesPagePage.js.map +0 -1
  131. package/dist/crewfoundry/pages/LearningCourseLearningPagePage.d.ts +0 -2
  132. package/dist/crewfoundry/pages/LearningCourseLearningPagePage.d.ts.map +0 -1
  133. package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js +0 -309
  134. package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js.map +0 -1
  135. package/dist/crewfoundry/pages/LearningLearningPagePage.d.ts +0 -2
  136. package/dist/crewfoundry/pages/LearningLearningPagePage.d.ts.map +0 -1
  137. package/dist/crewfoundry/pages/LearningLearningPagePage.js +0 -200
  138. package/dist/crewfoundry/pages/LearningLearningPagePage.js.map +0 -1
  139. package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.d.ts +0 -2
  140. package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.d.ts.map +0 -1
  141. package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js +0 -190
  142. package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js.map +0 -1
  143. package/dist/crewfoundry/pages/LearningLearningPathsPagePage.d.ts +0 -2
  144. package/dist/crewfoundry/pages/LearningLearningPathsPagePage.d.ts.map +0 -1
  145. package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js +0 -230
  146. package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js.map +0 -1
  147. package/dist/crewfoundry/pages/LearningMyLearningPagePage.d.ts +0 -2
  148. package/dist/crewfoundry/pages/LearningMyLearningPagePage.d.ts.map +0 -1
  149. package/dist/crewfoundry/pages/LearningMyLearningPagePage.js +0 -293
  150. package/dist/crewfoundry/pages/LearningMyLearningPagePage.js.map +0 -1
  151. package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.d.ts +0 -2
  152. package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.d.ts.map +0 -1
  153. package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js +0 -163
  154. package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js.map +0 -1
  155. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.d.ts +0 -2
  156. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.d.ts.map +0 -1
  157. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js +0 -365
  158. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js.map +0 -1
  159. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.d.ts +0 -2
  160. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.d.ts.map +0 -1
  161. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js +0 -224
  162. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js.map +0 -1
  163. package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.d.ts +0 -2
  164. package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.d.ts.map +0 -1
  165. package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js +0 -180
  166. package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js.map +0 -1
  167. package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.d.ts +0 -2
  168. package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.d.ts.map +0 -1
  169. package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.js +0 -38
  170. package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.js.map +0 -1
  171. package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.d.ts +0 -2
  172. package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.d.ts.map +0 -1
  173. package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js +0 -204
  174. package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js.map +0 -1
  175. package/dist/crewfoundry/pages/PaymentsEscrowPagePage.d.ts +0 -2
  176. package/dist/crewfoundry/pages/PaymentsEscrowPagePage.d.ts.map +0 -1
  177. package/dist/crewfoundry/pages/PaymentsEscrowPagePage.js +0 -55
  178. package/dist/crewfoundry/pages/PaymentsEscrowPagePage.js.map +0 -1
  179. package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.d.ts +0 -2
  180. package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.d.ts.map +0 -1
  181. package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js +0 -335
  182. package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js.map +0 -1
  183. package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.d.ts +0 -2
  184. package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.d.ts.map +0 -1
  185. package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js +0 -160
  186. package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js.map +0 -1
  187. package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.d.ts +0 -2
  188. package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.d.ts.map +0 -1
  189. package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js +0 -80
  190. package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js.map +0 -1
  191. package/dist/crewfoundry/pages/PaymentsSecurityPagePage.d.ts +0 -2
  192. package/dist/crewfoundry/pages/PaymentsSecurityPagePage.d.ts.map +0 -1
  193. package/dist/crewfoundry/pages/PaymentsSecurityPagePage.js +0 -191
  194. package/dist/crewfoundry/pages/PaymentsSecurityPagePage.js.map +0 -1
  195. package/dist/crewfoundry/utils/courseProgress.d.ts +0 -33
  196. package/dist/crewfoundry/utils/courseProgress.d.ts.map +0 -1
  197. package/dist/crewfoundry/utils/courseProgress.js +0 -46
  198. package/dist/crewfoundry/utils/courseProgress.js.map +0 -1
@@ -1,254 +1,195 @@
1
1
  import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
2
- import { formatEnumLabel as t } from "../utils/formatEnumLabel.js";
3
- import { FormModal as n, useFormModal as r } from "../components/forms/FormModal.js";
4
- import { Eye as i, Pencil as a, Plus as o, Star as s, Trash2 as c } from "lucide-react";
5
- import { useNavigate as l } from "react-router";
6
- import { jsx as u, jsxs as d } from "react/jsx-runtime";
7
- import { AlertDialog as f, AlertDialogAction as p, AlertDialogCancel as m, AlertDialogContent as h, AlertDialogDescription as g, AlertDialogFooter as _, AlertDialogHeader as v, AlertDialogTitle as y, AlertDialogTrigger as b, Badge as x, Button as S, CardContent as C, CardHeader as w, CardTitle as T, GlassCard as E, GradientText as D, IllustratedEmptyState as O, PagePurpose as k, Pagination as A } from "@burdenoff/fe-libs/ui";
8
- import { usePagination as j } from "@burdenoff/fe-libs/shared/hooks";
2
+ import { StatCard as t } from "../components/viz/StatCard.js";
3
+ import "../components/viz/index.js";
4
+ import { InlineError as n } from "../components/InlineError.js";
5
+ import { useEnsureLoaded as r } from "../lib/useEnsureLoaded.js";
6
+ import { MarketplaceTabs as i } from "../components/marketplace/MarketplaceTabs.js";
7
+ import { formatRate as a } from "../lib/marketplace.js";
8
+ import { ServiceListingModal as o } from "../components/marketplace/ServiceListingModal.js";
9
+ import { useState as s } from "react";
10
+ import { Pause as c, Pencil as l, Play as u, Plus as d, Trash2 as f } from "lucide-react";
11
+ import { useNavigate as p } from "react-router";
12
+ import { jsx as m, jsxs as h } from "react/jsx-runtime";
13
+ import { AlertDialog as g, AlertDialogAction as _, AlertDialogCancel as v, AlertDialogContent as y, AlertDialogDescription as b, AlertDialogFooter as x, AlertDialogHeader as S, AlertDialogTitle as C, Badge as w, Button as T, Card as E, CardContent as D, GradientText as O, IllustratedEmptyState as k, PagePurpose as A, ResponsiveTable as j, Spinner as M } from "@burdenoff/fe-libs/ui";
9
14
  //#region src/crewfoundry/pages/MarketplaceMyServicesPagePage.tsx
10
- var M = [
11
- {
12
- name: "title",
13
- label: "Service title",
14
- type: "text",
15
- required: !0,
16
- colSpan: 2
17
- },
18
- {
19
- name: "provider",
20
- label: "Provider",
21
- type: "text",
22
- required: !0
23
- },
24
- {
25
- name: "category",
26
- label: "Category",
27
- type: "text",
28
- required: !0
29
- },
30
- {
31
- name: "price",
32
- label: "Price",
33
- type: "number",
34
- required: !0
35
- },
36
- {
37
- name: "priceType",
38
- label: "Price type",
39
- type: "select",
40
- required: !0,
41
- options: [
42
- {
43
- label: "Hourly",
44
- value: "hourly"
45
- },
46
- {
47
- label: "Fixed",
48
- value: "fixed"
49
- },
50
- {
51
- label: "Monthly",
52
- value: "monthly"
53
- }
54
- ]
55
- },
56
- {
57
- name: "deliveryTime",
58
- label: "Delivery time",
59
- type: "text",
60
- required: !0,
61
- placeholder: "e.g. 3 days"
62
- },
63
- {
64
- name: "status",
65
- label: "Status",
66
- type: "select",
67
- options: [
68
- {
69
- label: "Active",
70
- value: "active"
71
- },
72
- {
73
- label: "Paused",
74
- value: "paused"
75
- },
76
- {
77
- label: "Pending",
78
- value: "pending"
79
- }
80
- ]
81
- },
82
- {
83
- name: "description",
84
- label: "Description",
85
- type: "textarea",
86
- required: !0,
87
- colSpan: 2
88
- },
89
- {
90
- name: "skills",
91
- label: "Skills",
92
- type: "tags",
93
- colSpan: 2
94
- }
95
- ], N = (e) => ({
96
- title: e.title,
97
- provider: e.provider,
98
- category: e.category,
99
- price: e.price,
100
- priceType: e.priceType,
101
- deliveryTime: e.deliveryTime,
102
- status: e.status,
103
- description: e.description,
104
- skills: e.skills
105
- }), P = (e, t) => ({
106
- id: t?.id ?? crypto.randomUUID(),
107
- title: String(e.title ?? ""),
108
- provider: String(e.provider ?? ""),
109
- category: String(e.category ?? ""),
110
- price: typeof e.price == "number" ? e.price : Number(e.price) || 0,
111
- priceType: e.priceType || "hourly",
112
- rating: t?.rating ?? 0,
113
- reviews: t?.reviews ?? 0,
114
- description: String(e.description ?? ""),
115
- deliveryTime: String(e.deliveryTime ?? ""),
116
- status: e.status || "active",
117
- skills: Array.isArray(e.skills) ? e.skills : []
118
- });
119
- function F() {
120
- let F = l(), { marketplaceServices: I, addMarketplaceService: L, updateMarketplaceService: R, removeMarketplaceService: z } = e(), B = r(), { page: V, pageSize: H, offset: U, setPage: W } = j({ initialPageSize: 9 }), G = I.slice(U, U + H);
121
- return /* @__PURE__ */ d("div", {
15
+ function N() {
16
+ let N = p(), { serviceListings: P, bookings: F, marketplaceLoaded: I, fetchMarketplace: L, updateServiceListing: R, removeServiceListing: z, initParams: B } = e(), V = r(I, L), [H, U] = s(null), [W, G] = s(null), [K, q] = s(!1), [J, Y] = s(null), X = P.filter((e) => e.providerActorId === B.actorId), Z = F.filter((e) => e.providerActorId === B.actorId), Q = Z.filter((e) => e.status === "requested").length, $ = async (e) => {
17
+ U(null);
18
+ try {
19
+ await e();
20
+ } catch (e) {
21
+ U(e instanceof Error ? e.message : "Something went wrong");
22
+ }
23
+ };
24
+ return /* @__PURE__ */ h("div", {
122
25
  className: "space-y-6 p-6",
123
26
  children: [
124
- /* @__PURE__ */ d("div", {
125
- className: "flex items-center justify-between",
126
- children: [/* @__PURE__ */ d("div", { children: [
127
- /* @__PURE__ */ u("h1", {
27
+ /* @__PURE__ */ h("div", {
28
+ className: "flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between",
29
+ children: [/* @__PURE__ */ h("div", { children: [
30
+ /* @__PURE__ */ m("h1", {
128
31
  className: "text-2xl font-semibold",
129
- children: /* @__PURE__ */ u(D, { children: "My Services" })
32
+ children: /* @__PURE__ */ m(O, { children: "My Services" })
130
33
  }),
131
- /* @__PURE__ */ u("p", {
34
+ /* @__PURE__ */ h("p", {
132
35
  className: "text-sm text-text-secondary",
133
- children: "Manage your listed services"
36
+ children: [
37
+ X.length,
38
+ " services you offer · ",
39
+ Q,
40
+ " booking requests waiting"
41
+ ]
134
42
  }),
135
- /* @__PURE__ */ u(k, {
43
+ /* @__PURE__ */ m(A, {
136
44
  className: "mt-1",
137
- children: "Manage the services you offer to clients — list, edit, and showcase your offerings to win more work on the marketplace."
45
+ children: "Manage the services you offer on the marketplace — set your rate, pause a service when you are fully booked, and respond to booking requests."
138
46
  })
139
- ] }), /* @__PURE__ */ d(S, {
47
+ ] }), /* @__PURE__ */ h(T, {
140
48
  size: "sm",
141
- onClick: () => B.openModal(),
142
- children: [/* @__PURE__ */ u(o, { className: "h-4 w-4 mr-1" }), "Create Service"]
49
+ onClick: () => q(!0),
50
+ children: [/* @__PURE__ */ m(d, { className: "mr-1 h-4 w-4" }), "Publish a service"]
143
51
  })]
144
52
  }),
145
- /* @__PURE__ */ u("div", {
146
- className: "grid gap-4 md:grid-cols-2 lg:grid-cols-3",
147
- children: I.length === 0 ? /* @__PURE__ */ u("div", {
148
- className: "col-span-full",
149
- children: /* @__PURE__ */ u(O, {
150
- illustration: "empty-generic",
151
- title: "No services listed",
152
- description: "List a service to start winning work on the marketplace."
53
+ /* @__PURE__ */ m(i, { value: "my-services" }),
54
+ /* @__PURE__ */ m(n, { message: V ?? H }),
55
+ /* @__PURE__ */ h("div", {
56
+ className: "grid gap-4 sm:grid-cols-3",
57
+ children: [
58
+ /* @__PURE__ */ m(t, {
59
+ label: "Services",
60
+ value: X.length
61
+ }),
62
+ /* @__PURE__ */ m(t, {
63
+ label: "Bookable",
64
+ value: X.filter((e) => e.status === "active").length
65
+ }),
66
+ /* @__PURE__ */ m(t, {
67
+ label: "Requests Waiting",
68
+ value: Q
153
69
  })
154
- }) : G.map((e, n) => /* @__PURE__ */ d(E, {
155
- treatment: n === 0 ? "glass" : "plain",
156
- glow: n === 0,
157
- children: [/* @__PURE__ */ u(w, { children: /* @__PURE__ */ d("div", {
158
- className: "flex items-center justify-between",
159
- children: [/* @__PURE__ */ u(T, {
160
- className: "text-base",
161
- children: e.title
162
- }), /* @__PURE__ */ u(x, {
163
- variant: e.status === "active" ? "default" : "secondary",
164
- className: "text-[10px]",
165
- children: t(e.status)
166
- })]
167
- }) }), /* @__PURE__ */ d(C, { children: [
168
- /* @__PURE__ */ u("p", {
169
- className: "text-sm text-text-secondary mb-3",
170
- children: e.description
171
- }),
172
- /* @__PURE__ */ d("div", {
173
- className: "flex items-center justify-between text-sm",
174
- children: [/* @__PURE__ */ d("span", {
175
- className: "font-bold",
176
- children: [
177
- "$",
178
- e.price,
179
- "/",
180
- e.priceType
181
- ]
182
- }), /* @__PURE__ */ d("span", {
183
- className: "flex items-center gap-1",
70
+ ]
71
+ }),
72
+ !I && !V ? /* @__PURE__ */ m("div", {
73
+ className: "flex min-h-[240px] items-center justify-center",
74
+ children: /* @__PURE__ */ m(M, { size: "lg" })
75
+ }) : X.length === 0 ? /* @__PURE__ */ m(k, {
76
+ illustration: "empty-data",
77
+ title: "You haven't published a service",
78
+ description: "Publish what you can help with and at what rate; colleagues can then book you.",
79
+ action: /* @__PURE__ */ h(T, {
80
+ size: "sm",
81
+ onClick: () => q(!0),
82
+ children: [/* @__PURE__ */ m(d, { className: "mr-1 h-4 w-4" }), "Publish a service"]
83
+ })
84
+ }) : /* @__PURE__ */ m(E, { children: /* @__PURE__ */ m(D, {
85
+ className: "pt-6",
86
+ children: /* @__PURE__ */ m(j, {
87
+ data: X,
88
+ rowKey: (e) => e.id,
89
+ columns: [
90
+ {
91
+ key: "title",
92
+ header: "Service",
93
+ priority: "primary",
94
+ cell: (e) => /* @__PURE__ */ m("button", {
95
+ type: "button",
96
+ className: "text-left font-medium hover:underline",
97
+ onClick: () => N(`../marketplace/service-details-page?id=${encodeURIComponent(e.id)}`),
98
+ children: e.title
99
+ })
100
+ },
101
+ {
102
+ key: "rate",
103
+ header: "Rate",
104
+ cell: (e) => /* @__PURE__ */ m("span", {
105
+ className: "tabular-nums",
106
+ children: a(e)
107
+ })
108
+ },
109
+ {
110
+ key: "bookings",
111
+ header: "Bookings",
112
+ cell: (e) => /* @__PURE__ */ m("span", {
113
+ className: "tabular-nums",
114
+ children: Z.filter((t) => t.listingId === e.id).length
115
+ })
116
+ },
117
+ {
118
+ key: "status",
119
+ header: "Status",
120
+ cell: (e) => /* @__PURE__ */ m(w, {
121
+ variant: e.status === "active" ? "default" : "secondary",
122
+ className: "text-[10px]",
123
+ children: e.status === "active" ? "Bookable" : "Paused"
124
+ })
125
+ },
126
+ {
127
+ key: "actions",
128
+ header: "",
129
+ cellClassName: "md:text-right",
130
+ cell: (e) => /* @__PURE__ */ h("div", {
131
+ className: "flex justify-end gap-1",
184
132
  children: [
185
- /* @__PURE__ */ u(s, { className: "h-3 w-3 text-status-warning-text" }),
186
- e.rating,
187
- " (",
188
- e.reviews,
189
- ")"
190
- ]
191
- })]
192
- }),
193
- /* @__PURE__ */ d("div", {
194
- className: "flex gap-2 mt-3",
195
- children: [
196
- /* @__PURE__ */ d(S, {
197
- variant: "outline",
198
- size: "sm",
199
- className: "flex-1",
200
- onClick: () => B.openModal(e),
201
- children: [/* @__PURE__ */ u(a, { className: "h-3.5 w-3.5 mr-1" }), "Edit"]
202
- }),
203
- /* @__PURE__ */ d(S, {
204
- size: "sm",
205
- className: "flex-1",
206
- onClick: () => F(`../marketplace/service-details-page?id=${e.id}`),
207
- children: [/* @__PURE__ */ u(i, { className: "h-3.5 w-3.5 mr-1" }), "View"]
208
- }),
209
- /* @__PURE__ */ d(f, { children: [/* @__PURE__ */ u(b, {
210
- asChild: !0,
211
- children: /* @__PURE__ */ u(S, {
133
+ /* @__PURE__ */ m(T, {
134
+ variant: "ghost",
135
+ size: "icon",
136
+ className: "h-8 w-8",
137
+ "aria-label": `${e.status === "active" ? "Pause" : "Resume"} ${e.title}`,
138
+ onClick: () => void $(() => R(e.id, { status: e.status === "active" ? "paused" : "active" })),
139
+ children: e.status === "active" ? /* @__PURE__ */ m(c, { className: "h-4 w-4" }) : /* @__PURE__ */ m(u, { className: "h-4 w-4" })
140
+ }),
141
+ /* @__PURE__ */ m(T, {
212
142
  variant: "ghost",
213
143
  size: "icon",
144
+ className: "h-8 w-8",
145
+ "aria-label": `Edit ${e.title}`,
146
+ onClick: () => G(e),
147
+ children: /* @__PURE__ */ m(l, { className: "h-4 w-4" })
148
+ }),
149
+ /* @__PURE__ */ m(T, {
150
+ variant: "ghost",
151
+ size: "icon",
152
+ className: "h-8 w-8",
214
153
  "aria-label": `Delete ${e.title}`,
215
- children: /* @__PURE__ */ u(c, { className: "h-4 w-4 text-status-error-text" })
154
+ onClick: () => Y(e),
155
+ children: /* @__PURE__ */ m(f, { className: "h-4 w-4" })
216
156
  })
217
- }), /* @__PURE__ */ d(h, { children: [/* @__PURE__ */ d(v, { children: [/* @__PURE__ */ u(y, { children: "Delete service?" }), /* @__PURE__ */ d(g, { children: [
218
- "This removes “",
219
- e.title,
220
- "” from your marketplace listings. This action cannot be undone."
221
- ] })] }), /* @__PURE__ */ d(_, { children: [/* @__PURE__ */ u(m, { children: "Cancel" }), /* @__PURE__ */ u(p, {
222
- onClick: () => void z(e.id),
223
- children: "Delete"
224
- })] })] })] })
225
- ]
226
- })
227
- ] })]
228
- }, e.id))
157
+ ]
158
+ })
159
+ }
160
+ ]
161
+ })
162
+ }) }),
163
+ /* @__PURE__ */ m(o, {
164
+ open: K,
165
+ onOpenChange: q,
166
+ listing: null
167
+ }),
168
+ /* @__PURE__ */ m(o, {
169
+ open: W !== null,
170
+ onOpenChange: (e) => {
171
+ e || G(null);
172
+ },
173
+ listing: W
229
174
  }),
230
- I.length > 0 ? /* @__PURE__ */ u(A, {
231
- page: V,
232
- pageSize: H,
233
- totalItems: I.length,
234
- onPageChange: W
235
- }) : null,
236
- /* @__PURE__ */ u(n, {
237
- open: B.open,
238
- onOpenChange: B.onOpenChange,
239
- title: B.context ? "Edit service" : "Create service",
240
- description: "Describe the service you offer clients on the marketplace.",
241
- fields: M,
242
- initialValues: B.context ? N(B.context) : void 0,
243
- submitLabel: B.context ? "Save changes" : "Create service",
244
- onSubmit: async (e) => {
245
- B.context ? await R(B.context.id, P(e, B.context)) : await L(P(e));
246
- }
175
+ /* @__PURE__ */ m(g, {
176
+ open: J !== null,
177
+ onOpenChange: (e) => {
178
+ e || Y(null);
179
+ },
180
+ children: /* @__PURE__ */ h(y, { children: [/* @__PURE__ */ h(S, { children: [/* @__PURE__ */ m(C, { children: "Delete service?" }), /* @__PURE__ */ m(b, { children: J ? `“${J.title}” is removed from the marketplace. Existing bookings and their escrow records are kept.` : "" })] }), /* @__PURE__ */ h(x, { children: [/* @__PURE__ */ m(v, { children: "Cancel" }), /* @__PURE__ */ m(_, {
181
+ onClick: (e) => {
182
+ e.preventDefault();
183
+ let t = J;
184
+ Y(null), t && $(() => z(t.id));
185
+ },
186
+ children: "Delete"
187
+ })] })] })
247
188
  })
248
189
  ]
249
190
  });
250
191
  }
251
192
  //#endregion
252
- export { F as MarketplaceMyServicesPagePage };
193
+ export { N as MarketplaceMyServicesPagePage };
253
194
 
254
195
  //# sourceMappingURL=MarketplaceMyServicesPagePage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MarketplaceMyServicesPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/MarketplaceMyServicesPagePage.tsx"],"sourcesContent":["import { useNavigate } from 'react-router';\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n AlertDialogTrigger,\n Badge,\n Button,\n CardContent,\n CardHeader,\n CardTitle,\n GlassCard,\n GradientText,\n IllustratedEmptyState,\n PagePurpose,\n Pagination,\n} from '@burdenoff/fe-libs/ui';\nimport { usePagination } from '@burdenoff/fe-libs/shared/hooks';\nimport { Eye, Pencil, Plus, Star, Trash2 } from 'lucide-react';\nimport {\n FormModal,\n useFormModal,\n type FieldConfig,\n type FormValues,\n} from '../components/forms/FormModal';\nimport { useCrewFoundryStore, type MarketplaceService } from '../store/crewfoundryStore';\nimport { formatEnumLabel } from '../utils/formatEnumLabel';\n\nconst SERVICE_FIELDS: FieldConfig[] = [\n { name: 'title', label: 'Service title', type: 'text', required: true, colSpan: 2 },\n { name: 'provider', label: 'Provider', type: 'text', required: true },\n { name: 'category', label: 'Category', type: 'text', required: true },\n { name: 'price', label: 'Price', type: 'number', required: true },\n {\n name: 'priceType',\n label: 'Price type',\n type: 'select',\n required: true,\n options: [\n { label: 'Hourly', value: 'hourly' },\n { label: 'Fixed', value: 'fixed' },\n { label: 'Monthly', value: 'monthly' },\n ],\n },\n {\n name: 'deliveryTime',\n label: 'Delivery time',\n type: 'text',\n required: true,\n placeholder: 'e.g. 3 days',\n },\n {\n name: 'status',\n label: 'Status',\n type: 'select',\n options: [\n { label: 'Active', value: 'active' },\n { label: 'Paused', value: 'paused' },\n { label: 'Pending', value: 'pending' },\n ],\n },\n { name: 'description', label: 'Description', type: 'textarea', required: true, colSpan: 2 },\n { name: 'skills', label: 'Skills', type: 'tags', colSpan: 2 },\n];\n\nconst toInitialValues = (service: MarketplaceService): FormValues => ({\n title: service.title,\n provider: service.provider,\n category: service.category,\n price: service.price,\n priceType: service.priceType,\n deliveryTime: service.deliveryTime,\n status: service.status,\n description: service.description,\n skills: service.skills,\n});\n\nconst valuesToService = (values: FormValues, base?: MarketplaceService): MarketplaceService => ({\n id: base?.id ?? crypto.randomUUID(),\n title: String(values.title ?? ''),\n provider: String(values.provider ?? ''),\n category: String(values.category ?? ''),\n price: typeof values.price === 'number' ? values.price : Number(values.price) || 0,\n priceType: (values.priceType as MarketplaceService['priceType']) || 'hourly',\n rating: base?.rating ?? 0,\n reviews: base?.reviews ?? 0,\n description: String(values.description ?? ''),\n deliveryTime: String(values.deliveryTime ?? ''),\n status: (values.status as MarketplaceService['status']) || 'active',\n skills: Array.isArray(values.skills) ? values.skills : [],\n});\n\nexport function MarketplaceMyServicesPagePage() {\n const navigate = useNavigate();\n const {\n marketplaceServices,\n addMarketplaceService,\n updateMarketplaceService,\n removeMarketplaceService,\n } = useCrewFoundryStore();\n const modal = useFormModal<MarketplaceService>();\n const { page, pageSize, offset, setPage } = usePagination({ initialPageSize: 9 });\n // Every marketplace service in this workspace is managed here as an owned listing.\n const myServices = marketplaceServices.slice(offset, offset + pageSize);\n\n const handleSubmit = async (values: FormValues) => {\n if (modal.context) {\n await updateMarketplaceService(modal.context.id, valuesToService(values, modal.context));\n } else {\n await addMarketplaceService(valuesToService(values));\n }\n };\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>My Services</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">Manage your listed services</p>\n <PagePurpose className=\"mt-1\">\n Manage the services you offer to clients — list, edit, and showcase your offerings to\n win more work on the marketplace.\n </PagePurpose>\n </div>\n <Button size=\"sm\" onClick={() => modal.openModal()}>\n <Plus className=\"h-4 w-4 mr-1\" />\n Create Service\n </Button>\n </div>\n <div className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-3\">\n {marketplaceServices.length === 0 ? (\n <div className=\"col-span-full\">\n <IllustratedEmptyState\n illustration=\"empty-generic\"\n title=\"No services listed\"\n description=\"List a service to start winning work on the marketplace.\"\n />\n </div>\n ) : (\n myServices.map((svc, _idx) => (\n <GlassCard key={svc.id} treatment={_idx === 0 ? 'glass' : 'plain'} glow={_idx === 0}>\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <CardTitle className=\"text-base\">{svc.title}</CardTitle>\n <Badge\n variant={svc.status === 'active' ? 'default' : 'secondary'}\n className=\"text-[10px]\"\n >\n {formatEnumLabel(svc.status)}\n </Badge>\n </div>\n </CardHeader>\n <CardContent>\n <p className=\"text-sm text-text-secondary mb-3\">{svc.description}</p>\n <div className=\"flex items-center justify-between text-sm\">\n <span className=\"font-bold\">\n ${svc.price}/{svc.priceType}\n </span>\n <span className=\"flex items-center gap-1\">\n <Star className=\"h-3 w-3 text-status-warning-text\" />\n {svc.rating} ({svc.reviews})\n </span>\n </div>\n <div className=\"flex gap-2 mt-3\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"flex-1\"\n onClick={() => modal.openModal(svc)}\n >\n <Pencil className=\"h-3.5 w-3.5 mr-1\" />\n Edit\n </Button>\n <Button\n size=\"sm\"\n className=\"flex-1\"\n onClick={() => navigate(`../marketplace/service-details-page?id=${svc.id}`)}\n >\n <Eye className=\"h-3.5 w-3.5 mr-1\" />\n View\n </Button>\n <AlertDialog>\n <AlertDialogTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\" aria-label={`Delete ${svc.title}`}>\n <Trash2 className=\"h-4 w-4 text-status-error-text\" />\n </Button>\n </AlertDialogTrigger>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>Delete service?</AlertDialogTitle>\n <AlertDialogDescription>\n This removes “{svc.title}” from your marketplace listings. This action\n cannot be undone.\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel>Cancel</AlertDialogCancel>\n <AlertDialogAction onClick={() => void removeMarketplaceService(svc.id)}>\n Delete\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </div>\n </CardContent>\n </GlassCard>\n ))\n )}\n </div>\n {marketplaceServices.length > 0 ? (\n <Pagination\n page={page}\n pageSize={pageSize}\n totalItems={marketplaceServices.length}\n onPageChange={setPage}\n />\n ) : null}\n\n <FormModal\n open={modal.open}\n onOpenChange={modal.onOpenChange}\n title={modal.context ? 'Edit service' : 'Create service'}\n description=\"Describe the service you offer clients on the marketplace.\"\n fields={SERVICE_FIELDS}\n initialValues={modal.context ? toInitialValues(modal.context) : undefined}\n submitLabel={modal.context ? 'Save changes' : 'Create service'}\n onSubmit={handleSubmit}\n />\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"MarketplaceMyServicesPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/MarketplaceMyServicesPagePage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\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 { Pause, Pencil, Play, Plus, Trash2 } from 'lucide-react';\nimport { useNavigate } from 'react-router';\nimport { InlineError } from '../components/InlineError';\nimport { MarketplaceTabs } from '../components/marketplace/MarketplaceTabs';\nimport { ServiceListingModal } from '../components/marketplace/ServiceListingModal';\nimport { StatCard } from '../components/viz';\nimport { useCrewFoundryStore, type CrewServiceListing } from '../store/crewfoundryStore';\nimport { formatRate } from '../lib/marketplace';\nimport { useEnsureLoaded } from '../lib/useEnsureLoaded';\n\nexport function MarketplaceMyServicesPagePage() {\n const navigate = useNavigate();\n const {\n serviceListings,\n bookings,\n marketplaceLoaded,\n fetchMarketplace,\n updateServiceListing,\n removeServiceListing,\n initParams,\n } = useCrewFoundryStore();\n const loadError = useEnsureLoaded(marketplaceLoaded, fetchMarketplace);\n const [actionError, setActionError] = useState<string | null>(null);\n const [editTarget, setEditTarget] = useState<CrewServiceListing | null>(null);\n const [createOpen, setCreateOpen] = useState(false);\n const [deleteTarget, setDeleteTarget] = useState<CrewServiceListing | null>(null);\n\n const mine = serviceListings.filter((listing) => listing.providerActorId === initParams.actorId);\n const myBookings = bookings.filter((booking) => booking.providerActorId === initParams.actorId);\n const pending = myBookings.filter((booking) => booking.status === 'requested').length;\n\n const runAction = async (action: () => Promise<void>) => {\n setActionError(null);\n try {\n await action();\n } catch (error) {\n setActionError(error instanceof Error ? error.message : 'Something went wrong');\n }\n };\n\n const columns: ResponsiveTableColumn<CrewServiceListing>[] = [\n {\n key: 'title',\n header: 'Service',\n priority: 'primary',\n cell: (listing) => (\n <button\n type=\"button\"\n className=\"text-left font-medium hover:underline\"\n onClick={() =>\n navigate(`../marketplace/service-details-page?id=${encodeURIComponent(listing.id)}`)\n }\n >\n {listing.title}\n </button>\n ),\n },\n {\n key: 'rate',\n header: 'Rate',\n cell: (listing) => <span className=\"tabular-nums\">{formatRate(listing)}</span>,\n },\n {\n key: 'bookings',\n header: 'Bookings',\n cell: (listing) => (\n <span className=\"tabular-nums\">\n {myBookings.filter((booking) => booking.listingId === listing.id).length}\n </span>\n ),\n },\n {\n key: 'status',\n header: 'Status',\n cell: (listing) => (\n <Badge\n variant={listing.status === 'active' ? 'default' : 'secondary'}\n className=\"text-[10px]\"\n >\n {listing.status === 'active' ? 'Bookable' : 'Paused'}\n </Badge>\n ),\n },\n {\n key: 'actions',\n header: '',\n cellClassName: 'md:text-right',\n cell: (listing) => (\n <div className=\"flex justify-end gap-1\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n aria-label={`${listing.status === 'active' ? 'Pause' : 'Resume'} ${listing.title}`}\n onClick={() =>\n void runAction(() =>\n updateServiceListing(listing.id, {\n status: listing.status === 'active' ? 'paused' : 'active',\n })\n )\n }\n >\n {listing.status === 'active' ? (\n <Pause className=\"h-4 w-4\" />\n ) : (\n <Play className=\"h-4 w-4\" />\n )}\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n aria-label={`Edit ${listing.title}`}\n onClick={() => setEditTarget(listing)}\n >\n <Pencil className=\"h-4 w-4\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n aria-label={`Delete ${listing.title}`}\n onClick={() => setDeleteTarget(listing)}\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </div>\n ),\n },\n ];\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>My Services</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\n {mine.length} services you offer · {pending} booking requests waiting\n </p>\n <PagePurpose className=\"mt-1\">\n Manage the services you offer on the marketplace — set your rate, pause a service when\n you are fully booked, and respond to booking requests.\n </PagePurpose>\n </div>\n <Button size=\"sm\" onClick={() => setCreateOpen(true)}>\n <Plus className=\"mr-1 h-4 w-4\" />\n Publish a service\n </Button>\n </div>\n\n <MarketplaceTabs value=\"my-services\" />\n\n <InlineError message={loadError ?? actionError} />\n\n <div className=\"grid gap-4 sm:grid-cols-3\">\n <StatCard label=\"Services\" value={mine.length} />\n <StatCard\n label=\"Bookable\"\n value={mine.filter((listing) => listing.status === 'active').length}\n />\n <StatCard label=\"Requests Waiting\" value={pending} />\n </div>\n\n {!marketplaceLoaded && !loadError ? (\n <div className=\"flex min-h-[240px] items-center justify-center\">\n <Spinner size=\"lg\" />\n </div>\n ) : mine.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title=\"You haven't published a service\"\n description=\"Publish what you can help with and at what rate; colleagues can then book you.\"\n action={\n <Button size=\"sm\" onClick={() => setCreateOpen(true)}>\n <Plus className=\"mr-1 h-4 w-4\" />\n Publish a service\n </Button>\n }\n />\n ) : (\n <Card>\n <CardContent className=\"pt-6\">\n <ResponsiveTable<CrewServiceListing>\n data={mine}\n rowKey={(listing) => listing.id}\n columns={columns}\n />\n </CardContent>\n </Card>\n )}\n\n <ServiceListingModal open={createOpen} onOpenChange={setCreateOpen} listing={null} />\n <ServiceListingModal\n open={editTarget !== null}\n onOpenChange={(open) => {\n if (!open) setEditTarget(null);\n }}\n listing={editTarget}\n />\n\n <AlertDialog\n open={deleteTarget !== null}\n onOpenChange={(open) => {\n if (!open) setDeleteTarget(null);\n }}\n >\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>Delete service?</AlertDialogTitle>\n <AlertDialogDescription>\n {deleteTarget\n ? `“${deleteTarget.title}” is removed from the marketplace. Existing bookings and their escrow records are kept.`\n : ''}\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel>Cancel</AlertDialogCancel>\n <AlertDialogAction\n onClick={(event) => {\n event.preventDefault();\n const target = deleteTarget;\n setDeleteTarget(null);\n if (target) void runAction(() => removeServiceListing(target.id));\n }}\n >\n Delete\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"MarketplaceServiceDetailsPagePage.d.ts","sourceRoot":"","sources":["../../../src/crewfoundry/pages/MarketplaceServiceDetailsPagePage.tsx"],"names":[],"mappings":"AA4CA,wBAAgB,iCAAiC,gCA8QhD"}
1
+ {"version":3,"file":"MarketplaceServiceDetailsPagePage.d.ts","sourceRoot":"","sources":["../../../src/crewfoundry/pages/MarketplaceServiceDetailsPagePage.tsx"],"names":[],"mappings":"AAuBA,wBAAgB,iCAAiC,gCAuIhD"}