fix(F6.1): load Area operator immediately for planned time
This commit is contained in:
@@ -49,6 +49,12 @@ function inspectorName(person: Inspector): string {
|
|||||||
return `${person.firstName} ${person.lastName}`.trim() || person.username;
|
return `${person.firstName} ${person.lastName}`.trim() || person.username;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function currentLocalDateTime(): string {
|
||||||
|
const now = new Date();
|
||||||
|
const local = new Date(now.getTime() - now.getTimezoneOffset() * 60_000);
|
||||||
|
return local.toISOString().slice(0, 16);
|
||||||
|
}
|
||||||
|
|
||||||
export function InspectionVisitCreateF61Page() {
|
export function InspectionVisitCreateF61Page() {
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
const [departments, setDepartments] = useState<Option[]>([]);
|
const [departments, setDepartments] = useState<Option[]>([]);
|
||||||
@@ -61,8 +67,9 @@ export function InspectionVisitCreateF61Page() {
|
|||||||
const [yacimientoId, setYacimientoId] = useState('');
|
const [yacimientoId, setYacimientoId] = useState('');
|
||||||
const [operatorId, setOperatorId] = useState('');
|
const [operatorId, setOperatorId] = useState('');
|
||||||
const [inspectorId, setInspectorId] = useState('');
|
const [inspectorId, setInspectorId] = useState('');
|
||||||
const [plannedStartAt, setPlannedStartAt] = useState('');
|
const [plannedStartAt, setPlannedStartAt] = useState(currentLocalDateTime);
|
||||||
const [loading, setLoading] = useState(true);
|
const [loading, setLoading] = useState(true);
|
||||||
|
const [loadingOperators, setLoadingOperators] = useState(false);
|
||||||
const [busy, setBusy] = useState(false);
|
const [busy, setBusy] = useState(false);
|
||||||
const [error, setError] = useState('');
|
const [error, setError] = useState('');
|
||||||
|
|
||||||
@@ -110,12 +117,14 @@ export function InspectionVisitCreateF61Page() {
|
|||||||
const parsedStart = new Date(plannedStartAt);
|
const parsedStart = new Date(plannedStartAt);
|
||||||
if (Number.isNaN(parsedStart.getTime())) return;
|
if (Number.isNaN(parsedStart.getTime())) return;
|
||||||
const at = encodeURIComponent(parsedStart.toISOString());
|
const at = encodeURIComponent(parsedStart.toISOString());
|
||||||
|
setLoadingOperators(true);
|
||||||
requestJson<{ data: Option[] }>(`/inspection-visits/planning-context/areas/${areaId}/operators?at=${at}`)
|
requestJson<{ data: Option[] }>(`/inspection-visits/planning-context/areas/${areaId}/operators?at=${at}`)
|
||||||
.then((response) => {
|
.then((response) => {
|
||||||
setOperators(response.data);
|
setOperators(response.data);
|
||||||
if (response.data.length === 1 && response.data[0]) setOperatorId(response.data[0].id);
|
if (response.data.length === 1 && response.data[0]) setOperatorId(response.data[0].id);
|
||||||
})
|
})
|
||||||
.catch((cause) => setError(cause instanceof Error ? cause.message : String(cause)));
|
.catch((cause) => setError(cause instanceof Error ? cause.message : String(cause)))
|
||||||
|
.finally(() => setLoadingOperators(false));
|
||||||
}, [areaId, plannedStartAt]);
|
}, [areaId, plannedStartAt]);
|
||||||
|
|
||||||
const submit = async (event: FormEvent) => {
|
const submit = async (event: FormEvent) => {
|
||||||
@@ -201,10 +210,11 @@ export function InspectionVisitCreateF61Page() {
|
|||||||
|
|
||||||
<label className="field">
|
<label className="field">
|
||||||
<span>Operadora del Área</span>
|
<span>Operadora del Área</span>
|
||||||
<SearchableSelect value={operatorId} onChange={(event) => setOperatorId(event.target.value)} searchPlaceholder="Buscar Operadora…" required disabled={!areaId || !plannedStartAt || operators.length === 0}>
|
<SearchableSelect value={operatorId} onChange={(event) => setOperatorId(event.target.value)} searchPlaceholder="Buscar Operadora…" required disabled={!areaId || !plannedStartAt || loadingOperators || operators.length === 0}>
|
||||||
<option value="">{operators.length === 0 && areaId && plannedStartAt ? 'Sin Operadora vigente para esa fecha' : 'Seleccionar Operadora…'}</option>
|
<option value="">{loadingOperators ? 'Cargando Operadora…' : operators.length === 0 && areaId && plannedStartAt ? 'Sin Operadora vigente para esa fecha' : 'Seleccionar Operadora…'}</option>
|
||||||
{operators.map((operator) => <option key={operator.id} value={operator.id}>{operator.name}</option>)}
|
{operators.map((operator) => <option key={operator.id} value={operator.id}>{operator.name}</option>)}
|
||||||
</SearchableSelect>
|
</SearchableSelect>
|
||||||
|
<small className="muted">Se obtiene de la relación vigente del Área para la fecha y hora de inicio.</small>
|
||||||
</label>
|
</label>
|
||||||
|
|
||||||
<label className="field">
|
<label className="field">
|
||||||
@@ -222,7 +232,7 @@ export function InspectionVisitCreateF61Page() {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
{areaId && yacimientos.length === 0 && <Alert>Esta Área no tiene Yacimientos cargados. No se puede planificar una Inspección hasta corregir su jerarquía.</Alert>}
|
{areaId && yacimientos.length === 0 && <Alert>Esta Área no tiene Yacimientos cargados. No se puede planificar una Inspección hasta corregir su jerarquía.</Alert>}
|
||||||
{areaId && plannedStartAt && operators.length === 0 && <Alert>Esta Área no tiene una Operadora vigente. Podés consultar el Inventario, pero no planificar una Inspección operativa hasta definir esa relación.</Alert>}
|
{areaId && plannedStartAt && !loadingOperators && operators.length === 0 && <Alert>Esta Área no tiene una Operadora vigente para la fecha seleccionada. Podés consultar el Inventario, pero no planificar una Inspección operativa hasta definir esa relación.</Alert>}
|
||||||
|
|
||||||
<div className="form-actions">
|
<div className="form-actions">
|
||||||
<Link className="button secondary" to="/inspecciones">Volver</Link>
|
<Link className="button secondary" to="/inspecciones">Volver</Link>
|
||||||
|
|||||||
Reference in New Issue
Block a user