From 50c74b9007002ff7f20ca17ffcc8d7d562b55c08 Mon Sep 17 00:00:00 2001 From: root Date: Tue, 28 Jul 2026 22:56:18 -0400 Subject: [PATCH] admin login fixed. --- apps/admin/src/app/dashboard/billing/page.tsx | 3 +- .../src/app/dashboard/companies/[id]/page.tsx | 88 ++++++++- apps/admin/src/app/dashboard/layout.tsx | 7 +- .../src/app/dashboard/notifications/page.tsx | 103 +++++----- apps/admin/src/app/login/page.tsx | 6 +- apps/admin/src/lib/adminNotifications.test.ts | 82 ++++++++ apps/admin/src/lib/adminNotifications.ts | 89 +++++++++ apps/admin/src/lib/appUrls.test.ts | 6 + apps/admin/src/lib/appUrls.ts | 7 +- apps/api/src/app.ts | 17 +- apps/api/src/middleware/csrf.ts | 16 +- .../modules/admin/admin.billing.service.ts | 36 ++-- apps/api/src/modules/admin/admin.repo.ts | 128 ++++++++++-- apps/api/src/modules/admin/admin.routes.ts | 6 +- .../src/modules/admin/admin.schemas.test.ts | 24 +++ apps/api/src/modules/admin/admin.schemas.ts | 7 +- .../src/modules/admin/admin.service.test.ts | 79 +++++++- apps/api/src/modules/admin/admin.service.ts | 70 ++++++- .../src/modules/auth/auth.employee.routes.ts | 5 +- .../src/tests/api/api-foundation.api.test.ts | 10 +- .../src/tests/api/auth-middleware.api.test.ts | 31 +++ ...employee-carplace-notification.api.test.ts | 13 ++ apps/api/src/tests/integration/admin.test.ts | 44 ++++- .../[locale]/[mode]/admin-sign-in/page.tsx | 20 ++ .../src/components/auth/SignInForm.tsx | 35 +++- .../unit/components/sign-in-form.test.tsx | 184 ++++++++++++++++++ package.json | 1 + scripts/create-admin-user.cjs | 107 ++++++++++ scripts/enroll-admin-2fa.cjs | 49 ++++- 29 files changed, 1155 insertions(+), 118 deletions(-) create mode 100644 apps/admin/src/lib/adminNotifications.test.ts create mode 100644 apps/admin/src/lib/adminNotifications.ts create mode 100644 apps/api/src/modules/admin/admin.schemas.test.ts create mode 100644 apps/homepage/src/app/[locale]/[mode]/admin-sign-in/page.tsx create mode 100644 apps/homepage/tests/unit/components/sign-in-form.test.tsx create mode 100644 scripts/create-admin-user.cjs diff --git a/apps/admin/src/app/dashboard/billing/page.tsx b/apps/admin/src/app/dashboard/billing/page.tsx index 87a5955..c68b1cf 100644 --- a/apps/admin/src/app/dashboard/billing/page.tsx +++ b/apps/admin/src/app/dashboard/billing/page.tsx @@ -212,11 +212,12 @@ const draftLineItem = (): DraftLineItem => ({ }) function money(amount: number, currency: string) { + const safeAmount = Number.isFinite(amount) ? amount : 0 return new Intl.NumberFormat('en-GB', { style: 'currency', currency, minimumFractionDigits: 2, - }).format(amount / 100) + }).format(safeAmount / 100) } function dateLabel(value: string | null | undefined) { diff --git a/apps/admin/src/app/dashboard/companies/[id]/page.tsx b/apps/admin/src/app/dashboard/companies/[id]/page.tsx index cb45340..475a610 100644 --- a/apps/admin/src/app/dashboard/companies/[id]/page.tsx +++ b/apps/admin/src/app/dashboard/companies/[id]/page.tsx @@ -207,6 +207,17 @@ const STATUS_COLORS: Record = { const INPUT_CLASS = 'mt-1 w-full rounded-xl border border-zinc-700 bg-zinc-900 px-3 py-2 text-sm text-zinc-100 outline-none focus:border-emerald-500' const LABEL_CLASS = 'text-xs font-medium uppercase tracking-wide text-zinc-500' +const COMPANY_TABS = [ + { id: 'company', label: 'Company' }, + { id: 'subscription', label: 'Subscription' }, + { id: 'publicProfile', label: 'Public profile' }, + { id: 'legalProfile', label: 'Legal profile' }, + { id: 'operations', label: 'Operations & finance' }, + { id: 'activity', label: 'Activity' }, +] as const + +type CompanyTabId = (typeof COMPANY_TABS)[number]['id'] + function toDateInput(value: string | null | undefined) { return value ? new Date(value).toISOString().slice(0, 10) : '' } @@ -318,6 +329,7 @@ export default function AdminCompanyDetailPage() { const [saving, setSaving] = useState(false) const [savedMessage, setSavedMessage] = useState(null) const [deleteConfirm, setDeleteConfirm] = useState(false) + const [activeTab, setActiveTab] = useState('company') async function fetchData() { try { @@ -566,8 +578,40 @@ export default function AdminCompanyDetailPage() { ))} -
-
+
+
+
+ {COMPANY_TABS.map((tab) => { + const selected = activeTab === tab.id + return ( + + ) + })} +
+
+ + -
+ -
+ -
+ -
+
-
+