"use Client"; import { Button } from "@/components/ui/button"; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog"; import { zodResolver } from "@hookform/resolvers/zod" import { useForm } from "react-hook-form" import { z } from "zod" import { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, } from "@/components/ui/form" import { Input } from "@/components/ui/input" import { Separator } from "@/components/ui/separator"; import { Plus } from "lucide-react"; import { useFieldArray } from "react-hook-form"; import { alterVorlage } from "./action"; import { useState } from "react"; type TableData = { id: number; product_type: string; height: number; width: number; printer: string; coordinates: { x: number; y: number; rotation: number }[]; }; type AlterDialogProps = { onNewEntry: () => void; data: TableData; }; export default function AlterDialog({ onNewEntry, data }: AlterDialogProps) { const [open, setOpen] = useState(false) const formSchema = z.object({ Drucker: z.string().min(1, { message: "Druckername muss mindestens 2 Zeichen lang sein.", }), Artikeltyp: z.string().min(1, { message: "Artikeltyp muss mindestens 2 Zeichen lang sein.", }), Höhe: z.preprocess( (value) => (typeof value === "string" ? parseFloat(value) : value), z.number({ invalid_type_error: "Höhe muss eine gültige Zahl sein. Bspw. 1.5 .", }).min(1, { message: "Höhe muss mindestens 1 sein.", }) ), Breite: z.preprocess( (value) => (typeof value === "string" ? parseFloat(value) : value), z.number({ invalid_type_error: "Breite muss eine gültige Zahl sein. Bspw. 1.5 .", }).min(1, { message: "Breite muss mindestens 1 sein.", }) ), Koordinaten: z.array( z.object({ x: z.preprocess( (value) => (typeof value === "string" ? parseFloat(value) : value), z.number().min(0, { message: "X-Koordinate muss mindestens 0 sein.", }) ), y: z.preprocess( (value) => (typeof value === "string" ? parseFloat(value) : value), z.number().min(0, { message: "Y-Koordinate muss mindestens 0 sein.", }) ), rotation: z.preprocess( (value) => (typeof value === "string" ? parseFloat(value) : value), z.number().min(0, { message: "Rotation muss mindestens 0 sein.", }) ), }) ).min(1, { message: "Es muss mindestens eine Koordinate angegeben werden.", }), }); const form = useForm>({ resolver: zodResolver(formSchema), defaultValues: { Drucker: data.printer, Artikeltyp: data.product_type, Höhe: data.height, Breite: data.width, Koordinaten: data.coordinates.map((coord) => ({ x: coord.x, y: coord.y, rotation: coord.rotation, })), }, }); const { fields, append, remove } = useFieldArray({ control: form.control, name: "Koordinaten", }); async function onSubmit(values: z.infer) { const formData = new FormData(); formData.append("id", data.id.toString()); formData.append("printer", values.Drucker); formData.append("product_type", values.Artikeltyp); formData.append("height", values.Höhe.toString()); formData.append("width", values.Breite.toString()); formData.append("coordinates", JSON.stringify(values.Koordinaten)); try { await alterVorlage(formData); setOpen(false); form.reset(); onNewEntry(); } catch (error) { console.error("Error submitting form:", error); throw new Error("An error occurred while submitting the form."); } } return (
Vorlage bearbeiten
( Drucker Name Der Name des Druckers, auf dem die Vorlage gedruckt wird. )} /> ( Artikel Typ Der Name des Artikels, der auf der Vorlage gedruckt wird. )} /> ( Höhe Die Höhe der Vorlage in Millimeter. )} /> ( Breite Die Breite der Vorlage in Millimeter. )} />
Koordinaten: {fields.map((field, index) => (
( X-Koordinate )} /> ( Y-Koordinate )} /> ( Rotation )} />
))}
); }