/** * Pure data + types for the dashboard-PDF report's widget catalogue. * * Lives in its own file so client-side surfaces (the "Export as PDF" * dialog) can import the catalogue without dragging the server-side * resolver — which imports the DB layer — into the client bundle. * Before this split, `export-dashboard-pdf-button.tsx` pulled * `PDF_DASHBOARD_WIDGETS` from `dashboard-report-data.service.ts`, * whose top-level `import { getKpis } from './dashboard.service'` * dragged in `postgres` and crashed the client build with * "Module not found: Can't resolve 'fs'". */ export const PDF_DASHBOARD_WIDGET_IDS = [ 'kpi_overview', 'pipeline_funnel', 'berth_status', 'source_conversion', 'hot_deals', ] as const; export type PdfDashboardWidgetId = (typeof PDF_DASHBOARD_WIDGET_IDS)[number]; export interface PdfDashboardWidgetOption { id: PdfDashboardWidgetId; label: string; description: string; } /** * Public widget list (label + description) for the export dialog. * Mirrored from the on-screen widget-registry but with PDF-friendly * copy: a "Berth heat" chart is "Berth demand ranking" in print. */ export const PDF_DASHBOARD_WIDGETS: readonly PdfDashboardWidgetOption[] = [ { id: 'kpi_overview', label: 'Key metrics', description: 'Total clients, active interests, pipeline value, occupancy %.', }, { id: 'pipeline_funnel', label: 'Pipeline funnel', description: 'Active interests grouped by pipeline stage.', }, { id: 'berth_status', label: 'Berth status distribution', description: 'Available / under offer / reserved / sold counts.', }, { id: 'source_conversion', label: 'Source conversion', description: 'Inquiries → Clients → Interests → Won, by lead source.', }, { id: 'hot_deals', label: 'Hot deals', description: 'Top 5 active interests by deal-health score.', }, ];