@burdenoff/microfe-proserviceworld 2026.509.101

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.
Files changed (106) hide show
  1. package/README.md +12 -0
  2. package/dist/dev/main.d.ts +2 -0
  3. package/dist/dev/main.d.ts.map +1 -0
  4. package/dist/generated/global-operations.d.ts +2 -0
  5. package/dist/generated/global-operations.d.ts.map +1 -0
  6. package/dist/generated/global-types.d.ts +18199 -0
  7. package/dist/generated/global-types.d.ts.map +1 -0
  8. package/dist/generated/wspace-operations.d.ts +2 -0
  9. package/dist/generated/wspace-operations.d.ts.map +1 -0
  10. package/dist/generated/wspace-types.d.ts +43046 -0
  11. package/dist/generated/wspace-types.d.ts.map +1 -0
  12. package/dist/index.d.ts +2 -0
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/index.js +5 -0
  15. package/dist/proserviceworld/ProServiceWorldRoot.d.ts +5 -0
  16. package/dist/proserviceworld/ProServiceWorldRoot.d.ts.map +1 -0
  17. package/dist/proserviceworld/ProServiceWorldRoot.js +151 -0
  18. package/dist/proserviceworld/ProServiceWorldRoot.js.map +1 -0
  19. package/dist/proserviceworld/ProServiceWorldRoutes.d.ts +2 -0
  20. package/dist/proserviceworld/ProServiceWorldRoutes.d.ts.map +1 -0
  21. package/dist/proserviceworld/ProServiceWorldRoutes.js +91 -0
  22. package/dist/proserviceworld/ProServiceWorldRoutes.js.map +1 -0
  23. package/dist/proserviceworld/index.d.ts +5 -0
  24. package/dist/proserviceworld/index.d.ts.map +1 -0
  25. package/dist/proserviceworld/index.js +3 -0
  26. package/dist/proserviceworld/pages/AdminReportsPage.d.ts +2 -0
  27. package/dist/proserviceworld/pages/AdminReportsPage.d.ts.map +1 -0
  28. package/dist/proserviceworld/pages/AdminReportsPage.js +512 -0
  29. package/dist/proserviceworld/pages/AdminReportsPage.js.map +1 -0
  30. package/dist/proserviceworld/pages/AdminUsersPage.d.ts +2 -0
  31. package/dist/proserviceworld/pages/AdminUsersPage.d.ts.map +1 -0
  32. package/dist/proserviceworld/pages/AdminUsersPage.js +444 -0
  33. package/dist/proserviceworld/pages/AdminUsersPage.js.map +1 -0
  34. package/dist/proserviceworld/pages/AnalyticsPage.d.ts +2 -0
  35. package/dist/proserviceworld/pages/AnalyticsPage.d.ts.map +1 -0
  36. package/dist/proserviceworld/pages/AnalyticsPage.js +433 -0
  37. package/dist/proserviceworld/pages/AnalyticsPage.js.map +1 -0
  38. package/dist/proserviceworld/pages/BookingsPage.d.ts +2 -0
  39. package/dist/proserviceworld/pages/BookingsPage.d.ts.map +1 -0
  40. package/dist/proserviceworld/pages/BookingsPage.js +425 -0
  41. package/dist/proserviceworld/pages/BookingsPage.js.map +1 -0
  42. package/dist/proserviceworld/pages/DashboardPage.d.ts +2 -0
  43. package/dist/proserviceworld/pages/DashboardPage.d.ts.map +1 -0
  44. package/dist/proserviceworld/pages/DashboardPage.js +583 -0
  45. package/dist/proserviceworld/pages/DashboardPage.js.map +1 -0
  46. package/dist/proserviceworld/pages/DocumentsPage.d.ts +2 -0
  47. package/dist/proserviceworld/pages/DocumentsPage.d.ts.map +1 -0
  48. package/dist/proserviceworld/pages/DocumentsPage.js +494 -0
  49. package/dist/proserviceworld/pages/DocumentsPage.js.map +1 -0
  50. package/dist/proserviceworld/pages/MessagesPage.d.ts +2 -0
  51. package/dist/proserviceworld/pages/MessagesPage.d.ts.map +1 -0
  52. package/dist/proserviceworld/pages/MessagesPage.js +229 -0
  53. package/dist/proserviceworld/pages/MessagesPage.js.map +1 -0
  54. package/dist/proserviceworld/pages/PaymentsPage.d.ts +2 -0
  55. package/dist/proserviceworld/pages/PaymentsPage.d.ts.map +1 -0
  56. package/dist/proserviceworld/pages/PaymentsPage.js +479 -0
  57. package/dist/proserviceworld/pages/PaymentsPage.js.map +1 -0
  58. package/dist/proserviceworld/pages/ProjectsPage.d.ts +2 -0
  59. package/dist/proserviceworld/pages/ProjectsPage.d.ts.map +1 -0
  60. package/dist/proserviceworld/pages/ProjectsPage.js +547 -0
  61. package/dist/proserviceworld/pages/ProjectsPage.js.map +1 -0
  62. package/dist/proserviceworld/pages/ProviderDetailPage.d.ts +2 -0
  63. package/dist/proserviceworld/pages/ProviderDetailPage.d.ts.map +1 -0
  64. package/dist/proserviceworld/pages/ProviderDetailPage.js +464 -0
  65. package/dist/proserviceworld/pages/ProviderDetailPage.js.map +1 -0
  66. package/dist/proserviceworld/pages/ProvidersPage.d.ts +2 -0
  67. package/dist/proserviceworld/pages/ProvidersPage.d.ts.map +1 -0
  68. package/dist/proserviceworld/pages/ProvidersPage.js +342 -0
  69. package/dist/proserviceworld/pages/ProvidersPage.js.map +1 -0
  70. package/dist/proserviceworld/pages/ReviewsPage.d.ts +2 -0
  71. package/dist/proserviceworld/pages/ReviewsPage.d.ts.map +1 -0
  72. package/dist/proserviceworld/pages/ReviewsPage.js +339 -0
  73. package/dist/proserviceworld/pages/ReviewsPage.js.map +1 -0
  74. package/dist/proserviceworld/pages/ServiceDetailsPage.d.ts +2 -0
  75. package/dist/proserviceworld/pages/ServiceDetailsPage.d.ts.map +1 -0
  76. package/dist/proserviceworld/pages/ServiceDetailsPage.js +563 -0
  77. package/dist/proserviceworld/pages/ServiceDetailsPage.js.map +1 -0
  78. package/dist/proserviceworld/pages/ServicesPage.d.ts +2 -0
  79. package/dist/proserviceworld/pages/ServicesPage.d.ts.map +1 -0
  80. package/dist/proserviceworld/pages/ServicesPage.js +337 -0
  81. package/dist/proserviceworld/pages/ServicesPage.js.map +1 -0
  82. package/dist/proserviceworld/pages/VerificationPage.d.ts +2 -0
  83. package/dist/proserviceworld/pages/VerificationPage.d.ts.map +1 -0
  84. package/dist/proserviceworld/pages/VerificationPage.js +357 -0
  85. package/dist/proserviceworld/pages/VerificationPage.js.map +1 -0
  86. package/dist/proserviceworld/providers/ProServiceWorldProvider.d.ts +6 -0
  87. package/dist/proserviceworld/providers/ProServiceWorldProvider.d.ts.map +1 -0
  88. package/dist/proserviceworld/providers/ProServiceWorldProvider.js +27 -0
  89. package/dist/proserviceworld/providers/ProServiceWorldProvider.js.map +1 -0
  90. package/dist/proserviceworld/store/proserviceworldStore.d.ts +32 -0
  91. package/dist/proserviceworld/store/proserviceworldStore.d.ts.map +1 -0
  92. package/dist/proserviceworld/store/proserviceworldStore.js +2490 -0
  93. package/dist/proserviceworld/store/proserviceworldStore.js.map +1 -0
  94. package/dist/proserviceworld/types/index.d.ts +338 -0
  95. package/dist/proserviceworld/types/index.d.ts.map +1 -0
  96. package/dist/proserviceworld/utils/cn.d.ts +4 -0
  97. package/dist/proserviceworld/utils/cn.d.ts.map +1 -0
  98. package/dist/proserviceworld/utils/i18n.d.ts +6 -0
  99. package/dist/proserviceworld/utils/i18n.d.ts.map +1 -0
  100. package/dist/proserviceworld/utils/i18n.js +15 -0
  101. package/dist/proserviceworld/utils/i18n.js.map +1 -0
  102. package/dist/proserviceworld/utils/navigation.d.ts +2 -0
  103. package/dist/proserviceworld/utils/navigation.d.ts.map +1 -0
  104. package/dist/proserviceworld/utils/navigation.js +8 -0
  105. package/dist/proserviceworld/utils/navigation.js.map +1 -0
  106. package/package.json +107 -0
