mirror of
https://github.com/Xevion/paperless-mobile.git
synced 2025-12-06 15:15:50 -06:00
Externalized API and models as own package
This commit is contained in:
5
.gitignore
vendored
5
.gitignore
vendored
@@ -56,4 +56,7 @@ di_initializer.config.dart
|
||||
|
||||
# l10n generated files:
|
||||
lib/generated/*
|
||||
untranslated_messages.txt
|
||||
untranslated_messages.txt
|
||||
|
||||
#lakos generated files
|
||||
**/dot_images/*
|
||||
17
integration_test/login/login_integration_test.dart
Normal file
17
integration_test/login/login_integration_test.dart
Normal file
@@ -0,0 +1,17 @@
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:integration_test/integration_test.dart';
|
||||
|
||||
void main() {
|
||||
final binding = IntegrationTestWidgetsFlutterBinding.ensureInitialized();
|
||||
|
||||
testWidgets('screenshot', (WidgetTester tester) async {
|
||||
// Build the app.
|
||||
|
||||
// This is required prior to taking the screenshot (Android only).
|
||||
await binding.convertFlutterSurfaceToImage();
|
||||
|
||||
// Trigger a frame.
|
||||
await tester.pumpAndSettle();
|
||||
await binding.takeScreenshot('screenshot-1');
|
||||
});
|
||||
}
|
||||
@@ -1,17 +1,21 @@
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:injectable/injectable.dart';
|
||||
import 'package:paperless_mobile/core/model/paperless_server_information.dart';
|
||||
import 'package:paperless_mobile/core/service/paperless_server_information_service.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/core/bloc/paperless_server_information_state.dart';
|
||||
|
||||
@singleton
|
||||
class PaperlessServerInformationCubit
|
||||
extends Cubit<PaperlessServerInformation> {
|
||||
final PaperlessServerInformationService service;
|
||||
extends Cubit<PaperlessServerInformationState> {
|
||||
final PaperlessServerStatsApi service;
|
||||
|
||||
PaperlessServerInformationCubit(this.service)
|
||||
: super(PaperlessServerInformation());
|
||||
: super(PaperlessServerInformationState());
|
||||
|
||||
Future<void> updateInformtion() async {
|
||||
emit(await service.getInformation());
|
||||
final information = await service.getServerInformation();
|
||||
emit(PaperlessServerInformationState(
|
||||
isLoaded: true,
|
||||
information: information,
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
11
lib/core/bloc/paperless_server_information_state.dart
Normal file
11
lib/core/bloc/paperless_server_information_state.dart
Normal file
@@ -0,0 +1,11 @@
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
|
||||
class PaperlessServerInformationState {
|
||||
final bool isLoaded;
|
||||
final PaperlessServerInformationModel? information;
|
||||
|
||||
PaperlessServerInformationState({
|
||||
this.isLoaded = false,
|
||||
this.information,
|
||||
});
|
||||
}
|
||||
@@ -1,35 +1,32 @@
|
||||
import 'dart:developer';
|
||||
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:paperless_mobile/core/model/error_message.dart';
|
||||
import 'package:paperless_mobile/features/login/bloc/authentication_cubit.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/core/store/local_vault.dart';
|
||||
import 'package:http_interceptor/http_interceptor.dart';
|
||||
import 'package:injectable/injectable.dart';
|
||||
|
||||
@injectable
|
||||
class AuthenticationInterceptor implements InterceptorContract {
|
||||
AuthenticationCubit authenticationCubit;
|
||||
AuthenticationInterceptor(this.authenticationCubit);
|
||||
final LocalVault _localVault;
|
||||
AuthenticationInterceptor(this._localVault);
|
||||
|
||||
@override
|
||||
Future<BaseRequest> interceptRequest({required BaseRequest request}) async {
|
||||
final authState = authenticationCubit.state;
|
||||
final auth = await _localVault.loadAuthenticationInformation();
|
||||
|
||||
if (kDebugMode) {
|
||||
log("Intercepted ${request.method} request to ${request.url.toString()}");
|
||||
}
|
||||
if (authState.authentication == null) {
|
||||
throw const ErrorMessage(ErrorCode.notAuthenticated);
|
||||
if (auth == null) {
|
||||
throw const PaperlessServerException(ErrorCode.notAuthenticated);
|
||||
}
|
||||
return request.copyWith(
|
||||
//Append server Url
|
||||
url: Uri.parse(
|
||||
authState.authentication!.serverUrl + request.url.toString()),
|
||||
headers: authState.authentication!.token.isEmpty
|
||||
url: Uri.parse(auth.serverUrl + request.url.toString()),
|
||||
headers: auth.token.isEmpty
|
||||
? request.headers
|
||||
: {
|
||||
...request.headers,
|
||||
'Authorization': 'Token ${authState.authentication!.token}'
|
||||
},
|
||||
: {...request.headers, 'Authorization': 'Token ${auth.token}'},
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:paperless_mobile/core/model/error_message.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/generated/l10n.dart';
|
||||
|
||||
String translateError(BuildContext context, ErrorCode code) {
|
||||
|
||||
@@ -2,7 +2,7 @@ import 'dart:typed_data';
|
||||
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:paperless_mobile/core/model/error_message.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/core/service/connectivity_status.service.dart';
|
||||
import 'package:paperless_mobile/core/type/types.dart';
|
||||
import 'package:paperless_mobile/di_initializer.dart';
|
||||
@@ -24,8 +24,8 @@ class TimeoutClient implements BaseClient {
|
||||
Future<StreamedResponse> send(BaseRequest request) async {
|
||||
return getIt<BaseClient>().send(request).timeout(
|
||||
requestTimeout,
|
||||
onTimeout: () =>
|
||||
Future.error(const ErrorMessage(ErrorCode.requestTimedOut)),
|
||||
onTimeout: () => Future.error(
|
||||
const PaperlessServerException(ErrorCode.requestTimedOut)),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -47,8 +47,8 @@ class TimeoutClient implements BaseClient {
|
||||
.delete(url, headers: headers, body: body, encoding: encoding)
|
||||
.timeout(
|
||||
requestTimeout,
|
||||
onTimeout: () =>
|
||||
Future.error(const ErrorMessage(ErrorCode.requestTimedOut)),
|
||||
onTimeout: () => Future.error(
|
||||
const PaperlessServerException(ErrorCode.requestTimedOut)),
|
||||
),
|
||||
);
|
||||
}
|
||||
@@ -62,8 +62,8 @@ class TimeoutClient implements BaseClient {
|
||||
return _handle400Error(
|
||||
await getIt<BaseClient>().get(url, headers: headers).timeout(
|
||||
requestTimeout,
|
||||
onTimeout: () =>
|
||||
Future.error(const ErrorMessage(ErrorCode.requestTimedOut)),
|
||||
onTimeout: () => Future.error(
|
||||
const PaperlessServerException(ErrorCode.requestTimedOut)),
|
||||
),
|
||||
);
|
||||
}
|
||||
@@ -77,8 +77,8 @@ class TimeoutClient implements BaseClient {
|
||||
return _handle400Error(
|
||||
await getIt<BaseClient>().head(url, headers: headers).timeout(
|
||||
requestTimeout,
|
||||
onTimeout: () =>
|
||||
Future.error(const ErrorMessage(ErrorCode.requestTimedOut)),
|
||||
onTimeout: () => Future.error(
|
||||
const PaperlessServerException(ErrorCode.requestTimedOut)),
|
||||
),
|
||||
);
|
||||
}
|
||||
@@ -96,8 +96,8 @@ class TimeoutClient implements BaseClient {
|
||||
.patch(url, headers: headers, body: body, encoding: encoding)
|
||||
.timeout(
|
||||
requestTimeout,
|
||||
onTimeout: () =>
|
||||
Future.error(const ErrorMessage(ErrorCode.requestTimedOut)),
|
||||
onTimeout: () => Future.error(
|
||||
const PaperlessServerException(ErrorCode.requestTimedOut)),
|
||||
),
|
||||
);
|
||||
}
|
||||
@@ -115,8 +115,8 @@ class TimeoutClient implements BaseClient {
|
||||
.post(url, headers: headers, body: body, encoding: encoding)
|
||||
.timeout(
|
||||
requestTimeout,
|
||||
onTimeout: () =>
|
||||
Future.error(const ErrorMessage(ErrorCode.requestTimedOut)),
|
||||
onTimeout: () => Future.error(
|
||||
const PaperlessServerException(ErrorCode.requestTimedOut)),
|
||||
),
|
||||
);
|
||||
}
|
||||
@@ -134,8 +134,8 @@ class TimeoutClient implements BaseClient {
|
||||
.put(url, headers: headers, body: body, encoding: encoding)
|
||||
.timeout(
|
||||
requestTimeout,
|
||||
onTimeout: () =>
|
||||
Future.error(const ErrorMessage(ErrorCode.requestTimedOut)),
|
||||
onTimeout: () => Future.error(
|
||||
const PaperlessServerException(ErrorCode.requestTimedOut)),
|
||||
),
|
||||
);
|
||||
}
|
||||
@@ -148,8 +148,8 @@ class TimeoutClient implements BaseClient {
|
||||
await _handleOfflineState();
|
||||
return getIt<BaseClient>().read(url, headers: headers).timeout(
|
||||
requestTimeout,
|
||||
onTimeout: () =>
|
||||
Future.error(const ErrorMessage(ErrorCode.requestTimedOut)),
|
||||
onTimeout: () => Future.error(
|
||||
const PaperlessServerException(ErrorCode.requestTimedOut)),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -161,8 +161,8 @@ class TimeoutClient implements BaseClient {
|
||||
await _handleOfflineState();
|
||||
return getIt<BaseClient>().readBytes(url, headers: headers).timeout(
|
||||
requestTimeout,
|
||||
onTimeout: () =>
|
||||
Future.error(const ErrorMessage(ErrorCode.requestTimedOut)),
|
||||
onTimeout: () => Future.error(
|
||||
const PaperlessServerException(ErrorCode.requestTimedOut)),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -188,7 +188,7 @@ class TimeoutClient implements BaseClient {
|
||||
|
||||
Future<void> _handleOfflineState() async {
|
||||
if (!(await connectivityStatusService.isConnectedToInternet())) {
|
||||
throw const ErrorMessage(ErrorCode.deviceOffline);
|
||||
throw const PaperlessServerException(ErrorCode.deviceOffline);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import 'package:paperless_mobile/core/model/paperless_statistics.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
|
||||
class PaperlessStatisticsState {
|
||||
final bool isLoaded;
|
||||
final PaperlessStatistics? statistics;
|
||||
final PaperlessServerStatisticsModel? statistics;
|
||||
|
||||
PaperlessStatisticsState({
|
||||
required this.isLoaded,
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:paperless_mobile/core/model/error_message.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:path_provider/path_provider.dart';
|
||||
import 'package:uuid/uuid.dart';
|
||||
|
||||
@@ -12,7 +12,7 @@ class FileService {
|
||||
) async {
|
||||
final dir = await documentsDirectory;
|
||||
if (dir == null) {
|
||||
throw const ErrorMessage.unknown(); //TODO: better handling
|
||||
throw const PaperlessServerException.unknown(); //TODO: better handling
|
||||
}
|
||||
File file = File("${dir.path}/$filename");
|
||||
return file..writeAsBytes(bytes);
|
||||
|
||||
@@ -1,37 +0,0 @@
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:http/http.dart';
|
||||
import 'package:injectable/injectable.dart';
|
||||
import 'package:paperless_mobile/core/model/paperless_server_information.dart';
|
||||
import 'package:paperless_mobile/core/store/local_vault.dart';
|
||||
|
||||
@injectable
|
||||
class PaperlessServerInformationService {
|
||||
final BaseClient client;
|
||||
final LocalVault localStore;
|
||||
|
||||
PaperlessServerInformationService(
|
||||
@Named("timeoutClient") this.client,
|
||||
this.localStore,
|
||||
);
|
||||
|
||||
Future<PaperlessServerInformation> getInformation() async {
|
||||
final response = await client.get(Uri.parse("/api/ui_settings/"));
|
||||
final version =
|
||||
response.headers[PaperlessServerInformation.versionHeader] ?? 'unknown';
|
||||
final apiVersion = int.tryParse(
|
||||
response.headers[PaperlessServerInformation.apiVersionHeader] ?? '1');
|
||||
final String username =
|
||||
jsonDecode(utf8.decode(response.bodyBytes))['username'];
|
||||
final String? host =
|
||||
response.headers[PaperlessServerInformation.hostHeader] ??
|
||||
response.request?.headers[PaperlessServerInformation.hostHeader] ??
|
||||
('${response.request?.url.host}:${response.request?.url.port}');
|
||||
return PaperlessServerInformation(
|
||||
username: username,
|
||||
version: version,
|
||||
apiVersion: apiVersion,
|
||||
host: host,
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,29 +0,0 @@
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:http/http.dart';
|
||||
import 'package:injectable/injectable.dart';
|
||||
import 'package:paperless_mobile/core/model/error_message.dart';
|
||||
import 'package:paperless_mobile/core/model/paperless_statistics.dart';
|
||||
import 'package:paperless_mobile/core/type/types.dart';
|
||||
|
||||
abstract class PaperlessStatisticsService {
|
||||
Future<PaperlessStatistics> getStatistics();
|
||||
}
|
||||
|
||||
@Injectable(as: PaperlessStatisticsService)
|
||||
class PaperlessStatisticsServiceImpl extends PaperlessStatisticsService {
|
||||
final BaseClient client;
|
||||
|
||||
PaperlessStatisticsServiceImpl(@Named('timeoutClient') this.client);
|
||||
|
||||
@override
|
||||
Future<PaperlessStatistics> getStatistics() async {
|
||||
final response = await client.get(Uri.parse('/api/statistics/'));
|
||||
if (response.statusCode == 200) {
|
||||
return PaperlessStatistics.fromJson(
|
||||
jsonDecode(utf8.decode(response.bodyBytes)) as JSON,
|
||||
);
|
||||
}
|
||||
throw const ErrorMessage.unknown();
|
||||
}
|
||||
}
|
||||
@@ -3,14 +3,13 @@ import 'dart:io';
|
||||
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:http/http.dart';
|
||||
import 'package:injectable/injectable.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/core/bloc/document_status_cubit.dart';
|
||||
import 'package:paperless_mobile/core/model/document_processing_status.dart';
|
||||
import 'package:paperless_mobile/di_initializer.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/document.model.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/paged_search_result.dart';
|
||||
import 'package:paperless_mobile/features/login/model/authentication_information.dart';
|
||||
import 'package:paperless_mobile/util.dart';
|
||||
import 'package:injectable/injectable.dart';
|
||||
import 'package:web_socket_channel/io.dart';
|
||||
|
||||
abstract class StatusService {
|
||||
|
||||
@@ -3,6 +3,7 @@ import 'dart:io';
|
||||
import 'package:connectivity_plus/connectivity_plus.dart';
|
||||
import 'package:encrypted_shared_preferences/encrypted_shared_preferences.dart';
|
||||
import 'package:flutter_cache_manager/flutter_cache_manager.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/core/interceptor/authentication.interceptor.dart';
|
||||
import 'package:paperless_mobile/core/interceptor/language_header.interceptor.dart';
|
||||
import 'package:paperless_mobile/core/interceptor/response_conversion.interceptor.dart';
|
||||
@@ -51,4 +52,28 @@ abstract class RegisterModule {
|
||||
|
||||
CacheManager getCacheManager(BaseClient client) => CacheManager(
|
||||
Config('cacheKey', fileService: HttpFileService(httpClient: client)));
|
||||
|
||||
PaperlessAuthenticationApi authenticationModule(BaseClient client) =>
|
||||
PaperlessAuthenticationApiImpl(client);
|
||||
|
||||
PaperlessLabelsApi labelsModule(
|
||||
@Named('timeoutClient') BaseClient timeoutClient,
|
||||
) =>
|
||||
PaperlessLabelApiImpl(timeoutClient);
|
||||
|
||||
PaperlessDocumentsApi documentsModule(
|
||||
@Named('timeoutClient') BaseClient timeoutClient,
|
||||
HttpClient httpClient,
|
||||
) =>
|
||||
PaperlessDocumentsApiImpl(timeoutClient, httpClient);
|
||||
|
||||
PaperlessSavedViewsApi savedViewsModule(
|
||||
@Named('timeoutClient') BaseClient timeoutClient,
|
||||
) =>
|
||||
PaperlessSavedViewsApiImpl(timeoutClient);
|
||||
|
||||
PaperlessServerStatsApi serverStatsModule(
|
||||
@Named('timeoutClient') BaseClient timeoutClient,
|
||||
) =>
|
||||
PaperlessServerStatsApiImpl(timeoutClient);
|
||||
}
|
||||
|
||||
@@ -62,7 +62,7 @@ class _BiometricAuthenticationIntroSlideState
|
||||
final settings =
|
||||
BlocProvider.of<ApplicationSettingsCubit>(context)
|
||||
.state;
|
||||
getIt<AuthenticationService>()
|
||||
getIt<LocalAuthenticationService>()
|
||||
.authenticateLocalUser(
|
||||
"Please authenticate to secure Paperless Mobile")
|
||||
.then((isEnabled) {
|
||||
|
||||
@@ -1,29 +1,28 @@
|
||||
import 'package:bloc/bloc.dart';
|
||||
import 'package:equatable/equatable.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/document.model.dart';
|
||||
import 'package:paperless_mobile/features/documents/repository/document_repository.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
|
||||
part 'document_details_state.dart';
|
||||
|
||||
class DocumentDetailsCubit extends Cubit<DocumentDetailsState> {
|
||||
final DocumentRepository _documentRepository;
|
||||
final PaperlessDocumentsApi _api;
|
||||
|
||||
DocumentDetailsCubit(this._documentRepository, DocumentModel initialDocument)
|
||||
DocumentDetailsCubit(this._api, DocumentModel initialDocument)
|
||||
: super(DocumentDetailsState(document: initialDocument));
|
||||
|
||||
Future<void> delete(DocumentModel document) async {
|
||||
await _documentRepository.delete(document);
|
||||
await _api.delete(document);
|
||||
emit(const DocumentDetailsState());
|
||||
}
|
||||
|
||||
Future<void> update(DocumentModel document) async {
|
||||
final updatedDocument = await _documentRepository.update(document);
|
||||
final updatedDocument = await _api.update(document);
|
||||
emit(DocumentDetailsState(document: updatedDocument));
|
||||
}
|
||||
|
||||
Future<void> assignAsn(DocumentModel document) async {
|
||||
if (document.archiveSerialNumber == null) {
|
||||
final int asn = await _documentRepository.findNextAsn();
|
||||
final int asn = await _api.findNextAsn();
|
||||
update(document.copyWith(archiveSerialNumber: asn));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,14 +7,11 @@ import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:intl/date_symbol_data_local.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
import 'package:paperless_mobile/core/model/error_message.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/core/widgets/highlighted_text.dart';
|
||||
import 'package:paperless_mobile/di_initializer.dart';
|
||||
import 'package:paperless_mobile/extensions/flutter_extensions.dart';
|
||||
import 'package:paperless_mobile/features/document_details/bloc/document_details_cubit.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/document.model.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/document_meta_data.model.dart';
|
||||
import 'package:paperless_mobile/features/documents/repository/document_repository.dart';
|
||||
import 'package:paperless_mobile/features/documents/view/pages/document_edit_page.dart';
|
||||
import 'package:paperless_mobile/features/documents/view/pages/document_view.dart';
|
||||
import 'package:paperless_mobile/features/documents/view/widgets/delete_document_confirmation_dialog.dart';
|
||||
@@ -235,7 +232,7 @@ class _DocumentDetailsPageState extends State<DocumentDetailsPage> {
|
||||
|
||||
Widget _buildDocumentMetaDataView(DocumentModel document) {
|
||||
return FutureBuilder<DocumentMetaData>(
|
||||
future: getIt<DocumentRepository>().getMetaData(document),
|
||||
future: getIt<PaperlessDocumentsApi>().getMetaData(document),
|
||||
builder: (context, snapshot) {
|
||||
if (!snapshot.hasData) {
|
||||
return const Center(child: CircularProgressIndicator());
|
||||
@@ -295,7 +292,7 @@ class _DocumentDetailsPageState extends State<DocumentDetailsPage> {
|
||||
Future<void> _assignAsn(DocumentModel document) async {
|
||||
try {
|
||||
await BlocProvider.of<DocumentDetailsCubit>(context).assignAsn(document);
|
||||
} on ErrorMessage catch (error, stackTrace) {
|
||||
} on PaperlessServerException catch (error, stackTrace) {
|
||||
showErrorMessage(context, error, stackTrace);
|
||||
}
|
||||
}
|
||||
@@ -414,7 +411,7 @@ class _DocumentDetailsPageState extends State<DocumentDetailsPage> {
|
||||
return;
|
||||
}
|
||||
setState(() => _isDownloadPending = true);
|
||||
getIt<DocumentRepository>().download(document).then((bytes) async {
|
||||
getIt<PaperlessDocumentsApi>().download(document).then((bytes) async {
|
||||
final Directory dir = (await getExternalStorageDirectories(
|
||||
type: StorageDirectory.downloads))!
|
||||
.first;
|
||||
@@ -431,7 +428,7 @@ class _DocumentDetailsPageState extends State<DocumentDetailsPage> {
|
||||
///
|
||||
Future<void> _onShare(DocumentModel document) async {
|
||||
Uint8List documentBytes =
|
||||
await getIt<DocumentRepository>().download(document);
|
||||
await getIt<PaperlessDocumentsApi>().download(document);
|
||||
final dir = await getTemporaryDirectory();
|
||||
final String path = "${dir.path}/${document.originalFileName}";
|
||||
await File(path).writeAsBytes(documentBytes);
|
||||
@@ -459,7 +456,7 @@ class _DocumentDetailsPageState extends State<DocumentDetailsPage> {
|
||||
try {
|
||||
await BlocProvider.of<DocumentDetailsCubit>(context).delete(document);
|
||||
showSnackBar(context, S.of(context).documentDeleteSuccessMessage);
|
||||
} on ErrorMessage catch (error, stackTrace) {
|
||||
} on PaperlessServerException catch (error, stackTrace) {
|
||||
showErrorMessage(context, error, stackTrace);
|
||||
} finally {
|
||||
// Document deleted => go back to primary route
|
||||
@@ -472,7 +469,7 @@ class _DocumentDetailsPageState extends State<DocumentDetailsPage> {
|
||||
Navigator.of(context).push(
|
||||
MaterialPageRoute(
|
||||
builder: (context) => DocumentView(
|
||||
documentBytes: getIt<DocumentRepository>().getPreview(document.id),
|
||||
documentBytes: getIt<PaperlessDocumentsApi>().getPreview(document.id),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
@@ -2,21 +2,17 @@ import 'dart:typed_data';
|
||||
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:injectable/injectable.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/features/documents/bloc/documents_state.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/bulk_edit.model.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/document.model.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/document_filter.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/paged_search_result.dart';
|
||||
import 'package:paperless_mobile/features/documents/repository/document_repository.dart';
|
||||
|
||||
@singleton
|
||||
class DocumentsCubit extends Cubit<DocumentsState> {
|
||||
final DocumentRepository documentRepository;
|
||||
final PaperlessDocumentsApi _api;
|
||||
|
||||
DocumentsCubit(this.documentRepository) : super(DocumentsState.initial);
|
||||
DocumentsCubit(this._api) : super(DocumentsState.initial);
|
||||
|
||||
Future<void> bulkRemove(List<DocumentModel> documents) async {
|
||||
await documentRepository.bulkAction(
|
||||
await _api.bulkAction(
|
||||
BulkDeleteAction(documents.map((doc) => doc.id)),
|
||||
);
|
||||
await reload();
|
||||
@@ -27,7 +23,7 @@ class DocumentsCubit extends Cubit<DocumentsState> {
|
||||
Iterable<int> addTags = const [],
|
||||
Iterable<int> removeTags = const [],
|
||||
}) async {
|
||||
await documentRepository.bulkAction(BulkModifyTagsAction(
|
||||
await _api.bulkAction(BulkModifyTagsAction(
|
||||
documents.map((doc) => doc.id),
|
||||
addTags: addTags,
|
||||
removeTags: removeTags,
|
||||
@@ -40,13 +36,13 @@ class DocumentsCubit extends Cubit<DocumentsState> {
|
||||
bool updateRemote = true,
|
||||
]) async {
|
||||
if (updateRemote) {
|
||||
await documentRepository.update(document);
|
||||
await _api.update(document);
|
||||
}
|
||||
await reload();
|
||||
}
|
||||
|
||||
Future<void> load() async {
|
||||
final result = await documentRepository.find(state.filter);
|
||||
final result = await _api.find(state.filter);
|
||||
emit(DocumentsState(
|
||||
isLoaded: true,
|
||||
value: [...state.value, result],
|
||||
@@ -60,15 +56,14 @@ class DocumentsCubit extends Cubit<DocumentsState> {
|
||||
}
|
||||
var newPages = <PagedSearchResult>[];
|
||||
for (final page in state.value) {
|
||||
final result = await documentRepository
|
||||
.find(state.filter.copyWith(page: page.pageKey));
|
||||
final result = await _api.find(state.filter.copyWith(page: page.pageKey));
|
||||
newPages.add(result);
|
||||
}
|
||||
emit(DocumentsState(isLoaded: true, value: newPages, filter: state.filter));
|
||||
}
|
||||
|
||||
Future<void> _bulkReloadDocuments() async {
|
||||
final result = await documentRepository
|
||||
final result = await _api
|
||||
.find(state.filter.copyWith(page: 1, pageSize: state.documents.length));
|
||||
emit(DocumentsState(isLoaded: true, value: [result], filter: state.filter));
|
||||
}
|
||||
@@ -78,7 +73,7 @@ class DocumentsCubit extends Cubit<DocumentsState> {
|
||||
return;
|
||||
}
|
||||
final newFilter = state.filter.copyWith(page: state.filter.page + 1);
|
||||
final result = await documentRepository.find(newFilter);
|
||||
final result = await _api.find(newFilter);
|
||||
emit(
|
||||
DocumentsState(
|
||||
isLoaded: true, value: [...state.value, result], filter: newFilter),
|
||||
@@ -91,7 +86,7 @@ class DocumentsCubit extends Cubit<DocumentsState> {
|
||||
Future<void> updateFilter({
|
||||
final DocumentFilter filter = DocumentFilter.initial,
|
||||
}) async {
|
||||
final result = await documentRepository.find(filter.copyWith(page: 1));
|
||||
final result = await _api.find(filter.copyWith(page: 1));
|
||||
emit(DocumentsState(filter: filter, value: [result], isLoaded: true));
|
||||
}
|
||||
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
import 'package:equatable/equatable.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/document.model.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/document_filter.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/paged_search_result.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
|
||||
class DocumentsState extends Equatable {
|
||||
final bool isLoaded;
|
||||
|
||||
@@ -1,56 +0,0 @@
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:paperless_mobile/core/model/error_message.dart';
|
||||
import 'package:paperless_mobile/core/util.dart';
|
||||
import 'package:paperless_mobile/di_initializer.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/saved_view.model.dart';
|
||||
import 'package:http/http.dart';
|
||||
import 'package:injectable/injectable.dart';
|
||||
|
||||
abstract class SavedViewsRepository {
|
||||
Future<List<SavedView>> getAll();
|
||||
|
||||
Future<SavedView> save(SavedView view);
|
||||
Future<int> delete(SavedView view);
|
||||
}
|
||||
|
||||
@Injectable(as: SavedViewsRepository)
|
||||
class SavedViewRepositoryImpl implements SavedViewsRepository {
|
||||
final BaseClient httpClient;
|
||||
|
||||
SavedViewRepositoryImpl(@Named("timeoutClient") this.httpClient);
|
||||
|
||||
@override
|
||||
Future<List<SavedView>> getAll() {
|
||||
return getCollection(
|
||||
"/api/saved_views/",
|
||||
SavedView.fromJson,
|
||||
ErrorCode.loadSavedViewsError,
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<SavedView> save(SavedView view) async {
|
||||
final response = await httpClient.post(
|
||||
Uri.parse("/api/saved_views/"),
|
||||
body: jsonEncode(view.toJson()),
|
||||
headers: {'Content-Type': 'application/json'},
|
||||
);
|
||||
if (response.statusCode == 201) {
|
||||
return SavedView.fromJson(jsonDecode(utf8.decode(response.bodyBytes)));
|
||||
}
|
||||
throw ErrorMessage(ErrorCode.createSavedViewError,
|
||||
httpStatusCode: response.statusCode);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<int> delete(SavedView view) async {
|
||||
final response =
|
||||
await httpClient.delete(Uri.parse("/api/saved_views/${view.id}/"));
|
||||
if (response.statusCode == 204) {
|
||||
return view.id!;
|
||||
}
|
||||
throw ErrorMessage(ErrorCode.deleteSavedViewError,
|
||||
httpStatusCode: response.statusCode);
|
||||
}
|
||||
}
|
||||
@@ -6,26 +6,15 @@ import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:flutter_form_builder/flutter_form_builder.dart';
|
||||
import 'package:form_builder_validators/form_builder_validators.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
import 'package:paperless_mobile/core/model/error_message.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/di_initializer.dart';
|
||||
import 'package:paperless_mobile/extensions/flutter_extensions.dart';
|
||||
import 'package:paperless_mobile/features/documents/bloc/documents_cubit.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/document.model.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/query_parameters/correspondent_query.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/query_parameters/document_type_query.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/query_parameters/id_query_parameter.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/query_parameters/storage_path_query.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/query_parameters/tags_query.dart';
|
||||
import 'package:paperless_mobile/features/documents/repository/document_repository.dart';
|
||||
import 'package:paperless_mobile/features/labels/correspondent/bloc/correspondents_cubit.dart';
|
||||
import 'package:paperless_mobile/features/labels/correspondent/model/correspondent.model.dart';
|
||||
import 'package:paperless_mobile/features/labels/correspondent/view/pages/add_correspondent_page.dart';
|
||||
import 'package:paperless_mobile/features/labels/document_type/bloc/document_type_cubit.dart';
|
||||
import 'package:paperless_mobile/features/labels/document_type/model/document_type.model.dart';
|
||||
import 'package:paperless_mobile/features/labels/document_type/view/pages/add_document_type_page.dart';
|
||||
import 'package:paperless_mobile/features/labels/model/label_state.dart';
|
||||
import 'package:paperless_mobile/features/labels/bloc/label_state.dart';
|
||||
import 'package:paperless_mobile/features/labels/storage_path/bloc/storage_path_cubit.dart';
|
||||
import 'package:paperless_mobile/features/labels/storage_path/model/storage_path.model.dart';
|
||||
import 'package:paperless_mobile/features/labels/storage_path/view/pages/add_storage_path_page.dart';
|
||||
import 'package:paperless_mobile/features/labels/tags/view/widgets/tags_form_field.dart';
|
||||
import 'package:paperless_mobile/features/labels/view/widgets/label_form_field.dart';
|
||||
@@ -62,7 +51,8 @@ class _DocumentEditPageState extends State<DocumentEditPage> {
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
documentBytes = getIt<DocumentRepository>().getPreview(widget.document.id);
|
||||
documentBytes =
|
||||
getIt<PaperlessDocumentsApi>().getPreview(widget.document.id);
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -92,7 +82,7 @@ class _DocumentEditPageState extends State<DocumentEditPage> {
|
||||
try {
|
||||
await widget.onEdit(updatedDocument);
|
||||
showSnackBar(context, S.of(context).documentUpdateSuccessMessage);
|
||||
} on ErrorMessage catch (error, stackTrace) {
|
||||
} on PaperlessServerException catch (error, stackTrace) {
|
||||
showErrorMessage(context, error, stackTrace);
|
||||
} finally {
|
||||
setState(() {
|
||||
|
||||
@@ -1,8 +1,5 @@
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:paperless_mobile/di_initializer.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/document.model.dart';
|
||||
import 'package:paperless_mobile/features/documents/repository/document_repository.dart';
|
||||
import 'package:paperless_mobile/generated/l10n.dart';
|
||||
import 'package:pdfx/pdfx.dart';
|
||||
|
||||
|
||||
@@ -1,16 +1,13 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/core/bloc/connectivity_cubit.dart';
|
||||
import 'package:paperless_mobile/core/model/error_message.dart';
|
||||
import 'package:paperless_mobile/di_initializer.dart';
|
||||
import 'package:paperless_mobile/features/document_details/bloc/document_details_cubit.dart';
|
||||
import 'package:paperless_mobile/features/document_details/view/pages/document_details_page.dart';
|
||||
import 'package:paperless_mobile/features/documents/bloc/documents_cubit.dart';
|
||||
import 'package:paperless_mobile/features/documents/bloc/documents_state.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/document.model.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/query_parameters/tags_query.dart';
|
||||
import 'package:paperless_mobile/features/documents/repository/document_repository.dart';
|
||||
import 'package:paperless_mobile/features/documents/view/widgets/documents_empty_state.dart';
|
||||
import 'package:paperless_mobile/features/documents/view/widgets/grid/document_grid.dart';
|
||||
import 'package:paperless_mobile/features/documents/view/widgets/list/document_list.dart';
|
||||
@@ -48,7 +45,7 @@ class _DocumentsPageState extends State<DocumentsPage> {
|
||||
super.initState();
|
||||
try {
|
||||
BlocProvider.of<DocumentsCubit>(context).load();
|
||||
} on ErrorMessage catch (error, stackTrace) {
|
||||
} on PaperlessServerException catch (error, stackTrace) {
|
||||
showErrorMessage(context, error, stackTrace);
|
||||
}
|
||||
_pagingController.addPageRequestListener(_loadNewPage);
|
||||
@@ -69,7 +66,7 @@ class _DocumentsPageState extends State<DocumentsPage> {
|
||||
}
|
||||
try {
|
||||
await documentsCubit.loadMore();
|
||||
} on ErrorMessage catch (error, stackTrace) {
|
||||
} on PaperlessServerException catch (error, stackTrace) {
|
||||
showErrorMessage(context, error, stackTrace);
|
||||
}
|
||||
}
|
||||
@@ -83,7 +80,7 @@ class _DocumentsPageState extends State<DocumentsPage> {
|
||||
await BlocProvider.of<DocumentsCubit>(context).updateCurrentFilter(
|
||||
(filter) => filter.copyWith(page: 1),
|
||||
);
|
||||
} on ErrorMessage catch (error, stackTrace) {
|
||||
} on PaperlessServerException catch (error, stackTrace) {
|
||||
showErrorMessage(context, error, stackTrace);
|
||||
}
|
||||
}
|
||||
@@ -254,7 +251,8 @@ class _DocumentsPageState extends State<DocumentsPage> {
|
||||
value: BlocProvider.of<StoragePathCubit>(context),
|
||||
),
|
||||
BlocProvider.value(
|
||||
value: DocumentDetailsCubit(getIt<DocumentRepository>(), document),
|
||||
value:
|
||||
DocumentDetailsCubit(getIt<PaperlessDocumentsApi>(), document),
|
||||
),
|
||||
],
|
||||
child: const DocumentDetailsPage(),
|
||||
@@ -281,7 +279,7 @@ class _DocumentsPageState extends State<DocumentsPage> {
|
||||
),
|
||||
);
|
||||
}
|
||||
} on ErrorMessage catch (error, stackTrace) {
|
||||
} on PaperlessServerException catch (error, stackTrace) {
|
||||
showErrorMessage(context, error, stackTrace);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/document.model.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/generated/l10n.dart';
|
||||
|
||||
class DeleteDocumentConfirmationDialog extends StatelessWidget {
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import 'package:cached_network_image/cached_network_image.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_cache_manager/flutter_cache_manager.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/di_initializer.dart';
|
||||
import 'package:paperless_mobile/features/documents/repository/document_repository.dart';
|
||||
import 'package:shimmer/shimmer.dart';
|
||||
|
||||
class DocumentPreview extends StatelessWidget {
|
||||
@@ -30,7 +30,7 @@ class DocumentPreview extends StatelessWidget {
|
||||
fit: fit,
|
||||
alignment: Alignment.topCenter,
|
||||
cacheKey: "thumb_$id",
|
||||
imageUrl: getIt<DocumentRepository>().getThumbnailUrl(id),
|
||||
imageUrl: getIt<PaperlessDocumentsApi>().getThumbnailUrl(id),
|
||||
errorWidget: (ctxt, msg, __) => Text(msg),
|
||||
placeholder: (context, value) => Shimmer.fromColors(
|
||||
baseColor: Colors.grey[300]!,
|
||||
|
||||
@@ -1,13 +1,12 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/core/widgets/empty_state.dart';
|
||||
import 'package:paperless_mobile/extensions/flutter_extensions.dart';
|
||||
import 'package:paperless_mobile/features/documents/bloc/documents_cubit.dart';
|
||||
import 'package:paperless_mobile/features/documents/bloc/documents_state.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/document_filter.dart';
|
||||
import 'package:paperless_mobile/features/saved_view/bloc/saved_view_cubit.dart';
|
||||
import 'package:paperless_mobile/generated/l10n.dart';
|
||||
import 'package:paperless_mobile/util.dart';
|
||||
|
||||
class DocumentsEmptyState extends StatelessWidget {
|
||||
final DocumentsState state;
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/core/widgets/documents_list_loading_widget.dart';
|
||||
import 'package:paperless_mobile/features/documents/bloc/documents_state.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/document.model.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/query_parameters/tags_query.dart';
|
||||
import 'package:paperless_mobile/features/documents/view/widgets/grid/document_grid_item.dart';
|
||||
import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart';
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/document.model.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/features/documents/view/widgets/document_preview.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';
|
||||
|
||||
@@ -1,12 +1,10 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/core/widgets/documents_list_loading_widget.dart';
|
||||
import 'package:paperless_mobile/core/widgets/offline_widget.dart';
|
||||
import 'package:paperless_mobile/features/documents/bloc/documents_state.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/document.model.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/query_parameters/tags_query.dart';
|
||||
import 'package:paperless_mobile/features/documents/view/widgets/list/document_list_item.dart';
|
||||
import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart';
|
||||
import 'package:paperless_mobile/features/labels/tags/model/tag.model.dart';
|
||||
|
||||
class DocumentListView extends StatelessWidget {
|
||||
final void Function(DocumentModel) onTap;
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/document.model.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/features/documents/view/widgets/document_preview.dart';
|
||||
import 'package:paperless_mobile/features/labels/correspondent/view/widgets/correspondent_widget.dart';
|
||||
import 'package:paperless_mobile/features/labels/tags/model/tag.model.dart';
|
||||
import 'package:paperless_mobile/features/labels/tags/view/widgets/tags_widget.dart';
|
||||
|
||||
class DocumentListItem extends StatelessWidget {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_form_builder/flutter_form_builder.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/query_parameters/sort_field.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
|
||||
class OrderByDropdown extends StatefulWidget {
|
||||
static const fkOrderBy = "orderBy";
|
||||
|
||||
@@ -1,25 +1,15 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:flutter_form_builder/flutter_form_builder.dart';
|
||||
import 'package:paperless_mobile/core/model/error_message.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/extensions/flutter_extensions.dart';
|
||||
import 'package:paperless_mobile/features/documents/bloc/documents_cubit.dart';
|
||||
import 'package:paperless_mobile/features/documents/bloc/documents_state.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/document.model.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/document_filter.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/query_parameters/correspondent_query.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/query_parameters/document_type_query.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/query_parameters/query_type.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/query_parameters/storage_path_query.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/query_parameters/tags_query.dart';
|
||||
import 'package:paperless_mobile/features/documents/view/widgets/search/query_type_form_field.dart';
|
||||
import 'package:paperless_mobile/features/labels/correspondent/bloc/correspondents_cubit.dart';
|
||||
import 'package:paperless_mobile/features/labels/correspondent/model/correspondent.model.dart';
|
||||
import 'package:paperless_mobile/features/labels/document_type/bloc/document_type_cubit.dart';
|
||||
import 'package:paperless_mobile/features/labels/document_type/model/document_type.model.dart';
|
||||
import 'package:paperless_mobile/features/labels/model/label_state.dart';
|
||||
import 'package:paperless_mobile/features/labels/bloc/label_state.dart';
|
||||
import 'package:paperless_mobile/features/labels/storage_path/bloc/storage_path_cubit.dart';
|
||||
import 'package:paperless_mobile/features/labels/storage_path/model/storage_path.model.dart';
|
||||
import 'package:paperless_mobile/features/labels/tags/view/widgets/tags_form_field.dart';
|
||||
import 'package:paperless_mobile/features/labels/view/widgets/label_form_field.dart';
|
||||
import 'package:paperless_mobile/features/saved_view/bloc/saved_view_cubit.dart';
|
||||
@@ -468,7 +458,7 @@ class _DocumentFilterPanelState extends State<DocumentFilterPanel> {
|
||||
BlocProvider.of<SavedViewCubit>(context).resetSelection();
|
||||
FocusScope.of(context).unfocus();
|
||||
widget.panelController.close();
|
||||
} on ErrorMessage catch (error, stackTrace) {
|
||||
} on PaperlessServerException catch (error, stackTrace) {
|
||||
showErrorMessage(context, error, stackTrace);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_form_builder/flutter_form_builder.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/query_parameters/query_type.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/generated/l10n.dart';
|
||||
|
||||
class QueryTypeFormField extends StatelessWidget {
|
||||
|
||||
@@ -1,12 +1,9 @@
|
||||
import 'dart:developer';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/di_initializer.dart';
|
||||
import 'package:paperless_mobile/features/documents/bloc/documents_cubit.dart';
|
||||
import 'package:paperless_mobile/features/documents/bloc/documents_state.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/query_parameters/sort_field.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/query_parameters/sort_order.dart';
|
||||
import 'package:paperless_mobile/generated/l10n.dart';
|
||||
import 'package:paperless_mobile/extensions/flutter_extensions.dart';
|
||||
|
||||
@@ -20,16 +17,6 @@ class SortFieldSelectionBottomSheet extends StatefulWidget {
|
||||
|
||||
class _SortFieldSelectionBottomSheetState
|
||||
extends State<SortFieldSelectionBottomSheet> {
|
||||
static const _sortFields = [
|
||||
SortField.created,
|
||||
SortField.added,
|
||||
SortField.modified,
|
||||
SortField.title,
|
||||
SortField.correspondentName,
|
||||
SortField.documentType,
|
||||
SortField.archiveSerialNumber
|
||||
];
|
||||
|
||||
SortField? _selectedFieldLoading;
|
||||
SortOrder? _selectedOrderLoading;
|
||||
|
||||
@@ -49,7 +36,7 @@ class _SortFieldSelectionBottomSheetState
|
||||
).padded(
|
||||
const EdgeInsets.symmetric(horizontal: 16, vertical: 16)),
|
||||
Column(
|
||||
children: _sortFields
|
||||
children: SortField.values
|
||||
.map(
|
||||
(e) => _buildSortOption(
|
||||
e,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/features/documents/bloc/documents_state.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/document.model.dart';
|
||||
import 'package:paperless_mobile/generated/l10n.dart';
|
||||
|
||||
class BulkDeleteConfirmationDialog extends StatelessWidget {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/saved_view.model.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/generated/l10n.dart';
|
||||
|
||||
class ConfirmDeleteSavedViewDialog extends StatelessWidget {
|
||||
|
||||
@@ -1,12 +1,10 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:paperless_mobile/core/logic/error_code_localization_mapper.dart';
|
||||
import 'package:paperless_mobile/core/model/error_message.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/features/documents/bloc/documents_cubit.dart';
|
||||
import 'package:paperless_mobile/features/documents/bloc/documents_state.dart';
|
||||
import 'package:paperless_mobile/features/documents/view/widgets/selection/bulk_delete_confirmation_dialog.dart';
|
||||
import 'package:paperless_mobile/features/documents/view/widgets/selection/saved_view_selection_widget.dart';
|
||||
import 'package:paperless_mobile/features/documents/view/widgets/sort_documents_button.dart';
|
||||
import 'package:paperless_mobile/features/saved_view/view/saved_view_selection_widget.dart';
|
||||
import 'package:paperless_mobile/generated/l10n.dart';
|
||||
import 'package:paperless_mobile/util.dart';
|
||||
|
||||
@@ -104,7 +102,7 @@ class _DocumentsPageAppBarState extends State<DocumentsPageAppBar> {
|
||||
context,
|
||||
S.of(context).documentsPageBulkDeleteSuccessfulText,
|
||||
);
|
||||
} on ErrorMessage catch (error, stackTrace) {
|
||||
} on PaperlessServerException catch (error, stackTrace) {
|
||||
showErrorMessage(context, error, stackTrace);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,18 +1,8 @@
|
||||
import 'dart:developer';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:paperless_mobile/core/logic/error_code_localization_mapper.dart';
|
||||
import 'package:paperless_mobile/core/model/error_message.dart';
|
||||
import 'package:paperless_mobile/di_initializer.dart';
|
||||
import 'package:paperless_mobile/features/documents/bloc/documents_cubit.dart';
|
||||
import 'package:paperless_mobile/features/documents/bloc/documents_state.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/query_parameters/sort_field.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/query_parameters/sort_order.dart';
|
||||
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
|
||||
import 'package:paperless_mobile/features/documents/view/widgets/search/sort_field_selection_bottom_sheet.dart';
|
||||
import 'package:paperless_mobile/generated/l10n.dart';
|
||||
import 'package:paperless_mobile/util.dart';
|
||||
|
||||
class SortDocumentsButton extends StatefulWidget {
|
||||
const SortDocumentsButton({
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/core/bloc/connectivity_cubit.dart';
|
||||
import 'package:paperless_mobile/core/bloc/paperless_server_information_cubit.dart';
|
||||
import 'package:paperless_mobile/core/model/error_message.dart';
|
||||
import 'package:paperless_mobile/core/widgets/offline_banner.dart';
|
||||
import 'package:paperless_mobile/di_initializer.dart';
|
||||
import 'package:paperless_mobile/features/documents/bloc/documents_cubit.dart';
|
||||
@@ -90,7 +89,7 @@ class _HomePageState extends State<HomePage> {
|
||||
getIt<StoragePathCubit>().initialize(),
|
||||
getIt<SavedViewCubit>().initialize(),
|
||||
]);
|
||||
} on ErrorMessage catch (error, stackTrace) {
|
||||
} on PaperlessServerException catch (error, stackTrace) {
|
||||
showErrorMessage(context, error, stackTrace);
|
||||
return Future.error(error);
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/core/bloc/paperless_server_information_cubit.dart';
|
||||
import 'package:paperless_mobile/core/model/error_message.dart';
|
||||
import 'package:paperless_mobile/core/model/paperless_server_information.dart';
|
||||
import 'package:paperless_mobile/core/bloc/paperless_server_information_state.dart';
|
||||
import 'package:paperless_mobile/di_initializer.dart';
|
||||
import 'package:paperless_mobile/extensions/flutter_extensions.dart';
|
||||
import 'package:paperless_mobile/features/documents/bloc/documents_cubit.dart';
|
||||
@@ -67,8 +67,12 @@ class InfoDrawer extends StatelessWidget {
|
||||
Align(
|
||||
alignment: Alignment.bottomRight,
|
||||
child: BlocBuilder<PaperlessServerInformationCubit,
|
||||
PaperlessServerInformation>(
|
||||
PaperlessServerInformationState>(
|
||||
builder: (context, state) {
|
||||
if (!state.isLoaded) {
|
||||
return Container();
|
||||
}
|
||||
final info = state.information!;
|
||||
return Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.end,
|
||||
children: [
|
||||
@@ -77,7 +81,7 @@ class InfoDrawer extends StatelessWidget {
|
||||
dense: true,
|
||||
title: Text(
|
||||
S.of(context).appDrawerHeaderLoggedInAsText +
|
||||
(state.username ?? '?'),
|
||||
(info.username ?? '?'),
|
||||
style: Theme.of(context).textTheme.bodyText2,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
textAlign: TextAlign.end,
|
||||
@@ -87,7 +91,7 @@ class InfoDrawer extends StatelessWidget {
|
||||
crossAxisAlignment: CrossAxisAlignment.end,
|
||||
children: [
|
||||
Text(
|
||||
state.host ?? '',
|
||||
state.information!.host ?? '',
|
||||
style:
|
||||
Theme.of(context).textTheme.bodyText2,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
@@ -95,7 +99,7 @@ class InfoDrawer extends StatelessWidget {
|
||||
maxLines: 1,
|
||||
),
|
||||
Text(
|
||||
'${S.of(context).serverInformationPaperlessVersionText} ${state.version} (API v${state.apiVersion})',
|
||||
'${S.of(context).serverInformationPaperlessVersionText} ${info.version} (API v${info.apiVersion})',
|
||||
style: Theme.of(context).textTheme.caption,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
textAlign: TextAlign.end,
|
||||
@@ -189,7 +193,7 @@ class InfoDrawer extends StatelessWidget {
|
||||
getIt<DocumentTypeCubit>().reset();
|
||||
getIt<TagCubit>().reset();
|
||||
getIt<DocumentScannerCubit>().reset();
|
||||
} on ErrorMessage catch (error, stackTrace) {
|
||||
} on PaperlessServerException catch (error, stackTrace) {
|
||||
showErrorMessage(context, error, stackTrace);
|
||||
}
|
||||
},
|
||||
|
||||
@@ -1,28 +1,20 @@
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:injectable/injectable.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/bulk_edit.model.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/document.model.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/document_filter.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/query_parameters/sort_field.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/query_parameters/tags_query.dart';
|
||||
import 'package:paperless_mobile/features/documents/repository/document_repository.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/features/inbox/bloc/state/inbox_state.dart';
|
||||
import 'package:paperless_mobile/features/labels/repository/label_repository.dart';
|
||||
|
||||
@injectable
|
||||
class InboxCubit extends Cubit<InboxState> {
|
||||
final LabelRepository _labelRepository;
|
||||
final DocumentRepository _documentRepository;
|
||||
final PaperlessLabelsApi _labelApi;
|
||||
final PaperlessDocumentsApi _documentsApi;
|
||||
|
||||
InboxCubit(this._labelRepository, this._documentRepository)
|
||||
: super(const InboxState());
|
||||
InboxCubit(this._labelApi, this._documentsApi) : super(const InboxState());
|
||||
|
||||
///
|
||||
/// Fetches inbox tag ids and loads the inbox items (documents).
|
||||
///
|
||||
Future<void> loadInbox() async {
|
||||
final inboxTags = await _labelRepository.getTags().then(
|
||||
final inboxTags = await _labelApi.getTags().then(
|
||||
(tags) => tags.where((t) => t.isInboxTag ?? false).map((t) => t.id!),
|
||||
);
|
||||
if (inboxTags.isEmpty) {
|
||||
@@ -33,7 +25,7 @@ class InboxCubit extends Cubit<InboxState> {
|
||||
inboxTags: [],
|
||||
));
|
||||
}
|
||||
final inboxDocuments = await _documentRepository
|
||||
final inboxDocuments = await _documentsApi
|
||||
.find(DocumentFilter(
|
||||
tags: AnyAssignedTagsQuery(tagIds: inboxTags),
|
||||
sortField: SortField.added,
|
||||
@@ -57,7 +49,7 @@ class InboxCubit extends Cubit<InboxState> {
|
||||
|
||||
final updatedTags = {...document.tags}..removeAll(tagsToRemove);
|
||||
|
||||
await _documentRepository.update(
|
||||
await _documentsApi.update(
|
||||
document.copyWith(
|
||||
tags: updatedTags,
|
||||
overwriteTags: true,
|
||||
@@ -85,7 +77,7 @@ class InboxCubit extends Cubit<InboxState> {
|
||||
tags: {...document.tags, ...removedTags},
|
||||
overwriteTags: true,
|
||||
);
|
||||
await _documentRepository.update(updatedDoc);
|
||||
await _documentsApi.update(updatedDoc);
|
||||
emit(
|
||||
InboxState(
|
||||
isLoaded: true,
|
||||
@@ -100,7 +92,7 @@ class InboxCubit extends Cubit<InboxState> {
|
||||
/// Removes inbox tags from all documents in the inbox.
|
||||
///
|
||||
Future<void> clearInbox() async {
|
||||
await _documentRepository.bulkAction(
|
||||
await _documentsApi.bulkAction(
|
||||
BulkModifyTagsAction.removeTags(
|
||||
state.inboxItems.map((e) => e.id),
|
||||
state.inboxTags,
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import 'package:equatable/equatable.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/document.model.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
|
||||
class InboxState with EquatableMixin {
|
||||
final bool isLoaded;
|
||||
|
||||
@@ -1,19 +1,18 @@
|
||||
import 'package:collection/collection.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:intl/date_symbol_data_local.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
import 'package:paperless_mobile/core/model/error_message.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/core/widgets/documents_list_loading_widget.dart';
|
||||
import 'package:paperless_mobile/extensions/dart_extensions.dart';
|
||||
import 'package:paperless_mobile/extensions/flutter_extensions.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/document.model.dart';
|
||||
import 'package:paperless_mobile/features/inbox/bloc/inbox_cubit.dart';
|
||||
import 'package:paperless_mobile/features/inbox/bloc/state/inbox_state.dart';
|
||||
import 'package:paperless_mobile/features/inbox/view/widgets/inbox_item.dart';
|
||||
import 'package:paperless_mobile/features/inbox/view/widgets/inbox_empty_widget.dart';
|
||||
import 'package:paperless_mobile/features/inbox/view/widgets/inbox_item.dart';
|
||||
import 'package:paperless_mobile/generated/l10n.dart';
|
||||
import 'package:paperless_mobile/util.dart';
|
||||
import 'package:collection/collection.dart';
|
||||
import 'package:paperless_mobile/extensions/dart_extensions.dart';
|
||||
|
||||
class InboxPage extends StatefulWidget {
|
||||
const InboxPage({super.key});
|
||||
@@ -230,13 +229,13 @@ class _InboxPageState extends State<InboxPage> {
|
||||
),
|
||||
);
|
||||
return true;
|
||||
} on ErrorMessage catch (error, stackTrace) {
|
||||
} on PaperlessServerException catch (error, stackTrace) {
|
||||
showErrorMessage(context, error, stackTrace);
|
||||
return false;
|
||||
} catch (error) {
|
||||
showErrorMessage(
|
||||
context,
|
||||
const ErrorMessage.unknown(),
|
||||
const PaperlessServerException.unknown(),
|
||||
);
|
||||
return false;
|
||||
}
|
||||
@@ -249,7 +248,7 @@ class _InboxPageState extends State<InboxPage> {
|
||||
try {
|
||||
await BlocProvider.of<InboxCubit>(context)
|
||||
.undoRemove(document, removedTags);
|
||||
} on ErrorMessage catch (error, stackTrace) {
|
||||
} on PaperlessServerException catch (error, stackTrace) {
|
||||
showErrorMessage(context, error, stackTrace);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:paperless_mobile/features/inbox/bloc/inbox_cubit.dart';
|
||||
import 'package:paperless_mobile/generated/l10n.dart';
|
||||
|
||||
class InboxEmptyWidget extends StatelessWidget {
|
||||
const InboxEmptyWidget({
|
||||
@@ -22,11 +23,11 @@ class InboxEmptyWidget extends StatelessWidget {
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
Text('You do not have unseen documents.'),
|
||||
Text(S.of(context).inboxPageNoNewDocumentsText),
|
||||
TextButton(
|
||||
onPressed: () =>
|
||||
_emptyStateRefreshIndicatorKey.currentState?.show(),
|
||||
child: Text('Refresh'),
|
||||
child: Text(S.of(context).inboxPageNoNewDocumentsRefreshLabel),
|
||||
),
|
||||
],
|
||||
),
|
||||
|
||||
@@ -1,12 +1,11 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/di_initializer.dart';
|
||||
import 'package:paperless_mobile/features/document_details/bloc/document_details_cubit.dart';
|
||||
import 'package:paperless_mobile/features/documents/bloc/documents_cubit.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/document.model.dart';
|
||||
import 'package:paperless_mobile/features/document_details/view/pages/document_details_page.dart';
|
||||
import 'package:paperless_mobile/features/documents/repository/document_repository.dart';
|
||||
import 'package:paperless_mobile/features/documents/view/widgets/document_preview.dart';
|
||||
import 'package:paperless_mobile/features/labels/bloc/global_state_bloc_provider.dart';
|
||||
import 'package:paperless_mobile/features/labels/tags/view/widgets/tags_widget.dart';
|
||||
@@ -54,7 +53,7 @@ class InboxItem extends StatelessWidget {
|
||||
additionalProviders: [
|
||||
BlocProvider<DocumentDetailsCubit>(
|
||||
create: (context) => DocumentDetailsCubit(
|
||||
getIt<DocumentRepository>(),
|
||||
getIt<PaperlessDocumentsApi>(),
|
||||
document,
|
||||
),
|
||||
),
|
||||
|
||||
@@ -1,13 +1,12 @@
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:paperless_mobile/features/labels/model/label.model.dart';
|
||||
import 'package:paperless_mobile/features/labels/model/label_state.dart';
|
||||
import 'package:paperless_mobile/features/labels/repository/label_repository.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/features/labels/bloc/label_state.dart';
|
||||
|
||||
abstract class LabelCubit<T extends Label> extends Cubit<LabelState<T>> {
|
||||
final LabelRepository labelRepository;
|
||||
final PaperlessLabelsApi labelsApi;
|
||||
|
||||
LabelCubit(this.labelRepository) : super(LabelState.initial());
|
||||
LabelCubit(this.labelsApi) : super(LabelState.initial());
|
||||
|
||||
@protected
|
||||
void loadFrom(Iterable<T> items) {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import 'package:paperless_mobile/features/labels/model/label.model.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
|
||||
class LabelState<T extends Label> {
|
||||
LabelState.initial() : this(isLoaded: false, labels: {});
|
||||
@@ -1,5 +1,5 @@
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/features/labels/bloc/label_cubit.dart';
|
||||
import 'package:paperless_mobile/features/labels/correspondent/model/correspondent.model.dart';
|
||||
import 'package:injectable/injectable.dart';
|
||||
|
||||
@singleton
|
||||
@@ -8,18 +8,17 @@ class CorrespondentCubit extends LabelCubit<Correspondent> {
|
||||
|
||||
@override
|
||||
Future<void> initialize() async {
|
||||
return labelRepository.getCorrespondents().then(loadFrom);
|
||||
return labelsApi.getCorrespondents().then(loadFrom);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<Correspondent> save(Correspondent item) =>
|
||||
labelRepository.saveCorrespondent(item);
|
||||
labelsApi.saveCorrespondent(item);
|
||||
|
||||
@override
|
||||
Future<Correspondent> update(Correspondent item) =>
|
||||
labelRepository.updateCorrespondent(item);
|
||||
labelsApi.updateCorrespondent(item);
|
||||
|
||||
@override
|
||||
Future<int> delete(Correspondent item) =>
|
||||
labelRepository.deleteCorrespondent(item);
|
||||
Future<int> delete(Correspondent item) => labelsApi.deleteCorrespondent(item);
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import 'package:flutter/widgets.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/features/labels/correspondent/bloc/correspondents_cubit.dart';
|
||||
import 'package:paperless_mobile/features/labels/correspondent/model/correspondent.model.dart';
|
||||
import 'package:paperless_mobile/features/labels/view/pages/add_label_page.dart';
|
||||
import 'package:paperless_mobile/generated/l10n.dart';
|
||||
|
||||
|
||||
@@ -1,11 +1,8 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:paperless_mobile/core/logic/error_code_localization_mapper.dart';
|
||||
import 'package:paperless_mobile/core/model/error_message.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/features/documents/bloc/documents_cubit.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/query_parameters/correspondent_query.dart';
|
||||
import 'package:paperless_mobile/features/labels/correspondent/bloc/correspondents_cubit.dart';
|
||||
import 'package:paperless_mobile/features/labels/correspondent/model/correspondent.model.dart';
|
||||
import 'package:paperless_mobile/features/labels/view/pages/edit_label_page.dart';
|
||||
import 'package:paperless_mobile/util.dart';
|
||||
|
||||
@@ -38,7 +35,7 @@ class EditCorrespondentPage extends StatelessWidget {
|
||||
);
|
||||
}
|
||||
Navigator.pop(context);
|
||||
} on ErrorMessage catch (error, stackTrace) {
|
||||
} on PaperlessServerException catch (error, stackTrace) {
|
||||
showErrorMessage(context, error, stackTrace);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,12 +1,9 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:paperless_mobile/core/model/error_message.dart';
|
||||
import 'package:paperless_mobile/di_initializer.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/features/documents/bloc/documents_cubit.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/query_parameters/correspondent_query.dart';
|
||||
import 'package:paperless_mobile/features/labels/correspondent/bloc/correspondents_cubit.dart';
|
||||
import 'package:paperless_mobile/features/labels/correspondent/model/correspondent.model.dart';
|
||||
import 'package:paperless_mobile/features/labels/model/label_state.dart';
|
||||
import 'package:paperless_mobile/features/labels/bloc/label_state.dart';
|
||||
import 'package:paperless_mobile/util.dart';
|
||||
|
||||
class CorrespondentWidget extends StatelessWidget {
|
||||
@@ -60,7 +57,7 @@ class CorrespondentWidget extends StatelessWidget {
|
||||
);
|
||||
}
|
||||
afterSelected?.call();
|
||||
} on ErrorMessage catch (error, stackTrace) {
|
||||
} on PaperlessServerException catch (error, stackTrace) {
|
||||
showErrorMessage(context, error, stackTrace);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/features/labels/bloc/label_cubit.dart';
|
||||
import 'package:paperless_mobile/features/labels/document_type/model/document_type.model.dart';
|
||||
import 'package:injectable/injectable.dart';
|
||||
|
||||
@singleton
|
||||
@@ -9,18 +8,17 @@ class DocumentTypeCubit extends LabelCubit<DocumentType> {
|
||||
|
||||
@override
|
||||
Future<void> initialize() async {
|
||||
labelRepository.getDocumentTypes().then(loadFrom);
|
||||
labelsApi.getDocumentTypes().then(loadFrom);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<DocumentType> save(DocumentType item) =>
|
||||
labelRepository.saveDocumentType(item);
|
||||
labelsApi.saveDocumentType(item);
|
||||
|
||||
@override
|
||||
Future<DocumentType> update(DocumentType item) =>
|
||||
labelRepository.updateDocumentType(item);
|
||||
labelsApi.updateDocumentType(item);
|
||||
|
||||
@override
|
||||
Future<int> delete(DocumentType item) =>
|
||||
labelRepository.deleteDocumentType(item);
|
||||
Future<int> delete(DocumentType item) => labelsApi.deleteDocumentType(item);
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/features/labels/document_type/bloc/document_type_cubit.dart';
|
||||
import 'package:paperless_mobile/features/labels/document_type/model/document_type.model.dart';
|
||||
import 'package:paperless_mobile/features/labels/view/pages/add_label_page.dart';
|
||||
import 'package:paperless_mobile/generated/l10n.dart';
|
||||
|
||||
|
||||
@@ -1,11 +1,8 @@
|
||||
import 'package:flutter/widgets.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:paperless_mobile/core/logic/error_code_localization_mapper.dart';
|
||||
import 'package:paperless_mobile/core/model/error_message.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/features/documents/bloc/documents_cubit.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/query_parameters/document_type_query.dart';
|
||||
import 'package:paperless_mobile/features/labels/document_type/bloc/document_type_cubit.dart';
|
||||
import 'package:paperless_mobile/features/labels/document_type/model/document_type.model.dart';
|
||||
import 'package:paperless_mobile/features/labels/view/pages/edit_label_page.dart';
|
||||
import 'package:paperless_mobile/util.dart';
|
||||
|
||||
@@ -33,8 +30,8 @@ class EditDocumentTypePage extends StatelessWidget {
|
||||
.copyWith(documentType: const DocumentTypeQuery.unset()),
|
||||
);
|
||||
}
|
||||
} on ErrorMessage catch (e) {
|
||||
showSnackBar(context, translateError(context, e.code));
|
||||
} on PaperlessServerException catch (error, stackTrace) {
|
||||
showErrorMessage(context, error, stackTrace);
|
||||
} finally {
|
||||
Navigator.pop(context);
|
||||
}
|
||||
|
||||
@@ -1,11 +1,9 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:paperless_mobile/core/model/error_message.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/features/documents/bloc/documents_cubit.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/query_parameters/document_type_query.dart';
|
||||
import 'package:paperless_mobile/features/labels/document_type/bloc/document_type_cubit.dart';
|
||||
import 'package:paperless_mobile/features/labels/document_type/model/document_type.model.dart';
|
||||
import 'package:paperless_mobile/features/labels/model/label_state.dart';
|
||||
import 'package:paperless_mobile/features/labels/bloc/label_state.dart';
|
||||
import 'package:paperless_mobile/util.dart';
|
||||
|
||||
class DocumentTypeWidget extends StatelessWidget {
|
||||
@@ -55,7 +53,7 @@ class DocumentTypeWidget extends StatelessWidget {
|
||||
);
|
||||
}
|
||||
afterSelected?.call();
|
||||
} on ErrorMessage catch (error, stackTrace) {
|
||||
} on PaperlessServerException catch (error, stackTrace) {
|
||||
showErrorMessage(context, error, stackTrace);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import 'package:injectable/injectable.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/features/labels/bloc/label_cubit.dart';
|
||||
import 'package:paperless_mobile/features/labels/storage_path/model/storage_path.model.dart';
|
||||
|
||||
@singleton
|
||||
class StoragePathCubit extends LabelCubit<StoragePath> {
|
||||
@@ -8,18 +8,16 @@ class StoragePathCubit extends LabelCubit<StoragePath> {
|
||||
|
||||
@override
|
||||
Future<void> initialize() async {
|
||||
return labelRepository.getStoragePaths().then(loadFrom);
|
||||
return labelsApi.getStoragePaths().then(loadFrom);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<StoragePath> save(StoragePath item) =>
|
||||
labelRepository.saveStoragePath(item);
|
||||
Future<StoragePath> save(StoragePath item) => labelsApi.saveStoragePath(item);
|
||||
|
||||
@override
|
||||
Future<StoragePath> update(StoragePath item) =>
|
||||
labelRepository.updateStoragePath(item);
|
||||
labelsApi.updateStoragePath(item);
|
||||
|
||||
@override
|
||||
Future<int> delete(StoragePath item) =>
|
||||
labelRepository.deleteStoragePath(item);
|
||||
Future<int> delete(StoragePath item) => labelsApi.deleteStoragePath(item);
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/features/labels/storage_path/bloc/storage_path_cubit.dart';
|
||||
import 'package:paperless_mobile/features/labels/storage_path/model/storage_path.model.dart';
|
||||
import 'package:paperless_mobile/features/labels/storage_path/view/widgets/storage_path_autofill_form_builder_field.dart';
|
||||
import 'package:paperless_mobile/features/labels/view/pages/add_label_page.dart';
|
||||
import 'package:paperless_mobile/generated/l10n.dart';
|
||||
|
||||
@@ -1,11 +1,8 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:paperless_mobile/core/logic/error_code_localization_mapper.dart';
|
||||
import 'package:paperless_mobile/core/model/error_message.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/features/documents/bloc/documents_cubit.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/query_parameters/storage_path_query.dart';
|
||||
import 'package:paperless_mobile/features/labels/storage_path/bloc/storage_path_cubit.dart';
|
||||
import 'package:paperless_mobile/features/labels/storage_path/model/storage_path.model.dart';
|
||||
import 'package:paperless_mobile/features/labels/storage_path/view/widgets/storage_path_autofill_form_builder_field.dart';
|
||||
import 'package:paperless_mobile/features/labels/view/pages/edit_label_page.dart';
|
||||
import 'package:paperless_mobile/util.dart';
|
||||
@@ -43,7 +40,7 @@ class EditStoragePathPage extends StatelessWidget {
|
||||
);
|
||||
}
|
||||
Navigator.pop(context);
|
||||
} on ErrorMessage catch (error, stackTrace) {
|
||||
} on PaperlessServerException catch (error, stackTrace) {
|
||||
showErrorMessage(context, error, stackTrace);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,11 +1,9 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:paperless_mobile/core/model/error_message.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/features/documents/bloc/documents_cubit.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/query_parameters/storage_path_query.dart';
|
||||
import 'package:paperless_mobile/features/labels/model/label_state.dart';
|
||||
import 'package:paperless_mobile/features/labels/bloc/label_state.dart';
|
||||
import 'package:paperless_mobile/features/labels/storage_path/bloc/storage_path_cubit.dart';
|
||||
import 'package:paperless_mobile/features/labels/storage_path/model/storage_path.model.dart';
|
||||
import 'package:paperless_mobile/util.dart';
|
||||
|
||||
class StoragePathWidget extends StatelessWidget {
|
||||
@@ -59,7 +57,7 @@ class StoragePathWidget extends StatelessWidget {
|
||||
);
|
||||
}
|
||||
afterSelected?.call();
|
||||
} on ErrorMessage catch (error, stackTrace) {
|
||||
} on PaperlessServerException catch (error, stackTrace) {
|
||||
showErrorMessage(context, error, stackTrace);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/features/labels/bloc/label_cubit.dart';
|
||||
import 'package:paperless_mobile/features/labels/tags/model/tag.model.dart';
|
||||
import 'package:injectable/injectable.dart';
|
||||
|
||||
@singleton
|
||||
@@ -8,15 +8,15 @@ class TagCubit extends LabelCubit<Tag> {
|
||||
|
||||
@override
|
||||
Future<void> initialize() async {
|
||||
return labelRepository.getTags().then(loadFrom);
|
||||
return labelsApi.getTags().then(loadFrom);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<Tag> save(Tag item) => labelRepository.saveTag(item);
|
||||
Future<Tag> save(Tag item) => labelsApi.saveTag(item);
|
||||
|
||||
@override
|
||||
Future<Tag> update(Tag item) => labelRepository.updateTag(item);
|
||||
Future<Tag> update(Tag item) => labelsApi.updateTag(item);
|
||||
|
||||
@override
|
||||
Future<int> delete(Tag item) => labelRepository.deleteTag(item);
|
||||
Future<int> delete(Tag item) => labelsApi.deleteTag(item);
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:flutter_form_builder/flutter_form_builder.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/features/labels/tags/bloc/tags_cubit.dart';
|
||||
import 'package:paperless_mobile/features/labels/tags/model/tag.model.dart';
|
||||
import 'package:paperless_mobile/features/labels/view/pages/add_label_page.dart';
|
||||
import 'package:paperless_mobile/generated/l10n.dart';
|
||||
import 'package:form_builder_extra_fields/form_builder_extra_fields.dart';
|
||||
|
||||
@@ -2,12 +2,9 @@ import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:flutter_form_builder/flutter_form_builder.dart';
|
||||
import 'package:form_builder_extra_fields/form_builder_extra_fields.dart';
|
||||
import 'package:paperless_mobile/core/model/error_message.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/features/documents/bloc/documents_cubit.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/document_filter.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/query_parameters/tags_query.dart';
|
||||
import 'package:paperless_mobile/features/labels/tags/bloc/tags_cubit.dart';
|
||||
import 'package:paperless_mobile/features/labels/tags/model/tag.model.dart';
|
||||
import 'package:paperless_mobile/features/labels/view/pages/edit_label_page.dart';
|
||||
import 'package:paperless_mobile/generated/l10n.dart';
|
||||
import 'package:paperless_mobile/util.dart';
|
||||
@@ -61,7 +58,7 @@ class EditTagPage extends StatelessWidget {
|
||||
}
|
||||
cubit.updateFilter(filter: updatedFilter);
|
||||
Navigator.pop(context);
|
||||
} on ErrorMessage catch (error, stackTrace) {
|
||||
} on PaperlessServerException catch (error, stackTrace) {
|
||||
showErrorMessage(context, error, stackTrace);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:paperless_mobile/features/labels/tags/model/tag.model.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
|
||||
class TagWidget extends StatelessWidget {
|
||||
final Tag tag;
|
||||
|
||||
@@ -2,10 +2,9 @@ import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:flutter_form_builder/flutter_form_builder.dart';
|
||||
import 'package:flutter_typeahead/flutter_typeahead.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/query_parameters/tags_query.dart';
|
||||
import 'package:paperless_mobile/features/labels/model/label_state.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/features/labels/bloc/label_state.dart';
|
||||
import 'package:paperless_mobile/features/labels/tags/bloc/tags_cubit.dart';
|
||||
import 'package:paperless_mobile/features/labels/tags/model/tag.model.dart';
|
||||
import 'package:paperless_mobile/features/labels/tags/view/pages/add_tag_page.dart';
|
||||
import 'package:paperless_mobile/generated/l10n.dart';
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:paperless_mobile/features/labels/model/label_state.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/features/labels/bloc/label_state.dart';
|
||||
import 'package:paperless_mobile/features/labels/tags/bloc/tags_cubit.dart';
|
||||
import 'package:paperless_mobile/features/labels/tags/model/tag.model.dart';
|
||||
import 'package:paperless_mobile/features/labels/tags/view/widgets/tag_widget.dart';
|
||||
|
||||
class TagsWidget extends StatefulWidget {
|
||||
|
||||
@@ -1,17 +1,12 @@
|
||||
import 'dart:developer';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_form_builder/flutter_form_builder.dart';
|
||||
import 'package:paperless_mobile/features/labels/bloc/label_cubit.dart';
|
||||
import 'package:paperless_mobile/core/logic/error_code_localization_mapper.dart';
|
||||
import 'package:paperless_mobile/core/model/error_message.dart';
|
||||
import 'package:form_builder_validators/form_builder_validators.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/core/type/types.dart';
|
||||
import 'package:paperless_mobile/extensions/flutter_extensions.dart';
|
||||
import 'package:paperless_mobile/features/labels/document_type/model/matching_algorithm.dart';
|
||||
import 'package:paperless_mobile/features/labels/model/label.model.dart';
|
||||
import 'package:paperless_mobile/features/labels/bloc/label_cubit.dart';
|
||||
import 'package:paperless_mobile/generated/l10n.dart';
|
||||
import 'package:paperless_mobile/util.dart';
|
||||
import 'package:form_builder_validators/form_builder_validators.dart';
|
||||
|
||||
class AddLabelPage<T extends Label> extends StatefulWidget {
|
||||
final String? initialName;
|
||||
@@ -107,8 +102,8 @@ class _AddLabelPageState<T extends Label> extends State<AddLabelPage<T>> {
|
||||
final label = await widget.cubit
|
||||
.add(widget.fromJson(_formKey.currentState!.value));
|
||||
Navigator.pop(context, label);
|
||||
} on ErrorMessage catch (e) {
|
||||
showSnackBar(context, translateError(context, e.code));
|
||||
} on PaperlessServerException catch (error, stackTrace) {
|
||||
showErrorMessage(context, error, stackTrace);
|
||||
} on PaperlessValidationErrors catch (json) {
|
||||
setState(() => _errors = json);
|
||||
}
|
||||
|
||||
@@ -3,11 +3,9 @@ import 'dart:async';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_form_builder/flutter_form_builder.dart';
|
||||
import 'package:form_builder_validators/form_builder_validators.dart';
|
||||
import 'package:paperless_mobile/core/model/error_message.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/core/type/types.dart';
|
||||
import 'package:paperless_mobile/extensions/flutter_extensions.dart';
|
||||
import 'package:paperless_mobile/features/labels/document_type/model/matching_algorithm.dart';
|
||||
import 'package:paperless_mobile/features/labels/model/label.model.dart';
|
||||
import 'package:paperless_mobile/generated/l10n.dart';
|
||||
import 'package:paperless_mobile/util.dart';
|
||||
|
||||
@@ -146,7 +144,7 @@ class _EditLabelPageState<T extends Label> extends State<EditLabelPage<T>> {
|
||||
Navigator.pop(context);
|
||||
} on PaperlessValidationErrors catch (errorMessages) {
|
||||
setState(() => _errors = errorMessages);
|
||||
} on ErrorMessage catch (error, stackTrace) {
|
||||
} on PaperlessServerException catch (error, stackTrace) {
|
||||
showErrorMessage(context, error, stackTrace);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,28 +1,20 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:paperless_mobile/features/labels/bloc/global_state_bloc_provider.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/di_initializer.dart';
|
||||
import 'package:paperless_mobile/features/documents/bloc/documents_cubit.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/document_filter.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/query_parameters/correspondent_query.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/query_parameters/document_type_query.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/query_parameters/storage_path_query.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/query_parameters/tags_query.dart';
|
||||
import 'package:paperless_mobile/features/home/view/widget/info_drawer.dart';
|
||||
import 'package:paperless_mobile/features/labels/bloc/global_state_bloc_provider.dart';
|
||||
import 'package:paperless_mobile/features/labels/correspondent/bloc/correspondents_cubit.dart';
|
||||
import 'package:paperless_mobile/features/labels/correspondent/model/correspondent.model.dart';
|
||||
import 'package:paperless_mobile/features/labels/correspondent/view/pages/add_correspondent_page.dart';
|
||||
import 'package:paperless_mobile/features/labels/correspondent/view/pages/edit_correspondent_page.dart';
|
||||
import 'package:paperless_mobile/features/labels/document_type/bloc/document_type_cubit.dart';
|
||||
import 'package:paperless_mobile/features/labels/document_type/model/document_type.model.dart';
|
||||
import 'package:paperless_mobile/features/labels/document_type/view/pages/add_document_type_page.dart';
|
||||
import 'package:paperless_mobile/features/labels/document_type/view/pages/edit_document_type_page.dart';
|
||||
import 'package:paperless_mobile/features/labels/storage_path/bloc/storage_path_cubit.dart';
|
||||
import 'package:paperless_mobile/features/labels/storage_path/model/storage_path.model.dart';
|
||||
import 'package:paperless_mobile/features/labels/storage_path/view/pages/add_storage_path_page.dart';
|
||||
import 'package:paperless_mobile/features/labels/storage_path/view/pages/edit_storage_path_page.dart';
|
||||
import 'package:paperless_mobile/features/labels/tags/bloc/tags_cubit.dart';
|
||||
import 'package:paperless_mobile/features/labels/tags/model/tag.model.dart';
|
||||
import 'package:paperless_mobile/features/labels/tags/view/pages/add_tag_page.dart';
|
||||
import 'package:paperless_mobile/features/labels/tags/view/pages/edit_tag_page.dart';
|
||||
import 'package:paperless_mobile/features/labels/view/widgets/label_tab_view.dart';
|
||||
|
||||
@@ -1,10 +1,6 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_form_builder/flutter_form_builder.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/query_parameters/correspondent_query.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/query_parameters/id_query_parameter.dart';
|
||||
import 'package:paperless_mobile/features/labels/correspondent/model/correspondent.model.dart';
|
||||
import 'package:paperless_mobile/features/labels/document_type/model/document_type.model.dart';
|
||||
import 'package:paperless_mobile/features/labels/model/label.model.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/generated/l10n.dart';
|
||||
import 'package:form_builder_extra_fields/form_builder_extra_fields.dart';
|
||||
|
||||
|
||||
@@ -1,13 +1,8 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/features/labels/bloc/global_state_bloc_provider.dart';
|
||||
import 'package:paperless_mobile/core/logic/error_code_localization_mapper.dart';
|
||||
import 'package:paperless_mobile/core/model/error_message.dart';
|
||||
import 'package:paperless_mobile/di_initializer.dart';
|
||||
import 'package:paperless_mobile/features/documents/bloc/documents_cubit.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/document_filter.dart';
|
||||
import 'package:paperless_mobile/features/documents/repository/document_repository.dart';
|
||||
import 'package:paperless_mobile/features/labels/model/label.model.dart';
|
||||
import 'package:paperless_mobile/features/linked_documents_preview/bloc/linked_documents_cubit.dart';
|
||||
import 'package:paperless_mobile/features/linked_documents_preview/view/pages/linked_documents_page.dart';
|
||||
|
||||
|
||||
@@ -1,11 +1,10 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/core/bloc/connectivity_cubit.dart';
|
||||
import 'package:paperless_mobile/features/labels/bloc/label_cubit.dart';
|
||||
import 'package:paperless_mobile/core/widgets/offline_widget.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/document_filter.dart';
|
||||
import 'package:paperless_mobile/features/labels/model/label.model.dart';
|
||||
import 'package:paperless_mobile/features/labels/model/label_state.dart';
|
||||
import 'package:paperless_mobile/features/labels/bloc/label_state.dart';
|
||||
import 'package:paperless_mobile/features/labels/view/widgets/label_item.dart';
|
||||
import 'package:paperless_mobile/extensions/flutter_extensions.dart';
|
||||
|
||||
|
||||
@@ -1,18 +1,16 @@
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:injectable/injectable.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/document_filter.dart';
|
||||
import 'package:paperless_mobile/features/documents/repository/document_repository.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/features/linked_documents_preview/bloc/state/linked_documents_state.dart';
|
||||
|
||||
@injectable
|
||||
class LinkedDocumentsCubit extends Cubit<LinkedDocumentsState> {
|
||||
final DocumentRepository _documentRepository;
|
||||
final PaperlessDocumentsApi _api;
|
||||
|
||||
LinkedDocumentsCubit(this._documentRepository)
|
||||
: super(LinkedDocumentsState());
|
||||
LinkedDocumentsCubit(this._api) : super(LinkedDocumentsState());
|
||||
|
||||
Future<void> initialize(DocumentFilter filter) async {
|
||||
final documents = await _documentRepository.find(
|
||||
final documents = await _api.find(
|
||||
filter.copyWith(
|
||||
pageSize: 100,
|
||||
),
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
import 'package:paperless_mobile/features/documents/model/document.model.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/document_filter.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/paged_search_result.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
|
||||
class LinkedDocumentsState {
|
||||
final bool isLoaded;
|
||||
|
||||
@@ -1,12 +1,11 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/core/widgets/documents_list_loading_widget.dart';
|
||||
import 'package:paperless_mobile/di_initializer.dart';
|
||||
import 'package:paperless_mobile/features/document_details/bloc/document_details_cubit.dart';
|
||||
import 'package:paperless_mobile/features/document_details/view/pages/document_details_page.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/document.model.dart';
|
||||
import 'package:paperless_mobile/features/documents/repository/document_repository.dart';
|
||||
import 'package:paperless_mobile/features/documents/view/widgets/list/document_list_item.dart';
|
||||
import 'package:paperless_mobile/features/labels/bloc/global_state_bloc_provider.dart';
|
||||
import 'package:paperless_mobile/features/linked_documents_preview/bloc/linked_documents_cubit.dart';
|
||||
@@ -69,7 +68,7 @@ class _LinkedDocumentsPageState extends State<LinkedDocumentsPage> {
|
||||
additionalProviders: [
|
||||
BlocProvider<DocumentDetailsCubit>.value(
|
||||
value: DocumentDetailsCubit(
|
||||
getIt<DocumentRepository>(),
|
||||
getIt<PaperlessDocumentsApi>(),
|
||||
document,
|
||||
),
|
||||
),
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import 'dart:developer';
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:paperless_mobile/core/model/error_message.dart';
|
||||
import 'package:injectable/injectable.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/core/store/local_vault.dart';
|
||||
import 'package:paperless_mobile/di_initializer.dart';
|
||||
import 'package:paperless_mobile/features/login/model/authentication_information.dart';
|
||||
@@ -10,18 +10,19 @@ import 'package:paperless_mobile/features/login/model/client_certificate.dart';
|
||||
import 'package:paperless_mobile/features/login/model/user_credentials.model.dart';
|
||||
import 'package:paperless_mobile/features/login/services/authentication.service.dart';
|
||||
import 'package:paperless_mobile/features/settings/model/application_settings_state.dart';
|
||||
import 'package:injectable/injectable.dart';
|
||||
|
||||
const authenticationKey = "authentication";
|
||||
|
||||
@singleton
|
||||
class AuthenticationCubit extends Cubit<AuthenticationState> {
|
||||
final LocalAuthenticationService _localAuthService;
|
||||
final PaperlessAuthenticationApi _authApi;
|
||||
final LocalVault localStore;
|
||||
final AuthenticationService authenticationService;
|
||||
|
||||
AuthenticationCubit(
|
||||
this.localStore,
|
||||
this.authenticationService,
|
||||
this._localAuthService,
|
||||
this._authApi,
|
||||
) : super(AuthenticationState.initial);
|
||||
|
||||
Future<void> initialize() {
|
||||
@@ -49,7 +50,7 @@ class AuthenticationCubit extends Cubit<AuthenticationState> {
|
||||
),
|
||||
),
|
||||
);
|
||||
final token = await authenticationService.login(
|
||||
final token = await _authApi.login(
|
||||
username: credentials.username!,
|
||||
password: credentials.password!,
|
||||
serverUrl: serverUrl,
|
||||
@@ -70,14 +71,14 @@ class AuthenticationCubit extends Cubit<AuthenticationState> {
|
||||
authentication: auth,
|
||||
));
|
||||
} on TlsException catch (_) {
|
||||
const error =
|
||||
ErrorMessage(ErrorCode.invalidClientCertificateConfiguration);
|
||||
const error = PaperlessServerException(
|
||||
ErrorCode.invalidClientCertificateConfiguration);
|
||||
throw error;
|
||||
} on SocketException catch (err) {
|
||||
if (err.message.contains("connection timed out")) {
|
||||
throw const ErrorMessage(ErrorCode.requestTimedOut);
|
||||
throw const PaperlessServerException(ErrorCode.requestTimedOut);
|
||||
} else {
|
||||
throw ErrorMessage.unknown();
|
||||
throw const PaperlessServerException.unknown();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -95,7 +96,7 @@ class AuthenticationCubit extends Cubit<AuthenticationState> {
|
||||
emit(AuthenticationState(isAuthenticated: false, wasLoginStored: false));
|
||||
} else {
|
||||
if (!appSettings.isLocalAuthenticationEnabled ||
|
||||
await authenticationService
|
||||
await _localAuthService
|
||||
.authenticateLocalUser("Authenticate to log back in")) {
|
||||
registerSecurityContext(storedAuth.clientCertificate);
|
||||
emit(
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:paperless_mobile/core/model/error_message.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/di_initializer.dart';
|
||||
import 'package:local_auth/local_auth.dart';
|
||||
|
||||
@@ -12,7 +12,8 @@ class LocalAuthenticationCubit extends Cubit<LocalAuthenticationState> {
|
||||
if (isAuthenticationSuccessful) {
|
||||
emit(LocalAuthenticationState(true));
|
||||
} else {
|
||||
throw const ErrorMessage(ErrorCode.biometricAuthenticationFailed);
|
||||
throw const PaperlessServerException(
|
||||
ErrorCode.biometricAuthenticationFailed);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,57 +1,17 @@
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:paperless_mobile/core/model/error_message.dart';
|
||||
import 'package:paperless_mobile/core/store/local_vault.dart';
|
||||
import 'package:http/http.dart';
|
||||
import 'package:injectable/injectable.dart';
|
||||
import 'package:local_auth/local_auth.dart';
|
||||
import 'package:paperless_mobile/core/store/local_vault.dart';
|
||||
|
||||
@singleton
|
||||
class AuthenticationService {
|
||||
final BaseClient httpClient;
|
||||
class LocalAuthenticationService {
|
||||
final LocalVault localStore;
|
||||
final LocalAuthentication localAuthentication;
|
||||
|
||||
AuthenticationService(
|
||||
LocalAuthenticationService(
|
||||
this.localStore,
|
||||
this.localAuthentication,
|
||||
@Named("timeoutClient") this.httpClient,
|
||||
);
|
||||
|
||||
///
|
||||
/// Returns the authentication token.
|
||||
///
|
||||
Future<String> login({
|
||||
required String username,
|
||||
required String password,
|
||||
required String serverUrl,
|
||||
}) async {
|
||||
late Response response;
|
||||
try {
|
||||
response = await httpClient.post(
|
||||
Uri.parse("/api/token/"),
|
||||
body: {"username": username, "password": password},
|
||||
);
|
||||
} on FormatException catch (e) {
|
||||
final source = e.source;
|
||||
if (source is String &&
|
||||
source.contains("400 No required SSL certificate was sent")) {
|
||||
throw const ErrorMessage(ErrorCode.missingClientCertificate);
|
||||
}
|
||||
}
|
||||
if (response.statusCode == 200) {
|
||||
final data = jsonDecode(utf8.decode(response.bodyBytes));
|
||||
return data['token'];
|
||||
} else if (response.statusCode == 400 &&
|
||||
response.body
|
||||
.toLowerCase()
|
||||
.contains("no required certificate was sent")) {
|
||||
throw const ErrorMessage(ErrorCode.invalidClientCertificateConfiguration);
|
||||
} else {
|
||||
throw const ErrorMessage(ErrorCode.authenticationFailed);
|
||||
}
|
||||
}
|
||||
|
||||
Future<bool> authenticateLocalUser(String localizedReason) async {
|
||||
if (await localAuthentication.isDeviceSupported()) {
|
||||
return await localAuthentication.authenticate(
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:flutter_form_builder/flutter_form_builder.dart';
|
||||
import 'package:paperless_mobile/core/model/error_message.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/extensions/flutter_extensions.dart';
|
||||
import 'package:paperless_mobile/features/login/bloc/authentication_cubit.dart';
|
||||
import 'package:paperless_mobile/features/login/view/widgets/client_certificate_form_field.dart';
|
||||
@@ -97,12 +97,12 @@ class _LoginPageState extends State<LoginPage> {
|
||||
clientCertificate:
|
||||
form[ClientCertificateFormField.fkClientCertificate],
|
||||
);
|
||||
} on ErrorMessage catch (error, stackTrace) {
|
||||
} on PaperlessServerException catch (error, stackTrace) {
|
||||
showErrorMessage(context, error, stackTrace);
|
||||
} on Map<String, dynamic> catch (error, stackTrace) {
|
||||
showGenericError(context, error.values.first, stackTrace);
|
||||
} catch (unknownError, stackTrace) {
|
||||
showErrorMessage(context, ErrorMessage.unknown(), stackTrace);
|
||||
showGenericError(context, unknownError.toString(), stackTrace);
|
||||
} finally {
|
||||
setState(() => _isLoginLoading = false);
|
||||
}
|
||||
|
||||
@@ -1,20 +1,19 @@
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:injectable/injectable.dart';
|
||||
import 'package:paperless_mobile/di_initializer.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/saved_view.model.dart';
|
||||
import 'package:paperless_mobile/features/documents/repository/saved_views_repository.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/features/saved_view/bloc/saved_view_state.dart';
|
||||
|
||||
@singleton
|
||||
class SavedViewCubit extends Cubit<SavedViewState> {
|
||||
SavedViewCubit() : super(SavedViewState(value: {}));
|
||||
final PaperlessSavedViewsApi _api;
|
||||
SavedViewCubit(this._api) : super(SavedViewState(value: {}));
|
||||
|
||||
void selectView(SavedView? view) {
|
||||
emit(SavedViewState(value: state.value, selectedSavedViewId: view?.id));
|
||||
}
|
||||
|
||||
Future<SavedView> add(SavedView view) async {
|
||||
final savedView = await getIt<SavedViewsRepository>().save(view);
|
||||
final savedView = await _api.save(view);
|
||||
emit(
|
||||
SavedViewState(
|
||||
value: {...state.value, savedView.id!: savedView},
|
||||
@@ -25,7 +24,7 @@ class SavedViewCubit extends Cubit<SavedViewState> {
|
||||
}
|
||||
|
||||
Future<int> remove(SavedView view) async {
|
||||
final id = await getIt<SavedViewsRepository>().delete(view);
|
||||
final id = await _api.delete(view);
|
||||
final newValue = {...state.value};
|
||||
newValue.removeWhere((key, value) => key == id);
|
||||
emit(
|
||||
@@ -40,7 +39,7 @@ class SavedViewCubit extends Cubit<SavedViewState> {
|
||||
}
|
||||
|
||||
Future<void> initialize() async {
|
||||
final views = await getIt<SavedViewsRepository>().getAll();
|
||||
final views = await _api.getAll();
|
||||
final values = {for (var element in views) element.id!: element};
|
||||
emit(SavedViewState(value: values));
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import 'package:equatable/equatable.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/saved_view.model.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
|
||||
class SavedViewState with EquatableMixin {
|
||||
final Map<int, SavedView> value;
|
||||
@@ -11,5 +11,8 @@ class SavedViewState with EquatableMixin {
|
||||
});
|
||||
|
||||
@override
|
||||
List<Object?> get props => [value, selectedSavedViewId];
|
||||
List<Object?> get props => [
|
||||
value,
|
||||
selectedSavedViewId,
|
||||
];
|
||||
}
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_form_builder/flutter_form_builder.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/document_filter.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/saved_view.model.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/generated/l10n.dart';
|
||||
import 'package:form_builder_validators/form_builder_validators.dart';
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:paperless_mobile/core/model/error_message.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/di_initializer.dart';
|
||||
import 'package:paperless_mobile/features/documents/bloc/documents_cubit.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/saved_view.model.dart';
|
||||
import 'package:paperless_mobile/features/documents/view/widgets/selection/add_saved_view_page.dart';
|
||||
import 'package:paperless_mobile/features/saved_view/view/add_saved_view_page.dart';
|
||||
import 'package:paperless_mobile/features/documents/view/widgets/selection/confirm_delete_saved_view_dialog.dart';
|
||||
import 'package:paperless_mobile/features/saved_view/bloc/saved_view_cubit.dart';
|
||||
import 'package:paperless_mobile/features/saved_view/bloc/saved_view_state.dart';
|
||||
@@ -87,7 +86,7 @@ class SavedViewSelectionWidget extends StatelessWidget {
|
||||
if (newView != null) {
|
||||
try {
|
||||
await BlocProvider.of<SavedViewCubit>(context).add(newView);
|
||||
} on ErrorMessage catch (error, stackTrace) {
|
||||
} on PaperlessServerException catch (error, stackTrace) {
|
||||
showErrorMessage(context, error, stackTrace);
|
||||
}
|
||||
}
|
||||
@@ -104,7 +103,7 @@ class SavedViewSelectionWidget extends StatelessWidget {
|
||||
BlocProvider.of<DocumentsCubit>(context).updateFilter();
|
||||
BlocProvider.of<SavedViewCubit>(context).selectView(null);
|
||||
}
|
||||
} on ErrorMessage catch (error, stackTrace) {
|
||||
} on PaperlessServerException catch (error, stackTrace) {
|
||||
showErrorMessage(context, error, stackTrace);
|
||||
}
|
||||
}
|
||||
@@ -119,7 +118,7 @@ class SavedViewSelectionWidget extends StatelessWidget {
|
||||
if (delete) {
|
||||
try {
|
||||
BlocProvider.of<SavedViewCubit>(context).remove(view);
|
||||
} on ErrorMessage catch (error, stackTrace) {
|
||||
} on PaperlessServerException catch (error, stackTrace) {
|
||||
showErrorMessage(context, error, stackTrace);
|
||||
}
|
||||
}
|
||||
@@ -4,18 +4,18 @@ import 'dart:io';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:paperless_mobile/core/model/error_message.dart';
|
||||
import 'package:injectable/injectable.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/document.model.dart';
|
||||
import 'package:paperless_mobile/features/documents/repository/document_repository.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/di_initializer.dart';
|
||||
import 'package:paperless_mobile/features/login/bloc/authentication_cubit.dart';
|
||||
|
||||
@injectable
|
||||
class DocumentScannerCubit extends Cubit<List<File>> {
|
||||
final DocumentRepository documentRepository;
|
||||
final PaperlessDocumentsApi _api;
|
||||
|
||||
static List<File> initialState = [];
|
||||
|
||||
DocumentScannerCubit(this.documentRepository) : super(initialState);
|
||||
DocumentScannerCubit(this._api) : super(initialState);
|
||||
|
||||
void addScan(File file) => emit([...state, file]);
|
||||
|
||||
@@ -26,7 +26,7 @@ class DocumentScannerCubit extends Cubit<List<File>> {
|
||||
scans.removeAt(fileIndex);
|
||||
emit(scans);
|
||||
} catch (_) {
|
||||
throw const ErrorMessage(ErrorCode.scanRemoveFailed);
|
||||
throw const PaperlessServerException(ErrorCode.scanRemoveFailed);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -41,7 +41,7 @@ class DocumentScannerCubit extends Cubit<List<File>> {
|
||||
imageCache.clear();
|
||||
emit(initialState);
|
||||
} catch (_) {
|
||||
throw const ErrorMessage(ErrorCode.scanRemoveFailed);
|
||||
throw const PaperlessServerException(ErrorCode.scanRemoveFailed);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -55,17 +55,23 @@ class DocumentScannerCubit extends Cubit<List<File>> {
|
||||
Iterable<int> tags = const [],
|
||||
DateTime? createdAt,
|
||||
}) async {
|
||||
await documentRepository.create(
|
||||
final auth = getIt<AuthenticationCubit>().state.authentication;
|
||||
if (auth == null) {
|
||||
throw const PaperlessServerException(ErrorCode.notAuthenticated);
|
||||
}
|
||||
await _api.create(
|
||||
bytes,
|
||||
fileName,
|
||||
filename: fileName,
|
||||
title: title,
|
||||
documentType: documentType,
|
||||
correspondent: correspondent,
|
||||
tags: tags,
|
||||
createdAt: createdAt,
|
||||
authToken: auth.token,
|
||||
serverUrl: auth.serverUrl,
|
||||
);
|
||||
if (onConsumptionFinished != null) {
|
||||
documentRepository
|
||||
_api
|
||||
.waitForConsumptionFinished(fileName, title)
|
||||
.then((value) => onConsumptionFinished(value));
|
||||
}
|
||||
|
||||
@@ -3,23 +3,15 @@ import 'dart:typed_data';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:flutter_form_builder/flutter_form_builder.dart';
|
||||
import 'package:paperless_mobile/core/model/error_message.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/core/type/types.dart';
|
||||
import 'package:paperless_mobile/di_initializer.dart';
|
||||
import 'package:paperless_mobile/extensions/flutter_extensions.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/document.model.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/query_parameters/correspondent_query.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/query_parameters/document_type_query.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/query_parameters/id_query_parameter.dart';
|
||||
import 'package:paperless_mobile/features/documents/model/query_parameters/tags_query.dart';
|
||||
import 'package:paperless_mobile/features/labels/correspondent/bloc/correspondents_cubit.dart';
|
||||
import 'package:paperless_mobile/features/labels/document_type/bloc/document_type_cubit.dart';
|
||||
import 'package:paperless_mobile/features/documents/bloc/documents_cubit.dart';
|
||||
import 'package:paperless_mobile/features/labels/correspondent/model/correspondent.model.dart';
|
||||
import 'package:paperless_mobile/features/labels/correspondent/view/pages/add_correspondent_page.dart';
|
||||
import 'package:paperless_mobile/features/labels/document_type/model/document_type.model.dart';
|
||||
import 'package:paperless_mobile/features/labels/document_type/view/pages/add_document_type_page.dart';
|
||||
import 'package:paperless_mobile/features/labels/model/label_state.dart';
|
||||
import 'package:paperless_mobile/features/labels/bloc/label_state.dart';
|
||||
import 'package:paperless_mobile/features/labels/tags/view/widgets/tags_form_field.dart';
|
||||
import 'package:paperless_mobile/features/labels/view/widgets/label_form_field.dart';
|
||||
import 'package:paperless_mobile/features/scan/bloc/document_scanner_cubit.dart';
|
||||
@@ -258,12 +250,13 @@ class _DocumentUploadPageState extends State<DocumentUploadPage> {
|
||||
showSnackBar(context, S.of(context).documentUploadSuccessText);
|
||||
Navigator.pop(context);
|
||||
widget.afterUpload?.call();
|
||||
} on ErrorMessage catch (error, stackTrace) {
|
||||
} on PaperlessServerException catch (error, stackTrace) {
|
||||
showErrorMessage(context, error, stackTrace);
|
||||
} on PaperlessValidationErrors catch (errorMessages) {
|
||||
setState(() => _errors = errorMessages);
|
||||
} on PaperlessValidationErrors catch (PaperlessServerExceptions) {
|
||||
setState(() => _errors = PaperlessServerExceptions);
|
||||
} catch (unknownError, stackTrace) {
|
||||
showErrorMessage(context, const ErrorMessage.unknown(), stackTrace);
|
||||
showErrorMessage(
|
||||
context, const PaperlessServerException.unknown(), stackTrace);
|
||||
} finally {
|
||||
setState(() {
|
||||
_isUploadLoading = false;
|
||||
|
||||
@@ -8,13 +8,10 @@ import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:mime/mime.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/features/labels/bloc/global_state_bloc_provider.dart';
|
||||
import 'package:paperless_mobile/core/global/constants.dart';
|
||||
import 'package:paperless_mobile/core/model/error_message.dart';
|
||||
import 'package:paperless_mobile/core/service/file_service.dart';
|
||||
import 'package:paperless_mobile/di_initializer.dart';
|
||||
import 'package:paperless_mobile/features/documents/bloc/documents_cubit.dart';
|
||||
import 'package:paperless_mobile/features/documents/repository/document_repository.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/scan/bloc/document_scanner_cubit.dart';
|
||||
@@ -193,7 +190,7 @@ class _ScannerPageState extends State<ScannerPage>
|
||||
try {
|
||||
BlocProvider.of<DocumentScannerCubit>(context)
|
||||
.removeScan(index);
|
||||
} on ErrorMessage catch (error, stackTrace) {
|
||||
} on PaperlessServerException catch (error, stackTrace) {
|
||||
showErrorMessage(context, error, stackTrace);
|
||||
}
|
||||
},
|
||||
@@ -206,7 +203,7 @@ class _ScannerPageState extends State<ScannerPage>
|
||||
void _reset(BuildContext context) {
|
||||
try {
|
||||
BlocProvider.of<DocumentScannerCubit>(context).reset();
|
||||
} on ErrorMessage catch (error, stackTrace) {
|
||||
} on PaperlessServerException catch (error, stackTrace) {
|
||||
showErrorMessage(context, error, stackTrace);
|
||||
}
|
||||
}
|
||||
@@ -231,7 +228,7 @@ class _ScannerPageState extends State<ScannerPage>
|
||||
)) {
|
||||
showErrorMessage(
|
||||
context,
|
||||
const ErrorMessage(ErrorCode.unsupportedFileFormat),
|
||||
const PaperlessServerException(ErrorCode.unsupportedFileFormat),
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -28,7 +28,7 @@ class BiometricAuthenticationSetting extends StatelessWidget {
|
||||
: S
|
||||
.of(context)
|
||||
.appSettingsDisableBiometricAuthenticationReasonText;
|
||||
final changeValue = await getIt<AuthenticationService>()
|
||||
final changeValue = await getIt<LocalAuthenticationService>()
|
||||
.authenticateLocalUser(localizedReason);
|
||||
if (changeValue) {
|
||||
settingsBloc.setIsBiometricAuthenticationEnabled(val);
|
||||
|
||||
@@ -14,13 +14,18 @@ class LanguageSelectionSetting extends StatefulWidget {
|
||||
}
|
||||
|
||||
class _LanguageSelectionSettingState extends State<LanguageSelectionSetting> {
|
||||
static const _languageOptions = {
|
||||
'en': 'English',
|
||||
'de': 'Deutsch',
|
||||
'cs': 'Česky',
|
||||
};
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return BlocBuilder<ApplicationSettingsCubit, ApplicationSettingsState>(
|
||||
builder: (context, settings) {
|
||||
return ListTile(
|
||||
title: Text(S.of(context).settingsPageLanguageSettingLabel),
|
||||
subtitle: Text(_mapSubtagToLanguage(settings.preferredLocaleSubtag)),
|
||||
subtitle: Text(_languageOptions[settings.preferredLocaleSubtag]!),
|
||||
onTap: () => showDialog(
|
||||
context: context,
|
||||
builder: (_) => RadioSettingsDialog<String>(
|
||||
@@ -28,12 +33,16 @@ class _LanguageSelectionSettingState extends State<LanguageSelectionSetting> {
|
||||
options: [
|
||||
RadioOption(
|
||||
value: 'en',
|
||||
label: _mapSubtagToLanguage('en'),
|
||||
label: _languageOptions['en']!,
|
||||
),
|
||||
RadioOption(
|
||||
value: 'de',
|
||||
label: _mapSubtagToLanguage('de'),
|
||||
label: _languageOptions['de']!,
|
||||
),
|
||||
RadioOption(
|
||||
value: 'cs',
|
||||
label: _languageOptions['cs']!,
|
||||
)
|
||||
],
|
||||
initialValue: BlocProvider.of<ApplicationSettingsCubit>(context)
|
||||
.state
|
||||
@@ -45,15 +54,4 @@ class _LanguageSelectionSettingState extends State<LanguageSelectionSetting> {
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
_mapSubtagToLanguage(String subtag) {
|
||||
switch (subtag) {
|
||||
case 'en':
|
||||
return "English";
|
||||
case 'de':
|
||||
return "Deutsch";
|
||||
default:
|
||||
return "English";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -415,5 +415,7 @@
|
||||
"tagInboxTagPropertyLabel": "Tag inboxu",
|
||||
"@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": {}
|
||||
}
|
||||
"@uploadPageAutomaticallInferredFieldsHintText": {},
|
||||
"inboxPageNoNewDocumentsText": "You do not have unseen documents.",
|
||||
"inboxPageNoNewDocumentsRefreshLabel": "Refresh"
|
||||
}
|
||||
@@ -415,5 +415,7 @@
|
||||
"tagInboxTagPropertyLabel": "Posteingangs-Tag",
|
||||
"@tagInboxTagPropertyLabel": {},
|
||||
"uploadPageAutomaticallInferredFieldsHintText": "Wenn Werte für diese Felder angegeben werden, wird Paperless nicht automatisch einen Wert zuweisen. Wenn diese Felder automatisch von Paperless erkannt werden sollen, sollten die Felder leer bleiben.",
|
||||
"@uploadPageAutomaticallInferredFieldsHintText": {}
|
||||
"@uploadPageAutomaticallInferredFieldsHintText": {},
|
||||
"inboxPageNoNewDocumentsText": "You do not have unseen documents.",
|
||||
"inboxPageNoNewDocumentsRefreshLabel": "Refresh"
|
||||
}
|
||||
@@ -1,419 +1,421 @@
|
||||
{
|
||||
"@@locale": "en",
|
||||
"aboutDialogDevelopedByText": "Developed by",
|
||||
"@aboutDialogDevelopedByText": {},
|
||||
"addCorrespondentPageTitle": "New Correspondent",
|
||||
"@addCorrespondentPageTitle": {},
|
||||
"addDocumentTypePageTitle": "New Document Type",
|
||||
"@addDocumentTypePageTitle": {},
|
||||
"addStoragePathPageTitle": "New Storage Path",
|
||||
"@addStoragePathPageTitle": {},
|
||||
"addTagPageTitle": "New Tag",
|
||||
"@addTagPageTitle": {},
|
||||
"appDrawerAboutInfoLoadingText": "Retrieving application information...",
|
||||
"@appDrawerAboutInfoLoadingText": {},
|
||||
"appDrawerAboutLabel": "About this app",
|
||||
"@appDrawerAboutLabel": {},
|
||||
"appDrawerHeaderLoggedInAsText": "Logged in as ",
|
||||
"@appDrawerHeaderLoggedInAsText": {},
|
||||
"appDrawerLogoutLabel": "Disconnect",
|
||||
"@appDrawerLogoutLabel": {},
|
||||
"appDrawerReportBugLabel": "Report a Bug",
|
||||
"@appDrawerReportBugLabel": {},
|
||||
"appDrawerSettingsLabel": "Settings",
|
||||
"@appDrawerSettingsLabel": {},
|
||||
"appSettingsBiometricAuthenticationDescriptionText": "Authenticate on app start",
|
||||
"@appSettingsBiometricAuthenticationDescriptionText": {},
|
||||
"appSettingsBiometricAuthenticationLabel": "Biometric authentication",
|
||||
"@appSettingsBiometricAuthenticationLabel": {},
|
||||
"appSettingsDisableBiometricAuthenticationReasonText": "Authenticate to disable biometric authentication",
|
||||
"@appSettingsDisableBiometricAuthenticationReasonText": {},
|
||||
"appSettingsEnableBiometricAuthenticationReasonText": "Authenticate to enable biometric authentication",
|
||||
"@appSettingsEnableBiometricAuthenticationReasonText": {},
|
||||
"appTitleText": "Paperless Mobile",
|
||||
"@appTitleText": {},
|
||||
"bottomNavDocumentsPageLabel": "Documents",
|
||||
"@bottomNavDocumentsPageLabel": {},
|
||||
"bottomNavInboxPageLabel": "Inbox",
|
||||
"@bottomNavInboxPageLabel": {},
|
||||
"bottomNavLabelsPageLabel": "Labels",
|
||||
"@bottomNavLabelsPageLabel": {},
|
||||
"bottomNavScannerPageLabel": "Scanner",
|
||||
"@bottomNavScannerPageLabel": {},
|
||||
"correspondentFormFieldSearchHintText": "Start typing...",
|
||||
"@correspondentFormFieldSearchHintText": {},
|
||||
"deleteViewDialogContentText": "Do you really want to delete this view?",
|
||||
"@deleteViewDialogContentText": {},
|
||||
"deleteViewDialogTitleText": "Delete view ",
|
||||
"@deleteViewDialogTitleText": {},
|
||||
"documentAddedPropertyLabel": "Added At",
|
||||
"@documentAddedPropertyLabel": {},
|
||||
"documentArchiveSerialNumberPropertyLongLabel": "Archive Serial Number",
|
||||
"@documentArchiveSerialNumberPropertyLongLabel": {},
|
||||
"documentArchiveSerialNumberPropertyShortLabel": "ASN",
|
||||
"@documentArchiveSerialNumberPropertyShortLabel": {},
|
||||
"documentCorrespondentPropertyLabel": "Correspondent",
|
||||
"@documentCorrespondentPropertyLabel": {},
|
||||
"documentCreatedPropertyLabel": "Created At",
|
||||
"@documentCreatedPropertyLabel": {},
|
||||
"documentDeleteSuccessMessage": "Document successfully deleted.",
|
||||
"@documentDeleteSuccessMessage": {},
|
||||
"documentDetailsPageAssignAsnButtonLabel": "Assign",
|
||||
"@documentDetailsPageAssignAsnButtonLabel": {},
|
||||
"documentDetailsPageSimilarDocumentsLabel": "Similar Documents",
|
||||
"@documentDetailsPageSimilarDocumentsLabel": {},
|
||||
"documentDetailsPageTabContentLabel": "Content",
|
||||
"@documentDetailsPageTabContentLabel": {},
|
||||
"documentDetailsPageTabMetaDataLabel": "Meta Data",
|
||||
"@documentDetailsPageTabMetaDataLabel": {},
|
||||
"documentDetailsPageTabOverviewLabel": "Overview",
|
||||
"@documentDetailsPageTabOverviewLabel": {},
|
||||
"documentDocumentTypePropertyLabel": "Document Type",
|
||||
"@documentDocumentTypePropertyLabel": {},
|
||||
"documentEditPageTitle": "Edit Document",
|
||||
"@documentEditPageTitle": {},
|
||||
"documentMetaDataChecksumLabel": "Original MD5-Checksum",
|
||||
"@documentMetaDataChecksumLabel": {},
|
||||
"documentMetaDataMediaFilenamePropertyLabel": "Media Filename",
|
||||
"@documentMetaDataMediaFilenamePropertyLabel": {},
|
||||
"documentMetaDataOriginalFileSizeLabel": "Original File Size",
|
||||
"@documentMetaDataOriginalFileSizeLabel": {},
|
||||
"documentMetaDataOriginalMimeTypeLabel": "Original MIME-Type",
|
||||
"@documentMetaDataOriginalMimeTypeLabel": {},
|
||||
"documentModifiedPropertyLabel": "Modified At",
|
||||
"@documentModifiedPropertyLabel": {},
|
||||
"documentPreviewPageTitle": "Preview",
|
||||
"@documentPreviewPageTitle": {},
|
||||
"documentScannerPageAddScanButtonLabel": "Scan a document",
|
||||
"@documentScannerPageAddScanButtonLabel": {},
|
||||
"documentScannerPageEmptyStateText": "No documents scanned yet.",
|
||||
"@documentScannerPageEmptyStateText": {},
|
||||
"documentScannerPageOrText": "or",
|
||||
"@documentScannerPageOrText": {},
|
||||
"documentScannerPageResetButtonTooltipText": "Delete all scans",
|
||||
"@documentScannerPageResetButtonTooltipText": {},
|
||||
"documentScannerPageTitle": "Scan",
|
||||
"@documentScannerPageTitle": {},
|
||||
"documentScannerPageUploadButtonTooltip": "Upload to Paperless",
|
||||
"@documentScannerPageUploadButtonTooltip": {},
|
||||
"documentScannerPageUploadFromThisDeviceButtonLabel": "Upload a document from this device",
|
||||
"@documentScannerPageUploadFromThisDeviceButtonLabel": {},
|
||||
"documentsFilterPageAdvancedLabel": "Advanced",
|
||||
"@documentsFilterPageAdvancedLabel": {},
|
||||
"documentsFilterPageApplyFilterLabel": "Apply",
|
||||
"@documentsFilterPageApplyFilterLabel": {},
|
||||
"documentsFilterPageDateRangeFieldEndLabel": "To",
|
||||
"@documentsFilterPageDateRangeFieldEndLabel": {},
|
||||
"documentsFilterPageDateRangeFieldStartLabel": "From",
|
||||
"@documentsFilterPageDateRangeFieldStartLabel": {},
|
||||
"documentsFilterPageDateRangeLastMonthLabel": "Last Month",
|
||||
"@documentsFilterPageDateRangeLastMonthLabel": {},
|
||||
"documentsFilterPageDateRangeLastSevenDaysLabel": "Last 7 Days",
|
||||
"@documentsFilterPageDateRangeLastSevenDaysLabel": {},
|
||||
"documentsFilterPageDateRangeLastThreeMonthsLabel": "Last 3 Months",
|
||||
"@documentsFilterPageDateRangeLastThreeMonthsLabel": {},
|
||||
"documentsFilterPageDateRangeLastYearLabel": "Last Year",
|
||||
"@documentsFilterPageDateRangeLastYearLabel": {},
|
||||
"documentsFilterPageQueryOptionsAsnLabel": "ASN",
|
||||
"@documentsFilterPageQueryOptionsAsnLabel": {},
|
||||
"documentsFilterPageQueryOptionsExtendedLabel": "Extended",
|
||||
"@documentsFilterPageQueryOptionsExtendedLabel": {},
|
||||
"documentsFilterPageQueryOptionsTitleAndContentLabel": "Title & Content",
|
||||
"@documentsFilterPageQueryOptionsTitleAndContentLabel": {},
|
||||
"documentsFilterPageQueryOptionsTitleLabel": "Title",
|
||||
"@documentsFilterPageQueryOptionsTitleLabel": {},
|
||||
"documentsFilterPageResetFilterLabel": "Reset",
|
||||
"@documentsFilterPageResetFilterLabel": {},
|
||||
"documentsFilterPageSearchLabel": "Search",
|
||||
"@documentsFilterPageSearchLabel": {},
|
||||
"documentsFilterPageTitle": "Filter Documents",
|
||||
"@documentsFilterPageTitle": {},
|
||||
"documentsPageBulkDeleteSuccessfulText": "Documents successfully deleted.",
|
||||
"@documentsPageBulkDeleteSuccessfulText": {},
|
||||
"documentsPageEmptyStateNothingHereText": "There seems to be nothing here...",
|
||||
"@documentsPageEmptyStateNothingHereText": {},
|
||||
"documentsPageEmptyStateOopsText": "Oops.",
|
||||
"@documentsPageEmptyStateOopsText": {},
|
||||
"documentsPageOrderByLabel": "Order By",
|
||||
"@documentsPageOrderByLabel": {},
|
||||
"documentsPageSelectionBulkDeleteDialogContinueText": "This action is irreversible. Do you wish to proceed anyway?",
|
||||
"@documentsPageSelectionBulkDeleteDialogContinueText": {},
|
||||
"documentsPageSelectionBulkDeleteDialogTitle": "Confirm deletion",
|
||||
"@documentsPageSelectionBulkDeleteDialogTitle": {},
|
||||
"documentsPageSelectionBulkDeleteDialogWarningTextMany": "Are you sure you want to delete the following documents?",
|
||||
"@documentsPageSelectionBulkDeleteDialogWarningTextMany": {},
|
||||
"documentsPageSelectionBulkDeleteDialogWarningTextOne": "Are you sure you want to delete the following document?",
|
||||
"@documentsPageSelectionBulkDeleteDialogWarningTextOne": {},
|
||||
"documentsPageTitle": "Documents",
|
||||
"@documentsPageTitle": {},
|
||||
"documentsSelectedText": "selected",
|
||||
"@documentsSelectedText": {},
|
||||
"documentStoragePathPropertyLabel": "Storage Path",
|
||||
"@documentStoragePathPropertyLabel": {},
|
||||
"documentsUploadPageTitle": "Prepare document",
|
||||
"@documentsUploadPageTitle": {},
|
||||
"documentTagsPropertyLabel": "Tags",
|
||||
"@documentTagsPropertyLabel": {},
|
||||
"documentTitlePropertyLabel": "Title",
|
||||
"@documentTitlePropertyLabel": {},
|
||||
"documentTypeFormFieldSearchHintText": "Start typing...",
|
||||
"@documentTypeFormFieldSearchHintText": {},
|
||||
"documentUpdateSuccessMessage": "Document successfully updated.",
|
||||
"@documentUpdateSuccessMessage": {},
|
||||
"documentUploadFileNameLabel": "File Name",
|
||||
"@documentUploadFileNameLabel": {},
|
||||
"documentUploadPageSynchronizeTitleAndFilenameLabel": "Synchronize title and filename",
|
||||
"@documentUploadPageSynchronizeTitleAndFilenameLabel": {},
|
||||
"documentUploadProcessingSuccessfulReloadActionText": "Reload",
|
||||
"@documentUploadProcessingSuccessfulReloadActionText": {},
|
||||
"documentUploadProcessingSuccessfulText": "Document successfully processed.",
|
||||
"@documentUploadProcessingSuccessfulText": {},
|
||||
"documentUploadSuccessText": "Document successfully uploaded, processing...",
|
||||
"@documentUploadSuccessText": {},
|
||||
"editLabelPageConfirmDeletionDialogTitle": "Confirm deletion",
|
||||
"@editLabelPageConfirmDeletionDialogTitle": {},
|
||||
"editLabelPageDeletionDialogText": "This label contains references to other documents. By deleting this label, all references will be removed. Continue?",
|
||||
"@editLabelPageDeletionDialogText": {},
|
||||
"errorMessageAuthenticationFailed": "Authentication failed, please try again.",
|
||||
"@errorMessageAuthenticationFailed": {},
|
||||
"errorMessageAutocompleteQueryError": "An error ocurred while trying to autocomplete your query.",
|
||||
"@errorMessageAutocompleteQueryError": {},
|
||||
"errorMessageBiometricAuthenticationFailed": "Biometric authentication failed.",
|
||||
"@errorMessageBiometricAuthenticationFailed": {},
|
||||
"errorMessageBiotmetricsNotSupported": "Biometric authentication not supported on this device.",
|
||||
"@errorMessageBiotmetricsNotSupported": {},
|
||||
"errorMessageBulkActionFailed": "Could not bulk edit documents.",
|
||||
"@errorMessageBulkActionFailed": {},
|
||||
"errorMessageCorrespondentCreateFailed": "Could not create correspondent, please try again.",
|
||||
"@errorMessageCorrespondentCreateFailed": {},
|
||||
"errorMessageCorrespondentLoadFailed": "Could not load correspondents.",
|
||||
"@errorMessageCorrespondentLoadFailed": {},
|
||||
"errorMessageCreateSavedViewError": "Could not create saved view, please try again.",
|
||||
"@errorMessageCreateSavedViewError": {},
|
||||
"errorMessageDeleteSavedViewError": "Could not delete saved view, please try again",
|
||||
"@errorMessageDeleteSavedViewError": {},
|
||||
"errorMessageDeviceOffline": "Could not fetch data: You are not connected to the internet.",
|
||||
"@errorMessageDeviceOffline": {},
|
||||
"errorMessageDocumentAsnQueryFailed": "Could not assign archive serial number.",
|
||||
"@errorMessageDocumentAsnQueryFailed": {},
|
||||
"errorMessageDocumentDeleteFailed": "Could not delete document, please try again.",
|
||||
"@errorMessageDocumentDeleteFailed": {},
|
||||
"errorMessageDocumentLoadFailed": "Could not load documents, please try again.",
|
||||
"@errorMessageDocumentLoadFailed": {},
|
||||
"errorMessageDocumentPreviewFailed": "Could not load document preview.",
|
||||
"@errorMessageDocumentPreviewFailed": {},
|
||||
"errorMessageDocumentTypeCreateFailed": "Could not create document, please try again.",
|
||||
"@errorMessageDocumentTypeCreateFailed": {},
|
||||
"errorMessageDocumentTypeLoadFailed": "Could not load document types, please try again.",
|
||||
"@errorMessageDocumentTypeLoadFailed": {},
|
||||
"errorMessageDocumentUpdateFailed": "Could not update document, please try again.",
|
||||
"@errorMessageDocumentUpdateFailed": {},
|
||||
"errorMessageDocumentUploadFailed": "Could not upload document, please try again.",
|
||||
"@errorMessageDocumentUploadFailed": {},
|
||||
"errorMessageInvalidClientCertificateConfiguration": "Invalid certificate or missing passphrase, please try again",
|
||||
"@errorMessageInvalidClientCertificateConfiguration": {},
|
||||
"errorMessageLoadSavedViewsError": "Could not load saved views.",
|
||||
"@errorMessageLoadSavedViewsError": {},
|
||||
"errorMessageMissingClientCertificate": "A client certificate was expected but not sent. Please provide a valid client certificate.",
|
||||
"@errorMessageMissingClientCertificate": {},
|
||||
"errorMessageNotAuthenticated": "User is not authenticated.",
|
||||
"@errorMessageNotAuthenticated": {},
|
||||
"errorMessageRequestTimedOut": "The request to the server timed out.",
|
||||
"@errorMessageRequestTimedOut": {},
|
||||
"errorMessageScanRemoveFailed": "An error occurred removing the scans.",
|
||||
"@errorMessageScanRemoveFailed": {},
|
||||
"errorMessageServerUnreachable": "Could not reach your Paperless server, is it up and running?",
|
||||
"@errorMessageServerUnreachable": {},
|
||||
"errorMessageSimilarQueryError": "Could not load similar documents.",
|
||||
"@errorMessageSimilarQueryError": {},
|
||||
"errorMessageStoragePathCreateFailed": "Could not create storage path, please try again.",
|
||||
"@errorMessageStoragePathCreateFailed": {},
|
||||
"errorMessageStoragePathLoadFailed": "Could not load storage paths.",
|
||||
"@errorMessageStoragePathLoadFailed": {},
|
||||
"errorMessageTagCreateFailed": "Could not create tag, please try again.",
|
||||
"@errorMessageTagCreateFailed": {},
|
||||
"errorMessageTagLoadFailed": "Could not load tags.",
|
||||
"@errorMessageTagLoadFailed": {},
|
||||
"errorMessageUnknonwnError": "An unknown error occurred.",
|
||||
"@errorMessageUnknonwnError": {},
|
||||
"errorMessageUnsupportedFileFormat": "This file format is not supported.",
|
||||
"@errorMessageUnsupportedFileFormat": {},
|
||||
"errorReportLabel": "REPORT",
|
||||
"@errorReportLabel": {},
|
||||
"genericActionCancelLabel": "Cancel",
|
||||
"@genericActionCancelLabel": {},
|
||||
"genericActionCreateLabel": "Create",
|
||||
"@genericActionCreateLabel": {},
|
||||
"genericActionDeleteLabel": "Delete",
|
||||
"@genericActionDeleteLabel": {},
|
||||
"genericActionEditLabel": "Edit",
|
||||
"@genericActionEditLabel": {},
|
||||
"genericActionOkLabel": "Ok",
|
||||
"@genericActionOkLabel": {},
|
||||
"genericActionSaveLabel": "Save",
|
||||
"@genericActionSaveLabel": {},
|
||||
"genericActionSelectText": "Select",
|
||||
"@genericActionSelectText": {},
|
||||
"genericActionUpdateLabel": "Update",
|
||||
"@genericActionUpdateLabel": {},
|
||||
"genericActionUploadLabel": "Upload",
|
||||
"@genericActionUploadLabel": {},
|
||||
"genericMessageOfflineText": "You're offline. Check your connection.",
|
||||
"@genericMessageOfflineText": {},
|
||||
"inboxPageDocumentRemovedMessageText": "Document removed from inbox.",
|
||||
"@inboxPageDocumentRemovedMessageText": {},
|
||||
"inboxPageMarkAllAsSeenConfirmationDialogText": "Are you sure you want to mark all documents as seen? This will perform a bulk edit operation removing all inbox tags from the documents.\nThis action is not reversible! Are you sure you want to continue?",
|
||||
"@inboxPageMarkAllAsSeenConfirmationDialogText": {},
|
||||
"inboxPageMarkAllAsSeenConfirmationDialogTitleText": "Mark all as seen?",
|
||||
"@inboxPageMarkAllAsSeenConfirmationDialogTitleText": {},
|
||||
"inboxPageMarkAllAsSeenLabel": "Mark all as seen",
|
||||
"@inboxPageMarkAllAsSeenLabel": {},
|
||||
"inboxPageMarkAsSeenText": "Mark as seen",
|
||||
"@inboxPageMarkAsSeenText": {},
|
||||
"inboxPageTodayText": "Today",
|
||||
"@inboxPageTodayText": {},
|
||||
"inboxPageUndoRemoveText": "UNDO",
|
||||
"@inboxPageUndoRemoveText": {},
|
||||
"inboxPageUnseenText": "unseen",
|
||||
"@inboxPageUnseenText": {},
|
||||
"inboxPageUsageHintText": "Hint: Swipe left to mark a document as seen and remove all inbox tags from the document.",
|
||||
"@inboxPageUsageHintText": {},
|
||||
"inboxPageYesterdayText": "Yesterday",
|
||||
"@inboxPageYesterdayText": {},
|
||||
"labelAnyAssignedText": "Any assigned",
|
||||
"@labelAnyAssignedText": {},
|
||||
"labelFormFieldNoItemsFoundText": "No items found!",
|
||||
"@labelFormFieldNoItemsFoundText": {},
|
||||
"labelIsInsensivitePropertyLabel": "Case Irrelevant",
|
||||
"@labelIsInsensivitePropertyLabel": {},
|
||||
"labelMatchingAlgorithmPropertyLabel": "Matching Algorithm",
|
||||
"@labelMatchingAlgorithmPropertyLabel": {},
|
||||
"labelMatchPropertyLabel": "Match",
|
||||
"@labelMatchPropertyLabel": {},
|
||||
"labelNamePropertyLabel": "Name",
|
||||
"@labelNamePropertyLabel": {},
|
||||
"labelNotAssignedText": "Not assigned",
|
||||
"@labelNotAssignedText": {},
|
||||
"labelsPageCorrespondentEmptyStateAddNewLabel": "Add new correspondent",
|
||||
"@labelsPageCorrespondentEmptyStateAddNewLabel": {},
|
||||
"labelsPageCorrespondentEmptyStateDescriptionText": "You don't seem to have any correspondents set up.",
|
||||
"@labelsPageCorrespondentEmptyStateDescriptionText": {},
|
||||
"labelsPageCorrespondentsTitleText": "Correspondents",
|
||||
"@labelsPageCorrespondentsTitleText": {},
|
||||
"labelsPageDocumentTypeEmptyStateAddNewLabel": "Add new document type",
|
||||
"@labelsPageDocumentTypeEmptyStateAddNewLabel": {},
|
||||
"labelsPageDocumentTypeEmptyStateDescriptionText": "You don't seem to have any document types set up.",
|
||||
"@labelsPageDocumentTypeEmptyStateDescriptionText": {},
|
||||
"labelsPageDocumentTypesTitleText": "Document Types",
|
||||
"@labelsPageDocumentTypesTitleText": {},
|
||||
"labelsPageStoragePathEmptyStateAddNewLabel": "Add new storage path",
|
||||
"@labelsPageStoragePathEmptyStateAddNewLabel": {},
|
||||
"labelsPageStoragePathEmptyStateDescriptionText": "You don't seem to have any storage paths set up.",
|
||||
"@labelsPageStoragePathEmptyStateDescriptionText": {},
|
||||
"labelsPageStoragePathTitleText": "Storage Paths",
|
||||
"@labelsPageStoragePathTitleText": {},
|
||||
"labelsPageTagsEmptyStateAddNewLabel": "Add new tag",
|
||||
"@labelsPageTagsEmptyStateAddNewLabel": {},
|
||||
"labelsPageTagsEmptyStateDescriptionText": "You don't seem to have any tags set up.",
|
||||
"@labelsPageTagsEmptyStateDescriptionText": {},
|
||||
"labelsPageTagsTitleText": "Tags",
|
||||
"@labelsPageTagsTitleText": {},
|
||||
"linkedDocumentsPageTitle": "Linked Documents",
|
||||
"@linkedDocumentsPageTitle": {},
|
||||
"loginPageAdvancedLabel": "Advanced Settings",
|
||||
"@loginPageAdvancedLabel": {},
|
||||
"loginPageClientCertificatePassphraseLabel": "Passphrase",
|
||||
"@loginPageClientCertificatePassphraseLabel": {},
|
||||
"loginPageClientCertificateSettingDescriptionText": "Configure Mutual TLS Authentication",
|
||||
"@loginPageClientCertificateSettingDescriptionText": {},
|
||||
"loginPageClientCertificateSettingInvalidFileFormatValidationText": "Invalid certificate format, only .pfx is allowed",
|
||||
"@loginPageClientCertificateSettingInvalidFileFormatValidationText": {},
|
||||
"loginPageClientCertificateSettingLabel": "Client Certificate",
|
||||
"@loginPageClientCertificateSettingLabel": {},
|
||||
"loginPageClientCertificateSettingSelectFileText": "Select file...",
|
||||
"@loginPageClientCertificateSettingSelectFileText": {},
|
||||
"loginPageIncorrectOrMissingCertificatePassphraseErrorMessageText": "Incorrect or missing certificate passphrase.",
|
||||
"@loginPageIncorrectOrMissingCertificatePassphraseErrorMessageText": {},
|
||||
"loginPageLoginButtonLabel": "Connect",
|
||||
"@loginPageLoginButtonLabel": {},
|
||||
"loginPagePasswordFieldLabel": "Password",
|
||||
"@loginPagePasswordFieldLabel": {},
|
||||
"loginPagePasswordValidatorMessageText": "Password must not be empty.",
|
||||
"@loginPagePasswordValidatorMessageText": {},
|
||||
"loginPageServerUrlFieldLabel": "Server Address",
|
||||
"@loginPageServerUrlFieldLabel": {},
|
||||
"loginPageServerUrlValidatorMessageText": "Server address must not be empty.",
|
||||
"@loginPageServerUrlValidatorMessageText": {},
|
||||
"loginPageTitle": "Connect to Paperless",
|
||||
"@loginPageTitle": {},
|
||||
"loginPageUsernameLabel": "Username",
|
||||
"@loginPageUsernameLabel": {},
|
||||
"loginPageUsernameValidatorMessageText": "Username must not be empty.",
|
||||
"@loginPageUsernameValidatorMessageText": {},
|
||||
"offlineWidgetText": "An internet connection could not be established.",
|
||||
"@offlineWidgetText": {},
|
||||
"onboardingDoneButtonLabel": "Done",
|
||||
"@onboardingDoneButtonLabel": {},
|
||||
"onboardingNextButtonLabel": "Next",
|
||||
"@onboardingNextButtonLabel": {},
|
||||
"referencedDocumentsReadOnlyHintText": "This is a read-only view! You cannot edit or remove documents. A maximum of 100 referenced documents will be loaded.",
|
||||
"@referencedDocumentsReadOnlyHintText": {},
|
||||
"savedViewCreateNewLabel": "New View",
|
||||
"@savedViewCreateNewLabel": {},
|
||||
"savedViewCreateTooltipText": "Creates a new view based on the current filter criteria.",
|
||||
"@savedViewCreateTooltipText": {},
|
||||
"savedViewNameLabel": "Name",
|
||||
"@savedViewNameLabel": {},
|
||||
"savedViewsEmptyStateText": "Create views to quickly filter your documents.",
|
||||
"@savedViewsEmptyStateText": {},
|
||||
"savedViewShowInSidebarLabel": "Show in sidebar",
|
||||
"@savedViewShowInSidebarLabel": {},
|
||||
"savedViewShowOnDashboardLabel": "Show on dashboard",
|
||||
"@savedViewShowOnDashboardLabel": {},
|
||||
"savedViewsLabel": "Saved Views",
|
||||
"@savedViewsLabel": {},
|
||||
"serverInformationPaperlessVersionText": "Paperless server version",
|
||||
"@serverInformationPaperlessVersionText": {},
|
||||
"settingsPageAppearanceSettingDarkThemeLabel": "Dark Theme",
|
||||
"@settingsPageAppearanceSettingDarkThemeLabel": {},
|
||||
"settingsPageAppearanceSettingLightThemeLabel": "Light Theme",
|
||||
"@settingsPageAppearanceSettingLightThemeLabel": {},
|
||||
"settingsPageAppearanceSettingSystemThemeLabel": "Use system theme",
|
||||
"@settingsPageAppearanceSettingSystemThemeLabel": {},
|
||||
"settingsPageAppearanceSettingTitle": "Appearance",
|
||||
"@settingsPageAppearanceSettingTitle": {},
|
||||
"settingsPageApplicationSettingsDescriptionText": "Language and visual appearance",
|
||||
"@settingsPageApplicationSettingsDescriptionText": {},
|
||||
"settingsPageApplicationSettingsLabel": "Application",
|
||||
"@settingsPageApplicationSettingsLabel": {},
|
||||
"settingsPageLanguageSettingLabel": "Language",
|
||||
"@settingsPageLanguageSettingLabel": {},
|
||||
"settingsPageSecuritySettingsDescriptionText": "Biometric authentication",
|
||||
"@settingsPageSecuritySettingsDescriptionText": {},
|
||||
"settingsPageSecuritySettingsLabel": "Security",
|
||||
"@settingsPageSecuritySettingsLabel": {},
|
||||
"settingsPageStorageSettingsDescriptionText": "Manage files and storage space",
|
||||
"@settingsPageStorageSettingsDescriptionText": {},
|
||||
"settingsPageStorageSettingsLabel": "Storage",
|
||||
"@settingsPageStorageSettingsLabel": {},
|
||||
"settingsThemeModeDarkLabel": "Dark",
|
||||
"@settingsThemeModeDarkLabel": {},
|
||||
"settingsThemeModeLightLabel": "Light",
|
||||
"@settingsThemeModeLightLabel": {},
|
||||
"settingsThemeModeSystemLabel": "System",
|
||||
"@settingsThemeModeSystemLabel": {},
|
||||
"storagePathParameterDayLabel": "day",
|
||||
"@storagePathParameterDayLabel": {},
|
||||
"storagePathParameterMonthLabel": "month",
|
||||
"@storagePathParameterMonthLabel": {},
|
||||
"storagePathParameterYearLabel": "year",
|
||||
"@storagePathParameterYearLabel": {},
|
||||
"tagColorPropertyLabel": "Color",
|
||||
"@tagColorPropertyLabel": {},
|
||||
"tagFormFieldSearchHintText": "Filter tags...",
|
||||
"@tagFormFieldSearchHintText": {},
|
||||
"tagInboxTagPropertyLabel": "Inbox-Tag",
|
||||
"@tagInboxTagPropertyLabel": {},
|
||||
"uploadPageAutomaticallInferredFieldsHintText": "If you specify values for these fields, your paperless instance will not automatically derive a value. If you want these values to be automatically populated by your server, leave the fields blank.",
|
||||
"@uploadPageAutomaticallInferredFieldsHintText": {}
|
||||
}
|
||||
"@@locale": "en",
|
||||
"aboutDialogDevelopedByText": "Developed by",
|
||||
"@aboutDialogDevelopedByText": {},
|
||||
"addCorrespondentPageTitle": "New Correspondent",
|
||||
"@addCorrespondentPageTitle": {},
|
||||
"addDocumentTypePageTitle": "New Document Type",
|
||||
"@addDocumentTypePageTitle": {},
|
||||
"addStoragePathPageTitle": "New Storage Path",
|
||||
"@addStoragePathPageTitle": {},
|
||||
"addTagPageTitle": "New Tag",
|
||||
"@addTagPageTitle": {},
|
||||
"appDrawerAboutInfoLoadingText": "Retrieving application information...",
|
||||
"@appDrawerAboutInfoLoadingText": {},
|
||||
"appDrawerAboutLabel": "About this app",
|
||||
"@appDrawerAboutLabel": {},
|
||||
"appDrawerHeaderLoggedInAsText": "Logged in as ",
|
||||
"@appDrawerHeaderLoggedInAsText": {},
|
||||
"appDrawerLogoutLabel": "Disconnect",
|
||||
"@appDrawerLogoutLabel": {},
|
||||
"appDrawerReportBugLabel": "Report a Bug",
|
||||
"@appDrawerReportBugLabel": {},
|
||||
"appDrawerSettingsLabel": "Settings",
|
||||
"@appDrawerSettingsLabel": {},
|
||||
"appSettingsBiometricAuthenticationDescriptionText": "Authenticate on app start",
|
||||
"@appSettingsBiometricAuthenticationDescriptionText": {},
|
||||
"appSettingsBiometricAuthenticationLabel": "Biometric authentication",
|
||||
"@appSettingsBiometricAuthenticationLabel": {},
|
||||
"appSettingsDisableBiometricAuthenticationReasonText": "Authenticate to disable biometric authentication",
|
||||
"@appSettingsDisableBiometricAuthenticationReasonText": {},
|
||||
"appSettingsEnableBiometricAuthenticationReasonText": "Authenticate to enable biometric authentication",
|
||||
"@appSettingsEnableBiometricAuthenticationReasonText": {},
|
||||
"appTitleText": "Paperless Mobile",
|
||||
"@appTitleText": {},
|
||||
"bottomNavDocumentsPageLabel": "Documents",
|
||||
"@bottomNavDocumentsPageLabel": {},
|
||||
"bottomNavInboxPageLabel": "Inbox",
|
||||
"@bottomNavInboxPageLabel": {},
|
||||
"bottomNavLabelsPageLabel": "Labels",
|
||||
"@bottomNavLabelsPageLabel": {},
|
||||
"bottomNavScannerPageLabel": "Scanner",
|
||||
"@bottomNavScannerPageLabel": {},
|
||||
"correspondentFormFieldSearchHintText": "Start typing...",
|
||||
"@correspondentFormFieldSearchHintText": {},
|
||||
"deleteViewDialogContentText": "Do you really want to delete this view?",
|
||||
"@deleteViewDialogContentText": {},
|
||||
"deleteViewDialogTitleText": "Delete view ",
|
||||
"@deleteViewDialogTitleText": {},
|
||||
"documentAddedPropertyLabel": "Added At",
|
||||
"@documentAddedPropertyLabel": {},
|
||||
"documentArchiveSerialNumberPropertyLongLabel": "Archive Serial Number",
|
||||
"@documentArchiveSerialNumberPropertyLongLabel": {},
|
||||
"documentArchiveSerialNumberPropertyShortLabel": "ASN",
|
||||
"@documentArchiveSerialNumberPropertyShortLabel": {},
|
||||
"documentCorrespondentPropertyLabel": "Correspondent",
|
||||
"@documentCorrespondentPropertyLabel": {},
|
||||
"documentCreatedPropertyLabel": "Created At",
|
||||
"@documentCreatedPropertyLabel": {},
|
||||
"documentDeleteSuccessMessage": "Document successfully deleted.",
|
||||
"@documentDeleteSuccessMessage": {},
|
||||
"documentDetailsPageAssignAsnButtonLabel": "Assign",
|
||||
"@documentDetailsPageAssignAsnButtonLabel": {},
|
||||
"documentDetailsPageSimilarDocumentsLabel": "Similar Documents",
|
||||
"@documentDetailsPageSimilarDocumentsLabel": {},
|
||||
"documentDetailsPageTabContentLabel": "Content",
|
||||
"@documentDetailsPageTabContentLabel": {},
|
||||
"documentDetailsPageTabMetaDataLabel": "Meta Data",
|
||||
"@documentDetailsPageTabMetaDataLabel": {},
|
||||
"documentDetailsPageTabOverviewLabel": "Overview",
|
||||
"@documentDetailsPageTabOverviewLabel": {},
|
||||
"documentDocumentTypePropertyLabel": "Document Type",
|
||||
"@documentDocumentTypePropertyLabel": {},
|
||||
"documentEditPageTitle": "Edit Document",
|
||||
"@documentEditPageTitle": {},
|
||||
"documentMetaDataChecksumLabel": "Original MD5-Checksum",
|
||||
"@documentMetaDataChecksumLabel": {},
|
||||
"documentMetaDataMediaFilenamePropertyLabel": "Media Filename",
|
||||
"@documentMetaDataMediaFilenamePropertyLabel": {},
|
||||
"documentMetaDataOriginalFileSizeLabel": "Original File Size",
|
||||
"@documentMetaDataOriginalFileSizeLabel": {},
|
||||
"documentMetaDataOriginalMimeTypeLabel": "Original MIME-Type",
|
||||
"@documentMetaDataOriginalMimeTypeLabel": {},
|
||||
"documentModifiedPropertyLabel": "Modified At",
|
||||
"@documentModifiedPropertyLabel": {},
|
||||
"documentPreviewPageTitle": "Preview",
|
||||
"@documentPreviewPageTitle": {},
|
||||
"documentScannerPageAddScanButtonLabel": "Scan a document",
|
||||
"@documentScannerPageAddScanButtonLabel": {},
|
||||
"documentScannerPageEmptyStateText": "No documents scanned yet.",
|
||||
"@documentScannerPageEmptyStateText": {},
|
||||
"documentScannerPageOrText": "or",
|
||||
"@documentScannerPageOrText": {},
|
||||
"documentScannerPageResetButtonTooltipText": "Delete all scans",
|
||||
"@documentScannerPageResetButtonTooltipText": {},
|
||||
"documentScannerPageTitle": "Scan",
|
||||
"@documentScannerPageTitle": {},
|
||||
"documentScannerPageUploadButtonTooltip": "Upload to Paperless",
|
||||
"@documentScannerPageUploadButtonTooltip": {},
|
||||
"documentScannerPageUploadFromThisDeviceButtonLabel": "Upload a document from this device",
|
||||
"@documentScannerPageUploadFromThisDeviceButtonLabel": {},
|
||||
"documentsFilterPageAdvancedLabel": "Advanced",
|
||||
"@documentsFilterPageAdvancedLabel": {},
|
||||
"documentsFilterPageApplyFilterLabel": "Apply",
|
||||
"@documentsFilterPageApplyFilterLabel": {},
|
||||
"documentsFilterPageDateRangeFieldEndLabel": "To",
|
||||
"@documentsFilterPageDateRangeFieldEndLabel": {},
|
||||
"documentsFilterPageDateRangeFieldStartLabel": "From",
|
||||
"@documentsFilterPageDateRangeFieldStartLabel": {},
|
||||
"documentsFilterPageDateRangeLastMonthLabel": "Last Month",
|
||||
"@documentsFilterPageDateRangeLastMonthLabel": {},
|
||||
"documentsFilterPageDateRangeLastSevenDaysLabel": "Last 7 Days",
|
||||
"@documentsFilterPageDateRangeLastSevenDaysLabel": {},
|
||||
"documentsFilterPageDateRangeLastThreeMonthsLabel": "Last 3 Months",
|
||||
"@documentsFilterPageDateRangeLastThreeMonthsLabel": {},
|
||||
"documentsFilterPageDateRangeLastYearLabel": "Last Year",
|
||||
"@documentsFilterPageDateRangeLastYearLabel": {},
|
||||
"documentsFilterPageQueryOptionsAsnLabel": "ASN",
|
||||
"@documentsFilterPageQueryOptionsAsnLabel": {},
|
||||
"documentsFilterPageQueryOptionsExtendedLabel": "Extended",
|
||||
"@documentsFilterPageQueryOptionsExtendedLabel": {},
|
||||
"documentsFilterPageQueryOptionsTitleAndContentLabel": "Title & Content",
|
||||
"@documentsFilterPageQueryOptionsTitleAndContentLabel": {},
|
||||
"documentsFilterPageQueryOptionsTitleLabel": "Title",
|
||||
"@documentsFilterPageQueryOptionsTitleLabel": {},
|
||||
"documentsFilterPageResetFilterLabel": "Reset",
|
||||
"@documentsFilterPageResetFilterLabel": {},
|
||||
"documentsFilterPageSearchLabel": "Search",
|
||||
"@documentsFilterPageSearchLabel": {},
|
||||
"documentsFilterPageTitle": "Filter Documents",
|
||||
"@documentsFilterPageTitle": {},
|
||||
"documentsPageBulkDeleteSuccessfulText": "Documents successfully deleted.",
|
||||
"@documentsPageBulkDeleteSuccessfulText": {},
|
||||
"documentsPageEmptyStateNothingHereText": "There seems to be nothing here...",
|
||||
"@documentsPageEmptyStateNothingHereText": {},
|
||||
"documentsPageEmptyStateOopsText": "Oops.",
|
||||
"@documentsPageEmptyStateOopsText": {},
|
||||
"documentsPageOrderByLabel": "Order By",
|
||||
"@documentsPageOrderByLabel": {},
|
||||
"documentsPageSelectionBulkDeleteDialogContinueText": "This action is irreversible. Do you wish to proceed anyway?",
|
||||
"@documentsPageSelectionBulkDeleteDialogContinueText": {},
|
||||
"documentsPageSelectionBulkDeleteDialogTitle": "Confirm deletion",
|
||||
"@documentsPageSelectionBulkDeleteDialogTitle": {},
|
||||
"documentsPageSelectionBulkDeleteDialogWarningTextMany": "Are you sure you want to delete the following documents?",
|
||||
"@documentsPageSelectionBulkDeleteDialogWarningTextMany": {},
|
||||
"documentsPageSelectionBulkDeleteDialogWarningTextOne": "Are you sure you want to delete the following document?",
|
||||
"@documentsPageSelectionBulkDeleteDialogWarningTextOne": {},
|
||||
"documentsPageTitle": "Documents",
|
||||
"@documentsPageTitle": {},
|
||||
"documentsSelectedText": "selected",
|
||||
"@documentsSelectedText": {},
|
||||
"documentStoragePathPropertyLabel": "Storage Path",
|
||||
"@documentStoragePathPropertyLabel": {},
|
||||
"documentsUploadPageTitle": "Prepare document",
|
||||
"@documentsUploadPageTitle": {},
|
||||
"documentTagsPropertyLabel": "Tags",
|
||||
"@documentTagsPropertyLabel": {},
|
||||
"documentTitlePropertyLabel": "Title",
|
||||
"@documentTitlePropertyLabel": {},
|
||||
"documentTypeFormFieldSearchHintText": "Start typing...",
|
||||
"@documentTypeFormFieldSearchHintText": {},
|
||||
"documentUpdateSuccessMessage": "Document successfully updated.",
|
||||
"@documentUpdateSuccessMessage": {},
|
||||
"documentUploadFileNameLabel": "File Name",
|
||||
"@documentUploadFileNameLabel": {},
|
||||
"documentUploadPageSynchronizeTitleAndFilenameLabel": "Synchronize title and filename",
|
||||
"@documentUploadPageSynchronizeTitleAndFilenameLabel": {},
|
||||
"documentUploadProcessingSuccessfulReloadActionText": "Reload",
|
||||
"@documentUploadProcessingSuccessfulReloadActionText": {},
|
||||
"documentUploadProcessingSuccessfulText": "Document successfully processed.",
|
||||
"@documentUploadProcessingSuccessfulText": {},
|
||||
"documentUploadSuccessText": "Document successfully uploaded, processing...",
|
||||
"@documentUploadSuccessText": {},
|
||||
"editLabelPageConfirmDeletionDialogTitle": "Confirm deletion",
|
||||
"@editLabelPageConfirmDeletionDialogTitle": {},
|
||||
"editLabelPageDeletionDialogText": "This label contains references to other documents. By deleting this label, all references will be removed. Continue?",
|
||||
"@editLabelPageDeletionDialogText": {},
|
||||
"errorMessageAuthenticationFailed": "Authentication failed, please try again.",
|
||||
"@errorMessageAuthenticationFailed": {},
|
||||
"errorMessageAutocompleteQueryError": "An error ocurred while trying to autocomplete your query.",
|
||||
"@errorMessageAutocompleteQueryError": {},
|
||||
"errorMessageBiometricAuthenticationFailed": "Biometric authentication failed.",
|
||||
"@errorMessageBiometricAuthenticationFailed": {},
|
||||
"errorMessageBiotmetricsNotSupported": "Biometric authentication not supported on this device.",
|
||||
"@errorMessageBiotmetricsNotSupported": {},
|
||||
"errorMessageBulkActionFailed": "Could not bulk edit documents.",
|
||||
"@errorMessageBulkActionFailed": {},
|
||||
"errorMessageCorrespondentCreateFailed": "Could not create correspondent, please try again.",
|
||||
"@errorMessageCorrespondentCreateFailed": {},
|
||||
"errorMessageCorrespondentLoadFailed": "Could not load correspondents.",
|
||||
"@errorMessageCorrespondentLoadFailed": {},
|
||||
"errorMessageCreateSavedViewError": "Could not create saved view, please try again.",
|
||||
"@errorMessageCreateSavedViewError": {},
|
||||
"errorMessageDeleteSavedViewError": "Could not delete saved view, please try again",
|
||||
"@errorMessageDeleteSavedViewError": {},
|
||||
"errorMessageDeviceOffline": "Could not fetch data: You are not connected to the internet.",
|
||||
"@errorMessageDeviceOffline": {},
|
||||
"errorMessageDocumentAsnQueryFailed": "Could not assign archive serial number.",
|
||||
"@errorMessageDocumentAsnQueryFailed": {},
|
||||
"errorMessageDocumentDeleteFailed": "Could not delete document, please try again.",
|
||||
"@errorMessageDocumentDeleteFailed": {},
|
||||
"errorMessageDocumentLoadFailed": "Could not load documents, please try again.",
|
||||
"@errorMessageDocumentLoadFailed": {},
|
||||
"errorMessageDocumentPreviewFailed": "Could not load document preview.",
|
||||
"@errorMessageDocumentPreviewFailed": {},
|
||||
"errorMessageDocumentTypeCreateFailed": "Could not create document, please try again.",
|
||||
"@errorMessageDocumentTypeCreateFailed": {},
|
||||
"errorMessageDocumentTypeLoadFailed": "Could not load document types, please try again.",
|
||||
"@errorMessageDocumentTypeLoadFailed": {},
|
||||
"errorMessageDocumentUpdateFailed": "Could not update document, please try again.",
|
||||
"@errorMessageDocumentUpdateFailed": {},
|
||||
"errorMessageDocumentUploadFailed": "Could not upload document, please try again.",
|
||||
"@errorMessageDocumentUploadFailed": {},
|
||||
"errorMessageInvalidClientCertificateConfiguration": "Invalid certificate or missing passphrase, please try again",
|
||||
"@errorMessageInvalidClientCertificateConfiguration": {},
|
||||
"errorMessageLoadSavedViewsError": "Could not load saved views.",
|
||||
"@errorMessageLoadSavedViewsError": {},
|
||||
"errorMessageMissingClientCertificate": "A client certificate was expected but not sent. Please provide a valid client certificate.",
|
||||
"@errorMessageMissingClientCertificate": {},
|
||||
"errorMessageNotAuthenticated": "User is not authenticated.",
|
||||
"@errorMessageNotAuthenticated": {},
|
||||
"errorMessageRequestTimedOut": "The request to the server timed out.",
|
||||
"@errorMessageRequestTimedOut": {},
|
||||
"errorMessageScanRemoveFailed": "An error occurred removing the scans.",
|
||||
"@errorMessageScanRemoveFailed": {},
|
||||
"errorMessageServerUnreachable": "Could not reach your Paperless server, is it up and running?",
|
||||
"@errorMessageServerUnreachable": {},
|
||||
"errorMessageSimilarQueryError": "Could not load similar documents.",
|
||||
"@errorMessageSimilarQueryError": {},
|
||||
"errorMessageStoragePathCreateFailed": "Could not create storage path, please try again.",
|
||||
"@errorMessageStoragePathCreateFailed": {},
|
||||
"errorMessageStoragePathLoadFailed": "Could not load storage paths.",
|
||||
"@errorMessageStoragePathLoadFailed": {},
|
||||
"errorMessageTagCreateFailed": "Could not create tag, please try again.",
|
||||
"@errorMessageTagCreateFailed": {},
|
||||
"errorMessageTagLoadFailed": "Could not load tags.",
|
||||
"@errorMessageTagLoadFailed": {},
|
||||
"errorMessageUnknonwnError": "An unknown error occurred.",
|
||||
"@errorMessageUnknonwnError": {},
|
||||
"errorMessageUnsupportedFileFormat": "This file format is not supported.",
|
||||
"@errorMessageUnsupportedFileFormat": {},
|
||||
"errorReportLabel": "REPORT",
|
||||
"@errorReportLabel": {},
|
||||
"genericActionCancelLabel": "Cancel",
|
||||
"@genericActionCancelLabel": {},
|
||||
"genericActionCreateLabel": "Create",
|
||||
"@genericActionCreateLabel": {},
|
||||
"genericActionDeleteLabel": "Delete",
|
||||
"@genericActionDeleteLabel": {},
|
||||
"genericActionEditLabel": "Edit",
|
||||
"@genericActionEditLabel": {},
|
||||
"genericActionOkLabel": "Ok",
|
||||
"@genericActionOkLabel": {},
|
||||
"genericActionSaveLabel": "Save",
|
||||
"@genericActionSaveLabel": {},
|
||||
"genericActionSelectText": "Select",
|
||||
"@genericActionSelectText": {},
|
||||
"genericActionUpdateLabel": "Update",
|
||||
"@genericActionUpdateLabel": {},
|
||||
"genericActionUploadLabel": "Upload",
|
||||
"@genericActionUploadLabel": {},
|
||||
"genericMessageOfflineText": "You're offline. Check your connection.",
|
||||
"@genericMessageOfflineText": {},
|
||||
"inboxPageDocumentRemovedMessageText": "Document removed from inbox.",
|
||||
"@inboxPageDocumentRemovedMessageText": {},
|
||||
"inboxPageMarkAllAsSeenConfirmationDialogText": "Are you sure you want to mark all documents as seen? This will perform a bulk edit operation removing all inbox tags from the documents.\nThis action is not reversible! Are you sure you want to continue?",
|
||||
"@inboxPageMarkAllAsSeenConfirmationDialogText": {},
|
||||
"inboxPageMarkAllAsSeenConfirmationDialogTitleText": "Mark all as seen?",
|
||||
"@inboxPageMarkAllAsSeenConfirmationDialogTitleText": {},
|
||||
"inboxPageMarkAllAsSeenLabel": "Mark all as seen",
|
||||
"@inboxPageMarkAllAsSeenLabel": {},
|
||||
"inboxPageMarkAsSeenText": "Mark as seen",
|
||||
"@inboxPageMarkAsSeenText": {},
|
||||
"inboxPageTodayText": "Today",
|
||||
"@inboxPageTodayText": {},
|
||||
"inboxPageUndoRemoveText": "UNDO",
|
||||
"@inboxPageUndoRemoveText": {},
|
||||
"inboxPageUnseenText": "unseen",
|
||||
"@inboxPageUnseenText": {},
|
||||
"inboxPageUsageHintText": "Hint: Swipe left to mark a document as seen and remove all inbox tags from the document.",
|
||||
"@inboxPageUsageHintText": {},
|
||||
"inboxPageYesterdayText": "Yesterday",
|
||||
"@inboxPageYesterdayText": {},
|
||||
"labelAnyAssignedText": "Any assigned",
|
||||
"@labelAnyAssignedText": {},
|
||||
"labelFormFieldNoItemsFoundText": "No items found!",
|
||||
"@labelFormFieldNoItemsFoundText": {},
|
||||
"labelIsInsensivitePropertyLabel": "Case Irrelevant",
|
||||
"@labelIsInsensivitePropertyLabel": {},
|
||||
"labelMatchingAlgorithmPropertyLabel": "Matching Algorithm",
|
||||
"@labelMatchingAlgorithmPropertyLabel": {},
|
||||
"labelMatchPropertyLabel": "Match",
|
||||
"@labelMatchPropertyLabel": {},
|
||||
"labelNamePropertyLabel": "Name",
|
||||
"@labelNamePropertyLabel": {},
|
||||
"labelNotAssignedText": "Not assigned",
|
||||
"@labelNotAssignedText": {},
|
||||
"labelsPageCorrespondentEmptyStateAddNewLabel": "Add new correspondent",
|
||||
"@labelsPageCorrespondentEmptyStateAddNewLabel": {},
|
||||
"labelsPageCorrespondentEmptyStateDescriptionText": "You don't seem to have any correspondents set up.",
|
||||
"@labelsPageCorrespondentEmptyStateDescriptionText": {},
|
||||
"labelsPageCorrespondentsTitleText": "Correspondents",
|
||||
"@labelsPageCorrespondentsTitleText": {},
|
||||
"labelsPageDocumentTypeEmptyStateAddNewLabel": "Add new document type",
|
||||
"@labelsPageDocumentTypeEmptyStateAddNewLabel": {},
|
||||
"labelsPageDocumentTypeEmptyStateDescriptionText": "You don't seem to have any document types set up.",
|
||||
"@labelsPageDocumentTypeEmptyStateDescriptionText": {},
|
||||
"labelsPageDocumentTypesTitleText": "Document Types",
|
||||
"@labelsPageDocumentTypesTitleText": {},
|
||||
"labelsPageStoragePathEmptyStateAddNewLabel": "Add new storage path",
|
||||
"@labelsPageStoragePathEmptyStateAddNewLabel": {},
|
||||
"labelsPageStoragePathEmptyStateDescriptionText": "You don't seem to have any storage paths set up.",
|
||||
"@labelsPageStoragePathEmptyStateDescriptionText": {},
|
||||
"labelsPageStoragePathTitleText": "Storage Paths",
|
||||
"@labelsPageStoragePathTitleText": {},
|
||||
"labelsPageTagsEmptyStateAddNewLabel": "Add new tag",
|
||||
"@labelsPageTagsEmptyStateAddNewLabel": {},
|
||||
"labelsPageTagsEmptyStateDescriptionText": "You don't seem to have any tags set up.",
|
||||
"@labelsPageTagsEmptyStateDescriptionText": {},
|
||||
"labelsPageTagsTitleText": "Tags",
|
||||
"@labelsPageTagsTitleText": {},
|
||||
"linkedDocumentsPageTitle": "Linked Documents",
|
||||
"@linkedDocumentsPageTitle": {},
|
||||
"loginPageAdvancedLabel": "Advanced Settings",
|
||||
"@loginPageAdvancedLabel": {},
|
||||
"loginPageClientCertificatePassphraseLabel": "Passphrase",
|
||||
"@loginPageClientCertificatePassphraseLabel": {},
|
||||
"loginPageClientCertificateSettingDescriptionText": "Configure Mutual TLS Authentication",
|
||||
"@loginPageClientCertificateSettingDescriptionText": {},
|
||||
"loginPageClientCertificateSettingInvalidFileFormatValidationText": "Invalid certificate format, only .pfx is allowed",
|
||||
"@loginPageClientCertificateSettingInvalidFileFormatValidationText": {},
|
||||
"loginPageClientCertificateSettingLabel": "Client Certificate",
|
||||
"@loginPageClientCertificateSettingLabel": {},
|
||||
"loginPageClientCertificateSettingSelectFileText": "Select file...",
|
||||
"@loginPageClientCertificateSettingSelectFileText": {},
|
||||
"loginPageIncorrectOrMissingCertificatePassphraseErrorMessageText": "Incorrect or missing certificate passphrase.",
|
||||
"@loginPageIncorrectOrMissingCertificatePassphraseErrorMessageText": {},
|
||||
"loginPageLoginButtonLabel": "Connect",
|
||||
"@loginPageLoginButtonLabel": {},
|
||||
"loginPagePasswordFieldLabel": "Password",
|
||||
"@loginPagePasswordFieldLabel": {},
|
||||
"loginPagePasswordValidatorMessageText": "Password must not be empty.",
|
||||
"@loginPagePasswordValidatorMessageText": {},
|
||||
"loginPageServerUrlFieldLabel": "Server Address",
|
||||
"@loginPageServerUrlFieldLabel": {},
|
||||
"loginPageServerUrlValidatorMessageText": "Server address must not be empty.",
|
||||
"@loginPageServerUrlValidatorMessageText": {},
|
||||
"loginPageTitle": "Connect to Paperless",
|
||||
"@loginPageTitle": {},
|
||||
"loginPageUsernameLabel": "Username",
|
||||
"@loginPageUsernameLabel": {},
|
||||
"loginPageUsernameValidatorMessageText": "Username must not be empty.",
|
||||
"@loginPageUsernameValidatorMessageText": {},
|
||||
"offlineWidgetText": "An internet connection could not be established.",
|
||||
"@offlineWidgetText": {},
|
||||
"onboardingDoneButtonLabel": "Done",
|
||||
"@onboardingDoneButtonLabel": {},
|
||||
"onboardingNextButtonLabel": "Next",
|
||||
"@onboardingNextButtonLabel": {},
|
||||
"referencedDocumentsReadOnlyHintText": "This is a read-only view! You cannot edit or remove documents. A maximum of 100 referenced documents will be loaded.",
|
||||
"@referencedDocumentsReadOnlyHintText": {},
|
||||
"savedViewCreateNewLabel": "New View",
|
||||
"@savedViewCreateNewLabel": {},
|
||||
"savedViewCreateTooltipText": "Creates a new view based on the current filter criteria.",
|
||||
"@savedViewCreateTooltipText": {},
|
||||
"savedViewNameLabel": "Name",
|
||||
"@savedViewNameLabel": {},
|
||||
"savedViewsEmptyStateText": "Create views to quickly filter your documents.",
|
||||
"@savedViewsEmptyStateText": {},
|
||||
"savedViewShowInSidebarLabel": "Show in sidebar",
|
||||
"@savedViewShowInSidebarLabel": {},
|
||||
"savedViewShowOnDashboardLabel": "Show on dashboard",
|
||||
"@savedViewShowOnDashboardLabel": {},
|
||||
"savedViewsLabel": "Saved Views",
|
||||
"@savedViewsLabel": {},
|
||||
"serverInformationPaperlessVersionText": "Paperless server version",
|
||||
"@serverInformationPaperlessVersionText": {},
|
||||
"settingsPageAppearanceSettingDarkThemeLabel": "Dark Theme",
|
||||
"@settingsPageAppearanceSettingDarkThemeLabel": {},
|
||||
"settingsPageAppearanceSettingLightThemeLabel": "Light Theme",
|
||||
"@settingsPageAppearanceSettingLightThemeLabel": {},
|
||||
"settingsPageAppearanceSettingSystemThemeLabel": "Use system theme",
|
||||
"@settingsPageAppearanceSettingSystemThemeLabel": {},
|
||||
"settingsPageAppearanceSettingTitle": "Appearance",
|
||||
"@settingsPageAppearanceSettingTitle": {},
|
||||
"settingsPageApplicationSettingsDescriptionText": "Language and visual appearance",
|
||||
"@settingsPageApplicationSettingsDescriptionText": {},
|
||||
"settingsPageApplicationSettingsLabel": "Application",
|
||||
"@settingsPageApplicationSettingsLabel": {},
|
||||
"settingsPageLanguageSettingLabel": "Language",
|
||||
"@settingsPageLanguageSettingLabel": {},
|
||||
"settingsPageSecuritySettingsDescriptionText": "Biometric authentication",
|
||||
"@settingsPageSecuritySettingsDescriptionText": {},
|
||||
"settingsPageSecuritySettingsLabel": "Security",
|
||||
"@settingsPageSecuritySettingsLabel": {},
|
||||
"settingsPageStorageSettingsDescriptionText": "Manage files and storage space",
|
||||
"@settingsPageStorageSettingsDescriptionText": {},
|
||||
"settingsPageStorageSettingsLabel": "Storage",
|
||||
"@settingsPageStorageSettingsLabel": {},
|
||||
"settingsThemeModeDarkLabel": "Dark",
|
||||
"@settingsThemeModeDarkLabel": {},
|
||||
"settingsThemeModeLightLabel": "Light",
|
||||
"@settingsThemeModeLightLabel": {},
|
||||
"settingsThemeModeSystemLabel": "System",
|
||||
"@settingsThemeModeSystemLabel": {},
|
||||
"storagePathParameterDayLabel": "day",
|
||||
"@storagePathParameterDayLabel": {},
|
||||
"storagePathParameterMonthLabel": "month",
|
||||
"@storagePathParameterMonthLabel": {},
|
||||
"storagePathParameterYearLabel": "year",
|
||||
"@storagePathParameterYearLabel": {},
|
||||
"tagColorPropertyLabel": "Color",
|
||||
"@tagColorPropertyLabel": {},
|
||||
"tagFormFieldSearchHintText": "Filter tags...",
|
||||
"@tagFormFieldSearchHintText": {},
|
||||
"tagInboxTagPropertyLabel": "Inbox-Tag",
|
||||
"@tagInboxTagPropertyLabel": {},
|
||||
"uploadPageAutomaticallInferredFieldsHintText": "If you specify values for these fields, your paperless instance will not automatically derive a value. If you want these values to be automatically populated by your server, leave the fields blank.",
|
||||
"@uploadPageAutomaticallInferredFieldsHintText": {},
|
||||
"inboxPageNoNewDocumentsText": "You do not have unseen documents.",
|
||||
"inboxPageNoNewDocumentsRefreshLabel": "Refresh"
|
||||
}
|
||||
@@ -1,4 +1,3 @@
|
||||
import 'dart:developer';
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
@@ -11,15 +10,14 @@ import 'package:form_builder_validators/form_builder_validators.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
import 'package:intl/intl_standalone.dart';
|
||||
import 'package:package_info_plus/package_info_plus.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/core/bloc/bloc_changes_observer.dart';
|
||||
import 'package:paperless_mobile/core/bloc/connectivity_cubit.dart';
|
||||
import 'package:paperless_mobile/features/labels/bloc/global_state_bloc_provider.dart';
|
||||
import 'package:paperless_mobile/core/bloc/paperless_server_information_cubit.dart';
|
||||
import 'package:paperless_mobile/core/global/asset_images.dart';
|
||||
import 'package:paperless_mobile/core/global/constants.dart';
|
||||
import 'package:paperless_mobile/core/global/http_self_signed_certificate_override.dart';
|
||||
import 'package:paperless_mobile/core/logic/error_code_localization_mapper.dart';
|
||||
import 'package:paperless_mobile/core/model/error_message.dart';
|
||||
import 'package:paperless_mobile/core/service/file_service.dart';
|
||||
import 'package:paperless_mobile/di_initializer.dart';
|
||||
import 'package:paperless_mobile/features/app_intro/application_intro_slideshow.dart';
|
||||
@@ -119,15 +117,16 @@ class _PaperlessMobileEntrypointState extends State<PaperlessMobileEntrypoint> {
|
||||
supportedLocales: const [
|
||||
Locale('en'), // Default if system locale is not available
|
||||
Locale('de'),
|
||||
Locale('cs'),
|
||||
],
|
||||
locale: Locale.fromSubtags(
|
||||
languageCode: settings.preferredLocaleSubtag),
|
||||
localizationsDelegates: const [
|
||||
S.delegate,
|
||||
GlobalMaterialLocalizations.delegate,
|
||||
GlobalCupertinoLocalizations.delegate,
|
||||
GlobalWidgetsLocalizations.delegate,
|
||||
FormBuilderLocalizations.delegate,
|
||||
GlobalCupertinoLocalizations.delegate,
|
||||
],
|
||||
home: const AuthenticationWrapper(),
|
||||
);
|
||||
|
||||
@@ -1,21 +1,16 @@
|
||||
import 'dart:async';
|
||||
import 'dart:convert';
|
||||
import 'dart:developer';
|
||||
import 'dart:io';
|
||||
import 'dart:typed_data';
|
||||
import 'dart:ui';
|
||||
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:paperless_mobile/core/logic/error_code_localization_mapper.dart';
|
||||
import 'package:paperless_mobile/core/model/error_message.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
import 'package:package_info_plus/package_info_plus.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_mobile/core/logic/error_code_localization_mapper.dart';
|
||||
import 'package:paperless_mobile/core/service/github_issue_service.dart';
|
||||
import 'package:paperless_mobile/generated/intl/messages_de.dart';
|
||||
import 'package:paperless_mobile/generated/l10n.dart';
|
||||
import 'package:path_provider/path_provider.dart';
|
||||
|
||||
final dateFormat = DateFormat("yyyy-MM-dd");
|
||||
final GlobalKey<ScaffoldState> rootScaffoldKey = GlobalKey<ScaffoldState>();
|
||||
@@ -65,7 +60,7 @@ void showGenericError(
|
||||
|
||||
void showErrorMessage(
|
||||
BuildContext context,
|
||||
ErrorMessage error, [
|
||||
PaperlessServerException error, [
|
||||
StackTrace? stackTrace,
|
||||
]) {
|
||||
showSnackBar(
|
||||
|
||||
30
packages/paperless_api/.gitignore
vendored
Normal file
30
packages/paperless_api/.gitignore
vendored
Normal file
@@ -0,0 +1,30 @@
|
||||
# Miscellaneous
|
||||
*.class
|
||||
*.log
|
||||
*.pyc
|
||||
*.swp
|
||||
.DS_Store
|
||||
.atom/
|
||||
.buildlog/
|
||||
.history
|
||||
.svn/
|
||||
migrate_working_dir/
|
||||
|
||||
# IntelliJ related
|
||||
*.iml
|
||||
*.ipr
|
||||
*.iws
|
||||
.idea/
|
||||
|
||||
# The .vscode folder contains launch configuration and tasks you configure in
|
||||
# VS Code which you may wish to be included in version control, so this line
|
||||
# is commented out by default.
|
||||
#.vscode/
|
||||
|
||||
# Flutter/Dart/Pub related
|
||||
# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock.
|
||||
/pubspec.lock
|
||||
**/doc/api/
|
||||
.dart_tool/
|
||||
.packages
|
||||
build/
|
||||
10
packages/paperless_api/.metadata
Normal file
10
packages/paperless_api/.metadata
Normal file
@@ -0,0 +1,10 @@
|
||||
# This file tracks properties of this Flutter project.
|
||||
# Used by Flutter tool to assess capabilities and perform upgrades etc.
|
||||
#
|
||||
# This file should be version controlled and should not be manually edited.
|
||||
|
||||
version:
|
||||
revision: b8f7f1f9869bb2d116aa6a70dbeac61000b52849
|
||||
channel: stable
|
||||
|
||||
project_type: package
|
||||
3
packages/paperless_api/CHANGELOG.md
Normal file
3
packages/paperless_api/CHANGELOG.md
Normal file
@@ -0,0 +1,3 @@
|
||||
## 0.0.1
|
||||
|
||||
* TODO: Describe initial release.
|
||||
1
packages/paperless_api/LICENSE
Normal file
1
packages/paperless_api/LICENSE
Normal file
@@ -0,0 +1 @@
|
||||
TODO: Add your license here.
|
||||
39
packages/paperless_api/README.md
Normal file
39
packages/paperless_api/README.md
Normal file
@@ -0,0 +1,39 @@
|
||||
<!--
|
||||
This README describes the package. If you publish this package to pub.dev,
|
||||
this README's contents appear on the landing page for your package.
|
||||
|
||||
For information about how to write a good package README, see the guide for
|
||||
[writing package pages](https://dart.dev/guides/libraries/writing-package-pages).
|
||||
|
||||
For general information about developing packages, see the Dart guide for
|
||||
[creating packages](https://dart.dev/guides/libraries/create-library-packages)
|
||||
and the Flutter guide for
|
||||
[developing packages and plugins](https://flutter.dev/developing-packages).
|
||||
-->
|
||||
|
||||
TODO: Put a short description of the package here that helps potential users
|
||||
know whether this package might be useful for them.
|
||||
|
||||
## Features
|
||||
|
||||
TODO: List what your package can do. Maybe include images, gifs, or videos.
|
||||
|
||||
## Getting started
|
||||
|
||||
TODO: List prerequisites and provide or point to information on how to
|
||||
start using the package.
|
||||
|
||||
## Usage
|
||||
|
||||
TODO: Include short and useful examples for package users. Add longer examples
|
||||
to `/example` folder.
|
||||
|
||||
```dart
|
||||
const like = 'sample';
|
||||
```
|
||||
|
||||
## Additional information
|
||||
|
||||
TODO: Tell users more about the package: where to find more information, how to
|
||||
contribute to the package, how to file issues, what response they can expect
|
||||
from the package authors, and more.
|
||||
4
packages/paperless_api/analysis_options.yaml
Normal file
4
packages/paperless_api/analysis_options.yaml
Normal file
@@ -0,0 +1,4 @@
|
||||
include: package:flutter_lints/flutter.yaml
|
||||
|
||||
# Additional information about this file can be found at
|
||||
# https://dart.dev/guides/language/analysis-options
|
||||
4
packages/paperless_api/lib/paperless_api.dart
Normal file
4
packages/paperless_api/lib/paperless_api.dart
Normal file
@@ -0,0 +1,4 @@
|
||||
library paperless_api;
|
||||
|
||||
export 'src/models/models.dart';
|
||||
export 'src/modules/modules.dart';
|
||||
3
packages/paperless_api/lib/src/constants.dart
Normal file
3
packages/paperless_api/lib/src/constants.dart
Normal file
@@ -0,0 +1,3 @@
|
||||
import 'package:intl/intl.dart';
|
||||
|
||||
final DateFormat apiDateFormat = DateFormat('yyyy-MM-dd');
|
||||
@@ -1,18 +1,16 @@
|
||||
import 'package:paperless_mobile/core/type/types.dart';
|
||||
|
||||
abstract class BulkAction {
|
||||
final Iterable<int> documentIds;
|
||||
|
||||
BulkAction(this.documentIds);
|
||||
|
||||
JSON toJson();
|
||||
Map<String, dynamic> toJson();
|
||||
}
|
||||
|
||||
class BulkDeleteAction extends BulkAction {
|
||||
BulkDeleteAction(super.documents);
|
||||
|
||||
@override
|
||||
JSON toJson() {
|
||||
Map<String, dynamic> toJson() {
|
||||
return {
|
||||
'documents': documentIds.toList(),
|
||||
'method': 'delete',
|
||||
@@ -39,7 +37,7 @@ class BulkModifyTagsAction extends BulkAction {
|
||||
removeTags = tags;
|
||||
|
||||
@override
|
||||
JSON toJson() {
|
||||
Map<String, dynamic> toJson() {
|
||||
return {
|
||||
'documents': documentIds.toList(),
|
||||
'method': 'modify_tags',
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user