fix(F6.1): make field preparation inspection-scoped
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
import { useEffect, useMemo, useState } from 'react';
|
||||
import { Link } from 'react-router';
|
||||
import { Link, useSearchParams } from 'react-router';
|
||||
import { SearchableSelect } from '../components/SearchableSelect';
|
||||
import { Alert, EmptyState, LoadingBlock } from '../components/Feedback';
|
||||
import { formatDate, formatDateOnly } from '../lib/format';
|
||||
@@ -17,6 +17,7 @@ interface VisitOption {
|
||||
code: string;
|
||||
status: string;
|
||||
plannedStartAt: string | null;
|
||||
scopeAsset?: { name: string; typeName?: string } | null;
|
||||
operationalArea: { name: string } | null;
|
||||
operatorCompany: { name: string } | null;
|
||||
}
|
||||
@@ -116,8 +117,10 @@ function findingAction(finding: BriefingFinding, act: BriefingAct, plannedOn: st
|
||||
}
|
||||
|
||||
export function FieldBriefingsPage() {
|
||||
const [searchParams] = useSearchParams();
|
||||
const requestedInspectionId = searchParams.get('inspectionId') ?? '';
|
||||
const [visits, setVisits] = useState<VisitOption[]>([]);
|
||||
const [visitId, setVisitId] = useState('');
|
||||
const [visitId, setVisitId] = useState(requestedInspectionId);
|
||||
const [briefing, setBriefing] = useState<FieldBriefing | null>(null);
|
||||
const [loadingVisits, setLoadingVisits] = useState(true);
|
||||
const [loading, setLoading] = useState(false);
|
||||
@@ -132,12 +135,15 @@ export function FieldBriefingsPage() {
|
||||
const all = [...planned.data, ...drafts.data]
|
||||
.sort((a, b) => String(a.plannedStartAt ?? '').localeCompare(String(b.plannedStartAt ?? '')));
|
||||
setVisits(all);
|
||||
const onlyVisit = all[0];
|
||||
if (all.length === 1 && onlyVisit) setVisitId(onlyVisit.id);
|
||||
if (requestedInspectionId && all.some((visit) => visit.id === requestedInspectionId)) {
|
||||
setVisitId(requestedInspectionId);
|
||||
} else if (all.length === 1 && all[0]) {
|
||||
setVisitId(all[0].id);
|
||||
}
|
||||
}).catch((cause) => {
|
||||
setError(cause instanceof Error ? cause.message : String(cause));
|
||||
}).finally(() => setLoadingVisits(false));
|
||||
}, []);
|
||||
}, [requestedInspectionId]);
|
||||
|
||||
useEffect(() => {
|
||||
if (!visitId) {
|
||||
@@ -158,11 +164,12 @@ export function FieldBriefingsPage() {
|
||||
);
|
||||
|
||||
return <section className="field-briefing-page">
|
||||
<div className="breadcrumb"><Link to="/inspecciones">Inspecciones</Link><span>/</span><span>Preparación para campo</span></div>
|
||||
<div className="page-heading">
|
||||
<div>
|
||||
<span className="eyebrow">ANTES DE SALIR A CAMPO</span>
|
||||
<h1>Preparación de campo</h1>
|
||||
<p>Seleccioná la inspección y revisá los pendientes de Actas anteriores del mismo Área/Yacimiento y Operadora.</p>
|
||||
<span className="eyebrow">ETAPA DE LA INSPECCIÓN</span>
|
||||
<h1>Preparación para campo</h1>
|
||||
<p>Revisá antecedentes y pendientes antes de iniciar la Inspección desde la APK.</p>
|
||||
</div>
|
||||
{briefing && <button className="button secondary no-print" type="button" onClick={() => window.print()}>
|
||||
Imprimir preparación
|
||||
@@ -170,15 +177,15 @@ export function FieldBriefingsPage() {
|
||||
</div>
|
||||
|
||||
<div className="form-card no-print">
|
||||
<label>Inspección planificada</label>
|
||||
<label>Inspección</label>
|
||||
{loadingVisits ? <LoadingBlock label="Cargando inspecciones…" /> : <SearchableSelect
|
||||
value={visitId}
|
||||
onChange={(event) => setVisitId(event.target.value)}
|
||||
searchPlaceholder="Buscar por código, Área u Operadora…"
|
||||
searchPlaceholder="Buscar por código, Yacimiento, Área u Operadora…"
|
||||
>
|
||||
<option value="">Seleccionar inspección…</option>
|
||||
{visits.map((visit) => <option key={visit.id} value={visit.id}>
|
||||
{visit.code} · {visit.operationalArea?.name ?? 'Sin Área'} · {visit.operatorCompany?.name ?? 'Sin Operadora'}
|
||||
{visit.code} · {visit.scopeAsset?.name ?? 'Sin Yacimiento'} · {visit.operationalArea?.name ?? 'Sin Área'} · {visit.operatorCompany?.name ?? 'Sin Operadora'}
|
||||
</option>)}
|
||||
</SearchableSelect>}
|
||||
{selected?.plannedStartAt && <small className="block-muted">Salida prevista: {formatDate(selected.plannedStartAt)}</small>}
|
||||
@@ -189,18 +196,18 @@ export function FieldBriefingsPage() {
|
||||
|
||||
{!loading && !briefing && !error && <EmptyState
|
||||
title="Seleccioná una inspección"
|
||||
text="El sistema reunirá automáticamente los pendientes de inspecciones anteriores del mismo contexto."
|
||||
text="El sistema reunirá automáticamente sus antecedentes y controles pendientes."
|
||||
/>}
|
||||
|
||||
{!loading && briefing && <>
|
||||
<div className="page-heading compact">
|
||||
<div>
|
||||
<span className="eyebrow">{briefing.inspection.code}</span>
|
||||
<h2>{briefing.inspection.area?.name ?? 'Área sin definir'} · {briefing.inspection.operatorCompany?.name ?? 'Operadora sin definir'}</h2>
|
||||
<p>Fecha de referencia: {formatDateOnly(briefing.plannedOn)}</p>
|
||||
<h2>{selected?.scopeAsset?.name ?? 'Yacimiento sin definir'} · {briefing.inspection.area?.name ?? 'Área sin definir'}</h2>
|
||||
<p>{briefing.inspection.operatorCompany?.name ?? 'Operadora sin definir'} · Fecha de referencia: {formatDateOnly(briefing.plannedOn)}</p>
|
||||
</div>
|
||||
<Link className="button secondary no-print" to={`/inspecciones/${briefing.inspection.id}`}>
|
||||
Abrir planificación
|
||||
Volver a la inspección
|
||||
</Link>
|
||||
</div>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user