/** =============================================================================== FILE: modules/web_api/static/js/tasks.js PROJECT: SCUD Orion AI (Unified Architecture) MODULE: web_api / static / js ROLE: Загрузка, фильтрация и рендеринг списка задач в боковой панели (Drawer). =============================================================================== */ let currentTaskFilter = 'IN_PROGRESS'; async function loadTasks() { const token = typeof API_TOKEN !== 'undefined' && API_TOKEN ? API_TOKEN : localStorage.getItem("scud_api_auth_token"); if (!token) return; try { const res = await fetch("/api/v1/tasks", { headers: { "Authorization": "Bearer " + token } }); if (res.ok) { const data = await res.json(); renderSidebarTasks(data.tasks || []); } else { renderSidebarError("Ошибка доступа. Авторизуйтесь снова."); } } catch (e) { console.error("Ошибка загрузки задач:", e); renderSidebarError("Ошибка сети. Сервер недоступен."); } } function renderSidebarError(msg) { // Поддерживаем оба варианта ID (новый и старый) для обратной совместимости const container = document.getElementById("tasks-list") || document.getElementById("tasks-list-container"); if (container) { container.innerHTML = `
${msg}
`; } } function filterTasksByTab(status) { currentTaskFilter = status; // Сброс стилей всех кнопок-вкладок document.querySelectorAll('.task-tab-btn').forEach(btn => { btn.classList.remove('text-indigo-600', 'bg-indigo-50'); btn.classList.add('text-slate-600'); }); // Установка активного стиля для выбранной вкладки const activeBtnId = { 'IN_PROGRESS': 'tab-in-progress', 'BACKLOG': 'tab-backlog', 'COMPLETED': 'tab-completed', 'ALL': 'tab-all' }[status]; if (activeBtnId) { const btn = document.getElementById(activeBtnId); if (btn) { btn.classList.remove('text-slate-600', 'hover:bg-slate-100'); btn.classList.add('text-indigo-600', 'bg-indigo-50'); } } loadTasks(); } function renderSidebarTasks(tasks) { const container = document.getElementById("tasks-list") || document.getElementById("tasks-list-container"); if (!container) return; let filtered = tasks; if (currentTaskFilter !== 'ALL') { filtered = tasks.filter(t => t.status === currentTaskFilter); } if (filtered.length === 0) { container.innerHTML = `
Нет задач в этой категории
`; return; } container.innerHTML = filtered.map(t => { const isCompleted = t.status === 'COMPLETED'; const priorityColor = t.priority === 'HIGH' || t.priority === 'CRITICAL' ? 'text-rose-600 bg-rose-50 border-rose-200' : t.priority === 'MEDIUM' ? 'text-amber-600 bg-amber-50 border-amber-200' : 'text-slate-600 bg-slate-50 border-slate-200'; return `
#${t.id} ${isCompleted ? ` Готово` : `${t.priority || 'LOW'}` }
${escapeHtml(t.title || 'Без названия')}
${escapeHtml(t.module || 'general')} ${t.due_date ? `${escapeHtml(t.due_date)}` : ''}
`; }).join(''); } // Глобальная инициализация при загрузке DOM document.addEventListener("DOMContentLoaded", () => { // Небольшая задержка, чтобы гарантировать применение токена setTimeout(loadTasks, 200); });