Skip to content

Commit dc739b5

Browse files
domain assessment fixes with claude
1 parent b56e881 commit dc739b5

60 files changed

Lines changed: 558 additions & 334 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

docs/bugs_and_todos/bugs.md

Lines changed: 0 additions & 1 deletion
This file was deleted.

docs/model_relations/school_data_hub_server.svg

Lines changed: 1 addition & 1 deletion
Loading

school_data_hub_client/lib/src/protocol/_features/hub/models/hub_object_type.dart

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,10 @@ enum HubObjectType implements _i1.SerializableModel {
2929
schoolday,
3030
schoolSemester,
3131
schoolData,
32-
user;
32+
user,
33+
libraryBook,
34+
workbook,
35+
timetableData;
3336

3437
static HubObjectType fromJson(int index) {
3538
switch (index) {
@@ -69,6 +72,12 @@ enum HubObjectType implements _i1.SerializableModel {
6972
return HubObjectType.schoolData;
7073
case 17:
7174
return HubObjectType.user;
75+
case 18:
76+
return HubObjectType.libraryBook;
77+
case 19:
78+
return HubObjectType.workbook;
79+
case 20:
80+
return HubObjectType.timetableData;
7281
default:
7382
throw ArgumentError(
7483
'Value "$index" cannot be converted to "HubObjectType"');

school_data_hub_flutter/assets/school_data_hub_server.svg

Lines changed: 1 addition & 1 deletion
Loading

school_data_hub_flutter/lib/core/init/init_on_user_auth.dart

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import 'package:school_data_hub_flutter/features/books/domain/book_manager.dart'
2525
import 'package:school_data_hub_flutter/features/books/domain/filters/pupil_book_lending_filter_manager.dart';
2626
import 'package:school_data_hub_flutter/features/books/domain/pupil_book_lending_manager.dart';
2727
import 'package:school_data_hub_flutter/features/learning/_competence/domain/competence_manager.dart';
28+
import 'package:school_data_hub_flutter/features/learning/_competence/presentation/learning_content_selection.dart';
2829
import 'package:school_data_hub_flutter/features/learning/_competence/domain/filters/competence_filter_manager.dart';
2930
import 'package:school_data_hub_flutter/features/learning/competence_report/domain/competence_report_item_manager.dart';
3031
import 'package:school_data_hub_flutter/features/learning/competence_report/domain/competence_report_manager.dart';
@@ -94,8 +95,8 @@ class InitOnUserAuth {
9495
dispose: (m) => m.dispose(),
9596
);
9697

97-
di.registerSingletonWithDependencies<LearningSupportManager>(
98-
() => LearningSupportManager(),
98+
di.registerSingletonAsync<LearningSupportManager>(
99+
() => LearningSupportManager().init(),
99100
dependsOn: [
100101
PupilProxyManager,
101102
SchoolCalendarManager,
@@ -132,6 +133,11 @@ class InitOnUserAuth {
132133
dispose: (m) => m.dispose(),
133134
);
134135

136+
di.registerSingleton<LearningContentSelection>(
137+
LearningContentSelection(),
138+
dispose: (s) => s.dispose(),
139+
);
140+
135141
di.registerSingletonAsync<CompetenceManager>(
136142
() => CompetenceManager().init(),
137143
dependsOn: [HubStreamService],
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import 'package:flutter_it/flutter_it.dart';
2+
import 'package:school_data_hub_client/school_data_hub_client.dart';
3+
import 'package:school_data_hub_flutter/features/_attendance/domain/attendance_manager.dart';
4+
import 'package:school_data_hub_flutter/features/_pupil/domain/models/pupil_proxy.dart';
5+
6+
extension PupilProxyAttendance on PupilProxy {
7+
List<MissedSchoolday>? get missedSchooldays =>
8+
di<AttendanceManager>().getAllPupilMissedSchooldays(pupilId);
9+
}

school_data_hub_flutter/lib/features/_authorizations/domain/authorization_manager.dart

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@ class AuthorizationManager with ChangeNotifier {
2525

2626
final _cacheManager = di<DefaultCacheManager>();
2727

28-
ValueListenable<List<Authorization>> get authorizations => _authorizations;
28+
ListNotifier<Authorization> get authorizations => _authorizations;
2929

30-
final _authorizations = ValueNotifier<List<Authorization>>([]);
30+
final _authorizations = ListNotifier<Authorization>();
3131

3232
Map<int, Authorization> _authorizationsMap = {};
3333

@@ -103,13 +103,20 @@ class AuthorizationManager with ChangeNotifier {
103103
if (_authorizationsMap.containsKey(id)) {
104104
_authorizationsMap.remove(id);
105105
_removePupilAuthListenablesForAuth(id);
106-
_authorizations.value = _authorizationsMap.values.toList();
106+
_syncAuthorizationsList();
107107
notifyListeners();
108108
}
109109
}
110110

111+
void _syncAuthorizationsList() {
112+
_authorizations.startTransAction();
113+
_authorizations.clear();
114+
_authorizations.addAll(_authorizationsMap.values);
115+
_authorizations.endTransAction();
116+
}
117+
111118
void clearData() {
112-
_authorizations.value = [];
119+
_authorizations.clear();
113120
_authorizationsMap = {};
114121
_pupilAuthListenables.clear();
115122
}
@@ -149,7 +156,7 @@ class AuthorizationManager with ChangeNotifier {
149156
for (var authorization in authorizations) {
150157
_authorizationsMap[authorization.id!] = authorization;
151158
}
152-
_authorizations.value = _authorizationsMap.values.toList();
159+
_syncAuthorizationsList();
153160
}
154161

155162
void _updatePupilAuthInCollections(PupilAuthorization pupilAuth) {
@@ -169,7 +176,7 @@ class AuthorizationManager with ChangeNotifier {
169176
_authorizationsMap[authId] = authorization.copyWith(
170177
authorizedPupils: pupilAuths,
171178
);
172-
_authorizations.value = _authorizationsMap.values.toList();
179+
_syncAuthorizationsList();
173180
}
174181

175182
Future<void> fetchAuthorizations() async {
@@ -194,7 +201,7 @@ class AuthorizationManager with ChangeNotifier {
194201
return;
195202
}
196203
_authorizationsMap[authorization.id!] = authorization;
197-
_authorizations.value = _authorizationsMap.values.toList();
204+
_syncAuthorizationsList();
198205

199206
_notificationService.showSnackBar(
200207
NotificationType.success,
@@ -237,7 +244,7 @@ class AuthorizationManager with ChangeNotifier {
237244
}
238245
_authorizationsMap.remove(authId);
239246
_removePupilAuthListenablesForAuth(authId);
240-
_authorizations.value = _authorizationsMap.values.toList();
247+
_syncAuthorizationsList();
241248

242249
_notificationService.showSnackBar(
243250
NotificationType.success,

school_data_hub_flutter/lib/features/_pupil/domain/models/pupil_proxy.dart

Lines changed: 5 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,13 @@
33
import 'package:collection/collection.dart';
44
import 'package:flutter/foundation.dart';
55
import 'package:flutter_it/flutter_it.dart';
6-
import 'package:logging/logging.dart';
76
import 'package:school_data_hub_client/school_data_hub_client.dart';
8-
import 'package:school_data_hub_flutter/features/_attendance/domain/attendance_manager.dart';
97
import 'package:school_data_hub_flutter/features/_pupil/domain/models/enums.dart';
108
import 'package:school_data_hub_flutter/features/_pupil/domain/models/pupil_identity_extensions.dart';
119
import 'package:school_data_hub_flutter/features/_pupil/domain/pupil_proxy_manager.dart';
12-
import 'package:school_data_hub_flutter/features/books/domain/pupil_book_lending_manager.dart';
13-
import 'package:school_data_hub_flutter/features/learning/_competence/domain/competence_manager.dart';
14-
import 'package:school_data_hub_flutter/features/learning_support/domain/learning_support_manager.dart';
15-
import 'package:school_data_hub_flutter/features/workbooks/domain/pupil_workbook_manager.dart';
1610

1711
typedef SiblingsResolver = List<PupilProxy> Function(PupilProxy pupil);
1812

19-
final _log = Logger('PupilProxy');
20-
2113
class PupilProxy with ChangeNotifier {
2214
PupilProxy({
2315
required PupilData pupilData,
@@ -36,20 +28,14 @@ class PupilProxy with ChangeNotifier {
3628
List<int>? _cachedSiblingIds;
3729
String? _cachedFamilyKey;
3830

39-
// Cached competence badge counts for performance
40-
Map<int, int>? _competenceBadgeCounts;
41-
42-
static const _jsonEquality = DeepCollectionEquality();
31+
static const _deepEquality = DeepCollectionEquality();
32+
int _dataHash = 0;
4333

4434
void updatePupil(PupilData pupilData) {
45-
if (_jsonEquality.equals(_pupilData.toJson(), pupilData.toJson())) {
46-
return;
47-
}
35+
final newHash = _deepEquality.hash(pupilData.toJson());
36+
if (newHash == _dataHash) return;
37+
_dataHash = newHash;
4838
_pupilData = pupilData;
49-
50-
// Invalidate cache when pupil data changes
51-
_competenceBadgeCounts = null;
52-
5339
notifyListeners();
5440
}
5541

@@ -226,20 +212,11 @@ class PupilProxy with ChangeNotifier {
226212

227213
List<CompetenceCheck>? get competenceChecks => _pupilData.competenceChecks;
228214

229-
List<CompetenceGoal> get competenceGoals =>
230-
di<CompetenceManager>().getCompetenceGoals(pupilId);
231-
232215
List<CompetenceReport>? get competenceReports => _pupilData.competenceReports;
233216

234217
List<CompetenceReportCheck>? get competenceReportChecks =>
235218
_pupilData.competenceReportChecks;
236219

237-
List<PupilWorkbook>? get pupilWorkbooks =>
238-
di<PupilWorkbookManager>().getPupilWorkbooks(pupilId);
239-
240-
List<PupilBookLending> get pupilBookLendings =>
241-
di<PupilBookLendingManager>().getPupilBookLendings(pupilId);
242-
243220
// learning support related
244221

245222
SupportLevel? get latestSupportLevel {
@@ -276,61 +253,11 @@ class PupilProxy with ChangeNotifier {
276253
?.score;
277254
}
278255

279-
List<SupportGoal> get supportGoals =>
280-
di<LearningSupportManager>().getSupportGoals(pupilId);
281-
282256
List<LearningSupportPlan>? get learningSupportPlans =>
283257
_pupilData.learningSupportPlans;
284258

285259
// schoolday related
286260

287-
List<MissedSchoolday>? get missedSchooldays =>
288-
di<AttendanceManager>().getAllPupilMissedSchooldays(pupilId);
289261
List<SchooldayEvent>? get schooldayEvents => _pupilData.schooldayEvents;
290262

291-
// Cached competence badge counts for performance
292-
Map<int, int> get competenceBadgeCounts {
293-
if (_competenceBadgeCounts != null) {
294-
return _competenceBadgeCounts!;
295-
}
296-
297-
// Calculate badge counts
298-
final competenceChecks = _pupilData.competenceChecks ?? [];
299-
final Map<int, int> counts = {};
300-
final Set<int> countedIds = {};
301-
302-
try {
303-
final competenceManager = di<CompetenceManager>();
304-
final rootMap = competenceManager.rootCompetencesMap;
305-
306-
// Initialize counts for all root competences
307-
for (final competenceId in rootMap.keys) {
308-
if (rootMap[competenceId] == competenceId) {
309-
counts[competenceId] = 0;
310-
}
311-
}
312-
313-
// Count checks per root competence
314-
for (final check in competenceChecks) {
315-
if (countedIds.contains(check.competenceId)) continue;
316-
countedIds.add(check.competenceId);
317-
318-
final rootCompetence = competenceManager.findRootCompetenceById(
319-
check.competenceId,
320-
);
321-
final int rootId = rootCompetence.publicId;
322-
323-
if (counts.containsKey(rootId)) {
324-
counts[rootId] = counts[rootId]! + 1;
325-
} else {
326-
counts[rootId] = 1;
327-
}
328-
}
329-
} catch (e) {
330-
_log.warning('Error calculating competence badge counts: $e');
331-
}
332-
333-
_competenceBadgeCounts = counts;
334-
return counts;
335-
}
336263
}

school_data_hub_flutter/lib/features/_pupil/presentation/pupil_profile_page/pupil_profile_page_content/learning_content/pupil_learning_content_expansion_tile_nav_bar.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import 'package:flutter/material.dart';
22
import 'package:flutter_it/flutter_it.dart';
33
import 'package:school_data_hub_flutter/common/widgets/orient_ui/button.dart';
44
import 'package:school_data_hub_flutter/features/_pupil/domain/models/pupil_proxy.dart';
5-
import 'package:school_data_hub_flutter/features/learning/_competence/domain/competence_manager.dart';
5+
import 'package:school_data_hub_flutter/features/learning/_competence/presentation/learning_content_selection.dart';
66
import 'package:school_data_hub_flutter/features/learning/_competence/presentation/pupil_list_learning_page/widgets/pupil_learning_content/pupil_learning_content_books.dart';
77
import 'package:school_data_hub_flutter/features/learning/_competence/presentation/pupil_list_learning_page/widgets/pupil_learning_content/pupil_learning_content_competence_goals.dart';
88
import 'package:school_data_hub_flutter/features/learning/_competence/presentation/pupil_list_learning_page/widgets/pupil_learning_content/pupil_learning_content_competence_statuses.dart';
@@ -21,7 +21,7 @@ class PupilLearningContentExpansionTileNavBar extends WatchingWidget {
2121
@override
2222
Widget build(BuildContext context) {
2323
final selectedContent = watchValue(
24-
(CompetenceManager m) => m.selectedLearningContent,
24+
(LearningContentSelection s) => s.selectedContent,
2525
);
2626

2727
return Column(

0 commit comments

Comments
 (0)