@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.
- package/README.md +12 -0
- package/dist/dev/main.d.ts +2 -0
- package/dist/dev/main.d.ts.map +1 -0
- package/dist/generated/global-operations.d.ts +2 -0
- package/dist/generated/global-operations.d.ts.map +1 -0
- package/dist/generated/global-types.d.ts +18199 -0
- package/dist/generated/global-types.d.ts.map +1 -0
- package/dist/generated/wspace-operations.d.ts +2 -0
- package/dist/generated/wspace-operations.d.ts.map +1 -0
- package/dist/generated/wspace-types.d.ts +43046 -0
- package/dist/generated/wspace-types.d.ts.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/proserviceworld/ProServiceWorldRoot.d.ts +5 -0
- package/dist/proserviceworld/ProServiceWorldRoot.d.ts.map +1 -0
- package/dist/proserviceworld/ProServiceWorldRoot.js +151 -0
- package/dist/proserviceworld/ProServiceWorldRoot.js.map +1 -0
- package/dist/proserviceworld/ProServiceWorldRoutes.d.ts +2 -0
- package/dist/proserviceworld/ProServiceWorldRoutes.d.ts.map +1 -0
- package/dist/proserviceworld/ProServiceWorldRoutes.js +91 -0
- package/dist/proserviceworld/ProServiceWorldRoutes.js.map +1 -0
- package/dist/proserviceworld/index.d.ts +5 -0
- package/dist/proserviceworld/index.d.ts.map +1 -0
- package/dist/proserviceworld/index.js +3 -0
- package/dist/proserviceworld/pages/AdminReportsPage.d.ts +2 -0
- package/dist/proserviceworld/pages/AdminReportsPage.d.ts.map +1 -0
- package/dist/proserviceworld/pages/AdminReportsPage.js +512 -0
- package/dist/proserviceworld/pages/AdminReportsPage.js.map +1 -0
- package/dist/proserviceworld/pages/AdminUsersPage.d.ts +2 -0
- package/dist/proserviceworld/pages/AdminUsersPage.d.ts.map +1 -0
- package/dist/proserviceworld/pages/AdminUsersPage.js +444 -0
- package/dist/proserviceworld/pages/AdminUsersPage.js.map +1 -0
- package/dist/proserviceworld/pages/AnalyticsPage.d.ts +2 -0
- package/dist/proserviceworld/pages/AnalyticsPage.d.ts.map +1 -0
- package/dist/proserviceworld/pages/AnalyticsPage.js +433 -0
- package/dist/proserviceworld/pages/AnalyticsPage.js.map +1 -0
- package/dist/proserviceworld/pages/BookingsPage.d.ts +2 -0
- package/dist/proserviceworld/pages/BookingsPage.d.ts.map +1 -0
- package/dist/proserviceworld/pages/BookingsPage.js +425 -0
- package/dist/proserviceworld/pages/BookingsPage.js.map +1 -0
- package/dist/proserviceworld/pages/DashboardPage.d.ts +2 -0
- package/dist/proserviceworld/pages/DashboardPage.d.ts.map +1 -0
- package/dist/proserviceworld/pages/DashboardPage.js +583 -0
- package/dist/proserviceworld/pages/DashboardPage.js.map +1 -0
- package/dist/proserviceworld/pages/DocumentsPage.d.ts +2 -0
- package/dist/proserviceworld/pages/DocumentsPage.d.ts.map +1 -0
- package/dist/proserviceworld/pages/DocumentsPage.js +494 -0
- package/dist/proserviceworld/pages/DocumentsPage.js.map +1 -0
- package/dist/proserviceworld/pages/MessagesPage.d.ts +2 -0
- package/dist/proserviceworld/pages/MessagesPage.d.ts.map +1 -0
- package/dist/proserviceworld/pages/MessagesPage.js +229 -0
- package/dist/proserviceworld/pages/MessagesPage.js.map +1 -0
- package/dist/proserviceworld/pages/PaymentsPage.d.ts +2 -0
- package/dist/proserviceworld/pages/PaymentsPage.d.ts.map +1 -0
- package/dist/proserviceworld/pages/PaymentsPage.js +479 -0
- package/dist/proserviceworld/pages/PaymentsPage.js.map +1 -0
- package/dist/proserviceworld/pages/ProjectsPage.d.ts +2 -0
- package/dist/proserviceworld/pages/ProjectsPage.d.ts.map +1 -0
- package/dist/proserviceworld/pages/ProjectsPage.js +547 -0
- package/dist/proserviceworld/pages/ProjectsPage.js.map +1 -0
- package/dist/proserviceworld/pages/ProviderDetailPage.d.ts +2 -0
- package/dist/proserviceworld/pages/ProviderDetailPage.d.ts.map +1 -0
- package/dist/proserviceworld/pages/ProviderDetailPage.js +464 -0
- package/dist/proserviceworld/pages/ProviderDetailPage.js.map +1 -0
- package/dist/proserviceworld/pages/ProvidersPage.d.ts +2 -0
- package/dist/proserviceworld/pages/ProvidersPage.d.ts.map +1 -0
- package/dist/proserviceworld/pages/ProvidersPage.js +342 -0
- package/dist/proserviceworld/pages/ProvidersPage.js.map +1 -0
- package/dist/proserviceworld/pages/ReviewsPage.d.ts +2 -0
- package/dist/proserviceworld/pages/ReviewsPage.d.ts.map +1 -0
- package/dist/proserviceworld/pages/ReviewsPage.js +339 -0
- package/dist/proserviceworld/pages/ReviewsPage.js.map +1 -0
- package/dist/proserviceworld/pages/ServiceDetailsPage.d.ts +2 -0
- package/dist/proserviceworld/pages/ServiceDetailsPage.d.ts.map +1 -0
- package/dist/proserviceworld/pages/ServiceDetailsPage.js +563 -0
- package/dist/proserviceworld/pages/ServiceDetailsPage.js.map +1 -0
- package/dist/proserviceworld/pages/ServicesPage.d.ts +2 -0
- package/dist/proserviceworld/pages/ServicesPage.d.ts.map +1 -0
- package/dist/proserviceworld/pages/ServicesPage.js +337 -0
- package/dist/proserviceworld/pages/ServicesPage.js.map +1 -0
- package/dist/proserviceworld/pages/VerificationPage.d.ts +2 -0
- package/dist/proserviceworld/pages/VerificationPage.d.ts.map +1 -0
- package/dist/proserviceworld/pages/VerificationPage.js +357 -0
- package/dist/proserviceworld/pages/VerificationPage.js.map +1 -0
- package/dist/proserviceworld/providers/ProServiceWorldProvider.d.ts +6 -0
- package/dist/proserviceworld/providers/ProServiceWorldProvider.d.ts.map +1 -0
- package/dist/proserviceworld/providers/ProServiceWorldProvider.js +27 -0
- package/dist/proserviceworld/providers/ProServiceWorldProvider.js.map +1 -0
- package/dist/proserviceworld/store/proserviceworldStore.d.ts +32 -0
- package/dist/proserviceworld/store/proserviceworldStore.d.ts.map +1 -0
- package/dist/proserviceworld/store/proserviceworldStore.js +2490 -0
- package/dist/proserviceworld/store/proserviceworldStore.js.map +1 -0
- package/dist/proserviceworld/types/index.d.ts +338 -0
- package/dist/proserviceworld/types/index.d.ts.map +1 -0
- package/dist/proserviceworld/utils/cn.d.ts +4 -0
- package/dist/proserviceworld/utils/cn.d.ts.map +1 -0
- package/dist/proserviceworld/utils/i18n.d.ts +6 -0
- package/dist/proserviceworld/utils/i18n.d.ts.map +1 -0
- package/dist/proserviceworld/utils/i18n.js +15 -0
- package/dist/proserviceworld/utils/i18n.js.map +1 -0
- package/dist/proserviceworld/utils/navigation.d.ts +2 -0
- package/dist/proserviceworld/utils/navigation.d.ts.map +1 -0
- package/dist/proserviceworld/utils/navigation.js +8 -0
- package/dist/proserviceworld/utils/navigation.js.map +1 -0
- package/package.json +107 -0
|
@@ -0,0 +1,479 @@
|
|
|
1
|
+
import { useProServiceWorldStore as e } from "../store/proserviceworldStore.js";
|
|
2
|
+
import { useMemo as t, useState as n } from "react";
|
|
3
|
+
import { ArrowDownLeft as r, ArrowUpRight as i, Building2 as a, Clock as o, CreditCard as s, DollarSign as c, Download as l, FileText as u, Plus as d, RotateCcw as f, Search as p, Shield as m, Wallet 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, Input as w } from "@burdenoff/fe-libs/ui";
|
|
6
|
+
//#region src/proserviceworld/pages/PaymentsPage.tsx
|
|
7
|
+
function T() {
|
|
8
|
+
let { transactions: T, paymentMethods: E, invoices: D } = e(), [O, k] = n("overview"), [A, j] = n(""), [M, N] = n("all"), P = T.filter((e) => e.type === "outgoing" && e.status === "completed").reduce((e, t) => e + t.amount, 0), F = T.filter((e) => e.status === "pending").reduce((e, t) => e + t.amount, 0), I = T.filter((e) => e.status === "completed").reduce((e, t) => e + t.fees, 0), L = T.filter((e) => e.type === "refund" && e.status === "completed").reduce((e, t) => e + t.amount, 0), R = t(() => {
|
|
9
|
+
let e = [...T];
|
|
10
|
+
if (M !== "all" && (e = e.filter((e) => e.status === M)), A.trim()) {
|
|
11
|
+
let t = A.toLowerCase();
|
|
12
|
+
e = e.filter((e) => e.description.toLowerCase().includes(t) || e.counterparty.toLowerCase().includes(t) || (e.serviceName?.toLowerCase().includes(t) ?? !1));
|
|
13
|
+
}
|
|
14
|
+
return e.sort((e, t) => new Date(t.createdAt).getTime() - new Date(e.createdAt).getTime());
|
|
15
|
+
}, [
|
|
16
|
+
T,
|
|
17
|
+
M,
|
|
18
|
+
A
|
|
19
|
+
]), z = (e) => e === "outgoing" ? /* @__PURE__ */ g(i, { className: "h-4 w-4 text-red-500" }) : e === "refund" ? /* @__PURE__ */ g(f, { className: "h-4 w-4 text-green-500" }) : /* @__PURE__ */ g(r, { className: "h-4 w-4 text-blue-500" }), B = (e) => /* @__PURE__ */ g(v, {
|
|
20
|
+
variant: {
|
|
21
|
+
completed: "default",
|
|
22
|
+
pending: "secondary",
|
|
23
|
+
failed: "destructive",
|
|
24
|
+
cancelled: "outline"
|
|
25
|
+
}[e] ?? "secondary",
|
|
26
|
+
children: e
|
|
27
|
+
}), V = (e) => g(e === "card" ? s : e === "bank" ? a : h, { className: "h-5 w-5" });
|
|
28
|
+
return /* @__PURE__ */ _("div", {
|
|
29
|
+
className: "space-y-6 p-6",
|
|
30
|
+
children: [
|
|
31
|
+
/* @__PURE__ */ _("div", {
|
|
32
|
+
className: "flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between",
|
|
33
|
+
children: [/* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("h1", {
|
|
34
|
+
className: "text-2xl font-semibold",
|
|
35
|
+
children: "Payments"
|
|
36
|
+
}), /* @__PURE__ */ g("p", {
|
|
37
|
+
className: "text-sm text-muted-foreground",
|
|
38
|
+
children: "Track transactions, manage payment methods, and view invoices."
|
|
39
|
+
})] }), /* @__PURE__ */ _(y, {
|
|
40
|
+
size: "sm",
|
|
41
|
+
children: [/* @__PURE__ */ g(d, { className: "mr-2 h-4 w-4" }), " Make Payment"]
|
|
42
|
+
})]
|
|
43
|
+
}),
|
|
44
|
+
/* @__PURE__ */ g("div", {
|
|
45
|
+
className: "flex gap-1 border-b",
|
|
46
|
+
children: [
|
|
47
|
+
{
|
|
48
|
+
key: "overview",
|
|
49
|
+
label: "Overview"
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
key: "transactions",
|
|
53
|
+
label: "Transactions"
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
key: "methods",
|
|
57
|
+
label: "Payment Methods"
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
key: "invoices",
|
|
61
|
+
label: "Invoices"
|
|
62
|
+
}
|
|
63
|
+
].map(({ key: e, label: t }) => /* @__PURE__ */ g("button", {
|
|
64
|
+
onClick: () => k(e),
|
|
65
|
+
className: `border-b-2 px-4 py-2 text-sm font-medium transition-colors ${O === e ? "border-primary text-primary" : "border-transparent text-muted-foreground hover:text-foreground"}`,
|
|
66
|
+
children: t
|
|
67
|
+
}, e))
|
|
68
|
+
}),
|
|
69
|
+
O === "overview" && /* @__PURE__ */ _("div", {
|
|
70
|
+
className: "space-y-6",
|
|
71
|
+
children: [/* @__PURE__ */ _("div", {
|
|
72
|
+
className: "grid gap-4 sm:grid-cols-2 lg:grid-cols-4",
|
|
73
|
+
children: [
|
|
74
|
+
/* @__PURE__ */ g(b, { children: /* @__PURE__ */ g(x, {
|
|
75
|
+
className: "pt-4",
|
|
76
|
+
children: /* @__PURE__ */ _("div", {
|
|
77
|
+
className: "flex items-center gap-3",
|
|
78
|
+
children: [/* @__PURE__ */ g("div", {
|
|
79
|
+
className: "rounded-lg bg-red-100 p-2 dark:bg-red-950",
|
|
80
|
+
children: /* @__PURE__ */ g(i, { className: "h-5 w-5 text-red-600" })
|
|
81
|
+
}), /* @__PURE__ */ _("div", { children: [/* @__PURE__ */ _("p", {
|
|
82
|
+
className: "text-2xl font-bold",
|
|
83
|
+
children: ["$", P.toLocaleString()]
|
|
84
|
+
}), /* @__PURE__ */ g("p", {
|
|
85
|
+
className: "text-xs text-muted-foreground",
|
|
86
|
+
children: "Total Spent"
|
|
87
|
+
})] })]
|
|
88
|
+
})
|
|
89
|
+
}) }),
|
|
90
|
+
/* @__PURE__ */ g(b, { children: /* @__PURE__ */ g(x, {
|
|
91
|
+
className: "pt-4",
|
|
92
|
+
children: /* @__PURE__ */ _("div", {
|
|
93
|
+
className: "flex items-center gap-3",
|
|
94
|
+
children: [/* @__PURE__ */ g("div", {
|
|
95
|
+
className: "rounded-lg bg-yellow-100 p-2 dark:bg-yellow-950",
|
|
96
|
+
children: /* @__PURE__ */ g(o, { className: "h-5 w-5 text-yellow-600" })
|
|
97
|
+
}), /* @__PURE__ */ _("div", { children: [/* @__PURE__ */ _("p", {
|
|
98
|
+
className: "text-2xl font-bold",
|
|
99
|
+
children: ["$", F.toLocaleString()]
|
|
100
|
+
}), /* @__PURE__ */ g("p", {
|
|
101
|
+
className: "text-xs text-muted-foreground",
|
|
102
|
+
children: "Pending"
|
|
103
|
+
})] })]
|
|
104
|
+
})
|
|
105
|
+
}) }),
|
|
106
|
+
/* @__PURE__ */ g(b, { children: /* @__PURE__ */ g(x, {
|
|
107
|
+
className: "pt-4",
|
|
108
|
+
children: /* @__PURE__ */ _("div", {
|
|
109
|
+
className: "flex items-center gap-3",
|
|
110
|
+
children: [/* @__PURE__ */ g("div", {
|
|
111
|
+
className: "rounded-lg bg-blue-100 p-2 dark:bg-blue-950",
|
|
112
|
+
children: /* @__PURE__ */ g(c, { className: "h-5 w-5 text-blue-600" })
|
|
113
|
+
}), /* @__PURE__ */ _("div", { children: [/* @__PURE__ */ _("p", {
|
|
114
|
+
className: "text-2xl font-bold",
|
|
115
|
+
children: ["$", I.toLocaleString()]
|
|
116
|
+
}), /* @__PURE__ */ g("p", {
|
|
117
|
+
className: "text-xs text-muted-foreground",
|
|
118
|
+
children: "Total Fees"
|
|
119
|
+
})] })]
|
|
120
|
+
})
|
|
121
|
+
}) }),
|
|
122
|
+
/* @__PURE__ */ g(b, { children: /* @__PURE__ */ g(x, {
|
|
123
|
+
className: "pt-4",
|
|
124
|
+
children: /* @__PURE__ */ _("div", {
|
|
125
|
+
className: "flex items-center gap-3",
|
|
126
|
+
children: [/* @__PURE__ */ g("div", {
|
|
127
|
+
className: "rounded-lg bg-green-100 p-2 dark:bg-green-950",
|
|
128
|
+
children: /* @__PURE__ */ g(f, { className: "h-5 w-5 text-green-600" })
|
|
129
|
+
}), /* @__PURE__ */ _("div", { children: [/* @__PURE__ */ _("p", {
|
|
130
|
+
className: "text-2xl font-bold",
|
|
131
|
+
children: ["$", L.toLocaleString()]
|
|
132
|
+
}), /* @__PURE__ */ g("p", {
|
|
133
|
+
className: "text-xs text-muted-foreground",
|
|
134
|
+
children: "Refunded"
|
|
135
|
+
})] })]
|
|
136
|
+
})
|
|
137
|
+
}) })
|
|
138
|
+
]
|
|
139
|
+
}), /* @__PURE__ */ _(b, { children: [/* @__PURE__ */ g(S, { children: /* @__PURE__ */ _("div", {
|
|
140
|
+
className: "flex items-center justify-between",
|
|
141
|
+
children: [/* @__PURE__ */ g(C, {
|
|
142
|
+
className: "text-base",
|
|
143
|
+
children: "Recent Transactions"
|
|
144
|
+
}), /* @__PURE__ */ g(y, {
|
|
145
|
+
variant: "outline",
|
|
146
|
+
size: "sm",
|
|
147
|
+
onClick: () => k("transactions"),
|
|
148
|
+
children: "View All"
|
|
149
|
+
})]
|
|
150
|
+
}) }), /* @__PURE__ */ g(x, { children: /* @__PURE__ */ g("div", {
|
|
151
|
+
className: "space-y-3",
|
|
152
|
+
children: T.slice(0, 5).map((e) => /* @__PURE__ */ _("div", {
|
|
153
|
+
className: "flex items-center justify-between rounded-lg border p-3",
|
|
154
|
+
children: [/* @__PURE__ */ _("div", {
|
|
155
|
+
className: "flex items-center gap-3",
|
|
156
|
+
children: [z(e.type), /* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("p", {
|
|
157
|
+
className: "text-sm font-medium",
|
|
158
|
+
children: e.description
|
|
159
|
+
}), /* @__PURE__ */ _("p", {
|
|
160
|
+
className: "text-xs text-muted-foreground",
|
|
161
|
+
children: [
|
|
162
|
+
e.counterparty,
|
|
163
|
+
" - ",
|
|
164
|
+
e.createdAt
|
|
165
|
+
]
|
|
166
|
+
})] })]
|
|
167
|
+
}), /* @__PURE__ */ _("div", {
|
|
168
|
+
className: "text-right",
|
|
169
|
+
children: [/* @__PURE__ */ _("p", {
|
|
170
|
+
className: `text-sm font-bold ${e.type === "refund" ? "text-green-600" : ""}`,
|
|
171
|
+
children: [
|
|
172
|
+
e.type === "refund" ? "+" : "-",
|
|
173
|
+
"$",
|
|
174
|
+
e.amount.toLocaleString()
|
|
175
|
+
]
|
|
176
|
+
}), B(e.status)]
|
|
177
|
+
})]
|
|
178
|
+
}, e.id))
|
|
179
|
+
}) })] })]
|
|
180
|
+
}),
|
|
181
|
+
O === "transactions" && /* @__PURE__ */ _("div", {
|
|
182
|
+
className: "space-y-4",
|
|
183
|
+
children: [/* @__PURE__ */ _("div", {
|
|
184
|
+
className: "flex flex-col gap-4 sm:flex-row sm:items-center",
|
|
185
|
+
children: [/* @__PURE__ */ _("div", {
|
|
186
|
+
className: "relative flex-1",
|
|
187
|
+
children: [/* @__PURE__ */ g(p, { className: "absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground" }), /* @__PURE__ */ g(w, {
|
|
188
|
+
placeholder: "Search transactions...",
|
|
189
|
+
value: A,
|
|
190
|
+
onChange: (e) => j(e.target.value),
|
|
191
|
+
className: "pl-10"
|
|
192
|
+
})]
|
|
193
|
+
}), /* @__PURE__ */ g("div", {
|
|
194
|
+
className: "flex gap-2",
|
|
195
|
+
children: [
|
|
196
|
+
"all",
|
|
197
|
+
"completed",
|
|
198
|
+
"pending",
|
|
199
|
+
"failed"
|
|
200
|
+
].map((e) => /* @__PURE__ */ g(y, {
|
|
201
|
+
variant: M === e ? "default" : "outline",
|
|
202
|
+
size: "sm",
|
|
203
|
+
onClick: () => N(e),
|
|
204
|
+
children: e === "all" ? "All" : e.charAt(0).toUpperCase() + e.slice(1)
|
|
205
|
+
}, e))
|
|
206
|
+
})]
|
|
207
|
+
}), /* @__PURE__ */ g(b, { children: /* @__PURE__ */ g(x, {
|
|
208
|
+
className: "pt-4",
|
|
209
|
+
children: /* @__PURE__ */ g("div", {
|
|
210
|
+
className: "overflow-x-auto",
|
|
211
|
+
children: /* @__PURE__ */ _("table", {
|
|
212
|
+
className: "w-full text-sm",
|
|
213
|
+
children: [/* @__PURE__ */ g("thead", { children: /* @__PURE__ */ _("tr", {
|
|
214
|
+
className: "border-b text-left text-muted-foreground",
|
|
215
|
+
children: [
|
|
216
|
+
/* @__PURE__ */ g("th", {
|
|
217
|
+
className: "p-3",
|
|
218
|
+
children: "Type"
|
|
219
|
+
}),
|
|
220
|
+
/* @__PURE__ */ g("th", {
|
|
221
|
+
className: "p-3",
|
|
222
|
+
children: "Description"
|
|
223
|
+
}),
|
|
224
|
+
/* @__PURE__ */ g("th", {
|
|
225
|
+
className: "p-3",
|
|
226
|
+
children: "Counterparty"
|
|
227
|
+
}),
|
|
228
|
+
/* @__PURE__ */ g("th", {
|
|
229
|
+
className: "p-3",
|
|
230
|
+
children: "Method"
|
|
231
|
+
}),
|
|
232
|
+
/* @__PURE__ */ g("th", {
|
|
233
|
+
className: "p-3 text-right",
|
|
234
|
+
children: "Amount"
|
|
235
|
+
}),
|
|
236
|
+
/* @__PURE__ */ g("th", {
|
|
237
|
+
className: "p-3 text-right",
|
|
238
|
+
children: "Fees"
|
|
239
|
+
}),
|
|
240
|
+
/* @__PURE__ */ g("th", {
|
|
241
|
+
className: "p-3 text-right",
|
|
242
|
+
children: "Net"
|
|
243
|
+
}),
|
|
244
|
+
/* @__PURE__ */ g("th", {
|
|
245
|
+
className: "p-3",
|
|
246
|
+
children: "Status"
|
|
247
|
+
}),
|
|
248
|
+
/* @__PURE__ */ g("th", {
|
|
249
|
+
className: "p-3",
|
|
250
|
+
children: "Date"
|
|
251
|
+
})
|
|
252
|
+
]
|
|
253
|
+
}) }), /* @__PURE__ */ g("tbody", { children: R.map((e) => /* @__PURE__ */ _("tr", {
|
|
254
|
+
className: "border-b hover:bg-muted/50",
|
|
255
|
+
children: [
|
|
256
|
+
/* @__PURE__ */ g("td", {
|
|
257
|
+
className: "p-3",
|
|
258
|
+
children: z(e.type)
|
|
259
|
+
}),
|
|
260
|
+
/* @__PURE__ */ g("td", {
|
|
261
|
+
className: "p-3 font-medium",
|
|
262
|
+
children: e.description
|
|
263
|
+
}),
|
|
264
|
+
/* @__PURE__ */ g("td", {
|
|
265
|
+
className: "p-3",
|
|
266
|
+
children: e.counterparty
|
|
267
|
+
}),
|
|
268
|
+
/* @__PURE__ */ g("td", {
|
|
269
|
+
className: "p-3",
|
|
270
|
+
children: /* @__PURE__ */ g(v, {
|
|
271
|
+
variant: "outline",
|
|
272
|
+
children: e.method.replace("_", " ")
|
|
273
|
+
})
|
|
274
|
+
}),
|
|
275
|
+
/* @__PURE__ */ _("td", {
|
|
276
|
+
className: `p-3 text-right font-medium ${e.type === "refund" ? "text-green-600" : ""}`,
|
|
277
|
+
children: [
|
|
278
|
+
e.type === "refund" ? "+" : "-",
|
|
279
|
+
"$",
|
|
280
|
+
e.amount.toLocaleString()
|
|
281
|
+
]
|
|
282
|
+
}),
|
|
283
|
+
/* @__PURE__ */ _("td", {
|
|
284
|
+
className: "p-3 text-right text-muted-foreground",
|
|
285
|
+
children: ["$", e.fees]
|
|
286
|
+
}),
|
|
287
|
+
/* @__PURE__ */ _("td", {
|
|
288
|
+
className: "p-3 text-right",
|
|
289
|
+
children: ["$", e.netAmount.toLocaleString()]
|
|
290
|
+
}),
|
|
291
|
+
/* @__PURE__ */ g("td", {
|
|
292
|
+
className: "p-3",
|
|
293
|
+
children: B(e.status)
|
|
294
|
+
}),
|
|
295
|
+
/* @__PURE__ */ g("td", {
|
|
296
|
+
className: "p-3 text-muted-foreground",
|
|
297
|
+
children: e.createdAt
|
|
298
|
+
})
|
|
299
|
+
]
|
|
300
|
+
}, e.id)) })]
|
|
301
|
+
})
|
|
302
|
+
})
|
|
303
|
+
}) })]
|
|
304
|
+
}),
|
|
305
|
+
O === "methods" && /* @__PURE__ */ g("div", {
|
|
306
|
+
className: "space-y-4",
|
|
307
|
+
children: /* @__PURE__ */ _("div", {
|
|
308
|
+
className: "grid gap-4 sm:grid-cols-2 lg:grid-cols-3",
|
|
309
|
+
children: [E.map((e) => /* @__PURE__ */ g(b, {
|
|
310
|
+
className: e.isDefault ? "border-primary" : "",
|
|
311
|
+
children: /* @__PURE__ */ _(x, {
|
|
312
|
+
className: "pt-6",
|
|
313
|
+
children: [
|
|
314
|
+
/* @__PURE__ */ _("div", {
|
|
315
|
+
className: "flex items-start justify-between",
|
|
316
|
+
children: [/* @__PURE__ */ _("div", {
|
|
317
|
+
className: "flex items-center gap-3",
|
|
318
|
+
children: [/* @__PURE__ */ g("div", {
|
|
319
|
+
className: "rounded-lg border p-2",
|
|
320
|
+
children: V(e.type)
|
|
321
|
+
}), /* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("p", {
|
|
322
|
+
className: "font-medium",
|
|
323
|
+
children: e.name
|
|
324
|
+
}), /* @__PURE__ */ g("p", {
|
|
325
|
+
className: "text-sm text-muted-foreground",
|
|
326
|
+
children: e.details
|
|
327
|
+
})] })]
|
|
328
|
+
}), e.isDefault && /* @__PURE__ */ g(v, { children: "Default" })]
|
|
329
|
+
}),
|
|
330
|
+
/* @__PURE__ */ _("div", {
|
|
331
|
+
className: "mt-4 flex items-center gap-4 text-sm",
|
|
332
|
+
children: [e.isVerified ? /* @__PURE__ */ _("span", {
|
|
333
|
+
className: "flex items-center gap-1 text-green-600",
|
|
334
|
+
children: [/* @__PURE__ */ g(m, { className: "h-4 w-4" }), " Verified"]
|
|
335
|
+
}) : /* @__PURE__ */ _("span", {
|
|
336
|
+
className: "flex items-center gap-1 text-yellow-600",
|
|
337
|
+
children: [/* @__PURE__ */ g(o, { className: "h-4 w-4" }), " Unverified"]
|
|
338
|
+
}), e.lastUsed && /* @__PURE__ */ _("span", {
|
|
339
|
+
className: "text-muted-foreground",
|
|
340
|
+
children: ["Last used: ", e.lastUsed]
|
|
341
|
+
})]
|
|
342
|
+
}),
|
|
343
|
+
/* @__PURE__ */ _("div", {
|
|
344
|
+
className: "mt-4 flex gap-2",
|
|
345
|
+
children: [!e.isDefault && /* @__PURE__ */ g(y, {
|
|
346
|
+
variant: "outline",
|
|
347
|
+
size: "sm",
|
|
348
|
+
className: "flex-1",
|
|
349
|
+
children: "Set Default"
|
|
350
|
+
}), /* @__PURE__ */ g(y, {
|
|
351
|
+
variant: "outline",
|
|
352
|
+
size: "sm",
|
|
353
|
+
className: "flex-1",
|
|
354
|
+
children: "Remove"
|
|
355
|
+
})]
|
|
356
|
+
})
|
|
357
|
+
]
|
|
358
|
+
})
|
|
359
|
+
}, e.id)), /* @__PURE__ */ g(b, {
|
|
360
|
+
className: "flex items-center justify-center border-dashed",
|
|
361
|
+
children: /* @__PURE__ */ _(x, {
|
|
362
|
+
className: "py-8 text-center",
|
|
363
|
+
children: [
|
|
364
|
+
/* @__PURE__ */ g(d, { className: "mx-auto h-8 w-8 text-muted-foreground" }),
|
|
365
|
+
/* @__PURE__ */ g("p", {
|
|
366
|
+
className: "mt-2 text-sm font-medium",
|
|
367
|
+
children: "Add Payment Method"
|
|
368
|
+
}),
|
|
369
|
+
/* @__PURE__ */ g("p", {
|
|
370
|
+
className: "text-xs text-muted-foreground",
|
|
371
|
+
children: "Add a new card, bank, or PayPal"
|
|
372
|
+
})
|
|
373
|
+
]
|
|
374
|
+
})
|
|
375
|
+
})]
|
|
376
|
+
})
|
|
377
|
+
}),
|
|
378
|
+
O === "invoices" && /* @__PURE__ */ g("div", {
|
|
379
|
+
className: "space-y-4",
|
|
380
|
+
children: /* @__PURE__ */ g(b, { children: /* @__PURE__ */ g(x, {
|
|
381
|
+
className: "pt-4",
|
|
382
|
+
children: /* @__PURE__ */ g("div", {
|
|
383
|
+
className: "overflow-x-auto",
|
|
384
|
+
children: /* @__PURE__ */ _("table", {
|
|
385
|
+
className: "w-full text-sm",
|
|
386
|
+
children: [/* @__PURE__ */ g("thead", { children: /* @__PURE__ */ _("tr", {
|
|
387
|
+
className: "border-b text-left text-muted-foreground",
|
|
388
|
+
children: [
|
|
389
|
+
/* @__PURE__ */ g("th", {
|
|
390
|
+
className: "p-3",
|
|
391
|
+
children: "Invoice #"
|
|
392
|
+
}),
|
|
393
|
+
/* @__PURE__ */ g("th", {
|
|
394
|
+
className: "p-3",
|
|
395
|
+
children: "Description"
|
|
396
|
+
}),
|
|
397
|
+
/* @__PURE__ */ g("th", {
|
|
398
|
+
className: "p-3",
|
|
399
|
+
children: "Client"
|
|
400
|
+
}),
|
|
401
|
+
/* @__PURE__ */ g("th", {
|
|
402
|
+
className: "p-3 text-right",
|
|
403
|
+
children: "Amount"
|
|
404
|
+
}),
|
|
405
|
+
/* @__PURE__ */ g("th", {
|
|
406
|
+
className: "p-3",
|
|
407
|
+
children: "Status"
|
|
408
|
+
}),
|
|
409
|
+
/* @__PURE__ */ g("th", {
|
|
410
|
+
className: "p-3",
|
|
411
|
+
children: "Due Date"
|
|
412
|
+
}),
|
|
413
|
+
/* @__PURE__ */ g("th", {
|
|
414
|
+
className: "p-3 text-right",
|
|
415
|
+
children: "Actions"
|
|
416
|
+
})
|
|
417
|
+
]
|
|
418
|
+
}) }), /* @__PURE__ */ g("tbody", { children: D.map((e) => /* @__PURE__ */ _("tr", {
|
|
419
|
+
className: "border-b hover:bg-muted/50",
|
|
420
|
+
children: [
|
|
421
|
+
/* @__PURE__ */ g("td", {
|
|
422
|
+
className: "p-3 font-medium",
|
|
423
|
+
children: e.number
|
|
424
|
+
}),
|
|
425
|
+
/* @__PURE__ */ g("td", {
|
|
426
|
+
className: "p-3",
|
|
427
|
+
children: e.description
|
|
428
|
+
}),
|
|
429
|
+
/* @__PURE__ */ g("td", {
|
|
430
|
+
className: "p-3",
|
|
431
|
+
children: e.clientName
|
|
432
|
+
}),
|
|
433
|
+
/* @__PURE__ */ _("td", {
|
|
434
|
+
className: "p-3 text-right font-medium",
|
|
435
|
+
children: ["$", e.amount.toLocaleString()]
|
|
436
|
+
}),
|
|
437
|
+
/* @__PURE__ */ g("td", {
|
|
438
|
+
className: "p-3",
|
|
439
|
+
children: /* @__PURE__ */ g(v, {
|
|
440
|
+
variant: {
|
|
441
|
+
paid: "default",
|
|
442
|
+
pending: "secondary",
|
|
443
|
+
overdue: "destructive"
|
|
444
|
+
}[e.status] ?? "secondary",
|
|
445
|
+
children: e.status
|
|
446
|
+
})
|
|
447
|
+
}),
|
|
448
|
+
/* @__PURE__ */ g("td", {
|
|
449
|
+
className: "p-3 text-muted-foreground",
|
|
450
|
+
children: e.dueDate
|
|
451
|
+
}),
|
|
452
|
+
/* @__PURE__ */ g("td", {
|
|
453
|
+
className: "p-3 text-right",
|
|
454
|
+
children: /* @__PURE__ */ _("div", {
|
|
455
|
+
className: "flex justify-end gap-1",
|
|
456
|
+
children: [/* @__PURE__ */ g(y, {
|
|
457
|
+
variant: "outline",
|
|
458
|
+
size: "sm",
|
|
459
|
+
children: /* @__PURE__ */ g(u, { className: "h-3 w-3" })
|
|
460
|
+
}), /* @__PURE__ */ g(y, {
|
|
461
|
+
variant: "outline",
|
|
462
|
+
size: "sm",
|
|
463
|
+
children: /* @__PURE__ */ g(l, { className: "h-3 w-3" })
|
|
464
|
+
})]
|
|
465
|
+
})
|
|
466
|
+
})
|
|
467
|
+
]
|
|
468
|
+
}, e.id)) })]
|
|
469
|
+
})
|
|
470
|
+
})
|
|
471
|
+
}) })
|
|
472
|
+
})
|
|
473
|
+
]
|
|
474
|
+
});
|
|
475
|
+
}
|
|
476
|
+
//#endregion
|
|
477
|
+
export { T as PaymentsPage };
|
|
478
|
+
|
|
479
|
+
//# sourceMappingURL=PaymentsPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PaymentsPage.js","names":[],"sources":["../../../src/proserviceworld/pages/PaymentsPage.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 DollarSign,\n CreditCard,\n Building2,\n Wallet,\n ArrowUpRight,\n ArrowDownLeft,\n RotateCcw,\n CheckCircle2,\n Clock,\n XCircle,\n Search,\n FileText,\n Plus,\n Shield,\n Download,\n} from 'lucide-react';\nimport { useProServiceWorldStore } from '../store/proserviceworldStore';\n\ntype PaymentTab = 'overview' | 'transactions' | 'methods' | 'invoices';\n\nexport function PaymentsPage() {\n const { transactions, paymentMethods, invoices } = useProServiceWorldStore();\n const [activeTab, setActiveTab] = useState<PaymentTab>('overview');\n const [searchQuery, setSearchQuery] = useState('');\n const [txnStatusFilter, setTxnStatusFilter] = useState<string>('all');\n\n // Overview stats\n const totalSpent = transactions\n .filter((t) => t.type === 'outgoing' && t.status === 'completed')\n .reduce((s, t) => s + t.amount, 0);\n const totalPending = transactions\n .filter((t) => t.status === 'pending')\n .reduce((s, t) => s + t.amount, 0);\n const totalFees = transactions\n .filter((t) => t.status === 'completed')\n .reduce((s, t) => s + t.fees, 0);\n const totalRefunded = transactions\n .filter((t) => t.type === 'refund' && t.status === 'completed')\n .reduce((s, t) => s + t.amount, 0);\n\n // Filter transactions\n const filteredTxns = useMemo(() => {\n let result = [...transactions];\n if (txnStatusFilter !== 'all') {\n result = result.filter((t) => t.status === txnStatusFilter);\n }\n if (searchQuery.trim()) {\n const q = searchQuery.toLowerCase();\n result = result.filter(\n (t) =>\n t.description.toLowerCase().includes(q) ||\n t.counterparty.toLowerCase().includes(q) ||\n (t.serviceName?.toLowerCase().includes(q) ?? false)\n );\n }\n return result.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());\n }, [transactions, txnStatusFilter, searchQuery]);\n\n const txnTypeIcon = (type: string) => {\n if (type === 'outgoing') return <ArrowUpRight className=\"h-4 w-4 text-red-500\" />;\n if (type === 'refund') return <RotateCcw className=\"h-4 w-4 text-green-500\" />;\n return <ArrowDownLeft className=\"h-4 w-4 text-blue-500\" />;\n };\n\n const statusBadge = (status: string) => {\n const variants: Record<string, 'default' | 'secondary' | 'destructive' | 'outline'> = {\n completed: 'default',\n pending: 'secondary',\n failed: 'destructive',\n cancelled: 'outline',\n };\n return <Badge variant={variants[status] ?? 'secondary'}>{status}</Badge>;\n };\n\n const methodIcon = (type: string) => {\n if (type === 'card') return <CreditCard className=\"h-5 w-5\" />;\n if (type === 'bank') return <Building2 className=\"h-5 w-5\" />;\n return <Wallet className=\"h-5 w-5\" />;\n };\n\n const tabs: { key: PaymentTab; label: string }[] = [\n { key: 'overview', label: 'Overview' },\n { key: 'transactions', label: 'Transactions' },\n { key: 'methods', label: 'Payment Methods' },\n { key: 'invoices', label: 'Invoices' },\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\">Payments</h1>\n <p className=\"text-sm text-muted-foreground\">\n Track transactions, manage payment methods, and view invoices.\n </p>\n </div>\n <Button size=\"sm\">\n <Plus className=\"mr-2 h-4 w-4\" /> Make Payment\n </Button>\n </div>\n\n {/* Tabs */}\n <div className=\"flex gap-1 border-b\">\n {tabs.map(({ key, label }) => (\n <button\n key={key}\n onClick={() => setActiveTab(key)}\n className={`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 {label}\n </button>\n ))}\n </div>\n\n {/* Overview Tab */}\n {activeTab === 'overview' && (\n <div className=\"space-y-6\">\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-red-100 p-2 dark:bg-red-950\">\n <ArrowUpRight className=\"h-5 w-5 text-red-600\" />\n </div>\n <div>\n <p className=\"text-2xl font-bold\">${totalSpent.toLocaleString()}</p>\n <p className=\"text-xs text-muted-foreground\">Total Spent</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 <Clock className=\"h-5 w-5 text-yellow-600\" />\n </div>\n <div>\n <p className=\"text-2xl font-bold\">${totalPending.toLocaleString()}</p>\n <p className=\"text-xs text-muted-foreground\">Pending</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-blue-100 p-2 dark:bg-blue-950\">\n <DollarSign className=\"h-5 w-5 text-blue-600\" />\n </div>\n <div>\n <p className=\"text-2xl font-bold\">${totalFees.toLocaleString()}</p>\n <p className=\"text-xs text-muted-foreground\">Total Fees</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 <RotateCcw className=\"h-5 w-5 text-green-600\" />\n </div>\n <div>\n <p className=\"text-2xl font-bold\">${totalRefunded.toLocaleString()}</p>\n <p className=\"text-xs text-muted-foreground\">Refunded</p>\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n\n {/* Recent transactions preview */}\n <Card>\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <CardTitle className=\"text-base\">Recent Transactions</CardTitle>\n <Button variant=\"outline\" size=\"sm\" onClick={() => setActiveTab('transactions')}>\n View All\n </Button>\n </div>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-3\">\n {transactions.slice(0, 5).map((txn) => (\n <div\n key={txn.id}\n className=\"flex items-center justify-between rounded-lg border p-3\"\n >\n <div className=\"flex items-center gap-3\">\n {txnTypeIcon(txn.type)}\n <div>\n <p className=\"text-sm font-medium\">{txn.description}</p>\n <p className=\"text-xs text-muted-foreground\">\n {txn.counterparty} - {txn.createdAt}\n </p>\n </div>\n </div>\n <div className=\"text-right\">\n <p\n className={`text-sm font-bold ${txn.type === 'refund' ? 'text-green-600' : ''}`}\n >\n {txn.type === 'refund' ? '+' : '-'}${txn.amount.toLocaleString()}\n </p>\n {statusBadge(txn.status)}\n </div>\n </div>\n ))}\n </div>\n </CardContent>\n </Card>\n </div>\n )}\n\n {/* Transactions Tab */}\n {activeTab === 'transactions' && (\n <div className=\"space-y-4\">\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 transactions...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"pl-10\"\n />\n </div>\n <div className=\"flex gap-2\">\n {['all', 'completed', 'pending', 'failed'].map((status) => (\n <Button\n key={status}\n variant={txnStatusFilter === status ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => setTxnStatusFilter(status)}\n >\n {status === 'all' ? 'All' : status.charAt(0).toUpperCase() + status.slice(1)}\n </Button>\n ))}\n </div>\n </div>\n\n <Card>\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 text-left text-muted-foreground\">\n <th className=\"p-3\">Type</th>\n <th className=\"p-3\">Description</th>\n <th className=\"p-3\">Counterparty</th>\n <th className=\"p-3\">Method</th>\n <th className=\"p-3 text-right\">Amount</th>\n <th className=\"p-3 text-right\">Fees</th>\n <th className=\"p-3 text-right\">Net</th>\n <th className=\"p-3\">Status</th>\n <th className=\"p-3\">Date</th>\n </tr>\n </thead>\n <tbody>\n {filteredTxns.map((txn) => (\n <tr key={txn.id} className=\"border-b hover:bg-muted/50\">\n <td className=\"p-3\">{txnTypeIcon(txn.type)}</td>\n <td className=\"p-3 font-medium\">{txn.description}</td>\n <td className=\"p-3\">{txn.counterparty}</td>\n <td className=\"p-3\">\n <Badge variant=\"outline\">{txn.method.replace('_', ' ')}</Badge>\n </td>\n <td\n className={`p-3 text-right font-medium ${txn.type === 'refund' ? 'text-green-600' : ''}`}\n >\n {txn.type === 'refund' ? '+' : '-'}${txn.amount.toLocaleString()}\n </td>\n <td className=\"p-3 text-right text-muted-foreground\">${txn.fees}</td>\n <td className=\"p-3 text-right\">${txn.netAmount.toLocaleString()}</td>\n <td className=\"p-3\">{statusBadge(txn.status)}</td>\n <td className=\"p-3 text-muted-foreground\">{txn.createdAt}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </CardContent>\n </Card>\n </div>\n )}\n\n {/* Payment Methods Tab */}\n {activeTab === 'methods' && (\n <div className=\"space-y-4\">\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {paymentMethods.map((method) => (\n <Card key={method.id} className={method.isDefault ? 'border-primary' : ''}>\n <CardContent className=\"pt-6\">\n <div className=\"flex items-start justify-between\">\n <div className=\"flex items-center gap-3\">\n <div className=\"rounded-lg border p-2\">{methodIcon(method.type)}</div>\n <div>\n <p className=\"font-medium\">{method.name}</p>\n <p className=\"text-sm text-muted-foreground\">{method.details}</p>\n </div>\n </div>\n {method.isDefault && <Badge>Default</Badge>}\n </div>\n\n <div className=\"mt-4 flex items-center gap-4 text-sm\">\n {method.isVerified ? (\n <span className=\"flex items-center gap-1 text-green-600\">\n <Shield className=\"h-4 w-4\" /> Verified\n </span>\n ) : (\n <span className=\"flex items-center gap-1 text-yellow-600\">\n <Clock className=\"h-4 w-4\" /> Unverified\n </span>\n )}\n {method.lastUsed && (\n <span className=\"text-muted-foreground\">Last used: {method.lastUsed}</span>\n )}\n </div>\n\n <div className=\"mt-4 flex gap-2\">\n {!method.isDefault && (\n <Button variant=\"outline\" size=\"sm\" className=\"flex-1\">\n Set Default\n </Button>\n )}\n <Button variant=\"outline\" size=\"sm\" className=\"flex-1\">\n Remove\n </Button>\n </div>\n </CardContent>\n </Card>\n ))}\n\n {/* Add new method card */}\n <Card className=\"flex items-center justify-center border-dashed\">\n <CardContent className=\"py-8 text-center\">\n <Plus className=\"mx-auto h-8 w-8 text-muted-foreground\" />\n <p className=\"mt-2 text-sm font-medium\">Add Payment Method</p>\n <p className=\"text-xs text-muted-foreground\">Add a new card, bank, or PayPal</p>\n </CardContent>\n </Card>\n </div>\n </div>\n )}\n\n {/* Invoices Tab */}\n {activeTab === 'invoices' && (\n <div className=\"space-y-4\">\n <Card>\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 text-left text-muted-foreground\">\n <th className=\"p-3\">Invoice #</th>\n <th className=\"p-3\">Description</th>\n <th className=\"p-3\">Client</th>\n <th className=\"p-3 text-right\">Amount</th>\n <th className=\"p-3\">Status</th>\n <th className=\"p-3\">Due Date</th>\n <th className=\"p-3 text-right\">Actions</th>\n </tr>\n </thead>\n <tbody>\n {invoices.map((inv) => {\n const invoiceStatusVariant: Record<\n string,\n 'default' | 'secondary' | 'destructive'\n > = {\n paid: 'default',\n pending: 'secondary',\n overdue: 'destructive',\n };\n return (\n <tr key={inv.id} className=\"border-b hover:bg-muted/50\">\n <td className=\"p-3 font-medium\">{inv.number}</td>\n <td className=\"p-3\">{inv.description}</td>\n <td className=\"p-3\">{inv.clientName}</td>\n <td className=\"p-3 text-right font-medium\">\n ${inv.amount.toLocaleString()}\n </td>\n <td className=\"p-3\">\n <Badge variant={invoiceStatusVariant[inv.status] ?? 'secondary'}>\n {inv.status}\n </Badge>\n </td>\n <td className=\"p-3 text-muted-foreground\">{inv.dueDate}</td>\n <td className=\"p-3 text-right\">\n <div className=\"flex justify-end gap-1\">\n <Button variant=\"outline\" size=\"sm\">\n <FileText className=\"h-3 w-3\" />\n </Button>\n <Button variant=\"outline\" size=\"sm\">\n <Download className=\"h-3 w-3\" />\n </Button>\n </div>\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n </CardContent>\n </Card>\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProjectsPage.d.ts","sourceRoot":"","sources":["../../../src/proserviceworld/pages/ProjectsPage.tsx"],"names":[],"mappings":"AA6DA,wBAAgB,YAAY,4CA4c3B"}
|