'use client' import { useState } from 'react' import { useForm, useFieldArray } from 'react-hook-form' import { zodResolver } from '@hookform/resolvers/zod' import * as z from 'zod' import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from '@/components/ui/dialog' import { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, } from '@/components/ui/form' import { Input } from '@/components/ui/input' import { Button } from '@/components/ui/button' import { Checkbox } from '@/components/ui/checkbox' import { Plus, Trash2, X, PlusCircle } from 'lucide-react' import { createProduct, updateProduct } from '@/lib/actions/products' import { ScrollArea } from '@/components/ui/scroll-area' import { Separator } from '@/components/ui/separator' import { Category, Product } from '@/lib/types' import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select" const moduleSchema = z.object({ name: z.string().min(2, 'Name muss mindestens 2 Zeichen lang sein'), description: z.string().optional(), price: z.coerce.number().min(0, 'Preis darf nicht negativ sein'), is_required: z.boolean().default(false), requirements: z.string().optional().default(''), // Will be converted to array exclusions: z.string().optional().default(''), // Will be converted to array }) const productSchema = z.object({ name: z.string().min(2, 'Name muss mindestens 2 Zeichen lang sein'), description: z.string().optional(), base_price: z.coerce.number().min(0, 'Preis darf nicht negativ sein'), category_id: z.string().min(1, 'Bitte wählen Sie eine Kategorie'), billing_interval: z.enum(['one_time', 'monthly']).default('monthly'), modules: z.array(moduleSchema).default([]), }) type ProductFormValues = z.infer export function CreateProductDialog({ children, categories, product }: { children?: React.ReactNode, categories: Category[], product?: Product }) { const [open, setOpen] = useState(false) const form = useForm({ resolver: zodResolver(productSchema) as any, defaultValues: { name: product?.name || '', description: product?.description || '', base_price: product?.base_price || 0, category_id: product?.category_id || '', billing_interval: product?.billing_interval || 'monthly', modules: product?.modules?.map(m => ({ name: m.name, description: m.description || '', price: m.price, is_required: false, requirements: m.requirements?.join(', ') || '', exclusions: m.exclusions?.join(', ') || '', })) || [], }, }) const { fields, append, remove } = useFieldArray({ name: 'modules', control: form.control, }) async function onSubmit(values: ProductFormValues) { try { const { modules, ...productData } = values const formattedModules = modules.map(m => ({ ...m, requirements: m.requirements ? m.requirements.split(',').map(s => s.trim()).filter(Boolean) : [], exclusions: m.exclusions ? m.exclusions.split(',').map(s => s.trim()).filter(Boolean) : [], })) if (product) { await updateProduct(product.id, productData as any, formattedModules as any) } else { await createProduct(productData as any, formattedModules as any) } setOpen(false) if (!product) form.reset() } catch (error) { console.error('Error saving product:', error) } } return ( {children || ( )} {product ? 'Produkt bearbeiten' : 'Neues Produkt erstellen'} Definieren Sie das Basisprodukt und fügen Sie optionale oder erforderliche Module hinzu.
( Produktname )} /> ( Basispreis (€) )} />
( Kategorie )} /> ( Abrechnungsmodell
{[ { value: 'one_time', label: 'Einmalig', icon: '💳' }, { value: 'monthly', label: 'Monatlich', icon: '🔄' }, ].map(opt => ( ))}
)} /> ( Beschreibung )} />

Module

{fields.map((field, index) => (
( Modulname )} /> ( Aufpreis (€) )} />
( Benötigt (IDs, kommagetrennt) )} /> ( Schließt aus (IDs, kommagetrennt) )} />
(
Erforderlich
)} />
))} {fields.length === 0 && (
Noch keine Module hinzugefügt.
)}
) }