/** * =============================================================================== * FILE: modules/web_api/static/js/tasks.js * ROLE: Управление персональными задачами оператора (CRUD, фильтры, рендер). * =============================================================================== */ window.escapeHtml = window.escapeHtml || function (str) { if (str === null || str === undefined) return ''; return String(str) .replace(/&/g, '&') .replace(//g, '>') .replace(/"/g, '"') .replace(/'/g, '''); }; let currentTasksFilter = 'ALL'; let tasksCache = []; function getTasksContainer() { return document.getElementById("tasks-list-container") || document.getElementById("sidebar-dynamic-content") || document.getElementById("tasks-list"); } async function loadTasks() { const container = getTasksContainer(); if (!container) return; container.innerHTML = `
Загрузка задач...
`; try { const res = await fetch("/api/v1/tasks", { headers: AuthManager.getAuthHeaders() }); if (!res.ok) { if (res.status === 401) { showAuthModal(); return; } throw new Error(`Ошибка сервера (${res.status})`); } const data = await res.json(); tasksCache = Array.isArray(data) ? data : (data.tasks || []); renderTasksUI(); } catch (err) { console.error("[Tasks] Ошибка загрузки:", err); container.innerHTML = `
Не удалось загрузить задачи
`; } } function setTaskFilter(filter) { currentTasksFilter = filter; renderTasksUI(); } function renderTasksUI() { const container = getTasksContainer(); if (!container) return; let filtered = tasksCache; if (currentTasksFilter === 'IN_PROGRESS') { filtered = tasksCache.filter(t => t.status === 'IN_PROGRESS'); } else if (currentTasksFilter === 'BACKLOG') { filtered = tasksCache.filter(t => t.status === 'BACKLOG' || t.status === 'PLANNED'); } else if (currentTasksFilter === 'COMPLETED') { filtered = tasksCache.filter(t => t.status === 'COMPLETED' || t.status === 'DONE'); } const filtersHtml = `
`; const addBtnHtml = `
Задачи: ${filtered.length}
`; if (filtered.length === 0) { container.innerHTML = ` ${filtersHtml} ${addBtnHtml}
Нет задач в выбранной категории
`; return; } const itemsHtml = filtered.map(t => { const isDone = t.status === 'COMPLETED' || t.status === 'DONE'; const priorityColors = { 'HIGH': 'bg-rose-50 text-rose-700 border-rose-200', 'MEDIUM': 'bg-amber-50 text-amber-700 border-amber-200', 'LOW': 'bg-slate-50 text-slate-600 border-slate-200' }; const pClass = priorityColors[t.priority] || priorityColors['MEDIUM']; return `
${escapeHtml(t.title)}
${t.priority || 'NORMAL'}
${t.task_id || ('#' + t.id)} · ${escapeHtml(t.module || 'general')}
`; }).join(''); container.innerHTML = ` ${filtersHtml} ${addBtnHtml}
${itemsHtml}
`; } async function toggleTaskStatus(id, currentStatus) { const newStatus = (currentStatus === 'COMPLETED' || currentStatus === 'DONE') ? 'IN_PROGRESS' : 'COMPLETED'; try { const res = await fetch(`/api/v1/tasks/${id}`, { method: "PATCH", headers: AuthManager.getAuthHeaders(), body: JSON.stringify({ status: newStatus }) }); if (res.ok) { loadTasks(); } } catch (e) { console.error("Ошибка смены статуса задачи:", e); } } async function deleteTaskItem(id) { if (!confirm("Удалить эту задачу?")) return; try { const res = await fetch(`/api/v1/tasks/${id}`, { method: "DELETE", headers: AuthManager.getAuthHeaders() }); if (res.ok) { loadTasks(); } } catch (e) { alert("Ошибка сети при удалении"); } } async function openCreateTaskModal() { const title = prompt("Введите описание новой задачи:"); if (!title || !title.trim()) return; try { const res = await fetch("/api/v1/tasks", { method: "POST", headers: AuthManager.getAuthHeaders(), body: JSON.stringify({ title: title.trim(), priority: "MEDIUM", status: "IN_PROGRESS" }) }); if (res.ok) { loadTasks(); } else { alert("Не удалось создать задачу"); } } catch (e) { alert("Ошибка сети"); } } window.loadTasks = loadTasks; window.setTaskFilter = setTaskFilter;