@burdenoff/microfe-crewfoundry 2026.626.1 → 2026.703.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/crewfoundry/components/forms/ConfirmDialog.js +43 -0
- package/dist/crewfoundry/components/forms/ConfirmDialog.js.map +1 -0
- package/dist/crewfoundry/components/forms/FormModal.js +220 -0
- package/dist/crewfoundry/components/forms/FormModal.js.map +1 -0
- package/dist/crewfoundry/components/forms/formValues.js +20 -0
- package/dist/crewfoundry/components/forms/formValues.js.map +1 -0
- package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js +255 -65
- package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js +28 -17
- package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsFilesPagePage.js +57 -53
- package/dist/crewfoundry/pages/CommunicationsFilesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js +32 -23
- package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js +44 -29
- package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js +183 -57
- package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyCompanyDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js +214 -92
- package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardDashboardPagePage.js +165 -131
- package/dist/crewfoundry/pages/DashboardDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js +163 -133
- package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringCandidatesPagePage.js +269 -54
- package/dist/crewfoundry/pages/HiringCandidatesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringCreateJobPagePage.js +225 -78
- package/dist/crewfoundry/pages/HiringCreateJobPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringInterviewsPagePage.js +213 -59
- package/dist/crewfoundry/pages/HiringInterviewsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js +287 -90
- package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringJobsPagePage.js +49 -47
- package/dist/crewfoundry/pages/HiringJobsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrDepartmentsPagePage.js +166 -59
- package/dist/crewfoundry/pages/HrDepartmentsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrEmployeesPagePage.js +274 -83
- package/dist/crewfoundry/pages/HrEmployeesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js +198 -88
- package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrPayrollPagePage.js +216 -88
- package/dist/crewfoundry/pages/HrPayrollPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js +216 -66
- package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js +6 -7
- package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js +83 -68
- package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCoursesPagePage.js +167 -46
- package/dist/crewfoundry/pages/LearningCoursesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js +75 -55
- package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js +152 -79
- package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningMyLearningPagePage.js +75 -63
- package/dist/crewfoundry/pages/LearningMyLearningPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js +3 -1
- package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js +235 -87
- package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js +199 -86
- package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js +21 -40
- package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/ProjectsCreateProjectPagePage.js +117 -45
- package/dist/crewfoundry/pages/ProjectsCreateProjectPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js +249 -90
- package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js +47 -45
- package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js +262 -133
- package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamsPagePage.js +144 -77
- package/dist/crewfoundry/pages/TeamsTeamsPagePage.js.map +1 -1
- package/dist/crewfoundry/store/crewfoundryStore.js +306 -51
- package/dist/crewfoundry/store/crewfoundryStore.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,98 +1,211 @@
|
|
|
1
1
|
import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
2
|
+
import { FormModal as t, useFormModal as n } from "../components/forms/FormModal.js";
|
|
3
|
+
import { CheckCircle2 as r, Plus as i } from "lucide-react";
|
|
4
|
+
import { Fragment as a, jsx as o, jsxs as s } from "react/jsx-runtime";
|
|
5
|
+
import { Badge as c, Button as l, CardContent as u, GlassCard as d, GradientText as f, IllustratedEmptyState as p, PagePurpose as m } from "@burdenoff/fe-libs/ui";
|
|
5
6
|
//#region src/crewfoundry/pages/PaymentsInvoicesPagePage.tsx
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
var h = [
|
|
8
|
+
{
|
|
9
|
+
name: "number",
|
|
10
|
+
label: "Invoice number",
|
|
11
|
+
type: "text",
|
|
12
|
+
required: !0,
|
|
13
|
+
placeholder: "INV-0001"
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
name: "clientName",
|
|
17
|
+
label: "Client name",
|
|
18
|
+
type: "text",
|
|
19
|
+
required: !0
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
name: "amount",
|
|
23
|
+
label: "Amount (USD)",
|
|
24
|
+
type: "number",
|
|
25
|
+
required: !0
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
name: "status",
|
|
29
|
+
label: "Status",
|
|
30
|
+
type: "select",
|
|
31
|
+
options: [
|
|
32
|
+
{
|
|
33
|
+
label: "Draft",
|
|
34
|
+
value: "draft"
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
label: "Sent",
|
|
38
|
+
value: "sent"
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
label: "Paid",
|
|
42
|
+
value: "paid"
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
label: "Overdue",
|
|
46
|
+
value: "overdue"
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
label: "Cancelled",
|
|
50
|
+
value: "cancelled"
|
|
51
|
+
}
|
|
52
|
+
]
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
name: "issueDate",
|
|
56
|
+
label: "Issue date",
|
|
57
|
+
type: "date",
|
|
58
|
+
required: !0
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
name: "dueDate",
|
|
62
|
+
label: "Due date",
|
|
63
|
+
type: "date"
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
name: "lineItem",
|
|
67
|
+
label: "Line item description",
|
|
68
|
+
type: "text",
|
|
69
|
+
colSpan: 2,
|
|
70
|
+
placeholder: "e.g. Consulting services"
|
|
71
|
+
}
|
|
72
|
+
], g = (e) => {
|
|
73
|
+
let t = typeof e.amount == "number" ? e.amount : Number(e.amount) || 0, n = String(e.lineItem ?? "").trim() || "Services rendered";
|
|
74
|
+
return {
|
|
75
|
+
id: crypto.randomUUID(),
|
|
76
|
+
number: String(e.number ?? ""),
|
|
77
|
+
clientName: String(e.clientName ?? ""),
|
|
78
|
+
amount: t,
|
|
79
|
+
status: e.status || "draft",
|
|
80
|
+
issueDate: String(e.issueDate ?? ""),
|
|
81
|
+
dueDate: String(e.dueDate ?? ""),
|
|
82
|
+
items: [{
|
|
83
|
+
description: n,
|
|
84
|
+
amount: t
|
|
85
|
+
}]
|
|
86
|
+
};
|
|
87
|
+
};
|
|
88
|
+
function _() {
|
|
89
|
+
let { invoices: _, addInvoice: v, updateInvoice: y } = e(), b = n();
|
|
90
|
+
return /* @__PURE__ */ s("div", {
|
|
9
91
|
className: "space-y-6 p-6",
|
|
10
|
-
children: [
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
/* @__PURE__ */
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
] }), /* @__PURE__ */ i(o, {
|
|
26
|
-
size: "sm",
|
|
27
|
-
children: [/* @__PURE__ */ r(t, { className: "h-4 w-4 mr-1" }), "Create Invoice"]
|
|
28
|
-
})]
|
|
29
|
-
}), /* @__PURE__ */ r(c, {
|
|
30
|
-
treatment: "glass",
|
|
31
|
-
glow: !0,
|
|
32
|
-
className: "border-border-seam",
|
|
33
|
-
children: /* @__PURE__ */ r(s, {
|
|
34
|
-
className: "p-0",
|
|
35
|
-
children: f.length === 0 ? /* @__PURE__ */ r("div", {
|
|
36
|
-
className: "p-6",
|
|
37
|
-
children: /* @__PURE__ */ r(u, {
|
|
38
|
-
illustration: "empty-data",
|
|
39
|
-
title: "No invoices yet",
|
|
40
|
-
description: "Create your first invoice to start getting paid."
|
|
92
|
+
children: [
|
|
93
|
+
/* @__PURE__ */ s("div", {
|
|
94
|
+
className: "flex items-center justify-between",
|
|
95
|
+
children: [/* @__PURE__ */ s("div", { children: [
|
|
96
|
+
/* @__PURE__ */ o("h1", {
|
|
97
|
+
className: "text-2xl font-semibold",
|
|
98
|
+
children: /* @__PURE__ */ o(f, { children: "Invoices" })
|
|
99
|
+
}),
|
|
100
|
+
/* @__PURE__ */ s("p", {
|
|
101
|
+
className: "text-sm text-text-secondary",
|
|
102
|
+
children: [_.length, " invoices"]
|
|
103
|
+
}),
|
|
104
|
+
/* @__PURE__ */ o(m, {
|
|
105
|
+
className: "mt-1",
|
|
106
|
+
children: "Create, send, and track invoices — see what's paid, pending, or overdue so you stay on top of getting paid."
|
|
41
107
|
})
|
|
42
|
-
})
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
108
|
+
] }), /* @__PURE__ */ s(l, {
|
|
109
|
+
size: "sm",
|
|
110
|
+
onClick: () => b.openModal(),
|
|
111
|
+
children: [/* @__PURE__ */ o(i, { className: "h-4 w-4 mr-1" }), "Create Invoice"]
|
|
112
|
+
})]
|
|
113
|
+
}),
|
|
114
|
+
/* @__PURE__ */ o(d, {
|
|
115
|
+
treatment: "glass",
|
|
116
|
+
glow: !0,
|
|
117
|
+
className: "border-border-seam",
|
|
118
|
+
children: /* @__PURE__ */ o(u, {
|
|
119
|
+
className: "p-0",
|
|
120
|
+
children: _.length === 0 ? /* @__PURE__ */ o("div", {
|
|
121
|
+
className: "p-6",
|
|
122
|
+
children: /* @__PURE__ */ o(p, {
|
|
123
|
+
illustration: "empty-data",
|
|
124
|
+
title: "No invoices yet",
|
|
125
|
+
description: "Create your first invoice to start getting paid."
|
|
56
126
|
})
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
children:
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
children: ["$", e.amount.toLocaleString()]
|
|
76
|
-
}),
|
|
77
|
-
/* @__PURE__ */ r("span", {
|
|
78
|
-
className: "text-text-secondary",
|
|
79
|
-
children: e.dueDate
|
|
80
|
-
}),
|
|
81
|
-
/* @__PURE__ */ r("div", {
|
|
82
|
-
className: "text-center",
|
|
83
|
-
children: /* @__PURE__ */ r(a, {
|
|
84
|
-
variant: e.status === "paid" ? "default" : e.status === "overdue" ? "destructive" : e.status === "draft" ? "outline" : "secondary",
|
|
85
|
-
className: "text-[10px]",
|
|
86
|
-
children: e.status
|
|
127
|
+
}) : /* @__PURE__ */ s(a, { children: [/* @__PURE__ */ s("div", {
|
|
128
|
+
className: "grid grid-cols-7 gap-2 text-xs font-medium text-text-secondary p-4 border-b",
|
|
129
|
+
children: [
|
|
130
|
+
/* @__PURE__ */ o("span", { children: "Invoice #" }),
|
|
131
|
+
/* @__PURE__ */ o("span", { children: "Client" }),
|
|
132
|
+
/* @__PURE__ */ o("span", { children: "Items" }),
|
|
133
|
+
/* @__PURE__ */ o("span", {
|
|
134
|
+
className: "text-right",
|
|
135
|
+
children: "Amount"
|
|
136
|
+
}),
|
|
137
|
+
/* @__PURE__ */ o("span", { children: "Due Date" }),
|
|
138
|
+
/* @__PURE__ */ o("span", {
|
|
139
|
+
className: "text-center",
|
|
140
|
+
children: "Status"
|
|
141
|
+
}),
|
|
142
|
+
/* @__PURE__ */ o("span", {
|
|
143
|
+
className: "text-right",
|
|
144
|
+
children: "Actions"
|
|
87
145
|
})
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
146
|
+
]
|
|
147
|
+
}), _.map((e) => /* @__PURE__ */ s("div", {
|
|
148
|
+
className: "grid grid-cols-7 gap-2 py-3 px-4 border-b last:border-0 text-sm hover:bg-bg-sunken/50",
|
|
149
|
+
children: [
|
|
150
|
+
/* @__PURE__ */ o("span", {
|
|
151
|
+
className: "font-medium",
|
|
152
|
+
children: e.number
|
|
153
|
+
}),
|
|
154
|
+
/* @__PURE__ */ o("span", {
|
|
155
|
+
className: "text-text-secondary",
|
|
156
|
+
children: e.clientName
|
|
157
|
+
}),
|
|
158
|
+
/* @__PURE__ */ o("div", {
|
|
159
|
+
className: "text-xs text-text-secondary",
|
|
160
|
+
children: e.items.map((e) => e.description).join(", ")
|
|
161
|
+
}),
|
|
162
|
+
/* @__PURE__ */ s("span", {
|
|
163
|
+
className: "text-right font-medium",
|
|
164
|
+
children: ["$", e.amount.toLocaleString()]
|
|
165
|
+
}),
|
|
166
|
+
/* @__PURE__ */ o("span", {
|
|
167
|
+
className: "text-text-secondary",
|
|
168
|
+
children: e.dueDate
|
|
169
|
+
}),
|
|
170
|
+
/* @__PURE__ */ o("div", {
|
|
171
|
+
className: "text-center",
|
|
172
|
+
children: /* @__PURE__ */ o(c, {
|
|
173
|
+
variant: e.status === "paid" ? "default" : e.status === "overdue" ? "destructive" : e.status === "draft" ? "outline" : "secondary",
|
|
174
|
+
className: "text-[10px]",
|
|
175
|
+
children: e.status
|
|
176
|
+
})
|
|
177
|
+
}),
|
|
178
|
+
/* @__PURE__ */ o("div", {
|
|
179
|
+
className: "flex items-center justify-end",
|
|
180
|
+
children: e.status === "paid" ? /* @__PURE__ */ s("span", {
|
|
181
|
+
className: "inline-flex items-center gap-1 text-xs text-status-success-text",
|
|
182
|
+
children: [/* @__PURE__ */ o(r, { className: "h-3.5 w-3.5" }), "Paid"]
|
|
183
|
+
}) : /* @__PURE__ */ s(l, {
|
|
184
|
+
variant: "outline",
|
|
185
|
+
size: "sm",
|
|
186
|
+
onClick: () => void y(e.id, { status: "paid" }),
|
|
187
|
+
children: [/* @__PURE__ */ o(r, { className: "h-3.5 w-3.5 mr-1" }), "Mark Paid"]
|
|
188
|
+
})
|
|
189
|
+
})
|
|
190
|
+
]
|
|
191
|
+
}, e.id))] })
|
|
192
|
+
})
|
|
193
|
+
}),
|
|
194
|
+
/* @__PURE__ */ o(t, {
|
|
195
|
+
open: b.open,
|
|
196
|
+
onOpenChange: b.onOpenChange,
|
|
197
|
+
title: "Create invoice",
|
|
198
|
+
description: "Issue a new invoice to a client and track its payment status.",
|
|
199
|
+
fields: h,
|
|
200
|
+
submitLabel: "Create invoice",
|
|
201
|
+
onSubmit: async (e) => {
|
|
202
|
+
await v(g(e));
|
|
203
|
+
}
|
|
91
204
|
})
|
|
92
|
-
|
|
205
|
+
]
|
|
93
206
|
});
|
|
94
207
|
}
|
|
95
208
|
//#endregion
|
|
96
|
-
export {
|
|
209
|
+
export { _ as PaymentsInvoicesPagePage };
|
|
97
210
|
|
|
98
211
|
//# sourceMappingURL=PaymentsInvoicesPagePage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PaymentsInvoicesPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/PaymentsInvoicesPagePage.tsx"],"sourcesContent":["import {\n Badge,\n Button,\n CardContent,\n GlassCard,\n GradientText,\n IllustratedEmptyState,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport {
|
|
1
|
+
{"version":3,"file":"PaymentsInvoicesPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/PaymentsInvoicesPagePage.tsx"],"sourcesContent":["import {\n Badge,\n Button,\n CardContent,\n GlassCard,\n GradientText,\n IllustratedEmptyState,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport { CheckCircle2, Plus } from 'lucide-react';\nimport {\n FormModal,\n useFormModal,\n type FieldConfig,\n type FormValues,\n} from '../components/forms/FormModal';\nimport { useCrewFoundryStore, type Invoice } from '../store/crewfoundryStore';\n\nconst INVOICE_FIELDS: FieldConfig[] = [\n { name: 'number', label: 'Invoice number', type: 'text', required: true, placeholder: 'INV-0001' },\n { name: 'clientName', label: 'Client name', type: 'text', required: true },\n { name: 'amount', label: 'Amount (USD)', type: 'number', required: true },\n {\n name: 'status',\n label: 'Status',\n type: 'select',\n options: [\n { label: 'Draft', value: 'draft' },\n { label: 'Sent', value: 'sent' },\n { label: 'Paid', value: 'paid' },\n { label: 'Overdue', value: 'overdue' },\n { label: 'Cancelled', value: 'cancelled' },\n ],\n },\n { name: 'issueDate', label: 'Issue date', type: 'date', required: true },\n { name: 'dueDate', label: 'Due date', type: 'date' },\n {\n name: 'lineItem',\n label: 'Line item description',\n type: 'text',\n colSpan: 2,\n placeholder: 'e.g. Consulting services',\n },\n];\n\nconst valuesToInvoice = (values: FormValues): Invoice => {\n const amount = typeof values.amount === 'number' ? values.amount : Number(values.amount) || 0;\n const description = String(values.lineItem ?? '').trim() || 'Services rendered';\n return {\n id: crypto.randomUUID(),\n number: String(values.number ?? ''),\n clientName: String(values.clientName ?? ''),\n amount,\n status: (values.status as Invoice['status']) || 'draft',\n issueDate: String(values.issueDate ?? ''),\n dueDate: String(values.dueDate ?? ''),\n items: [{ description, amount }],\n };\n};\n\nexport function PaymentsInvoicesPagePage() {\n const { invoices, addInvoice, updateInvoice } = useCrewFoundryStore();\n const modal = useFormModal();\n\n const handleSubmit = async (values: FormValues) => {\n await addInvoice(valuesToInvoice(values));\n };\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>Invoices</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">{invoices.length} invoices</p>\n <PagePurpose className=\"mt-1\">Create, send, and track invoices — see what's paid, pending, or overdue so you stay on top of getting paid.</PagePurpose>\n </div>\n <Button size=\"sm\" onClick={() => modal.openModal()}>\n <Plus className=\"h-4 w-4 mr-1\" />\n Create Invoice\n </Button>\n </div>\n <GlassCard treatment=\"glass\" glow className=\"border-border-seam\">\n <CardContent className=\"p-0\">\n {invoices.length === 0 ? (\n <div className=\"p-6\">\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title=\"No invoices yet\"\n description=\"Create your first invoice to start getting paid.\"\n />\n </div>\n ) : (\n <>\n <div className=\"grid grid-cols-7 gap-2 text-xs font-medium text-text-secondary p-4 border-b\">\n <span>Invoice #</span>\n <span>Client</span>\n <span>Items</span>\n <span className=\"text-right\">Amount</span>\n <span>Due Date</span>\n <span className=\"text-center\">Status</span>\n <span className=\"text-right\">Actions</span>\n </div>\n {invoices.map((inv) => (\n <div\n key={inv.id}\n className=\"grid grid-cols-7 gap-2 py-3 px-4 border-b last:border-0 text-sm hover:bg-bg-sunken/50\"\n >\n <span className=\"font-medium\">{inv.number}</span>\n <span className=\"text-text-secondary\">{inv.clientName}</span>\n <div className=\"text-xs text-text-secondary\">\n {inv.items.map((i) => i.description).join(', ')}\n </div>\n <span className=\"text-right font-medium\">${inv.amount.toLocaleString()}</span>\n <span className=\"text-text-secondary\">{inv.dueDate}</span>\n <div className=\"text-center\">\n <Badge\n variant={\n inv.status === 'paid'\n ? 'default'\n : inv.status === 'overdue'\n ? 'destructive'\n : inv.status === 'draft'\n ? 'outline'\n : 'secondary'\n }\n className=\"text-[10px]\"\n >\n {inv.status}\n </Badge>\n </div>\n <div className=\"flex items-center justify-end\">\n {inv.status === 'paid' ? (\n <span className=\"inline-flex items-center gap-1 text-xs text-status-success-text\">\n <CheckCircle2 className=\"h-3.5 w-3.5\" />\n Paid\n </span>\n ) : (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => void updateInvoice(inv.id, { status: 'paid' })}\n >\n <CheckCircle2 className=\"h-3.5 w-3.5 mr-1\" />\n Mark Paid\n </Button>\n )}\n </div>\n </div>\n ))}\n </>\n )}\n </CardContent>\n </GlassCard>\n\n <FormModal\n open={modal.open}\n onOpenChange={modal.onOpenChange}\n title=\"Create invoice\"\n description=\"Issue a new invoice to a client and track its payment status.\"\n fields={INVOICE_FIELDS}\n submitLabel=\"Create invoice\"\n onSubmit={handleSubmit}\n />\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PaymentsPaymentDashboardPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/PaymentsPaymentDashboardPagePage.tsx"],"sourcesContent":["import {\n Badge,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n GlassCard,\n GradientText,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport {
|
|
1
|
+
{"version":3,"file":"PaymentsPaymentDashboardPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/PaymentsPaymentDashboardPagePage.tsx"],"sourcesContent":["import {\n Badge,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n GlassCard,\n GradientText,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport { CreditCard, DollarSign, Receipt, TrendingUp } from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\nexport function PaymentsPaymentDashboardPagePage() {\n const { invoices, payrollRecords } = useCrewFoundryStore();\n const totalInvoiced = invoices.reduce((s, i) => s + i.amount, 0);\n const totalPaid = invoices.filter((i) => i.status === 'paid').reduce((s, i) => s + i.amount, 0);\n const totalPayroll = payrollRecords.reduce((s, r) => s + r.grossPay, 0);\n\n return (\n <div className=\"space-y-6 p-6\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>Payment Dashboard</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">Financial transactions and payment overview</p>\n <PagePurpose className=\"mt-1\">A snapshot of all money movement — incoming payments, payouts, and balances so you understand your financial position at a glance.</PagePurpose>\n </div>\n <div className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-4\">\n <GlassCard treatment=\"glass\" glow className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Total Invoiced</CardTitle>\n <Receipt className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">${totalInvoiced.toLocaleString()}</div>\n </CardContent>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Collected</CardTitle>\n <DollarSign className=\"h-4 w-4 text-status-success-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">${totalPaid.toLocaleString()}</div>\n </CardContent>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Payroll Processed</CardTitle>\n <CreditCard className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">${totalPayroll.toLocaleString()}</div>\n </CardContent>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Outstanding</CardTitle>\n <TrendingUp className=\"h-4 w-4 text-status-warning-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">\n ${(totalInvoiced - totalPaid).toLocaleString()}\n </div>\n </CardContent>\n </GlassCard>\n </div>\n <Card>\n <CardHeader>\n <CardTitle>Recent Invoices</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-5 gap-2 text-xs font-medium text-text-secondary border-b pb-2 mb-2\">\n <span>Invoice</span>\n <span>Client</span>\n <span className=\"text-right\">Amount</span>\n <span>Due Date</span>\n <span className=\"text-center\">Status</span>\n </div>\n {invoices.map((inv) => (\n <div\n key={inv.id}\n className=\"grid grid-cols-5 gap-2 py-2 border-b last:border-0 text-sm\"\n >\n <span className=\"font-medium\">{inv.number}</span>\n <span className=\"text-text-secondary\">{inv.clientName}</span>\n <span className=\"text-right\">${inv.amount.toLocaleString()}</span>\n <span className=\"text-text-secondary\">{inv.dueDate}</span>\n <div className=\"text-center\">\n <Badge\n variant={\n inv.status === 'paid'\n ? 'default'\n : inv.status === 'overdue'\n ? 'destructive'\n : 'secondary'\n }\n className=\"text-[10px]\"\n >\n {inv.status}\n </Badge>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,37 +1,12 @@
|
|
|
1
1
|
import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { Building2 as t, CreditCard as n, ExternalLink as r } from "lucide-react";
|
|
3
|
+
import { useNavigate as i } from "react-router-dom";
|
|
4
4
|
import { jsx as a, jsxs as o } from "react/jsx-runtime";
|
|
5
5
|
import { Badge as s, Button as c, CardContent as l, GlassCard as u, GradientText as d, IllustratedEmptyState as f, PagePurpose as p } from "@burdenoff/fe-libs/ui";
|
|
6
6
|
//#region src/crewfoundry/pages/PaymentsPaymentMethodsPagePage.tsx
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
id: `bank-${e.id}`,
|
|
11
|
-
type: "bank",
|
|
12
|
-
name: `${e.department} Settlement Account`,
|
|
13
|
-
bank: _[t % Math.max(_.length, 1)]?.name || "Burdenoff Bank",
|
|
14
|
-
last4: String(e.netPay).slice(-4).padStart(4, "0"),
|
|
15
|
-
status: t === 0 ? "primary" : "active"
|
|
16
|
-
})), t = h.slice(0, 4).map((t, n) => {
|
|
17
|
-
let r = String((n + 3) % 12 + 1).padStart(2, "0"), i = String(2027 + n % 2);
|
|
18
|
-
return {
|
|
19
|
-
id: `card-${t.id}`,
|
|
20
|
-
type: "card",
|
|
21
|
-
name: `${v[n % Math.max(v.length, 1)]?.name || "Corporate"} Card`,
|
|
22
|
-
bank: t.clientName,
|
|
23
|
-
last4: t.number.replaceAll(/\D/g, "").slice(-4).padStart(4, "0"),
|
|
24
|
-
status: n === 0 && e.length === 0 ? "primary" : "active",
|
|
25
|
-
expiry: `${r}/${i}`
|
|
26
|
-
};
|
|
27
|
-
});
|
|
28
|
-
return [...e, ...t];
|
|
29
|
-
}, [
|
|
30
|
-
v,
|
|
31
|
-
h,
|
|
32
|
-
g,
|
|
33
|
-
_
|
|
34
|
-
]), b = m.length > 0 ? m : y;
|
|
7
|
+
var m = "/billing/payment-methods";
|
|
8
|
+
function h() {
|
|
9
|
+
let h = i(), { paymentMethods: g } = e(), _ = () => h(m);
|
|
35
10
|
return /* @__PURE__ */ o("div", {
|
|
36
11
|
className: "space-y-6 p-6",
|
|
37
12
|
children: [/* @__PURE__ */ o("div", {
|
|
@@ -43,35 +18,41 @@ function m() {
|
|
|
43
18
|
}),
|
|
44
19
|
/* @__PURE__ */ a("p", {
|
|
45
20
|
className: "text-sm text-text-secondary",
|
|
46
|
-
children: "
|
|
21
|
+
children: "Managed in your platform Billing settings"
|
|
47
22
|
}),
|
|
48
23
|
/* @__PURE__ */ a(p, {
|
|
49
24
|
className: "mt-1",
|
|
50
|
-
children: "Manage how you pay and get paid —
|
|
25
|
+
children: "Manage how you pay and get paid — cards, bank accounts, and payout methods are held securely in Billing settings."
|
|
51
26
|
})
|
|
52
27
|
] }), /* @__PURE__ */ o(c, {
|
|
53
28
|
size: "sm",
|
|
54
|
-
|
|
29
|
+
onClick: _,
|
|
30
|
+
children: [/* @__PURE__ */ a(r, { className: "mr-1 h-4 w-4" }), "Manage in Billing settings"]
|
|
55
31
|
})]
|
|
56
32
|
}), /* @__PURE__ */ a("div", {
|
|
57
33
|
className: "grid gap-4 md:grid-cols-2",
|
|
58
|
-
children:
|
|
34
|
+
children: g.length === 0 ? /* @__PURE__ */ a("div", {
|
|
59
35
|
className: "col-span-full",
|
|
60
36
|
children: /* @__PURE__ */ a(f, {
|
|
61
37
|
illustration: "empty-generic",
|
|
62
38
|
title: "No payment methods",
|
|
63
|
-
description: "Add a card or bank account to pay and get paid."
|
|
39
|
+
description: "Payment methods live in your platform Billing settings. Add a card or bank account there to pay and get paid.",
|
|
40
|
+
action: /* @__PURE__ */ o(c, {
|
|
41
|
+
size: "sm",
|
|
42
|
+
onClick: _,
|
|
43
|
+
children: [/* @__PURE__ */ a(r, { className: "mr-1 h-4 w-4" }), "Open Billing settings"]
|
|
44
|
+
})
|
|
64
45
|
})
|
|
65
|
-
}) :
|
|
66
|
-
treatment:
|
|
67
|
-
glow:
|
|
46
|
+
}) : g.map((e, r) => /* @__PURE__ */ a(u, {
|
|
47
|
+
treatment: r === 0 ? "glass" : "plain",
|
|
48
|
+
glow: r === 0,
|
|
68
49
|
children: /* @__PURE__ */ o(l, {
|
|
69
50
|
className: "p-4",
|
|
70
51
|
children: [/* @__PURE__ */ o("div", {
|
|
71
52
|
className: "mb-3 flex items-center justify-between",
|
|
72
53
|
children: [/* @__PURE__ */ o("div", {
|
|
73
54
|
className: "flex items-center gap-2",
|
|
74
|
-
children: [e.type === "bank" ? /* @__PURE__ */ a(
|
|
55
|
+
children: [e.type === "bank" ? /* @__PURE__ */ a(t, { className: "h-5 w-5 text-text-secondary" }) : /* @__PURE__ */ a(n, { className: "h-5 w-5 text-text-secondary" }), /* @__PURE__ */ o("div", { children: [/* @__PURE__ */ a("p", {
|
|
75
56
|
className: "text-sm font-medium",
|
|
76
57
|
children: e.name
|
|
77
58
|
}), /* @__PURE__ */ a("p", {
|
|
@@ -93,6 +74,6 @@ function m() {
|
|
|
93
74
|
});
|
|
94
75
|
}
|
|
95
76
|
//#endregion
|
|
96
|
-
export {
|
|
77
|
+
export { h as PaymentsPaymentMethodsPagePage };
|
|
97
78
|
|
|
98
79
|
//# sourceMappingURL=PaymentsPaymentMethodsPagePage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PaymentsPaymentMethodsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/PaymentsPaymentMethodsPagePage.tsx"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"PaymentsPaymentMethodsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/PaymentsPaymentMethodsPagePage.tsx"],"sourcesContent":["import { useNavigate } from 'react-router-dom';\nimport {\n Badge,\n Button,\n CardContent,\n GlassCard,\n GradientText,\n IllustratedEmptyState,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport { Building2, CreditCard, ExternalLink } from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\n// Payment methods are owned by the platform Billing module (global billing\n// account), not by CrewFoundry. We read the real methods surfaced via the\n// billing overlap and send all add/manage actions to Billing settings — there\n// is deliberately no crew-local payment-method store.\nconst BILLING_PAYMENT_METHODS_ROUTE = '/billing/payment-methods';\n\nexport function PaymentsPaymentMethodsPagePage() {\n const navigate = useNavigate();\n const { paymentMethods } = useCrewFoundryStore();\n\n const goToBilling = () => navigate(BILLING_PAYMENT_METHODS_ROUTE);\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>Payment Methods</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\n Managed in your platform Billing settings\n </p>\n <PagePurpose className=\"mt-1\">Manage how you pay and get paid — cards, bank accounts, and payout methods are held securely in Billing settings.</PagePurpose>\n </div>\n <Button size=\"sm\" onClick={goToBilling}>\n <ExternalLink className=\"mr-1 h-4 w-4\" />\n Manage in Billing settings\n </Button>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-2\">\n {paymentMethods.length === 0 ? (\n <div className=\"col-span-full\">\n <IllustratedEmptyState\n illustration=\"empty-generic\"\n title=\"No payment methods\"\n description=\"Payment methods live in your platform Billing settings. Add a card or bank account there to pay and get paid.\"\n action={\n <Button size=\"sm\" onClick={goToBilling}>\n <ExternalLink className=\"mr-1 h-4 w-4\" />\n Open Billing settings\n </Button>\n }\n />\n </div>\n ) : (\n paymentMethods.map((method, _idx) => (\n <GlassCard key={method.id} treatment={_idx === 0 ? 'glass' : 'plain'} glow={_idx === 0}>\n <CardContent className=\"p-4\">\n <div className=\"mb-3 flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n {method.type === 'bank' ? (\n <Building2 className=\"h-5 w-5 text-text-secondary\" />\n ) : (\n <CreditCard className=\"h-5 w-5 text-text-secondary\" />\n )}\n <div>\n <p className=\"text-sm font-medium\">{method.name}</p>\n <p className=\"text-xs text-text-secondary\">{method.bank}</p>\n </div>\n </div>\n <Badge\n variant={method.status === 'primary' ? 'default' : 'secondary'}\n className=\"text-[10px]\"\n >\n {method.status}\n </Badge>\n </div>\n <div className=\"flex items-center justify-between text-sm text-text-secondary\">\n <span>•••• •••• •••• {method.last4}</span>\n {method.expiry ? <span>Exp: {method.expiry}</span> : null}\n </div>\n </CardContent>\n </GlassCard>\n ))\n )}\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;AAiBA,IAAM,IAAgC;AAEtC,SAAgB,IAAiC;CAC/C,IAAM,IAAW,GAAa,EACxB,EAAE,sBAAmB,GAAqB,EAE1C,UAAoB,EAAS,EAA8B;AAEjE,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD,EAAA,UAAA;IACE,kBAAC,MAAD;KAAI,WAAU;eACZ,kBAAC,GAAD,EAAA,UAAc,mBAA8B,CAAA;KACzC,CAAA;IACL,kBAAC,KAAD;KAAG,WAAU;eAA8B;KAEvC,CAAA;IACJ,kBAAC,GAAD;KAAa,WAAU;eAAO;KAA+H,CAAA;IACzJ,EAAA,CAAA,EACN,kBAAC,GAAD;IAAQ,MAAK;IAAK,SAAS;cAA3B,CACE,kBAAC,GAAD,EAAc,WAAU,gBAAiB,CAAA,EAAA,6BAElC;MACL;MAEN,kBAAC,OAAD;GAAK,WAAU;aACZ,EAAe,WAAW,IACzB,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,GAAD;KACE,cAAa;KACb,OAAM;KACN,aAAY;KACZ,QACE,kBAAC,GAAD;MAAQ,MAAK;MAAK,SAAS;gBAA3B,CACE,kBAAC,GAAD,EAAc,WAAU,gBAAiB,CAAA,EAAA,wBAElC;;KAEX,CAAA;IACE,CAAA,GAEN,EAAe,KAAK,GAAQ,MAC1B,kBAAC,GAAD;IAA2B,WAAW,MAAS,IAAI,UAAU;IAAS,MAAM,MAAS;cACnF,kBAAC,GAAD;KAAa,WAAU;eAAvB,CACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACG,EAAO,SAAS,SACf,kBAAC,GAAD,EAAW,WAAU,+BAAgC,CAAA,GAErD,kBAAC,GAAD,EAAY,WAAU,+BAAgC,CAAA,EAExD,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;QAAG,WAAU;kBAAuB,EAAO;QAAS,CAAA,EACpD,kBAAC,KAAD;QAAG,WAAU;kBAA+B,EAAO;QAAS,CAAA,CACxD,EAAA,CAAA,CACF;UACN,kBAAC,GAAD;OACE,SAAS,EAAO,WAAW,YAAY,YAAY;OACnD,WAAU;iBAET,EAAO;OACF,CAAA,CACJ;SACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,QAAD,EAAA,UAAA,CAAM,mBAAgB,EAAO,MAAa,EAAA,CAAA,EACzC,EAAO,SAAS,kBAAC,QAAD,EAAA,UAAA,CAAM,SAAM,EAAO,OAAc,EAAA,CAAA,GAAG,KACjD;QACM;;IACJ,EA1BI,EAAO,GA0BX,CACZ;GAEA,CAAA,CACF"}
|