import Link from 'next/link'; import { Bell, Briefcase, Database, FileText, HardDrive, Inbox, Key, LayoutDashboard, Mail, Palette, ScrollText, Settings, Shield, Sliders, Tag, Upload, Users, UsersRound, Webhook, Globe, } from 'lucide-react'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { PageHeader } from '@/components/shared/page-header'; interface AdminSection { href: string; label: string; description: string; icon: typeof Settings; } interface AdminGroup { title: string; description: string; sections: AdminSection[]; } const GROUPS: AdminGroup[] = [ { title: 'Access', description: 'Who can sign in and what they can do once they do.', sections: [ { href: 'users', label: 'Users', description: 'CRM accounts, role assignments, and per-user residential access toggles.', icon: Users, }, { href: 'invitations', label: 'Invitations', description: 'Send invitations, track pending invites, and resend or revoke them.', icon: Mail, }, { href: 'roles', label: 'Roles & Permissions', description: 'Default permission sets and per-port role overrides.', icon: Shield, }, ], }, { title: 'Configuration', description: 'Branding, integrations, and per-port settings.', sections: [ { href: 'email', label: 'Email Settings', description: 'From address, signatures, and per-port SMTP overrides.', icon: Mail, }, { href: 'documenso', label: 'Documenso & EOI', description: 'API credentials, EOI template, and default in-app vs Documenso pathway.', icon: FileText, }, { href: 'reminders', label: 'Reminders', description: 'Default reminder behaviour and the daily-digest delivery window.', icon: Bell, }, { href: 'branding', label: 'Branding', description: 'App name, logo, primary color, and email header/footer HTML.', icon: Palette, }, { href: 'settings', label: 'System Settings', description: 'Generic key/value configuration store for advanced flags.', icon: Settings, }, { href: 'webhooks', label: 'Webhooks', description: 'Outgoing webhook subscriptions, secrets, and delivery log.', icon: Webhook, }, ], }, { title: 'Content', description: 'Forms, templates, and labels that users see.', sections: [ { href: 'forms', label: 'Forms', description: 'Form templates used by client-facing inquiry and intake flows.', icon: Sliders, }, { href: 'templates', label: 'Document Templates', description: 'PDF + email templates with merge-field placeholders.', icon: FileText, }, { href: 'email-templates', label: 'Email Templates', description: 'Customize subject lines for transactional emails (portal, inquiry, invite).', icon: Mail, }, { href: 'tags', label: 'Tags', description: 'Color-coded tags applied to clients, yachts, companies, and interests.', icon: Tag, }, { href: 'custom-fields', label: 'Custom Fields', description: 'Tenant-defined fields for clients, yachts, and reservations.', icon: Key, }, ], }, { title: 'Data Quality', description: 'Cleanup, imports, and the audit trail.', sections: [ { href: 'inquiries', label: 'Inquiry Inbox', description: 'Submissions captured from the public marketing site (berth, residence, contact).', icon: Inbox, }, { href: 'sends', label: 'Send Log', description: 'Brochure and per-berth PDF sends, with delivery failures surfaced for retry.', icon: Mail, }, { href: 'duplicates', label: 'Duplicates', description: 'Review queue of suspected duplicate clients flagged by the dedup engine.', icon: UsersRound, }, { href: 'import', label: 'Bulk Import', description: 'CSV-driven imports for clients, yachts, and reservations.', icon: Upload, }, { href: 'audit', label: 'Audit Log', description: 'Searchable log of every authenticated mutation in the system.', icon: ScrollText, }, ], }, { title: 'Operations', description: 'Health checks and disaster recovery.', sections: [ { href: 'reports', label: 'Reports', description: 'Saved analytics views and ad-hoc query results.', icon: LayoutDashboard, }, { href: 'monitoring', label: 'Queue Monitoring', description: 'BullMQ queue health, throughput, and retry diagnostics.', icon: Database, }, { href: 'backup', label: 'Backup & Restore', description: 'Backup posture + retention policy (read-only).', icon: HardDrive, }, { href: 'storage', label: 'Storage Backend', description: 'Choose between S3-compatible object store or local filesystem; migrate between them.', icon: HardDrive, }, ], }, { title: 'Tenancy', description: 'Multi-port and multi-install scaffolding.', sections: [ { href: 'ports', label: 'Ports', description: 'Manage the marinas/ports this installation serves.', icon: Briefcase, }, { href: 'onboarding', label: 'Onboarding checklist', description: 'Setup checklist for fresh ports (read-only references).', icon: LayoutDashboard, }, ], }, { title: 'Integrations', description: 'Third-party providers wired into the app.', sections: [ { href: 'ai', label: 'AI configuration', description: 'Master switch + provider credentials shared by every AI surface (OCR, berth-PDF parser, future recommender embeddings).', icon: ScrollText, }, { href: 'ocr', label: 'Receipt OCR (per-feature)', description: 'Provider, model, and confidence thresholds for the receipt scanner.', icon: ScrollText, }, { href: 'website-analytics', label: 'Website analytics (Umami)', description: 'Per-port Umami URL, API token, and Website ID.', icon: Globe, }, { href: 'residential-stages', label: 'Residential pipeline stages', description: 'Configure stages residential interests flow through. Removing a stage with active interests prompts for reassignment.', icon: ScrollText, }, ], }, ]; export default async function AdminLandingPage({ params, }: { params: Promise<{ portSlug: string }>; }) { const { portSlug } = await params; return (
{GROUPS.map((group) => (

{group.title}

{group.description}

{group.sections.map((s) => { const Icon = s.icon; return (
{s.label}
{s.description}
); })}
))}
); }