From 520599986cd8afa91a7616164b74ae60ccf953ad Mon Sep 17 00:00:00 2001 From: DanielS Date: Wed, 24 Jun 2026 23:29:16 +0200 Subject: [PATCH] Add user lock/unlock functionality and remove partner management --- shop/app/admin/einstellungen/page.tsx | 55 ++++++++ shop/app/admin/layout.tsx | 5 +- shop/app/admin/partners/page.tsx | 180 -------------------------- shop/components/admin/user-list.tsx | 63 ++++++--- shop/lib/actions/partners.ts | 49 ------- 5 files changed, 99 insertions(+), 253 deletions(-) delete mode 100644 shop/app/admin/partners/page.tsx delete mode 100644 shop/lib/actions/partners.ts diff --git a/shop/app/admin/einstellungen/page.tsx b/shop/app/admin/einstellungen/page.tsx index 30917be..5edc207 100644 --- a/shop/app/admin/einstellungen/page.tsx +++ b/shop/app/admin/einstellungen/page.tsx @@ -1,5 +1,60 @@ +/* Updated Admin Settings without Partner Management */ 'use client'; +import { useState, useEffect } from 'react'; +import { Switch } from '@/components/ui/switch'; +import { Button } from '@/components/ui/button'; +import { Input } from '@/components/ui/input'; +import { Label } from '@/components/ui/label'; +import { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, +} from '@/components/ui/dialog'; + +export default function AdminSettings() { + const [demoActive, setDemoActive] = useState(true); + + useEffect(() => { + const state = localStorage.getItem('demo_banner_disabled') !== 'true'; + setDemoActive(state); + }, []); + + const toggleDemo = (checked: boolean) => { + setDemoActive(checked); + localStorage.setItem('demo_banner_disabled', (!checked).toString()); + window.dispatchEvent(new Event('storage_demo_changed')); + }; + + return ( +
+ {/* Page Header */} +
+

Admin Einstellungen

+

+ Verwalten Sie globale Shopeinstellungen. +

+
+ + {/* Allgemeine Einstellungen */} +
+

Allgemeine Einstellungen

+
+
+

Demo-Warnmeldungen

+

Schaltet gelbe Banner ein oder aus.

+
+ +
+
+
+ ); +} + + import { useState, useEffect } from 'react'; import { Switch } from '@/components/ui/switch'; import { Button } from '@/components/ui/button'; diff --git a/shop/app/admin/layout.tsx b/shop/app/admin/layout.tsx index 63fb324..506ad7f 100644 --- a/shop/app/admin/layout.tsx +++ b/shop/app/admin/layout.tsx @@ -58,10 +58,7 @@ export default async function AdminLayout({ Benutzer - - - Partner - + Firmen diff --git a/shop/app/admin/partners/page.tsx b/shop/app/admin/partners/page.tsx deleted file mode 100644 index 166f8b8..0000000 --- a/shop/app/admin/partners/page.tsx +++ /dev/null @@ -1,180 +0,0 @@ -'use client' - -import { useState, useEffect } from 'react' -import { Building2, Plus, Trash2, Loader2 } from 'lucide-react' -import { Button } from '@/components/ui/button' -import { Input } from '@/components/ui/input' -import { Label } from '@/components/ui/label' -import { - Dialog, - DialogContent, - DialogDescription, - DialogFooter, - DialogHeader, - DialogTitle, -} from '@/components/ui/dialog' -import { getPartners, createPartner, deletePartner } from '@/lib/actions/partners' - -export default function PartnersPage() { - const [partners, setPartners] = useState([]) - const [loading, setLoading] = useState(true) - const [isCreateOpen, setIsCreateOpen] = useState(false) - const [name, setName] = useState('') - const [creating, setCreating] = useState(false) - const [createError, setCreateError] = useState(null) - const [deletingId, setDeletingId] = useState(null) - - const loadPartners = async () => { - setLoading(true) - try { - const data = await getPartners() - setPartners(data) - } catch (err) { - console.error('Fehler beim Laden der Partner:', err) - } finally { - setLoading(false) - } - } - - useEffect(() => { - loadPartners() - }, []) - - const handleCreate = async (e: React.FormEvent) => { - e.preventDefault() - setCreating(true) - setCreateError(null) - try { - await createPartner(name) - setIsCreateOpen(false) - setName('') - loadPartners() - } catch (err: any) { - setCreateError(err.message || 'Fehler beim Anlegen.') - } finally { - setCreating(false) - } - } - - const handleDelete = async (id: string, partnerName: string) => { - if (!confirm(`Partner "${partnerName}" wirklich löschen?`)) return - setDeletingId(id) - try { - await deletePartner(id) - loadPartners() - } catch (err) { - console.error('Fehler beim Löschen:', err) - } finally { - setDeletingId(null) - } - } - - return ( -
- {/* Header */} -
-
-

- Partnerverwaltung -

-

- Verwalten Sie Partner. -

-
- -
- - {/* Partner Table */} -
- {loading ? ( -
- - Lade Partner… -
- ) : partners.length === 0 ? ( -
- - Noch keine Partner angelegt. -
- ) : ( - - - - - - - - - - {partners.map((partner) => ( - - - - - - ))} - -
PartnernameErstellt amAktionen
-
- - {partner.name} -
-
- {partner.created_at ? new Date(partner.created_at).toLocaleDateString('de-DE') : '–'} - - -
- )} -
- - {/* Dialog: Neuer Partner */} - - - - Neuen Partner anlegen - - Geben Sie den Namen des Partners ein. - - -
-
- - setName(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-list.tsx b/shop/components/admin/user-list.tsx index 0ebd917..3f55e92 100644 --- a/shop/components/admin/user-list.tsx +++ b/shop/components/admin/user-list.tsx @@ -11,7 +11,7 @@ import { TableRow, } from '@/components/ui/table' import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card' -import { Key, Trash2, Mail, Loader2, Building2 } from 'lucide-react' +import { Key, Trash2, Mail, Loader2, Building2, Ban, Unlock } from 'lucide-react' import { Button } from '@/components/ui/button' import { deleteUser, resetPassword, updateUserRole } from '@/lib/actions/users' import { assignCompanyToUser } from '@/lib/actions/companies' @@ -61,6 +61,19 @@ export function UserList({ initialUsers, companies }: UserListProps) { } } + const handleToggleLock = async (id: string, currentRole: Role) => { + const newRole = currentRole === 'gesperrt' ? 'partner' : 'gesperrt' + setLoadingId(id + '-lock') + try { + await updateUserRole(id, newRole) + router.refresh() + } catch (e) { + console.error('Fehler beim Sperren/Entsperren:', e) + } finally { + setLoadingId(null) + } + } + const handleCompanyChange = async (userId: string, companyId: string) => { setLoadingId(userId + '-company') try { @@ -160,25 +173,35 @@ export function UserList({ initialUsers, companies }: UserListProps) {
- - + + +
diff --git a/shop/lib/actions/partners.ts b/shop/lib/actions/partners.ts deleted file mode 100644 index 13c03de..0000000 --- a/shop/lib/actions/partners.ts +++ /dev/null @@ -1,49 +0,0 @@ -'use server' - -import { createAdminClient } from '@/lib/supabase/admin' -import { revalidatePath } from 'next/cache' - -export async function getPartners() { - const admin = createAdminClient() - const { data, error } = await admin - .from('partners') - .select('id, name, created_at') - .order('name', { ascending: true }) - if (error) throw error - return data || [] -} - -export async function createPartner(name: string) { - const admin = createAdminClient() - const { data, error } = await admin - .from('partners') - .insert({ name: name.trim() }) - .select() - .single() - if (error) throw error - revalidatePath('/admin/partners') - revalidatePath('/admin/users') - return data -} - -export async function deletePartner(id: string) { - const admin = createAdminClient() - const { error } = await admin - .from('partners') - .delete() - .eq('id', id) - if (error) throw error - revalidatePath('/admin/partners') - revalidatePath('/admin/users') -} - -export async function assignPartnerToUser(userId: string, partnerId: string | null) { - const admin = createAdminClient() - const { error } = await admin - .from('users') - .update({ partner_id: partnerId }) - .eq('id', userId) - if (error) throw error - revalidatePath('/admin/users') - revalidatePath('/admin/einstellungen') -}