/** * PermissionMatrix * * User × Role matrix with inline toggles and edit/remove actions. */ import React, { useState } from 'react'; import { FaEdit, FaTrash } from 'react-icons/fa'; import type { FeatureAccessUser } from '../../hooks/useFeatureAccess'; import type { FeatureInstanceRole } from '../../hooks/useFeatureAccess'; import styles from './Admin.module.css'; import matrixStyles from './PermissionMatrix.module.css'; export interface PermissionMatrixProps { users: FeatureAccessUser[]; roles: FeatureInstanceRole[]; onEditUser: (user: FeatureAccessUser) => void; onRemoveUser: (user: FeatureAccessUser) => void; onAddUser: () => void; disabled?: boolean; } export const PermissionMatrix: React.FC = ({ users, roles, onEditUser, onRemoveUser, onAddUser, disabled = false, }) => { const [removingId, setRemovingId] = useState(null); const handleRemove = (user: FeatureAccessUser) => { if (removingId) return; if (window.confirm(`"${user.username}" aus dieser Instanz entfernen?`)) { setRemovingId(user.userId); onRemoveUser(user); setRemovingId(null); } }; if (roles.length === 0) { return (

Keine Rollen in dieser Instanz. Bitte zuerst Rollen synchronisieren.

); } return (
{roles.map((r) => ( ))} {users.length === 0 ? ( ) : ( users.map((user) => ( {roles.map((role) => { const hasRole = user.roleIds?.includes(role.id) ?? false; return ( ); })} )) )}
Benutzer {r.roleLabel} Aktiv Aktionen
Keine Benutzer zugewiesen.
{user.username} {user.email && ( {user.email} )} {hasRole ? '✓' : '—'} {user.enabled ? '✓' : '—'}
); }; export default PermissionMatrix;