v21: индикатор хранилища, кнопка очистки, лимит 1.5 МБ
This commit is contained in:
parent
4cc95a366f
commit
15180b11b9
18
index.html
18
index.html
@ -215,7 +215,9 @@ function renderDashboard(){
|
||||
h+='<select id="rptFrom">'+months.map(function(m,i){return'<option value="'+i+'">'+M(i)+'</option>'}).join("")+'</select>';
|
||||
h+='<span>—</span><select id="rptTo">'+months.map(function(m,i){return'<option value="'+i+'"'+(i===11?" selected":"")+'>'+M(i)+'</option>'}).join("")+'</select>';
|
||||
h+='<button class="btn btn-sm" onclick="downloadReport()">Скачать CSV</button>';
|
||||
h+='<button class="btn btn-sm btn-outline" onclick="downloadHTML()" style="margin-left:8px">Скачать HTML</button></div></div>';
|
||||
h+='<button class="btn btn-sm btn-outline" onclick="downloadHTML()" style="margin-left:8px">Скачать HTML</button>';
|
||||
h+='<div style="margin-top:12px;font-size:12px;color:var(--gray-500)">Хранилище: '+fmtStorage()+'</div>';
|
||||
h+='<button class="btn btn-sm" style="margin-top:6px;background:var(--red);color:#fff" onclick="clearAllFiles()">🗑 Очистить все файлы</button></div></div>';
|
||||
|
||||
document.getElementById("tab-dashboard").innerHTML=h;
|
||||
}
|
||||
@ -442,6 +444,10 @@ function setMD(id,o,si){var k=si>=0?'sf_'+id+'_s'+si:'sf_'+id;localStorage.setIt
|
||||
function getSC(id){var r=localStorage.getItem("ss_"+id);return r?JSON.parse(r):[]}
|
||||
function setSC(id,a){localStorage.setItem("ss_"+id,JSON.stringify(a))}
|
||||
|
||||
function storageUsed(){var t=0;for(var i=0;i<localStorage.length;i++){var k=localStorage.key(i);if(k.indexOf('sf_')===0||k.indexOf('ss_')===0)t+=localStorage.getItem(k).length*2}return t}
|
||||
function fmtStorage(){var b=storageUsed();return b>1048576?(b/1048576).toFixed(1)+' МБ':(b/1024).toFixed(0)+' КБ'}
|
||||
function clearAllFiles(){if(!confirm('Удалить ВСЕ загруженные файлы и отчёты? Это нельзя отменить.'))return;var keys=[];for(var i=0;i<localStorage.length;i++){var k=localStorage.key(i);if(k.indexOf('sf_')===0||k.indexOf('ss_')===0)keys.push(k)}keys.forEach(function(k){localStorage.removeItem(k)});alert('Файлы очищены. Хранилище: '+fmtStorage());renderDashboard()}
|
||||
|
||||
function countFiles(id){
|
||||
var total=0,main=getMD(id);
|
||||
for(var k in main){if(main.hasOwnProperty(k))total+=(main[k].files||[]).length}
|
||||
@ -456,9 +462,15 @@ function uploadFiles(eid,mk,si){
|
||||
if(!fi||!fi.files.length)return;
|
||||
var desc=(document.getElementById('fd'+prefix)||{}).value;desc=(desc||'').trim();
|
||||
var btn=document.getElementById('ub'+prefix);btn.textContent="Загружается...";btn.disabled=true;
|
||||
var MAX=4*1024*1024,ad=getMD(eid,si);if(!ad[mk])ad[mk]={report:"",files:[]};
|
||||
var MAX=1536*1024,ad=getMD(eid,si);if(!ad[mk])ad[mk]={report:"",files:[]};
|
||||
var arr=ad[mk].files,pr=0,sk=0;
|
||||
function fin(){try{setMD(eid,ad,si)}catch(e){alert("Хранилище переполнено")}if(sk)alert(sk+" файл(ов) > 4 МБ пропущены");closeEM();openEdit(eid,curMonth,si>=0?si:undefined)}
|
||||
function fin(){
|
||||
try{setMD(eid,ad,si)}catch(e){
|
||||
var bak=JSON.parse(JSON.stringify(ad));bak[mk].files=bak[mk].files.slice(0,-(pr-sk)||0);try{setMD(eid,bak,si)}catch(e2){}
|
||||
alert("⚠️ Хранилище заполнено. Удалите старые файлы (кнопка «Очистить все файлы» на дашборде).");
|
||||
}
|
||||
if(sk)alert(sk+" файл(ов) > 1.5 МБ пропущены");closeEM();openEdit(eid,curMonth,si>=0?si:undefined)
|
||||
}
|
||||
for(var i=0;i<fi.files.length;i++){(function(f){if(f.size>MAX){sk++;pr++;if(pr===fi.files.length)fin();return}
|
||||
var r=new FileReader();r.onload=function(ev){arr.push({name:f.name,size:f.size,type:f.type,desc:desc,date:new Date().toLocaleDateString(),data:ev.target.result});pr++;if(pr===fi.files.length)fin()};
|
||||
r.onerror=function(){pr++;if(pr===fi.files.length)fin()};r.readAsDataURL(f)})(fi.files[i])}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user