diff --git a/shop/app/admin/companies/page.tsx b/shop/app/admin/companies/page.tsx index 38d273f..4e099e4 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, Pencil, Mail, MapPin, Search } from 'lucide-react' +import { Building2, Plus, Trash2, Loader2, Pencil, Mail, MapPin, Search, Users } from 'lucide-react' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' @@ -14,6 +14,7 @@ import { DialogTitle, } from '@/components/ui/dialog' import { getCompanies, createCompany, updateCompany, deleteCompany } from '@/lib/actions/companies' +import { getUsersByCompany } from '@/lib/actions/users' export default function CompaniesPage() { const [companies, setCompanies] = useState([]) @@ -32,6 +33,11 @@ export default function CompaniesPage() { const [deletingId, setDeletingId] = useState(null) const [searchQuery, setSearchQuery] = useState('') + const [isUsersOpen, setIsUsersOpen] = useState(false) + const [selectedCompanyForUsers, setSelectedCompanyForUsers] = useState(null) + const [companyUsers, setCompanyUsers] = useState([]) + const [loadingUsers, setLoadingUsers] = useState(false) + const loadCompanies = async () => { setLoading(true) try { @@ -85,6 +91,20 @@ export default function CompaniesPage() { } } + const handleShowUsers = async (company: any) => { + setSelectedCompanyForUsers(company) + setIsUsersOpen(true) + setLoadingUsers(true) + try { + const data = await getUsersByCompany(company.id) + setCompanyUsers(data) + } catch (err) { + console.error('Fehler beim Laden der Benutzer:', err) + } finally { + setLoadingUsers(false) + } + } + const handleDelete = async (id: string, firmName: string) => { if (!confirm(`Firma "${firmName}" wirklich löschen? Alle zugewiesenen Partner werden getrennt.`)) return setDeletingId(id) @@ -189,6 +209,15 @@ export default function CompaniesPage() {
+ + + +
) } diff --git a/shop/lib/actions/users.ts b/shop/lib/actions/users.ts index 7c68c41..5dea4bd 100644 --- a/shop/lib/actions/users.ts +++ b/shop/lib/actions/users.ts @@ -230,3 +230,39 @@ export async function updateUserProfile(id: string, data: { first_name: string | if (error) throw error; revalidatePath('/admin/users'); } + +export async function getUsersByCompany(companyId: string) { + const admin = createAdminClient(); + const { data: dbUsers, error: dbError } = await admin + .from('users') + .select('id, role') + .eq('company_id', companyId); + if (dbError) throw dbError; + + if (dbUsers.length === 0) return []; + + const { data: { users }, error } = await admin.auth.admin.listUsers(); + if (error) throw error; + + const authUserMap = new Map(users.map((u) => [u.id, u])); + const userIds = dbUsers.map((u) => u.id); + + const { data: dbProfiles } = await admin + .from('profiles') + .select('id, first_name, last_name') + .in('id', userIds); + + const profileMap = new Map((dbProfiles || []).map((p) => [p.id, p])); + + return dbUsers.map((u) => { + const authUser = authUserMap.get(u.id); + const profile = profileMap.get(u.id); + return { + id: u.id, + email: authUser?.email || '', + role: u.role, + first_name: profile?.first_name || '', + last_name: profile?.last_name || '', + }; + }); +}