Commit 422f4f7

derdilla <82763757+NobodyForNothing@users.noreply.github.com>
2023-12-15 12:41:12
add export column manager screen
Signed-off-by: derdilla <82763757+NobodyForNothing@users.noreply.github.com>
1 parent dd07e55
lib/l10n/app_en.arb
@@ -476,5 +476,7 @@
   "remove": "Remove",
   "@remove": {},
   "manageExportColumns": "Manage export columns",
-  "@manageExportColumns": {}
+  "@manageExportColumns": {},
+  "buildIn": "Build-in",
+  "@buildIn": {}
 }
lib/model/storage/export_columns_store.dart
@@ -18,7 +18,6 @@ class ExportColumnsManager extends ChangeNotifier { // TODO: separate ExportColu
 
   /// View of map between all [ExportColumn.internalName]s and [ExportColumn]s added by a user.
   UnmodifiableMapView<String, ExportColumn> get userColumns => UnmodifiableMapView(_userColumns);
-  // TODO: consider replacing with a allColumns getter once build ins are added.
 
   /// Tries to save the column to the map with the [ExportColumn.internalName] key.
   ///
@@ -69,6 +68,14 @@ class ExportColumnsManager extends ChangeNotifier { // TODO: separate ExportColu
     return UnmodifiableListView(columns);
   }
 
+  /// Returns a list of all NativeColumns and BuildInColumns defined.
+  UnmodifiableListView<ExportColumn> getAllUnmodifiableColumns() {
+    final columns = <ExportColumn>[];
+    columns.addAll(NativeColumn.allColumns);
+    columns.addAll(BuildInColumn.allColumns);
+    return UnmodifiableListView(columns);
+  }
+
   String toJson() { // TODO: update from and TO json to new style
     final columns = [];
     for (final c in _userColumns.values) {
lib/screens/subsettings/export_import/active_field_customization.dart
@@ -6,6 +6,7 @@ import 'package:blood_pressure_app/model/storage/export_columns_store.dart';
 import 'package:blood_pressure_app/model/storage/export_csv_settings_store.dart';
 import 'package:blood_pressure_app/model/storage/export_pdf_settings_store.dart';
 import 'package:blood_pressure_app/model/storage/export_settings_store.dart';
+import 'package:blood_pressure_app/screens/subsettings/export_import/export_column_management_screen.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter_gen/gen_l10n/app_localizations.dart';
 import 'package:provider/provider.dart';
@@ -44,84 +45,89 @@ class ActiveExportFieldCustomization extends StatelessWidget {
       },
     );
 
-    if (fieldsConfig.activePreset != ExportImportPreset.none) {
-      return dropdown;
-    }
     return Column(
       mainAxisSize: MainAxisSize.min,
       children: [
         dropdown,
-        Container(
-          margin: const EdgeInsets.symmetric(
-              horizontal: 16,
-              vertical: 5
-          ),
-          height: 400,
-          decoration: BoxDecoration(
-            border: Border.all(color: Theme.of(context).textTheme.labelLarge?.color ?? Colors.teal),
-            borderRadius: const BorderRadius.all(Radius.circular(10)),
-          ),
-          child: Consumer<ExportColumnsManager>(
-              builder: (context, availableColumns, child) {
-                final activeColumns = fieldsConfig.getActiveColumns(availableColumns);
-                return ReorderableListView.builder(
-                    itemBuilder: (context, idx) {
-                      if (idx >= activeColumns.length) {
-                        return ListTile(
-                          key: const Key('add field'),
-                          leading: const Icon(Icons.add),
-                          title: Text(localizations.addEntry),
-                          onTap: () async {
-                            final column = await showDialog<ExportColumn?>(context: context, builder: (context) =>
-                                SimpleDialog(
-                                  title: Text(localizations.addEntry),
-                                  insetPadding: const EdgeInsets.symmetric(
-                                    vertical: 64,
-                                  ),
-                                  children: availableColumns.getAllColumns().map((column) =>
-                                      ListTile(
-                                        title: Text(column.userTitle(localizations)),
-                                        onTap: () => Navigator.of(context).pop(column),
-                                      )
-                                  ).toList(),
-                                )
-                            );
-                            if (column != null) fieldsConfig.addUserColumn(column);
-                          },
-                        );
-                      }
-                      return ListTile(
-                        key: Key(activeColumns[idx].internalIdentifier + idx.toString()),
-                        title: Text(activeColumns[idx].userTitle(localizations)),
-                        trailing: Row(
-                          mainAxisSize: MainAxisSize.min,
-                          children: [
-                            IconButton(
-                                tooltip: localizations.remove,
-                                onPressed: () {
-                                  fieldsConfig.removeUserColumn(activeColumns[idx].internalIdentifier);
-                                },
-                                icon: const Icon(Icons.remove_circle_outline)
-                            ),
-                            const Icon(Icons.drag_handle),
-                          ],
-                        ),
-                      );
-                    },
-                    itemCount: activeColumns.length + 1,
-                    onReorder: fieldsConfig.reorderUserColumns
-                );
-              }
-          ),
-        ),
         ListTile(
           title: Text(localizations.manageExportColumns),
           trailing: const Icon(Icons.arrow_forward_ios),
           onTap: () {
-            // TODO implement adding / editing columns => separate ColumnsManagerScreen ?
+            Navigator.push(
+              context,
+              MaterialPageRoute(builder: (context) => const ExportColumnsManagementScreen()),);
           },
         ),
+        if (fieldsConfig.activePreset == ExportImportPreset.none)
+          _buildActiveColumnsEditor(context, localizations, fieldsConfig),
       ],
     );
   }
+
+  Widget _buildActiveColumnsEditor(BuildContext context,
+    AppLocalizations localizations,
+    ActiveExportColumnConfiguration fieldsConfig) =>
+      Container(
+        margin: const EdgeInsets.symmetric(
+            horizontal: 16,
+            vertical: 5
+        ),
+        height: 400,
+        decoration: BoxDecoration(
+          border: Border.all(color: Theme.of(context).textTheme.labelLarge?.color ?? Colors.teal),
+          borderRadius: const BorderRadius.all(Radius.circular(10)),
+        ),
+        child: Consumer<ExportColumnsManager>(
+          builder: (context, availableColumns, child) {
+            final activeColumns = fieldsConfig.getActiveColumns(availableColumns);
+            return ReorderableListView.builder(
+              itemBuilder: (context, idx) {
+                if (idx >= activeColumns.length) {
+                  return ListTile(
+                    key: const Key('add field'),
+                    leading: const Icon(Icons.add),
+                    title: Text(localizations.addEntry),
+                    onTap: () async {
+                      final column = await showDialog<ExportColumn?>(context: context, builder: (context) =>
+                          SimpleDialog(
+                            title: Text(localizations.addEntry),
+                            insetPadding: const EdgeInsets.symmetric(
+                              vertical: 64,
+                            ),
+                            children: availableColumns.getAllColumns().map((column) =>
+                              ListTile(
+                                title: Text(column.userTitle(localizations)),
+                                onTap: () => Navigator.of(context).pop(column),
+                              )
+                            ).toList(),
+                          )
+                      );
+                      if (column != null) fieldsConfig.addUserColumn(column);
+                    },
+                  );
+                }
+                return ListTile(
+                  key: Key(activeColumns[idx].internalIdentifier + idx.toString()),
+                  title: Text(activeColumns[idx].userTitle(localizations)),
+                  trailing: Row(
+                    mainAxisSize: MainAxisSize.min,
+                    children: [
+                      IconButton(
+                        tooltip: localizations.remove,
+                        onPressed: () {
+                          fieldsConfig.removeUserColumn(activeColumns[idx].internalIdentifier);
+                        },
+                        icon: const Icon(Icons.remove_circle_outline)
+                      ),
+                      const Icon(Icons.drag_handle),
+                    ],
+                  ),
+                );
+              },
+              itemCount: activeColumns.length + 1,
+              onReorder: fieldsConfig.reorderUserColumns
+            );
+          }
+        ),
+      );
 }
