Skip to content

Commit 8c8a229

Browse files
competence feature: widget refactor
1 parent c639664 commit 8c8a229

6 files changed

Lines changed: 122 additions & 78 deletions

File tree

school_data_hub_flutter/lib/features/learning/domain/competence_manager.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,7 @@ class CompetenceManager {
262262
required int score,
263263
required String? competenceComment,
264264
required String? groupId,
265+
String? groupCheckName,
265266
}) async {
266267
final createdBy = di<HubSessionManager>().userName;
267268
final PupilData? updatedPupilData = await _competenceCheckApiService
@@ -273,6 +274,7 @@ class CompetenceManager {
273274
score: score,
274275
valueFactor: 1,
275276
groupCheckId: groupId,
277+
groupCheckName: groupCheckName,
276278
);
277279
if (updatedPupilData == null) {
278280
return;
@@ -293,6 +295,7 @@ class CompetenceManager {
293295
required int score,
294296
required String? competenceComment,
295297
required String? groupId,
298+
String? groupCheckName,
296299
required File file,
297300
}) async {
298301
final createdBy = di<HubSessionManager>().userName;
@@ -307,6 +310,7 @@ class CompetenceManager {
307310
score: score,
308311
valueFactor: 1,
309312
groupCheckId: groupId,
313+
groupCheckName: groupCheckName,
310314
);
311315

312316
if (updatedPupilData == null) {

school_data_hub_flutter/lib/features/learning/presentation/multi_pupil_competence_check_page/multi_pupil_competence_check_page.dart

Lines changed: 73 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,45 @@
11
import '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';
25
import 'package:school_data_hub_flutter/common/theme/app_colors.dart';
36
import 'package:school_data_hub_flutter/common/widgets/generic_components/generic_app_bar.dart';
47
import 'package:school_data_hub_flutter/common/widgets/generic_components/generic_sliver_list.dart';
58
import 'package:school_data_hub_flutter/common/widgets/generic_components/generic_sliver_search_app_bar.dart';
69
import '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';
810
import 'package:school_data_hub_flutter/features/learning/presentation/multi_pupil_competence_check_page/widgets/competence_parents_names_widget.dart';
911
import 'package:school_data_hub_flutter/features/learning/presentation/multi_pupil_competence_check_page/widgets/multi_pupil_competence_check_card.dart';
1012
import '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';
1115
import 'package:school_data_hub_flutter/features/pupil/domain/pupil_proxy_manager.dart';
1216
import '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
}

school_data_hub_flutter/lib/features/learning/presentation/multi_pupil_competence_check_page/multi_pupil_competence_check_view_model.dart

Lines changed: 0 additions & 64 deletions
This file was deleted.

school_data_hub_flutter/lib/features/learning/presentation/multi_pupil_competence_check_page/widgets/multi_pupil_competence_check_card.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,13 @@ import 'package:school_data_hub_flutter/features/pupil/presentation/widgets/avat
2020

2121
class MultiPupilCompetenceCheckCard extends WatchingWidget {
2222
final String groupId;
23+
final String? groupCheckName;
2324
final int competenceId;
2425
final PupilProxy passedPupil;
2526
const MultiPupilCompetenceCheckCard({
2627
required this.passedPupil,
2728
required this.groupId,
29+
this.groupCheckName,
2830
required this.competenceId,
2931
super.key,
3032
});
@@ -145,6 +147,7 @@ class MultiPupilCompetenceCheckCard extends WatchingWidget {
145147
competenceId: competenceId,
146148
competenceComment: '',
147149
groupId: groupId,
150+
groupCheckName: groupCheckName,
148151
score: value!,
149152
);
150153
},
@@ -254,6 +257,7 @@ class MultiPupilCompetenceCheckCard extends WatchingWidget {
254257
competenceId: competenceId,
255258
competenceComment: '',
256259
groupId: groupId,
260+
groupCheckName: groupCheckName,
257261
score: 0,
258262
file: file,
259263
);

school_data_hub_flutter/lib/features/learning/presentation/pupil_list_learning_page/widgets/pupil_competence_checks/competence_check_card.dart

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import 'dart:io';
22

33
import 'package:flutter/material.dart';
4+
import 'package:flutter_it/flutter_it.dart';
45
import 'package:gap/gap.dart';
56
import 'package:school_data_hub_client/school_data_hub_client.dart';
67
import 'package:school_data_hub_flutter/app_utils/create_and_crop_image_file.dart';
@@ -18,7 +19,6 @@ import 'package:school_data_hub_flutter/core/session/hub_session_helper.dart';
1819
import 'package:school_data_hub_flutter/features/learning/domain/competence_helper.dart';
1920
import 'package:school_data_hub_flutter/features/learning/domain/competence_manager.dart';
2021
import 'package:school_data_hub_flutter/features/school_calendar/domain/school_calendar_manager.dart';
21-
import 'package:flutter_it/flutter_it.dart';
2222

2323
class CompetenceCheckCard extends StatelessWidget {
2424
final CompetenceCheck competenceCheck;
@@ -98,7 +98,7 @@ class CompetenceCheckCard extends StatelessWidget {
9898
const Spacer(),
9999
const Text('Erstellt von:', style: TextStyle(fontSize: 16)),
100100
const Gap(5),
101-
// only admin can change the admonishing user
101+
// only admin can change the docummenting user
102102
isAuthorized
103103
? InkWell(
104104
onTap: () async {
@@ -137,6 +137,43 @@ class CompetenceCheckCard extends StatelessWidget {
137137
const Gap(5),
138138
],
139139
),
140+
if (competenceCheck.groupCheckName != null &&
141+
competenceCheck.groupCheckName!.isNotEmpty) ...[
142+
const Gap(5),
143+
Container(
144+
padding: const EdgeInsets.symmetric(
145+
horizontal: 10,
146+
vertical: 6,
147+
),
148+
decoration: BoxDecoration(
149+
color: AppColors.backgroundColor.withValues(alpha: 0.15),
150+
borderRadius: BorderRadius.circular(8),
151+
border: Border.all(
152+
color: AppColors.backgroundColor.withValues(alpha: 0.3),
153+
width: 1,
154+
),
155+
),
156+
child: Row(
157+
mainAxisSize: MainAxisSize.min,
158+
children: [
159+
Icon(
160+
Icons.label_outline,
161+
size: 16,
162+
color: AppColors.backgroundColor,
163+
),
164+
const Gap(6),
165+
Text(
166+
competenceCheck.groupCheckName!,
167+
style: TextStyle(
168+
fontSize: 14,
169+
fontWeight: FontWeight.w600,
170+
color: AppColors.backgroundColor,
171+
),
172+
),
173+
],
174+
),
175+
),
176+
],
140177
const Gap(10),
141178
Row(
142179
crossAxisAlignment: CrossAxisAlignment.center,

school_data_hub_flutter/lib/features/learning/presentation/select_competence_page/select_competence_page.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import 'package:gap/gap.dart';
33
import 'package:school_data_hub_flutter/common/theme/app_colors.dart';
44
import 'package:school_data_hub_flutter/common/theme/styles.dart';
55
import 'package:school_data_hub_flutter/features/learning/presentation/competence_list_page/widgets/competence_list_view_bottom_navbar.dart';
6-
import 'package:school_data_hub_flutter/features/learning/presentation/multi_pupil_competence_check_page/multi_pupil_competence_check_view_model.dart';
6+
import 'package:school_data_hub_flutter/features/learning/presentation/multi_pupil_competence_check_page/multi_pupil_competence_check_page.dart';
77
import 'package:school_data_hub_flutter/features/learning/presentation/select_competence_page/select_competence_view_model.dart';
88
import 'package:school_data_hub_flutter/features/learning/presentation/select_competence_page/selectable_competence_tree.dart';
99

@@ -82,7 +82,7 @@ class SelectCompetencePage extends StatelessWidget {
8282
} else {
8383
Navigator.of(context).push(
8484
MaterialPageRoute(
85-
builder: (ctx) => MultiPupilCompetenceCheck(
85+
builder: (ctx) => MultiPupilCompetenceCheckPage(
8686
competence: viewModel.selectedCompetence!,
8787
),
8888
),

0 commit comments

Comments
 (0)