From ad5b4d6d55beb96d016b57180cdd31c3630bc396 Mon Sep 17 00:00:00 2001 From: marsalva Date: Tue, 24 Feb 2026 07:42:24 +0000 Subject: [PATCH] Actualizar usuarios.html --- usuarios.html | 187 ++++++++++++++++++++++++++++---------------------- 1 file changed, 106 insertions(+), 81 deletions(-) diff --git a/usuarios.html b/usuarios.html index 23bea87..40c7bac 100644 --- a/usuarios.html +++ b/usuarios.html @@ -23,6 +23,15 @@ .text-primary-dynamic { color: var(--primary) !important; } .bg-primary-dynamic { background-color: var(--primary) !important; } .border-primary-dynamic { border-color: var(--primary) !important; } + + /* Toggle Switch Custom */ + .toggle-checkbox:checked { + right: 0; + border-color: #10b981; /* Verde esmeralda */ + } + .toggle-checkbox:checked + .toggle-label { + background-color: #10b981; + } @@ -79,10 +88,9 @@
- - + @@ -95,6 +103,17 @@
+
+
+

Acceso a Bolsa Libre (Solicitar Servicios)

+

Si lo desactivas, este operario solo verá los avisos que la oficina le asigne a dedo.

+
+
+ + +
+
+
@@ -112,12 +131,12 @@
-
-
+
@@ -125,6 +144,7 @@
+
@@ -150,7 +170,7 @@ Personal Contacto - Rol / Gremios + Rol / Permisos Zonas Cobertura Acciones @@ -204,6 +224,17 @@ setupProvinceSelect(); }); + // Oculta/Muestra el interruptor de la bolsa según el rol seleccionado + function toggleBolsaSwitch() { + const role = document.getElementById('uRole').value; + const container = document.getElementById('bolsaSwitchContainer'); + if(role === 'operario') { + container.style.display = 'flex'; + } else { + container.style.display = 'none'; + } + } + function setupProvinceSelect() { const sel = document.getElementById('selProvince'); if(!sel) return; @@ -221,6 +252,8 @@ const loader = document.getElementById('loaderMun'); selMun.innerHTML = ''; selMun.disabled = true; + document.getElementById('hiddenManualCity').value = ""; // Reset + if(!provName) return; if (loader) loader.classList.remove('hidden'); @@ -244,10 +277,10 @@ opt.innerText = `${mun.toUpperCase()} (${grouped[mun].length} CPs)`; selMun.appendChild(opt); }); - selMun.innerHTML += ''; + selMun.innerHTML += ''; selMun.disabled = false; } else { - selMun.innerHTML = ''; + selMun.innerHTML = ''; selMun.disabled = false; } } catch (e) { @@ -258,39 +291,56 @@ } } - function autoFillCP(munName) { - const sel = document.getElementById('selMunicipio'); - if (munName === "OTRO") { - const customMun = prompt("Nombre del Municipio:"); - if (customMun) { - const newOpt = document.createElement('option'); - newOpt.value = customMun.toUpperCase(); - newOpt.innerText = customMun.toUpperCase(); - newOpt.selected = true; - sel.appendChild(newOpt); + function handleMunicipioChange(val) { + if (val === "OTRO") { + const customMun = prompt("Nombre de la población / zona:"); + if (customMun && customMun.trim() !== "") { + // Guardamos el nombre real en el input oculto en lugar de dejar la palabra "OTRO" + document.getElementById('hiddenManualCity').value = customMun.toUpperCase(); + // Cambiamos el texto visual del select para que sepa que está seleccionada + document.getElementById('selMunicipio').options[document.getElementById('selMunicipio').selectedIndex].text = `✔️ ${customMun.toUpperCase()}`; + showToast("Ahora escribe los CPs abajo", false); + } else { + // Si cancela, volvemos a la opción por defecto + document.getElementById('selMunicipio').value = ""; } + } else { + document.getElementById('hiddenManualCity').value = ""; } } function addZoneToUser() { const prov = document.getElementById('selProvince').value; const selMun = document.getElementById('selMunicipio'); - const munName = selMun.value; + const munValue = selMun.value; + const manualCityName = document.getElementById('hiddenManualCity').value; - if (!prov || !munName) { showToast("Selecciona Provincia y Municipio", true); return; } + if (!prov || !munValue) { showToast("Selecciona Provincia y Municipio", true); return; } - if (munName === "OTRO" || (selMun.options[selMun.selectedIndex] && selMun.options[selMun.selectedIndex].text.includes("MANUAL"))) { + if (munValue === "OTRO") { const manualCP = document.getElementById('cpInput').value.trim(); - if(!manualCP) { showToast("Escribe el CP manual", true); return; } - tempUserZones.push({ province: prov, city: munName === "OTRO" ? "MANUAL" : munName, cps: manualCP }); - } else { - const cpList = JSON.parse(selMun.options[selMun.selectedIndex].dataset.cps); - cpList.forEach(cp => { - if (!tempUserZones.some(z => z.city === munName && z.cps === cp)) { - tempUserZones.push({ province: prov, city: munName, cps: cp }); + if(!manualCP) { showToast("Escribe el CP manual en el cuadro", true); return; } + if(!manualCityName) { showToast("Falta el nombre de la población", true); return; } + + // Si ha puesto varios separados por coma o guion + const cpsArray = manualCP.split(/[,-\s]+/).filter(c => c.trim() !== ""); + + cpsArray.forEach(cp => { + if (!tempUserZones.some(z => z.city === manualCityName && z.cps === cp)) { + tempUserZones.push({ province: prov, city: manualCityName, cps: cp }); } }); - showToast(`Añadidos códigos de ${munName}`); + showToast(`Zonas manuales añadidas`); + + } else { + // Modo Automático desde la lista + const cpList = JSON.parse(selMun.options[selMun.selectedIndex].dataset.cps); + cpList.forEach(cp => { + if (!tempUserZones.some(z => z.city === munValue && z.cps === cp)) { + tempUserZones.push({ province: prov, city: munValue, cps: cp }); + } + }); + showToast(`Añadidos códigos de ${munValue}`); } renderTempZones(); document.getElementById('cpInput').value = ""; @@ -364,12 +414,20 @@ lucide.createIcons(); const selectedGuilds = Array.from(document.querySelectorAll('.guild-checkbox:checked')).map(cb => cb.value); + + // Lógica del rol final según el interruptor + let finalRole = document.getElementById('uRole').value; + if (finalRole === 'operario') { + const wantsBolsa = document.getElementById('uBolsaAccess').checked; + if (!wantsBolsa) finalRole = 'operario_cerrado'; + } + const data = { fullName: document.getElementById('uName').value, email: document.getElementById('uEmail').value, phone: document.getElementById('uPhone').value, password: document.getElementById('uPass').value, - role: document.getElementById('uRole').value, + role: finalRole, guilds: selectedGuilds, zones: tempUserZones }; @@ -395,12 +453,22 @@ document.getElementById('uName').value = user.full_name; document.getElementById('uEmail').value = user.email; document.getElementById('uPhone').value = user.phone; - document.getElementById('uRole').value = user.role; + + // Setear el select del rol base + let baseRole = user.role; + if (baseRole === 'operario_cerrado') baseRole = 'operario'; + document.getElementById('uRole').value = baseRole; + toggleBolsaSwitch(); // Muestra el interruptor si es operario + + // Setear el interruptor + document.getElementById('uBolsaAccess').checked = (user.role === 'operario'); + document.getElementById('uPass').value = ""; tempUserZones = user.zones || []; renderTempZones(); const userGuilds = user.guilds || []; document.querySelectorAll('.guild-checkbox').forEach(cb => { cb.checked = userGuilds.includes(parseInt(cb.value)); }); + document.getElementById('formTitle').innerText = "2. Editando Usuario"; document.getElementById('btnCancelEdit').classList.remove('hidden'); window.scrollTo({ top: 0, behavior: 'smooth' }); @@ -420,7 +488,10 @@ document.getElementById('uEmail').value = ""; document.getElementById('uPhone').value = ""; document.getElementById('uPass').value = ""; - document.getElementById('uRole').value = "operario"; // Reset al valor por defecto + document.getElementById('uRole').value = "operario"; + document.getElementById('uBolsaAccess').checked = true; + toggleBolsaSwitch(); + tempUserZones = []; renderTempZones(); document.getElementById('formTitle').innerText = "2. Nueva Ficha de Usuario"; @@ -464,27 +535,20 @@ return `
${city} (${groupedZones[city].join(", ")})
`; }).join("") || 'Sin zona'; - let roleBadge = "OP. NORMAL"; + let roleBadge = "OP. APP (BOLSA LIBRE)"; let roleColor = "bg-blue-50 text-blue-600 border-blue-100"; - let toggleRoleBtnText = "Bolsa Off"; // Botón para cambiar rol if (u.role === 'operario_cerrado') { - roleBadge = "OP. CERRADO"; + roleBadge = "OP. CERRADO (SOLO ASIGNADOS)"; roleColor = "bg-amber-50 text-amber-600 border-amber-200"; - toggleRoleBtnText = "Bolsa On"; } else if (u.role === 'admin') { roleBadge = "ADMINISTRADOR"; roleColor = "bg-purple-50 text-purple-600 border-purple-200"; - toggleRoleBtnText = ""; // Los admin no tienen esto } else if (u.role === 'facturacion') { roleBadge = "FACTURACIÓN"; roleColor = "bg-emerald-50 text-emerald-600 border-emerald-200"; - toggleRoleBtnText = ""; } - // Generar el botón de alternar bolsa si aplica - const toggleRoleHtml = toggleRoleBtnText ? `` : ''; - tbody.innerHTML += ` @@ -504,7 +568,6 @@
${uZonesHtml}
- ${toggleRoleHtml}