diff --git a/shop/app/admin/companies/page.tsx b/shop/app/admin/companies/page.tsx index 0228bd5..4457e99 100644 --- a/shop/app/admin/companies/page.tsx +++ b/shop/app/admin/companies/page.tsx @@ -1,7 +1,7 @@ 'use client' import { useState, useEffect } from 'react' -import { Building2, Plus, Trash2, Loader2 } from 'lucide-react' +import { Building2, Plus, Trash2, Loader2, Pencil, Mail, MapPin } from 'lucide-react' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' @@ -13,13 +13,20 @@ import { DialogHeader, DialogTitle, } from '@/components/ui/dialog' -import { getCompanies, createCompany, deleteCompany } from '@/lib/actions/companies' +import { getCompanies, createCompany, updateCompany, deleteCompany } from '@/lib/actions/companies' export default function CompaniesPage() { const [companies, setCompanies] = useState([]) const [loading, setLoading] = useState(true) - const [isCreateOpen, setIsCreateOpen] = useState(false) + const [isOpen, setIsOpen] = useState(false) + const [editingCompany, setEditingCompany] = useState(null) + const [name, setName] = useState('') + const [street, setStreet] = useState('') + const [zip, setZip] = useState('') + const [city, setCity] = useState('') + const [email, setEmail] = useState('') + const [creating, setCreating] = useState(false) const [createError, setCreateError] = useState(null) const [deletingId, setDeletingId] = useState(null) @@ -40,17 +47,38 @@ export default function CompaniesPage() { loadCompanies() }, []) - const handleCreate = async (e: React.FormEvent) => { + const handleOpenDialog = (company: any = null) => { + setEditingCompany(company) + setName(company ? company.name || '' : '') + setStreet(company ? company.street || '' : '') + setZip(company ? company.zip || '' : '') + setCity(company ? company.city || '' : '') + setEmail(company ? company.email || '' : '') + setCreateError(null) + setIsOpen(true) + } + + const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() setCreating(true) setCreateError(null) try { - await createCompany(name) - setIsCreateOpen(false) - setName('') + const payload = { + name: name.trim(), + street: street.trim(), + zip: zip.trim(), + city: city.trim(), + email: email.trim(), + } + if (editingCompany) { + await updateCompany(editingCompany.id, payload) + } else { + await createCompany(payload) + } + setIsOpen(false) loadCompanies() } catch (err: any) { - setCreateError(err.message || 'Fehler beim Anlegen.') + setCreateError(err.message || 'Fehler beim Speichern.') } finally { setCreating(false) } @@ -70,7 +98,7 @@ export default function CompaniesPage() { } return ( -
+
{/* Header */}
@@ -79,11 +107,11 @@ export default function CompaniesPage() { Firmenverwaltung

- Verwalten Sie Firmen und weisen Sie Partner zu. + Verwalten Sie Firmen, deren Lieferadresse und weisen Sie Partner zu.

+ +
+ + + {company.street ? `${company.street}, ${company.zip} ${company.city}` : '–'} + +
+ + + {company.email ? ( +
+ + {company.email} +
+ ) : '–'} + {company.created_at ? new Date(company.created_at).toLocaleDateString('de-DE') : '–'} - +
+ + +
))} @@ -144,16 +201,18 @@ export default function CompaniesPage() { )}
- {/* Dialog: Neue Firma */} - + {/* Dialog: Firma anlegen / bearbeiten */} + - Neue Firma anlegen + + {editingCompany ? 'Firma bearbeiten' : 'Neue Firma anlegen'} + - Geben Sie den Namen der Firma ein. Partner können danach zugewiesen werden. + Geben Sie die Firmendetails und die vollständige Lieferadresse ein. Alle Felder sind Pflichtfelder. -
+
+ +
+ + setStreet(e.target.value)} + className="bg-slate-50 dark:bg-white/5 border-slate-200 dark:border-white/10" + /> +
+ +
+
+ + setZip(e.target.value)} + className="bg-slate-50 dark:bg-white/5 border-slate-200 dark:border-white/10" + /> +
+
+ + setCity(e.target.value)} + className="bg-slate-50 dark:bg-white/5 border-slate-200 dark:border-white/10" + /> +
+
+ +
+ + setEmail(e.target.value)} + className="bg-slate-50 dark:bg-white/5 border-slate-200 dark:border-white/10" + /> +
+ {createError && (

{createError}

)} -
diff --git a/shop/components/admin/user-dialog.tsx b/shop/components/admin/user-dialog.tsx index 1f99f20..16c88d0 100644 --- a/shop/components/admin/user-dialog.tsx +++ b/shop/components/admin/user-dialog.tsx @@ -280,7 +280,7 @@ export function UserDialog({ companies }: UserDialogProps) { if (trimmed) { setIsCreatingCompany(true) try { - const created = await createCompany(trimmed) + const created = await createCompany({ name: trimmed }) if (created) { setLocalCompanies((prev) => [...prev, created]) field.onChange(created.id) diff --git a/shop/lib/actions/companies.ts b/shop/lib/actions/companies.ts index d049da6..e95d060 100644 --- a/shop/lib/actions/companies.ts +++ b/shop/lib/actions/companies.ts @@ -9,20 +9,32 @@ export async function getCompanies() { return data } -export async function createCompany(name: string) { +export async function createCompany(data: { name: string; street?: string; zip?: string; city?: string; email?: string }) { const admin = createAdminClient() - const { data, error } = await admin.from('companies').insert({ name }).select().single() + const { data: dbData, error } = await admin.from('companies').insert({ + name: data.name, + street: data.street || null, + zip: data.zip || null, + city: data.city || null, + email: data.email || null, + }).select().single() if (error) throw error revalidatePath('/admin/companies') - return data + return dbData } -export async function updateCompany(id: string, name: string) { +export async function updateCompany(id: string, data: { name: string; street?: string; zip?: string; city?: string; email?: string }) { const admin = createAdminClient() - const { data, error } = await admin.from('companies').update({ name }).eq('id', id).select().single() + const { data: dbData, error } = await admin.from('companies').update({ + name: data.name, + street: data.street || null, + zip: data.zip || null, + city: data.city || null, + email: data.email || null, + }).eq('id', id).select().single() if (error) throw error revalidatePath('/admin/companies') - return data + return dbData } export async function deleteCompany(id: string) { diff --git a/shop/supabase/migrations/20260625000000_add_delivery_address_to_companies.sql b/shop/supabase/migrations/20260625000000_add_delivery_address_to_companies.sql new file mode 100644 index 0000000..9a4a058 --- /dev/null +++ b/shop/supabase/migrations/20260625000000_add_delivery_address_to_companies.sql @@ -0,0 +1,6 @@ +-- Migration: Add delivery address columns to companies table +ALTER TABLE public.companies + ADD COLUMN IF NOT EXISTS street TEXT, + ADD COLUMN IF NOT EXISTS zip TEXT, + ADD COLUMN IF NOT EXISTS city TEXT, + ADD COLUMN IF NOT EXISTS email TEXT;