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.
-
- ) : (
-
-
-
- | Partnername |
- Erstellt am |
- Aktionen |
-
-
-
- {partners.map((partner) => (
-
- |
-
-
- {partner.name}
-
- |
-
- {partner.created_at ? new Date(partner.created_at).toLocaleDateString('de-DE') : '–'}
- |
-
-
- |
-
- ))}
-
-
- )}
-
-
- {/* Dialog: Neuer Partner */}
-
-
- )
-}
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')
-}