const PipelinesUI = { pipelines: [], agents: [], _editingId: null, _steps: [], _pendingApprovals: new Map(), async load() { try { const [pipelines, agents] = await Promise.all([ API.pipelines.list(), API.agents.list(), ]); PipelinesUI.pipelines = Array.isArray(pipelines) ? pipelines : []; PipelinesUI.agents = Array.isArray(agents) ? agents : []; PipelinesUI.render(); } catch (err) { Toast.error(`Erro ao carregar pipelines: ${err.message}`); } }, filter(searchText) { const search = (searchText || '').toLowerCase(); const filtered = PipelinesUI.pipelines.filter((p) => { const name = (p.name || '').toLowerCase(); const desc = (p.description || '').toLowerCase(); return !search || name.includes(search) || desc.includes(search); }); PipelinesUI.render(filtered); }, render(filteredPipelines) { const grid = document.getElementById('pipelines-grid'); if (!grid) return; const pipelines = filteredPipelines || PipelinesUI.pipelines; const existingCards = grid.querySelectorAll('.pipeline-card'); existingCards.forEach((c) => c.remove()); const emptyState = grid.querySelector('.empty-state'); if (pipelines.length === 0) { if (!emptyState) { grid.insertAdjacentHTML('beforeend', PipelinesUI.renderEmpty()); } Utils.refreshIcons(grid); return; } if (emptyState) emptyState.remove(); const fragment = document.createDocumentFragment(); pipelines.forEach((pipeline) => { const wrapper = document.createElement('div'); wrapper.innerHTML = PipelinesUI.renderCard(pipeline); fragment.appendChild(wrapper.firstElementChild); }); grid.appendChild(fragment); Utils.refreshIcons(grid); }, renderEmpty() { return `
Crie seu primeiro pipeline para encadear agentes em fluxos automatizados.
${Utils.escapeHtml(pipeline.description)}
` : ''}