const TasksUI = { tasks: [], _editingId: null, async load() { try { TasksUI.tasks = await API.tasks.list(); TasksUI.render(); } catch (err) { Toast.error(`Erro ao carregar tarefas: ${err.message}`); } }, render(filteredTasks) { const container = document.getElementById('tasks-grid'); const empty = document.getElementById('tasks-empty-state'); if (!container) return; const tasks = filteredTasks || TasksUI.tasks; const existingCards = container.querySelectorAll('.task-card'); existingCards.forEach((c) => c.remove()); if (tasks.length === 0) { if (empty) empty.style.display = 'flex'; return; } if (empty) empty.style.display = 'none'; const fragment = document.createDocumentFragment(); tasks.forEach((task) => { const wrapper = document.createElement('div'); wrapper.innerHTML = TasksUI._renderCard(task); fragment.appendChild(wrapper.firstElementChild); }); container.appendChild(fragment); if (window.lucide) lucide.createIcons({ nodes: [container] }); }, filter(searchText, categoryFilter) { const search = (searchText || '').toLowerCase(); const category = categoryFilter || ''; const filtered = TasksUI.tasks.filter((t) => { const name = (t.name || '').toLowerCase(); const desc = (t.description || '').toLowerCase(); const matchesSearch = !search || name.includes(search) || desc.includes(search); const matchesCategory = !category || t.category === category; return matchesSearch && matchesCategory; }); TasksUI.render(filtered); }, _renderCard(task) { const categoryClass = TasksUI._categoryClass(task.category); const categoryLabel = task.category || 'Geral'; const createdAt = TasksUI._formatDate(task.createdAt || task.created_at); return `

${task.name}

${categoryLabel}
${task.description ? `

${task.description}

` : ''}
`; }, openCreateModal() { TasksUI._editingId = null; TasksUI._openInlineForm({}); }, openEditModal(taskId) { const task = TasksUI.tasks.find((t) => t.id === taskId); if (!task) return; TasksUI._editingId = taskId; TasksUI._openInlineForm(task); }, _openInlineForm(task) { const container = document.getElementById('tasks-grid'); if (!container) return; const existing = document.getElementById('task-inline-form'); if (existing) existing.remove(); const isEdit = !!TasksUI._editingId; const title = isEdit ? 'Editar tarefa' : 'Nome da tarefa *'; const btnLabel = isEdit ? 'Atualizar' : 'Salvar'; const formHtml = `
`; const empty = document.getElementById('tasks-empty-state'); if (empty) empty.style.display = 'none'; container.insertAdjacentHTML('afterbegin', formHtml); document.getElementById('btn-save-inline-task')?.addEventListener('click', () => { const name = document.getElementById('task-inline-name')?.value.trim(); const category = document.getElementById('task-inline-category')?.value; const description = document.getElementById('task-inline-description')?.value.trim(); if (!name) { Toast.warning('Nome da tarefa é obrigatório'); return; } TasksUI.save({ name, category, description }); }); document.getElementById('btn-cancel-inline-task')?.addEventListener('click', () => { document.getElementById('task-inline-form')?.remove(); TasksUI._editingId = null; if (TasksUI.tasks.length === 0) { const emptyEl = document.getElementById('tasks-empty-state'); if (emptyEl) emptyEl.style.display = 'flex'; } }); document.getElementById('task-inline-name')?.focus(); }, async save(data) { if (!data || !data.name) { Toast.warning('Nome da tarefa é obrigatório'); return; } try { if (TasksUI._editingId) { await API.tasks.update(TasksUI._editingId, data); Toast.success('Tarefa atualizada com sucesso'); } else { await API.tasks.create(data); Toast.success('Tarefa criada com sucesso'); } TasksUI._editingId = null; document.getElementById('task-inline-form')?.remove(); await TasksUI.load(); } catch (err) { Toast.error(`Erro ao salvar tarefa: ${err.message}`); } }, async delete(taskId) { const confirmed = await Modal.confirm( 'Excluir tarefa', 'Tem certeza que deseja excluir esta tarefa?' ); if (!confirmed) return; try { await API.tasks.delete(taskId); Toast.success('Tarefa excluída com sucesso'); await TasksUI.load(); } catch (err) { Toast.error(`Erro ao excluir tarefa: ${err.message}`); } }, async execute(taskId) { const task = TasksUI.tasks.find((t) => t.id === taskId); if (!task) return; try { const agents = await API.agents.list(); const activeAgents = agents.filter((a) => a.status === 'active'); if (activeAgents.length === 0) { Toast.warning('Nenhum agente ativo disponível para executar'); return; } const selectEl = document.getElementById('execute-agent-select'); if (selectEl) { selectEl.innerHTML = '' + activeAgents.map((a) => ``).join(''); selectEl.value = ''; } const hiddenId = document.getElementById('execute-agent-id'); if (hiddenId) hiddenId.value = ''; const taskEl = document.getElementById('execute-task-desc'); if (taskEl) { const parts = [task.name]; if (task.description) parts.push(task.description); taskEl.value = parts.join('\n\n'); } const instructionsEl = document.getElementById('execute-instructions'); if (instructionsEl) instructionsEl.value = ''; await AgentsUI._loadSavedTasks(); const savedTaskSelect = document.getElementById('execute-saved-task'); if (savedTaskSelect) savedTaskSelect.value = task.id; Modal.open('execute-modal-overlay'); } catch (err) { Toast.error(`Erro ao abrir execução: ${err.message}`); } }, _categoryClass(category) { const map = { 'code-review': 'badge--blue', security: 'badge--red', refactor: 'badge--purple', tests: 'badge--green', docs: 'badge--gray', performance: 'badge--orange', }; return map[(category || '').toLowerCase()] || 'badge--gray'; }, _formatDate(isoString) { if (!isoString) return '—'; return new Date(isoString).toLocaleDateString('pt-BR'); }, }; window.TasksUI = TasksUI;