// loadMyCreatedTasks.js - Задачи, созданные пользователем и назначенные ему // Глобальные переменные let expandedMyTasks = new Set(); let updateInterval = null; let isUpdating = false; // Показать секцию "Мои задачи (как автор)" function showMyTasksSection() { showSection('mytasks'); window.currentTaskView = 'my_assigned'; loadTasks(); startAutoUpdate(); } // Показать секцию "Задачи для исполнения" function showRunTasksSection() { showSection('runtasks'); window.currentTaskView = 'assigned_to_me'; loadTasks(); startAutoUpdate(); } // Остановка автообновления при уходе с секции function hideTasksSection() { 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'); const runtasksSection = document.getElementById('runtasks-section'); if ((!mytasksSection || !mytasksSection.classList.contains('active')) && (!runtasksSection || !runtasksSection.classList.contains('active'))) { console.log('⏸️ Секция неактивна, автообновление приостановлено'); stopAutoUpdate(); return; } isUpdating = true; try { console.log('🔄 Автообновление задач...', new Date().toLocaleTimeString()); await loadTasks(); // просто перезагружаем с текущими фильтрами // Показываем уведомление об обновлении showUpdateNotification(); } 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 filterMyTasks() { loadTasks(); } // Функция фильтрации для "Задачи для исполнения" function filterRunTasks() { loadTasks(); } // Рендеринг для "Мои задачи" function renderMyTasks() { const container = document.getElementById('mytasks-list'); if (!container) return; if (!window.tasks || window.tasks.length === 0) { container.innerHTML = '
У вас пока нет созданных задач
'; return; } // Используем общую функцию рендеринга, если она есть if (typeof renderTasksInContainer === 'function') { renderTasksInContainer('mytasks-list', window.tasks); } else { // Запасной вариант: рендерим прямо здесь (упрощённо) renderMyTasksSimple(window.tasks); } } // Упрощённый рендеринг для "Мои задачи" (если нет общей функции) function renderMyTasksSimple(tasks) { const container = document.getElementById('mytasks-list'); // Сортируем задачи по дате создания (новые сверху) const sortedTasks = [...tasks].sort((a, b) => new Date(b.created_at || 0) - new Date(a.created_at || 0) ); container.innerHTML = sortedTasks.map(task => { const isExpanded = expandedMyTasks.has(task.id); const overallStatus = getTaskOverallStatus(task); const statusClass = getStatusClass(overallStatus); const isClosed = task.closed_at !== null; const isCopy = task.original_task_id !== null; const timeLeftInfo = getTimeLeftInfo(task); return `
Задача №${task.id} ${task.title || 'Без названия'} ${task.task_type ? `${getTaskTypeDisplayName(task.task_type)}` : ''} ${isClosed ? 'Закрыта' : ''} ${isCopy ? 'Копия' : ''} ${timeLeftInfo ? `${timeLeftInfo.text}` : ''} ${task.assignments && task.assignments.length > 0 ? `${task.assignments.map(a => a.user_name).join(', ')}` : '' }
Выполнить до: ${formatDateTime(task.due_date || task.created_at)}
${isExpanded ? `
${currentUser && currentUser.login === 'minicrm' ? `` : '' } ${currentUser && currentUser.login === 'kalugin.o' ? `` : '' } ${currentUser && (currentUser.role === 'tasks' || currentUser.role === 'admin') ? `` : '' } ${currentUser && (currentUser.role === 'tasks' || currentUser.role === 'admin') ? `` : '' } ${currentUser && currentUser.login === 'minicrm' ? `` : '' } ${currentUser && currentUser.login === 'minicrm' ? `` : '' }
` : ''} ${isCopy && task.original_task_title ? `
Оригинал: "${task.original_task_title}" (создал: ${task.original_creator_name})
` : ''}
${task.description || 'Нет описания'}
${task.rework_comment ? `
Комментарий к доработке: ${task.rework_comment}
` : ''}
Файлы: ${task.files && task.files.length > 0 ? (typeof renderGroupedFilesWithDelete === 'function' ? renderGroupedFilesWithDelete(task) : renderGroupedFiles(task)) : 'нет файлов' }
Исполнители: ${task.assignments && task.assignments.length > 0 ? renderAssignmentList(task.assignments, task.id, true) : '
Не назначены
' }
Создана: ${formatDateTime(task.start_date || task.created_at)} | Выполнить до: ${formatDateTime(task.due_date || task.created_at)} | Автор: ${task.creator_name} | Тип: ${task.task_type ? `${getTaskTypeDisplayName(task.task_type)}` : ''} ${task.closed_at ? `
Закрыта: ${formatDateTime(task.closed_at)}` : ''}
`; }).join(''); // Загружаем файлы для развернутых задач expandedMyTasks.forEach(taskId => { if (window.tasks.some(t => t.id == taskId)) { loadTaskFiles(taskId); } }); } // Функция для переключения развернутого состояния задачи function toggleMyTask(taskId) { if (expandedMyTasks.has(taskId)) { expandedMyTasks.delete(taskId); } else { expandedMyTasks.add(taskId); loadTaskFiles(taskId); } renderMyTasks(); } // Остальные вспомогательные функции (getStatusClass, getTaskTypeDisplayName, formatDateTime, renderAssignment, filterAssignments, openAddFileModal, closeAddFileModal, openTaskChat, openEditModal, openCopyModal, openReworkModal, closeTask, deleteTask, updateStatus) остаются без изменений // ... // Экспортируем функции в глобальную область window.showMyTasksSection = showMyTasksSection; window.showRunTasksSection = showRunTasksSection; window.filterMyTasks = filterMyTasks; window.filterRunTasks = filterRunTasks; window.toggleMyTask = toggleMyTask; window.renderMyTasks = renderMyTasks;