- Campo universal de ubicación (Google Maps/Waze/OSM/coordenadas/dirección) sobre proveedores extensibles (src/utils/ubicacion) con resolver e inferencia inversa Nominatim (nombre/provincia pre-rellenados, alias cooficiales) - FAB flotante abajo a la derecha que abre la pasarela en un modal accesible (Escape, foco contenido, responsive); sin descripción ni puntuación; avisos de duplicado y filtro de palabras dentro del modal - Aviso PWA reposicionado: tarjeta abajo a la izquierda en móvil, botón compacto arriba a la izquierda en PC (no tapa el FAB) - Suite de pruebas: 88 unitarias/componente (vitest + RTL, offline) y 10 de integración (supertest + SQLite :memory: y Nominatim real opt-in) - CI: workflow de Gitea Actions con npm test + build en push/PR e integración manual
27 lines
1.1 KiB
React
27 lines
1.1 KiB
React
import { inputStyle } from "../styles/shared.js";
|
|
import { PROVINCIAS } from "../constants/provincias.js";
|
|
|
|
// Paso 3 de la pasarela: provincia, pre-rellenada con lo inferido desde la
|
|
// ubicación (si la inferencia falló o no casó con el listado, llega vacía).
|
|
export default function PasoProvincia({ form, setForm }) {
|
|
return (
|
|
<div>
|
|
<label htmlFor="paso-provincia" style={{ fontSize: 12, color: "var(--color-text-secondary)", display: "block", marginBottom: 4 }}>
|
|
Provincia <span style={{ color: "#8B0000" }}>*</span>
|
|
</label>
|
|
<select
|
|
id="paso-provincia"
|
|
style={inputStyle}
|
|
value={form.provincia}
|
|
onChange={(e) => setForm((f) => ({ ...f, provincia: e.target.value }))}
|
|
>
|
|
<option value="">Selecciona provincia...</option>
|
|
{PROVINCIAS.map((p) => <option key={p} value={p}>{p}</option>)}
|
|
</select>
|
|
<p style={{ fontSize: 11, color: "var(--color-text-tertiary)", margin: "6px 0 0" }}>
|
|
Si se rellenó automáticamente desde la ubicación, verifica que es correcta.
|
|
</p>
|
|
</div>
|
|
);
|
|
}
|