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+='
'+d[m].files.map(function(f){return''+esc(f.name)+(f.desc?' — '+esc(f.desc):'')+' ('+(f.size/1024).toFixed(0)+' КБ) '}).join("")+' ';
+ 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Подпункты';
- e.sub.forEach(function(s,i){var ch=sc.indexOf(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+='
Текст отчёта за '+M(curMonth)+'
';
+ 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+='
';
+
+ html+=sh;
+
html+='
🤖 Вывод ИИ-агента '+esc(e.ai)+'';
html+='
История:
';e.h.forEach(function(h){html+='
'});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)}