feat(members): swipe par rôle + suppression SuperAdmin avec cascade UX
Swipe actions différenciées par rôle : - SuperAdmin : → Reset MDP, ← Affecter Org - OrgAdmin : → Reset MDP, ← lifecycle selon statut (Suspendre/Activer/Réactiver) (masqué si cible = ORGADMIN/SUPERADMIN — cohérent avec guard backend) - Autres rôles : → Reset MDP seulement Suppression compte (SuperAdmin uniquement) : - Nouveau callback onDeleteAccount dans MembersPage + MemberDetailPage - Bouton rouge 'Supprimer ce compte' dans action sheet (zone destructive) - Dialog de confirmation adaptatif dark/light avec badge admin si cible ORGADMIN - Bouton caché si compte déjà désactivé (actif=false) - Bannière 'Compte désactivé' visible sur page détail d'un compte soft-deleted - BlocListener MembreDeleted : SnackBar + maybePop() + reload liste - Bloc gère 409 Conflict (mono-admin) → MembresActionForbidden avec message backend Nouvelles signatures : - onLifecycleAction : (memberId, organisationId, action, motif) — inclut orgId pour permettre au SuperAdmin d'agir via l'org du membre lui-même - 'actif' et 'roleCode' exposés dans la map via _convertMembreToMap
This commit is contained in:
@@ -248,6 +248,12 @@ class MembresNetworkError extends MembresError {
|
||||
});
|
||||
}
|
||||
|
||||
/// Accès refusé (HTTP 403) sur une action lifecycle (radier, suspendre, archiver).
|
||||
/// Distinct de MembresNetworkError pour permettre un message utilisateur ciblé.
|
||||
class MembresActionForbidden extends MembresError {
|
||||
const MembresActionForbidden({required super.message, super.code = '403', super.error});
|
||||
}
|
||||
|
||||
/// État d'erreur de validation
|
||||
class MembresValidationError extends MembresError {
|
||||
final Map<String, String> validationErrors;
|
||||
|
||||
Reference in New Issue
Block a user