Commit cafb410

derdilla <82763757+NobodyForNothing@users.noreply.github.com>
2024-01-27 18:05:00
implement data selection options
Signed-off-by: derdilla <82763757+NobodyForNothing@users.noreply.github.com>
1 parent 0dda00d
Changed files (2)
lib/screens/subsettings/export_import/export_column_management_screen.dart
@@ -6,8 +6,10 @@ 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.
+/// Page that shows all export columns and allows adding and editing custom
+/// ones.
 class ExportColumnsManagementScreen extends StatelessWidget {
+  /// Create a page for listing, editing and adding export columns.
   const ExportColumnsManagementScreen({super.key});
 
   @override
lib/screens/subsettings/foreign_db_import_screen.dart
@@ -1,4 +1,6 @@
 import 'package:blood_pressure_app/components/consistent_future_builder.dart';
+import 'package:blood_pressure_app/model/export_import/import_field_type.dart';
+import 'package:collection/collection.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter_gen/gen_l10n/app_localizations.dart';
 import 'package:sqflite/sqflite.dart';
@@ -17,37 +19,87 @@ class ForeignDBImportScreen extends StatefulWidget {
 
 class _ForeignDBImportScreenState extends State<ForeignDBImportScreen> {
 
+  /// The name of the table that contains the data.
+  String? _selectedTableName;
+
   /// The name of the selected column that contains the timestamps.
   String? _activeTimeColumnName;
 
+  /// The name of the column selected before selecting a datatype.
+  ///
+  /// Once a datatype is selected, this is reset to null.
+  String? _lastSelectedColumnName;
+
   @override
   Widget build(BuildContext context) => Scaffold(
-    appBar: AppBar(),
+    appBar: AppBar(
+      title: (_selectedTableName == null)
+          ? const Text('Table')
+          : const Text('Time column'),
+    ),
     body: ConsistentFutureBuilder(
       future: _ColumnImportData.loadFromDB(widget.db),
-      onData: (BuildContext context, data) {
-        final localizations = AppLocalizations.of(context);
-        return ListView(
-          children: [
-            ListTile(
-              title: Text(
-                'Select table:',
-                style: Theme.of(context).textTheme.titleLarge!,
-              ),
-            ),
-            for (final table in data.tableNames)
-              Card(
-                child: Padding(
-                  padding: const EdgeInsets.all(14),
-                  child: Text(table),
-                ),
-              ),
-            // TODO
-          ],
+      onData: (BuildContext context, _ColumnImportData data) {
+        final localizations = AppLocalizations.of(context)!;
+
+        if (_selectedTableName == null) {
+          return _buildTableSelection(data);
+        }
+        if (_activeTimeColumnName == null) {
+          return _buildColumnSelection(data, (String columnName) => setState(() {
+            _activeTimeColumnName = columnName;
+          }),);
+        }
+
+        if (_lastSelectedColumnName == null) {
+          return _buildColumnSelection(data, (columnName) => setState(() {
+            _lastSelectedColumnName = columnName;
+          }),);
+        }
+        return _buildCardList(
+          RowDataFieldType.values.map((e) => e.localize(localizations)),
+          (columnName) {
+            setState(() {
+              // TODO: add to columns
+              _lastSelectedColumnName = null;
+            });
+          },
         );
+
+        // TODO: add finalize button
+
+        
       },
     ),
   );
+
+  Widget _buildTableSelection(_ColumnImportData data) =>
+      _buildCardList(data.tableNames, (tableName) => setState(() {
+        _selectedTableName = tableName;
+      }));
+
+  Widget _buildColumnSelection(
+      _ColumnImportData data, 
+      void Function(String columnName) onSelection,
+  ) => _buildCardList(data.columns[_selectedTableName]!, onSelection);
+
+  Widget _buildCardList(
+      Iterable<String> allOptions,
+      void Function(String columnName) onSelection,
+  ) => ListView(
+    children: [
+      for (final option in allOptions)
+        InkWell(
+          onTap: () => onSelection(option),
+          child: Card(
+            child: Padding(
+              padding: const EdgeInsets.all(14),
+              child: Text(option),
+            ),
+          ),
+        ),
+    ],
+  );
 }
 
 
@@ -67,7 +119,11 @@ class _ColumnImportData {
           .firstMatch(creationSql)
           ?.group(0)
           ?.split(',')
-          .map((e) => e.split(' ').first)
+          .map((e) => e
+              .split(' ')
+              .firstWhereOrNull((e) => e.trim().isNotEmpty),
+          )
+          .whereNotNull()
           .toList();
       assert(colNames != null);
       columns[tableName] = colNames;