Commit 84288a1

derdilla <82763757+NobodyForNothing@users.noreply.github.com>
2024-02-23 20:26:21
fix column detection
Signed-off-by: derdilla <82763757+NobodyForNothing@users.noreply.github.com>
1 parent 9830e72
Changed files (2)
lib
components
screens
lib/components/dialoges/tree_selection_dialoge.dart
@@ -188,6 +188,9 @@ class _TreeSelectionDialogeState extends State<TreeSelectionDialoge>
           textColor: Theme.of(context).colorScheme.error,
           titleTextStyle: Theme.of(context).textTheme.labelLarge,
         ),
+
+      // TODO: don't rebuild when validation error
+      // TODO: backwards navigation
     ],
   );
 }
lib/screens/subsettings/foreign_db_import_screen.dart
@@ -35,17 +35,25 @@ class _ForeignDBImportScreenState extends State<ForeignDBImportScreen> {
 
           if ((selections.length % 2 == 0)) {
             final columns = data.columns[selections[0]]!;
-            columns.remove(selections[1]);
-            return columns;
+            return columns.whereNot((e) => selections.contains(e)).toList();
           } else {
             return RowDataFieldType.values
-                .whereNot((element) => element == RowDataFieldType.timestamp)
+                .whereNot((e) => e == RowDataFieldType.timestamp
+                    || selections.contains(e),)
                 .map((e) => e.localize(localizations))
                 .toList();
           }
         },
-        validator: (todo) { // TODO
-          return 'The schnibledumps doesn\'t schwibble!';
+        validator: (elements) {
+          const kMetaColumns = 2;
+          if (elements.isEmpty) return 'No table selected';
+          if (elements.length < kMetaColumns) return 'No time column selected';
+          if (elements.length % 2 != kMetaColumns % 2) {
+            return 'Select a data column or return to last screen';
+          }
+          if (elements.length < 4) return 'Select at least one data column';
+
+          return 'The schnibledumps doesn\'t schwibble!'; // TODO
         },
         buildTitle: (selections) {
           if (selections.isEmpty) return 'Select table';
@@ -60,6 +68,7 @@ class _ForeignDBImportScreenState extends State<ForeignDBImportScreen> {
       );
       // TODO: perform import
       // TODO: localize everything
+      // TODO: detect when no more selections are possible
     },
   );
 }
@@ -79,7 +88,7 @@ class _ColumnImportData {
       final colNames = RegExp(r'CREATE\s+TABLE\s+[0-9\w]+\s*\(([\w\s()0-9,]+?)\)+')
           .firstMatch(creationSql)
           ?.group(1)
-          ?.split(',')
+          ?.split(RegExp(r'[,()]'))
           .map((e) => e
               .split(' ')
               .where((e) => e.isNotEmpty)
@@ -90,6 +99,7 @@ class _ColumnImportData {
               .firstWhereOrNull((e) => e.trim().isNotEmpty),
           )
           .whereNotNull()
+          .toSet() // remove duplicates
           .toList();
       print('$creationSql:\t $colNames');
       // don't show tables without columns