From 9abce08ef23a072f0f1406354bb5179fa8d77aa3 Mon Sep 17 00:00:00 2001 From: Anton Stubenbord Date: Fri, 10 Feb 2023 16:09:36 +0100 Subject: [PATCH] feat: Add view type selection to linked documents view --- .../cubit/linked_documents_cubit.dart | 22 +++++++- .../cubit/linked_documents_state.dart | 17 +++++-- .../view/linked_documents_page.dart | 50 ++++++++++++------- 3 files changed, 66 insertions(+), 23 deletions(-) diff --git a/lib/features/linked_documents/cubit/linked_documents_cubit.dart b/lib/features/linked_documents/cubit/linked_documents_cubit.dart index 534ff94..a4ee175 100644 --- a/lib/features/linked_documents/cubit/linked_documents_cubit.dart +++ b/lib/features/linked_documents/cubit/linked_documents_cubit.dart @@ -1,11 +1,15 @@ -import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:hydrated_bloc/hydrated_bloc.dart'; +import 'package:json_annotation/json_annotation.dart'; import 'package:paperless_api/paperless_api.dart'; import 'package:paperless_mobile/core/notifier/document_changed_notifier.dart'; import 'package:paperless_mobile/features/paged_document_view/model/paged_documents_state.dart'; import 'package:paperless_mobile/features/paged_document_view/paged_documents_mixin.dart'; +import 'package:paperless_mobile/features/settings/model/view_type.dart'; part 'linked_documents_state.dart'; -class LinkedDocumentsCubit extends Cubit +part 'linked_documents_cubit.g.dart'; + +class LinkedDocumentsCubit extends HydratedCubit with PagedDocumentsMixin { @override final PaperlessDocumentsApi api; @@ -35,4 +39,18 @@ class LinkedDocumentsCubit extends Cubit replace(document); } } + + void setViewType(ViewType type) { + emit(state.copyWith(viewType: type)); + } + + @override + LinkedDocumentsState? fromJson(Map json) { + return LinkedDocumentsState.fromJson(json); + } + + @override + Map? toJson(LinkedDocumentsState state) { + return state.toJson(); + } } diff --git a/lib/features/linked_documents/cubit/linked_documents_state.dart b/lib/features/linked_documents/cubit/linked_documents_state.dart index 25c497e..29877a6 100644 --- a/lib/features/linked_documents/cubit/linked_documents_state.dart +++ b/lib/features/linked_documents/cubit/linked_documents_state.dart @@ -1,7 +1,11 @@ part of 'linked_documents_cubit.dart'; +@JsonSerializable(ignoreUnannotated: true) class LinkedDocumentsState extends PagedDocumentsState { + @JsonKey() + final ViewType viewType; const LinkedDocumentsState({ + this.viewType = ViewType.list, super.filter, super.isLoading, super.hasLoaded, @@ -13,12 +17,14 @@ class LinkedDocumentsState extends PagedDocumentsState { bool? isLoading, bool? hasLoaded, List>? value, + ViewType? viewType, }) { return LinkedDocumentsState( filter: filter ?? this.filter, isLoading: isLoading ?? this.isLoading, hasLoaded: hasLoaded ?? this.hasLoaded, value: value ?? this.value, + viewType: viewType ?? this.viewType, ); } @@ -39,9 +45,12 @@ class LinkedDocumentsState extends PagedDocumentsState { @override List get props => [ - filter, - isLoading, - hasLoaded, - value, + viewType, + ...super.props, ]; + + factory LinkedDocumentsState.fromJson(Map json) => + _$LinkedDocumentsStateFromJson(json); + + Map toJson() => _$LinkedDocumentsStateToJson(this); } diff --git a/lib/features/linked_documents/view/linked_documents_page.dart b/lib/features/linked_documents/view/linked_documents_page.dart index a6bb77f..7b97e7a 100644 --- a/lib/features/linked_documents/view/linked_documents_page.dart +++ b/lib/features/linked_documents/view/linked_documents_page.dart @@ -3,6 +3,7 @@ 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/documents/view/widgets/adaptive_documents_view.dart'; +import 'package:paperless_mobile/features/documents/view/widgets/selection/view_type_selection_widget.dart'; import 'package:paperless_mobile/features/linked_documents/cubit/linked_documents_cubit.dart'; import 'package:paperless_mobile/generated/l10n.dart'; import 'package:paperless_mobile/helpers/message_helpers.dart'; @@ -43,28 +44,43 @@ class _LinkedDocumentsPageState extends State { return Scaffold( appBar: AppBar( title: Text(S.of(context).linkedDocumentsPageTitle), + actions: [ + BlocBuilder( + builder: (context, state) { + return ViewTypeSelectionWidget( + viewType: state.viewType, + onChanged: context.read().setViewType, + ); + }, + ), + ], ), body: BlocBuilder( builder: (context, state) { return BlocBuilder( builder: (context, connectivity) { - return DefaultAdaptiveDocumentsView( - scrollController: _scrollController, - documents: state.documents, - hasInternetConnection: connectivity.isConnected, - isLabelClickable: false, - isLoading: state.isLoading, - hasLoaded: state.hasLoaded, - onTap: (document) { - Navigator.pushNamed( - context, - DocumentDetailsRoute.routeName, - arguments: DocumentDetailsRouteArguments( - document: document, - isLabelClickable: false, - ), - ); - }, + return CustomScrollView( + controller: _scrollController, + slivers: [ + SliverAdaptiveDocumentsView( + viewType: state.viewType, + documents: state.documents, + hasInternetConnection: connectivity.isConnected, + isLabelClickable: false, + isLoading: state.isLoading, + hasLoaded: state.hasLoaded, + onTap: (document) { + Navigator.pushNamed( + context, + DocumentDetailsRoute.routeName, + arguments: DocumentDetailsRouteArguments( + document: document, + isLabelClickable: false, + ), + ); + }, + ), + ], ); }, );