@burdenoff/microfe-proserviceworld 2026.703.1 → 2026.706.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/index.js +2 -3
- package/dist/node_modules/clsx/dist/clsx.js +18 -0
- package/dist/node_modules/clsx/dist/clsx.js.map +1 -0
- package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js +1716 -0
- package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js.map +1 -0
- package/dist/proserviceworld/ProServiceWorldRoot.js +92 -136
- package/dist/proserviceworld/ProServiceWorldRoot.js.map +1 -1
- package/dist/proserviceworld/ProServiceWorldRoutes.js +18 -26
- package/dist/proserviceworld/ProServiceWorldRoutes.js.map +1 -1
- package/dist/proserviceworld/components/DiscussionThread.js +76 -0
- package/dist/proserviceworld/components/DiscussionThread.js.map +1 -0
- package/dist/proserviceworld/components/ui.js +273 -0
- package/dist/proserviceworld/components/ui.js.map +1 -0
- package/dist/proserviceworld/hooks/useEntityComments.js +56 -0
- package/dist/proserviceworld/hooks/useEntityComments.js.map +1 -0
- package/dist/proserviceworld/hooks/useFiles.js +45 -0
- package/dist/proserviceworld/hooks/useFiles.js.map +1 -0
- package/dist/proserviceworld/hooks/useProServiceWorldApi.js +416 -0
- package/dist/proserviceworld/hooks/useProServiceWorldApi.js.map +1 -0
- package/dist/proserviceworld/index.js +0 -1
- package/dist/proserviceworld/pages/AnalyticsPage.js +163 -475
- package/dist/proserviceworld/pages/AnalyticsPage.js.map +1 -1
- package/dist/proserviceworld/pages/ClientDetailPage.js +243 -0
- package/dist/proserviceworld/pages/ClientDetailPage.js.map +1 -0
- package/dist/proserviceworld/pages/ClientsPage.js +295 -0
- package/dist/proserviceworld/pages/ClientsPage.js.map +1 -0
- package/dist/proserviceworld/pages/CompliancePage.js +307 -0
- package/dist/proserviceworld/pages/CompliancePage.js.map +1 -0
- package/dist/proserviceworld/pages/ConflictsPage.js +234 -0
- package/dist/proserviceworld/pages/ConflictsPage.js.map +1 -0
- package/dist/proserviceworld/pages/DashboardPage.js +179 -632
- package/dist/proserviceworld/pages/DashboardPage.js.map +1 -1
- package/dist/proserviceworld/pages/DocumentsPage.js +235 -539
- package/dist/proserviceworld/pages/DocumentsPage.js.map +1 -1
- package/dist/proserviceworld/pages/EngagementDetailPage.js +449 -0
- package/dist/proserviceworld/pages/EngagementDetailPage.js.map +1 -0
- package/dist/proserviceworld/pages/EngagementsPage.js +256 -0
- package/dist/proserviceworld/pages/EngagementsPage.js.map +1 -0
- package/dist/proserviceworld/pages/InvoicesPage.js +303 -0
- package/dist/proserviceworld/pages/InvoicesPage.js.map +1 -0
- package/dist/proserviceworld/pages/MattersPage.js +275 -0
- package/dist/proserviceworld/pages/MattersPage.js.map +1 -0
- package/dist/proserviceworld/pages/PracticeAreasPage.js +176 -0
- package/dist/proserviceworld/pages/PracticeAreasPage.js.map +1 -0
- package/dist/proserviceworld/pages/TimePage.js +310 -0
- package/dist/proserviceworld/pages/TimePage.js.map +1 -0
- package/dist/proserviceworld/utils/cn.js +10 -0
- package/dist/proserviceworld/utils/cn.js.map +1 -0
- package/dist/proserviceworld/utils/nav.js +11 -0
- package/dist/proserviceworld/utils/nav.js.map +1 -0
- package/package.json +1 -1
- package/dist/proserviceworld/pages/AdminReportsPage.js +0 -579
- package/dist/proserviceworld/pages/AdminReportsPage.js.map +0 -1
- package/dist/proserviceworld/pages/AdminUsersPage.js +0 -468
- package/dist/proserviceworld/pages/AdminUsersPage.js.map +0 -1
- package/dist/proserviceworld/pages/BookingsPage.js +0 -446
- package/dist/proserviceworld/pages/BookingsPage.js.map +0 -1
- package/dist/proserviceworld/pages/MessagesPage.js +0 -238
- package/dist/proserviceworld/pages/MessagesPage.js.map +0 -1
- package/dist/proserviceworld/pages/PaymentsPage.js +0 -537
- package/dist/proserviceworld/pages/PaymentsPage.js.map +0 -1
- package/dist/proserviceworld/pages/ProjectsPage.js +0 -627
- package/dist/proserviceworld/pages/ProjectsPage.js.map +0 -1
- package/dist/proserviceworld/pages/ProviderDetailPage.js +0 -538
- package/dist/proserviceworld/pages/ProviderDetailPage.js.map +0 -1
- package/dist/proserviceworld/pages/ProvidersPage.js +0 -347
- package/dist/proserviceworld/pages/ProvidersPage.js.map +0 -1
- package/dist/proserviceworld/pages/ReviewsPage.js +0 -356
- package/dist/proserviceworld/pages/ReviewsPage.js.map +0 -1
- package/dist/proserviceworld/pages/ServiceDetailsPage.js +0 -631
- package/dist/proserviceworld/pages/ServiceDetailsPage.js.map +0 -1
- package/dist/proserviceworld/pages/ServicesPage.js +0 -344
- package/dist/proserviceworld/pages/ServicesPage.js.map +0 -1
- package/dist/proserviceworld/pages/VerificationPage.js +0 -370
- package/dist/proserviceworld/pages/VerificationPage.js.map +0 -1
- package/dist/proserviceworld/store/proserviceworldStore.js +0 -2490
- package/dist/proserviceworld/store/proserviceworldStore.js.map +0 -1
- package/dist/proserviceworld/utils/i18n.js +0 -15
- package/dist/proserviceworld/utils/i18n.js.map +0 -1
|
@@ -1,446 +0,0 @@
|
|
|
1
|
-
import { useProServiceWorldStore as e } from "../store/proserviceworldStore.js";
|
|
2
|
-
import { useMemo as t, useState as n } from "react";
|
|
3
|
-
import { ArrowUpDown as r, Calendar as i, CheckCircle2 as a, ChevronRight as o, Clock as s, DollarSign as c, Filter as l, Loader2 as u, Search as d, User as f, XCircle as p } from "lucide-react";
|
|
4
|
-
import { jsx as m, jsxs as h } from "react/jsx-runtime";
|
|
5
|
-
import { Badge as g, Button as _, Card as v, CardContent as y, GlassCard as b, IllustratedEmptyState as x, Input as S, PagePurpose as C } from "@burdenoff/fe-libs/ui";
|
|
6
|
-
//#region src/proserviceworld/pages/BookingsPage.tsx
|
|
7
|
-
var w = {
|
|
8
|
-
pending: {
|
|
9
|
-
label: "Pending",
|
|
10
|
-
color: "text-status-warning-text",
|
|
11
|
-
icon: s,
|
|
12
|
-
badgeVariant: "secondary"
|
|
13
|
-
},
|
|
14
|
-
in_progress: {
|
|
15
|
-
label: "In Progress",
|
|
16
|
-
color: "text-accent-blue",
|
|
17
|
-
icon: u,
|
|
18
|
-
badgeVariant: "default"
|
|
19
|
-
},
|
|
20
|
-
completed: {
|
|
21
|
-
label: "Completed",
|
|
22
|
-
color: "text-status-success-text",
|
|
23
|
-
icon: a,
|
|
24
|
-
badgeVariant: "outline"
|
|
25
|
-
},
|
|
26
|
-
cancelled: {
|
|
27
|
-
label: "Cancelled",
|
|
28
|
-
color: "text-status-error-text",
|
|
29
|
-
icon: p,
|
|
30
|
-
badgeVariant: "destructive"
|
|
31
|
-
}
|
|
32
|
-
};
|
|
33
|
-
function T() {
|
|
34
|
-
let { bookings: s } = e(), [p, T] = n(""), [E, D] = n("all"), [O, k] = n("date"), [A, j] = n(!1), [M, N] = n(null), P = t(() => {
|
|
35
|
-
let e = s;
|
|
36
|
-
if (E !== "all" && (e = e.filter((e) => e.status === E)), p.trim()) {
|
|
37
|
-
let t = p.toLowerCase();
|
|
38
|
-
e = e.filter((e) => e.title.toLowerCase().includes(t) || e.providerName.toLowerCase().includes(t) || e.serviceName.toLowerCase().includes(t));
|
|
39
|
-
}
|
|
40
|
-
return e = [...e].sort((e, t) => {
|
|
41
|
-
let n = O === "date" ? new Date(t.createdAt).getTime() - new Date(e.createdAt).getTime() : O === "budget" ? t.budget - e.budget : t.progress - e.progress;
|
|
42
|
-
return A ? -n : n;
|
|
43
|
-
}), e;
|
|
44
|
-
}, [
|
|
45
|
-
s,
|
|
46
|
-
p,
|
|
47
|
-
E,
|
|
48
|
-
O,
|
|
49
|
-
A
|
|
50
|
-
]), F = M ? s.find((e) => e.id === M) : null, I = t(() => {
|
|
51
|
-
let e = { all: s.length };
|
|
52
|
-
for (let t of s) e[t.status] = (e[t.status] ?? 0) + 1;
|
|
53
|
-
return e;
|
|
54
|
-
}, [s]), L = s.reduce((e, t) => e + t.budget, 0), R = Math.round(s.filter((e) => e.status === "in_progress").reduce((e, t) => e + t.progress, 0) / Math.max(1, s.filter((e) => e.status === "in_progress").length)), z = (e) => {
|
|
55
|
-
O === e ? j(!A) : (k(e), j(!1));
|
|
56
|
-
};
|
|
57
|
-
return /* @__PURE__ */ h("div", {
|
|
58
|
-
className: "space-y-6 p-6 bg-bg-canvas min-h-screen",
|
|
59
|
-
children: [
|
|
60
|
-
/* @__PURE__ */ h("div", {
|
|
61
|
-
className: "flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between",
|
|
62
|
-
children: [/* @__PURE__ */ h("div", { children: [/* @__PURE__ */ m("h1", {
|
|
63
|
-
className: "text-2xl font-semibold tracking-tight",
|
|
64
|
-
children: "Bookings"
|
|
65
|
-
}), /* @__PURE__ */ m("p", {
|
|
66
|
-
className: "text-sm text-text-secondary",
|
|
67
|
-
children: "Manage and track all your service bookings."
|
|
68
|
-
})] }), /* @__PURE__ */ h(_, {
|
|
69
|
-
size: "sm",
|
|
70
|
-
children: [/* @__PURE__ */ m(i, { className: "mr-2 h-4 w-4" }), " New Booking"]
|
|
71
|
-
})]
|
|
72
|
-
}),
|
|
73
|
-
/* @__PURE__ */ m(C, {
|
|
74
|
-
icon: /* @__PURE__ */ m(i, { className: "h-4 w-4" }),
|
|
75
|
-
children: "Every engagement you have booked, in one timeline. Filter by status, search by provider or service, and open any booking to follow its progress, payment status, and key dates — then message the provider or take action right from the detail panel."
|
|
76
|
-
}),
|
|
77
|
-
/* @__PURE__ */ h("div", {
|
|
78
|
-
className: "grid gap-4 sm:grid-cols-2 lg:grid-cols-4",
|
|
79
|
-
children: [
|
|
80
|
-
/* @__PURE__ */ m(b, {
|
|
81
|
-
treatment: "metric",
|
|
82
|
-
className: "border-border-seam",
|
|
83
|
-
children: /* @__PURE__ */ h("div", {
|
|
84
|
-
className: "flex items-center gap-3",
|
|
85
|
-
children: [/* @__PURE__ */ m("div", {
|
|
86
|
-
className: "rounded-lg bg-status-info-bg-subtle p-2",
|
|
87
|
-
children: /* @__PURE__ */ m(i, { className: "h-5 w-5 text-accent-blue" })
|
|
88
|
-
}), /* @__PURE__ */ h("div", { children: [/* @__PURE__ */ m("p", {
|
|
89
|
-
className: "text-2xl font-bold tabular-nums",
|
|
90
|
-
children: s.length
|
|
91
|
-
}), /* @__PURE__ */ m("p", {
|
|
92
|
-
className: "text-xs text-text-secondary",
|
|
93
|
-
children: "Total Bookings"
|
|
94
|
-
})] })]
|
|
95
|
-
})
|
|
96
|
-
}),
|
|
97
|
-
/* @__PURE__ */ m(b, {
|
|
98
|
-
treatment: "metric",
|
|
99
|
-
className: "border-border-seam",
|
|
100
|
-
children: /* @__PURE__ */ h("div", {
|
|
101
|
-
className: "flex items-center gap-3",
|
|
102
|
-
children: [/* @__PURE__ */ m("div", {
|
|
103
|
-
className: "rounded-lg bg-status-success-bg-subtle p-2",
|
|
104
|
-
children: /* @__PURE__ */ m(a, { className: "h-5 w-5 text-status-success-text" })
|
|
105
|
-
}), /* @__PURE__ */ h("div", { children: [/* @__PURE__ */ m("p", {
|
|
106
|
-
className: "text-2xl font-bold tabular-nums",
|
|
107
|
-
children: I.completed ?? 0
|
|
108
|
-
}), /* @__PURE__ */ m("p", {
|
|
109
|
-
className: "text-xs text-text-secondary",
|
|
110
|
-
children: "Completed"
|
|
111
|
-
})] })]
|
|
112
|
-
})
|
|
113
|
-
}),
|
|
114
|
-
/* @__PURE__ */ m(b, {
|
|
115
|
-
treatment: "metric",
|
|
116
|
-
className: "border-border-seam",
|
|
117
|
-
children: /* @__PURE__ */ h("div", {
|
|
118
|
-
className: "flex items-center gap-3",
|
|
119
|
-
children: [/* @__PURE__ */ m("div", {
|
|
120
|
-
className: "rounded-lg bg-status-warning-bg-subtle p-2",
|
|
121
|
-
children: /* @__PURE__ */ m(u, { className: "h-5 w-5 text-status-warning-text" })
|
|
122
|
-
}), /* @__PURE__ */ h("div", { children: [/* @__PURE__ */ h("p", {
|
|
123
|
-
className: "text-2xl font-bold tabular-nums",
|
|
124
|
-
children: [R, "%"]
|
|
125
|
-
}), /* @__PURE__ */ m("p", {
|
|
126
|
-
className: "text-xs text-text-secondary",
|
|
127
|
-
children: "Avg. In-Progress"
|
|
128
|
-
})] })]
|
|
129
|
-
})
|
|
130
|
-
}),
|
|
131
|
-
/* @__PURE__ */ m(b, {
|
|
132
|
-
treatment: "glass",
|
|
133
|
-
glow: !0,
|
|
134
|
-
className: "border-border-seam",
|
|
135
|
-
children: /* @__PURE__ */ h("div", {
|
|
136
|
-
className: "flex items-center gap-3",
|
|
137
|
-
children: [/* @__PURE__ */ m("div", {
|
|
138
|
-
className: "rounded-lg bg-accent-purple-subtle p-2",
|
|
139
|
-
children: /* @__PURE__ */ m(c, { className: "h-5 w-5 text-accent-purple" })
|
|
140
|
-
}), /* @__PURE__ */ h("div", { children: [/* @__PURE__ */ h("p", {
|
|
141
|
-
className: "text-2xl font-bold tabular-nums",
|
|
142
|
-
children: ["$", L.toLocaleString()]
|
|
143
|
-
}), /* @__PURE__ */ m("p", {
|
|
144
|
-
className: "text-xs text-text-secondary",
|
|
145
|
-
children: "Total Budget"
|
|
146
|
-
})] })]
|
|
147
|
-
})
|
|
148
|
-
})
|
|
149
|
-
]
|
|
150
|
-
}),
|
|
151
|
-
/* @__PURE__ */ h("div", {
|
|
152
|
-
className: "flex flex-col gap-4 sm:flex-row sm:items-center",
|
|
153
|
-
children: [/* @__PURE__ */ h("div", {
|
|
154
|
-
className: "relative flex-1",
|
|
155
|
-
children: [/* @__PURE__ */ m(d, { className: "absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-secondary" }), /* @__PURE__ */ m(S, {
|
|
156
|
-
placeholder: "Search bookings by title, provider, or service...",
|
|
157
|
-
value: p,
|
|
158
|
-
onChange: (e) => T(e.target.value),
|
|
159
|
-
className: "pl-10"
|
|
160
|
-
})]
|
|
161
|
-
}), /* @__PURE__ */ h("div", {
|
|
162
|
-
className: "flex flex-wrap items-center gap-2",
|
|
163
|
-
children: [/* @__PURE__ */ m(l, { className: "h-4 w-4 text-text-secondary" }), [
|
|
164
|
-
"all",
|
|
165
|
-
"pending",
|
|
166
|
-
"in_progress",
|
|
167
|
-
"completed",
|
|
168
|
-
"cancelled"
|
|
169
|
-
].map((e) => /* @__PURE__ */ h(_, {
|
|
170
|
-
variant: E === e ? "default" : "outline",
|
|
171
|
-
size: "sm",
|
|
172
|
-
onClick: () => D(e),
|
|
173
|
-
children: [e === "all" ? "All" : w[e].label, /* @__PURE__ */ h("span", {
|
|
174
|
-
className: "ml-1 text-xs opacity-70 tabular-nums",
|
|
175
|
-
children: [
|
|
176
|
-
"(",
|
|
177
|
-
I[e] ?? 0,
|
|
178
|
-
")"
|
|
179
|
-
]
|
|
180
|
-
})]
|
|
181
|
-
}, e))]
|
|
182
|
-
})]
|
|
183
|
-
}),
|
|
184
|
-
/* @__PURE__ */ m("div", {
|
|
185
|
-
className: "flex flex-wrap gap-2",
|
|
186
|
-
children: [
|
|
187
|
-
{
|
|
188
|
-
field: "date",
|
|
189
|
-
label: "Date"
|
|
190
|
-
},
|
|
191
|
-
{
|
|
192
|
-
field: "budget",
|
|
193
|
-
label: "Budget"
|
|
194
|
-
},
|
|
195
|
-
{
|
|
196
|
-
field: "progress",
|
|
197
|
-
label: "Progress"
|
|
198
|
-
}
|
|
199
|
-
].map(({ field: e, label: t }) => /* @__PURE__ */ h("button", {
|
|
200
|
-
onClick: () => z(e),
|
|
201
|
-
"aria-pressed": O === e,
|
|
202
|
-
className: `flex items-center gap-1 rounded border px-3 py-1 text-xs transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus ${O === e ? "border-border-strong bg-accent-soft text-text-primary" : "border-border-seam text-text-secondary hover:bg-bg-sunken/50"}`,
|
|
203
|
-
children: [/* @__PURE__ */ m(r, { className: "h-3 w-3" }), t]
|
|
204
|
-
}, e))
|
|
205
|
-
}),
|
|
206
|
-
/* @__PURE__ */ h("div", {
|
|
207
|
-
className: "grid gap-6 lg:grid-cols-3",
|
|
208
|
-
children: [/* @__PURE__ */ m("div", {
|
|
209
|
-
className: `space-y-3 ${F ? "lg:col-span-2" : "lg:col-span-3"}`,
|
|
210
|
-
children: P.length === 0 ? /* @__PURE__ */ m(v, {
|
|
211
|
-
className: "border-border-seam",
|
|
212
|
-
children: /* @__PURE__ */ m(y, {
|
|
213
|
-
className: "py-4",
|
|
214
|
-
children: /* @__PURE__ */ m(x, {
|
|
215
|
-
illustration: "empty-search",
|
|
216
|
-
title: "No bookings found",
|
|
217
|
-
description: "No bookings match your current filters."
|
|
218
|
-
})
|
|
219
|
-
})
|
|
220
|
-
}) : P.map((e) => {
|
|
221
|
-
let t = w[e.status], n = t.icon;
|
|
222
|
-
return /* @__PURE__ */ m(v, {
|
|
223
|
-
className: `cursor-pointer border-border-seam transition-shadow hover:shadow-pop ${M === e.id ? "border-border-strong ring-1 ring-border-focus" : ""}`,
|
|
224
|
-
onClick: () => N(M === e.id ? null : e.id),
|
|
225
|
-
children: /* @__PURE__ */ h(y, {
|
|
226
|
-
className: "pt-4",
|
|
227
|
-
children: [/* @__PURE__ */ h("div", {
|
|
228
|
-
className: "flex items-start justify-between gap-4",
|
|
229
|
-
children: [/* @__PURE__ */ h("div", {
|
|
230
|
-
className: "flex-1 space-y-2",
|
|
231
|
-
children: [
|
|
232
|
-
/* @__PURE__ */ h("div", {
|
|
233
|
-
className: "flex items-center gap-2",
|
|
234
|
-
children: [/* @__PURE__ */ m(n, { className: `h-4 w-4 ${t.color}` }), /* @__PURE__ */ m("h3", {
|
|
235
|
-
className: "font-medium",
|
|
236
|
-
children: e.title
|
|
237
|
-
})]
|
|
238
|
-
}),
|
|
239
|
-
/* @__PURE__ */ m("p", {
|
|
240
|
-
className: "text-sm text-text-secondary line-clamp-1",
|
|
241
|
-
children: e.description
|
|
242
|
-
}),
|
|
243
|
-
/* @__PURE__ */ h("div", {
|
|
244
|
-
className: "flex flex-wrap items-center gap-4 text-xs text-text-secondary",
|
|
245
|
-
children: [
|
|
246
|
-
/* @__PURE__ */ h("span", {
|
|
247
|
-
className: "flex items-center gap-1",
|
|
248
|
-
children: [
|
|
249
|
-
/* @__PURE__ */ m(f, { className: "h-3 w-3" }),
|
|
250
|
-
" ",
|
|
251
|
-
e.providerName
|
|
252
|
-
]
|
|
253
|
-
}),
|
|
254
|
-
/* @__PURE__ */ h("span", {
|
|
255
|
-
className: "flex items-center gap-1",
|
|
256
|
-
children: [
|
|
257
|
-
/* @__PURE__ */ m(i, { className: "h-3 w-3" }),
|
|
258
|
-
" ",
|
|
259
|
-
e.startDate
|
|
260
|
-
]
|
|
261
|
-
}),
|
|
262
|
-
/* @__PURE__ */ h("span", {
|
|
263
|
-
className: "flex items-center gap-1 tabular-nums",
|
|
264
|
-
children: [
|
|
265
|
-
/* @__PURE__ */ m(c, { className: "h-3 w-3" }),
|
|
266
|
-
" $",
|
|
267
|
-
e.budget.toLocaleString()
|
|
268
|
-
]
|
|
269
|
-
})
|
|
270
|
-
]
|
|
271
|
-
})
|
|
272
|
-
]
|
|
273
|
-
}), /* @__PURE__ */ h("div", {
|
|
274
|
-
className: "flex flex-col items-end gap-2",
|
|
275
|
-
children: [
|
|
276
|
-
/* @__PURE__ */ m(g, {
|
|
277
|
-
variant: t.badgeVariant,
|
|
278
|
-
children: t.label
|
|
279
|
-
}),
|
|
280
|
-
e.status === "in_progress" && /* @__PURE__ */ h("span", {
|
|
281
|
-
className: "text-sm font-medium tabular-nums",
|
|
282
|
-
children: [e.progress, "%"]
|
|
283
|
-
}),
|
|
284
|
-
/* @__PURE__ */ m(o, { className: "h-4 w-4 text-text-secondary" })
|
|
285
|
-
]
|
|
286
|
-
})]
|
|
287
|
-
}), e.status === "in_progress" && /* @__PURE__ */ m("div", {
|
|
288
|
-
className: "mt-3",
|
|
289
|
-
children: /* @__PURE__ */ m("div", {
|
|
290
|
-
className: "h-2 w-full overflow-hidden rounded-full bg-bg-sunken",
|
|
291
|
-
children: /* @__PURE__ */ m("div", {
|
|
292
|
-
className: "h-2 rounded-full bg-action-primary-bg transition-all",
|
|
293
|
-
style: { width: `${e.progress}%` }
|
|
294
|
-
})
|
|
295
|
-
})
|
|
296
|
-
})]
|
|
297
|
-
})
|
|
298
|
-
}, e.id);
|
|
299
|
-
})
|
|
300
|
-
}), F && /* @__PURE__ */ m("div", {
|
|
301
|
-
className: "space-y-4",
|
|
302
|
-
children: /* @__PURE__ */ h(b, {
|
|
303
|
-
treatment: "glass",
|
|
304
|
-
className: "border-border-seam lg:sticky lg:top-6",
|
|
305
|
-
children: [/* @__PURE__ */ h("div", {
|
|
306
|
-
className: "flex items-center justify-between",
|
|
307
|
-
children: [/* @__PURE__ */ m("h2", {
|
|
308
|
-
className: "text-base font-semibold tracking-tight",
|
|
309
|
-
children: "Booking Details"
|
|
310
|
-
}), /* @__PURE__ */ m(_, {
|
|
311
|
-
variant: "outline",
|
|
312
|
-
size: "sm",
|
|
313
|
-
onClick: () => N(null),
|
|
314
|
-
children: "Close"
|
|
315
|
-
})]
|
|
316
|
-
}), /* @__PURE__ */ h("div", {
|
|
317
|
-
className: "mt-4 space-y-4",
|
|
318
|
-
children: [
|
|
319
|
-
/* @__PURE__ */ h("div", { children: [/* @__PURE__ */ m("h3", {
|
|
320
|
-
className: "font-semibold",
|
|
321
|
-
children: F.title
|
|
322
|
-
}), /* @__PURE__ */ m("p", {
|
|
323
|
-
className: "mt-1 text-sm text-text-secondary",
|
|
324
|
-
children: F.description
|
|
325
|
-
})] }),
|
|
326
|
-
/* @__PURE__ */ m(g, {
|
|
327
|
-
variant: w[F.status].badgeVariant,
|
|
328
|
-
children: w[F.status].label
|
|
329
|
-
}),
|
|
330
|
-
F.status === "in_progress" && /* @__PURE__ */ h("div", { children: [/* @__PURE__ */ h("div", {
|
|
331
|
-
className: "flex items-center justify-between text-sm",
|
|
332
|
-
children: [/* @__PURE__ */ m("span", {
|
|
333
|
-
className: "text-text-secondary",
|
|
334
|
-
children: "Progress"
|
|
335
|
-
}), /* @__PURE__ */ h("span", {
|
|
336
|
-
className: "font-medium tabular-nums",
|
|
337
|
-
children: [F.progress, "%"]
|
|
338
|
-
})]
|
|
339
|
-
}), /* @__PURE__ */ m("div", {
|
|
340
|
-
className: "mt-1 h-2 w-full overflow-hidden rounded-full bg-bg-sunken",
|
|
341
|
-
children: /* @__PURE__ */ m("div", {
|
|
342
|
-
className: "h-2 rounded-full bg-action-primary-bg",
|
|
343
|
-
style: { width: `${F.progress}%` }
|
|
344
|
-
})
|
|
345
|
-
})] }),
|
|
346
|
-
/* @__PURE__ */ h("div", {
|
|
347
|
-
className: "space-y-2 border-t border-border-seam pt-3 text-sm",
|
|
348
|
-
children: [
|
|
349
|
-
/* @__PURE__ */ h("div", {
|
|
350
|
-
className: "flex justify-between",
|
|
351
|
-
children: [/* @__PURE__ */ m("span", {
|
|
352
|
-
className: "text-text-secondary",
|
|
353
|
-
children: "Service"
|
|
354
|
-
}), /* @__PURE__ */ m("span", {
|
|
355
|
-
className: "font-medium",
|
|
356
|
-
children: F.serviceName
|
|
357
|
-
})]
|
|
358
|
-
}),
|
|
359
|
-
/* @__PURE__ */ h("div", {
|
|
360
|
-
className: "flex justify-between",
|
|
361
|
-
children: [/* @__PURE__ */ m("span", {
|
|
362
|
-
className: "text-text-secondary",
|
|
363
|
-
children: "Provider"
|
|
364
|
-
}), /* @__PURE__ */ m("span", {
|
|
365
|
-
className: "font-medium",
|
|
366
|
-
children: F.providerName
|
|
367
|
-
})]
|
|
368
|
-
}),
|
|
369
|
-
/* @__PURE__ */ h("div", {
|
|
370
|
-
className: "flex justify-between",
|
|
371
|
-
children: [/* @__PURE__ */ m("span", {
|
|
372
|
-
className: "text-text-secondary",
|
|
373
|
-
children: "Budget"
|
|
374
|
-
}), /* @__PURE__ */ h("span", {
|
|
375
|
-
className: "font-medium tabular-nums",
|
|
376
|
-
children: ["$", F.budget.toLocaleString()]
|
|
377
|
-
})]
|
|
378
|
-
}),
|
|
379
|
-
/* @__PURE__ */ h("div", {
|
|
380
|
-
className: "flex justify-between",
|
|
381
|
-
children: [/* @__PURE__ */ m("span", {
|
|
382
|
-
className: "text-text-secondary",
|
|
383
|
-
children: "Start Date"
|
|
384
|
-
}), /* @__PURE__ */ m("span", {
|
|
385
|
-
className: "font-medium",
|
|
386
|
-
children: F.startDate
|
|
387
|
-
})]
|
|
388
|
-
}),
|
|
389
|
-
/* @__PURE__ */ h("div", {
|
|
390
|
-
className: "flex justify-between",
|
|
391
|
-
children: [/* @__PURE__ */ m("span", {
|
|
392
|
-
className: "text-text-secondary",
|
|
393
|
-
children: "End Date"
|
|
394
|
-
}), /* @__PURE__ */ m("span", {
|
|
395
|
-
className: "font-medium",
|
|
396
|
-
children: F.endDate
|
|
397
|
-
})]
|
|
398
|
-
}),
|
|
399
|
-
/* @__PURE__ */ h("div", {
|
|
400
|
-
className: "flex justify-between",
|
|
401
|
-
children: [/* @__PURE__ */ m("span", {
|
|
402
|
-
className: "text-text-secondary",
|
|
403
|
-
children: "Payment"
|
|
404
|
-
}), /* @__PURE__ */ m(g, {
|
|
405
|
-
variant: "secondary",
|
|
406
|
-
children: F.paymentStatus
|
|
407
|
-
})]
|
|
408
|
-
}),
|
|
409
|
-
/* @__PURE__ */ h("div", {
|
|
410
|
-
className: "flex justify-between",
|
|
411
|
-
children: [/* @__PURE__ */ m("span", {
|
|
412
|
-
className: "text-text-secondary",
|
|
413
|
-
children: "Method"
|
|
414
|
-
}), /* @__PURE__ */ m("span", {
|
|
415
|
-
className: "font-medium",
|
|
416
|
-
children: F.paymentMethod.replace("_", " ")
|
|
417
|
-
})]
|
|
418
|
-
})
|
|
419
|
-
]
|
|
420
|
-
}),
|
|
421
|
-
/* @__PURE__ */ h("div", {
|
|
422
|
-
className: "flex gap-2 border-t border-border-seam pt-3",
|
|
423
|
-
children: [/* @__PURE__ */ m(_, {
|
|
424
|
-
className: "flex-1",
|
|
425
|
-
size: "sm",
|
|
426
|
-
variant: "outline",
|
|
427
|
-
children: "Message Provider"
|
|
428
|
-
}), F.status === "pending" && /* @__PURE__ */ m(_, {
|
|
429
|
-
className: "flex-1",
|
|
430
|
-
size: "sm",
|
|
431
|
-
variant: "destructive",
|
|
432
|
-
children: "Cancel"
|
|
433
|
-
})]
|
|
434
|
-
})
|
|
435
|
-
]
|
|
436
|
-
})]
|
|
437
|
-
})
|
|
438
|
-
})]
|
|
439
|
-
})
|
|
440
|
-
]
|
|
441
|
-
});
|
|
442
|
-
}
|
|
443
|
-
//#endregion
|
|
444
|
-
export { T as BookingsPage };
|
|
445
|
-
|
|
446
|
-
//# sourceMappingURL=BookingsPage.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"BookingsPage.js","names":[],"sources":["../../../src/proserviceworld/pages/BookingsPage.tsx"],"sourcesContent":["import { useState, useMemo } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n Input,\n GlassCard,\n IllustratedEmptyState,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport {\n Search,\n Clock,\n CheckCircle2,\n XCircle,\n Loader2,\n Calendar,\n DollarSign,\n User,\n ChevronRight,\n Filter,\n ArrowUpDown,\n} from 'lucide-react';\nimport { useProServiceWorldStore } from '../store/proserviceworldStore';\nimport type { BookingStatus } from '../types';\n\nconst statusConfig: Record<\n BookingStatus,\n {\n label: string;\n color: string;\n icon: typeof Clock;\n badgeVariant: 'default' | 'secondary' | 'outline' | 'destructive';\n }\n> = {\n pending: {\n label: 'Pending',\n color: 'text-status-warning-text',\n icon: Clock,\n badgeVariant: 'secondary',\n },\n in_progress: {\n label: 'In Progress',\n color: 'text-accent-blue',\n icon: Loader2,\n badgeVariant: 'default',\n },\n completed: {\n label: 'Completed',\n color: 'text-status-success-text',\n icon: CheckCircle2,\n badgeVariant: 'outline',\n },\n cancelled: {\n label: 'Cancelled',\n color: 'text-status-error-text',\n icon: XCircle,\n badgeVariant: 'destructive',\n },\n};\n\ntype SortField = 'date' | 'budget' | 'progress';\n\nexport function BookingsPage() {\n const { bookings } = useProServiceWorldStore();\n const [searchQuery, setSearchQuery] = useState('');\n const [statusFilter, setStatusFilter] = useState<BookingStatus | 'all'>('all');\n const [sortField, setSortField] = useState<SortField>('date');\n const [sortAsc, setSortAsc] = useState(false);\n const [selectedBookingId, setSelectedBookingId] = useState<string | null>(null);\n\n const filtered = useMemo(() => {\n let result = bookings;\n\n if (statusFilter !== 'all') {\n result = result.filter((b) => b.status === statusFilter);\n }\n\n if (searchQuery.trim()) {\n const q = searchQuery.toLowerCase();\n result = result.filter(\n (b) =>\n b.title.toLowerCase().includes(q) ||\n b.providerName.toLowerCase().includes(q) ||\n b.serviceName.toLowerCase().includes(q)\n );\n }\n\n result = [...result].sort((a, b) => {\n const cmp =\n sortField === 'date'\n ? new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime()\n : sortField === 'budget'\n ? b.budget - a.budget\n : b.progress - a.progress;\n return sortAsc ? -cmp : cmp;\n });\n\n return result;\n }, [bookings, searchQuery, statusFilter, sortField, sortAsc]);\n\n const selectedBooking = selectedBookingId\n ? bookings.find((b) => b.id === selectedBookingId)\n : null;\n\n const statusCounts = useMemo(() => {\n const counts: Record<string, number> = { all: bookings.length };\n for (const b of bookings) {\n counts[b.status] = (counts[b.status] ?? 0) + 1;\n }\n return counts;\n }, [bookings]);\n\n const totalBudget = bookings.reduce((sum, b) => sum + b.budget, 0);\n const avgProgress = Math.round(\n bookings.filter((b) => b.status === 'in_progress').reduce((sum, b) => sum + b.progress, 0) /\n Math.max(1, bookings.filter((b) => b.status === 'in_progress').length)\n );\n\n const handleSort = (field: SortField) => {\n if (sortField === field) setSortAsc(!sortAsc);\n else {\n setSortField(field);\n setSortAsc(false);\n }\n };\n\n return (\n <div className=\"space-y-6 p-6 bg-bg-canvas min-h-screen\">\n {/* Header */}\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold tracking-tight\">Bookings</h1>\n <p className=\"text-sm text-text-secondary\">Manage and track all your service bookings.</p>\n </div>\n <Button size=\"sm\">\n <Calendar className=\"mr-2 h-4 w-4\" /> New Booking\n </Button>\n </div>\n\n <PagePurpose icon={<Calendar className=\"h-4 w-4\" />}>\n Every engagement you have booked, in one timeline. Filter by status, search by provider or\n service, and open any booking to follow its progress, payment status, and key dates — then\n message the provider or take action right from the detail panel.\n </PagePurpose>\n\n {/* Stats */}\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <div className=\"flex items-center gap-3\">\n <div className=\"rounded-lg bg-status-info-bg-subtle p-2\">\n <Calendar className=\"h-5 w-5 text-accent-blue\" />\n </div>\n <div>\n <p className=\"text-2xl font-bold tabular-nums\">{bookings.length}</p>\n <p className=\"text-xs text-text-secondary\">Total Bookings</p>\n </div>\n </div>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <div className=\"flex items-center gap-3\">\n <div className=\"rounded-lg bg-status-success-bg-subtle p-2\">\n <CheckCircle2 className=\"h-5 w-5 text-status-success-text\" />\n </div>\n <div>\n <p className=\"text-2xl font-bold tabular-nums\">{statusCounts.completed ?? 0}</p>\n <p className=\"text-xs text-text-secondary\">Completed</p>\n </div>\n </div>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <div className=\"flex items-center gap-3\">\n <div className=\"rounded-lg bg-status-warning-bg-subtle p-2\">\n <Loader2 className=\"h-5 w-5 text-status-warning-text\" />\n </div>\n <div>\n <p className=\"text-2xl font-bold tabular-nums\">{avgProgress}%</p>\n <p className=\"text-xs text-text-secondary\">Avg. In-Progress</p>\n </div>\n </div>\n </GlassCard>\n <GlassCard treatment=\"glass\" glow className=\"border-border-seam\">\n <div className=\"flex items-center gap-3\">\n <div className=\"rounded-lg bg-accent-purple-subtle p-2\">\n <DollarSign className=\"h-5 w-5 text-accent-purple\" />\n </div>\n <div>\n <p className=\"text-2xl font-bold tabular-nums\">${totalBudget.toLocaleString()}</p>\n <p className=\"text-xs text-text-secondary\">Total Budget</p>\n </div>\n </div>\n </GlassCard>\n </div>\n\n {/* Filters */}\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center\">\n <div className=\"relative flex-1\">\n <Search className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-secondary\" />\n <Input\n placeholder=\"Search bookings by title, provider, or service...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"pl-10\"\n />\n </div>\n <div className=\"flex flex-wrap items-center gap-2\">\n <Filter className=\"h-4 w-4 text-text-secondary\" />\n {(['all', 'pending', 'in_progress', 'completed', 'cancelled'] as const).map((status) => (\n <Button\n key={status}\n variant={statusFilter === status ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => setStatusFilter(status)}\n >\n {status === 'all' ? 'All' : statusConfig[status].label}\n <span className=\"ml-1 text-xs opacity-70 tabular-nums\">\n ({statusCounts[status] ?? 0})\n </span>\n </Button>\n ))}\n </div>\n </div>\n\n {/* Sort controls */}\n <div className=\"flex flex-wrap gap-2\">\n {[\n { field: 'date' as SortField, label: 'Date' },\n { field: 'budget' as SortField, label: 'Budget' },\n { field: 'progress' as SortField, label: 'Progress' },\n ].map(({ field, label }) => (\n <button\n key={field}\n onClick={() => handleSort(field)}\n aria-pressed={sortField === field}\n className={`flex items-center gap-1 rounded border px-3 py-1 text-xs transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus ${\n sortField === field\n ? 'border-border-strong bg-accent-soft text-text-primary'\n : 'border-border-seam text-text-secondary hover:bg-bg-sunken/50'\n }`}\n >\n <ArrowUpDown className=\"h-3 w-3\" />\n {label}\n </button>\n ))}\n </div>\n\n <div className=\"grid gap-6 lg:grid-cols-3\">\n {/* Booking list */}\n <div className={`space-y-3 ${selectedBooking ? 'lg:col-span-2' : 'lg:col-span-3'}`}>\n {filtered.length === 0 ? (\n <Card className=\"border-border-seam\">\n <CardContent className=\"py-4\">\n <IllustratedEmptyState\n illustration=\"empty-search\"\n title=\"No bookings found\"\n description=\"No bookings match your current filters.\"\n />\n </CardContent>\n </Card>\n ) : (\n filtered.map((booking) => {\n const config = statusConfig[booking.status];\n const StatusIcon = config.icon;\n return (\n <Card\n key={booking.id}\n className={`cursor-pointer border-border-seam transition-shadow hover:shadow-pop ${\n selectedBookingId === booking.id\n ? 'border-border-strong ring-1 ring-border-focus'\n : ''\n }`}\n onClick={() =>\n setSelectedBookingId(selectedBookingId === booking.id ? null : booking.id)\n }\n >\n <CardContent className=\"pt-4\">\n <div className=\"flex items-start justify-between gap-4\">\n <div className=\"flex-1 space-y-2\">\n <div className=\"flex items-center gap-2\">\n <StatusIcon className={`h-4 w-4 ${config.color}`} />\n <h3 className=\"font-medium\">{booking.title}</h3>\n </div>\n <p className=\"text-sm text-text-secondary line-clamp-1\">\n {booking.description}\n </p>\n <div className=\"flex flex-wrap items-center gap-4 text-xs text-text-secondary\">\n <span className=\"flex items-center gap-1\">\n <User className=\"h-3 w-3\" /> {booking.providerName}\n </span>\n <span className=\"flex items-center gap-1\">\n <Calendar className=\"h-3 w-3\" /> {booking.startDate}\n </span>\n <span className=\"flex items-center gap-1 tabular-nums\">\n <DollarSign className=\"h-3 w-3\" /> ${booking.budget.toLocaleString()}\n </span>\n </div>\n </div>\n <div className=\"flex flex-col items-end gap-2\">\n <Badge variant={config.badgeVariant}>{config.label}</Badge>\n {booking.status === 'in_progress' && (\n <span className=\"text-sm font-medium tabular-nums\">\n {booking.progress}%\n </span>\n )}\n <ChevronRight className=\"h-4 w-4 text-text-secondary\" />\n </div>\n </div>\n\n {/* Progress bar for in-progress bookings */}\n {booking.status === 'in_progress' && (\n <div className=\"mt-3\">\n <div className=\"h-2 w-full overflow-hidden rounded-full bg-bg-sunken\">\n <div\n className=\"h-2 rounded-full bg-action-primary-bg transition-all\"\n style={{ width: `${booking.progress}%` }}\n />\n </div>\n </div>\n )}\n </CardContent>\n </Card>\n );\n })\n )}\n </div>\n\n {/* Detail rail */}\n {selectedBooking && (\n <div className=\"space-y-4\">\n <GlassCard treatment=\"glass\" className=\"border-border-seam lg:sticky lg:top-6\">\n <div className=\"flex items-center justify-between\">\n <h2 className=\"text-base font-semibold tracking-tight\">Booking Details</h2>\n <Button variant=\"outline\" size=\"sm\" onClick={() => setSelectedBookingId(null)}>\n Close\n </Button>\n </div>\n <div className=\"mt-4 space-y-4\">\n <div>\n <h3 className=\"font-semibold\">{selectedBooking.title}</h3>\n <p className=\"mt-1 text-sm text-text-secondary\">{selectedBooking.description}</p>\n </div>\n\n <Badge variant={statusConfig[selectedBooking.status].badgeVariant}>\n {statusConfig[selectedBooking.status].label}\n </Badge>\n\n {selectedBooking.status === 'in_progress' && (\n <div>\n <div className=\"flex items-center justify-between text-sm\">\n <span className=\"text-text-secondary\">Progress</span>\n <span className=\"font-medium tabular-nums\">{selectedBooking.progress}%</span>\n </div>\n <div className=\"mt-1 h-2 w-full overflow-hidden rounded-full bg-bg-sunken\">\n <div\n className=\"h-2 rounded-full bg-action-primary-bg\"\n style={{ width: `${selectedBooking.progress}%` }}\n />\n </div>\n </div>\n )}\n\n <div className=\"space-y-2 border-t border-border-seam pt-3 text-sm\">\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Service</span>\n <span className=\"font-medium\">{selectedBooking.serviceName}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Provider</span>\n <span className=\"font-medium\">{selectedBooking.providerName}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Budget</span>\n <span className=\"font-medium tabular-nums\">\n ${selectedBooking.budget.toLocaleString()}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Start Date</span>\n <span className=\"font-medium\">{selectedBooking.startDate}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">End Date</span>\n <span className=\"font-medium\">{selectedBooking.endDate}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Payment</span>\n <Badge variant=\"secondary\">{selectedBooking.paymentStatus}</Badge>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Method</span>\n <span className=\"font-medium\">\n {selectedBooking.paymentMethod.replace('_', ' ')}\n </span>\n </div>\n </div>\n\n <div className=\"flex gap-2 border-t border-border-seam pt-3\">\n <Button className=\"flex-1\" size=\"sm\" variant=\"outline\">\n Message Provider\n </Button>\n {selectedBooking.status === 'pending' && (\n <Button className=\"flex-1\" size=\"sm\" variant=\"destructive\">\n Cancel\n </Button>\n )}\n </div>\n </div>\n </GlassCard>\n </div>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|