From 818dbba6544c61b9cbb5e483ebc656f52e9ac6e4 Mon Sep 17 00:00:00 2001 From: Shni Date: Wed, 15 Oct 2025 13:57:24 -0500 Subject: [PATCH] =?UTF-8?q?feat:=20Agregar=20alertas=20a=20nivel=20de=20p?= =?UTF-8?q?=C3=A1gina=20y=20validaciones=20en=20la=20gesti=C3=B3n=20de=20r?= =?UTF-8?q?ecompensas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../partials/dashboard/dashboard_items.ejs | 29 +++++++++++++++++-- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/src/server/views/partials/dashboard/dashboard_items.ejs b/src/server/views/partials/dashboard/dashboard_items.ejs index 96ca89e..41566ac 100644 --- a/src/server/views/partials/dashboard/dashboard_items.ejs +++ b/src/server/views/partials/dashboard/dashboard_items.ejs @@ -6,6 +6,8 @@ + +
<% if (typeof guildRoles !== 'undefined') { %> @@ -342,14 +344,18 @@ function setCurrentRewards(arr) { document.getElementById('rewardsList').dataset.rewards = JSON.stringify(arr || []); } document.getElementById('addRewardBtn').addEventListener('click', ()=>{ + clearModalError(); const type = document.getElementById('newRewardType').value; - const amt = Number(document.getElementById('newRewardAmount').value) || 0; + const amtRaw = document.getElementById('newRewardAmount').value; + const amt = Number(amtRaw); const key = document.getElementById('newRewardItemKey').value.trim(); const list = getCurrentRewards(); if (type === 'coins') { + if (!amtRaw || isNaN(amt) || amt <= 0) { setModalError('Cantidad de coins debe ser mayor a 0'); return; } list.push({ coins: amt }); } else { if (!key) { setModalError('item.key requerido'); return; } + if (!amtRaw || isNaN(amt) || amt <= 0) { setModalError('Cantidad de item debe ser mayor a 0'); return; } list.push({ items: [{ key, quantity: amt || 1 }] }); } setCurrentRewards(list); @@ -357,6 +363,7 @@ // clear input document.getElementById('newRewardAmount').value = ''; document.getElementById('newRewardItemKey').value = ''; + clearModalError(); }); // Hide item key input when reward type is coins @@ -438,6 +445,21 @@ Array.from(list.querySelectorAll('.delBtn')).forEach(b=>b.addEventListener('click', onDelete)); } + // Page-level alerts (non-blocking) + function showPageAlert(type, msg, ttl) { + try { + const c = document.getElementById('pageAlert'); + if (!c) return; + const color = (type === 'success') ? 'bg-green-600' : (type === 'danger' ? 'bg-red-700' : (type === 'warning' ? 'bg-amber-700' : 'bg-sky-600')); + c.innerHTML = `
${escapeHtml(msg)}
`; + c.classList.remove('hidden'); + const close = document.getElementById('pageAlertClose'); + if (close) close.addEventListener('click', ()=>{ c.classList.add('hidden'); c.innerHTML = ''; }); + if (typeof ttl === 'number' && ttl > 0) setTimeout(()=>{ c.classList.add('hidden'); c.innerHTML = ''; }, ttl); + } catch (e) { console.error('showPageAlert error', e); } + } + function clearPageAlert() { const c = document.getElementById('pageAlert'); if (c) { c.classList.add('hidden'); c.innerHTML=''; } } + function escapeHtml(s){ if (!s) return ''; return String(s).replace(/[&<>"']/g, (m)=>({'&':'&','<':'<','>':'>','"':'"',"'":'''})[m] || m); } function onEdit(e) { @@ -543,7 +565,7 @@ if (!res.ok) throw new Error('delete-failed'); await fetchItems(); } catch (err) { - alert('Error al eliminar'); + showPageAlert('danger','Error al eliminar'); } } @@ -688,7 +710,8 @@ // load raw props button handler document.getElementById('loadRawPropsBtn').addEventListener('click', async ()=>{ const id = document.getElementById('itemId').value; - if (!id) return alert('Abra un item primero para cargar props raw'); + if (!id) { setModalError('Abra un item primero para cargar props raw'); return; } + clearPageAlert(); const raw = await tryLoadRawProps(id); if (!raw) return; try {