(()=>{ const F=FuelTrack; const text=()=>getComputedStyle(document.body).color; const grid=()=>getComputedStyle(document.documentElement).getPropertyValue('--bs-border-color').trim()||'rgba(0,0,0,.1)'; function destroy(id){if(F.charts[id]){F.charts[id].destroy();delete F.charts[id]}} function empty(id,value){F.qs(`#${id}-empty`)?.classList.toggle('d-none',!value);F.qs(`#${id}`)?.classList.toggle('d-none',value)} const commonScales=()=>({x:{ticks:{color:text()},grid:{color:grid()}},y:{beginAtZero:true,ticks:{color:text()},grid:{color:grid()}}}); F.renderBarChart=(id,data)=>{ const el=F.qs(`#${id}`);if(!el)return; const labels=Object.keys(data||{});destroy(id);empty(id,!labels.length);if(!labels.length)return; F.charts[id]=new Chart(el,{type:'bar',data:{labels,datasets:[ {label:'Detal brutto (zł)',data:labels.map(k=>data[k].retail_gross)}, {label:'Do zapłaty brutto (zł)',data:labels.map(k=>data[k].invoice_gross)}, {label:'Różnica brutto (zł)',data:labels.map(k=>data[k].gross_saving)} ]},options:{responsive:true,maintainAspectRatio:false,plugins:{legend:{labels:{color:text()}}},scales:commonScales()}}); }; F.renderMultiLineChart=(id,series,gross=false)=>{ const el=F.qs(`#${id}`);if(!el)return;destroy(id); const keys=Object.keys(series||{}).filter(k=>(series[k]||[]).length);empty(id,!keys.length);if(!keys.length)return; const dates=[...new Set(keys.flatMap(k=>series[k].map(p=>p.date)))].sort(); F.charts[id]=new Chart(el,{type:'line',data:{labels:dates,datasets:keys.map(k=>{const m=new Map(series[k].map(p=>[p.date,p.value]));return{label:`${k} ${gross?'brutto':'netto'} zł/l`,data:dates.map(d=>m.has(d)?m.get(d):null),spanGaps:true,tension:.2,pointRadius:1.5,borderWidth:2}})},options:{responsive:true,maintainAspectRatio:false,interaction:{mode:'index',intersect:false},plugins:{legend:{labels:{color:text()}}},scales:{x:{ticks:{color:text(),maxTicksLimit:12},grid:{color:grid()}},y:{ticks:{color:text()},grid:{color:grid()}}}}}); }; F.renderCostReportChart=(id,data)=>{ const el=F.qs(`#${id}`);if(!el)return; const labels=Object.keys(data||{});destroy(id);empty(id,!labels.length);if(!labels.length)return; F.charts[id]=new Chart(el,{type:'bar',data:{labels,datasets:[ {label:'Detal brutto (zł)',data:labels.map(k=>data[k].retail_gross)}, {label:'Do zapłaty brutto (zł)',data:labels.map(k=>data[k].invoice)}, {label:'Różnica brutto (zł)',data:labels.map(k=>data[k].gross_saving)} ]},options:{responsive:true,maintainAspectRatio:false,plugins:{legend:{labels:{color:text()}}},scales:commonScales()}}); }; })();