import { useEffect, useState } from 'react'; import { Link } from 'react-router'; import { useAuth } from '../auth/AuthContext'; import { Alert, LoadingBlock, errorMessage } from '../components/Feedback'; import { Icon } from '../components/Icon'; import { getDashboardSummary, getHealth } from '../lib/api'; import type { DashboardSummary, HealthResponse } from '../lib/api'; import { actionLabel, formatDate, formatDateOnly } from '../lib/format'; function todayDate(): string { const now = new Date(); const local = new Date(now.getTime() - now.getTimezoneOffset() * 60_000); return local.toISOString().slice(0, 10); } export function DashboardPage() { const { user, hasPermission } = useAuth(); const [summary, setSummary] = useState(null); const [health, setHealth] = useState(null); const [error, setError] = useState(''); useEffect(() => { Promise.all([getDashboardSummary(), getHealth()]) .then(([dashboard, service]) => { setSummary(dashboard); setHealth(service); }) .catch((requestError) => setError(errorMessage(requestError))); }, []); return
RESUMEN OPERATIVO

Buen día, {user?.firstName}

Lo que requiere atención y las próximas tareas de inspección.

{health?.status === 'ok' ? 'Sistema operativo' : 'Verificando sistema'}
{error && {error}} {!summary ? : <>
HOY

Qué requiere atención

INSPECCIONES PLANIFICADAS{summary.counts.plannedInspections}Pendientes de iniciar
VERIFICACIONES VENCIDAS{summary.counts.overdueControls}Requieren control operativo
HALLAZGOS ABIERTOS{summary.counts.openFindings}Seguimiento activo
REGISTROS A VALIDAR{summary.counts.assetsNeedValidation}Datos pendientes de revisión
INVENTARIOS Y SEGUIMIENTO

Estado general

INVENTARIO{summary.counts.totalAssets}Elementos registrados en los inventarios
SIN UBICACIÓN{summary.counts.assetsWithoutGeometry}Sin geometría registrada
ESPERANDO RESPUESTA{summary.counts.awaitingCompanyResponse}{summary.counts.overdueCompanyResponses} vencidas · {summary.counts.companyResponsesDueNext7Days} vencen en 7 días
PRÓXIMAS VERIFICACIONES{summary.counts.controlsNext30Days}{summary.counts.awaitingVerificationSchedule} pendientes de programar
{hasPermission('inspection_findings.read') &&
AGENDA

Próximos controles

Hallazgos que tienen una fecha de verificación programada.

Ver hallazgos
{summary.upcomingControls.length === 0 &&

Todavía no hay controles programados.

} {summary.upcomingControls.map((control) =>
{control.title}

{control.assetCode} · {control.assetName}

)}
}
ACTIVIDAD

Últimos cambios

{hasPermission('audit.read') && Ver auditoría }
{summary.recentAudit.length === 0 ?

Todavía no hay actividad registrada.

: summary.recentAudit.map((event) =>
{actionLabel(event.action)}

{event.actorUsername ?? 'Sistema'}{event.entityType ? ` · ${event.entityType}` : ''}

)}
ACCESOS RÁPIDOS

Administración

InventariosInventario operativo organizado por empresa {hasPermission('asset_types.read') && Configuración de InventariosTipos y campos configurables} {hasPermission('users.read') && UsuariosAccesos y roles}
API {health?.version ?? '—'} · Base {health?.database === 'ok' ? 'operativa' : 'sin verificar'}
}
; }