diff --git a/src/app/(dashboard)/[portSlug]/admin/backup/page.tsx b/src/app/(dashboard)/[portSlug]/admin/backup/page.tsx index db99410..d9d8131 100644 --- a/src/app/(dashboard)/[portSlug]/admin/backup/page.tsx +++ b/src/app/(dashboard)/[portSlug]/admin/backup/page.tsx @@ -1,10 +1,9 @@ +import { PageHeader } from '@/components/shared/page-header'; + export default function BackupManagementPage() { return (
-
-

Backup Management

-

Manage system backups and restoration

-
+

Coming in Layer 4

diff --git a/src/app/(dashboard)/[portSlug]/admin/branding/page.tsx b/src/app/(dashboard)/[portSlug]/admin/branding/page.tsx index 6891c1a..aaca5f0 100644 --- a/src/app/(dashboard)/[portSlug]/admin/branding/page.tsx +++ b/src/app/(dashboard)/[portSlug]/admin/branding/page.tsx @@ -2,6 +2,7 @@ import { SettingsFormCard, type SettingFieldDef, } from '@/components/admin/shared/settings-form-card'; +import { PageHeader } from '@/components/shared/page-header'; const FIELDS: SettingFieldDef[] = [ { @@ -47,13 +48,10 @@ const FIELDS: SettingFieldDef[] = [ export default function BrandingSettingsPage() { return (

-
-

Branding

-

- Logo, primary color, app name, and email header/footer HTML used by the branded auth shell - and outgoing email templates. -

-
+ -
-

Documenso & EOI

-

- API credentials and default EOI generation pathway. Use the test-connection button to - verify a saved configuration before relying on it. -

-
+ -
-

Email Settings

-

- Per-port outgoing email configuration. SMTP credentials and the From address default to - environment variables when these fields are blank. -

-
+ -
-

Data Import

-

Import data from external sources

-
+

Coming in Layer 4

diff --git a/src/app/(dashboard)/[portSlug]/admin/invitations/page.tsx b/src/app/(dashboard)/[portSlug]/admin/invitations/page.tsx index 526a6ec..da5e4fc 100644 --- a/src/app/(dashboard)/[portSlug]/admin/invitations/page.tsx +++ b/src/app/(dashboard)/[portSlug]/admin/invitations/page.tsx @@ -1,15 +1,13 @@ import { InvitationsManager } from '@/components/admin/invitations/invitations-manager'; +import { PageHeader } from '@/components/shared/page-header'; export default function InvitationsPage() { return (

-
-

Invitations

-

- Send a single-use invitation to a new CRM user. The recipient sets their own password via - the link in the email. -

-
+
); diff --git a/src/app/(dashboard)/[portSlug]/admin/onboarding/page.tsx b/src/app/(dashboard)/[portSlug]/admin/onboarding/page.tsx index f3ad81b..d4f9abf 100644 --- a/src/app/(dashboard)/[portSlug]/admin/onboarding/page.tsx +++ b/src/app/(dashboard)/[portSlug]/admin/onboarding/page.tsx @@ -1,10 +1,9 @@ +import { PageHeader } from '@/components/shared/page-header'; + export default function OnboardingPage() { return (
-
-

Onboarding

-

Guided setup for new port configurations

-
+

Coming in Layer 4

diff --git a/src/app/(dashboard)/[portSlug]/admin/page.tsx b/src/app/(dashboard)/[portSlug]/admin/page.tsx index 51f9976..7396b88 100644 --- a/src/app/(dashboard)/[portSlug]/admin/page.tsx +++ b/src/app/(dashboard)/[portSlug]/admin/page.tsx @@ -20,6 +20,7 @@ import { } from 'lucide-react'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; +import { PageHeader } from '@/components/shared/page-header'; interface AdminSection { href: string; @@ -165,13 +166,10 @@ export default async function AdminLandingPage({ const { portSlug } = await params; return (

-
-

Administration

-

- Per-port configuration and system administration. Each card below opens a dedicated - settings page. -

-
+
{SECTIONS.map((s) => { const Icon = s.icon; diff --git a/src/app/(dashboard)/[portSlug]/admin/reminders/page.tsx b/src/app/(dashboard)/[portSlug]/admin/reminders/page.tsx index 019eb68..af70669 100644 --- a/src/app/(dashboard)/[portSlug]/admin/reminders/page.tsx +++ b/src/app/(dashboard)/[portSlug]/admin/reminders/page.tsx @@ -2,6 +2,7 @@ import { SettingsFormCard, type SettingFieldDef, } from '@/components/admin/shared/settings-form-card'; +import { PageHeader } from '@/components/shared/page-header'; const DEFAULT_FIELDS: SettingFieldDef[] = [ { @@ -53,14 +54,10 @@ const DIGEST_FIELDS: SettingFieldDef[] = [ export default function ReminderSettingsPage() { return (
-
-

Reminders

-

- Default reminder behaviour for new interests and the optional daily-digest delivery - window. Individual users can still configure their own digest preferences in Notifications - → Preferences. -

-
+ -
-

Scheduled Reports

-

Configure and manage automated report delivery

-
+

Coming in Layer 3

diff --git a/src/app/(dashboard)/[portSlug]/admin/webhooks/page.tsx b/src/app/(dashboard)/[portSlug]/admin/webhooks/page.tsx index 1f2fc79..be44d1d 100644 --- a/src/app/(dashboard)/[portSlug]/admin/webhooks/page.tsx +++ b/src/app/(dashboard)/[portSlug]/admin/webhooks/page.tsx @@ -2,6 +2,7 @@ import { useCallback, useEffect, useState } from 'react'; import { Button } from '@/components/ui/button'; +import { PageHeader } from '@/components/shared/page-header'; import { Badge } from '@/components/ui/badge'; import { AlertDialog, @@ -36,7 +37,11 @@ export default function WebhooksPage() { const [deleteTarget, setDeleteTarget] = useState(null); const [expandedId, setExpandedId] = useState(null); const [regenerating, setRegenerating] = useState(null); - const [newSecret, setNewSecret] = useState<{ webhookId: string; secret: string; masked: string } | null>(null); + const [newSecret, setNewSecret] = useState<{ + webhookId: string; + secret: string; + masked: string; + } | null>(null); const loadWebhooks = useCallback(async () => { try { @@ -98,15 +103,20 @@ export default function WebhooksPage() { return (

-
-
-

Webhooks

-

Configure outgoing webhook integrations

-
- -
+ { + setEditTarget(null); + setFormOpen(true); + }} + > + Add Webhook + + } + /> {loading ? (

Loading...

@@ -116,7 +126,13 @@ export default function WebhooksPage() {

Add a webhook to receive real-time notifications of CRM events.

-
@@ -141,17 +157,16 @@ export default function WebhooksPage() {
- @@ -163,11 +178,7 @@ export default function WebhooksPage() { > Delete -
@@ -228,18 +239,26 @@ export default function WebhooksPage() { onSuccess={loadWebhooks} /> - { if (!open) setDeleteTarget(null); }}> + { + if (!open) setDeleteTarget(null); + }} + > Delete Webhook - Delete "{deleteTarget?.name}"? This will also delete all delivery history. This action - cannot be undone. + Delete "{deleteTarget?.name}"? This will also delete all delivery history. + This action cannot be undone. Cancel - + Delete diff --git a/src/components/admin/system-monitoring-dashboard.tsx b/src/components/admin/system-monitoring-dashboard.tsx index f575d48..3748f3b 100644 --- a/src/components/admin/system-monitoring-dashboard.tsx +++ b/src/components/admin/system-monitoring-dashboard.tsx @@ -7,6 +7,7 @@ import { apiFetch } from '@/lib/api/client'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { ServiceHealthCard } from './service-health-card'; import { QueueOverview } from './queue-overview'; +import { PageHeader } from '@/components/shared/page-header'; import type { HealthStatus, QueueStatus, @@ -17,16 +18,14 @@ import type { export function SystemMonitoringDashboard() { const { data: healthData } = useQuery({ queryKey: ['system', 'health'], - queryFn: () => - apiFetch<{ data: HealthStatus }>('/api/v1/admin/health').then((r) => r.data), + queryFn: () => apiFetch<{ data: HealthStatus }>('/api/v1/admin/health').then((r) => r.data), staleTime: 30_000, refetchInterval: 30_000, }); const { data: queuesData } = useQuery({ queryKey: ['system', 'queues'], - queryFn: () => - apiFetch<{ data: QueueStatus[] }>('/api/v1/admin/queues').then((r) => r.data), + queryFn: () => apiFetch<{ data: QueueStatus[] }>('/api/v1/admin/queues').then((r) => r.data), staleTime: 10_000, refetchInterval: 10_000, }); @@ -47,11 +46,10 @@ export function SystemMonitoringDashboard() { return (
- {/* Page header */} -
-

System Monitoring

-

Real-time health, queue status and connection tracking

-
+ {/* Service health */}
@@ -79,10 +77,7 @@ export function SystemMonitoringDashboard() { ) : (
{[1, 2, 3, 4].map((i) => ( -
+
))}
)} @@ -124,9 +119,7 @@ export function SystemMonitoringDashboard() { -

- {queues.reduce((sum, q) => sum + q.active, 0)} -

+

{queues.reduce((sum, q) => sum + q.active, 0)}

@@ -141,10 +134,7 @@ export function SystemMonitoringDashboard() { ) : (
{[1, 2, 3, 4, 5].map((i) => ( -
+
))}
)} @@ -159,8 +149,7 @@ export function SystemMonitoringDashboard() { function RecentErrorsPanel() { const { data: errorsData } = useQuery({ queryKey: ['system', 'errors'], - queryFn: () => - apiFetch<{ data: RecentError[] }>('/api/v1/admin/errors').then((r) => r.data), + queryFn: () => apiFetch<{ data: RecentError[] }>('/api/v1/admin/errors').then((r) => r.data), staleTime: 30_000, refetchInterval: 30_000, });