From cd38f9eca812135c93749d2bc5afd658405048ae Mon Sep 17 00:00:00 2001 From: Jonas Sander <29028262+Jonas-Sander@users.noreply.github.com> Date: Mon, 27 May 2024 17:12:13 +0200 Subject: [PATCH 01/28] Move Methods out of HomeworkList class into extensions. --- .../lib/src/models/homework_list.dart | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/lib/hausaufgabenheft_logik/lib/src/models/homework_list.dart b/lib/hausaufgabenheft_logik/lib/src/models/homework_list.dart index cd04c54a4..e9f69ace3 100644 --- a/lib/hausaufgabenheft_logik/lib/src/models/homework_list.dart +++ b/lib/hausaufgabenheft_logik/lib/src/models/homework_list.dart @@ -38,8 +38,6 @@ class HomeworkList extends ListBase { void addAll(Iterable iterable) => _homeworks.addAll(iterable); - void sortWith(Sort sort) => sort.sort(this); - @override String toString() { var s = 'HomeworkList([\n'; @@ -49,10 +47,24 @@ class HomeworkList extends ListBase { s += '])'; return s; } +} + +extension SortWith on List { + void sortWith(Sort sort) { + sort.sort(this); + } +} + +extension HomeworkListExtension on List { + HomeworkList get completed => HomeworkList( + where((homework) => homework.status == CompletionStatus.completed) + .toList()); + HomeworkList get open => HomeworkList( + where((homework) => homework.status == CompletionStatus.open).toList()); List getDistinctOrderedSubjects() { final subjects = {}; - for (final homework in _homeworks) { + for (final homework in this) { subjects.add(homework.subject); } return subjects.toList(); @@ -60,15 +72,7 @@ class HomeworkList extends ListBase { HomeworkList getOverdue([Date? now]) { now = now ?? Date.now(); - return HomeworkList(_homeworks - .where((homeworks) => homeworks.isOverdueRelativeTo(now!)) - .toList()); + return HomeworkList( + where((homeworks) => homeworks.isOverdueRelativeTo(now!)).toList()); } - - HomeworkList get completed => HomeworkList(_homeworks - .where((homework) => homework.status == CompletionStatus.completed) - .toList()); - HomeworkList get open => HomeworkList(_homeworks - .where((homework) => homework.status == CompletionStatus.open) - .toList()); } From cdf3319cee82e5a7ff12b06823c28e857ffa3320 Mon Sep 17 00:00:00 2001 From: Jonas Sander <29028262+Jonas-Sander@users.noreply.github.com> Date: Mon, 27 May 2024 17:14:57 +0200 Subject: [PATCH 02/28] Depreceate old HomeworkList methods and create new --- .../lib/src/models/homework_list.dart | 19 ++++++++++++++++--- .../open_homework_list_view_factory.dart | 2 +- .../test/homework_page_bloc_test.dart | 2 +- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/lib/hausaufgabenheft_logik/lib/src/models/homework_list.dart b/lib/hausaufgabenheft_logik/lib/src/models/homework_list.dart index e9f69ace3..e68040310 100644 --- a/lib/hausaufgabenheft_logik/lib/src/models/homework_list.dart +++ b/lib/hausaufgabenheft_logik/lib/src/models/homework_list.dart @@ -56,11 +56,18 @@ extension SortWith on List { } extension HomeworkListExtension on List { - HomeworkList get completed => HomeworkList( + @deprecated + HomeworkList get completedHl => HomeworkList( where((homework) => homework.status == CompletionStatus.completed) .toList()); - HomeworkList get open => HomeworkList( + List get completed => + where((homework) => homework.status == CompletionStatus.completed) + .toList(); + @deprecated + HomeworkList get openHl => HomeworkList( where((homework) => homework.status == CompletionStatus.open).toList()); + List get open => + where((homework) => homework.status == CompletionStatus.open).toList(); List getDistinctOrderedSubjects() { final subjects = {}; @@ -70,9 +77,15 @@ extension HomeworkListExtension on List { return subjects.toList(); } - HomeworkList getOverdue([Date? now]) { + @deprecated + HomeworkList getOverdueHl([Date? now]) { now = now ?? Date.now(); return HomeworkList( where((homeworks) => homeworks.isOverdueRelativeTo(now!)).toList()); } + + List getOverdue([Date? now]) { + now = now ?? Date.now(); + return where((homeworks) => homeworks.isOverdueRelativeTo(now!)).toList(); + } } diff --git a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/views/open_homework_list_view_factory.dart b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/views/open_homework_list_view_factory.dart index 60fdbb739..64483eb71 100644 --- a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/views/open_homework_list_view_factory.dart +++ b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/views/open_homework_list_view_factory.dart @@ -39,7 +39,7 @@ class OpenHomeworkListViewFactory { bool _shouldShowCompleteOverdueHomeworkPrompt(HomeworkList openHomeworks) { var now = _getCurrentDate(); - var overdueOpenHomeworks = openHomeworks.getOverdue(now); + var overdueOpenHomeworks = openHomeworks.getOverdueHl(now); return overdueOpenHomeworks.length > 2; } } diff --git a/lib/hausaufgabenheft_logik/test/homework_page_bloc_test.dart b/lib/hausaufgabenheft_logik/test/homework_page_bloc_test.dart index a1652b449..541fd1168 100644 --- a/lib/hausaufgabenheft_logik/test/homework_page_bloc_test.dart +++ b/lib/hausaufgabenheft_logik/test/homework_page_bloc_test.dart @@ -507,7 +507,7 @@ HomeworkPageBloc createBloc( completionDispatcher: RepositoryHomeworkCompletionDispatcher(repository), getOpenOverdueHomeworkIds: () async { final open = await repository.openHomeworks.first; - return HomeworkList(open).getOverdue().map((hw) => hw.id).toList(); + return HomeworkList(open).getOverdueHl().map((hw) => hw.id).toList(); }, keyValueStore: keyValueStore ?? InMemoryKeyValueStore(), getCurrentDateTime: getCurrentDateTime, From 3dfc2c2ba6b64562fde61bfcb7dd44d0f9d91bd3 Mon Sep 17 00:00:00 2001 From: Jonas Sander <29028262+Jonas-Sander@users.noreply.github.com> Date: Mon, 27 May 2024 17:15:53 +0200 Subject: [PATCH 03/28] Move to new methods --- .../lib/src/models/homework_list.dart | 14 -------------- .../views/open_homework_list_view_factory.dart | 2 +- .../test/homework_page_bloc_test.dart | 2 +- 3 files changed, 2 insertions(+), 16 deletions(-) diff --git a/lib/hausaufgabenheft_logik/lib/src/models/homework_list.dart b/lib/hausaufgabenheft_logik/lib/src/models/homework_list.dart index e68040310..4a3bb3c16 100644 --- a/lib/hausaufgabenheft_logik/lib/src/models/homework_list.dart +++ b/lib/hausaufgabenheft_logik/lib/src/models/homework_list.dart @@ -56,16 +56,9 @@ extension SortWith on List { } extension HomeworkListExtension on List { - @deprecated - HomeworkList get completedHl => HomeworkList( - where((homework) => homework.status == CompletionStatus.completed) - .toList()); List get completed => where((homework) => homework.status == CompletionStatus.completed) .toList(); - @deprecated - HomeworkList get openHl => HomeworkList( - where((homework) => homework.status == CompletionStatus.open).toList()); List get open => where((homework) => homework.status == CompletionStatus.open).toList(); @@ -77,13 +70,6 @@ extension HomeworkListExtension on List { return subjects.toList(); } - @deprecated - HomeworkList getOverdueHl([Date? now]) { - now = now ?? Date.now(); - return HomeworkList( - where((homeworks) => homeworks.isOverdueRelativeTo(now!)).toList()); - } - List getOverdue([Date? now]) { now = now ?? Date.now(); return where((homeworks) => homeworks.isOverdueRelativeTo(now!)).toList(); diff --git a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/views/open_homework_list_view_factory.dart b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/views/open_homework_list_view_factory.dart index 64483eb71..60fdbb739 100644 --- a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/views/open_homework_list_view_factory.dart +++ b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/views/open_homework_list_view_factory.dart @@ -39,7 +39,7 @@ class OpenHomeworkListViewFactory { bool _shouldShowCompleteOverdueHomeworkPrompt(HomeworkList openHomeworks) { var now = _getCurrentDate(); - var overdueOpenHomeworks = openHomeworks.getOverdueHl(now); + var overdueOpenHomeworks = openHomeworks.getOverdue(now); return overdueOpenHomeworks.length > 2; } } diff --git a/lib/hausaufgabenheft_logik/test/homework_page_bloc_test.dart b/lib/hausaufgabenheft_logik/test/homework_page_bloc_test.dart index 541fd1168..a1652b449 100644 --- a/lib/hausaufgabenheft_logik/test/homework_page_bloc_test.dart +++ b/lib/hausaufgabenheft_logik/test/homework_page_bloc_test.dart @@ -507,7 +507,7 @@ HomeworkPageBloc createBloc( completionDispatcher: RepositoryHomeworkCompletionDispatcher(repository), getOpenOverdueHomeworkIds: () async { final open = await repository.openHomeworks.first; - return HomeworkList(open).getOverdueHl().map((hw) => hw.id).toList(); + return HomeworkList(open).getOverdue().map((hw) => hw.id).toList(); }, keyValueStore: keyValueStore ?? InMemoryKeyValueStore(), getCurrentDateTime: getCurrentDateTime, From bcb13cd3db2e52f7450ef1288494240b2d185bdf Mon Sep 17 00:00:00 2001 From: Jonas Sander <29028262+Jonas-Sander@users.noreply.github.com> Date: Mon, 27 May 2024 17:22:26 +0200 Subject: [PATCH 04/28] Remove `HomeworkList`. --- ...lazy_loading_completed_homeworks_bloc.dart | 3 +- .../states.dart | 5 +-- .../completed_homework_list_view_factory.dart | 7 ++-- .../lib/src/models/homework_list.dart | 40 +------------------ .../open_homework_list_bloc.dart | 4 +- .../open_homework_list_bloc/states.dart | 4 +- .../open_homework_view_bloc.dart | 13 +++--- .../sort_and_subcategorizer.dart | 2 +- .../subcategorizer.dart | 5 +-- .../subject_subcategorizer.dart | 2 +- .../todo_date_subcategorizer.dart | 3 +- .../open_homework_list_view_factory.dart | 7 ++-- .../test/homework_list_test.dart | 22 +++++----- .../test/homework_page_bloc_test.dart | 2 +- .../test/open_homework_view_bloc_test.dart | 3 +- 15 files changed, 38 insertions(+), 84 deletions(-) diff --git a/lib/hausaufgabenheft_logik/lib/src/completed_homeworks/lazy_loading_completed_homeworks_bloc/lazy_loading_completed_homeworks_bloc.dart b/lib/hausaufgabenheft_logik/lib/src/completed_homeworks/lazy_loading_completed_homeworks_bloc/lazy_loading_completed_homeworks_bloc.dart index 0e5462718..4d9a01689 100644 --- a/lib/hausaufgabenheft_logik/lib/src/completed_homeworks/lazy_loading_completed_homeworks_bloc/lazy_loading_completed_homeworks_bloc.dart +++ b/lib/hausaufgabenheft_logik/lib/src/completed_homeworks/lazy_loading_completed_homeworks_bloc/lazy_loading_completed_homeworks_bloc.dart @@ -10,7 +10,6 @@ import 'package:bloc/bloc.dart'; import 'package:bloc_base/bloc_base.dart' as bloc_base; import '../../data_source/homework_data_source.dart'; -import '../../models/homework_list.dart'; import 'events.dart'; import 'states.dart'; @@ -32,7 +31,7 @@ class LazyLoadingCompletedHomeworksBloc extends Bloc< event.numberOfHomeworksToLoad); _lazyLoadingController!.results.listen((res) => add( _Yield(Success( - HomeworkList(res.homeworks), + res.homeworks, loadedAllHomeworks: !res.moreHomeworkAvailable, )), )); diff --git a/lib/hausaufgabenheft_logik/lib/src/completed_homeworks/lazy_loading_completed_homeworks_bloc/states.dart b/lib/hausaufgabenheft_logik/lib/src/completed_homeworks/lazy_loading_completed_homeworks_bloc/states.dart index 4630642be..d797b96e0 100644 --- a/lib/hausaufgabenheft_logik/lib/src/completed_homeworks/lazy_loading_completed_homeworks_bloc/states.dart +++ b/lib/hausaufgabenheft_logik/lib/src/completed_homeworks/lazy_loading_completed_homeworks_bloc/states.dart @@ -7,13 +7,12 @@ // SPDX-License-Identifier: EUPL-1.2 import 'package:equatable/equatable.dart'; - -import '../../models/homework_list.dart'; +import 'package:hausaufgabenheft_logik/hausaufgabenheft_logik.dart'; abstract class LazyLoadingCompletedHomeworksBlocState extends Equatable {} class Success extends LazyLoadingCompletedHomeworksBlocState { - final HomeworkList homeworks; + final List homeworks; final bool loadedAllHomeworks; Success(this.homeworks, {required this.loadedAllHomeworks}); diff --git a/lib/hausaufgabenheft_logik/lib/src/completed_homeworks/views/completed_homework_list_view_factory.dart b/lib/hausaufgabenheft_logik/lib/src/completed_homeworks/views/completed_homework_list_view_factory.dart index 251fdd717..67f0948b1 100644 --- a/lib/hausaufgabenheft_logik/lib/src/completed_homeworks/views/completed_homework_list_view_factory.dart +++ b/lib/hausaufgabenheft_logik/lib/src/completed_homeworks/views/completed_homework_list_view_factory.dart @@ -6,8 +6,7 @@ // // SPDX-License-Identifier: EUPL-1.2 -import 'package:hausaufgabenheft_logik/src/models/homework_list.dart'; -import 'completed_homwork_list_view.dart'; +import 'package:hausaufgabenheft_logik/hausaufgabenheft_logik.dart'; import '../../views/student_homework_view_factory.dart'; class CompletedHomeworkListViewFactory { @@ -15,8 +14,8 @@ class CompletedHomeworkListViewFactory { CompletedHomeworkListViewFactory(this._studentHomeworkViewFactory); - CompletedHomeworkListView create( - HomeworkList completedHomeworks, bool loadedAllCompletedHomeworks) { + CompletedHomeworkListView create(List completedHomeworks, + bool loadedAllCompletedHomeworks) { final orderedHomeworks = [ for (final completedHomework in completedHomeworks) _studentHomeworkViewFactory.createFrom(completedHomework) diff --git a/lib/hausaufgabenheft_logik/lib/src/models/homework_list.dart b/lib/hausaufgabenheft_logik/lib/src/models/homework_list.dart index 4a3bb3c16..8c1d77536 100644 --- a/lib/hausaufgabenheft_logik/lib/src/models/homework_list.dart +++ b/lib/hausaufgabenheft_logik/lib/src/models/homework_list.dart @@ -6,48 +6,12 @@ // // SPDX-License-Identifier: EUPL-1.2 -import 'dart:collection'; import 'package:hausaufgabenheft_logik/src/models/homework/homework_completion_status.dart'; -import 'homework/homework.dart'; +import '../open_homeworks/sort_and_subcategorization/sort/src/sort.dart'; import 'date.dart'; +import 'homework/homework.dart'; import 'subject.dart'; -import '../open_homeworks/sort_and_subcategorization/sort/src/sort.dart'; - -class HomeworkList extends ListBase { - final List _homeworks; - - HomeworkList(List homeworks) - : _homeworks = List.from(homeworks); - @override - int get length => _homeworks.length; - - @override - set length(int newLength) => _homeworks.length = newLength; - - @override - HomeworkReadModel operator [](int index) => _homeworks[index]; - - @override - void operator []=(int index, value) => _homeworks[index] = value; - - @override // Overwritten for performance reasons as stated in ListBase - void add(HomeworkReadModel element) => _homeworks.add(element); - - @override // Overwritten for performance reasons as stated in ListBase - void addAll(Iterable iterable) => - _homeworks.addAll(iterable); - - @override - String toString() { - var s = 'HomeworkList([\n'; - for (final homework in _homeworks) { - s += '$homework\n'; - } - s += '])'; - return s; - } -} extension SortWith on List { void sortWith(Sort sort) { diff --git a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/open_homework_list_bloc/open_homework_list_bloc.dart b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/open_homework_list_bloc/open_homework_list_bloc.dart index c1541a906..81974befb 100644 --- a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/open_homework_list_bloc/open_homework_list_bloc.dart +++ b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/open_homework_list_bloc/open_homework_list_bloc.dart @@ -8,7 +8,6 @@ import 'package:bloc/bloc.dart'; import 'package:hausaufgabenheft_logik/src/data_source/homework_data_source.dart'; -import 'package:hausaufgabenheft_logik/src/models/homework_list.dart'; import 'events.dart'; import 'states.dart'; @@ -22,8 +21,7 @@ class OpenHomeworkListBloc OpenHomeworkListBloc(this._repository) : super(Uninitialized()) { on((event, emit) { - _repository.openHomeworks - .listen((hws) => add(_Yield(Success(HomeworkList(hws))))); + _repository.openHomeworks.listen((hws) => add(_Yield(Success(hws)))); }); on<_Yield>((event, emit) => emit(event.payload)); } diff --git a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/open_homework_list_bloc/states.dart b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/open_homework_list_bloc/states.dart index 633de2296..610f30a6c 100644 --- a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/open_homework_list_bloc/states.dart +++ b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/open_homework_list_bloc/states.dart @@ -6,14 +6,14 @@ // // SPDX-License-Identifier: EUPL-1.2 -import 'package:hausaufgabenheft_logik/src/models/homework_list.dart'; +import 'package:hausaufgabenheft_logik/hausaufgabenheft_logik.dart'; abstract class OpenHomeworkListBlocState {} class Uninitialized extends OpenHomeworkListBlocState {} class Success extends OpenHomeworkListBlocState { - final HomeworkList homeworks; + final List homeworks; Success(this.homeworks); } diff --git a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/open_homework_view_bloc/open_homework_view_bloc.dart b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/open_homework_view_bloc/open_homework_view_bloc.dart index 9bfd28727..82f7370aa 100644 --- a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/open_homework_view_bloc/open_homework_view_bloc.dart +++ b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/open_homework_view_bloc/open_homework_view_bloc.dart @@ -11,10 +11,9 @@ import 'dart:async'; import 'package:bloc/bloc.dart'; import 'package:bloc_base/bloc_base.dart' as bloc_base; import 'package:hausaufgabenheft_logik/src/models/homework/homework.dart'; -import 'package:hausaufgabenheft_logik/src/models/homework_list.dart'; -import 'package:hausaufgabenheft_logik/src/open_homeworks/sort_and_subcategorization/sort/src/sort.dart'; import 'package:hausaufgabenheft_logik/src/open_homeworks/open_homework_list_bloc/open_homework_list_bloc.dart' as hws_bloc; +import 'package:hausaufgabenheft_logik/src/open_homeworks/sort_and_subcategorization/sort/src/sort.dart'; import 'package:hausaufgabenheft_logik/src/open_homeworks/views/open_homework_list_view_factory.dart'; import 'events.dart'; @@ -29,14 +28,14 @@ class OpenHomeworksViewBloc final OpenHomeworkListViewFactory _listViewFactory; final hws_bloc.OpenHomeworkListBloc _openHomeworksBloc; - late Stream _openHomeworks; + late Stream> _openHomeworks; late StreamSubscription _streamSubscription; - HomeworkList? _latestHomeworks; + List? _latestHomeworks; Sort? _currentSort; OpenHomeworksViewBloc(this._openHomeworksBloc, this._listViewFactory) : super(Uninitialized()) { - _latestHomeworks = HomeworkList([]); + _latestHomeworks = []; _openHomeworks = _openHomeworksBloc.stream.transform(_toHomeworkList); on((event, emit) { @@ -65,7 +64,7 @@ class OpenHomeworksViewBloc } class _CreateListView extends OpenHomeworkViewEvent { - final HomeworkList? homeworks; + final List? homeworks; final Sort? sort; _CreateListView(this.homeworks, this.sort); @@ -75,7 +74,7 @@ class _CreateListView extends OpenHomeworkViewEvent { } final _toHomeworkList = StreamTransformer.fromHandlers(handleData: (state, sink) { + List>.fromHandlers(handleData: (state, sink) { if (state is hws_bloc.Success) { sink.add(state.homeworks); } diff --git a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort_and_subcategorizer.dart b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort_and_subcategorizer.dart index c9f04f10d..6cd3cb73d 100644 --- a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort_and_subcategorizer.dart +++ b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort_and_subcategorizer.dart @@ -20,7 +20,7 @@ class HomeworkSortAndSubcategorizer { HomeworkSortAndSubcategorizer(this.getMatchingSubcategorizer); List sortAndSubcategorize( - HomeworkList homeworks, Sort sort) { + List homeworks, Sort sort) { homeworks.sortWith(sort); return getMatchingSubcategorizer(sort).subcategorize(homeworks); } diff --git a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/subcategorizer.dart b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/subcategorizer.dart index 8b9de8397..330bd38e8 100644 --- a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/subcategorizer.dart +++ b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/subcategorizer.dart @@ -6,9 +6,8 @@ // // SPDX-License-Identifier: EUPL-1.2 -import 'package:hausaufgabenheft_logik/src/models/homework_list.dart'; -import 'package:hausaufgabenheft_logik/src/open_homeworks/views/homework_section_view.dart'; +import 'package:hausaufgabenheft_logik/hausaufgabenheft_logik.dart'; abstract class Subcategorizer { - List subcategorize(HomeworkList homeworks); + List subcategorize(List homeworks); } diff --git a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/subject_subcategorizer.dart b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/subject_subcategorizer.dart index f38bc09ad..79c3d891b 100644 --- a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/subject_subcategorizer.dart +++ b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/subject_subcategorizer.dart @@ -18,7 +18,7 @@ class SubjectSubcategeorizer extends Subcategorizer { SubjectSubcategeorizer(this._viewFactory); @override - List subcategorize(HomeworkList homeworks) { + List subcategorize(List homeworks) { final subjects = homeworks.getDistinctOrderedSubjects(); final homeworkSections = []; for (final subject in subjects) { diff --git a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/todo_date_subcategorizer.dart b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/todo_date_subcategorizer.dart index 29e6caf88..4f8ab8711 100644 --- a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/todo_date_subcategorizer.dart +++ b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/todo_date_subcategorizer.dart @@ -7,7 +7,6 @@ // SPDX-License-Identifier: EUPL-1.2 import 'package:hausaufgabenheft_logik/hausaufgabenheft_logik.dart'; -import 'package:hausaufgabenheft_logik/src/models/homework_list.dart'; import 'package:hausaufgabenheft_logik/src/views/student_homework_view_factory.dart'; import 'subcategorizer.dart'; @@ -19,7 +18,7 @@ class TodoDateSubcategorizer extends Subcategorizer { TodoDateSubcategorizer(this.currentDate, this._viewFactory); @override - List subcategorize(HomeworkList homeworks) { + List subcategorize(List homeworks) { final latestHomeworkList = homeworks; final now = currentDate; final tomorrow = now.addDays(1); diff --git a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/views/open_homework_list_view_factory.dart b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/views/open_homework_list_view_factory.dart index 60fdbb739..e05c878cf 100644 --- a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/views/open_homework_list_view_factory.dart +++ b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/views/open_homework_list_view_factory.dart @@ -24,8 +24,8 @@ class OpenHomeworkListViewFactory { OpenHomeworkListView create( List openHomeworks, Sort sort) { - final homeworkSectionViews = _sortAndSubcategorizer.sortAndSubcategorize( - openHomeworks as HomeworkList, sort); + final homeworkSectionViews = + _sortAndSubcategorizer.sortAndSubcategorize(openHomeworks, sort); final showCompleteOverdueHomeworkPrompt = _shouldShowCompleteOverdueHomeworkPrompt(openHomeworks); @@ -37,7 +37,8 @@ class OpenHomeworkListViewFactory { ); } - bool _shouldShowCompleteOverdueHomeworkPrompt(HomeworkList openHomeworks) { + bool _shouldShowCompleteOverdueHomeworkPrompt( + List openHomeworks) { var now = _getCurrentDate(); var overdueOpenHomeworks = openHomeworks.getOverdue(now); return overdueOpenHomeworks.length > 2; diff --git a/lib/hausaufgabenheft_logik/test/homework_list_test.dart b/lib/hausaufgabenheft_logik/test/homework_list_test.dart index aaa5c09d7..58402249a 100644 --- a/lib/hausaufgabenheft_logik/test/homework_list_test.dart +++ b/lib/hausaufgabenheft_logik/test/homework_list_test.dart @@ -17,7 +17,7 @@ import 'create_homework_util.dart'; import 'test_data/homeworks.dart'; void main() { - group('HomeworkList', () { + group('List', () { group('sort with SubjectSmallestDateAndTitleSort', () { testSubjectSort('firstly sorts by Subject', (homeworks) => homeworks.sortWith(SubjectSmallestDateAndTitleSort())); @@ -32,7 +32,7 @@ void main() { testSort( 'integration test', - unsorted: HomeworkList(unsortedHomework), + unsorted: unsortedHomework, sorted: sortedHomeworksForSortBySubjectDateTitle, sort: (homeworks) => homeworks.sortWith(SubjectSmallestDateAndTitleSort()), @@ -52,7 +52,7 @@ void main() { testSort( 'integration test', - unsorted: HomeworkList(unsortedHomework), + unsorted: unsortedHomework, sorted: sortedHomeworksForSortByDateSubjectTitle, sort: (homeworks) => homeworks.sortWith(SmallestDateSubjectAndTitleSort()), @@ -67,7 +67,7 @@ void main() { ); final unsorted = List.from(sorted)..shuffle(); testSort('does sort titles starting with numbers by their value', - unsorted: HomeworkList(unsorted), + unsorted: unsorted, sorted: sorted, sort: (hw) => hw.sortWith(SmallestDateSubjectAndTitleSort()), skip: true); @@ -81,7 +81,7 @@ void main() { final homeworks = [ for (final subject in subjects) createHomework(subject: subject.name) ]; - final homeworkList = HomeworkList(homeworks); + final homeworkList = homeworks; final result = homeworkList.getDistinctOrderedSubjects(); @@ -91,14 +91,13 @@ void main() { void testDateSort(String title, ListCallback sort) => testSort( title, - unsorted: - HomeworkList([haDate_23_02_19, haDate_02_01_19, haDate_30_2_2020]), + unsorted: [haDate_23_02_19, haDate_02_01_19, haDate_30_2_2020], sorted: [haDate_02_01_19, haDate_23_02_19, haDate_30_2_2020], sort: sort, ); void testSort(String title, - {required HomeworkList unsorted, + {required List unsorted, required List sorted, required ListCallback sort, bool skip = false}) { @@ -110,17 +109,16 @@ void testSort(String title, void testSubjectSort(String title, ListCallback sort) => testSort( title, - unsorted: HomeworkList( - [haSubjectInformatics, haSubjectEnglish, haSubjectMaths]), + unsorted: [haSubjectInformatics, haSubjectEnglish, haSubjectMaths], sorted: [haSubjectEnglish, haSubjectInformatics, haSubjectMaths], sort: sort, ); void testTitleSort(String title, ListCallback sort) => testSort( title, - unsorted: HomeworkList([haTitleBlatt, haTitleAufgaben, haTitleClown]), + unsorted: [haTitleBlatt, haTitleAufgaben, haTitleClown], sorted: [haTitleAufgaben, haTitleBlatt, haTitleClown], sort: sort, ); -typedef ListCallback = void Function(HomeworkList); +typedef ListCallback = void Function(List); diff --git a/lib/hausaufgabenheft_logik/test/homework_page_bloc_test.dart b/lib/hausaufgabenheft_logik/test/homework_page_bloc_test.dart index a1652b449..0e3b2a757 100644 --- a/lib/hausaufgabenheft_logik/test/homework_page_bloc_test.dart +++ b/lib/hausaufgabenheft_logik/test/homework_page_bloc_test.dart @@ -507,7 +507,7 @@ HomeworkPageBloc createBloc( completionDispatcher: RepositoryHomeworkCompletionDispatcher(repository), getOpenOverdueHomeworkIds: () async { final open = await repository.openHomeworks.first; - return HomeworkList(open).getOverdue().map((hw) => hw.id).toList(); + return open.getOverdue().map((hw) => hw.id).toList(); }, keyValueStore: keyValueStore ?? InMemoryKeyValueStore(), getCurrentDateTime: getCurrentDateTime, diff --git a/lib/hausaufgabenheft_logik/test/open_homework_view_bloc_test.dart b/lib/hausaufgabenheft_logik/test/open_homework_view_bloc_test.dart index 29a683f45..de523acb5 100644 --- a/lib/hausaufgabenheft_logik/test/open_homework_view_bloc_test.dart +++ b/lib/hausaufgabenheft_logik/test/open_homework_view_bloc_test.dart @@ -8,7 +8,6 @@ import 'package:bloc/bloc.dart'; import 'package:hausaufgabenheft_logik/src/models/homework/homework.dart'; -import 'package:hausaufgabenheft_logik/src/models/homework_list.dart'; import 'package:hausaufgabenheft_logik/src/open_homeworks/open_homework_list_bloc/open_homework_list_bloc.dart' as list_bloc; import 'package:hausaufgabenheft_logik/src/open_homeworks/open_homework_view_bloc/open_homework_view_bloc.dart'; @@ -63,7 +62,7 @@ class MockOpenHomeworkListViewFactory implements OpenHomeworkListViewFactory { class MockOpenHomeworkListBloc extends Bloc implements list_bloc.OpenHomeworkListBloc { - var homeworkListToReturn = HomeworkList([]); + var homeworkListToReturn = []; MockOpenHomeworkListBloc() : super(list_bloc.Uninitialized()) { on((event, emit) { From a65e585a0b59792a3e7436b7ecfc4077d255bfae Mon Sep 17 00:00:00 2001 From: Jonas Sander <29028262+Jonas-Sander@users.noreply.github.com> Date: Mon, 27 May 2024 17:30:13 +0200 Subject: [PATCH 05/28] Clean up `Subject` --- .../lib/src/models/subject.dart | 22 +++++-------------- 1 file changed, 5 insertions(+), 17 deletions(-) diff --git a/lib/hausaufgabenheft_logik/lib/src/models/subject.dart b/lib/hausaufgabenheft_logik/lib/src/models/subject.dart index c4e367a79..cd884845b 100644 --- a/lib/hausaufgabenheft_logik/lib/src/models/subject.dart +++ b/lib/hausaufgabenheft_logik/lib/src/models/subject.dart @@ -6,33 +6,21 @@ // // SPDX-License-Identifier: EUPL-1.2 +import 'package:equatable/equatable.dart'; import 'package:hausaufgabenheft_logik/src/views/color.dart'; -class Subject { +class Subject extends Equatable { final String name; final Color? color; final String abbreviation; + @override + List get props => [name, color, abbreviation]; + Subject(this.name, {this.color, required this.abbreviation}) { if (name.isEmpty) { throw ArgumentError.value( name, 'name', "The subject name can't be empty"); } } - - @override - int get hashCode => name.hashCode; - - bool get isValid => name.isNotEmpty; - - @override - bool operator ==(other) { - return identical(this, other) || - other is Subject && name == other.name && color == other.color; - } - - @override - String toString() { - return 'Subject(name: $name, color: $color)'; - } } From 75c4c09f704ef401336d2e55c5907dbd3a247c55 Mon Sep 17 00:00:00 2001 From: Jonas Sander <29028262+Jonas-Sander@users.noreply.github.com> Date: Mon, 27 May 2024 17:30:36 +0200 Subject: [PATCH 06/28] Delete open_homework_view_bloc_test.dart --- .../test/open_homework_view_bloc_test.dart | 72 ------------------- 1 file changed, 72 deletions(-) delete mode 100644 lib/hausaufgabenheft_logik/test/open_homework_view_bloc_test.dart diff --git a/lib/hausaufgabenheft_logik/test/open_homework_view_bloc_test.dart b/lib/hausaufgabenheft_logik/test/open_homework_view_bloc_test.dart deleted file mode 100644 index de523acb5..000000000 --- a/lib/hausaufgabenheft_logik/test/open_homework_view_bloc_test.dart +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright (c) 2022 Sharezone UG (haftungsbeschränkt) -// Licensed under the EUPL-1.2-or-later. -// -// You may obtain a copy of the Licence at: -// https://joinup.ec.europa.eu/software/page/eupl -// -// SPDX-License-Identifier: EUPL-1.2 - -import 'package:bloc/bloc.dart'; -import 'package:hausaufgabenheft_logik/src/models/homework/homework.dart'; -import 'package:hausaufgabenheft_logik/src/open_homeworks/open_homework_list_bloc/open_homework_list_bloc.dart' - as list_bloc; -import 'package:hausaufgabenheft_logik/src/open_homeworks/open_homework_view_bloc/open_homework_view_bloc.dart'; -import 'package:hausaufgabenheft_logik/src/open_homeworks/sort_and_subcategorization/sort/homework_sorts.dart'; -import 'package:hausaufgabenheft_logik/src/open_homeworks/views/homework_section_view.dart'; -import 'package:hausaufgabenheft_logik/src/open_homeworks/views/open_homework_list_view.dart'; -import 'package:hausaufgabenheft_logik/src/open_homeworks/views/open_homework_list_view_factory.dart'; -import 'package:rxdart/rxdart.dart'; -import 'package:test/test.dart'; - -void main() { - group('OpenHomeworksViewBloc', () { - late OpenHomeworksViewBloc openHomeworksViewBloc; - MockOpenHomeworkListBloc mockOpenHomeworkListBloc; - late MockOpenHomeworkListViewFactory mockOpenHomeworkListViewFactory; - setUp(() { - mockOpenHomeworkListBloc = MockOpenHomeworkListBloc(); - mockOpenHomeworkListViewFactory = MockOpenHomeworkListViewFactory(); - openHomeworksViewBloc = OpenHomeworksViewBloc( - mockOpenHomeworkListBloc, mockOpenHomeworkListViewFactory); - }); - - test('returns correct homework', () async { - var sections = [const HomeworkSectionView('Some Section', [])]; - mockOpenHomeworkListViewFactory.sectionsToReturn = sections; - - openHomeworksViewBloc - .add(LoadHomeworks(SmallestDateSubjectAndTitleSort())); - - final success = - await openHomeworksViewBloc.stream.whereType().first; - expect(success.openHomeworkListView.sections, sections); - }); - }); -} - -class MockOpenHomeworkListViewFactory implements OpenHomeworkListViewFactory { - List sectionsToReturn = []; - List gotHomeworks = []; - @override - OpenHomeworkListView create( - List openHomeworks, Sort sort) { - gotHomeworks = openHomeworks; - return OpenHomeworkListView( - sectionsToReturn, - showCompleteOverdueHomeworkPrompt: true, - sorting: HomeworkSort.smallestDateSubjectAndTitle, - ); - } -} - -class MockOpenHomeworkListBloc extends Bloc - implements list_bloc.OpenHomeworkListBloc { - var homeworkListToReturn = []; - - MockOpenHomeworkListBloc() : super(list_bloc.Uninitialized()) { - on((event, emit) { - emit(list_bloc.Success(homeworkListToReturn)); - }); - } -} From b84e693b7133a569f695756e04ce84751ae95193 Mon Sep 17 00:00:00 2001 From: Jonas Sander <29028262+Jonas-Sander@users.noreply.github.com> Date: Mon, 27 May 2024 17:35:18 +0200 Subject: [PATCH 07/28] fix test failing bc of subject change --- lib/hausaufgabenheft_logik/test/homework_list_test.dart | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/hausaufgabenheft_logik/test/homework_list_test.dart b/lib/hausaufgabenheft_logik/test/homework_list_test.dart index 58402249a..c43ce6fad 100644 --- a/lib/hausaufgabenheft_logik/test/homework_list_test.dart +++ b/lib/hausaufgabenheft_logik/test/homework_list_test.dart @@ -79,7 +79,9 @@ void main() { var deutsch = Subject('Deutsch', abbreviation: 'De'); final subjects = [mathe, englisch, mathe, mathe, deutsch]; final homeworks = [ - for (final subject in subjects) createHomework(subject: subject.name) + for (final subject in subjects) + createHomework( + subject: subject.name, abbreviation: subject.abbreviation) ]; final homeworkList = homeworks; From 955536e69c63f5fbafe1d5e43c75c3a59910620e Mon Sep 17 00:00:00 2001 From: Jonas Sander <29028262+Jonas-Sander@users.noreply.github.com> Date: Mon, 27 May 2024 17:36:45 +0200 Subject: [PATCH 08/28] Clean up `Title` --- .../lib/src/models/title.dart | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/lib/hausaufgabenheft_logik/lib/src/models/title.dart b/lib/hausaufgabenheft_logik/lib/src/models/title.dart index ab23fda41..7e4d8c330 100644 --- a/lib/hausaufgabenheft_logik/lib/src/models/title.dart +++ b/lib/hausaufgabenheft_logik/lib/src/models/title.dart @@ -6,26 +6,18 @@ // // SPDX-License-Identifier: EUPL-1.2 -class Title implements Comparable { - final String value; +import 'package:equatable/equatable.dart'; - const Title(this.value); +class Title extends Equatable implements Comparable<Title> { + final String value; @override - bool operator ==(other) { - return identical(this, other) || other is Title && value == other.value; - } + List<Object> get props => [value]; - @override - int get hashCode => value.hashCode; + const Title(this.value); @override int compareTo(Title other) { return value.compareTo(other.value); } - - @override - String toString() { - return 'Title(value: $value)'; - } } From 1a9b949908f7fd15400e1e603473b8d042ca8a1b Mon Sep 17 00:00:00 2001 From: Jonas Sander <29028262+Jonas-Sander@users.noreply.github.com> Date: Mon, 27 May 2024 17:45:23 +0200 Subject: [PATCH 09/28] Clean up `Date` --- .../lib/src/models/date.dart | 68 ++++++------------- .../test/date/date_test.dart | 13 ---- 2 files changed, 19 insertions(+), 62 deletions(-) diff --git a/lib/hausaufgabenheft_logik/lib/src/models/date.dart b/lib/hausaufgabenheft_logik/lib/src/models/date.dart index c4dcc7b45..68da72aa3 100644 --- a/lib/hausaufgabenheft_logik/lib/src/models/date.dart +++ b/lib/hausaufgabenheft_logik/lib/src/models/date.dart @@ -7,12 +7,16 @@ // SPDX-License-Identifier: EUPL-1.2 import 'package:clock/clock.dart'; +import 'package:equatable/equatable.dart'; -class Date implements Comparable<Date> { +class Date extends Equatable implements Comparable<Date> { final int day; final int month; final int year; + @override + List<Object> get props => [day, month, year]; + const Date({ required this.day, required this.month, @@ -30,63 +34,29 @@ class Date implements Comparable<Date> { DateTime asDateTime() => DateTime(year, month, day, 0, 0, 0, 0, 0); - bool operator >(Date other) { - return compareTo(other) > 0; - } - - bool operator <(Date other) { - return compareTo(other) < 0; - } - - @override - bool operator ==(Object other) { - if (identical(this, other)) return true; - - return other is Date && - other.day == day && - other.month == month && - other.year == year; + Date addDays(int daysToAdd) { + final dateTime = asDateTime(); + DateTime newDateTime; + newDateTime = dateTime.add(Duration(days: daysToAdd)); + return Date.fromDateTime(newDateTime); } @override int compareTo(Date other) { - if (year > other.year) { - return 1; - } else if (year < other.year) { - return -1; + if (year.compareTo(other.year) != 0) { + return year.compareTo(other.year); + } else if (month.compareTo(other.month) != 0) { + return month.compareTo(other.month); } else { - if (month > other.month) { - return 1; - } else if (month < other.month) { - return -1; - } else { - if (day > other.day) { - return 1; - } else if (day < other.day) { - return -1; - } - return 0; - } + return day.compareTo(other.day); } } - @override - int get hashCode => day.hashCode ^ month.hashCode ^ year.hashCode; - - @override - String toString() { - return 'Date(day: $day, month: $month, year: $year)'; - } - - /// Does NOT roll over to the next month, just plain stupid addition - Date addDaysWithNoChecking(int days) { - return Date(year: year, month: month, day: day + days); + bool operator >(Date other) { + return compareTo(other) > 0; } - Date addDays(int daysToAdd) { - final dateTime = asDateTime(); - DateTime newDateTime; - newDateTime = dateTime.add(Duration(days: daysToAdd)); - return Date.fromDateTime(newDateTime); + bool operator <(Date other) { + return compareTo(other) < 0; } } diff --git a/lib/hausaufgabenheft_logik/test/date/date_test.dart b/lib/hausaufgabenheft_logik/test/date/date_test.dart index f1b3db911..6778063fe 100644 --- a/lib/hausaufgabenheft_logik/test/date/date_test.dart +++ b/lib/hausaufgabenheft_logik/test/date/date_test.dart @@ -23,19 +23,6 @@ void main() { final dateAsDateTime = date.asDateTime(); expect(dateAsDateTime, DateTime(2019, 1, 1, 0, 0, 0, 0, 0)); }); - - test( - '.addDaysWithNoChecking adds appropiate amount of days, while not checking if the month has been exceeded', - () { - expect(const Date(year: 2019, month: 1, day: 1).addDaysWithNoChecking(1), - const Date(year: 2019, month: 1, day: 2)); - expect( - const Date(year: 2019, month: 1, day: 10).addDaysWithNoChecking(-5), - const Date(year: 2019, month: 1, day: 5)); - // Explicit: DANGER, STUPID ALGORITHM - expect(const Date(year: 2019, month: 1, day: 30).addDaysWithNoChecking(5), - const Date(year: 2019, month: 1, day: 35)); - }); test('.addDays adds day regarding the month length', () { expect(const Date(year: 2019, month: 11, day: 30).addDays(1), const Date(year: 2019, month: 12, day: 1)); // has 30 days From c61e4e1a9deedaf9a8488531756f7b28f0dc2f17 Mon Sep 17 00:00:00 2001 From: Jonas Sander <29028262+Jonas-Sander@users.noreply.github.com> Date: Mon, 27 May 2024 17:47:57 +0200 Subject: [PATCH 10/28] Move models. --- .../lib/hausaufgabenheft_logik.dart | 4 ++-- .../lib/src/data_source/homework_data_source.dart | 2 +- .../homework_completion_dispatcher.dart | 2 +- .../lib/src/lehrer/teacher_homework_read_model.dart | 4 ++-- .../lib/src/lehrer/teacher_homework_view_factory.dart | 2 +- .../lib/src/models/{homework => }/homework.dart | 8 ++++---- .../models/{homework => }/homework_completion_status.dart | 0 .../lib/src/models/homework_list.dart | 4 ++-- .../models/{homework => }/models_used_by_homework.dart | 6 +++--- .../open_homeworks/open_homework_view_bloc/events.dart | 2 +- .../open_homework_view_bloc/open_homework_view_bloc.dart | 2 +- .../sort/smallest_date_subject_and_title_sort.dart | 2 +- .../sort/src/homework_attribute_sorts.dart | 2 +- .../sort/subject_smallest_date_and_title_sort.dart | 2 +- .../sort_and_subcategorizer.dart | 2 +- .../src/open_homeworks/views/homework_section_view.dart | 2 +- .../views/open_homework_list_view_factory.dart | 4 ++-- .../lib/src/setup/create_homework_page_bloc.dart | 2 +- .../lib/src/views/student_homework_view_factory.dart | 4 ++-- lib/hausaufgabenheft_logik/test/create_homework_util.dart | 4 ++-- .../test/create_student_homework_view_test.dart | 4 ++-- lib/hausaufgabenheft_logik/test/homework_list_test.dart | 4 ++-- .../realtime_completed_homework_loader.dart | 2 +- lib/hausaufgabenheft_logik/test/test_data/homeworks.dart | 2 +- 24 files changed, 36 insertions(+), 36 deletions(-) rename lib/hausaufgabenheft_logik/lib/src/models/{homework => }/homework.dart (92%) rename lib/hausaufgabenheft_logik/lib/src/models/{homework => }/homework_completion_status.dart (100%) rename lib/hausaufgabenheft_logik/lib/src/models/{homework => }/models_used_by_homework.dart (80%) diff --git a/lib/hausaufgabenheft_logik/lib/hausaufgabenheft_logik.dart b/lib/hausaufgabenheft_logik/lib/hausaufgabenheft_logik.dart index 117e4fb0d..77e0e91f3 100644 --- a/lib/hausaufgabenheft_logik/lib/hausaufgabenheft_logik.dart +++ b/lib/hausaufgabenheft_logik/lib/hausaufgabenheft_logik.dart @@ -42,8 +42,8 @@ library hausaufgabenheft_logik; export 'src/student_homework_page_bloc/events.dart'; export 'src/student_homework_page_bloc/student_homework_page_bloc.dart'; export 'src/student_homework_page_bloc/states.dart'; -export 'src/models/homework/homework.dart'; -export 'src/models/homework/models_used_by_homework.dart'; +export 'src/models/homework.dart'; +export 'src/models/models_used_by_homework.dart'; export 'src/open_homeworks/sort_and_subcategorization/sort/smallest_date_subject_and_title_sort.dart'; export 'src/open_homeworks/sort_and_subcategorization/sort/src/sort.dart'; export 'src/open_homeworks/sort_and_subcategorization/sort/subject_smallest_date_and_title_sort.dart'; diff --git a/lib/hausaufgabenheft_logik/lib/src/data_source/homework_data_source.dart b/lib/hausaufgabenheft_logik/lib/src/data_source/homework_data_source.dart index 38d93339d..8c0af7f37 100644 --- a/lib/hausaufgabenheft_logik/lib/src/data_source/homework_data_source.dart +++ b/lib/hausaufgabenheft_logik/lib/src/data_source/homework_data_source.dart @@ -6,7 +6,7 @@ // // SPDX-License-Identifier: EUPL-1.2 -import 'package:hausaufgabenheft_logik/src/models/homework/homework.dart'; +import 'package:hausaufgabenheft_logik/src/models/homework.dart'; import 'package:collection/collection.dart' show DeepCollectionEquality; abstract class HomeworkDataSource { diff --git a/lib/hausaufgabenheft_logik/lib/src/homework_completion/homework_completion_dispatcher.dart b/lib/hausaufgabenheft_logik/lib/src/homework_completion/homework_completion_dispatcher.dart index 82adc8444..a2b8d2437 100644 --- a/lib/hausaufgabenheft_logik/lib/src/homework_completion/homework_completion_dispatcher.dart +++ b/lib/hausaufgabenheft_logik/lib/src/homework_completion/homework_completion_dispatcher.dart @@ -7,7 +7,7 @@ // SPDX-License-Identifier: EUPL-1.2 import 'package:common_domain_models/common_domain_models.dart'; -import 'package:hausaufgabenheft_logik/src/models/homework/homework_completion_status.dart'; +import 'package:hausaufgabenheft_logik/src/models/homework_completion_status.dart'; /// The boundary to the outer world. /// The only purpose for this class is to change the completion status of a diff --git a/lib/hausaufgabenheft_logik/lib/src/lehrer/teacher_homework_read_model.dart b/lib/hausaufgabenheft_logik/lib/src/lehrer/teacher_homework_read_model.dart index 2047a396a..a800dfbfe 100644 --- a/lib/hausaufgabenheft_logik/lib/src/lehrer/teacher_homework_read_model.dart +++ b/lib/hausaufgabenheft_logik/lib/src/lehrer/teacher_homework_read_model.dart @@ -7,8 +7,8 @@ // SPDX-License-Identifier: EUPL-1.2 import 'package:common_domain_models/common_domain_models.dart'; -import 'package:hausaufgabenheft_logik/src/models/homework/homework.dart'; -import 'package:hausaufgabenheft_logik/src/models/homework/models_used_by_homework.dart'; +import 'package:hausaufgabenheft_logik/src/models/homework.dart'; +import 'package:hausaufgabenheft_logik/src/models/models_used_by_homework.dart'; /// Ein ReadModel für die Lehrer-Hausaufgaben-Seite. /// Siehe [HomeworkReadModel]. diff --git a/lib/hausaufgabenheft_logik/lib/src/lehrer/teacher_homework_view_factory.dart b/lib/hausaufgabenheft_logik/lib/src/lehrer/teacher_homework_view_factory.dart index e5525edf9..886b3a21c 100644 --- a/lib/hausaufgabenheft_logik/lib/src/lehrer/teacher_homework_view_factory.dart +++ b/lib/hausaufgabenheft_logik/lib/src/lehrer/teacher_homework_view_factory.dart @@ -6,7 +6,7 @@ // // SPDX-License-Identifier: EUPL-1.2 -import 'package:hausaufgabenheft_logik/src/models/homework/models_used_by_homework.dart'; +import 'package:hausaufgabenheft_logik/src/models/models_used_by_homework.dart'; import 'package:hausaufgabenheft_logik/src/views/color.dart'; import '../../hausaufgabenheft_logik_lehrer.dart'; diff --git a/lib/hausaufgabenheft_logik/lib/src/models/homework/homework.dart b/lib/hausaufgabenheft_logik/lib/src/models/homework.dart similarity index 92% rename from lib/hausaufgabenheft_logik/lib/src/models/homework/homework.dart rename to lib/hausaufgabenheft_logik/lib/src/models/homework.dart index 4e7bafc50..87f55175f 100644 --- a/lib/hausaufgabenheft_logik/lib/src/models/homework/homework.dart +++ b/lib/hausaufgabenheft_logik/lib/src/models/homework.dart @@ -7,11 +7,11 @@ // SPDX-License-Identifier: EUPL-1.2 import 'package:common_domain_models/common_domain_models.dart'; -import 'package:hausaufgabenheft_logik/src/models/homework/homework_completion_status.dart'; +import 'package:hausaufgabenheft_logik/src/models/homework_completion_status.dart'; -import '../date.dart'; -import '../subject.dart'; -import '../title.dart'; +import 'date.dart'; +import 'subject.dart'; +import 'title.dart'; /// The read model of a Homework that is specific to one user. /// The Homework should only be used to display a homework, created specifically diff --git a/lib/hausaufgabenheft_logik/lib/src/models/homework/homework_completion_status.dart b/lib/hausaufgabenheft_logik/lib/src/models/homework_completion_status.dart similarity index 100% rename from lib/hausaufgabenheft_logik/lib/src/models/homework/homework_completion_status.dart rename to lib/hausaufgabenheft_logik/lib/src/models/homework_completion_status.dart diff --git a/lib/hausaufgabenheft_logik/lib/src/models/homework_list.dart b/lib/hausaufgabenheft_logik/lib/src/models/homework_list.dart index 8c1d77536..6b6fd9374 100644 --- a/lib/hausaufgabenheft_logik/lib/src/models/homework_list.dart +++ b/lib/hausaufgabenheft_logik/lib/src/models/homework_list.dart @@ -6,11 +6,11 @@ // // SPDX-License-Identifier: EUPL-1.2 -import 'package:hausaufgabenheft_logik/src/models/homework/homework_completion_status.dart'; +import 'package:hausaufgabenheft_logik/src/models/homework_completion_status.dart'; import '../open_homeworks/sort_and_subcategorization/sort/src/sort.dart'; import 'date.dart'; -import 'homework/homework.dart'; +import 'homework.dart'; import 'subject.dart'; extension SortWith<T> on List<T> { diff --git a/lib/hausaufgabenheft_logik/lib/src/models/homework/models_used_by_homework.dart b/lib/hausaufgabenheft_logik/lib/src/models/models_used_by_homework.dart similarity index 80% rename from lib/hausaufgabenheft_logik/lib/src/models/homework/models_used_by_homework.dart rename to lib/hausaufgabenheft_logik/lib/src/models/models_used_by_homework.dart index 5cceec335..bec948fa5 100644 --- a/lib/hausaufgabenheft_logik/lib/src/models/homework/models_used_by_homework.dart +++ b/lib/hausaufgabenheft_logik/lib/src/models/models_used_by_homework.dart @@ -8,7 +8,7 @@ library models; -export '../date.dart'; -export '../subject.dart'; -export '../title.dart'; +export 'date.dart'; +export 'subject.dart'; +export 'title.dart'; export 'homework_completion_status.dart'; diff --git a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/open_homework_view_bloc/events.dart b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/open_homework_view_bloc/events.dart index 4edcaf79e..bd89f8bcd 100644 --- a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/open_homework_view_bloc/events.dart +++ b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/open_homework_view_bloc/events.dart @@ -7,7 +7,7 @@ // SPDX-License-Identifier: EUPL-1.2 import 'package:equatable/equatable.dart'; -import 'package:hausaufgabenheft_logik/src/models/homework/homework.dart'; +import 'package:hausaufgabenheft_logik/src/models/homework.dart'; import 'package:hausaufgabenheft_logik/src/open_homeworks/sort_and_subcategorization/sort/src/sort.dart'; abstract class OpenHomeworkViewEvent extends Equatable {} diff --git a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/open_homework_view_bloc/open_homework_view_bloc.dart b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/open_homework_view_bloc/open_homework_view_bloc.dart index 82f7370aa..4fa9c0f87 100644 --- a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/open_homework_view_bloc/open_homework_view_bloc.dart +++ b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/open_homework_view_bloc/open_homework_view_bloc.dart @@ -10,7 +10,7 @@ import 'dart:async'; import 'package:bloc/bloc.dart'; import 'package:bloc_base/bloc_base.dart' as bloc_base; -import 'package:hausaufgabenheft_logik/src/models/homework/homework.dart'; +import 'package:hausaufgabenheft_logik/src/models/homework.dart'; import 'package:hausaufgabenheft_logik/src/open_homeworks/open_homework_list_bloc/open_homework_list_bloc.dart' as hws_bloc; import 'package:hausaufgabenheft_logik/src/open_homeworks/sort_and_subcategorization/sort/src/sort.dart'; diff --git a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort/smallest_date_subject_and_title_sort.dart b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort/smallest_date_subject_and_title_sort.dart index 96f5b3f43..7631dd384 100644 --- a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort/smallest_date_subject_and_title_sort.dart +++ b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort/smallest_date_subject_and_title_sort.dart @@ -6,7 +6,7 @@ // // SPDX-License-Identifier: EUPL-1.2 -import '../../../models/homework/homework.dart'; +import '../../../models/homework.dart'; import '../../../models/date.dart'; import 'src/sort.dart'; import 'src/sort_with_operations.dart'; diff --git a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort/src/homework_attribute_sorts.dart b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort/src/homework_attribute_sorts.dart index c3f88e697..90d692fa8 100644 --- a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort/src/homework_attribute_sorts.dart +++ b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort/src/homework_attribute_sorts.dart @@ -6,7 +6,7 @@ // // SPDX-License-Identifier: EUPL-1.2 -import 'package:hausaufgabenheft_logik/src/models/homework/homework.dart'; +import 'package:hausaufgabenheft_logik/src/models/homework.dart'; import 'sort_with_operations.dart'; diff --git a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort/subject_smallest_date_and_title_sort.dart b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort/subject_smallest_date_and_title_sort.dart index 79b5a2cbd..5901c9cc2 100644 --- a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort/subject_smallest_date_and_title_sort.dart +++ b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort/subject_smallest_date_and_title_sort.dart @@ -6,7 +6,7 @@ // // SPDX-License-Identifier: EUPL-1.2 -import '../../../models/homework/homework.dart'; +import '../../../models/homework.dart'; import 'src/sort.dart'; import 'src/sort_with_operations.dart'; import 'src/homework_attribute_sorts.dart'; diff --git a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort_and_subcategorizer.dart b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort_and_subcategorizer.dart index 6cd3cb73d..ee1f3bc82 100644 --- a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort_and_subcategorizer.dart +++ b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort_and_subcategorizer.dart @@ -8,7 +8,7 @@ import 'package:hausaufgabenheft_logik/src/models/homework_list.dart'; import 'package:hausaufgabenheft_logik/src/open_homeworks/sort_and_subcategorization/sort/src/sort.dart'; -import 'package:hausaufgabenheft_logik/src/models/homework/homework.dart'; +import 'package:hausaufgabenheft_logik/src/models/homework.dart'; import 'package:hausaufgabenheft_logik/src/open_homeworks/views/homework_section_view.dart'; import 'subcategorizer.dart'; diff --git a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/views/homework_section_view.dart b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/views/homework_section_view.dart index 6b9c0b11d..869e03551 100644 --- a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/views/homework_section_view.dart +++ b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/views/homework_section_view.dart @@ -7,7 +7,7 @@ // SPDX-License-Identifier: EUPL-1.2 import 'package:equatable/equatable.dart'; -import 'package:hausaufgabenheft_logik/src/models/homework/homework.dart'; +import 'package:hausaufgabenheft_logik/src/models/homework.dart'; import '../../views/homework_view.dart'; import '../../views/student_homework_view_factory.dart'; diff --git a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/views/open_homework_list_view_factory.dart b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/views/open_homework_list_view_factory.dart index e05c878cf..962c367a6 100644 --- a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/views/open_homework_list_view_factory.dart +++ b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/views/open_homework_list_view_factory.dart @@ -6,8 +6,8 @@ // // SPDX-License-Identifier: EUPL-1.2 -import 'package:hausaufgabenheft_logik/src/models/homework/homework.dart'; -import 'package:hausaufgabenheft_logik/src/models/homework/models_used_by_homework.dart'; +import 'package:hausaufgabenheft_logik/src/models/homework.dart'; +import 'package:hausaufgabenheft_logik/src/models/models_used_by_homework.dart'; import 'package:hausaufgabenheft_logik/src/models/homework_list.dart'; import 'package:hausaufgabenheft_logik/src/open_homeworks/sort_and_subcategorization/sort/src/sort.dart'; import 'package:hausaufgabenheft_logik/src/open_homeworks/sort_and_subcategorization/sort_and_subcategorizer.dart'; diff --git a/lib/hausaufgabenheft_logik/lib/src/setup/create_homework_page_bloc.dart b/lib/hausaufgabenheft_logik/lib/src/setup/create_homework_page_bloc.dart index cfac84e32..0a5f40865 100644 --- a/lib/hausaufgabenheft_logik/lib/src/setup/create_homework_page_bloc.dart +++ b/lib/hausaufgabenheft_logik/lib/src/setup/create_homework_page_bloc.dart @@ -15,7 +15,7 @@ import 'package:hausaufgabenheft_logik/src/student_homework_page_bloc/homework_s import '../completed_homeworks/completed_homeworks_view_bloc/completed_homeworks_view_bloc.dart'; import '../completed_homeworks/lazy_loading_completed_homeworks_bloc/lazy_loading_completed_homeworks_bloc.dart'; import '../completed_homeworks/views/completed_homework_list_view_factory.dart'; -import '../models/homework/models_used_by_homework.dart'; +import '../models/models_used_by_homework.dart'; import '../open_homeworks/sort_and_subcategorization/sort_and_subcategorizer.dart'; import '../open_homeworks/sort_and_subcategorization/subcategorizer_factory.dart'; import '../open_homeworks/views/open_homework_list_view_factory.dart'; diff --git a/lib/hausaufgabenheft_logik/lib/src/views/student_homework_view_factory.dart b/lib/hausaufgabenheft_logik/lib/src/views/student_homework_view_factory.dart index d507d6371..bcba98a1d 100644 --- a/lib/hausaufgabenheft_logik/lib/src/views/student_homework_view_factory.dart +++ b/lib/hausaufgabenheft_logik/lib/src/views/student_homework_view_factory.dart @@ -6,8 +6,8 @@ // // SPDX-License-Identifier: EUPL-1.2 -import 'package:hausaufgabenheft_logik/src/models/homework/homework.dart'; -import 'package:hausaufgabenheft_logik/src/models/homework/models_used_by_homework.dart'; +import 'package:hausaufgabenheft_logik/src/models/homework.dart'; +import 'package:hausaufgabenheft_logik/src/models/models_used_by_homework.dart'; import 'package:hausaufgabenheft_logik/src/views/color.dart'; import 'package:hausaufgabenheft_logik/src/views/homework_view.dart'; diff --git a/lib/hausaufgabenheft_logik/test/create_homework_util.dart b/lib/hausaufgabenheft_logik/test/create_homework_util.dart index 6aa2d2631..1edad6c75 100644 --- a/lib/hausaufgabenheft_logik/test/create_homework_util.dart +++ b/lib/hausaufgabenheft_logik/test/create_homework_util.dart @@ -7,8 +7,8 @@ // SPDX-License-Identifier: EUPL-1.2 import 'package:common_domain_models/common_domain_models.dart'; -import 'package:hausaufgabenheft_logik/src/models/homework/homework.dart'; -import 'package:hausaufgabenheft_logik/src/models/homework/models_used_by_homework.dart'; +import 'package:hausaufgabenheft_logik/src/models/homework.dart'; +import 'package:hausaufgabenheft_logik/src/models/models_used_by_homework.dart'; import 'package:hausaufgabenheft_logik/src/views/color.dart'; import 'package:test_randomness/test_randomness.dart'; diff --git a/lib/hausaufgabenheft_logik/test/create_student_homework_view_test.dart b/lib/hausaufgabenheft_logik/test/create_student_homework_view_test.dart index cdbc3642e..704d7f5ce 100644 --- a/lib/hausaufgabenheft_logik/test/create_student_homework_view_test.dart +++ b/lib/hausaufgabenheft_logik/test/create_student_homework_view_test.dart @@ -7,8 +7,8 @@ // SPDX-License-Identifier: EUPL-1.2 import 'package:common_domain_models/common_domain_models.dart'; -import 'package:hausaufgabenheft_logik/src/models/homework/homework.dart'; -import 'package:hausaufgabenheft_logik/src/models/homework/models_used_by_homework.dart'; +import 'package:hausaufgabenheft_logik/src/models/homework.dart'; +import 'package:hausaufgabenheft_logik/src/models/models_used_by_homework.dart'; import 'package:hausaufgabenheft_logik/src/views/color.dart'; import 'package:hausaufgabenheft_logik/src/views/student_homework_view_factory.dart'; import 'package:hausaufgabenheft_logik/src/views/homework_view.dart'; diff --git a/lib/hausaufgabenheft_logik/test/homework_list_test.dart b/lib/hausaufgabenheft_logik/test/homework_list_test.dart index c43ce6fad..00ed0adbc 100644 --- a/lib/hausaufgabenheft_logik/test/homework_list_test.dart +++ b/lib/hausaufgabenheft_logik/test/homework_list_test.dart @@ -6,8 +6,8 @@ // // SPDX-License-Identifier: EUPL-1.2 -import 'package:hausaufgabenheft_logik/src/models/homework/homework.dart'; -import 'package:hausaufgabenheft_logik/src/models/homework/models_used_by_homework.dart'; +import 'package:hausaufgabenheft_logik/src/models/homework.dart'; +import 'package:hausaufgabenheft_logik/src/models/models_used_by_homework.dart'; import 'package:hausaufgabenheft_logik/src/models/homework_list.dart'; import 'package:hausaufgabenheft_logik/src/open_homeworks/sort_and_subcategorization/sort/smallest_date_subject_and_title_sort.dart'; import 'package:hausaufgabenheft_logik/src/open_homeworks/sort_and_subcategorization/sort/subject_smallest_date_and_title_sort.dart'; diff --git a/lib/hausaufgabenheft_logik/test/in_memory_repo/realtime_completed_homework_loader.dart b/lib/hausaufgabenheft_logik/test/in_memory_repo/realtime_completed_homework_loader.dart index 0bfa89cbe..54472c9da 100644 --- a/lib/hausaufgabenheft_logik/test/in_memory_repo/realtime_completed_homework_loader.dart +++ b/lib/hausaufgabenheft_logik/test/in_memory_repo/realtime_completed_homework_loader.dart @@ -6,7 +6,7 @@ // // SPDX-License-Identifier: EUPL-1.2 -import 'package:hausaufgabenheft_logik/src/models/homework/homework.dart'; +import 'package:hausaufgabenheft_logik/src/models/homework.dart'; abstract class RealtimeCompletedHomeworkLoader { Stream<List<HomeworkReadModel>> loadMostRecentHomeworks( diff --git a/lib/hausaufgabenheft_logik/test/test_data/homeworks.dart b/lib/hausaufgabenheft_logik/test/test_data/homeworks.dart index a8fe1b040..e1a1a42aa 100644 --- a/lib/hausaufgabenheft_logik/test/test_data/homeworks.dart +++ b/lib/hausaufgabenheft_logik/test/test_data/homeworks.dart @@ -6,7 +6,7 @@ // // SPDX-License-Identifier: EUPL-1.2 -import 'package:hausaufgabenheft_logik/src/models/homework/models_used_by_homework.dart'; +import 'package:hausaufgabenheft_logik/src/models/models_used_by_homework.dart'; import '../create_homework_util.dart'; From 65b0461404ff3c2d6a3114d7a9e6b6af6039d934 Mon Sep 17 00:00:00 2001 From: Jonas Sander <29028262+Jonas-Sander@users.noreply.github.com> Date: Mon, 27 May 2024 17:49:21 +0200 Subject: [PATCH 11/28] Create `homework_list_extensions.dart` --- .../lib/hausaufgabenheft_logik.dart | 1 + .../homework_list.dart => homework_list_extensions.dart} | 8 ++++---- .../sort_and_subcategorizer.dart | 2 +- .../subject_subcategorizer.dart | 1 - .../views/open_homework_list_view_factory.dart | 2 +- lib/hausaufgabenheft_logik/test/homework_list_test.dart | 2 +- .../test/homework_page_bloc_test.dart | 1 - 7 files changed, 8 insertions(+), 9 deletions(-) rename lib/hausaufgabenheft_logik/lib/src/{models/homework_list.dart => homework_list_extensions.dart} (87%) diff --git a/lib/hausaufgabenheft_logik/lib/hausaufgabenheft_logik.dart b/lib/hausaufgabenheft_logik/lib/hausaufgabenheft_logik.dart index 77e0e91f3..3c01829bf 100644 --- a/lib/hausaufgabenheft_logik/lib/hausaufgabenheft_logik.dart +++ b/lib/hausaufgabenheft_logik/lib/hausaufgabenheft_logik.dart @@ -54,3 +54,4 @@ export 'src/views/homework_view.dart'; export 'src/open_homeworks/views/homework_section_view.dart'; export 'src/data_source/homework_data_source.dart'; export 'src/homework_completion/homework_completion_dispatcher.dart'; +export 'src/homework_list_extensions.dart'; diff --git a/lib/hausaufgabenheft_logik/lib/src/models/homework_list.dart b/lib/hausaufgabenheft_logik/lib/src/homework_list_extensions.dart similarity index 87% rename from lib/hausaufgabenheft_logik/lib/src/models/homework_list.dart rename to lib/hausaufgabenheft_logik/lib/src/homework_list_extensions.dart index 6b6fd9374..e98f1601d 100644 --- a/lib/hausaufgabenheft_logik/lib/src/models/homework_list.dart +++ b/lib/hausaufgabenheft_logik/lib/src/homework_list_extensions.dart @@ -8,10 +8,10 @@ import 'package:hausaufgabenheft_logik/src/models/homework_completion_status.dart'; -import '../open_homeworks/sort_and_subcategorization/sort/src/sort.dart'; -import 'date.dart'; -import 'homework.dart'; -import 'subject.dart'; +import 'open_homeworks/sort_and_subcategorization/sort/src/sort.dart'; +import 'models/date.dart'; +import 'models/homework.dart'; +import 'models/subject.dart'; extension SortWith<T> on List<T> { void sortWith(Sort<T> sort) { diff --git a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort_and_subcategorizer.dart b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort_and_subcategorizer.dart index ee1f3bc82..ffaaa9c33 100644 --- a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort_and_subcategorizer.dart +++ b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort_and_subcategorizer.dart @@ -6,7 +6,7 @@ // // SPDX-License-Identifier: EUPL-1.2 -import 'package:hausaufgabenheft_logik/src/models/homework_list.dart'; +import 'package:hausaufgabenheft_logik/src/homework_list_extensions.dart'; import 'package:hausaufgabenheft_logik/src/open_homeworks/sort_and_subcategorization/sort/src/sort.dart'; import 'package:hausaufgabenheft_logik/src/models/homework.dart'; import 'package:hausaufgabenheft_logik/src/open_homeworks/views/homework_section_view.dart'; diff --git a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/subject_subcategorizer.dart b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/subject_subcategorizer.dart index 79c3d891b..bbaa22998 100644 --- a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/subject_subcategorizer.dart +++ b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/subject_subcategorizer.dart @@ -7,7 +7,6 @@ // SPDX-License-Identifier: EUPL-1.2 import 'package:hausaufgabenheft_logik/hausaufgabenheft_logik.dart'; -import 'package:hausaufgabenheft_logik/src/models/homework_list.dart'; import 'package:hausaufgabenheft_logik/src/views/student_homework_view_factory.dart'; import 'subcategorizer.dart'; diff --git a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/views/open_homework_list_view_factory.dart b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/views/open_homework_list_view_factory.dart index 962c367a6..5a55f975b 100644 --- a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/views/open_homework_list_view_factory.dart +++ b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/views/open_homework_list_view_factory.dart @@ -8,7 +8,7 @@ import 'package:hausaufgabenheft_logik/src/models/homework.dart'; import 'package:hausaufgabenheft_logik/src/models/models_used_by_homework.dart'; -import 'package:hausaufgabenheft_logik/src/models/homework_list.dart'; +import 'package:hausaufgabenheft_logik/src/homework_list_extensions.dart'; import 'package:hausaufgabenheft_logik/src/open_homeworks/sort_and_subcategorization/sort/src/sort.dart'; import 'package:hausaufgabenheft_logik/src/open_homeworks/sort_and_subcategorization/sort_and_subcategorizer.dart'; import 'package:hausaufgabenheft_logik/src/open_homeworks/sort_and_subcategorization/sort/src/homework_sort_enum_sort_object_conversion_extensions.dart'; diff --git a/lib/hausaufgabenheft_logik/test/homework_list_test.dart b/lib/hausaufgabenheft_logik/test/homework_list_test.dart index 00ed0adbc..adb02b958 100644 --- a/lib/hausaufgabenheft_logik/test/homework_list_test.dart +++ b/lib/hausaufgabenheft_logik/test/homework_list_test.dart @@ -8,7 +8,7 @@ import 'package:hausaufgabenheft_logik/src/models/homework.dart'; import 'package:hausaufgabenheft_logik/src/models/models_used_by_homework.dart'; -import 'package:hausaufgabenheft_logik/src/models/homework_list.dart'; +import 'package:hausaufgabenheft_logik/src/homework_list_extensions.dart'; import 'package:hausaufgabenheft_logik/src/open_homeworks/sort_and_subcategorization/sort/smallest_date_subject_and_title_sort.dart'; import 'package:hausaufgabenheft_logik/src/open_homeworks/sort_and_subcategorization/sort/subject_smallest_date_and_title_sort.dart'; import 'package:test/test.dart'; diff --git a/lib/hausaufgabenheft_logik/test/homework_page_bloc_test.dart b/lib/hausaufgabenheft_logik/test/homework_page_bloc_test.dart index 0e3b2a757..9865ebec1 100644 --- a/lib/hausaufgabenheft_logik/test/homework_page_bloc_test.dart +++ b/lib/hausaufgabenheft_logik/test/homework_page_bloc_test.dart @@ -18,7 +18,6 @@ import 'package:hausaufgabenheft_logik/src/completed_homeworks/completed_homewor import 'package:hausaufgabenheft_logik/src/completed_homeworks/lazy_loading_completed_homeworks_bloc/lazy_loading_completed_homeworks_bloc.dart' as lazy_loading; import 'package:hausaufgabenheft_logik/src/completed_homeworks/views/completed_homework_list_view_factory.dart'; -import 'package:hausaufgabenheft_logik/src/models/homework_list.dart'; import 'package:hausaufgabenheft_logik/src/student_homework_page_bloc/homework_sorting_cache.dart'; import 'package:hausaufgabenheft_logik/src/views/color.dart'; import 'package:hausaufgabenheft_logik/src/views/student_homework_view_factory.dart'; From 512710961bb41d40355d17cf4b88fa0cdc580911 Mon Sep 17 00:00:00 2001 From: Jonas Sander <29028262+Jonas-Sander@users.noreply.github.com> Date: Mon, 27 May 2024 17:51:09 +0200 Subject: [PATCH 12/28] Rename ot modles.dart --- lib/hausaufgabenheft_logik/lib/hausaufgabenheft_logik.dart | 2 +- .../lib/src/lehrer/teacher_homework_read_model.dart | 2 +- .../lib/src/lehrer/teacher_homework_view_factory.dart | 2 +- .../src/models/{models_used_by_homework.dart => models.dart} | 2 -- .../open_homeworks/views/open_homework_list_view_factory.dart | 2 +- .../lib/src/setup/create_homework_page_bloc.dart | 2 +- .../lib/src/views/student_homework_view_factory.dart | 2 +- lib/hausaufgabenheft_logik/test/create_homework_util.dart | 2 +- .../test/create_student_homework_view_test.dart | 2 +- lib/hausaufgabenheft_logik/test/homework_list_test.dart | 2 +- lib/hausaufgabenheft_logik/test/test_data/homeworks.dart | 2 +- 11 files changed, 10 insertions(+), 12 deletions(-) rename lib/hausaufgabenheft_logik/lib/src/models/{models_used_by_homework.dart => models.dart} (95%) diff --git a/lib/hausaufgabenheft_logik/lib/hausaufgabenheft_logik.dart b/lib/hausaufgabenheft_logik/lib/hausaufgabenheft_logik.dart index 3c01829bf..23dc99565 100644 --- a/lib/hausaufgabenheft_logik/lib/hausaufgabenheft_logik.dart +++ b/lib/hausaufgabenheft_logik/lib/hausaufgabenheft_logik.dart @@ -43,7 +43,7 @@ export 'src/student_homework_page_bloc/events.dart'; export 'src/student_homework_page_bloc/student_homework_page_bloc.dart'; export 'src/student_homework_page_bloc/states.dart'; export 'src/models/homework.dart'; -export 'src/models/models_used_by_homework.dart'; +export 'src/models/models.dart'; export 'src/open_homeworks/sort_and_subcategorization/sort/smallest_date_subject_and_title_sort.dart'; export 'src/open_homeworks/sort_and_subcategorization/sort/src/sort.dart'; export 'src/open_homeworks/sort_and_subcategorization/sort/subject_smallest_date_and_title_sort.dart'; diff --git a/lib/hausaufgabenheft_logik/lib/src/lehrer/teacher_homework_read_model.dart b/lib/hausaufgabenheft_logik/lib/src/lehrer/teacher_homework_read_model.dart index a800dfbfe..a9dc1d8c6 100644 --- a/lib/hausaufgabenheft_logik/lib/src/lehrer/teacher_homework_read_model.dart +++ b/lib/hausaufgabenheft_logik/lib/src/lehrer/teacher_homework_read_model.dart @@ -8,7 +8,7 @@ import 'package:common_domain_models/common_domain_models.dart'; import 'package:hausaufgabenheft_logik/src/models/homework.dart'; -import 'package:hausaufgabenheft_logik/src/models/models_used_by_homework.dart'; +import 'package:hausaufgabenheft_logik/src/models/models.dart'; /// Ein ReadModel für die Lehrer-Hausaufgaben-Seite. /// Siehe [HomeworkReadModel]. diff --git a/lib/hausaufgabenheft_logik/lib/src/lehrer/teacher_homework_view_factory.dart b/lib/hausaufgabenheft_logik/lib/src/lehrer/teacher_homework_view_factory.dart index 886b3a21c..d2c0cf138 100644 --- a/lib/hausaufgabenheft_logik/lib/src/lehrer/teacher_homework_view_factory.dart +++ b/lib/hausaufgabenheft_logik/lib/src/lehrer/teacher_homework_view_factory.dart @@ -6,7 +6,7 @@ // // SPDX-License-Identifier: EUPL-1.2 -import 'package:hausaufgabenheft_logik/src/models/models_used_by_homework.dart'; +import 'package:hausaufgabenheft_logik/src/models/models.dart'; import 'package:hausaufgabenheft_logik/src/views/color.dart'; import '../../hausaufgabenheft_logik_lehrer.dart'; diff --git a/lib/hausaufgabenheft_logik/lib/src/models/models_used_by_homework.dart b/lib/hausaufgabenheft_logik/lib/src/models/models.dart similarity index 95% rename from lib/hausaufgabenheft_logik/lib/src/models/models_used_by_homework.dart rename to lib/hausaufgabenheft_logik/lib/src/models/models.dart index bec948fa5..64c09e722 100644 --- a/lib/hausaufgabenheft_logik/lib/src/models/models_used_by_homework.dart +++ b/lib/hausaufgabenheft_logik/lib/src/models/models.dart @@ -6,8 +6,6 @@ // // SPDX-License-Identifier: EUPL-1.2 -library models; - export 'date.dart'; export 'subject.dart'; export 'title.dart'; diff --git a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/views/open_homework_list_view_factory.dart b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/views/open_homework_list_view_factory.dart index 5a55f975b..2ea21509e 100644 --- a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/views/open_homework_list_view_factory.dart +++ b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/views/open_homework_list_view_factory.dart @@ -7,7 +7,7 @@ // SPDX-License-Identifier: EUPL-1.2 import 'package:hausaufgabenheft_logik/src/models/homework.dart'; -import 'package:hausaufgabenheft_logik/src/models/models_used_by_homework.dart'; +import 'package:hausaufgabenheft_logik/src/models/models.dart'; import 'package:hausaufgabenheft_logik/src/homework_list_extensions.dart'; import 'package:hausaufgabenheft_logik/src/open_homeworks/sort_and_subcategorization/sort/src/sort.dart'; import 'package:hausaufgabenheft_logik/src/open_homeworks/sort_and_subcategorization/sort_and_subcategorizer.dart'; diff --git a/lib/hausaufgabenheft_logik/lib/src/setup/create_homework_page_bloc.dart b/lib/hausaufgabenheft_logik/lib/src/setup/create_homework_page_bloc.dart index 0a5f40865..33b042f16 100644 --- a/lib/hausaufgabenheft_logik/lib/src/setup/create_homework_page_bloc.dart +++ b/lib/hausaufgabenheft_logik/lib/src/setup/create_homework_page_bloc.dart @@ -15,7 +15,7 @@ import 'package:hausaufgabenheft_logik/src/student_homework_page_bloc/homework_s import '../completed_homeworks/completed_homeworks_view_bloc/completed_homeworks_view_bloc.dart'; import '../completed_homeworks/lazy_loading_completed_homeworks_bloc/lazy_loading_completed_homeworks_bloc.dart'; import '../completed_homeworks/views/completed_homework_list_view_factory.dart'; -import '../models/models_used_by_homework.dart'; +import '../models/models.dart'; import '../open_homeworks/sort_and_subcategorization/sort_and_subcategorizer.dart'; import '../open_homeworks/sort_and_subcategorization/subcategorizer_factory.dart'; import '../open_homeworks/views/open_homework_list_view_factory.dart'; diff --git a/lib/hausaufgabenheft_logik/lib/src/views/student_homework_view_factory.dart b/lib/hausaufgabenheft_logik/lib/src/views/student_homework_view_factory.dart index bcba98a1d..d8deff607 100644 --- a/lib/hausaufgabenheft_logik/lib/src/views/student_homework_view_factory.dart +++ b/lib/hausaufgabenheft_logik/lib/src/views/student_homework_view_factory.dart @@ -7,7 +7,7 @@ // SPDX-License-Identifier: EUPL-1.2 import 'package:hausaufgabenheft_logik/src/models/homework.dart'; -import 'package:hausaufgabenheft_logik/src/models/models_used_by_homework.dart'; +import 'package:hausaufgabenheft_logik/src/models/models.dart'; import 'package:hausaufgabenheft_logik/src/views/color.dart'; import 'package:hausaufgabenheft_logik/src/views/homework_view.dart'; diff --git a/lib/hausaufgabenheft_logik/test/create_homework_util.dart b/lib/hausaufgabenheft_logik/test/create_homework_util.dart index 1edad6c75..88a6028c4 100644 --- a/lib/hausaufgabenheft_logik/test/create_homework_util.dart +++ b/lib/hausaufgabenheft_logik/test/create_homework_util.dart @@ -8,7 +8,7 @@ import 'package:common_domain_models/common_domain_models.dart'; import 'package:hausaufgabenheft_logik/src/models/homework.dart'; -import 'package:hausaufgabenheft_logik/src/models/models_used_by_homework.dart'; +import 'package:hausaufgabenheft_logik/src/models/models.dart'; import 'package:hausaufgabenheft_logik/src/views/color.dart'; import 'package:test_randomness/test_randomness.dart'; diff --git a/lib/hausaufgabenheft_logik/test/create_student_homework_view_test.dart b/lib/hausaufgabenheft_logik/test/create_student_homework_view_test.dart index 704d7f5ce..5753e1885 100644 --- a/lib/hausaufgabenheft_logik/test/create_student_homework_view_test.dart +++ b/lib/hausaufgabenheft_logik/test/create_student_homework_view_test.dart @@ -8,7 +8,7 @@ import 'package:common_domain_models/common_domain_models.dart'; import 'package:hausaufgabenheft_logik/src/models/homework.dart'; -import 'package:hausaufgabenheft_logik/src/models/models_used_by_homework.dart'; +import 'package:hausaufgabenheft_logik/src/models/models.dart'; import 'package:hausaufgabenheft_logik/src/views/color.dart'; import 'package:hausaufgabenheft_logik/src/views/student_homework_view_factory.dart'; import 'package:hausaufgabenheft_logik/src/views/homework_view.dart'; diff --git a/lib/hausaufgabenheft_logik/test/homework_list_test.dart b/lib/hausaufgabenheft_logik/test/homework_list_test.dart index adb02b958..8a10e9bcc 100644 --- a/lib/hausaufgabenheft_logik/test/homework_list_test.dart +++ b/lib/hausaufgabenheft_logik/test/homework_list_test.dart @@ -7,7 +7,7 @@ // SPDX-License-Identifier: EUPL-1.2 import 'package:hausaufgabenheft_logik/src/models/homework.dart'; -import 'package:hausaufgabenheft_logik/src/models/models_used_by_homework.dart'; +import 'package:hausaufgabenheft_logik/src/models/models.dart'; import 'package:hausaufgabenheft_logik/src/homework_list_extensions.dart'; import 'package:hausaufgabenheft_logik/src/open_homeworks/sort_and_subcategorization/sort/smallest_date_subject_and_title_sort.dart'; import 'package:hausaufgabenheft_logik/src/open_homeworks/sort_and_subcategorization/sort/subject_smallest_date_and_title_sort.dart'; diff --git a/lib/hausaufgabenheft_logik/test/test_data/homeworks.dart b/lib/hausaufgabenheft_logik/test/test_data/homeworks.dart index e1a1a42aa..b6e211d7c 100644 --- a/lib/hausaufgabenheft_logik/test/test_data/homeworks.dart +++ b/lib/hausaufgabenheft_logik/test/test_data/homeworks.dart @@ -6,7 +6,7 @@ // // SPDX-License-Identifier: EUPL-1.2 -import 'package:hausaufgabenheft_logik/src/models/models_used_by_homework.dart'; +import 'package:hausaufgabenheft_logik/src/models/models.dart'; import '../create_homework_util.dart'; From f35632d323df2f49ad202f7fa78786fd7f4850e8 Mon Sep 17 00:00:00 2001 From: Jonas Sander <29028262+Jonas-Sander@users.noreply.github.com> Date: Mon, 27 May 2024 18:33:43 +0200 Subject: [PATCH 13/28] Delete `LazyLoadingCompletedHomeworksBloc` --- .../completed_homeworks_view_bloc.dart | 37 +++++------ .../events.dart | 39 ----------- ...lazy_loading_completed_homeworks_bloc.dart | 66 ------------------- .../states.dart | 27 -------- .../src/setup/create_homework_page_bloc.dart | 5 +- .../test/homework_page_bloc_test.dart | 6 +- 6 files changed, 17 insertions(+), 163 deletions(-) delete mode 100644 lib/hausaufgabenheft_logik/lib/src/completed_homeworks/lazy_loading_completed_homeworks_bloc/events.dart delete mode 100644 lib/hausaufgabenheft_logik/lib/src/completed_homeworks/lazy_loading_completed_homeworks_bloc/lazy_loading_completed_homeworks_bloc.dart delete mode 100644 lib/hausaufgabenheft_logik/lib/src/completed_homeworks/lazy_loading_completed_homeworks_bloc/states.dart diff --git a/lib/hausaufgabenheft_logik/lib/src/completed_homeworks/completed_homeworks_view_bloc/completed_homeworks_view_bloc.dart b/lib/hausaufgabenheft_logik/lib/src/completed_homeworks/completed_homeworks_view_bloc/completed_homeworks_view_bloc.dart index 1193a0cfb..df9a0fe10 100644 --- a/lib/hausaufgabenheft_logik/lib/src/completed_homeworks/completed_homeworks_view_bloc/completed_homeworks_view_bloc.dart +++ b/lib/hausaufgabenheft_logik/lib/src/completed_homeworks/completed_homeworks_view_bloc/completed_homeworks_view_bloc.dart @@ -10,10 +10,9 @@ import 'dart:async'; import 'package:bloc/bloc.dart'; import 'package:bloc_base/bloc_base.dart' as bloc_base; -import 'package:hausaufgabenheft_logik/src/completed_homeworks/lazy_loading_completed_homeworks_bloc/lazy_loading_completed_homeworks_bloc.dart' - as lazy_loading; +import 'package:hausaufgabenheft_logik/hausaufgabenheft_logik.dart' + show HomeworkDataSource, LazyLoadingController, LazyLoadingResult; import 'package:hausaufgabenheft_logik/src/completed_homeworks/views/completed_homework_list_view_factory.dart'; -import 'package:rxdart/rxdart.dart'; import 'events.dart'; import 'states.dart'; @@ -23,37 +22,31 @@ export 'states.dart'; class CompletedHomeworksViewBloc extends Bloc<CompletedHomeworksViewBlocEvent, CompletedHomeworksViewBlocState> implements bloc_base.BlocBase { - final lazy_loading.LazyLoadingCompletedHomeworksBloc - _lazyLoadingCompletedHomeworksBloc; + final HomeworkDataSource _homeworkRepository; + LazyLoadingController? _lazyLoadingController; final CompletedHomeworkListViewFactory _completedHomeworkListViewFactory; final int nrOfInitialCompletedHomeworksToLoad; late StreamSubscription _streamSubscription; - late Stream<lazy_loading.Success> _lazyLoadingSuccessStates; - CompletedHomeworksViewBloc(this._lazyLoadingCompletedHomeworksBloc, - this._completedHomeworkListViewFactory, + CompletedHomeworksViewBloc( + this._homeworkRepository, this._completedHomeworkListViewFactory, {this.nrOfInitialCompletedHomeworksToLoad = 8}) : super(Loading()) { - _lazyLoadingSuccessStates = _lazyLoadingCompletedHomeworksBloc.stream - .whereType<lazy_loading.Success>(); - on<StartTransformingHomeworks>((event, emit) { - _lazyLoadingCompletedHomeworksBloc.add( - lazy_loading.LoadCompletedHomeworks( - nrOfInitialCompletedHomeworksToLoad)); + _lazyLoadingController = + _homeworkRepository.getLazyLoadingCompletedHomeworksController( + nrOfInitialCompletedHomeworksToLoad); - _streamSubscription = _lazyLoadingSuccessStates.listen((state) { + _streamSubscription = _lazyLoadingController!.results.listen((state) { add(_Transform(state)); }); }); on<AdvanceCompletedHomeworks>((event, emit) { - _lazyLoadingCompletedHomeworksBloc - .add(lazy_loading.AdvanceCompletedHomeworks(event.advanceBy)); + _lazyLoadingController!.advanceBy(event.advanceBy); }); on<_Transform>((event, emit) { - final success = event.successState; final listView = _completedHomeworkListViewFactory.create( - success.homeworks, success.loadedAllHomeworks); + event.result.homeworks, !event.result.moreHomeworkAvailable); emit(Success(listView)); }); } @@ -65,10 +58,10 @@ class CompletedHomeworksViewBloc extends Bloc<CompletedHomeworksViewBlocEvent, } class _Transform extends CompletedHomeworksViewBlocEvent { - final lazy_loading.Success successState; + final LazyLoadingResult result; - _Transform(this.successState); + _Transform(this.result); @override - List<Object> get props => [successState]; + List<Object> get props => [result]; } diff --git a/lib/hausaufgabenheft_logik/lib/src/completed_homeworks/lazy_loading_completed_homeworks_bloc/events.dart b/lib/hausaufgabenheft_logik/lib/src/completed_homeworks/lazy_loading_completed_homeworks_bloc/events.dart deleted file mode 100644 index 3fc59ad3f..000000000 --- a/lib/hausaufgabenheft_logik/lib/src/completed_homeworks/lazy_loading_completed_homeworks_bloc/events.dart +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright (c) 2022 Sharezone UG (haftungsbeschränkt) -// Licensed under the EUPL-1.2-or-later. -// -// You may obtain a copy of the Licence at: -// https://joinup.ec.europa.eu/software/page/eupl -// -// SPDX-License-Identifier: EUPL-1.2 - -import 'package:equatable/equatable.dart'; - -abstract class LazyLoadingCompletedHomeworksEvent extends Equatable {} - -class LoadCompletedHomeworks extends LazyLoadingCompletedHomeworksEvent { - final int numberOfHomeworksToLoad; - - LoadCompletedHomeworks(this.numberOfHomeworksToLoad); - - @override - List<Object> get props => [numberOfHomeworksToLoad]; - - @override - String toString() { - return 'LoadCompletedHomeworks(numberOfHomeworksToLoad: $numberOfHomeworksToLoad)'; - } -} - -class AdvanceCompletedHomeworks extends LazyLoadingCompletedHomeworksEvent { - final int advanceBy; - - AdvanceCompletedHomeworks(this.advanceBy); - - @override - List<Object> get props => [advanceBy]; - - @override - String toString() { - return 'AdvanceCompletedHomeworks(advanceBy: $advanceBy)'; - } -} diff --git a/lib/hausaufgabenheft_logik/lib/src/completed_homeworks/lazy_loading_completed_homeworks_bloc/lazy_loading_completed_homeworks_bloc.dart b/lib/hausaufgabenheft_logik/lib/src/completed_homeworks/lazy_loading_completed_homeworks_bloc/lazy_loading_completed_homeworks_bloc.dart deleted file mode 100644 index 4d9a01689..000000000 --- a/lib/hausaufgabenheft_logik/lib/src/completed_homeworks/lazy_loading_completed_homeworks_bloc/lazy_loading_completed_homeworks_bloc.dart +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright (c) 2022 Sharezone UG (haftungsbeschränkt) -// Licensed under the EUPL-1.2-or-later. -// -// You may obtain a copy of the Licence at: -// https://joinup.ec.europa.eu/software/page/eupl -// -// SPDX-License-Identifier: EUPL-1.2 - -import 'package:bloc/bloc.dart'; -import 'package:bloc_base/bloc_base.dart' as bloc_base; - -import '../../data_source/homework_data_source.dart'; -import 'events.dart'; -import 'states.dart'; - -export 'events.dart'; -export 'states.dart'; - -class LazyLoadingCompletedHomeworksBloc extends Bloc< - LazyLoadingCompletedHomeworksEvent, - LazyLoadingCompletedHomeworksBlocState> implements bloc_base.BlocBase { - final HomeworkDataSource _homeworkRepository; - LazyLoadingController? _lazyLoadingController; - - LazyLoadingCompletedHomeworksBloc(this._homeworkRepository) - : super(Loading()) { - on<LoadCompletedHomeworks>( - (event, emit) { - _lazyLoadingController = - _homeworkRepository.getLazyLoadingCompletedHomeworksController( - event.numberOfHomeworksToLoad); - _lazyLoadingController!.results.listen((res) => add( - _Yield(Success( - res.homeworks, - loadedAllHomeworks: !res.moreHomeworkAvailable, - )), - )); - }, - ); - on<AdvanceCompletedHomeworks>( - (event, emit) { - assert(_lazyLoadingController != null); - _lazyLoadingController!.advanceBy(event.advanceBy); - }, - ); - on<_Yield>( - (event, emit) => emit(event.payload), - ); - } - - @override - void dispose() {} -} - -class _Yield extends LazyLoadingCompletedHomeworksEvent { - final dynamic payload; - _Yield(this.payload) : assert(payload != null); - - @override - List<Object> get props => [payload]; - - @override - String toString() { - return '_Yield(payload: $payload)'; - } -} diff --git a/lib/hausaufgabenheft_logik/lib/src/completed_homeworks/lazy_loading_completed_homeworks_bloc/states.dart b/lib/hausaufgabenheft_logik/lib/src/completed_homeworks/lazy_loading_completed_homeworks_bloc/states.dart deleted file mode 100644 index d797b96e0..000000000 --- a/lib/hausaufgabenheft_logik/lib/src/completed_homeworks/lazy_loading_completed_homeworks_bloc/states.dart +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright (c) 2022 Sharezone UG (haftungsbeschränkt) -// Licensed under the EUPL-1.2-or-later. -// -// You may obtain a copy of the Licence at: -// https://joinup.ec.europa.eu/software/page/eupl -// -// SPDX-License-Identifier: EUPL-1.2 - -import 'package:equatable/equatable.dart'; -import 'package:hausaufgabenheft_logik/hausaufgabenheft_logik.dart'; - -abstract class LazyLoadingCompletedHomeworksBlocState extends Equatable {} - -class Success extends LazyLoadingCompletedHomeworksBlocState { - final List<HomeworkReadModel> homeworks; - final bool loadedAllHomeworks; - - Success(this.homeworks, {required this.loadedAllHomeworks}); - - @override - List<Object> get props => [homeworks, loadedAllHomeworks]; -} - -class Loading extends LazyLoadingCompletedHomeworksBlocState { - @override - List<Object> get props => []; -} diff --git a/lib/hausaufgabenheft_logik/lib/src/setup/create_homework_page_bloc.dart b/lib/hausaufgabenheft_logik/lib/src/setup/create_homework_page_bloc.dart index 33b042f16..c3314a4c9 100644 --- a/lib/hausaufgabenheft_logik/lib/src/setup/create_homework_page_bloc.dart +++ b/lib/hausaufgabenheft_logik/lib/src/setup/create_homework_page_bloc.dart @@ -13,7 +13,6 @@ import 'package:hausaufgabenheft_logik/src/open_homeworks/open_homework_view_blo import 'package:hausaufgabenheft_logik/src/student_homework_page_bloc/homework_sorting_cache.dart'; import '../completed_homeworks/completed_homeworks_view_bloc/completed_homeworks_view_bloc.dart'; -import '../completed_homeworks/lazy_loading_completed_homeworks_bloc/lazy_loading_completed_homeworks_bloc.dart'; import '../completed_homeworks/views/completed_homework_list_view_factory.dart'; import '../models/models.dart'; import '../open_homeworks/sort_and_subcategorization/sort_and_subcategorizer.dart'; @@ -39,10 +38,8 @@ HomeworkPageBloc createHomeworkPageBloc( final completedHomeworkListViewFactory = CompletedHomeworkListViewFactory(viewFactory); - final lazyLoadingCompletedHomeworksBloc = - LazyLoadingCompletedHomeworksBloc(dependencies.dataSource); final completedHomeworksViewBloc = CompletedHomeworksViewBloc( - lazyLoadingCompletedHomeworksBloc, completedHomeworkListViewFactory, + dependencies.dataSource, completedHomeworkListViewFactory, nrOfInitialCompletedHomeworksToLoad: config.nrOfInitialCompletedHomeworksToLoad); diff --git a/lib/hausaufgabenheft_logik/test/homework_page_bloc_test.dart b/lib/hausaufgabenheft_logik/test/homework_page_bloc_test.dart index 9865ebec1..d0d1097f3 100644 --- a/lib/hausaufgabenheft_logik/test/homework_page_bloc_test.dart +++ b/lib/hausaufgabenheft_logik/test/homework_page_bloc_test.dart @@ -15,8 +15,6 @@ import 'package:hausaufgabenheft_logik/hausaufgabenheft_logik.dart'; import 'package:hausaufgabenheft_logik/hausaufgabenheft_logik_setup.dart'; import 'package:hausaufgabenheft_logik/src/completed_homeworks/completed_homeworks_view_bloc/completed_homeworks_view_bloc.dart' as completed; -import 'package:hausaufgabenheft_logik/src/completed_homeworks/lazy_loading_completed_homeworks_bloc/lazy_loading_completed_homeworks_bloc.dart' - as lazy_loading; import 'package:hausaufgabenheft_logik/src/completed_homeworks/views/completed_homework_list_view_factory.dart'; import 'package:hausaufgabenheft_logik/src/student_homework_page_bloc/homework_sorting_cache.dart'; import 'package:hausaufgabenheft_logik/src/views/color.dart'; @@ -524,10 +522,8 @@ completed.CompletedHomeworksViewBloc createCompletedHomeworksViewBloc( {required int nrOfInitialCompletedHomeworksToLoad}) { final completedHomeworkListViewFactory = CompletedHomeworkListViewFactory(viewFactory); - final lazyLoadingCompletedHomeworksBloc = - lazy_loading.LazyLoadingCompletedHomeworksBloc(repository); final completedHomeworksViewBloc = completed.CompletedHomeworksViewBloc( - lazyLoadingCompletedHomeworksBloc, completedHomeworkListViewFactory, + repository, completedHomeworkListViewFactory, nrOfInitialCompletedHomeworksToLoad: nrOfInitialCompletedHomeworksToLoad); return completedHomeworksViewBloc; } From 3fd1f72e8a64669b5c3396016b662c0e8beb83e1 Mon Sep 17 00:00:00 2001 From: Jonas Sander <29028262+Jonas-Sander@users.noreply.github.com> Date: Mon, 27 May 2024 18:35:00 +0200 Subject: [PATCH 14/28] Refactor `HomeworkPageCompletionDispatcher` --- .../homework_page_completion_dispatcher.dart | 48 +++++-------------- .../student_homework_page_bloc.dart | 10 ++-- 2 files changed, 18 insertions(+), 40 deletions(-) diff --git a/lib/hausaufgabenheft_logik/lib/src/homework_completion/homework_page_completion_dispatcher.dart b/lib/hausaufgabenheft_logik/lib/src/homework_completion/homework_page_completion_dispatcher.dart index 4bd4db52a..d9c089559 100644 --- a/lib/hausaufgabenheft_logik/lib/src/homework_completion/homework_page_completion_dispatcher.dart +++ b/lib/hausaufgabenheft_logik/lib/src/homework_completion/homework_page_completion_dispatcher.dart @@ -7,7 +7,6 @@ // SPDX-License-Identifier: EUPL-1.2 import 'package:common_domain_models/common_domain_models.dart'; -import 'package:equatable/equatable.dart'; import 'package:hausaufgabenheft_logik/hausaufgabenheft_logik.dart'; /// The [HomeworkPageCompletionDispatcher] is a homework page sepecific input for @@ -26,42 +25,17 @@ class HomeworkPageCompletionDispatcher { HomeworkPageCompletionDispatcher(this._homeworkCompletionDispatcher, {required this.getCurrentOverdueHomeworkIds}); - Future<void> add(HomeworkCompletionEvent event) async { - if (event is SingleHomeworkCompletionEvent) { - _homeworkCompletionDispatcher.dispatch( - HomeworkCompletion( - HomeworkId(event.homeworkId), - event.newValue ? CompletionStatus.completed : CompletionStatus.open, - ), - ); - } else if (event is AllOverdueHomeworkCompletionEvent) { - final overdueHwIds = await getCurrentOverdueHomeworkIds(); - for (final overdueHwId in overdueHwIds) { - _homeworkCompletionDispatcher.dispatch( - HomeworkCompletion(overdueHwId, CompletionStatus.completed), - ); - } - } else { - throw UnimplementedError('$event is not implemented'); - } + Future<void> changeCompletionStatus( + HomeworkId homeworkId, CompletionStatus newCompletionValue) async { + _homeworkCompletionDispatcher + .dispatch(HomeworkCompletion(homeworkId, newCompletionValue)); } -} - -abstract class HomeworkCompletionEvent extends Equatable {} - -class SingleHomeworkCompletionEvent extends HomeworkCompletionEvent { - final String homeworkId; - final bool newValue; - - SingleHomeworkCompletionEvent(this.homeworkId, this.newValue); - @override - List<Object> get props => [homeworkId]; -} - -/// Will change the completion status of all open homeworks, where the todo date -/// is before today, to completed. -class AllOverdueHomeworkCompletionEvent extends HomeworkCompletionEvent { - @override - List<Object> get props => []; + Future<void> completeAllOverdueHomeworks() async { + final hws = await getCurrentOverdueHomeworkIds(); + for (final hw in hws) { + _homeworkCompletionDispatcher + .dispatch(HomeworkCompletion(hw, CompletionStatus.completed)); + } + } } diff --git a/lib/hausaufgabenheft_logik/lib/src/student_homework_page_bloc/student_homework_page_bloc.dart b/lib/hausaufgabenheft_logik/lib/src/student_homework_page_bloc/student_homework_page_bloc.dart index 46bf032f3..aaa1fa0cd 100644 --- a/lib/hausaufgabenheft_logik/lib/src/student_homework_page_bloc/student_homework_page_bloc.dart +++ b/lib/hausaufgabenheft_logik/lib/src/student_homework_page_bloc/student_homework_page_bloc.dart @@ -10,6 +10,7 @@ import 'dart:async'; import 'package:bloc/bloc.dart'; import 'package:bloc_base/bloc_base.dart' as bloc_base; +import 'package:common_domain_models/common_domain_models.dart'; import 'package:hausaufgabenheft_logik/hausaufgabenheft_logik.dart'; import 'package:hausaufgabenheft_logik/src/student_homework_page_bloc/homework_sorting_cache.dart'; import 'package:rxdart/rxdart.dart'; @@ -117,12 +118,15 @@ class HomeworkPageBloc extends Bloc<HomeworkPageEvent, HomeworkPageState> Future<void> _mapHomeworkChangedCompletionStatus( CompletionStatusChanged event) async { - await _homeworkCompletionReceiver - .add(SingleHomeworkCompletionEvent(event.homeworkId, event.newValue)); + await _homeworkCompletionReceiver.changeCompletionStatus( + HomeworkId(event.homeworkId), + event.newValue == true + ? CompletionStatus.completed + : CompletionStatus.open); } Future<void> _mapHomeworkMarkOverdueToState(CompletedAllOverdue event) async { - await _homeworkCompletionReceiver.add(AllOverdueHomeworkCompletionEvent()); + await _homeworkCompletionReceiver.completeAllOverdueHomeworks(); } @override From bec07b75e205014954ff94e4dcdba9357d3882f7 Mon Sep 17 00:00:00 2001 From: Jonas Sander <29028262+Jonas-Sander@users.noreply.github.com> Date: Mon, 27 May 2024 19:25:08 +0200 Subject: [PATCH 15/28] Delete `CompletedHomeworksViewBloc`. --- .../completed_homeworks_view_bloc.dart | 67 ------------------- .../completed_homeworks_view_bloc/events.dart | 23 ------- .../completed_homeworks_view_bloc/states.dart | 27 -------- .../src/setup/create_homework_page_bloc.dart | 10 ++- .../student_homework_page_bloc.dart | 41 +++++++----- .../test/homework_page_bloc_test.dart | 16 ----- 6 files changed, 30 insertions(+), 154 deletions(-) delete mode 100644 lib/hausaufgabenheft_logik/lib/src/completed_homeworks/completed_homeworks_view_bloc/completed_homeworks_view_bloc.dart delete mode 100644 lib/hausaufgabenheft_logik/lib/src/completed_homeworks/completed_homeworks_view_bloc/events.dart delete mode 100644 lib/hausaufgabenheft_logik/lib/src/completed_homeworks/completed_homeworks_view_bloc/states.dart diff --git a/lib/hausaufgabenheft_logik/lib/src/completed_homeworks/completed_homeworks_view_bloc/completed_homeworks_view_bloc.dart b/lib/hausaufgabenheft_logik/lib/src/completed_homeworks/completed_homeworks_view_bloc/completed_homeworks_view_bloc.dart deleted file mode 100644 index df9a0fe10..000000000 --- a/lib/hausaufgabenheft_logik/lib/src/completed_homeworks/completed_homeworks_view_bloc/completed_homeworks_view_bloc.dart +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright (c) 2022 Sharezone UG (haftungsbeschränkt) -// Licensed under the EUPL-1.2-or-later. -// -// You may obtain a copy of the Licence at: -// https://joinup.ec.europa.eu/software/page/eupl -// -// SPDX-License-Identifier: EUPL-1.2 - -import 'dart:async'; - -import 'package:bloc/bloc.dart'; -import 'package:bloc_base/bloc_base.dart' as bloc_base; -import 'package:hausaufgabenheft_logik/hausaufgabenheft_logik.dart' - show HomeworkDataSource, LazyLoadingController, LazyLoadingResult; -import 'package:hausaufgabenheft_logik/src/completed_homeworks/views/completed_homework_list_view_factory.dart'; - -import 'events.dart'; -import 'states.dart'; - -export 'events.dart'; -export 'states.dart'; - -class CompletedHomeworksViewBloc extends Bloc<CompletedHomeworksViewBlocEvent, - CompletedHomeworksViewBlocState> implements bloc_base.BlocBase { - final HomeworkDataSource _homeworkRepository; - LazyLoadingController? _lazyLoadingController; - final CompletedHomeworkListViewFactory _completedHomeworkListViewFactory; - final int nrOfInitialCompletedHomeworksToLoad; - late StreamSubscription _streamSubscription; - - CompletedHomeworksViewBloc( - this._homeworkRepository, this._completedHomeworkListViewFactory, - {this.nrOfInitialCompletedHomeworksToLoad = 8}) - : super(Loading()) { - on<StartTransformingHomeworks>((event, emit) { - _lazyLoadingController = - _homeworkRepository.getLazyLoadingCompletedHomeworksController( - nrOfInitialCompletedHomeworksToLoad); - - _streamSubscription = _lazyLoadingController!.results.listen((state) { - add(_Transform(state)); - }); - }); - on<AdvanceCompletedHomeworks>((event, emit) { - _lazyLoadingController!.advanceBy(event.advanceBy); - }); - on<_Transform>((event, emit) { - final listView = _completedHomeworkListViewFactory.create( - event.result.homeworks, !event.result.moreHomeworkAvailable); - emit(Success(listView)); - }); - } - - @override - void dispose() { - _streamSubscription.cancel(); - } -} - -class _Transform extends CompletedHomeworksViewBlocEvent { - final LazyLoadingResult result; - - _Transform(this.result); - - @override - List<Object> get props => [result]; -} diff --git a/lib/hausaufgabenheft_logik/lib/src/completed_homeworks/completed_homeworks_view_bloc/events.dart b/lib/hausaufgabenheft_logik/lib/src/completed_homeworks/completed_homeworks_view_bloc/events.dart deleted file mode 100644 index 808c9f672..000000000 --- a/lib/hausaufgabenheft_logik/lib/src/completed_homeworks/completed_homeworks_view_bloc/events.dart +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright (c) 2022 Sharezone UG (haftungsbeschränkt) -// Licensed under the EUPL-1.2-or-later. -// -// You may obtain a copy of the Licence at: -// https://joinup.ec.europa.eu/software/page/eupl -// -// SPDX-License-Identifier: EUPL-1.2 - -import 'package:equatable/equatable.dart'; - -abstract class CompletedHomeworksViewBlocEvent extends Equatable {} - -class StartTransformingHomeworks extends CompletedHomeworksViewBlocEvent { - @override - List<Object> get props => []; -} - -class AdvanceCompletedHomeworks extends CompletedHomeworksViewBlocEvent { - final int advanceBy; - @override - List<Object> get props => [advanceBy]; - AdvanceCompletedHomeworks(this.advanceBy); -} diff --git a/lib/hausaufgabenheft_logik/lib/src/completed_homeworks/completed_homeworks_view_bloc/states.dart b/lib/hausaufgabenheft_logik/lib/src/completed_homeworks/completed_homeworks_view_bloc/states.dart deleted file mode 100644 index 099c61839..000000000 --- a/lib/hausaufgabenheft_logik/lib/src/completed_homeworks/completed_homeworks_view_bloc/states.dart +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright (c) 2022 Sharezone UG (haftungsbeschränkt) -// Licensed under the EUPL-1.2-or-later. -// -// You may obtain a copy of the Licence at: -// https://joinup.ec.europa.eu/software/page/eupl -// -// SPDX-License-Identifier: EUPL-1.2 - -import 'package:equatable/equatable.dart'; - -import 'package:hausaufgabenheft_logik/src/completed_homeworks/views/completed_homwork_list_view.dart'; - -abstract class CompletedHomeworksViewBlocState extends Equatable {} - -class Loading extends CompletedHomeworksViewBlocState { - @override - List<Object> get props => []; -} - -class Success extends CompletedHomeworksViewBlocState { - final CompletedHomeworkListView completedHomeworksView; - - Success(this.completedHomeworksView); - - @override - List<Object> get props => [completedHomeworksView]; -} diff --git a/lib/hausaufgabenheft_logik/lib/src/setup/create_homework_page_bloc.dart b/lib/hausaufgabenheft_logik/lib/src/setup/create_homework_page_bloc.dart index c3314a4c9..3e641b6d7 100644 --- a/lib/hausaufgabenheft_logik/lib/src/setup/create_homework_page_bloc.dart +++ b/lib/hausaufgabenheft_logik/lib/src/setup/create_homework_page_bloc.dart @@ -12,7 +12,6 @@ import 'package:hausaufgabenheft_logik/src/open_homeworks/open_homework_list_blo import 'package:hausaufgabenheft_logik/src/open_homeworks/open_homework_view_bloc/open_homework_view_bloc.dart'; import 'package:hausaufgabenheft_logik/src/student_homework_page_bloc/homework_sorting_cache.dart'; -import '../completed_homeworks/completed_homeworks_view_bloc/completed_homeworks_view_bloc.dart'; import '../completed_homeworks/views/completed_homework_list_view_factory.dart'; import '../models/models.dart'; import '../open_homeworks/sort_and_subcategorization/sort_and_subcategorizer.dart'; @@ -38,10 +37,6 @@ HomeworkPageBloc createHomeworkPageBloc( final completedHomeworkListViewFactory = CompletedHomeworkListViewFactory(viewFactory); - final completedHomeworksViewBloc = CompletedHomeworksViewBloc( - dependencies.dataSource, completedHomeworkListViewFactory, - nrOfInitialCompletedHomeworksToLoad: - config.nrOfInitialCompletedHomeworksToLoad); final homeworkPageCompletionReceiver = HomeworkPageCompletionDispatcher( dependencies.completionDispatcher, @@ -49,7 +44,10 @@ HomeworkPageBloc createHomeworkPageBloc( return HomeworkPageBloc( openHomeworksViewBloc: openHomeworksViewBloc, - completedHomeworksViewBloc: completedHomeworksViewBloc, + completedHomeworkListViewFactory: completedHomeworkListViewFactory, + homeworkDataSource: dependencies.dataSource, + numberOfInitialCompletedHomeworksToLoad: + config.nrOfInitialCompletedHomeworksToLoad, homeworkCompletionReceiver: homeworkPageCompletionReceiver, homeworkSortingCache: HomeworkSortingCache(dependencies.keyValueStore), getCurrentDateTime: dependencies.getCurrentDateTime ?? () => clock.now(), diff --git a/lib/hausaufgabenheft_logik/lib/src/student_homework_page_bloc/student_homework_page_bloc.dart b/lib/hausaufgabenheft_logik/lib/src/student_homework_page_bloc/student_homework_page_bloc.dart index aaa1fa0cd..1c30203e5 100644 --- a/lib/hausaufgabenheft_logik/lib/src/student_homework_page_bloc/student_homework_page_bloc.dart +++ b/lib/hausaufgabenheft_logik/lib/src/student_homework_page_bloc/student_homework_page_bloc.dart @@ -12,14 +12,13 @@ import 'package:bloc/bloc.dart'; import 'package:bloc_base/bloc_base.dart' as bloc_base; import 'package:common_domain_models/common_domain_models.dart'; import 'package:hausaufgabenheft_logik/hausaufgabenheft_logik.dart'; -import 'package:hausaufgabenheft_logik/src/student_homework_page_bloc/homework_sorting_cache.dart'; -import 'package:rxdart/rxdart.dart'; -import 'package:hausaufgabenheft_logik/src/open_homeworks/sort_and_subcategorization/sort/src/homework_sort_enum_sort_object_conversion_extensions.dart'; -import 'package:hausaufgabenheft_logik/src/completed_homeworks/completed_homeworks_view_bloc/completed_homeworks_view_bloc.dart' - as completed; +import 'package:hausaufgabenheft_logik/src/completed_homeworks/views/completed_homework_list_view_factory.dart'; import 'package:hausaufgabenheft_logik/src/homework_completion/homework_page_completion_dispatcher.dart'; import 'package:hausaufgabenheft_logik/src/open_homeworks/open_homework_view_bloc/open_homework_view_bloc.dart' as open; +import 'package:hausaufgabenheft_logik/src/open_homeworks/sort_and_subcategorization/sort/src/homework_sort_enum_sort_object_conversion_extensions.dart'; +import 'package:hausaufgabenheft_logik/src/student_homework_page_bloc/homework_sorting_cache.dart'; +import 'package:rxdart/rxdart.dart'; /// This Bloc serves basically only as an interface to the outer world with 2 /// tasks: @@ -31,24 +30,30 @@ import 'package:hausaufgabenheft_logik/src/open_homeworks/open_homework_view_blo class HomeworkPageBloc extends Bloc<HomeworkPageEvent, HomeworkPageState> implements bloc_base.BlocBase { final open.OpenHomeworksViewBloc _openHomeworksViewBloc; - final completed.CompletedHomeworksViewBloc _completedHomeworksViewBloc; final HomeworkPageCompletionDispatcher _homeworkCompletionReceiver; + final HomeworkDataSource _homeworkDataSource; final HomeworkSortingCache _homeworkSortingCache; final DateTime Function() _getCurrentDateTime; + final int numberOfInitialCompletedHomeworksToLoad; + final CompletedHomeworkListViewFactory _completedHomeworkListViewFactory; + LazyLoadingController? _lazyLoadingController; /// Whether [close] or [dispose] has been called; bool _isClosed = false; HomeworkPageBloc({ required open.OpenHomeworksViewBloc openHomeworksViewBloc, - required completed.CompletedHomeworksViewBloc completedHomeworksViewBloc, required HomeworkPageCompletionDispatcher homeworkCompletionReceiver, required HomeworkSortingCache homeworkSortingCache, + required HomeworkDataSource homeworkDataSource, + required CompletedHomeworkListViewFactory completedHomeworkListViewFactory, + required this.numberOfInitialCompletedHomeworksToLoad, required DateTime Function() getCurrentDateTime, }) : _openHomeworksViewBloc = openHomeworksViewBloc, - _completedHomeworksViewBloc = completedHomeworksViewBloc, + _homeworkDataSource = homeworkDataSource, _homeworkSortingCache = homeworkSortingCache, _homeworkCompletionReceiver = homeworkCompletionReceiver, + _completedHomeworkListViewFactory = completedHomeworkListViewFactory, _getCurrentDateTime = getCurrentDateTime, super(Uninitialized()) { on<LoadHomeworks>((event, emit) { @@ -77,7 +82,9 @@ class HomeworkPageBloc extends Bloc<HomeworkPageEvent, HomeworkPageState> StreamSubscription? _combineLatestSubscription; Future<void> _mapLoadHomeworksToState() async { - _completedHomeworksViewBloc.add(completed.StartTransformingHomeworks()); + _lazyLoadingController = + _homeworkDataSource.getLazyLoadingCompletedHomeworksController( + numberOfInitialCompletedHomeworksToLoad); final sortEnum = (await _homeworkSortingCache.getLastSorting( orElse: HomeworkSort.smallestDateSubjectAndTitle))!; @@ -85,13 +92,17 @@ class HomeworkPageBloc extends Bloc<HomeworkPageEvent, HomeworkPageState> _openHomeworksViewBloc.add(open.LoadHomeworks(sort)); final completedHomeworksSuccessStates = - _completedHomeworksViewBloc.stream.whereType<completed.Success>(); + _lazyLoadingController!.results.map((s) { + final view = _completedHomeworkListViewFactory.create( + s.homeworks, !s.moreHomeworkAvailable); + return view; + }); final openHomeworksSuccessStates = _openHomeworksViewBloc.stream.whereType<open.Success>(); _combineLatestSubscription = - Rx.combineLatest2<completed.Success, open.Success, Success>( + Rx.combineLatest2<CompletedHomeworkListView, open.Success, Success>( completedHomeworksSuccessStates, openHomeworksSuccessStates, _toSuccessState, @@ -102,12 +113,12 @@ class HomeworkPageBloc extends Bloc<HomeworkPageEvent, HomeworkPageState> }); } - Success _toSuccessState(completed.Success completed, open.Success open) => - Success(completed.completedHomeworksView, open.openHomeworkListView); + Success _toSuccessState( + CompletedHomeworkListView completed, open.Success open) => + Success(completed, open.openHomeworkListView); void _mapAdvanceCompletedHomeworks(AdvanceCompletedHomeworks event) async { - _completedHomeworksViewBloc - .add(completed.AdvanceCompletedHomeworks(event.advanceBy)); + _lazyLoadingController!.advanceBy(event.advanceBy); } Future<void> _mapFilterChangedToState(OpenHwSortingChanged event) async { diff --git a/lib/hausaufgabenheft_logik/test/homework_page_bloc_test.dart b/lib/hausaufgabenheft_logik/test/homework_page_bloc_test.dart index d0d1097f3..60e771510 100644 --- a/lib/hausaufgabenheft_logik/test/homework_page_bloc_test.dart +++ b/lib/hausaufgabenheft_logik/test/homework_page_bloc_test.dart @@ -13,12 +13,8 @@ import 'package:bloc/bloc.dart'; import 'package:clock/clock.dart'; import 'package:hausaufgabenheft_logik/hausaufgabenheft_logik.dart'; import 'package:hausaufgabenheft_logik/hausaufgabenheft_logik_setup.dart'; -import 'package:hausaufgabenheft_logik/src/completed_homeworks/completed_homeworks_view_bloc/completed_homeworks_view_bloc.dart' - as completed; -import 'package:hausaufgabenheft_logik/src/completed_homeworks/views/completed_homework_list_view_factory.dart'; import 'package:hausaufgabenheft_logik/src/student_homework_page_bloc/homework_sorting_cache.dart'; import 'package:hausaufgabenheft_logik/src/views/color.dart'; -import 'package:hausaufgabenheft_logik/src/views/student_homework_view_factory.dart'; import 'package:key_value_store/in_memory_key_value_store.dart'; import 'package:key_value_store/key_value_store.dart'; import 'package:rxdart/rxdart.dart'; @@ -516,18 +512,6 @@ HomeworkPageBloc createBloc( ); } -completed.CompletedHomeworksViewBloc createCompletedHomeworksViewBloc( - StudentHomeworkViewFactory viewFactory, - InMemoryHomeworkRepository repository, - {required int nrOfInitialCompletedHomeworksToLoad}) { - final completedHomeworkListViewFactory = - CompletedHomeworkListViewFactory(viewFactory); - final completedHomeworksViewBloc = completed.CompletedHomeworksViewBloc( - repository, completedHomeworkListViewFactory, - nrOfInitialCompletedHomeworksToLoad: nrOfInitialCompletedHomeworksToLoad); - return completedHomeworksViewBloc; -} - InMemoryHomeworkRepository createRepositoy() => InMemoryHomeworkRepository(); Date dateFromDay(int day) => Date(year: 2019, month: 1, day: day); From 0d46fdf45ae715adbb94c357d8ba6f92f7841226 Mon Sep 17 00:00:00 2001 From: Jonas Sander <29028262+Jonas-Sander@users.noreply.github.com> Date: Mon, 27 May 2024 19:32:48 +0200 Subject: [PATCH 16/28] Delete `OpenHomeworkListBloc` --- .../open_homework_list_bloc/events.dart | 16 --------- .../open_homework_list_bloc.dart | 36 ------------------- .../open_homework_list_bloc/states.dart | 19 ---------- .../open_homework_view_bloc.dart | 20 +++-------- .../src/setup/create_homework_page_bloc.dart | 6 ++-- 5 files changed, 7 insertions(+), 90 deletions(-) delete mode 100644 lib/hausaufgabenheft_logik/lib/src/open_homeworks/open_homework_list_bloc/events.dart delete mode 100644 lib/hausaufgabenheft_logik/lib/src/open_homeworks/open_homework_list_bloc/open_homework_list_bloc.dart delete mode 100644 lib/hausaufgabenheft_logik/lib/src/open_homeworks/open_homework_list_bloc/states.dart diff --git a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/open_homework_list_bloc/events.dart b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/open_homework_list_bloc/events.dart deleted file mode 100644 index f6d4a3ce1..000000000 --- a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/open_homework_list_bloc/events.dart +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (c) 2022 Sharezone UG (haftungsbeschränkt) -// Licensed under the EUPL-1.2-or-later. -// -// You may obtain a copy of the Licence at: -// https://joinup.ec.europa.eu/software/page/eupl -// -// SPDX-License-Identifier: EUPL-1.2 - -import 'package:equatable/equatable.dart'; - -abstract class OpenHomeworkListBlocEvent extends Equatable {} - -class LoadHomeworks extends OpenHomeworkListBlocEvent { - @override - List<Object> get props => []; -} diff --git a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/open_homework_list_bloc/open_homework_list_bloc.dart b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/open_homework_list_bloc/open_homework_list_bloc.dart deleted file mode 100644 index 81974befb..000000000 --- a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/open_homework_list_bloc/open_homework_list_bloc.dart +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (c) 2022 Sharezone UG (haftungsbeschränkt) -// Licensed under the EUPL-1.2-or-later. -// -// You may obtain a copy of the Licence at: -// https://joinup.ec.europa.eu/software/page/eupl -// -// SPDX-License-Identifier: EUPL-1.2 - -import 'package:bloc/bloc.dart'; -import 'package:hausaufgabenheft_logik/src/data_source/homework_data_source.dart'; - -import 'events.dart'; -import 'states.dart'; - -export 'events.dart'; -export 'states.dart'; - -class OpenHomeworkListBloc - extends Bloc<OpenHomeworkListBlocEvent, OpenHomeworkListBlocState> { - final HomeworkDataSource _repository; - - OpenHomeworkListBloc(this._repository) : super(Uninitialized()) { - on<LoadHomeworks>((event, emit) { - _repository.openHomeworks.listen((hws) => add(_Yield(Success(hws)))); - }); - on<_Yield>((event, emit) => emit(event.payload)); - } -} - -class _Yield extends OpenHomeworkListBlocEvent { - final dynamic payload; - _Yield(this.payload) : assert(payload != null); - - @override - List<Object> get props => [payload]; -} diff --git a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/open_homework_list_bloc/states.dart b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/open_homework_list_bloc/states.dart deleted file mode 100644 index 610f30a6c..000000000 --- a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/open_homework_list_bloc/states.dart +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright (c) 2022 Sharezone UG (haftungsbeschränkt) -// Licensed under the EUPL-1.2-or-later. -// -// You may obtain a copy of the Licence at: -// https://joinup.ec.europa.eu/software/page/eupl -// -// SPDX-License-Identifier: EUPL-1.2 - -import 'package:hausaufgabenheft_logik/hausaufgabenheft_logik.dart'; - -abstract class OpenHomeworkListBlocState {} - -class Uninitialized extends OpenHomeworkListBlocState {} - -class Success extends OpenHomeworkListBlocState { - final List<HomeworkReadModel> homeworks; - - Success(this.homeworks); -} diff --git a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/open_homework_view_bloc/open_homework_view_bloc.dart b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/open_homework_view_bloc/open_homework_view_bloc.dart index 4fa9c0f87..c4da4b38a 100644 --- a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/open_homework_view_bloc/open_homework_view_bloc.dart +++ b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/open_homework_view_bloc/open_homework_view_bloc.dart @@ -10,9 +10,8 @@ import 'dart:async'; import 'package:bloc/bloc.dart'; import 'package:bloc_base/bloc_base.dart' as bloc_base; +import 'package:hausaufgabenheft_logik/src/data_source/homework_data_source.dart'; import 'package:hausaufgabenheft_logik/src/models/homework.dart'; -import 'package:hausaufgabenheft_logik/src/open_homeworks/open_homework_list_bloc/open_homework_list_bloc.dart' - as hws_bloc; import 'package:hausaufgabenheft_logik/src/open_homeworks/sort_and_subcategorization/sort/src/sort.dart'; import 'package:hausaufgabenheft_logik/src/open_homeworks/views/open_homework_list_view_factory.dart'; @@ -26,22 +25,20 @@ class OpenHomeworksViewBloc extends Bloc<OpenHomeworkViewEvent, OpenHomeworksViewBlocState> implements bloc_base.BlocBase { final OpenHomeworkListViewFactory _listViewFactory; - final hws_bloc.OpenHomeworkListBloc _openHomeworksBloc; + final HomeworkDataSource _dataSource; - late Stream<List<HomeworkReadModel>> _openHomeworks; late StreamSubscription _streamSubscription; List<HomeworkReadModel>? _latestHomeworks; Sort<HomeworkReadModel>? _currentSort; - OpenHomeworksViewBloc(this._openHomeworksBloc, this._listViewFactory) + OpenHomeworksViewBloc(this._dataSource, this._listViewFactory) : super(Uninitialized()) { _latestHomeworks = []; - _openHomeworks = _openHomeworksBloc.stream.transform(_toHomeworkList); on<LoadHomeworks>((event, emit) { _currentSort = event.sort; - _openHomeworksBloc.add(hws_bloc.LoadHomeworks()); - _streamSubscription = _openHomeworks.listen((hws) { + + _streamSubscription = _dataSource.openHomeworks.listen((hws) { _latestHomeworks = hws; add(_CreateListView(hws, _currentSort)); }); @@ -72,10 +69,3 @@ class _CreateListView extends OpenHomeworkViewEvent { @override List<Object?> get props => [homeworks, sort]; } - -final _toHomeworkList = StreamTransformer<hws_bloc.OpenHomeworkListBlocState, - List<HomeworkReadModel>>.fromHandlers(handleData: (state, sink) { - if (state is hws_bloc.Success) { - sink.add(state.homeworks); - } -}); diff --git a/lib/hausaufgabenheft_logik/lib/src/setup/create_homework_page_bloc.dart b/lib/hausaufgabenheft_logik/lib/src/setup/create_homework_page_bloc.dart index 3e641b6d7..d692c613a 100644 --- a/lib/hausaufgabenheft_logik/lib/src/setup/create_homework_page_bloc.dart +++ b/lib/hausaufgabenheft_logik/lib/src/setup/create_homework_page_bloc.dart @@ -8,7 +8,6 @@ import 'package:clock/clock.dart'; import 'package:hausaufgabenheft_logik/src/homework_completion/homework_page_completion_dispatcher.dart'; -import 'package:hausaufgabenheft_logik/src/open_homeworks/open_homework_list_bloc/open_homework_list_bloc.dart'; import 'package:hausaufgabenheft_logik/src/open_homeworks/open_homework_view_bloc/open_homework_view_bloc.dart'; import 'package:hausaufgabenheft_logik/src/student_homework_page_bloc/homework_sorting_cache.dart'; @@ -31,9 +30,8 @@ HomeworkPageBloc createHomeworkPageBloc( subcategorizerFactory.getMatchingSubcategorizer); final openHomeworkListViewFactory = OpenHomeworkListViewFactory(sortAndSubcategorizer, () => Date.now()); - final openHomeworkListBloc = OpenHomeworkListBloc(dependencies.dataSource); - final openHomeworksViewBloc = - OpenHomeworksViewBloc(openHomeworkListBloc, openHomeworkListViewFactory); + final openHomeworksViewBloc = OpenHomeworksViewBloc( + dependencies.dataSource, openHomeworkListViewFactory); final completedHomeworkListViewFactory = CompletedHomeworkListViewFactory(viewFactory); From 2af698c8ef4abffadcca032323eaac08e0ee832a Mon Sep 17 00:00:00 2001 From: Jonas Sander <29028262+Jonas-Sander@users.noreply.github.com> Date: Mon, 27 May 2024 20:15:22 +0200 Subject: [PATCH 17/28] Delete `OpenHomeworksViewBloc` --- .../open_homework_view_bloc/events.dart | 41 ----------- .../open_homework_view_bloc.dart | 71 ------------------- .../open_homework_view_bloc/states.dart | 33 --------- .../src/setup/create_homework_page_bloc.dart | 5 +- .../student_homework_page_bloc.dart | 52 +++++++------- .../test/homework_page_bloc_test.dart | 2 +- 6 files changed, 30 insertions(+), 174 deletions(-) delete mode 100644 lib/hausaufgabenheft_logik/lib/src/open_homeworks/open_homework_view_bloc/events.dart delete mode 100644 lib/hausaufgabenheft_logik/lib/src/open_homeworks/open_homework_view_bloc/open_homework_view_bloc.dart delete mode 100644 lib/hausaufgabenheft_logik/lib/src/open_homeworks/open_homework_view_bloc/states.dart diff --git a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/open_homework_view_bloc/events.dart b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/open_homework_view_bloc/events.dart deleted file mode 100644 index bd89f8bcd..000000000 --- a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/open_homework_view_bloc/events.dart +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright (c) 2022 Sharezone UG (haftungsbeschränkt) -// Licensed under the EUPL-1.2-or-later. -// -// You may obtain a copy of the Licence at: -// https://joinup.ec.europa.eu/software/page/eupl -// -// SPDX-License-Identifier: EUPL-1.2 - -import 'package:equatable/equatable.dart'; -import 'package:hausaufgabenheft_logik/src/models/homework.dart'; -import 'package:hausaufgabenheft_logik/src/open_homeworks/sort_and_subcategorization/sort/src/sort.dart'; - -abstract class OpenHomeworkViewEvent extends Equatable {} - -class LoadHomeworks extends OpenHomeworkViewEvent { - final Sort<HomeworkReadModel> sort; - - LoadHomeworks(this.sort); - - @override - List<Object> get props => [sort]; - - @override - String toString() { - return 'LoadHomeworks(sort: $sort)'; - } -} - -class SortingChanged extends OpenHomeworkViewEvent { - final Sort<HomeworkReadModel> sort; - - SortingChanged(this.sort); - - @override - List<Object> get props => [sort]; - - @override - String toString() { - return 'SortingChanged(sort: $sort)'; - } -} diff --git a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/open_homework_view_bloc/open_homework_view_bloc.dart b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/open_homework_view_bloc/open_homework_view_bloc.dart deleted file mode 100644 index c4da4b38a..000000000 --- a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/open_homework_view_bloc/open_homework_view_bloc.dart +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright (c) 2022 Sharezone UG (haftungsbeschränkt) -// Licensed under the EUPL-1.2-or-later. -// -// You may obtain a copy of the Licence at: -// https://joinup.ec.europa.eu/software/page/eupl -// -// SPDX-License-Identifier: EUPL-1.2 - -import 'dart:async'; - -import 'package:bloc/bloc.dart'; -import 'package:bloc_base/bloc_base.dart' as bloc_base; -import 'package:hausaufgabenheft_logik/src/data_source/homework_data_source.dart'; -import 'package:hausaufgabenheft_logik/src/models/homework.dart'; -import 'package:hausaufgabenheft_logik/src/open_homeworks/sort_and_subcategorization/sort/src/sort.dart'; -import 'package:hausaufgabenheft_logik/src/open_homeworks/views/open_homework_list_view_factory.dart'; - -import 'events.dart'; -import 'states.dart'; - -export 'events.dart'; -export 'states.dart'; - -class OpenHomeworksViewBloc - extends Bloc<OpenHomeworkViewEvent, OpenHomeworksViewBlocState> - implements bloc_base.BlocBase { - final OpenHomeworkListViewFactory _listViewFactory; - final HomeworkDataSource _dataSource; - - late StreamSubscription _streamSubscription; - List<HomeworkReadModel>? _latestHomeworks; - Sort<HomeworkReadModel>? _currentSort; - - OpenHomeworksViewBloc(this._dataSource, this._listViewFactory) - : super(Uninitialized()) { - _latestHomeworks = []; - - on<LoadHomeworks>((event, emit) { - _currentSort = event.sort; - - _streamSubscription = _dataSource.openHomeworks.listen((hws) { - _latestHomeworks = hws; - add(_CreateListView(hws, _currentSort)); - }); - }); - on<SortingChanged>((event, emit) { - _currentSort = event.sort; - add(_CreateListView(_latestHomeworks, _currentSort)); - }); - on<_CreateListView>((event, emit) { - final view = _listViewFactory.create(event.homeworks!, event.sort!); - var success = Success(view); - emit(success); - }); - } - - @override - void dispose() { - _streamSubscription.cancel(); - } -} - -class _CreateListView extends OpenHomeworkViewEvent { - final List<HomeworkReadModel>? homeworks; - final Sort<HomeworkReadModel>? sort; - - _CreateListView(this.homeworks, this.sort); - - @override - List<Object?> get props => [homeworks, sort]; -} diff --git a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/open_homework_view_bloc/states.dart b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/open_homework_view_bloc/states.dart deleted file mode 100644 index ce62f0a44..000000000 --- a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/open_homework_view_bloc/states.dart +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright (c) 2022 Sharezone UG (haftungsbeschränkt) -// Licensed under the EUPL-1.2-or-later. -// -// You may obtain a copy of the Licence at: -// https://joinup.ec.europa.eu/software/page/eupl -// -// SPDX-License-Identifier: EUPL-1.2 - -import 'package:hausaufgabenheft_logik/src/open_homeworks/views/open_homework_list_view.dart'; - -abstract class OpenHomeworksViewBlocState {} - -class Uninitialized extends OpenHomeworksViewBlocState {} - -class Success extends OpenHomeworksViewBlocState { - final OpenHomeworkListView openHomeworkListView; - - Success(this.openHomeworkListView); - - @override - bool operator ==(Object other) { - return identical(this, other) || - other is Success && other.openHomeworkListView == openHomeworkListView; - } - - @override - int get hashCode => openHomeworkListView.hashCode; - - @override - String toString() { - return 'Success(openHomeworkListView: $openHomeworkListView)'; - } -} diff --git a/lib/hausaufgabenheft_logik/lib/src/setup/create_homework_page_bloc.dart b/lib/hausaufgabenheft_logik/lib/src/setup/create_homework_page_bloc.dart index d692c613a..80f7fdbc8 100644 --- a/lib/hausaufgabenheft_logik/lib/src/setup/create_homework_page_bloc.dart +++ b/lib/hausaufgabenheft_logik/lib/src/setup/create_homework_page_bloc.dart @@ -8,7 +8,6 @@ import 'package:clock/clock.dart'; import 'package:hausaufgabenheft_logik/src/homework_completion/homework_page_completion_dispatcher.dart'; -import 'package:hausaufgabenheft_logik/src/open_homeworks/open_homework_view_bloc/open_homework_view_bloc.dart'; import 'package:hausaufgabenheft_logik/src/student_homework_page_bloc/homework_sorting_cache.dart'; import '../completed_homeworks/views/completed_homework_list_view_factory.dart'; @@ -30,8 +29,6 @@ HomeworkPageBloc createHomeworkPageBloc( subcategorizerFactory.getMatchingSubcategorizer); final openHomeworkListViewFactory = OpenHomeworkListViewFactory(sortAndSubcategorizer, () => Date.now()); - final openHomeworksViewBloc = OpenHomeworksViewBloc( - dependencies.dataSource, openHomeworkListViewFactory); final completedHomeworkListViewFactory = CompletedHomeworkListViewFactory(viewFactory); @@ -41,7 +38,7 @@ HomeworkPageBloc createHomeworkPageBloc( getCurrentOverdueHomeworkIds: dependencies.getOpenOverdueHomeworkIds); return HomeworkPageBloc( - openHomeworksViewBloc: openHomeworksViewBloc, + openHomeworkListViewFactory: openHomeworkListViewFactory, completedHomeworkListViewFactory: completedHomeworkListViewFactory, homeworkDataSource: dependencies.dataSource, numberOfInitialCompletedHomeworksToLoad: diff --git a/lib/hausaufgabenheft_logik/lib/src/student_homework_page_bloc/student_homework_page_bloc.dart b/lib/hausaufgabenheft_logik/lib/src/student_homework_page_bloc/student_homework_page_bloc.dart index 1c30203e5..148345a4c 100644 --- a/lib/hausaufgabenheft_logik/lib/src/student_homework_page_bloc/student_homework_page_bloc.dart +++ b/lib/hausaufgabenheft_logik/lib/src/student_homework_page_bloc/student_homework_page_bloc.dart @@ -14,9 +14,8 @@ import 'package:common_domain_models/common_domain_models.dart'; import 'package:hausaufgabenheft_logik/hausaufgabenheft_logik.dart'; import 'package:hausaufgabenheft_logik/src/completed_homeworks/views/completed_homework_list_view_factory.dart'; import 'package:hausaufgabenheft_logik/src/homework_completion/homework_page_completion_dispatcher.dart'; -import 'package:hausaufgabenheft_logik/src/open_homeworks/open_homework_view_bloc/open_homework_view_bloc.dart' - as open; import 'package:hausaufgabenheft_logik/src/open_homeworks/sort_and_subcategorization/sort/src/homework_sort_enum_sort_object_conversion_extensions.dart'; +import 'package:hausaufgabenheft_logik/src/open_homeworks/views/open_homework_list_view_factory.dart'; import 'package:hausaufgabenheft_logik/src/student_homework_page_bloc/homework_sorting_cache.dart'; import 'package:rxdart/rxdart.dart'; @@ -29,28 +28,29 @@ import 'package:rxdart/rxdart.dart'; /// between visits of the homework page. class HomeworkPageBloc extends Bloc<HomeworkPageEvent, HomeworkPageState> implements bloc_base.BlocBase { - final open.OpenHomeworksViewBloc _openHomeworksViewBloc; final HomeworkPageCompletionDispatcher _homeworkCompletionReceiver; final HomeworkDataSource _homeworkDataSource; final HomeworkSortingCache _homeworkSortingCache; final DateTime Function() _getCurrentDateTime; final int numberOfInitialCompletedHomeworksToLoad; final CompletedHomeworkListViewFactory _completedHomeworkListViewFactory; + final OpenHomeworkListViewFactory _openHomeworkListViewFactory; + final sortingStream = BehaviorSubject<HomeworkSort>(); LazyLoadingController? _lazyLoadingController; /// Whether [close] or [dispose] has been called; bool _isClosed = false; HomeworkPageBloc({ - required open.OpenHomeworksViewBloc openHomeworksViewBloc, required HomeworkPageCompletionDispatcher homeworkCompletionReceiver, required HomeworkSortingCache homeworkSortingCache, required HomeworkDataSource homeworkDataSource, required CompletedHomeworkListViewFactory completedHomeworkListViewFactory, + required OpenHomeworkListViewFactory openHomeworkListViewFactory, required this.numberOfInitialCompletedHomeworksToLoad, required DateTime Function() getCurrentDateTime, - }) : _openHomeworksViewBloc = openHomeworksViewBloc, - _homeworkDataSource = homeworkDataSource, + }) : _homeworkDataSource = homeworkDataSource, + _openHomeworkListViewFactory = openHomeworkListViewFactory, _homeworkSortingCache = homeworkSortingCache, _homeworkCompletionReceiver = homeworkCompletionReceiver, _completedHomeworkListViewFactory = completedHomeworkListViewFactory, @@ -82,29 +82,32 @@ class HomeworkPageBloc extends Bloc<HomeworkPageEvent, HomeworkPageState> StreamSubscription? _combineLatestSubscription; Future<void> _mapLoadHomeworksToState() async { + final sortEnum = (await _homeworkSortingCache.getLastSorting( + orElse: HomeworkSort.smallestDateSubjectAndTitle))!; + sortingStream.add(sortEnum); + + final openHwListStream = Rx.combineLatest2<List<HomeworkReadModel>, + HomeworkSort, OpenHomeworkListView>( + _homeworkDataSource.openHomeworks, sortingStream, (openHws, sort) { + final sortObj = sort.toSortObject(getCurrentDate: _getCurrentDate); + return _openHomeworkListViewFactory.create(openHws, sortObj); + }); + _lazyLoadingController = _homeworkDataSource.getLazyLoadingCompletedHomeworksController( numberOfInitialCompletedHomeworksToLoad); - final sortEnum = (await _homeworkSortingCache.getLastSorting( - orElse: HomeworkSort.smallestDateSubjectAndTitle))!; - final sort = sortEnum.toSortObject(getCurrentDate: _getCurrentDate); - _openHomeworksViewBloc.add(open.LoadHomeworks(sort)); - - final completedHomeworksSuccessStates = + final completedHomeworkListViewStream = _lazyLoadingController!.results.map((s) { final view = _completedHomeworkListViewFactory.create( s.homeworks, !s.moreHomeworkAvailable); return view; }); - final openHomeworksSuccessStates = - _openHomeworksViewBloc.stream.whereType<open.Success>(); - - _combineLatestSubscription = - Rx.combineLatest2<CompletedHomeworkListView, open.Success, Success>( - completedHomeworksSuccessStates, - openHomeworksSuccessStates, + _combineLatestSubscription = Rx.combineLatest2<CompletedHomeworkListView, + OpenHomeworkListView, Success>( + completedHomeworkListViewStream, + openHwListStream, _toSuccessState, ).listen((s) { if (!_isClosed) { @@ -113,9 +116,9 @@ class HomeworkPageBloc extends Bloc<HomeworkPageEvent, HomeworkPageState> }); } - Success _toSuccessState( - CompletedHomeworkListView completed, open.Success open) => - Success(completed, open.openHomeworkListView); + Success _toSuccessState(CompletedHomeworkListView completed, + OpenHomeworkListView openHomeworkListView) => + Success(completed, openHomeworkListView); void _mapAdvanceCompletedHomeworks(AdvanceCompletedHomeworks event) async { _lazyLoadingController!.advanceBy(event.advanceBy); @@ -123,8 +126,7 @@ class HomeworkPageBloc extends Bloc<HomeworkPageEvent, HomeworkPageState> Future<void> _mapFilterChangedToState(OpenHwSortingChanged event) async { await _homeworkSortingCache.setLastSorting(event.sort); - final newSorting = event.sort.toSortObject(getCurrentDate: _getCurrentDate); - _openHomeworksViewBloc.add(open.SortingChanged(newSorting)); + sortingStream.add(event.sort); } Future<void> _mapHomeworkChangedCompletionStatus( @@ -143,6 +145,7 @@ class HomeworkPageBloc extends Bloc<HomeworkPageEvent, HomeworkPageState> @override Future<void> close() { _isClosed = true; + sortingStream.close(); _combineLatestSubscription?.cancel(); return super.close(); } @@ -150,6 +153,7 @@ class HomeworkPageBloc extends Bloc<HomeworkPageEvent, HomeworkPageState> @override void dispose() { _isClosed = true; + sortingStream.close(); _combineLatestSubscription?.cancel(); } } diff --git a/lib/hausaufgabenheft_logik/test/homework_page_bloc_test.dart b/lib/hausaufgabenheft_logik/test/homework_page_bloc_test.dart index 60e771510..c9c11dec5 100644 --- a/lib/hausaufgabenheft_logik/test/homework_page_bloc_test.dart +++ b/lib/hausaufgabenheft_logik/test/homework_page_bloc_test.dart @@ -186,7 +186,7 @@ void main() { bloc.add(LoadHomeworks()); bloc.add(OpenHwSortingChanged(HomeworkSort.smallestDateSubjectAndTitle)); - Success result = await bloc.stream.whereType<Success>().skip(1).first; + Success result = await bloc.stream.whereType<Success>().first; final notDone = result.open; expect(notDone.sections.length, 5); From 91c13eccce138b7744b0b8acc2883dcac881dabf Mon Sep 17 00:00:00 2001 From: Jonas Sander <29028262+Jonas-Sander@users.noreply.github.com> Date: Tue, 28 May 2024 17:03:41 +0200 Subject: [PATCH 18/28] Merge files into sort_and_subcategorizer.dart --- .../sort_and_subcategorizer.dart | 119 ++++++++++++++++-- .../subcategorizer.dart | 13 -- .../subcategorizer_factory.dart | 30 ----- .../subject_subcategorizer.dart | 35 ------ .../todo_date_subcategorizer.dart | 64 ---------- .../src/setup/create_homework_page_bloc.dart | 11 +- 6 files changed, 115 insertions(+), 157 deletions(-) delete mode 100644 lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/subcategorizer.dart delete mode 100644 lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/subcategorizer_factory.dart delete mode 100644 lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/subject_subcategorizer.dart delete mode 100644 lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/todo_date_subcategorizer.dart diff --git a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort_and_subcategorizer.dart b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort_and_subcategorizer.dart index ffaaa9c33..2c924d1e5 100644 --- a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort_and_subcategorizer.dart +++ b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort_and_subcategorizer.dart @@ -6,22 +6,119 @@ // // SPDX-License-Identifier: EUPL-1.2 -import 'package:hausaufgabenheft_logik/src/homework_list_extensions.dart'; -import 'package:hausaufgabenheft_logik/src/open_homeworks/sort_and_subcategorization/sort/src/sort.dart'; -import 'package:hausaufgabenheft_logik/src/models/homework.dart'; -import 'package:hausaufgabenheft_logik/src/open_homeworks/views/homework_section_view.dart'; - -import 'subcategorizer.dart'; +import 'package:hausaufgabenheft_logik/color.dart'; +import 'package:hausaufgabenheft_logik/hausaufgabenheft_logik.dart'; +import 'package:hausaufgabenheft_logik/src/views/student_homework_view_factory.dart'; class HomeworkSortAndSubcategorizer { - Subcategorizer Function(Sort<HomeworkReadModel> sortToMatch) - getMatchingSubcategorizer; - - HomeworkSortAndSubcategorizer(this.getMatchingSubcategorizer); + final Color defaultColor; + final Date Function() getCurrentDate; + HomeworkSortAndSubcategorizer({ + required this.defaultColor, + required this.getCurrentDate, + }); List<HomeworkSectionView> sortAndSubcategorize( List<HomeworkReadModel> homeworks, Sort<HomeworkReadModel> sort) { homeworks.sortWith(sort); - return getMatchingSubcategorizer(sort).subcategorize(homeworks); + return SubcategorizerFactory(StudentHomeworkViewFactory( + defaultColorValue: defaultColor.value, + getCurrentDate: getCurrentDate, + )).getMatchingSubcategorizer(sort).subcategorize(homeworks); + } +} + +class SubcategorizerFactory { + final StudentHomeworkViewFactory _viewFactory; + + SubcategorizerFactory(this._viewFactory); + + Subcategorizer getMatchingSubcategorizer(Sort sort) { + if (sort is SubjectSmallestDateAndTitleSort) { + return SubjectSubcategeorizer(_viewFactory); + } else if (sort is SmallestDateSubjectAndTitleSort) { + return TodoDateSubcategorizer(sort.getCurrentDate(), _viewFactory); + } else { + throw UnimplementedError('No matching Subcategorizer for $sort'); + } + } +} + +abstract class Subcategorizer { + List<HomeworkSectionView> subcategorize(List<HomeworkReadModel> homeworks); +} + +class SubjectSubcategeorizer extends Subcategorizer { + final StudentHomeworkViewFactory _viewFactory; + + SubjectSubcategeorizer(this._viewFactory); + + @override + List<HomeworkSectionView> subcategorize(List<HomeworkReadModel> homeworks) { + final subjects = homeworks.getDistinctOrderedSubjects(); + final homeworkSections = <HomeworkSectionView>[]; + for (final subject in subjects) { + final List<HomeworkReadModel> homeworksWithSubject = + homeworks.where((h) => h.subject == subject).toList(); + + final homeworkViewsWithSubject = + homeworksWithSubject.map((h) => _viewFactory.createFrom(h)).toList(); + + homeworkSections + .add(HomeworkSectionView(subject.name, homeworkViewsWithSubject)); + } + return homeworkSections; + } +} + +class TodoDateSubcategorizer extends Subcategorizer { + final Date currentDate; + final StudentHomeworkViewFactory _viewFactory; + + TodoDateSubcategorizer(this.currentDate, this._viewFactory); + + @override + List<HomeworkSectionView> subcategorize(List<HomeworkReadModel> homeworks) { + final latestHomeworkList = homeworks; + final now = currentDate; + final tomorrow = now.addDays(1); + final in2Days = tomorrow.addDays(1); + + final List<HomeworkReadModel> overdueHomework = latestHomeworkList + .where((h) => Date.fromDateTime(h.todoDate) < now) + .toList(); + final List<HomeworkReadModel> todayHomework = latestHomeworkList + .where((h) => Date.fromDateTime(h.todoDate) == now) + .toList(); + final List<HomeworkReadModel> tomorrowHomework = latestHomeworkList + .where((h) => Date.fromDateTime(h.todoDate) == tomorrow) + .toList(); + final List<HomeworkReadModel> in2DaysHomework = latestHomeworkList + .where((h) => Date.fromDateTime(h.todoDate) == in2Days) + .toList(); + final List<HomeworkReadModel> futureHomework = latestHomeworkList + .where((h) => Date.fromDateTime(h.todoDate) > in2Days) + .toList(); + + final overdueSec = HomeworkSectionView.fromModels( + 'Überfällig', overdueHomework, _viewFactory); + final todaySec = + HomeworkSectionView.fromModels('Heute', todayHomework, _viewFactory); + final tomorrowSec = HomeworkSectionView.fromModels( + 'Morgen', tomorrowHomework, _viewFactory); + final inTwoDaysSec = HomeworkSectionView.fromModels( + 'Übermorgen', in2DaysHomework, _viewFactory); + final afterTwoDaysSec = + HomeworkSectionView.fromModels('Später', futureHomework, _viewFactory); + + final sections = [ + overdueSec, + todaySec, + tomorrowSec, + inTwoDaysSec, + afterTwoDaysSec + ]; + + return sections.where((section) => section.isNotEmpty).toList(); } } diff --git a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/subcategorizer.dart b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/subcategorizer.dart deleted file mode 100644 index 330bd38e8..000000000 --- a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/subcategorizer.dart +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright (c) 2022 Sharezone UG (haftungsbeschränkt) -// Licensed under the EUPL-1.2-or-later. -// -// You may obtain a copy of the Licence at: -// https://joinup.ec.europa.eu/software/page/eupl -// -// SPDX-License-Identifier: EUPL-1.2 - -import 'package:hausaufgabenheft_logik/hausaufgabenheft_logik.dart'; - -abstract class Subcategorizer { - List<HomeworkSectionView> subcategorize(List<HomeworkReadModel> homeworks); -} diff --git a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/subcategorizer_factory.dart b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/subcategorizer_factory.dart deleted file mode 100644 index 392747ad3..000000000 --- a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/subcategorizer_factory.dart +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright (c) 2022 Sharezone UG (haftungsbeschränkt) -// Licensed under the EUPL-1.2-or-later. -// -// You may obtain a copy of the Licence at: -// https://joinup.ec.europa.eu/software/page/eupl -// -// SPDX-License-Identifier: EUPL-1.2 - -import 'package:hausaufgabenheft_logik/src/open_homeworks/sort_and_subcategorization/sort/homework_sorts.dart'; -import 'package:hausaufgabenheft_logik/src/views/student_homework_view_factory.dart'; - -import 'subcategorizer.dart'; -import 'subject_subcategorizer.dart'; -import 'todo_date_subcategorizer.dart'; - -class SubcategorizerFactory { - final StudentHomeworkViewFactory _viewFactory; - - SubcategorizerFactory(this._viewFactory); - - Subcategorizer getMatchingSubcategorizer(Sort sort) { - if (sort is SubjectSmallestDateAndTitleSort) { - return SubjectSubcategeorizer(_viewFactory); - } else if (sort is SmallestDateSubjectAndTitleSort) { - return TodoDateSubcategorizer(sort.getCurrentDate(), _viewFactory); - } else { - throw UnimplementedError('No matching Subcategorizer for $sort'); - } - } -} diff --git a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/subject_subcategorizer.dart b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/subject_subcategorizer.dart deleted file mode 100644 index bbaa22998..000000000 --- a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/subject_subcategorizer.dart +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright (c) 2022 Sharezone UG (haftungsbeschränkt) -// Licensed under the EUPL-1.2-or-later. -// -// You may obtain a copy of the Licence at: -// https://joinup.ec.europa.eu/software/page/eupl -// -// SPDX-License-Identifier: EUPL-1.2 - -import 'package:hausaufgabenheft_logik/hausaufgabenheft_logik.dart'; -import 'package:hausaufgabenheft_logik/src/views/student_homework_view_factory.dart'; - -import 'subcategorizer.dart'; - -class SubjectSubcategeorizer extends Subcategorizer { - final StudentHomeworkViewFactory _viewFactory; - - SubjectSubcategeorizer(this._viewFactory); - - @override - List<HomeworkSectionView> subcategorize(List<HomeworkReadModel> homeworks) { - final subjects = homeworks.getDistinctOrderedSubjects(); - final homeworkSections = <HomeworkSectionView>[]; - for (final subject in subjects) { - final List<HomeworkReadModel> homeworksWithSubject = - homeworks.where((h) => h.subject == subject).toList(); - - final homeworkViewsWithSubject = - homeworksWithSubject.map((h) => _viewFactory.createFrom(h)).toList(); - - homeworkSections - .add(HomeworkSectionView(subject.name, homeworkViewsWithSubject)); - } - return homeworkSections; - } -} diff --git a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/todo_date_subcategorizer.dart b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/todo_date_subcategorizer.dart deleted file mode 100644 index 4f8ab8711..000000000 --- a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/todo_date_subcategorizer.dart +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright (c) 2022 Sharezone UG (haftungsbeschränkt) -// Licensed under the EUPL-1.2-or-later. -// -// You may obtain a copy of the Licence at: -// https://joinup.ec.europa.eu/software/page/eupl -// -// SPDX-License-Identifier: EUPL-1.2 - -import 'package:hausaufgabenheft_logik/hausaufgabenheft_logik.dart'; -import 'package:hausaufgabenheft_logik/src/views/student_homework_view_factory.dart'; - -import 'subcategorizer.dart'; - -class TodoDateSubcategorizer extends Subcategorizer { - final Date currentDate; - final StudentHomeworkViewFactory _viewFactory; - - TodoDateSubcategorizer(this.currentDate, this._viewFactory); - - @override - List<HomeworkSectionView> subcategorize(List<HomeworkReadModel> homeworks) { - final latestHomeworkList = homeworks; - final now = currentDate; - final tomorrow = now.addDays(1); - final in2Days = tomorrow.addDays(1); - - final List<HomeworkReadModel> overdueHomework = latestHomeworkList - .where((h) => Date.fromDateTime(h.todoDate) < now) - .toList(); - final List<HomeworkReadModel> todayHomework = latestHomeworkList - .where((h) => Date.fromDateTime(h.todoDate) == now) - .toList(); - final List<HomeworkReadModel> tomorrowHomework = latestHomeworkList - .where((h) => Date.fromDateTime(h.todoDate) == tomorrow) - .toList(); - final List<HomeworkReadModel> in2DaysHomework = latestHomeworkList - .where((h) => Date.fromDateTime(h.todoDate) == in2Days) - .toList(); - final List<HomeworkReadModel> futureHomework = latestHomeworkList - .where((h) => Date.fromDateTime(h.todoDate) > in2Days) - .toList(); - - final overdueSec = HomeworkSectionView.fromModels( - 'Überfällig', overdueHomework, _viewFactory); - final todaySec = - HomeworkSectionView.fromModels('Heute', todayHomework, _viewFactory); - final tomorrowSec = HomeworkSectionView.fromModels( - 'Morgen', tomorrowHomework, _viewFactory); - final inTwoDaysSec = HomeworkSectionView.fromModels( - 'Übermorgen', in2DaysHomework, _viewFactory); - final afterTwoDaysSec = - HomeworkSectionView.fromModels('Später', futureHomework, _viewFactory); - - final sections = [ - overdueSec, - todaySec, - tomorrowSec, - inTwoDaysSec, - afterTwoDaysSec - ]; - - return sections.where((section) => section.isNotEmpty).toList(); - } -} diff --git a/lib/hausaufgabenheft_logik/lib/src/setup/create_homework_page_bloc.dart b/lib/hausaufgabenheft_logik/lib/src/setup/create_homework_page_bloc.dart index 80f7fdbc8..6a46c8995 100644 --- a/lib/hausaufgabenheft_logik/lib/src/setup/create_homework_page_bloc.dart +++ b/lib/hausaufgabenheft_logik/lib/src/setup/create_homework_page_bloc.dart @@ -7,13 +7,13 @@ // SPDX-License-Identifier: EUPL-1.2 import 'package:clock/clock.dart'; +import 'package:hausaufgabenheft_logik/color.dart'; import 'package:hausaufgabenheft_logik/src/homework_completion/homework_page_completion_dispatcher.dart'; import 'package:hausaufgabenheft_logik/src/student_homework_page_bloc/homework_sorting_cache.dart'; import '../completed_homeworks/views/completed_homework_list_view_factory.dart'; import '../models/models.dart'; import '../open_homeworks/sort_and_subcategorization/sort_and_subcategorizer.dart'; -import '../open_homeworks/sort_and_subcategorization/subcategorizer_factory.dart'; import '../open_homeworks/views/open_homework_list_view_factory.dart'; import '../student_homework_page_bloc/student_homework_page_bloc.dart'; import '../views/student_homework_view_factory.dart'; @@ -22,13 +22,16 @@ import 'dependencies.dart'; HomeworkPageBloc createHomeworkPageBloc( HausaufgabenheftDependencies dependencies, HausaufgabenheftConfig config) { + getCurrentDate() => Date.now(); + final viewFactory = StudentHomeworkViewFactory( defaultColorValue: config.defaultCourseColorValue); - final subcategorizerFactory = SubcategorizerFactory(viewFactory); final sortAndSubcategorizer = HomeworkSortAndSubcategorizer( - subcategorizerFactory.getMatchingSubcategorizer); + defaultColor: Color(config.defaultCourseColorValue), + getCurrentDate: getCurrentDate, + ); final openHomeworkListViewFactory = - OpenHomeworkListViewFactory(sortAndSubcategorizer, () => Date.now()); + OpenHomeworkListViewFactory(sortAndSubcategorizer, getCurrentDate); final completedHomeworkListViewFactory = CompletedHomeworkListViewFactory(viewFactory); From ce0757a6870d46188a1b129460f24acd4e8df45d Mon Sep 17 00:00:00 2001 From: Jonas Sander <29028262+Jonas-Sander@users.noreply.github.com> Date: Tue, 28 May 2024 17:07:25 +0200 Subject: [PATCH 19/28] Merge sorts into sort.dart --- .../lib/hausaufgabenheft_logik.dart | 20 ++++--- .../sort/homework_sorts.dart | 2 - .../smallest_date_subject_and_title_sort.dart | 41 -------------- .../sort/src/sort.dart | 53 ++++++++++++++++++- .../subject_smallest_date_and_title_sort.dart | 30 ----------- .../test/homework_list_test.dart | 6 +-- 6 files changed, 62 insertions(+), 90 deletions(-) delete mode 100644 lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort/smallest_date_subject_and_title_sort.dart delete mode 100644 lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort/subject_smallest_date_and_title_sort.dart diff --git a/lib/hausaufgabenheft_logik/lib/hausaufgabenheft_logik.dart b/lib/hausaufgabenheft_logik/lib/hausaufgabenheft_logik.dart index 23dc99565..0d6924715 100644 --- a/lib/hausaufgabenheft_logik/lib/hausaufgabenheft_logik.dart +++ b/lib/hausaufgabenheft_logik/lib/hausaufgabenheft_logik.dart @@ -39,19 +39,17 @@ /// library hausaufgabenheft_logik; -export 'src/student_homework_page_bloc/events.dart'; -export 'src/student_homework_page_bloc/student_homework_page_bloc.dart'; -export 'src/student_homework_page_bloc/states.dart'; +export 'src/completed_homeworks/views/completed_homwork_list_view.dart'; +export 'src/data_source/homework_data_source.dart'; +export 'src/homework_completion/homework_completion_dispatcher.dart'; +export 'src/homework_list_extensions.dart'; export 'src/models/homework.dart'; export 'src/models/models.dart'; -export 'src/open_homeworks/sort_and_subcategorization/sort/smallest_date_subject_and_title_sort.dart'; export 'src/open_homeworks/sort_and_subcategorization/sort/src/sort.dart'; -export 'src/open_homeworks/sort_and_subcategorization/sort/subject_smallest_date_and_title_sort.dart'; -export 'src/completed_homeworks/views/completed_homwork_list_view.dart'; -export 'src/open_homeworks/views/open_homework_list_view.dart'; export 'src/open_homeworks/sort_and_subcategorization/sort_and_subcategorizer.dart'; -export 'src/views/homework_view.dart'; export 'src/open_homeworks/views/homework_section_view.dart'; -export 'src/data_source/homework_data_source.dart'; -export 'src/homework_completion/homework_completion_dispatcher.dart'; -export 'src/homework_list_extensions.dart'; +export 'src/open_homeworks/views/open_homework_list_view.dart'; +export 'src/student_homework_page_bloc/events.dart'; +export 'src/student_homework_page_bloc/states.dart'; +export 'src/student_homework_page_bloc/student_homework_page_bloc.dart'; +export 'src/views/homework_view.dart'; diff --git a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort/homework_sorts.dart b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort/homework_sorts.dart index 29c29d14a..b7eb8950c 100644 --- a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort/homework_sorts.dart +++ b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort/homework_sorts.dart @@ -6,6 +6,4 @@ // // SPDX-License-Identifier: EUPL-1.2 -export 'smallest_date_subject_and_title_sort.dart'; export 'src/sort.dart'; -export 'subject_smallest_date_and_title_sort.dart'; diff --git a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort/smallest_date_subject_and_title_sort.dart b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort/smallest_date_subject_and_title_sort.dart deleted file mode 100644 index 7631dd384..000000000 --- a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort/smallest_date_subject_and_title_sort.dart +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright (c) 2022 Sharezone UG (haftungsbeschränkt) -// Licensed under the EUPL-1.2-or-later. -// -// You may obtain a copy of the Licence at: -// https://joinup.ec.europa.eu/software/page/eupl -// -// SPDX-License-Identifier: EUPL-1.2 - -import '../../../models/homework.dart'; -import '../../../models/date.dart'; -import 'src/sort.dart'; -import 'src/sort_with_operations.dart'; -import 'src/homework_attribute_sorts.dart'; - -/// Sorts the homeworks firstly by date (earliest date first). -/// If they have the same date, they will be sorted alphabetically by subject. -/// If they have the same date and subject, they will be sorted alphabetically by title. -class SmallestDateSubjectAndTitleSort extends Sort<HomeworkReadModel> { - late Date Function() getCurrentDate; - - SmallestDateSubjectAndTitleSort({Date Function()? getCurrentDate}) { - this.getCurrentDate = getCurrentDate ?? () => Date.now(); - } - - @override - List<HomeworkReadModel> sort(List<HomeworkReadModel> list) { - sortWithOperations<HomeworkReadModel>( - list, List.from([dateSort, subjectSort, titleSort])); - return list; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - other is SmallestDateSubjectAndTitleSort && - other.getCurrentDate == getCurrentDate; - } - - @override - int get hashCode => getCurrentDate.hashCode; -} diff --git a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort/src/sort.dart b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort/src/sort.dart index fc3e796c7..8e38b6f93 100644 --- a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort/src/sort.dart +++ b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort/src/sort.dart @@ -6,6 +6,57 @@ // // SPDX-License-Identifier: EUPL-1.2 -abstract class Sort<T> { +import 'package:hausaufgabenheft_logik/hausaufgabenheft_logik.dart'; + +import 'homework_attribute_sorts.dart'; +import 'sort_with_operations.dart'; + +sealed class Sort<T> { void sort(List<T> list); } + +/// Sorts the homeworks firstly by date (earliest date first). +/// If they have the same date, they will be sorted alphabetically by subject. +/// If they have the same date and subject, they will be sorted alphabetically by title. +class SmallestDateSubjectAndTitleSort extends Sort<HomeworkReadModel> { + late Date Function() getCurrentDate; + + SmallestDateSubjectAndTitleSort({Date Function()? getCurrentDate}) { + this.getCurrentDate = getCurrentDate ?? () => Date.now(); + } + + @override + List<HomeworkReadModel> sort(List<HomeworkReadModel> list) { + sortWithOperations<HomeworkReadModel>( + list, List.from([dateSort, subjectSort, titleSort])); + return list; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + other is SmallestDateSubjectAndTitleSort && + other.getCurrentDate == getCurrentDate; + } + + @override + int get hashCode => getCurrentDate.hashCode; +} + +/// Sorts the homeworks firstly by Subject. +/// If they have the same subject, they will be sorted by date (earliest date first). +/// If they have the same date and subject, they will be sorted alphabetically by title. +class SubjectSmallestDateAndTitleSort extends Sort<HomeworkReadModel> { + @override + List<HomeworkReadModel> sort(List<HomeworkReadModel> list) { + sortWithOperations<HomeworkReadModel>( + list, List.from([subjectSort, dateSort, titleSort])); + return list; + } + + @override + bool operator ==(Object other) => true; + + @override + int get hashCode => 1337; +} diff --git a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort/subject_smallest_date_and_title_sort.dart b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort/subject_smallest_date_and_title_sort.dart deleted file mode 100644 index 5901c9cc2..000000000 --- a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort/subject_smallest_date_and_title_sort.dart +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright (c) 2022 Sharezone UG (haftungsbeschränkt) -// Licensed under the EUPL-1.2-or-later. -// -// You may obtain a copy of the Licence at: -// https://joinup.ec.europa.eu/software/page/eupl -// -// SPDX-License-Identifier: EUPL-1.2 - -import '../../../models/homework.dart'; -import 'src/sort.dart'; -import 'src/sort_with_operations.dart'; -import 'src/homework_attribute_sorts.dart'; - -/// Sorts the homeworks firstly by Subject. -/// If they have the same subject, they will be sorted by date (earliest date first). -/// If they have the same date and subject, they will be sorted alphabetically by title. -class SubjectSmallestDateAndTitleSort extends Sort<HomeworkReadModel> { - @override - List<HomeworkReadModel> sort(List<HomeworkReadModel> list) { - sortWithOperations<HomeworkReadModel>( - list, List.from([subjectSort, dateSort, titleSort])); - return list; - } - - @override - bool operator ==(Object other) => true; - - @override - int get hashCode => 1337; -} diff --git a/lib/hausaufgabenheft_logik/test/homework_list_test.dart b/lib/hausaufgabenheft_logik/test/homework_list_test.dart index 8a10e9bcc..beb86135e 100644 --- a/lib/hausaufgabenheft_logik/test/homework_list_test.dart +++ b/lib/hausaufgabenheft_logik/test/homework_list_test.dart @@ -6,11 +6,7 @@ // // SPDX-License-Identifier: EUPL-1.2 -import 'package:hausaufgabenheft_logik/src/models/homework.dart'; -import 'package:hausaufgabenheft_logik/src/models/models.dart'; -import 'package:hausaufgabenheft_logik/src/homework_list_extensions.dart'; -import 'package:hausaufgabenheft_logik/src/open_homeworks/sort_and_subcategorization/sort/smallest_date_subject_and_title_sort.dart'; -import 'package:hausaufgabenheft_logik/src/open_homeworks/sort_and_subcategorization/sort/subject_smallest_date_and_title_sort.dart'; +import 'package:hausaufgabenheft_logik/hausaufgabenheft_logik.dart'; import 'package:test/test.dart'; import 'create_homework_util.dart'; From 5deea794c9879c2fe2f2ea0f2a77b443b51d1de5 Mon Sep 17 00:00:00 2001 From: Jonas Sander <29028262+Jonas-Sander@users.noreply.github.com> Date: Tue, 28 May 2024 17:21:24 +0200 Subject: [PATCH 20/28] Fix getCurrentDate --- .../lib/src/setup/create_homework_page_bloc.dart | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/hausaufgabenheft_logik/lib/src/setup/create_homework_page_bloc.dart b/lib/hausaufgabenheft_logik/lib/src/setup/create_homework_page_bloc.dart index 6a46c8995..17b660143 100644 --- a/lib/hausaufgabenheft_logik/lib/src/setup/create_homework_page_bloc.dart +++ b/lib/hausaufgabenheft_logik/lib/src/setup/create_homework_page_bloc.dart @@ -22,7 +22,9 @@ import 'dependencies.dart'; HomeworkPageBloc createHomeworkPageBloc( HausaufgabenheftDependencies dependencies, HausaufgabenheftConfig config) { - getCurrentDate() => Date.now(); + final getCurrentDateTime = + dependencies.getCurrentDateTime ?? () => clock.now(); + getCurrentDate() => Date.fromDateTime(getCurrentDateTime()); final viewFactory = StudentHomeworkViewFactory( defaultColorValue: config.defaultCourseColorValue); From c875f299da507a175f4897912465db3ca81abef6 Mon Sep 17 00:00:00 2001 From: Jonas Sander <29028262+Jonas-Sander@users.noreply.github.com> Date: Tue, 28 May 2024 17:21:35 +0200 Subject: [PATCH 21/28] Inline SubcategorizerFactory --- .../sort_and_subcategorizer.dart | 26 +++++++------------ 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort_and_subcategorizer.dart b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort_and_subcategorizer.dart index 2c924d1e5..7c4bf757a 100644 --- a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort_and_subcategorizer.dart +++ b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort_and_subcategorizer.dart @@ -21,26 +21,20 @@ class HomeworkSortAndSubcategorizer { List<HomeworkSectionView> sortAndSubcategorize( List<HomeworkReadModel> homeworks, Sort<HomeworkReadModel> sort) { homeworks.sortWith(sort); - return SubcategorizerFactory(StudentHomeworkViewFactory( + + final studentHomeworkViewFactory = StudentHomeworkViewFactory( defaultColorValue: defaultColor.value, getCurrentDate: getCurrentDate, - )).getMatchingSubcategorizer(sort).subcategorize(homeworks); - } -} + ); -class SubcategorizerFactory { - final StudentHomeworkViewFactory _viewFactory; - - SubcategorizerFactory(this._viewFactory); + final matchingSubcategorizer = switch (sort) { + SubjectSmallestDateAndTitleSort() => + SubjectSubcategeorizer(studentHomeworkViewFactory), + SmallestDateSubjectAndTitleSort() => + TodoDateSubcategorizer(getCurrentDate(), studentHomeworkViewFactory), + }; - Subcategorizer getMatchingSubcategorizer(Sort sort) { - if (sort is SubjectSmallestDateAndTitleSort) { - return SubjectSubcategeorizer(_viewFactory); - } else if (sort is SmallestDateSubjectAndTitleSort) { - return TodoDateSubcategorizer(sort.getCurrentDate(), _viewFactory); - } else { - throw UnimplementedError('No matching Subcategorizer for $sort'); - } + return matchingSubcategorizer.subcategorize(homeworks); } } From 5787e06e7034088716e23f72c230d1dee7930f4a Mon Sep 17 00:00:00 2001 From: Jonas Sander <29028262+Jonas-Sander@users.noreply.github.com> Date: Tue, 28 May 2024 17:33:01 +0200 Subject: [PATCH 22/28] Make _Subcategorizer private; refactor. --- .../sort_and_subcategorizer.dart | 29 +++++++++---------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort_and_subcategorizer.dart b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort_and_subcategorizer.dart index 7c4bf757a..c73662795 100644 --- a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort_and_subcategorizer.dart +++ b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort_and_subcategorizer.dart @@ -11,41 +11,40 @@ import 'package:hausaufgabenheft_logik/hausaufgabenheft_logik.dart'; import 'package:hausaufgabenheft_logik/src/views/student_homework_view_factory.dart'; class HomeworkSortAndSubcategorizer { - final Color defaultColor; + final StudentHomeworkViewFactory _viewFactory; final Date Function() getCurrentDate; + HomeworkSortAndSubcategorizer({ - required this.defaultColor, + required Color defaultColor, required this.getCurrentDate, - }); + }) : _viewFactory = StudentHomeworkViewFactory( + defaultColorValue: defaultColor.value, + getCurrentDate: getCurrentDate, + ); List<HomeworkSectionView> sortAndSubcategorize( List<HomeworkReadModel> homeworks, Sort<HomeworkReadModel> sort) { homeworks.sortWith(sort); - final studentHomeworkViewFactory = StudentHomeworkViewFactory( - defaultColorValue: defaultColor.value, - getCurrentDate: getCurrentDate, - ); - final matchingSubcategorizer = switch (sort) { SubjectSmallestDateAndTitleSort() => - SubjectSubcategeorizer(studentHomeworkViewFactory), + _SubjectSubcategeorizer(_viewFactory), SmallestDateSubjectAndTitleSort() => - TodoDateSubcategorizer(getCurrentDate(), studentHomeworkViewFactory), + _TodoDateSubcategorizer(getCurrentDate(), _viewFactory), }; return matchingSubcategorizer.subcategorize(homeworks); } } -abstract class Subcategorizer { +abstract class _Subcategorizer { List<HomeworkSectionView> subcategorize(List<HomeworkReadModel> homeworks); } -class SubjectSubcategeorizer extends Subcategorizer { +class _SubjectSubcategeorizer extends _Subcategorizer { final StudentHomeworkViewFactory _viewFactory; - SubjectSubcategeorizer(this._viewFactory); + _SubjectSubcategeorizer(this._viewFactory); @override List<HomeworkSectionView> subcategorize(List<HomeworkReadModel> homeworks) { @@ -65,11 +64,11 @@ class SubjectSubcategeorizer extends Subcategorizer { } } -class TodoDateSubcategorizer extends Subcategorizer { +class _TodoDateSubcategorizer extends _Subcategorizer { final Date currentDate; final StudentHomeworkViewFactory _viewFactory; - TodoDateSubcategorizer(this.currentDate, this._viewFactory); + _TodoDateSubcategorizer(this.currentDate, this._viewFactory); @override List<HomeworkSectionView> subcategorize(List<HomeworkReadModel> homeworks) { From 88de985c07c2d952e2dd4d1683a89191bc1e7e28 Mon Sep 17 00:00:00 2001 From: Jonas Sander <29028262+Jonas-Sander@users.noreply.github.com> Date: Tue, 28 May 2024 17:47:30 +0200 Subject: [PATCH 23/28] Refactor _mapLoadHomeworksToState --- .../student_homework_page_bloc.dart | 40 +++++++------------ 1 file changed, 15 insertions(+), 25 deletions(-) diff --git a/lib/hausaufgabenheft_logik/lib/src/student_homework_page_bloc/student_homework_page_bloc.dart b/lib/hausaufgabenheft_logik/lib/src/student_homework_page_bloc/student_homework_page_bloc.dart index 148345a4c..a2604a54c 100644 --- a/lib/hausaufgabenheft_logik/lib/src/student_homework_page_bloc/student_homework_page_bloc.dart +++ b/lib/hausaufgabenheft_logik/lib/src/student_homework_page_bloc/student_homework_page_bloc.dart @@ -82,44 +82,34 @@ class HomeworkPageBloc extends Bloc<HomeworkPageEvent, HomeworkPageState> StreamSubscription? _combineLatestSubscription; Future<void> _mapLoadHomeworksToState() async { + _lazyLoadingController = + _homeworkDataSource.getLazyLoadingCompletedHomeworksController( + numberOfInitialCompletedHomeworksToLoad); + final sortEnum = (await _homeworkSortingCache.getLastSorting( orElse: HomeworkSort.smallestDateSubjectAndTitle))!; sortingStream.add(sortEnum); - final openHwListStream = Rx.combineLatest2<List<HomeworkReadModel>, - HomeworkSort, OpenHomeworkListView>( - _homeworkDataSource.openHomeworks, sortingStream, (openHws, sort) { + _combineLatestSubscription = Rx.combineLatest3<List<HomeworkReadModel>, + HomeworkSort, LazyLoadingResult, Success>( + _homeworkDataSource.openHomeworks, + sortingStream, + _lazyLoadingController!.results, (openHws, sort, lazyCompletedHwsRes) { final sortObj = sort.toSortObject(getCurrentDate: _getCurrentDate); - return _openHomeworkListViewFactory.create(openHws, sortObj); - }); + final open = _openHomeworkListViewFactory.create(openHws, sortObj); - _lazyLoadingController = - _homeworkDataSource.getLazyLoadingCompletedHomeworksController( - numberOfInitialCompletedHomeworksToLoad); + final completed = _completedHomeworkListViewFactory.create( + lazyCompletedHwsRes.homeworks, + !lazyCompletedHwsRes.moreHomeworkAvailable); - final completedHomeworkListViewStream = - _lazyLoadingController!.results.map((s) { - final view = _completedHomeworkListViewFactory.create( - s.homeworks, !s.moreHomeworkAvailable); - return view; - }); - - _combineLatestSubscription = Rx.combineLatest2<CompletedHomeworkListView, - OpenHomeworkListView, Success>( - completedHomeworkListViewStream, - openHwListStream, - _toSuccessState, - ).listen((s) { + return Success(completed, open); + }).listen((s) { if (!_isClosed) { add(_Yield(s)); } }); } - Success _toSuccessState(CompletedHomeworkListView completed, - OpenHomeworkListView openHomeworkListView) => - Success(completed, openHomeworkListView); - void _mapAdvanceCompletedHomeworks(AdvanceCompletedHomeworks event) async { _lazyLoadingController!.advanceBy(event.advanceBy); } From b7ef85add39b919b86aebf8d0aa09e166ab6880b Mon Sep 17 00:00:00 2001 From: Jonas Sander <29028262+Jonas-Sander@users.noreply.github.com> Date: Tue, 28 May 2024 17:53:42 +0200 Subject: [PATCH 24/28] refactor _homeworkSortingCache.getLastSorting --- .../student_homework_page_bloc/homework_sorting_cache.dart | 4 ++-- .../student_homework_page_bloc.dart | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/hausaufgabenheft_logik/lib/src/student_homework_page_bloc/homework_sorting_cache.dart b/lib/hausaufgabenheft_logik/lib/src/student_homework_page_bloc/homework_sorting_cache.dart index 14b9aa0b9..9dac83f26 100644 --- a/lib/hausaufgabenheft_logik/lib/src/student_homework_page_bloc/homework_sorting_cache.dart +++ b/lib/hausaufgabenheft_logik/lib/src/student_homework_page_bloc/homework_sorting_cache.dart @@ -20,8 +20,8 @@ class HomeworkSortingCache { await _keyValueStore.setString(_key, homeworkSortToString(homeworkSort)); } - Future<HomeworkSort?> getLastSorting({HomeworkSort? orElse}) async { + Future<HomeworkSort?> getLastSorting() async { final string = _keyValueStore.getString(_key); - return string != null ? homeworkSortFromString(string) : orElse; + return string != null ? homeworkSortFromString(string) : null; } } diff --git a/lib/hausaufgabenheft_logik/lib/src/student_homework_page_bloc/student_homework_page_bloc.dart b/lib/hausaufgabenheft_logik/lib/src/student_homework_page_bloc/student_homework_page_bloc.dart index a2604a54c..8f09ecc90 100644 --- a/lib/hausaufgabenheft_logik/lib/src/student_homework_page_bloc/student_homework_page_bloc.dart +++ b/lib/hausaufgabenheft_logik/lib/src/student_homework_page_bloc/student_homework_page_bloc.dart @@ -86,8 +86,8 @@ class HomeworkPageBloc extends Bloc<HomeworkPageEvent, HomeworkPageState> _homeworkDataSource.getLazyLoadingCompletedHomeworksController( numberOfInitialCompletedHomeworksToLoad); - final sortEnum = (await _homeworkSortingCache.getLastSorting( - orElse: HomeworkSort.smallestDateSubjectAndTitle))!; + final sortEnum = await _homeworkSortingCache.getLastSorting() ?? + HomeworkSort.smallestDateSubjectAndTitle; sortingStream.add(sortEnum); _combineLatestSubscription = Rx.combineLatest3<List<HomeworkReadModel>, From b47e2a985dc6cb204cd11dcb9c6fe634a6f62386 Mon Sep 17 00:00:00 2001 From: Jonas Sander <29028262+Jonas-Sander@users.noreply.github.com> Date: Tue, 28 May 2024 18:05:21 +0200 Subject: [PATCH 25/28] Refactor _currentSortStream --- .../student_homework_page_bloc.dart | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/lib/hausaufgabenheft_logik/lib/src/student_homework_page_bloc/student_homework_page_bloc.dart b/lib/hausaufgabenheft_logik/lib/src/student_homework_page_bloc/student_homework_page_bloc.dart index 8f09ecc90..916983ffb 100644 --- a/lib/hausaufgabenheft_logik/lib/src/student_homework_page_bloc/student_homework_page_bloc.dart +++ b/lib/hausaufgabenheft_logik/lib/src/student_homework_page_bloc/student_homework_page_bloc.dart @@ -35,7 +35,7 @@ class HomeworkPageBloc extends Bloc<HomeworkPageEvent, HomeworkPageState> final int numberOfInitialCompletedHomeworksToLoad; final CompletedHomeworkListViewFactory _completedHomeworkListViewFactory; final OpenHomeworkListViewFactory _openHomeworkListViewFactory; - final sortingStream = BehaviorSubject<HomeworkSort>(); + final _currentSortStream = BehaviorSubject<Sort<HomeworkReadModel>>(); LazyLoadingController? _lazyLoadingController; /// Whether [close] or [dispose] has been called; @@ -88,15 +88,15 @@ class HomeworkPageBloc extends Bloc<HomeworkPageEvent, HomeworkPageState> final sortEnum = await _homeworkSortingCache.getLastSorting() ?? HomeworkSort.smallestDateSubjectAndTitle; - sortingStream.add(sortEnum); + _currentSortStream + .add(sortEnum.toSortObject(getCurrentDate: _getCurrentDate)); _combineLatestSubscription = Rx.combineLatest3<List<HomeworkReadModel>, - HomeworkSort, LazyLoadingResult, Success>( + Sort<HomeworkReadModel>, LazyLoadingResult, Success>( _homeworkDataSource.openHomeworks, - sortingStream, + _currentSortStream, _lazyLoadingController!.results, (openHws, sort, lazyCompletedHwsRes) { - final sortObj = sort.toSortObject(getCurrentDate: _getCurrentDate); - final open = _openHomeworkListViewFactory.create(openHws, sortObj); + final open = _openHomeworkListViewFactory.create(openHws, sort); final completed = _completedHomeworkListViewFactory.create( lazyCompletedHwsRes.homeworks, @@ -116,7 +116,8 @@ class HomeworkPageBloc extends Bloc<HomeworkPageEvent, HomeworkPageState> Future<void> _mapFilterChangedToState(OpenHwSortingChanged event) async { await _homeworkSortingCache.setLastSorting(event.sort); - sortingStream.add(event.sort); + _currentSortStream + .add(event.sort.toSortObject(getCurrentDate: _getCurrentDate)); } Future<void> _mapHomeworkChangedCompletionStatus( @@ -135,7 +136,7 @@ class HomeworkPageBloc extends Bloc<HomeworkPageEvent, HomeworkPageState> @override Future<void> close() { _isClosed = true; - sortingStream.close(); + _currentSortStream.close(); _combineLatestSubscription?.cancel(); return super.close(); } @@ -143,7 +144,7 @@ class HomeworkPageBloc extends Bloc<HomeworkPageEvent, HomeworkPageState> @override void dispose() { _isClosed = true; - sortingStream.close(); + _currentSortStream.close(); _combineLatestSubscription?.cancel(); } } From 9a75f17e0fa3c32d9eeb75366ec9d29794edc2aa Mon Sep 17 00:00:00 2001 From: Jonas Sander <29028262+Jonas-Sander@users.noreply.github.com> Date: Tue, 28 May 2024 18:09:48 +0200 Subject: [PATCH 26/28] . --- .../student_homework_page_bloc.dart | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/lib/hausaufgabenheft_logik/lib/src/student_homework_page_bloc/student_homework_page_bloc.dart b/lib/hausaufgabenheft_logik/lib/src/student_homework_page_bloc/student_homework_page_bloc.dart index 916983ffb..96a56aefa 100644 --- a/lib/hausaufgabenheft_logik/lib/src/student_homework_page_bloc/student_homework_page_bloc.dart +++ b/lib/hausaufgabenheft_logik/lib/src/student_homework_page_bloc/student_homework_page_bloc.dart @@ -19,13 +19,6 @@ import 'package:hausaufgabenheft_logik/src/open_homeworks/views/open_homework_li import 'package:hausaufgabenheft_logik/src/student_homework_page_bloc/homework_sorting_cache.dart'; import 'package:rxdart/rxdart.dart'; -/// This Bloc serves basically only as an interface to the outer world with 2 -/// tasks: -/// * It delegates all incoming [HomeworkPageEvent]s to the other blocs. -/// * It merges the Success states from the [OpenHomeworksViewBloc] and -/// [CompletedHomeworksViewBloc] together into one [Success] state. -/// * It caches the last sorting of Homeworks so that it stays consistent -/// between visits of the homework page. class HomeworkPageBloc extends Bloc<HomeworkPageEvent, HomeworkPageState> implements bloc_base.BlocBase { final HomeworkPageCompletionDispatcher _homeworkCompletionReceiver; @@ -82,15 +75,15 @@ class HomeworkPageBloc extends Bloc<HomeworkPageEvent, HomeworkPageState> StreamSubscription? _combineLatestSubscription; Future<void> _mapLoadHomeworksToState() async { - _lazyLoadingController = - _homeworkDataSource.getLazyLoadingCompletedHomeworksController( - numberOfInitialCompletedHomeworksToLoad); - final sortEnum = await _homeworkSortingCache.getLastSorting() ?? HomeworkSort.smallestDateSubjectAndTitle; _currentSortStream .add(sortEnum.toSortObject(getCurrentDate: _getCurrentDate)); + _lazyLoadingController = + _homeworkDataSource.getLazyLoadingCompletedHomeworksController( + numberOfInitialCompletedHomeworksToLoad); + _combineLatestSubscription = Rx.combineLatest3<List<HomeworkReadModel>, Sort<HomeworkReadModel>, LazyLoadingResult, Success>( _homeworkDataSource.openHomeworks, From ef9820c61ed0816d7a0125f28d8eee4164824105 Mon Sep 17 00:00:00 2001 From: Jonas Sander <29028262+Jonas-Sander@users.noreply.github.com> Date: Tue, 28 May 2024 18:11:45 +0200 Subject: [PATCH 27/28] Refactor `HomeworkReadModel` --- .../lib/src/models/homework.dart | 41 ++++--------------- 1 file changed, 8 insertions(+), 33 deletions(-) diff --git a/lib/hausaufgabenheft_logik/lib/src/models/homework.dart b/lib/hausaufgabenheft_logik/lib/src/models/homework.dart index 87f55175f..bac3a415c 100644 --- a/lib/hausaufgabenheft_logik/lib/src/models/homework.dart +++ b/lib/hausaufgabenheft_logik/lib/src/models/homework.dart @@ -7,6 +7,7 @@ // SPDX-License-Identifier: EUPL-1.2 import 'package:common_domain_models/common_domain_models.dart'; +import 'package:equatable/equatable.dart'; import 'package:hausaufgabenheft_logik/src/models/homework_completion_status.dart'; import 'date.dart'; @@ -20,7 +21,7 @@ import 'title.dart'; /// In Sharezone it used in the context of the HomeworkPage, as it is basically /// a merge from the information of the homework-details (title, subject, ...) /// and the specific done status of the user viewing the homework. -class HomeworkReadModel { +class HomeworkReadModel extends Equatable { final HomeworkId id; final DateTime todoDate; final Subject subject; @@ -28,46 +29,20 @@ class HomeworkReadModel { final bool withSubmissions; final CompletionStatus status; - HomeworkReadModel({ + @override + List<Object?> get props => + [id, todoDate, subject, title, withSubmissions, status]; + + const HomeworkReadModel({ required this.id, required this.title, required this.subject, required this.status, required this.withSubmissions, required this.todoDate, - }) { - ArgumentError.checkNotNull(id); - ArgumentError.checkNotNull(todoDate); - ArgumentError.checkNotNull(status); - ArgumentError.checkNotNull(subject); - ArgumentError.checkNotNull(withSubmissions); - ArgumentError.checkNotNull(title); - } - - @override - int get hashCode => - id.hashCode ^ - todoDate.hashCode ^ - status.hashCode ^ - subject.hashCode ^ - title.hashCode; - - @override - bool operator ==(other) => - identical(this, other) || - other is HomeworkReadModel && - id == other.id && - title == other.title && - subject == other.subject && - status == other.status && - todoDate == other.todoDate; + }); bool isOverdueRelativeTo(Date today) { return Date.fromDateTime(todoDate) < today; } - - @override - String toString() { - return 'Homework(Id: $id, title: $title, subject: $subject, todoDate: $todoDate, done: $status)'; - } } From 81e8e963500964bcea2f08152ce8b5c3cc560360 Mon Sep 17 00:00:00 2001 From: Jonas Sander <29028262+Jonas-Sander@users.noreply.github.com> Date: Tue, 28 May 2024 19:28:58 +0200 Subject: [PATCH 28/28] Replace `List` with `IList`. --- .../student/src/open_homework_list.dart | 5 +- .../src/teacher_open_homework_list.dart | 5 +- .../teacher_homework_page_widget_test.dart | 74 ++++++++++-------- .../src/firestore_homework_data_source.dart | 7 +- ...re_realtime_completed_homework_loader.dart | 3 +- .../lib/src/homework_transformation.dart | 11 +-- .../realtime_completed_homework_loader.dart | 3 +- .../pubspec.lock | 8 ++ .../pubspec.yaml | 1 + .../test/in_memory_homework_loader.dart | 5 +- .../test/lazy_loading_controller_test.dart | 19 ++--- .../completed_homework_list_view_factory.dart | 7 +- .../views/completed_homwork_list_view.dart | 4 +- .../src/data_source/homework_data_source.dart | 8 +- .../homework_page_completion_dispatcher.dart | 3 +- .../lib/src/homework_list_extensions.dart | 25 +++--- .../teacher_archived_homework_list_view.dart | 4 +- .../lehrer/teacher_homework_page_bloc.dart | 77 +++++++++++-------- .../lehrer/teacher_homework_section_view.dart | 13 ++-- .../teacher_open_homework_list_view.dart | 3 +- .../sort/src/sort.dart | 17 ++-- .../sort/src/sort_with_operations.dart | 8 +- .../sort_and_subcategorizer.dart | 50 ++++++------ .../views/homework_section_view.dart | 13 ++-- .../views/open_homework_list_view.dart | 3 +- .../open_homework_list_view_factory.dart | 5 +- .../lib/src/setup/dependencies.dart | 3 +- .../student_homework_page_bloc.dart | 3 +- lib/hausaufgabenheft_logik/pubspec.lock | 8 ++ lib/hausaufgabenheft_logik/pubspec.yaml | 1 + .../test/homework_list_test.dart | 10 ++- .../test/homework_page_bloc_test.dart | 10 ++- .../in_memory_homework_repository.dart | 31 ++++---- .../realtime_completed_homework_loader.dart | 3 +- 34 files changed, 262 insertions(+), 188 deletions(-) diff --git a/app/lib/homework/student/src/open_homework_list.dart b/app/lib/homework/student/src/open_homework_list.dart index e7d94e6e9..51c2c9184 100644 --- a/app/lib/homework/student/src/open_homework_list.dart +++ b/app/lib/homework/student/src/open_homework_list.dart @@ -44,7 +44,7 @@ class OpenHomeworkList extends StatelessWidget { Widget build(BuildContext context) { final bloc = BlocProvider.of<HomeworkPageBloc>(context); - if (_nullOrEmpty(homeworkListView.sections)) return Container(); + if (homeworkListView.sections.isEmpty) return Container(); return GlowingOverscrollColorChanger( color: overscrollColor, child: AnimatedStaggeredScrollView( @@ -72,7 +72,4 @@ class OpenHomeworkList extends StatelessWidget { ), ); } - - bool _nullOrEmpty(List<HomeworkSectionView> homeworkSections) => - homeworkSections.isEmpty; } diff --git a/app/lib/homework/teacher/src/teacher_open_homework_list.dart b/app/lib/homework/teacher/src/teacher_open_homework_list.dart index 3e6233c9a..34b4e47e1 100644 --- a/app/lib/homework/teacher/src/teacher_open_homework_list.dart +++ b/app/lib/homework/teacher/src/teacher_open_homework_list.dart @@ -29,7 +29,7 @@ class TeacherOpenHomeworkList extends StatelessWidget { @override Widget build(BuildContext context) { - if (_nullOrEmpty(homeworkListView.sections)) return Container(); + if (homeworkListView.sections.isEmpty) return Container(); return GlowingOverscrollColorChanger( color: overscrollColor, child: AnimatedStaggeredScrollView( @@ -48,7 +48,4 @@ class TeacherOpenHomeworkList extends StatelessWidget { ], )); } - - bool _nullOrEmpty(List<TeacherHomeworkSectionView> homeworkSections) => - homeworkSections.isEmpty; } diff --git a/app/test/homework/teacher/teacher_homework_page_widget_test.dart b/app/test/homework/teacher/teacher_homework_page_widget_test.dart index c1059dbc8..12999f99a 100644 --- a/app/test/homework/teacher/teacher_homework_page_widget_test.dart +++ b/app/test/homework/teacher/teacher_homework_page_widget_test.dart @@ -13,6 +13,7 @@ import 'package:analytics/null_analytics_backend.dart'; import 'package:bloc_provider/bloc_provider.dart'; import 'package:bloc_provider/multi_bloc_provider.dart'; import 'package:common_domain_models/common_domain_models.dart'; +import 'package:fast_immutable_collections/fast_immutable_collections.dart'; import 'package:flutter/material.dart' as flutter show Color; import 'package:flutter/material.dart' hide Color; import 'package:flutter_test/flutter_test.dart'; @@ -161,16 +162,22 @@ void main() { bloc: homeworkPageBloc, initialTab: HomeworkTab.open); homeworkPageBloc.emitNewState(Success( - TeacherOpenHomeworkListView([ - TeacherHomeworkSectionView('Section 1', [ - randomHomeworkViewWith(title: 'HW in first Section'), - ]), - TeacherHomeworkSectionView('Section 2', [ - randomHomeworkViewWith(title: 'HW in second Section'), - ]), - ], sorting: HomeworkSort.subjectSmallestDateAndTitleSort), + TeacherOpenHomeworkListView( + IList([ + TeacherHomeworkSectionView( + 'Section 1', + IListConst([ + randomHomeworkViewWith(title: 'HW in first Section'), + ])), + TeacherHomeworkSectionView( + 'Section 2', + IList([ + randomHomeworkViewWith(title: 'HW in second Section'), + ])), + ]), + sorting: HomeworkSort.subjectSmallestDateAndTitleSort), TeacherArchivedHomeworkListView( - [], + const IListConst([]), loadedAllArchivedHomeworks: true, ), )); @@ -242,7 +249,7 @@ void main() { await pumpHomeworkPage(tester, bloc: homeworkPageBloc, initialTab: HomeworkTab.archived); - final firstHomeworkBatch = generateRandomHomeworks(count: 30); + final firstHomeworkBatch = generateRandomHomeworks(count: 30).toIList(); homeworkPageBloc.emitNewState( Success( @@ -274,10 +281,8 @@ void main() { reason: "After scrolling down to near the last loaded homework the bloc should've received the event to load the next archived homeworks (as there are more to load in this test)."); - final allLoadedHomeworks = [ - ...firstHomeworkBatch, - ...generateRandomHomeworks(count: 10) - ]; + final allLoadedHomeworks = + IList([...firstHomeworkBatch, ...generateRandomHomeworks(count: 10)]); homeworkPageBloc.emitNewState( Success( @@ -362,11 +367,13 @@ void main() { bloc: homeworkPageBloc, initialTab: HomeworkTab.open); homeworkPageBloc.emitNewState(Success( - TeacherOpenHomeworkListView([ - TeacherHomeworkSectionView('Section 1', views), - ], sorting: HomeworkSort.subjectSmallestDateAndTitleSort), + TeacherOpenHomeworkListView( + IList([ + TeacherHomeworkSectionView('Section 1', views.toIList()), + ]), + sorting: HomeworkSort.subjectSmallestDateAndTitleSort), TeacherArchivedHomeworkListView( - [], + const IListConst([]), loadedAllArchivedHomeworks: true, ), )); @@ -416,7 +423,7 @@ void main() { _noOpenHomeworks, TeacherArchivedHomeworkListView( // No homeworks loaded already - [], + const IListConst([]), // but there are homeworks to load loadedAllArchivedHomeworks: false, ), @@ -489,32 +496,37 @@ TeacherHomeworkView randomHomeworkViewWith({ Success _openHomeworksWith(HomeworkSort sort) { return Success( - TeacherOpenHomeworkListView([ - TeacherHomeworkSectionView('Heute', [ - randomHomeworkViewWith(title: 'S. 32'), - randomHomeworkViewWith(title: 'S. 34'), - randomHomeworkViewWith(title: 'S. 31'), - ]) - ], sorting: sort), + TeacherOpenHomeworkListView( + IList([ + TeacherHomeworkSectionView( + 'Heute', + IList([ + randomHomeworkViewWith(title: 'S. 32'), + randomHomeworkViewWith(title: 'S. 34'), + randomHomeworkViewWith(title: 'S. 31'), + ])), + ]), + sorting: sort), _noArchivedHomeworks, ); } final _noHomeworks = Success( TeacherOpenHomeworkListView( - [], + const IListConst([]), sorting: HomeworkSort.smallestDateSubjectAndTitle, ), TeacherArchivedHomeworkListView( - [], + const IListConst([]), loadedAllArchivedHomeworks: true, ), ); -final _noOpenHomeworks = TeacherOpenHomeworkListView([], +final _noOpenHomeworks = TeacherOpenHomeworkListView(const IListConst([]), sorting: HomeworkSort.smallestDateSubjectAndTitle); -final _noArchivedHomeworks = - TeacherArchivedHomeworkListView([], loadedAllArchivedHomeworks: true); +final _noArchivedHomeworks = TeacherArchivedHomeworkListView( + const IListConst([]), + loadedAllArchivedHomeworks: true); Future<void> _pumpHomeworkPageWithNoHomeworks( WidgetTester tester, { diff --git a/lib/firebase_hausaufgabenheft_logik/lib/src/firestore_homework_data_source.dart b/lib/firebase_hausaufgabenheft_logik/lib/src/firestore_homework_data_source.dart index 510e1f05f..bf6f23288 100644 --- a/lib/firebase_hausaufgabenheft_logik/lib/src/firestore_homework_data_source.dart +++ b/lib/firebase_hausaufgabenheft_logik/lib/src/firestore_homework_data_source.dart @@ -10,6 +10,7 @@ import 'dart:async'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:common_domain_models/common_domain_models.dart'; +import 'package:fast_immutable_collections/fast_immutable_collections.dart'; import 'package:hausaufgabenheft_logik/hausaufgabenheft_logik.dart'; import 'homework_transformation.dart'; @@ -24,7 +25,7 @@ class FirestoreHomeworkDataSource extends HomeworkDataSource { this.createLazyLoadingController, this._homeworkTransformer); @override - Stream<List<HomeworkReadModel>> get openHomeworks { + Stream<IList<HomeworkReadModel>> get openHomeworks { return _homeworkCollection .where("assignedUserArrays.openStudentUids", arrayContains: uid) .snapshots() @@ -37,12 +38,12 @@ class FirestoreHomeworkDataSource extends HomeworkDataSource { return homework; } - Future<List<HomeworkId>> getCurrentOpenOverdueHomeworkIds() async { + Future<IList<HomeworkId>> getCurrentOpenOverdueHomeworkIds() async { final open = await openHomeworks.first; final overdue = open .where((homeworks) => homeworks.isOverdueRelativeTo(Date.now())) .toList(); - final overdueIds = overdue.map((hws) => hws.id).toList(); + final overdueIds = overdue.map((hws) => hws.id).toIList(); return overdueIds; } diff --git a/lib/firebase_hausaufgabenheft_logik/lib/src/firestore_realtime_completed_homework_loader.dart b/lib/firebase_hausaufgabenheft_logik/lib/src/firestore_realtime_completed_homework_loader.dart index 9284987a3..572d0c792 100644 --- a/lib/firebase_hausaufgabenheft_logik/lib/src/firestore_realtime_completed_homework_loader.dart +++ b/lib/firebase_hausaufgabenheft_logik/lib/src/firestore_realtime_completed_homework_loader.dart @@ -7,6 +7,7 @@ // SPDX-License-Identifier: EUPL-1.2 import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:fast_immutable_collections/fast_immutable_collections.dart'; import 'package:hausaufgabenheft_logik/hausaufgabenheft_logik.dart'; import 'homework_transformation.dart'; @@ -22,7 +23,7 @@ class FirestoreRealtimeCompletedHomeworkLoader this._homeworkCollection, this._userId, this._homeworkTransformer); @override - Stream<List<HomeworkReadModel>> loadMostRecentHomeworks( + Stream<IList<HomeworkReadModel>> loadMostRecentHomeworks( int numberOfHomeworks) { return _homeworkCollection .where('assignedUserArrays.completedStudentUids', diff --git a/lib/firebase_hausaufgabenheft_logik/lib/src/homework_transformation.dart b/lib/firebase_hausaufgabenheft_logik/lib/src/homework_transformation.dart index cfefa36f8..b622337af 100644 --- a/lib/firebase_hausaufgabenheft_logik/lib/src/homework_transformation.dart +++ b/lib/firebase_hausaufgabenheft_logik/lib/src/homework_transformation.dart @@ -11,6 +11,7 @@ import 'dart:developer'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:common_domain_models/common_domain_models.dart'; +import 'package:fast_immutable_collections/fast_immutable_collections.dart'; import 'package:hausaufgabenheft_logik/color.dart'; import 'package:hausaufgabenheft_logik/hausaufgabenheft_logik.dart'; @@ -19,25 +20,25 @@ import 'homework_dto.dart'; typedef CourseColorRetriever = FutureOr<int> Function(String courseId); class HomeworkTransformer extends StreamTransformerBase< - QuerySnapshot<Map<String, dynamic>>, List<HomeworkReadModel>> { + QuerySnapshot<Map<String, dynamic>>, IList<HomeworkReadModel>> { final String userId; final CourseColorRetriever getCourseColorHexValue; HomeworkTransformer(this.userId, {required this.getCourseColorHexValue}); @override - Stream<List<HomeworkReadModel>> bind(Stream<QuerySnapshot> stream) { + Stream<IList<HomeworkReadModel>> bind(Stream<QuerySnapshot> stream) { return stream.asyncMap(querySnapshotToHomeworks); } - Future<List<HomeworkReadModel>> querySnapshotToHomeworks( + Future<IList<HomeworkReadModel>> querySnapshotToHomeworks( QuerySnapshot querySnapshot) async { - final homeworks = <HomeworkReadModel>[]; + IList<HomeworkReadModel> homeworks = const IListConst([]); for (final document in querySnapshot.docs) { final homework = await tryToConvertToHomework(document, userId, getCourseColorHexValue: getCourseColorHexValue); if (homework != null) { - homeworks.add(homework); + homeworks = homeworks.add(homework); } } return homeworks; diff --git a/lib/firebase_hausaufgabenheft_logik/lib/src/realtime_completed_homework_loader.dart b/lib/firebase_hausaufgabenheft_logik/lib/src/realtime_completed_homework_loader.dart index 297e8894a..fe53f0755 100644 --- a/lib/firebase_hausaufgabenheft_logik/lib/src/realtime_completed_homework_loader.dart +++ b/lib/firebase_hausaufgabenheft_logik/lib/src/realtime_completed_homework_loader.dart @@ -6,9 +6,10 @@ // // SPDX-License-Identifier: EUPL-1.2 +import 'package:fast_immutable_collections/fast_immutable_collections.dart'; import 'package:hausaufgabenheft_logik/hausaufgabenheft_logik.dart'; abstract class RealtimeCompletedHomeworkLoader { - Stream<List<HomeworkReadModel>> loadMostRecentHomeworks( + Stream<IList<HomeworkReadModel>> loadMostRecentHomeworks( int numberOfHomeworks); } diff --git a/lib/firebase_hausaufgabenheft_logik/pubspec.lock b/lib/firebase_hausaufgabenheft_logik/pubspec.lock index b4a75c930..7f904b577 100644 --- a/lib/firebase_hausaufgabenheft_logik/pubspec.lock +++ b/lib/firebase_hausaufgabenheft_logik/pubspec.lock @@ -158,6 +158,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.1" + fast_immutable_collections: + dependency: "direct main" + description: + name: fast_immutable_collections + sha256: b910ccdc99bb38a2abbce07c5afb8f81d4e222a892e4d095a548b99814837b0c + url: "https://pub.dev" + source: hosted + version: "9.2.1" firebase_core: dependency: transitive description: diff --git a/lib/firebase_hausaufgabenheft_logik/pubspec.yaml b/lib/firebase_hausaufgabenheft_logik/pubspec.yaml index 6d3f124e0..7aed50061 100644 --- a/lib/firebase_hausaufgabenheft_logik/pubspec.yaml +++ b/lib/firebase_hausaufgabenheft_logik/pubspec.yaml @@ -25,6 +25,7 @@ dependencies: time: path: ../time cloud_firestore: ^4.17.2 + fast_immutable_collections: ^9.1.5 flutter: sdk: flutter clock: ^1.1.1 diff --git a/lib/firebase_hausaufgabenheft_logik/test/in_memory_homework_loader.dart b/lib/firebase_hausaufgabenheft_logik/test/in_memory_homework_loader.dart index dc83d43d1..e57539347 100644 --- a/lib/firebase_hausaufgabenheft_logik/test/in_memory_homework_loader.dart +++ b/lib/firebase_hausaufgabenheft_logik/test/in_memory_homework_loader.dart @@ -6,17 +6,18 @@ // // SPDX-License-Identifier: EUPL-1.2 +import 'package:fast_immutable_collections/fast_immutable_collections.dart'; import 'package:firebase_hausaufgabenheft_logik/src/realtime_completed_homework_loader.dart'; import 'package:hausaufgabenheft_logik/hausaufgabenheft_logik.dart'; import 'package:rxdart/subjects.dart'; class InMemoryHomeworkLoader extends RealtimeCompletedHomeworkLoader { - final BehaviorSubject<List<HomeworkReadModel>> _completedHomeworksSubject; + final BehaviorSubject<IList<HomeworkReadModel>> _completedHomeworksSubject; InMemoryHomeworkLoader(this._completedHomeworksSubject); @override - Stream<List<HomeworkReadModel>> loadMostRecentHomeworks( + Stream<IList<HomeworkReadModel>> loadMostRecentHomeworks( int numberOfHomeworks) { return _completedHomeworksSubject.map((homeworks) { if (homeworks.length < numberOfHomeworks) return homeworks; diff --git a/lib/firebase_hausaufgabenheft_logik/test/lazy_loading_controller_test.dart b/lib/firebase_hausaufgabenheft_logik/test/lazy_loading_controller_test.dart index 11c176af8..64ae882d5 100644 --- a/lib/firebase_hausaufgabenheft_logik/test/lazy_loading_controller_test.dart +++ b/lib/firebase_hausaufgabenheft_logik/test/lazy_loading_controller_test.dart @@ -10,6 +10,7 @@ import 'dart:async'; import 'package:clock/clock.dart'; import 'package:common_domain_models/common_domain_models.dart'; +import 'package:fast_immutable_collections/fast_immutable_collections.dart'; import 'package:firebase_hausaufgabenheft_logik/src/realtime_updating_lazy_loading_controller.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:hausaufgabenheft_logik/hausaufgabenheft_logik.dart'; @@ -22,14 +23,14 @@ class ReportingInMemoryHomeworkLoader extends InMemoryHomeworkLoader { bool wasInvoked = false; @override - Stream<List<HomeworkReadModel>> loadMostRecentHomeworks( + Stream<IList<HomeworkReadModel>> loadMostRecentHomeworks( int numberOfHomeworks) { wasInvoked = true; return super.loadMostRecentHomeworks(numberOfHomeworks); } } -List<HomeworkReadModel> listOfHomeworksWithLength(int length) => List.generate( +IList<HomeworkReadModel> listOfHomeworksWithLength(int length) => List.generate( length, (index) => HomeworkReadModel( id: HomeworkId("$index"), @@ -38,21 +39,21 @@ List<HomeworkReadModel> listOfHomeworksWithLength(int length) => List.generate( subject: Subject("Mathe", abbreviation: 'Ma'), title: const Title("ABC"), withSubmissions: false), - ); + ).toIList(); -Stream<List<HomeworkReadModel>> getHomeworkResultsAsStream( +Stream<IList<HomeworkReadModel>> getHomeworkResultsAsStream( Stream<LazyLoadingResult> resultStream) => resultStream.map((res) => res.homeworks); void main() { group('LazyLoadingController', () { late ReportingInMemoryHomeworkLoader homeworkLoader; - late rx.BehaviorSubject<List<HomeworkReadModel>> homeworkSubject; + late rx.BehaviorSubject<IList<HomeworkReadModel>> homeworkSubject; - void addToDataSource(List<HomeworkReadModel> homeworks) { - final hws = homeworkSubject.valueOrNull; + void addToDataSource(IList<HomeworkReadModel> homeworks) { + var hws = homeworkSubject.valueOrNull; if (hws != null) { - hws.addAll(homeworks); + hws = hws.addAll(homeworks); homeworkSubject.add(hws); } else { homeworkSubject.add(homeworks); @@ -60,7 +61,7 @@ void main() { } setUp(() { - homeworkSubject = rx.BehaviorSubject<List<HomeworkReadModel>>(); + homeworkSubject = rx.BehaviorSubject<IList<HomeworkReadModel>>(); homeworkLoader = ReportingInMemoryHomeworkLoader(homeworkSubject); }); diff --git a/lib/hausaufgabenheft_logik/lib/src/completed_homeworks/views/completed_homework_list_view_factory.dart b/lib/hausaufgabenheft_logik/lib/src/completed_homeworks/views/completed_homework_list_view_factory.dart index 67f0948b1..b0a73f0fa 100644 --- a/lib/hausaufgabenheft_logik/lib/src/completed_homeworks/views/completed_homework_list_view_factory.dart +++ b/lib/hausaufgabenheft_logik/lib/src/completed_homeworks/views/completed_homework_list_view_factory.dart @@ -6,6 +6,7 @@ // // SPDX-License-Identifier: EUPL-1.2 +import 'package:fast_immutable_collections/fast_immutable_collections.dart'; import 'package:hausaufgabenheft_logik/hausaufgabenheft_logik.dart'; import '../../views/student_homework_view_factory.dart'; @@ -14,12 +15,12 @@ class CompletedHomeworkListViewFactory { CompletedHomeworkListViewFactory(this._studentHomeworkViewFactory); - CompletedHomeworkListView create(List<HomeworkReadModel> completedHomeworks, + CompletedHomeworkListView create(IList<HomeworkReadModel> completedHomeworks, bool loadedAllCompletedHomeworks) { - final orderedHomeworks = [ + final orderedHomeworks = IList([ for (final completedHomework in completedHomeworks) _studentHomeworkViewFactory.createFrom(completedHomework) - ]; + ]); return CompletedHomeworkListView(orderedHomeworks, loadedAllCompletedHomeworks: loadedAllCompletedHomeworks); } diff --git a/lib/hausaufgabenheft_logik/lib/src/completed_homeworks/views/completed_homwork_list_view.dart b/lib/hausaufgabenheft_logik/lib/src/completed_homeworks/views/completed_homwork_list_view.dart index 3640edd27..8f091879c 100644 --- a/lib/hausaufgabenheft_logik/lib/src/completed_homeworks/views/completed_homwork_list_view.dart +++ b/lib/hausaufgabenheft_logik/lib/src/completed_homeworks/views/completed_homwork_list_view.dart @@ -6,11 +6,13 @@ // // SPDX-License-Identifier: EUPL-1.2 +import 'package:fast_immutable_collections/fast_immutable_collections.dart'; + import '../../views/homework_view.dart'; class CompletedHomeworkListView { final bool loadedAllCompletedHomeworks; - final List<StudentHomeworkView> orderedHomeworks; + final IList<StudentHomeworkView> orderedHomeworks; CompletedHomeworkListView(this.orderedHomeworks, {required this.loadedAllCompletedHomeworks}); diff --git a/lib/hausaufgabenheft_logik/lib/src/data_source/homework_data_source.dart b/lib/hausaufgabenheft_logik/lib/src/data_source/homework_data_source.dart index 8c0af7f37..bfbf52e3a 100644 --- a/lib/hausaufgabenheft_logik/lib/src/data_source/homework_data_source.dart +++ b/lib/hausaufgabenheft_logik/lib/src/data_source/homework_data_source.dart @@ -6,11 +6,12 @@ // // SPDX-License-Identifier: EUPL-1.2 +import 'package:fast_immutable_collections/fast_immutable_collections.dart'; import 'package:hausaufgabenheft_logik/src/models/homework.dart'; import 'package:collection/collection.dart' show DeepCollectionEquality; abstract class HomeworkDataSource { - Stream<List<HomeworkReadModel>> get openHomeworks; + Stream<IList<HomeworkReadModel>> get openHomeworks; LazyLoadingController getLazyLoadingCompletedHomeworksController( int nrOfInitialHomeworkToLoad); } @@ -21,12 +22,13 @@ abstract class LazyLoadingController { } class LazyLoadingResult { - final List<HomeworkReadModel> homeworks; + final IList<HomeworkReadModel> homeworks; final bool moreHomeworkAvailable; LazyLoadingResult(this.homeworks, {required this.moreHomeworkAvailable}); - LazyLoadingResult.empty({this.moreHomeworkAvailable = true}) : homeworks = []; + LazyLoadingResult.empty({this.moreHomeworkAvailable = true}) + : homeworks = const IListConst([]); @override String toString() { diff --git a/lib/hausaufgabenheft_logik/lib/src/homework_completion/homework_page_completion_dispatcher.dart b/lib/hausaufgabenheft_logik/lib/src/homework_completion/homework_page_completion_dispatcher.dart index d9c089559..587bef3a3 100644 --- a/lib/hausaufgabenheft_logik/lib/src/homework_completion/homework_page_completion_dispatcher.dart +++ b/lib/hausaufgabenheft_logik/lib/src/homework_completion/homework_page_completion_dispatcher.dart @@ -7,6 +7,7 @@ // SPDX-License-Identifier: EUPL-1.2 import 'package:common_domain_models/common_domain_models.dart'; +import 'package:fast_immutable_collections/fast_immutable_collections.dart'; import 'package:hausaufgabenheft_logik/hausaufgabenheft_logik.dart'; /// The [HomeworkPageCompletionDispatcher] is a homework page sepecific input for @@ -19,7 +20,7 @@ import 'package:hausaufgabenheft_logik/hausaufgabenheft_logik.dart'; /// [AllOverdueHomeworkCompletionEvent] while the [HomeworkCompletionDispatcher] /// is not bound to the homework page. class HomeworkPageCompletionDispatcher { - final Future<List<HomeworkId>> Function() getCurrentOverdueHomeworkIds; + final Future<IList<HomeworkId>> Function() getCurrentOverdueHomeworkIds; final HomeworkCompletionDispatcher _homeworkCompletionDispatcher; HomeworkPageCompletionDispatcher(this._homeworkCompletionDispatcher, diff --git a/lib/hausaufgabenheft_logik/lib/src/homework_list_extensions.dart b/lib/hausaufgabenheft_logik/lib/src/homework_list_extensions.dart index e98f1601d..9e0c6fa61 100644 --- a/lib/hausaufgabenheft_logik/lib/src/homework_list_extensions.dart +++ b/lib/hausaufgabenheft_logik/lib/src/homework_list_extensions.dart @@ -6,6 +6,7 @@ // // SPDX-License-Identifier: EUPL-1.2 +import 'package:fast_immutable_collections/fast_immutable_collections.dart'; import 'package:hausaufgabenheft_logik/src/models/homework_completion_status.dart'; import 'open_homeworks/sort_and_subcategorization/sort/src/sort.dart'; @@ -13,29 +14,29 @@ import 'models/date.dart'; import 'models/homework.dart'; import 'models/subject.dart'; -extension SortWith<T> on List<T> { - void sortWith(Sort<T> sort) { - sort.sort(this); +extension SortWith<T> on IList<T> { + IList<T> sortWith(Sort<T> sort) { + return sort.sort(this); } } -extension HomeworkListExtension on List<HomeworkReadModel> { - List<HomeworkReadModel> get completed => +extension HomeworkListExtension on IList<HomeworkReadModel> { + IList<HomeworkReadModel> get completed => where((homework) => homework.status == CompletionStatus.completed) - .toList(); - List<HomeworkReadModel> get open => - where((homework) => homework.status == CompletionStatus.open).toList(); + .toIList(); + IList<HomeworkReadModel> get open => + where((homework) => homework.status == CompletionStatus.open).toIList(); - List<Subject> getDistinctOrderedSubjects() { + IList<Subject> getDistinctOrderedSubjects() { final subjects = <Subject>{}; for (final homework in this) { subjects.add(homework.subject); } - return subjects.toList(); + return subjects.toIList(); } - List<HomeworkReadModel> getOverdue([Date? now]) { + IList<HomeworkReadModel> getOverdue([Date? now]) { now = now ?? Date.now(); - return where((homeworks) => homeworks.isOverdueRelativeTo(now!)).toList(); + return where((homeworks) => homeworks.isOverdueRelativeTo(now!)).toIList(); } } diff --git a/lib/hausaufgabenheft_logik/lib/src/lehrer/teacher_archived_homework_list_view.dart b/lib/hausaufgabenheft_logik/lib/src/lehrer/teacher_archived_homework_list_view.dart index e90427b7f..eabbc26a4 100644 --- a/lib/hausaufgabenheft_logik/lib/src/lehrer/teacher_archived_homework_list_view.dart +++ b/lib/hausaufgabenheft_logik/lib/src/lehrer/teacher_archived_homework_list_view.dart @@ -6,11 +6,13 @@ // // SPDX-License-Identifier: EUPL-1.2 +import 'package:fast_immutable_collections/fast_immutable_collections.dart'; + import 'teacher_homework_view.dart'; class TeacherArchivedHomeworkListView { final bool loadedAllArchivedHomeworks; - final List<TeacherHomeworkView> orderedHomeworks; + final IList<TeacherHomeworkView> orderedHomeworks; TeacherArchivedHomeworkListView(this.orderedHomeworks, {required this.loadedAllArchivedHomeworks}); diff --git a/lib/hausaufgabenheft_logik/lib/src/lehrer/teacher_homework_page_bloc.dart b/lib/hausaufgabenheft_logik/lib/src/lehrer/teacher_homework_page_bloc.dart index ce0ec760d..afc535b0e 100644 --- a/lib/hausaufgabenheft_logik/lib/src/lehrer/teacher_homework_page_bloc.dart +++ b/lib/hausaufgabenheft_logik/lib/src/lehrer/teacher_homework_page_bloc.dart @@ -11,6 +11,7 @@ import 'dart:async'; import 'package:bloc/bloc.dart'; import 'package:bloc_base/bloc_base.dart' as bloc_base; import 'package:common_domain_models/common_domain_models.dart'; +import 'package:fast_immutable_collections/fast_immutable_collections.dart'; import 'package:hausaufgabenheft_logik/color.dart'; import 'package:hausaufgabenheft_logik/hausaufgabenheft_logik_lehrer.dart'; import 'package:meta/meta.dart'; @@ -66,31 +67,37 @@ class _States { // ignore: unused_field static final _placeholder = Success( - TeacherOpenHomeworkListView([], + TeacherOpenHomeworkListView(const IListConst([]), sorting: HomeworkSort.smallestDateSubjectAndTitle), - TeacherArchivedHomeworkListView([], loadedAllArchivedHomeworks: true), + TeacherArchivedHomeworkListView(const IListConst([]), + loadedAllArchivedHomeworks: true), ); /// Answer for [_ArchivedHwLazyLoadingState.askedForFirstBatch] - static final __archivedHomeworksFirstState = TeacherArchivedHomeworkListView([ - _Homeworks._noSubmissionNoPermissions, - _Homeworks._withSubmissionWithPermissions, - ..._generateRandomHomeworks(count: 18) - ], loadedAllArchivedHomeworks: false); + static final __archivedHomeworksFirstState = TeacherArchivedHomeworkListView( + IList([ + _Homeworks._noSubmissionNoPermissions, + _Homeworks._withSubmissionWithPermissions, + ..._generateRandomHomeworks(count: 18) + ]), + loadedAllArchivedHomeworks: false); /// Answer for [_ArchivedHwLazyLoadingState.askedForSecondBatch] - static final __archivedHomeworksSecondState = - TeacherArchivedHomeworkListView([ - ...__archivedHomeworksFirstState.orderedHomeworks, - ..._generateRandomHomeworks(count: 10) - ], loadedAllArchivedHomeworks: false); + static final __archivedHomeworksSecondState = TeacherArchivedHomeworkListView( + IList([ + ...__archivedHomeworksFirstState.orderedHomeworks, + ..._generateRandomHomeworks(count: 10) + ]), + loadedAllArchivedHomeworks: false); /// Answer for [_ArchivedHwLazyLoadingState.askedForAll] static final __archivedHomeworksLoadedAllState = - TeacherArchivedHomeworkListView([ - ...__archivedHomeworksSecondState.orderedHomeworks, - ..._generateRandomHomeworks(count: 10) - ], loadedAllArchivedHomeworks: true); + TeacherArchivedHomeworkListView( + IList([ + ...__archivedHomeworksSecondState.orderedHomeworks, + ..._generateRandomHomeworks(count: 10) + ]), + loadedAllArchivedHomeworks: true); static TeacherArchivedHomeworkListView __getArchivedListView( _ArchivedHwLazyLoadingState loadingState) { @@ -107,26 +114,36 @@ class _States { static Success _homeworksAllLoadedSortedBySubject( _ArchivedHwLazyLoadingState loadingState) { return Success( - TeacherOpenHomeworkListView([ - TeacherHomeworkSectionView('Mathe', [ - _Homeworks._noSubmissionWithPermissions, - _Homeworks._withSubmissionNoPermissions - ]) - ], sorting: HomeworkSort.subjectSmallestDateAndTitleSort), + TeacherOpenHomeworkListView( + IList([ + TeacherHomeworkSectionView( + 'Mathe', + IList([ + _Homeworks._noSubmissionWithPermissions, + _Homeworks._withSubmissionNoPermissions + ])) + ]), + sorting: HomeworkSort.subjectSmallestDateAndTitleSort), __getArchivedListView(loadingState)); } static Success _homeworksAllLoadedSortedByTodoDate( _ArchivedHwLazyLoadingState loadingState) { return Success( - TeacherOpenHomeworkListView([ - TeacherHomeworkSectionView('Heute', [ - _Homeworks._noSubmissionWithPermissions, - ]), - TeacherHomeworkSectionView('In 3 Tagen', [ - _Homeworks._withSubmissionNoPermissions, - ]) - ], sorting: HomeworkSort.smallestDateSubjectAndTitle), + TeacherOpenHomeworkListView( + IList([ + TeacherHomeworkSectionView( + 'Heute', + IList([ + _Homeworks._noSubmissionWithPermissions, + ])), + TeacherHomeworkSectionView( + 'In 3 Tagen', + IList([ + _Homeworks._withSubmissionNoPermissions, + ])) + ]), + sorting: HomeworkSort.smallestDateSubjectAndTitle), __getArchivedListView(loadingState), ); } diff --git a/lib/hausaufgabenheft_logik/lib/src/lehrer/teacher_homework_section_view.dart b/lib/hausaufgabenheft_logik/lib/src/lehrer/teacher_homework_section_view.dart index c8f2ae2e9..94cf6af39 100644 --- a/lib/hausaufgabenheft_logik/lib/src/lehrer/teacher_homework_section_view.dart +++ b/lib/hausaufgabenheft_logik/lib/src/lehrer/teacher_homework_section_view.dart @@ -7,13 +7,14 @@ // SPDX-License-Identifier: EUPL-1.2 import 'package:equatable/equatable.dart'; +import 'package:fast_immutable_collections/fast_immutable_collections.dart'; import 'package:hausaufgabenheft_logik/hausaufgabenheft_logik_lehrer.dart'; import 'teacher_homework_view_factory.dart'; class TeacherHomeworkSectionView extends Equatable { final String title; - final List<TeacherHomeworkView> homeworks; + final IList<TeacherHomeworkView> homeworks; bool get isEmpty => homeworks.isEmpty; bool get isNotEmpty => homeworks.isNotEmpty; @@ -25,12 +26,14 @@ class TeacherHomeworkSectionView extends Equatable { factory TeacherHomeworkSectionView.fromModels( String title, - List<TeacherHomeworkReadModel> homeworks, + IList<TeacherHomeworkReadModel> homeworks, TeacherHomeworkViewFactory viewFactory, ) { - return TeacherHomeworkSectionView(title, [ - for (final h in homeworks) viewFactory.createFrom(h), - ]); + return TeacherHomeworkSectionView( + title, + IList([ + for (final h in homeworks) viewFactory.createFrom(h), + ])); } @override diff --git a/lib/hausaufgabenheft_logik/lib/src/lehrer/teacher_open_homework_list_view.dart b/lib/hausaufgabenheft_logik/lib/src/lehrer/teacher_open_homework_list_view.dart index 50f64d26b..c97f10112 100644 --- a/lib/hausaufgabenheft_logik/lib/src/lehrer/teacher_open_homework_list_view.dart +++ b/lib/hausaufgabenheft_logik/lib/src/lehrer/teacher_open_homework_list_view.dart @@ -8,11 +8,12 @@ import 'package:collection/collection.dart' show DeepCollectionEquality; import 'package:collection/collection.dart'; +import 'package:fast_immutable_collections/fast_immutable_collections.dart'; import 'teacher_homework_section_view.dart'; class TeacherOpenHomeworkListView { - final List<TeacherHomeworkSectionView> sections; + final IList<TeacherHomeworkSectionView> sections; final HomeworkSort sorting; TeacherOpenHomeworkListView( diff --git a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort/src/sort.dart b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort/src/sort.dart index 8e38b6f93..d2ed3d779 100644 --- a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort/src/sort.dart +++ b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort/src/sort.dart @@ -6,13 +6,14 @@ // // SPDX-License-Identifier: EUPL-1.2 +import 'package:fast_immutable_collections/fast_immutable_collections.dart'; import 'package:hausaufgabenheft_logik/hausaufgabenheft_logik.dart'; import 'homework_attribute_sorts.dart'; import 'sort_with_operations.dart'; sealed class Sort<T> { - void sort(List<T> list); + IList<T> sort(IList<T> list); } /// Sorts the homeworks firstly by date (earliest date first). @@ -26,10 +27,9 @@ class SmallestDateSubjectAndTitleSort extends Sort<HomeworkReadModel> { } @override - List<HomeworkReadModel> sort(List<HomeworkReadModel> list) { - sortWithOperations<HomeworkReadModel>( - list, List.from([dateSort, subjectSort, titleSort])); - return list; + IList<HomeworkReadModel> sort(IList<HomeworkReadModel> list) { + return sortWithOperations<HomeworkReadModel>( + list, const IListConst([dateSort, subjectSort, titleSort])); } @override @@ -48,10 +48,9 @@ class SmallestDateSubjectAndTitleSort extends Sort<HomeworkReadModel> { /// If they have the same date and subject, they will be sorted alphabetically by title. class SubjectSmallestDateAndTitleSort extends Sort<HomeworkReadModel> { @override - List<HomeworkReadModel> sort(List<HomeworkReadModel> list) { - sortWithOperations<HomeworkReadModel>( - list, List.from([subjectSort, dateSort, titleSort])); - return list; + IList<HomeworkReadModel> sort(IList<HomeworkReadModel> list) { + return sortWithOperations<HomeworkReadModel>( + list, const IListConst([subjectSort, dateSort, titleSort])); } @override diff --git a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort/src/sort_with_operations.dart b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort/src/sort_with_operations.dart index 836ae1873..e8b5a4956 100644 --- a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort/src/sort_with_operations.dart +++ b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort/src/sort_with_operations.dart @@ -6,6 +6,8 @@ // // SPDX-License-Identifier: EUPL-1.2 +import 'package:fast_immutable_collections/fast_immutable_collections.dart'; + /// Sorts the [listToSort] sequentially with the [comparisions]. /// If a comparision does treat the objects as equal, the next comparision will be executed on those. /// The result of the last comparision will be used either way. @@ -29,10 +31,10 @@ /// h6 - Informatik: “Buch S. 33” (06.10.19) /// h5 - Mathematik: “Buch S. 33” (01.01.19) /// h7 - Mathematik: “Buch S. 37” (06.10.20) -void sortWithOperations<T>( - List<T> listToSort, List<Comparision<T>> comparisions) { +IList<T> sortWithOperations<T>( + IList<T> listToSort, IList<Comparision<T>> comparisions) { final last = comparisions.last; - listToSort.sort((ha1, ha2) { + return listToSort.sort((ha1, ha2) { for (final comparision in comparisions) { final result = comparision(ha1, ha2); if (result.objectsAreNotEqual || comparision == last) { diff --git a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort_and_subcategorizer.dart b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort_and_subcategorizer.dart index c73662795..7ab318433 100644 --- a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort_and_subcategorizer.dart +++ b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/sort_and_subcategorization/sort_and_subcategorizer.dart @@ -6,6 +6,7 @@ // // SPDX-License-Identifier: EUPL-1.2 +import 'package:fast_immutable_collections/fast_immutable_collections.dart'; import 'package:hausaufgabenheft_logik/color.dart'; import 'package:hausaufgabenheft_logik/hausaufgabenheft_logik.dart'; import 'package:hausaufgabenheft_logik/src/views/student_homework_view_factory.dart'; @@ -22,9 +23,9 @@ class HomeworkSortAndSubcategorizer { getCurrentDate: getCurrentDate, ); - List<HomeworkSectionView> sortAndSubcategorize( - List<HomeworkReadModel> homeworks, Sort<HomeworkReadModel> sort) { - homeworks.sortWith(sort); + IList<HomeworkSectionView> sortAndSubcategorize( + IList<HomeworkReadModel> homeworks, Sort<HomeworkReadModel> sort) { + final sorted = homeworks.sortWith(sort); final matchingSubcategorizer = switch (sort) { SubjectSmallestDateAndTitleSort() => @@ -33,12 +34,12 @@ class HomeworkSortAndSubcategorizer { _TodoDateSubcategorizer(getCurrentDate(), _viewFactory), }; - return matchingSubcategorizer.subcategorize(homeworks); + return matchingSubcategorizer.subcategorize(sorted); } } abstract class _Subcategorizer { - List<HomeworkSectionView> subcategorize(List<HomeworkReadModel> homeworks); + IList<HomeworkSectionView> subcategorize(IList<HomeworkReadModel> homeworks); } class _SubjectSubcategeorizer extends _Subcategorizer { @@ -47,17 +48,17 @@ class _SubjectSubcategeorizer extends _Subcategorizer { _SubjectSubcategeorizer(this._viewFactory); @override - List<HomeworkSectionView> subcategorize(List<HomeworkReadModel> homeworks) { + IList<HomeworkSectionView> subcategorize(IList<HomeworkReadModel> homeworks) { final subjects = homeworks.getDistinctOrderedSubjects(); - final homeworkSections = <HomeworkSectionView>[]; + var homeworkSections = IList<HomeworkSectionView>(); for (final subject in subjects) { - final List<HomeworkReadModel> homeworksWithSubject = - homeworks.where((h) => h.subject == subject).toList(); + final IList<HomeworkReadModel> homeworksWithSubject = + homeworks.where((h) => h.subject == subject).toIList(); final homeworkViewsWithSubject = - homeworksWithSubject.map((h) => _viewFactory.createFrom(h)).toList(); + homeworksWithSubject.map((h) => _viewFactory.createFrom(h)).toIList(); - homeworkSections + homeworkSections = homeworkSections .add(HomeworkSectionView(subject.name, homeworkViewsWithSubject)); } return homeworkSections; @@ -71,27 +72,24 @@ class _TodoDateSubcategorizer extends _Subcategorizer { _TodoDateSubcategorizer(this.currentDate, this._viewFactory); @override - List<HomeworkSectionView> subcategorize(List<HomeworkReadModel> homeworks) { - final latestHomeworkList = homeworks; + IList<HomeworkSectionView> subcategorize(IList<HomeworkReadModel> homeworks) { final now = currentDate; final tomorrow = now.addDays(1); final in2Days = tomorrow.addDays(1); - final List<HomeworkReadModel> overdueHomework = latestHomeworkList - .where((h) => Date.fromDateTime(h.todoDate) < now) - .toList(); - final List<HomeworkReadModel> todayHomework = latestHomeworkList - .where((h) => Date.fromDateTime(h.todoDate) == now) - .toList(); - final List<HomeworkReadModel> tomorrowHomework = latestHomeworkList + final IList<HomeworkReadModel> overdueHomework = + homeworks.where((h) => Date.fromDateTime(h.todoDate) < now).toIList(); + final IList<HomeworkReadModel> todayHomework = + homeworks.where((h) => Date.fromDateTime(h.todoDate) == now).toIList(); + final IList<HomeworkReadModel> tomorrowHomework = homeworks .where((h) => Date.fromDateTime(h.todoDate) == tomorrow) - .toList(); - final List<HomeworkReadModel> in2DaysHomework = latestHomeworkList + .toIList(); + final IList<HomeworkReadModel> in2DaysHomework = homeworks .where((h) => Date.fromDateTime(h.todoDate) == in2Days) - .toList(); - final List<HomeworkReadModel> futureHomework = latestHomeworkList + .toIList(); + final IList<HomeworkReadModel> futureHomework = homeworks .where((h) => Date.fromDateTime(h.todoDate) > in2Days) - .toList(); + .toIList(); final overdueSec = HomeworkSectionView.fromModels( 'Überfällig', overdueHomework, _viewFactory); @@ -112,6 +110,6 @@ class _TodoDateSubcategorizer extends _Subcategorizer { afterTwoDaysSec ]; - return sections.where((section) => section.isNotEmpty).toList(); + return sections.where((section) => section.isNotEmpty).toIList(); } } diff --git a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/views/homework_section_view.dart b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/views/homework_section_view.dart index 869e03551..aa7d19c7e 100644 --- a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/views/homework_section_view.dart +++ b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/views/homework_section_view.dart @@ -7,6 +7,7 @@ // SPDX-License-Identifier: EUPL-1.2 import 'package:equatable/equatable.dart'; +import 'package:fast_immutable_collections/fast_immutable_collections.dart'; import 'package:hausaufgabenheft_logik/src/models/homework.dart'; import '../../views/homework_view.dart'; @@ -14,7 +15,7 @@ import '../../views/student_homework_view_factory.dart'; class HomeworkSectionView extends Equatable { final String title; - final List<StudentHomeworkView> homeworks; + final IList<StudentHomeworkView> homeworks; bool get isEmpty => homeworks.isEmpty; bool get isNotEmpty => homeworks.isNotEmpty; @@ -26,11 +27,13 @@ class HomeworkSectionView extends Equatable { factory HomeworkSectionView.fromModels( String title, - List<HomeworkReadModel> homeworks, + IList<HomeworkReadModel> homeworks, StudentHomeworkViewFactory viewFactory) { - return HomeworkSectionView(title, [ - for (final h in homeworks) viewFactory.createFrom(h), - ]); + return HomeworkSectionView( + title, + IList([ + for (final h in homeworks) viewFactory.createFrom(h), + ])); } @override diff --git a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/views/open_homework_list_view.dart b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/views/open_homework_list_view.dart index d6257a657..73fb74dd8 100644 --- a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/views/open_homework_list_view.dart +++ b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/views/open_homework_list_view.dart @@ -7,13 +7,14 @@ // SPDX-License-Identifier: EUPL-1.2 import 'package:collection/collection.dart' show DeepCollectionEquality; +import 'package:fast_immutable_collections/fast_immutable_collections.dart'; import 'package:hausaufgabenheft_logik/hausaufgabenheft_logik.dart'; import 'homework_section_view.dart'; class OpenHomeworkListView { final bool showCompleteOverdueHomeworkPrompt; - final List<HomeworkSectionView> sections; + final IList<HomeworkSectionView> sections; final HomeworkSort sorting; OpenHomeworkListView( diff --git a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/views/open_homework_list_view_factory.dart b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/views/open_homework_list_view_factory.dart index 2ea21509e..985e6b33d 100644 --- a/lib/hausaufgabenheft_logik/lib/src/open_homeworks/views/open_homework_list_view_factory.dart +++ b/lib/hausaufgabenheft_logik/lib/src/open_homeworks/views/open_homework_list_view_factory.dart @@ -6,6 +6,7 @@ // // SPDX-License-Identifier: EUPL-1.2 +import 'package:fast_immutable_collections/fast_immutable_collections.dart'; import 'package:hausaufgabenheft_logik/src/models/homework.dart'; import 'package:hausaufgabenheft_logik/src/models/models.dart'; import 'package:hausaufgabenheft_logik/src/homework_list_extensions.dart'; @@ -23,7 +24,7 @@ class OpenHomeworkListViewFactory { this._sortAndSubcategorizer, this._getCurrentDate); OpenHomeworkListView create( - List<HomeworkReadModel> openHomeworks, Sort<HomeworkReadModel> sort) { + IList<HomeworkReadModel> openHomeworks, Sort<HomeworkReadModel> sort) { final homeworkSectionViews = _sortAndSubcategorizer.sortAndSubcategorize(openHomeworks, sort); @@ -38,7 +39,7 @@ class OpenHomeworkListViewFactory { } bool _shouldShowCompleteOverdueHomeworkPrompt( - List<HomeworkReadModel> openHomeworks) { + IList<HomeworkReadModel> openHomeworks) { var now = _getCurrentDate(); var overdueOpenHomeworks = openHomeworks.getOverdue(now); return overdueOpenHomeworks.length > 2; diff --git a/lib/hausaufgabenheft_logik/lib/src/setup/dependencies.dart b/lib/hausaufgabenheft_logik/lib/src/setup/dependencies.dart index 5bba6d9e9..f0fc2cfa8 100644 --- a/lib/hausaufgabenheft_logik/lib/src/setup/dependencies.dart +++ b/lib/hausaufgabenheft_logik/lib/src/setup/dependencies.dart @@ -7,6 +7,7 @@ // SPDX-License-Identifier: EUPL-1.2 import 'package:common_domain_models/common_domain_models.dart'; +import 'package:fast_immutable_collections/fast_immutable_collections.dart'; import 'package:key_value_store/key_value_store.dart'; import '../data_source/homework_data_source.dart'; import '../homework_completion/homework_completion_dispatcher.dart'; @@ -20,7 +21,7 @@ class HausaufgabenheftDependencies { /// Used to complete all overdue homeworks at once by using the completion /// dispatcher. - final Future<List<HomeworkId>> Function() getOpenOverdueHomeworkIds; + final Future<IList<HomeworkId>> Function() getOpenOverdueHomeworkIds; final KeyValueStore keyValueStore; diff --git a/lib/hausaufgabenheft_logik/lib/src/student_homework_page_bloc/student_homework_page_bloc.dart b/lib/hausaufgabenheft_logik/lib/src/student_homework_page_bloc/student_homework_page_bloc.dart index 96a56aefa..351713a03 100644 --- a/lib/hausaufgabenheft_logik/lib/src/student_homework_page_bloc/student_homework_page_bloc.dart +++ b/lib/hausaufgabenheft_logik/lib/src/student_homework_page_bloc/student_homework_page_bloc.dart @@ -11,6 +11,7 @@ import 'dart:async'; import 'package:bloc/bloc.dart'; import 'package:bloc_base/bloc_base.dart' as bloc_base; import 'package:common_domain_models/common_domain_models.dart'; +import 'package:fast_immutable_collections/fast_immutable_collections.dart'; import 'package:hausaufgabenheft_logik/hausaufgabenheft_logik.dart'; import 'package:hausaufgabenheft_logik/src/completed_homeworks/views/completed_homework_list_view_factory.dart'; import 'package:hausaufgabenheft_logik/src/homework_completion/homework_page_completion_dispatcher.dart'; @@ -84,7 +85,7 @@ class HomeworkPageBloc extends Bloc<HomeworkPageEvent, HomeworkPageState> _homeworkDataSource.getLazyLoadingCompletedHomeworksController( numberOfInitialCompletedHomeworksToLoad); - _combineLatestSubscription = Rx.combineLatest3<List<HomeworkReadModel>, + _combineLatestSubscription = Rx.combineLatest3<IList<HomeworkReadModel>, Sort<HomeworkReadModel>, LazyLoadingResult, Success>( _homeworkDataSource.openHomeworks, _currentSortStream, diff --git a/lib/hausaufgabenheft_logik/pubspec.lock b/lib/hausaufgabenheft_logik/pubspec.lock index af545a917..6b1977698 100644 --- a/lib/hausaufgabenheft_logik/pubspec.lock +++ b/lib/hausaufgabenheft_logik/pubspec.lock @@ -127,6 +127,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.5" + fast_immutable_collections: + dependency: "direct main" + description: + name: fast_immutable_collections + sha256: b910ccdc99bb38a2abbce07c5afb8f81d4e222a892e4d095a548b99814837b0c + url: "https://pub.dev" + source: hosted + version: "9.2.1" file: dependency: "direct dev" description: diff --git a/lib/hausaufgabenheft_logik/pubspec.yaml b/lib/hausaufgabenheft_logik/pubspec.yaml index a39969ea1..abe6de277 100644 --- a/lib/hausaufgabenheft_logik/pubspec.yaml +++ b/lib/hausaufgabenheft_logik/pubspec.yaml @@ -20,6 +20,7 @@ dependencies: bloc: ^8.1.2 rxdart: ^0.27.1 equatable: ^2.0.5 + fast_immutable_collections: ^9.1.5 collection: ^1.17.2 meta: any key_value_store: diff --git a/lib/hausaufgabenheft_logik/test/homework_list_test.dart b/lib/hausaufgabenheft_logik/test/homework_list_test.dart index beb86135e..9f2ebda21 100644 --- a/lib/hausaufgabenheft_logik/test/homework_list_test.dart +++ b/lib/hausaufgabenheft_logik/test/homework_list_test.dart @@ -6,6 +6,7 @@ // // SPDX-License-Identifier: EUPL-1.2 +import 'package:fast_immutable_collections/fast_immutable_collections.dart'; import 'package:hausaufgabenheft_logik/hausaufgabenheft_logik.dart'; import 'package:test/test.dart'; @@ -79,7 +80,7 @@ void main() { createHomework( subject: subject.name, abbreviation: subject.abbreviation) ]; - final homeworkList = homeworks; + final homeworkList = homeworks.toIList(); final result = homeworkList.getDistinctOrderedSubjects(); @@ -100,8 +101,8 @@ void testSort(String title, required ListCallback sort, bool skip = false}) { test(title, () { - sort(unsorted); - expect(unsorted, sorted); + final actualSorted = sort(unsorted.toIList()); + expect(actualSorted.toList(), sorted); }, skip: skip); } @@ -119,4 +120,5 @@ void testTitleSort(String title, ListCallback sort) => testSort( sort: sort, ); -typedef ListCallback = void Function(List<HomeworkReadModel>); +typedef ListCallback = IList<HomeworkReadModel> Function( + IList<HomeworkReadModel>); diff --git a/lib/hausaufgabenheft_logik/test/homework_page_bloc_test.dart b/lib/hausaufgabenheft_logik/test/homework_page_bloc_test.dart index c9c11dec5..c03882545 100644 --- a/lib/hausaufgabenheft_logik/test/homework_page_bloc_test.dart +++ b/lib/hausaufgabenheft_logik/test/homework_page_bloc_test.dart @@ -11,6 +11,7 @@ import 'dart:developer'; import 'package:bloc/bloc.dart'; import 'package:clock/clock.dart'; +import 'package:fast_immutable_collections/fast_immutable_collections.dart'; import 'package:hausaufgabenheft_logik/hausaufgabenheft_logik.dart'; import 'package:hausaufgabenheft_logik/hausaufgabenheft_logik_setup.dart'; import 'package:hausaufgabenheft_logik/src/student_homework_page_bloc/homework_sorting_cache.dart'; @@ -480,9 +481,12 @@ void main() { extension on OpenHomeworkListView { List<StudentHomeworkView> get orderedHomeworks { - final listOfListOfHomeworks = sections.map((s) => s.homeworks).toList(); + final listOfListOfHomeworks = + sections.map((s) => s.homeworks.toList()).toList(); if (listOfListOfHomeworks.isEmpty) return []; - if (listOfListOfHomeworks.length == 1) return listOfListOfHomeworks.single; + if (listOfListOfHomeworks.length == 1) { + return listOfListOfHomeworks.single.toList(); + } return listOfListOfHomeworks.reduce((l1, l2) => [...l1, ...l2]).toList(); } } @@ -500,7 +504,7 @@ HomeworkPageBloc createBloc( completionDispatcher: RepositoryHomeworkCompletionDispatcher(repository), getOpenOverdueHomeworkIds: () async { final open = await repository.openHomeworks.first; - return open.getOverdue().map((hw) => hw.id).toList(); + return open.getOverdue().map((hw) => hw.id).toIList(); }, keyValueStore: keyValueStore ?? InMemoryKeyValueStore(), getCurrentDateTime: getCurrentDateTime, diff --git a/lib/hausaufgabenheft_logik/test/in_memory_repo/in_memory_homework_repository.dart b/lib/hausaufgabenheft_logik/test/in_memory_repo/in_memory_homework_repository.dart index 08db69a9a..7c90e949f 100644 --- a/lib/hausaufgabenheft_logik/test/in_memory_repo/in_memory_homework_repository.dart +++ b/lib/hausaufgabenheft_logik/test/in_memory_repo/in_memory_homework_repository.dart @@ -9,20 +9,21 @@ import 'dart:async'; import 'package:common_domain_models/common_domain_models.dart'; +import 'package:fast_immutable_collections/fast_immutable_collections.dart'; import 'package:rxdart/rxdart.dart'; import 'package:hausaufgabenheft_logik/hausaufgabenheft_logik.dart'; import 'firebase_realtime_updating_lazy_loading_controller.dart'; import 'realtime_completed_homework_loader.dart'; class InMemoryHomeworkRepository extends HomeworkDataSource { - final List<HomeworkReadModel> _homeworks = []; - List<HomeworkReadModel> get _openHomeworks => - _homeworks.where((h) => h.status == CompletionStatus.open).toList(); - List<HomeworkReadModel> get _completedHomeworks => - _homeworks.where((h) => h.status == CompletionStatus.completed).toList(); - - final _openHomeworkStream = BehaviorSubject<List<HomeworkReadModel>>(); - final _completedHomeworkStream = BehaviorSubject<List<HomeworkReadModel>>(); + IList<HomeworkReadModel> _homeworks = const IListConst([]); + IList<HomeworkReadModel> get _openHomeworks => + _homeworks.where((h) => h.status == CompletionStatus.open).toIList(); + IList<HomeworkReadModel> get _completedHomeworks => + _homeworks.where((h) => h.status == CompletionStatus.completed).toIList(); + + final _openHomeworkStream = BehaviorSubject<IList<HomeworkReadModel>>(); + final _completedHomeworkStream = BehaviorSubject<IList<HomeworkReadModel>>(); final Duration fakeDelay; InMemoryHomeworkRepository({this.fakeDelay = Duration.zero}) { @@ -30,30 +31,30 @@ class InMemoryHomeworkRepository extends HomeworkDataSource { } @override - Stream<List<HomeworkReadModel>> get openHomeworks => + Stream<IList<HomeworkReadModel>> get openHomeworks => _openHomeworkStream.stream.delay(fakeDelay); final bool _loadedAllCompleted = false; bool get loadedAllCompleted => _loadedAllCompleted; Future<void> add(HomeworkReadModel homework) async { - _homeworks.add(homework); + _homeworks = _homeworks.add(homework); addHomeworksToStreams(); } Future<void> delete(HomeworkReadModel homework) async { - _homeworks.removeWhere((h) => h.id == homework.id); + _homeworks = _homeworks.removeWhere((h) => h.id == homework.id); addHomeworksToStreams(); } - Future<List<HomeworkReadModel>> getAll() async { + Future<IList<HomeworkReadModel>> getAll() async { await Future.delayed(fakeDelay); return _homeworks; } Future<void> update(HomeworkReadModel homework) async { final index = _homeworks.indexWhere((h) => h.id == homework.id); - _homeworks[index] = homework; + _homeworks = _homeworks.replace(index, homework); addHomeworksToStreams(); } @@ -76,12 +77,12 @@ class InMemoryHomeworkRepository extends HomeworkDataSource { } class InMemoryHomeworkLoader extends RealtimeCompletedHomeworkLoader { - final BehaviorSubject<List<HomeworkReadModel>> _completedHomeworksSubject; + final BehaviorSubject<IList<HomeworkReadModel>> _completedHomeworksSubject; InMemoryHomeworkLoader(this._completedHomeworksSubject); @override - Stream<List<HomeworkReadModel>> loadMostRecentHomeworks( + Stream<IList<HomeworkReadModel>> loadMostRecentHomeworks( int numberOfHomeworks) { return _completedHomeworksSubject.map((homeworks) { if (homeworks.length < numberOfHomeworks) return homeworks; diff --git a/lib/hausaufgabenheft_logik/test/in_memory_repo/realtime_completed_homework_loader.dart b/lib/hausaufgabenheft_logik/test/in_memory_repo/realtime_completed_homework_loader.dart index 54472c9da..a0beb5f59 100644 --- a/lib/hausaufgabenheft_logik/test/in_memory_repo/realtime_completed_homework_loader.dart +++ b/lib/hausaufgabenheft_logik/test/in_memory_repo/realtime_completed_homework_loader.dart @@ -6,9 +6,10 @@ // // SPDX-License-Identifier: EUPL-1.2 +import 'package:fast_immutable_collections/fast_immutable_collections.dart'; import 'package:hausaufgabenheft_logik/src/models/homework.dart'; abstract class RealtimeCompletedHomeworkLoader { - Stream<List<HomeworkReadModel>> loadMostRecentHomeworks( + Stream<IList<HomeworkReadModel>> loadMostRecentHomeworks( int numberOfHomeworks); }