feat: Add improved date input, fix bugs, restructurings

This commit is contained in:
Anton Stubenbord
2023-10-20 17:28:54 +02:00
parent 18e178b644
commit 652abb6945
32 changed files with 840 additions and 775 deletions

View File

@@ -50,11 +50,16 @@ class _ArchiveSerialNumberFieldState extends State<ArchiveSerialNumberField> {
context.watch<LocalUserAccount>().paperlessUser.canEditDocuments;
return BlocListener<DocumentDetailsCubit, DocumentDetailsState>(
listenWhen: (previous, current) =>
previous is DocumentDetailsLoaded &&
current is DocumentDetailsLoaded &&
previous.document.archiveSerialNumber !=
current.document.archiveSerialNumber,
current.document.archiveSerialNumber,
listener: (context, state) {
_asnEditingController.text =
state.document.archiveSerialNumber?.toString() ?? '';
_asnEditingController.text = (state as DocumentDetailsLoaded)
.document
.archiveSerialNumber
?.toString() ??
'';
setState(() {
_canUpdate = false;
});

View File

@@ -1,26 +1,37 @@
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/highlighted_text.dart';
import 'package:paperless_mobile/core/widgets/shimmer_placeholder.dart';
import 'package:paperless_mobile/core/extensions/flutter_extensions.dart';
import 'package:paperless_mobile/features/document_details/cubit/document_details_cubit.dart';
import 'package:paperless_mobile/generated/l10n/app_localizations.dart';
class DocumentContentWidget extends StatelessWidget {
final bool isFullContentLoaded;
final String? queryString;
final DocumentModel document;
final String? queryString;
const DocumentContentWidget({
super.key,
required this.isFullContentLoaded,
required this.document,
this.queryString,
});
@override
Widget build(BuildContext context) {
final screenWidth = MediaQuery.sizeOf(context).width;
// if (document == null) {
// final widths = [.3, .8, .9, .7, .6, .4, .8, .8, .6, .4];
// return SliverToBoxAdapter(
// child: ShimmerPlaceholder(
// child: Column(
// children: [
// for (int i = 0; i < 10; i++)
// Container(
// width: MediaQuery.sizeOf(context).width * widths[i],
// height: 14,
// color: Colors.white,
// margin: EdgeInsets.symmetric(vertical: 4),
// ),
// ],
// ),
// ),
// );
// }
return SliverToBoxAdapter(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
@@ -31,21 +42,6 @@ class DocumentContentWidget extends StatelessWidget {
style: Theme.of(context).textTheme.bodyMedium,
caseSensitive: false,
),
if (!isFullContentLoaded)
ShimmerPlaceholder(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
for (var scale in [0.5, 0.9, 0.5, 0.8, 0.9, 0.9])
Container(
margin: const EdgeInsets.symmetric(vertical: 4),
width: screenWidth * scale,
height: 14,
color: Colors.white,
),
],
),
).paddedOnly(top: 4),
],
),
);

View File

@@ -4,87 +4,73 @@ import 'package:intl/intl.dart';
import 'package:paperless_api/paperless_api.dart';
import 'package:paperless_mobile/core/database/tables/local_user_account.dart';
import 'package:paperless_mobile/core/extensions/flutter_extensions.dart';
import 'package:paperless_mobile/features/document_details/cubit/document_details_cubit.dart';
import 'package:paperless_mobile/features/document_details/view/widgets/archive_serial_number_field.dart';
import 'package:paperless_mobile/features/document_details/view/widgets/details_item.dart';
import 'package:paperless_mobile/generated/l10n/app_localizations.dart';
import 'package:paperless_mobile/helpers/format_helpers.dart';
class DocumentMetaDataWidget extends StatefulWidget {
class DocumentMetaDataWidget extends StatelessWidget {
final DocumentModel document;
final DocumentMetaData metaData;
final double itemSpacing;
const DocumentMetaDataWidget({
super.key,
required this.document,
required this.metaData,
required this.itemSpacing,
});
@override
State<DocumentMetaDataWidget> createState() => _DocumentMetaDataWidgetState();
}
class _DocumentMetaDataWidgetState extends State<DocumentMetaDataWidget> {
@override
Widget build(BuildContext context) {
final currentUser = context.watch<LocalUserAccount>().paperlessUser;
return BlocBuilder<DocumentDetailsCubit, DocumentDetailsState>(
builder: (context, state) {
if (state.metaData == null) {
return const SliverToBoxAdapter(
child: Center(
child: CircularProgressIndicator(),
),
);
}
return SliverList(
delegate: SliverChildListDelegate(
[
if (currentUser.canEditDocuments)
ArchiveSerialNumberField(
document: widget.document,
).paddedOnly(bottom: widget.itemSpacing),
DetailsItem.text(
DateFormat.yMMMMd(Localizations.localeOf(context).toString())
.format(widget.document.modified),
context: context,
label: S.of(context)!.modifiedAt,
).paddedOnly(bottom: widget.itemSpacing),
DetailsItem.text(
DateFormat.yMMMMd(Localizations.localeOf(context).toString())
.format(widget.document.added),
context: context,
label: S.of(context)!.addedAt,
).paddedOnly(bottom: widget.itemSpacing),
DetailsItem.text(
state.metaData!.mediaFilename,
context: context,
label: S.of(context)!.mediaFilename,
).paddedOnly(bottom: widget.itemSpacing),
if (state.document.originalFileName != null)
DetailsItem.text(
state.document.originalFileName!,
context: context,
label: S.of(context)!.originalMD5Checksum,
).paddedOnly(bottom: widget.itemSpacing),
DetailsItem.text(
state.metaData!.originalChecksum,
context: context,
label: S.of(context)!.originalMD5Checksum,
).paddedOnly(bottom: widget.itemSpacing),
DetailsItem.text(
formatBytes(state.metaData!.originalSize, 2),
context: context,
label: S.of(context)!.originalFileSize,
).paddedOnly(bottom: widget.itemSpacing),
DetailsItem.text(
state.metaData!.originalMimeType,
context: context,
label: S.of(context)!.originalMIMEType,
).paddedOnly(bottom: widget.itemSpacing),
],
),
);
},
return SliverList(
delegate: SliverChildListDelegate(
[
if (currentUser.canEditDocuments)
ArchiveSerialNumberField(
document: document,
).paddedOnly(bottom: itemSpacing),
DetailsItem.text(
DateFormat.yMMMMd(Localizations.localeOf(context).toString())
.format(document.modified),
context: context,
label: S.of(context)!.modifiedAt,
).paddedOnly(bottom: itemSpacing),
DetailsItem.text(
DateFormat.yMMMMd(Localizations.localeOf(context).toString())
.format(document.added),
context: context,
label: S.of(context)!.addedAt,
).paddedOnly(bottom: itemSpacing),
DetailsItem.text(
metaData.mediaFilename,
context: context,
label: S.of(context)!.mediaFilename,
).paddedOnly(bottom: itemSpacing),
if (document.originalFileName != null)
DetailsItem.text(
document.originalFileName!,
context: context,
label: S.of(context)!.originalMD5Checksum,
).paddedOnly(bottom: itemSpacing),
DetailsItem.text(
metaData.originalChecksum,
context: context,
label: S.of(context)!.originalMD5Checksum,
).paddedOnly(bottom: itemSpacing),
DetailsItem.text(
formatBytes(metaData.originalSize, 2),
context: context,
label: S.of(context)!.originalFileSize,
).paddedOnly(bottom: itemSpacing),
DetailsItem.text(
metaData.originalMimeType,
context: context,
label: S.of(context)!.originalMIMEType,
).paddedOnly(bottom: itemSpacing),
],
),
);
}
}

View File

@@ -6,6 +6,7 @@ import 'package:paperless_mobile/core/database/tables/local_user_account.dart';
import 'package:paperless_mobile/core/repository/label_repository.dart';
import 'package:paperless_mobile/core/widgets/highlighted_text.dart';
import 'package:paperless_mobile/core/extensions/flutter_extensions.dart';
import 'package:paperless_mobile/core/widgets/shimmer_placeholder.dart';
import 'package:paperless_mobile/features/document_details/view/widgets/details_item.dart';
import 'package:paperless_mobile/features/labels/tags/view/widgets/tags_widget.dart';
import 'package:paperless_mobile/features/labels/view/widgets/label_text.dart';
@@ -27,6 +28,7 @@ class DocumentOverviewWidget extends StatelessWidget {
Widget build(BuildContext context) {
final user = context.watch<LocalUserAccount>().paperlessUser;
final availableLabels = context.watch<LabelRepository>().state;
return SliverList.list(
children: [
if (document.title.isNotEmpty)