11import 'package:flutter/material.dart' ;
2+ import 'package:flutter_it/flutter_it.dart' ;
3+ import 'package:school_data_hub_client/school_data_hub_client.dart' ;
4+ import 'package:school_data_hub_flutter/app_utils/generate_uuid.dart' ;
25import 'package:school_data_hub_flutter/common/theme/app_colors.dart' ;
36import 'package:school_data_hub_flutter/common/widgets/generic_components/generic_app_bar.dart' ;
47import 'package:school_data_hub_flutter/common/widgets/generic_components/generic_sliver_list.dart' ;
58import 'package:school_data_hub_flutter/common/widgets/generic_components/generic_sliver_search_app_bar.dart' ;
69import 'package:school_data_hub_flutter/features/learning/domain/competence_helper.dart' ;
7- import 'package:school_data_hub_flutter/features/learning/presentation/multi_pupil_competence_check_page/multi_pupil_competence_check_view_model.dart' ;
810import 'package:school_data_hub_flutter/features/learning/presentation/multi_pupil_competence_check_page/widgets/competence_parents_names_widget.dart' ;
911import 'package:school_data_hub_flutter/features/learning/presentation/multi_pupil_competence_check_page/widgets/multi_pupil_competence_check_card.dart' ;
1012import 'package:school_data_hub_flutter/features/learning/presentation/multi_pupil_competence_check_page/widgets/multi_pupil_competence_check_page_bottom_navbar.dart' ;
13+ import 'package:school_data_hub_flutter/features/pupil/domain/filters/pupils_filter.dart' ;
14+ import 'package:school_data_hub_flutter/features/pupil/domain/models/pupil_proxy.dart' ;
1115import 'package:school_data_hub_flutter/features/pupil/domain/pupil_proxy_manager.dart' ;
1216import 'package:school_data_hub_flutter/features/pupil/presentation/_credit/credit_list_page/widgets/credit_list_searchbar.dart' ;
13- import 'package:flutter_it/flutter_it.dart' ;
1417
15- class MultiPupilCompetenceCheckPage extends StatelessWidget {
16- final MultiPupilCompetenceCheckViewModel viewModel;
17- const MultiPupilCompetenceCheckPage ({required this .viewModel, super .key});
18+ class MultiPupilCompetenceCheckPage extends WatchingWidget {
19+ final Competence competence;
20+
21+ const MultiPupilCompetenceCheckPage ({
22+ required this .competence,
23+ super .key,
24+ });
1825
1926 @override
2027 Widget build (BuildContext context) {
21- final competence = viewModel.widget.competence;
22- final filteredPupils = viewModel.competenceFilteredPupils;
28+ // Create local observables once - auto-disposed when widget is destroyed
29+ final groupCheckNameController = createOnce (() => TextEditingController ());
30+ final groupCheckNameNotifier = createOnce (() => ValueNotifier <String >('' ));
31+ final groupId = createOnce (() => generateCustomUuid ());
32+
33+ // Watch the group check name reactively
34+ final groupCheckName = watch (groupCheckNameNotifier).value;
35+
36+ // Watch filtered pupils and apply competence filter
37+ final filteredPupils = watchValue ((PupilsFilter x) => x.filteredPupils);
38+ final competenceFilteredPupils = _getFilteredPupilsWithCompetence (
39+ competence: competence,
40+ pupilsToBeFiltered: filteredPupils,
41+ );
42+
2343 return Scaffold (
2444 backgroundColor: AppColors .canvasColor,
2545 appBar: const GenericAppBar (
@@ -66,20 +86,39 @@ class MultiPupilCompetenceCheckPage extends StatelessWidget {
6686 ),
6787 ),
6888 ),
89+ Padding (
90+ padding: const EdgeInsets .symmetric (horizontal: 10.0 , vertical: 5.0 ),
91+ child: TextField (
92+ controller: groupCheckNameController,
93+ onChanged: (value) {
94+ groupCheckNameNotifier.value = value;
95+ },
96+ decoration: InputDecoration (
97+ labelText: 'Gruppenname (optional)' ,
98+ hintText: 'z.B. Mathetest, Leseübung...' ,
99+ border: OutlineInputBorder (
100+ borderRadius: BorderRadius .circular (8 ),
101+ ),
102+ filled: true ,
103+ fillColor: Colors .white,
104+ ),
105+ ),
106+ ),
69107 Expanded (
70108 child: CustomScrollView (
71109 slivers: [
72110 // const SliverGap(5),
73111 GenericSliverSearchAppBar (
74112 height: 110 ,
75- title: CreditListSearchBar (pupils: filteredPupils ),
113+ title: CreditListSearchBar (pupils: competenceFilteredPupils ),
76114 ),
77115 GenericSliverListWithEmptyListCheck (
78- items: filteredPupils ,
116+ items: competenceFilteredPupils ,
79117 itemBuilder: (_, pupil) =>
80118 MultiPupilCompetenceCheckCard (
81119 passedPupil: pupil,
82- groupId: viewModel.groupId,
120+ groupId: groupId,
121+ groupCheckName: groupCheckName.isEmpty ? null : groupCheckName,
83122 competenceId: competence.publicId,
84123 ),
85124 ),
@@ -94,4 +133,28 @@ class MultiPupilCompetenceCheckPage extends StatelessWidget {
94133 bottomNavigationBar: const MultiPupilCompetenceCheckPageBottomNavBar (),
95134 );
96135 }
136+
137+ // Filter pupils based on competence (helper method)
138+ List <PupilProxy > _getFilteredPupilsWithCompetence ({
139+ required Competence competence,
140+ required List <PupilProxy > pupilsToBeFiltered,
141+ }) {
142+ List <PupilProxy > pupils = [];
143+
144+ for (PupilProxy pupil in pupilsToBeFiltered) {
145+ if (pupil.specialNeeds != null && pupil.specialNeeds! .contains ('LE' )) {
146+ pupils.add (pupil);
147+ continue ;
148+ } else {
149+ final allowedCompetences =
150+ CompetenceHelper .getAllowedCompetencesForThisPupil (pupil);
151+
152+ if (allowedCompetences.contains (competence)) {
153+ pupils.add (pupil);
154+ continue ;
155+ }
156+ }
157+ }
158+ return pupils;
159+ }
97160}
0 commit comments