\ No newline at end of file
lib/screens/subsettings/export_import/export_column_management_screen.dart
@@ -0,0 +1,60 @@
+import 'package:blood_pressure_app/model/storage/export_columns_store.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_gen/gen_l10n/app_localizations.dart';
+import 'package:provider/provider.dart';
+
+/// Page that shows all export columns and allows adding and editing custom ones.
+class ExportColumnsManagementScreen extends StatelessWidget {
+  const ExportColumnsManagementScreen({super.key});
+
+  @override
+  Widget build(BuildContext context) {
+    final localizations = AppLocalizations.of(context)!;
+    return Scaffold(
+      appBar: AppBar(
+        forceMaterialTransparency: true,
+      ),
+      body: Consumer<ExportColumnsManager>(
+        builder: (context, columnsManager, child) => ListView(
+          children: [
+            ExpansionTile(
+              title: Text(localizations.buildIn,
+                style: Theme.of(context).textTheme.titleLarge!,),
+              children: [
+                for (final column in columnsManager.getAllUnmodifiableColumns())
+                  ListTile(
+                    title: Text(column.userTitle(localizations)),
+                    subtitle: column.formatPattern == null ? null : Text(column.formatPattern!),
+                  )
+              ],
+            ),
+            ExpansionTile(
+              initiallyExpanded: true,
+              title: Text(localizations.custom,
+                style: Theme.of(context).textTheme.titleLarge!,),
+              children: [
+                for (final column in columnsManager.userColumns.values)
+                  ListTile(
+                    title: Text(column.userTitle(localizations)),
+                    subtitle: Text(column.formatPattern.toString()),
+                    trailing: const Icon(Icons.edit),
+                    onTap: () {
+                      // TODO: implement tile editing
+                    },
+                  ),
+                ListTile(
+                  leading: const Icon(Icons.add),
+                  title: Text(localizations.addExportformat),
+                  onTap: () {
+                    // TODO: reimplement tile adding
+                  },
+                )
+              ],
+            )
+          ],
+        )
+      ),
+    );
+  }
+
+}
\ No newline at end of file
lib/screens/subsettings/export_import/export_import_screen.dart
@@ -12,6 +12,7 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart';
 import 'package:jsaver/jSaver.dart';
 import 'package:provider/provider.dart';
 
+/// Screen to configure and perform exports and imports of blood pressure values.
 class ExportImportScreen extends StatelessWidget {
   const ExportImportScreen({super.key});