Commit 378f24f

derdilla <82763757+NobodyForNothing@users.noreply.github.com>
2023-10-03 23:49:09
add custom columns to csv export settings
Signed-off-by: derdilla <82763757+NobodyForNothing@users.noreply.github.com>
1 parent afd2e92
lib/model/storage/convert_util.dart
@@ -96,4 +96,17 @@ class ConvertUtil {
         end: DateTime.fromMillisecondsSinceEpoch(endTimestamp)
     );
   }
+
+  static List<T>? parseList<T>(dynamic value) {
+    if (value is List<T>) return value;
+    if (value is List<dynamic>) {
+      List<T> validValues = [];
+      for (final v in value) {
+        if (v is T) validValues.add(v);
+      }
+      if (value.length == validValues.length) return validValues;
+    }
+    if (value is List && value.isEmpty) return [];
+    return null;
+  }
 }
\ No newline at end of file
lib/model/storage/export_csv_settings_store.dart
@@ -1,5 +1,6 @@
 import 'dart:convert';
 
+import 'package:blood_pressure_app/model/export_options.dart';
 import 'package:blood_pressure_app/model/storage/convert_util.dart';
 import 'package:flutter/material.dart';
 
@@ -7,17 +8,23 @@ class CsvExportSettings extends ChangeNotifier {
   CsvExportSettings({
     String? fieldDelimiter,
     String? textDelimiter,
-    bool? exportHeadline
+    bool? exportHeadline,
+    bool? exportCustomFields,
+    List<String>? customFields,
   }) {
     if (fieldDelimiter != null) _fieldDelimiter = fieldDelimiter;
     if (textDelimiter != null) _textDelimiter = textDelimiter;
     if (exportHeadline != null) _exportHeadline = exportHeadline;
+    if (exportCustomFields != null) _exportCustomFields = exportCustomFields;
+    if (customFields != null) _customFields = customFields;
   }
 
   factory CsvExportSettings.fromMap(Map<String, dynamic> map) => CsvExportSettings(
       fieldDelimiter: ConvertUtil.parseString(map['fieldDelimiter']),
       textDelimiter: ConvertUtil.parseString(map['textDelimiter']),
-      exportHeadline: ConvertUtil.parseBool(map['exportHeadline'])
+      exportHeadline: ConvertUtil.parseBool(map['exportHeadline']),
+      exportCustomFields: ConvertUtil.parseBool(map['exportCustomFields']),
+      customFields: ConvertUtil.parseList<String>(map['customFields']),
   );
 
   factory CsvExportSettings.fromJson(String json) {
@@ -31,7 +38,9 @@ class CsvExportSettings extends ChangeNotifier {
   Map<String, dynamic> toMap() => <String, dynamic>{
     'fieldDelimiter': fieldDelimiter,
     'textDelimiter': textDelimiter,
-    'exportHeadline': exportHeadline
+    'exportHeadline': exportHeadline,
+    'exportCustomFields': exportCustomFields,
+    'customFields': customFields,
   };
 
   String toJson() => jsonEncode(toMap());
@@ -57,5 +66,19 @@ class CsvExportSettings extends ChangeNotifier {
     notifyListeners();
   }
 
+  bool _exportCustomFields = false;
+  bool get exportCustomFields => _exportCustomFields;
+  set exportCustomFields(bool value) {
+    _exportCustomFields = value;
+    notifyListeners();
+  }
+
+  List<String> _customFields = ExportFields.defaultCsv;
+  List<String> get customFields => _customFields;
+  set customFields(List<String> value) {
+    _customFields = value;
+    notifyListeners();
+  }
+
   // Procedure for adding more entries described in the settings_store.dart doc comment
 }
\ No newline at end of file
test/model/convert_util_test.dart
@@ -100,5 +100,18 @@ void main() {
       expect(ConvertUtil.parseLocale('null'), null);
       expect(ConvertUtil.parseLocale('NuLl'), null);
     });
+
+    test('parseList should convert valid values correctly', () {
+      expect(ConvertUtil.parseList<int>([1234,567,89,0]), [1234,567,89,0]);
+      expect(ConvertUtil.parseList<String>(['1234','567','89','0', 'test']), ['1234','567','89','0', 'test']);
+      expect(ConvertUtil.parseList<String>(<dynamic>['1234','567','89','0', 'test']), ['1234','567','89','0', 'test']);
+      expect(ConvertUtil.parseList<String>([]), []);
+    });
+    test('parseList should parse invalid values as null', () {
+      expect(ConvertUtil.parseList<int>(['1234','567','89','0', 'test']), null);
+      expect(ConvertUtil.parseList<String>({'test': 5}), null);
+      expect(ConvertUtil.parseList<String>([1234,567,89,0]), null);
+      expect(ConvertUtil.parseList<String>('tests'), null);
+    });
   });
 }
\ No newline at end of file
test/model/json_serialization_test.dart
@@ -175,12 +175,16 @@ void main() {
         fieldDelimiter: 'asdfghjklö',
         textDelimiter: 'asdfghjklö2',
         exportHeadline: false,
+        exportCustomFields: true,
+        customFields: ['test1', 'test2'],
       );
       final fromJson = CsvExportSettings.fromJson(initial.toJson());
 
       expect(initial.fieldDelimiter, fromJson.fieldDelimiter);
       expect(initial.textDelimiter, fromJson.textDelimiter);
       expect(initial.exportHeadline, fromJson.exportHeadline);
+      expect(initial.exportCustomFields, fromJson.exportCustomFields);
+      expect(initial.customFields, fromJson.customFields);
 
       expect(initial.toJson(), fromJson.toJson());
     });
@@ -201,6 +205,8 @@ void main() {
       expect(v1.fieldDelimiter, CsvExportSettings().fieldDelimiter);
       expect(v2.exportHeadline, CsvExportSettings().exportHeadline);
       expect(v3.textDelimiter, CsvExportSettings().textDelimiter);
+      expect(v3.exportCustomFields, CsvExportSettings().exportCustomFields);
+      expect(v3.customFields, CsvExportSettings().customFields);
     });
   });