From 25da60f7b2c57dd5f08822b813031a7b35331f74 Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Fri, 7 Nov 2025 19:20:49 +0000 Subject: [PATCH] Refactor agent details page Move AI model select above system prompt and add version history modal. --- .../agents/VersionHistoryDialog.tsx | 122 ++++++++++ src/pages/AgentDetails.tsx | 213 ++++++------------ 2 files changed, 191 insertions(+), 144 deletions(-) create mode 100644 src/components/agents/VersionHistoryDialog.tsx diff --git a/src/components/agents/VersionHistoryDialog.tsx b/src/components/agents/VersionHistoryDialog.tsx new file mode 100644 index 0000000..86fc848 --- /dev/null +++ b/src/components/agents/VersionHistoryDialog.tsx @@ -0,0 +1,122 @@ +import { Button } from "@/components/ui/button"; +import { + Dialog, + DialogContent, + DialogDescription, + DialogHeader, + DialogTitle, +} from "@/components/ui/dialog"; +import { ScrollArea } from "@/components/ui/scroll-area"; +import { Badge } from "@/components/ui/badge"; +import { Copy } from "lucide-react"; +import { useToast } from "@/hooks/use-toast"; + +interface VersionHistoryDialogProps { + open: boolean; + onOpenChange: (open: boolean) => void; + agentName: string; + versions: Array<{ + id: number; + version: string; + type: "major" | "minor" | "patch"; + description: string; + prompt: string; + createdAt: string; + author: string; + }>; +} + +export function VersionHistoryDialog({ + open, + onOpenChange, + agentName, + versions, +}: VersionHistoryDialogProps) { + const { toast } = useToast(); + + const handleCopyPrompt = async (prompt: string) => { + try { + await navigator.clipboard.writeText(prompt); + toast({ + title: "Copiado!", + description: "Prompt copiado para a área de transferência.", + }); + } catch (error) { + toast({ + title: "Erro", + description: "Não foi possível copiar o prompt.", + variant: "destructive", + }); + } + }; + + const getVersionTypeColor = (type: string) => { + switch (type) { + case "major": + return "bg-primary text-primary-foreground"; + case "minor": + return "bg-secondary text-secondary-foreground"; + case "patch": + return "bg-muted text-muted-foreground"; + default: + return "bg-muted text-muted-foreground"; + } + }; + + return ( + + + + Histórico de Versões + + Todas as alterações salvas do prompt de {agentName} + + + +
+ {versions.map((version) => ( +
+
+
+
+ v{version.version} + + {version.type} + +
+

+ {version.description} +

+
+ +
+ +
+

+ {version.prompt} +

+
+ +
+

+ {version.author} • {version.createdAt} +

+
+
+ ))} +
+
+
+
+ ); +} diff --git a/src/pages/AgentDetails.tsx b/src/pages/AgentDetails.tsx index 08052f0..dc8c674 100644 --- a/src/pages/AgentDetails.tsx +++ b/src/pages/AgentDetails.tsx @@ -1,20 +1,19 @@ import { useState } from "react"; import { useParams, useNavigate } from "react-router-dom"; import { Button } from "@/components/ui/button"; -import { Input } from "@/components/ui/input"; -import { Label } from "@/components/ui/label"; import { Textarea } from "@/components/ui/textarea"; import { Badge } from "@/components/ui/badge"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; -import { ScrollArea } from "@/components/ui/scroll-area"; -import { ArrowLeft, Bot, Save, Clock, Copy } from "lucide-react"; +import { ArrowLeft, Bot, Save, History } from "lucide-react"; import { useToast } from "@/hooks/use-toast"; +import { VersionHistoryDialog } from "@/components/agents/VersionHistoryDialog"; export default function AgentDetails() { const { id } = useParams(); const navigate = useNavigate(); const { toast } = useToast(); + const [isHistoryOpen, setIsHistoryOpen] = useState(false); // Mock data - substituir por dados reais do backend const [agent, setAgent] = useState({ @@ -73,35 +72,6 @@ export default function AgentDetails() { }); }; - const handleCopyPrompt = async (prompt: string) => { - try { - await navigator.clipboard.writeText(prompt); - toast({ - title: "Copiado!", - description: "Prompt copiado para a área de transferência.", - }); - } catch (error) { - toast({ - title: "Erro", - description: "Não foi possível copiar o prompt.", - variant: "destructive", - }); - } - }; - - const getVersionTypeColor = (type: string) => { - switch (type) { - case "major": - return "bg-primary text-primary-foreground"; - case "minor": - return "bg-secondary text-secondary-foreground"; - case "patch": - return "bg-muted text-muted-foreground"; - default: - return "bg-muted text-muted-foreground"; - } - }; - return (
{/* Header */} @@ -115,7 +85,7 @@ export default function AgentDetails() { Voltar para Agentes -
+
@@ -136,121 +106,76 @@ export default function AgentDetails() {
- +
+ + +
-
- {/* Left Column - Prompt & Model */} -
- {/* System Prompt */} - - - System Prompt - - Define o comportamento e personalidade do agente - - - -