@burdenoff/microfe-proserviceworld 2026.512.1 → 2026.624.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/proserviceworld/pages/AdminReportsPage.js +28 -28
- package/dist/proserviceworld/pages/AdminReportsPage.js.map +1 -1
- package/dist/proserviceworld/pages/AdminUsersPage.js +19 -19
- package/dist/proserviceworld/pages/AdminUsersPage.js.map +1 -1
- package/dist/proserviceworld/pages/AnalyticsPage.js +27 -27
- package/dist/proserviceworld/pages/AnalyticsPage.js.map +1 -1
- package/dist/proserviceworld/pages/BookingsPage.js +24 -24
- package/dist/proserviceworld/pages/BookingsPage.js.map +1 -1
- package/dist/proserviceworld/pages/DashboardPage.js +33 -33
- package/dist/proserviceworld/pages/DashboardPage.js.map +1 -1
- package/dist/proserviceworld/pages/DocumentsPage.js +29 -29
- package/dist/proserviceworld/pages/DocumentsPage.js.map +1 -1
- package/dist/proserviceworld/pages/MessagesPage.js +15 -15
- package/dist/proserviceworld/pages/MessagesPage.js.map +1 -1
- package/dist/proserviceworld/pages/PaymentsPage.js +19 -19
- package/dist/proserviceworld/pages/PaymentsPage.js.map +1 -1
- package/dist/proserviceworld/pages/ProjectsPage.js +36 -36
- package/dist/proserviceworld/pages/ProjectsPage.js.map +1 -1
- package/dist/proserviceworld/pages/ProviderDetailPage.js +36 -36
- package/dist/proserviceworld/pages/ProviderDetailPage.js.map +1 -1
- package/dist/proserviceworld/pages/ProvidersPage.js +19 -19
- package/dist/proserviceworld/pages/ProvidersPage.js.map +1 -1
- package/dist/proserviceworld/pages/ReviewsPage.js +22 -22
- package/dist/proserviceworld/pages/ReviewsPage.js.map +1 -1
- package/dist/proserviceworld/pages/ServiceDetailsPage.js +35 -35
- package/dist/proserviceworld/pages/ServiceDetailsPage.js.map +1 -1
- package/dist/proserviceworld/pages/ServicesPage.js +14 -14
- package/dist/proserviceworld/pages/ServicesPage.js.map +1 -1
- package/dist/proserviceworld/pages/VerificationPage.js +23 -23
- package/dist/proserviceworld/pages/VerificationPage.js.map +1 -1
- package/package.json +1 -1
- package/dist/dev/main.d.ts +0 -2
- package/dist/dev/main.d.ts.map +0 -1
- package/dist/generated/global-operations.d.ts +0 -2
- package/dist/generated/global-operations.d.ts.map +0 -1
- package/dist/generated/global-types.d.ts +0 -18199
- package/dist/generated/global-types.d.ts.map +0 -1
- package/dist/generated/wspace-operations.d.ts +0 -2
- package/dist/generated/wspace-operations.d.ts.map +0 -1
- package/dist/generated/wspace-types.d.ts +0 -43046
- package/dist/generated/wspace-types.d.ts.map +0 -1
- package/dist/index.d.ts +0 -2
- package/dist/index.d.ts.map +0 -1
- package/dist/proserviceworld/ProServiceWorldRoot.d.ts +0 -5
- package/dist/proserviceworld/ProServiceWorldRoot.d.ts.map +0 -1
- package/dist/proserviceworld/ProServiceWorldRoutes.d.ts +0 -2
- package/dist/proserviceworld/ProServiceWorldRoutes.d.ts.map +0 -1
- package/dist/proserviceworld/index.d.ts +0 -5
- package/dist/proserviceworld/index.d.ts.map +0 -1
- package/dist/proserviceworld/pages/AdminReportsPage.d.ts +0 -2
- package/dist/proserviceworld/pages/AdminReportsPage.d.ts.map +0 -1
- package/dist/proserviceworld/pages/AdminUsersPage.d.ts +0 -2
- package/dist/proserviceworld/pages/AdminUsersPage.d.ts.map +0 -1
- package/dist/proserviceworld/pages/AnalyticsPage.d.ts +0 -2
- package/dist/proserviceworld/pages/AnalyticsPage.d.ts.map +0 -1
- package/dist/proserviceworld/pages/BookingsPage.d.ts +0 -2
- package/dist/proserviceworld/pages/BookingsPage.d.ts.map +0 -1
- package/dist/proserviceworld/pages/DashboardPage.d.ts +0 -2
- package/dist/proserviceworld/pages/DashboardPage.d.ts.map +0 -1
- package/dist/proserviceworld/pages/DocumentsPage.d.ts +0 -2
- package/dist/proserviceworld/pages/DocumentsPage.d.ts.map +0 -1
- package/dist/proserviceworld/pages/MessagesPage.d.ts +0 -2
- package/dist/proserviceworld/pages/MessagesPage.d.ts.map +0 -1
- package/dist/proserviceworld/pages/PaymentsPage.d.ts +0 -2
- package/dist/proserviceworld/pages/PaymentsPage.d.ts.map +0 -1
- package/dist/proserviceworld/pages/ProjectsPage.d.ts +0 -2
- package/dist/proserviceworld/pages/ProjectsPage.d.ts.map +0 -1
- package/dist/proserviceworld/pages/ProviderDetailPage.d.ts +0 -2
- package/dist/proserviceworld/pages/ProviderDetailPage.d.ts.map +0 -1
- package/dist/proserviceworld/pages/ProvidersPage.d.ts +0 -2
- package/dist/proserviceworld/pages/ProvidersPage.d.ts.map +0 -1
- package/dist/proserviceworld/pages/ReviewsPage.d.ts +0 -2
- package/dist/proserviceworld/pages/ReviewsPage.d.ts.map +0 -1
- package/dist/proserviceworld/pages/ServiceDetailsPage.d.ts +0 -2
- package/dist/proserviceworld/pages/ServiceDetailsPage.d.ts.map +0 -1
- package/dist/proserviceworld/pages/ServicesPage.d.ts +0 -2
- package/dist/proserviceworld/pages/ServicesPage.d.ts.map +0 -1
- package/dist/proserviceworld/pages/VerificationPage.d.ts +0 -2
- package/dist/proserviceworld/pages/VerificationPage.d.ts.map +0 -1
- package/dist/proserviceworld/providers/ProServiceWorldProvider.d.ts +0 -6
- package/dist/proserviceworld/providers/ProServiceWorldProvider.d.ts.map +0 -1
- package/dist/proserviceworld/store/proserviceworldStore.d.ts +0 -32
- package/dist/proserviceworld/store/proserviceworldStore.d.ts.map +0 -1
- package/dist/proserviceworld/types/index.d.ts +0 -338
- package/dist/proserviceworld/types/index.d.ts.map +0 -1
- package/dist/proserviceworld/utils/cn.d.ts +0 -4
- package/dist/proserviceworld/utils/cn.d.ts.map +0 -1
- package/dist/proserviceworld/utils/i18n.d.ts +0 -6
- package/dist/proserviceworld/utils/i18n.d.ts.map +0 -1
- package/dist/proserviceworld/utils/navigation.d.ts +0 -2
- package/dist/proserviceworld/utils/navigation.d.ts.map +0 -1
|
@@ -63,7 +63,7 @@ function w() {
|
|
|
63
63
|
className: "text-2xl font-semibold",
|
|
64
64
|
children: "Bookings"
|
|
65
65
|
}), /* @__PURE__ */ m("p", {
|
|
66
|
-
className: "text-sm text-
|
|
66
|
+
className: "text-sm text-text-secondary",
|
|
67
67
|
children: "Manage and track all your service bookings."
|
|
68
68
|
})] }), /* @__PURE__ */ h(_, {
|
|
69
69
|
size: "sm",
|
|
@@ -84,7 +84,7 @@ function w() {
|
|
|
84
84
|
className: "text-2xl font-bold",
|
|
85
85
|
children: s.length
|
|
86
86
|
}), /* @__PURE__ */ m("p", {
|
|
87
|
-
className: "text-xs text-
|
|
87
|
+
className: "text-xs text-text-secondary",
|
|
88
88
|
children: "Total Bookings"
|
|
89
89
|
})] })]
|
|
90
90
|
})
|
|
@@ -100,7 +100,7 @@ function w() {
|
|
|
100
100
|
className: "text-2xl font-bold",
|
|
101
101
|
children: F.completed ?? 0
|
|
102
102
|
}), /* @__PURE__ */ m("p", {
|
|
103
|
-
className: "text-xs text-
|
|
103
|
+
className: "text-xs text-text-secondary",
|
|
104
104
|
children: "Completed"
|
|
105
105
|
})] })]
|
|
106
106
|
})
|
|
@@ -116,7 +116,7 @@ function w() {
|
|
|
116
116
|
className: "text-2xl font-bold",
|
|
117
117
|
children: [L, "%"]
|
|
118
118
|
}), /* @__PURE__ */ m("p", {
|
|
119
|
-
className: "text-xs text-
|
|
119
|
+
className: "text-xs text-text-secondary",
|
|
120
120
|
children: "Avg. In-Progress"
|
|
121
121
|
})] })]
|
|
122
122
|
})
|
|
@@ -132,7 +132,7 @@ function w() {
|
|
|
132
132
|
className: "text-2xl font-bold",
|
|
133
133
|
children: ["$", I.toLocaleString()]
|
|
134
134
|
}), /* @__PURE__ */ m("p", {
|
|
135
|
-
className: "text-xs text-
|
|
135
|
+
className: "text-xs text-text-secondary",
|
|
136
136
|
children: "Total Budget"
|
|
137
137
|
})] })]
|
|
138
138
|
})
|
|
@@ -143,7 +143,7 @@ function w() {
|
|
|
143
143
|
className: "flex flex-col gap-4 sm:flex-row sm:items-center",
|
|
144
144
|
children: [/* @__PURE__ */ h("div", {
|
|
145
145
|
className: "relative flex-1",
|
|
146
|
-
children: [/* @__PURE__ */ m(d, { className: "absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-
|
|
146
|
+
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, {
|
|
147
147
|
placeholder: "Search bookings by title, provider, or service...",
|
|
148
148
|
value: p,
|
|
149
149
|
onChange: (e) => w(e.target.value),
|
|
@@ -151,7 +151,7 @@ function w() {
|
|
|
151
151
|
})]
|
|
152
152
|
}), /* @__PURE__ */ h("div", {
|
|
153
153
|
className: "flex items-center gap-2",
|
|
154
|
-
children: [/* @__PURE__ */ m(l, { className: "h-4 w-4 text-
|
|
154
|
+
children: [/* @__PURE__ */ m(l, { className: "h-4 w-4 text-text-secondary" }), [
|
|
155
155
|
"all",
|
|
156
156
|
"pending",
|
|
157
157
|
"in_progress",
|
|
@@ -189,7 +189,7 @@ function w() {
|
|
|
189
189
|
}
|
|
190
190
|
].map(({ field: e, label: t }) => /* @__PURE__ */ h("button", {
|
|
191
191
|
onClick: () => R(e),
|
|
192
|
-
className: `flex items-center gap-1 rounded border px-3 py-1 text-xs ${D === e ? "border-primary bg-primary/5 text-primary" : "text-
|
|
192
|
+
className: `flex items-center gap-1 rounded border px-3 py-1 text-xs ${D === e ? "border-primary bg-action-primary-bg/5 text-primary" : "text-text-secondary hover:bg-bg-sunken/50"}`,
|
|
193
193
|
children: [/* @__PURE__ */ m(r, { className: "h-3 w-3" }), t]
|
|
194
194
|
}, e))
|
|
195
195
|
}),
|
|
@@ -198,12 +198,12 @@ function w() {
|
|
|
198
198
|
children: [/* @__PURE__ */ m("div", {
|
|
199
199
|
className: `space-y-3 ${P ? "lg:col-span-2" : "lg:col-span-3"}`,
|
|
200
200
|
children: N.length === 0 ? /* @__PURE__ */ m(v, { children: /* @__PURE__ */ m(y, {
|
|
201
|
-
className: "py-12 text-center text-
|
|
201
|
+
className: "py-12 text-center text-text-secondary",
|
|
202
202
|
children: "No bookings match your filters."
|
|
203
203
|
}) }) : N.map((e) => {
|
|
204
204
|
let t = C[e.status], n = t.icon;
|
|
205
205
|
return /* @__PURE__ */ m(v, {
|
|
206
|
-
className: `cursor-pointer transition-colors hover:bg-
|
|
206
|
+
className: `cursor-pointer transition-colors hover:bg-bg-sunken/30 ${j === e.id ? "border-primary ring-1 ring-primary" : ""}`,
|
|
207
207
|
onClick: () => M(j === e.id ? null : e.id),
|
|
208
208
|
children: /* @__PURE__ */ h(y, {
|
|
209
209
|
className: "pt-4",
|
|
@@ -220,11 +220,11 @@ function w() {
|
|
|
220
220
|
})]
|
|
221
221
|
}),
|
|
222
222
|
/* @__PURE__ */ m("p", {
|
|
223
|
-
className: "text-sm text-
|
|
223
|
+
className: "text-sm text-text-secondary line-clamp-1",
|
|
224
224
|
children: e.description
|
|
225
225
|
}),
|
|
226
226
|
/* @__PURE__ */ h("div", {
|
|
227
|
-
className: "flex flex-wrap items-center gap-4 text-xs text-
|
|
227
|
+
className: "flex flex-wrap items-center gap-4 text-xs text-text-secondary",
|
|
228
228
|
children: [
|
|
229
229
|
/* @__PURE__ */ h("span", {
|
|
230
230
|
className: "flex items-center gap-1",
|
|
@@ -264,13 +264,13 @@ function w() {
|
|
|
264
264
|
className: "text-sm font-medium",
|
|
265
265
|
children: [e.progress, "%"]
|
|
266
266
|
}),
|
|
267
|
-
/* @__PURE__ */ m(o, { className: "h-4 w-4 text-
|
|
267
|
+
/* @__PURE__ */ m(o, { className: "h-4 w-4 text-text-secondary" })
|
|
268
268
|
]
|
|
269
269
|
})]
|
|
270
270
|
}), e.status === "in_progress" && /* @__PURE__ */ m("div", {
|
|
271
271
|
className: "mt-3",
|
|
272
272
|
children: /* @__PURE__ */ m("div", {
|
|
273
|
-
className: "h-2 w-full overflow-hidden rounded-full bg-
|
|
273
|
+
className: "h-2 w-full overflow-hidden rounded-full bg-bg-sunken",
|
|
274
274
|
children: /* @__PURE__ */ m("div", {
|
|
275
275
|
className: "h-2 rounded-full bg-blue-500 transition-all",
|
|
276
276
|
style: { width: `${e.progress}%` }
|
|
@@ -300,7 +300,7 @@ function w() {
|
|
|
300
300
|
className: "font-semibold",
|
|
301
301
|
children: P.title
|
|
302
302
|
}), /* @__PURE__ */ m("p", {
|
|
303
|
-
className: "mt-1 text-sm text-
|
|
303
|
+
className: "mt-1 text-sm text-text-secondary",
|
|
304
304
|
children: P.description
|
|
305
305
|
})] }),
|
|
306
306
|
/* @__PURE__ */ m(g, {
|
|
@@ -310,14 +310,14 @@ function w() {
|
|
|
310
310
|
P.status === "in_progress" && /* @__PURE__ */ h("div", { children: [/* @__PURE__ */ h("div", {
|
|
311
311
|
className: "flex items-center justify-between text-sm",
|
|
312
312
|
children: [/* @__PURE__ */ m("span", {
|
|
313
|
-
className: "text-
|
|
313
|
+
className: "text-text-secondary",
|
|
314
314
|
children: "Progress"
|
|
315
315
|
}), /* @__PURE__ */ h("span", {
|
|
316
316
|
className: "font-medium",
|
|
317
317
|
children: [P.progress, "%"]
|
|
318
318
|
})]
|
|
319
319
|
}), /* @__PURE__ */ m("div", {
|
|
320
|
-
className: "mt-1 h-2 w-full overflow-hidden rounded-full bg-
|
|
320
|
+
className: "mt-1 h-2 w-full overflow-hidden rounded-full bg-bg-sunken",
|
|
321
321
|
children: /* @__PURE__ */ m("div", {
|
|
322
322
|
className: "h-2 rounded-full bg-blue-500",
|
|
323
323
|
style: { width: `${P.progress}%` }
|
|
@@ -329,7 +329,7 @@ function w() {
|
|
|
329
329
|
/* @__PURE__ */ h("div", {
|
|
330
330
|
className: "flex justify-between",
|
|
331
331
|
children: [/* @__PURE__ */ m("span", {
|
|
332
|
-
className: "text-
|
|
332
|
+
className: "text-text-secondary",
|
|
333
333
|
children: "Service"
|
|
334
334
|
}), /* @__PURE__ */ m("span", {
|
|
335
335
|
className: "font-medium",
|
|
@@ -339,7 +339,7 @@ function w() {
|
|
|
339
339
|
/* @__PURE__ */ h("div", {
|
|
340
340
|
className: "flex justify-between",
|
|
341
341
|
children: [/* @__PURE__ */ m("span", {
|
|
342
|
-
className: "text-
|
|
342
|
+
className: "text-text-secondary",
|
|
343
343
|
children: "Provider"
|
|
344
344
|
}), /* @__PURE__ */ m("span", {
|
|
345
345
|
className: "font-medium",
|
|
@@ -349,7 +349,7 @@ function w() {
|
|
|
349
349
|
/* @__PURE__ */ h("div", {
|
|
350
350
|
className: "flex justify-between",
|
|
351
351
|
children: [/* @__PURE__ */ m("span", {
|
|
352
|
-
className: "text-
|
|
352
|
+
className: "text-text-secondary",
|
|
353
353
|
children: "Budget"
|
|
354
354
|
}), /* @__PURE__ */ h("span", {
|
|
355
355
|
className: "font-medium",
|
|
@@ -359,7 +359,7 @@ function w() {
|
|
|
359
359
|
/* @__PURE__ */ h("div", {
|
|
360
360
|
className: "flex justify-between",
|
|
361
361
|
children: [/* @__PURE__ */ m("span", {
|
|
362
|
-
className: "text-
|
|
362
|
+
className: "text-text-secondary",
|
|
363
363
|
children: "Start Date"
|
|
364
364
|
}), /* @__PURE__ */ m("span", {
|
|
365
365
|
className: "font-medium",
|
|
@@ -369,7 +369,7 @@ function w() {
|
|
|
369
369
|
/* @__PURE__ */ h("div", {
|
|
370
370
|
className: "flex justify-between",
|
|
371
371
|
children: [/* @__PURE__ */ m("span", {
|
|
372
|
-
className: "text-
|
|
372
|
+
className: "text-text-secondary",
|
|
373
373
|
children: "End Date"
|
|
374
374
|
}), /* @__PURE__ */ m("span", {
|
|
375
375
|
className: "font-medium",
|
|
@@ -379,7 +379,7 @@ function w() {
|
|
|
379
379
|
/* @__PURE__ */ h("div", {
|
|
380
380
|
className: "flex justify-between",
|
|
381
381
|
children: [/* @__PURE__ */ m("span", {
|
|
382
|
-
className: "text-
|
|
382
|
+
className: "text-text-secondary",
|
|
383
383
|
children: "Payment"
|
|
384
384
|
}), /* @__PURE__ */ m(g, {
|
|
385
385
|
variant: "secondary",
|
|
@@ -389,7 +389,7 @@ function w() {
|
|
|
389
389
|
/* @__PURE__ */ h("div", {
|
|
390
390
|
className: "flex justify-between",
|
|
391
391
|
children: [/* @__PURE__ */ m("span", {
|
|
392
|
-
className: "text-
|
|
392
|
+
className: "text-text-secondary",
|
|
393
393
|
children: "Method"
|
|
394
394
|
}), /* @__PURE__ */ m("span", {
|
|
395
395
|
className: "font-medium",
|
|
@@ -1 +1 @@
|
|
|
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} 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: { label: 'Pending', color: 'text-yellow-600', icon: Clock, badgeVariant: 'secondary' },\n in_progress: {\n label: 'In Progress',\n color: 'text-blue-600',\n icon: Loader2,\n badgeVariant: 'default',\n },\n completed: {\n label: 'Completed',\n color: 'text-green-600',\n icon: CheckCircle2,\n badgeVariant: 'outline',\n },\n cancelled: {\n label: 'Cancelled',\n color: 'text-red-600',\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\">\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\">Bookings</h1>\n <p className=\"text-sm text-muted-foreground\">\n Manage and track all your service bookings.\n </p>\n </div>\n <Button size=\"sm\">\n <Calendar className=\"mr-2 h-4 w-4\" /> New Booking\n </Button>\n </div>\n\n {/* Stats */}\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"rounded-lg bg-blue-100 p-2 dark:bg-blue-950\">\n <Calendar className=\"h-5 w-5 text-blue-600\" />\n </div>\n <div>\n <p className=\"text-2xl font-bold\">{bookings.length}</p>\n <p className=\"text-xs text-muted-foreground\">Total Bookings</p>\n </div>\n </div>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"rounded-lg bg-green-100 p-2 dark:bg-green-950\">\n <CheckCircle2 className=\"h-5 w-5 text-green-600\" />\n </div>\n <div>\n <p className=\"text-2xl font-bold\">{statusCounts.completed ?? 0}</p>\n <p className=\"text-xs text-muted-foreground\">Completed</p>\n </div>\n </div>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"rounded-lg bg-yellow-100 p-2 dark:bg-yellow-950\">\n <Loader2 className=\"h-5 w-5 text-yellow-600\" />\n </div>\n <div>\n <p className=\"text-2xl font-bold\">{avgProgress}%</p>\n <p className=\"text-xs text-muted-foreground\">Avg. In-Progress</p>\n </div>\n </div>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"rounded-lg bg-purple-100 p-2 dark:bg-purple-950\">\n <DollarSign className=\"h-5 w-5 text-purple-600\" />\n </div>\n <div>\n <p className=\"text-2xl font-bold\">${totalBudget.toLocaleString()}</p>\n <p className=\"text-xs text-muted-foreground\">Total Budget</p>\n </div>\n </div>\n </CardContent>\n </Card>\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-muted-foreground\" />\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 items-center gap-2\">\n <Filter className=\"h-4 w-4 text-muted-foreground\" />\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\">({statusCounts[status] ?? 0})</span>\n </Button>\n ))}\n </div>\n </div>\n\n {/* Sort controls */}\n <div className=\"flex 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 className={`flex items-center gap-1 rounded border px-3 py-1 text-xs ${\n sortField === field\n ? 'border-primary bg-primary/5 text-primary'\n : 'text-muted-foreground hover:bg-muted/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>\n <CardContent className=\"py-12 text-center text-muted-foreground\">\n No bookings match your filters.\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 transition-colors hover:bg-muted/30 ${\n selectedBookingId === booking.id ? 'border-primary ring-1 ring-primary' : ''\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-muted-foreground line-clamp-1\">\n {booking.description}\n </p>\n <div className=\"flex flex-wrap items-center gap-4 text-xs text-muted-foreground\">\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\">\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\">{booking.progress}%</span>\n )}\n <ChevronRight className=\"h-4 w-4 text-muted-foreground\" />\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-muted\">\n <div\n className=\"h-2 rounded-full bg-blue-500 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 panel */}\n {selectedBooking && (\n <div className=\"space-y-4\">\n <Card>\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <CardTitle className=\"text-base\">Booking Details</CardTitle>\n <Button variant=\"outline\" size=\"sm\" onClick={() => setSelectedBookingId(null)}>\n Close\n </Button>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div>\n <h3 className=\"font-semibold\">{selectedBooking.title}</h3>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n {selectedBooking.description}\n </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-muted-foreground\">Progress</span>\n <span className=\"font-medium\">{selectedBooking.progress}%</span>\n </div>\n <div className=\"mt-1 h-2 w-full overflow-hidden rounded-full bg-muted\">\n <div\n className=\"h-2 rounded-full bg-blue-500\"\n style={{ width: `${selectedBooking.progress}%` }}\n />\n </div>\n </div>\n )}\n\n <div className=\"space-y-2 border-t pt-3 text-sm\">\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Service</span>\n <span className=\"font-medium\">{selectedBooking.serviceName}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Provider</span>\n <span className=\"font-medium\">{selectedBooking.providerName}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Budget</span>\n <span className=\"font-medium\">${selectedBooking.budget.toLocaleString()}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Start Date</span>\n <span className=\"font-medium\">{selectedBooking.startDate}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">End Date</span>\n <span className=\"font-medium\">{selectedBooking.endDate}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Payment</span>\n <Badge variant=\"secondary\">{selectedBooking.paymentStatus}</Badge>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">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 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 </CardContent>\n </Card>\n </div>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
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} 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: { label: 'Pending', color: 'text-yellow-600', icon: Clock, badgeVariant: 'secondary' },\n in_progress: {\n label: 'In Progress',\n color: 'text-blue-600',\n icon: Loader2,\n badgeVariant: 'default',\n },\n completed: {\n label: 'Completed',\n color: 'text-green-600',\n icon: CheckCircle2,\n badgeVariant: 'outline',\n },\n cancelled: {\n label: 'Cancelled',\n color: 'text-red-600',\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\">\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\">Bookings</h1>\n <p className=\"text-sm text-text-secondary\">\n Manage and track all your service bookings.\n </p>\n </div>\n <Button size=\"sm\">\n <Calendar className=\"mr-2 h-4 w-4\" /> New Booking\n </Button>\n </div>\n\n {/* Stats */}\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"rounded-lg bg-blue-100 p-2 dark:bg-blue-950\">\n <Calendar className=\"h-5 w-5 text-blue-600\" />\n </div>\n <div>\n <p className=\"text-2xl font-bold\">{bookings.length}</p>\n <p className=\"text-xs text-text-secondary\">Total Bookings</p>\n </div>\n </div>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"rounded-lg bg-green-100 p-2 dark:bg-green-950\">\n <CheckCircle2 className=\"h-5 w-5 text-green-600\" />\n </div>\n <div>\n <p className=\"text-2xl font-bold\">{statusCounts.completed ?? 0}</p>\n <p className=\"text-xs text-text-secondary\">Completed</p>\n </div>\n </div>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"rounded-lg bg-yellow-100 p-2 dark:bg-yellow-950\">\n <Loader2 className=\"h-5 w-5 text-yellow-600\" />\n </div>\n <div>\n <p className=\"text-2xl font-bold\">{avgProgress}%</p>\n <p className=\"text-xs text-text-secondary\">Avg. In-Progress</p>\n </div>\n </div>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"rounded-lg bg-purple-100 p-2 dark:bg-purple-950\">\n <DollarSign className=\"h-5 w-5 text-purple-600\" />\n </div>\n <div>\n <p className=\"text-2xl font-bold\">${totalBudget.toLocaleString()}</p>\n <p className=\"text-xs text-text-secondary\">Total Budget</p>\n </div>\n </div>\n </CardContent>\n </Card>\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 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\">({statusCounts[status] ?? 0})</span>\n </Button>\n ))}\n </div>\n </div>\n\n {/* Sort controls */}\n <div className=\"flex 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 className={`flex items-center gap-1 rounded border px-3 py-1 text-xs ${\n sortField === field\n ? 'border-primary bg-action-primary-bg/5 text-primary'\n : '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>\n <CardContent className=\"py-12 text-center text-text-secondary\">\n No bookings match your filters.\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 transition-colors hover:bg-bg-sunken/30 ${\n selectedBookingId === booking.id ? 'border-primary ring-1 ring-primary' : ''\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\">\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\">{booking.progress}%</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-blue-500 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 panel */}\n {selectedBooking && (\n <div className=\"space-y-4\">\n <Card>\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <CardTitle className=\"text-base\">Booking Details</CardTitle>\n <Button variant=\"outline\" size=\"sm\" onClick={() => setSelectedBookingId(null)}>\n Close\n </Button>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div>\n <h3 className=\"font-semibold\">{selectedBooking.title}</h3>\n <p className=\"mt-1 text-sm text-text-secondary\">\n {selectedBooking.description}\n </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\">{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-blue-500\"\n style={{ width: `${selectedBooking.progress}%` }}\n />\n </div>\n </div>\n )}\n\n <div className=\"space-y-2 border-t 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\">${selectedBooking.budget.toLocaleString()}</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 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 </CardContent>\n </Card>\n </div>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -34,15 +34,15 @@ function E() {
|
|
|
34
34
|
className: "text-2xl font-semibold",
|
|
35
35
|
children: D("proserviceworld.dashboard.title", "Dashboard")
|
|
36
36
|
}), /* @__PURE__ */ v("p", {
|
|
37
|
-
className: "text-sm text-
|
|
37
|
+
className: "text-sm text-text-secondary",
|
|
38
38
|
children: D("proserviceworld.dashboard.subtitle", "Welcome back! Here is your activity overview.")
|
|
39
39
|
})] }), /* @__PURE__ */ y("div", {
|
|
40
40
|
className: "flex items-center gap-2",
|
|
41
41
|
children: [/* @__PURE__ */ v("div", {
|
|
42
|
-
className: "flex bg-
|
|
42
|
+
className: "flex bg-bg-sunken rounded-lg p-1",
|
|
43
43
|
children: B.map((e) => /* @__PURE__ */ v("button", {
|
|
44
44
|
onClick: () => P(e.id),
|
|
45
|
-
className: `px-3 py-1.5 rounded text-sm font-medium transition-colors ${N === e.id ? "bg-
|
|
45
|
+
className: `px-3 py-1.5 rounded text-sm font-medium transition-colors ${N === e.id ? "bg-bg-surface text-text-primary shadow-sm" : "text-text-secondary hover:text-text-primary"}`,
|
|
46
46
|
children: e.label
|
|
47
47
|
}, e.id))
|
|
48
48
|
}), z > 0 && /* @__PURE__ */ y(x, {
|
|
@@ -63,7 +63,7 @@ function E() {
|
|
|
63
63
|
className: "text-xl font-bold",
|
|
64
64
|
children: D("proserviceworld.dashboard.client.welcomeTitle", "Welcome back, Alex!")
|
|
65
65
|
}), /* @__PURE__ */ v("p", {
|
|
66
|
-
className: "text-
|
|
66
|
+
className: "text-text-secondary mt-1",
|
|
67
67
|
children: D("proserviceworld.dashboard.client.welcomeSubtitle", "Manage your services, bookings, and find new providers")
|
|
68
68
|
})] }), /* @__PURE__ */ y(x, {
|
|
69
69
|
size: "sm",
|
|
@@ -84,7 +84,7 @@ function E() {
|
|
|
84
84
|
className: "text-2xl font-bold",
|
|
85
85
|
children: F.length
|
|
86
86
|
}), /* @__PURE__ */ v("p", {
|
|
87
|
-
className: "text-sm text-
|
|
87
|
+
className: "text-sm text-text-secondary",
|
|
88
88
|
children: D("proserviceworld.dashboard.client.metrics.activeBookings", "Active Bookings")
|
|
89
89
|
})]
|
|
90
90
|
})]
|
|
@@ -100,7 +100,7 @@ function E() {
|
|
|
100
100
|
className: "text-2xl font-bold",
|
|
101
101
|
children: "4.8"
|
|
102
102
|
}), /* @__PURE__ */ v("p", {
|
|
103
|
-
className: "text-sm text-
|
|
103
|
+
className: "text-sm text-text-secondary",
|
|
104
104
|
children: D("proserviceworld.dashboard.client.metrics.avgRatingGiven", "Avg. Rating Given")
|
|
105
105
|
})]
|
|
106
106
|
})]
|
|
@@ -116,7 +116,7 @@ function E() {
|
|
|
116
116
|
className: "text-2xl font-bold",
|
|
117
117
|
children: I.length
|
|
118
118
|
}), /* @__PURE__ */ v("p", {
|
|
119
|
-
className: "text-sm text-
|
|
119
|
+
className: "text-sm text-text-secondary",
|
|
120
120
|
children: D("proserviceworld.dashboard.client.metrics.completedProjects", "Completed Projects")
|
|
121
121
|
})]
|
|
122
122
|
})]
|
|
@@ -132,7 +132,7 @@ function E() {
|
|
|
132
132
|
className: "text-2xl font-bold",
|
|
133
133
|
children: ["$", R.toLocaleString()]
|
|
134
134
|
}), /* @__PURE__ */ v("p", {
|
|
135
|
-
className: "text-sm text-
|
|
135
|
+
className: "text-sm text-text-secondary",
|
|
136
136
|
children: D("proserviceworld.dashboard.client.metrics.totalSpent", "Total Spent")
|
|
137
137
|
})]
|
|
138
138
|
})]
|
|
@@ -154,13 +154,13 @@ function E() {
|
|
|
154
154
|
children: [/* @__PURE__ */ y("div", {
|
|
155
155
|
className: "flex items-center space-x-4",
|
|
156
156
|
children: [/* @__PURE__ */ v("div", {
|
|
157
|
-
className: "h-10 w-10 rounded-full bg-primary/10 flex items-center justify-center",
|
|
157
|
+
className: "h-10 w-10 rounded-full bg-action-primary-bg/10 flex items-center justify-center",
|
|
158
158
|
children: /* @__PURE__ */ v(o, { className: "h-5 w-5 text-primary" })
|
|
159
159
|
}), /* @__PURE__ */ y("div", { children: [/* @__PURE__ */ v("p", {
|
|
160
160
|
className: "font-medium",
|
|
161
161
|
children: e.title
|
|
162
162
|
}), /* @__PURE__ */ v("p", {
|
|
163
|
-
className: "text-sm text-
|
|
163
|
+
className: "text-sm text-text-secondary",
|
|
164
164
|
children: D("proserviceworld.dashboard.client.booking.provider", "Provider: {{name}}", { name: e.providerName })
|
|
165
165
|
})] })]
|
|
166
166
|
}), /* @__PURE__ */ y("div", {
|
|
@@ -188,7 +188,7 @@ function E() {
|
|
|
188
188
|
className: "text-xl font-bold",
|
|
189
189
|
children: D("proserviceworld.dashboard.provider.welcomeTitle", "Welcome back, Provider!")
|
|
190
190
|
}), /* @__PURE__ */ v("p", {
|
|
191
|
-
className: "text-
|
|
191
|
+
className: "text-text-secondary mt-1",
|
|
192
192
|
children: D("proserviceworld.dashboard.provider.welcomeSubtitle", "Manage your services, bookings, and grow your business")
|
|
193
193
|
})] }), /* @__PURE__ */ y("div", {
|
|
194
194
|
className: "flex gap-2",
|
|
@@ -216,7 +216,7 @@ function E() {
|
|
|
216
216
|
className: "text-2xl font-bold",
|
|
217
217
|
children: "4.9"
|
|
218
218
|
}), /* @__PURE__ */ v("p", {
|
|
219
|
-
className: "text-sm text-
|
|
219
|
+
className: "text-sm text-text-secondary",
|
|
220
220
|
children: D("proserviceworld.dashboard.provider.metrics.rating", "Rating ({{count}} reviews)", { count: j.length })
|
|
221
221
|
})]
|
|
222
222
|
})]
|
|
@@ -232,7 +232,7 @@ function E() {
|
|
|
232
232
|
className: "text-2xl font-bold",
|
|
233
233
|
children: F.length
|
|
234
234
|
}), /* @__PURE__ */ v("p", {
|
|
235
|
-
className: "text-sm text-
|
|
235
|
+
className: "text-sm text-text-secondary",
|
|
236
236
|
children: D("proserviceworld.dashboard.provider.metrics.activeProjects", "Active Projects")
|
|
237
237
|
})]
|
|
238
238
|
})]
|
|
@@ -248,7 +248,7 @@ function E() {
|
|
|
248
248
|
className: "text-2xl font-bold",
|
|
249
249
|
children: "98%"
|
|
250
250
|
}), /* @__PURE__ */ v("p", {
|
|
251
|
-
className: "text-sm text-
|
|
251
|
+
className: "text-sm text-text-secondary",
|
|
252
252
|
children: D("proserviceworld.dashboard.provider.metrics.completionRate", "Completion Rate")
|
|
253
253
|
})]
|
|
254
254
|
})]
|
|
@@ -264,7 +264,7 @@ function E() {
|
|
|
264
264
|
className: "text-2xl font-bold",
|
|
265
265
|
children: "$12,850"
|
|
266
266
|
}), /* @__PURE__ */ v("p", {
|
|
267
|
-
className: "text-sm text-
|
|
267
|
+
className: "text-sm text-text-secondary",
|
|
268
268
|
children: D("proserviceworld.dashboard.provider.metrics.thisMonth", "This Month")
|
|
269
269
|
})]
|
|
270
270
|
})]
|
|
@@ -295,7 +295,7 @@ function E() {
|
|
|
295
295
|
children: e.title
|
|
296
296
|
}),
|
|
297
297
|
/* @__PURE__ */ v("p", {
|
|
298
|
-
className: "text-sm text-
|
|
298
|
+
className: "text-sm text-text-secondary mb-2 line-clamp-2",
|
|
299
299
|
children: e.description
|
|
300
300
|
}),
|
|
301
301
|
/* @__PURE__ */ y("div", {
|
|
@@ -324,7 +324,7 @@ function E() {
|
|
|
324
324
|
className: "text-xl font-bold",
|
|
325
325
|
children: D("proserviceworld.dashboard.admin.title", "Admin Dashboard")
|
|
326
326
|
}), /* @__PURE__ */ v("p", {
|
|
327
|
-
className: "text-
|
|
327
|
+
className: "text-text-secondary mt-1",
|
|
328
328
|
children: D("proserviceworld.dashboard.admin.subtitle", "Monitor platform activity and manage users")
|
|
329
329
|
})] }), /* @__PURE__ */ y("div", {
|
|
330
330
|
className: "flex gap-2",
|
|
@@ -352,7 +352,7 @@ function E() {
|
|
|
352
352
|
className: "text-2xl font-bold",
|
|
353
353
|
children: k.length
|
|
354
354
|
}), /* @__PURE__ */ v("p", {
|
|
355
|
-
className: "text-sm text-
|
|
355
|
+
className: "text-sm text-text-secondary",
|
|
356
356
|
children: D("proserviceworld.dashboard.admin.metrics.totalProviders", "Total Providers")
|
|
357
357
|
})]
|
|
358
358
|
})]
|
|
@@ -368,7 +368,7 @@ function E() {
|
|
|
368
368
|
className: "text-2xl font-bold",
|
|
369
369
|
children: A.length
|
|
370
370
|
}), /* @__PURE__ */ v("p", {
|
|
371
|
-
className: "text-sm text-
|
|
371
|
+
className: "text-sm text-text-secondary",
|
|
372
372
|
children: D("proserviceworld.dashboard.admin.metrics.totalServices", "Total Services")
|
|
373
373
|
})]
|
|
374
374
|
})]
|
|
@@ -384,7 +384,7 @@ function E() {
|
|
|
384
384
|
className: "text-2xl font-bold",
|
|
385
385
|
children: O.length
|
|
386
386
|
}), /* @__PURE__ */ v("p", {
|
|
387
|
-
className: "text-sm text-
|
|
387
|
+
className: "text-sm text-text-secondary",
|
|
388
388
|
children: D("proserviceworld.dashboard.admin.metrics.totalBookings", "Total Bookings")
|
|
389
389
|
})]
|
|
390
390
|
})]
|
|
@@ -400,7 +400,7 @@ function E() {
|
|
|
400
400
|
className: "text-2xl font-bold",
|
|
401
401
|
children: "$45,670"
|
|
402
402
|
}), /* @__PURE__ */ v("p", {
|
|
403
|
-
className: "text-sm text-
|
|
403
|
+
className: "text-sm text-text-secondary",
|
|
404
404
|
children: D("proserviceworld.dashboard.admin.metrics.totalRevenue", "Total Revenue")
|
|
405
405
|
})]
|
|
406
406
|
})]
|
|
@@ -416,7 +416,7 @@ function E() {
|
|
|
416
416
|
className: "flex items-center space-x-4",
|
|
417
417
|
children: [
|
|
418
418
|
/* @__PURE__ */ v("div", {
|
|
419
|
-
className: "h-10 w-10 rounded-full bg-primary/10 flex items-center justify-center",
|
|
419
|
+
className: "h-10 w-10 rounded-full bg-action-primary-bg/10 flex items-center justify-center",
|
|
420
420
|
children: /* @__PURE__ */ v("span", {
|
|
421
421
|
className: "text-primary font-medium",
|
|
422
422
|
children: e.name.charAt(0)
|
|
@@ -428,7 +428,7 @@ function E() {
|
|
|
428
428
|
className: "font-medium",
|
|
429
429
|
children: e.businessName
|
|
430
430
|
}), /* @__PURE__ */ v("p", {
|
|
431
|
-
className: "text-sm text-
|
|
431
|
+
className: "text-sm text-text-secondary",
|
|
432
432
|
children: e.specializations[0]
|
|
433
433
|
})]
|
|
434
434
|
}),
|
|
@@ -447,7 +447,7 @@ function E() {
|
|
|
447
447
|
className: "font-medium text-sm",
|
|
448
448
|
children: D("proserviceworld.dashboard.admin.alerts.pendingVerifications.title", "Pending Verifications")
|
|
449
449
|
}), /* @__PURE__ */ v("p", {
|
|
450
|
-
className: "text-sm text-
|
|
450
|
+
className: "text-sm text-text-secondary",
|
|
451
451
|
children: D("proserviceworld.dashboard.admin.alerts.pendingVerifications.description", "3 providers awaiting verification")
|
|
452
452
|
})] })]
|
|
453
453
|
}),
|
|
@@ -457,7 +457,7 @@ function E() {
|
|
|
457
457
|
className: "font-medium text-sm",
|
|
458
458
|
children: D("proserviceworld.dashboard.admin.alerts.systemStatus.title", "System Status")
|
|
459
459
|
}), /* @__PURE__ */ v("p", {
|
|
460
|
-
className: "text-sm text-
|
|
460
|
+
className: "text-sm text-text-secondary",
|
|
461
461
|
children: D("proserviceworld.dashboard.admin.alerts.systemStatus.description", "All systems operational")
|
|
462
462
|
})] })]
|
|
463
463
|
}),
|
|
@@ -467,7 +467,7 @@ function E() {
|
|
|
467
467
|
className: "font-medium text-sm",
|
|
468
468
|
children: D("proserviceworld.dashboard.admin.alerts.newReviews.title", "New Reviews")
|
|
469
469
|
}), /* @__PURE__ */ v("p", {
|
|
470
|
-
className: "text-sm text-
|
|
470
|
+
className: "text-sm text-text-secondary",
|
|
471
471
|
children: D("proserviceworld.dashboard.admin.alerts.newReviews.description", "12 new reviews this week")
|
|
472
472
|
})] })]
|
|
473
473
|
})
|
|
@@ -487,7 +487,7 @@ function E() {
|
|
|
487
487
|
className: "text-xl font-bold",
|
|
488
488
|
children: D("proserviceworld.dashboard.team.title", "Welcome, Team Member!")
|
|
489
489
|
}), /* @__PURE__ */ v("p", {
|
|
490
|
-
className: "text-
|
|
490
|
+
className: "text-text-secondary mt-1",
|
|
491
491
|
children: D("proserviceworld.dashboard.team.subtitle", "Manage assigned tasks and projects")
|
|
492
492
|
})] }), /* @__PURE__ */ y(x, {
|
|
493
493
|
variant: "outline",
|
|
@@ -509,7 +509,7 @@ function E() {
|
|
|
509
509
|
className: "text-2xl font-bold",
|
|
510
510
|
children: "8"
|
|
511
511
|
}), /* @__PURE__ */ v("p", {
|
|
512
|
-
className: "text-sm text-
|
|
512
|
+
className: "text-sm text-text-secondary",
|
|
513
513
|
children: D("proserviceworld.dashboard.team.metrics.tasksCompleted", "Tasks Completed")
|
|
514
514
|
})]
|
|
515
515
|
})]
|
|
@@ -525,7 +525,7 @@ function E() {
|
|
|
525
525
|
className: "text-2xl font-bold",
|
|
526
526
|
children: L.length
|
|
527
527
|
}), /* @__PURE__ */ v("p", {
|
|
528
|
-
className: "text-sm text-
|
|
528
|
+
className: "text-sm text-text-secondary",
|
|
529
529
|
children: D("proserviceworld.dashboard.team.metrics.pendingTasks", "Pending Tasks")
|
|
530
530
|
})]
|
|
531
531
|
})]
|
|
@@ -541,7 +541,7 @@ function E() {
|
|
|
541
541
|
className: "text-2xl font-bold",
|
|
542
542
|
children: "4.9"
|
|
543
543
|
}), /* @__PURE__ */ v("p", {
|
|
544
|
-
className: "text-sm text-
|
|
544
|
+
className: "text-sm text-text-secondary",
|
|
545
545
|
children: D("proserviceworld.dashboard.team.metrics.performanceScore", "Performance Score")
|
|
546
546
|
})]
|
|
547
547
|
})]
|
|
@@ -557,7 +557,7 @@ function E() {
|
|
|
557
557
|
className: "text-2xl font-bold",
|
|
558
558
|
children: F.length
|
|
559
559
|
}), /* @__PURE__ */ v("p", {
|
|
560
|
-
className: "text-sm text-
|
|
560
|
+
className: "text-sm text-text-secondary",
|
|
561
561
|
children: D("proserviceworld.dashboard.team.metrics.activeProjects", "Active Projects")
|
|
562
562
|
})]
|
|
563
563
|
})]
|
|
@@ -567,8 +567,8 @@ function E() {
|
|
|
567
567
|
}),
|
|
568
568
|
/* @__PURE__ */ y(S, { children: [/* @__PURE__ */ v(w, { children: /* @__PURE__ */ v(T, { children: D("proserviceworld.dashboard.team.sections.recentActivity", "Recent Activity") }) }), /* @__PURE__ */ y(C, {
|
|
569
569
|
className: "text-center py-8",
|
|
570
|
-
children: [/* @__PURE__ */ v(f, { className: "h-12 w-12 mx-auto text-
|
|
571
|
-
className: "text-
|
|
570
|
+
children: [/* @__PURE__ */ v(f, { className: "h-12 w-12 mx-auto text-text-secondary mb-4" }), /* @__PURE__ */ v("p", {
|
|
571
|
+
className: "text-text-secondary",
|
|
572
572
|
children: D("proserviceworld.dashboard.team.sections.comingSoon", "Team member features coming soon")
|
|
573
573
|
})]
|
|
574
574
|
})] })
|