mirror of
https://github.com/Xevion/paperless-mobile.git
synced 2025-12-10 08:07:59 -06:00
Added open in system viewer, updated translations.
This commit is contained in:
@@ -7,6 +7,7 @@ import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/core/service/file_service.dart';
|
||||
import 'package:url_launcher/url_launcher.dart';
|
||||
import 'package:url_launcher/url_launcher_string.dart';
|
||||
import 'package:open_filex/open_filex.dart';
|
||||
|
||||
part 'document_details_state.dart';
|
||||
|
||||
@@ -47,21 +48,14 @@ class DocumentDetailsCubit extends Cubit<DocumentDetailsState> {
|
||||
}
|
||||
}
|
||||
|
||||
Future<bool> openDocumentInSystemViewer() async {
|
||||
Future<ResultType> openDocumentInSystemViewer() async {
|
||||
final downloadDir = await FileService.temporaryDirectory;
|
||||
final metaData = await _api.getMetaData(state.document);
|
||||
final docBytes = await _api.download(state.document);
|
||||
File f = File('${downloadDir.path}/${metaData.mediaFilename}');
|
||||
f.writeAsBytes(docBytes);
|
||||
final url = Uri(
|
||||
scheme: "file",
|
||||
path: f.path,
|
||||
);
|
||||
log(url.toString());
|
||||
if (await canLaunchUrl(url)) {
|
||||
return launchUrl(url);
|
||||
}
|
||||
return false;
|
||||
return OpenFilex.open(f.path, type: "application/pdf")
|
||||
.then((value) => value.type);
|
||||
}
|
||||
|
||||
void replaceDocument(DocumentModel document) {
|
||||
|
||||
@@ -5,12 +5,12 @@ import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
import 'package:open_filex/open_filex.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/core/bloc/connectivity_cubit.dart';
|
||||
import 'package:paperless_mobile/core/repository/state/impl/correspondent_repository_state.dart';
|
||||
import 'package:paperless_mobile/core/service/file_service.dart';
|
||||
import 'package:paperless_mobile/core/translation/error_code_localization_mapper.dart';
|
||||
import 'package:paperless_mobile/core/widgets/highlighted_text.dart';
|
||||
import 'package:paperless_mobile/core/widgets/hint_card.dart';
|
||||
import 'package:paperless_mobile/core/widgets/offline_widget.dart';
|
||||
import 'package:paperless_mobile/extensions/flutter_extensions.dart';
|
||||
import 'package:paperless_mobile/features/document_details/bloc/document_details_cubit.dart';
|
||||
@@ -20,8 +20,6 @@ import 'package:paperless_mobile/features/documents/view/pages/document_view.dar
|
||||
import 'package:paperless_mobile/features/documents/view/widgets/delete_document_confirmation_dialog.dart';
|
||||
import 'package:paperless_mobile/features/documents/view/widgets/document_preview.dart';
|
||||
import 'package:paperless_mobile/features/edit_document/cubit/edit_document_cubit.dart';
|
||||
import 'package:paperless_mobile/features/labels/correspondent/view/widgets/correspondent_widget.dart';
|
||||
import 'package:paperless_mobile/features/labels/document_type/view/widgets/document_type_widget.dart';
|
||||
import 'package:paperless_mobile/features/labels/storage_path/view/widgets/storage_path_widget.dart';
|
||||
import 'package:paperless_mobile/features/labels/tags/view/widgets/tags_widget.dart';
|
||||
import 'package:paperless_mobile/features/labels/view/widgets/label_text.dart';
|
||||
@@ -75,9 +73,15 @@ class _DocumentDetailsPageState extends State<DocumentDetailsPage> {
|
||||
return b.Badge(
|
||||
position: b.BadgePosition.topEnd(top: -12, end: -6),
|
||||
showBadge: _filteredSuggestions.hasSuggestions,
|
||||
child: FloatingActionButton(
|
||||
child: const Icon(Icons.edit),
|
||||
onPressed: () => _onEdit(state.document),
|
||||
child: Tooltip(
|
||||
message:
|
||||
S.of(context).documentDetailsPageEditTooltip,
|
||||
preferBelow: false,
|
||||
verticalOffset: 40,
|
||||
child: FloatingActionButton(
|
||||
child: const Icon(Icons.edit),
|
||||
onPressed: () => _onEdit(state.document),
|
||||
),
|
||||
),
|
||||
badgeContent: Text(
|
||||
'${_filteredSuggestions.suggestionsCount}',
|
||||
@@ -86,7 +90,6 @@ class _DocumentDetailsPageState extends State<DocumentDetailsPage> {
|
||||
),
|
||||
),
|
||||
badgeColor: Colors.red,
|
||||
//TODO: Wait for stable version of m3, then use AlignmentDirectional.topEnd
|
||||
);
|
||||
},
|
||||
);
|
||||
@@ -104,33 +107,40 @@ class _DocumentDetailsPageState extends State<DocumentDetailsPage> {
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: [
|
||||
IconButton(
|
||||
tooltip:
|
||||
S.of(context).documentDetailsPageDeleteTooltip,
|
||||
icon: const Icon(Icons.delete),
|
||||
onPressed: widget.allowEdit && isConnected
|
||||
? () => _onDelete(state.document)
|
||||
: null,
|
||||
).paddedSymmetrically(horizontal: 4),
|
||||
Tooltip(
|
||||
message: "Download",
|
||||
message:
|
||||
S.of(context).documentDetailsPageDownloadTooltip,
|
||||
child: DocumentDownloadButton(
|
||||
document: state.document,
|
||||
enabled: isConnected,
|
||||
),
|
||||
),
|
||||
IconButton(
|
||||
tooltip:
|
||||
S.of(context).documentDetailsPagePreviewTooltip,
|
||||
icon: const Icon(Icons.visibility),
|
||||
onPressed: isConnected
|
||||
? () => _onOpen(state.document)
|
||||
: null,
|
||||
).paddedOnly(right: 4.0),
|
||||
// IconButton(
|
||||
// icon: const Icon(Icons.open_in_new),
|
||||
// onPressed: isConnected
|
||||
// ? context
|
||||
// .read<DocumentDetailsCubit>()
|
||||
// .openDocumentInSystemViewer
|
||||
// : null,
|
||||
// ).paddedOnly(right: 4.0),
|
||||
IconButton(
|
||||
tooltip: S
|
||||
.of(context)
|
||||
.documentDetailsPageOpenInSystemViewerTooltip,
|
||||
icon: const Icon(Icons.open_in_new),
|
||||
onPressed:
|
||||
isConnected ? _onOpenFileInSystemViewer : null,
|
||||
).paddedOnly(right: 4.0),
|
||||
IconButton(
|
||||
tooltip:
|
||||
S.of(context).documentDetailsPageShareTooltip,
|
||||
icon: const Icon(Icons.share),
|
||||
onPressed: isConnected
|
||||
? () => _onShare(state.document)
|
||||
@@ -270,6 +280,23 @@ class _DocumentDetailsPageState extends State<DocumentDetailsPage> {
|
||||
}
|
||||
}
|
||||
|
||||
void _onOpenFileInSystemViewer() async {
|
||||
final status =
|
||||
await context.read<DocumentDetailsCubit>().openDocumentInSystemViewer();
|
||||
if (status == ResultType.done) return;
|
||||
if (status == ResultType.noAppToOpen) {
|
||||
showGenericError(context,
|
||||
S.of(context).documentDetailsPageNoPdfViewerFoundErrorMessage);
|
||||
}
|
||||
if (status == ResultType.fileNotFound) {
|
||||
showGenericError(context, translateError(context, ErrorCode.unknown));
|
||||
}
|
||||
if (status == ResultType.permissionDenied) {
|
||||
showGenericError(context,
|
||||
S.of(context).documentDetailsPageOpenPdfPermissionDeniedErrorMessage);
|
||||
}
|
||||
}
|
||||
|
||||
Widget _buildDocumentMetaDataView(DocumentModel document) {
|
||||
return BlocBuilder<ConnectivityCubit, ConnectivityState>(
|
||||
builder: (context, state) {
|
||||
|
||||
@@ -84,8 +84,8 @@ class AdaptiveDocumentsView extends StatelessWidget {
|
||||
|
||||
Widget _buildGridView() {
|
||||
return SliverGrid.builder(
|
||||
gridDelegate: const SliverGridDelegateWithMaxCrossAxisExtent(
|
||||
maxCrossAxisExtent: 178,
|
||||
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
|
||||
crossAxisCount: 2,
|
||||
mainAxisSpacing: 4,
|
||||
crossAxisSpacing: 4,
|
||||
childAspectRatio: 1 / 2,
|
||||
|
||||
@@ -102,7 +102,7 @@ class _HomePageState extends State<HomePage> {
|
||||
final filename = extractFilenameFromPath(mediaFile.path);
|
||||
final extension = p.extension(mediaFile.path);
|
||||
try {
|
||||
if (File(mediaFile.path).existsSync()) {
|
||||
if (await File(mediaFile.path).exists()) {
|
||||
final bytes = File(mediaFile.path).readAsBytesSync();
|
||||
final success = await Navigator.push<bool>(
|
||||
context,
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:hydrated_bloc/hydrated_bloc.dart';
|
||||
import 'package:package_info_plus/package_info_plus.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/core/bloc/paperless_server_information_cubit.dart';
|
||||
@@ -280,22 +281,23 @@ class _AppDrawerState extends State<AppDrawer> {
|
||||
);
|
||||
}
|
||||
|
||||
void _onLogout() {
|
||||
void _onLogout() async {
|
||||
try {
|
||||
context.read<AuthenticationCubit>().logout();
|
||||
context.read<LocalVault>().clear();
|
||||
context.read<ApplicationSettingsCubit>().clear();
|
||||
context.read<LabelRepository<Tag, TagRepositoryState>>().clear();
|
||||
context
|
||||
await context.read<AuthenticationCubit>().logout();
|
||||
await context.read<LocalVault>().clear();
|
||||
await context.read<ApplicationSettingsCubit>().clear();
|
||||
await context.read<LabelRepository<Tag, TagRepositoryState>>().clear();
|
||||
await context
|
||||
.read<LabelRepository<Correspondent, CorrespondentRepositoryState>>()
|
||||
.clear();
|
||||
context
|
||||
await context
|
||||
.read<LabelRepository<DocumentType, DocumentTypeRepositoryState>>()
|
||||
.clear();
|
||||
context
|
||||
await context
|
||||
.read<LabelRepository<StoragePath, StoragePathRepositoryState>>()
|
||||
.clear();
|
||||
context.read<SavedViewRepository>().clear();
|
||||
await context.read<SavedViewRepository>().clear();
|
||||
await HydratedBloc.storage.clear();
|
||||
} on PaperlessServerException catch (error, stackTrace) {
|
||||
showErrorMessage(context, error, stackTrace);
|
||||
}
|
||||
|
||||
@@ -15,7 +15,7 @@ class TagWidget extends StatelessWidget {
|
||||
this.isClickable = true,
|
||||
required this.onSelected,
|
||||
this.showShortName = false,
|
||||
this.dense = false,
|
||||
this.dense = true,
|
||||
});
|
||||
|
||||
@override
|
||||
|
||||
@@ -45,7 +45,7 @@ class TagsWidget extends StatelessWidget {
|
||||
return Wrap(
|
||||
runAlignment: WrapAlignment.start,
|
||||
children: children,
|
||||
runSpacing: 8,
|
||||
runSpacing: 4,
|
||||
spacing: 4,
|
||||
);
|
||||
} else {
|
||||
|
||||
@@ -82,7 +82,7 @@ class _ScannerPageState extends State<ScannerPage>
|
||||
),
|
||||
)
|
||||
: null,
|
||||
icon: const Icon(Icons.preview),
|
||||
icon: const Icon(Icons.visibility),
|
||||
tooltip: S.of(context).documentScannerPageResetButtonTooltipText,
|
||||
);
|
||||
},
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import 'dart:collection';
|
||||
import 'dart:developer';
|
||||
|
||||
import 'package:flutter/widgets.dart';
|
||||
import 'package:receive_sharing_intent/receive_sharing_intent.dart';
|
||||
@@ -11,11 +12,14 @@ class ShareIntentQueue extends ChangeNotifier {
|
||||
static final instance = ShareIntentQueue._();
|
||||
|
||||
void add(SharedMediaFile file) {
|
||||
debugPrint("Adding received file to queue: ${file.path}");
|
||||
_queue.add(file);
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
void addAll(Iterable<SharedMediaFile> files) {
|
||||
debugPrint(
|
||||
"Adding received files to queue: ${files.map((e) => e.path).join(",")}");
|
||||
_queue.addAll(files);
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user