Commit 7ca44a2

derdilla <derdilla06@gmail.com>
2023-08-02 15:41:49
use export columns in exporter
1 parent 79767a2
lib/model/export_import.dart
@@ -4,6 +4,7 @@ import 'dart:io';
 import 'dart:typed_data';
 
 import 'package:blood_pressure_app/model/blood_pressure_analyzer.dart';
+import 'package:blood_pressure_app/model/export_options.dart';
 import 'package:blood_pressure_app/model/settings_store.dart';
 import 'package:csv/csv.dart';
 import 'package:file_picker/file_picker.dart';
@@ -32,8 +33,9 @@ class ExportFileCreator {
   final Settings settings;
   final AppLocalizations localizations;
   final ThemeData theme;
+  final ExportConfigurationModel exportColumnsConfig;
 
-  ExportFileCreator(this.settings, this.localizations, this.theme);
+  ExportFileCreator(this.settings, this.localizations, this.theme, this.exportColumnsConfig);
 
   Future<Uint8List> createFile(List<BloodPressureRecord> records) async {
     switch (settings.exportFormat) {
@@ -62,17 +64,17 @@ class ExportFileCreator {
   }
 
   Uint8List createCSVCFile(List<BloodPressureRecord> records) {
-    List<String> exportItems;
+    List<ExportColumn> exportItems;
     if (settings.exportCustomEntries) {
-      exportItems = settings.exportItems;
+      exportItems = exportColumnsConfig.getActiveExportColumns();
     } else {
-      exportItems = ['timestampUnixMs', 'systolic', 'diastolic', 'pulse', 'notes'];
+      exportItems = exportColumnsConfig.getDefaultFormates();
     }
 
     var csvHead = '';
     if (settings.exportCsvHeadline) {
       for (var i = 0; i<exportItems.length; i++) {
-        csvHead += exportItems[i];
+        csvHead += exportItems[i].internalName;
         if (i<(exportItems.length - 1)) {
           csvHead += settings.csvFieldDelimiter;
         }
@@ -84,26 +86,7 @@ class ExportFileCreator {
     for (var record in records) {
       List<dynamic> row = [];
       for (var attribute in exportItems) {
-        switch (attribute) {
-          case 'timestampUnixMs':
-            row.add(record.creationTime.millisecondsSinceEpoch);
-            break;
-          case 'isoUTCTime':
-            row.add(record.creationTime.toIso8601String());
-            break;
-          case 'systolic':
-            row.add(record.systolic ?? '');
-            break;
-          case 'diastolic':
-            row.add(record.diastolic ?? '');
-            break;
-          case 'pulse':
-            row.add(record.pulse ?? '');
-            break;
-          case 'notes':
-            row.add(record.notes ?? '');
-            break;
-        }
+        row.add(attribute.formatRecord(record));
       }
       items.add(row);
     }
@@ -286,12 +269,13 @@ class Exporter {
   final ScaffoldMessengerState messenger;
   final AppLocalizations localizations;
   final ThemeData theme;
+  final ExportConfigurationModel exportColumnsConfig;
 
-  Exporter(this.settings, this.model, this.messenger, this.localizations, this.theme);
+  Exporter(this.settings, this.model, this.messenger, this.localizations, this.theme, this.exportColumnsConfig);
 
   Future<void> export() async {
     final entries = await model.getInTimeRange(settings.displayDataStart, settings.displayDataEnd);
-    var fileContents = await ExportFileCreator(settings, localizations, theme).createFile(entries);
+    var fileContents = await ExportFileCreator(settings, localizations, theme, exportColumnsConfig).createFile(entries);
     String filename = 'blood_press_${DateTime.now().toIso8601String()}';
     String ext;
     switch(settings.exportFormat) {
@@ -352,7 +336,7 @@ class Exporter {
     var path = result.files.single.path;
     assert(path != null); // null state directly linked to binary content
 
-    var fileContents = await ExportFileCreator(settings, localizations, theme).parseFile(path! ,binaryContent);
+    var fileContents = await ExportFileCreator(settings, localizations, theme, exportColumnsConfig).parseFile(path! ,binaryContent);
     if (fileContents == null) {
       messenger.showSnackBar(SnackBar(content: Text(localizations.errNotImportable)));
       return;
lib/model/export_options.dart
@@ -38,7 +38,7 @@ class ExportConfigurationModel {
       _availableFormats.add(ExportColumn(internalName: e['internalColumnName'].toString(),
           columnTitle: e['columnTitle'].toString(), formatPattern: e['formatPattern'].toString()));
     }
-    _availableFormats.addAll(_getDefaultFormates());
+    _availableFormats.addAll(getDefaultFormates());
   }
   static Future<ExportConfigurationModel> get(Settings settings, AppLocalizations localizations, {String? dbPath, bool isFullPath = false}) async {
     if (_instance == null) {
@@ -48,7 +48,15 @@ class ExportConfigurationModel {
     return _instance!;
   }
 
-  List<ExportColumn> _getDefaultFormates() => [
+  List<ExportColumn> getActiveExportColumns() {
+    List<ExportColumn> activeFields = [];
+    for (final internalName in settings.exportItems) {
+      activeFields.add(availableFormats.singleWhere((e) => e.internalName == internalName));
+    }
+    return activeFields;
+  }
+  
+  List<ExportColumn> getDefaultFormates() => [
     ExportColumn(internalName: 'timestampUnixMs', columnTitle: localizations.unixTimestamp, formatPattern: r'$TIMESTAMP', editable: false),
     ExportColumn(internalName: 'formattedTimestamp', columnTitle: localizations.time, formatPattern: '\$FORMAT{\$TIMESTAMP,${settings.dateFormatString}}', editable: false),
     ExportColumn(internalName: 'systolic', columnTitle: localizations.sysLong, formatPattern: r'$SYS', editable: false),
lib/screens/subsettings/export_column_data.dart
@@ -100,7 +100,7 @@ class _EditExportColumnPageState extends State<EditExportColumnPage> {
                               }
                             },
                           ),
-                          TextFormField( // TODO: documentation
+                          TextFormField(
                             key: const Key('formatPattern'),
                             initialValue: _formatPattern,
                             decoration: InputDecoration(
lib/screens/subsettings/export_import_screen.dart
@@ -118,9 +118,7 @@ class _ExportFieldCustomisationSettingState extends State<ExportFieldCustomisati
   @override
   Widget build(BuildContext context) {
     _future ??= ExportConfigurationModel.get(Provider.of<Settings>(context, listen: false), AppLocalizations.of(context)!);
-    
-    
-    
+
     return ConsistentFutureBuilder(
       future: _future!,
       onData: (context, result) {
@@ -182,7 +180,7 @@ class ExportImportButtons extends StatelessWidget {
                 child: MaterialButton(
                   height: 60,
                   child:  Text(AppLocalizations.of(context)!.export),
-                  onPressed: () => Exporter(settings, model, messenger, localizations, theme).export(),
+                  onPressed: () async => Exporter(settings, model, messenger, localizations, theme, await ExportConfigurationModel.get(settings, localizations)).export(),
                 )
             ),
             const VerticalDivider(),
@@ -191,7 +189,7 @@ class ExportImportButtons extends StatelessWidget {
                 child: MaterialButton(
                   height: 60,
                   child: Text(AppLocalizations.of(context)!.import),
-                  onPressed: () => Exporter(settings, model, messenger, localizations, theme).import(),
+                  onPressed: () async => Exporter(settings, model, messenger, localizations, theme, await ExportConfigurationModel.get(settings, localizations)).import(),
                 )
             ),
           ],
lib/screens/add_measurement.dart
@@ -1,6 +1,7 @@
 import 'package:blood_pressure_app/components/date_time_picker.dart';
 import 'package:blood_pressure_app/model/blood_pressure.dart';
 import 'package:blood_pressure_app/model/export_import.dart';
+import 'package:blood_pressure_app/model/export_options.dart';
 import 'package:blood_pressure_app/model/settings_store.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/services.dart';
@@ -191,7 +192,8 @@ class _AddMeasurementPageState extends State<AddMeasurementPage> {
                                 await model.add(BloodPressureRecord(_time, _systolic, _diastolic, _pulse, _note));
                                 if (settings.exportAfterEveryEntry && context.mounted) {
                                   final exporter = Exporter(settings, model, ScaffoldMessenger.of(context),
-                                      AppLocalizations.of(context)!, Theme.of(context));
+                                      AppLocalizations.of(context)!, Theme.of(context),
+                                      await ExportConfigurationModel.get(Provider.of<Settings>(context, listen: false), AppLocalizations.of(context)!));
                                   exporter.export();
                                 }
                                 navigator.pop();