From 943b3cf23987612153239e8e89226a9af71d2e16 Mon Sep 17 00:00:00 2001 From: Aldrik Ramaekers Date: Thu, 18 Aug 2022 21:59:18 +0200 Subject: move hardcoded values to config --- README | 5 +- lib/config/defaults.dart | 21 +++++-- lib/pages/agenda_page.dart | 79 ++++++++++---------------- lib/pages/developer_page.dart | 59 +++++++++++++++++++ lib/pages/home_page.dart | 8 ++- lib/pages/logbook_page.dart | 6 ++ lib/services/local_shift_provider_service.dart | 26 ++++++--- lib/services/mock_shift_provider_service.dart | 18 +++--- lib/services/settings_service.dart | 2 +- lib/shift.dart | 22 ++----- lib/widgets/agenda_week_item.dart | 13 +---- 11 files changed, 151 insertions(+), 108 deletions(-) create mode 100644 lib/pages/developer_page.dart diff --git a/README b/README index 9d796af..ae88807 100644 --- a/README +++ b/README @@ -1,8 +1,11 @@ # Aanpassingen - exceptions afhandelen binnen localShiftProvider en doorgeven aan ui +- optie om bepaalde features aan en uit te zetten on config/config.dart +- verplaats style naar config/style.dart +- verplaats hardcoded kleuren naar style.dart # Nog te doen -- uurloon van gebruiker gebruiken in berekeningen +- Laat gebruiker shift types aanpassen in instellingen pagina # Features - Aanmelden van werktijden diff --git a/lib/config/defaults.dart b/lib/config/defaults.dart index 2553bbe..d71df88 100644 --- a/lib/config/defaults.dart +++ b/lib/config/defaults.dart @@ -1,11 +1,13 @@ class ShiftType { String name; Duration startTime; - Duration startTimeSturday; + Duration startTimeSaturday; + Duration expectedDuration; ShiftType( {required this.name, required this.startTime, - required this.startTimeSturday}); + required this.startTimeSaturday, + required this.expectedDuration}); } class DefaultConfig { @@ -13,14 +15,23 @@ class DefaultConfig { ShiftType( name: 'Dagrit', startTime: Duration(hours: 10), - startTimeSturday: Duration(hours: 10)), + startTimeSaturday: Duration(hours: 10), + expectedDuration: Duration(hours: 8)), ShiftType( name: 'Avondrit', startTime: Duration(hours: 17), - startTimeSturday: Duration(hours: 15, minutes: 30)), + startTimeSaturday: Duration(hours: 15, minutes: 30), + expectedDuration: Duration(hours: 5)), ShiftType( name: 'Terugscan', startTime: Duration(hours: 14, minutes: 30), - startTimeSturday: Duration(hours: 13, minutes: 30)), + startTimeSaturday: Duration(hours: 13, minutes: 30), + expectedDuration: Duration(hours: 8)), ]; + + static ShiftType getShiftByName(String name) { + var result = shiftTypes.where((element) => element.name == name); + if (result.isEmpty) throw Exception('Type werkvorm bestaat niet [$name].'); + return result.first; + } } diff --git a/lib/pages/agenda_page.dart b/lib/pages/agenda_page.dart index b461791..174f71d 100644 --- a/lib/pages/agenda_page.dart +++ b/lib/pages/agenda_page.dart @@ -1,6 +1,7 @@ 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/config/defaults.dart'; import 'package:training_planner/events/RefreshWeekEvent.dart'; import 'package:training_planner/main.dart'; import 'package:training_planner/pages/home_page.dart'; @@ -59,29 +60,14 @@ class _AgendaPageState extends State { break; } - ShiftType type = ShiftType.Dagrit; - if (shiftsSelected[1]) type = ShiftType.Avondrit; - if (shiftsSelected[2]) type = ShiftType.Terugscannen; - - switch (type) { - case ShiftType.Dagrit: - dayOfWeek = dayOfWeek.add(Duration(hours: 10)); - break; - case ShiftType.Avondrit: - dayOfWeek = dayOfWeek.add(Duration( - hours: dayOfWeek.weekday == 6 ? 15 : 17, - minutes: dayOfWeek.weekday == 6 ? 30 : 0)); - break; - case ShiftType.Terugscannen: - dayOfWeek = dayOfWeek.add( - Duration(hours: dayOfWeek.weekday == 6 ? 13 : 14, minutes: 30)); - break; - } + ShiftType type = DefaultConfig.shiftTypes[currentSelectedShiftIndex]; + dayOfWeek = dayOfWeek.add( + dayOfWeek.weekday != 6 ? type.startTime : type.startTimeSaturday); Settings settings = await settingsService.readSettingsFromFile(); bool success = await shiftProvider.addShift( - Shift(start: dayOfWeek, type: type, payRate: settings.salary)); + Shift(start: dayOfWeek, type: type.name, payRate: settings.salary)); if (!success) { messageService.showMessage( context, @@ -93,11 +79,14 @@ class _AgendaPageState extends State { } List dayIsSelected = [false, false, false, false, false, false, false]; - List shiftsSelected = [false, true, false]; + List shiftsSelected = + DefaultConfig.shiftTypes.map((e) => false).toList(); + int currentSelectedShiftIndex = 0; Future showAddShiftDialog() async { dayIsSelected = [false, false, false, false, false, false, false]; - shiftsSelected = [false, true, false]; + shiftsSelected = DefaultConfig.shiftTypes.map((e) => false).toList(); + currentSelectedShiftIndex = 1; // set up the buttons Widget cancelButton = FlatButton( @@ -131,15 +120,10 @@ class _AgendaPageState extends State { !splitDays ? (ToggleButtons( direction: Axis.vertical, - children: [ - Text('Ma'), - Text('Di'), - Text('Wo'), - Text('Do'), - Text('Vr'), - Text('Za'), - Text('Zo'), - ], + children: [1, 2, 3, 4, 5, 6, 7] + .map((weekdayIndex) => + Text(DateHelper.getWeekdayName(weekdayIndex))) + .toList(), onPressed: (int index) { setState(() { dayIsSelected[index] = !dayIsSelected[index]; @@ -149,12 +133,10 @@ class _AgendaPageState extends State { )) : (ToggleButtons( direction: Axis.vertical, - children: [ - Text('Ma'), - Text('Di'), - Text('Wo'), - Text('Do'), - ], + children: [1, 2, 3, 4] + .map((weekdayIndex) => + Text(DateHelper.getWeekdayName(weekdayIndex))) + .toList(), onPressed: (int index) { setState(() { dayIsSelected[index] = !dayIsSelected[index]; @@ -165,11 +147,10 @@ class _AgendaPageState extends State { splitDays ? (ToggleButtons( direction: Axis.vertical, - children: [ - Text('Vr'), - Text('Za'), - Text('Zo'), - ], + children: [5, 6, 7] + .map((weekdayIndex) => + Text(DateHelper.getWeekdayName(weekdayIndex))) + .toList(), onPressed: (int index) { setState(() { dayIsSelected[index + 4] = !dayIsSelected[index + 4]; @@ -181,19 +162,17 @@ class _AgendaPageState extends State { ToggleButtons( direction: Axis.vertical, children: [ - Padding( - padding: const EdgeInsets.all(0), child: Text('Dagrit')), - Padding( - padding: const EdgeInsets.all(0), - child: Text('Avondrit')), - Padding( - padding: const EdgeInsets.all(0), - child: Text('Terugscan')), + for (int i = 0; i < DefaultConfig.shiftTypes.length; i++) + Padding( + padding: const EdgeInsets.all(0), + child: Text(DefaultConfig.shiftTypes[i].name)), ], onPressed: (int index) { setState(() { - shiftsSelected = [false, false, false]; + shiftsSelected = + DefaultConfig.shiftTypes.map((e) => false).toList(); shiftsSelected[index] = true; + currentSelectedShiftIndex = index; }); }, isSelected: shiftsSelected, diff --git a/lib/pages/developer_page.dart b/lib/pages/developer_page.dart new file mode 100644 index 0000000..05a029a --- /dev/null +++ b/lib/pages/developer_page.dart @@ -0,0 +1,59 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:training_planner/events/RefreshWeekEvent.dart'; +import 'package:training_planner/main.dart'; +import 'package:training_planner/services/local_shift_provider_service.dart'; +import 'package:training_planner/services/settings_service.dart'; +import 'package:training_planner/style/style.dart'; + +class DeveloperPage extends StatefulWidget { + @override + _DeveloperPageState createState() => _DeveloperPageState(); + + const DeveloperPage({Key? key}) : super(key: key); +} + +class _DeveloperPageState extends State { + @override + initState() { + super.initState(); + } + + void clearLocalFiles() async { + if (shiftProvider is LocalShiftProviderService) { + LocalShiftProviderService lsp = + shiftProvider as LocalShiftProviderService; + var fileList = await lsp.getStoredFileList(); + + for (var item in fileList) { + await File(item).delete(); + } + + eventBus.fire(RefreshWeekEvent()); + } + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text('Instellingen'), + backgroundColor: Style.background, + foregroundColor: Style.titleColor, + ), + body: Center( + child: Padding( + padding: const EdgeInsets.all(50), + child: Column( + children: [ + TextButton( + onPressed: () async => clearLocalFiles(), + child: Text('Bestanden verwijderen')), + ], + ), + ), + ), + ); + } +} diff --git a/lib/pages/home_page.dart b/lib/pages/home_page.dart index 87d3ce7..ee2a5cd 100644 --- a/lib/pages/home_page.dart +++ b/lib/pages/home_page.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:training_planner/pages/agenda_page.dart'; +import 'package:training_planner/pages/developer_page.dart'; import 'package:training_planner/pages/logbook_page.dart'; import 'package:training_planner/pages/settings_page.dart'; import 'package:training_planner/shift.dart'; @@ -73,9 +74,12 @@ class _HomePageState extends State { }, ), ListTile( - title: const Text('Profiel'), + title: const Text('Ontwikkelaar'), onTap: () { - // ... + Navigator.push( + context, + MaterialPageRoute(builder: (context) => DeveloperPage()), + ); }, ), ], diff --git a/lib/pages/logbook_page.dart b/lib/pages/logbook_page.dart index fb21c9a..be49ac8 100644 --- a/lib/pages/logbook_page.dart +++ b/lib/pages/logbook_page.dart @@ -124,6 +124,12 @@ class _LogbookPageState extends State { Widget getDataList() { var monthDataWidgets = createMonthDataWidgets(); + if (monthDataWidgets.isEmpty) { + return Center( + child: Text('Geen data beschikbaar'), + ); + } + return SafeArea( child: CustomScrollView( physics: null, diff --git a/lib/services/local_shift_provider_service.dart b/lib/services/local_shift_provider_service.dart index 4894820..a7dfa5b 100644 --- a/lib/services/local_shift_provider_service.dart +++ b/lib/services/local_shift_provider_service.dart @@ -20,6 +20,21 @@ class LocalShiftProviderService extends IProgramProviderService { return directory.path; } + Future> getStoredFileList() async { + List result = []; + Directory dir = await _localDir; + var list = dir.listSync(); + for (var item in list) { + if (!item.path.endsWith('.json') || !item.path.contains('shifts')) { + continue; + } + + result.add(item.path); + } + + return result; + } + Future _localFile(String postfix) async { final path = await _localPath; String fullPath = '$path/shifts_' + postfix + '.json'; @@ -100,16 +115,10 @@ class LocalShiftProviderService extends IProgramProviderService { @override Future> getPastShifts() async { - await Future.delayed(Duration(seconds: 1)); List shifts = []; - Directory dir = await _localDir; - var list = dir.listSync(); + var list = await getStoredFileList(); for (var item in list) { - if (!item.path.endsWith('.json') || !item.path.contains('shifts')) { - continue; - } - - final file = File(item.path); + final file = File(item); final contents = await file.readAsString(); final Iterable iterable = await jsonDecode(contents); List data = @@ -124,7 +133,6 @@ class LocalShiftProviderService extends IProgramProviderService { @override Future> getShiftsForWeek(DateTime firstDayOfWeek) async { - await Future.delayed(Duration(seconds: 1)); var items = await readShiftsFromFile( DateUtilities.DateUtils.firstDayOfWeek(firstDayOfWeek)); List result = []; diff --git a/lib/services/mock_shift_provider_service.dart b/lib/services/mock_shift_provider_service.dart index e6c88e0..605ba19 100644 --- a/lib/services/mock_shift_provider_service.dart +++ b/lib/services/mock_shift_provider_service.dart @@ -13,41 +13,37 @@ class MockShiftProviderService extends IProgramProviderService { Shift( end: DateTime(2022, 8, 8, 20, 30), start: DateTime(2022, 8, 8, 16, 30), - type: ShiftType.Avondrit, + type: 'Avondrit', payRate: 13.75), ); shifts.add(Shift( end: DateTime(2022, 8, 6, 20, 30), start: DateTime(2022, 8, 6, 16, 30), - type: ShiftType.Avondrit, + type: 'Avondrit', payRate: 13.75)); shifts.add(Shift( end: DateTime(2022, 8, 5, 20, 30), start: DateTime(2022, 8, 5, 16, 30), - type: ShiftType.Avondrit, + type: 'Avondrit', payRate: 13.75)); shifts.add(Shift( - start: DateTime(2022, 8, 4, 16, 30), - type: ShiftType.Avondrit, - payRate: 13.75)); + start: DateTime(2022, 8, 4, 16, 30), type: 'Avondrit', payRate: 13.75)); shifts.add(Shift( end: DateTime(2022, 8, 1, 17, 30), start: DateTime(2022, 8, 1, 9, 30), - type: ShiftType.Dagrit, + type: 'Dagrit', payRate: 13.75)); shifts.add(Shift( - start: DateTime(2022, 8, 22, 9, 30), - type: ShiftType.Dagrit, - payRate: 13.75)); + start: DateTime(2022, 8, 22, 9, 30), type: 'Dagrit', payRate: 13.75)); shifts.add(Shift( start: DateTime.now().subtract(Duration(hours: 2)), - type: ShiftType.Dagrit, + type: 'Dagrit', payRate: 13.75)); savedShifts = shifts; diff --git a/lib/services/settings_service.dart b/lib/services/settings_service.dart index 027ecc2..350d7bd 100644 --- a/lib/services/settings_service.dart +++ b/lib/services/settings_service.dart @@ -44,7 +44,7 @@ class SettingsService { if (!exists) { print('created settings.json'); await file.create(); - await writeSettingsToFile(DefaultSettings()); + await file.writeAsString(jsonEncode(DefaultSettings())); } return File('$path/settings.json'); diff --git a/lib/shift.dart b/lib/shift.dart index fb79a04..72679ce 100644 --- a/lib/shift.dart +++ b/lib/shift.dart @@ -1,12 +1,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:in_date_utils/in_date_utils.dart' as DateUtilities; - -enum ShiftType { - Dagrit, - Avondrit, - Terugscannen, -} +import 'package:training_planner/config/defaults.dart'; enum ShiftStatus { OldOpen, @@ -19,7 +14,7 @@ enum ShiftStatus { class Shift { DateTime start; DateTime? end; - ShiftType type; + String type; double payRate; bool isActive = false; @@ -32,7 +27,7 @@ class Shift { Shift.fromJson(Map json) : start = DateTime.parse(json['start']), end = json['end'] == null ? null : DateTime.tryParse(json['end']), - type = ShiftType.values.firstWhere((e) => e.toString() == json['type']), + type = json['type'], isActive = json['isActive'] == 'true', payRate = double.parse(json['payRate']); @@ -40,7 +35,7 @@ class Shift { return { 'start': start.toIso8601String(), 'end': end?.toIso8601String(), - 'type': type.toString(), + 'type': type, 'isActive': isActive.toString(), 'payRate': payRate.toStringAsFixed(2), }; @@ -87,14 +82,7 @@ class Shift { } DateTime expectedEndTime() { - switch (type) { - case ShiftType.Avondrit: - return start.add(Duration(hours: 5)); - case ShiftType.Dagrit: - return start.add(Duration(hours: 8)); - case ShiftType.Terugscannen: - return start.add(Duration(hours: 8)); - } + return start.add(DefaultConfig.getShiftByName(type).expectedDuration); } Duration getElapsedSessionTime() { diff --git a/lib/widgets/agenda_week_item.dart b/lib/widgets/agenda_week_item.dart index 10ccba7..6a9fe19 100644 --- a/lib/widgets/agenda_week_item.dart +++ b/lib/widgets/agenda_week_item.dart @@ -74,18 +74,7 @@ class _ExerciseEntryState extends State { }); setState(() { - switch (widget.shift.type) { - case ShiftType.Avondrit: - shiftTypeName = 'Avondrit'; - break; - case ShiftType.Dagrit: - shiftTypeName = 'Dagrit'; - break; - case ShiftType.Terugscannen: - shiftTypeName = 'Terugscannen'; - break; - } - + shiftTypeName = widget.shift.type; setStartAndEndTime(); }); } -- cgit v1.2.3-70-g09d2