@@ -4,18 +4,21 @@ import 'dart:typed_data';
44import 'package:flutter/material.dart' ;
55import 'package:flutter_it/flutter_it.dart' ;
66import 'package:gap/gap.dart' ;
7+ import 'package:logging/logging.dart' ;
78import 'package:printing/printing.dart' ;
9+ import 'package:school_data_hub_client/school_data_hub_client.dart' ;
810import 'package:school_data_hub_flutter/app_utils/pdf_viewer_page.dart' ;
911import 'package:school_data_hub_flutter/common/theme/app_colors.dart' ;
1012import 'package:school_data_hub_flutter/common/theme/styles.dart' ;
1113import 'package:school_data_hub_flutter/common/widgets/bottom_nav_bar/generic_bottom_nav_bar.dart' ;
1214import 'package:school_data_hub_flutter/common/widgets/generic_components/generic_app_bar.dart' ;
1315import 'package:school_data_hub_flutter/features/user/data/staff_excel_import_parser.dart' ;
14- import 'package:school_data_hub_client/school_data_hub_client.dart' ;
1516import 'package:school_data_hub_flutter/features/user/domain/batch_create_result.dart' ;
1617import 'package:school_data_hub_flutter/features/user/domain/user_manager.dart' ;
1718import 'package:school_data_hub_flutter/features/user/presentation/batch_import_users/staff_credentials_pdf_service.dart' ;
1819
20+ final _log = Logger ('BatchImportUsersPage' );
21+
1922class BatchImportUsersPage extends StatefulWidget {
2023 const BatchImportUsersPage ({super .key});
2124
@@ -49,7 +52,11 @@ class _BatchImportUsersPageState extends State<BatchImportUsersPage> {
4952
5053 Future <void > _createUsers () async {
5154 final rows = _parseResult? .rows ?? [];
52- if (rows.isEmpty) return ;
55+ _log.info ('[BatchImport] Benutzer anlegen clicked, rows=${rows .length }' );
56+ if (rows.isEmpty) {
57+ _log.warning ('[BatchImport] No rows to create, returning' );
58+ return ;
59+ }
5360 setState (() {
5461 _isCreating = true ;
5562 _batchResult = null ;
@@ -61,40 +68,58 @@ class _BatchImportUsersPageState extends State<BatchImportUsersPage> {
6168 final errors = < BatchCreateError > [];
6269
6370 try {
71+ _log.info ('[BatchImport] Getting stream from UserManager' );
6472 final stream = userManager.batchCreateUsersStreamFromImportRows (rows);
73+ _log.info ('[BatchImport] Subscribing to batchCreateUsersStream' );
6574 _streamSubscription = stream.listen (
6675 (event) {
6776 if (! mounted) return ;
6877 if (event.credential != null ) {
6978 final c = event.credential! ;
70- credentials.add (StaffCredentialEntry (
71- userName: c.userName,
72- fullName: c.fullName,
73- email: c.email,
74- password: c.password,
75- ));
79+ credentials.add (
80+ StaffCredentialEntry (
81+ userName: c.userName,
82+ fullName: c.fullName,
83+ email: c.email,
84+ password: c.password,
85+ ),
86+ );
7687 setState (() => _progressCreated = credentials.length);
88+ _log.info (
89+ '[BatchImport] Event: created ${credentials .length } — ${c .userName }' ,
90+ );
7791 } else if (event.error != null ) {
7892 final e = event.error! ;
79- errors.add (BatchCreateError (
80- rowIndex: e.rowIndex,
81- userNameOrKurzel: e.userNameOrKurzel,
82- message: e.message,
83- ));
93+ errors.add (
94+ BatchCreateError (
95+ rowIndex: e.rowIndex,
96+ userNameOrKurzel: e.userNameOrKurzel,
97+ message: e.message,
98+ ),
99+ );
84100 setState (() => _progressErrors = errors.length);
101+ _log.info (
102+ '[BatchImport] Event: error ${errors .length } — row ${e .rowIndex } ${e .userNameOrKurzel }: ${e .message }' ,
103+ );
85104 }
86105 },
87- onError: (Object e) {
106+ onError: (Object e, StackTrace ? st) {
107+ _log.severe ('[BatchImport] Stream onError' , e, st);
88108 if (mounted) {
89109 setState (() => _isCreating = false );
90- ScaffoldMessenger .of (context). showSnackBar (
91- SnackBar (content : Text ( 'Fehler: $ e ' )) ,
92- );
110+ ScaffoldMessenger .of (
111+ context ,
112+ ). showSnackBar ( SnackBar (content : Text ( 'Fehler: $ e ' ))) ;
93113 }
94114 },
95115 onDone: () async {
116+ _log.info (
117+ '[BatchImport] Stream onDone — credentials=${credentials .length } errors=${errors .length }' ,
118+ );
96119 if (! mounted) return ;
120+ _log.info ('[BatchImport] Refreshing user list' );
97121 await userManager.fetchUsersCommand.runAsync ();
122+ if (! mounted) return ;
98123 setState (() {
99124 _batchResult = BatchCreateResult (
100125 credentials: credentials,
@@ -104,15 +129,19 @@ class _BatchImportUsersPageState extends State<BatchImportUsersPage> {
104129 _progressCreated = 0 ;
105130 _progressErrors = 0 ;
106131 });
132+ _log.info (
133+ '[BatchImport] Batch complete. Success: ${credentials .length }, failures: ${errors .length }' ,
134+ );
107135 },
108136 cancelOnError: false ,
109137 );
110- } catch (e) {
138+ } catch (e, st) {
139+ _log.severe ('[BatchImport] _createUsers catch' , e, st);
111140 if (mounted) {
112141 setState (() => _isCreating = false );
113- ScaffoldMessenger .of (context). showSnackBar (
114- SnackBar (content : Text ( 'Fehler: $ e ' )) ,
115- );
142+ ScaffoldMessenger .of (
143+ context ,
144+ ). showSnackBar ( SnackBar (content : Text ( 'Fehler: $ e ' ))) ;
116145 }
117146 }
118147 }
0 commit comments