fix: Fix filepath splitting, fix slivers on scanner page

This commit is contained in:
Anton Stubenbord
2023-02-24 15:55:16 +01:00
parent 378e3ff104
commit 74a87b3308
3 changed files with 114 additions and 91 deletions

View File

@@ -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,
);
}
}

View File

@@ -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/global/constants.dart';
import 'package:paperless_mobile/core/repository/label_repository.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/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/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/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_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/cubit/document_upload_cubit.dart';
import 'package:paperless_mobile/features/document_upload/view/document_upload_preparation_page.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/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/features/tasks/cubit/task_status_cubit.dart';
import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; import 'package:paperless_mobile/generated/l10n/app_localizations.dart';
import 'package:paperless_mobile/helpers/file_helpers.dart'; import 'package:paperless_mobile/helpers/file_helpers.dart';
import 'package:paperless_mobile/helpers/message_helpers.dart'; import 'package:paperless_mobile/helpers/message_helpers.dart';
import 'package:paperless_mobile/helpers/permission_helpers.dart'; import 'package:paperless_mobile/helpers/permission_helpers.dart';
@@ -59,11 +56,6 @@ class _ScannerPageState extends State<ScannerPage>
onPressed: () => _openDocumentScanner(context), onPressed: () => _openDocumentScanner(context),
child: const Icon(Icons.add_a_photo_outlined), 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<DocumentScannerCubit, List<File>>( body: BlocBuilder<DocumentScannerCubit, List<File>>(
builder: (context, state) { builder: (context, state) {
return SafeArea( return SafeArea(
@@ -119,53 +111,56 @@ class _ScannerPageState extends State<ScannerPage>
} }
Widget _buildActions(bool isConnected) { Widget _buildActions(bool isConnected) {
return SizedBox( return ColoredBox(
height: kTextTabBarHeight, color: Theme.of(context).colorScheme.background,
child: Row( child: SizedBox(
crossAxisAlignment: CrossAxisAlignment.center, height: kTextTabBarHeight,
mainAxisAlignment: MainAxisAlignment.spaceAround, child: Row(
children: [ crossAxisAlignment: CrossAxisAlignment.center,
BlocBuilder<DocumentScannerCubit, List<File>>( mainAxisAlignment: MainAxisAlignment.spaceAround,
builder: (context, state) { children: [
return TextButton.icon( BlocBuilder<DocumentScannerCubit, List<File>>(
label: Text(S.of(context)!.previewScan), builder: (context, state) {
onPressed: state.isNotEmpty return TextButton.icon(
? () => Navigator.of(context).push( label: Text(S.of(context)!.previewScan),
MaterialPageRoute( onPressed: state.isNotEmpty
builder: (context) => DocumentView( ? () => Navigator.of(context).push(
documentBytes: _assembleFileBytes( MaterialPageRoute(
state, builder: (context) => DocumentView(
forcePdf: true, documentBytes: _assembleFileBytes(
).then((file) => file.bytes), state,
forcePdf: true,
).then((file) => file.bytes),
),
), ),
), )
) : null,
: null, icon: const Icon(Icons.visibility_outlined),
icon: const Icon(Icons.visibility_outlined), );
); },
}, ),
), BlocBuilder<DocumentScannerCubit, List<File>>(
BlocBuilder<DocumentScannerCubit, List<File>>( builder: (context, state) {
builder: (context, state) { return TextButton.icon(
return TextButton.icon( label: Text(S.of(context)!.clearAll),
label: Text(S.of(context)!.clearAll), onPressed: state.isEmpty ? null : () => _reset(context),
onPressed: state.isEmpty ? null : () => _reset(context), icon: const Icon(Icons.delete_sweep_outlined),
icon: const Icon(Icons.delete_sweep_outlined), );
); },
}, ),
), BlocBuilder<DocumentScannerCubit, List<File>>(
BlocBuilder<DocumentScannerCubit, List<File>>( builder: (context, state) {
builder: (context, state) { return TextButton.icon(
return TextButton.icon( label: Text(S.of(context)!.upload),
label: Text(S.of(context)!.upload), onPressed: state.isEmpty || !isConnected
onPressed: state.isEmpty || !isConnected ? null
? null : () => _onPrepareDocumentUpload(context),
: () => _onPrepareDocumentUpload(context), icon: const Icon(Icons.upload_outlined),
icon: const Icon(Icons.upload_outlined), );
); },
}, ),
), ],
], ),
), ),
); );
} }
@@ -260,28 +255,35 @@ class _ScannerPageState extends State<ScannerPage>
} }
Widget _buildImageGrid(List<File> scans) { Widget _buildImageGrid(List<File> scans) {
return SliverGrid.builder( return CustomScrollView(
itemCount: scans.length, slivers: [
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( SliverOverlapInjector(handle: searchBarHandle),
crossAxisCount: 3, SliverOverlapInjector(handle: actionsHandle),
childAspectRatio: 1 / sqrt(2), SliverGrid.builder(
crossAxisSpacing: 10, itemCount: scans.length,
mainAxisSpacing: 10, 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<DocumentScannerCubit>().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<DocumentScannerCubit>().removeScan(index);
} on PaperlessServerException catch (error, stackTrace) {
showErrorMessage(context, error, stackTrace);
}
},
index: index,
totalNumberOfFiles: scans.length,
);
});
} }
void _reset(BuildContext context) { void _reset(BuildContext context) {
@@ -300,17 +302,18 @@ class _ScannerPageState extends State<ScannerPage>
allowMultiple: false, allowMultiple: false,
); );
if (result?.files.single.path != null) { if (result?.files.single.path != null) {
File file = File(result!.files.single.path!); final path = result!.files.single.path!;
if (!supportedFileExtensions final fileDescription = FileDescription.fromPath(path);
.contains(file.path.split('.').last.toLowerCase())) { File file = File(path);
if (!supportedFileExtensions.contains(
fileDescription.extension.toLowerCase(),
)) {
showErrorMessage( showErrorMessage(
context, context,
const PaperlessServerException(ErrorCode.unsupportedFileFormat), const PaperlessServerException(ErrorCode.unsupportedFileFormat),
); );
return; return;
} }
final filename = extractFilenameFromPath(file.path);
final extension = p.extension(file.path);
Navigator.of(context).push( Navigator.of(context).push(
MaterialPageRoute( MaterialPageRoute(
builder: (_) => LabelRepositoriesProvider( builder: (_) => LabelRepositoriesProvider(
@@ -325,9 +328,9 @@ class _ScannerPageState extends State<ScannerPage>
), ),
child: DocumentUploadPreparationPage( child: DocumentUploadPreparationPage(
fileBytes: file.readAsBytesSync(), fileBytes: file.readAsBytesSync(),
filename: filename, filename: fileDescription.filename,
fileExtension: extension, title: fileDescription.filename,
title: filename, fileExtension: fileDescription.extension,
), ),
), ),
), ),

View File

@@ -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/global/constants.dart';
import 'package:paperless_mobile/core/repository/label_repository.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/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/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/cubit/document_scanner_cubit.dart';
import 'package:paperless_mobile/features/document_scan/view/scanner_page.dart'; import 'package:paperless_mobile/features/document_scan/view/scanner_page.dart';
@@ -152,8 +153,7 @@ class _HomePageState extends State<HomePage> with WidgetsBindingObserver {
} }
return; return;
} }
final filename = extractFilenameFromPath(mediaFile.path); final fileDescription = FileDescription.fromPath(mediaFile.path);
final extension = p.extension(mediaFile.path);
if (await File(mediaFile.path).exists()) { if (await File(mediaFile.path).exists()) {
final bytes = File(mediaFile.path).readAsBytesSync(); final bytes = File(mediaFile.path).readAsBytesSync();
final result = await Navigator.push<DocumentUploadResult>( final result = await Navigator.push<DocumentUploadResult>(
@@ -168,9 +168,9 @@ class _HomePageState extends State<HomePage> with WidgetsBindingObserver {
), ),
child: DocumentUploadPreparationPage( child: DocumentUploadPreparationPage(
fileBytes: bytes, fileBytes: bytes,
filename: filename, filename: fileDescription.filename,
title: filename, title: fileDescription.filename,
fileExtension: extension, fileExtension: fileDescription.extension,
), ),
), ),
), ),