Skip to content

Commit 17def70

Browse files
Merge pull request #17 from dabblingwithcode/staging
Staging
2 parents a4f2d52 + 04beeff commit 17def70

20 files changed

Lines changed: 669 additions & 128 deletions

File tree

school_data_hub_client/lib/src/protocol/_features/books/models/library_book_location.dart

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
// ignore_for_file: no_leading_underscores_for_library_prefixes
1212
import 'package:serverpod_client/serverpod_client.dart' as _i1;
13+
1314
import '../../../_features/books/models/library_book.dart' as _i2;
1415

1516
abstract class LibraryBookLocation implements _i1.SerializableModel {
@@ -66,6 +67,17 @@ abstract class LibraryBookLocation implements _i1.SerializableModel {
6667
String toString() {
6768
return _i1.SerializationManager.encode(this);
6869
}
70+
71+
@override
72+
bool operator ==(Object other) {
73+
if (identical(this, other)) return true;
74+
return other is LibraryBookLocation &&
75+
other.id == id &&
76+
other.location == location;
77+
}
78+
79+
@override
80+
int get hashCode => Object.hash(id, location);
6981
}
7082

7183
class _Undefined {}

school_data_hub_flutter/lib/app_utils/shorebird_code_push.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ class _CheckForUpdatesPageState extends State<CheckForUpdatesPage> {
213213
),
214214
),
215215

216-
bottomNavigationBar: const BottomNavBarNoFilterButton(),
216+
bottomNavigationBar: GenericBottomNavBarWithActions(),
217217
);
218218
}
219219
}

school_data_hub_flutter/lib/common/widgets/generic_components/bottom_nav_bar_no_filter_button.dart

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@ import 'package:gap/gap.dart';
33
import 'package:school_data_hub_flutter/common/theme/app_colors.dart';
44
import 'package:school_data_hub_flutter/common/widgets/bottom_nav_bar_layouts.dart';
55

6-
class BottomNavBarNoFilterButton extends StatelessWidget {
7-
const BottomNavBarNoFilterButton({super.key});
6+
class GenericBottomNavBarWithActions extends StatelessWidget {
7+
final List<Widget>? actions;
8+
GenericBottomNavBarWithActions({this.actions, super.key});
89

910
@override
1011
Widget build(BuildContext context) {
@@ -28,6 +29,8 @@ class BottomNavBarNoFilterButton extends StatelessWidget {
2829
Navigator.pop(context);
2930
},
3031
),
32+
if (actions != null)
33+
for (var action in actions!) ...[const Gap(15), action],
3134
const Gap(15),
3235
],
3336
),

school_data_hub_flutter/lib/common/widgets/unencrypted_image_in_card.dart

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

