feat(features): refontes onboarding/organizations/profile/reports/settings/solidarity

- onboarding : datasource souscription, models formule/status, bloc complet
- organizations : bloc orgs + switcher + types bloc, models, pages edit/create
- profile : bloc complet avec change password, delete account, preferences
- reports : bloc avec DashboardReports + ScheduleReports + GenerateReport
- settings : language, privacy, feedback pages
- solidarity : bloc complet demandes d'aide (CRUD, approuver, rejeter)
This commit is contained in:
dahoud
2026-04-15 20:27:12 +00:00
parent dbf6a972ba
commit 744faa3a9c
17 changed files with 711 additions and 403 deletions

View File

@@ -38,6 +38,20 @@ class SystemSettingsBloc extends Bloc<SystemSettingsEvent, SystemSettingsState>
on<TestDatabaseConnection>(_onTestDatabaseConnection);
on<TestEmailConfiguration>(_onTestEmailConfiguration);
on<ResetSystemConfig>(_onResetSystemConfig);
on<OptimizeDatabase>(_onOptimizeDatabase);
on<ForceGlobalLogout>(_onForceGlobalLogout);
on<CleanupSessions>(_onCleanupSessions);
on<CleanOldLogs>(_onCleanOldLogs);
on<PurgeExpiredData>(_onPurgeExpiredData);
on<AnalyzePerformance>(_onAnalyzePerformance);
on<CreateBackup>(_onCreateBackup);
on<ScheduleMaintenance>(_onScheduleMaintenance);
on<EmergencyMaintenance>(_onEmergencyMaintenance);
on<CheckUpdates>(_onCheckUpdates);
on<ExportLogs>(_onExportLogs);
on<GenerateUsageReport>(_onGenerateUsageReport);
on<GenerateAuditReport>(_onGenerateAuditReport);
on<ExportGDPRData>(_onExportGDPRData);
}
Future<void> _onLoadSystemConfig(
@@ -165,4 +179,159 @@ class SystemSettingsBloc extends Bloc<SystemSettingsEvent, SystemSettingsState>
emit(SystemSettingsError('Erreur de réinitialisation: ${e.toString()}'));
}
}
Future<void> _onOptimizeDatabase(OptimizeDatabase event, Emitter<SystemSettingsState> emit) async {
emit(SystemSettingsLoading());
try {
final result = await _repository.optimizeDatabase();
emit(SystemSettingsSuccess(result['message'] as String? ?? 'Base de données optimisée'));
} catch (e) {
if (e is DioException && e.type == DioExceptionType.cancel) return;
emit(SystemSettingsError('Erreur: ${e.toString()}'));
}
}
Future<void> _onForceGlobalLogout(ForceGlobalLogout event, Emitter<SystemSettingsState> emit) async {
emit(SystemSettingsLoading());
try {
final result = await _repository.forceGlobalLogout();
emit(SystemSettingsSuccess(result['message'] as String? ?? 'Déconnexion globale déclenchée'));
} catch (e) {
if (e is DioException && e.type == DioExceptionType.cancel) return;
emit(SystemSettingsError('Erreur: ${e.toString()}'));
}
}
Future<void> _onCleanupSessions(CleanupSessions event, Emitter<SystemSettingsState> emit) async {
emit(SystemSettingsLoading());
try {
final result = await _repository.cleanupSessions();
emit(SystemSettingsSuccess(result['message'] as String? ?? 'Sessions nettoyées'));
} catch (e) {
if (e is DioException && e.type == DioExceptionType.cancel) return;
emit(SystemSettingsError('Erreur: ${e.toString()}'));
}
}
Future<void> _onCleanOldLogs(CleanOldLogs event, Emitter<SystemSettingsState> emit) async {
emit(SystemSettingsLoading());
try {
final result = await _repository.cleanOldLogs();
emit(SystemSettingsSuccess(result['message'] as String? ?? 'Logs nettoyés'));
} catch (e) {
if (e is DioException && e.type == DioExceptionType.cancel) return;
emit(SystemSettingsError('Erreur: ${e.toString()}'));
}
}
Future<void> _onPurgeExpiredData(PurgeExpiredData event, Emitter<SystemSettingsState> emit) async {
emit(SystemSettingsLoading());
try {
final result = await _repository.purgeExpiredData();
emit(SystemSettingsSuccess(result['message'] as String? ?? 'Données purgées'));
} catch (e) {
if (e is DioException && e.type == DioExceptionType.cancel) return;
emit(SystemSettingsError('Erreur: ${e.toString()}'));
}
}
Future<void> _onAnalyzePerformance(AnalyzePerformance event, Emitter<SystemSettingsState> emit) async {
emit(SystemSettingsLoading());
try {
final result = await _repository.analyzePerformance();
emit(SystemSettingsSuccess(result['message'] as String? ?? 'Analyse terminée'));
} catch (e) {
if (e is DioException && e.type == DioExceptionType.cancel) return;
emit(SystemSettingsError('Erreur: ${e.toString()}'));
}
}
Future<void> _onCreateBackup(CreateBackup event, Emitter<SystemSettingsState> emit) async {
emit(SystemSettingsLoading());
try {
final result = await _repository.createBackup();
emit(SystemSettingsSuccess(result['message'] as String? ?? 'Sauvegarde créée'));
} catch (e) {
if (e is DioException && e.type == DioExceptionType.cancel) return;
emit(SystemSettingsError('Erreur: ${e.toString()}'));
}
}
Future<void> _onScheduleMaintenance(ScheduleMaintenance event, Emitter<SystemSettingsState> emit) async {
emit(SystemSettingsLoading());
try {
final result = await _repository.scheduleMaintenance(scheduledAt: event.scheduledAt, reason: event.reason);
emit(SystemSettingsSuccess(result['message'] as String? ?? 'Maintenance planifiée'));
} catch (e) {
if (e is DioException && e.type == DioExceptionType.cancel) return;
emit(SystemSettingsError('Erreur: ${e.toString()}'));
}
}
Future<void> _onEmergencyMaintenance(EmergencyMaintenance event, Emitter<SystemSettingsState> emit) async {
emit(SystemSettingsLoading());
try {
final result = await _repository.emergencyMaintenance();
emit(SystemSettingsSuccess(result['message'] as String? ?? 'Maintenance d\'urgence activée'));
} catch (e) {
if (e is DioException && e.type == DioExceptionType.cancel) return;
emit(SystemSettingsError('Erreur: ${e.toString()}'));
}
}
Future<void> _onCheckUpdates(CheckUpdates event, Emitter<SystemSettingsState> emit) async {
emit(SystemSettingsLoading());
try {
final result = await _repository.checkUpdates();
emit(SystemSettingsSuccess(result['message'] as String? ?? 'Vérification terminée'));
} catch (e) {
if (e is DioException && e.type == DioExceptionType.cancel) return;
emit(SystemSettingsError('Erreur: ${e.toString()}'));
}
}
Future<void> _onExportLogs(ExportLogs event, Emitter<SystemSettingsState> emit) async {
emit(SystemSettingsLoading());
try {
final result = await _repository.exportLogs();
final count = result['count'] as int? ?? 0;
emit(SystemSettingsSuccess('$count log(s) exporté(s)'));
} catch (e) {
if (e is DioException && e.type == DioExceptionType.cancel) return;
emit(SystemSettingsError('Erreur: ${e.toString()}'));
}
}
Future<void> _onGenerateUsageReport(GenerateUsageReport event, Emitter<SystemSettingsState> emit) async {
emit(SystemSettingsLoading());
try {
final result = await _repository.generateUsageReport();
emit(SystemSettingsSuccess(result['message'] as String? ?? 'Rapport généré'));
} catch (e) {
if (e is DioException && e.type == DioExceptionType.cancel) return;
emit(SystemSettingsError('Erreur: ${e.toString()}'));
}
}
Future<void> _onGenerateAuditReport(GenerateAuditReport event, Emitter<SystemSettingsState> emit) async {
emit(SystemSettingsLoading());
try {
final result = await _repository.generateAuditReport();
emit(SystemSettingsSuccess(result['message'] as String? ?? 'Rapport d\'audit généré'));
} catch (e) {
if (e is DioException && e.type == DioExceptionType.cancel) return;
emit(SystemSettingsError('Erreur: ${e.toString()}'));
}
}
Future<void> _onExportGDPRData(ExportGDPRData event, Emitter<SystemSettingsState> emit) async {
emit(SystemSettingsLoading());
try {
final result = await _repository.exportGDPRData();
emit(SystemSettingsSuccess(result['message'] as String? ?? 'Export RGPD initié'));
} catch (e) {
if (e is DioException && e.type == DioExceptionType.cancel) return;
emit(SystemSettingsError('Erreur: ${e.toString()}'));
}
}
}

