diff --git a/usuarios.html b/usuarios.html
index 0d2dc94..a512422 100644
--- a/usuarios.html
+++ b/usuarios.html
@@ -175,43 +175,72 @@
});
}
- async function fetchMunicipios(provName) {
- const selMun = document.getElementById('selMunicipio');
- const loader = document.getElementById('loaderMun');
- selMun.innerHTML = '';
- selMun.disabled = true;
- if(!provName) return;
+ // 1. Cargamos municipios AGRUPADOS por nombre
+async function fetchMunicipios(provName) {
+ const selMun = document.getElementById('selMunicipio');
+ const loader = document.getElementById('loaderMun');
+ selMun.innerHTML = '';
+ selMun.disabled = true;
+ if(!provName) return;
- if (loader) loader.classList.remove('hidden');
+ if (loader) loader.classList.remove('hidden');
+ try {
+ const res = await fetch(`${API_URL}/api/geo/municipios/${provName}`, {
+ headers: { "Authorization": `Bearer ${localStorage.getItem("token")}` }
+ });
+ const data = await res.json();
+
+ if (data.ok && data.municipios.length > 0) {
+ // Agrupamos códigos por municipio
+ const grouped = data.municipios.reduce((acc, m) => {
+ if(!acc[m.municipio]) acc[m.municipio] = [];
+ acc[m.municipio].push(m.codigo_postal);
+ return acc;
+ }, {});
- try {
- const res = await fetch(`${API_URL}/api/geo/municipios/${provName}`, {
- headers: { "Authorization": `Bearer ${localStorage.getItem("token")}` }
- });
- const data = await res.json();
-
- if (data.ok && data.municipios.length > 0) {
- selMun.innerHTML = '';
- data.municipios.forEach(m => {
- const opt = document.createElement('option');
- opt.value = m.municipio;
- opt.dataset.cp = m.codigo_postal;
- opt.innerText = `${m.municipio.toUpperCase()} (${m.codigo_postal})`;
- selMun.appendChild(opt);
- });
- selMun.innerHTML += '';
- selMun.disabled = false;
- } else {
- selMun.innerHTML = '';
- selMun.disabled = false;
- }
- } catch (e) {
- console.error("Error de conexión con la DB geográfica");
- } finally {
- if (loader) loader.classList.add('hidden');
- lucide.createIcons();
- }
+ selMun.innerHTML = '';
+ Object.keys(grouped).sort().forEach(mun => {
+ const opt = document.createElement('option');
+ opt.value = mun;
+ // Guardamos el array de códigos en un dataset
+ opt.dataset.cps = JSON.stringify(grouped[mun]);
+ opt.innerText = `${mun.toUpperCase()} (${grouped[mun].length} CPs)`;
+ selMun.appendChild(opt);
+ });
+ selMun.innerHTML += '';
+ selMun.disabled = false;
}
+ } catch (e) { console.error(e); }
+ finally { if (loader) loader.classList.add('hidden'); }
+}
+
+// 2. Añadimos todos los códigos del municipio de una vez
+function addZoneToUser() {
+ const prov = document.getElementById('selProvince').value;
+ const selMun = document.getElementById('selMunicipio');
+ const munName = selMun.value;
+
+ if (!prov || !munName) { showToast("Selecciona Provincia y Municipio", true); return; }
+
+ if (munName === "OTRO") {
+ const manualCP = document.getElementById('cpInput').value.trim();
+ if(!manualCP) { showToast("Escribe el CP manual", true); return; }
+ tempUserZones.push({ province: prov, city: "MANUAL", cps: manualCP });
+ } else {
+ // Extraemos la lista de CPs del pueblo seleccionado
+ const cpList = JSON.parse(selMun.options[selMun.selectedIndex].dataset.cps);
+ cpList.forEach(cp => {
+ // Evitamos duplicados antes de añadir
+ if (!tempUserZones.some(z => z.city === munName && z.cps === cp)) {
+ tempUserZones.push({ province: prov, city: munName, cps: cp });
+ }
+ });
+ showToast(`✅ Añadidos ${cpList.length} códigos de ${munName}`);
+ }
+
+ renderTempZones();
+ document.getElementById('cpInput').value = "";
+}
function autoFillCP(munName) {
const sel = document.getElementById('selMunicipio');