Commit 2ae7d98

derdilla <82763757+NobodyForNothing@users.noreply.github.com>
2024-03-08 09:32:30
improve import preview
Signed-off-by: derdilla <82763757+NobodyForNothing@users.noreply.github.com>
1 parent b4a9061
Changed files (2)
lib
components
screens
subsettings
lib/components/dialoges/import_preview.dart
@@ -1,4 +1,6 @@
 
+import 'dart:math';
+
 import 'package:blood_pressure_app/components/dialoges/fullscreen_dialoge.dart';
 import 'package:blood_pressure_app/model/export_import/column.dart';
 import 'package:blood_pressure_app/model/export_import/csv_record_parsing_actor.dart';
@@ -7,7 +9,7 @@ import 'package:flutter/material.dart';
 import 'package:flutter_gen/gen_l10n/app_localizations.dart';
 
 class ImportPreview extends StatefulWidget {
-
+  /// Create a preview of how the app would import csv with options.
   const ImportPreview({super.key,
     required this.bottomAppBar,
     required this.initialActor, 
@@ -28,6 +30,8 @@ class ImportPreview extends StatefulWidget {
 }
 
 class _ImportPreviewState extends State<ImportPreview> {
+  static const int _kRowLimit = 30;
+
   late CsvRecordParsingActor _actor;
 
   @override
@@ -48,7 +52,7 @@ class _ImportPreviewState extends State<ImportPreview> {
           children: [
             for (int colIdx = 0; colIdx < _actor.columnNames.length; colIdx++)
               Column(
-                crossAxisAlignment: CrossAxisAlignment.start,
+                crossAxisAlignment: CrossAxisAlignment.end,
                 children: [
                   DropdownButton(
                     items: [
@@ -84,12 +88,20 @@ class _ImportPreviewState extends State<ImportPreview> {
                     },
                   ),
                   const Divider(),
-                  for (int rowIdx = 0; rowIdx < _actor.dataLines.length; rowIdx++) // TODO rework if needed (parsed?)
+                  for (int rowIdx = 0; rowIdx < min(_actor.dataLines.length, _kRowLimit); rowIdx++) // TODO rework if needed (parsed?)
                     _buildCell(
                       rowIdx,
                       _actor.dataLines[rowIdx][colIdx],
                       _actor.columnParsers[_actor.columnNames[colIdx]],
                     ),
+                  if (_kRowLimit < _actor.dataLines.length)
+                    const Align(
+                      alignment: AlignmentDirectional.center,
+                      child: Padding(
+                        padding: EdgeInsets.symmetric(horizontal: 10),
+                        child: Text('...')
+                      )
+                    ),
                 ],
               ),
           ],
@@ -99,6 +111,14 @@ class _ImportPreviewState extends State<ImportPreview> {
   );
 
   Widget _buildCell(int lineNumber, String csvContent, ExportColumn? parser) {
+    Widget buildContent(String txt, [Color? color]) => Padding(
+      padding: const EdgeInsets.symmetric(
+        vertical: 6,
+        horizontal: 4,
+      ),
+      child: Text(txt, style: TextStyle(color: color,),),
+    );
+
     final localizations = AppLocalizations.of(context)!;
     final parsed = parser?.decode(csvContent);
     if (parsed?.$2 == null) {
@@ -107,9 +127,7 @@ class _ImportPreviewState extends State<ImportPreview> {
           lineNumber,
           parsed?.$1.localize(localizations) ?? csvContent,
         ),
-        child: Text(csvContent, style: TextStyle(
-          color: Theme.of(context).colorScheme.error,
-        ),),
+        child: buildContent(csvContent, Theme.of(context).colorScheme.error),
       );
     }
 
@@ -119,7 +137,7 @@ class _ImportPreviewState extends State<ImportPreview> {
     if (text.isEmpty) text = '-';
     return Tooltip(
       message: csvContent,
-      child: Text(text),
+      child: buildContent(text),
     );
   }
 }
lib/screens/subsettings/export_import/export_button_bar.dart
@@ -2,9 +2,11 @@ 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/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';
+import 'package:blood_pressure_app/model/export_import/csv_record_parsing_actor.dart';
 import 'package:blood_pressure_app/model/export_import/pdf_converter.dart';
 import 'package:blood_pressure_app/model/export_import/record_parsing_result.dart';
 import 'package:blood_pressure_app/model/storage/export_columns_store.dart';
@@ -73,6 +75,19 @@ class ExportButtonBar extends StatelessWidget {
                       Provider.of<CsvExportSettings>(context, listen: false),
                       Provider.of<ExportColumnsManager>(context, listen: false),
                     );
+                    // TODO: integrate properly
+                    await showDialog(context: context, builder: (context) =>
+                      Dialog.fullscreen(
+                        child: ImportPreview(
+                          bottomAppBar: true,
+                          initialActor: CsvRecordParsingActor(
+                            converter,
+                            utf8.decode(binaryContent),
+                          ),
+                          columnsManager: Provider.of<ExportColumnsManager>(context, listen: false),
+                        ),
+                      ),
+                    );
                     final result = converter.parse(utf8.decode(binaryContent));
                     final importedRecords = result.getOr((error) {
                       switch (error) {