Commit cafb410
Changed files (2)
lib
screens
subsettings
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;