// Скрипт для отображения задач, где пользователь является автором // Глобальные переменные let myAuthorTasks = []; let myAuthorTasksFiltered = []; let expandedMyTasks = new Set(); // Для отслеживания развернутых задач let updateInterval = null; // Интервал обновления let isUpdating = false; // Флаг для предотвращения множественных обновлений // Загрузка задач при открытии секции function showMyTasksSection() { showSection('mytasks'); loadMyAuthorTasks(); startAutoUpdate(); // Запускаем автообновление при открытии секции } // Остановка автообновления при уходе с секции function hideMyTasksSection() { stopAutoUpdate(); } // Запуск автоматического обновления function startAutoUpdate() { // Останавливаем предыдущий интервал, если был stopAutoUpdate(); // Запускаем новый интервал (каждые 15 секунд) updateInterval = setInterval(() => { autoUpdateTasks(); }, 15000); // 15000 мс = 15 секунд console.log('🔄 Автообновление задач запущено (каждые 15 сек)'); } // Остановка автоматического обновления function stopAutoUpdate() { if (updateInterval) { clearInterval(updateInterval); updateInterval = null; console.log('⏹️ Автообновление задач остановлено'); } } // Функция автоматического обновления async function autoUpdateTasks() { // Предотвращаем множественные обновления if (isUpdating) { console.log('⏳ Обновление уже выполняется, пропускаем...'); return; } // Проверяем, активна ли секция const mytasksSection = document.getElementById('mytasks-section'); if (!mytasksSection || !mytasksSection.classList.contains('active')) { console.log('⏸️ Секция неактивна, автообновление приостановлено'); stopAutoUpdate(); return; } isUpdating = true; try { console.log('🔄 Автообновление задач...', new Date().toLocaleTimeString()); const response = await fetch('/api/kanban-tasks?days=62&filter=created'); if (!response.ok) { throw new Error(`Ошибка сервера: ${response.status}`); } const data = await response.json(); const newTasks = data.tasks || []; // Проверяем, изменились ли данные if (hasTasksChanged(myAuthorTasks, newTasks)) { console.log('📊 Данные изменились, обновляем отображение'); myAuthorTasks = newTasks; filterMyTasks(); // Показываем уведомление об обновлении showUpdateNotification(); } else { console.log('📊 Данные не изменились'); } } catch (error) { console.error('❌ Ошибка автообновления:', error); } finally { isUpdating = false; } } // Показ уведомления об обновлении function showUpdateNotification() { const notification = document.createElement('div'); notification.className = 'update-notification'; notification.innerHTML = ` 🔄 Данные обновлены ${new Date().toLocaleTimeString()} `; document.body.appendChild(notification); // Анимация появления и исчезновения setTimeout(() => { notification.classList.add('show'); }, 10); setTimeout(() => { notification.classList.remove('show'); setTimeout(() => { notification.remove(); }, 300); }, 2000); } // Проверка, изменились ли данные function hasTasksChanged(oldTasks, newTasks) { if (oldTasks.length !== newTasks.length) return true; // Создаем Map для быстрого сравнения const oldMap = new Map(oldTasks.map(t => [t.id, t])); for (const newTask of newTasks) { const oldTask = oldMap.get(newTask.id); if (!oldTask) return true; // Проверяем важные поля if (oldTask.kanbanStatus !== newTask.kanbanStatus) return true; if (oldTask.title !== newTask.title) return true; if (oldTask.description !== newTask.description) return true; if (oldTask.due_date !== newTask.due_date) return true; // Проверяем изменения в назначениях if (!areAssignmentsEqual(oldTask.assignments, newTask.assignments)) return true; // Проверяем изменения в файлах if (!areFilesEqual(oldTask.files, newTask.files)) return true; } return false; } // Проверка равенства назначений function areAssignmentsEqual(oldAssignments, newAssignments) { if (!oldAssignments && !newAssignments) return true; if (!oldAssignments || !newAssignments) return false; if (oldAssignments.length !== newAssignments.length) return false; const oldMap = new Map(oldAssignments.map(a => [a.user_id, a])); for (const newAss of newAssignments) { const oldAss = oldMap.get(newAss.user_id); if (!oldAss) return false; if (oldAss.status !== newAss.status) return false; } return true; } // Проверка равенства файлов function areFilesEqual(oldFiles, newFiles) { if (!oldFiles && !newFiles) return true; if (!oldFiles || !newFiles) return false; if (oldFiles.length !== newFiles.length) return false; const oldIds = new Set(oldFiles.map(f => f.id)); const newIds = new Set(newFiles.map(f => f.id)); return oldIds.size === newIds.size && [...oldIds].every(id => newIds.has(id)); } // Основная функция загрузки задач async function loadMyAuthorTasks() { const container = document.getElementById('mytasks-list'); try { container.innerHTML = `
Загрузка ваших задач...