Files
fuel_track/app/static/js/charts.js
T
Mateusz Gruszczyński 72757cad55 fix w kalkulacji last price
2026-07-14 14:22:08 +02:00

36 lines
2.6 KiB
JavaScript

(()=>{
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()}});
};
})();