@burdenoff/microfe-crewfoundry 2026.703.2 → 2026.704.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/crewfoundry/pages/AdminAdminPagePage.js +117 -164
- package/dist/crewfoundry/pages/AdminAdminPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsAnalyticsPagePage.js +99 -82
- package/dist/crewfoundry/pages/AnalyticsAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsEmployeeAnalyticsPagePage.js +160 -192
- package/dist/crewfoundry/pages/AnalyticsEmployeeAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js +238 -231
- package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.js +196 -166
- package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js +45 -147
- package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsDirectoryPagePage.js +20 -11
- package/dist/crewfoundry/pages/CommunicationsDirectoryPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsFilesPagePage.js +45 -152
- package/dist/crewfoundry/pages/CommunicationsFilesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js +50 -138
- package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsTeamsPagePage.js +149 -67
- package/dist/crewfoundry/pages/CommunicationsTeamsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js +50 -201
- package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js +205 -136
- package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyCompanyDashboardPagePage.js +25 -31
- package/dist/crewfoundry/pages/CompanyCompanyDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyCompanyProfilePagePage.js +118 -104
- package/dist/crewfoundry/pages/CompanyCompanyProfilePagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js +117 -58
- package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardAnalyticsPagePage.js +90 -94
- package/dist/crewfoundry/pages/DashboardAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardDashboardPagePage.js +210 -191
- package/dist/crewfoundry/pages/DashboardDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js +213 -180
- package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardExecutiveDashboardPage.js +133 -264
- package/dist/crewfoundry/pages/DashboardExecutiveDashboardPage.js.map +1 -1
- package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.js +279 -212
- package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringApplicationsPagePage.js +131 -105
- package/dist/crewfoundry/pages/HiringApplicationsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringCandidatesPagePage.js +167 -148
- package/dist/crewfoundry/pages/HiringCandidatesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringCreateJobPagePage.js +3 -3
- package/dist/crewfoundry/pages/HiringCreateJobPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringInterviewsPagePage.js +13 -5
- package/dist/crewfoundry/pages/HiringInterviewsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js +151 -152
- package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringJobsPagePage.js +38 -21
- package/dist/crewfoundry/pages/HiringJobsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrDepartmentsPagePage.js +3 -3
- package/dist/crewfoundry/pages/HrDepartmentsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrEmployeesPagePage.js +134 -127
- package/dist/crewfoundry/pages/HrEmployeesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js +163 -132
- package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrPayrollPagePage.js +202 -160
- package/dist/crewfoundry/pages/HrPayrollPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js +104 -91
- package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js +29 -147
- package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCertificatesPagePage.js +22 -106
- package/dist/crewfoundry/pages/LearningCertificatesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js +74 -74
- package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js +101 -97
- package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCoursesPagePage.js +64 -47
- package/dist/crewfoundry/pages/LearningCoursesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.js +111 -121
- package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPagePage.js +131 -110
- package/dist/crewfoundry/pages/LearningLearningPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js +65 -64
- package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js +58 -43
- package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningMyLearningPagePage.js +66 -82
- package/dist/crewfoundry/pages/LearningMyLearningPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js +38 -88
- package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js +59 -65
- package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js +209 -323
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js +175 -220
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js +74 -59
- package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js +96 -80
- package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.js +28 -100
- package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js +27 -20
- package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js +73 -73
- package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js +62 -56
- package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsEscrowPagePage.js +40 -138
- package/dist/crewfoundry/pages/PaymentsEscrowPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js +126 -93
- package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js +99 -77
- package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsSecurityPagePage.js +73 -74
- package/dist/crewfoundry/pages/PaymentsSecurityPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/ProjectsCreateProjectPagePage.js +1 -1
- package/dist/crewfoundry/pages/ProjectsCreateProjectPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js +122 -122
- package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js +130 -113
- package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamAnalyticsPagePage.js +68 -59
- package/dist/crewfoundry/pages/TeamsTeamAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamDetailPagePage.js +73 -62
- package/dist/crewfoundry/pages/TeamsTeamDetailPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamDirectoryPagePage.js +82 -58
- package/dist/crewfoundry/pages/TeamsTeamDirectoryPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js +153 -153
- package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamsPagePage.js +63 -48
- package/dist/crewfoundry/pages/TeamsTeamsPagePage.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,110 +1,38 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { Search as r } from "lucide-react";
|
|
4
|
-
import { jsx as i, jsxs as a } from "react/jsx-runtime";
|
|
5
|
-
import { CardContent as o, GlassCard as s, GradientText as c, IllustratedEmptyState as l, Input as u, PagePurpose as d } from "@burdenoff/fe-libs/ui";
|
|
1
|
+
import { jsx as e, jsxs as t } from "react/jsx-runtime";
|
|
2
|
+
import { CardContent as n, GlassCard as r, GradientText as i, IllustratedEmptyState as a, PagePurpose as o } from "@burdenoff/fe-libs/ui";
|
|
6
3
|
//#region src/crewfoundry/pages/MarketplaceMessagingPagePage.tsx
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
if (Number.isNaN(t.getTime())) return "recently";
|
|
10
|
-
let n = Math.max(1, Math.floor((Date.now() - t.getTime()) / (1e3 * 60 * 60)));
|
|
11
|
-
return n < 24 ? `${n} hours ago` : `${Math.floor(n / 24)} days ago`;
|
|
12
|
-
};
|
|
13
|
-
function p() {
|
|
14
|
-
let [p, m] = n(""), { marketplaceServices: h, notifications: g, clients: _, vendors: v } = e(), y = t(() => g.slice(0, 20).map((e, t) => {
|
|
15
|
-
let n = h[t % Math.max(h.length, 1)], r = _[t % Math.max(_.length, 1)]?.name || v[t % Math.max(v.length, 1)]?.name || "Marketplace Partner";
|
|
16
|
-
return {
|
|
17
|
-
id: e.id,
|
|
18
|
-
from: n?.provider || r,
|
|
19
|
-
company: r,
|
|
20
|
-
message: e.message,
|
|
21
|
-
time: f(e.createdAt),
|
|
22
|
-
unread: !e.read
|
|
23
|
-
};
|
|
24
|
-
}), [
|
|
25
|
-
_,
|
|
26
|
-
h,
|
|
27
|
-
g,
|
|
28
|
-
v
|
|
29
|
-
]).filter((e) => `${e.from} ${e.company} ${e.message}`.toLowerCase().includes(p.toLowerCase()));
|
|
30
|
-
return /* @__PURE__ */ a("div", {
|
|
4
|
+
function s() {
|
|
5
|
+
return /* @__PURE__ */ t("div", {
|
|
31
6
|
className: "space-y-6 p-6",
|
|
32
|
-
children: [
|
|
33
|
-
/* @__PURE__ */
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
children: "Communication with service providers"
|
|
41
|
-
}),
|
|
42
|
-
/* @__PURE__ */ i(d, {
|
|
43
|
-
className: "mt-1",
|
|
44
|
-
children: "Message freelancers and clients about your engagements — keep all marketplace conversations in one organized inbox."
|
|
45
|
-
})
|
|
46
|
-
] }),
|
|
47
|
-
/* @__PURE__ */ a("div", {
|
|
48
|
-
className: "relative max-w-sm",
|
|
49
|
-
children: [/* @__PURE__ */ i(r, { className: "absolute top-1/2 left-3 h-4 w-4 -translate-y-1/2 text-text-secondary" }), /* @__PURE__ */ i(u, {
|
|
50
|
-
placeholder: "Search messages...",
|
|
51
|
-
className: "pl-9",
|
|
52
|
-
value: p,
|
|
53
|
-
onChange: (e) => m(e.target.value)
|
|
54
|
-
})]
|
|
7
|
+
children: [/* @__PURE__ */ t("div", { children: [
|
|
8
|
+
/* @__PURE__ */ e("h1", {
|
|
9
|
+
className: "text-2xl font-semibold",
|
|
10
|
+
children: /* @__PURE__ */ e(i, { children: "Service Messages" })
|
|
11
|
+
}),
|
|
12
|
+
/* @__PURE__ */ e("p", {
|
|
13
|
+
className: "text-sm text-text-secondary",
|
|
14
|
+
children: "Communication with service providers"
|
|
55
15
|
}),
|
|
56
|
-
/* @__PURE__ */
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
className: `flex cursor-pointer items-center gap-3 border-b p-4 last:border-0 hover:bg-bg-sunken/50 ${e.unread ? "bg-status-info-bg/30" : ""}`,
|
|
71
|
-
children: [
|
|
72
|
-
/* @__PURE__ */ i("div", {
|
|
73
|
-
className: "flex h-10 w-10 flex-shrink-0 items-center justify-center rounded-full bg-action-primary-bg/10 text-sm font-bold",
|
|
74
|
-
children: e.from.split(" ").map((e) => e[0]).join("")
|
|
75
|
-
}),
|
|
76
|
-
/* @__PURE__ */ a("div", {
|
|
77
|
-
className: "min-w-0 flex-1",
|
|
78
|
-
children: [
|
|
79
|
-
/* @__PURE__ */ a("div", {
|
|
80
|
-
className: "flex items-center justify-between",
|
|
81
|
-
children: [/* @__PURE__ */ i("p", {
|
|
82
|
-
className: `text-sm ${e.unread ? "font-bold" : "font-medium"}`,
|
|
83
|
-
children: e.from
|
|
84
|
-
}), /* @__PURE__ */ i("span", {
|
|
85
|
-
className: "text-xs text-text-secondary",
|
|
86
|
-
children: e.time
|
|
87
|
-
})]
|
|
88
|
-
}),
|
|
89
|
-
/* @__PURE__ */ i("p", {
|
|
90
|
-
className: "text-xs text-text-secondary",
|
|
91
|
-
children: e.company
|
|
92
|
-
}),
|
|
93
|
-
/* @__PURE__ */ i("p", {
|
|
94
|
-
className: "mt-0.5 truncate text-xs text-text-secondary",
|
|
95
|
-
children: e.message
|
|
96
|
-
})
|
|
97
|
-
]
|
|
98
|
-
}),
|
|
99
|
-
e.unread ? /* @__PURE__ */ i("div", { className: "h-2 w-2 flex-shrink-0 rounded-full bg-status-info-text" }) : null
|
|
100
|
-
]
|
|
101
|
-
}, e.id))
|
|
16
|
+
/* @__PURE__ */ e(o, {
|
|
17
|
+
className: "mt-1",
|
|
18
|
+
children: "Message freelancers and clients about your engagements — keep all marketplace conversations in one organized inbox."
|
|
19
|
+
})
|
|
20
|
+
] }), /* @__PURE__ */ e(r, {
|
|
21
|
+
treatment: "glass",
|
|
22
|
+
glow: !0,
|
|
23
|
+
className: "border-border-seam",
|
|
24
|
+
children: /* @__PURE__ */ e(n, {
|
|
25
|
+
className: "p-6",
|
|
26
|
+
children: /* @__PURE__ */ e(a, {
|
|
27
|
+
illustration: "empty-notifications",
|
|
28
|
+
title: "Direct messaging is coming soon",
|
|
29
|
+
description: "Conversations with providers and clients will appear here once marketplace messaging ships."
|
|
102
30
|
})
|
|
103
31
|
})
|
|
104
|
-
]
|
|
32
|
+
})]
|
|
105
33
|
});
|
|
106
34
|
}
|
|
107
35
|
//#endregion
|
|
108
|
-
export {
|
|
36
|
+
export { s as MarketplaceMessagingPagePage };
|
|
109
37
|
|
|
110
38
|
//# sourceMappingURL=MarketplaceMessagingPagePage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MarketplaceMessagingPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/MarketplaceMessagingPagePage.tsx"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"MarketplaceMessagingPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/MarketplaceMessagingPagePage.tsx"],"sourcesContent":["import {\n CardContent,\n GlassCard,\n GradientText,\n IllustratedEmptyState,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\n\nexport function MarketplaceMessagingPagePage() {\n return (\n <div className=\"space-y-6 p-6\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>Service Messages</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">Communication with service providers</p>\n <PagePurpose className=\"mt-1\">Message freelancers and clients about your engagements — keep all marketplace conversations in one organized inbox.</PagePurpose>\n </div>\n\n <GlassCard treatment=\"glass\" glow className=\"border-border-seam\">\n <CardContent className=\"p-6\">\n {/* Direct marketplace messaging has no backend yet. We show an honest\n coming-soon empty state rather than synthesizing message threads\n from unrelated notification data. */}\n <IllustratedEmptyState\n illustration=\"empty-notifications\"\n title=\"Direct messaging is coming soon\"\n description=\"Conversations with providers and clients will appear here once marketplace messaging ships.\"\n />\n </CardContent>\n </GlassCard>\n </div>\n );\n}\n"],"mappings":";;;AAQA,SAAgB,IAA+B;AAC7C,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,OAAD,EAAA,UAAA;GACE,kBAAC,MAAD;IAAI,WAAU;cACZ,kBAAC,GAAD,EAAA,UAAc,oBAA+B,CAAA;IAC1C,CAAA;GACL,kBAAC,KAAD;IAAG,WAAU;cAA8B;IAAwC,CAAA;GACnF,kBAAC,GAAD;IAAa,WAAU;cAAO;IAAiI,CAAA;GAC3J,EAAA,CAAA,EAEN,kBAAC,GAAD;GAAW,WAAU;GAAQ,MAAA;GAAK,WAAU;aAC1C,kBAAC,GAAD;IAAa,WAAU;cAIrB,kBAAC,GAAD;KACE,cAAa;KACb,OAAM;KACN,aAAY;KACZ,CAAA;IACU,CAAA;GACJ,CAAA,CACR"}
|
|
@@ -3,9 +3,10 @@ import { FormModal as t, useFormModal as n } from "../components/forms/FormModal
|
|
|
3
3
|
import { Eye as r, Pencil as i, Plus as a, Star as o, Trash2 as s } from "lucide-react";
|
|
4
4
|
import { useNavigate as c } from "react-router-dom";
|
|
5
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";
|
|
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, Pagination as k } from "@burdenoff/fe-libs/ui";
|
|
7
|
+
import { usePagination as A } from "@burdenoff/fe-libs/shared/hooks";
|
|
7
8
|
//#region src/crewfoundry/pages/MarketplaceMyServicesPagePage.tsx
|
|
8
|
-
var
|
|
9
|
+
var j = [
|
|
9
10
|
{
|
|
10
11
|
name: "title",
|
|
11
12
|
label: "Service title",
|
|
@@ -90,7 +91,7 @@ var k = [
|
|
|
90
91
|
type: "tags",
|
|
91
92
|
colSpan: 2
|
|
92
93
|
}
|
|
93
|
-
],
|
|
94
|
+
], M = (e) => ({
|
|
94
95
|
title: e.title,
|
|
95
96
|
provider: e.provider,
|
|
96
97
|
category: e.category,
|
|
@@ -100,7 +101,7 @@ var k = [
|
|
|
100
101
|
status: e.status,
|
|
101
102
|
description: e.description,
|
|
102
103
|
skills: e.skills
|
|
103
|
-
}),
|
|
104
|
+
}), N = (e, t) => ({
|
|
104
105
|
id: t?.id ?? crypto.randomUUID(),
|
|
105
106
|
title: String(e.title ?? ""),
|
|
106
107
|
provider: String(e.provider ?? ""),
|
|
@@ -114,8 +115,8 @@ var k = [
|
|
|
114
115
|
status: e.status || "active",
|
|
115
116
|
skills: Array.isArray(e.skills) ? e.skills : []
|
|
116
117
|
});
|
|
117
|
-
function
|
|
118
|
-
let
|
|
118
|
+
function P() {
|
|
119
|
+
let P = c(), { marketplaceServices: F, addMarketplaceService: I, updateMarketplaceService: L, removeMarketplaceService: R } = e(), z = n(), { page: B, pageSize: V, offset: H, setPage: U } = A({ initialPageSize: 9 }), W = F.slice(H, H + V);
|
|
119
120
|
return /* @__PURE__ */ u("div", {
|
|
120
121
|
className: "space-y-6 p-6",
|
|
121
122
|
children: [
|
|
@@ -136,20 +137,20 @@ function M() {
|
|
|
136
137
|
})
|
|
137
138
|
] }), /* @__PURE__ */ u(x, {
|
|
138
139
|
size: "sm",
|
|
139
|
-
onClick: () =>
|
|
140
|
+
onClick: () => z.openModal(),
|
|
140
141
|
children: [/* @__PURE__ */ l(a, { className: "h-4 w-4 mr-1" }), "Create Service"]
|
|
141
142
|
})]
|
|
142
143
|
}),
|
|
143
144
|
/* @__PURE__ */ l("div", {
|
|
144
145
|
className: "grid gap-4 md:grid-cols-2 lg:grid-cols-3",
|
|
145
|
-
children:
|
|
146
|
+
children: F.length === 0 ? /* @__PURE__ */ l("div", {
|
|
146
147
|
className: "col-span-full",
|
|
147
148
|
children: /* @__PURE__ */ l(D, {
|
|
148
149
|
illustration: "empty-generic",
|
|
149
150
|
title: "No services listed",
|
|
150
151
|
description: "List a service to start winning work on the marketplace."
|
|
151
152
|
})
|
|
152
|
-
}) :
|
|
153
|
+
}) : W.map((e, t) => /* @__PURE__ */ u(T, {
|
|
153
154
|
treatment: t === 0 ? "glass" : "plain",
|
|
154
155
|
glow: t === 0,
|
|
155
156
|
children: [/* @__PURE__ */ l(C, { children: /* @__PURE__ */ u("div", {
|
|
@@ -195,13 +196,13 @@ function M() {
|
|
|
195
196
|
variant: "outline",
|
|
196
197
|
size: "sm",
|
|
197
198
|
className: "flex-1",
|
|
198
|
-
onClick: () =>
|
|
199
|
+
onClick: () => z.openModal(e),
|
|
199
200
|
children: [/* @__PURE__ */ l(i, { className: "h-3.5 w-3.5 mr-1" }), "Edit"]
|
|
200
201
|
}),
|
|
201
202
|
/* @__PURE__ */ u(x, {
|
|
202
203
|
size: "sm",
|
|
203
204
|
className: "flex-1",
|
|
204
|
-
onClick: () =>
|
|
205
|
+
onClick: () => P(`../../marketplace/service-details-page?id=${e.id}`),
|
|
205
206
|
children: [/* @__PURE__ */ l(r, { className: "h-3.5 w-3.5 mr-1" }), "View"]
|
|
206
207
|
}),
|
|
207
208
|
/* @__PURE__ */ u(d, { children: [/* @__PURE__ */ l(y, {
|
|
@@ -217,7 +218,7 @@ function M() {
|
|
|
217
218
|
e.title,
|
|
218
219
|
"” from your marketplace listings. This action cannot be undone."
|
|
219
220
|
] })] }), /* @__PURE__ */ u(g, { children: [/* @__PURE__ */ l(p, { children: "Cancel" }), /* @__PURE__ */ l(f, {
|
|
220
|
-
onClick: () => void
|
|
221
|
+
onClick: () => void R(e.id),
|
|
221
222
|
children: "Delete"
|
|
222
223
|
})] })] })] })
|
|
223
224
|
]
|
|
@@ -225,22 +226,28 @@ function M() {
|
|
|
225
226
|
] })]
|
|
226
227
|
}, e.id))
|
|
227
228
|
}),
|
|
229
|
+
F.length > 0 ? /* @__PURE__ */ l(k, {
|
|
230
|
+
page: B,
|
|
231
|
+
pageSize: V,
|
|
232
|
+
totalItems: F.length,
|
|
233
|
+
onPageChange: U
|
|
234
|
+
}) : null,
|
|
228
235
|
/* @__PURE__ */ l(t, {
|
|
229
|
-
open:
|
|
230
|
-
onOpenChange:
|
|
231
|
-
title:
|
|
236
|
+
open: z.open,
|
|
237
|
+
onOpenChange: z.onOpenChange,
|
|
238
|
+
title: z.context ? "Edit service" : "Create service",
|
|
232
239
|
description: "Describe the service you offer clients on the marketplace.",
|
|
233
|
-
fields:
|
|
234
|
-
initialValues:
|
|
235
|
-
submitLabel:
|
|
240
|
+
fields: j,
|
|
241
|
+
initialValues: z.context ? M(z.context) : void 0,
|
|
242
|
+
submitLabel: z.context ? "Save changes" : "Create service",
|
|
236
243
|
onSubmit: async (e) => {
|
|
237
|
-
|
|
244
|
+
z.context ? await L(z.context.id, N(e, z.context)) : await I(N(e));
|
|
238
245
|
}
|
|
239
246
|
})
|
|
240
247
|
]
|
|
241
248
|
});
|
|
242
249
|
}
|
|
243
250
|
//#endregion
|
|
244
|
-
export {
|
|
251
|
+
export { P as MarketplaceMyServicesPagePage };
|
|
245
252
|
|
|
246
253
|
//# 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-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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"}
|
|
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 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';\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 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\">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 {marketplaceServices.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={() =>\n navigate(`../../marketplace/service-details-page?id=${svc.id}`)\n }\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 {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,122 +1,122 @@
|
|
|
1
1
|
import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
|
|
2
2
|
import { Calendar as t, DollarSign as n, MessageSquare as r, Users as i } from "lucide-react";
|
|
3
|
-
import {
|
|
4
|
-
import { jsx as
|
|
5
|
-
import { Badge as
|
|
3
|
+
import { useLocation as a, useNavigate as o } from "react-router-dom";
|
|
4
|
+
import { jsx as s, jsxs as c } from "react/jsx-runtime";
|
|
5
|
+
import { Badge as l, Card as u, CardContent as d, EmphasisPanel as f, GradientText as p, IllustratedEmptyState as m, NextSteps as h, PagePurpose as g } from "@burdenoff/fe-libs/ui";
|
|
6
6
|
//#region src/crewfoundry/pages/MarketplaceProjectDetailsPagePage.tsx
|
|
7
|
-
function
|
|
8
|
-
let
|
|
9
|
-
return
|
|
7
|
+
function _() {
|
|
8
|
+
let _ = o(), v = a(), { projects: y } = e(), b = new URLSearchParams(v.search).get("id"), x = y.find((e) => e.id === b) ?? y[0];
|
|
9
|
+
return x ? /* @__PURE__ */ c("div", {
|
|
10
10
|
className: "space-y-6 p-6 max-w-4xl",
|
|
11
11
|
children: [
|
|
12
|
-
/* @__PURE__ */
|
|
12
|
+
/* @__PURE__ */ c("div", {
|
|
13
13
|
className: "flex items-center justify-between",
|
|
14
|
-
children: [/* @__PURE__ */
|
|
15
|
-
/* @__PURE__ */
|
|
14
|
+
children: [/* @__PURE__ */ c("div", { children: [
|
|
15
|
+
/* @__PURE__ */ s("h1", {
|
|
16
16
|
className: "text-2xl font-semibold",
|
|
17
|
-
children: /* @__PURE__ */
|
|
17
|
+
children: /* @__PURE__ */ s(p, { children: x.name })
|
|
18
18
|
}),
|
|
19
|
-
/* @__PURE__ */
|
|
19
|
+
/* @__PURE__ */ s("p", {
|
|
20
20
|
className: "text-sm text-text-secondary",
|
|
21
|
-
children:
|
|
21
|
+
children: x.description
|
|
22
22
|
}),
|
|
23
|
-
/* @__PURE__ */
|
|
23
|
+
/* @__PURE__ */ s(g, {
|
|
24
24
|
className: "mt-2",
|
|
25
25
|
children: "The full picture of a marketplace project — scope, budget, timeline, and progress — so you can track delivery and stay aligned with the team doing the work."
|
|
26
26
|
})
|
|
27
|
-
] }), /* @__PURE__ */
|
|
28
|
-
variant:
|
|
29
|
-
children:
|
|
27
|
+
] }), /* @__PURE__ */ s(l, {
|
|
28
|
+
variant: x.status === "active" ? "default" : "secondary",
|
|
29
|
+
children: x.status
|
|
30
30
|
})]
|
|
31
31
|
}),
|
|
32
|
-
/* @__PURE__ */
|
|
32
|
+
/* @__PURE__ */ s(h, {
|
|
33
33
|
storageKey: "crewfoundry-marketplace-project-details",
|
|
34
34
|
steps: [
|
|
35
35
|
{
|
|
36
36
|
id: "message",
|
|
37
37
|
label: "Message the team",
|
|
38
38
|
description: "Coordinate on scope, blockers, and next milestones.",
|
|
39
|
-
icon: /* @__PURE__ */
|
|
40
|
-
onClick: () =>
|
|
39
|
+
icon: /* @__PURE__ */ s(r, { className: "h-4 w-4" }),
|
|
40
|
+
onClick: () => _("../../marketplace/messaging-page")
|
|
41
41
|
},
|
|
42
42
|
{
|
|
43
43
|
id: "bookings",
|
|
44
44
|
label: "Review bookings",
|
|
45
45
|
description: "Check the engagements tied to this project.",
|
|
46
|
-
icon: /* @__PURE__ */
|
|
47
|
-
onClick: () =>
|
|
46
|
+
icon: /* @__PURE__ */ s(t, { className: "h-4 w-4" }),
|
|
47
|
+
onClick: () => _("../../marketplace/booking-management-page")
|
|
48
48
|
},
|
|
49
49
|
{
|
|
50
50
|
id: "earnings",
|
|
51
51
|
label: "Track earnings",
|
|
52
52
|
description: "See payouts and balances connected to your work.",
|
|
53
|
-
icon: /* @__PURE__ */
|
|
54
|
-
onClick: () =>
|
|
53
|
+
icon: /* @__PURE__ */ s(n, { className: "h-4 w-4" }),
|
|
54
|
+
onClick: () => _("../../marketplace/earnings-page")
|
|
55
55
|
}
|
|
56
56
|
]
|
|
57
57
|
}),
|
|
58
|
-
/* @__PURE__ */
|
|
58
|
+
/* @__PURE__ */ c("div", {
|
|
59
59
|
className: "grid gap-4 md:grid-cols-4",
|
|
60
60
|
children: [
|
|
61
|
-
/* @__PURE__ */
|
|
61
|
+
/* @__PURE__ */ s(u, { children: /* @__PURE__ */ c(d, {
|
|
62
62
|
className: "p-4 text-center",
|
|
63
63
|
children: [
|
|
64
|
-
/* @__PURE__ */
|
|
65
|
-
/* @__PURE__ */
|
|
64
|
+
/* @__PURE__ */ s(n, { className: "h-5 w-5 mx-auto text-text-secondary mb-1" }),
|
|
65
|
+
/* @__PURE__ */ c("p", {
|
|
66
66
|
className: "text-lg font-bold",
|
|
67
67
|
children: [
|
|
68
68
|
"$",
|
|
69
|
-
(
|
|
69
|
+
(x.budget / 1e3).toFixed(0),
|
|
70
70
|
"K"
|
|
71
71
|
]
|
|
72
72
|
}),
|
|
73
|
-
/* @__PURE__ */
|
|
73
|
+
/* @__PURE__ */ s("p", {
|
|
74
74
|
className: "text-xs text-text-secondary",
|
|
75
75
|
children: "Budget"
|
|
76
76
|
})
|
|
77
77
|
]
|
|
78
78
|
}) }),
|
|
79
|
-
/* @__PURE__ */
|
|
79
|
+
/* @__PURE__ */ s(u, { children: /* @__PURE__ */ c(d, {
|
|
80
80
|
className: "p-4 text-center",
|
|
81
81
|
children: [
|
|
82
|
-
/* @__PURE__ */
|
|
83
|
-
/* @__PURE__ */
|
|
82
|
+
/* @__PURE__ */ s(n, { className: "h-5 w-5 mx-auto text-status-success-text mb-1" }),
|
|
83
|
+
/* @__PURE__ */ c("p", {
|
|
84
84
|
className: "text-lg font-bold",
|
|
85
85
|
children: [
|
|
86
86
|
"$",
|
|
87
|
-
(
|
|
87
|
+
(x.spent / 1e3).toFixed(0),
|
|
88
88
|
"K"
|
|
89
89
|
]
|
|
90
90
|
}),
|
|
91
|
-
/* @__PURE__ */
|
|
91
|
+
/* @__PURE__ */ s("p", {
|
|
92
92
|
className: "text-xs text-text-secondary",
|
|
93
93
|
children: "Spent"
|
|
94
94
|
})
|
|
95
95
|
]
|
|
96
96
|
}) }),
|
|
97
|
-
/* @__PURE__ */
|
|
97
|
+
/* @__PURE__ */ s(u, { children: /* @__PURE__ */ c(d, {
|
|
98
98
|
className: "p-4 text-center",
|
|
99
99
|
children: [
|
|
100
|
-
/* @__PURE__ */
|
|
101
|
-
/* @__PURE__ */
|
|
100
|
+
/* @__PURE__ */ s(i, { className: "h-5 w-5 mx-auto text-text-secondary mb-1" }),
|
|
101
|
+
/* @__PURE__ */ s("p", {
|
|
102
102
|
className: "text-lg font-bold",
|
|
103
|
-
children:
|
|
103
|
+
children: x.teamName
|
|
104
104
|
}),
|
|
105
|
-
/* @__PURE__ */
|
|
105
|
+
/* @__PURE__ */ s("p", {
|
|
106
106
|
className: "text-xs text-text-secondary",
|
|
107
107
|
children: "Team"
|
|
108
108
|
})
|
|
109
109
|
]
|
|
110
110
|
}) }),
|
|
111
|
-
/* @__PURE__ */
|
|
111
|
+
/* @__PURE__ */ s(u, { children: /* @__PURE__ */ c(d, {
|
|
112
112
|
className: "p-4 text-center",
|
|
113
113
|
children: [
|
|
114
|
-
/* @__PURE__ */
|
|
115
|
-
/* @__PURE__ */
|
|
114
|
+
/* @__PURE__ */ s(t, { className: "h-5 w-5 mx-auto text-text-secondary mb-1" }),
|
|
115
|
+
/* @__PURE__ */ s("p", {
|
|
116
116
|
className: "text-lg font-bold",
|
|
117
|
-
children:
|
|
117
|
+
children: x.endDate
|
|
118
118
|
}),
|
|
119
|
-
/* @__PURE__ */
|
|
119
|
+
/* @__PURE__ */ s("p", {
|
|
120
120
|
className: "text-xs text-text-secondary",
|
|
121
121
|
children: "Deadline"
|
|
122
122
|
})
|
|
@@ -124,70 +124,70 @@ function g() {
|
|
|
124
124
|
}) })
|
|
125
125
|
]
|
|
126
126
|
}),
|
|
127
|
-
/* @__PURE__ */
|
|
128
|
-
/* @__PURE__ */
|
|
127
|
+
/* @__PURE__ */ c(f, { children: [
|
|
128
|
+
/* @__PURE__ */ s("div", {
|
|
129
129
|
className: "mb-2 text-lg font-semibold",
|
|
130
130
|
children: "Progress"
|
|
131
131
|
}),
|
|
132
|
-
/* @__PURE__ */
|
|
132
|
+
/* @__PURE__ */ c("div", {
|
|
133
133
|
className: "space-y-2",
|
|
134
|
-
children: [/* @__PURE__ */
|
|
134
|
+
children: [/* @__PURE__ */ c("div", {
|
|
135
135
|
className: "flex justify-between text-sm",
|
|
136
|
-
children: [/* @__PURE__ */
|
|
137
|
-
|
|
136
|
+
children: [/* @__PURE__ */ c("span", { children: [
|
|
137
|
+
x.completedTasks,
|
|
138
138
|
" of ",
|
|
139
|
-
|
|
139
|
+
x.tasks,
|
|
140
140
|
" tasks"
|
|
141
|
-
] }), /* @__PURE__ */
|
|
141
|
+
] }), /* @__PURE__ */ c("span", {
|
|
142
142
|
className: "font-medium",
|
|
143
|
-
children: [
|
|
143
|
+
children: [x.progress, "%"]
|
|
144
144
|
})]
|
|
145
|
-
}), /* @__PURE__ */
|
|
145
|
+
}), /* @__PURE__ */ s("div", {
|
|
146
146
|
className: "h-3 bg-bg-sunken rounded overflow-hidden",
|
|
147
|
-
children: /* @__PURE__ */
|
|
147
|
+
children: /* @__PURE__ */ s("div", {
|
|
148
148
|
className: "h-3 bg-action-primary-bg rounded",
|
|
149
|
-
style: { width: `${
|
|
149
|
+
style: { width: `${x.progress}%` }
|
|
150
150
|
})
|
|
151
151
|
})]
|
|
152
152
|
}),
|
|
153
|
-
/* @__PURE__ */
|
|
153
|
+
/* @__PURE__ */ c("div", {
|
|
154
154
|
className: "grid grid-cols-2 gap-4 mt-4",
|
|
155
155
|
children: [
|
|
156
|
-
/* @__PURE__ */
|
|
156
|
+
/* @__PURE__ */ c("div", { children: [/* @__PURE__ */ s("p", {
|
|
157
157
|
className: "text-xs text-text-secondary",
|
|
158
158
|
children: "Manager"
|
|
159
|
-
}), /* @__PURE__ */
|
|
159
|
+
}), /* @__PURE__ */ s("p", {
|
|
160
160
|
className: "text-sm font-medium",
|
|
161
|
-
children:
|
|
161
|
+
children: x.managerName
|
|
162
162
|
})] }),
|
|
163
|
-
/* @__PURE__ */
|
|
163
|
+
/* @__PURE__ */ c("div", { children: [/* @__PURE__ */ s("p", {
|
|
164
164
|
className: "text-xs text-text-secondary",
|
|
165
165
|
children: "Priority"
|
|
166
|
-
}), /* @__PURE__ */
|
|
167
|
-
variant:
|
|
168
|
-
children:
|
|
166
|
+
}), /* @__PURE__ */ s(l, {
|
|
167
|
+
variant: x.priority === "critical" ? "destructive" : x.priority === "high" ? "default" : "secondary",
|
|
168
|
+
children: x.priority
|
|
169
169
|
})] }),
|
|
170
|
-
/* @__PURE__ */
|
|
170
|
+
/* @__PURE__ */ c("div", { children: [/* @__PURE__ */ s("p", {
|
|
171
171
|
className: "text-xs text-text-secondary",
|
|
172
172
|
children: "Start Date"
|
|
173
|
-
}), /* @__PURE__ */
|
|
173
|
+
}), /* @__PURE__ */ s("p", {
|
|
174
174
|
className: "text-sm",
|
|
175
|
-
children:
|
|
175
|
+
children: x.startDate
|
|
176
176
|
})] }),
|
|
177
|
-
/* @__PURE__ */
|
|
177
|
+
/* @__PURE__ */ c("div", { children: [/* @__PURE__ */ s("p", {
|
|
178
178
|
className: "text-xs text-text-secondary",
|
|
179
179
|
children: "End Date"
|
|
180
|
-
}), /* @__PURE__ */
|
|
180
|
+
}), /* @__PURE__ */ s("p", {
|
|
181
181
|
className: "text-sm",
|
|
182
|
-
children:
|
|
182
|
+
children: x.endDate
|
|
183
183
|
})] })
|
|
184
184
|
]
|
|
185
185
|
})
|
|
186
186
|
] })
|
|
187
187
|
]
|
|
188
|
-
}) : /* @__PURE__ */
|
|
188
|
+
}) : /* @__PURE__ */ s("div", {
|
|
189
189
|
className: "p-6",
|
|
190
|
-
children: /* @__PURE__ */
|
|
190
|
+
children: /* @__PURE__ */ s(m, {
|
|
191
191
|
illustration: "empty-search",
|
|
192
192
|
title: "Project not found",
|
|
193
193
|
description: "This project is no longer available."
|
|
@@ -195,6 +195,6 @@ function g() {
|
|
|
195
195
|
});
|
|
196
196
|
}
|
|
197
197
|
//#endregion
|
|
198
|
-
export {
|
|
198
|
+
export { _ as MarketplaceProjectDetailsPagePage };
|
|
199
199
|
|
|
200
200
|
//# sourceMappingURL=MarketplaceProjectDetailsPagePage.js.map
|