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);
Utils.refreshIcons(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.description ? `
${Utils.escapeHtml(task.description.length > 240 ? task.description.slice(0, 240) + '…' : 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;