Tela completa de campanhas do discador preditivo: listagem com busca/
filtro/status, wizard de criacao em 7 passos exatamente como a
especificacao nomeia (Geral -> Telefonia -> Discagem -> Horarios ->
Gravacao e IA -> Leads -> Revisao, agente.md secao 170) — nada e criado
ate confirmar na revisao, upload de CSV de leads na mesma acao de
criacao — e detalhe com acoes de ciclo de vida (iniciar/pausar/drenar/
parar, cada botao so aparece quando a transicao e valida pro status
atual), pacing ao vivo, previa de leads com import adicional, e remover.
Corrige de quebra um erro real de build: Server Actions exportadas como
arrow function que so repassam argumentos pra outra funcao quebram
("Server Actions must be async functions") — precisam ser declaradas
como async function de verdade.
Testado ponta a ponta com fila+tronco reais: os 7 passos preenchidos e
revisados, campanha criada com CSV de 3 leads importado, ciclo de vida
completo start->pause->drain->stop->delete via API, e confirmado que uma
campanha iniciada de verdade e pega pelo PredictiveDialerEngine real
rodando em Docker (stats deixam de ser null depois de alguns segundos).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EWHKmcVJtstQFErbZ1AanY
84 lines
2.4 KiB
TypeScript
84 lines
2.4 KiB
TypeScript
import {
|
|
LayoutDashboard,
|
|
PhoneOutgoing,
|
|
Headset,
|
|
Router,
|
|
Radar,
|
|
Mic,
|
|
Sparkles,
|
|
BarChart3,
|
|
ShieldCheck,
|
|
} from "lucide-react";
|
|
import type { NavSection } from "../shell/nav-types";
|
|
|
|
/** IA fixa do menu Tenant (agente.md secao 169) — "Dashboard" (PHASE 23),
|
|
* "Telefonia > Ramais" (PHASE 25) e "Discador > Campanhas" (PHASE 26) têm
|
|
* página construída até agora, o resto existe pra provar a arquitetura
|
|
* completa (Product Principle #5 em PRODUCT.md), renderizado como
|
|
* indisponível em vez de virar link morto. "Itens sem permissão não
|
|
* aparecem" (secao 169) ainda não é aplicado aqui — este primeiro corte
|
|
* mostra a IA inteira pra qualquer usuário tenant autenticado; filtrar por
|
|
* permission real fica pra quando mais telas existirem pra testar contra. */
|
|
export const TENANT_NAV: NavSection[] = [
|
|
{
|
|
label: "Dashboard",
|
|
icon: LayoutDashboard,
|
|
href: "/app",
|
|
description: "Chamadas, agentes e filas agora",
|
|
},
|
|
{
|
|
label: "Discador",
|
|
icon: PhoneOutgoing,
|
|
children: [
|
|
{
|
|
label: "Campanhas",
|
|
href: "/app/discador/campanhas",
|
|
description: "Discador preditivo — campanhas deste tenant",
|
|
},
|
|
{ label: "Leads" },
|
|
{ label: "Importações" },
|
|
{ label: "Callbacks" },
|
|
{ label: "Lista de Bloqueio" },
|
|
],
|
|
},
|
|
{
|
|
label: "Call Center",
|
|
icon: Headset,
|
|
children: [{ label: "Agentes" }, { label: "Filas" }, { label: "Pausas" }, { label: "Disposições" }],
|
|
},
|
|
{
|
|
label: "Telefonia",
|
|
icon: Router,
|
|
children: [
|
|
{
|
|
label: "Ramais",
|
|
href: "/app/telefonia/ramais",
|
|
description: "Ramais SIP deste tenant — números, senha, caller ID",
|
|
},
|
|
{ label: "Troncos" },
|
|
{ label: "Dialplan" },
|
|
],
|
|
},
|
|
{
|
|
label: "Monitoramento",
|
|
icon: Radar,
|
|
children: [{ label: "Campanhas" }, { label: "Filas" }, { label: "Agentes" }, { label: "Ramais" }, { label: "Troncos" }],
|
|
},
|
|
{ label: "Gravações", icon: Mic },
|
|
{
|
|
label: "IA",
|
|
icon: Sparkles,
|
|
children: [{ label: "Análises" }, { label: "Scorecards" }, { label: "Prompts" }, { label: "Configurações" }],
|
|
},
|
|
{
|
|
label: "Relatórios",
|
|
icon: BarChart3,
|
|
children: [{ label: "Chamadas" }, { label: "Agentes" }, { label: "Filas" }, { label: "Campanhas" }, { label: "Consumo" }],
|
|
},
|
|
{
|
|
label: "Administração",
|
|
icon: ShieldCheck,
|
|
children: [{ label: "Usuários" }, { label: "Perfis" }, { label: "Configurações" }],
|
|
},
|
|
];
|