Commit 531fa00

derdilla <82763757+NobodyForNothing@users.noreply.github.com>
2024-08-06 15:18:34
implement medicine intake export
Signed-off-by: derdilla <82763757+NobodyForNothing@users.noreply.github.com>
1 parent 0e13f6a
Changed files (4)
app/lib/l10n/app_en.arb
@@ -512,5 +512,7 @@
     "deleteAllNotes": "Delete all notes",
     "@deleteAllNotes": {},
     "date": "Date",
-    "@date": {}
+    "@date": {},
+    "intakes": "Medicine intakes",
+    "@intakes": {}
 }
\ No newline at end of file
app/lib/model/export_import/column.dart
@@ -3,6 +3,7 @@ import 'dart:convert';
 import 'package:blood_pressure_app/model/export_import/export_configuration.dart';
 import 'package:blood_pressure_app/model/export_import/import_field_type.dart';
 import 'package:blood_pressure_app/model/export_import/record_formatter.dart';
+import 'package:blood_pressure_app/model/storage/convert_util.dart';
 import 'package:flutter_gen/gen_l10n/app_localizations.dart';
 import 'package:health_data_store/health_data_store.dart';
 
@@ -23,6 +24,7 @@ class NativeColumn extends ExportColumn {
     notes,
     color,
     needlePin,
+    intakes,
   ];
 
   static final NativeColumn timestampUnixMs = NativeColumn._create(
@@ -87,10 +89,36 @@ class NativeColumn extends ExportColumn {
       return null;
     }
   );
+  // TODO: add to default export columns, use during importing
+  static final NativeColumn intakes = NativeColumn._create(
+      'intakes',
+      RowDataFieldType.intakes,
+        (_, __, intakes) => intakes
+            .map((i) => '${i.medicine.designation}(${i.dosis.mg})')
+            .join('|'),
+        (String pattern) {
+          if (pattern.isEmpty) return [];
+          final intakes = [];
+          for (final e in pattern.split('|')) {
+            final es = e.split('(');
+            if (es.length < 2) return null;
+            final [med, dosisStr, ...] = es;
+            final dosis = ConvertUtil.parseDouble(dosisStr.replaceAll(')', ''));
+            if (dosis == null) return null;
+            intakes.add((med, dosis));
+            return intakes;
+          }
+          final value = int.tryParse(pattern);
+          return value;
+        }
+  );
   
   final String _csvTitle;
   final RowDataFieldType _restoreableType;
   final String Function(BloodPressureRecord record, Note note, List<MedicineIntake> intakes) _encode;
+  /// Function to attempt decoding.
+  ///
+  /// Must either return null or the type indicated by [_restoreableType].
   final Object? Function(String pattern) _decode;
 
   @override
app/lib/model/export_import/import_field_type.dart
@@ -19,7 +19,9 @@ enum RowDataFieldType {
   /// Guarantees that a [int] containing a [Color.value] is returned.
   ///
   /// Backwards compatability with [MeasurementNeedlePin] json is maintained.
-  color;
+  color,
+  /// Guarantees [List<(String medicineDesignation, int dosisMg)>] is returned.
+  intakes;
 
   /// Selection of a displayable string from [localizations].
   String localize(AppLocalizations localizations) {
@@ -36,6 +38,8 @@ enum RowDataFieldType {
         return localizations.notes;
       case RowDataFieldType.color:
         return localizations.color;
+      case RowDataFieldType.intakes:
+        return localizations.intakes;
     }
   }
 }
app/lib/model/export_import/record_formatter.dart
@@ -1,6 +1,7 @@
 import 'dart:convert';
 
 import 'package:blood_pressure_app/model/blood_pressure/needle_pin.dart';
+import 'package:blood_pressure_app/model/export_import/column.dart';
 import 'package:blood_pressure_app/model/export_import/import_field_type.dart';
 import 'package:function_tree/function_tree.dart';
 import 'package:health_data_store/health_data_store.dart';
@@ -65,6 +66,8 @@ class ScriptedFormatter implements Formatter {
         } on TypeError {
           return null;
         }
+      case RowDataFieldType.intakes:
+        return NativeColumn.intakes.decode(text);
     }}();
     if (value != null) return (restoreAbleType!, value);
     return null;