@burdenoff/microfe-crewfoundry 2026.529.1 → 2026.624.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/crewfoundry/pages/AdminAdminPagePage.js +15 -15
- package/dist/crewfoundry/pages/AdminAdminPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsAnalyticsPagePage.js +15 -15
- package/dist/crewfoundry/pages/AnalyticsAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsEmployeeAnalyticsPagePage.js +17 -17
- package/dist/crewfoundry/pages/AnalyticsEmployeeAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js +19 -19
- package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.js +16 -16
- package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js +5 -5
- package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js +7 -7
- package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsDirectoryPagePage.js +7 -7
- package/dist/crewfoundry/pages/CommunicationsDirectoryPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsFilesPagePage.js +7 -7
- package/dist/crewfoundry/pages/CommunicationsFilesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js +7 -7
- package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsTeamsPagePage.js +3 -3
- package/dist/crewfoundry/pages/CommunicationsTeamsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js +8 -8
- package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js +8 -8
- package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyCompanyDashboardPagePage.js +14 -14
- package/dist/crewfoundry/pages/CompanyCompanyDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyCompanyProfilePagePage.js +10 -10
- package/dist/crewfoundry/pages/CompanyCompanyProfilePagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js +4 -4
- package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardAnalyticsPagePage.js +17 -17
- package/dist/crewfoundry/pages/DashboardAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardDashboardPagePage.js +19 -19
- package/dist/crewfoundry/pages/DashboardDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js +17 -17
- package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardExecutiveDashboardPage.js +12 -12
- package/dist/crewfoundry/pages/DashboardExecutiveDashboardPage.js.map +1 -1
- package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.js +12 -12
- package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringApplicationsPagePage.js +11 -11
- package/dist/crewfoundry/pages/HiringApplicationsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringCandidatesPagePage.js +7 -7
- package/dist/crewfoundry/pages/HiringCandidatesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringCreateJobPagePage.js +1 -1
- package/dist/crewfoundry/pages/HiringCreateJobPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringInterviewsPagePage.js +7 -7
- package/dist/crewfoundry/pages/HiringInterviewsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js +13 -13
- package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringJobsPagePage.js +7 -7
- package/dist/crewfoundry/pages/HiringJobsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrDepartmentsPagePage.js +10 -10
- package/dist/crewfoundry/pages/HrDepartmentsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrEmployeesPagePage.js +9 -9
- package/dist/crewfoundry/pages/HrEmployeesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js +13 -13
- package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrPayrollPagePage.js +10 -10
- package/dist/crewfoundry/pages/HrPayrollPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js +9 -9
- package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js +3 -3
- package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCertificatesPagePage.js +2 -2
- package/dist/crewfoundry/pages/LearningCertificatesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js +11 -11
- package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js +7 -7
- package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCoursesPagePage.js +4 -4
- package/dist/crewfoundry/pages/LearningCoursesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.js +9 -9
- package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPagePage.js +10 -10
- package/dist/crewfoundry/pages/LearningLearningPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js +11 -11
- package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js +5 -5
- package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningMyLearningPagePage.js +7 -7
- package/dist/crewfoundry/pages/LearningMyLearningPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js +3 -3
- package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js +7 -7
- package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js +11 -11
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js +11 -11
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js +6 -6
- package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js +6 -6
- package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.js +7 -7
- package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js +2 -2
- package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js +15 -15
- package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js +10 -10
- package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsEscrowPagePage.js +5 -5
- package/dist/crewfoundry/pages/PaymentsEscrowPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js +6 -6
- package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js +6 -6
- package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js +4 -4
- package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsSecurityPagePage.js +4 -4
- package/dist/crewfoundry/pages/PaymentsSecurityPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/ProjectsCreateProjectPagePage.js +1 -1
- package/dist/crewfoundry/pages/ProjectsCreateProjectPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js +15 -15
- package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js +4 -4
- package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamAnalyticsPagePage.js +8 -8
- package/dist/crewfoundry/pages/TeamsTeamAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamDetailPagePage.js +14 -14
- package/dist/crewfoundry/pages/TeamsTeamDetailPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamDirectoryPagePage.js +6 -6
- package/dist/crewfoundry/pages/TeamsTeamDirectoryPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js +20 -20
- package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamsPagePage.js +3 -3
- package/dist/crewfoundry/pages/TeamsTeamsPagePage.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PaymentsInvoicesPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/PaymentsInvoicesPagePage.tsx"],"sourcesContent":["import { Badge, Button, Card, CardContent, CardHeader, CardTitle } from '@burdenoff/fe-libs/ui';\nimport { FileText, Plus } from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\nexport function PaymentsInvoicesPagePage() {\n const { invoices } = useCrewFoundryStore();\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\">Invoices</h1>\n <p className=\"text-sm text-
|
|
1
|
+
{"version":3,"file":"PaymentsInvoicesPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/PaymentsInvoicesPagePage.tsx"],"sourcesContent":["import { Badge, Button, Card, CardContent, CardHeader, CardTitle } from '@burdenoff/fe-libs/ui';\nimport { FileText, Plus } from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\nexport function PaymentsInvoicesPagePage() {\n const { invoices } = useCrewFoundryStore();\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\">Invoices</h1>\n <p className=\"text-sm text-text-secondary\">{invoices.length} invoices</p>\n </div>\n <Button size=\"sm\">\n <Plus className=\"h-4 w-4 mr-1\" />\n Create Invoice\n </Button>\n </div>\n <Card>\n <CardContent className=\"p-0\">\n <div className=\"grid grid-cols-6 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 </div>\n {invoices.map((inv) => (\n <div\n key={inv.id}\n className=\"grid grid-cols-6 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>\n ))}\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":";;;;;AAIA,SAAgB,IAA2B;CACzC,IAAM,EAAE,gBAAa,GAAqB;AAE1C,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;IAAI,WAAU;cAAyB;IAAa,CAAA,EACpD,kBAAC,KAAD;IAAG,WAAU;cAAb,CAA4C,EAAS,QAAO,YAAa;MACrE,EAAA,CAAA,EACN,kBAAC,GAAD;IAAQ,MAAK;cAAb,CACE,kBAAC,GAAD,EAAM,WAAU,gBAAiB,CAAA,EAAA,iBAE1B;MACL;MACN,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;GAAa,WAAU;aAAvB,CACE,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,QAAD,EAAA,UAAM,aAAgB,CAAA;KACtB,kBAAC,QAAD,EAAA,UAAM,UAAa,CAAA;KACnB,kBAAC,QAAD,EAAA,UAAM,SAAY,CAAA;KAClB,kBAAC,QAAD;MAAM,WAAU;gBAAa;MAAa,CAAA;KAC1C,kBAAC,QAAD,EAAA,UAAM,YAAe,CAAA;KACrB,kBAAC,QAAD;MAAM,WAAU;gBAAc;MAAa,CAAA;KACvC;OACL,EAAS,KAAK,MACb,kBAAC,OAAD;IAEE,WAAU;cAFZ;KAIE,kBAAC,QAAD;MAAM,WAAU;gBAAe,EAAI;MAAc,CAAA;KACjD,kBAAC,QAAD;MAAM,WAAU;gBAAuB,EAAI;MAAkB,CAAA;KAC7D,kBAAC,OAAD;MAAK,WAAU;gBACZ,EAAI,MAAM,KAAK,MAAM,EAAE,YAAY,CAAC,KAAK,KAAK;MAC3C,CAAA;KACN,kBAAC,QAAD;MAAM,WAAU;gBAAhB,CAAyC,KAAE,EAAI,OAAO,gBAAgB,CAAQ;;KAC9E,kBAAC,QAAD;MAAM,WAAU;gBAAuB,EAAI;MAAe,CAAA;KAC1D,kBAAC,OAAD;MAAK,WAAU;gBACb,kBAAC,GAAD;OACE,SACE,EAAI,WAAW,SACX,YACA,EAAI,WAAW,YACb,gBACA,EAAI,WAAW,UACb,YACA;OAEV,WAAU;iBAET,EAAI;OACC,CAAA;MACJ,CAAA;KACF;MA1BC,EAAI,GA0BL,CACN,CACU;MACT,CAAA,CACH"}
|
|
@@ -12,7 +12,7 @@ function f() {
|
|
|
12
12
|
className: "text-2xl font-semibold",
|
|
13
13
|
children: "Payment Dashboard"
|
|
14
14
|
}), /* @__PURE__ */ a("p", {
|
|
15
|
-
className: "text-sm text-
|
|
15
|
+
className: "text-sm text-text-secondary",
|
|
16
16
|
children: "Financial transactions and payment overview"
|
|
17
17
|
})] }),
|
|
18
18
|
/* @__PURE__ */ o("div", {
|
|
@@ -23,7 +23,7 @@ function f() {
|
|
|
23
23
|
children: [/* @__PURE__ */ a(d, {
|
|
24
24
|
className: "text-sm font-medium",
|
|
25
25
|
children: "Total Invoiced"
|
|
26
|
-
}), /* @__PURE__ */ a(r, { className: "h-4 w-4 text-
|
|
26
|
+
}), /* @__PURE__ */ a(r, { className: "h-4 w-4 text-text-secondary" })]
|
|
27
27
|
}), /* @__PURE__ */ a(l, { children: /* @__PURE__ */ o("div", {
|
|
28
28
|
className: "text-2xl font-bold",
|
|
29
29
|
children: ["$", m.toLocaleString()]
|
|
@@ -43,7 +43,7 @@ function f() {
|
|
|
43
43
|
children: [/* @__PURE__ */ a(d, {
|
|
44
44
|
className: "text-sm font-medium",
|
|
45
45
|
children: "Payroll Processed"
|
|
46
|
-
}), /* @__PURE__ */ a(t, { className: "h-4 w-4 text-
|
|
46
|
+
}), /* @__PURE__ */ a(t, { className: "h-4 w-4 text-text-secondary" })]
|
|
47
47
|
}), /* @__PURE__ */ a(l, { children: /* @__PURE__ */ o("div", {
|
|
48
48
|
className: "text-2xl font-bold",
|
|
49
49
|
children: ["$", g.toLocaleString()]
|
|
@@ -61,7 +61,7 @@ function f() {
|
|
|
61
61
|
]
|
|
62
62
|
}),
|
|
63
63
|
/* @__PURE__ */ o(c, { children: [/* @__PURE__ */ a(u, { children: /* @__PURE__ */ a(d, { children: "Recent Invoices" }) }), /* @__PURE__ */ o(l, { children: [/* @__PURE__ */ o("div", {
|
|
64
|
-
className: "grid grid-cols-5 gap-2 text-xs font-medium text-
|
|
64
|
+
className: "grid grid-cols-5 gap-2 text-xs font-medium text-text-secondary border-b pb-2 mb-2",
|
|
65
65
|
children: [
|
|
66
66
|
/* @__PURE__ */ a("span", { children: "Invoice" }),
|
|
67
67
|
/* @__PURE__ */ a("span", { children: "Client" }),
|
|
@@ -83,7 +83,7 @@ function f() {
|
|
|
83
83
|
children: e.number
|
|
84
84
|
}),
|
|
85
85
|
/* @__PURE__ */ a("span", {
|
|
86
|
-
className: "text-
|
|
86
|
+
className: "text-text-secondary",
|
|
87
87
|
children: e.clientName
|
|
88
88
|
}),
|
|
89
89
|
/* @__PURE__ */ o("span", {
|
|
@@ -91,7 +91,7 @@ function f() {
|
|
|
91
91
|
children: ["$", e.amount.toLocaleString()]
|
|
92
92
|
}),
|
|
93
93
|
/* @__PURE__ */ a("span", {
|
|
94
|
-
className: "text-
|
|
94
|
+
className: "text-text-secondary",
|
|
95
95
|
children: e.dueDate
|
|
96
96
|
}),
|
|
97
97
|
/* @__PURE__ */ a("div", {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PaymentsPaymentDashboardPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/PaymentsPaymentDashboardPagePage.tsx"],"sourcesContent":["import {\n Badge,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n} from '@burdenoff/fe-libs/ui';\nimport { ArrowUp, 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\">Payment Dashboard</h1>\n <p className=\"text-sm text-
|
|
1
|
+
{"version":3,"file":"PaymentsPaymentDashboardPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/PaymentsPaymentDashboardPagePage.tsx"],"sourcesContent":["import {\n Badge,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n} from '@burdenoff/fe-libs/ui';\nimport { ArrowUp, 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\">Payment Dashboard</h1>\n <p className=\"text-sm text-text-secondary\">Financial transactions and payment overview</p>\n </div>\n <div className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-4\">\n <Card>\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\">${totalInvoiced.toLocaleString()}</div>\n </CardContent>\n </Card>\n <Card>\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-green-500\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">${totalPaid.toLocaleString()}</div>\n </CardContent>\n </Card>\n <Card>\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\">${totalPayroll.toLocaleString()}</div>\n </CardContent>\n </Card>\n <Card>\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-yellow-500\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">\n ${(totalInvoiced - totalPaid).toLocaleString()}\n </div>\n </CardContent>\n </Card>\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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"}
|
|
@@ -40,7 +40,7 @@ function d() {
|
|
|
40
40
|
className: "text-2xl font-semibold",
|
|
41
41
|
children: "Payment Methods"
|
|
42
42
|
}), /* @__PURE__ */ a("p", {
|
|
43
|
-
className: "text-sm text-
|
|
43
|
+
className: "text-sm text-text-secondary",
|
|
44
44
|
children: "Manage company payment accounts"
|
|
45
45
|
})] }), /* @__PURE__ */ o(c, {
|
|
46
46
|
size: "sm",
|
|
@@ -54,11 +54,11 @@ function d() {
|
|
|
54
54
|
className: "mb-3 flex items-center justify-between",
|
|
55
55
|
children: [/* @__PURE__ */ o("div", {
|
|
56
56
|
className: "flex items-center gap-2",
|
|
57
|
-
children: [e.type === "bank" ? /* @__PURE__ */ a(n, { className: "h-5 w-5 text-
|
|
57
|
+
children: [e.type === "bank" ? /* @__PURE__ */ a(n, { className: "h-5 w-5 text-text-secondary" }) : /* @__PURE__ */ a(r, { className: "h-5 w-5 text-text-secondary" }), /* @__PURE__ */ o("div", { children: [/* @__PURE__ */ a("p", {
|
|
58
58
|
className: "text-sm font-medium",
|
|
59
59
|
children: e.name
|
|
60
60
|
}), /* @__PURE__ */ a("p", {
|
|
61
|
-
className: "text-xs text-
|
|
61
|
+
className: "text-xs text-text-secondary",
|
|
62
62
|
children: e.bank
|
|
63
63
|
})] })]
|
|
64
64
|
}), /* @__PURE__ */ a(s, {
|
|
@@ -67,7 +67,7 @@ function d() {
|
|
|
67
67
|
children: e.status
|
|
68
68
|
})]
|
|
69
69
|
}), /* @__PURE__ */ o("div", {
|
|
70
|
-
className: "flex items-center justify-between text-sm text-
|
|
70
|
+
className: "flex items-center justify-between text-sm text-text-secondary",
|
|
71
71
|
children: [/* @__PURE__ */ o("span", { children: ["•••• •••• •••• ", e.last4] }), e.expiry ? /* @__PURE__ */ o("span", { children: ["Exp: ", e.expiry] }) : null]
|
|
72
72
|
})]
|
|
73
73
|
}) }, e.id))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PaymentsPaymentMethodsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/PaymentsPaymentMethodsPagePage.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport { Badge, Button, Card, CardContent } from '@burdenoff/fe-libs/ui';\nimport { Building2, CreditCard, Plus } from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\ntype PaymentMethod = {\n id: string;\n type: 'bank' | 'card';\n name: string;\n bank: string;\n last4: string;\n status: 'primary' | 'active';\n expiry?: string;\n};\n\nexport function PaymentsPaymentMethodsPagePage() {\n const {\n paymentMethods: overlapPaymentMethods,\n invoices,\n payrollRecords,\n vendors,\n clients,\n } = useCrewFoundryStore();\n\n const fallbackMethods = useMemo<PaymentMethod[]>(() => {\n const bankMethods = payrollRecords.slice(0, 3).map((record, index) => ({\n id: `bank-${record.id}`,\n type: 'bank' as const,\n name: `${record.department} Settlement Account`,\n bank: vendors[index % Math.max(vendors.length, 1)]?.name || 'Burdenoff Bank',\n last4: String(record.netPay).slice(-4).padStart(4, '0'),\n status: index === 0 ? ('primary' as const) : ('active' as const),\n }));\n\n const cardMethods = invoices.slice(0, 4).map((invoice, index) => {\n const month = String(((index + 3) % 12) + 1).padStart(2, '0');\n const year = String(2027 + (index % 2));\n return {\n id: `card-${invoice.id}`,\n type: 'card' as const,\n name: `${clients[index % Math.max(clients.length, 1)]?.name || 'Corporate'} Card`,\n bank: invoice.clientName,\n last4: invoice.number.replaceAll(/\\D/g, '').slice(-4).padStart(4, '0'),\n status:\n index === 0 && bankMethods.length === 0 ? ('primary' as const) : ('active' as const),\n expiry: `${month}/${year}`,\n };\n });\n\n return [...bankMethods, ...cardMethods];\n }, [clients, invoices, payrollRecords, vendors]);\n\n const paymentMethods = overlapPaymentMethods.length > 0 ? overlapPaymentMethods : fallbackMethods;\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\">Payment Methods</h1>\n <p className=\"text-sm text-
|
|
1
|
+
{"version":3,"file":"PaymentsPaymentMethodsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/PaymentsPaymentMethodsPagePage.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport { Badge, Button, Card, CardContent } from '@burdenoff/fe-libs/ui';\nimport { Building2, CreditCard, Plus } from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\ntype PaymentMethod = {\n id: string;\n type: 'bank' | 'card';\n name: string;\n bank: string;\n last4: string;\n status: 'primary' | 'active';\n expiry?: string;\n};\n\nexport function PaymentsPaymentMethodsPagePage() {\n const {\n paymentMethods: overlapPaymentMethods,\n invoices,\n payrollRecords,\n vendors,\n clients,\n } = useCrewFoundryStore();\n\n const fallbackMethods = useMemo<PaymentMethod[]>(() => {\n const bankMethods = payrollRecords.slice(0, 3).map((record, index) => ({\n id: `bank-${record.id}`,\n type: 'bank' as const,\n name: `${record.department} Settlement Account`,\n bank: vendors[index % Math.max(vendors.length, 1)]?.name || 'Burdenoff Bank',\n last4: String(record.netPay).slice(-4).padStart(4, '0'),\n status: index === 0 ? ('primary' as const) : ('active' as const),\n }));\n\n const cardMethods = invoices.slice(0, 4).map((invoice, index) => {\n const month = String(((index + 3) % 12) + 1).padStart(2, '0');\n const year = String(2027 + (index % 2));\n return {\n id: `card-${invoice.id}`,\n type: 'card' as const,\n name: `${clients[index % Math.max(clients.length, 1)]?.name || 'Corporate'} Card`,\n bank: invoice.clientName,\n last4: invoice.number.replaceAll(/\\D/g, '').slice(-4).padStart(4, '0'),\n status:\n index === 0 && bankMethods.length === 0 ? ('primary' as const) : ('active' as const),\n expiry: `${month}/${year}`,\n };\n });\n\n return [...bankMethods, ...cardMethods];\n }, [clients, invoices, payrollRecords, vendors]);\n\n const paymentMethods = overlapPaymentMethods.length > 0 ? overlapPaymentMethods : fallbackMethods;\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\">Payment Methods</h1>\n <p className=\"text-sm text-text-secondary\">Manage company payment accounts</p>\n </div>\n <Button size=\"sm\">\n <Plus className=\"mr-1 h-4 w-4\" />\n Add Method\n </Button>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-2\">\n {paymentMethods.map((method) => (\n <Card key={method.id}>\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 </Card>\n ))}\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;AAeA,SAAgB,IAAiC;CAC/C,IAAM,EACJ,gBAAgB,GAChB,aACA,mBACA,YACA,eACE,GAAqB,EAEnB,IAAkB,QAA+B;EACrD,IAAM,IAAc,EAAe,MAAM,GAAG,EAAE,CAAC,KAAK,GAAQ,OAAW;GACrE,IAAI,QAAQ,EAAO;GACnB,MAAM;GACN,MAAM,GAAG,EAAO,WAAW;GAC3B,MAAM,EAAQ,IAAQ,KAAK,IAAI,EAAQ,QAAQ,EAAE,GAAG,QAAQ;GAC5D,OAAO,OAAO,EAAO,OAAO,CAAC,MAAM,GAAG,CAAC,SAAS,GAAG,IAAI;GACvD,QAAQ,MAAU,IAAK,YAAuB;GAC/C,EAAE,EAEG,IAAc,EAAS,MAAM,GAAG,EAAE,CAAC,KAAK,GAAS,MAAU;GAC/D,IAAM,IAAQ,QAAS,IAAQ,KAAK,KAAM,EAAE,CAAC,SAAS,GAAG,IAAI,EACvD,IAAO,OAAO,OAAQ,IAAQ,EAAG;AACvC,UAAO;IACL,IAAI,QAAQ,EAAQ;IACpB,MAAM;IACN,MAAM,GAAG,EAAQ,IAAQ,KAAK,IAAI,EAAQ,QAAQ,EAAE,GAAG,QAAQ,YAAY;IAC3E,MAAM,EAAQ;IACd,OAAO,EAAQ,OAAO,WAAW,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,SAAS,GAAG,IAAI;IACtE,QACE,MAAU,KAAK,EAAY,WAAW,IAAK,YAAuB;IACpE,QAAQ,GAAG,EAAM,GAAG;IACrB;IACD;AAEF,SAAO,CAAC,GAAG,GAAa,GAAG,EAAY;IACtC;EAAC;EAAS;EAAU;EAAgB;EAAQ,CAAC,EAE1C,IAAiB,EAAsB,SAAS,IAAI,IAAwB;AAElF,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;IAAI,WAAU;cAAyB;IAAoB,CAAA,EAC3D,kBAAC,KAAD;IAAG,WAAU;cAA8B;IAAmC,CAAA,CAC1E,EAAA,CAAA,EACN,kBAAC,GAAD;IAAQ,MAAK;cAAb,CACE,kBAAC,GAAD,EAAM,WAAU,gBAAiB,CAAA,EAAA,aAE1B;MACL;MAEN,kBAAC,OAAD;GAAK,WAAU;aACZ,EAAe,KAAK,MACnB,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;IAAa,WAAU;cAAvB,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,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;OAAG,WAAU;iBAAuB,EAAO;OAAS,CAAA,EACpD,kBAAC,KAAD;OAAG,WAAU;iBAA+B,EAAO;OAAS,CAAA,CACxD,EAAA,CAAA,CACF;SACN,kBAAC,GAAD;MACE,SAAS,EAAO,WAAW,YAAY,YAAY;MACnD,WAAU;gBAET,EAAO;MACF,CAAA,CACJ;QACN,kBAAC,OAAD;KAAK,WAAU;eAAf,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;OACM;OACT,EA1BI,EAAO,GA0BX,CACP;GACE,CAAA,CACF"}
|
|
@@ -70,7 +70,7 @@ function g() {
|
|
|
70
70
|
className: "text-2xl font-semibold",
|
|
71
71
|
children: "Payment Security"
|
|
72
72
|
}), /* @__PURE__ */ o("p", {
|
|
73
|
-
className: "text-sm text-
|
|
73
|
+
className: "text-sm text-text-secondary",
|
|
74
74
|
children: "Security controls and compliance status"
|
|
75
75
|
})] }), /* @__PURE__ */ s(l, {
|
|
76
76
|
variant: "outline",
|
|
@@ -130,7 +130,7 @@ function g() {
|
|
|
130
130
|
}), /* @__PURE__ */ s("div", {
|
|
131
131
|
className: "flex items-center gap-2",
|
|
132
132
|
children: [/* @__PURE__ */ s("span", {
|
|
133
|
-
className: "text-xs text-
|
|
133
|
+
className: "text-xs text-text-secondary",
|
|
134
134
|
children: ["Last: ", e.lastChecked]
|
|
135
135
|
}), /* @__PURE__ */ o(c, {
|
|
136
136
|
variant: e.status === "passed" ? "default" : "secondary",
|
|
@@ -146,14 +146,14 @@ function g() {
|
|
|
146
146
|
className: "flex items-center justify-between rounded border p-3",
|
|
147
147
|
children: [/* @__PURE__ */ s("div", {
|
|
148
148
|
className: "flex items-center gap-2",
|
|
149
|
-
children: [/* @__PURE__ */ o(n, { className: `h-4 w-4 ${e.severity === "medium" ? "text-yellow-500" : e.severity === "low" ? "text-blue-500" : "text-
|
|
149
|
+
children: [/* @__PURE__ */ o(n, { className: `h-4 w-4 ${e.severity === "medium" ? "text-yellow-500" : e.severity === "low" ? "text-blue-500" : "text-text-secondary"}` }), /* @__PURE__ */ o("span", {
|
|
150
150
|
className: "text-sm",
|
|
151
151
|
children: e.message
|
|
152
152
|
})]
|
|
153
153
|
}), /* @__PURE__ */ s("div", {
|
|
154
154
|
className: "flex items-center gap-2",
|
|
155
155
|
children: [/* @__PURE__ */ o("span", {
|
|
156
|
-
className: "text-xs text-
|
|
156
|
+
className: "text-xs text-text-secondary",
|
|
157
157
|
children: e.time
|
|
158
158
|
}), /* @__PURE__ */ o(c, {
|
|
159
159
|
variant: "outline",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PaymentsSecurityPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/PaymentsSecurityPagePage.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport { Badge, Button, Card, CardContent, CardHeader, CardTitle } from '@burdenoff/fe-libs/ui';\nimport { AlertTriangle, CheckCircle, Shield, ShieldCheck } from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\ntype SecurityCheck = {\n name: string;\n status: 'passed' | 'warning';\n lastChecked: string;\n};\n\ntype SecurityAlert = {\n id: string;\n message: string;\n severity: 'medium' | 'low' | 'info';\n time: string;\n};\n\nconst formatDate = (value: string): string => {\n const parsed = new Date(value);\n if (Number.isNaN(parsed.getTime())) {\n return 'Unknown';\n }\n return parsed.toISOString().split('T')[0];\n};\n\nconst timeAgo = (value: string): string => {\n const parsed = new Date(value);\n if (Number.isNaN(parsed.getTime())) {\n return 'recently';\n }\n const hours = Math.max(1, Math.floor((Date.now() - parsed.getTime()) / (1000 * 60 * 60)));\n return hours < 24 ? `${hours}h ago` : `${Math.floor(hours / 24)}d ago`;\n};\n\nexport function PaymentsSecurityPagePage() {\n const { notifications, invoices, payrollRecords } = useCrewFoundryStore();\n\n const securityChecks = useMemo<SecurityCheck[]>(() => {\n const failedInvoices = invoices.filter((invoice) => invoice.status === 'overdue').length;\n const payrollFailures = payrollRecords.filter((record) => record.status === 'failed').length;\n const warning = failedInvoices > 0 || payrollFailures > 0;\n\n return [\n {\n name: 'PCI DSS Compliance',\n status: 'passed',\n lastChecked: formatDate(new Date().toISOString()),\n },\n {\n name: 'SSL/TLS Encryption',\n status: 'passed',\n lastChecked: formatDate(new Date().toISOString()),\n },\n {\n name: 'Two-Factor Authentication',\n status: 'passed',\n lastChecked: formatDate(new Date().toISOString()),\n },\n {\n name: 'Data Encryption at Rest',\n status: 'passed',\n lastChecked: formatDate(new Date().toISOString()),\n },\n {\n name: 'Payment Processing Audit',\n status: warning ? 'warning' : 'passed',\n lastChecked: formatDate(new Date().toISOString()),\n },\n {\n name: 'Access Control Review',\n status: notifications.some((notification) => notification.type === 'error')\n ? 'warning'\n : 'passed',\n lastChecked: formatDate(new Date().toISOString()),\n },\n ];\n }, [invoices, notifications, payrollRecords]);\n\n const recentAlerts = useMemo<SecurityAlert[]>(() => {\n return notifications.slice(0, 6).map((notification) => {\n const severity: SecurityAlert['severity'] =\n notification.type === 'error' ? 'medium' : notification.type === 'warning' ? 'low' : 'info';\n\n return {\n id: notification.id,\n message: notification.message,\n severity,\n time: timeAgo(notification.createdAt),\n };\n });\n }, [notifications]);\n\n const passedChecks = securityChecks.filter((check) => check.status === 'passed').length;\n const securityScore = Math.round((passedChecks / Math.max(securityChecks.length, 1)) * 100);\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\">Payment Security</h1>\n <p className=\"text-sm text-muted-foreground\">Security controls and compliance status</p>\n </div>\n <Button variant=\"outline\" size=\"sm\">\n <Shield className=\"mr-1 h-4 w-4\" />\n Run Audit\n </Button>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-3\">\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Security Score</CardTitle>\n <ShieldCheck className=\"h-4 w-4 text-green-500\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">{securityScore}/100</div>\n </CardContent>\n </Card>\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Checks Passing</CardTitle>\n <CheckCircle className=\"h-4 w-4 text-green-500\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">\n {passedChecks}/{securityChecks.length}\n </div>\n </CardContent>\n </Card>\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Active Alerts</CardTitle>\n <AlertTriangle className=\"h-4 w-4 text-yellow-500\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">{recentAlerts.length}</div>\n </CardContent>\n </Card>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle>Security Checks</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {securityChecks.map((check) => (\n <div key={check.name} className=\"flex items-center justify-between rounded border p-3\">\n <div className=\"flex items-center gap-2\">\n {check.status === 'passed' ? (\n <CheckCircle className=\"h-4 w-4 text-green-500\" />\n ) : (\n <AlertTriangle className=\"h-4 w-4 text-yellow-500\" />\n )}\n <span className=\"text-sm font-medium\">{check.name}</span>\n </div>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-muted-foreground\">Last: {check.lastChecked}</span>\n <Badge\n variant={check.status === 'passed' ? 'default' : 'secondary'}\n className=\"text-[10px]\"\n >\n {check.status}\n </Badge>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>Security Alerts</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {recentAlerts.map((alert) => (\n <div key={alert.id} className=\"flex items-center justify-between rounded border p-3\">\n <div className=\"flex items-center gap-2\">\n <AlertTriangle\n className={`h-4 w-4 ${\n alert.severity === 'medium'\n ? 'text-yellow-500'\n : alert.severity === 'low'\n ? 'text-blue-500'\n : 'text-muted-foreground'\n }`}\n />\n <span className=\"text-sm\">{alert.message}</span>\n </div>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-muted-foreground\">{alert.time}</span>\n <Badge variant=\"outline\" className=\"text-[10px]\">\n {alert.severity}\n </Badge>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PaymentsSecurityPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/PaymentsSecurityPagePage.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport { Badge, Button, Card, CardContent, CardHeader, CardTitle } from '@burdenoff/fe-libs/ui';\nimport { AlertTriangle, CheckCircle, Shield, ShieldCheck } from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\ntype SecurityCheck = {\n name: string;\n status: 'passed' | 'warning';\n lastChecked: string;\n};\n\ntype SecurityAlert = {\n id: string;\n message: string;\n severity: 'medium' | 'low' | 'info';\n time: string;\n};\n\nconst formatDate = (value: string): string => {\n const parsed = new Date(value);\n if (Number.isNaN(parsed.getTime())) {\n return 'Unknown';\n }\n return parsed.toISOString().split('T')[0];\n};\n\nconst timeAgo = (value: string): string => {\n const parsed = new Date(value);\n if (Number.isNaN(parsed.getTime())) {\n return 'recently';\n }\n const hours = Math.max(1, Math.floor((Date.now() - parsed.getTime()) / (1000 * 60 * 60)));\n return hours < 24 ? `${hours}h ago` : `${Math.floor(hours / 24)}d ago`;\n};\n\nexport function PaymentsSecurityPagePage() {\n const { notifications, invoices, payrollRecords } = useCrewFoundryStore();\n\n const securityChecks = useMemo<SecurityCheck[]>(() => {\n const failedInvoices = invoices.filter((invoice) => invoice.status === 'overdue').length;\n const payrollFailures = payrollRecords.filter((record) => record.status === 'failed').length;\n const warning = failedInvoices > 0 || payrollFailures > 0;\n\n return [\n {\n name: 'PCI DSS Compliance',\n status: 'passed',\n lastChecked: formatDate(new Date().toISOString()),\n },\n {\n name: 'SSL/TLS Encryption',\n status: 'passed',\n lastChecked: formatDate(new Date().toISOString()),\n },\n {\n name: 'Two-Factor Authentication',\n status: 'passed',\n lastChecked: formatDate(new Date().toISOString()),\n },\n {\n name: 'Data Encryption at Rest',\n status: 'passed',\n lastChecked: formatDate(new Date().toISOString()),\n },\n {\n name: 'Payment Processing Audit',\n status: warning ? 'warning' : 'passed',\n lastChecked: formatDate(new Date().toISOString()),\n },\n {\n name: 'Access Control Review',\n status: notifications.some((notification) => notification.type === 'error')\n ? 'warning'\n : 'passed',\n lastChecked: formatDate(new Date().toISOString()),\n },\n ];\n }, [invoices, notifications, payrollRecords]);\n\n const recentAlerts = useMemo<SecurityAlert[]>(() => {\n return notifications.slice(0, 6).map((notification) => {\n const severity: SecurityAlert['severity'] =\n notification.type === 'error' ? 'medium' : notification.type === 'warning' ? 'low' : 'info';\n\n return {\n id: notification.id,\n message: notification.message,\n severity,\n time: timeAgo(notification.createdAt),\n };\n });\n }, [notifications]);\n\n const passedChecks = securityChecks.filter((check) => check.status === 'passed').length;\n const securityScore = Math.round((passedChecks / Math.max(securityChecks.length, 1)) * 100);\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\">Payment Security</h1>\n <p className=\"text-sm text-text-secondary\">Security controls and compliance status</p>\n </div>\n <Button variant=\"outline\" size=\"sm\">\n <Shield className=\"mr-1 h-4 w-4\" />\n Run Audit\n </Button>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-3\">\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Security Score</CardTitle>\n <ShieldCheck className=\"h-4 w-4 text-green-500\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">{securityScore}/100</div>\n </CardContent>\n </Card>\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Checks Passing</CardTitle>\n <CheckCircle className=\"h-4 w-4 text-green-500\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">\n {passedChecks}/{securityChecks.length}\n </div>\n </CardContent>\n </Card>\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Active Alerts</CardTitle>\n <AlertTriangle className=\"h-4 w-4 text-yellow-500\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">{recentAlerts.length}</div>\n </CardContent>\n </Card>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle>Security Checks</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {securityChecks.map((check) => (\n <div key={check.name} className=\"flex items-center justify-between rounded border p-3\">\n <div className=\"flex items-center gap-2\">\n {check.status === 'passed' ? (\n <CheckCircle className=\"h-4 w-4 text-green-500\" />\n ) : (\n <AlertTriangle className=\"h-4 w-4 text-yellow-500\" />\n )}\n <span className=\"text-sm font-medium\">{check.name}</span>\n </div>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-text-secondary\">Last: {check.lastChecked}</span>\n <Badge\n variant={check.status === 'passed' ? 'default' : 'secondary'}\n className=\"text-[10px]\"\n >\n {check.status}\n </Badge>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>Security Alerts</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {recentAlerts.map((alert) => (\n <div key={alert.id} className=\"flex items-center justify-between rounded border p-3\">\n <div className=\"flex items-center gap-2\">\n <AlertTriangle\n className={`h-4 w-4 ${\n alert.severity === 'medium'\n ? 'text-yellow-500'\n : alert.severity === 'low'\n ? 'text-blue-500'\n : 'text-text-secondary'\n }`}\n />\n <span className=\"text-sm\">{alert.message}</span>\n </div>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-text-secondary\">{alert.time}</span>\n <Badge variant=\"outline\" className=\"text-[10px]\">\n {alert.severity}\n </Badge>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -12,7 +12,7 @@ function f() {
|
|
|
12
12
|
className: "text-2xl font-semibold",
|
|
13
13
|
children: "Create Project"
|
|
14
14
|
}), /* @__PURE__ */ r("p", {
|
|
15
|
-
className: "text-sm text-
|
|
15
|
+
className: "text-sm text-text-secondary",
|
|
16
16
|
children: "Set up a new project for your team"
|
|
17
17
|
})] }),
|
|
18
18
|
/* @__PURE__ */ i(o, { children: [/* @__PURE__ */ r(c, { children: /* @__PURE__ */ i(l, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProjectsCreateProjectPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/ProjectsCreateProjectPagePage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport {\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n Input,\n Textarea,\n} from '@burdenoff/fe-libs/ui';\nimport { FolderKanban, Save } from 'lucide-react';\n\nexport function ProjectsCreateProjectPagePage() {\n const [name, setName] = useState('');\n const [description, setDescription] = useState('');\n const [startDate, setStartDate] = useState('');\n const [endDate, setEndDate] = useState('');\n const [budget, setBudget] = useState('');\n\n return (\n <div className=\"space-y-6 p-6 max-w-3xl\">\n <div>\n <h1 className=\"text-2xl font-semibold\">Create Project</h1>\n <p className=\"text-sm text-
|
|
1
|
+
{"version":3,"file":"ProjectsCreateProjectPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/ProjectsCreateProjectPagePage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport {\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n Input,\n Textarea,\n} from '@burdenoff/fe-libs/ui';\nimport { FolderKanban, Save } from 'lucide-react';\n\nexport function ProjectsCreateProjectPagePage() {\n const [name, setName] = useState('');\n const [description, setDescription] = useState('');\n const [startDate, setStartDate] = useState('');\n const [endDate, setEndDate] = useState('');\n const [budget, setBudget] = useState('');\n\n return (\n <div className=\"space-y-6 p-6 max-w-3xl\">\n <div>\n <h1 className=\"text-2xl font-semibold\">Create Project</h1>\n <p className=\"text-sm text-text-secondary\">Set up a new project for your team</p>\n </div>\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <FolderKanban className=\"h-5 w-5\" />\n Project Details\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">Project Name</label>\n <Input\n placeholder=\"e.g. HR Analytics Dashboard v3\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">Description</label>\n <Textarea\n placeholder=\"Describe the project objectives and scope...\"\n rows={3}\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n />\n </div>\n <div className=\"grid grid-cols-2 gap-4\">\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">Start Date</label>\n <Input type=\"date\" value={startDate} onChange={(e) => setStartDate(e.target.value)} />\n </div>\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">End Date</label>\n <Input type=\"date\" value={endDate} onChange={(e) => setEndDate(e.target.value)} />\n </div>\n </div>\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">Budget ($)</label>\n <Input\n type=\"number\"\n placeholder=\"e.g. 250000\"\n value={budget}\n onChange={(e) => setBudget(e.target.value)}\n />\n </div>\n </CardContent>\n </Card>\n <div className=\"flex justify-end gap-2\">\n <Button variant=\"outline\">Save as Draft</Button>\n <Button>\n <Save className=\"h-4 w-4 mr-1\" />\n Create Project\n </Button>\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;AAaA,SAAgB,IAAgC;CAC9C,IAAM,CAAC,GAAM,KAAW,EAAS,GAAG,EAC9B,CAAC,GAAa,KAAkB,EAAS,GAAG,EAC5C,CAAC,GAAW,KAAgB,EAAS,GAAG,EACxC,CAAC,GAAS,KAAc,EAAS,GAAG,EACpC,CAAC,GAAQ,KAAa,EAAS,GAAG;AAExC,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;IAAI,WAAU;cAAyB;IAAmB,CAAA,EAC1D,kBAAC,KAAD;IAAG,WAAU;cAA8B;IAAsC,CAAA,CAC7E,EAAA,CAAA;GACN,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;IAAW,WAAU;cAArB,CACE,kBAAC,GAAD,EAAc,WAAU,WAAY,CAAA,EAAA,kBAE1B;OACD,CAAA,EACb,kBAAC,GAAD;IAAa,WAAU;cAAvB;KACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,SAAD;OAAO,WAAU;iBAAsB;OAAoB,CAAA,EAC3D,kBAAC,GAAD;OACE,aAAY;OACZ,OAAO;OACP,WAAW,MAAM,EAAQ,EAAE,OAAO,MAAM;OACxC,CAAA,CACE;;KACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,SAAD;OAAO,WAAU;iBAAsB;OAAmB,CAAA,EAC1D,kBAAC,GAAD;OACE,aAAY;OACZ,MAAM;OACN,OAAO;OACP,WAAW,MAAM,EAAe,EAAE,OAAO,MAAM;OAC/C,CAAA,CACE;;KACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,SAAD;QAAO,WAAU;kBAAsB;QAAkB,CAAA,EACzD,kBAAC,GAAD;QAAO,MAAK;QAAO,OAAO;QAAW,WAAW,MAAM,EAAa,EAAE,OAAO,MAAM;QAAI,CAAA,CAClF;UACN,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,SAAD;QAAO,WAAU;kBAAsB;QAAgB,CAAA,EACvD,kBAAC,GAAD;QAAO,MAAK;QAAO,OAAO;QAAS,WAAW,MAAM,EAAW,EAAE,OAAO,MAAM;QAAI,CAAA,CAC9E;SACF;;KACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,SAAD;OAAO,WAAU;iBAAsB;OAAkB,CAAA,EACzD,kBAAC,GAAD;OACE,MAAK;OACL,aAAY;OACZ,OAAO;OACP,WAAW,MAAM,EAAU,EAAE,OAAO,MAAM;OAC1C,CAAA,CACE;;KACM;MACT,EAAA,CAAA;GACP,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD;KAAQ,SAAQ;eAAU;KAAsB,CAAA,EAChD,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAM,WAAU,gBAAiB,CAAA,EAAA,iBAE1B,EAAA,CAAA,CACL;;GACF"}
|
|
@@ -14,7 +14,7 @@ function f() {
|
|
|
14
14
|
className: "text-2xl font-semibold",
|
|
15
15
|
children: p.name
|
|
16
16
|
}), /* @__PURE__ */ a("p", {
|
|
17
|
-
className: "text-sm text-
|
|
17
|
+
className: "text-sm text-text-secondary",
|
|
18
18
|
children: p.description
|
|
19
19
|
})] }), /* @__PURE__ */ o("div", {
|
|
20
20
|
className: "flex gap-1",
|
|
@@ -33,13 +33,13 @@ function f() {
|
|
|
33
33
|
/* @__PURE__ */ a(c, { children: /* @__PURE__ */ o(l, {
|
|
34
34
|
className: "p-4 text-center",
|
|
35
35
|
children: [
|
|
36
|
-
/* @__PURE__ */ a(r, { className: "h-5 w-5 mx-auto text-
|
|
36
|
+
/* @__PURE__ */ a(r, { className: "h-5 w-5 mx-auto text-text-secondary mb-1" }),
|
|
37
37
|
/* @__PURE__ */ o("p", {
|
|
38
38
|
className: "text-lg font-bold",
|
|
39
39
|
children: [p.progress, "%"]
|
|
40
40
|
}),
|
|
41
41
|
/* @__PURE__ */ a("p", {
|
|
42
|
-
className: "text-xs text-
|
|
42
|
+
className: "text-xs text-text-secondary",
|
|
43
43
|
children: "Progress"
|
|
44
44
|
})
|
|
45
45
|
]
|
|
@@ -47,7 +47,7 @@ function f() {
|
|
|
47
47
|
/* @__PURE__ */ a(c, { children: /* @__PURE__ */ o(l, {
|
|
48
48
|
className: "p-4 text-center",
|
|
49
49
|
children: [
|
|
50
|
-
/* @__PURE__ */ a(n, { className: "h-5 w-5 mx-auto text-
|
|
50
|
+
/* @__PURE__ */ a(n, { className: "h-5 w-5 mx-auto text-text-secondary mb-1" }),
|
|
51
51
|
/* @__PURE__ */ o("p", {
|
|
52
52
|
className: "text-lg font-bold",
|
|
53
53
|
children: [
|
|
@@ -57,7 +57,7 @@ function f() {
|
|
|
57
57
|
]
|
|
58
58
|
}),
|
|
59
59
|
/* @__PURE__ */ a("p", {
|
|
60
|
-
className: "text-xs text-
|
|
60
|
+
className: "text-xs text-text-secondary",
|
|
61
61
|
children: "Budget"
|
|
62
62
|
})
|
|
63
63
|
]
|
|
@@ -65,13 +65,13 @@ function f() {
|
|
|
65
65
|
/* @__PURE__ */ a(c, { children: /* @__PURE__ */ o(l, {
|
|
66
66
|
className: "p-4 text-center",
|
|
67
67
|
children: [
|
|
68
|
-
/* @__PURE__ */ a(i, { className: "h-5 w-5 mx-auto text-
|
|
68
|
+
/* @__PURE__ */ a(i, { className: "h-5 w-5 mx-auto text-text-secondary mb-1" }),
|
|
69
69
|
/* @__PURE__ */ a("p", {
|
|
70
70
|
className: "text-lg font-bold",
|
|
71
71
|
children: p.teamName
|
|
72
72
|
}),
|
|
73
73
|
/* @__PURE__ */ a("p", {
|
|
74
|
-
className: "text-xs text-
|
|
74
|
+
className: "text-xs text-text-secondary",
|
|
75
75
|
children: "Team"
|
|
76
76
|
})
|
|
77
77
|
]
|
|
@@ -79,13 +79,13 @@ function f() {
|
|
|
79
79
|
/* @__PURE__ */ a(c, { children: /* @__PURE__ */ o(l, {
|
|
80
80
|
className: "p-4 text-center",
|
|
81
81
|
children: [
|
|
82
|
-
/* @__PURE__ */ a(t, { className: "h-5 w-5 mx-auto text-
|
|
82
|
+
/* @__PURE__ */ a(t, { className: "h-5 w-5 mx-auto text-text-secondary mb-1" }),
|
|
83
83
|
/* @__PURE__ */ a("p", {
|
|
84
84
|
className: "text-lg font-bold",
|
|
85
85
|
children: p.endDate
|
|
86
86
|
}),
|
|
87
87
|
/* @__PURE__ */ a("p", {
|
|
88
|
-
className: "text-xs text-
|
|
88
|
+
className: "text-xs text-text-secondary",
|
|
89
89
|
children: "Deadline"
|
|
90
90
|
})
|
|
91
91
|
]
|
|
@@ -106,9 +106,9 @@ function f() {
|
|
|
106
106
|
children: [p.progress, "%"]
|
|
107
107
|
})]
|
|
108
108
|
}), /* @__PURE__ */ a("div", {
|
|
109
|
-
className: "h-3 bg-
|
|
109
|
+
className: "h-3 bg-bg-sunken rounded overflow-hidden",
|
|
110
110
|
children: /* @__PURE__ */ a("div", {
|
|
111
|
-
className: "h-3 bg-primary rounded",
|
|
111
|
+
className: "h-3 bg-action-primary-bg rounded",
|
|
112
112
|
style: { width: `${p.progress}%` }
|
|
113
113
|
})
|
|
114
114
|
})]
|
|
@@ -128,7 +128,7 @@ function f() {
|
|
|
128
128
|
children: [Math.round(p.spent / p.budget * 100), "%"]
|
|
129
129
|
})]
|
|
130
130
|
}), /* @__PURE__ */ a("div", {
|
|
131
|
-
className: "h-3 bg-
|
|
131
|
+
className: "h-3 bg-bg-sunken rounded overflow-hidden",
|
|
132
132
|
children: /* @__PURE__ */ a("div", {
|
|
133
133
|
className: `h-3 rounded ${p.spent / p.budget > .9 ? "bg-red-500" : "bg-green-500"}`,
|
|
134
134
|
style: { width: `${Math.round(p.spent / p.budget * 100)}%` }
|
|
@@ -137,13 +137,13 @@ function f() {
|
|
|
137
137
|
}), /* @__PURE__ */ o("div", {
|
|
138
138
|
className: "grid grid-cols-2 gap-4 mt-4 text-sm",
|
|
139
139
|
children: [/* @__PURE__ */ o("div", { children: [/* @__PURE__ */ a("p", {
|
|
140
|
-
className: "text-xs text-
|
|
140
|
+
className: "text-xs text-text-secondary",
|
|
141
141
|
children: "Manager"
|
|
142
142
|
}), /* @__PURE__ */ a("p", {
|
|
143
143
|
className: "font-medium",
|
|
144
144
|
children: p.managerName
|
|
145
145
|
})] }), /* @__PURE__ */ o("div", { children: [/* @__PURE__ */ a("p", {
|
|
146
|
-
className: "text-xs text-
|
|
146
|
+
className: "text-xs text-text-secondary",
|
|
147
147
|
children: "Timeline"
|
|
148
148
|
}), /* @__PURE__ */ o("p", { children: [
|
|
149
149
|
p.startDate,
|
|
@@ -153,7 +153,7 @@ function f() {
|
|
|
153
153
|
})] })] })
|
|
154
154
|
]
|
|
155
155
|
}) : /* @__PURE__ */ a("div", {
|
|
156
|
-
className: "p-6 text-
|
|
156
|
+
className: "p-6 text-text-secondary",
|
|
157
157
|
children: "No project found."
|
|
158
158
|
});
|
|
159
159
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProjectsProjectDetailsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/ProjectsProjectDetailsPagePage.tsx"],"sourcesContent":["import { Badge, Card, CardContent, CardHeader, CardTitle } from '@burdenoff/fe-libs/ui';\nimport { Calendar, DollarSign, Target, Users } from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\nexport function ProjectsProjectDetailsPagePage() {\n const { projects } = useCrewFoundryStore();\n const project = projects[1]; // Show second project for variety\n if (!project) return <div className=\"p-6 text-
|
|
1
|
+
{"version":3,"file":"ProjectsProjectDetailsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/ProjectsProjectDetailsPagePage.tsx"],"sourcesContent":["import { Badge, Card, CardContent, CardHeader, CardTitle } from '@burdenoff/fe-libs/ui';\nimport { Calendar, DollarSign, Target, Users } from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\nexport function ProjectsProjectDetailsPagePage() {\n const { projects } = useCrewFoundryStore();\n const project = projects[1]; // Show second project for variety\n if (!project) return <div className=\"p-6 text-text-secondary\">No project found.</div>;\n\n return (\n <div className=\"space-y-6 p-6 max-w-4xl\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold\">{project.name}</h1>\n <p className=\"text-sm text-text-secondary\">{project.description}</p>\n </div>\n <div className=\"flex gap-1\">\n <Badge variant={project.priority === 'critical' ? 'destructive' : 'default'}>\n {project.priority}\n </Badge>\n <Badge variant={project.status === 'active' ? 'default' : 'secondary'}>\n {project.status}\n </Badge>\n </div>\n </div>\n <div className=\"grid gap-4 md:grid-cols-4\">\n <Card>\n <CardContent className=\"p-4 text-center\">\n <Target className=\"h-5 w-5 mx-auto text-text-secondary mb-1\" />\n <p className=\"text-lg font-bold\">{project.progress}%</p>\n <p className=\"text-xs text-text-secondary\">Progress</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"p-4 text-center\">\n <DollarSign className=\"h-5 w-5 mx-auto text-text-secondary mb-1\" />\n <p className=\"text-lg font-bold\">${(project.budget / 1000).toFixed(0)}K</p>\n <p className=\"text-xs text-text-secondary\">Budget</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"p-4 text-center\">\n <Users className=\"h-5 w-5 mx-auto text-text-secondary mb-1\" />\n <p className=\"text-lg font-bold\">{project.teamName}</p>\n <p className=\"text-xs text-text-secondary\">Team</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"p-4 text-center\">\n <Calendar className=\"h-5 w-5 mx-auto text-text-secondary mb-1\" />\n <p className=\"text-lg font-bold\">{project.endDate}</p>\n <p className=\"text-xs text-text-secondary\">Deadline</p>\n </CardContent>\n </Card>\n </div>\n <Card>\n <CardHeader>\n <CardTitle>Task Progress</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-2\">\n <div className=\"flex justify-between text-sm\">\n <span>\n {project.completedTasks} of {project.tasks} tasks completed\n </span>\n <span className=\"font-medium\">{project.progress}%</span>\n </div>\n <div className=\"h-3 bg-bg-sunken rounded overflow-hidden\">\n <div className=\"h-3 bg-action-primary-bg rounded\" style={{ width: `${project.progress}%` }} />\n </div>\n </div>\n </CardContent>\n </Card>\n <Card>\n <CardHeader>\n <CardTitle>Budget Tracking</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-2\">\n <div className=\"flex justify-between text-sm\">\n <span>\n Spent ${(project.spent / 1000).toFixed(0)}K of ${(project.budget / 1000).toFixed(0)}\n K\n </span>\n <span className=\"font-medium\">\n {Math.round((project.spent / project.budget) * 100)}%\n </span>\n </div>\n <div className=\"h-3 bg-bg-sunken rounded overflow-hidden\">\n <div\n className={`h-3 rounded ${project.spent / project.budget > 0.9 ? 'bg-red-500' : 'bg-green-500'}`}\n style={{ width: `${Math.round((project.spent / project.budget) * 100)}%` }}\n />\n </div>\n </div>\n <div className=\"grid grid-cols-2 gap-4 mt-4 text-sm\">\n <div>\n <p className=\"text-xs text-text-secondary\">Manager</p>\n <p className=\"font-medium\">{project.managerName}</p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Timeline</p>\n <p>\n {project.startDate} — {project.endDate}\n </p>\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -17,7 +17,7 @@ function f() {
|
|
|
17
17
|
className: "text-2xl font-semibold",
|
|
18
18
|
children: h("crewfoundry.projects.title", "Projects")
|
|
19
19
|
}), /* @__PURE__ */ r("p", {
|
|
20
|
-
className: "text-sm text-
|
|
20
|
+
className: "text-sm text-text-secondary",
|
|
21
21
|
children: [
|
|
22
22
|
m.length,
|
|
23
23
|
" ",
|
|
@@ -54,15 +54,15 @@ function f() {
|
|
|
54
54
|
h("crewfoundry.projects.card.tasks", "tasks")
|
|
55
55
|
] }), /* @__PURE__ */ r("span", { children: [e.progress, "%"] })]
|
|
56
56
|
}), /* @__PURE__ */ n("div", {
|
|
57
|
-
className: "h-2 bg-
|
|
57
|
+
className: "h-2 bg-bg-sunken rounded overflow-hidden",
|
|
58
58
|
children: /* @__PURE__ */ n("div", {
|
|
59
|
-
className: "h-2 bg-primary rounded",
|
|
59
|
+
className: "h-2 bg-action-primary-bg rounded",
|
|
60
60
|
style: { width: `${e.progress}%` }
|
|
61
61
|
})
|
|
62
62
|
})]
|
|
63
63
|
}),
|
|
64
64
|
/* @__PURE__ */ r("div", {
|
|
65
|
-
className: "grid grid-cols-2 gap-2 text-xs text-
|
|
65
|
+
className: "grid grid-cols-2 gap-2 text-xs text-text-secondary",
|
|
66
66
|
children: [
|
|
67
67
|
/* @__PURE__ */ r("span", { children: [
|
|
68
68
|
h("crewfoundry.projects.card.team", "Team"),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProjectsProjectsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/ProjectsProjectsPagePage.tsx"],"sourcesContent":["import {\n Badge,\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n} from '@burdenoff/fe-libs/ui';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { DollarSign, FolderKanban, Plus } from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\nexport function ProjectsProjectsPagePage() {\n const { t: translate } = useI18n();\n const { projects } = useCrewFoundryStore();\n const activeProjects = projects.filter((p) => p.status === 'active');\n const t = (key: string, fallback: string) => {\n const value = translate(key);\n return value === key ? fallback : value;\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\">{t('crewfoundry.projects.title', 'Projects')}</h1>\n <p className=\"text-sm text-
|
|
1
|
+
{"version":3,"file":"ProjectsProjectsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/ProjectsProjectsPagePage.tsx"],"sourcesContent":["import {\n Badge,\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n} from '@burdenoff/fe-libs/ui';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { DollarSign, FolderKanban, Plus } from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\nexport function ProjectsProjectsPagePage() {\n const { t: translate } = useI18n();\n const { projects } = useCrewFoundryStore();\n const activeProjects = projects.filter((p) => p.status === 'active');\n const t = (key: string, fallback: string) => {\n const value = translate(key);\n return value === key ? fallback : value;\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\">{t('crewfoundry.projects.title', 'Projects')}</h1>\n <p className=\"text-sm text-text-secondary\">\n {activeProjects.length}{' '}\n {t('crewfoundry.projects.summary.activeProjects', 'active projects')}\n </p>\n </div>\n <Button size=\"sm\">\n <Plus className=\"h-4 w-4 mr-1\" />\n {t('crewfoundry.projects.actions.newProject', 'New Project')}\n </Button>\n </div>\n <div className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-3\">\n {projects.map((project) => (\n <Card key={project.id} className=\"hover:shadow-md transition-shadow cursor-pointer\">\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <CardTitle className=\"text-base\">{project.name}</CardTitle>\n <Badge\n variant={\n project.status === 'active'\n ? 'default'\n : project.status === 'completed'\n ? 'secondary'\n : 'outline'\n }\n className=\"text-[10px]\"\n >\n {project.status}\n </Badge>\n </div>\n <CardDescription>{project.description}</CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-2 mb-3\">\n <div className=\"flex justify-between text-xs\">\n <span>\n {project.completedTasks}/{project.tasks}{' '}\n {t('crewfoundry.projects.card.tasks', 'tasks')}\n </span>\n <span>{project.progress}%</span>\n </div>\n <div className=\"h-2 bg-bg-sunken rounded overflow-hidden\">\n <div\n className=\"h-2 bg-action-primary-bg rounded\"\n style={{ width: `${project.progress}%` }}\n />\n </div>\n </div>\n <div className=\"grid grid-cols-2 gap-2 text-xs text-text-secondary\">\n <span>\n {t('crewfoundry.projects.card.team', 'Team')}: {project.teamName}\n </span>\n <span>\n {t('crewfoundry.projects.card.manager', 'Manager')}: {project.managerName}\n </span>\n <span>\n {t('crewfoundry.projects.card.budget', 'Budget')}: $\n {(project.budget / 1000).toFixed(0)}K\n </span>\n <span>\n {t('crewfoundry.projects.card.spent', 'Spent')}: $\n {(project.spent / 1000).toFixed(0)}K\n </span>\n </div>\n <div className=\"flex gap-1 mt-2\">\n <Badge\n variant={\n project.priority === 'critical'\n ? 'destructive'\n : project.priority === 'high'\n ? 'default'\n : 'secondary'\n }\n className=\"text-[10px]\"\n >\n {project.priority}\n </Badge>\n <Badge variant=\"outline\" className=\"text-[10px]\">\n {project.startDate} — {project.endDate}\n </Badge>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;AAaA,SAAgB,IAA2B;CACzC,IAAM,EAAE,GAAG,MAAc,GAAS,EAC5B,EAAE,gBAAa,GAAqB,EACpC,IAAiB,EAAS,QAAQ,MAAM,EAAE,WAAW,SAAS,EAC9D,KAAK,GAAa,MAAqB;EAC3C,IAAM,IAAQ,EAAU,EAAI;AAC5B,SAAO,MAAU,IAAM,IAAW;;AAGpC,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;IAAI,WAAU;cAA0B,EAAE,8BAA8B,WAAW;IAAM,CAAA,EACzF,kBAAC,KAAD;IAAG,WAAU;cAAb;KACG,EAAe;KAAQ;KACvB,EAAE,+CAA+C,kBAAkB;KAClE;MACA,EAAA,CAAA,EACN,kBAAC,GAAD;IAAQ,MAAK;cAAb,CACE,kBAAC,GAAD,EAAM,WAAU,gBAAiB,CAAA,EAChC,EAAE,2CAA2C,cAAc,CACrD;MACL;MACN,kBAAC,OAAD;GAAK,WAAU;aACZ,EAAS,KAAK,MACb,kBAAC,GAAD;IAAuB,WAAU;cAAjC,CACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD;MAAW,WAAU;gBAAa,EAAQ;MAAiB,CAAA,EAC3D,kBAAC,GAAD;MACE,SACE,EAAQ,WAAW,WACf,YACA,EAAQ,WAAW,cACjB,cACA;MAER,WAAU;gBAET,EAAQ;MACH,CAAA,CACJ;QACN,kBAAC,GAAD,EAAA,UAAkB,EAAQ,aAA8B,CAAA,CAC7C,EAAA,CAAA,EACb,kBAAC,GAAD,EAAA,UAAA;KACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,QAAD,EAAA,UAAA;QACG,EAAQ;QAAe;QAAE,EAAQ;QAAO;QACxC,EAAE,mCAAmC,QAAQ;QACzC,EAAA,CAAA,EACP,kBAAC,QAAD,EAAA,UAAA,CAAO,EAAQ,UAAS,IAAQ,EAAA,CAAA,CAC5B;UACN,kBAAC,OAAD;OAAK,WAAU;iBACb,kBAAC,OAAD;QACE,WAAU;QACV,OAAO,EAAE,OAAO,GAAG,EAAQ,SAAS,IAAI;QACxC,CAAA;OACE,CAAA,CACF;;KACN,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,kBAAC,QAAD,EAAA,UAAA;QACG,EAAE,kCAAkC,OAAO;QAAC;QAAG,EAAQ;QACnD,EAAA,CAAA;OACP,kBAAC,QAAD,EAAA,UAAA;QACG,EAAE,qCAAqC,UAAU;QAAC;QAAG,EAAQ;QACzD,EAAA,CAAA;OACP,kBAAC,QAAD,EAAA,UAAA;QACG,EAAE,oCAAoC,SAAS;QAAC;SAC/C,EAAQ,SAAS,KAAM,QAAQ,EAAE;QAAC;QAC/B,EAAA,CAAA;OACP,kBAAC,QAAD,EAAA,UAAA;QACG,EAAE,mCAAmC,QAAQ;QAAC;SAC7C,EAAQ,QAAQ,KAAM,QAAQ,EAAE;QAAC;QAC9B,EAAA,CAAA;OACH;;KACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD;OACE,SACE,EAAQ,aAAa,aACjB,gBACA,EAAQ,aAAa,SACnB,YACA;OAER,WAAU;iBAET,EAAQ;OACH,CAAA,EACR,kBAAC,GAAD;OAAO,SAAQ;OAAU,WAAU;iBAAnC;QACG,EAAQ;QAAU;QAAI,EAAQ;QACzB;SACJ;;KACM,EAAA,CAAA,CACT;MArEI,EAAQ,GAqEZ,CACP;GACE,CAAA,CACF"}
|