Commit 5559a69
Changed files (3)
lib
components
dialoges
screens
subsettings
export_import
test
ui
components
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,
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));
+ });
+}