fix: Mandantenverwaltung LDAP-Status und Nutzer-Listing
- tenantstore.List(): LEFT JOIN tenant_ldap hinzugefügt — ldap_enabled + ldap_url
werden jetzt im GET /api/tenants Response mitgeliefert
- Tenant-Struct: Felder LDAPEnabled *bool + LDAPURL string ergänzt
- Neuer Endpunkt GET /api/tenants/{id}/users → listet Nutzer eines Mandanten
- api.ts: getTenantUsers() Funktion + tenant_id Feld im User Interface
- Admin-Panel: "Nutzer"-Button im Mandanten-Tab öffnet Dialog mit Nutzerliste
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -24,6 +24,7 @@ import {
|
||||
deleteLDAPConfig,
|
||||
testLDAPConfig,
|
||||
getTenants,
|
||||
getTenantUsers,
|
||||
createTenant,
|
||||
updateTenant,
|
||||
deleteTenant,
|
||||
@@ -238,6 +239,12 @@ export default function AdminPage() {
|
||||
// Superadmin: tenant LDAP dialog
|
||||
const [tenantLdapDialogId, setTenantLdapDialogId] = useState<number | null>(null);
|
||||
|
||||
// Tenant users dialog
|
||||
const [tenantUsersDialogId, setTenantUsersDialogId] = useState<number | null>(null);
|
||||
const [tenantUsersDialogName, setTenantUsersDialogName] = useState("");
|
||||
const [tenantUsers, setTenantUsers] = useState<User[]>([]);
|
||||
const [tenantUsersLoading, setTenantUsersLoading] = useState(false);
|
||||
|
||||
// Labels state
|
||||
const [adminLabels, setAdminLabels] = useState<MailLabel[]>([]);
|
||||
const [adminLabelsLoading, setAdminLabelsLoading] = useState(false);
|
||||
@@ -747,6 +754,18 @@ export default function AdminPage() {
|
||||
finally { setDomainsLoading(false); }
|
||||
}
|
||||
|
||||
async function openUsersDialog(t: Tenant) {
|
||||
setTenantUsersDialogId(t.id);
|
||||
setTenantUsersDialogName(t.name);
|
||||
setTenantUsersLoading(true);
|
||||
setTenantUsers([]);
|
||||
try {
|
||||
const users = await getTenantUsers(t.id);
|
||||
setTenantUsers(users || []);
|
||||
} catch { /* ignore */ }
|
||||
finally { setTenantUsersLoading(false); }
|
||||
}
|
||||
|
||||
async function handleAddDomain() {
|
||||
if (!domainDialogTenant || !newDomain) return;
|
||||
setAddDomainLoading(true);
|
||||
@@ -2477,6 +2496,9 @@ export default function AdminPage() {
|
||||
<Button size="sm" variant="outline" onClick={() => openDomainDialog(t)}>
|
||||
Domains
|
||||
</Button>
|
||||
<Button size="sm" variant="outline" onClick={() => openUsersDialog(t)}>
|
||||
Nutzer
|
||||
</Button>
|
||||
<Button size="sm" variant="outline" onClick={() => setTenantLdapDialogId(t.id)}>
|
||||
LDAP
|
||||
</Button>
|
||||
@@ -2564,6 +2586,46 @@ export default function AdminPage() {
|
||||
</DialogContent>
|
||||
</Dialog>
|
||||
|
||||
{/* Tenant users dialog */}
|
||||
<Dialog open={tenantUsersDialogId !== null} onOpenChange={(open) => { if (!open) setTenantUsersDialogId(null); }}>
|
||||
<DialogContent>
|
||||
<DialogHeader>
|
||||
<DialogTitle>Nutzer: {tenantUsersDialogName}</DialogTitle>
|
||||
<DialogDescription>Dem Mandanten zugewiesene Benutzerkonten.</DialogDescription>
|
||||
</DialogHeader>
|
||||
{tenantUsersLoading ? (
|
||||
<Skeleton className="h-24 w-full" />
|
||||
) : tenantUsers.length === 0 ? (
|
||||
<p className="text-sm text-muted-foreground py-4 text-center">Keine Benutzer diesem Mandanten zugewiesen.</p>
|
||||
) : (
|
||||
<Table>
|
||||
<TableHeader>
|
||||
<TableRow>
|
||||
<TableHead>Benutzername</TableHead>
|
||||
<TableHead>E-Mail</TableHead>
|
||||
<TableHead>Rolle</TableHead>
|
||||
<TableHead>Status</TableHead>
|
||||
</TableRow>
|
||||
</TableHeader>
|
||||
<TableBody>
|
||||
{tenantUsers.map((u) => (
|
||||
<TableRow key={u.id}>
|
||||
<TableCell className="font-medium">{u.username}</TableCell>
|
||||
<TableCell className="text-sm text-muted-foreground">{u.email}</TableCell>
|
||||
<TableCell><Badge variant="outline">{u.role}</Badge></TableCell>
|
||||
<TableCell>
|
||||
<Badge variant={u.active ? "default" : "secondary"}>
|
||||
{u.active ? "Aktiv" : "Inaktiv"}
|
||||
</Badge>
|
||||
</TableCell>
|
||||
</TableRow>
|
||||
))}
|
||||
</TableBody>
|
||||
</Table>
|
||||
)}
|
||||
</DialogContent>
|
||||
</Dialog>
|
||||
|
||||
{/* Tenant LDAP dialog (superadmin) */}
|
||||
{tenantLdapDialogId !== null && (
|
||||
<TenantLDAPDialog
|
||||
|
||||
Reference in New Issue
Block a user