import React, { useState } from 'react'; import { createPortal } from 'react-dom'; import clsx from 'clsx'; import { X, Shield, User, Users, Plus, Trash2, Lock, Eye, Pencil, ChevronDown, Calendar, Crown, } from 'lucide-react'; import { useEntityPermissions, useCreateEntityPermission, useUpdateEntityPermission, useDeleteEntityPermission, useEntityAccess, } from '@/api/entityPermissionHooks'; import { useUsers } from '@/api/users'; import { useGroups } from '@/api/groups'; import type { EntityPermission, PermissionLevel } from '@/api/entityPermissions'; interface ShareDialogProps { entityType: string; entityId: string; entityName: string; onClose: () => void; } const PERM_LEVELS: { value: PermissionLevel; label: string; icon: React.ComponentType<{ className?: string; strokeWidth?: number }> | any; desc: string }[] = [ { value: 'read', label: 'Lesen', icon: Eye, desc: 'Inhalt ansehen' }, { value: 'write', label: 'Schreiben', icon: Pencil, desc: 'Inhalt bearbeiten, neue hinzufügen' }, { value: 'admin', label: 'Admin', icon: Shield, desc: 'Bearbeiten + Löschen + Rechte verwalten' }, { value: 'delete', label: 'Löschen', icon: Trash2, desc: 'Vollzugriff inkl. Löschen' }, ]; function permIcon(level: string) { const p = PERM_LEVELS.find((l) => l.value === level); return p ? p.icon : Eye; } function permLabel(level: string) { const p = PERM_LEVELS.find((l) => l.value === level); return p ? p.label : level; } export function ShareDialog({ entityType, entityId, entityName, onClose }: ShareDialogProps) { const { data: permData, isLoading } = useEntityPermissions(entityType, entityId); const { data: accessData } = useEntityAccess(entityType, entityId); const { data: usersData } = useUsers(1, 100); const { data: groupsData } = useGroups(); const createMut = useCreateEntityPermission(); const updateMut = useUpdateEntityPermission(); const deleteMut = useDeleteEntityPermission(); const [showAdd, setShowAdd] = useState(false); const [addType, setAddType] = useState<'user' | 'group'>('user'); const [addPrincipalId, setAddPrincipalId] = useState(''); const [addLevel, setAddLevel] = useState('read'); const [addExpiresAt, setAddExpiresAt] = useState(''); const permissions = permData?.items ?? []; const users = usersData?.items ?? []; const groups = groupsData?.items ?? []; const ownerName = accessData?.owner_name ?? null; const ownerEmail = accessData?.owner_email ?? null; const handleAdd = () => { if (!addPrincipalId) return; createMut.mutate( { entityType, entityId, data: { user_id: addType === 'user' ? addPrincipalId : undefined, group_id: addType === 'group' ? addPrincipalId : undefined, permission_level: addLevel, expires_at: addExpiresAt || null, }, }, { onSuccess: () => { setShowAdd(false); setAddPrincipalId(''); setAddLevel('read'); setAddExpiresAt(''); }, } ); }; const handleUpdate = (perm: EntityPermission, newLevel: string) => { updateMut.mutate({ entityType, entityId, permId: perm.id, data: { permission_level: newLevel as PermissionLevel }, }); }; const handleUpdateExpiry = (perm: EntityPermission, expiresAt: string) => { updateMut.mutate({ entityType, entityId, permId: perm.id, data: { expires_at: expiresAt || null }, }); }; const handleDelete = (perm: EntityPermission) => { if (!confirm(`Berechtigung für ${perm.user_name || perm.group_name || 'diesen Eintrag'} entfernen?`)) return; deleteMut.mutate({ entityType, entityId, permId: perm.id }); }; return createPortal(
e.stopPropagation()} > {/* Header */}

Freigabe: {entityName}

{/* Body */}
{/* Info banner */}

Element teilen

Gewähre Benutzern oder Gruppen Zugriff auf dieses Element. Die Berechtigungsstufe bestimmt, welche Aktionen durchgeführt werden können.

{/* Owner info */} {ownerName && (
Besitzer

{ownerName}{ownerEmail ? ` (${ownerEmail})` : ''}

)} {/* Existing permissions */} {isLoading ? (
Laden…
) : permissions.length === 0 ? (
Noch keine Berechtigungen vergeben. Dieses Element ist nur für den Besitzer sichtbar.
) : (
{permissions.map((perm) => { const Icon = perm.user_id ? User : Users; const name = perm.user_name || perm.group_name || 'Unbekannt'; const email = perm.user_email; const PermIcon = permIcon(perm.permission_level); const isExpired = perm.expires_at ? new Date(perm.expires_at) < new Date() : false; return (
{name} {isExpired && ( (abgelaufen) )}
{email && (
{email}
)} {/* Expiry date */}
handleUpdateExpiry(perm, e.target.value || '')} className="text-xs border border-secondary-200 rounded px-1 py-0.5 bg-transparent focus:outline-none focus:ring-1 focus:ring-primary-500 text-secondary-500" title="Ablaufdatum setzen" />
{/* Permission level selector */}
{/* Delete */}
); })}
)} {/* Add new permission */} {showAdd ? (
Neue Berechtigung
{/* Type toggle */}
{/* Principal select */} {/* Permission level */}
{PERM_LEVELS.map((l) => ( ))}
{/* Expiry date */}
setAddExpiresAt(e.target.value)} className="w-full px-3 py-2 text-sm border border-secondary-200 rounded-md bg-white focus:outline-none focus:ring-2 focus:ring-primary-500" min={new Date().toISOString().split('T')[0]} />
{/* Actions */}
) : ( )}
{/* Footer */}
, document.body ); }