import { useState } from "react"; import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; import { ScrollArea } from "@/components/ui/scroll-area"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter } from "@/components/ui/dialog"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Textarea } from "@/components/ui/textarea"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { useToast } from "@/hooks/use-toast"; import { Code2, Database, Layout, GitBranch, BarChart3, FileText, Plus, Settings, Play, Zap, Layers, Puzzle, Palette, Terminal, Box, Workflow, PanelLeft, Table2, FormInput, ListChecks, PieChart, LineChart, Gauge, Bot, Code, Trash2, Save, Sparkles, Rocket } from "lucide-react"; import { useLocation } from "wouter"; import DocTypeBuilder from "./DocTypeBuilder"; import PageBuilder from "./PageBuilder"; import WorkflowBuilder from "./WorkflowBuilder"; import IDE from "./IDE"; import DevAgent from "@/components/lowcode/DevAgent"; import OpenClawPanel from "@/components/OpenClawPanel"; import AutomationCenter from "./AutomationCenter"; type ActiveTool = "home" | "doctypes" | "pages" | "workflows" | "dashboards" | "reports" | "scripts" | "ide" | "agent" | "openclaw" | "automationcenter"; interface Dashboard { id: number; name: string; description?: string; widgets: any[]; createdAt: string; } interface Report { id: number; name: string; dataSource: string; fields: string[]; filters?: any; createdAt: string; } interface Script { id: number; name: string; type: string; code: string; createdAt: string; } export default function DevelopmentModule() { const [activeTool, setActiveTool] = useState("home"); const [showNewDashboardDialog, setShowNewDashboardDialog] = useState(false); const [showNewReportDialog, setShowNewReportDialog] = useState(false); const [showNewScriptDialog, setShowNewScriptDialog] = useState(false); const [showConfigDialog, setShowConfigDialog] = useState(false); const [newDashboardName, setNewDashboardName] = useState(""); const [newDashboardDesc, setNewDashboardDesc] = useState(""); const [newReportName, setNewReportName] = useState(""); const [newReportDataSource, setNewReportDataSource] = useState(""); const [newScriptName, setNewScriptName] = useState(""); const [newScriptType, setNewScriptType] = useState("validation"); const [newScriptCode, setNewScriptCode] = useState(""); const [dashboards, setDashboards] = useState([]); const [reports, setReports] = useState([]); const [scripts, setScripts] = useState([]); const [selectedDashboard, setSelectedDashboard] = useState(null); const [selectedWidgetType, setSelectedWidgetType] = useState(null); const { toast } = useToast(); const { data: stats } = useQuery({ queryKey: ["/api/lowcode/stats"], queryFn: async () => { try { const [doctypes, pages, workflows] = await Promise.all([ fetch("/api/lowcode/doctypes").then(r => r.ok ? r.json() : []), fetch("/api/lowcode/pages").then(r => r.ok ? r.json() : []), fetch("/api/lowcode/workflows").then(r => r.ok ? r.json() : []) ]); return { doctypes: doctypes.length || 0, pages: pages.length || 0, workflows: workflows.length || 0, scripts: 0, dashboards: 0, reports: 0 }; } catch { return { doctypes: 0, pages: 0, workflows: 0, scripts: 0, dashboards: 0, reports: 0 }; } } }); const handleCreateDashboard = () => { if (!newDashboardName.trim()) { toast({ title: "Nome obrigatório", description: "Digite um nome para o dashboard", variant: "destructive" }); return; } const newDashboard: Dashboard = { id: Date.now(), name: newDashboardName, description: newDashboardDesc, widgets: [], createdAt: new Date().toISOString() }; setDashboards([...dashboards, newDashboard]); setSelectedDashboard(newDashboard); setNewDashboardName(""); setNewDashboardDesc(""); setShowNewDashboardDialog(false); toast({ title: "Dashboard criado", description: `"${newDashboard.name}" foi criado com sucesso` }); }; const handleCreateReport = () => { if (!newReportName.trim()) { toast({ title: "Nome obrigatório", description: "Digite um nome para o relatório", variant: "destructive" }); return; } const newReport: Report = { id: Date.now(), name: newReportName, dataSource: newReportDataSource, fields: [], createdAt: new Date().toISOString() }; setReports([...reports, newReport]); setNewReportName(""); setNewReportDataSource(""); setShowNewReportDialog(false); toast({ title: "Relatório criado", description: `"${newReport.name}" foi criado com sucesso` }); }; const handleCreateScript = () => { if (!newScriptName.trim()) { toast({ title: "Nome obrigatório", description: "Digite um nome para o script", variant: "destructive" }); return; } const newScript: Script = { id: Date.now(), name: newScriptName, type: newScriptType, code: newScriptCode || "// Seu código aqui\n", createdAt: new Date().toISOString() }; setScripts([...scripts, newScript]); setNewScriptName(""); setNewScriptType("validation"); setNewScriptCode(""); setShowNewScriptDialog(false); toast({ title: "Script criado", description: `"${newScript.name}" foi criado com sucesso` }); }; const handleAddWidget = (widgetType: string) => { if (!selectedDashboard) { toast({ title: "Selecione um dashboard", description: "Crie ou selecione um dashboard primeiro", variant: "destructive" }); return; } const newWidget = { id: Date.now(), type: widgetType, title: `${widgetType} Widget`, config: {} }; const updated = { ...selectedDashboard, widgets: [...selectedDashboard.widgets, newWidget] }; setSelectedDashboard(updated); setDashboards(dashboards.map(d => d.id === updated.id ? updated : d)); toast({ title: "Widget adicionado", description: `Widget ${widgetType} adicionado ao dashboard` }); }; const handleRunReport = () => { toast({ title: "Executando relatório", description: "O relatório está sendo processado..." }); setTimeout(() => { toast({ title: "Relatório concluído", description: "Os dados foram gerados com sucesso" }); }, 1500); }; const handleTestScript = () => { toast({ title: "Testando script", description: "Executando em ambiente de sandbox..." }); setTimeout(() => { toast({ title: "Teste concluído", description: "Script executado sem erros" }); }, 1000); }; const tools = [ { id: "doctypes" as ActiveTool, name: "DocTypes", description: "Crie entidades e formulários", icon: Database, color: "bg-blue-500", count: stats?.doctypes || 0, category: "low-code" }, { id: "pages" as ActiveTool, name: "Páginas", description: "Monte interfaces visuais", icon: Layout, color: "bg-purple-500", count: stats?.pages || 0, category: "low-code" }, { id: "workflows" as ActiveTool, name: "Workflows", description: "Automações e integrações", icon: GitBranch, color: "bg-green-500", count: stats?.workflows || 0, category: "no-code" }, { id: "dashboards" as ActiveTool, name: "Dashboards", description: "Painéis e KPIs visuais", icon: BarChart3, color: "bg-orange-500", count: stats?.dashboards || 0, category: "no-code" }, { id: "reports" as ActiveTool, name: "Relatórios", description: "Relatórios personalizados", icon: FileText, color: "bg-red-500", count: stats?.reports || 0, category: "no-code" }, { id: "scripts" as ActiveTool, name: "Scripts", description: "Código customizado", icon: Code2, color: "bg-gray-700", count: stats?.scripts || 0, category: "low-code" }, { id: "ide" as ActiveTool, name: "IDE", description: "Editor de código completo", icon: Code, color: "bg-cyan-600", count: 0, category: "dev" }, { id: "agent" as ActiveTool, name: "Manus AI", description: "Agente autônomo de IA", icon: Bot, color: "bg-violet-600", count: 0, category: "dev" }, { id: "openclaw" as ActiveTool, name: "Skills Emergentes", description: "Padrões detectados automaticamente", icon: Sparkles, color: "bg-yellow-500", count: 0, category: "dev" }, { id: "automationcenter" as ActiveTool, name: "Automation Center", description: "Automações unificadas Central + XOS", icon: Workflow, color: "bg-blue-600", count: 0, category: "dev" }, ]; const [, navigate] = useLocation(); const aiTools = [ { id: "dev-center", name: "IA Autônoma", description: "Crie funcionalidades com prompts em português. Os agentes projetam, codificam e validam automaticamente.", icon: Sparkles, color: "from-purple-600 to-indigo-700", features: ["Desenvolver", "Preview", "Publicar", "Analisar Repos"], path: "/dev-center" } ]; const renderHome = () => (

Centro de Desenvolvimento

Crie módulos, automações e interfaces sem código

Low-Code / No-Code

Total de Componentes

{(stats?.doctypes || 0) + (stats?.pages || 0) + (stats?.workflows || 0)}

Automações Ativas

{stats?.workflows || 0}

Interfaces Criadas

{stats?.pages || 0}

navigate("/dev-center")} data-testid="card-ai-autonomous" >

IA Autônoma

Centro de Comando

Descreva o que você quer criar em português e a IA vai usar todas as ferramentas abaixo automaticamente: DocTypes, Páginas, Workflows, Dashboards...

Desenvolver
Preview ao Vivo
Publicar

Ferramentas de Desenvolvimento (A IA pode usar todas automaticamente)

{tools.map((tool) => ( setActiveTool(tool.id)} data-testid={`dev-tool-${tool.id}`} >

{tool.name}

{tool.category}

{tool.description}

{tool.count} criados
))}
Componentes Pré-definidos Blocos prontos para usar
{[ { icon: FormInput, name: "Formulário", color: "bg-blue-100 text-blue-600" }, { icon: Table2, name: "Tabela", color: "bg-green-100 text-green-600" }, { icon: PieChart, name: "Gráfico Pizza", color: "bg-orange-100 text-orange-600" }, { icon: LineChart, name: "Gráfico Linha", color: "bg-purple-100 text-purple-600" }, { icon: Gauge, name: "Medidor", color: "bg-red-100 text-red-600" }, { icon: ListChecks, name: "Lista", color: "bg-gray-100 text-gray-600" }, ].map((comp) => (
{comp.name}
))}
Templates Prontos Comece com um modelo
{[ { name: "CRUD Completo", desc: "Listagem + Formulário + Detalhes", icon: Database }, { name: "Dashboard Executivo", desc: "KPIs + Gráficos + Alertas", icon: BarChart3 }, { name: "Workflow de Aprovação", desc: "Solicitação → Análise → Aprovação", icon: GitBranch }, ].map((template) => (

{template.name}

{template.desc}

))}
); const renderDashboardBuilder = () => (

Dashboard Builder

Crie painéis visuais com arrastar e soltar

{selectedDashboard && (

{selectedDashboard.name}

{selectedDashboard.widgets.length} widgets

Editando
)}
handleAddWidget("KPI Card")} data-testid="widget-kpi">
KPI Card
handleAddWidget("Gráfico Barras")} data-testid="widget-bar">
Gráfico Barras
handleAddWidget("Gráfico Pizza")} data-testid="widget-pie">
Gráfico Pizza
handleAddWidget("Tabela")} data-testid="widget-table">
Tabela
{selectedDashboard && selectedDashboard.widgets.length > 0 ? (
{selectedDashboard.widgets.map((widget, index) => (
{widget.type}
Preview {widget.type}
))}
) : (

Área do Dashboard

Clique nos widgets acima para adicionar ao painel

)}
); const renderReportBuilder = () => (

Report Builder

Crie relatórios personalizados

Fonte de Dados

{["Clientes", "Produtos", "Pedidos", "Amostras", "Laudos"].map((source) => (
setNewReportDataSource(source)}> {source}
))}

