Améliorations UX Annuaire Membres (parité avec Gestion Organisations) :
1. Panneau recherche/filtres toujours visible (plus de toggle collapsible)
→ UX plus directe, pas de clic supplémentaire pour chercher
2. Filtre par rôle (nouveau) : chips Admin, Modérateur, Membre Actif, Membre Simple
avec icône badge devant la rangée, couleur accent différente du statut
3. Bouton Refresh ajouté dans l'AppBar (cohérence avec la page Organisations)
4. Lien 'Réinitialiser les filtres' visible quand au moins un filtre est actif
5. _filteredMembers intègre le filtre rôle via _roleFilterMapping
Supprimé :
- _isSearchExpanded (plus utile — panneau toujours visible)
- Bouton toggle search dans l'AppBar (remplacé par affichage permanent)
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
- NotImplementedFailure: ajout userFriendlyMessage et icon construction (blue)
- ErrorDisplayWidget: support spécial pour NotImplementedFailure (bientôt disponible)
- SnackbarHelper: classe centralisée pour messages cohérents (success, error, warning, info, notImplemented)
- budgets_list_page: remplace generic snackbar par SnackbarHelper.showNotImplemented
- conversations_page: remplace 2 TODOs par SnackbarHelper.showNotImplemented
- export_members: met à jour TODO obsolète (endpoint PDF maintenant disponible)
- cache_service: fix AppLogger.error calls (error: named param)
- cached_datasource_decorator: fix AppLogger.error call
Task #64 - Fix Snackbar Placeholders + NotImplementedFailure UX