feat(#96): différencier la consultation admin et le mode édition
Affiche une identité visuelle dédiée pour les super admins et adapte l’action par ligne (oeil en lecture seule, crayon en édition) avec modale strictement read-only quand l’utilisateur n’a pas les droits. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:p_tits_pas/models/user.dart';
|
||||
import 'package:p_tits_pas/screens/administrateurs/creation/gestionnaires_create.dart';
|
||||
import 'package:p_tits_pas/services/auth_service.dart';
|
||||
import 'package:p_tits_pas/services/user_service.dart';
|
||||
import 'package:p_tits_pas/widgets/admin/common/admin_user_card.dart';
|
||||
import 'package:p_tits_pas/widgets/admin/common/user_list.dart';
|
||||
@@ -21,10 +22,12 @@ class _AdminManagementWidgetState extends State<AdminManagementWidget> {
|
||||
bool _isLoading = false;
|
||||
String? _error;
|
||||
List<AppUser> _admins = [];
|
||||
String? _currentUserRole;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_loadCurrentUserRole();
|
||||
_loadAdmins();
|
||||
}
|
||||
|
||||
@@ -52,7 +55,31 @@ class _AdminManagementWidgetState extends State<AdminManagementWidget> {
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _loadCurrentUserRole() async {
|
||||
final cached = await AuthService.getCurrentUser();
|
||||
if (!mounted) return;
|
||||
if (cached != null) {
|
||||
setState(() {
|
||||
_currentUserRole = cached.role.toLowerCase();
|
||||
});
|
||||
return;
|
||||
}
|
||||
final refreshed = await AuthService.refreshCurrentUser();
|
||||
if (!mounted || refreshed == null) return;
|
||||
setState(() {
|
||||
_currentUserRole = refreshed.role.toLowerCase();
|
||||
});
|
||||
}
|
||||
|
||||
bool _isSuperAdmin(AppUser user) => user.role.toLowerCase() == 'super_admin';
|
||||
|
||||
bool _canEditAdmin(AppUser target) {
|
||||
if (!_isSuperAdmin(target)) return true;
|
||||
return _currentUserRole == 'super_admin';
|
||||
}
|
||||
|
||||
Future<void> _openAdminEditDialog(AppUser user) async {
|
||||
final canEdit = _canEditAdmin(user);
|
||||
final changed = await showDialog<bool>(
|
||||
context: context,
|
||||
barrierDismissible: false,
|
||||
@@ -61,10 +88,11 @@ class _AdminManagementWidgetState extends State<AdminManagementWidget> {
|
||||
initialUser: user,
|
||||
adminMode: true,
|
||||
withRelais: false,
|
||||
readOnly: !canEdit,
|
||||
);
|
||||
},
|
||||
);
|
||||
if (changed == true) {
|
||||
if (changed == true && canEdit) {
|
||||
await _loadAdmins();
|
||||
}
|
||||
}
|
||||
@@ -86,6 +114,8 @@ class _AdminManagementWidgetState extends State<AdminManagementWidget> {
|
||||
itemCount: filteredAdmins.length,
|
||||
itemBuilder: (context, index) {
|
||||
final user = filteredAdmins[index];
|
||||
final isSuperAdmin = _isSuperAdmin(user);
|
||||
final canEdit = _canEditAdmin(user);
|
||||
return AdminUserCard(
|
||||
title: user.fullName,
|
||||
subtitleLines: [
|
||||
@@ -93,10 +123,22 @@ class _AdminManagementWidgetState extends State<AdminManagementWidget> {
|
||||
'Rôle : ${user.role}',
|
||||
],
|
||||
avatarUrl: user.photoUrl,
|
||||
borderColor: isSuperAdmin
|
||||
? const Color(0xFF8E6AC8)
|
||||
: Colors.grey.shade300,
|
||||
backgroundColor: isSuperAdmin
|
||||
? const Color(0xFFF4EEFF)
|
||||
: Colors.white,
|
||||
titleColor: isSuperAdmin ? const Color(0xFF5D2F99) : null,
|
||||
infoColor: isSuperAdmin
|
||||
? const Color(0xFF6D4EA1)
|
||||
: Colors.black54,
|
||||
actions: [
|
||||
IconButton(
|
||||
icon: const Icon(Icons.edit),
|
||||
tooltip: 'Modifier',
|
||||
icon: Icon(
|
||||
canEdit ? Icons.edit_outlined : Icons.visibility_outlined,
|
||||
),
|
||||
tooltip: canEdit ? 'Modifier' : 'Consulter',
|
||||
onPressed: () {
|
||||
_openAdminEditDialog(user);
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user