Dashboard UI: davatelj dropdown + dynamic years + KORISNIK truncate + PDF link

This commit is contained in:
2026-05-05 13:43:30 +02:00
parent 16b980e842
commit c6a5ec62aa
10 changed files with 606 additions and 72 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

+28 -16
View File
@@ -991,15 +991,12 @@ async function loadDash(){
<div class="card" style="margin-top:14px">
<div class="card-h">
<div class="card-t">💰 Najveći primatelji javnih potreba</div>
<div style="display:flex;gap:8px;align-items:center">
<div style="display:flex;gap:8px;align-items:center;flex-wrap:wrap">
<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>
<select id="dash-davatelj" 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="all" selected>Svi davatelji</option>
</select>
<span class="tb-s" id="dash-nos-cnt"></span>
</div>
@@ -1012,17 +1009,31 @@ async function loadDash(){
}
async function refreshDashNositelji(){
const sel = $('#dash-god');
if(!sel) return;
const god = sel.value;
const selG = $('#dash-god');
const selD = $('#dash-davatelj');
if(!selG) return;
const god = selG.value;
const dav = selD ? selD.value : 'all';
const lbl = (god === '0' || Number(god) <= 0) ? 'sve godine' : god;
const out = $('#dash-nos-out');
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');
const url = '/dashboard/top-primatelji?godina='+god+(dav!=='all' ? '&davatelj='+encodeURIComponent(dav) : '')+'&limit=100';
const d = await api(url);
if(!d){ out.innerHTML='<div class="empty">Greška pri dohvatu</div>'; return; }
// Populate dropdowns dynamically (first time)
if(d.available_years && selG.options.length <= 1){
selG.innerHTML = '<option value="0">Sve godine</option>' + d.available_years.map(y =>
'<option value="'+y.godina+'"'+(String(y.godina)===god?' selected':'')+'>'+y.godina+' ('+y.broj+' / '+fmtEur(y.suma||0)+')</option>'
).join('');
}
if(d.available_davatelji && selD && selD.options.length <= 1){
selD.innerHTML = '<option value="all">Svi davatelji</option>' + d.available_davatelji.map(dn =>
'<option value="'+dn+'"'+(dn===dav?' selected':'')+'>'+dn+'</option>'
).join('');
}
const rows = (d.rows || []);
$('#dash-nos-cnt').textContent = rows.length+' primatelja · ukupno '+fmtEur(d.ukupno||0);
$('#dash-nos-cnt').textContent = rows.length+' primatelja · ukupno '+fmtEur((d.summary && d.summary.total_amount)||d.ukupno||0);
if(rows.length === 0){
out.innerHTML = '<div class="empty">Nema podataka za '+lbl+'</div>';
return;
@@ -1036,16 +1047,17 @@ async function refreshDashNositelji(){
vrsta: r.vrsta,
iznos_eur: r.iznos,
godina: r.godina,
izvor: r.davatelj_naziv,
izvor: r.davatelj,
napomena: r.napomena,
source_url: r.pdf_url,
klub_id: r.klub_id
};
const pjson = JSON.stringify(proxy).replace(/'/g,"&#39;");
const naziv_short = (r.naziv_kluba || '').length > 60 ? r.naziv_kluba.slice(0,57)+'...' : (r.naziv_kluba || '');
return `
<tr onclick='openPrimateljDetail(${pjson})'>
<tr onclick='openPrimateljDetail(${pjson})' title="${esc(r.naziv_kluba || '')}">
<td>${i+1}</td>
<td><b>${esc(r.naziv_kluba)}</b>${r.godina && god==='0' ? ' <span class="tb-s">('+r.godina+')</span>' : ''}</td>
<td><b>${esc(naziv_short)}</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>