mirror of
https://github.com/Xevion/paperless-mobile.git
synced 2025-12-11 08:08:00 -06:00
Merge branch 'development'
This commit is contained in:
@@ -24,18 +24,275 @@
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
</intent-filter>
|
||||
<!-- Enables sharing image files "into" this app -->
|
||||
|
||||
|
||||
<!-- START Snippet from https://github.com/qcasey/paperless_share -->
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data android:mimeType="image/*" android:scheme="content" />
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data android:mimeType="image/*" android:scheme="file" />
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.SEND" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data android:mimeType="image/*" />
|
||||
</intent-filter>
|
||||
<!-- Enables sharing pdf files "into" this app -->
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.SEND_MULTIPLE" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data android:mimeType="image/*" />
|
||||
</intent-filter>
|
||||
|
||||
<!-- .pdf -->
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data android:mimeType="application/pdf" android:scheme="content" />
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data android:mimeType="application/pdf" android:scheme="file" />
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.SEND" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data android:mimeType="application/pdf" />
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.SEND_MULTIPLE" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data android:mimeType="application/pdf" />
|
||||
</intent-filter>
|
||||
|
||||
<!-- .doc -->
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data android:mimeType="application/msword" android:scheme="content" />
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data android:mimeType="application/msword" android:scheme="file" />
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.SEND" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data android:mimeType="application/msword" />
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.SEND_MULTIPLE" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data android:mimeType="application/msword" />
|
||||
</intent-filter>
|
||||
|
||||
<!-- .docx -->
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data
|
||||
android:mimeType="application/vnd.openxmlformats-officedocument.wordprocessingml.document"
|
||||
android:scheme="content" />
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data
|
||||
android:mimeType="application/vnd.openxmlformats-officedocument.wordprocessingml.document"
|
||||
android:scheme="file" />
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.SEND" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data
|
||||
android:mimeType="application/vnd.openxmlformats-officedocument.wordprocessingml.document" />
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.SEND_MULTIPLE" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data
|
||||
android:mimeType="application/vnd.openxmlformats-officedocument.wordprocessingml.document" />
|
||||
</intent-filter>
|
||||
|
||||
<!-- .odp -->
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data android:mimeType="application/vnd.oasis.opendocument.presentation"
|
||||
android:scheme="content" />
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data android:mimeType="application/vnd.oasis.opendocument.presentation"
|
||||
android:scheme="file" />
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.SEND" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data android:mimeType="application/vnd.oasis.opendocument.presentation" />
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.SEND_MULTIPLE" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data android:mimeType="application/vnd.oasis.opendocument.presentation" />
|
||||
</intent-filter>
|
||||
|
||||
<!-- .odt -->
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data android:mimeType="application/vnd.oasis.opendocument.text"
|
||||
android:scheme="content" />
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data android:mimeType="application/vnd.oasis.opendocument.text"
|
||||
android:scheme="file" />
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.SEND" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data android:mimeType="application/vnd.oasis.opendocument.text" />
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.SEND_MULTIPLE" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data android:mimeType="application/vnd.oasis.opendocument.text" />
|
||||
</intent-filter>
|
||||
|
||||
<!-- .ods -->
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data android:mimeType="application/vnd.oasis.opendocument.spreadsheet"
|
||||
android:scheme="content" />
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data android:mimeType="application/vnd.oasis.opendocument.spreadsheet"
|
||||
android:scheme="file" />
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.SEND" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data android:mimeType="application/vnd.oasis.opendocument.spreadsheet" />
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.SEND_MULTIPLE" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data android:mimeType="application/vnd.oasis.opendocument.spreadsheet" />
|
||||
</intent-filter>
|
||||
|
||||
<!-- .ppt -->
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data android:mimeType="application/vnd.ms-powerpoint" android:scheme="content" />
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data android:mimeType="application/vnd.ms-powerpoint" android:scheme="file" />
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.SEND" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data android:mimeType="application/vnd.ms-powerpoint" />
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.SEND_MULTIPLE" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data android:mimeType="application/vnd.ms-powerpoint" />
|
||||
</intent-filter>
|
||||
|
||||
<!-- .pptx -->
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data
|
||||
android:mimeType="application/vnd.openxmlformats-officedocument.presentationml.presentation"
|
||||
android:scheme="content" />
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data
|
||||
android:mimeType="application/vnd.openxmlformats-officedocument.presentationml.presentation"
|
||||
android:scheme="file" />
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.SEND" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data
|
||||
android:mimeType="application/vnd.openxmlformats-officedocument.presentationml.presentation" />
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.SEND_MULTIPLE" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data
|
||||
android:mimeType="application/vnd.openxmlformats-officedocument.presentationml.presentation" />
|
||||
</intent-filter>
|
||||
|
||||
<!-- .xls -->
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data android:mimeType="application/vnd.ms-excel" android:scheme="content" />
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data android:mimeType="application/vnd.ms-excel" android:scheme="file" />
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.SEND" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data android:mimeType="application/vnd.ms-excel" />
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.SEND_MULTIPLE" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data android:mimeType="application/vnd.ms-excel" />
|
||||
</intent-filter>
|
||||
|
||||
<!-- .xlsx -->
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data
|
||||
android:mimeType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
|
||||
android:scheme="content" />
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data
|
||||
android:mimeType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
|
||||
android:scheme="file" />
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.SEND" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data
|
||||
android:mimeType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" />
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.SEND_MULTIPLE" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data
|
||||
android:mimeType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" />
|
||||
</intent-filter>
|
||||
<!-- END Snippet from https://github.com/qcasey/paperless_share -->
|
||||
|
||||
</activity>
|
||||
<!-- Don't delete the meta-data below.
|
||||
This is used by the Flutter tool to
|
||||
|
||||
@@ -1,23 +1,35 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
///
|
||||
/// Workaround class to change background color of chips without losing ripple effect.
|
||||
/// Currently broken in flutter m3.
|
||||
/// Applies only to light theme if [applyToDarkTheme] is not explicitly set to true.
|
||||
///
|
||||
class ColoredChipWrapper extends StatelessWidget {
|
||||
////
|
||||
final Color? backgroundColor;
|
||||
final Widget child;
|
||||
final bool applyToDarkTheme;
|
||||
|
||||
const ColoredChipWrapper({
|
||||
super.key,
|
||||
this.backgroundColor,
|
||||
required this.child,
|
||||
this.applyToDarkTheme = false,
|
||||
});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
Color color = backgroundColor ?? Colors.lightGreen[50]!;
|
||||
|
||||
return Theme(
|
||||
data: Theme.of(context).copyWith(
|
||||
canvasColor: color,
|
||||
),
|
||||
child: child,
|
||||
);
|
||||
final brightness = Theme.of(context).brightness;
|
||||
if ((brightness == Brightness.dark && applyToDarkTheme) ||
|
||||
brightness == Brightness.light) {
|
||||
return Theme(
|
||||
data: Theme.of(context).copyWith(
|
||||
canvasColor: backgroundColor ?? Colors.lightGreen[50]!,
|
||||
),
|
||||
child: child,
|
||||
);
|
||||
}
|
||||
return child;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -16,7 +16,7 @@ import 'package:paperless_mobile/features/documents/view/widgets/new_items_loadi
|
||||
import 'package:paperless_mobile/features/documents/view/widgets/search/document_filter_panel.dart';
|
||||
import 'package:paperless_mobile/features/documents/view/widgets/selection/bulk_delete_confirmation_dialog.dart';
|
||||
import 'package:paperless_mobile/features/documents/view/widgets/sort_documents_button.dart';
|
||||
import 'package:paperless_mobile/features/home/view/widget/info_drawer.dart';
|
||||
import 'package:paperless_mobile/features/home/view/widget/app_drawer.dart';
|
||||
import 'package:paperless_mobile/features/labels/bloc/providers/labels_bloc_provider.dart';
|
||||
import 'package:paperless_mobile/features/login/bloc/authentication_cubit.dart';
|
||||
import 'package:paperless_mobile/features/saved_view/cubit/saved_view_cubit.dart';
|
||||
@@ -131,7 +131,7 @@ class _DocumentsPageState extends State<DocumentsPage> {
|
||||
return Scaffold(
|
||||
drawer: BlocProvider.value(
|
||||
value: context.read<AuthenticationCubit>(),
|
||||
child: InfoDrawer(
|
||||
child: AppDrawer(
|
||||
afterInboxClosed: () => context.read<DocumentsCubit>().reload(),
|
||||
),
|
||||
),
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -21,7 +21,7 @@ import 'package:paperless_mobile/features/documents/bloc/documents_cubit.dart';
|
||||
import 'package:paperless_mobile/features/documents/view/pages/documents_page.dart';
|
||||
import 'package:paperless_mobile/features/home/view/route_description.dart';
|
||||
import 'package:paperless_mobile/features/home/view/widget/bottom_navigation_bar.dart';
|
||||
import 'package:paperless_mobile/features/home/view/widget/info_drawer.dart';
|
||||
import 'package:paperless_mobile/features/home/view/widget/app_drawer.dart';
|
||||
import 'package:paperless_mobile/features/labels/view/pages/labels_page.dart';
|
||||
import 'package:paperless_mobile/features/notifications/services/local_notification_service.dart';
|
||||
import 'package:paperless_mobile/features/saved_view/cubit/saved_view_cubit.dart';
|
||||
@@ -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,
|
||||
@@ -238,7 +238,7 @@ class _HomePageState extends State<HomePage> {
|
||||
if (!sizingInformation.isMobile) {
|
||||
return Scaffold(
|
||||
key: rootScaffoldKey,
|
||||
drawer: const InfoDrawer(),
|
||||
drawer: const AppDrawer(),
|
||||
body: Row(
|
||||
children: [
|
||||
NavigationRail(
|
||||
@@ -266,7 +266,7 @@ class _HomePageState extends State<HomePage> {
|
||||
destinations:
|
||||
destinations.map((e) => e.toNavigationDestination()).toList(),
|
||||
),
|
||||
drawer: const InfoDrawer(),
|
||||
drawer: const AppDrawer(),
|
||||
body: routes[_currentIndex],
|
||||
);
|
||||
},
|
||||
|
||||
@@ -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';
|
||||
@@ -23,24 +24,24 @@ import 'package:paperless_mobile/util.dart';
|
||||
import 'package:url_launcher/link.dart';
|
||||
import 'package:url_launcher/url_launcher_string.dart';
|
||||
|
||||
class InfoDrawer extends StatefulWidget {
|
||||
class AppDrawer extends StatefulWidget {
|
||||
final VoidCallback? afterInboxClosed;
|
||||
|
||||
const InfoDrawer({Key? key, this.afterInboxClosed}) : super(key: key);
|
||||
const AppDrawer({Key? key, this.afterInboxClosed}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<InfoDrawer> createState() => _InfoDrawerState();
|
||||
State<AppDrawer> createState() => _AppDrawerState();
|
||||
}
|
||||
|
||||
enum NavigationDestinations {
|
||||
inbox,
|
||||
settings,
|
||||
reportBug,
|
||||
about,
|
||||
logout;
|
||||
}
|
||||
// enum NavigationDestinations {
|
||||
// inbox,
|
||||
// settings,
|
||||
// reportBug,
|
||||
// about,
|
||||
// logout;
|
||||
// }
|
||||
|
||||
class _InfoDrawerState extends State<InfoDrawer> {
|
||||
class _AppDrawerState extends State<AppDrawer> {
|
||||
late final Future<PackageInfo> _packageInfo;
|
||||
|
||||
@override
|
||||
@@ -219,7 +220,7 @@ class _InfoDrawerState extends State<InfoDrawer> {
|
||||
],
|
||||
),
|
||||
decoration: BoxDecoration(
|
||||
color: Theme.of(context).colorScheme.surfaceVariant,
|
||||
color: Theme.of(context).colorScheme.primaryContainer,
|
||||
),
|
||||
),
|
||||
...[
|
||||
@@ -280,22 +281,23 @@ class _InfoDrawerState extends State<InfoDrawer> {
|
||||
);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
@@ -80,6 +80,7 @@ class InboxCubit extends HydratedCubit<InboxState> with DocumentsPagingMixin {
|
||||
),
|
||||
);
|
||||
}
|
||||
emit(state.copyWith(inboxTags: inboxTags));
|
||||
return updateFilter(
|
||||
filter: DocumentFilter(
|
||||
sortField: SortField.added,
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -16,7 +16,7 @@ import 'package:paperless_mobile/features/edit_label/view/impl/edit_corresponden
|
||||
import 'package:paperless_mobile/features/edit_label/view/impl/edit_document_type_page.dart';
|
||||
import 'package:paperless_mobile/features/edit_label/view/impl/edit_storage_path_page.dart';
|
||||
import 'package:paperless_mobile/features/edit_label/view/impl/edit_tag_page.dart';
|
||||
import 'package:paperless_mobile/features/home/view/widget/info_drawer.dart';
|
||||
import 'package:paperless_mobile/features/home/view/widget/app_drawer.dart';
|
||||
import 'package:paperless_mobile/features/labels/bloc/providers/correspondent_bloc_provider.dart';
|
||||
import 'package:paperless_mobile/features/labels/bloc/providers/document_type_bloc_provider.dart';
|
||||
import 'package:paperless_mobile/features/labels/bloc/providers/storage_path_bloc_provider.dart';
|
||||
@@ -51,7 +51,7 @@ class _LabelsPageState extends State<LabelsPage>
|
||||
child: BlocBuilder<ConnectivityCubit, ConnectivityState>(
|
||||
builder: (context, connectedState) {
|
||||
return Scaffold(
|
||||
drawer: const InfoDrawer(),
|
||||
drawer: const AppDrawer(),
|
||||
appBar: AppBar(
|
||||
title: Text(
|
||||
[
|
||||
|
||||
@@ -22,7 +22,7 @@ import 'package:paperless_mobile/core/widgets/offline_banner.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/home/view/widget/info_drawer.dart';
|
||||
import 'package:paperless_mobile/features/home/view/widget/app_drawer.dart';
|
||||
import 'package:paperless_mobile/features/scan/bloc/document_scanner_cubit.dart';
|
||||
import 'package:paperless_mobile/features/scan/view/widgets/grid_image_item_widget.dart';
|
||||
import 'package:paperless_mobile/features/tasks/cubit/task_status_cubit.dart';
|
||||
@@ -47,7 +47,7 @@ class _ScannerPageState extends State<ScannerPage>
|
||||
return BlocBuilder<ConnectivityCubit, ConnectivityState>(
|
||||
builder: (context, connectedState) {
|
||||
return Scaffold(
|
||||
drawer: const InfoDrawer(),
|
||||
drawer: const AppDrawer(),
|
||||
floatingActionButton: FloatingActionButton(
|
||||
onPressed: () => _openDocumentScanner(context),
|
||||
child: const Icon(Icons.add_a_photo_outlined),
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -64,8 +64,24 @@
|
||||
"@documentDeleteSuccessMessage": {},
|
||||
"documentDetailsPageAssignAsnButtonLabel": "Přiřadit",
|
||||
"@documentDetailsPageAssignAsnButtonLabel": {},
|
||||
"documentDetailsPageLoadFullContentLabel": "",
|
||||
"documentDetailsPageDeleteTooltip": "Delete",
|
||||
"@documentDetailsPageDeleteTooltip": {},
|
||||
"documentDetailsPageDownloadTooltip": "Download",
|
||||
"@documentDetailsPageDownloadTooltip": {},
|
||||
"documentDetailsPageEditTooltip": "Edit",
|
||||
"@documentDetailsPageEditTooltip": {},
|
||||
"documentDetailsPageLoadFullContentLabel": "Načíst celý obsah",
|
||||
"@documentDetailsPageLoadFullContentLabel": {},
|
||||
"documentDetailsPageNoPdfViewerFoundErrorMessage": "No app to display PDF files found!",
|
||||
"@documentDetailsPageNoPdfViewerFoundErrorMessage": {},
|
||||
"documentDetailsPageOpenInSystemViewerTooltip": "Open in system viewer",
|
||||
"@documentDetailsPageOpenInSystemViewerTooltip": {},
|
||||
"documentDetailsPageOpenPdfPermissionDeniedErrorMessage": "Could not open file: Permission denied.",
|
||||
"@documentDetailsPageOpenPdfPermissionDeniedErrorMessage": {},
|
||||
"documentDetailsPagePreviewTooltip": "Preview",
|
||||
"@documentDetailsPagePreviewTooltip": {},
|
||||
"documentDetailsPageShareTooltip": "Share",
|
||||
"@documentDetailsPageShareTooltip": {},
|
||||
"documentDetailsPageSimilarDocumentsLabel": "Podobné dokumenty",
|
||||
"@documentDetailsPageSimilarDocumentsLabel": {},
|
||||
"documentDetailsPageTabContentLabel": "Obsah",
|
||||
@@ -78,7 +94,7 @@
|
||||
"@documentDocumentTypePropertyLabel": {},
|
||||
"documentDownloadSuccessMessage": "Dokument úspěšně stažen.",
|
||||
"@documentDownloadSuccessMessage": {},
|
||||
"documentEditPageSuggestionsLabel": "",
|
||||
"documentEditPageSuggestionsLabel": "Návrhy:",
|
||||
"@documentEditPageSuggestionsLabel": {},
|
||||
"documentEditPageTitle": "Upravit dokument",
|
||||
"@documentEditPageTitle": {},
|
||||
@@ -158,7 +174,7 @@
|
||||
"@documentsPageEmptyStateNothingHereText": {},
|
||||
"documentsPageEmptyStateOopsText": "Ajaj.",
|
||||
"@documentsPageEmptyStateOopsText": {},
|
||||
"documentsPageNewDocumentAvailableText": "",
|
||||
"documentsPageNewDocumentAvailableText": "Dostupný nový dokument!",
|
||||
"@documentsPageNewDocumentAvailableText": {},
|
||||
"documentsPageOrderByLabel": "Řadit dle",
|
||||
"@documentsPageOrderByLabel": {},
|
||||
@@ -200,7 +216,7 @@
|
||||
"@editLabelPageConfirmDeletionDialogTitle": {},
|
||||
"editLabelPageDeletionDialogText": "Dokumenty mají přiřazen tento štítek. Odstraněním štítku bude označení odstraněno. Pokračovat?",
|
||||
"@editLabelPageDeletionDialogText": {},
|
||||
"errorMessageAcknowledgeTasksError": "",
|
||||
"errorMessageAcknowledgeTasksError": "Could not acknowledge tasks.",
|
||||
"@errorMessageAcknowledgeTasksError": {},
|
||||
"errorMessageAuthenticationFailed": "Přihlášení selhalo, zkuste to znovu.",
|
||||
"@errorMessageAuthenticationFailed": {},
|
||||
@@ -258,7 +274,7 @@
|
||||
"@errorMessageStoragePathCreateFailed": {},
|
||||
"errorMessageStoragePathLoadFailed": "Nelze načíst cestu k úložišti.",
|
||||
"@errorMessageStoragePathLoadFailed": {},
|
||||
"errorMessageSuggestionsQueryError": "",
|
||||
"errorMessageSuggestionsQueryError": "Návrhy se nepodařilo načíst.",
|
||||
"@errorMessageSuggestionsQueryError": {},
|
||||
"errorMessageTagCreateFailed": "Nelze vytvořit tag, zkuste to znovu.",
|
||||
"@errorMessageTagCreateFailed": {},
|
||||
@@ -270,25 +286,25 @@
|
||||
"@errorMessageUnsupportedFileFormat": {},
|
||||
"errorReportLabel": "NAHLÁSIT",
|
||||
"@errorReportLabel": {},
|
||||
"extendedDateRangeDialogAbsoluteLabel": "",
|
||||
"extendedDateRangeDialogAbsoluteLabel": "Absolutní",
|
||||
"@extendedDateRangeDialogAbsoluteLabel": {},
|
||||
"extendedDateRangeDialogHintText": "",
|
||||
"extendedDateRangeDialogHintText": "Tip: Kromě konkrétního data lze také specifikovat relativní časovou odchylku k aktuálnímu datu.",
|
||||
"@extendedDateRangeDialogHintText": {},
|
||||
"extendedDateRangeDialogRelativeAmountLabel": "",
|
||||
"extendedDateRangeDialogRelativeAmountLabel": "Počet",
|
||||
"@extendedDateRangeDialogRelativeAmountLabel": {},
|
||||
"extendedDateRangeDialogRelativeLabel": "",
|
||||
"extendedDateRangeDialogRelativeLabel": "Relativní",
|
||||
"@extendedDateRangeDialogRelativeLabel": {},
|
||||
"extendedDateRangeDialogRelativeLastLabel": "",
|
||||
"extendedDateRangeDialogRelativeLastLabel": "Poslední",
|
||||
"@extendedDateRangeDialogRelativeLastLabel": {},
|
||||
"extendedDateRangeDialogRelativeTimeUnitLabel": "",
|
||||
"extendedDateRangeDialogRelativeTimeUnitLabel": "Časové jednotky",
|
||||
"@extendedDateRangeDialogRelativeTimeUnitLabel": {},
|
||||
"extendedDateRangeDialogTitle": "",
|
||||
"extendedDateRangeDialogTitle": "Vybrat časové rozmezí",
|
||||
"@extendedDateRangeDialogTitle": {},
|
||||
"extendedDateRangePickerAfterLabel": "",
|
||||
"extendedDateRangePickerAfterLabel": "Po",
|
||||
"@extendedDateRangePickerAfterLabel": {},
|
||||
"extendedDateRangePickerBeforeLabel": "",
|
||||
"extendedDateRangePickerBeforeLabel": "Před",
|
||||
"@extendedDateRangePickerBeforeLabel": {},
|
||||
"extendedDateRangePickerDayText": "{count, plural, other{}}",
|
||||
"extendedDateRangePickerDayText": "{count, plural, zero{} one{den} few{dny} many{dnů} other{}}",
|
||||
"@extendedDateRangePickerDayText": {
|
||||
"placeholders": {
|
||||
"count": {}
|
||||
@@ -306,9 +322,9 @@
|
||||
"count": {}
|
||||
}
|
||||
},
|
||||
"extendedDateRangePickerLastText": "",
|
||||
"extendedDateRangePickerLastText": "Poslední",
|
||||
"@extendedDateRangePickerLastText": {},
|
||||
"extendedDateRangePickerLastWeeksLabel": "{count, plural, other{}}",
|
||||
"extendedDateRangePickerLastWeeksLabel": "{count, plural, zero{} one{minulý týden} few{poslední {count} týdny} many{posledních {count} týdnů} other{}}",
|
||||
"@extendedDateRangePickerLastWeeksLabel": {
|
||||
"placeholders": {
|
||||
"count": {}
|
||||
@@ -320,25 +336,25 @@
|
||||
"count": {}
|
||||
}
|
||||
},
|
||||
"extendedDateRangePickerMonthText": "{count, plural, other{}}",
|
||||
"extendedDateRangePickerMonthText": "{count, plural, zero{} one{měsíc} few{mesíce} many{měsíců} other{}}",
|
||||
"@extendedDateRangePickerMonthText": {
|
||||
"placeholders": {
|
||||
"count": {}
|
||||
}
|
||||
},
|
||||
"extendedDateRangePickerWeekText": "{count, plural, other{}}",
|
||||
"extendedDateRangePickerWeekText": "{count, plural, zero{} one{týden} few{týdny} many{týdnů} other{}}",
|
||||
"@extendedDateRangePickerWeekText": {
|
||||
"placeholders": {
|
||||
"count": {}
|
||||
}
|
||||
},
|
||||
"extendedDateRangePickerYearText": "{count, plural, other{}}",
|
||||
"extendedDateRangePickerYearText": "{count, plural, zero{} one{rok} few{roky} many{let} other{}}",
|
||||
"@extendedDateRangePickerYearText": {
|
||||
"placeholders": {
|
||||
"count": {}
|
||||
}
|
||||
},
|
||||
"genericAcknowledgeLabel": "",
|
||||
"genericAcknowledgeLabel": "Rozumím!",
|
||||
"@genericAcknowledgeLabel": {},
|
||||
"genericActionCancelLabel": "Zrušit",
|
||||
"@genericActionCancelLabel": {},
|
||||
@@ -360,7 +376,7 @@
|
||||
"@genericActionUploadLabel": {},
|
||||
"genericMessageOfflineText": "Jste offline.",
|
||||
"@genericMessageOfflineText": {},
|
||||
"inboxPageAssignAsnLabel": "",
|
||||
"inboxPageAssignAsnLabel": "Assign ASN",
|
||||
"@inboxPageAssignAsnLabel": {},
|
||||
"inboxPageDocumentRemovedMessageText": "Dokument odstraněn z inboxu.",
|
||||
"@inboxPageDocumentRemovedMessageText": {},
|
||||
@@ -376,9 +392,9 @@
|
||||
"@inboxPageNoNewDocumentsRefreshLabel": {},
|
||||
"inboxPageNoNewDocumentsText": "Nemáte neshlédnuté dokumenty.",
|
||||
"@inboxPageNoNewDocumentsText": {},
|
||||
"inboxPageQuickActionsLabel": "",
|
||||
"inboxPageQuickActionsLabel": "Quick Action",
|
||||
"@inboxPageQuickActionsLabel": {},
|
||||
"inboxPageSuggestionSuccessfullyAppliedMessage": "",
|
||||
"inboxPageSuggestionSuccessfullyAppliedMessage": "Suggestion successfully applied.",
|
||||
"@inboxPageSuggestionSuccessfullyAppliedMessage": {},
|
||||
"inboxPageTodayText": "Dnes",
|
||||
"@inboxPageTodayText": {},
|
||||
@@ -442,7 +458,7 @@
|
||||
"@loginPageClientCertificateSettingLabel": {},
|
||||
"loginPageClientCertificateSettingSelectFileText": "Vybrat soubor...",
|
||||
"@loginPageClientCertificateSettingSelectFileText": {},
|
||||
"loginPageContinueLabel": "",
|
||||
"loginPageContinueLabel": "Pokračovat",
|
||||
"@loginPageContinueLabel": {},
|
||||
"loginPageIncorrectOrMissingCertificatePassphraseErrorMessageText": "Chybná nebo chybějící heslová fráze certifikátu.",
|
||||
"@loginPageIncorrectOrMissingCertificatePassphraseErrorMessageText": {},
|
||||
@@ -452,31 +468,31 @@
|
||||
"@loginPagePasswordFieldLabel": {},
|
||||
"loginPagePasswordValidatorMessageText": "Heslo nesmí být prázdné.",
|
||||
"@loginPagePasswordValidatorMessageText": {},
|
||||
"loginPageReachabilityConnectionTimeoutText": "",
|
||||
"loginPageReachabilityConnectionTimeoutText": "Čas spojení vypršel.",
|
||||
"@loginPageReachabilityConnectionTimeoutText": {},
|
||||
"loginPageReachabilityInvalidClientCertificateConfigurationText": "",
|
||||
"loginPageReachabilityInvalidClientCertificateConfigurationText": "Špatné nebo chybějící heslo certifikátu.",
|
||||
"@loginPageReachabilityInvalidClientCertificateConfigurationText": {},
|
||||
"loginPageReachabilityMissingClientCertificateText": "",
|
||||
"loginPageReachabilityMissingClientCertificateText": "A client certificate was expected but not sent. Please provide a certificate.",
|
||||
"@loginPageReachabilityMissingClientCertificateText": {},
|
||||
"loginPageReachabilityNotReachableText": "",
|
||||
"loginPageReachabilityNotReachableText": "Could not establish a connection to the server.",
|
||||
"@loginPageReachabilityNotReachableText": {},
|
||||
"loginPageReachabilitySuccessText": "",
|
||||
"loginPageReachabilitySuccessText": "Připojení úspěšně vytvořeno.",
|
||||
"@loginPageReachabilitySuccessText": {},
|
||||
"loginPageReachabilityUnresolvedHostText": "",
|
||||
"loginPageReachabilityUnresolvedHostText": "Host could not be resolved. Please check the server address and your internet connection. ",
|
||||
"@loginPageReachabilityUnresolvedHostText": {},
|
||||
"loginPageServerUrlFieldLabel": "'Adresa serveru",
|
||||
"@loginPageServerUrlFieldLabel": {},
|
||||
"loginPageServerUrlValidatorMessageInvalidAddressText": "",
|
||||
"loginPageServerUrlValidatorMessageInvalidAddressText": "Neplatná adresa",
|
||||
"@loginPageServerUrlValidatorMessageInvalidAddressText": {},
|
||||
"loginPageServerUrlValidatorMessageMissingSchemeText": "",
|
||||
"loginPageServerUrlValidatorMessageMissingSchemeText": "Server address must include a scheme.",
|
||||
"@loginPageServerUrlValidatorMessageMissingSchemeText": {},
|
||||
"loginPageServerUrlValidatorMessageRequiredText": "Adresa serveru nesmí být prázdná.",
|
||||
"@loginPageServerUrlValidatorMessageRequiredText": {},
|
||||
"loginPageSignInButtonLabel": "",
|
||||
"loginPageSignInButtonLabel": "Přihlásit",
|
||||
"@loginPageSignInButtonLabel": {},
|
||||
"loginPageSignInTitle": "",
|
||||
"loginPageSignInTitle": "Přihlásit",
|
||||
"@loginPageSignInTitle": {},
|
||||
"loginPageSignInToPrefixText": "",
|
||||
"loginPageSignInToPrefixText": "Přihlásit k {serverAddress}",
|
||||
"@loginPageSignInToPrefixText": {
|
||||
"placeholders": {
|
||||
"serverAddress": {}
|
||||
@@ -488,29 +504,29 @@
|
||||
"@loginPageUsernameLabel": {},
|
||||
"loginPageUsernameValidatorMessageText": "Jméno uživatele nesmí být prázdné.",
|
||||
"@loginPageUsernameValidatorMessageText": {},
|
||||
"matchingAlgorithmAllDescription": "",
|
||||
"matchingAlgorithmAllDescription": "Document contains all of these words",
|
||||
"@matchingAlgorithmAllDescription": {},
|
||||
"matchingAlgorithmAllName": "",
|
||||
"matchingAlgorithmAllName": "Vše",
|
||||
"@matchingAlgorithmAllName": {},
|
||||
"matchingAlgorithmAnyDescription": "",
|
||||
"matchingAlgorithmAnyDescription": "Document contains any of these words",
|
||||
"@matchingAlgorithmAnyDescription": {},
|
||||
"matchingAlgorithmAnyName": "",
|
||||
"matchingAlgorithmAnyName": "Jakékoliv slovo",
|
||||
"@matchingAlgorithmAnyName": {},
|
||||
"matchingAlgorithmAutoDescription": "",
|
||||
"matchingAlgorithmAutoDescription": "Learn matching automatically",
|
||||
"@matchingAlgorithmAutoDescription": {},
|
||||
"matchingAlgorithmAutoName": "",
|
||||
"matchingAlgorithmAutoName": "Auto",
|
||||
"@matchingAlgorithmAutoName": {},
|
||||
"matchingAlgorithmExactDescription": "",
|
||||
"matchingAlgorithmExactDescription": "Document contains this string",
|
||||
"@matchingAlgorithmExactDescription": {},
|
||||
"matchingAlgorithmExactName": "",
|
||||
"matchingAlgorithmExactName": "Exact",
|
||||
"@matchingAlgorithmExactName": {},
|
||||
"matchingAlgorithmFuzzyDescription": "",
|
||||
"matchingAlgorithmFuzzyDescription": "Document contains a word similar to this word",
|
||||
"@matchingAlgorithmFuzzyDescription": {},
|
||||
"matchingAlgorithmFuzzyName": "",
|
||||
"matchingAlgorithmFuzzyName": "Fuzzy",
|
||||
"@matchingAlgorithmFuzzyName": {},
|
||||
"matchingAlgorithmRegexDescription": "",
|
||||
"matchingAlgorithmRegexDescription": "Document matches this regular expression",
|
||||
"@matchingAlgorithmRegexDescription": {},
|
||||
"matchingAlgorithmRegexName": "",
|
||||
"matchingAlgorithmRegexName": "Regular Expression",
|
||||
"@matchingAlgorithmRegexName": {},
|
||||
"offlineWidgetText": "Nezdařilo se vytvořit připojení k internetu.",
|
||||
"@offlineWidgetText": {},
|
||||
@@ -518,7 +534,7 @@
|
||||
"@onboardingDoneButtonLabel": {},
|
||||
"onboardingNextButtonLabel": "Další",
|
||||
"@onboardingNextButtonLabel": {},
|
||||
"receiveSharedFilePermissionDeniedMessage": "",
|
||||
"receiveSharedFilePermissionDeniedMessage": "Přístup k obdrženému souboru zamítnut. Než budeš sdílet, zkus nejdříve otevřít aplikaci.",
|
||||
"@receiveSharedFilePermissionDeniedMessage": {},
|
||||
"referencedDocumentsReadOnlyHintText": "Tento náhled nelze upravovat! Nelze upravovat nebo odstraňovat dokumenty. Bude načteno maximálně 100 odkazovaných dokumentů.",
|
||||
"@referencedDocumentsReadOnlyHintText": {},
|
||||
@@ -582,12 +598,12 @@
|
||||
"@tagInboxTagPropertyLabel": {},
|
||||
"uploadPageAutomaticallInferredFieldsHintText": "Pokud specifikuješ hodnoty pro tato pole, paperless instance nebude automaticky přiřazovat naučené hodnoty. Pokud mají být tato pole automaticky vyplňována, nevyplňujte zde nic.",
|
||||
"@uploadPageAutomaticallInferredFieldsHintText": {},
|
||||
"verifyIdentityPageDescriptionText": "",
|
||||
"verifyIdentityPageDescriptionText": "Use the configured biometric factor to authenticate and unlock your documents.",
|
||||
"@verifyIdentityPageDescriptionText": {},
|
||||
"verifyIdentityPageLogoutButtonLabel": "",
|
||||
"verifyIdentityPageLogoutButtonLabel": "Odpojit",
|
||||
"@verifyIdentityPageLogoutButtonLabel": {},
|
||||
"verifyIdentityPageTitle": "",
|
||||
"verifyIdentityPageTitle": "Ověř svou identitu",
|
||||
"@verifyIdentityPageTitle": {},
|
||||
"verifyIdentityPageVerifyIdentityButtonLabel": "",
|
||||
"verifyIdentityPageVerifyIdentityButtonLabel": "Ověřit identitu",
|
||||
"@verifyIdentityPageVerifyIdentityButtonLabel": {}
|
||||
}
|
||||
@@ -64,8 +64,24 @@
|
||||
"@documentDeleteSuccessMessage": {},
|
||||
"documentDetailsPageAssignAsnButtonLabel": "Zuweisen",
|
||||
"@documentDetailsPageAssignAsnButtonLabel": {},
|
||||
"documentDetailsPageDeleteTooltip": "Löschen",
|
||||
"@documentDetailsPageDeleteTooltip": {},
|
||||
"documentDetailsPageDownloadTooltip": "Herunterladen",
|
||||
"@documentDetailsPageDownloadTooltip": {},
|
||||
"documentDetailsPageEditTooltip": "Bearbeiten",
|
||||
"@documentDetailsPageEditTooltip": {},
|
||||
"documentDetailsPageLoadFullContentLabel": "Lade gesamten Inhalt",
|
||||
"@documentDetailsPageLoadFullContentLabel": {},
|
||||
"documentDetailsPageNoPdfViewerFoundErrorMessage": "Es wurde keine App zum Anzeigen von PDF Dateien gefunden!",
|
||||
"@documentDetailsPageNoPdfViewerFoundErrorMessage": {},
|
||||
"documentDetailsPageOpenInSystemViewerTooltip": "In System-Viewer öffnen",
|
||||
"@documentDetailsPageOpenInSystemViewerTooltip": {},
|
||||
"documentDetailsPageOpenPdfPermissionDeniedErrorMessage": "Datei konnte nicht geöffnet werden: Zugriff verweigert.",
|
||||
"@documentDetailsPageOpenPdfPermissionDeniedErrorMessage": {},
|
||||
"documentDetailsPagePreviewTooltip": "Vorschau",
|
||||
"@documentDetailsPagePreviewTooltip": {},
|
||||
"documentDetailsPageShareTooltip": "Teilen",
|
||||
"@documentDetailsPageShareTooltip": {},
|
||||
"documentDetailsPageSimilarDocumentsLabel": "Similar Documents",
|
||||
"@documentDetailsPageSimilarDocumentsLabel": {},
|
||||
"documentDetailsPageTabContentLabel": "Inhalt",
|
||||
|
||||
@@ -64,8 +64,24 @@
|
||||
"@documentDeleteSuccessMessage": {},
|
||||
"documentDetailsPageAssignAsnButtonLabel": "Assign",
|
||||
"@documentDetailsPageAssignAsnButtonLabel": {},
|
||||
"documentDetailsPageDeleteTooltip": "Delete",
|
||||
"@documentDetailsPageDeleteTooltip": {},
|
||||
"documentDetailsPageDownloadTooltip": "Download",
|
||||
"@documentDetailsPageDownloadTooltip": {},
|
||||
"documentDetailsPageEditTooltip": "Edit",
|
||||
"@documentDetailsPageEditTooltip": {},
|
||||
"documentDetailsPageLoadFullContentLabel": "Load full content",
|
||||
"@documentDetailsPageLoadFullContentLabel": {},
|
||||
"documentDetailsPageNoPdfViewerFoundErrorMessage": "No app to display PDF files found!",
|
||||
"@documentDetailsPageNoPdfViewerFoundErrorMessage": {},
|
||||
"documentDetailsPageOpenInSystemViewerTooltip": "Open in system viewer",
|
||||
"@documentDetailsPageOpenInSystemViewerTooltip": {},
|
||||
"documentDetailsPageOpenPdfPermissionDeniedErrorMessage": "Could not open file: Permission denied.",
|
||||
"@documentDetailsPageOpenPdfPermissionDeniedErrorMessage": {},
|
||||
"documentDetailsPagePreviewTooltip": "Preview",
|
||||
"@documentDetailsPagePreviewTooltip": {},
|
||||
"documentDetailsPageShareTooltip": "Share",
|
||||
"@documentDetailsPageShareTooltip": {},
|
||||
"documentDetailsPageSimilarDocumentsLabel": "Similar Documents",
|
||||
"@documentDetailsPageSimilarDocumentsLabel": {},
|
||||
"documentDetailsPageTabContentLabel": "Content",
|
||||
@@ -288,7 +304,7 @@
|
||||
"@extendedDateRangePickerAfterLabel": {},
|
||||
"extendedDateRangePickerBeforeLabel": "Before",
|
||||
"@extendedDateRangePickerBeforeLabel": {},
|
||||
"extendedDateRangePickerDayText": "{count, plural, zero{} one{day} other{days}}",
|
||||
"extendedDateRangePickerDayText": "{count, plural, zero{days} one{day} other{days}}",
|
||||
"@extendedDateRangePickerDayText": {
|
||||
"placeholders": {
|
||||
"count": {}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"@@locale": "tr",
|
||||
"aboutDialogDevelopedByText": "",
|
||||
"aboutDialogDevelopedByText": "Developed by {name}",
|
||||
"@aboutDialogDevelopedByText": {
|
||||
"placeholders": {
|
||||
"name": {}
|
||||
@@ -50,7 +50,7 @@
|
||||
"@deleteViewDialogContentText": {},
|
||||
"deleteViewDialogTitleText": "Görünümü sil",
|
||||
"@deleteViewDialogTitleText": {},
|
||||
"documentAddedPropertyLabel": "",
|
||||
"documentAddedPropertyLabel": "Added at",
|
||||
"@documentAddedPropertyLabel": {},
|
||||
"documentArchiveSerialNumberPropertyLongLabel": "Arşiv Seri Numarası",
|
||||
"@documentArchiveSerialNumberPropertyLongLabel": {},
|
||||
@@ -58,14 +58,30 @@
|
||||
"@documentArchiveSerialNumberPropertyShortLabel": {},
|
||||
"documentCorrespondentPropertyLabel": "Ek Yazarlar",
|
||||
"@documentCorrespondentPropertyLabel": {},
|
||||
"documentCreatedPropertyLabel": "",
|
||||
"documentCreatedPropertyLabel": "Created at",
|
||||
"@documentCreatedPropertyLabel": {},
|
||||
"documentDeleteSuccessMessage": "Doküman başarıyla silindi.",
|
||||
"@documentDeleteSuccessMessage": {},
|
||||
"documentDetailsPageAssignAsnButtonLabel": "Ata",
|
||||
"@documentDetailsPageAssignAsnButtonLabel": {},
|
||||
"documentDetailsPageDeleteTooltip": "Delete",
|
||||
"@documentDetailsPageDeleteTooltip": {},
|
||||
"documentDetailsPageDownloadTooltip": "Download",
|
||||
"@documentDetailsPageDownloadTooltip": {},
|
||||
"documentDetailsPageEditTooltip": "Edit",
|
||||
"@documentDetailsPageEditTooltip": {},
|
||||
"documentDetailsPageLoadFullContentLabel": "Tüm içeriği yükle",
|
||||
"@documentDetailsPageLoadFullContentLabel": {},
|
||||
"documentDetailsPageNoPdfViewerFoundErrorMessage": "No app to display PDF files found!",
|
||||
"@documentDetailsPageNoPdfViewerFoundErrorMessage": {},
|
||||
"documentDetailsPageOpenInSystemViewerTooltip": "Open in system viewer",
|
||||
"@documentDetailsPageOpenInSystemViewerTooltip": {},
|
||||
"documentDetailsPageOpenPdfPermissionDeniedErrorMessage": "Could not open file: Permission denied.",
|
||||
"@documentDetailsPageOpenPdfPermissionDeniedErrorMessage": {},
|
||||
"documentDetailsPagePreviewTooltip": "Preview",
|
||||
"@documentDetailsPagePreviewTooltip": {},
|
||||
"documentDetailsPageShareTooltip": "Share",
|
||||
"@documentDetailsPageShareTooltip": {},
|
||||
"documentDetailsPageSimilarDocumentsLabel": "Benzer Belgeler",
|
||||
"@documentDetailsPageSimilarDocumentsLabel": {},
|
||||
"documentDetailsPageTabContentLabel": "İçerik",
|
||||
@@ -108,7 +124,7 @@
|
||||
"@documentMetaDataOriginalFileSizeLabel": {},
|
||||
"documentMetaDataOriginalMimeTypeLabel": "Orijinal MIME-Tipi",
|
||||
"@documentMetaDataOriginalMimeTypeLabel": {},
|
||||
"documentModifiedPropertyLabel": "",
|
||||
"documentModifiedPropertyLabel": "Modified at",
|
||||
"@documentModifiedPropertyLabel": {},
|
||||
"documentPreviewPageTitle": "Ön izleme",
|
||||
"@documentPreviewPageTitle": {},
|
||||
@@ -142,7 +158,7 @@
|
||||
"@documentsFilterPageDateRangeLastYearLabel": {},
|
||||
"documentsFilterPageQueryOptionsAsnLabel": "ASN",
|
||||
"@documentsFilterPageQueryOptionsAsnLabel": {},
|
||||
"documentsFilterPageQueryOptionsExtendedLabel": "",
|
||||
"documentsFilterPageQueryOptionsExtendedLabel": "Extended",
|
||||
"@documentsFilterPageQueryOptionsExtendedLabel": {},
|
||||
"documentsFilterPageQueryOptionsTitleAndContentLabel": "Başlık & İçerik",
|
||||
"@documentsFilterPageQueryOptionsTitleAndContentLabel": {},
|
||||
@@ -398,7 +414,7 @@
|
||||
"@labelIsInsensivitePropertyLabel": {},
|
||||
"labelMatchingAlgorithmPropertyLabel": "Eşleştirme Algoritması",
|
||||
"@labelMatchingAlgorithmPropertyLabel": {},
|
||||
"labelMatchPropertyLabel": "",
|
||||
"labelMatchPropertyLabel": "Match",
|
||||
"@labelMatchPropertyLabel": {},
|
||||
"labelNamePropertyLabel": "İsim",
|
||||
"@labelNamePropertyLabel": {},
|
||||
@@ -408,7 +424,7 @@
|
||||
"@labelsPageCorrespondentEmptyStateAddNewLabel": {},
|
||||
"labelsPageCorrespondentEmptyStateDescriptionText": "Herhangi bir ek yazar ayarlamamışsınız gibi görünüyor.",
|
||||
"@labelsPageCorrespondentEmptyStateDescriptionText": {},
|
||||
"labelsPageCorrespondentsTitleText": "",
|
||||
"labelsPageCorrespondentsTitleText": "Correspondents",
|
||||
"@labelsPageCorrespondentsTitleText": {},
|
||||
"labelsPageDocumentTypeEmptyStateAddNewLabel": "Yeni döküman türü ekle",
|
||||
"@labelsPageDocumentTypeEmptyStateAddNewLabel": {},
|
||||
@@ -488,29 +504,29 @@
|
||||
"@loginPageUsernameLabel": {},
|
||||
"loginPageUsernameValidatorMessageText": "Kullanıcı adı boş bırakılamaz.",
|
||||
"@loginPageUsernameValidatorMessageText": {},
|
||||
"matchingAlgorithmAllDescription": "",
|
||||
"matchingAlgorithmAllDescription": "Document contains all of these words",
|
||||
"@matchingAlgorithmAllDescription": {},
|
||||
"matchingAlgorithmAllName": "",
|
||||
"matchingAlgorithmAllName": "All",
|
||||
"@matchingAlgorithmAllName": {},
|
||||
"matchingAlgorithmAnyDescription": "",
|
||||
"matchingAlgorithmAnyDescription": "Document contains any of these words",
|
||||
"@matchingAlgorithmAnyDescription": {},
|
||||
"matchingAlgorithmAnyName": "",
|
||||
"matchingAlgorithmAnyName": "Any",
|
||||
"@matchingAlgorithmAnyName": {},
|
||||
"matchingAlgorithmAutoDescription": "",
|
||||
"matchingAlgorithmAutoDescription": "Learn matching automatically",
|
||||
"@matchingAlgorithmAutoDescription": {},
|
||||
"matchingAlgorithmAutoName": "",
|
||||
"matchingAlgorithmAutoName": "Auto",
|
||||
"@matchingAlgorithmAutoName": {},
|
||||
"matchingAlgorithmExactDescription": "",
|
||||
"matchingAlgorithmExactDescription": "Document contains this string",
|
||||
"@matchingAlgorithmExactDescription": {},
|
||||
"matchingAlgorithmExactName": "",
|
||||
"matchingAlgorithmExactName": "Exact",
|
||||
"@matchingAlgorithmExactName": {},
|
||||
"matchingAlgorithmFuzzyDescription": "",
|
||||
"matchingAlgorithmFuzzyDescription": "Document contains a word similar to this word",
|
||||
"@matchingAlgorithmFuzzyDescription": {},
|
||||
"matchingAlgorithmFuzzyName": "",
|
||||
"matchingAlgorithmFuzzyName": "Fuzzy",
|
||||
"@matchingAlgorithmFuzzyName": {},
|
||||
"matchingAlgorithmRegexDescription": "",
|
||||
"matchingAlgorithmRegexDescription": "Document matches this regular expression",
|
||||
"@matchingAlgorithmRegexDescription": {},
|
||||
"matchingAlgorithmRegexName": "",
|
||||
"matchingAlgorithmRegexName": "Regular Expression",
|
||||
"@matchingAlgorithmRegexName": {},
|
||||
"offlineWidgetText": "İnternet bağlantısı kurulamadı.",
|
||||
"@offlineWidgetText": {},
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
import 'dart:developer';
|
||||
|
||||
import 'package:connectivity_plus/connectivity_plus.dart';
|
||||
import 'package:encrypted_shared_preferences/encrypted_shared_preferences.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
@@ -132,6 +134,7 @@ void main() async {
|
||||
//Update language header in interceptor on language change.
|
||||
appSettingsCubit.stream.listen((event) => languageHeaderInterceptor
|
||||
.preferredLocaleSubtag = event.preferredLocaleSubtag);
|
||||
|
||||
runApp(
|
||||
MultiProvider(
|
||||
providers: [
|
||||
@@ -261,9 +264,6 @@ class _PaperlessMobileEntrypointState extends State<PaperlessMobileEntrypoint> {
|
||||
),
|
||||
),
|
||||
materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
|
||||
chipTheme: ChipThemeData(
|
||||
backgroundColor: Colors.lightGreen[50],
|
||||
),
|
||||
listTileTheme: const ListTileThemeData(
|
||||
tileColor: Colors.transparent,
|
||||
),
|
||||
|
||||
@@ -981,6 +981,14 @@ packages:
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.2"
|
||||
open_filex:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: open_filex
|
||||
sha256: "854aefd72dfd74219dc8c8d1767c34ec1eae64b8399a5be317bddb1ec2108915"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.3.2"
|
||||
package_config:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
||||
@@ -16,7 +16,7 @@ publish_to: "none" # Remove this line if you wish to publish to pub.dev
|
||||
# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
|
||||
# Read more about iOS versioning at
|
||||
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
|
||||
version: 1.5.1+14
|
||||
version: 1.5.2+15
|
||||
|
||||
environment:
|
||||
sdk: '>=3.0.0-35.0.dev <4.0.0'
|
||||
@@ -86,6 +86,7 @@ dependencies:
|
||||
flutter_local_notifications: ^13.0.0
|
||||
flutter_staggered_grid_view: ^0.6.2
|
||||
responsive_builder: ^0.4.3
|
||||
open_filex: ^4.3.2
|
||||
|
||||
dev_dependencies:
|
||||
integration_test:
|
||||
@@ -145,8 +146,10 @@ flutter:
|
||||
flutter_intl:
|
||||
enabled: true
|
||||
main_locale: en
|
||||
|
||||
localizely:
|
||||
project_id: 84b4144d-a628-4ba6-a8d0-4f9917444057
|
||||
download_empty_as: main
|
||||
|
||||
flutter_native_splash:
|
||||
image: assets/logos/paperless_logo_green.png
|
||||
|
||||
Reference in New Issue
Block a user