refactor(#93): homogénéiser la présentation des onglets admin
Uniformise les 4 onglets de gestion admin avec des composants UI partagés (header, états de liste, carte utilisateur) pour garantir une expérience cohérente sans changement backend. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -1,6 +1,9 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:p_tits_pas/models/user.dart';
|
||||
import 'package:p_tits_pas/services/user_service.dart';
|
||||
import 'package:p_tits_pas/widgets/admin/common/admin_list_header.dart';
|
||||
import 'package:p_tits_pas/widgets/admin/common/admin_list_state.dart';
|
||||
import 'package:p_tits_pas/widgets/admin/common/admin_user_card.dart';
|
||||
|
||||
class AdminManagementWidget extends StatefulWidget {
|
||||
const AdminManagementWidget({super.key});
|
||||
@@ -69,71 +72,51 @@ class _AdminManagementWidgetState extends State<AdminManagementWidget> {
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||
children: [
|
||||
Row(
|
||||
children: [
|
||||
Expanded(
|
||||
child: TextField(
|
||||
controller: _searchController,
|
||||
decoration: const InputDecoration(
|
||||
hintText: "Rechercher un administrateur...",
|
||||
prefixIcon: Icon(Icons.search),
|
||||
border: OutlineInputBorder(),
|
||||
),
|
||||
),
|
||||
),
|
||||
const SizedBox(width: 16),
|
||||
ElevatedButton.icon(
|
||||
onPressed: () {
|
||||
// TODO: Créer admin
|
||||
},
|
||||
icon: const Icon(Icons.add),
|
||||
label: const Text("Créer un admin"),
|
||||
),
|
||||
],
|
||||
AdminListHeader(
|
||||
searchController: _searchController,
|
||||
searchHint: 'Rechercher un administrateur...',
|
||||
actionLabel: 'Créer un admin',
|
||||
onActionPressed: () {
|
||||
// TODO: Créer admin
|
||||
},
|
||||
),
|
||||
const SizedBox(height: 24),
|
||||
if (_isLoading)
|
||||
const Center(child: CircularProgressIndicator())
|
||||
else if (_error != null)
|
||||
Center(child: Text('Erreur: $_error', style: const TextStyle(color: Colors.red)))
|
||||
else if (_filteredAdmins.isEmpty)
|
||||
const Center(child: Text("Aucun administrateur trouvé."))
|
||||
else
|
||||
Expanded(
|
||||
child: ListView.builder(
|
||||
itemCount: _filteredAdmins.length,
|
||||
itemBuilder: (context, index) {
|
||||
final user = _filteredAdmins[index];
|
||||
return Card(
|
||||
margin: const EdgeInsets.only(bottom: 12),
|
||||
child: ListTile(
|
||||
leading: CircleAvatar(
|
||||
child: Text(user.fullName.isNotEmpty
|
||||
? user.fullName[0].toUpperCase()
|
||||
: 'A'),
|
||||
),
|
||||
title: Text(user.fullName.isNotEmpty
|
||||
? user.fullName
|
||||
: 'Sans nom'),
|
||||
subtitle: Text(user.email),
|
||||
trailing: Row(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
IconButton(
|
||||
icon: const Icon(Icons.edit),
|
||||
onPressed: () {},
|
||||
),
|
||||
IconButton(
|
||||
icon: const Icon(Icons.delete),
|
||||
onPressed: () {},
|
||||
),
|
||||
],
|
||||
),
|
||||
const SizedBox(height: 16),
|
||||
AdminListState(
|
||||
isLoading: _isLoading,
|
||||
error: _error,
|
||||
isEmpty: _filteredAdmins.isEmpty,
|
||||
emptyMessage: 'Aucun administrateur trouvé.',
|
||||
list: ListView.builder(
|
||||
itemCount: _filteredAdmins.length,
|
||||
itemBuilder: (context, index) {
|
||||
final user = _filteredAdmins[index];
|
||||
return AdminUserCard(
|
||||
title: user.fullName,
|
||||
subtitleLines: [
|
||||
user.email,
|
||||
'Rôle : ${user.role}',
|
||||
],
|
||||
avatarUrl: user.photoUrl,
|
||||
actions: [
|
||||
IconButton(
|
||||
icon: const Icon(Icons.edit),
|
||||
tooltip: 'Modifier',
|
||||
onPressed: () {
|
||||
// TODO: Modifier admin
|
||||
},
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
)
|
||||
IconButton(
|
||||
icon: const Icon(Icons.delete),
|
||||
tooltip: 'Supprimer',
|
||||
onPressed: () {
|
||||
// TODO: Supprimer admin
|
||||
},
|
||||
),
|
||||
],
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user