From 8ed1b574e8b5e9fc806aedc87af7aabcf73da6e6 Mon Sep 17 00:00:00 2001 From: Aldrik Ramaekers Date: Wed, 17 Aug 2022 13:54:48 +0200 Subject: b0.2 --- lib/events/RefreshWeekEvent.dart | 1 + lib/main.dart | 4 +- lib/pages/agenda_page.dart | 20 +++++--- lib/pages/home_page.dart | 4 ++ lib/pages/logbook_page.dart | 9 +--- lib/services/ishift_provider_service.dart | 2 +- lib/services/local_shift_provider_service.dart | 18 +++++-- lib/services/messaging_service.dart | 9 ++++ lib/services/mock_shift_provider_service.dart | 5 +- lib/shift.dart | 5 ++ lib/utils/date.dart | 20 ++++++++ lib/widgets/agenda_week.dart | 14 ++++++ lib/widgets/agenda_week_item.dart | 68 +++++++++++++++----------- 13 files changed, 127 insertions(+), 52 deletions(-) create mode 100644 lib/events/RefreshWeekEvent.dart create mode 100644 lib/services/messaging_service.dart (limited to 'lib') diff --git a/lib/events/RefreshWeekEvent.dart b/lib/events/RefreshWeekEvent.dart new file mode 100644 index 0000000..6f8fc52 --- /dev/null +++ b/lib/events/RefreshWeekEvent.dart @@ -0,0 +1 @@ +class RefreshWeekEvent {} diff --git a/lib/main.dart b/lib/main.dart index d5c1f21..6e15b59 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,6 +1,7 @@ import 'package:event_bus/event_bus.dart'; import 'package:flutter/material.dart'; import 'package:training_planner/services/ishift_provider_service.dart'; +import 'package:training_planner/services/messaging_service.dart'; import 'package:training_planner/services/mock_shift_provider_service.dart'; import 'package:training_planner/services/local_shift_provider_service.dart'; import 'pages/home_page.dart'; @@ -10,8 +11,9 @@ void main() { runApp(const MyApp()); } -IProgramProviderService shiftProvider = LocalShiftProviderService(); +final IProgramProviderService shiftProvider = LocalShiftProviderService(); final LocalAuthentication auth = LocalAuthentication(); +final MessagingService messageService = MessagingService(); EventBus eventBus = EventBus(); diff --git a/lib/pages/agenda_page.dart b/lib/pages/agenda_page.dart index eca39fe..26eb877 100644 --- a/lib/pages/agenda_page.dart +++ b/lib/pages/agenda_page.dart @@ -1,10 +1,12 @@ import 'package:carousel_slider/carousel_slider.dart'; import 'package:flutter/material.dart'; import 'package:in_date_utils/in_date_utils.dart' as DateUtilities; +import 'package:training_planner/events/RefreshWeekEvent.dart'; import 'package:training_planner/main.dart'; import 'package:training_planner/pages/home_page.dart'; import 'package:training_planner/shift.dart'; import 'package:training_planner/style/style.dart'; +import 'package:training_planner/utils/date.dart'; import 'package:training_planner/widgets/agenda_week.dart'; class AgendaPage extends StatefulWidget { @@ -76,7 +78,15 @@ class _AgendaPageState extends State { break; } - await shiftProvider.addShift(Shift(start: dayOfWeek, type: type)); + bool success = + await shiftProvider.addShift(Shift(start: dayOfWeek, type: type)); + if (!success) { + messageService.showMessage( + context, + '\'' + + DateHelper.getWeekdayNameFull(dayOfWeek.weekday) + + '\' is al ingepland'); + } } } @@ -98,7 +108,6 @@ class _AgendaPageState extends State { child: Text("Ok"), onPressed: () async { await addShiftsFromDialog(); - setState(() {}); Navigator.pop(context); }, ); @@ -221,12 +230,7 @@ class _AgendaPageState extends State { floatingActionButton: FloatingActionButton( onPressed: () async { await showAddShiftDialog(); - Navigator.pushReplacement( - context, - MaterialPageRoute( - builder: (BuildContext context) => HomePage( - agendaWeekNr: currentSelectedPageIndex, - ))); + eventBus.fire(RefreshWeekEvent()); }, backgroundColor: Style.titleColor, child: const Icon(Icons.add), diff --git a/lib/pages/home_page.dart b/lib/pages/home_page.dart index 6b81451..3b57a0f 100644 --- a/lib/pages/home_page.dart +++ b/lib/pages/home_page.dart @@ -31,6 +31,10 @@ class _HomePageState extends State { void _onItemTapped(int index) { setState(() { widget.agendaWeekNr = 0; + _widgetOptions = [ + new AgendaPage(agendaWeekNr: widget.agendaWeekNr), + new LogbookPage(), + ]; _selectedIndex = index; }); } diff --git a/lib/pages/logbook_page.dart b/lib/pages/logbook_page.dart index 0849cda..a9ef211 100644 --- a/lib/pages/logbook_page.dart +++ b/lib/pages/logbook_page.dart @@ -106,14 +106,9 @@ class _LogbookPageState extends State { Text('Gewerkt: ' + month.totalWorkedTime.inHours.toString() + ' uur'), - Text('Verdiend: ' + + Text('Verdiend: €' + month.expectedSalary.toStringAsFixed(2) + - (month.shifts.isNotEmpty - ? ' (' + - (month.shifts[0].getMinutePayRate() * 60) - .toStringAsFixed(2) + - '/uur)' - : '')), + ' (schatting)'), Padding(padding: EdgeInsets.only(left: 5, bottom: 5, right: 5)), ], ), diff --git a/lib/services/ishift_provider_service.dart b/lib/services/ishift_provider_service.dart index 7f0e6d5..68f4277 100644 --- a/lib/services/ishift_provider_service.dart +++ b/lib/services/ishift_provider_service.dart @@ -6,6 +6,6 @@ abstract class IProgramProviderService { Future> getPastShifts(); Future> getShiftsForWeek(DateTime firstDayOfWeek); Future updateShift(Shift shift); - Future addShift(Shift shift); + Future addShift(Shift shift); Future deleteShift(Shift shift); } diff --git a/lib/services/local_shift_provider_service.dart b/lib/services/local_shift_provider_service.dart index 263d747..2d00a1e 100644 --- a/lib/services/local_shift_provider_service.dart +++ b/lib/services/local_shift_provider_service.dart @@ -8,9 +8,7 @@ import 'package:in_date_utils/in_date_utils.dart' as DateUtilities; import 'package:path_provider/path_provider.dart'; class LocalShiftProviderService extends IProgramProviderService { - LocalShiftProviderService() { - writeShiftsFromFile([]); - } + LocalShiftProviderService() {} Future get _localPath async { final directory = await getApplicationDocumentsDirectory(); @@ -19,6 +17,15 @@ class LocalShiftProviderService extends IProgramProviderService { Future get _localFile async { final path = await _localPath; + File file = File('$path/shifts.json'); + + bool exists = await file.exists(); + if (!exists) { + print('created shifts.json'); + await file.create(); + await writeShiftsFromFile([]); + } + return File('$path/shifts.json'); } @@ -67,16 +74,17 @@ class LocalShiftProviderService extends IProgramProviderService { } @override - Future addShift(Shift shift) async { + Future addShift(Shift shift) async { List savedShifts = await readShiftsFromFile(); for (var item in savedShifts) { if (DateUtilities.DateUtils.isSameDay(shift.start, item.start)) { - return; + return false; } } savedShifts.add(shift); await writeShiftsFromFile(savedShifts); + return true; } @override diff --git a/lib/services/messaging_service.dart b/lib/services/messaging_service.dart new file mode 100644 index 0000000..e601abb --- /dev/null +++ b/lib/services/messaging_service.dart @@ -0,0 +1,9 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +class MessagingService { + void showMessage(BuildContext context, String message) { + ScaffoldMessenger.of(context) + .showSnackBar(SnackBar(content: Text(message))); + } +} diff --git a/lib/services/mock_shift_provider_service.dart b/lib/services/mock_shift_provider_service.dart index 8f8db3e..c7bc865 100644 --- a/lib/services/mock_shift_provider_service.dart +++ b/lib/services/mock_shift_provider_service.dart @@ -56,13 +56,14 @@ class MockShiftProviderService extends IProgramProviderService { } @override - Future addShift(Shift shift) async { + Future addShift(Shift shift) async { for (var item in savedShifts) { if (DateUtilities.DateUtils.isSameDay(shift.start, item.start)) { - return; + return false; } } savedShifts.add(shift); + return true; } @override diff --git a/lib/shift.dart b/lib/shift.dart index eecf4cc..c444b38 100644 --- a/lib/shift.dart +++ b/lib/shift.dart @@ -120,6 +120,11 @@ class Shift { getMinutePayRate() * 1.35; } + if (start.weekday == 7) { + return endToCalculate.difference(start).inMinutes * + getMinutePayRate() * + 2; + } return endToCalculate.difference(start).inMinutes * getMinutePayRate(); } diff --git a/lib/utils/date.dart b/lib/utils/date.dart index 7a66c03..07596a2 100644 --- a/lib/utils/date.dart +++ b/lib/utils/date.dart @@ -1,4 +1,24 @@ class DateHelper { + static String getWeekdayNameFull(int nr) { + switch (nr) { + case DateTime.monday: + return 'Maandag'; + case DateTime.tuesday: + return 'Dinsdag'; + case DateTime.wednesday: + return 'Woensdag'; + case DateTime.thursday: + return 'Donderdag'; + case DateTime.friday: + return 'Vrijdag'; + case DateTime.saturday: + return 'Zaterdag'; + case DateTime.sunday: + return 'Zondag'; + } + return ''; + } + static String getWeekdayName(int nr) { switch (nr) { case DateTime.monday: diff --git a/lib/widgets/agenda_week.dart b/lib/widgets/agenda_week.dart index 543e0ff..a8f9350 100644 --- a/lib/widgets/agenda_week.dart +++ b/lib/widgets/agenda_week.dart @@ -1,4 +1,7 @@ +import 'dart:async'; + import 'package:flutter/material.dart'; +import 'package:training_planner/events/RefreshWeekEvent.dart'; import 'package:training_planner/main.dart'; import 'package:training_planner/shift.dart'; import 'package:training_planner/style/style.dart'; @@ -24,6 +27,7 @@ class AgendaWeek extends StatefulWidget { class _AgendaWeekState extends State { List weekItems = []; + StreamSubscription? eventbusSubscription; void updateItems() { setState(() { @@ -58,6 +62,16 @@ class _AgendaWeekState extends State { void initState() { super.initState(); updateItems(); + + eventbusSubscription = eventBus.on().listen((event) { + updateItems(); + }); + } + + @override + void dispose() { + eventbusSubscription?.cancel(); + super.dispose(); } @override diff --git a/lib/widgets/agenda_week_item.dart b/lib/widgets/agenda_week_item.dart index b74cabd..20d237b 100644 --- a/lib/widgets/agenda_week_item.dart +++ b/lib/widgets/agenda_week_item.dart @@ -150,6 +150,10 @@ class _ExerciseEntryState extends State { } Future requestStartAndEndTimeForShift() async { + bool alsoAskForEndTime = + widget.shift.getShiftStatus() == ShiftStatus.OldOpen || + widget.shift.getShiftStatus() == ShiftStatus.Closed; + final TimeOfDay? startTime = await showTimePicker( context: context, helpText: 'Begin tijd', @@ -162,17 +166,26 @@ class _ExerciseEntryState extends State { return; } - final TimeOfDay? endTime = await showTimePicker( - context: context, - helpText: 'Eind tijd', - initialTime: TimeOfDay( - hour: widget.shift.expectedEndTime().hour, - minute: widget.shift.expectedEndTime().minute), - initialEntryMode: TimePickerEntryMode.input, - ); + if (alsoAskForEndTime) { + final TimeOfDay? endTime = await showTimePicker( + context: context, + helpText: 'Eind tijd', + initialTime: TimeOfDay( + hour: widget.shift.expectedEndTime().hour, + minute: widget.shift.expectedEndTime().minute), + initialEntryMode: TimePickerEntryMode.input, + ); + + if (endTime == null) { + return; + } - if (endTime == null) { - return; + widget.shift.end = DateTime( + widget.shift.start.year, + widget.shift.start.month, + widget.shift.start.day, + endTime.hour, + endTime.minute); } widget.shift.start = DateTime( @@ -182,13 +195,6 @@ class _ExerciseEntryState extends State { startTime.hour, startTime.minute); - widget.shift.end = DateTime( - widget.shift.start.year, - widget.shift.start.month, - widget.shift.start.day, - endTime.hour, - endTime.minute); - await shiftProvider.updateShift(widget.shift); } @@ -229,7 +235,7 @@ class _ExerciseEntryState extends State { }, ); Widget continueButton = FlatButton( - child: Text("Verwijder"), + child: Text("Verwijderen"), onPressed: () async { await shiftProvider.deleteShift(widget.shift); Navigator.pop(context); @@ -325,18 +331,24 @@ class _ExerciseEntryState extends State { ), width: widthOfWeekday, ), - Container( - child: RichText( - text: TextSpan( - style: TextStyle(color: Colors.black), - children: [ - TextSpan(text: ' | ' + shiftTime), - TextSpan( - text: shiftTimeEnd, style: endDateTextStyle) - ], + GestureDetector( + onLongPress: () { + requestStartAndEndTimeForShift() + .then((e) => {setState(() {})}); + }, + child: Container( + child: RichText( + text: TextSpan( + style: TextStyle(color: Colors.black), + children: [ + TextSpan(text: ' | ' + shiftTime), + TextSpan( + text: shiftTimeEnd, style: endDateTextStyle) + ], + ), ), + width: widthOfDates, ), - width: widthOfDates, ), Container( child: Text( -- cgit v1.2.3-70-g09d2