Merge pull request #13 from EuskadiTech/copilot/disable-button-during-save

Prevent duplicate transactions by disabling save buttons during async operations
This commit is contained in:
Naiel
2026-01-21 12:59:26 +01:00
committed by GitHub
8 changed files with 162 additions and 11 deletions

View File

@@ -199,6 +199,13 @@ PAGES.aulas = {
}
})();
document.getElementById(btn_guardar).onclick = () => {
// Disable button to prevent double-clicking
var guardarBtn = document.getElementById(btn_guardar);
if (guardarBtn.disabled) return;
guardarBtn.disabled = true;
guardarBtn.style.opacity = "0.5";
var data = {
Solicitante: document.getElementById(field_autor).value,
Contenido: document.getElementById(field_contenido).value,
@@ -211,7 +218,13 @@ PAGES.aulas = {
document.getElementById("actionStatus").style.display = "none";
setUrlHash("aulas,solicitudes");
}, SAVE_WAIT);
}).catch((e) => { console.warn('DB.put error', e); });
}).catch((e) => {
console.warn('DB.put error', e);
guardarBtn.disabled = false;
guardarBtn.style.opacity = "1";
document.getElementById("actionStatus").style.display = "none";
toastr.error("Error al guardar la solicitud");
});
};
document.getElementById(btn_borrar).onclick = () => {
if (confirm("¿Quieres borrar esta solicitud?") == true) {
@@ -330,6 +343,13 @@ PAGES.aulas = {
}
})();
document.getElementById(btn_guardar).onclick = () => {
// Disable button to prevent double-clicking
var guardarBtn = document.getElementById(btn_guardar);
if (guardarBtn.disabled) return;
guardarBtn.disabled = true;
guardarBtn.style.opacity = "0.5";
var data = {
Autor: document.getElementById(field_autor).value,
Contenido: document.getElementById(field_contenido).value,
@@ -343,7 +363,13 @@ PAGES.aulas = {
document.getElementById("actionStatus").style.display = "none";
setUrlHash("aulas,informes");
}, SAVE_WAIT);
}).catch((e) => { console.warn('DB.put error', e); });
}).catch((e) => {
console.warn('DB.put error', e);
guardarBtn.disabled = false;
guardarBtn.style.opacity = "1";
document.getElementById("actionStatus").style.display = "none";
toastr.error("Error al guardar el informe");
});
};
document.getElementById(btn_borrar).onclick = () => {
if (confirm("¿Quieres borrar este informe?") == true) {

View File

@@ -122,6 +122,11 @@ PAGES.avisos = {
}
})();
document.getElementById(btn_guardar).onclick = () => {
// Check if button is already disabled to prevent double-clicking
var guardarBtn = document.getElementById(btn_guardar);
if (guardarBtn.disabled) return;
// Validate before disabling button
if (document.getElementById(field_origen).value == "") {
alert("¡Hay que elegir una persona de origen!");
return;
@@ -130,6 +135,11 @@ PAGES.avisos = {
alert("¡Hay que elegir una persona de origen!");
return;
}
// Disable button after validation passes
guardarBtn.disabled = true;
guardarBtn.style.opacity = "0.5";
var data = {
Fecha: document.getElementById(field_fecha).value,
Origen: document.getElementById(field_origen).value,
@@ -148,7 +158,13 @@ PAGES.avisos = {
document.getElementById("actionStatus").style.display = "none";
setUrlHash("avisos");
}, SAVE_WAIT);
}).catch((e) => { console.warn('DB.put error', e); });
}).catch((e) => {
console.warn('DB.put error', e);
guardarBtn.disabled = false;
guardarBtn.style.opacity = "1";
document.getElementById("actionStatus").style.display = "none";
toastr.error("Error al guardar la notificación");
});
};
document.getElementById(btn_borrar).onclick = () => {
if (confirm("¿Quieres borrar esta notificación?") == true) {

View File

@@ -44,6 +44,13 @@ PAGES.comedor = {
}
});
document.getElementById(btn_guardar).onclick = () => {
// Disable button to prevent double-clicking
var guardarBtn = document.getElementById(btn_guardar);
if (guardarBtn.disabled) return;
guardarBtn.disabled = true;
guardarBtn.style.opacity = "0.5";
const newDate = document.getElementById(field_fecha).value;
var data = {
Fecha: newDate,
@@ -62,7 +69,13 @@ PAGES.comedor = {
document.getElementById("actionStatus").style.display = "none";
setUrlHash("comedor");
}, SAVE_WAIT);
}).catch((e) => { console.warn('DB.put error', e); });
}).catch((e) => {
console.warn('DB.put error', e);
guardarBtn.disabled = false;
guardarBtn.style.opacity = "1";
document.getElementById("actionStatus").style.display = "none";
toastr.error("Error al guardar el menú");
});
};
document.getElementById(btn_borrar).onclick = () => {
if (confirm("¿Quieres borrar esta entrada?") == true) {

View File

@@ -82,6 +82,13 @@ PAGES.materiales = {
}
});
document.getElementById(btn_guardar).onclick = () => {
// Disable button to prevent double-clicking
var guardarBtn = document.getElementById(btn_guardar);
if (guardarBtn.disabled) return;
guardarBtn.disabled = true;
guardarBtn.style.opacity = "0.5";
var data = {
Nombre: document.getElementById(field_nombre).value,
Unidad: document.getElementById(field_unidad).value,
@@ -98,7 +105,13 @@ PAGES.materiales = {
document.getElementById("actionStatus").style.display = "none";
setUrlHash("materiales");
}, SAVE_WAIT);
}).catch((e) => { console.warn('DB.put error', e); });
}).catch((e) => {
console.warn('DB.put error', e);
guardarBtn.disabled = false;
guardarBtn.style.opacity = "1";
document.getElementById("actionStatus").style.display = "none";
toastr.error("Error al guardar el material");
});
};
document.getElementById(btn_borrar).onclick = () => {
if (confirm("¿Quieres borrar este material?") == true) {

View File

@@ -136,6 +136,13 @@ PAGES.notas = {
e.target.value = '';
});
document.getElementById(btn_guardar).onclick = () => {
// Disable button to prevent double-clicking
var guardarBtn = document.getElementById(btn_guardar);
if (guardarBtn.disabled) return;
guardarBtn.disabled = true;
guardarBtn.style.opacity = "0.5";
var data = {
Autor: document.getElementById(field_autor).value,
Contenido: document.getElementById(field_contenido).value,
@@ -180,8 +187,20 @@ PAGES.notas = {
document.getElementById("actionStatus").style.display = "none";
setUrlHash("notas");
}, SAVE_WAIT);
}).catch((e) => { console.warn('Attachment upload error', e); document.getElementById("actionStatus").style.display = "none"; });
}).catch((e) => { console.warn('DB.put error', e); document.getElementById("actionStatus").style.display = "none"; });
}).catch((e) => {
console.warn('Attachment upload error', e);
document.getElementById("actionStatus").style.display = "none";
guardarBtn.disabled = false;
guardarBtn.style.opacity = "1";
toastr.error("Error al guardar los adjuntos");
});
}).catch((e) => {
console.warn('DB.put error', e);
document.getElementById("actionStatus").style.display = "none";
guardarBtn.disabled = false;
guardarBtn.style.opacity = "1";
toastr.error("Error al guardar la nota");
});
};
document.getElementById(btn_borrar).onclick = () => {
if (confirm("¿Quieres borrar esta nota?") == true) {

View File

@@ -320,6 +320,11 @@ PAGES.pagos = {
// Confirm final transaction button
document.getElementById(btn_confirm + "2").onclick = () => {
// Disable button to prevent double-clicking
var confirmBtn = document.getElementById(btn_confirm + "2");
if (confirmBtn.disabled) return;
confirmBtn.disabled = true;
confirmBtn.style.opacity = "0.5";
processTransaction();
};
@@ -502,6 +507,16 @@ PAGES.pagos = {
document.getElementById("actionStatus").style.display = "none";
setUrlHash("pagos," + ticketId);
}, SAVE_WAIT);
}).catch((e) => {
console.warn('DB.put error', e);
// Re-enable confirm button on error
var confirmBtn = document.getElementById(btn_confirm + "2");
if (confirmBtn) {
confirmBtn.disabled = false;
confirmBtn.style.opacity = "1";
}
document.getElementById("actionStatus").style.display = "none";
toastr.error("Error al guardar la transacción");
});
}
@@ -1311,6 +1326,10 @@ PAGES.pagos = {
// Save button
document.getElementById(btn_save).onclick = () => {
// Disable button to prevent double-clicking
var saveBtn = document.getElementById(btn_save);
if (saveBtn.disabled) return;
var tipo = document.getElementById(field_tipo).value;
var monto = parseFloat(document.getElementById(field_monto).value);
var personaId = document.getElementById(field_persona).value;
@@ -1350,6 +1369,9 @@ PAGES.pagos = {
return;
}
saveBtn.disabled = true;
saveBtn.style.opacity = "0.5";
// Update transaction data
var updatedData = {
...originalData,
@@ -1376,7 +1398,14 @@ PAGES.pagos = {
document.getElementById("actionStatus").style.display = "none";
setUrlHash("pagos," + transactionId);
}, SAVE_WAIT);
}).catch((e) => { console.warn('DB.put error', e); });
}).catch((e) => {
console.warn('DB.put error', e);
// Re-enable save button on error
saveBtn.disabled = false;
saveBtn.style.opacity = "1";
document.getElementById("actionStatus").style.display = "none";
toastr.error("Error al actualizar la transacción");
});
};
// Cancel button

