Commit 7ca44a2
Changed files (5)
lib
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();