// AssignUsersModal - Modal for managing user assignments to a project function AssignUsersModal({ project, users, onClose, onSuccess }) { const [assignments, setAssignments] = React.useState([]); const [loading, setLoading] = React.useState(true); const [selectedUser, setSelectedUser] = React.useState(''); const [assigning, setAssigning] = React.useState(false); const [refreshKey, setRefreshKey] = React.useState(0); const [confirmRemove, setConfirmRemove] = React.useState(null); // { userId, userName } const toast = useToast(); const loadAssignments = React.useCallback(async () => { setLoading(true); // Clear existing data first to force visual update setAssignments([]); // Small delay to ensure backend has committed changes await new Promise(resolve => setTimeout(resolve, 100)); try { const data = await ApiUtils.getProjectAssignments(project.id); // Force new array reference with deep copy for React to detect changes setAssignments(data.map(a => ({ ...a, _key: Date.now() }))); setRefreshKey(Date.now()); } catch (err) { toast('Errore nel caricamento assegnazioni: ' + err.message, 'error'); } finally { setLoading(false); } }, [project.id, toast]); React.useEffect(() => { loadAssignments(); }, [loadAssignments]); const handleAssign = async () => { if (!selectedUser) return; setAssigning(true); try { await ApiUtils.assignUserToProject(project.id, { user_id: selectedUser, }); toast('Utente assegnato con successo', 'success'); setSelectedUser(''); await loadAssignments(); onSuccess(); } catch (err) { toast('Errore nell\'assegnazione: ' + err.message, 'error'); } finally { setAssigning(false); } }; const handleRemove = (userId, userName) => { setConfirmRemove({ userId, userName }); }; const executeRemove = async () => { if (!confirmRemove) return; try { await ApiUtils.removeUserFromProject(project.id, confirmRemove.userId); toast('Utente rimosso dalla pratica', 'success'); setConfirmRemove(null); await loadAssignments(); onSuccess(); } catch (err) { toast('Errore nella rimozione: ' + err.message, 'error'); setConfirmRemove(null); } }; const assignedUserIds = assignments.map(a => a.user_id); const availableUsers = users.filter(u => !assignedUserIds.includes(u.id)); return (

Gestisci Assegnazioni

{project.name}

{/* Add User Section */}

Aggiungi Utente

{selectedUser && ( )}
{/* Current Assignments */}

Utenti Assegnati ({assignments.length})

{loading ? (
) : assignments.length === 0 ? (

Nessun utente assegnato a questa pratica

) : (
{assignments.map(assignment => { const avatarUrl = assignment.user_avatar ? window.ApiUsers?.getAvatarUrl(assignment.user_avatar) : null; return (
{avatarUrl ? ( {assignment.user_name} ) : (
{assignment.user_name?.charAt(0).toUpperCase() || '?'}
)}
{assignment.user_name || 'Utente'}
{assignment.user_email}
); })}
)}
{/* Confirmation Modal */} {confirmRemove && ( setConfirmRemove(null)} /> )}
); } window.AssignUsersModal = AssignUsersModal;