// ECO-PANNEAU.FR - _react/clients/_clients_settings_team.jsx const { useState } = React; window.pano_ClientSettingsTeam = ({ data, showToast, refreshData, openLocalDialog, closeCurrentLayer, activeDialog, onClose }) => { // ZÉRO-DETTE : Utilisation de notre Hook abstrait ! const { isMounted, safeFetch } = window.pano_useSafeFetch(); const [isSaving, setIsSaving] = useState(false); const [confirmConfig, setConfirmConfig] = useState(null); // 1. - Composants et Icônes const { UsersIcon, Trash2Icon } = window.pano_getIcons(); const { Button, ConfirmModal, CardGrid, DataCard, Modal } = window.pano_getComponents(); const teamHistory = data.team || []; // 2. - Actions métier const handleRemoveGlobalCollaborator = (targetEmail) => { setConfirmConfig({ title: "Supprimer le contact", message: "Voulez-vous supprimer définitivement ce contact de votre carnet d'adresses et de votre historique ?", confirmText: "Supprimer", cancelText: "Annuler", isDestructive: true, onConfirm: async () => { // ZÉRO-DETTE : Dépilement propre via le retour arrière de l'historique closeCurrentLayer(); const d = await safeFetch('clients/team/remove', { body: { email: targetEmail }, setLoading: setIsSaving, successMessage: "Contact supprimé de l'historique." }); if (!isMounted.current) return; // SÉCURITÉ : Coupe-circuit if (d && refreshData) refreshData(); } }); openLocalDialog('confirm_team'); }; // 3. - Rendu UI return ( ( )} >
Cet onglet liste l'intégralité des collaborateurs passés ou présents sur tous vos panneaux. La gestion des accès actifs s'effectue individuellement pour chaque panneau depuis l'onglet "Mes panneaux" (bouton "Équipe").

Contacts enregistrés

{window.pano_formatPlural(teamHistory.length, 'contact', 'contacts')}
{teamHistory.length === 0 ? (
{UsersIcon && }

Aucun collaborateur dans votre historique.

Invitez des collaborateurs depuis la gestion de vos panneaux.

) : ( {/* CORRECTION SÉCURITÉ REACT : Deep Copy + Vérification des undefined pour empêcher le crash localeCompare */} {[...teamHistory].sort((a,b) => (a.company || '').localeCompare(b.company || '')).map((member, i) => (
Société / Contact

{member.company}

{member.name}

Panneaux {member.active_panels > 0 ? ( {window.pano_formatPlural(member.active_panels, 'Actif', 'Actifs')} ) : ( Aucun )}
E-mail {member.email}
))}
)}
{/* Sécurité anti boucle infinie sur l'annulation */} {activeDialog === 'confirm_team' && confirmConfig && ConfirmModal && ( { setConfirmConfig(null); closeCurrentLayer(); }} /> )}
); }; /* EOF ========== [_react/clients/_clients_settings_team.jsx] */