feat: WebSocket temps réel + Finance Workflow + corrections
- Task #6: WebSocket /ws/dashboard + Kafka events (5 topics) * Backend: KafkaEventProducer, KafkaEventConsumer * Mobile: WebSocketService (reconnection, heartbeat, typed events) * DashboardBloc: Auto-refresh depuis WebSocket events - Finance Workflow: approbations + budgets (backend + mobile) * Backend: entities, services, resources, migrations Flyway V6 * Mobile: features finance_workflow complète avec BLoC - Corrections DI: interfaces IRepository partout * IProfileRepository, IOrganizationRepository, IMembreRepository * GetIt configuré avec @injectable - Spec-Kit: constitution + templates mis à jour * .specify/memory/constitution.md enrichie * Templates agent, plan, spec, tasks, checklist - Nettoyage: fichiers temporaires supprimés Signed-off-by: lions dev Team
This commit is contained in:
@@ -1,8 +1,10 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:url_launcher/url_launcher.dart';
|
||||
import '../../../../shared/design_system/unionflow_design_system.dart';
|
||||
import '../../../../features/authentication/presentation/bloc/auth_bloc.dart';
|
||||
import '../../../../features/authentication/data/models/user_role.dart';
|
||||
import '../../../adhesions/presentation/pages/adhesions_page_wrapper.dart';
|
||||
|
||||
/// Page de gestion des membres - Interface sophistiquée et exhaustive
|
||||
///
|
||||
@@ -1131,12 +1133,23 @@ class _MembersPageState extends State<MembersPage> with TickerProviderStateMixin
|
||||
context: context,
|
||||
builder: (context) => AlertDialog(
|
||||
title: const Text('Ajouter un membre'),
|
||||
content: const Text('Fonctionnalité d\'ajout de membre à implémenter'),
|
||||
content: const Text(
|
||||
'Pour enregistrer un nouveau membre, créez une adhésion depuis le module Adhésions.',
|
||||
),
|
||||
actions: [
|
||||
TextButton(
|
||||
onPressed: () => Navigator.of(context).pop(),
|
||||
child: const Text('Fermer'),
|
||||
),
|
||||
ElevatedButton(
|
||||
onPressed: () {
|
||||
Navigator.of(context).pop();
|
||||
Navigator.of(context).push(
|
||||
MaterialPageRoute<void>(builder: (_) => const AdhesionsPageWrapper()),
|
||||
);
|
||||
},
|
||||
child: const Text('Créer une adhésion'),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
@@ -1144,10 +1157,35 @@ class _MembersPageState extends State<MembersPage> with TickerProviderStateMixin
|
||||
|
||||
/// Affiche les actions groupées
|
||||
void _showBulkActions() {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
const SnackBar(
|
||||
content: Text('Actions groupées à implémenter'),
|
||||
backgroundColor: Color(0xFF6C5CE7),
|
||||
showModalBottomSheet<void>(
|
||||
context: context,
|
||||
builder: (context) => SafeArea(
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
ListTile(
|
||||
leading: const Icon(Icons.file_download_outlined),
|
||||
title: const Text('Exporter la sélection'),
|
||||
onTap: () {
|
||||
Navigator.pop(context);
|
||||
_exportMembers();
|
||||
},
|
||||
),
|
||||
ListTile(
|
||||
leading: const Icon(Icons.email_outlined),
|
||||
title: const Text('Envoyer un message groupé'),
|
||||
onTap: () {
|
||||
Navigator.pop(context);
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
const SnackBar(
|
||||
content: Text('Messagerie groupée à venir. Utilisez l\'action « Message » sur un membre.'),
|
||||
backgroundColor: Color(0xFF6C5CE7),
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
@@ -1190,25 +1228,10 @@ class _MembersPageState extends State<MembersPage> with TickerProviderStateMixin
|
||||
}
|
||||
}
|
||||
|
||||
/// Dialog d'édition de membre
|
||||
/// Dialog d'édition de membre : ouvre la fiche détail (édition complète à venir)
|
||||
void _showEditMemberDialog(Map<String, dynamic> member) {
|
||||
showDialog(
|
||||
context: context,
|
||||
builder: (context) => AlertDialog(
|
||||
title: Text('Modifier ${member['name']}'),
|
||||
content: const Text('Fonctionnalité de modification à implémenter'),
|
||||
actions: [
|
||||
TextButton(
|
||||
onPressed: () => Navigator.of(context).pop(),
|
||||
child: const Text('Annuler'),
|
||||
),
|
||||
ElevatedButton(
|
||||
onPressed: () => Navigator.of(context).pop(),
|
||||
child: const Text('Sauvegarder'),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
Navigator.of(context).pop(); // ferme le dialog éventuel
|
||||
_showMemberDetails(member);
|
||||
}
|
||||
|
||||
/// Envoie un message à un membre
|
||||
|
||||
Reference in New Issue
Block a user