feat: Add view type selection to linked documents view

This commit is contained in:
Anton Stubenbord
2023-02-10 16:09:36 +01:00
parent fc0b3240bb
commit 9abce08ef2
3 changed files with 66 additions and 23 deletions

View File

@@ -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_api/paperless_api.dart';
import 'package:paperless_mobile/core/notifier/document_changed_notifier.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/model/paged_documents_state.dart';
import 'package:paperless_mobile/features/paged_document_view/paged_documents_mixin.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'; part 'linked_documents_state.dart';
class LinkedDocumentsCubit extends Cubit<LinkedDocumentsState> part 'linked_documents_cubit.g.dart';
class LinkedDocumentsCubit extends HydratedCubit<LinkedDocumentsState>
with PagedDocumentsMixin { with PagedDocumentsMixin {
@override @override
final PaperlessDocumentsApi api; final PaperlessDocumentsApi api;
@@ -35,4 +39,18 @@ class LinkedDocumentsCubit extends Cubit<LinkedDocumentsState>
replace(document); replace(document);
} }
} }
void setViewType(ViewType type) {
emit(state.copyWith(viewType: type));
}
@override
LinkedDocumentsState? fromJson(Map<String, dynamic> json) {
return LinkedDocumentsState.fromJson(json);
}
@override
Map<String, dynamic>? toJson(LinkedDocumentsState state) {
return state.toJson();
}
} }

View File

@@ -1,7 +1,11 @@
part of 'linked_documents_cubit.dart'; part of 'linked_documents_cubit.dart';
@JsonSerializable(ignoreUnannotated: true)
class LinkedDocumentsState extends PagedDocumentsState { class LinkedDocumentsState extends PagedDocumentsState {
@JsonKey()
final ViewType viewType;
const LinkedDocumentsState({ const LinkedDocumentsState({
this.viewType = ViewType.list,
super.filter, super.filter,
super.isLoading, super.isLoading,
super.hasLoaded, super.hasLoaded,
@@ -13,12 +17,14 @@ class LinkedDocumentsState extends PagedDocumentsState {
bool? isLoading, bool? isLoading,
bool? hasLoaded, bool? hasLoaded,
List<PagedSearchResult<DocumentModel>>? value, List<PagedSearchResult<DocumentModel>>? value,
ViewType? viewType,
}) { }) {
return LinkedDocumentsState( return LinkedDocumentsState(
filter: filter ?? this.filter, filter: filter ?? this.filter,
isLoading: isLoading ?? this.isLoading, isLoading: isLoading ?? this.isLoading,
hasLoaded: hasLoaded ?? this.hasLoaded, hasLoaded: hasLoaded ?? this.hasLoaded,
value: value ?? this.value, value: value ?? this.value,
viewType: viewType ?? this.viewType,
); );
} }
@@ -39,9 +45,12 @@ class LinkedDocumentsState extends PagedDocumentsState {
@override @override
List<Object?> get props => [ List<Object?> get props => [
filter, viewType,
isLoading, ...super.props,
hasLoaded,
value,
]; ];
factory LinkedDocumentsState.fromJson(Map<String, dynamic> json) =>
_$LinkedDocumentsStateFromJson(json);
Map<String, dynamic> toJson() => _$LinkedDocumentsStateToJson(this);
} }

View File

@@ -3,6 +3,7 @@ import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:paperless_api/paperless_api.dart'; import 'package:paperless_api/paperless_api.dart';
import 'package:paperless_mobile/core/bloc/connectivity_cubit.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/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/features/linked_documents/cubit/linked_documents_cubit.dart';
import 'package:paperless_mobile/generated/l10n.dart'; import 'package:paperless_mobile/generated/l10n.dart';
import 'package:paperless_mobile/helpers/message_helpers.dart'; import 'package:paperless_mobile/helpers/message_helpers.dart';
@@ -43,28 +44,43 @@ class _LinkedDocumentsPageState extends State<LinkedDocumentsPage> {
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
title: Text(S.of(context).linkedDocumentsPageTitle), title: Text(S.of(context).linkedDocumentsPageTitle),
actions: [
BlocBuilder<LinkedDocumentsCubit, LinkedDocumentsState>(
builder: (context, state) {
return ViewTypeSelectionWidget(
viewType: state.viewType,
onChanged: context.read<LinkedDocumentsCubit>().setViewType,
);
},
),
],
), ),
body: BlocBuilder<LinkedDocumentsCubit, LinkedDocumentsState>( body: BlocBuilder<LinkedDocumentsCubit, LinkedDocumentsState>(
builder: (context, state) { builder: (context, state) {
return BlocBuilder<ConnectivityCubit, ConnectivityState>( return BlocBuilder<ConnectivityCubit, ConnectivityState>(
builder: (context, connectivity) { builder: (context, connectivity) {
return DefaultAdaptiveDocumentsView( return CustomScrollView(
scrollController: _scrollController, controller: _scrollController,
documents: state.documents, slivers: [
hasInternetConnection: connectivity.isConnected, SliverAdaptiveDocumentsView(
isLabelClickable: false, viewType: state.viewType,
isLoading: state.isLoading, documents: state.documents,
hasLoaded: state.hasLoaded, hasInternetConnection: connectivity.isConnected,
onTap: (document) { isLabelClickable: false,
Navigator.pushNamed( isLoading: state.isLoading,
context, hasLoaded: state.hasLoaded,
DocumentDetailsRoute.routeName, onTap: (document) {
arguments: DocumentDetailsRouteArguments( Navigator.pushNamed(
document: document, context,
isLabelClickable: false, DocumentDetailsRoute.routeName,
), arguments: DocumentDetailsRouteArguments(
); document: document,
}, isLabelClickable: false,
),
);
},
),
],
); );
}, },
); );