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