From 74a87b33081872d54995706b63e008ba22342463 Mon Sep 17 00:00:00 2001 From: Anton Stubenbord Date: Fri, 24 Feb 2023 15:55:16 +0100 Subject: [PATCH] fix: Fix filepath splitting, fix slivers on scanner page --- lib/core/service/file_description.dart | 20 ++ .../document_scan/view/scanner_page.dart | 175 +++++++++--------- lib/features/home/view/home_page.dart | 10 +- 3 files changed, 114 insertions(+), 91 deletions(-) create mode 100644 lib/core/service/file_description.dart diff --git a/lib/core/service/file_description.dart b/lib/core/service/file_description.dart new file mode 100644 index 0000000..5b0a81c --- /dev/null +++ b/lib/core/service/file_description.dart @@ -0,0 +1,20 @@ +class FileDescription { + final String filename; + final String extension; + + FileDescription({ + required this.filename, + required this.extension, + }); + + factory FileDescription.fromPath(String path) { + final filename = path.split(RegExp(r"/")).last; + final fragments = filename.split("."); + final ext = fragments.removeLast(); + final name = fragments.join("."); + return FileDescription( + filename: name, + extension: ext, + ); + } +} diff --git a/lib/features/document_scan/view/scanner_page.dart b/lib/features/document_scan/view/scanner_page.dart index a63721a..178be0f 100644 --- a/lib/features/document_scan/view/scanner_page.dart +++ b/lib/features/document_scan/view/scanner_page.dart @@ -13,20 +13,17 @@ import 'package:paperless_mobile/core/delegate/customizable_sliver_persistent_he import 'package:paperless_mobile/core/global/constants.dart'; import 'package:paperless_mobile/core/repository/label_repository.dart'; import 'package:paperless_mobile/core/repository/provider/label_repositories_provider.dart'; +import 'package:paperless_mobile/core/service/file_description.dart'; import 'package:paperless_mobile/core/service/file_service.dart'; -import 'package:paperless_mobile/core/widgets/offline_banner.dart'; import 'package:paperless_mobile/features/app_drawer/view/app_drawer.dart'; -import 'package:paperless_mobile/features/document_search/view/document_search_page.dart'; +import 'package:paperless_mobile/features/document_scan/cubit/document_scanner_cubit.dart'; +import 'package:paperless_mobile/features/document_scan/view/widgets/scanned_image_item.dart'; import 'package:paperless_mobile/features/document_search/view/sliver_search_bar.dart'; import 'package:paperless_mobile/features/document_upload/cubit/document_upload_cubit.dart'; import 'package:paperless_mobile/features/document_upload/view/document_upload_preparation_page.dart'; import 'package:paperless_mobile/features/documents/view/pages/document_view.dart'; -import 'package:paperless_mobile/features/document_scan/cubit/document_scanner_cubit.dart'; -import 'package:paperless_mobile/features/document_scan/view/widgets/scanned_image_item.dart'; -import 'package:paperless_mobile/features/search_app_bar/view/search_app_bar.dart'; import 'package:paperless_mobile/features/tasks/cubit/task_status_cubit.dart'; import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; - import 'package:paperless_mobile/helpers/file_helpers.dart'; import 'package:paperless_mobile/helpers/message_helpers.dart'; import 'package:paperless_mobile/helpers/permission_helpers.dart'; @@ -59,11 +56,6 @@ class _ScannerPageState extends State onPressed: () => _openDocumentScanner(context), child: const Icon(Icons.add_a_photo_outlined), ), - //appBar: _buildAppBar(context, connectedState.isConnected), - // body: Padding( - // padding: const EdgeInsets.all(8.0), - // child: _buildBody(connectedState.isConnected), - // ), body: BlocBuilder>( builder: (context, state) { return SafeArea( @@ -119,53 +111,56 @@ class _ScannerPageState extends State } Widget _buildActions(bool isConnected) { - return SizedBox( - height: kTextTabBarHeight, - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - BlocBuilder>( - builder: (context, state) { - return TextButton.icon( - label: Text(S.of(context)!.previewScan), - onPressed: state.isNotEmpty - ? () => Navigator.of(context).push( - MaterialPageRoute( - builder: (context) => DocumentView( - documentBytes: _assembleFileBytes( - state, - forcePdf: true, - ).then((file) => file.bytes), + return ColoredBox( + color: Theme.of(context).colorScheme.background, + child: SizedBox( + height: kTextTabBarHeight, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + BlocBuilder>( + builder: (context, state) { + return TextButton.icon( + label: Text(S.of(context)!.previewScan), + onPressed: state.isNotEmpty + ? () => Navigator.of(context).push( + MaterialPageRoute( + builder: (context) => DocumentView( + documentBytes: _assembleFileBytes( + state, + forcePdf: true, + ).then((file) => file.bytes), + ), ), - ), - ) - : null, - icon: const Icon(Icons.visibility_outlined), - ); - }, - ), - BlocBuilder>( - builder: (context, state) { - return TextButton.icon( - label: Text(S.of(context)!.clearAll), - onPressed: state.isEmpty ? null : () => _reset(context), - icon: const Icon(Icons.delete_sweep_outlined), - ); - }, - ), - BlocBuilder>( - builder: (context, state) { - return TextButton.icon( - label: Text(S.of(context)!.upload), - onPressed: state.isEmpty || !isConnected - ? null - : () => _onPrepareDocumentUpload(context), - icon: const Icon(Icons.upload_outlined), - ); - }, - ), - ], + ) + : null, + icon: const Icon(Icons.visibility_outlined), + ); + }, + ), + BlocBuilder>( + builder: (context, state) { + return TextButton.icon( + label: Text(S.of(context)!.clearAll), + onPressed: state.isEmpty ? null : () => _reset(context), + icon: const Icon(Icons.delete_sweep_outlined), + ); + }, + ), + BlocBuilder>( + builder: (context, state) { + return TextButton.icon( + label: Text(S.of(context)!.upload), + onPressed: state.isEmpty || !isConnected + ? null + : () => _onPrepareDocumentUpload(context), + icon: const Icon(Icons.upload_outlined), + ); + }, + ), + ], + ), ), ); } @@ -260,28 +255,35 @@ class _ScannerPageState extends State } Widget _buildImageGrid(List scans) { - return SliverGrid.builder( - itemCount: scans.length, - gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: 3, - childAspectRatio: 1 / sqrt(2), - crossAxisSpacing: 10, - mainAxisSpacing: 10, + return CustomScrollView( + slivers: [ + SliverOverlapInjector(handle: searchBarHandle), + SliverOverlapInjector(handle: actionsHandle), + SliverGrid.builder( + itemCount: scans.length, + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 3, + childAspectRatio: 1 / sqrt(2), + crossAxisSpacing: 10, + mainAxisSpacing: 10, + ), + itemBuilder: (context, index) { + return ScannedImageItem( + file: scans[index], + onDelete: () async { + try { + context.read().removeScan(index); + } on PaperlessServerException catch (error, stackTrace) { + showErrorMessage(context, error, stackTrace); + } + }, + index: index, + totalNumberOfFiles: scans.length, + ); + }, ), - itemBuilder: (context, index) { - return ScannedImageItem( - file: scans[index], - onDelete: () async { - try { - context.read().removeScan(index); - } on PaperlessServerException catch (error, stackTrace) { - showErrorMessage(context, error, stackTrace); - } - }, - index: index, - totalNumberOfFiles: scans.length, - ); - }); + ], + ); } void _reset(BuildContext context) { @@ -300,17 +302,18 @@ class _ScannerPageState extends State allowMultiple: false, ); if (result?.files.single.path != null) { - File file = File(result!.files.single.path!); - if (!supportedFileExtensions - .contains(file.path.split('.').last.toLowerCase())) { + final path = result!.files.single.path!; + final fileDescription = FileDescription.fromPath(path); + File file = File(path); + if (!supportedFileExtensions.contains( + fileDescription.extension.toLowerCase(), + )) { showErrorMessage( context, const PaperlessServerException(ErrorCode.unsupportedFileFormat), ); return; } - final filename = extractFilenameFromPath(file.path); - final extension = p.extension(file.path); Navigator.of(context).push( MaterialPageRoute( builder: (_) => LabelRepositoriesProvider( @@ -325,9 +328,9 @@ class _ScannerPageState extends State ), child: DocumentUploadPreparationPage( fileBytes: file.readAsBytesSync(), - filename: filename, - fileExtension: extension, - title: filename, + filename: fileDescription.filename, + title: fileDescription.filename, + fileExtension: fileDescription.extension, ), ), ), diff --git a/lib/features/home/view/home_page.dart b/lib/features/home/view/home_page.dart index aa4bb53..b5e76ce 100644 --- a/lib/features/home/view/home_page.dart +++ b/lib/features/home/view/home_page.dart @@ -12,6 +12,7 @@ import 'package:paperless_mobile/core/bloc/paperless_server_information_cubit.da import 'package:paperless_mobile/core/global/constants.dart'; import 'package:paperless_mobile/core/repository/label_repository.dart'; import 'package:paperless_mobile/core/repository/saved_view_repository.dart'; +import 'package:paperless_mobile/core/service/file_description.dart'; import 'package:paperless_mobile/core/translation/error_code_localization_mapper.dart'; import 'package:paperless_mobile/features/document_scan/cubit/document_scanner_cubit.dart'; import 'package:paperless_mobile/features/document_scan/view/scanner_page.dart'; @@ -152,8 +153,7 @@ class _HomePageState extends State with WidgetsBindingObserver { } return; } - final filename = extractFilenameFromPath(mediaFile.path); - final extension = p.extension(mediaFile.path); + final fileDescription = FileDescription.fromPath(mediaFile.path); if (await File(mediaFile.path).exists()) { final bytes = File(mediaFile.path).readAsBytesSync(); final result = await Navigator.push( @@ -168,9 +168,9 @@ class _HomePageState extends State with WidgetsBindingObserver { ), child: DocumentUploadPreparationPage( fileBytes: bytes, - filename: filename, - title: filename, - fileExtension: extension, + filename: fileDescription.filename, + title: fileDescription.filename, + fileExtension: fileDescription.extension, ), ), ),