From 5893645c46c491bddb97fef25e48d139b461d2e9 Mon Sep 17 00:00:00 2001 From: Maciej Pienczyn Date: Tue, 14 Apr 2026 19:29:06 +0200 Subject: [PATCH] =?UTF-8?q?fix(fees):=20naprawiono=20klik=20w=20kwadrat=20?= =?UTF-8?q?miesi=C4=85ca=20(konflikt=20cudzys=C5=82ow=C3=B3w=20w=20onclick?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Błąd: onclick="fn({{ name|tojson }})" — Jinja tojson generuje wartość z cudzysłowami, które łamały atrybut HTML (zewnętrzne też cudzysłowy). Efekt: klik w kwadrat nie robił nic. Naprawa: przejście na data-* atrybuty + DOMContentLoaded event listener z document.querySelectorAll. Zero escapingu, zero konfliktów. Co-Authored-By: Claude Opus 4.6 (1M context) --- templates/admin/fees.html | 42 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/templates/admin/fees.html b/templates/admin/fees.html index bd21cbf..df31fbe 100755 --- a/templates/admin/fees.html +++ b/templates/admin/fees.html @@ -497,14 +497,30 @@ + data-company-id="{{ cf.company.id }}" + data-company-name="{{ cf.company.name }}" + data-year="{{ year }}" + data-month="{{ m }}" + data-fee-id="{{ fee.id }}" + data-amount="{{ fee.amount|int }}" + data-expected="{{ expected }}" + data-is-paid="{{ 'true' if fee.status == 'paid' else 'false' }}" + data-amount-paid="{{ fee.amount_paid|int if fee.amount_paid else 0 }}"> {{ m }}{% if fee.status == 'partial' %}{{ fee.amount_paid|int }}{% endif %}{% if underpaid %}!{% endif %} {% else %} + data-company-id="{{ cf.company.id }}" + data-company-name="{{ cf.company.name }}" + data-year="{{ year }}" + data-month="{{ m }}" + data-fee-id="" + data-amount="{{ expected }}" + data-expected="{{ expected }}" + data-is-paid="false" + data-amount-paid="0"> {{ m }} {% endif %} @@ -770,6 +786,28 @@ async function generateFees() { document.getElementById('paymentModal').classList.remove('active'); } + // Event delegation — wszystkie klikalne kwadraciki miesięcy w widoku rocznym + document.addEventListener('DOMContentLoaded', function() { + document.querySelectorAll('.month-cell.clickable').forEach(function(cell) { + cell.addEventListener('click', function(ev) { + ev.preventDefault(); + var d = cell.dataset; + var feeId = d.feeId ? parseInt(d.feeId) : null; + openPaymentModalSmart( + parseInt(d.companyId), + d.companyName, + parseInt(d.year), + parseInt(d.month), + feeId, + parseFloat(d.amount), + parseFloat(d.expected), + d.isPaid === 'true', + parseFloat(d.amountPaid || 0) + ); + }); + }); + }); + document.getElementById('paymentForm').addEventListener('submit', async function(e) { e.preventDefault();