const dropZone = document.getElementById('dropZone'); const fileInput = document.getElementById('fileInput'); const selectedFilesDiv = document.getElementById('selectedFiles'); const filesCountSpan = document.getElementById('filesCount'); const filesListDiv = document.getElementById('filesList'); const processBtn = document.getElementById('processBtn'); const loader = document.getElementById('loader'); const resultsDiv = document.getElementById('results'); const tasksBody = document.getElementById('tasksBody'); const statsDiv = document.getElementById('stats'); const downloadBtn = document.getElementById('downloadBtn'); const exportSheets = document.getElementById('exportSheets'); const sheetsUrl = document.getElementById('sheetsUrl'); const exportCalendar = document.getElementById('exportCalendar'); const calendarId = document.getElementById('calendarId'); let selectedFiles = []; let excelData = null; function updateFilesList() { if (selectedFiles.length === 0) { selectedFilesDiv.style.display = 'none'; processBtn.disabled = true; return; } selectedFilesDiv.style.display = 'block'; filesCountSpan.textContent = selectedFiles.length; let filesHtml = ''; for (let i = 0; i < selectedFiles.length; i++) { const file = selectedFiles[i]; filesHtml += '
📄 ' + file.name + '
'; } filesListDiv.innerHTML = filesHtml; processBtn.disabled = false; } window.removeFile = function(index) { selectedFiles.splice(index, 1); updateFilesList(); }; function addFiles(files) { const allowed = ['.pdf', '.docx', '.doc']; const valid = []; for (let i = 0; i < files.length; i++) { const file = files[i]; const ext = '.' + file.name.split('.').pop().toLowerCase(); if (allowed.includes(ext)) { valid.push(file); } } if (valid.length === 0) { alert('Поддерживаются только PDF, DOCX, DOC'); return; } for (let i = 0; i < valid.length; i++) { const newFile = valid[i]; let exists = false; for (let j = 0; j < selectedFiles.length; j++) { if (selectedFiles[j].name === newFile.name && selectedFiles[j].size === newFile.size) { exists = true; break; } } if (!exists) { selectedFiles.push(newFile); } } updateFilesList(); } dropZone.addEventListener('click', function() { fileInput.click(); }); dropZone.addEventListener('dragover', function(e) { e.preventDefault(); }); dropZone.addEventListener('drop', function(e) { e.preventDefault(); if (e.dataTransfer.files.length) { addFiles(e.dataTransfer.files); } }); fileInput.addEventListener('change', function(e) { if (e.target.files.length) { addFiles(e.target.files); } fileInput.value = ''; }); exportSheets.addEventListener('change', function() { sheetsUrl.disabled = !exportSheets.checked; }); exportCalendar.addEventListener('change', function() { calendarId.disabled = !exportCalendar.checked; }); function displayResults(tasks, stats, filesInfo) { let statsHtml = '
' + stats.total + '
Всего задач
'; statsHtml += '
' + stats.with_responsible + '
С ответственным
'; statsHtml += '
' + stats.with_date + '
С датой
'; if (filesInfo && filesInfo.length) { statsHtml += '
' + filesInfo.length + '
Обработано файлов
'; } statsDiv.innerHTML = statsHtml; let tasksHtml = ''; for (let i = 0; i < tasks.length; i++) { const task = tasks[i]; const summary = task.summary || (task.full_description || '').substring(0, 80); const description = (task.full_description || '').substring(0, 100); tasksHtml += ''; tasksHtml += '' + task.number + ''; tasksHtml += '' + summary + ((task.full_description || '').length > 80 ? '...' : '') + ''; tasksHtml += '' + description + ((task.full_description || '').length > 100 ? '...' : '') + ''; tasksHtml += '' + (task.responsible || '-') + ''; tasksHtml += '' + (task.due_date_str || '-') + ''; tasksHtml += ''; } tasksBody.innerHTML = tasksHtml; resultsDiv.style.display = 'block'; } function setupDownload(data) { if (!data) return; downloadBtn.style.display = 'inline-block'; downloadBtn.onclick = function() { try { const binaryString = atob(data); const bytes = new Uint8Array(binaryString.length); for (let i = 0; i < binaryString.length; i++) { bytes[i] = binaryString.charCodeAt(i); } const blob = new Blob([bytes], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; const now = new Date(); const year = now.getFullYear(); const month = String(now.getMonth() + 1).padStart(2, '0'); const day = String(now.getDate()).padStart(2, '0'); const hours = String(now.getHours()).padStart(2, '0'); const minutes = String(now.getMinutes()).padStart(2, '0'); const seconds = String(now.getSeconds()).padStart(2, '0'); const timestamp = year + '-' + month + '-' + day + 'T' + hours + '-' + minutes + '-' + seconds; a.download = 'tasks_' + timestamp + '.xlsx'; a.click(); URL.revokeObjectURL(url); } catch (err) { console.error('Ошибка скачивания:', err); alert('Ошибка при скачивании файла'); } }; } processBtn.addEventListener('click', async function() { if (selectedFiles.length === 0) return; processBtn.disabled = true; loader.style.display = 'block'; resultsDiv.style.display = 'none'; downloadBtn.style.display = 'none'; const formData = new FormData(); for (let i = 0; i < selectedFiles.length; i++) { formData.append('files', selectedFiles[i]); } formData.append('export_to_sheets', exportSheets.checked); formData.append('export_to_calendar', exportCalendar.checked); formData.append('sheets_url', sheetsUrl.value); formData.append('calendar_id', calendarId.value); // ===== ПРОВЕРКА: что отправляем ===== console.log('Отправляю FormData:'); for (let pair of formData.entries()) { console.log(pair[0], '=', pair[1]); } // =================================== console.log('Отправляю:', { files: selectedFiles.length, export_to_calendar: exportCalendar.checked, calendar_id: calendarId.value }); try { const response = await fetch('/parse-batch', { method: 'POST', body: formData }); console.log('Ответ получен, статус:', response.status); if (!response.ok) { throw new Error('HTTP ошибка: ' + response.status); } const data = await response.json(); console.log('Данные:', data); if (data.success) { if (data.excel_base64) { excelData = data.excel_base64; setupDownload(excelData); } displayResults(data.tasks, data.statistics, data.files); if (data.calendar_export === 'success') { alert('Задачи добавлены в Google Calendar'); } else if (data.calendar_export) { alert('Ошибка Calendar: ' + data.calendar_export); } } else { alert('Ошибка: ' + (data.error || 'Неизвестная ошибка')); } } catch (err) { console.error('Ошибка:', err); alert('Ошибка соединения: ' + err.message + '\n\nПроверь, что сервер запущен (python3 backend.py)'); } finally { processBtn.disabled = false; loader.style.display = 'none'; } });