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');