Commit 412d101

derdilla <82763757+NobodyForNothing@users.noreply.github.com>
2023-12-02 20:35:55
implement abstraction for active ExportColumns
Signed-off-by: derdilla <82763757+NobodyForNothing@users.noreply.github.com>
1 parent 17b3b71
Changed files (3)
lib/model/export_import/column.dart
@@ -8,7 +8,9 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart';
 
 /// Converters for [BloodPressureRecord] attributes.
 class NativeColumn extends ExportColumn {
-  NativeColumn._create(this._csvTitle, this._restoreableType, this._encode, this._decode);
+  NativeColumn._create(this._csvTitle, this._restoreableType, this._encode, this._decode) {
+    allColumns.add(this);
+  }
   
   final String _csvTitle;
   final RowDataFieldType _restoreableType;
@@ -73,6 +75,8 @@ class NativeColumn extends ExportColumn {
       }
   );
 
+  static final List<NativeColumn> allColumns = [];
+
   @override
   String get csvTitle => _csvTitle;
 
lib/model/export_import/export_configuration.dart
@@ -0,0 +1,99 @@
+import 'dart:convert';
+
+import 'package:blood_pressure_app/model/export_import/column.dart';
+import 'package:blood_pressure_app/model/storage/export_columns_store.dart';
+import 'package:collection/collection.dart';
+import 'package:flutter/widgets.dart';
+import 'package:flutter_gen/gen_l10n/app_localizations.dart';
+
+/// Class for managing columns currently used for ex- and import.
+class ActiveExportColumnConfiguration extends ChangeNotifier {
+  /// Create a manager of the currently relevant [ExportColumn]s.
+  ActiveExportColumnConfiguration({
+    required ExportImportPreset activePreset,
+    List<ExportColumn>? userSelectedColumns
+  }) : _activePreset = activePreset, _userSelectedColumns = userSelectedColumns ?? [];
+
+  factory ActiveExportColumnConfiguration.fromJson(String jsonString, ExportColumnsManager availableColumns) {
+    final json = jsonDecode(jsonString);
+    final columns = (){
+      final columns = json['columns'];
+      if (columns is! List<String>) return <ExportColumn>[];
+      return [
+        for (final c in columns)
+          availableColumns.getColumn(c),
+      ].whereNotNull().toList();
+    }();
+    return ActiveExportColumnConfiguration(
+      activePreset: ExportImportPreset.decode(json['preset']) ?? ExportImportPreset.bloodPressureApp,
+      userSelectedColumns: columns
+    );
+  }
+
+  String toJson() => jsonEncode({
+    'columns': _userSelectedColumns.map((e) => e.internalIdentifier),
+    'preset': _activePreset.encode()
+  });
+
+  /// The last selected columns, different from [getActiveColumns].
+  final List<ExportColumn> _userSelectedColumns;
+
+  ExportImportPreset _activePreset;
+  ExportImportPreset get activePreset => _activePreset;
+  set activePreset(ExportImportPreset value) {
+    _activePreset = value;
+    notifyListeners();
+  }
+  // TODO: put in CsvExportSettings, PdfExportSettings
+
+  /// Columns to respect for export.
+  UnmodifiableListView<ExportColumn> getActiveColumns() => UnmodifiableListView( 
+    switch (_activePreset) {
+      ExportImportPreset.none => _userSelectedColumns,
+      ExportImportPreset.bloodPressureApp => [
+        NativeColumn.timestamp,
+        NativeColumn.systolic,
+        NativeColumn.diastolic,
+        NativeColumn.pulse,
+        NativeColumn.notes,
+        NativeColumn.color,
+      ],
+      // TODO: Handle this case. once myheart options are reimplemented.
+      ExportImportPreset.myHeart => [],
+    });
+}
+
+
+/// Common export configurations that have specific associated columns.
+enum ExportImportPreset {
+  /// Custom export configuration.
+  none,
+
+  /// Default preset, that ensures working exports and restoration.
+  bloodPressureApp,
+  myHeart;
+
+  String localize(AppLocalizations localizations) => switch (this) {
+    ExportImportPreset.none => localizations.custom,
+    ExportImportPreset.bloodPressureApp => localizations.default_,
+    ExportImportPreset.myHeart => '"My Heart" export'
+  };
+
+  int encode() => switch (this) {
+    ExportImportPreset.none => 0,
+    ExportImportPreset.bloodPressureApp => 1,
+    ExportImportPreset.myHeart => 2
+  };
+
+  static ExportImportPreset? decode(dynamic e) {
+    return switch(e) {
+      0 => ExportImportPreset.none,
+      1 => ExportImportPreset.bloodPressureApp,
+      2 => ExportImportPreset.myHeart,
+      _ => (){
+        assert(false);
+        return null;
+      }(),
+    };
+  }
+}
\ No newline at end of file
lib/model/storage/export_columns_store.dart
@@ -4,13 +4,12 @@ import 'dart:convert';
 import 'package:blood_pressure_app/model/export_import/column.dart';
 import 'package:flutter/material.dart';
 
