diff --git a/index.html b/index.html index a7dfa4a..0b358c3 100644 --- a/index.html +++ b/index.html @@ -149,7 +149,6 @@ td{border-bottom:1px solid var(--gray-200)}tr:hover td{background:var(--cyan-50) var sections=["I. Люди","II. Оборудование","III. Аварии и ЧС","IV. Информ. работа","V. ИИ и цифровизация"]; var branches=["Дирекция производственной безопасности","Дивизион «Сеть»","Дивизион по корпоративному бизнесу","Дивизион по розничному бизнесу","Сервисная фабрика","Дирекция «Телеком Комплект»","Корпоративный университет","Дирекция управления проектами","Дивизион цифрового бизнеса"]; var regions=["Центральный регион","Алматинский регион","Южный регион","Северный регион","Восточный регион","Западный регион"]; -var branchRegion=[0,3,1,1,2,3,4,0,5]; // branch index -> region index var statusMap={done:"Исполнено",warn:"На контроле",late:"Просрочено",wait:"В процессе"}; var months=["2026-01","2026-02","2026-03","2026-04","2026-05","2026-06","2026-07","2026-08","2026-09","2026-10","2026-11","2026-12"]; var monthNames=["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек"]; @@ -177,7 +176,7 @@ var users={ "east@telecom.kz":{name:"Отв. Восточный регион",branch:6,role:"region",region:4}, "west@telecom.kz":{name:"Отв. Западный регион",branch:8,role:"region",region:5} }; -var curUser=null,curMonth=5,curFilter=null; // curFilter: null=all, {type:"branch",id:N} or {type:"region",id:N} +var curUser=null,curMonth=5,curRegion=0,editSubIdx=-1; // Load events var events=null; @@ -429,22 +428,70 @@ function renderAnalytics(){ // ===== EDIT MODAL ===== var editSubIdx = -1; // -1=none, click 📎 to expand -function openEdit(id, mi, si){ +function openEdit(id, mi, ri, si){ if(typeof mi==="number")curMonth=mi; + if(typeof ri==="number")curRegion=ri; editSubIdx = (typeof si==="number") ? si : -1; // reset to -1 if not specified var e=null;for(var i=0;i'; html+='

'+esc(e.t)+'

'; - html+='
Регион'+regions[branchRegion[e.b]]+'
Дивизион'+esc(branches[e.b])+'
Ответственный'+esc(e.r)+'
Срок'+e.due+'
Факт'+e.done+'
'; + html+='
Дивизион'+esc(branches[e.b])+'
Ответственный'+esc(e.r)+'
Срок'+e.due+'
Факт'+e.done+'
'; + html+='
'; + html+='
'+e.p+'%
'; + html+='
'; + + // Month tabs + Region tabs + var mh='
';months.forEach(function(m,i){mh+=''+M(i)+''});mh+='
'; + var rh='
Регион:'; + regions.forEach(function(r,i){rh+=''+r+''});rh+='
'; + + // Main event files (for selected region) + html+='
📎 Отчётность — '+regions[curRegion]+'
'; + html+=mh;html+=rh; + 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)+'

'; + + // Sub-items + var hasSub = e.sub && e.sub.length; + if(hasSub){ + html+='
📋 Подпункты

Нажмите 📎 для управления файлами подпункта

'; + e.sub.forEach(function(s,i){ + var ch=sc.indexOf(i)>=0,sd=getMD(e.id,curRegion,i),scd=sd[cm]||{report:"",files:[]},scfs=scd.files||[]; + var isActive=editSubIdx===i; + html+='
'; + html+=''+s.l+')'+esc(s.t)+''; + html+='Файлов: '+scfs.length+''; + html+=''; + html+='
'; + if(isActive){ + html+='
'; + html+='
'+s.l+') '+esc(s.t)+'
'; + html+='
Файлы подпункта: '+regions[curRegion]+' · '+M(curMonth)+'
'; + html+='
'; + if(scfs.length)html+='
Файлы ('+scfs.length+'):
'; + scfs.forEach(function(f,fi){html+='
📄 '+esc(f.name)+''+(f.desc?''+esc(f.desc)+'':'')+''+(f.size/1024).toFixed(0)+' КБ · '+f.date+'
'}); + html+='
'; + html+='
'; + } + }); + html+='
'; + } + + html+='

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

