fix: migrate file storage from localStorage to IndexedDB — unlimited storage, no base64 penalty
This commit is contained in:
parent
4e681a42ee
commit
7f4d581e52
109
index.html
109
index.html
@ -974,6 +974,38 @@ var brs=["Дирекция производственной безопаснос
|
|||||||
var stn={warn:"В процессе",late:"Просрочено",done:"Исполнено"};
|
var stn={warn:"В процессе",late:"Просрочено",done:"Исполнено"};
|
||||||
var stc={warn:"a",late:"r",done:"g"};
|
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 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_files_v2";var DBVER=1;var db=null;
|
||||||
|
function openDB(cb){
|
||||||
|
if(db){cb(db);return}
|
||||||
|
var r=indexedDB.open(DBNAME,DBVER);
|
||||||
|
r.onupgradeneeded=function(e){var d=e.target.result;if(!d.objectStoreNames.contains("files")){d.createObjectStore("files",{keyPath:"id"})}};
|
||||||
|
r.onsuccess=function(e){db=e.target.result;cb(db)};
|
||||||
|
r.onerror=function(){db=null;cb(null)}
|
||||||
|
}
|
||||||
|
function saveFile(id,file,cb){
|
||||||
|
openDB(function(d){
|
||||||
|
if(!d){cb(false);return}
|
||||||
|
var tx=d.transaction("files","readwrite");var st=tx.objectStore("files");
|
||||||
|
var fr=new FileReader();
|
||||||
|
fr.onload=function(){st.put({id:id,name:file.name,size:file.size,type:file.type,data:fr.result,ts:new Date().toISOString()});tx.oncomplete=function(){cb(true)}};
|
||||||
|
fr.readAsArrayBuffer(file)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
function getFile(id,cb){
|
||||||
|
openDB(function(d){if(!d){cb(null);return}var tx=d.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 deleteFileDB(id,cb){
|
||||||
|
openDB(function(d){if(!d){cb(false);return}var tx=d.transaction("files","readwrite");var st=tx.objectStore("files");st.delete(id);tx.oncomplete=function(){cb(true)}})
|
||||||
|
}
|
||||||
|
function listFiles(prefix,cb){
|
||||||
|
openDB(function(d){
|
||||||
|
if(!d){cb([]);return}
|
||||||
|
var tx=d.transaction("files","readonly");var st=tx.objectStore("files");
|
||||||
|
var rq=st.openCursor();var res=[];
|
||||||
|
rq.onsuccess=function(e){var c=e.target.result;if(c){if(c.value.id.indexOf(prefix)===0)res.push(c.value);c.continue()}else{cb(res)}}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
function esc(s){
|
function esc(s){
|
||||||
return String(s).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")
|
return String(s).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")
|
||||||
@ -1361,57 +1393,30 @@ function upFile(id){
|
|||||||
var inp=document.getElementById("fu_"+id);
|
var inp=document.getElementById("fu_"+id);
|
||||||
if(!inp||!inp.files||!inp.files[0])return;
|
if(!inp||!inp.files||!inp.files[0])return;
|
||||||
var f=inp.files[0];
|
var f=inp.files[0];
|
||||||
if(f.size>3145728){alert("\u0424\u0430\u0439\u043B \u0431\u043E\u043B\u044C\u0448\u0435 3MB");return}
|
if(f.size>1073741824){alert("\u0424\u0430\u0439\u043B \u0431\u043E\u043B\u044C\u0448\u0435 1GB");return}
|
||||||
var fr=new FileReader();
|
|
||||||
var subKey=curSub!==null?"_s"+curSub:"";
|
var subKey=curSub!==null?"_s"+curSub:"";
|
||||||
var inm=document.getElementById("evm_"+id);
|
var inm=document.getElementById("evm_"+id);
|
||||||
var monthKey=inm?"_m"+inm.value:"";
|
var monthKey=inm?"_m"+inm.value:"";
|
||||||
var brKey="_b"+(cu?cu.bg:0);
|
var brKey="_b"+(cu?cu.bg:0);
|
||||||
var fname=f.name;var fsize=f.size;
|
var fileId="sf_"+id+monthKey+subKey+brKey+"_"+Date.now();
|
||||||
fr.onload=function(){
|
saveFile(fileId,f,function(ok){
|
||||||
var key="sf_"+id+monthKey+subKey+brKey;
|
if(ok){openEv(id,curSub!==null?curSub:undefined)}
|
||||||
var arr=[];
|
else{alert("\u041E\u0448\u0438\u0431\u043A\u0430 \u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u0438\u044F")}
|
||||||
var ex=localStorage.getItem(key);
|
})
|
||||||
if(ex){try{arr=JSON.parse(ex)}catch(e){}}
|
|
||||||
var d=new Date();
|
|
||||||
arr.push({n:fname,s:fsize,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. \u0412\u043E\u0437\u043C\u043E\u0436\u043D\u043E \u0437\u0430\u043F\u043E\u043B\u043D\u0435\u043D\u043E \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0435 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430.");return}
|
|
||||||
openEv(id,curSub!==null?curSub:undefined)
|
|
||||||
};
|
|
||||||
fr.readAsDataURL(f)
|
|
||||||
}
|
}
|
||||||
function dlFile(id,idx){
|
function dlFile(evId,fileId){
|
||||||
var inm=document.getElementById("evm_"+id);
|
if(typeof fileId!=="string"||fileId.length<10)return;
|
||||||
var monthKey=inm?"_m"+inm.value:"";
|
getFile(fileId,function(f){
|
||||||
var key="sf_"+id+monthKey+(curSub!==null?"_s"+curSub:"")+"_b"+(cu?cu.bg:0);
|
if(!f)return;
|
||||||
var ex=localStorage.getItem(key);
|
var blob=new Blob([f.data],{type:f.type||"application/octet-stream"});
|
||||||
if(!ex)return;
|
var url=URL.createObjectURL(blob);
|
||||||
try{
|
var a=document.createElement("a");a.href=url;a.download=f.name;document.body.appendChild(a);a.click();document.body.removeChild(a);
|
||||||
var arr=JSON.parse(ex);
|
setTimeout(function(){URL.revokeObjectURL(url)},5000)
|
||||||
var f=arr[idx];
|
})
|
||||||
if(!f||!f.data)return;
|
|
||||||
var a=document.createElement("a");
|
|
||||||
a.href=f.data;
|
|
||||||
a.download=f.n;
|
|
||||||
document.body.appendChild(a);
|
|
||||||
a.click();
|
|
||||||
document.body.removeChild(a)
|
|
||||||
}catch(e){}
|
|
||||||
}
|
}
|
||||||
function delFile(id,idx){
|
function delFile(evId,fileId){
|
||||||
if(!confirm("\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0444\u0430\u0439\u043B?"))return;
|
if(!confirm("\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0444\u0430\u0439\u043B?"))return;
|
||||||
var inm=document.getElementById("evm_"+id);
|
deleteFileDB(fileId,function(ok){if(ok){openEv(evId,curSub!==null?curSub:undefined)}})
|
||||||
var monthKey=inm?"_m"+inm.value:"";
|
|
||||||
var key="sf_"+id+monthKey+(curSub!==null?"_s"+curSub:"")+"_b"+(cu?cu.bg:0);
|
|
||||||
var ex=localStorage.getItem(key);
|
|
||||||
if(!ex)return;
|
|
||||||
try{
|
|
||||||
var arr=JSON.parse(ex);
|
|
||||||
arr.splice(idx,1);
|
|
||||||
if(arr.length){localStorage.setItem(key,JSON.stringify(arr))}
|
|
||||||
else{localStorage.removeItem(key)}
|
|
||||||
openEv(id,curSub!==null?curSub:undefined)
|
|
||||||
}catch(e){}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function saveBackup(){
|
function saveBackup(){
|
||||||
@ -1588,18 +1593,8 @@ function dlHTML(){
|
|||||||
if(!reportQty&&e.q)reportQty=e.q;
|
if(!reportQty&&e.q)reportQty=e.q;
|
||||||
if(reportNote)hh+="<div class='desc'><strong>\u041E\u043F\u0438\u0441\u0430\u043D\u0438\u0435 \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u044F:</strong><br>"+esc(reportNote)+"</div>";
|
if(reportNote)hh+="<div class='desc'><strong>\u041E\u043F\u0438\u0441\u0430\u043D\u0438\u0435 \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u044F:</strong><br>"+esc(reportNote)+"</div>";
|
||||||
if(reportQty)hh+="<div class='qty'>\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E: "+reportQty+"</div>";
|
if(reportQty)hh+="<div class='qty'>\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E: "+reportQty+"</div>";
|
||||||
var fhtml="";
|
hh+="<div class='files'><strong>\u041F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u044E\u0449\u0438\u0435 \u0444\u0430\u0439\u043B\u044B:</strong> \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B \u0432 \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438</div>";
|
||||||
for(var mi=0;mi<months.length;mi++){
|
|
||||||
for(var si=-1;si<(e.sub?e.sub.length:0);si++){
|
|
||||||
var sk=si>=0?"_s"+si:"";var mk="_m"+months[mi];
|
|
||||||
for(var bk=0;bk<brs.length;bk++){
|
|
||||||
var key="sf_"+e.id+mk+sk+"_b"+bk;
|
|
||||||
var fd=localStorage.getItem(key);
|
|
||||||
if(fd){try{var arr=JSON.parse(fd);for(var fi=0;fi<arr.length;fi++){var f=arr[fi];if(f&&f.n)fhtml+="<a href='"+f.data+"' download='"+esc(f.n)+"'>"+esc(f.n)+" ("+Math.round((f.s||0)/1024)+" KB)</a>"}}catch(ex){}}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(fhtml)hh+="<div class='files'><strong>\u041F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u044E\u0449\u0438\u0435 \u0444\u0430\u0439\u043B\u044B:</strong><br>"+fhtml+"</div>";
|
|
||||||
}
|
}
|
||||||
hh+="<p style='font-size:11px;color:#64748B'><em>\u041E\u0442\u0447\u0451\u0442 \u0441\u0444\u043E\u0440\u043C\u0438\u0440\u043E\u0432\u0430\u043D: "+new Date().toLocaleDateString("ru-RU")+"</em></p></body></html>";
|
hh+="<p style='font-size:11px;color:#64748B'><em>\u041E\u0442\u0447\u0451\u0442 \u0441\u0444\u043E\u0440\u043C\u0438\u0440\u043E\u0432\u0430\u043D: "+new Date().toLocaleDateString("ru-RU")+"</em></p></body></html>";
|
||||||
var blob=new Blob([hh],{type:"text/html"});
|
var blob=new Blob([hh],{type:"text/html"});
|
||||||
@ -1967,6 +1962,6 @@ function dlAnalyticsWord(){
|
|||||||
var blob=new Blob([h],{type:"application/msword"});var a=document.createElement("a");a.href=URL.createObjectURL(blob);a.download="analytics.doc";a.click()
|
var blob=new Blob([h],{type:"application/msword"});var a=document.createElement("a");a.href=URL.createObjectURL(blob);a.download="analytics.doc";a.click()
|
||||||
}
|
}
|
||||||
|
|
||||||
</script></script></script></script></script></script></script>
|
</script></script></script></script></script></script></script></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user