diff options
| -rw-r--r-- | README | 5 | ||||
| -rw-r--r-- | lib/config/defaults.dart | 26 | ||||
| -rw-r--r-- | lib/main.dart | 2 | ||||
| -rw-r--r-- | lib/pages/home_page.dart | 45 | ||||
| -rw-r--r-- | lib/pages/settings_page.dart | 58 | ||||
| -rw-r--r-- | lib/services/local_shift_provider_service.dart | 2 | ||||
| -rw-r--r-- | lib/services/settings_service.dart | 80 | ||||
| -rw-r--r-- | lib/widgets/agenda_week_title.dart | 2 |
8 files changed, 216 insertions, 4 deletions
@@ -1,8 +1,10 @@ # Aanpassingen - exceptions afhandelen binnen localShiftProvider en doorgeven aan ui +- uursalaris opslaan per shift zodat aanpassingen oudere shifts niet aanpassen # Nog te doen -- gebruiker standaard uurloon laten aanpassen +- laad animaties voor het lezen van locale bestanden (testen met delays) +- uurloon van gebruiker gebruiken in berekeningen - gebruiker standaard begintijd laten aanpassen per shift - versie toevoegen aan locale bestanden @@ -17,3 +19,4 @@ - werkt on alle soorten schermen - Laat salaris zien per shift - duidelijke berichtgeving en foutmeldingen +- Instellingen pagina voor persoonlijke instellingen en salaris diff --git a/lib/config/defaults.dart b/lib/config/defaults.dart new file mode 100644 index 0000000..2553bbe --- /dev/null +++ b/lib/config/defaults.dart @@ -0,0 +1,26 @@ +class ShiftType { + String name; + Duration startTime; + Duration startTimeSturday; + ShiftType( + {required this.name, + required this.startTime, + required this.startTimeSturday}); +} + +class DefaultConfig { + static List<ShiftType> shiftTypes = [ + ShiftType( + name: 'Dagrit', + startTime: Duration(hours: 10), + startTimeSturday: Duration(hours: 10)), + ShiftType( + name: 'Avondrit', + startTime: Duration(hours: 17), + startTimeSturday: Duration(hours: 15, minutes: 30)), + ShiftType( + name: 'Terugscan', + startTime: Duration(hours: 14, minutes: 30), + startTimeSturday: Duration(hours: 13, minutes: 30)), + ]; +} diff --git a/lib/main.dart b/lib/main.dart index 6e15b59..476a36a 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -4,6 +4,7 @@ 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 'package:training_planner/services/settings_service.dart'; import 'pages/home_page.dart'; import 'package:local_auth/local_auth.dart'; @@ -14,6 +15,7 @@ void main() { final IProgramProviderService shiftProvider = LocalShiftProviderService(); final LocalAuthentication auth = LocalAuthentication(); final MessagingService messageService = MessagingService(); +final SettingsService settingsService = SettingsService(); EventBus eventBus = EventBus(); diff --git a/lib/pages/home_page.dart b/lib/pages/home_page.dart index 3b57a0f..87d3ce7 100644 --- a/lib/pages/home_page.dart +++ b/lib/pages/home_page.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:training_planner/pages/agenda_page.dart'; import 'package:training_planner/pages/logbook_page.dart'; +import 'package:training_planner/pages/settings_page.dart'; import 'package:training_planner/shift.dart'; import 'package:training_planner/main.dart'; import 'package:training_planner/style/style.dart'; @@ -39,9 +40,53 @@ class _HomePageState extends State<HomePage> { }); } + Drawer createDrawer() { + return Drawer( + // Add a ListView to the drawer. This ensures the user can scroll + // through the options in the drawer if there isn't enough vertical + // space to fit everything. + child: ListView( + // Important: Remove any padding from the ListView. + padding: EdgeInsets.zero, + children: [ + SizedBox( + height: MediaQuery.of(context).viewPadding.top + 60, + child: const DrawerHeader( + decoration: BoxDecoration( + color: Style.background, + ), + child: Text('Mijn werkschema'), + ), + ), + ListTile( + title: const Text('Instellingen'), + onTap: () { + settingsService.readSettingsFromFile().then((value) => { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => SettingsPage( + settings: value, + )), + ) + }); + }, + ), + ListTile( + title: const Text('Profiel'), + onTap: () { + // ... + }, + ), + ], + ), + ); + } + @override Widget build(BuildContext context) { return Scaffold( + drawer: createDrawer(), appBar: AppBar( title: const Text('Werkschema'), backgroundColor: Style.background, diff --git a/lib/pages/settings_page.dart b/lib/pages/settings_page.dart new file mode 100644 index 0000000..08dbaf4 --- /dev/null +++ b/lib/pages/settings_page.dart @@ -0,0 +1,58 @@ +import 'package:flutter/material.dart'; +import 'package:training_planner/main.dart'; +import 'package:training_planner/services/settings_service.dart'; +import 'package:training_planner/style/style.dart'; + +class SettingsPage extends StatefulWidget { + final Settings settings; + + @override + _SettingsPageState createState() => _SettingsPageState(); + + const SettingsPage({Key? key, required this.settings}) : super(key: key); +} + +class _SettingsPageState extends State<SettingsPage> { + @override + initState() { + super.initState(); + } + + Future<void> saveSettings() async { + settingsService.writeSettingsToFile(widget.settings); + Navigator.pop(context); + } + + @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: [ + TextFormField( + keyboardType: TextInputType.number, + initialValue: widget.settings.salary.toStringAsFixed(2), + onChanged: (value) => + {widget.settings.salary = double.parse(value)}, + decoration: InputDecoration( + labelText: 'Huidige uurloon', + ), + ), + Padding(padding: const EdgeInsets.all(20)), + TextButton( + onPressed: () async => await saveSettings(), + child: Text('Opslaan')), + ], + ), + ), + ), + ); + } +} diff --git a/lib/services/local_shift_provider_service.dart b/lib/services/local_shift_provider_service.dart index 2d00a1e..6839dff 100644 --- a/lib/services/local_shift_provider_service.dart +++ b/lib/services/local_shift_provider_service.dart @@ -34,7 +34,6 @@ class LocalShiftProviderService extends IProgramProviderService { final file = await _localFile; String content = jsonEncode(shifts); await file.writeAsString(content); - print('Writing to file: ' + content); } catch (e, stacktrace) { print(stacktrace); print(e); @@ -48,7 +47,6 @@ class LocalShiftProviderService extends IProgramProviderService { final Iterable iterable = await jsonDecode(contents); List<Shift> data = List<Shift>.from(iterable.map((model) => Shift.fromJson(model))); - print('Read from file: ' + contents); return data; } catch (e, stacktrace) { diff --git a/lib/services/settings_service.dart b/lib/services/settings_service.dart new file mode 100644 index 0000000..027ecc2 --- /dev/null +++ b/lib/services/settings_service.dart @@ -0,0 +1,80 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:path_provider/path_provider.dart'; + +class Settings { + double salary; + + Settings({required this.salary}); + + Settings.fromJson(Map<String, dynamic> json) + : salary = double.parse(json['salary']); + + Map<String, dynamic> toJson() { + return { + 'salary': salary.toStringAsFixed(2), + }; + } +} + +class DefaultSettings extends Settings { + DefaultSettings() : super(salary: 13.75); + + DefaultSettings.fromJson(Map<String, dynamic> json) : super.fromJson(json); + + Map<String, dynamic> toJson() { + return { + 'salary': salary.toStringAsFixed(2), + }; + } +} + +class SettingsService { + Future<String> get _localPath async { + final directory = await getApplicationDocumentsDirectory(); + return directory.path; + } + + Future<File> get _localFile async { + final path = await _localPath; + File file = File('$path/settings.json'); + + bool exists = await file.exists(); + if (!exists) { + print('created settings.json'); + await file.create(); + await writeSettingsToFile(DefaultSettings()); + } + + return File('$path/settings.json'); + } + + Future<void> writeSettingsToFile(Settings settings) async { + try { + final file = await _localFile; + String content = jsonEncode(settings); + print('writing to file: ' + content); + await file.writeAsString(content); + } catch (e, stacktrace) { + print(stacktrace); + print(e); + } + } + + Future<Settings> readSettingsFromFile() async { + try { + final file = await _localFile; + final contents = await file.readAsString(); + print('read from file: ' + contents); + var raw = await jsonDecode(contents); + var settings = Settings.fromJson(raw); + return settings; + } catch (e, stacktrace) { + print(stacktrace); + print(e); + writeSettingsToFile(DefaultSettings()); + return DefaultSettings(); + } + } +} diff --git a/lib/widgets/agenda_week_title.dart b/lib/widgets/agenda_week_title.dart index 582b6b8..2c18986 100644 --- a/lib/widgets/agenda_week_title.dart +++ b/lib/widgets/agenda_week_title.dart @@ -28,7 +28,7 @@ class _AgendaWeekTitleState extends State<AgendaWeekTitle> { children: [ this.widget.isCurrentWeek ? Icon(Icons.today) - : Padding(padding: const EdgeInsets.all(0)), + : Padding(padding: const EdgeInsets.all(12)), Center( child: Text( " Week #" + |
