summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorAldrik Ramaekers <aldrik@amftech.nl>2022-08-17 13:54:48 +0200
committerAldrik Ramaekers <aldrik@amftech.nl>2022-08-17 13:54:48 +0200
commit8ed1b574e8b5e9fc806aedc87af7aabcf73da6e6 (patch)
tree5126fb297b9df2829b6b34f966f615183b4c73af /lib
parent3d25fdc99fd37f3b5e37f25b7a38804a02130426 (diff)
b0.2
Diffstat (limited to 'lib')
-rw-r--r--lib/events/RefreshWeekEvent.dart1
-rw-r--r--lib/main.dart4
-rw-r--r--lib/pages/agenda_page.dart20
-rw-r--r--lib/pages/home_page.dart4
-rw-r--r--lib/pages/logbook_page.dart9
-rw-r--r--lib/services/ishift_provider_service.dart2
-rw-r--r--lib/services/local_shift_provider_service.dart18
-rw-r--r--lib/services/messaging_service.dart9
-rw-r--r--lib/services/mock_shift_provider_service.dart5
-rw-r--r--lib/shift.dart5
-rw-r--r--lib/utils/date.dart20
-rw-r--r--lib/widgets/agenda_week.dart14
-rw-r--r--lib/widgets/agenda_week_item.dart68
13 files changed, 127 insertions, 52 deletions
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<AgendaPage> {
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<AgendaPage> {
child: Text("Ok"),
onPressed: () async {
await addShiftsFromDialog();
- setState(() {});
Navigator.pop(context);
},
);
@@ -221,12 +230,7 @@ class _AgendaPageState extends State<AgendaPage> {
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<HomePage> {
void _onItemTapped(int index) {
setState(() {
widget.agendaWeekNr = 0;
+ _widgetOptions = <Widget>[
+ 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<LogbookPage> {
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<List<Shift>> getPastShifts();
Future<List<Shift>> getShiftsForWeek(DateTime firstDayOfWeek);
Future<void> updateShift(Shift shift);
- Future<void> addShift(Shift shift);
+ Future<bool> addShift(Shift shift);
Future<void> 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<String> get _localPath async {
final directory = await getApplicationDocumentsDirectory();
@@ -19,6 +17,15 @@ class LocalShiftProviderService extends IProgramProviderService {
Future<File> 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<void> addShift(Shift shift) async {
+ Future<bool> addShift(Shift shift) async {
List<Shift> 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<void> addShift(Shift shift) async {
+ Future<bool> 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<AgendaWeek> {
List<Widget> weekItems = [];
+ StreamSubscription? eventbusSubscription;
void updateItems() {
setState(() {
@@ -58,6 +62,16 @@ class _AgendaWeekState extends State<AgendaWeek> {
void initState() {
super.initState();
updateItems();
+
+ eventbusSubscription = eventBus.on<RefreshWeekEvent>().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<AgendaWeekItem> {
}
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<AgendaWeekItem> {
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<AgendaWeekItem> {
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<AgendaWeekItem> {
},
);
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<AgendaWeekItem> {
),
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(