v19: чёткое разделение файлов подпунктов и общих, кнопка 📂/📎

This commit is contained in:
Dauren777 2026-06-05 04:53:48 +00:00
parent 15fdf39f18
commit 812ad693c3

View File

@ -343,11 +343,11 @@ function renderAnalytics(){
}
// ===== EDIT MODAL =====
var editSubIdx = -1; // -1 = main event, 0+ = sub-item
var editSubIdx = -1; // -1=none, click 📎 to expand
function openEdit(id, mi, si){
if(typeof mi==="number")curMonth=mi;
if(typeof si==="number")editSubIdx=si;
editSubIdx = (typeof si==="number") ? si : -1; // reset to -1 if not specified
var e=null;for(var i=0;i<events.length;i++){if(events[i].id===id){e=events[i];break}}if(!e)return;
var hasSub = e.sub && e.sub.length;
var cm=months[curMonth];
@ -368,27 +368,29 @@ function openEdit(id, mi, si){
// Month tabs (shared)
var mh='<div class="month-tabs">';months.forEach(function(m,i){mh+='<span class="month-tab'+(i===curMonth?" active":"")+'" onclick="openEdit('+e.id+','+i+','+editSubIdx+')">'+M(i)+'</span>'});mh+='</div>';
// Sub-items with file sections
// Sub-items with file sections (shown first for clarity)
var sh='';
if(hasSub){
sh+='<div style="border-top:1px solid var(--gray-200);padding-top:16px;margin-top:16px"><div style="font-weight:600;margin-bottom:8px">Подпункты</div>';
sh+='<div style="border-top:2px solid var(--cyan);padding-top:16px;margin-top:16px"><div style="font-weight:700;font-size:15px;margin-bottom:4px">📋 Подпункты мероприятия</div><p style="font-size:12px;color:var(--gray-500);margin-bottom:12px">Нажмите 📎 на подпункте для управления его файлами</p>';
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+='<div class="sub-item" style="flex-wrap:wrap;padding:12px 14px;margin-bottom:8px">';
sh+='<input type="checkbox" id="sc_'+i+'" '+(ch?"checked":"")+'><span class="sub-label">'+s.l+')</span><span class="sub-text" style="flex:1">'+esc(s.t)+'</span>';
sh+='<div class="sub-item" style="flex-wrap:wrap;padding:12px 14px;margin-bottom:8px;'+(isActive?'border:2px solid var(--cyan)':'')+'">';
sh+='<input type="checkbox" id="sc_'+i+'" '+(ch?"checked":"")+'><span class="sub-label" style="font-size:16px">'+s.l+')</span><span class="sub-text" style="flex:1">'+esc(s.t)+'</span>';
sh+='<span style="font-size:11px;color:var(--gray-500);margin-right:8px">Файлов: '+(scfs.length)+'</span>';
sh+='<button class="btn btn-sm" onclick="openEdit('+e.id+','+curMonth+','+i+')" style="font-size:11px;background:'+(isActive?'var(--cyan)':'var(--gray-100)')+'">📎</button>';
sh+='<button class="btn btn-sm" onclick="openEdit('+e.id+','+curMonth+','+i+')" style="font-size:12px;'+(isActive?'background:var(--cyan);font-weight:700':'')+'">'+(isActive?'📂 Открыто':'📎 Файлы')+'</button>';
sh+='</div>';
if(isActive){
sh+='<div style="margin-left:20px;margin-bottom:12px;padding:12px;background:var(--cyan-50);border-radius:8px">';
sh+='<div style="font-weight:600;font-size:13px;margin-bottom:8px">'+s.l+') '+esc(s.t.slice(0,60))+'...</div>';
sh+='<div class="field"><label>Текст отчёта за '+M(curMonth)+'</label><textarea id="mr_s'+i+'" placeholder="Опишите ход исполнения..." style="min-height:60px">'+esc(scd.report||"")+'</textarea></div>';
sh+='<div style="margin-left:20px;margin-bottom:16px;padding:16px;background:var(--cyan-50);border-radius:8px;border:2px solid var(--cyan)">';
sh+='<div style="font-weight:700;font-size:14px;margin-bottom:4px;color:var(--ink)">'+s.l+') '+esc(s.t)+'</div>';
sh+='<div style="font-size:11px;color:var(--gray-500);margin-bottom:12px">Файлы этого подпункта за '+M(curMonth)+'</div>';
sh+='<div class="field"><label>Текст отчёта</label><textarea id="mr_s'+i+'" placeholder="Опишите ход исполнения..." style="min-height:60px">'+esc(scd.report||"")+'</textarea></div>';
if(scfs.length){sh+='<div style="font-weight:600;font-size:13px;margin:8px 0">Прикреплённые файлы ('+scfs.length+'):</div>'}
scfs.forEach(function(f,fi){sh+='<div class="file-row"><span class="file-info"><span class="file-name" onclick="dlF('+e.id+','+curMonth+','+fi+','+i+')">📄 '+esc(f.name)+'</span>'+(f.desc?'<span class="file-desc">'+esc(f.desc)+'</span>':'')+'</span><span class="file-meta">'+(f.size/1024).toFixed(0)+' КБ · '+f.date+'</span><button class="file-del" onclick="rmF('+e.id+','+curMonth+','+fi+','+i+')">×</button></div>'});
sh+='<div class="upload-row"><input type="text" id="fd_s'+i+'" placeholder="Описание файла"><input type="file" id="fi_s'+i+'" multiple style="max-width:180px"><button class="btn btn-sm" id="ub_s'+i+'" onclick="uploadFiles('+e.id+','+curMonth+','+i+')">Загрузить</button></div>';
sh+='<div class="upload-row"><input type="text" id="fd_s'+i+'" placeholder="Описание файла"><input type="file" id="fi_s'+i+'" multiple style="max-width:180px"><button class="btn btn-sm" id="ub_s'+i+'" onclick="uploadFiles('+e.id+','+curMonth+','+i+')">📤 Загрузить</button></div>';
sh+='</div>';
}
});
@ -396,15 +398,14 @@ function openEdit(id, mi, si){
}
// Main event files section
html+='<div style="border-top:1px solid var(--gray-200);padding-top:16px;margin-top:12px"><div style="display:flex;justify-content:space-between;margin-bottom:12px"><span style="font-weight:600">📎 Общие материалы</span><span style="font-size:12px;color:var(--gray-500)">Файлов: '+cfs.length+'</span></div>';
html+=sh;
html+='<div style="border-top:1px solid var(--gray-200);padding-top:16px;margin-top:12px"><div style="font-weight:600;font-size:14px;margin-bottom:4px">📎 Общие материалы мероприятия</div><p style="font-size:11px;color:var(--gray-500);margin-bottom:8px">Файлы, не привязанные к конкретному подпункту</p>';
html+=mh;
html+='<div class="field" style="margin-top:12px"><label>Текст отчёта за '+M(curMonth)+'</label><textarea id="mr" placeholder="Опишите ход исполнения... Можно без файлов." style="min-height:80px">'+esc(cd.report||"")+'</textarea></div>';
cfs.forEach(function(f,i){html+='<div class="file-row"><span class="file-info"><span class="file-name" onclick="dlF('+e.id+','+curMonth+','+i+',-1)">📄 '+esc(f.name)+'</span>'+(f.desc?'<span class="file-desc">'+esc(f.desc)+'</span>':'')+'</span><span class="file-meta">'+(f.size/1024).toFixed(0)+' КБ · '+f.date+'</span><button class="file-del" onclick="rmF('+e.id+','+curMonth+','+i+',-1)">×</button></div>'});
html+='<div class="upload-row"><input type="text" id="fd" placeholder="Описание файла"><input type="file" id="fi" multiple style="max-width:220px"><button class="btn btn-sm" id="ub" onclick="uploadFiles('+e.id+','+curMonth+',-1)">Загрузить</button></div>';
html+='<div class="upload-row"><input type="text" id="fd" placeholder="Описание файла"><input type="file" id="fi" multiple style="max-width:220px"><button class="btn btn-sm" id="ub" onclick="uploadFiles('+e.id+','+curMonth+',-1)">📤 Загрузить</button></div>';
html+='<p style="font-size:11px;color:var(--gray-500);margin-top:6px">Формы завершения: '+esc(e.dname)+'</p></div>';
html+=sh;
html+='<div class="ai-block"><h4>🤖 Вывод ИИ-агента</h4>'+esc(e.ai)+'</div>';
html+='<div style="font-weight:600;margin:8px 0 4px">История:</div><div>';e.h.forEach(function(h){html+='<div class="history-item"><div class="dot"></div>'+esc(h)+'</div>'});html+='</div>';
html+='<div style="margin-top:20px;display:flex;gap:12px"><button class="btn" onclick="saveEdit('+e.id+','+curMonth+')">Сохранить</button><button class="btn btn-outline" onclick="closeEM()">Отмена</button></div>';