import { useEffect, useState } from 'react'; import type { FormEvent } from 'react'; import { Link, useSearchParams } from 'react-router'; import { PermissionGate } from '../auth/PermissionGate'; import { Alert, EmptyState, LoadingBlock, errorMessage } from '../components/Feedback'; import { Icon } from '../components/Icon'; import { useOperationalContext } from '../context/OperationalContext'; import { OperationalFilters } from '../features/inspections/OperationalFilters'; import { INSPECTION_VISIT_STATUSES, inspectionStatusClass, inspectionVisitStatusLabel, } from '../features/inspections/inspectionPresentation'; import { listInspectionVisits } from '../lib/api'; import type { InspectionVisitListItem, InspectionVisitStatus, PageMeta, } from '../lib/api'; import { formatDate } from '../lib/format'; const statusTabs: Array<{ value: InspectionVisitStatus | ''; label: string }> = [ { value: '', label: 'Todas' }, ...INSPECTION_VISIT_STATUSES, ]; export function InspectionVisitsPage() { const [urlParams, setUrlParams] = useSearchParams(); const context = useOperationalContext(); const [visits, setVisits] = useState([]); const [meta, setMeta] = useState({ page: 1, pageSize: 25, total: 0, totalPages: 0 }); const [loading, setLoading] = useState(true); const [error, setError] = useState(''); const [draftSearch, setDraftSearch] = useState(urlParams.get('search') ?? ''); const search = urlParams.get('search') ?? ''; const rawStatus = urlParams.get('status') ?? ''; const status = INSPECTION_VISIT_STATUSES.some((item) => item.value === rawStatus) ? rawStatus as InspectionVisitStatus : ''; const companyId = context.companyId || urlParams.get('companyId') || ''; const areaId = context.areaId || urlParams.get('areaId') || ''; const inspectorId = urlParams.get('inspectorId') ?? ''; const dateFrom = urlParams.get('dateFrom') ?? ''; const dateTo = urlParams.get('dateTo') ?? ''; const page = Math.max(1, Number(urlParams.get('page') ?? 1) || 1); useEffect(() => { setLoading(true); setError(''); listInspectionVisits({ page, pageSize: 25, search, status, companyId, areaId, inspectorId, dateFrom, dateTo }) .then((response) => { setVisits(response.data); setMeta(response.meta); }) .catch((requestError) => setError(errorMessage(requestError))) .finally(() => setLoading(false)); }, [page, search, status, companyId, areaId, inspectorId, dateFrom, dateTo]); const updateFilter = (key: string, value: string) => { const next = new URLSearchParams(urlParams); if (key === 'areaId') { context.setAreaId(value); next.delete('areaId'); next.delete('companyId'); } else if (key === 'companyId') { context.setCompanyId(value); next.delete('companyId'); } else { value ? next.set(key, value) : next.delete(key); } next.delete('page'); setUrlParams(next); }; const applySearch = (event: FormEvent) => { event.preventDefault(); updateFilter('search', draftSearch.trim()); }; const setPage = (value: number) => { const next = new URLSearchParams(urlParams); value > 1 ? next.set('page', String(value)) : next.delete('page'); setUrlParams(next); }; const statusHref = (value: InspectionVisitStatus | '') => { const next = new URLSearchParams(urlParams); value ? next.set('status', value) : next.delete('status'); next.delete('page'); return `/inspecciones${next.size ? `?${next}` : ''}`; }; return
OPERACIÓN

Inspecciones

Planificá, seguí y consultá todo el ciclo de una inspección desde un único lugar.

Planificar inspección
{error && {error}} {loading ? : visits.length === 0 ? :
{meta.total} inspección{meta.total === 1 ? '' : 'es'}Página {page} de {Math.max(meta.totalPages, 1)}
{visits.map((visit) => )}
InspecciónEstadoÁrea / OperadoraResponsableFecha previstaInventario
{visit.code}{visit.operationalArea?.name ?? 'Sin Área'} · {visit.operatorCompany?.name ?? 'Sin Operadora'}
{inspectionVisitStatusLabel(visit.status)}{visit.operationalArea || visit.operatorCompany ? {visit.operationalArea?.name ?? 'Sin Área'}{visit.operatorCompany?.name ?? 'Sin Operadora'} : Sin contexto}{visit.leadInspector ? `${visit.leadInspector.firstName} ${visit.leadInspector.lastName}` : 'Sin asignar'}{formatDate(visit.plannedStartAt)}inicio planificado{visit.scopeAsset ? {visit.scopeAsset.name}{visit.scopeAsset.code} : <>{visit.assetCount} registro{visit.assetCount === 1 ? '' : 's'}{visit.memberCount} integrante{visit.memberCount === 1 ? '' : 's'}}
{meta.total ? `${(page - 1) * meta.pageSize + 1}–${Math.min(page * meta.pageSize, meta.total)} de ${meta.total}` : '0 resultados'}
}
; }