/** * AdminUsersPage * * Admin page for managing Users using FormGeneratorTable. */ import React, { useState, useMemo } from 'react'; import { useNavigate } from 'react-router-dom'; import { useOrgUsers, useUserOperations } from '../../hooks/useUsers'; import { FormGeneratorTable } from '../../components/FormGenerator/FormGeneratorTable'; import { FormGeneratorForm } from '../../components/FormGenerator/FormGeneratorForm'; import { FaPlus, FaSync, FaKey, FaEnvelopeOpenText, FaUserShield } from 'react-icons/fa'; import styles from './Admin.module.css'; import { useLanguage } from '../../providers/language/LanguageContext'; interface User { id: string; username: string; email: string; fullName: string; enabled: boolean; isSysAdmin?: boolean; [key: string]: any; } export const AdminUsersPage: React.FC = () => { const { t } = useLanguage(); const navigate = useNavigate(); // Use two hooks: one for data, one for operations const { data: users, attributes, permissions, pagination, loading, error, refetch, fetchUserById, updateOptimistically, } = useOrgUsers(); const { handleUserCreate: createUser, handleUserUpdate: updateUser, handleUserDelete: deleteUser, handleSendPasswordLink, handleInlineUpdate, sendingPasswordLink: sendingPasswordLinkState, } = useUserOperations(); const [showCreateModal, setShowCreateModal] = useState(false); const [editingUser, setEditingUser] = useState(null); // Generate columns from attributes const columns = useMemo(() => { return (attributes || []).map(attr => ({ key: attr.name, label: attr.label || attr.name, type: attr.type as any, sortable: attr.sortable !== false, filterable: attr.filterable !== false, searchable: attr.searchable !== false, width: attr.width || 150, minWidth: attr.minWidth || 100, maxWidth: attr.maxWidth || 400, fkSource: (attr as any).fkSource, fkDisplayField: (attr as any).fkDisplayField, })); }, [attributes]); // Check permissions const canCreate = permissions?.create !== 'n'; const canUpdate = permissions?.update !== 'n'; const canDelete = permissions?.delete !== 'n'; // Handle edit click const handleEditClick = async (user: User) => { const fullUser = await fetchUserById(user.id); if (fullUser) { setEditingUser(fullUser as User); } }; // Handle create submit const handleCreateSubmit = async (data: Partial) => { const result = await createUser(data as Omit); if (result.success) { setShowCreateModal(false); refetch(); // Refresh the list } }; // Handle edit submit const handleEditSubmit = async (data: Partial) => { if (!editingUser) return; const result = await updateUser(editingUser.id, data); if (result.success) { setEditingUser(null); refetch(); // Refresh the list } }; // Handle delete (confirmation handled by DeleteActionButton) const handleDeleteUser = async (user: User) => { const success = await deleteUser(user.id); if (success) { refetch(); // Refresh the list } }; // Handle send password link const handleSendPassword = async (user: User) => { await handleSendPasswordLink(user.id); }; // Form attributes from backend - filter for create/edit forms const formAttributes = useMemo(() => { const excludedFields = ['id', 'hashedPassword', 'authenticationAuthority']; return (attributes || []) .filter(attr => !excludedFields.includes(attr.name)) .map(attr => ({ ...attr, // Mark username as readonly for edit mode (will be handled by FormGeneratorForm) editable: attr.name === 'username' ? false : attr.editable, })); }, [attributes]); if (error) { return (
⚠️

{t('Fehler beim Laden der Benutzer')}: {error}

); } return (

{t('Benutzer')}

{t('Verwalten Sie alle Benutzer im')}

{canCreate && ( )}
, onClick: handleSendPassword, title: t('Passwort-Link senden'), loading: (row: User) => sendingPasswordLinkState.has(row.id), } ] : []} onDelete={handleDeleteUser} hookData={{ refetch, permissions, pagination, handleDelete: deleteUser, handleInlineUpdate, updateOptimistically, }} emptyMessage={t('Keine Benutzer gefunden')} />
{/* Create Modal */} {showCreateModal && (
setShowCreateModal(false)}>
e.stopPropagation()}>

{t('Neuer Benutzer')}

{formAttributes.length === 0 ? (
{t('Lade Formular')}
) : ( setShowCreateModal(false)} submitButtonText={t('Erstellen')} cancelButtonText={t('Abbrechen')} /> )}
)} {/* Edit Modal */} {editingUser && (
setEditingUser(null)}>
e.stopPropagation()}>

{t('Benutzer bearbeiten')}

{formAttributes.length === 0 ? (
{t('Lade Formular')}
) : ( setEditingUser(null)} submitButtonText={t('Speichern')} cancelButtonText={t('Abbrechen')} /> )}
)}
); }; export default AdminUsersPage;