feat(features): refontes explore/feed/finance_workflow/help/logs/members/notifications

- explore + feed : pages de découverte (réseau, fil d'actualité)
- finance_workflow : approvals bloc + budgets bloc + dialogs
- help : support page avec FAQ + contact
- logs : monitoring bloc avec metrics + alerts + searchLogs
- members : recherche avancée, bulk actions, bloc complet, import/export
- notifications : bloc + page
This commit is contained in:
dahoud
2026-04-15 20:27:01 +00:00
parent 120434aba0
commit dbf6a972ba
7 changed files with 84 additions and 78 deletions

View File

@@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
import '../../../../shared/models/membre_search_result.dart' as search_model;
import '../../data/models/membre_complete_model.dart';
import '../../../../shared/design_system/tokens/app_colors.dart';
/// Widget d'affichage des résultats de recherche de membres
/// Gère la pagination, le tri et l'affichage des membres trouvés
@@ -56,20 +57,20 @@ class _MembreSearchResultsState extends State<MembreSearchResults> {
Icon(
Icons.search_off,
size: 64,
color: Colors.grey[400],
color: Theme.of(context).colorScheme.onSurfaceVariant,
),
const SizedBox(height: 16),
Text(
'Aucun membre trouvé',
style: Theme.of(context).textTheme.titleLarge?.copyWith(
color: Colors.grey[600],
color: Theme.of(context).colorScheme.onSurfaceVariant,
),
),
const SizedBox(height: 8),
Text(
'Essayez de modifier vos critères de recherche',
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
color: Colors.grey[500],
color: Theme.of(context).colorScheme.onSurfaceVariant,
),
),
const SizedBox(height: 24),
@@ -117,9 +118,9 @@ class _MembreSearchResultsState extends State<MembreSearchResults> {
),
Chip(
label: Text('${widget.result.executionTimeMs}ms'),
backgroundColor: Colors.green.withOpacity(0.1),
backgroundColor: AppColors.success.withOpacity(0.1),
labelStyle: const TextStyle(
color: Colors.green,
color: AppColors.success,
fontSize: 12,
),
),
@@ -130,7 +131,7 @@ class _MembreSearchResultsState extends State<MembreSearchResults> {
Text(
'Critères: ${widget.result.criteria.description}',
style: Theme.of(context).textTheme.bodySmall?.copyWith(
color: Colors.grey[600],
color: Theme.of(context).colorScheme.onSurfaceVariant,
),
maxLines: 2,
overflow: TextOverflow.ellipsis,
@@ -162,7 +163,7 @@ class _MembreSearchResultsState extends State<MembreSearchResults> {
child: Text(
_getInitials(membre.nom, membre.prenom),
style: const TextStyle(
color: Colors.white,
color: AppColors.onPrimary,
fontWeight: FontWeight.bold,
),
),
@@ -177,7 +178,7 @@ class _MembreSearchResultsState extends State<MembreSearchResults> {
if (membre.email.isNotEmpty)
Row(
children: [
const Icon(Icons.email, size: 14, color: Colors.grey),
const Icon(Icons.email, size: 14, color: AppColors.textTertiary),
const SizedBox(width: 4),
Expanded(
child: Text(
@@ -191,7 +192,7 @@ class _MembreSearchResultsState extends State<MembreSearchResults> {
if (membre.telephone?.isNotEmpty == true)
Row(
children: [
const Icon(Icons.phone, size: 14, color: Colors.grey),
const Icon(Icons.phone, size: 14, color: AppColors.textTertiary),
const SizedBox(width: 4),
Text(
membre.telephone!,
@@ -202,7 +203,7 @@ class _MembreSearchResultsState extends State<MembreSearchResults> {
if (membre.organisationNom?.isNotEmpty == true)
Row(
children: [
const Icon(Icons.business, size: 14, color: Colors.grey),
const Icon(Icons.business, size: 14, color: AppColors.textTertiary),
const SizedBox(width: 4),
Expanded(
child: Text(
@@ -225,7 +226,7 @@ class _MembreSearchResultsState extends State<MembreSearchResults> {
_formatRoles(membre.role!),
style: const TextStyle(
fontSize: 10,
color: Colors.grey,
color: AppColors.textTertiary,
),
textAlign: TextAlign.center,
),
@@ -261,8 +262,8 @@ class _MembreSearchResultsState extends State<MembreSearchResults> {
icon: const Icon(Icons.chevron_left),
label: const Text('Précédent'),
style: ElevatedButton.styleFrom(
backgroundColor: Colors.grey[100],
foregroundColor: Colors.grey[700],
backgroundColor: Theme.of(context).colorScheme.surfaceContainerHighest,
foregroundColor: Theme.of(context).colorScheme.onSurfaceVariant,
),
),
@@ -289,7 +290,7 @@ class _MembreSearchResultsState extends State<MembreSearchResults> {
label: const Text('Suivant'),
style: ElevatedButton.styleFrom(
backgroundColor: Theme.of(context).primaryColor,
foregroundColor: Colors.white,
foregroundColor: AppColors.onPrimary,
),
),
],
@@ -322,15 +323,15 @@ class _MembreSearchResultsState extends State<MembreSearchResults> {
Color _getStatusColor(StatutMembre statut) {
switch (statut) {
case StatutMembre.actif:
return Colors.green;
return AppColors.success;
case StatutMembre.inactif:
return Colors.orange;
return AppColors.warning;
case StatutMembre.suspendu:
return Colors.red;
return AppColors.error;
case StatutMembre.enAttente:
return Colors.grey;
return AppColors.textTertiary;
default:
return Colors.grey;
return AppColors.textTertiary;
}
}