@@ -0,0 +1,512 @@
1
+ import { useProServiceWorldStore as e } from "../store/proserviceworldStore.js";
2
+ import { useState as t } from "react";
3
+ import { AlertTriangle as n, ArrowUpRight as r, BarChart3 as i, Calendar as a, DollarSign as o, Download as s, FileText as c, Minus as l, Shield as u, ShoppingCart as d, Star as f, TrendingDown as p, TrendingUp as m, Users as h } from "lucide-react";
4
+ import { jsx as g, jsxs as _ } from "react/jsx-runtime";
5
+ import { Badge as v, Button as y, Card as b, CardContent as x, CardHeader as S, CardTitle as C } from "@burdenoff/fe-libs/ui";
6
+ //#region src/proserviceworld/pages/AdminReportsPage.tsx
7
+ function w() {
8
+ let { adminReportMetrics: w, revenueData: T, servicePerformance: E, geographicData: D, adminUsers: O } = e(), [k, A] = t("overview"), [j, M] = t("30d"), N = [
9
+ {
10
+ key: "overview",
11
+ label: "Overview",
12
+ icon: i
13
+ },
14
+ {
15
+ key: "users",
16
+ label: "Users",
17
+ icon: h
18
+ },
19
+ {
20
+ key: "revenue",
21
+ label: "Revenue",
22
+ icon: o
23
+ },
24
+ {
25
+ key: "bookings",
26
+ label: "Bookings",
27
+ icon: d
28
+ }
29
+ ], P = (e) => e === "positive" ? /* @__PURE__ */ g(m, { className: "h-4 w-4 text-green-500" }) : e === "negative" ? /* @__PURE__ */ g(p, { className: "h-4 w-4 text-red-500" }) : /* @__PURE__ */ g(l, { className: "h-4 w-4 text-gray-400" }), F = [
30
+ h,
31
+ u,
32
+ d,
33
+ o,
34
+ f,
35
+ n
36
+ ], I = Math.max(...T.map((e) => e.value)), L = Math.max(...E.map((e) => e.value)), R = O.reduce((e, t) => (e[t.role] = (e[t.role] ?? 0) + 1, e), {}), z = O.reduce((e, t) => (e[t.status] = (e[t.status] ?? 0) + 1, e), {});
37
+ return /* @__PURE__ */ _("div", {
38
+ className: "space-y-6 p-6",
39
+ children: [
40
+ /* @__PURE__ */ _("div", {
41
+ className: "flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between",
42
+ children: [/* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("h1", {
43
+ className: "text-2xl font-semibold",
44
+ children: "Admin Reports"
45
+ }), /* @__PURE__ */ g("p", {
46
+ className: "text-sm text-muted-foreground",
47
+ children: "Platform analytics, performance metrics, and operational reports."
48
+ })] }), /* @__PURE__ */ _("div", {
49
+ className: "flex gap-2",
50
+ children: [/* @__PURE__ */ _(y, {
51
+ variant: "outline",
52
+ size: "sm",
53
+ children: [/* @__PURE__ */ g(c, { className: "mr-2 h-4 w-4" }), " Generate Report"]
54
+ }), /* @__PURE__ */ _(y, {
55
+ variant: "outline",
56
+ size: "sm",
57
+ children: [/* @__PURE__ */ g(s, { className: "mr-2 h-4 w-4" }), " Export CSV"]
58
+ })]
59
+ })]
60
+ }),
61
+ /* @__PURE__ */ _("div", {
62
+ className: "flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between",
63
+ children: [/* @__PURE__ */ g("div", {
64
+ className: "flex gap-1 border-b",
65
+ children: N.map(({ key: e, label: t, icon: n }) => /* @__PURE__ */ _("button", {
66
+ onClick: () => A(e),
67
+ className: `flex items-center gap-2 border-b-2 px-4 py-2 text-sm font-medium transition-colors ${k === e ? "border-primary text-primary" : "border-transparent text-muted-foreground hover:text-foreground"}`,
68
+ children: [/* @__PURE__ */ g(n, { className: "h-4 w-4" }), t]
69
+ }, e))
70
+ }), /* @__PURE__ */ _("div", {
71
+ className: "flex items-center gap-2",
72
+ children: [/* @__PURE__ */ g(a, { className: "h-4 w-4 text-muted-foreground" }), /* @__PURE__ */ g("div", {
73
+ className: "flex rounded border",
74
+ children: [
75
+ "7d",
76
+ "30d",
77
+ "90d",
78
+ "1y"
79
+ ].map((e) => /* @__PURE__ */ g("button", {
80
+ onClick: () => M(e),
81
+ className: `px-3 py-1 text-xs font-medium ${j === e ? "bg-primary text-primary-foreground" : "text-muted-foreground hover:bg-muted/50"}`,
82
+ children: e
83
+ }, e))
84
+ })]
85
+ })]
86
+ }),
87
+ /* @__PURE__ */ g("div", {
88
+ className: "grid gap-4 sm:grid-cols-2 lg:grid-cols-3",
89
+ children: w.map((e, t) => /* @__PURE__ */ g(b, { children: /* @__PURE__ */ _(x, {
90
+ className: "pt-4",
91
+ children: [
92
+ /* @__PURE__ */ _("div", {
93
+ className: "flex items-center justify-between",
94
+ children: [/* @__PURE__ */ _("div", {
95
+ className: "flex items-center gap-2",
96
+ children: [/* @__PURE__ */ g(F[t % F.length] ?? i, { className: "h-4 w-4 text-muted-foreground" }), /* @__PURE__ */ g("p", {
97
+ className: "text-sm font-medium text-muted-foreground",
98
+ children: e.label
99
+ })]
100
+ }), P(e.changeType)]
101
+ }),
102
+ /* @__PURE__ */ g("p", {
103
+ className: "mt-2 text-3xl font-bold",
104
+ children: e.value
105
+ }),
106
+ /* @__PURE__ */ _("p", {
107
+ className: `mt-1 flex items-center gap-1 text-xs ${e.changeType === "positive" ? "text-green-600" : e.changeType === "negative" ? "text-red-600" : "text-gray-500"}`,
108
+ children: [
109
+ /* @__PURE__ */ g(r, { className: "h-3 w-3" }),
110
+ e.change,
111
+ " vs last period"
112
+ ]
113
+ })
114
+ ]
115
+ }) }, t))
116
+ }),
117
+ k === "overview" && /* @__PURE__ */ _("div", {
118
+ className: "grid gap-6 lg:grid-cols-2",
119
+ children: [
120
+ /* @__PURE__ */ _(b, { children: [/* @__PURE__ */ g(S, { children: /* @__PURE__ */ _("div", {
121
+ className: "flex items-center justify-between",
122
+ children: [/* @__PURE__ */ g(C, {
123
+ className: "text-base",
124
+ children: "Platform Revenue"
125
+ }), /* @__PURE__ */ g(v, {
126
+ variant: "secondary",
127
+ children: "Monthly"
128
+ })]
129
+ }) }), /* @__PURE__ */ g(x, {
130
+ className: "space-y-3",
131
+ children: T.map((e) => /* @__PURE__ */ _("div", {
132
+ className: "flex items-center gap-3",
133
+ children: [
134
+ /* @__PURE__ */ g("span", {
135
+ className: "w-10 text-xs text-muted-foreground",
136
+ children: e.name
137
+ }),
138
+ /* @__PURE__ */ g("div", {
139
+ className: "flex-1 h-5 bg-muted rounded overflow-hidden",
140
+ children: /* @__PURE__ */ g("div", {
141
+ className: "h-5 bg-primary rounded",
142
+ style: { width: `${e.value / I * 100}%` }
143
+ })
144
+ }),
145
+ /* @__PURE__ */ _("span", {
146
+ className: "w-16 text-right text-xs font-medium",
147
+ children: [
148
+ "$",
149
+ (e.value / 1e3).toFixed(1),
150
+ "k"
151
+ ]
152
+ })
153
+ ]
154
+ }, e.name))
155
+ })] }),
156
+ /* @__PURE__ */ _(b, { children: [/* @__PURE__ */ g(S, { children: /* @__PURE__ */ _("div", {
157
+ className: "flex items-center justify-between",
158
+ children: [/* @__PURE__ */ g(C, {
159
+ className: "text-base",
160
+ children: "Service Bookings"
161
+ }), /* @__PURE__ */ g(v, {
162
+ variant: "secondary",
163
+ children: "Total"
164
+ })]
165
+ }) }), /* @__PURE__ */ g(x, {
166
+ className: "space-y-3",
167
+ children: [...E].sort((e, t) => t.value - e.value).map((e) => /* @__PURE__ */ _("div", {
168
+ className: "flex items-center gap-3",
169
+ children: [
170
+ /* @__PURE__ */ g("span", {
171
+ className: "w-32 truncate text-xs text-muted-foreground",
172
+ children: e.name
173
+ }),
174
+ /* @__PURE__ */ g("div", {
175
+ className: "flex-1 h-5 bg-muted rounded overflow-hidden",
176
+ children: /* @__PURE__ */ g("div", {
177
+ className: "h-5 bg-blue-500 rounded",
178
+ style: { width: `${e.value / L * 100}%` }
179
+ })
180
+ }),
181
+ /* @__PURE__ */ g("span", {
182
+ className: "w-12 text-right text-xs font-medium",
183
+ children: e.value
184
+ })
185
+ ]
186
+ }, e.name))
187
+ })] }),
188
+ /* @__PURE__ */ _(b, {
189
+ className: "lg:col-span-2",
190
+ children: [/* @__PURE__ */ g(S, { children: /* @__PURE__ */ g(C, {
191
+ className: "text-base",
192
+ children: "Revenue by Region"
193
+ }) }), /* @__PURE__ */ g(x, { children: /* @__PURE__ */ g("div", {
194
+ className: "overflow-x-auto",
195
+ children: /* @__PURE__ */ _("table", {
196
+ className: "w-full text-sm",
197
+ children: [/* @__PURE__ */ g("thead", { children: /* @__PURE__ */ _("tr", {
198
+ className: "border-b text-left text-muted-foreground",
199
+ children: [
200
+ /* @__PURE__ */ g("th", {
201
+ className: "p-3",
202
+ children: "Region"
203
+ }),
204
+ /* @__PURE__ */ g("th", {
205
+ className: "p-3 text-right",
206
+ children: "Clients"
207
+ }),
208
+ /* @__PURE__ */ g("th", {
209
+ className: "p-3 text-right",
210
+ children: "Revenue"
211
+ }),
212
+ /* @__PURE__ */ g("th", {
213
+ className: "p-3 text-right",
214
+ children: "Avg. per Client"
215
+ }),
216
+ /* @__PURE__ */ g("th", {
217
+ className: "p-3",
218
+ children: "Share"
219
+ })
220
+ ]
221
+ }) }), /* @__PURE__ */ g("tbody", { children: D.map((e) => {
222
+ let t = D.reduce((e, t) => e + t.revenue, 0), n = Math.round(e.revenue / t * 100), r = Math.round(e.revenue / e.clients);
223
+ return /* @__PURE__ */ _("tr", {
224
+ className: "border-b hover:bg-muted/50",
225
+ children: [
226
+ /* @__PURE__ */ g("td", {
227
+ className: "p-3 font-medium",
228
+ children: e.country
229
+ }),
230
+ /* @__PURE__ */ g("td", {
231
+ className: "p-3 text-right",
232
+ children: e.clients
233
+ }),
234
+ /* @__PURE__ */ _("td", {
235
+ className: "p-3 text-right font-medium",
236
+ children: [
237
+ "$",
238
+ (e.revenue / 1e3).toFixed(0),
239
+ "k"
240
+ ]
241
+ }),
242
+ /* @__PURE__ */ _("td", {
243
+ className: "p-3 text-right text-muted-foreground",
244
+ children: ["$", r.toLocaleString()]
245
+ }),
246
+ /* @__PURE__ */ g("td", {
247
+ className: "p-3",
248
+ children: /* @__PURE__ */ _("div", {
249
+ className: "flex items-center gap-2",
250
+ children: [/* @__PURE__ */ g("div", {
251
+ className: "h-2 flex-1 overflow-hidden rounded-full bg-muted",
252
+ children: /* @__PURE__ */ g("div", {
253
+ className: "h-2 rounded-full bg-primary",
254
+ style: { width: `${n}%` }
255
+ })
256
+ }), /* @__PURE__ */ _("span", {
257
+ className: "w-10 text-right text-xs",
258
+ children: [n, "%"]
259
+ })]
260
+ })
261
+ })
262
+ ]
263
+ }, e.country);
264
+ }) })]
265
+ })
266
+ }) })]
267
+ })
268
+ ]
269
+ }),
270
+ k === "users" && /* @__PURE__ */ _("div", {
271
+ className: "grid gap-6 lg:grid-cols-2",
272
+ children: [
273
+ /* @__PURE__ */ _(b, { children: [/* @__PURE__ */ g(S, { children: /* @__PURE__ */ g(C, {
274
+ className: "text-base",
275
+ children: "User Role Distribution"
276
+ }) }), /* @__PURE__ */ g(x, {
277
+ className: "space-y-3",
278
+ children: Object.entries(R).map(([e, t]) => {
279
+ let n = Math.round(t / O.length * 100);
280
+ return /* @__PURE__ */ _("div", {
281
+ className: "flex items-center gap-3",
282
+ children: [
283
+ /* @__PURE__ */ g("span", {
284
+ className: "w-24 text-sm font-medium capitalize",
285
+ children: e.replace("_", " ")
286
+ }),
287
+ /* @__PURE__ */ g("div", {
288
+ className: "flex-1 h-5 bg-muted rounded overflow-hidden",
289
+ children: /* @__PURE__ */ g("div", {
290
+ className: `h-5 rounded ${{
291
+ client: "bg-blue-500",
292
+ provider: "bg-green-500",
293
+ admin: "bg-red-500",
294
+ team_member: "bg-purple-500"
295
+ }[e] ?? "bg-gray-400"}`,
296
+ style: { width: `${n}%` }
297
+ })
298
+ }),
299
+ /* @__PURE__ */ _("span", {
300
+ className: "w-16 text-right text-sm",
301
+ children: [
302
+ t,
303
+ " (",
304
+ n,
305
+ "%)"
306
+ ]
307
+ })
308
+ ]
309
+ }, e);
310
+ })
311
+ })] }),
312
+ /* @__PURE__ */ _(b, { children: [/* @__PURE__ */ g(S, { children: /* @__PURE__ */ g(C, {
313
+ className: "text-base",
314
+ children: "User Status Distribution"
315
+ }) }), /* @__PURE__ */ g(x, {
316
+ className: "space-y-3",
317
+ children: Object.entries(z).map(([e, t]) => {
318
+ let n = Math.round(t / O.length * 100);
319
+ return /* @__PURE__ */ _("div", {
320
+ className: "flex items-center gap-3",
321
+ children: [
322
+ /* @__PURE__ */ g("span", {
323
+ className: "w-24 text-sm font-medium capitalize",
324
+ children: e
325
+ }),
326
+ /* @__PURE__ */ g("div", {
327
+ className: "flex-1 h-5 bg-muted rounded overflow-hidden",
328
+ children: /* @__PURE__ */ g("div", {
329
+ className: `h-5 rounded ${{
330
+ active: "bg-green-500",
331
+ suspended: "bg-orange-500",
332
+ pending: "bg-yellow-500",
333
+ banned: "bg-red-500"
334
+ }[e] ?? "bg-gray-400"}`,
335
+ style: { width: `${n}%` }
336
+ })
337
+ }),
338
+ /* @__PURE__ */ _("span", {
339
+ className: "w-16 text-right text-sm",
340
+ children: [
341
+ t,
342
+ " (",
343
+ n,
344
+ "%)"
345
+ ]
346
+ })
347
+ ]
348
+ }, e);
349
+ })
350
+ })] }),
351
+ /* @__PURE__ */ _(b, {
352
+ className: "lg:col-span-2",
353
+ children: [/* @__PURE__ */ g(S, { children: /* @__PURE__ */ g(C, {
354
+ className: "text-base",
355
+ children: "Top Users by Spending"
356
+ }) }), /* @__PURE__ */ g(x, { children: /* @__PURE__ */ g("div", {
357
+ className: "space-y-2",
358
+ children: [...O].filter((e) => e.totalSpent > 0).sort((e, t) => t.totalSpent - e.totalSpent).slice(0, 5).map((e, t) => /* @__PURE__ */ _("div", {
359
+ className: "flex items-center justify-between rounded-lg border p-3",
360
+ children: [/* @__PURE__ */ _("div", {
361
+ className: "flex items-center gap-3",
362
+ children: [/* @__PURE__ */ g("span", {
363
+ className: "flex h-8 w-8 items-center justify-center rounded-full bg-primary/10 text-sm font-bold text-primary",
364
+ children: t + 1
365
+ }), /* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("p", {
366
+ className: "font-medium",
367
+ children: e.name
368
+ }), /* @__PURE__ */ g("p", {
369
+ className: "text-xs text-muted-foreground",
370
+ children: e.email
371
+ })] })]
372
+ }), /* @__PURE__ */ _("div", {
373
+ className: "text-right",
374
+ children: [/* @__PURE__ */ _("p", {
375
+ className: "font-bold",
376
+ children: ["$", e.totalSpent.toLocaleString()]
377
+ }), /* @__PURE__ */ _("p", {
378
+ className: "text-xs text-muted-foreground",
379
+ children: [e.bookingsCount, " bookings"]
380
+ })]
381
+ })]
382
+ }, e.id))
383
+ }) })]
384
+ })
385
+ ]
386
+ }),
387
+ k === "revenue" && /* @__PURE__ */ g("div", {
388
+ className: "space-y-6",
389
+ children: /* @__PURE__ */ _(b, { children: [/* @__PURE__ */ g(S, { children: /* @__PURE__ */ g(C, {
390
+ className: "text-base",
391
+ children: "Monthly Revenue Comparison"
392
+ }) }), /* @__PURE__ */ g(x, {
393
+ className: "space-y-4",
394
+ children: T.map((e) => {
395
+ let t = e.prev ? ((e.value - e.prev) / e.prev * 100).toFixed(1) : "0", n = e.prev ? e.value >= e.prev : !0;
396
+ return /* @__PURE__ */ _("div", {
397
+ className: "rounded-lg border p-4",
398
+ children: [/* @__PURE__ */ _("div", {
399
+ className: "flex items-center justify-between",
400
+ children: [/* @__PURE__ */ _("div", { children: [/* @__PURE__ */ _("p", {
401
+ className: "font-medium",
402
+ children: [e.name, " 2025"]
403
+ }), /* @__PURE__ */ _("div", {
404
+ className: "mt-1 flex items-center gap-4 text-sm text-muted-foreground",
405
+ children: [/* @__PURE__ */ _("span", { children: [
406
+ "Current: $",
407
+ (e.value / 1e3).toFixed(1),
408
+ "k"
409
+ ] }), /* @__PURE__ */ _("span", { children: [
410
+ "Previous: $",
411
+ ((e.prev ?? 0) / 1e3).toFixed(1),
412
+ "k"
413
+ ] })]
414
+ })] }), /* @__PURE__ */ _(v, {
415
+ variant: n ? "default" : "destructive",
416
+ children: [
417
+ n ? "+" : "",
418
+ t,
419
+ "%"
420
+ ]
421
+ })]
422
+ }), /* @__PURE__ */ _("div", {
423
+ className: "mt-3 flex gap-1 h-4",
424
+ children: [/* @__PURE__ */ g("div", {
425
+ className: "h-4 rounded bg-primary/30",
426
+ style: { width: `${(e.prev ?? 0) / I * 100}%` }
427
+ }), /* @__PURE__ */ g("div", {
428
+ className: "h-4 rounded bg-primary",
429
+ style: { width: `${Math.max(0, (e.value - (e.prev ?? 0)) / I * 100)}%` }
430
+ })]
431
+ })]
432
+ }, e.name);
433
+ })
434
+ })] })
435
+ }),
436
+ k === "bookings" && /* @__PURE__ */ _("div", {
437
+ className: "grid gap-6 lg:grid-cols-2",
438
+ children: [/* @__PURE__ */ _(b, { children: [/* @__PURE__ */ g(S, { children: /* @__PURE__ */ g(C, {
439
+ className: "text-base",
440
+ children: "Bookings by Service Category"
441
+ }) }), /* @__PURE__ */ g(x, {
442
+ className: "space-y-3",
443
+ children: [...E].sort((e, t) => t.value - e.value).map((e, t) => /* @__PURE__ */ _("div", {
444
+ className: "flex items-center gap-3",
445
+ children: [/* @__PURE__ */ _("span", {
446
+ className: "w-6 text-sm font-bold text-muted-foreground",
447
+ children: ["#", t + 1]
448
+ }), /* @__PURE__ */ _("div", {
449
+ className: "flex-1",
450
+ children: [/* @__PURE__ */ _("div", {
451
+ className: "flex items-center justify-between text-sm",
452
+ children: [/* @__PURE__ */ g("span", {
453
+ className: "font-medium",
454
+ children: e.name
455
+ }), /* @__PURE__ */ _("span", { children: [e.value, " bookings"] })]
456
+ }), /* @__PURE__ */ g("div", {
457
+ className: "mt-1 h-2 overflow-hidden rounded-full bg-muted",
458
+ children: /* @__PURE__ */ g("div", {
459
+ className: "h-2 rounded-full bg-primary",
460
+ style: { width: `${e.value / L * 100}%` }
461
+ })
462
+ })]
463
+ })]
464
+ }, e.name))
465
+ })] }), /* @__PURE__ */ _(b, { children: [/* @__PURE__ */ g(S, { children: /* @__PURE__ */ g(C, {
466
+ className: "text-base",
467
+ children: "Quick Stats"
468
+ }) }), /* @__PURE__ */ g(x, {
469
+ className: "space-y-4",
470
+ children: [
471
+ {
472
+ label: "Total Bookings",
473
+ value: E.reduce((e, t) => e + t.value, 0).toLocaleString(),
474
+ icon: d
475
+ },
476
+ {
477
+ label: "Avg. Booking Value",
478
+ value: "$3,804",
479
+ icon: o
480
+ },
481
+ {
482
+ label: "Completion Rate",
483
+ value: "96.5%",
484
+ icon: m
485
+ },
486
+ {
487
+ label: "Client Satisfaction",
488
+ value: "4.7/5.0",
489
+ icon: f
490
+ }
491
+ ].map(({ label: e, value: t, icon: n }) => /* @__PURE__ */ _("div", {
492
+ className: "flex items-center justify-between rounded-lg border p-3",
493
+ children: [/* @__PURE__ */ _("div", {
494
+ className: "flex items-center gap-3",
495
+ children: [/* @__PURE__ */ g(n, { className: "h-5 w-5 text-muted-foreground" }), /* @__PURE__ */ g("span", {
496
+ className: "text-sm font-medium",
497
+ children: e
498
+ })]
499
+ }), /* @__PURE__ */ g("span", {
500
+ className: "text-lg font-bold",
501
+ children: t
502
+ })]
503
+ }, e))
504
+ })] })]
505
+ })
506
+ ]
507
+ });
508
+ }
509
+ //#endregion
510
+ export { w as AdminReportsPage };
511
+
512
+ //# sourceMappingURL=AdminReportsPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdminReportsPage.js","names":[],"sources":["../../../src/proserviceworld/pages/AdminReportsPage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { Badge, Button, Card, CardContent, CardHeader, CardTitle } from '@burdenoff/fe-libs/ui';\nimport {\n TrendingUp,\n TrendingDown,\n Minus,\n Download,\n FileText,\n BarChart3,\n PieChart,\n Calendar,\n Filter,\n Users,\n DollarSign,\n ShoppingCart,\n Star,\n AlertTriangle,\n ArrowUpRight,\n Shield,\n} from 'lucide-react';\nimport { useProServiceWorldStore } from '../store/proserviceworldStore';\n\ntype ReportTab = 'overview' | 'users' | 'revenue' | 'bookings';\ntype TimeRange = '7d' | '30d' | '90d' | '1y';\n\nexport function AdminReportsPage() {\n const { adminReportMetrics, revenueData, servicePerformance, geographicData, adminUsers } =\n useProServiceWorldStore();\n const [activeTab, setActiveTab] = useState<ReportTab>('overview');\n const [timeRange, setTimeRange] = useState<TimeRange>('30d');\n\n const tabs: { key: ReportTab; label: string; icon: typeof BarChart3 }[] = [\n { key: 'overview', label: 'Overview', icon: BarChart3 },\n { key: 'users', label: 'Users', icon: Users },\n { key: 'revenue', label: 'Revenue', icon: DollarSign },\n { key: 'bookings', label: 'Bookings', icon: ShoppingCart },\n ];\n\n const changeIcon = (type: string) => {\n if (type === 'positive') return <TrendingUp className=\"h-4 w-4 text-green-500\" />;\n if (type === 'negative') return <TrendingDown className=\"h-4 w-4 text-red-500\" />;\n return <Minus className=\"h-4 w-4 text-gray-400\" />;\n };\n\n const metricIcons = [Users, Shield, ShoppingCart, DollarSign, Star, AlertTriangle];\n\n const maxRevenue = Math.max(...revenueData.map((d) => d.value));\n const maxServiceBookings = Math.max(...servicePerformance.map((d) => d.value));\n\n // Role distribution\n const roleCounts = adminUsers.reduce<Record<string, number>>((acc, u) => {\n acc[u.role] = (acc[u.role] ?? 0) + 1;\n return acc;\n }, {});\n\n // Status distribution\n const statusCounts = adminUsers.reduce<Record<string, number>>((acc, u) => {\n acc[u.status] = (acc[u.status] ?? 0) + 1;\n return acc;\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\">Admin Reports</h1>\n <p className=\"text-sm text-muted-foreground\">\n Platform analytics, performance metrics, and operational reports.\n </p>\n </div>\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" size=\"sm\">\n <FileText className=\"mr-2 h-4 w-4\" /> Generate Report\n </Button>\n <Button variant=\"outline\" size=\"sm\">\n <Download className=\"mr-2 h-4 w-4\" /> Export CSV\n </Button>\n </div>\n </div>\n\n {/* Time Range + Tabs */}\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\n <div className=\"flex gap-1 border-b\">\n {tabs.map(({ key, label, icon: Icon }) => (\n <button\n key={key}\n onClick={() => setActiveTab(key)}\n className={`flex items-center gap-2 border-b-2 px-4 py-2 text-sm font-medium transition-colors ${\n activeTab === key\n ? 'border-primary text-primary'\n : 'border-transparent text-muted-foreground hover:text-foreground'\n }`}\n >\n <Icon className=\"h-4 w-4\" />\n {label}\n </button>\n ))}\n </div>\n <div className=\"flex items-center gap-2\">\n <Calendar className=\"h-4 w-4 text-muted-foreground\" />\n <div className=\"flex rounded border\">\n {(['7d', '30d', '90d', '1y'] as TimeRange[]).map((range) => (\n <button\n key={range}\n onClick={() => setTimeRange(range)}\n className={`px-3 py-1 text-xs font-medium ${\n timeRange === range\n ? 'bg-primary text-primary-foreground'\n : 'text-muted-foreground hover:bg-muted/50'\n }`}\n >\n {range}\n </button>\n ))}\n </div>\n </div>\n </div>\n\n {/* Metric Cards */}\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {adminReportMetrics.map((metric, i) => {\n const MetricIcon = metricIcons[i % metricIcons.length] ?? BarChart3;\n return (\n <Card key={i}>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <MetricIcon className=\"h-4 w-4 text-muted-foreground\" />\n <p className=\"text-sm font-medium text-muted-foreground\">{metric.label}</p>\n </div>\n {changeIcon(metric.changeType)}\n </div>\n <p className=\"mt-2 text-3xl font-bold\">{metric.value}</p>\n <p\n className={`mt-1 flex items-center gap-1 text-xs ${\n metric.changeType === 'positive'\n ? 'text-green-600'\n : metric.changeType === 'negative'\n ? 'text-red-600'\n : 'text-gray-500'\n }`}\n >\n <ArrowUpRight className=\"h-3 w-3\" />\n {metric.change} vs last period\n </p>\n </CardContent>\n </Card>\n );\n })}\n </div>\n\n {/* Overview Tab */}\n {activeTab === 'overview' && (\n <div className=\"grid gap-6 lg:grid-cols-2\">\n {/* Revenue trend */}\n <Card>\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <CardTitle className=\"text-base\">Platform Revenue</CardTitle>\n <Badge variant=\"secondary\">Monthly</Badge>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {revenueData.map((point) => (\n <div key={point.name} className=\"flex items-center gap-3\">\n <span className=\"w-10 text-xs text-muted-foreground\">{point.name}</span>\n <div className=\"flex-1 h-5 bg-muted rounded overflow-hidden\">\n <div\n className=\"h-5 bg-primary rounded\"\n style={{ width: `${(point.value / maxRevenue) * 100}%` }}\n />\n </div>\n <span className=\"w-16 text-right text-xs font-medium\">\n ${(point.value / 1000).toFixed(1)}k\n </span>\n </div>\n ))}\n </CardContent>\n </Card>\n\n {/* Service breakdown */}\n <Card>\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <CardTitle className=\"text-base\">Service Bookings</CardTitle>\n <Badge variant=\"secondary\">Total</Badge>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {[...servicePerformance]\n .sort((a, b) => b.value - a.value)\n .map((service) => (\n <div key={service.name} className=\"flex items-center gap-3\">\n <span className=\"w-32 truncate text-xs text-muted-foreground\">\n {service.name}\n </span>\n <div className=\"flex-1 h-5 bg-muted rounded overflow-hidden\">\n <div\n className=\"h-5 bg-blue-500 rounded\"\n style={{ width: `${(service.value / maxServiceBookings) * 100}%` }}\n />\n </div>\n <span className=\"w-12 text-right text-xs font-medium\">{service.value}</span>\n </div>\n ))}\n </CardContent>\n </Card>\n\n {/* Geographic revenue */}\n <Card className=\"lg:col-span-2\">\n <CardHeader>\n <CardTitle className=\"text-base\">Revenue by Region</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b text-left text-muted-foreground\">\n <th className=\"p-3\">Region</th>\n <th className=\"p-3 text-right\">Clients</th>\n <th className=\"p-3 text-right\">Revenue</th>\n <th className=\"p-3 text-right\">Avg. per Client</th>\n <th className=\"p-3\">Share</th>\n </tr>\n </thead>\n <tbody>\n {geographicData.map((geo) => {\n const totalRevenue = geographicData.reduce((s, g) => s + g.revenue, 0);\n const pct = Math.round((geo.revenue / totalRevenue) * 100);\n const avgPerClient = Math.round(geo.revenue / geo.clients);\n return (\n <tr key={geo.country} className=\"border-b hover:bg-muted/50\">\n <td className=\"p-3 font-medium\">{geo.country}</td>\n <td className=\"p-3 text-right\">{geo.clients}</td>\n <td className=\"p-3 text-right font-medium\">\n ${(geo.revenue / 1000).toFixed(0)}k\n </td>\n <td className=\"p-3 text-right text-muted-foreground\">\n ${avgPerClient.toLocaleString()}\n </td>\n <td className=\"p-3\">\n <div className=\"flex items-center gap-2\">\n <div className=\"h-2 flex-1 overflow-hidden rounded-full bg-muted\">\n <div\n className=\"h-2 rounded-full bg-primary\"\n style={{ width: `${pct}%` }}\n />\n </div>\n <span className=\"w-10 text-right text-xs\">{pct}%</span>\n </div>\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n </CardContent>\n </Card>\n </div>\n )}\n\n {/* Users Tab */}\n {activeTab === 'users' && (\n <div className=\"grid gap-6 lg:grid-cols-2\">\n <Card>\n <CardHeader>\n <CardTitle className=\"text-base\">User Role Distribution</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {Object.entries(roleCounts).map(([role, count]) => {\n const pct = Math.round((count / adminUsers.length) * 100);\n const roleColors: Record<string, string> = {\n client: 'bg-blue-500',\n provider: 'bg-green-500',\n admin: 'bg-red-500',\n team_member: 'bg-purple-500',\n };\n return (\n <div key={role} className=\"flex items-center gap-3\">\n <span className=\"w-24 text-sm font-medium capitalize\">\n {role.replace('_', ' ')}\n </span>\n <div className=\"flex-1 h-5 bg-muted rounded overflow-hidden\">\n <div\n className={`h-5 rounded ${roleColors[role] ?? 'bg-gray-400'}`}\n style={{ width: `${pct}%` }}\n />\n </div>\n <span className=\"w-16 text-right text-sm\">\n {count} ({pct}%)\n </span>\n </div>\n );\n })}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"text-base\">User Status Distribution</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {Object.entries(statusCounts).map(([status, count]) => {\n const pct = Math.round((count / adminUsers.length) * 100);\n const statusColors: Record<string, string> = {\n active: 'bg-green-500',\n suspended: 'bg-orange-500',\n pending: 'bg-yellow-500',\n banned: 'bg-red-500',\n };\n return (\n <div key={status} className=\"flex items-center gap-3\">\n <span className=\"w-24 text-sm font-medium capitalize\">{status}</span>\n <div className=\"flex-1 h-5 bg-muted rounded overflow-hidden\">\n <div\n className={`h-5 rounded ${statusColors[status] ?? 'bg-gray-400'}`}\n style={{ width: `${pct}%` }}\n />\n </div>\n <span className=\"w-16 text-right text-sm\">\n {count} ({pct}%)\n </span>\n </div>\n );\n })}\n </CardContent>\n </Card>\n\n {/* Top users by spend */}\n <Card className=\"lg:col-span-2\">\n <CardHeader>\n <CardTitle className=\"text-base\">Top Users by Spending</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-2\">\n {[...adminUsers]\n .filter((u) => u.totalSpent > 0)\n .sort((a, b) => b.totalSpent - a.totalSpent)\n .slice(0, 5)\n .map((user, idx) => (\n <div\n key={user.id}\n className=\"flex items-center justify-between rounded-lg border p-3\"\n >\n <div className=\"flex items-center gap-3\">\n <span className=\"flex h-8 w-8 items-center justify-center rounded-full bg-primary/10 text-sm font-bold text-primary\">\n {idx + 1}\n </span>\n <div>\n <p className=\"font-medium\">{user.name}</p>\n <p className=\"text-xs text-muted-foreground\">{user.email}</p>\n </div>\n </div>\n <div className=\"text-right\">\n <p className=\"font-bold\">${user.totalSpent.toLocaleString()}</p>\n <p className=\"text-xs text-muted-foreground\">\n {user.bookingsCount} bookings\n </p>\n </div>\n </div>\n ))}\n </div>\n </CardContent>\n </Card>\n </div>\n )}\n\n {/* Revenue Tab */}\n {activeTab === 'revenue' && (\n <div className=\"space-y-6\">\n <Card>\n <CardHeader>\n <CardTitle className=\"text-base\">Monthly Revenue Comparison</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {revenueData.map((point) => {\n const growth = point.prev\n ? (((point.value - point.prev) / point.prev) * 100).toFixed(1)\n : '0';\n const isPositive = point.prev ? point.value >= point.prev : true;\n return (\n <div key={point.name} className=\"rounded-lg border p-4\">\n <div className=\"flex items-center justify-between\">\n <div>\n <p className=\"font-medium\">{point.name} 2025</p>\n <div className=\"mt-1 flex items-center gap-4 text-sm text-muted-foreground\">\n <span>Current: ${(point.value / 1000).toFixed(1)}k</span>\n <span>Previous: ${((point.prev ?? 0) / 1000).toFixed(1)}k</span>\n </div>\n </div>\n <Badge variant={isPositive ? 'default' : 'destructive'}>\n {isPositive ? '+' : ''}\n {growth}%\n </Badge>\n </div>\n <div className=\"mt-3 flex gap-1 h-4\">\n <div\n className=\"h-4 rounded bg-primary/30\"\n style={{ width: `${((point.prev ?? 0) / maxRevenue) * 100}%` }}\n />\n <div\n className=\"h-4 rounded bg-primary\"\n style={{\n width: `${Math.max(0, ((point.value - (point.prev ?? 0)) / maxRevenue) * 100)}%`,\n }}\n />\n </div>\n </div>\n );\n })}\n </CardContent>\n </Card>\n </div>\n )}\n\n {/* Bookings Tab */}\n {activeTab === 'bookings' && (\n <div className=\"grid gap-6 lg:grid-cols-2\">\n <Card>\n <CardHeader>\n <CardTitle className=\"text-base\">Bookings by Service Category</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {[...servicePerformance]\n .sort((a, b) => b.value - a.value)\n .map((service, idx) => (\n <div key={service.name} className=\"flex items-center gap-3\">\n <span className=\"w-6 text-sm font-bold text-muted-foreground\">#{idx + 1}</span>\n <div className=\"flex-1\">\n <div className=\"flex items-center justify-between text-sm\">\n <span className=\"font-medium\">{service.name}</span>\n <span>{service.value} bookings</span>\n </div>\n <div className=\"mt-1 h-2 overflow-hidden rounded-full bg-muted\">\n <div\n className=\"h-2 rounded-full bg-primary\"\n style={{ width: `${(service.value / maxServiceBookings) * 100}%` }}\n />\n </div>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"text-base\">Quick Stats</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {[\n {\n label: 'Total Bookings',\n value: servicePerformance.reduce((s, p) => s + p.value, 0).toLocaleString(),\n icon: ShoppingCart,\n },\n { label: 'Avg. Booking Value', value: '$3,804', icon: DollarSign },\n { label: 'Completion Rate', value: '96.5%', icon: TrendingUp },\n { label: 'Client Satisfaction', value: '4.7/5.0', icon: Star },\n ].map(({ label, value, icon: Icon }) => (\n <div\n key={label}\n className=\"flex items-center justify-between rounded-lg border p-3\"\n >\n <div className=\"flex items-center gap-3\">\n <Icon className=\"h-5 w-5 text-muted-foreground\" />\n <span className=\"text-sm font-medium\">{label}</span>\n </div>\n <span className=\"text-lg font-bold\">{value}</span>\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function AdminUsersPage(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=AdminUsersPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdminUsersPage.d.ts","sourceRoot":"","sources":["../../../src/proserviceworld/pages/AdminUsersPage.tsx"],"names":[],"mappings":"AAmDA,wBAAgB,cAAc,4CA2S7B"}