@burdenoff/microfe-crewfoundry 2026.626.1 → 2026.703.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/crewfoundry/components/forms/ConfirmDialog.js +43 -0
- package/dist/crewfoundry/components/forms/ConfirmDialog.js.map +1 -0
- package/dist/crewfoundry/components/forms/FormModal.js +220 -0
- package/dist/crewfoundry/components/forms/FormModal.js.map +1 -0
- package/dist/crewfoundry/components/forms/formValues.js +20 -0
- package/dist/crewfoundry/components/forms/formValues.js.map +1 -0
- package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js +255 -65
- package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js +28 -17
- package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsFilesPagePage.js +57 -53
- package/dist/crewfoundry/pages/CommunicationsFilesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js +32 -23
- package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js +44 -29
- package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js +183 -57
- package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyCompanyDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js +214 -92
- package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardDashboardPagePage.js +165 -131
- package/dist/crewfoundry/pages/DashboardDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js +163 -133
- package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringCandidatesPagePage.js +269 -54
- package/dist/crewfoundry/pages/HiringCandidatesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringCreateJobPagePage.js +225 -78
- package/dist/crewfoundry/pages/HiringCreateJobPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringInterviewsPagePage.js +213 -59
- package/dist/crewfoundry/pages/HiringInterviewsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js +287 -90
- package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringJobsPagePage.js +49 -47
- package/dist/crewfoundry/pages/HiringJobsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrDepartmentsPagePage.js +166 -59
- package/dist/crewfoundry/pages/HrDepartmentsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrEmployeesPagePage.js +274 -83
- package/dist/crewfoundry/pages/HrEmployeesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js +198 -88
- package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrPayrollPagePage.js +216 -88
- package/dist/crewfoundry/pages/HrPayrollPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js +216 -66
- package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js +6 -7
- package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js +83 -68
- package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCoursesPagePage.js +167 -46
- package/dist/crewfoundry/pages/LearningCoursesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js +75 -55
- package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js +152 -79
- package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningMyLearningPagePage.js +75 -63
- package/dist/crewfoundry/pages/LearningMyLearningPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js +3 -1
- package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js +235 -87
- package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js +199 -86
- package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js +21 -40
- package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/ProjectsCreateProjectPagePage.js +117 -45
- package/dist/crewfoundry/pages/ProjectsCreateProjectPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js +249 -90
- package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js +47 -45
- package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js +262 -133
- package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamsPagePage.js +144 -77
- package/dist/crewfoundry/pages/TeamsTeamsPagePage.js.map +1 -1
- package/dist/crewfoundry/store/crewfoundryStore.js +339 -52
- package/dist/crewfoundry/store/crewfoundryStore.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,98 +1,246 @@
|
|
|
1
1
|
import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
2
|
+
import { FormModal as t, useFormModal as n } from "../components/forms/FormModal.js";
|
|
3
|
+
import { Eye as r, Pencil as i, Plus as a, Star as o, Trash2 as s } from "lucide-react";
|
|
4
|
+
import { useNavigate as c } from "react-router-dom";
|
|
5
|
+
import { jsx as l, jsxs as u } from "react/jsx-runtime";
|
|
6
|
+
import { AlertDialog as d, AlertDialogAction as f, AlertDialogCancel as p, AlertDialogContent as m, AlertDialogDescription as h, AlertDialogFooter as g, AlertDialogHeader as _, AlertDialogTitle as v, AlertDialogTrigger as y, Badge as b, Button as x, CardContent as S, CardHeader as C, CardTitle as w, GlassCard as T, GradientText as E, IllustratedEmptyState as D, PagePurpose as O } from "@burdenoff/fe-libs/ui";
|
|
5
7
|
//#region src/crewfoundry/pages/MarketplaceMyServicesPagePage.tsx
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
8
|
+
var k = [
|
|
9
|
+
{
|
|
10
|
+
name: "title",
|
|
11
|
+
label: "Service title",
|
|
12
|
+
type: "text",
|
|
13
|
+
required: !0,
|
|
14
|
+
colSpan: 2
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
name: "provider",
|
|
18
|
+
label: "Provider",
|
|
19
|
+
type: "text",
|
|
20
|
+
required: !0
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
name: "category",
|
|
24
|
+
label: "Category",
|
|
25
|
+
type: "text",
|
|
26
|
+
required: !0
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
name: "price",
|
|
30
|
+
label: "Price",
|
|
31
|
+
type: "number",
|
|
32
|
+
required: !0
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
name: "priceType",
|
|
36
|
+
label: "Price type",
|
|
37
|
+
type: "select",
|
|
38
|
+
required: !0,
|
|
39
|
+
options: [
|
|
40
|
+
{
|
|
41
|
+
label: "Hourly",
|
|
42
|
+
value: "hourly"
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
label: "Fixed",
|
|
46
|
+
value: "fixed"
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
label: "Monthly",
|
|
50
|
+
value: "monthly"
|
|
51
|
+
}
|
|
52
|
+
]
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
name: "deliveryTime",
|
|
56
|
+
label: "Delivery time",
|
|
57
|
+
type: "text",
|
|
58
|
+
required: !0,
|
|
59
|
+
placeholder: "e.g. 3 days"
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
name: "status",
|
|
63
|
+
label: "Status",
|
|
64
|
+
type: "select",
|
|
65
|
+
options: [
|
|
66
|
+
{
|
|
67
|
+
label: "Active",
|
|
68
|
+
value: "active"
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
label: "Paused",
|
|
72
|
+
value: "paused"
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
label: "Pending",
|
|
76
|
+
value: "pending"
|
|
77
|
+
}
|
|
78
|
+
]
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
name: "description",
|
|
82
|
+
label: "Description",
|
|
83
|
+
type: "textarea",
|
|
84
|
+
required: !0,
|
|
85
|
+
colSpan: 2
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
name: "skills",
|
|
89
|
+
label: "Skills",
|
|
90
|
+
type: "tags",
|
|
91
|
+
colSpan: 2
|
|
92
|
+
}
|
|
93
|
+
], A = (e) => ({
|
|
94
|
+
title: e.title,
|
|
95
|
+
provider: e.provider,
|
|
96
|
+
category: e.category,
|
|
97
|
+
price: e.price,
|
|
98
|
+
priceType: e.priceType,
|
|
99
|
+
deliveryTime: e.deliveryTime,
|
|
100
|
+
status: e.status,
|
|
101
|
+
description: e.description,
|
|
102
|
+
skills: e.skills
|
|
103
|
+
}), j = (e, t) => ({
|
|
104
|
+
id: t?.id ?? crypto.randomUUID(),
|
|
105
|
+
title: String(e.title ?? ""),
|
|
106
|
+
provider: String(e.provider ?? ""),
|
|
107
|
+
category: String(e.category ?? ""),
|
|
108
|
+
price: typeof e.price == "number" ? e.price : Number(e.price) || 0,
|
|
109
|
+
priceType: e.priceType || "hourly",
|
|
110
|
+
rating: t?.rating ?? 0,
|
|
111
|
+
reviews: t?.reviews ?? 0,
|
|
112
|
+
description: String(e.description ?? ""),
|
|
113
|
+
deliveryTime: String(e.deliveryTime ?? ""),
|
|
114
|
+
status: e.status || "active",
|
|
115
|
+
skills: Array.isArray(e.skills) ? e.skills : []
|
|
116
|
+
});
|
|
117
|
+
function M() {
|
|
118
|
+
let M = c(), { marketplaceServices: N, addMarketplaceService: P, updateMarketplaceService: F, removeMarketplaceService: I } = e(), L = n(), R = N.slice(0, 3);
|
|
119
|
+
return /* @__PURE__ */ u("div", {
|
|
9
120
|
className: "space-y-6 p-6",
|
|
10
|
-
children: [
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
/* @__PURE__ */
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
/* @__PURE__ */ r("p", {
|
|
18
|
-
className: "text-sm text-text-secondary",
|
|
19
|
-
children: "Manage your listed services"
|
|
20
|
-
}),
|
|
21
|
-
/* @__PURE__ */ r(p, {
|
|
22
|
-
className: "mt-1",
|
|
23
|
-
children: "Manage the services you offer to clients — list, edit, and showcase your offerings to win more work on the marketplace."
|
|
24
|
-
})
|
|
25
|
-
] }), /* @__PURE__ */ i(o, {
|
|
26
|
-
size: "sm",
|
|
27
|
-
children: [/* @__PURE__ */ r(t, { className: "h-4 w-4 mr-1" }), "Create Service"]
|
|
28
|
-
})]
|
|
29
|
-
}), /* @__PURE__ */ r("div", {
|
|
30
|
-
className: "grid gap-4 md:grid-cols-2 lg:grid-cols-3",
|
|
31
|
-
children: h.length === 0 ? /* @__PURE__ */ r("div", {
|
|
32
|
-
className: "col-span-full",
|
|
33
|
-
children: /* @__PURE__ */ r(f, {
|
|
34
|
-
illustration: "empty-generic",
|
|
35
|
-
title: "No services listed",
|
|
36
|
-
description: "List a service to start winning work on the marketplace."
|
|
37
|
-
})
|
|
38
|
-
}) : h.map((e, t) => /* @__PURE__ */ i(u, {
|
|
39
|
-
treatment: t === 0 ? "glass" : "plain",
|
|
40
|
-
glow: t === 0,
|
|
41
|
-
children: [/* @__PURE__ */ r(c, { children: /* @__PURE__ */ i("div", {
|
|
42
|
-
className: "flex items-center justify-between",
|
|
43
|
-
children: [/* @__PURE__ */ r(l, {
|
|
44
|
-
className: "text-base",
|
|
45
|
-
children: e.title
|
|
46
|
-
}), /* @__PURE__ */ r(a, {
|
|
47
|
-
variant: e.status === "active" ? "default" : "secondary",
|
|
48
|
-
className: "text-[10px]",
|
|
49
|
-
children: e.status
|
|
50
|
-
})]
|
|
51
|
-
}) }), /* @__PURE__ */ i(s, { children: [
|
|
52
|
-
/* @__PURE__ */ r("p", {
|
|
53
|
-
className: "text-sm text-text-secondary mb-3",
|
|
54
|
-
children: e.description
|
|
121
|
+
children: [
|
|
122
|
+
/* @__PURE__ */ u("div", {
|
|
123
|
+
className: "flex items-center justify-between",
|
|
124
|
+
children: [/* @__PURE__ */ u("div", { children: [
|
|
125
|
+
/* @__PURE__ */ l("h1", {
|
|
126
|
+
className: "text-2xl font-semibold",
|
|
127
|
+
children: /* @__PURE__ */ l(E, { children: "My Services" })
|
|
55
128
|
}),
|
|
56
|
-
/* @__PURE__ */
|
|
57
|
-
className: "
|
|
58
|
-
children:
|
|
59
|
-
className: "font-bold",
|
|
60
|
-
children: [
|
|
61
|
-
"$",
|
|
62
|
-
e.price,
|
|
63
|
-
"/",
|
|
64
|
-
e.priceType
|
|
65
|
-
]
|
|
66
|
-
}), /* @__PURE__ */ i("span", {
|
|
67
|
-
className: "flex items-center gap-1",
|
|
68
|
-
children: [
|
|
69
|
-
/* @__PURE__ */ r(n, { className: "h-3 w-3 text-status-warning-text" }),
|
|
70
|
-
e.rating,
|
|
71
|
-
" (",
|
|
72
|
-
e.reviews,
|
|
73
|
-
")"
|
|
74
|
-
]
|
|
75
|
-
})]
|
|
129
|
+
/* @__PURE__ */ l("p", {
|
|
130
|
+
className: "text-sm text-text-secondary",
|
|
131
|
+
children: "Manage your listed services"
|
|
76
132
|
}),
|
|
77
|
-
/* @__PURE__ */
|
|
78
|
-
className: "
|
|
79
|
-
children:
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
133
|
+
/* @__PURE__ */ l(O, {
|
|
134
|
+
className: "mt-1",
|
|
135
|
+
children: "Manage the services you offer to clients — list, edit, and showcase your offerings to win more work on the marketplace."
|
|
136
|
+
})
|
|
137
|
+
] }), /* @__PURE__ */ u(x, {
|
|
138
|
+
size: "sm",
|
|
139
|
+
onClick: () => L.openModal(),
|
|
140
|
+
children: [/* @__PURE__ */ l(a, { className: "h-4 w-4 mr-1" }), "Create Service"]
|
|
141
|
+
})]
|
|
142
|
+
}),
|
|
143
|
+
/* @__PURE__ */ l("div", {
|
|
144
|
+
className: "grid gap-4 md:grid-cols-2 lg:grid-cols-3",
|
|
145
|
+
children: R.length === 0 ? /* @__PURE__ */ l("div", {
|
|
146
|
+
className: "col-span-full",
|
|
147
|
+
children: /* @__PURE__ */ l(D, {
|
|
148
|
+
illustration: "empty-generic",
|
|
149
|
+
title: "No services listed",
|
|
150
|
+
description: "List a service to start winning work on the marketplace."
|
|
89
151
|
})
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
152
|
+
}) : R.map((e, t) => /* @__PURE__ */ u(T, {
|
|
153
|
+
treatment: t === 0 ? "glass" : "plain",
|
|
154
|
+
glow: t === 0,
|
|
155
|
+
children: [/* @__PURE__ */ l(C, { children: /* @__PURE__ */ u("div", {
|
|
156
|
+
className: "flex items-center justify-between",
|
|
157
|
+
children: [/* @__PURE__ */ l(w, {
|
|
158
|
+
className: "text-base",
|
|
159
|
+
children: e.title
|
|
160
|
+
}), /* @__PURE__ */ l(b, {
|
|
161
|
+
variant: e.status === "active" ? "default" : "secondary",
|
|
162
|
+
className: "text-[10px]",
|
|
163
|
+
children: e.status
|
|
164
|
+
})]
|
|
165
|
+
}) }), /* @__PURE__ */ u(S, { children: [
|
|
166
|
+
/* @__PURE__ */ l("p", {
|
|
167
|
+
className: "text-sm text-text-secondary mb-3",
|
|
168
|
+
children: e.description
|
|
169
|
+
}),
|
|
170
|
+
/* @__PURE__ */ u("div", {
|
|
171
|
+
className: "flex items-center justify-between text-sm",
|
|
172
|
+
children: [/* @__PURE__ */ u("span", {
|
|
173
|
+
className: "font-bold",
|
|
174
|
+
children: [
|
|
175
|
+
"$",
|
|
176
|
+
e.price,
|
|
177
|
+
"/",
|
|
178
|
+
e.priceType
|
|
179
|
+
]
|
|
180
|
+
}), /* @__PURE__ */ u("span", {
|
|
181
|
+
className: "flex items-center gap-1",
|
|
182
|
+
children: [
|
|
183
|
+
/* @__PURE__ */ l(o, { className: "h-3 w-3 text-status-warning-text" }),
|
|
184
|
+
e.rating,
|
|
185
|
+
" (",
|
|
186
|
+
e.reviews,
|
|
187
|
+
")"
|
|
188
|
+
]
|
|
189
|
+
})]
|
|
190
|
+
}),
|
|
191
|
+
/* @__PURE__ */ u("div", {
|
|
192
|
+
className: "flex gap-2 mt-3",
|
|
193
|
+
children: [
|
|
194
|
+
/* @__PURE__ */ u(x, {
|
|
195
|
+
variant: "outline",
|
|
196
|
+
size: "sm",
|
|
197
|
+
className: "flex-1",
|
|
198
|
+
onClick: () => L.openModal(e),
|
|
199
|
+
children: [/* @__PURE__ */ l(i, { className: "h-3.5 w-3.5 mr-1" }), "Edit"]
|
|
200
|
+
}),
|
|
201
|
+
/* @__PURE__ */ u(x, {
|
|
202
|
+
size: "sm",
|
|
203
|
+
className: "flex-1",
|
|
204
|
+
onClick: () => M("../../marketplace/service-details-page"),
|
|
205
|
+
children: [/* @__PURE__ */ l(r, { className: "h-3.5 w-3.5 mr-1" }), "View"]
|
|
206
|
+
}),
|
|
207
|
+
/* @__PURE__ */ u(d, { children: [/* @__PURE__ */ l(y, {
|
|
208
|
+
asChild: !0,
|
|
209
|
+
children: /* @__PURE__ */ l(x, {
|
|
210
|
+
variant: "ghost",
|
|
211
|
+
size: "icon",
|
|
212
|
+
"aria-label": `Delete ${e.title}`,
|
|
213
|
+
children: /* @__PURE__ */ l(s, { className: "h-4 w-4 text-status-error-text" })
|
|
214
|
+
})
|
|
215
|
+
}), /* @__PURE__ */ u(m, { children: [/* @__PURE__ */ u(_, { children: [/* @__PURE__ */ l(v, { children: "Delete service?" }), /* @__PURE__ */ u(h, { children: [
|
|
216
|
+
"This removes “",
|
|
217
|
+
e.title,
|
|
218
|
+
"” from your marketplace listings. This action cannot be undone."
|
|
219
|
+
] })] }), /* @__PURE__ */ u(g, { children: [/* @__PURE__ */ l(p, { children: "Cancel" }), /* @__PURE__ */ l(f, {
|
|
220
|
+
onClick: () => void I(e.id),
|
|
221
|
+
children: "Delete"
|
|
222
|
+
})] })] })] })
|
|
223
|
+
]
|
|
224
|
+
})
|
|
225
|
+
] })]
|
|
226
|
+
}, e.id))
|
|
227
|
+
}),
|
|
228
|
+
/* @__PURE__ */ l(t, {
|
|
229
|
+
open: L.open,
|
|
230
|
+
onOpenChange: L.onOpenChange,
|
|
231
|
+
title: L.context ? "Edit service" : "Create service",
|
|
232
|
+
description: "Describe the service you offer clients on the marketplace.",
|
|
233
|
+
fields: k,
|
|
234
|
+
initialValues: L.context ? A(L.context) : void 0,
|
|
235
|
+
submitLabel: L.context ? "Save changes" : "Create service",
|
|
236
|
+
onSubmit: async (e) => {
|
|
237
|
+
L.context ? await F(L.context.id, j(e, L.context)) : await P(j(e));
|
|
238
|
+
}
|
|
239
|
+
})
|
|
240
|
+
]
|
|
93
241
|
});
|
|
94
242
|
}
|
|
95
243
|
//#endregion
|
|
96
|
-
export {
|
|
244
|
+
export { M as MarketplaceMyServicesPagePage };
|
|
97
245
|
|
|
98
246
|
//# sourceMappingURL=MarketplaceMyServicesPagePage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MarketplaceMyServicesPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/MarketplaceMyServicesPagePage.tsx"],"sourcesContent":["import {\n Badge,\n Button,\n CardContent,\n CardHeader,\n CardTitle,\n GlassCard,\n GradientText,\n IllustratedEmptyState,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport { Plus, Star } from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\nexport function MarketplaceMyServicesPagePage() {\n const { marketplaceServices } = useCrewFoundryStore();\n // Show a subset as \"my services\"\n const myServices = marketplaceServices.slice(0, 3);\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\">Manage the services you offer to clients — list, edit, and showcase your offerings to win more work on the marketplace.</PagePurpose>\n </div>\n <Button size=\"sm\">\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 {myServices.length === 0 ? (\n <div className=\"col-span-full\">\n <IllustratedEmptyState illustration=\"empty-generic\" title=\"No services listed\" description=\"List a service to start winning work on the marketplace.\" />\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 {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 variant=\"outline\" size=\"sm\" className=\"flex-1\">\n Edit\n </Button>\n <Button size=\"sm\" className=\"flex-1\">\n View\n </Button>\n </div>\n </CardContent>\n </GlassCard>\n )))}\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;AAcA,SAAgB,IAAgC;CAC9C,IAAM,EAAE,2BAAwB,GAAqB,EAE/C,IAAa,EAAoB,MAAM,GAAG,EAAE;AAElD,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD,EAAA,UAAA;IACE,kBAAC,MAAD;KAAI,WAAU;eACZ,kBAAC,GAAD,EAAA,UAAc,eAA0B,CAAA;KACrC,CAAA;IACL,kBAAC,KAAD;KAAG,WAAU;eAA8B;KAA+B,CAAA;IAC1E,kBAAC,GAAD;KAAa,WAAU;eAAO;KAAqI,CAAA;IAC/J,EAAA,CAAA,EACN,kBAAC,GAAD;IAAQ,MAAK;cAAb,CACE,kBAAC,GAAD,EAAM,WAAU,gBAAiB,CAAA,EAAA,iBAE1B;MACL;MACN,kBAAC,OAAD;GAAK,WAAU;aACZ,EAAW,WAAW,IACrB,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,GAAD;KAAuB,cAAa;KAAgB,OAAM;KAAqB,aAAY;KAA6D,CAAA;IACpJ,CAAA,GAEN,EAAW,KAAK,GAAK,MACrB,kBAAC,GAAD;IAAwB,WAAW,MAAS,IAAI,UAAU;IAAS,MAAM,MAAS;cAAlF,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD;MAAW,WAAU;gBAAa,EAAI;MAAkB,CAAA,EACxD,kBAAC,GAAD;MACE,SAAS,EAAI,WAAW,WAAW,YAAY;MAC/C,WAAU;gBAET,EAAI;MACC,CAAA,CACJ;QACK,CAAA,EACb,kBAAC,GAAD,EAAA,UAAA;KACE,kBAAC,KAAD;MAAG,WAAU;gBAAoC,EAAI;MAAgB,CAAA;KACrE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,QAAD;OAAM,WAAU;iBAAhB;QAA4B;QACxB,EAAI;QAAM;QAAE,EAAI;QACb;UACP,kBAAC,QAAD;OAAM,WAAU;iBAAhB;QACE,kBAAC,GAAD,EAAM,WAAU,oCAAqC,CAAA;QACpD,EAAI;QAAO;QAAG,EAAI;QAAQ;QACtB;SACH;;KACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD;OAAQ,SAAQ;OAAU,MAAK;OAAK,WAAU;iBAAS;OAE9C,CAAA,EACT,kBAAC,GAAD;OAAQ,MAAK;OAAK,WAAU;iBAAS;OAE5B,CAAA,CACL;;KACM,EAAA,CAAA,CACJ;MAhCI,EAAI,GAgCR,CACZ;GACE,CAAA,CACF"}
|
|
1
|
+
{"version":3,"file":"MarketplaceMyServicesPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/MarketplaceMyServicesPagePage.tsx"],"sourcesContent":["import { useNavigate } from 'react-router-dom';\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} from '@burdenoff/fe-libs/ui';\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';\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 { name: 'deliveryTime', label: 'Delivery time', type: 'text', required: true, placeholder: 'e.g. 3 days' },\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 = (\n values: FormValues,\n base?: MarketplaceService\n): 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 { marketplaceServices, addMarketplaceService, updateMarketplaceService, removeMarketplaceService } =\n useCrewFoundryStore();\n const modal = useFormModal<MarketplaceService>();\n // Show a subset as \"my services\"\n const myServices = marketplaceServices.slice(0, 3);\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\">Manage the services you offer to clients — list, edit, and showcase your offerings to win more work on the marketplace.</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 {myServices.length === 0 ? (\n <div className=\"col-span-full\">\n <IllustratedEmptyState illustration=\"empty-generic\" title=\"No services listed\" description=\"List a service to start winning work on the marketplace.\" />\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 {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')}\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 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 </div>\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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"}
|