Documents
This commit is contained in:
parent
097866b269
commit
af8a7dab28
|
|
@ -1,12 +1,16 @@
|
||||||
// Dart imports:
|
// Dart imports:
|
||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
|
import 'dart:io' as file;
|
||||||
|
import 'dart:io';
|
||||||
|
|
||||||
// Flutter imports:
|
// Flutter imports:
|
||||||
import 'package:built_collection/built_collection.dart';
|
import 'package:built_collection/built_collection.dart';
|
||||||
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
// Package imports:
|
// Package imports:
|
||||||
import 'package:flutter_redux/flutter_redux.dart';
|
import 'package:flutter_redux/flutter_redux.dart';
|
||||||
|
import 'package:flutter_styled_toast/flutter_styled_toast.dart';
|
||||||
|
|
||||||
// Project imports:
|
// Project imports:
|
||||||
import 'package:invoiceninja_flutter/data/models/models.dart';
|
import 'package:invoiceninja_flutter/data/models/models.dart';
|
||||||
|
|
@ -16,9 +20,15 @@ import 'package:invoiceninja_flutter/redux/app/app_state.dart';
|
||||||
import 'package:invoiceninja_flutter/ui/app/entities/entity_actions_dialog.dart';
|
import 'package:invoiceninja_flutter/ui/app/entities/entity_actions_dialog.dart';
|
||||||
import 'package:invoiceninja_flutter/utils/completers.dart';
|
import 'package:invoiceninja_flutter/utils/completers.dart';
|
||||||
import 'package:invoiceninja_flutter/utils/localization.dart';
|
import 'package:invoiceninja_flutter/utils/localization.dart';
|
||||||
|
import 'package:invoiceninja_flutter/utils/platforms.dart';
|
||||||
|
import 'package:path_provider/path_provider.dart';
|
||||||
import 'package:pinch_zoom/pinch_zoom.dart';
|
import 'package:pinch_zoom/pinch_zoom.dart';
|
||||||
import 'package:printing/printing.dart';
|
import 'package:printing/printing.dart';
|
||||||
|
|
||||||
|
import 'package:invoiceninja_flutter/utils/web_stub.dart'
|
||||||
|
if (dart.library.html) 'package:invoiceninja_flutter/utils/web.dart';
|
||||||
|
import 'package:share_plus/share_plus.dart';
|
||||||
|
|
||||||
class ViewDocumentList implements PersistUI {
|
class ViewDocumentList implements PersistUI {
|
||||||
ViewDocumentList({
|
ViewDocumentList({
|
||||||
this.force = false,
|
this.force = false,
|
||||||
|
|
@ -406,6 +416,46 @@ void handleDocumentAction(
|
||||||
showDocument();
|
showDocument();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case EntityAction.download:
|
||||||
|
void downloadDocument() async {
|
||||||
|
final DocumentEntity document =
|
||||||
|
store.state.documentState.map[documentIds.first];
|
||||||
|
if (kIsWeb) {
|
||||||
|
WebUtils.downloadBinaryFile(document.name, document.data);
|
||||||
|
} else {
|
||||||
|
final directory = await (isDesktopOS()
|
||||||
|
? getDownloadsDirectory()
|
||||||
|
: getApplicationDocumentsDirectory());
|
||||||
|
|
||||||
|
String filePath =
|
||||||
|
'${directory.path}${file.Platform.pathSeparator}${document.name}';
|
||||||
|
|
||||||
|
if (file.File(filePath).existsSync()) {
|
||||||
|
final extension = document.name.split('.').last;
|
||||||
|
final timestamp = DateTime.now().millisecondsSinceEpoch;
|
||||||
|
filePath =
|
||||||
|
filePath.replaceFirst('.$extension', '_$timestamp.$extension');
|
||||||
|
}
|
||||||
|
|
||||||
|
await File(filePath).writeAsBytes(document.data);
|
||||||
|
|
||||||
|
if (isDesktopOS()) {
|
||||||
|
showToast(localization.fileSavedInPath
|
||||||
|
.replaceFirst(':path', directory.path));
|
||||||
|
} else {
|
||||||
|
await Share.shareXFiles([XFile(filePath)]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (document.data == null) {
|
||||||
|
store.dispatch(LoadDocumentData(
|
||||||
|
documentId: document.id,
|
||||||
|
completer: Completer<void>()
|
||||||
|
..future.then((value) => downloadDocument())));
|
||||||
|
} else {
|
||||||
|
downloadDocument();
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,3 @@
|
||||||
// Dart imports:
|
|
||||||
import 'dart:io';
|
|
||||||
import 'dart:io' as file;
|
|
||||||
|
|
||||||
// Flutter imports:
|
// Flutter imports:
|
||||||
import 'package:desktop_drop/desktop_drop.dart';
|
import 'package:desktop_drop/desktop_drop.dart';
|
||||||
import 'package:file_picker/file_picker.dart';
|
import 'package:file_picker/file_picker.dart';
|
||||||
|
|
@ -11,8 +7,6 @@ import 'package:flutter/material.dart';
|
||||||
// Package imports:
|
// Package imports:
|
||||||
import 'package:cached_network_image/cached_network_image.dart';
|
import 'package:cached_network_image/cached_network_image.dart';
|
||||||
import 'package:flutter_redux/flutter_redux.dart';
|
import 'package:flutter_redux/flutter_redux.dart';
|
||||||
import 'package:flutter_styled_toast/flutter_styled_toast.dart';
|
|
||||||
import 'package:http/http.dart' as http;
|
|
||||||
import 'package:http/http.dart';
|
import 'package:http/http.dart';
|
||||||
import 'package:image_cropper/image_cropper.dart';
|
import 'package:image_cropper/image_cropper.dart';
|
||||||
import 'package:image_picker/image_picker.dart';
|
import 'package:image_picker/image_picker.dart';
|
||||||
|
|
@ -20,13 +14,10 @@ import 'package:invoiceninja_flutter/redux/document/document_actions.dart';
|
||||||
import 'package:invoiceninja_flutter/ui/app/dashed_rect.dart';
|
import 'package:invoiceninja_flutter/ui/app/dashed_rect.dart';
|
||||||
import 'package:invoiceninja_flutter/utils/completers.dart';
|
import 'package:invoiceninja_flutter/utils/completers.dart';
|
||||||
import 'package:material_design_icons_flutter/material_design_icons_flutter.dart';
|
import 'package:material_design_icons_flutter/material_design_icons_flutter.dart';
|
||||||
import 'package:path_provider/path_provider.dart';
|
|
||||||
import 'package:permission_handler/permission_handler.dart';
|
import 'package:permission_handler/permission_handler.dart';
|
||||||
import 'package:share_plus/share_plus.dart';
|
|
||||||
|
|
||||||
// Project imports:
|
// Project imports:
|
||||||
import 'package:invoiceninja_flutter/data/models/models.dart';
|
import 'package:invoiceninja_flutter/data/models/models.dart';
|
||||||
import 'package:invoiceninja_flutter/data/web_client.dart';
|
|
||||||
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
|
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
|
||||||
import 'package:invoiceninja_flutter/ui/app/buttons/elevated_button.dart';
|
import 'package:invoiceninja_flutter/ui/app/buttons/elevated_button.dart';
|
||||||
import 'package:invoiceninja_flutter/ui/app/icon_text.dart';
|
import 'package:invoiceninja_flutter/ui/app/icon_text.dart';
|
||||||
|
|
@ -39,9 +30,6 @@ import 'package:invoiceninja_flutter/utils/icons.dart';
|
||||||
import 'package:invoiceninja_flutter/utils/localization.dart';
|
import 'package:invoiceninja_flutter/utils/localization.dart';
|
||||||
import 'package:invoiceninja_flutter/utils/platforms.dart';
|
import 'package:invoiceninja_flutter/utils/platforms.dart';
|
||||||
|
|
||||||
import 'package:invoiceninja_flutter/utils/web_stub.dart'
|
|
||||||
if (dart.library.html) 'package:invoiceninja_flutter/utils/web.dart';
|
|
||||||
|
|
||||||
class DocumentGrid extends StatefulWidget {
|
class DocumentGrid extends StatefulWidget {
|
||||||
const DocumentGrid({
|
const DocumentGrid({
|
||||||
@required this.documents,
|
@required this.documents,
|
||||||
|
|
@ -318,41 +306,8 @@ class DocumentTile extends StatelessWidget {
|
||||||
handleDocumentAction(context, [document],
|
handleDocumentAction(context, [document],
|
||||||
EntityAction.viewDocument);
|
EntityAction.viewDocument);
|
||||||
} else if (value == localization.download) {
|
} else if (value == localization.download) {
|
||||||
final http.Response response = await WebClient()
|
handleDocumentAction(
|
||||||
.get(document.url, state.credentials.token,
|
context, [document], EntityAction.download);
|
||||||
rawResponse: true);
|
|
||||||
|
|
||||||
if (kIsWeb) {
|
|
||||||
WebUtils.downloadBinaryFile(
|
|
||||||
document.name, response.bodyBytes);
|
|
||||||
} else {
|
|
||||||
final directory = await (isDesktopOS()
|
|
||||||
? getDownloadsDirectory()
|
|
||||||
: getApplicationDocumentsDirectory());
|
|
||||||
|
|
||||||
String filePath =
|
|
||||||
'${directory.path}${file.Platform.pathSeparator}${document.name}';
|
|
||||||
|
|
||||||
if (file.File(filePath).existsSync()) {
|
|
||||||
final extension =
|
|
||||||
document.name.split('.').last;
|
|
||||||
final timestamp =
|
|
||||||
DateTime.now().millisecondsSinceEpoch;
|
|
||||||
filePath = filePath.replaceFirst(
|
|
||||||
'.$extension',
|
|
||||||
'_$timestamp.$extension');
|
|
||||||
}
|
|
||||||
|
|
||||||
await File(filePath)
|
|
||||||
.writeAsBytes(response.bodyBytes);
|
|
||||||
|
|
||||||
if (isDesktopOS()) {
|
|
||||||
showToast(localization.fileSavedInPath
|
|
||||||
.replaceFirst(':path', directory.path));
|
|
||||||
} else {
|
|
||||||
await Share.shareXFiles([XFile(filePath)]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (value == localization.delete) {
|
} else if (value == localization.delete) {
|
||||||
confirmCallback(
|
confirmCallback(
|
||||||
context: context,
|
context: context,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue