From 8fbfa90b55078681e060823b458ad76cb1896998 Mon Sep 17 00:00:00 2001 From: alex289 Date: Thu, 4 Jun 2026 17:47:46 +0200 Subject: [PATCH] feat: Icon picker --- frontend/messages/de.json | 3 + frontend/messages/en.json | 3 + .../src/components/dialogs/upsert-agent.tsx | 21 +++ .../src/components/lucide-icon-picker.tsx | 137 ++++++++++++++++++ 4 files changed, 164 insertions(+) create mode 100644 frontend/src/components/lucide-icon-picker.tsx diff --git a/frontend/messages/de.json b/frontend/messages/de.json index 1ef5537d..34db81d8 100644 --- a/frontend/messages/de.json +++ b/frontend/messages/de.json @@ -215,6 +215,9 @@ "addAgentDescription": "Füge einen neuen Agenten hinzu, um Docker-Hosts und Server zu verwalten.", "editAgentDescription": "Aktualisiere die Agentenkonfiguration.", "agentNamePlaceholder": "z. B. \"prod-server-01\"", + "icon": "Icon", + "selectIcon": "Icon auswählen", + "noIconsFound": "Keine Icons gefunden", "agentUpdated": "Agent aktualisiert", "agentConnected": "Agent verbunden", "failedSaveAgent": "Agent konnte nicht gespeichert werden", diff --git a/frontend/messages/en.json b/frontend/messages/en.json index 6250b2e8..21ec11a6 100644 --- a/frontend/messages/en.json +++ b/frontend/messages/en.json @@ -215,6 +215,9 @@ "addAgentDescription": "Add a new agent to manage Docker hosts and servers.", "editAgentDescription": "Update the agent configuration.", "agentNamePlaceholder": "e.g. \"prod-server-01\"", + "icon": "Icon", + "selectIcon": "Select an icon", + "noIconsFound": "No icons found", "agentUpdated": "Agent updated", "agentConnected": "Agent connected", "failedSaveAgent": "Failed to save agent", diff --git a/frontend/src/components/dialogs/upsert-agent.tsx b/frontend/src/components/dialogs/upsert-agent.tsx index a1098ac7..778ef56b 100644 --- a/frontend/src/components/dialogs/upsert-agent.tsx +++ b/frontend/src/components/dialogs/upsert-agent.tsx @@ -20,6 +20,7 @@ import { Input } from "../ui/input"; import { createAgent, updateAgent, type Agent } from "@/lib/agents"; import CopyValueDialog from "./copy-value-dialog"; import { m } from "@/lib/paraglide/messages"; +import LucideIconPicker, { type LucideIconName } from "@/components/lucide-icon-picker"; const agentSchema = z.object({ name: z @@ -27,8 +28,11 @@ const agentSchema = z.object({ .trim() .min(1, m.validationAgentNameRequired()) .max(128, m.validationAgentNameMaxLength()), + icon: z.string(), }); +const defaultAgentIcon: LucideIconName = "server"; + export default function UpsertAgentDialog({ agent, asDropdownItem = false, @@ -45,6 +49,7 @@ export default function UpsertAgentDialog({ const form = useForm({ defaultValues: { name: agent?.name ?? "", + icon: defaultAgentIcon as string, }, validators: { onSubmit: agentSchema, @@ -68,6 +73,7 @@ export default function UpsertAgentDialog({ toast.success(m.agentConnected()); } setOpen(false); + form.reset(); } catch (err) { toast.error(err instanceof Error ? err.message : m.failedSaveAgent()); } finally { @@ -134,6 +140,21 @@ export default function UpsertAgentDialog({ }} /> + ( + + + + + )} + /> +