@burdenoff/microfe-proserviceworld 2026.703.1 → 2026.706.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/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/ui.js +273 -0
- package/dist/proserviceworld/components/ui.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 +238 -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 +444 -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,468 +0,0 @@
|
|
|
1
|
-
import { useProServiceWorldStore as e } from "../store/proserviceworldStore.js";
|
|
2
|
-
import { useMemo as t, useState as n } from "react";
|
|
3
|
-
import { Ban as r, CheckCircle2 as i, Clock as a, Download as o, Filter as s, Mail as c, MoreHorizontal as l, Plus as u, Search as d, Shield as f, Star as p, UserCheck as m, Users as h, XCircle as g } from "lucide-react";
|
|
4
|
-
import { jsx as _, jsxs as v } from "react/jsx-runtime";
|
|
5
|
-
import { AuroraBackground as y, Badge as b, Button as x, CTAOverflowMenu as S, Card as C, CardContent as w, GlassCard as T, GradientText as E, IllustratedEmptyState as D, Input as O, PagePurpose as k } from "@burdenoff/fe-libs/ui";
|
|
6
|
-
//#region src/proserviceworld/pages/AdminUsersPage.tsx
|
|
7
|
-
var A = {
|
|
8
|
-
client: {
|
|
9
|
-
label: "Client",
|
|
10
|
-
variant: "secondary"
|
|
11
|
-
},
|
|
12
|
-
provider: {
|
|
13
|
-
label: "Provider",
|
|
14
|
-
variant: "default"
|
|
15
|
-
},
|
|
16
|
-
admin: {
|
|
17
|
-
label: "Admin",
|
|
18
|
-
variant: "destructive"
|
|
19
|
-
},
|
|
20
|
-
team_member: {
|
|
21
|
-
label: "Team",
|
|
22
|
-
variant: "outline"
|
|
23
|
-
}
|
|
24
|
-
}, j = {
|
|
25
|
-
active: {
|
|
26
|
-
label: "Active",
|
|
27
|
-
icon: i,
|
|
28
|
-
color: "text-status-success-text"
|
|
29
|
-
},
|
|
30
|
-
suspended: {
|
|
31
|
-
label: "Suspended",
|
|
32
|
-
icon: r,
|
|
33
|
-
color: "text-status-warning-text"
|
|
34
|
-
},
|
|
35
|
-
pending: {
|
|
36
|
-
label: "Pending",
|
|
37
|
-
icon: a,
|
|
38
|
-
color: "text-status-warning-text"
|
|
39
|
-
},
|
|
40
|
-
banned: {
|
|
41
|
-
label: "Banned",
|
|
42
|
-
icon: g,
|
|
43
|
-
color: "text-status-error-text"
|
|
44
|
-
}
|
|
45
|
-
};
|
|
46
|
-
function M() {
|
|
47
|
-
let { adminUsers: r } = e(), [a, M] = n(""), [N, P] = n("all"), [F, I] = n("all"), [L, R] = n(/* @__PURE__ */ new Set()), z = t(() => {
|
|
48
|
-
let e = [...r];
|
|
49
|
-
if (N !== "all" && (e = e.filter((e) => e.role === N)), F !== "all" && (e = e.filter((e) => e.status === F)), a.trim()) {
|
|
50
|
-
let t = a.toLowerCase();
|
|
51
|
-
e = e.filter((e) => e.name.toLowerCase().includes(t) || e.email.toLowerCase().includes(t));
|
|
52
|
-
}
|
|
53
|
-
return e;
|
|
54
|
-
}, [
|
|
55
|
-
r,
|
|
56
|
-
N,
|
|
57
|
-
F,
|
|
58
|
-
a
|
|
59
|
-
]), B = r.length, V = r.filter((e) => e.status === "active").length, H = r.filter((e) => e.role === "provider").length, U = r.filter((e) => e.verified).length, W = (e) => {
|
|
60
|
-
let t = new Set(L);
|
|
61
|
-
t.has(e) ? t.delete(e) : t.add(e), R(t);
|
|
62
|
-
};
|
|
63
|
-
return /* @__PURE__ */ v("div", {
|
|
64
|
-
className: "space-y-6 p-6 bg-bg-canvas min-h-screen",
|
|
65
|
-
children: [
|
|
66
|
-
/* @__PURE__ */ v("div", {
|
|
67
|
-
className: "relative overflow-hidden rounded-card -mx-2 px-2 pt-1 flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between",
|
|
68
|
-
children: [
|
|
69
|
-
/* @__PURE__ */ _(y, { intensity: "subtle" }),
|
|
70
|
-
/* @__PURE__ */ v("div", { children: [/* @__PURE__ */ _("h1", {
|
|
71
|
-
className: "text-2xl font-semibold tracking-tight",
|
|
72
|
-
children: /* @__PURE__ */ _(E, { children: "User Management" })
|
|
73
|
-
}), /* @__PURE__ */ _("p", {
|
|
74
|
-
className: "text-sm text-text-secondary",
|
|
75
|
-
children: "Admin panel to manage platform users, roles, and access."
|
|
76
|
-
})] }),
|
|
77
|
-
/* @__PURE__ */ _(S, {
|
|
78
|
-
primary: {
|
|
79
|
-
label: "Invite User",
|
|
80
|
-
onSelect: () => {},
|
|
81
|
-
icon: /* @__PURE__ */ _(u, { className: "h-4 w-4" })
|
|
82
|
-
},
|
|
83
|
-
actions: [{
|
|
84
|
-
label: "Export",
|
|
85
|
-
onSelect: () => {},
|
|
86
|
-
icon: /* @__PURE__ */ _(o, { className: "h-4 w-4" })
|
|
87
|
-
}]
|
|
88
|
-
})
|
|
89
|
-
]
|
|
90
|
-
}),
|
|
91
|
-
/* @__PURE__ */ _(k, {
|
|
92
|
-
icon: /* @__PURE__ */ _(h, { className: "h-4 w-4" }),
|
|
93
|
-
children: "The control room for everyone on the platform. Search, filter by role and status, and review each user's activity and spend at a glance — then invite new members or take bulk action to activate, suspend, or ban accounts as needed."
|
|
94
|
-
}),
|
|
95
|
-
/* @__PURE__ */ v("div", {
|
|
96
|
-
className: "grid gap-4 sm:grid-cols-2 lg:grid-cols-4",
|
|
97
|
-
children: [
|
|
98
|
-
/* @__PURE__ */ _(T, {
|
|
99
|
-
treatment: "glass",
|
|
100
|
-
glow: !0,
|
|
101
|
-
className: "border-border-seam",
|
|
102
|
-
children: /* @__PURE__ */ v("div", {
|
|
103
|
-
className: "flex items-center gap-3",
|
|
104
|
-
children: [/* @__PURE__ */ _("div", {
|
|
105
|
-
className: "rounded-lg bg-status-info-bg-subtle p-2",
|
|
106
|
-
children: /* @__PURE__ */ _(h, { className: "h-5 w-5 text-accent-blue" })
|
|
107
|
-
}), /* @__PURE__ */ v("div", { children: [/* @__PURE__ */ _("p", {
|
|
108
|
-
className: "text-2xl font-bold tabular-nums",
|
|
109
|
-
children: B
|
|
110
|
-
}), /* @__PURE__ */ _("p", {
|
|
111
|
-
className: "text-xs text-text-secondary",
|
|
112
|
-
children: "Total Users"
|
|
113
|
-
})] })]
|
|
114
|
-
})
|
|
115
|
-
}),
|
|
116
|
-
/* @__PURE__ */ _(T, {
|
|
117
|
-
treatment: "metric",
|
|
118
|
-
className: "border-border-seam",
|
|
119
|
-
children: /* @__PURE__ */ v("div", {
|
|
120
|
-
className: "flex items-center gap-3",
|
|
121
|
-
children: [/* @__PURE__ */ _("div", {
|
|
122
|
-
className: "rounded-lg bg-status-success-bg-subtle p-2",
|
|
123
|
-
children: /* @__PURE__ */ _(m, { className: "h-5 w-5 text-status-success-text" })
|
|
124
|
-
}), /* @__PURE__ */ v("div", { children: [/* @__PURE__ */ _("p", {
|
|
125
|
-
className: "text-2xl font-bold tabular-nums",
|
|
126
|
-
children: V
|
|
127
|
-
}), /* @__PURE__ */ _("p", {
|
|
128
|
-
className: "text-xs text-text-secondary",
|
|
129
|
-
children: "Active Users"
|
|
130
|
-
})] })]
|
|
131
|
-
})
|
|
132
|
-
}),
|
|
133
|
-
/* @__PURE__ */ _(T, {
|
|
134
|
-
treatment: "metric",
|
|
135
|
-
className: "border-border-seam",
|
|
136
|
-
children: /* @__PURE__ */ v("div", {
|
|
137
|
-
className: "flex items-center gap-3",
|
|
138
|
-
children: [/* @__PURE__ */ _("div", {
|
|
139
|
-
className: "rounded-lg bg-accent-purple-subtle p-2",
|
|
140
|
-
children: /* @__PURE__ */ _(f, { className: "h-5 w-5 text-accent-purple" })
|
|
141
|
-
}), /* @__PURE__ */ v("div", { children: [/* @__PURE__ */ _("p", {
|
|
142
|
-
className: "text-2xl font-bold tabular-nums",
|
|
143
|
-
children: H
|
|
144
|
-
}), /* @__PURE__ */ _("p", {
|
|
145
|
-
className: "text-xs text-text-secondary",
|
|
146
|
-
children: "Providers"
|
|
147
|
-
})] })]
|
|
148
|
-
})
|
|
149
|
-
}),
|
|
150
|
-
/* @__PURE__ */ _(T, {
|
|
151
|
-
treatment: "metric",
|
|
152
|
-
className: "border-border-seam",
|
|
153
|
-
children: /* @__PURE__ */ v("div", {
|
|
154
|
-
className: "flex items-center gap-3",
|
|
155
|
-
children: [/* @__PURE__ */ _("div", {
|
|
156
|
-
className: "rounded-lg bg-status-warning-bg-subtle p-2",
|
|
157
|
-
children: /* @__PURE__ */ _(i, { className: "h-5 w-5 text-status-warning-text" })
|
|
158
|
-
}), /* @__PURE__ */ v("div", { children: [/* @__PURE__ */ _("p", {
|
|
159
|
-
className: "text-2xl font-bold tabular-nums",
|
|
160
|
-
children: U
|
|
161
|
-
}), /* @__PURE__ */ _("p", {
|
|
162
|
-
className: "text-xs text-text-secondary",
|
|
163
|
-
children: "Verified"
|
|
164
|
-
})] })]
|
|
165
|
-
})
|
|
166
|
-
})
|
|
167
|
-
]
|
|
168
|
-
}),
|
|
169
|
-
/* @__PURE__ */ v("div", {
|
|
170
|
-
className: "flex flex-col gap-4 sm:flex-row sm:items-center",
|
|
171
|
-
children: [/* @__PURE__ */ v("div", {
|
|
172
|
-
className: "relative flex-1",
|
|
173
|
-
children: [/* @__PURE__ */ _(d, { className: "absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-secondary" }), /* @__PURE__ */ _(O, {
|
|
174
|
-
placeholder: "Search by name or email...",
|
|
175
|
-
value: a,
|
|
176
|
-
onChange: (e) => M(e.target.value),
|
|
177
|
-
className: "pl-10"
|
|
178
|
-
})]
|
|
179
|
-
}), /* @__PURE__ */ v("div", {
|
|
180
|
-
className: "flex items-center gap-2",
|
|
181
|
-
children: [
|
|
182
|
-
/* @__PURE__ */ _(s, { className: "h-4 w-4 text-text-secondary" }),
|
|
183
|
-
/* @__PURE__ */ v("select", {
|
|
184
|
-
className: "rounded border border-border-seam bg-bg-surface px-2 py-1 text-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus",
|
|
185
|
-
value: N,
|
|
186
|
-
onChange: (e) => P(e.target.value),
|
|
187
|
-
children: [
|
|
188
|
-
/* @__PURE__ */ _("option", {
|
|
189
|
-
value: "all",
|
|
190
|
-
children: "All Roles"
|
|
191
|
-
}),
|
|
192
|
-
/* @__PURE__ */ _("option", {
|
|
193
|
-
value: "client",
|
|
194
|
-
children: "Client"
|
|
195
|
-
}),
|
|
196
|
-
/* @__PURE__ */ _("option", {
|
|
197
|
-
value: "provider",
|
|
198
|
-
children: "Provider"
|
|
199
|
-
}),
|
|
200
|
-
/* @__PURE__ */ _("option", {
|
|
201
|
-
value: "admin",
|
|
202
|
-
children: "Admin"
|
|
203
|
-
}),
|
|
204
|
-
/* @__PURE__ */ _("option", {
|
|
205
|
-
value: "team_member",
|
|
206
|
-
children: "Team Member"
|
|
207
|
-
})
|
|
208
|
-
]
|
|
209
|
-
}),
|
|
210
|
-
/* @__PURE__ */ v("select", {
|
|
211
|
-
className: "rounded border border-border-seam bg-bg-surface px-2 py-1 text-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus",
|
|
212
|
-
value: F,
|
|
213
|
-
onChange: (e) => I(e.target.value),
|
|
214
|
-
children: [
|
|
215
|
-
/* @__PURE__ */ _("option", {
|
|
216
|
-
value: "all",
|
|
217
|
-
children: "All Status"
|
|
218
|
-
}),
|
|
219
|
-
/* @__PURE__ */ _("option", {
|
|
220
|
-
value: "active",
|
|
221
|
-
children: "Active"
|
|
222
|
-
}),
|
|
223
|
-
/* @__PURE__ */ _("option", {
|
|
224
|
-
value: "suspended",
|
|
225
|
-
children: "Suspended"
|
|
226
|
-
}),
|
|
227
|
-
/* @__PURE__ */ _("option", {
|
|
228
|
-
value: "pending",
|
|
229
|
-
children: "Pending"
|
|
230
|
-
}),
|
|
231
|
-
/* @__PURE__ */ _("option", {
|
|
232
|
-
value: "banned",
|
|
233
|
-
children: "Banned"
|
|
234
|
-
})
|
|
235
|
-
]
|
|
236
|
-
})
|
|
237
|
-
]
|
|
238
|
-
})]
|
|
239
|
-
}),
|
|
240
|
-
L.size > 0 && /* @__PURE__ */ v("div", {
|
|
241
|
-
className: "flex items-center gap-3 rounded-lg bg-accent-soft border border-border-seam p-3",
|
|
242
|
-
children: [
|
|
243
|
-
/* @__PURE__ */ v("span", {
|
|
244
|
-
className: "text-sm font-medium",
|
|
245
|
-
children: [L.size, " user(s) selected"]
|
|
246
|
-
}),
|
|
247
|
-
/* @__PURE__ */ _(x, {
|
|
248
|
-
variant: "outline",
|
|
249
|
-
size: "sm",
|
|
250
|
-
children: "Activate"
|
|
251
|
-
}),
|
|
252
|
-
/* @__PURE__ */ _(x, {
|
|
253
|
-
variant: "outline",
|
|
254
|
-
size: "sm",
|
|
255
|
-
children: "Suspend"
|
|
256
|
-
}),
|
|
257
|
-
/* @__PURE__ */ _(x, {
|
|
258
|
-
variant: "destructive",
|
|
259
|
-
size: "sm",
|
|
260
|
-
children: "Ban"
|
|
261
|
-
})
|
|
262
|
-
]
|
|
263
|
-
}),
|
|
264
|
-
/* @__PURE__ */ _(C, {
|
|
265
|
-
className: "border-border-seam",
|
|
266
|
-
children: /* @__PURE__ */ v(w, {
|
|
267
|
-
className: "pt-4",
|
|
268
|
-
children: [/* @__PURE__ */ _("div", {
|
|
269
|
-
className: "overflow-x-auto",
|
|
270
|
-
children: /* @__PURE__ */ v("table", {
|
|
271
|
-
className: "w-full text-sm",
|
|
272
|
-
children: [/* @__PURE__ */ _("thead", { children: /* @__PURE__ */ v("tr", {
|
|
273
|
-
className: "border-b border-border-seam text-left text-text-secondary",
|
|
274
|
-
children: [
|
|
275
|
-
/* @__PURE__ */ _("th", {
|
|
276
|
-
className: "p-3",
|
|
277
|
-
children: /* @__PURE__ */ _("input", {
|
|
278
|
-
type: "checkbox",
|
|
279
|
-
checked: L.size === z.length && z.length > 0,
|
|
280
|
-
onChange: () => {
|
|
281
|
-
L.size === z.length ? R(/* @__PURE__ */ new Set()) : R(new Set(z.map((e) => e.id)));
|
|
282
|
-
},
|
|
283
|
-
className: "rounded"
|
|
284
|
-
})
|
|
285
|
-
}),
|
|
286
|
-
/* @__PURE__ */ _("th", {
|
|
287
|
-
className: "p-3",
|
|
288
|
-
children: "User"
|
|
289
|
-
}),
|
|
290
|
-
/* @__PURE__ */ _("th", {
|
|
291
|
-
className: "p-3",
|
|
292
|
-
children: "Role"
|
|
293
|
-
}),
|
|
294
|
-
/* @__PURE__ */ _("th", {
|
|
295
|
-
className: "p-3",
|
|
296
|
-
children: "Status"
|
|
297
|
-
}),
|
|
298
|
-
/* @__PURE__ */ _("th", {
|
|
299
|
-
className: "p-3",
|
|
300
|
-
children: "Verified"
|
|
301
|
-
}),
|
|
302
|
-
/* @__PURE__ */ _("th", {
|
|
303
|
-
className: "p-3",
|
|
304
|
-
children: "Joined"
|
|
305
|
-
}),
|
|
306
|
-
/* @__PURE__ */ _("th", {
|
|
307
|
-
className: "p-3",
|
|
308
|
-
children: "Last Active"
|
|
309
|
-
}),
|
|
310
|
-
/* @__PURE__ */ _("th", {
|
|
311
|
-
className: "p-3 text-right",
|
|
312
|
-
children: "Bookings"
|
|
313
|
-
}),
|
|
314
|
-
/* @__PURE__ */ _("th", {
|
|
315
|
-
className: "p-3 text-right",
|
|
316
|
-
children: "Spent"
|
|
317
|
-
}),
|
|
318
|
-
/* @__PURE__ */ _("th", {
|
|
319
|
-
className: "p-3",
|
|
320
|
-
children: "Rating"
|
|
321
|
-
}),
|
|
322
|
-
/* @__PURE__ */ _("th", {
|
|
323
|
-
className: "p-3 text-right",
|
|
324
|
-
children: "Actions"
|
|
325
|
-
})
|
|
326
|
-
]
|
|
327
|
-
}) }), /* @__PURE__ */ _("tbody", { children: z.length === 0 ? /* @__PURE__ */ _("tr", { children: /* @__PURE__ */ _("td", {
|
|
328
|
-
colSpan: 11,
|
|
329
|
-
className: "p-4",
|
|
330
|
-
children: /* @__PURE__ */ _(D, {
|
|
331
|
-
illustration: "empty-people",
|
|
332
|
-
title: "No users found",
|
|
333
|
-
description: "No users match your current filters."
|
|
334
|
-
})
|
|
335
|
-
}) }) : z.map((e) => {
|
|
336
|
-
let t = j[e.status], n = t.icon;
|
|
337
|
-
return /* @__PURE__ */ v("tr", {
|
|
338
|
-
className: "border-b border-border-seam transition-colors hover:bg-bg-sunken/50",
|
|
339
|
-
children: [
|
|
340
|
-
/* @__PURE__ */ _("td", {
|
|
341
|
-
className: "p-3",
|
|
342
|
-
children: /* @__PURE__ */ _("input", {
|
|
343
|
-
type: "checkbox",
|
|
344
|
-
"aria-label": `Select ${e.name}`,
|
|
345
|
-
checked: L.has(e.id),
|
|
346
|
-
onChange: () => W(e.id),
|
|
347
|
-
className: "rounded"
|
|
348
|
-
})
|
|
349
|
-
}),
|
|
350
|
-
/* @__PURE__ */ _("td", {
|
|
351
|
-
className: "p-3",
|
|
352
|
-
children: /* @__PURE__ */ v("div", {
|
|
353
|
-
className: "flex items-center gap-3",
|
|
354
|
-
children: [/* @__PURE__ */ _("div", {
|
|
355
|
-
className: "flex h-8 w-8 items-center justify-center rounded-full bg-accent-soft text-xs font-semibold text-text-primary",
|
|
356
|
-
children: e.name.charAt(0)
|
|
357
|
-
}), /* @__PURE__ */ v("div", { children: [/* @__PURE__ */ _("p", {
|
|
358
|
-
className: "font-medium",
|
|
359
|
-
children: e.name
|
|
360
|
-
}), /* @__PURE__ */ _("p", {
|
|
361
|
-
className: "text-xs text-text-secondary",
|
|
362
|
-
children: e.email
|
|
363
|
-
})] })]
|
|
364
|
-
})
|
|
365
|
-
}),
|
|
366
|
-
/* @__PURE__ */ _("td", {
|
|
367
|
-
className: "p-3",
|
|
368
|
-
children: /* @__PURE__ */ _(b, {
|
|
369
|
-
variant: A[e.role].variant,
|
|
370
|
-
children: A[e.role].label
|
|
371
|
-
})
|
|
372
|
-
}),
|
|
373
|
-
/* @__PURE__ */ _("td", {
|
|
374
|
-
className: "p-3",
|
|
375
|
-
children: /* @__PURE__ */ v("div", {
|
|
376
|
-
className: "flex items-center gap-1",
|
|
377
|
-
children: [/* @__PURE__ */ _(n, { className: `h-4 w-4 ${t.color}` }), /* @__PURE__ */ _("span", {
|
|
378
|
-
className: `text-xs font-medium ${t.color}`,
|
|
379
|
-
children: t.label
|
|
380
|
-
})]
|
|
381
|
-
})
|
|
382
|
-
}),
|
|
383
|
-
/* @__PURE__ */ _("td", {
|
|
384
|
-
className: "p-3",
|
|
385
|
-
children: e.verified ? /* @__PURE__ */ _(i, { className: "h-4 w-4 text-status-success-text" }) : /* @__PURE__ */ _(g, { className: "h-4 w-4 text-text-muted" })
|
|
386
|
-
}),
|
|
387
|
-
/* @__PURE__ */ _("td", {
|
|
388
|
-
className: "p-3 text-text-secondary",
|
|
389
|
-
children: e.joinedDate
|
|
390
|
-
}),
|
|
391
|
-
/* @__PURE__ */ _("td", {
|
|
392
|
-
className: "p-3 text-text-secondary",
|
|
393
|
-
children: e.lastActive
|
|
394
|
-
}),
|
|
395
|
-
/* @__PURE__ */ _("td", {
|
|
396
|
-
className: "p-3 text-right tabular-nums",
|
|
397
|
-
children: e.bookingsCount
|
|
398
|
-
}),
|
|
399
|
-
/* @__PURE__ */ _("td", {
|
|
400
|
-
className: "p-3 text-right tabular-nums",
|
|
401
|
-
children: e.totalSpent > 0 ? `$${e.totalSpent.toLocaleString()}` : "-"
|
|
402
|
-
}),
|
|
403
|
-
/* @__PURE__ */ _("td", {
|
|
404
|
-
className: "p-3",
|
|
405
|
-
children: e.rating ? /* @__PURE__ */ v("div", {
|
|
406
|
-
className: "flex items-center gap-1",
|
|
407
|
-
children: [/* @__PURE__ */ _(p, { className: "h-3 w-3 fill-status-warning-text text-status-warning-text" }), /* @__PURE__ */ _("span", {
|
|
408
|
-
className: "text-xs font-medium tabular-nums",
|
|
409
|
-
children: e.rating
|
|
410
|
-
})]
|
|
411
|
-
}) : /* @__PURE__ */ _("span", {
|
|
412
|
-
className: "text-xs text-text-secondary",
|
|
413
|
-
children: "-"
|
|
414
|
-
})
|
|
415
|
-
}),
|
|
416
|
-
/* @__PURE__ */ _("td", {
|
|
417
|
-
className: "p-3 text-right",
|
|
418
|
-
children: /* @__PURE__ */ v("div", {
|
|
419
|
-
className: "flex justify-end gap-1",
|
|
420
|
-
children: [/* @__PURE__ */ _(x, {
|
|
421
|
-
variant: "outline",
|
|
422
|
-
size: "sm",
|
|
423
|
-
"aria-label": `Email ${e.name}`,
|
|
424
|
-
children: /* @__PURE__ */ _(c, { className: "h-3 w-3" })
|
|
425
|
-
}), /* @__PURE__ */ _(x, {
|
|
426
|
-
variant: "outline",
|
|
427
|
-
size: "sm",
|
|
428
|
-
"aria-label": `More actions for ${e.name}`,
|
|
429
|
-
children: /* @__PURE__ */ _(l, { className: "h-3 w-3" })
|
|
430
|
-
})]
|
|
431
|
-
})
|
|
432
|
-
})
|
|
433
|
-
]
|
|
434
|
-
}, e.id);
|
|
435
|
-
}) })]
|
|
436
|
-
})
|
|
437
|
-
}), /* @__PURE__ */ v("div", {
|
|
438
|
-
className: "mt-4 flex items-center justify-between border-t border-border-seam pt-4 text-sm text-text-secondary",
|
|
439
|
-
children: [/* @__PURE__ */ v("span", { children: [
|
|
440
|
-
"Showing ",
|
|
441
|
-
z.length,
|
|
442
|
-
" of ",
|
|
443
|
-
r.length,
|
|
444
|
-
" users"
|
|
445
|
-
] }), /* @__PURE__ */ v("div", {
|
|
446
|
-
className: "flex gap-1",
|
|
447
|
-
children: [/* @__PURE__ */ _(x, {
|
|
448
|
-
variant: "outline",
|
|
449
|
-
size: "sm",
|
|
450
|
-
disabled: !0,
|
|
451
|
-
children: "Previous"
|
|
452
|
-
}), /* @__PURE__ */ _(x, {
|
|
453
|
-
variant: "outline",
|
|
454
|
-
size: "sm",
|
|
455
|
-
disabled: !0,
|
|
456
|
-
children: "Next"
|
|
457
|
-
})]
|
|
458
|
-
})]
|
|
459
|
-
})]
|
|
460
|
-
})
|
|
461
|
-
})
|
|
462
|
-
]
|
|
463
|
-
});
|
|
464
|
-
}
|
|
465
|
-
//#endregion
|
|
466
|
-
export { M as AdminUsersPage };
|
|
467
|
-
|
|
468
|
-
//# sourceMappingURL=AdminUsersPage.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AdminUsersPage.js","names":[],"sources":["../../../src/proserviceworld/pages/AdminUsersPage.tsx"],"sourcesContent":["import { useState, useMemo } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n Input,\n GlassCard,\n AuroraBackground,\n GradientText,\n CTAOverflowMenu,\n IllustratedEmptyState,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport {\n Search,\n Filter,\n Users,\n UserCheck,\n Shield,\n Star,\n CheckCircle2,\n XCircle,\n Clock,\n Ban,\n MoreHorizontal,\n Download,\n Plus,\n Mail,\n} from 'lucide-react';\nimport { useProServiceWorldStore } from '../store/proserviceworldStore';\nimport type { AdminUserRole, AdminUserStatus } from '../types';\n\nconst roleConfig: Record<\n AdminUserRole,\n { label: string; variant: 'default' | 'secondary' | 'outline' | 'destructive' }\n> = {\n client: { label: 'Client', variant: 'secondary' },\n provider: { label: 'Provider', variant: 'default' },\n admin: { label: 'Admin', variant: 'destructive' },\n team_member: { label: 'Team', variant: 'outline' },\n};\n\nconst statusConfig: Record<\n AdminUserStatus,\n { label: string; icon: typeof CheckCircle2; color: string }\n> = {\n active: { label: 'Active', icon: CheckCircle2, color: 'text-status-success-text' },\n suspended: { label: 'Suspended', icon: Ban, color: 'text-status-warning-text' },\n pending: { label: 'Pending', icon: Clock, color: 'text-status-warning-text' },\n banned: { label: 'Banned', icon: XCircle, color: 'text-status-error-text' },\n};\n\nexport function AdminUsersPage() {\n const { adminUsers } = useProServiceWorldStore();\n const [searchQuery, setSearchQuery] = useState('');\n const [roleFilter, setRoleFilter] = useState<AdminUserRole | 'all'>('all');\n const [statusFilter, setStatusFilter] = useState<AdminUserStatus | 'all'>('all');\n const [selectedIds, setSelectedIds] = useState<Set<string>>(new Set());\n\n const filtered = useMemo(() => {\n let result = [...adminUsers];\n if (roleFilter !== 'all') result = result.filter((u) => u.role === roleFilter);\n if (statusFilter !== 'all') result = result.filter((u) => u.status === statusFilter);\n if (searchQuery.trim()) {\n const q = searchQuery.toLowerCase();\n result = result.filter(\n (u) => u.name.toLowerCase().includes(q) || u.email.toLowerCase().includes(q)\n );\n }\n return result;\n }, [adminUsers, roleFilter, statusFilter, searchQuery]);\n\n // Stats\n const totalUsers = adminUsers.length;\n const activeUsers = adminUsers.filter((u) => u.status === 'active').length;\n const providers = adminUsers.filter((u) => u.role === 'provider').length;\n const verifiedUsers = adminUsers.filter((u) => u.verified).length;\n\n const toggleSelect = (id: string) => {\n const next = new Set(selectedIds);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n setSelectedIds(next);\n };\n\n const toggleSelectAll = () => {\n if (selectedIds.size === filtered.length) setSelectedIds(new Set());\n else setSelectedIds(new Set(filtered.map((u) => u.id)));\n };\n\n return (\n <div className=\"space-y-6 p-6 bg-bg-canvas min-h-screen\">\n {/* Hero header — the ONE aurora backdrop for this MFE */}\n <div className=\"relative overflow-hidden rounded-card -mx-2 px-2 pt-1 flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\n <AuroraBackground intensity=\"subtle\" />\n <div>\n <h1 className=\"text-2xl font-semibold tracking-tight\">\n <GradientText>User Management</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\n Admin panel to manage platform users, roles, and access.\n </p>\n </div>\n <CTAOverflowMenu\n primary={{\n label: 'Invite User',\n onSelect: () => {},\n icon: <Plus className=\"h-4 w-4\" />,\n }}\n actions={[\n {\n label: 'Export',\n onSelect: () => {},\n icon: <Download className=\"h-4 w-4\" />,\n },\n ]}\n />\n </div>\n\n <PagePurpose icon={<Users className=\"h-4 w-4\" />}>\n The control room for everyone on the platform. Search, filter by role and status, and\n review each user's activity and spend at a glance — then invite new members or take\n bulk action to activate, suspend, or ban accounts as needed.\n </PagePurpose>\n\n {/* Stats */}\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <GlassCard treatment=\"glass\" glow 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 <Users className=\"h-5 w-5 text-accent-blue\" />\n </div>\n <div>\n <p className=\"text-2xl font-bold tabular-nums\">{totalUsers}</p>\n <p className=\"text-xs text-text-secondary\">Total Users</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 <UserCheck className=\"h-5 w-5 text-status-success-text\" />\n </div>\n <div>\n <p className=\"text-2xl font-bold tabular-nums\">{activeUsers}</p>\n <p className=\"text-xs text-text-secondary\">Active Users</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-accent-purple-subtle p-2\">\n <Shield className=\"h-5 w-5 text-accent-purple\" />\n </div>\n <div>\n <p className=\"text-2xl font-bold tabular-nums\">{providers}</p>\n <p className=\"text-xs text-text-secondary\">Providers</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 <CheckCircle2 className=\"h-5 w-5 text-status-warning-text\" />\n </div>\n <div>\n <p className=\"text-2xl font-bold tabular-nums\">{verifiedUsers}</p>\n <p className=\"text-xs text-text-secondary\">Verified</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 by name or email...\"\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 <select\n className=\"rounded border border-border-seam bg-bg-surface px-2 py-1 text-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus\"\n value={roleFilter}\n onChange={(e) => setRoleFilter(e.target.value as AdminUserRole | 'all')}\n >\n <option value=\"all\">All Roles</option>\n <option value=\"client\">Client</option>\n <option value=\"provider\">Provider</option>\n <option value=\"admin\">Admin</option>\n <option value=\"team_member\">Team Member</option>\n </select>\n <select\n className=\"rounded border border-border-seam bg-bg-surface px-2 py-1 text-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus\"\n value={statusFilter}\n onChange={(e) => setStatusFilter(e.target.value as AdminUserStatus | 'all')}\n >\n <option value=\"all\">All Status</option>\n <option value=\"active\">Active</option>\n <option value=\"suspended\">Suspended</option>\n <option value=\"pending\">Pending</option>\n <option value=\"banned\">Banned</option>\n </select>\n </div>\n </div>\n\n {/* Bulk actions */}\n {selectedIds.size > 0 && (\n <div className=\"flex items-center gap-3 rounded-lg bg-accent-soft border border-border-seam p-3\">\n <span className=\"text-sm font-medium\">{selectedIds.size} user(s) selected</span>\n <Button variant=\"outline\" size=\"sm\">\n Activate\n </Button>\n <Button variant=\"outline\" size=\"sm\">\n Suspend\n </Button>\n <Button variant=\"destructive\" size=\"sm\">\n Ban\n </Button>\n </div>\n )}\n\n {/* User table */}\n <Card className=\"border-border-seam\">\n <CardContent className=\"pt-4\">\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b border-border-seam text-left text-text-secondary\">\n <th className=\"p-3\">\n <input\n type=\"checkbox\"\n checked={selectedIds.size === filtered.length && filtered.length > 0}\n onChange={toggleSelectAll}\n className=\"rounded\"\n />\n </th>\n <th className=\"p-3\">User</th>\n <th className=\"p-3\">Role</th>\n <th className=\"p-3\">Status</th>\n <th className=\"p-3\">Verified</th>\n <th className=\"p-3\">Joined</th>\n <th className=\"p-3\">Last Active</th>\n <th className=\"p-3 text-right\">Bookings</th>\n <th className=\"p-3 text-right\">Spent</th>\n <th className=\"p-3\">Rating</th>\n <th className=\"p-3 text-right\">Actions</th>\n </tr>\n </thead>\n <tbody>\n {filtered.length === 0 ? (\n <tr>\n <td colSpan={11} className=\"p-4\">\n <IllustratedEmptyState\n illustration=\"empty-people\"\n title=\"No users found\"\n description=\"No users match your current filters.\"\n />\n </td>\n </tr>\n ) : (\n filtered.map((user) => {\n const sCfg = statusConfig[user.status];\n const StatusIcon = sCfg.icon;\n return (\n <tr key={user.id} className=\"border-b border-border-seam transition-colors hover:bg-bg-sunken/50\">\n <td className=\"p-3\">\n <input\n type=\"checkbox\"\n aria-label={`Select ${user.name}`}\n checked={selectedIds.has(user.id)}\n onChange={() => toggleSelect(user.id)}\n className=\"rounded\"\n />\n </td>\n <td className=\"p-3\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-8 w-8 items-center justify-center rounded-full bg-accent-soft text-xs font-semibold text-text-primary\">\n {user.name.charAt(0)}\n </div>\n <div>\n <p className=\"font-medium\">{user.name}</p>\n <p className=\"text-xs text-text-secondary\">{user.email}</p>\n </div>\n </div>\n </td>\n <td className=\"p-3\">\n <Badge variant={roleConfig[user.role].variant}>\n {roleConfig[user.role].label}\n </Badge>\n </td>\n <td className=\"p-3\">\n <div className=\"flex items-center gap-1\">\n <StatusIcon className={`h-4 w-4 ${sCfg.color}`} />\n <span className={`text-xs font-medium ${sCfg.color}`}>\n {sCfg.label}\n </span>\n </div>\n </td>\n <td className=\"p-3\">\n {user.verified ? (\n <CheckCircle2 className=\"h-4 w-4 text-status-success-text\" />\n ) : (\n <XCircle className=\"h-4 w-4 text-text-muted\" />\n )}\n </td>\n <td className=\"p-3 text-text-secondary\">{user.joinedDate}</td>\n <td className=\"p-3 text-text-secondary\">{user.lastActive}</td>\n <td className=\"p-3 text-right tabular-nums\">{user.bookingsCount}</td>\n <td className=\"p-3 text-right tabular-nums\">\n {user.totalSpent > 0 ? `$${user.totalSpent.toLocaleString()}` : '-'}\n </td>\n <td className=\"p-3\">\n {user.rating ? (\n <div className=\"flex items-center gap-1\">\n <Star className=\"h-3 w-3 fill-status-warning-text text-status-warning-text\" />\n <span className=\"text-xs font-medium tabular-nums\">{user.rating}</span>\n </div>\n ) : (\n <span className=\"text-xs text-text-secondary\">-</span>\n )}\n </td>\n <td className=\"p-3 text-right\">\n <div className=\"flex justify-end gap-1\">\n <Button variant=\"outline\" size=\"sm\" aria-label={`Email ${user.name}`}>\n <Mail className=\"h-3 w-3\" />\n </Button>\n <Button variant=\"outline\" size=\"sm\" aria-label={`More actions for ${user.name}`}>\n <MoreHorizontal className=\"h-3 w-3\" />\n </Button>\n </div>\n </td>\n </tr>\n );\n })\n )}\n </tbody>\n </table>\n </div>\n\n {/* Pagination hint */}\n <div className=\"mt-4 flex items-center justify-between border-t border-border-seam pt-4 text-sm text-text-secondary\">\n <span>\n Showing {filtered.length} of {adminUsers.length} users\n </span>\n <div className=\"flex gap-1\">\n <Button variant=\"outline\" size=\"sm\" disabled>\n Previous\n </Button>\n <Button variant=\"outline\" size=\"sm\" disabled>\n Next\n </Button>\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
|