fix: IndexedDB file storage on stable base — no localStorage quota issues

This commit is contained in:
Dauren777 2026-06-11 06:48:02 +00:00
parent 330a7ff9d1
commit 0890704801

View File

@ -967,6 +967,46 @@ var brs=["Дирекция производственной безопаснос
var stn={warn:"В процессе",late:"Просрочено",done:"Исполнено"};
var stc={warn:"a",late:"r",done:"g"};
var USR={curator:{n:"Куратор ПБ",bg:0},admin:{n:"Администратор",bg:0},dpp:{n:"Директор ДПБ",bg:0},ivanov:{n:"Иванов Иван",bg:1},petrov:{n:"Петров Петр",bg:2},sidorov:{n:"Сидоров Сидор",bg:3},kozhin:{n:"Кожин А.М.",bg:4},ismailov:{n:"Исмаилов Р.К.",bg:1},nurpeisov:{n:"Нурпеисов Д.А.",bg:5},suleimenov:{n:"Сулейменов К.Т.",bg:6},kassenov:{n:"Касенов Б.Б.",bg:7},serikov:{n:"Сериков Е.С.",bg:8},zhunusov:{n:"Жунусов А.А.",bg:2},muratov:{n:"Муратов А.Т.",bg:3},bakirov:{n:"Бакиров Т.Н.",bg:4}};
var DBNAME="hse_fv3";var DBVER=1;var gdb=null;
function openDB(cb){
if(gdb){cb(gdb);return}
var r=indexedDB.open(DBNAME,DBVER);
r.onupgradeneeded=function(e){e.target.result.createObjectStore("files",{keyPath:"id"})};
r.onsuccess=function(e){gdb=e.target.result;cb(gdb)};
r.onerror=function(){cb(null)}
}
function idbPut(id,blob,name,size,type,cb){
openDB(function(db){if(!db){cb(false);return}
var tx=db.transaction("files","readwrite");var st=tx.objectStore("files");
var fr=new FileReader();fr.onload=function(){
st.put({id:id,name:name,size:size,type:type,data:fr.result});
tx.oncomplete=function(){cb(true)};tx.onerror=function(){cb(false)}
};fr.readAsArrayBuffer(new Blob([blob],{type:type||"application/octet-stream"}))
})
}
function idbGetAll(prefix,cb){
openDB(function(db){if(!db){cb([]);return}
var tx=db.transaction("files","readonly");var st=tx.objectStore("files");
var rq=st.getAll();rq.onsuccess=function(){
var all=rq.result||[];var res=[];
for(var i=0;i<all.length;i++){if(all[i].id.indexOf(prefix)===0)res.push(all[i])}
cb(res)
};rq.onerror=function(){cb([])}
})
}
function idbGet(id,cb){
openDB(function(db){if(!db){cb(null);return}
var tx=db.transaction("files","readonly");var st=tx.objectStore("files");
var rq=st.get(id);rq.onsuccess=function(){cb(rq.result)};rq.onerror=function(){cb(null)}
})
}
function idbDel(id,cb){
openDB(function(db){if(!db){cb(false);return}
var tx=db.transaction("files","readwrite");tx.objectStore("files").delete(id);
tx.oncomplete=function(){cb(true)};tx.onerror=function(){cb(false)}
})
}
function esc(s){
return String(s).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")
@ -1283,7 +1323,28 @@ function openEv(id,subIdx){
h+="<div style='margin-top:16px;text-align:right;border-top:1px solid #E2E8F0;padding-top:12px'><button class='btn btn-sm btn-g' onclick='saveEvModal("+e.id+")'>Сохранить</button>";
h+="<button class='btn btn-sm' style='margin-left:8px;background:#E2E8F0;color:#0B1A2E' onclick='closeModal()'>Отмена</button></div>";
h+="</div>";
showModal(h)
showModal(h);
idbGetAll(fk+"_m"+selMonth,function(files){
var fdiv=document.getElementById("fl_"+e.id);if(!fdiv)return;
if(!files||!files.length){fdiv.innerHTML="\u041D\u0435\u0442 \u0444\u0430\u0439\u043B\u043E\u0432";return}
var fh="";var groups={};
for(var i=0;i<files.length;i++){
var f=files[i];var parts=f.id.split("_b");var bi=parseInt(parts[parts.length-1])||0;
if(!groups[bi])groups[bi]=[];groups[bi].push(f)
}
for(var bi=0;bi<brs.length;bi++){
if(!groups[bi]||!groups[bi].length)continue;
if(cu&&cu.bg===0)fh+="<div style='font-size:11px;color:#64748B;margin-top:4px'><strong>"+esc(brs[bi])+":</strong></div>";
for(var j=0;j<groups[bi].length;j++){
var f=groups[bi][j];var kb=Math.round(f.size/1024);
var sz=kb<1024?kb+" KB":(kb/1024).toFixed(1)+" MB";
var d=new Date(f.name.length>0?0:0);var ds="";
try{var dd=new Date(parseInt(f.id.split("_").pop()));ds=dd.getDate()+"."+String(dd.getMonth()+1).padStart(2,"0")+"."+dd.getFullYear()}catch(e){}
fh+="<div class='file-item'><span class='fn'>"+esc(f.name)+"</span><span class='fs'>("+sz+(ds?", "+ds:"")+")</span><a onclick='idbGet(\""+f.id+"\",function(ff){if(!ff)return;var blob=new Blob([ff.data],{type:ff.type||\"\"});var url=URL.createObjectURL(blob);var a=document.createElement(\"a\");a.href=url;a.download=ff.name;document.body.appendChild(a);a.click();document.body.removeChild(a);setTimeout(function(){URL.revokeObjectURL(url)},5000)})'>\u0421\u043A\u0430\u0447\u0430\u0442\u044C</a><a style='color:#EF4444;margin-left:4px' onclick='idbDel(\""+f.id+"\",function(o){if(o)openEv("+e.id+(subIdx!==undefined?","+subIdx:"")+")})'>\u0423\u0434\u0430\u043B\u0438\u0442\u044C</a></div>"
}
}
fdiv.innerHTML=fh||"\u041D\u0435\u0442 \u0444\u0430\u0439\u043B\u043E\u0432"
})
}
function showModal(html){
@ -1340,23 +1401,15 @@ function upFile(id){
var inp=document.getElementById("fu_"+id);
if(!inp||!inp.files||!inp.files[0])return;
var f=inp.files[0];
if(f.size>3145728){alert("\u0424\u0430\u0439\u043B \u0431\u043E\u043B\u044C\u0448\u0435 3MB");return}
var fr=new FileReader();
var subKey=curSub!==null?"_s"+curSub:"";
var inm=document.getElementById("evm_"+id);
var monthKey=inm?"_m"+inm.value:"";
var brKey="_b"+(cu?cu.bg:0);
fr.onload=function(){
var key="sf_"+id+monthKey+subKey+brKey;
var arr=[];
var ex=localStorage.getItem(key);
if(ex){try{arr=JSON.parse(ex)}catch(e){}}
var d=new Date();
arr.push({n:f.name,s:f.size,d:d.getDate()+"."+String(d.getMonth()+1).padStart(2,"0")+"."+d.getFullYear(),u:cu?cu.n:"",data:fr.result});
try{localStorage.setItem(key,JSON.stringify(arr))}catch(e){alert("\u041E\u0448\u0438\u0431\u043A\u0430 \u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u0438\u044F")}
openEv(id,curSub!==null?curSub:undefined)
};
fr.readAsDataURL(f)
var mk=inm?"_m"+inm.value:"_m0";
var sk=curSub!==null?"_s"+curSub:"";
var bk="_b"+(cu?cu.bg:0);
var fileId="sf_"+id+mk+sk+bk+"_"+Date.now();
idbPut(fileId,f,f.name,f.size,f.type,function(ok){
if(ok){openEv(id,curSub!==null?curSub:undefined)}
else{alert("\u041E\u0448\u0438\u0431\u043A\u0430 \u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u0438\u044F")}
})
}
function dlFile(id,idx){
var inm=document.getElementById("evm_"+id);
@ -1992,6 +2045,6 @@ function dlAnalyticsWord(){
var a=document.createElement("a");a.href=URL.createObjectURL(blob);a.download="analytics.doc";a.click()
}
</script></script></script>
</script></script></script></script>
</body>
</html>