Commit 76a6894

derdilla <derdilla06@gmail.com>
2023-06-22 08:29:21
Add warn banner for non-importable configuration
1 parent 406df24
Changed files (3)
lib/l10n/app_de.arb
@@ -107,6 +107,8 @@
       }
     }
   },
+  "exportWarnConfigNotImportable": "Hey! Nur eine freundliche Info: Die aktuelle Exportkonfiguration ist nicht importierbar. Um das zu beheben, stelle sicher, dass der Exporttyp als CSV festgelegt ist, die Überschrift aktiviert ist und die Felder 'diastolic', 'systolic', 'pulse', 'notes' sowie eines der verfügbaren Zeitformate enthalten sind.",
+
   "shared": "Geteilt",
   "import": "IMPORT",
   "sourceCode": "Quellcode",
lib/l10n/app_en.arb
@@ -119,6 +119,7 @@
       }
     }
   },
+  "exportWarnConfigNotImportable": "Hey! Just a friendly heads up: the current export configuration won't be importable. To fix it, make sure you set the export type as CSV, enable the headline, and include the fields 'diastolic', 'systolic', 'pulse', 'notes', along with one of the time formats available.",
 
   "statistics": "Statistics",
   "measurementCount": "Measurement count",
lib/screens/subsettings/export_import_screen.dart
@@ -14,9 +14,16 @@ import 'package:intl/intl.dart';
 import 'package:provider/provider.dart';
 import 'package:share_plus/share_plus.dart';
 
-class ExportImportScreen extends StatelessWidget {
+class ExportImportScreen extends StatefulWidget {
   const ExportImportScreen({super.key});
 
+  @override
+  State<ExportImportScreen> createState() => _ExportImportScreenState();
+}
+
+class _ExportImportScreenState extends State<ExportImportScreen> {
+  bool _showWarnBanner = true;
+
   @override
   Widget build(BuildContext context) {
     return Scaffold(
@@ -27,6 +34,7 @@ class ExportImportScreen extends StatelessWidget {
       body: Container(
         margin: const EdgeInsets.only(bottom: 80),
         child: Consumer<Settings>(builder: (context, settings, child) {
+           // export range
           var exportRange = settings.exportDataRange;
           String exportRangeText;
           if (exportRange.start.millisecondsSinceEpoch != 0 && exportRange.end.millisecondsSinceEpoch != 0) {
@@ -36,48 +44,7 @@ class ExportImportScreen extends StatelessWidget {
             exportRangeText = AppLocalizations.of(context)!.errPleaseSelect;
           }
 
-          List<Widget> modeSpecificSettings = [];
-          if (settings.exportFormat == ExportFormat.csv) {
-            modeSpecificSettings = [
-              InputSettingsTile(
-                title: Text(AppLocalizations.of(context)!.fieldDelimiter),
-                inputWidth: 40,
-                initialValue: settings.csvFieldDelimiter,
-                onEditingComplete: (value) {
-                  if (value != null) {
-                    settings.csvFieldDelimiter = value;
-                  }
-                },
-              ),
-              InputSettingsTile(
-                title: Text(AppLocalizations.of(context)!.textDelimiter),
-                inputWidth: 40,
-                initialValue: settings.csvTextDelimiter,
-                onEditingComplete: (value) {
-                  if (value != null) {
-                    settings.csvTextDelimiter = value;
-                  }
-                },
-              ),
-              SwitchSettingsTile(
-                  title: Text(AppLocalizations.of(context)!.exportCsvHeadline),
-                  description: Text(AppLocalizations.of(context)!.exportCsvHeadlineDesc),
-                  initialValue: settings.exportCsvHeadline,
-                  onToggle: (value) {
-                    settings.exportCsvHeadline = value;
-                  }
-              ),
-              SwitchSettingsTile(
-                title: Text(AppLocalizations.of(context)!.exportCustomEntries),
-                initialValue: settings.exportCustomEntries,
-                onToggle: (value) {
-                  settings.exportCustomEntries = value;
-                }
-              ),
-              (settings.exportCustomEntries) ? const CsvItemsOrderCreator(): const SizedBox.shrink()
-            ];
-          }
-
+          // default options
           List<Widget> options = [
             SwitchSettingsTile(
                 title: Text(AppLocalizations.of(context)!.exportLimitDataRange),
@@ -135,6 +102,77 @@ class ExportImportScreen extends StatelessWidget {
             ),
              */
           ];
+
+          // mode specifics
+          List<Widget> modeSpecificSettings = [];
+          if (settings.exportFormat == ExportFormat.csv) {
+            modeSpecificSettings = [
+              InputSettingsTile(
+                title: Text(AppLocalizations.of(context)!.fieldDelimiter),
+                inputWidth: 40,
+                initialValue: settings.csvFieldDelimiter,
+                onEditingComplete: (value) {
+                  if (value != null) {
+                    settings.csvFieldDelimiter = value;
+                  }
+                },
+              ),
+              InputSettingsTile(
+                title: Text(AppLocalizations.of(context)!.textDelimiter),
+                inputWidth: 40,
+                initialValue: settings.csvTextDelimiter,
+                onEditingComplete: (value) {
+                  if (value != null) {
+                    settings.csvTextDelimiter = value;
+                  }
+                },
+              ),
+              SwitchSettingsTile(
+                  title: Text(AppLocalizations.of(context)!.exportCsvHeadline),
+                  description: Text(AppLocalizations.of(context)!.exportCsvHeadlineDesc),
+                  initialValue: settings.exportCsvHeadline,
+                  onToggle: (value) {
+                    settings.exportCsvHeadline = value;
+                  }
+              ),
+              SwitchSettingsTile(
+                title: Text(AppLocalizations.of(context)!.exportCustomEntries),
+                initialValue: settings.exportCustomEntries,
+                onToggle: (value) {
+                  settings.exportCustomEntries = value;
+                }
+              ),
+              (settings.exportCustomEntries) ? const CsvItemsOrderCreator(): const SizedBox.shrink()
+            ];
+          }
+
+          // warn banner when
+          if (_showWarnBanner && (settings.exportFormat != ExportFormat.csv ||
+              settings.exportCsvHeadline == false ||
+              !(
+                  (settings.exportItems.contains('timestampUnixMs') || settings.exportItems.contains('isoUTCTime')) &&
+                  settings.exportItems.contains('systolic') &&
+                  settings.exportItems.contains('diastolic') &&
+                  settings.exportItems.contains('pulse') &&
+                  settings.exportItems.contains('notes')
+              )
+          )) {
+            options.insert(0, MaterialBanner(
+              padding: const EdgeInsets.all(20),
+              content: Text(AppLocalizations.of(context)!.exportWarnConfigNotImportable),
+              actions: [
+                TextButton(
+                    onPressed: () {
+                      setState(() {
+                        _showWarnBanner = false;
+                      });
+                    },
+                    child: Text(AppLocalizations.of(context)!.btnConfirm))
+              ]
+            ));
+          }
+
+          // create view
           options.addAll(modeSpecificSettings);
           options.add(const SizedBox(height: 20,));
           return ListView(