1jQuery(document).ready(function($) { 2 var ajax_url_naveza = `${ajax_url}ajax-naveza.php`; 3 4 var t = {}; // translations, populated on init 5 6 var pieColors = [ 7 'rgba(0,155,219,0.8)','rgba(255,99,132,0.8)','rgba(255,205,86,0.8)', 8 'rgba(75,192,192,0.8)','rgba(153,102,255,0.8)','rgba(255,159,64,0.8)', 9 'rgba(54,162,235,0.8)','rgba(201,203,207,0.8)','rgba(231,76,60,0.8)', 10 'rgba(46,204,113,0.8)','rgba(52,152,219,0.8)','rgba(155,89,182,0.8)' 11 ]; 12 13 function htmlspecialchars(str) { 14 return String(str) 15 .replace(/&/g, '&') 16 .replace(/</g, '<') 17 .replace(/>/g, '>') 18 .replace(/"/g, '"'); 19 } 20 21 function buildChart($panel, type, years) { 22 var year = $panel.data('year'); 23 var yearData = years[year]; 24 var $canvas = $panel.find('canvas')[0]; 25 26 if ($canvas._chartInstance) { 27 $canvas._chartInstance.destroy(); 28 } 29 30 var labels = $.map(yearData.rows, function(r) { return r.naziv; }); 31 var data = $.map(yearData.rows, function(r) { return r.stevilo; }); 32 var isPie = type === 'pie'; 33 var isChart = type === 'chart'; 34 35 $canvas._chartInstance = new Chart($canvas, { 36 type: isPie ? 'pie' : 'bar', 37 data: { 38 labels: labels, 39 datasets: [{ 40 label: t.st_prodanih + ' ' + year, 41 data: data, 42 backgroundColor: isPie || isChart ? pieColors : 'rgba(0, 155, 219, 0.7)', 43 borderColor: isPie ? '#fff' : 'rgba(0, 155, 219, 1)', 44 borderWidth: 1 45 }] 46 }, 47 options: { 48 indexAxis: isChart ? 'y' : 'x', 49 responsive: true, 50 plugins: { 51 legend: { display: isPie } 52 }, 53 scales: isPie ? {} : { 54 x: { beginAtZero: true } 55 } 56 } 57 }); 58 } 59 60 function renderMembership($container, years) { 61 var currentView = 'table'; 62 63 var $toggle = $( 64 '<div class="membership-toggle">' + 65 '<button class="membership-view-btn active" data-view="table"><i class="fa-solid fa-table"></i> ' + t.tabela + '</button>' + 66 '<button class="membership-view-btn" data-view="chart"><i class="fa-solid fa-chart-line"></i> ' + t.crtni_diagram + '</button>' + 67 '<button class="membership-view-btn" data-view="pie"><i class="fa-solid fa-chart-pie"></i> ' + t.krozni_diagram + '</button>' + 68 '</div>' 69 ); 70 71 var currentYear = Math.max.apply(null, Object.keys(years).map(Number)); 72 73 var $tabs = $('<div class="membership-tabs"></div>'); 74 $.each(years, function(year) { 75 var isActive = parseInt(year) === currentYear; 76 $tabs.append($('<button class="membership-tab' + (isActive ? ' active' : '') + '" data-year="' + year + '">' + year + '</button>')); 77 }); 78 79 var $panels = $('<div class="membership-panels"></div>'); 80 $.each(years, function(year, yearData) { 81 var isActive = parseInt(year) === currentYear; 82 var $panel = $('<div class="membership-panel' + (isActive ? ' active' : '') + '" data-year="' + year + '"></div>'); 83 84 var $tableWrap = $('<div class="membership-view membership-view-table"></div>'); 85 var $table = $('<table class="table membership-data-table"><thead><tr><th>' + t.clanarina + '</th><th>' + t.st_prodanih + '</th></tr></thead></table>'); 86 var $tbody = $('<tbody></tbody>'); 87 $.each(yearData.rows, function(i, row) { 88 $tbody.append('<tr><td>' + row.naziv + '</td><td>' + row.stevilo + '</td></tr>'); 89 }); 90 $tbody.append('<tr class="membership-total"><td>' + t.skupaj + ':</td><td>' + yearData.skupaj + '</td></tr>'); 91 $table.append($tbody); 92 $tableWrap.append($table); 93 94 var $chartWrap = $('<div class="membership-view membership-view-chart" style="display:none;"><canvas></canvas></div>'); 95 96 $panel.append($tableWrap).append($chartWrap); 97 $panels.append($panel); 98 }); 99 100 $container.append($toggle).append($tabs).append($panels); 101 102 $container.on('click', '.membership-view-btn', function() { 103 var view = $(this).data('view'); 104 if(view === currentView) return; 105 currentView = view; 106 107 $container.find('.membership-view-btn').removeClass('active'); 108 $(this).addClass('active'); 109 110 if(view === 'table') { 111 $container.find('.membership-view-table').show(); 112 $container.find('.membership-view-chart').hide(); 113 } else { 114 $container.find('.membership-view-table').hide(); 115 $container.find('.membership-view-chart').show(); 116 buildChart($container.find('.membership-panel.active'), view, years); 117 } 118 }); 119 120 $container.on('click', '.membership-tab', function() { 121 var year = $(this).data('year'); 122 $container.find('.membership-tab').removeClass('active'); 123 $(this).addClass('active'); 124 $container.find('.membership-panel').removeClass('active'); 125 var $active = $container.find('.membership-panel[data-year="' + year + '"]').addClass('active'); 126 127 if(currentView === 'chart' || currentView === 'pie') { 128 buildChart($active, currentView, years); 129 } 130 }); 131 } 132 133 function initSocietyPage() { 134 var id = $('.society-wrapper').attr('data-society-id'); 135 if(!(id > 0)) return; 136 137 ajax_cb(ajax_url_naveza, 'POST', { method: 'get_membership_data_for_society', societyId: id }, function(obj) { 138 if(!obj.status) return; 139 renderMembership($('.membership-table'), obj.data.years); 140 }); 141 } 142 143 function initMdoPage() { 144 $('#mdo-accordion').on('show.bs.collapse', function(e) { 145 var $body = $(e.target).find('.accordion-body'); 146 var $stats = $body.find('.mdo-stats'); 147 148 if($stats.attr('data-loaded') === 'true') return; 149 150 var mdoId = $stats.data('mdo-id'); 151 if(!(mdoId > 0)) return; 152 153 $stats.html('<p class="mdo-loading">' + t.nalagam + '</p>'); 154 155 ajax_cb(ajax_url_naveza, 'POST', { method: 'get_membership_data_for_mdo', mdoId: mdoId }, function(obj) { 156 $stats.empty().attr('data-loaded', 'true'); 157 158 if(!obj.status) { 159 $stats.html('<p class="text-muted">' + t.ni_podatkov + '</p>'); 160 return; 161 } 162 163 // totals block 164 var $totalsWrap = $('<div class="membership-table mdo-totals mb-4"></div>'); 165 $totalsWrap.append($('<h6 class="mdo-totals-title">' + t.skupaj_mdo + '</h6>')); 166 renderMembership($totalsWrap, obj.data.totals); 167 $stats.append($totalsWrap); 168 169 // po društvih title 170 $stats.append($('<h6 class="mdo-totals-title mt-4">' + t.po_drustvoh + '</h6>')); 171 172 // per-society inner accordion
173 var $inner = $('<div class="accordion mdo-societies-accordion"></div>'); 174 var index = 0; 175 176 $.each(obj.data.societies, function(naziv, societyData) { 177 var innerId = 'mdo-society-' + mdoId + '-' + index; 178 179 var $item = $( 180 '<div class="accordion-item mdo-society-item">' + 181 '<h2 class="accordion-header">' + 182 '<button class="accordion-button collapsed mdo-society-btn" type="button" data-bs-toggle="collapse" data-bs-target="#' + innerId + '" aria-expanded="false">' + 183 htmlspecialchars(naziv) + 184 '</button>' + 185 '</h2>' + 186 '<div id="' + innerId + '" class="accordion-collapse collapse">' + 187 '<div class="accordion-body mdo-society-body"></div>' + 188 '</div>' + 189 '</div>' 190 ); 191 192 $inner.append($item); 193 index++; 194 }); 195 196 $stats.append($inner); 197 198 $inner.on('show.bs.collapse', function(e) { 199 var $body = $(e.target).find('.mdo-society-body'); 200 if($body.attr('data-loaded') === 'true') return; 201 $body.attr('data-loaded', 'true'); 202 203 var naziv = $(e.target).closest('.accordion-item').find('.mdo-society-btn').text().trim(); 204 205 if(obj.data.societies[naziv]) { 206 var $memberWrap = $('<div class="membership-table"></div>'); 207 $body.append($memberWrap); 208 renderMembership($memberWrap, obj.data.societies[naziv].years); 209 } 210 }); 211 }); 212 }); 213 } 214 215 // ââ Boot ââââââââââââââââââââââââââââââââââââââââââââââââââââââ 216 if($('.society-wrapper')[0] || $('.mdo-pd-wrapper')[0]) { 217 ajax_cb(ajax_url_naveza, 'POST', { method: 'get_translations_for_charts' }, function(obj) { 218 if(!obj.status) return; 219 t = obj.data; 220 221 if($('.society-wrapper')[0]) initSocietyPage(); 222 if($('.mdo-pd-wrapper')[0]) initMdoPage(); 223 }); 224 } 225});
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.