diff --git a/frontend/lib/widgets/admin/admin_management_widget.dart b/frontend/lib/widgets/admin/admin_management_widget.dart index 14ef51c..6a69695 100644 --- a/frontend/lib/widgets/admin/admin_management_widget.dart +++ b/frontend/lib/widgets/admin/admin_management_widget.dart @@ -89,13 +89,6 @@ class _AdminManagementWidgetState extends State { // TODO: Modifier admin }, ), - IconButton( - icon: const Icon(Icons.delete), - tooltip: 'Supprimer', - onPressed: () { - // TODO: Supprimer admin - }, - ), ], ); }, diff --git a/frontend/lib/widgets/admin/common/admin_user_card.dart b/frontend/lib/widgets/admin/common/admin_user_card.dart index 8745d4c..914e218 100644 --- a/frontend/lib/widgets/admin/common/admin_user_card.dart +++ b/frontend/lib/widgets/admin/common/admin_user_card.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -class AdminUserCard extends StatelessWidget { +class AdminUserCard extends StatefulWidget { final String title; final List subtitleLines; final String? avatarUrl; @@ -16,75 +16,117 @@ class AdminUserCard extends StatelessWidget { this.actions = const [], }); + @override + State createState() => _AdminUserCardState(); +} + +class _AdminUserCardState extends State { + bool _isHovered = false; + @override Widget build(BuildContext context) { - return Card( - margin: const EdgeInsets.only(bottom: 12), - elevation: 0, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(8), - side: BorderSide(color: Colors.grey.shade300), - ), - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 10), - child: Row( - children: [ - CircleAvatar( - radius: 14, - backgroundColor: const Color(0xFFEDE5FA), - backgroundImage: - avatarUrl != null ? NetworkImage(avatarUrl!) : null, - child: avatarUrl == null - ? Icon( - fallbackIcon, - size: 16, - color: const Color(0xFF6B3FA0), - ) - : null, + final infoLine = + widget.subtitleLines.where((e) => e.trim().isNotEmpty).join(' '); + final actionsWidth = + widget.actions.isNotEmpty ? widget.actions.length * 30.0 : 0.0; + + return MouseRegion( + onEnter: (_) => setState(() => _isHovered = true), + onExit: (_) => setState(() => _isHovered = false), + child: Material( + color: Colors.transparent, + borderRadius: BorderRadius.circular(10), + child: InkWell( + onTap: () {}, + borderRadius: BorderRadius.circular(10), + hoverColor: const Color(0x149CC5C0), + child: Card( + margin: const EdgeInsets.only(bottom: 12), + elevation: 0, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), + side: BorderSide(color: Colors.grey.shade300), ), - const SizedBox(width: 10), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 9), + child: Row( children: [ - Text( - title.isNotEmpty ? title : 'Sans nom', - style: const TextStyle( - fontWeight: FontWeight.w600, - fontSize: 14, + CircleAvatar( + radius: 14, + backgroundColor: const Color(0xFFEDE5FA), + backgroundImage: widget.avatarUrl != null + ? NetworkImage(widget.avatarUrl!) + : null, + child: widget.avatarUrl == null + ? Icon( + widget.fallbackIcon, + size: 16, + color: const Color(0xFF6B3FA0), + ) + : null, + ), + const SizedBox(width: 10), + Expanded( + child: Row( + children: [ + Flexible( + fit: FlexFit.loose, + child: Text( + widget.title.isNotEmpty ? widget.title : 'Sans nom', + style: const TextStyle( + fontWeight: FontWeight.w600, + fontSize: 14, + ), + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ), + const SizedBox(width: 10), + Expanded( + child: Text( + infoLine, + style: const TextStyle( + color: Colors.black54, + fontSize: 12, + ), + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ), + ], ), ), - const SizedBox(height: 2), - ...subtitleLines.map( - (line) => Text( - line, - style: const TextStyle( - color: Colors.black54, - fontSize: 12, + if (widget.actions.isNotEmpty) + SizedBox( + width: actionsWidth, + child: AnimatedOpacity( + duration: const Duration(milliseconds: 120), + opacity: _isHovered ? 1 : 0, + child: IgnorePointer( + ignoring: !_isHovered, + child: IconTheme( + data: const IconThemeData(size: 17), + child: IconButtonTheme( + data: IconButtonThemeData( + style: IconButton.styleFrom( + visualDensity: VisualDensity.compact, + padding: const EdgeInsets.all(4), + minimumSize: const Size(28, 28), + ), + ), + child: Row( + mainAxisSize: MainAxisSize.min, + children: widget.actions, + ), + ), + ), + ), ), ), - ), ], ), ), - if (actions.isNotEmpty) - IconTheme( - data: const IconThemeData(size: 18), - child: IconButtonTheme( - data: IconButtonThemeData( - style: IconButton.styleFrom( - visualDensity: VisualDensity.compact, - padding: const EdgeInsets.all(4), - minimumSize: const Size(28, 28), - ), - ), - child: Row( - mainAxisSize: MainAxisSize.min, - children: actions, - ), - ), - ), - ], + ), ), ), );