/**
===============================================================================
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);
});