Commit 412d101
Changed files (3)
lib
model
export_import
storage
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