View File

@@ -10,25 +10,63 @@ abstract class SystemSettingsEvent extends Equatable {
List<Object?> get props => [];
}
// ── Chargement ─────────────────────────────────────────────────────────────
class LoadSystemConfig extends SystemSettingsEvent {}
class LoadCacheStats extends SystemSettingsEvent {}
class LoadSystemMetrics extends SystemSettingsEvent {}
// ── Configuration ──────────────────────────────────────────────────────────
class UpdateSystemConfig extends SystemSettingsEvent {
final Map<String, dynamic> config;
const UpdateSystemConfig(this.config);
@override
List<Object?> get props => [config];
}
class LoadCacheStats extends SystemSettingsEvent {}
class LoadSystemMetrics extends SystemSettingsEvent {}
class ClearCache extends SystemSettingsEvent {}
class ResetSystemConfig extends SystemSettingsEvent {}
// ── Tests ───────────────────────────────────────────────────────────────────
class TestDatabaseConnection extends SystemSettingsEvent {}
class TestEmailConfiguration extends SystemSettingsEvent {}
class ResetSystemConfig extends SystemSettingsEvent {}
// ── Cache ────────────────────────────────────────────────────────────────────
class ClearCache extends SystemSettingsEvent {}
// ── Base de données ──────────────────────────────────────────────────────────
class OptimizeDatabase extends SystemSettingsEvent {}
// ── Sécurité ─────────────────────────────────────────────────────────────────
class ForceGlobalLogout extends SystemSettingsEvent {}
class CleanupSessions extends SystemSettingsEvent {}
class ExportGDPRData extends SystemSettingsEvent {}
// ── Logs ─────────────────────────────────────────────────────────────────────
class CleanOldLogs extends SystemSettingsEvent {}
class ExportLogs extends SystemSettingsEvent {}
// ── Données ──────────────────────────────────────────────────────────────────
class PurgeExpiredData extends SystemSettingsEvent {}
// ── Performance ──────────────────────────────────────────────────────────────
class AnalyzePerformance extends SystemSettingsEvent {}
// ── Sauvegarde ────────────────────────────────────────────────────────────────
class CreateBackup extends SystemSettingsEvent {}
// ── Maintenance ───────────────────────────────────────────────────────────────
class ScheduleMaintenance extends SystemSettingsEvent {
final String? scheduledAt;
final String? reason;
const ScheduleMaintenance({this.scheduledAt, this.reason});
@override
List<Object?> get props => [scheduledAt, reason];
}
class EmergencyMaintenance extends SystemSettingsEvent {}
// ── Mises à jour ──────────────────────────────────────────────────────────────
class CheckUpdates extends SystemSettingsEvent {}
// ── Rapports ──────────────────────────────────────────────────────────────────
class GenerateAuditReport extends SystemSettingsEvent {}
class GenerateUsageReport extends SystemSettingsEvent {}