'+esc(e.ai)+'
'; + html+='
История:
';e.h.forEach(function(h){html+='
'+esc(h)+'
'});html+='
'; + html+='
'; + + document.getElementById("editModalContent").innerHTML=html; + document.getElementById("editModalOverlay").classList.add("open"); +} html+='
'; html+='
'+e.p+'%
'; html+='
'; @@ -504,13 +551,12 @@ function saveEdit(id, mk){ e.s=document.getElementById("es").value;e.p=parseInt(document.getElementById("ep").value); var cmt=(document.getElementById("ec").value||"").trim(); // Save main event report - var mr=document.getElementById("mr");if(mr){var ad=getMD(id,-1);if(!ad[mk])ad[mk]={report:"",files:[]};ad[mk].report=mr.value;setMD(id,ad,-1)} - // Save sub-item reports + var mr=document.getElementById("mr");if(mr){var ad=getMD(id,curRegion,-1);if(!ad[mk])ad[mk]={report:"",files:[]};ad[mk].report=mr.value;setMD(id,ad,curRegion,-1)} if(e.sub&&e.sub.length){ var cks=[]; e.sub.forEach(function(_,i){ var el=document.getElementById("sc_"+i);if(el&&el.checked)cks.push(i); - var sr=document.getElementById("mr_s"+i);if(sr){var sd=getMD(id,i);if(!sd[mk])sd[mk]={report:"",files:[]};sd[mk].report=sr.value;setMD(id,sd,i)} + var sr=document.getElementById("mr_s"+i);if(sr){var sd=getMD(id,curRegion,i);if(!sd[mk])sd[mk]={report:"",files:[]};sd[mk].report=sr.value;setMD(id,sd,curRegion,i)} }); setSC(id,cks); } @@ -520,15 +566,15 @@ function saveEdit(id, mk){ } function closeEM(){document.getElementById("editModalOverlay").classList.remove("open")} -// File storage: sf_ 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))} +// File storage: sf__r for main, sf__s_r for sub-item +function getMD(id,ri,si){ri=ri||0;var k=si>=0?'sf_'+id+'_s'+si+'_r'+ri:'sf_'+id+'_r'+ri;var r=localStorage.getItem(k);return r?JSON.parse(r):{}} +function setMD(id,o,ri,si){ri=ri||0;var k=si>=0?'sf_'+id+'_s'+si+'_r'+ri:'sf_'+id+'_r'+ri;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 storageUsed(){var t=0;for(var i=0;i1048576?(b/1048576).toFixed(1)+' МБ':(b/1024).toFixed(0)+' КБ'} -function clearAllFiles(){if(!confirm('Удалить ВСЕ загруженные файлы и отчёты? Это нельзя отменить.'))return;var keys=[];for(var i=0;i=0?'_s'+si:'',fi=document.getElementById('fi'+prefix); +function uploadFiles(eid,mk,ri,si){ + mk=months[mk];var prefix=si>=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=3072*1024,ad=getMD(eid,si);if(!ad[mk])ad[mk]={report:"",files:[]}; + var MAX=3072*1024,ad=getMD(eid,ri,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){ - 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("⚠️ Хранилище заполнено. Удалите старые файлы (кнопка «Очистить файлы» на дашборде)."); + try{setMD(eid,ad,ri,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,ri,si)}catch(e2){} + alert("⚠️ Хранилище заполнено. Очистите файлы на дашборде."); } - addLog("загрузил файлы",eid,(pr-sk)+" файл(ов) за "+M(mk)); - if(sk)alert(sk+" файл(ов) > 3 МБ пропущены");closeEM();openEdit(eid,curMonth,si>=0?si:undefined) + addLog("загрузил файлы",eid,(pr-sk)+" файл(ов) за "+M(mk)+" ("+regions[ri]+")"); + if(sk)alert(sk+" файл(ов) > 3 МБ пропущены");closeEM();openEdit(eid,curMonth,ri,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,si){si=si||-1;mk=months[mk];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;mk=months[mk];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)} +function dlF(eid,mk,idx,ri,si){si=si||-1;mk=months[mk];var ad=getMD(eid,ri,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,ri,si){si=si||-1;mk=months[mk];var ad=getMD(eid,ri,si);if(!ad[mk]||!ad[mk].files)return;ad[mk].files.splice(idx,1);setMD(eid,ad,ri,si);closeEM();openEdit(eid,curMonth,ri,si>=0?si:undefined)} function renderJournal(){ var log=getLog().reverse(),h='

Журнал действий

';