+/// Class for managing columns available to the user.
 class ExportColumnsManager extends ChangeNotifier { // TODO: separate ExportColumnsManager for export and import ?
   /// Create a new class for managing export columns.
   ///
   /// It will be filled with the default columns but won't contain initial user columns.
-  ExportColumnsManager({
-    this.activePreset = ExportImportPreset.bloodPressureApp
-  });
+  ExportColumnsManager();
 
   static const List<String> reservedNamespaces = ['buildIn', 'myHeart'];
 
@@ -42,23 +41,12 @@ class ExportColumnsManager extends ChangeNotifier { // TODO: separate ExportColu
     notifyListeners();
   }
 
-  final List<String> _activeColumnIDs = []; // TODO import/export
-  ExportImportPreset activePreset;
-
-  List<ExportColumn> getActiveColumns() => switch (activePreset) {
-    // TODO: Handle this case.
-    ExportImportPreset.none => [],
-    // TODO: Handle this case.
-    ExportImportPreset.bloodPressureApp => [
-      NativeColumn.timestamp,
-      NativeColumn.systolic,
-      NativeColumn.diastolic,
-      NativeColumn.pulse,
-      NativeColumn.notes,
-      NativeColumn.color,
-    ],
-    // TODO: Handle this case.
-    ExportImportPreset.myHeart => [],
+  /// Get any defined column (user or build in) by identifier.
+  ExportColumn? getColumn(String identifier) {// TODO test
+    return userColumns[identifier] ??
+        NativeColumn.allColumns.where(
+            (c) => c.internalIdentifier == identifier)
+        .firstOrNull; // ?? ...
   }
 
   String toJson() {
@@ -79,15 +67,13 @@ class ExportColumnsManager extends ChangeNotifier { // TODO: separate ExportColu
     }
     return jsonEncode({
       'userColumns': columns,
-      'preset': activePreset.encode(),
     });
   }
 
   factory ExportColumnsManager.fromJson(String jsonString) {
     final json = jsonDecode(jsonString);
-    final ExportImportPreset preset = ExportImportPreset.decode(json['preset']) ?? ExportImportPreset.bloodPressureApp;
     final List<dynamic> jsonUserColumns = json['userColumns'];
-    final manager = ExportColumnsManager(activePreset: preset);
+    final manager = ExportColumnsManager();
     for (final Map<String, dynamic> c in jsonUserColumns) {
       switch (c['t']) {
         case 0:
@@ -102,29 +88,3 @@ class ExportColumnsManager extends ChangeNotifier { // TODO: separate ExportColu
   }
 }
 
-enum ExportImportPreset {
-  /// Custom export configuration.
-  none,
-
-  /// Default preset, that ensures working exports and restoration.
-  bloodPressureApp,
-  myHeart;
-
-  int encode() => switch (this) {
-    ExportImportPreset.none => 0,
-    ExportImportPreset.bloodPressureApp => 1,
-    ExportImportPreset.myHeart => 2
-  };
-
-  static ExportImportPreset? decode(dynamic e) {
-    return switch(e) {
-      0 => ExportImportPreset.none,
-      1 => ExportImportPreset.bloodPressureApp,
-      2 => ExportImportPreset.myHeart,
-      _ => (){
-        assert(false);
-        return null;
-      }(),
-    };
-  }
-}
\ No newline at end of file