From 0a9b9138bccaf29356bf4b4e40ed967533bf7f5b Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Tue, 28 Apr 2026 07:06:16 +0000
Subject: [PATCH 1/3] Initial plan
From d849e7d3e6b8af088ab133c351d6044fe2156751 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Tue, 28 Apr 2026 07:14:49 +0000
Subject: [PATCH 2/3] Replace alert() payment errors with inline role=alert
containers in checkout.html
Agent-Logs-Url: https://github.com/dsaub/proyecto-final/sessions/e4ef062a-c246-4ec3-9424-987f29891c30
Co-authored-by: dsaub <54474838+dsaub@users.noreply.github.com>
---
tienda/templates/tienda/checkout.html | 14 +++++++++++---
1 file changed, 11 insertions(+), 3 deletions(-)
diff --git a/tienda/templates/tienda/checkout.html b/tienda/templates/tienda/checkout.html
index 1b88ee9..8747769 100644
--- a/tienda/templates/tienda/checkout.html
+++ b/tienda/templates/tienda/checkout.html
@@ -196,6 +196,7 @@
Guardar esta cuenta de PayPal para futuras compras
+
{% if not addresses or stock_issues %}
Selecciona una dirección de envío válida para activar el pago.
@@ -254,10 +255,12 @@ document.getElementById('pay-card-btn').addEventListener('click', async () => {
const addressId = document.getElementById('shipping-address').value;
if (!addressId) {
- alert('Selecciona una dirección de envío para continuar.');
+ const cardErrors = document.getElementById('card-errors');
+ cardErrors.textContent = 'Selecciona una dirección de envío para continuar.';
return;
}
+ document.getElementById('card-errors').textContent = '';
const btn = document.getElementById('pay-card-btn');
const spinner = document.getElementById('card-spinner');
btn.disabled = true;
@@ -335,9 +338,12 @@ paypal.Buttons({
createOrder: async () => {
const addressId = document.getElementById('shipping-address').value;
if (!addressId) {
- alert('Selecciona una dirección de envío para continuar.');
+ const paypalErrors = document.getElementById('paypal-errors');
+ paypalErrors.textContent = 'Selecciona una dirección de envío para continuar.';
+ paypalErrors.classList.remove('d-none');
return Promise.reject(new Error('Sin dirección'));
}
+ document.getElementById('paypal-errors').classList.add('d-none');
const resp = await fetch('{% url "crear_orden_paypal" %}', {
method: 'POST',
headers: { 'Content-Type': 'application/json', 'X-CSRFToken': CSRF_TOKEN },
@@ -359,7 +365,9 @@ paypal.Buttons({
showSuccess(result.transaction_code);
},
onError: (err) => {
- alert('Error en el pago con PayPal: ' + err);
+ const paypalErrors = document.getElementById('paypal-errors');
+ paypalErrors.textContent = 'Error en el pago con PayPal: ' + err;
+ paypalErrors.classList.remove('d-none');
},
}).render('#paypal-button-container');
{% endif %}
From 25c6fc7315bec31c11cb6a653779d652d4a937d6 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Tue, 28 Apr 2026 07:16:26 +0000
Subject: [PATCH 3/3] Add null guards for error container DOM lookups
Agent-Logs-Url: https://github.com/dsaub/proyecto-final/sessions/e4ef062a-c246-4ec3-9424-987f29891c30
Co-authored-by: dsaub <54474838+dsaub@users.noreply.github.com>
---
tienda/templates/tienda/checkout.html | 20 +++++++++++++-------
1 file changed, 13 insertions(+), 7 deletions(-)
diff --git a/tienda/templates/tienda/checkout.html b/tienda/templates/tienda/checkout.html
index 8747769..04fafd9 100644
--- a/tienda/templates/tienda/checkout.html
+++ b/tienda/templates/tienda/checkout.html
@@ -256,11 +256,12 @@ document.getElementById('pay-card-btn').addEventListener('click', async () => {
const addressId = document.getElementById('shipping-address').value;
if (!addressId) {
const cardErrors = document.getElementById('card-errors');
- cardErrors.textContent = 'Selecciona una dirección de envío para continuar.';
+ if (cardErrors) cardErrors.textContent = 'Selecciona una dirección de envío para continuar.';
return;
}
- document.getElementById('card-errors').textContent = '';
+ const cardErrorsEl = document.getElementById('card-errors');
+ if (cardErrorsEl) cardErrorsEl.textContent = '';
const btn = document.getElementById('pay-card-btn');
const spinner = document.getElementById('card-spinner');
btn.disabled = true;
@@ -339,11 +340,14 @@ paypal.Buttons({
const addressId = document.getElementById('shipping-address').value;
if (!addressId) {
const paypalErrors = document.getElementById('paypal-errors');
- paypalErrors.textContent = 'Selecciona una dirección de envío para continuar.';
- paypalErrors.classList.remove('d-none');
+ if (paypalErrors) {
+ paypalErrors.textContent = 'Selecciona una dirección de envío para continuar.';
+ paypalErrors.classList.remove('d-none');
+ }
return Promise.reject(new Error('Sin dirección'));
}
- document.getElementById('paypal-errors').classList.add('d-none');
+ const paypalErrorsEl = document.getElementById('paypal-errors');
+ if (paypalErrorsEl) paypalErrorsEl.classList.add('d-none');
const resp = await fetch('{% url "crear_orden_paypal" %}', {
method: 'POST',
headers: { 'Content-Type': 'application/json', 'X-CSRFToken': CSRF_TOKEN },
@@ -366,8 +370,10 @@ paypal.Buttons({
},
onError: (err) => {
const paypalErrors = document.getElementById('paypal-errors');
- paypalErrors.textContent = 'Error en el pago con PayPal: ' + err;
- paypalErrors.classList.remove('d-none');
+ if (paypalErrors) {
+ paypalErrors.textContent = 'Error en el pago con PayPal: ' + err;
+ paypalErrors.classList.remove('d-none');
+ }
},
}).render('#paypal-button-container');
{% endif %}