Commit 5559a69

derdilla <82763757+NobodyForNothing@users.noreply.github.com>
2024-03-14 15:56:04
implement showing all rows
Signed-off-by: derdilla <82763757+NobodyForNothing@users.noreply.github.com>
1 parent f8de561
Changed files (3)
lib
components
screens
subsettings
test
lib/components/dialoges/import_preview.dart → lib/components/dialoges/import_preview_dialoge.dart
@@ -14,9 +14,9 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart';
 /// A preview that allows customizing columns used for csv data import.
 ///
 /// Pops the scope with a list of measurements on save ([List<BloodPressureRecord>?]).
-class ImportPreview extends StatefulWidget {
+class ImportPreviewDialoge extends StatefulWidget {
   /// Create a preview of how the app would import csv with options.
-  const ImportPreview({super.key,
+  const ImportPreviewDialoge({super.key,
     required this.bottomAppBar,
     required this.initialActor, 
     required this.columnsManager,
@@ -32,10 +32,10 @@ class ImportPreview extends StatefulWidget {
   final CsvRecordParsingActor initialActor;
 
   @override
-  State<ImportPreview> createState() => _ImportPreviewState();
+  State<ImportPreviewDialoge> createState() => _ImportPreviewDialogeState();
 }
 
-class _ImportPreviewState extends State<ImportPreview> {
+class _ImportPreviewDialogeState extends State<ImportPreviewDialoge> {
   static const int _kRowLimit = 30;
 
   late CsvRecordParsingActor _actor;
@@ -44,6 +44,9 @@ class _ImportPreviewState extends State<ImportPreview> {
 
   bool _showingError = false;
 
+  /// Whether to limit shown rows to [_kRowLimit] for faster rendering.
+  bool _limitRows = true;
+
   @override
   void initState() {
     super.initState();
@@ -131,18 +134,20 @@ class _ImportPreviewState extends State<ImportPreview> {
                     },
                   ),
                   const Divider(),
-                  for (int rowIdx = 0; rowIdx < min(_actor.dataLines.length, _kRowLimit); rowIdx++) // TODO rework if needed (parsed?)
+                  for (int rowIdx = 0; rowIdx < (_limitRows
+                      ? min(_actor.dataLines.length, _kRowLimit)
+                      : _actor.dataLines.length); rowIdx++) // TODO rework if needed (parsed?)
                     _buildCell(
                       rowIdx,
                       _actor.dataLines[rowIdx][colIdx],
                       _actor.columnParsers[_actor.columnNames[colIdx]],
                     ),
-                  if (_kRowLimit < _actor.dataLines.length)
-                    const Align(
+                  if (_limitRows && _kRowLimit < _actor.dataLines.length)
+                    Align(
                       alignment: AlignmentDirectional.center,
-                      child: Padding(
-                        padding: EdgeInsets.symmetric(horizontal: 10),
-                        child: Text('...'),
+                      child: TextButton(
+                        onPressed: () => setState(() {_limitRows = false;}),
+                        child: const Text('…')
                       ),
                     ),
                 ],
@@ -196,7 +201,7 @@ Future<List<BloodPressureRecord>?> showImportPreview(
   showDialog<List<BloodPressureRecord>>(
     context: context, builder: (context) =>
     Dialog.fullscreen(
-      child: ImportPreview(
+      child: ImportPreviewDialoge(
         bottomAppBar: bottomAppBar,
         initialActor: initialActor,
         columnsManager: columnsManager,
lib/screens/subsettings/export_import/export_button_bar.dart
@@ -2,7 +2,7 @@ import 'dart:convert';
 import 'dart:io';
 import 'dart:typed_data';
 
-import 'package:blood_pressure_app/components/dialoges/import_preview.dart';
+import 'package:blood_pressure_app/components/dialoges/import_preview_dialoge.dart';
 import 'package:blood_pressure_app/model/blood_pressure/model.dart';
 import 'package:blood_pressure_app/model/blood_pressure/record.dart';
 import 'package:blood_pressure_app/model/export_import/csv_converter.dart';
test/ui/components/import_preview_dialoge_test.dart
@@ -0,0 +1,53 @@
+import 'package:blood_pressure_app/components/dialoges/import_preview_dialoge.dart';
+import 'package:blood_pressure_app/model/export_import/csv_converter.dart';
+import 'package:blood_pressure_app/model/export_import/csv_record_parsing_actor.dart';
+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:flutter/material.dart';
+import 'package:flutter_test/flutter_test.dart';
+
+import 'util.dart';
+
+void main() {
+  testWidgets('should open', (tester) async {
+    await tester.pumpWidget(materialApp(ImportPreviewDialoge(
+      bottomAppBar: false,
+      initialActor: CsvRecordParsingActor(
+        CsvConverter(
+          CsvExportSettings(),
+          ExportColumnsManager(),
+        ),
+        'timestampUnixMs,systolic,diastolic,pulse,notes,needlePin\n1703175193324'
+        ',123,45,67,note1,"{""color"":4285132974}"\n1703147206000,114,71,56,,null',
+      ),
+      columnsManager: ExportColumnsManager(),
+    )));
+
+    expect(tester.takeException(), isNull);
+    expect(find.byType(DropdownButton), findsNWidgets(6), reason: '6 columns');
+    expect(find.text('note1'), findsOneWidget);
+  });
+  testWidgets('should limit rows', (tester) async {
+    var csvTxt = 'timestampUnixMs,systolic,diastolic,pulse,notes,needlePin';
+    for (int i = 0; i < 40; i++) {
+      csvTxt += '\n${1703147206000 + i},1,1,1,row-content,null';
+    }
+
+    await tester.pumpWidget(materialApp(ImportPreviewDialoge(
+      bottomAppBar: false,
+      initialActor: CsvRecordParsingActor(
+        CsvConverter(
+          CsvExportSettings(),
+          ExportColumnsManager(),
+        ),
+        csvTxt,
+      ),
+      columnsManager: ExportColumnsManager(),
+    )));
+
+    expect(find.text('row-content'), findsNWidgets(30));
+    await tester.dragFrom(Offset(10, tester.view.physicalSize.height), Offset(0, -(tester.view.physicalSize.height)));
+    await tester.pumpAndSettle();
+    expect(find.text('…'), findsAtLeast(1));
+  });
+}