Campos

{["ID", "Nome", "Data", "Status", "Valor"].map((field) => (
{field}
))}
Preview do Relatório

Selecione campos e configure filtros

); const renderScriptEditor = () => (

Script Editor

Código customizado para eventos e validações

Tipos de Script

{[ { name: "Validação", desc: "Validar dados antes de salvar", value: "validation" }, { name: "Evento", desc: "Executar em ações do usuário", value: "event" }, { name: "Cálculo", desc: "Campos calculados", value: "calculation" }, { name: "API", desc: "Integrações externas", value: "api" }, ].map((type) => (
setNewScriptType(type.value)}>

{type.name}

{type.desc}

))}

// Exemplo de script de validação

function validate(doc) {"{"}

if (!doc.name) {"{"}

throw new Error("Nome é obrigatório");

{"}"}

return true;

{"}"}

); return (
{tools.map((tool) => ( ))}
{activeTool === "home" && renderHome()} {activeTool === "doctypes" && } {activeTool === "pages" && } {activeTool === "workflows" && } {activeTool === "dashboards" && renderDashboardBuilder()} {activeTool === "reports" && renderReportBuilder()} {activeTool === "scripts" && renderScriptEditor()} {activeTool === "ide" && } {activeTool === "agent" && } {activeTool === "openclaw" && } {activeTool === "automationcenter" && }
Novo Dashboard
setNewDashboardName(e.target.value)} placeholder="Ex: Dashboard de Vendas" data-testid="input-dashboard-name" />