33
import 'package:flutter/material.dart';
4+
import 'package:flutter_cache_manager/flutter_cache_manager.dart';
45
import 'package:flutter_hooks/flutter_hooks.dart';
56
import 'package:school_data_hub_flutter/app_utils/create_and_crop_image_file.dart';
67
import 'package:school_data_hub_flutter/common/theme/app_colors.dart';
@@ -22,7 +23,16 @@ class UnencryptedImageInCard extends HookWidget {
2223

2324
@override
2425
Widget build(BuildContext context) {
26+
final refreshState = useState(0);
2527
final randomPart = useMemoized(() => UniqueKey().toString(), []);
28+
final imageFuture = useMemoized(
29+
() => cachedPublicImageOrDownloadPublicImage(
30+
path: path,
31+
cacheKey: cacheKey,
32+
),
33+
[path, cacheKey, refreshState.value],
34+
);
35+
2636
return SizedBox(
2737
height: size,
2838
width: (21 / 30) * size,
@@ -31,18 +41,18 @@ class UnencryptedImageInCard extends HookWidget {
3141
onLongPress: () async {
3242
final File? file = await createAndCropImageFile(context);
3343
if (file == null) return;
44+
45+
await di<DefaultCacheManager>().removeFile(cacheKey);
3446
await di<BookManager>().updateBookImage(
3547
file: file,
3648
isbn: int.tryParse(cacheKey)!,
3749
);
50+
refreshState.value++;
3851
},
3952
child: WidgetZoom(
4053
heroAnimationTag: '$cacheKey$randomPart',
4154
zoomWidget: FutureBuilder<Image>(
42-
future: cachedPublicImageOrDownloadPublicImage(
43-
path: path,
44-
cacheKey: cacheKey,
45-
),
55+
future: imageFuture,
4656
builder: (context, snapshot) {
4757
Widget child;
4858
if (snapshot.connectionState == ConnectionState.waiting) {

school_data_hub_flutter/lib/features/_attendance/presentation/attendance_page/attendance_list_page.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@ import 'package:flutter/material.dart';
44
import 'package:gap/gap.dart';
55
import 'package:logging/logging.dart';
66
import 'package:school_data_hub_client/school_data_hub_client.dart';
7-
import 'package:school_data_hub_flutter/core/models/datetime_extensions.dart';
87
import 'package:school_data_hub_flutter/common/services/notification_service.dart';
98
import 'package:school_data_hub_flutter/common/theme/app_colors.dart';
109
import 'package:school_data_hub_flutter/common/widgets/generic_components/generic_sliver_list.dart';
1110
import 'package:school_data_hub_flutter/common/widgets/generic_components/generic_sliver_search_app_bar.dart';
11+
import 'package:school_data_hub_flutter/core/models/datetime_extensions.dart';
1212
import 'package:school_data_hub_flutter/core/session/hub_session_manager.dart';
1313
import 'package:school_data_hub_flutter/features/_attendance/domain/attendance_helper_functions.dart';
1414
import 'package:school_data_hub_flutter/features/_attendance/domain/attendance_manager.dart';

school_data_hub_flutter/lib/features/_schoolday_events/domain/filters/schoolday_event_filter_helpers.dart

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

school_data_hub_flutter/lib/features/_schoolday_events/domain/filters/schoolday_event_filter_manager.dart

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import 'package:collection/collection.dart';
22
import 'package:flutter/foundation.dart';
3+
import 'package:flutter/material.dart';
34
import 'package:school_data_hub_client/school_data_hub_client.dart';
45
import 'package:school_data_hub_flutter/common/domain/filters/filters_state_manager.dart';
56
import 'package:school_data_hub_flutter/features/_schoolday_events/domain/models/schoolday_event_enums.dart';
@@ -157,6 +158,39 @@ class SchooldayEventFilterManager {
157158
}
158159
}
159160

161+
if (activeFilters[SchooldayEventFilter.duringBreak]!) {
162+
if (schooldayEvent.eventTime == null) {
163+
continue;
164+
}
165+
final eventTimeOfDay = TimeOfDay(
166+
hour: int.parse(schooldayEvent.eventTime!.split(':')[0]),
167+
minute: int.parse(schooldayEvent.eventTime!.split(':')[1]),
168+
);
169+
if (eventTimeOfDay.isAfter(const TimeOfDay(hour: 10, minute: 29)) &&
170+
eventTimeOfDay.isBefore(const TimeOfDay(hour: 11, minute: 20))) {
171+
isMatched = true;
172+
complementaryFilter = true;
173+
} else if (!complementaryFilter) {
174+
isMatched = false;
175+
}
176+
}
177+
if (activeFilters[SchooldayEventFilter.notDuringBreak]!) {
178+
if (schooldayEvent.eventTime == null) {
179+
continue;
180+
}
181+
final eventTimeOfDay = TimeOfDay(
182+
hour: int.parse(schooldayEvent.eventTime!.split(':')[0]),
183+
minute: int.parse(schooldayEvent.eventTime!.split(':')[1]),
184+
);
185+
if (eventTimeOfDay.isBefore(const TimeOfDay(hour: 10, minute: 29)) ||
186+
eventTimeOfDay.isAfter(const TimeOfDay(hour: 11, minute: 20))) {
187+
isMatched = true;
188+
complementaryFilter = true;
189+
} else if (!complementaryFilter) {
190+
isMatched = false;
191+
}
192+
}
193+
160194
//- The behavior of this first filter group should be
161195
//- excluding for the next filter group
162196
//- let's tidy up the list

school_data_hub_flutter/lib/features/_schoolday_events/domain/models/schoolday_event_enums.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ enum SchooldayEventFilter {
3838
admonitionInfo,
3939
transitionAdvice,
4040
processed,
41+
duringBreak,
42+
notDuringBreak,
4143
}
4244

4345
Map<SchooldayEventFilter, bool> initialSchooldayEventFilterValues = {
@@ -61,4 +63,6 @@ Map<SchooldayEventFilter, bool> initialSchooldayEventFilterValues = {
6163
SchooldayEventFilter.admonitionInfo: false,
6264
SchooldayEventFilter.transitionAdvice: false,
6365
SchooldayEventFilter.processed: false,
66+
SchooldayEventFilter.duringBreak: false,
67+
SchooldayEventFilter.notDuringBreak: false,
6468
};

school_data_hub_flutter/lib/features/_schoolday_events/presentation/schoolday_event_list_page/widgets/schoolday_event_filter_bottom_sheet.dart

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,10 @@ class SchooldayEventFilterBottomSheet extends WatchingWidget {
6363
activeSchooldayEventFilters[SchooldayEventFilter.learningSupportInfo]!;
6464
bool valueAdmonitionInfo =
6565
activeSchooldayEventFilters[SchooldayEventFilter.admonitionInfo]!;
66-
66+
bool valueDuringBreak =
67+
activeSchooldayEventFilters[SchooldayEventFilter.duringBreak]!;
68+
bool valueNotDuringBreak =
69+
activeSchooldayEventFilters[SchooldayEventFilter.notDuringBreak]!;
6770
return Padding(
6871
padding: const EdgeInsets.only(left: 15.0, right: 15, top: 5),
6972
child: Column(
@@ -184,6 +187,42 @@ class SchooldayEventFilterBottomSheet extends WatchingWidget {
184187
);
185188
},
186189
),
190+
ThemedFilterChip(
191+
label: '🕒',
192+
selected: valueDuringBreak,
193+
onSelected: (val) {
194+
_schooldayEventFilterManager.setFilter(
195+
schooldayEventFilters: [
196+
(
197+
filter: SchooldayEventFilter.duringBreak,
198+
value: val,
199+
),
200+
(
201+
filter: SchooldayEventFilter.notDuringBreak,
202+
value: !val,
203+
),
204+
],
205+
);
206+
},
207+
),
208+
ThemedFilterChip(
209+
label: '✏️',
210+
selected: valueNotDuringBreak,
211+
onSelected: (val) {
212+
_schooldayEventFilterManager.setFilter(
213+
schooldayEventFilters: [
214+
(
215+
filter: SchooldayEventFilter.notDuringBreak,
216+
value: val,
217+
),
218+
(
219+
filter: SchooldayEventFilter.duringBreak,
220+
value: !val,
221+
),
222+
],
223+
);
224+
},
225+
),
187226
],
188227
),
189228
const Gap(10),

school_data_hub_flutter/lib/features/app_settings/settings_page/widgets/settings_account_section.dart

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
import 'package:flutter/material.dart';
22
import 'package:flutter_settings_ui/flutter_settings_ui.dart';
3-
import 'package:gap/gap.dart';
4-
import 'package:school_data_hub_flutter/common/widgets/dialogs/confirmation_dialog.dart';
5-
import 'package:school_data_hub_flutter/core/session/hub_session_helper.dart';
63
import 'package:school_data_hub_flutter/core/session/hub_session_manager.dart';
74
import 'package:school_data_hub_flutter/features/user/presentation/change_password/change_password_page.dart';
85
import 'package:watch_it/watch_it.dart';
@@ -57,31 +54,6 @@ class SettingsAccountSection extends AbstractSettingsSection with WatchItMixin {
5754
trailing: null,
5855
),
5956

60-
SettingsTile.navigation(
61-
leading: GestureDetector(
62-
onTap: () async {
63-
bool? confirm = await confirmationDialog(
64-
context: context,
65-
title: 'Achtung!',
66-
message: 'Ausloggen und alle Daten löschen?',
67-
);
68-
if (confirm == true && context.mounted) {
69-
SessionHelper.logoutAndDeleteAllInstanceData();
70-
}
71-
return;
72-
},
73-
child: const Row(
74-
children: [
75-
Icon(Icons.logout),
76-
Gap(5),
77-
Icon(Icons.delete_forever_outlined),
78-
],
79-
),
80-
),
81-
title: const Text('Ausloggen und Daten löschen'),
82-
value: const Text('App wird zurückgesetzt!'),
83-
//onPressed:
84-
),
8557
SettingsTile.navigation(
8658
leading: const Icon(Icons.attach_money_rounded),
8759
title: const Text('Guthaben'),

0 commit comments

Comments
 (0)