diff --git a/index.html b/index.html index 78fdda5..7cecc3e 100644 --- a/index.html +++ b/index.html @@ -222,37 +222,47 @@ function renderDashboard(){ function downloadReport(){ var from=parseInt(document.getElementById("rptFrom").value),to=parseInt(document.getElementById("rptTo").value); - var my=getMy(),csv="№;Мероприятие;Раздел;Дивизион;Статус;Прогресс;Срок;Факт;Отчёты по месяцам (текст);Файлы по месяцам (названия)\n"; + var my=getMy(),csv="№;Мероприятие;Подпункт;Раздел;Дивизион;Статус;Прогресс;Срок;Факт;Отчёт (текст);Файлы\n"; my.forEach(function(e){ - var rep="",fls="",d=getMD(e.id); - for(var i=from;i<=to;i++){var m=months[i];if(d[m]){if(d[m].report)rep+=M(i)+": "+d[m].report.replace(/"/g,'""')+"; ";if(d[m].files&&d[m].files.length)fls+=M(i)+": "+d[m].files.map(function(f){return f.name}).join(", ")+"; "}} - csv+=e.id+';"'+e.t.replace(/"/g,'""')+'";'+sections[e.sec]+';'+branches[e.b]+';'+statusMap[e.s]+';'+e.p+'%;'+e.due+';'+(e.done||"—")+';"'+rep+'";"'+fls+'"\n'; + function addRow(subLabel,subIdx){var rep="",fls="",d=getMD(e.id,subIdx); + for(var i=from;i<=to;i++){var m=months[i];if(d[m]){if(d[m].report)rep+=M(i)+": "+d[m].report.replace(/"/g,'""')+"; ";if(d[m].files&&d[m].files.length)fls+=M(i)+": "+d[m].files.map(function(f){return f.name}).join(", ")+"; "}} + csv+=e.id+';"'+e.t.replace(/"/g,'""')+'";'+(subLabel||"общее")+';'+sections[e.sec]+';'+branches[e.b]+';'+statusMap[e.s]+';'+e.p+'%;'+e.due+';'+(e.done||"—")+';"'+rep+'";"'+fls+'"\n';} + addRow("",-1); + if(e.sub) e.sub.forEach(function(s,i){ addRow(s.l,i); }); }); var blob=new Blob(["\uFEFF"+csv],{type:"text/csv;charset=utf-8"}),a=document.createElement("a");a.href=URL.createObjectURL(blob);a.download="otchet_pb_"+M(from)+"-"+M(to)+".csv";a.click() } function downloadHTML(){ var from=parseInt(document.getElementById("rptFrom").value),to=parseInt(document.getElementById("rptTo").value); - var my=getMy(),h='Сводный отчёт ПБ'; + var my=getMy(),h='Сводный отчёт ПБ'; h+='

ИИ-Агент ПБ — Сводный отчёт

Период: '+M(from)+' — '+M(to)+' · Дивизион: '+branches[curUser.branch]+' · Сформирован: '+new Date().toLocaleDateString()+'

'; my.forEach(function(e){ var scls={done:"g",warn:"a",late:"r",wait:"w"}[e.s]; h+='

'+e.id+'. '+esc(e.t)+'

'; h+='
Раздел: '+sections[e.sec]+'Дивизион: '+branches[e.b]+'Срок: '+e.due+'Факт: '+(e.done||"—")+'Прогресс: '+e.p+'%'+statusMap[e.s]+'
'; h+='
Ответственный: '+esc(e.r)+'
'; - var d=getMD(e.id),has=false; - for(var i=from;i<=to;i++){var m=months[i];if(d[m]&&(d[m].report||(d[m].files&&d[m].files.length))){ - has=true;h+='
'+M(i)+''; - if(d[m].report)h+='

'+esc(d[m].report)+'

'; - if(d[m].files&&d[m].files.length)h+='
    '+d[m].files.map(function(f){return'
  • '+esc(f.name)+(f.desc?' — '+esc(f.desc):'')+' ('+(f.size/1024).toFixed(0)+' КБ)
  • '}).join("")+'
'; - h+='
'}} - if(!has)h+='

Нет отчётов за выбранный период

'; + // Main event data + h+=renderMonthBlock(e.id,-1,"Общие материалы",from,to); + // Sub-items + if(e.sub) e.sub.forEach(function(s,i){ h+='
'+s.l+') '+esc(s.t)+'';h+=renderMonthBlock(e.id,i,"",from,to);h+='
'}); h+='
🤖 ИИ: '+esc(e.ai)+'
'; }); h+=''; var blob=new Blob(["\uFEFF"+h],{type:"text/html;charset=utf-8"}),a=document.createElement("a");a.href=URL.createObjectURL(blob);a.download="otchet_pb_"+M(from)+"-"+M(to)+".html";a.click() } +function renderMonthBlock(id,si,label,from,to){ + var d=getMD(id,si),has=false,html=''; + for(var i=from;i<=to;i++){var m=months[i];if(d[m]&&(d[m].report||(d[m].files&&d[m].files.length))){ + has=true;html+='
'+M(i)+(label?' — '+label:'')+''; + if(d[m].report)html+='

'+esc(d[m].report)+'

'; + if(d[m].files&&d[m].files.length)html+='
'; + html+='
'}} + if(!has)html='

Нет отчётов

'; + return html; +} + // ===== MY EVENTS ===== var expandedEvents = {}; function toggleExpand(eid) { expandedEvents[eid] = !expandedEvents[eid]; renderMyEvents(); } @@ -333,19 +343,19 @@ function renderAnalytics(){ } // ===== EDIT MODAL ===== -function openEdit(id,mi){ +var editSubIdx = -1; // -1 = main event, 0+ = sub-item + +function openEdit(id, mi, si){ if(typeof mi==="number")curMonth=mi; + if(typeof si==="number")editSubIdx=si; var e=null;for(var i=0;i=0;sh+='
'+s.l+')'+esc(s.t)+'
'}); - sh+=''} - - var fh="";cfs.forEach(function(f,i){fh+='
📄 '+esc(f.name)+''+(f.desc?''+esc(f.desc)+'':'')+''+(f.size/1024).toFixed(0)+' КБ · '+f.date+'
'}); - - var mh='
';months.forEach(function(m,i){mh+=''+M(i)+''});mh+='
'; + // Main event data + var md=getMD(e.id,-1); + var cd=md[cm]||{report:"",files:[]}, cfs=cd.files||[]; var html=''; html+='Раздел '+["I","II","III","IV","V"][e.sec]+''; @@ -354,52 +364,104 @@ function openEdit(id,mi){ html+='
'; html+='
'+e.p+'%
'; html+='
'; - html+=sh; - html+='
📎 Отчётность по месяцамФайлов: '+tf+'
'; + + // Month tabs (shared) + var mh='
';months.forEach(function(m,i){mh+=''+M(i)+''});mh+='
'; + + // Sub-items with file sections + var sh=''; + if(hasSub){ + sh+='
Подпункты
'; + sh+=mh; + e.sub.forEach(function(s,i){ + var ch=sc.indexOf(i)>=0; + var sd=getMD(e.id,i), scd=sd[cm]||{report:"",files:[]}, scfs=scd.files||[]; + var isActive = editSubIdx === i; + sh+='
'; + sh+=''+s.l+')'+esc(s.t)+''; + sh+='Файлов: '+(scfs.length)+''; + sh+=''; + sh+='
'; + + if(isActive){ + sh+='
'; + sh+='
'+s.l+') '+esc(s.t.slice(0,60))+'...
'; + sh+='
'; + scfs.forEach(function(f,fi){sh+='
📄 '+esc(f.name)+''+(f.desc?''+esc(f.desc)+'':'')+''+(f.size/1024).toFixed(0)+' КБ · '+f.date+'
'}); + sh+='
'; + sh+='
'; + } + }); + sh+='
'; + } + + // Main event files section + html+='
📎 Общие материалыФайлов: '+cfs.length+'
'; html+=mh; html+='
'; - html+=fh; - html+='
'; + cfs.forEach(function(f,i){html+='
📄 '+esc(f.name)+''+(f.desc?''+esc(f.desc)+'':'')+''+(f.size/1024).toFixed(0)+' КБ · '+f.date+'
'}); + html+='
'; html+='

Формы завершения: '+esc(e.dname)+'

'; + + html+=sh; + html+='

🤖 Вывод ИИ-агента

'+esc(e.ai)+'
'; html+='
История:
';e.h.forEach(function(h){html+='
'+esc(h)+'
'});html+='
'; - html+='
'; + html+='
'; document.getElementById("editModalContent").innerHTML=html; document.getElementById("editModalOverlay").classList.add("open"); } -function saveEdit(id,mk){ +function saveEdit(id, mk){ var e=null;for(var i=0;i for main, sf__s for sub-item i +function getMD(id,si){var k=si>=0?'sf_'+id+'_s'+si:'sf_'+id;var r=localStorage.getItem(k);return r?JSON.parse(r):{}} +function setMD(id,o,si){var k=si>=0?'sf_'+id+'_s'+si:'sf_'+id;localStorage.setItem(k,JSON.stringify(o))} 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 uploadFiles(eid,mk){ - var fi=document.getElementById("fi");if(!fi||!fi.files.length)return; - var desc=(document.getElementById("fd").value||"").trim(),btn=document.getElementById("ub"); - btn.textContent="Загружается...";btn.disabled=true; - var MAX=4*1024*1024,ad=getMD(eid);if(!ad[mk])ad[mk]={report:"",files:[]}; +function countFiles(id){ + var total=0,main=getMD(id); + for(var k in main){if(main.hasOwnProperty(k))total+=(main[k].files||[]).length} + var e=null;for(var i=0;i=0?'_s'+si:'',fi=document.getElementById('fi'+prefix); + 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 arr=ad[mk].files,pr=0,sk=0; - function fin(){try{setMD(eid,ad)}catch(e){alert("Хранилище переполнено")}if(sk)alert(sk+" файл(ов) > 4 МБ пропущены");closeEM();openEdit(eid)} + function fin(){try{setMD(eid,ad,si)}catch(e){alert("Хранилище переполнено")}if(sk)alert(sk+" файл(ов) > 4 МБ пропущены");closeEM();openEdit(eid,curMonth,si>=0?si:undefined)} for(var i=0;iMAX){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])} } -function dlF(eid,mk,idx){var ad=getMD(eid),arr=ad[mk]?ad[mk].files:null;if(!arr||!arr[idx]||!arr[idx].data)return;var f=arr[idx],a=document.createElement("a");a.href=f.data;a.download=f.name;document.body.appendChild(a);a.click();document.body.removeChild(a)} -function rmF(eid,mk,idx){var ad=getMD(eid);if(!ad[mk]||!ad[mk].files)return;ad[mk].files.splice(idx,1);setMD(eid,ad);closeEM();openEdit(eid)} +function dlF(eid,mk,idx,si){si=si||-1;var ad=getMD(eid,si),arr=ad[mk]?ad[mk].files:null;if(!arr||!arr[idx]||!arr[idx].data)return;var f=arr[idx],a=document.createElement("a");a.href=f.data;a.download=f.name;document.body.appendChild(a);a.click();document.body.removeChild(a)} +function rmF(eid,mk,idx,si){si=si||-1;var ad=getMD(eid,si);if(!ad[mk]||!ad[mk].files)return;ad[mk].files.splice(idx,1);setMD(eid,ad,si);closeEM();openEdit(eid,curMonth,si>=0?si:undefined)} // Init function renderAll(){notifsUpdate();switchTab(document.querySelector(".tab-btn.active").dataset.tab)}