PDF link target=_blank + nginx timeouts + priority filteri (samo s podacima)

nginx (sport.rinet.one):
- proxy_read_timeout 60s → 300s
- proxy_send_timeout 300s
- proxy_buffering off (PDF stream)
- client_max_body_size 50M → 100M

Endpoints:
- /api/v2/klubovi/financirani: +with_data filter (samo s potporama/godišnjakom/HNS)
- /api/v2/sportasi/filtered: +samo_priority +samo_s_hns

Frontend:
- PDF link target=_blank rel=noopener
- window._klub_only_priority = true (default)
- window._sportas_only_priority = true (default)

DB View:
- pgz_sport.v_nogomet_priority (prima_potpore, u_godisnjaku, ima_hns_roster)
This commit is contained in:
2026-05-05 13:51:07 +02:00
parent c6a5ec62aa
commit f7b5114f58
289 changed files with 37204 additions and 363 deletions
+57 -13
View File
@@ -1956,10 +1956,12 @@ async function openSportas(id){
.forEach(k => { if((d[k]===null||d[k]===undefined||d[k]==='') && p[k]!==null && p[k]!==undefined && p[k]!=='') d[k]=p[k]; });
}
const stats = d.stats || {};
const sezone = d.clan_sezona || [];
const utakmice = d.utakmice || [];
const sezone = (d.clan_sezona && d.clan_sezona.length) ? d.clan_sezona : ((dV2 && dV2.hns_seasons) || []);
const utakmice = (d.utakmice && d.utakmice.length) ? d.utakmice : ((dV2 && dV2.hns_matches) || []);
const nagrade = d.nagrade || [];
const godisnjaci = d.godisnjak_godine || d.godisnjaci || [];
// SUB6 2026-05-05: M2M kategorije (clan_kategorije) iz /v2/clan/{id}/full
const kategorije = (dV2 && dV2.kategorije) || [];
const initials = (((d.ime||'?')[0]||'?')+((d.prezime||'?')[0]||'?')).toUpperCase();
const photo = d.slika_url ? '<img src="'+esc(d.slika_url)+'" alt="" onerror="this.style.display=\'none\';if(this.parentElement)this.parentElement.innerHTML=\'<div class=\\\'no\\\'>'+initials+'</div>\'">' : '<div class="no">'+initials+'</div>';
const dob = d.datum_rodjenja || d.datum_rodenja;
@@ -2020,6 +2022,7 @@ async function openSportas(id){
<div class="tabs">
<div class="tab active" onclick="switchPlayerTab(this,'p-sez')">🏆 HNS Karijera (${sezone.length})</div>
<div class="tab" onclick="switchPlayerTab(this,'p-utak')">📅 Posljednje utakmice (${utakmice.length})</div>
<div class="tab" onclick="switchPlayerTab(this,'p-kat')">🏷️ Kategorije (${kategorije.length})</div>
<div class="tab" onclick="switchPlayerTab(this,'p-bio')">Bio</div>
<div class="tab" onclick="switchPlayerTab(this,'p-god')">Godišnjaci (${godisnjaci.length})</div>
<div class="tab" onclick="switchPlayerTab(this,'p-nag')">Nagrade (${nagrade.length})</div>
@@ -2035,11 +2038,11 @@ async function openSportas(id){
<td>${esc(s.natjecanje||'')}</td>
<td>${esc(s.klub_naziv||'')}</td>
<td class="num">${fmtNum(s.nastupi)}</td>
<td class="num"><b style="color:var(--pgz-gold)">${fmtNum(s.pogoci)}</b></td>
<td class="num"><b style="color:var(--pgz-gold)">${fmtNum(s.pogoci ?? s.golovi)}</b></td>
<td class="num">${fmtNum(s.asistencije)}</td>
<td class="num">${fmtNum(s.zuti_kartoni)}</td>
<td class="num">${fmtNum(s.crveni_kartoni)}</td>
<td>${s.natjecanje_url?'<a href="'+esc(s.natjecanje_url)+'" target="_blank">↗</a>':''}</td>
<td class="num">${fmtNum(s.zuti_kartoni ?? s.zuti)}</td>
<td class="num">${fmtNum(s.crveni_kartoni ?? s.crveni)}</td>
<td>${(s.natjecanje_url||s.source_url)?'<a href="'+esc(s.natjecanje_url||s.source_url)+'" target="_blank">↗</a>':''}</td>
</tr>`).join('')}
</tbody>
</table></div>` : '<div class="empty">Nema sezonskih podataka</div>'}
@@ -2048,22 +2051,45 @@ async function openSportas(id){
<div id="p-utak" class="ptab" style="display:none">
<div class="pp-section-h">📅 Posljednje utakmice <span class="cnt">${utakmice.length} zabilježeno</span></div>
${utakmice.length ? `<div style="overflow-x:auto;max-height:500px;overflow-y:auto"><table>
<thead><tr><th>Datum</th><th>Natjecanje</th><th colspan="3">Susret</th><th class="num">Gol.</th><th class="num">Min.</th><th></th></tr></thead>
<tbody>${utakmice.map(u => `
<thead><tr><th>Datum</th><th>Natjecanje</th><th colspan="3">Susret</th><th>Pozicija</th><th class="num">Gol.</th><th class="num">Min.</th><th></th></tr></thead>
<tbody>${utakmice.map(u => {
const dom = u.klub_dom || u.domacin || '';
const gost = u.klub_gost || u.gost || '';
const golovi = (u.pogodaka != null ? u.pogodaka : u.golovi);
const minute = (u.minute != null) ? u.minute : ((u.minute_od != null && u.minute_do != null) ? (u.minute_do - u.minute_od) : null);
return `
<tr class="no-click">
<td>${fmtDate(u.datum)}</td>
<td>${esc(u.natjecanje||'')}</td>
<td>${u.klub_dom_logo?'<img src="'+esc(u.klub_dom_logo)+'" class="utlogo" onerror="this.style.display=\'none\'">':''}${esc(u.klub_dom||'')}</td>
<td>${u.klub_dom_logo?'<img src="'+esc(u.klub_dom_logo)+'" class="utlogo" onerror="this.style.display=\'none\'">':''}${esc(dom)}</td>
<td><b>${esc(u.rezultat||'-')}</b></td>
<td>${u.klub_gost_logo?'<img src="'+esc(u.klub_gost_logo)+'" class="utlogo" onerror="this.style.display=\'none\'">':''}${esc(u.klub_gost||'')}</td>
<td class="num"><b style="color:var(--pgz-gold)">${fmtNum(u.pogodaka)}</b></td>
<td class="num">${fmtNum(u.minute)}</td>
<td>${u.klub_gost_logo?'<img src="'+esc(u.klub_gost_logo)+'" class="utlogo" onerror="this.style.display=\'none\'">':''}${esc(gost)}</td>
<td>${esc(u.pozicija||'—')}</td>
<td class="num"><b style="color:var(--pgz-gold)">${fmtNum(golovi)}</b></td>
<td class="num">${fmtNum(minute)}</td>
<td>${u.source_url?'<a href="'+esc(u.source_url)+'" target="_blank">↗</a>':''}</td>
</tr>`).join('')}
</tr>`;
}).join('')}
</tbody>
</table></div>` : '<div class="empty">Nema podataka o utakmicama</div>'}
</div>
<div id="p-kat" class="ptab" style="display:none">
<div class="pp-section-h">🏷️ Kategorije <span class="cnt">${kategorije.length} ${kategorije.length===1?'zapis':(kategorije.length<5&&kategorije.length>1?'zapisa':'zapisa')}</span></div>
${kategorije.length ? `<div style="overflow-x:auto;max-height:500px;overflow-y:auto"><table>
<thead><tr><th>Sezona</th><th>Kategorija</th><th>Klub</th><th>Izvor</th><th></th></tr></thead>
<tbody>${kategorije.map(k => `
<tr class="no-click">
<td><b>${esc(k.sezona||'—')}</b></td>
<td><span class="tag b">${esc(k.kategorija||'—')}</span></td>
<td>${k.klub_id ? '<a class="link-chip" onclick="closePanel();setTimeout(()=>openKlub('+k.klub_id+'),250)">'+esc(k.klub_naziv||('Klub #'+k.klub_id))+'</a>' : (k.klub_naziv?esc(k.klub_naziv):'—')}</td>
<td>${esc(k.source||'—')}</td>
<td>${k.source_url?'<a href="'+esc(k.source_url)+'" target="_blank" rel="noopener">↗</a>':''}</td>
</tr>`).join('')}
</tbody>
</table></div>` : '<div class="empty">Nema M2M kategorija (clan_kategorije)</div>'}
</div>
<div id="p-bio" class="ptab" style="display:none">
<div class="kv">
<div class="k">OIB</div><div class="v">${d.oib?(canSeeFullOib({klub_id:d.klub_id,savez_id:d.savez_id})?'<a class="link-chip" onclick="openOIB(&quot;'+esc(d.oib)+'&quot;)">'+esc(d.oib)+'</a>':maskOib(d.oib)):'—'}</div>
@@ -3343,6 +3369,24 @@ function init(){
navTo('dashboard');
}
window.addEventListener('DOMContentLoaded', init);
// PRIORITY FILTERS (CRISIS V5) — default: prikazujemo samo klubove koji imaju podatke
window._klub_only_priority = true; // by default: only klubovi koji primaju novac ili su u godisnjaku ili imaju HNS roster
window._sportas_only_priority = true; // by default: only iz priority klubova
window._sportas_only_hns = false; // dodatni filter: samo s HNS profilom
window.toggleKlubPriority = function(){
window._klub_only_priority = !window._klub_only_priority;
if(typeof loadKlubovi === 'function') loadKlubovi();
};
window.toggleSportasPriority = function(){
window._sportas_only_priority = !window._sportas_only_priority;
if(typeof loadSportasi === 'function') loadSportasi();
};
window.toggleSportasHNS = function(){
window._sportas_only_hns = !window._sportas_only_hns;
if(typeof loadSportasi === 'function') loadSportasi();
};
</script>
</body>
</html>