diff --git a/app.html b/app.html
index fa33bce..9bb72e5 100644
--- a/app.html
+++ b/app.html
@@ -155,25 +155,28 @@ function rMS(){
function rDB(){
var c=document.getElementById("dbc");if(!c)return;
var a=getA(),all=allU();
+ // Сохраняем значения фильтров до перерисовки
+ var savedDf=(document.getElementById("df")||{}).value||"",savedDt=(document.getElementById("dt")||{}).value||"";
// Date filter
- var df=document.getElementById("df"),dt=document.getElementById("dt");
- if(df&&df.value)a=a.filter(function(x){return x.date>=df.value});
- if(dt&&dt.value)a=a.filter(function(x){return x.date<=dt.value});
+ if(savedDf)a=a.filter(function(x){return x.date>=savedDf});
+ if(savedDt)a=a.filter(function(x){return x.date<=savedDt});
var t=a.length,sf=a.filter(function(x){return x.overallSafe}).length,wd=a.filter(function(x){return !x.overallSafe}).length,tv=a.reduce(function(s,x){return s+(x.totalViolations||0)},0);
var ot=0,bh=0,ov=0;for(var k in all){if(k==="admin")continue;var u=all[k];var q=getUserQuota(u);if(!q.p)continue;var p=gp(q.p);var d=a.filter(function(x){return x.createdBy===k&&new Date(x.date)>=p.s}).length;if(d>q.c)ov++;else if(d>=q.c)ot++;else bh++}
var adb=isA()?"
|
":"";
- c.innerHTML=adb+"
спо
"+
+ c.innerHTML=adb+"
спо
"+
"
"+t+"
Всего аудитов
"+sf+"
Безопасно
"+wd+"
С нарушениями
"+tv+"
Всего пунктов нарушений
"+(ot+ov)+"
Выполняют график
"+bh+"
Отстают от графика
"+
"
📂 Нарушения по категориям
📅 Динамика по датам
"+
"
🔝 Топ-10 нарушений
";
- setTimeout(function(){
+ // Charts — с проверкой что canvas существует
+ var initCharts=function(){if(!document.getElementById("ch1")){setTimeout(initCharts,100);return}
if(window._charts){for(var ck in window._charts)try{window._charts[ck].destroy()}catch(e){}}window._charts={};
- var ctx1=document.getElementById("ch1");if(ctx1)window._charts.cat=new Chart(ctx1,{type:"bar",data:{labels:CATS.map(function(c){return c.title.split(". ")[1]}),datasets:[{label:"Нарушений",data:CATS.map(function(cat){return a.reduce(function(s,x){var c2=x.categories&&x.categories[cat.id];return s+(c2?c2.items.length:0)},0)}),backgroundColor:"#E63946",borderRadius:4}]},options:{responsive:true,plugins:{legend:{display:false}}}});
+ window._charts.cat=new Chart(document.getElementById("ch1"),{type:"bar",data:{labels:CATS.map(function(c){return c.title.split(". ")[1]}),datasets:[{label:"Нарушений",data:CATS.map(function(cat){return a.reduce(function(s,x){var c2=x.categories&&x.categories[cat.id];return s+(c2?c2.items.length:0)},0)}),backgroundColor:"#E63946",borderRadius:4}]},options:{responsive:true,plugins:{legend:{display:false}}}});
var dates={};a.forEach(function(x){if(!dates[x.date])dates[x.date]=0;dates[x.date]+=(x.totalViolations||0)});var sd=Object.keys(dates).sort();
- var ctx2=document.getElementById("ch2");if(ctx2)window._charts.tl=new Chart(ctx2,{type:"line",data:{labels:sd,datasets:[{label:"Нарушений",data:sd.map(function(d){return dates[d]}),borderColor:"#E63946",tension:0.3,pointRadius:4}]},options:{responsive:true,plugins:{legend:{display:false}}}});
+ window._charts.tl=new Chart(document.getElementById("ch2"),{type:"line",data:{labels:sd,datasets:[{label:"Нарушений",data:sd.map(function(d){return dates[d]}),borderColor:"#E63946",tension:0.3,pointRadius:4}]},options:{responsive:true,plugins:{legend:{display:false}}}});
var ic={};a.forEach(function(x){if(x.categories){Object.values(x.categories).forEach(function(cat){if(cat.items)cat.items.forEach(function(it){ic[it.item]=(ic[it.item]||0)+1})})}});var ti=Object.entries(ic).sort(function(a,b){return b[1]-a[1]}).slice(0,10);
- var ctx3=document.getElementById("ch3");if(ctx3)window._charts.top=new Chart(ctx3,{type:"bar",data:{labels:ti.map(function(i){return i[0]}),datasets:[{label:"Раз",data:ti.map(function(i){return i[1]}),backgroundColor:["#E63946","#E76F51","#F4A261","#E9C46A","#2A9D8F","#264653","#00B4D8","#0077B6","#023E8A","#6C757D"],borderRadius:4}]},options:{indexAxis:"y",responsive:true,plugins:{legend:{display:false}}}});
- },300);
+ window._charts.top=new Chart(document.getElementById("ch3"),{type:"bar",data:{labels:ti.map(function(i){return i[0]}),datasets:[{label:"Раз",data:ti.map(function(i){return i[1]}),backgroundColor:["#E63946","#E76F51","#F4A261","#E9C46A","#2A9D8F","#264653","#00B4D8","#0077B6","#023E8A","#6C757D"],borderRadius:4}]},options:{indexAxis:"y",responsive:true,plugins:{legend:{display:false}}}});
+ };
+ setTimeout(initCharts,200);
}
function rVL(){var c=document.getElementById("vlc");if(!c)return;var a=getA(),td=new Date().toISOString().split("T")[0],av=[];