Dashboard top primatelji wired to live endpoint (default 2025, year filter)

- Frontend (sport2.html): refreshDashNositelji() koristi /api/dashboard/top-primatelji
  umjesto /v2/potpore/by-year (koji je za 2025 vraćao samo 1 agregirani redak).
  Dropdown proširen na "Sve godine" + 2021..2026. Dodana kolona "Platitelj".
- Backend (pgz_sport_api.py): top-primatelji endpoint sada parsira napomena
  'doc_id=N' i JOIN-a pgz_sport.dokumenti za pdf_url; godina<=0 → sve godine;
  dodane kolone vrsta + pdf_url + doc_title.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Damir Radulić
2026-05-05 09:11:47 +02:00
parent 49ac2c0dc8
commit 31e0374465
3 changed files with 167 additions and 21 deletions
+39 -14
View File
@@ -905,9 +905,13 @@ async function loadDash(){
<div class="card-t">💰 Najveći primatelji javnih potreba</div>
<div style="display:flex;gap:8px;align-items:center">
<select id="dash-god" onchange="refreshDashNositelji()" style="background:var(--bg2);border:1px solid var(--rim);border-radius:5px;padding:6px 10px;color:var(--t1);font-size:12px">
<option value="0">Sve godine</option>
<option value="2026">2026</option>
<option value="2025" selected>2025</option>
<option value="2024">2024</option>
<option value="2023">2023</option>
<option value="2022">2022</option>
<option value="2021">2021</option>
</select>
<span class="tb-s" id="dash-nos-cnt"></span>
</div>
@@ -923,23 +927,44 @@ async function refreshDashNositelji(){
const sel = $('#dash-god');
if(!sel) return;
const god = sel.value;
const lbl = (god === '0' || Number(god) <= 0) ? 'sve godine' : god;
const out = $('#dash-nos-out');
out.innerHTML = '<div class="loading">Učitavanje primatelja '+god+'…</div>';
const d = await api('/v2/potpore/by-year?godina='+god);
out.innerHTML = '<div class="loading">Učitavanje primatelja '+lbl+'…</div>';
// wired na dashboard endpoint koji vraća sve nositelje (ne samo agregate)
const d = await api('/dashboard/top-primatelji?godina='+god+'&limit=50');
if(!d){ out.innerHTML='<div class="empty">Greška pri dohvatu</div>'; return; }
const rows = (d.results || []).slice().sort((a,b)=>Number(b.iznos_eur||0)-Number(a.iznos_eur||0)).slice(0, 25);
$('#dash-nos-cnt').textContent = rows.length+' / '+(d.count||0)+' · ukupno '+fmtEur(d.total||0);
out.innerHTML = `<div style="overflow-x:auto"><table>
<thead><tr><th>#</th><th>Korisnik</th><th>Sport</th><th>Vrsta</th><th class="num">Iznos</th><th>PDF</th></tr></thead>
<tbody>${rows.map((r,i) => `
<tr onclick='openPrimateljDetail(${JSON.stringify(r).replace(/'/g,"&#39;")})'>
const rows = (d.rows || []);
$('#dash-nos-cnt').textContent = rows.length+' primatelja · ukupno '+fmtEur(d.ukupno||0);
if(rows.length === 0){
out.innerHTML = '<div class="empty">Nema podataka za '+lbl+'</div>';
return;
}
out.innerHTML = `<div style="overflow-x:auto;max-height:520px;overflow-y:auto"><table>
<thead><tr><th>#</th><th>Korisnik</th><th>Sport</th><th>Vrsta</th><th class="num">Iznos</th><th>Platitelj</th><th>PDF</th></tr></thead>
<tbody>${rows.map((r,i) => {
const proxy = {
korisnik: r.naziv_kluba,
sport: r.sport && r.sport!=='n/a' ? r.sport : null,
vrsta: r.vrsta,
iznos_eur: r.iznos,
godina: r.godina,
izvor: r.davatelj_naziv,
napomena: r.napomena,
source_url: r.pdf_url,
klub_id: r.klub_id
};
const pjson = JSON.stringify(proxy).replace(/'/g,"&#39;");
return `
<tr onclick='openPrimateljDetail(${pjson})'>
<td>${i+1}</td>
<td><b>${esc(r.korisnik)}</b></td>
<td>${txt(r.sport)}</td>
<td>${txt(r.vrsta)}</td>
<td class="num"><b>${fmtEurFull(r.iznos_eur)}</b></td>
<td>${r.source_url?'<a href="'+esc(r.source_url)+'" target="_blank" onclick="event.stopPropagation()">📄 PDF</a>':'—'}</td>
</tr>`).join('')}</tbody>
<td><b>${esc(r.naziv_kluba)}</b>${r.godina && god==='0' ? ' <span class="tb-s">('+r.godina+')</span>' : ''}</td>
<td>${r.sport && r.sport!=='n/a' ? esc(r.sport) : '—'}</td>
<td>${esc(r.vrsta||'')}</td>
<td class="num"><b>${fmtEurFull(r.iznos)}</b></td>
<td>${esc(r.davatelj_naziv||'')}</td>
<td>${r.pdf_url?'<a href="'+esc(r.pdf_url)+'" target="_blank" onclick="event.stopPropagation()">📄 PDF</a>':'—'}</td>
</tr>`;
}).join('')}</tbody>
</table></div>`;
}