View File

@@ -147,6 +147,13 @@ PAGES.personas = {
reader.readAsDataURL(file);
});
document.getElementById(btn_guardar).onclick = () => {
// Disable button to prevent double-clicking
var guardarBtn = document.getElementById(btn_guardar);
if (guardarBtn.disabled) return;
guardarBtn.disabled = true;
guardarBtn.style.opacity = "0.5";
var dt = new FormData(pdel);
var data = {
Nombre: document.getElementById(field_nombre).value,
@@ -173,8 +180,20 @@ PAGES.personas = {
document.getElementById("actionStatus").style.display = "none";
setUrlHash("personas");
}, SAVE_WAIT);
}).catch((e) => { console.warn('putAttachment error', e); document.getElementById("actionStatus").style.display = "none"; });
}).catch((e) => { console.warn('DB.put error', e); document.getElementById("actionStatus").style.display = "none"; });
}).catch((e) => {
console.warn('putAttachment error', e);
document.getElementById("actionStatus").style.display = "none";
guardarBtn.disabled = false;
guardarBtn.style.opacity = "1";
toastr.error("Error al guardar la foto");
});
}).catch((e) => {
console.warn('DB.put error', e);
document.getElementById("actionStatus").style.display = "none";
guardarBtn.disabled = false;
guardarBtn.style.opacity = "1";
toastr.error("Error al guardar la persona");
});
};
document.getElementById(btn_ver_monedero).onclick = () => {
setUrlHash("pagos"); // Navigate to pagos and show transactions for this person

View File

@@ -99,10 +99,20 @@ PAGES.supercafe = {
}
});
document.getElementById(btn_guardar).onclick = () => {
// Check if button is already disabled to prevent double-clicking
var guardarBtn = document.getElementById(btn_guardar);
if (guardarBtn.disabled) return;
// Validate before disabling button
if (document.getElementById(field_persona).value == "") {
alert("¡Hay que elegir una persona!");
return;
}
// Disable button after validation passes
guardarBtn.disabled = true;
guardarBtn.style.opacity = "0.5";
var data = {
Fecha: document.getElementById(field_fecha).value,
Persona: document.getElementById(field_persona).value,
@@ -119,7 +129,13 @@ PAGES.supercafe = {
document.getElementById("actionStatus").style.display = "none";
setUrlHash("supercafe");
}, SAVE_WAIT);
}).catch((e) => { console.warn('DB.put error', e); });
}).catch((e) => {
console.warn('DB.put error', e);
guardarBtn.disabled = false;
guardarBtn.style.opacity = "1";
document.getElementById("actionStatus").style.display = "none";
toastr.error("Error al guardar la comanda");
});
};
document.getElementById(btn_borrar).onclick = () => {
if (