feat: Add new view type, WIP

This commit is contained in:
Anton Stubenbord
2023-02-12 19:31:04 +01:00
parent 681d551b56
commit 26b283b83a
3 changed files with 64 additions and 60 deletions

View File

@@ -18,7 +18,6 @@ import 'package:paperless_mobile/features/saved_view/cubit/saved_view_cubit.dart
import 'package:paperless_mobile/features/saved_view/view/add_saved_view_page.dart'; import 'package:paperless_mobile/features/saved_view/view/add_saved_view_page.dart';
import 'package:paperless_mobile/features/saved_view/view/saved_view_list.dart'; import 'package:paperless_mobile/features/saved_view/view/saved_view_list.dart';
import 'package:paperless_mobile/features/search_app_bar/view/search_app_bar.dart'; import 'package:paperless_mobile/features/search_app_bar/view/search_app_bar.dart';
import 'package:paperless_mobile/features/settings/model/view_type.dart';
import 'package:paperless_mobile/features/tasks/cubit/task_status_cubit.dart'; import 'package:paperless_mobile/features/tasks/cubit/task_status_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';
@@ -243,67 +242,68 @@ class _DocumentsPageState extends State<DocumentsPage>
children: [ children: [
Builder( Builder(
builder: (context) { builder: (context) {
final itemHeight =
MediaQuery.sizeOf(context).height -
MediaQuery.viewInsetsOf(context).bottom -
MediaQuery.viewInsetsOf(context).top -
kToolbarHeight -
kTextTabBarHeight -
56;
return RefreshIndicator( return RefreshIndicator(
edgeOffset: kToolbarHeight + kTextTabBarHeight, edgeOffset: kToolbarHeight + kTextTabBarHeight,
onRefresh: _onReloadDocuments, onRefresh: _onReloadDocuments,
notificationPredicate: (_) => notificationPredicate: (_) =>
connectivityState.isConnected, connectivityState.isConnected,
child: child: CustomScrollView(
key: const PageStorageKey<String>("documents"),
slivers: <Widget>[
SliverOverlapInjector(
handle: NestedScrollView
.sliverOverlapAbsorberHandleFor(
context),
),
_buildViewActions(),
BlocBuilder<DocumentsCubit, DocumentsState>( BlocBuilder<DocumentsCubit, DocumentsState>(
builder: (context, state) { builder: (context, state) {
return CustomScrollView( if (state.hasLoaded &&
key: const PageStorageKey<String>( state.documents.isEmpty) {
"documents"), return SliverToBoxAdapter(
slivers: <Widget>[ child: DocumentsEmptyState(
SliverOverlapInjector( state: state,
handle: NestedScrollView onReset: () {
.sliverOverlapAbsorberHandleFor( context
context), .read<DocumentsCubit>()
), .resetFilter();
_buildViewActions(), },
Builder( ),
builder: (context) { );
if (state.hasLoaded && }
state.documents.isEmpty) {
return SliverToBoxAdapter(
child: DocumentsEmptyState(
state: state,
onReset: () {
context
.read<DocumentsCubit>()
.resetFilter();
},
),
);
}
return SliverAdaptiveDocumentsView( return SliverAdaptiveDocumentsView(
viewType: state.viewType, viewType: state.viewType,
onTap: _openDetails, maxItemExtent: itemHeight,
onSelected: context onTap: _openDetails,
.read<DocumentsCubit>() onSelected: context
.toggleDocumentSelection, .read<DocumentsCubit>()
hasInternetConnection: .toggleDocumentSelection,
connectivityState.isConnected, hasInternetConnection:
onTagSelected: _addTagToFilter, connectivityState.isConnected,
onCorrespondentSelected: onTagSelected: _addTagToFilter,
_addCorrespondentToFilter, onCorrespondentSelected:
onDocumentTypeSelected: _addCorrespondentToFilter,
_addDocumentTypeToFilter, onDocumentTypeSelected:
onStoragePathSelected: _addDocumentTypeToFilter,
_addStoragePathToFilter, onStoragePathSelected:
documents: state.documents, _addStoragePathToFilter,
hasLoaded: state.hasLoaded, documents: state.documents,
isLabelClickable: true, hasLoaded: state.hasLoaded,
isLoading: state.isLoading, isLabelClickable: true,
selectedDocumentIds: isLoading: state.isLoading,
state.selectedIds, selectedDocumentIds: state.selectedIds,
); );
}, },
), ),
], ],
);
},
), ),
); );
}, },

View File

@@ -23,6 +23,7 @@ abstract class AdaptiveDocumentsView extends StatelessWidget {
final void Function(int? id)? onCorrespondentSelected; final void Function(int? id)? onCorrespondentSelected;
final void Function(int? id)? onDocumentTypeSelected; final void Function(int? id)? onDocumentTypeSelected;
final void Function(int? id)? onStoragePathSelected; final void Function(int? id)? onStoragePathSelected;
final double maxItemExtent;
bool get showLoadingPlaceholder => (!hasLoaded && isLoading); bool get showLoadingPlaceholder => (!hasLoaded && isLoading);
const AdaptiveDocumentsView({ const AdaptiveDocumentsView({
@@ -41,6 +42,7 @@ abstract class AdaptiveDocumentsView extends StatelessWidget {
required this.isLoading, required this.isLoading,
required this.hasLoaded, required this.hasLoaded,
this.enableHeroAnimation = true, this.enableHeroAnimation = true,
required this.maxItemExtent,
}); });
} }
@@ -61,6 +63,7 @@ class SliverAdaptiveDocumentsView extends AdaptiveDocumentsView {
super.enableHeroAnimation, super.enableHeroAnimation,
required super.isLoading, required super.isLoading,
required super.hasLoaded, required super.hasLoaded,
super.maxItemExtent = double.infinity,
}); });
@override @override
@@ -71,7 +74,7 @@ class SliverAdaptiveDocumentsView extends AdaptiveDocumentsView {
case ViewType.list: case ViewType.list:
return _buildListView(); return _buildListView();
case ViewType.detailed: case ViewType.detailed:
return _buildFullView(); return _buildFullView(context);
} }
} }
@@ -104,18 +107,19 @@ class SliverAdaptiveDocumentsView extends AdaptiveDocumentsView {
); );
} }
Widget _buildFullView() { Widget _buildFullView(BuildContext context) {
if (showLoadingPlaceholder) { if (showLoadingPlaceholder) {
//TODO: Build detailed loading animation //TODO: Build detailed loading animation
return DocumentsListLoadingWidget.sliver(); return DocumentsListLoadingWidget.sliver();
} }
return SliverList( return SliverFixedExtentList(
itemExtent: maxItemExtent,
delegate: SliverChildBuilderDelegate( delegate: SliverChildBuilderDelegate(
childCount: documents.length, childCount: documents.length,
(context, index) { (context, index) {
final document = documents.elementAt(index); final document = documents.elementAt(index);
return LabelRepositoriesProvider( return LabelRepositoriesProvider(
child: DocumentDetailedItem( child: DocumentGridItem(
isLabelClickable: isLabelClickable, isLabelClickable: isLabelClickable,
document: document, document: document,
onTap: onTap, onTap: onTap,
@@ -185,6 +189,7 @@ class DefaultAdaptiveDocumentsView extends AdaptiveDocumentsView {
super.selectedDocumentIds, super.selectedDocumentIds,
super.viewType, super.viewType,
super.enableHeroAnimation = true, super.enableHeroAnimation = true,
super.maxItemExtent = double.infinity,
}); });
@override @override

View File

@@ -1,4 +1,3 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:paperless_mobile/features/documents/view/widgets/document_preview.dart'; import 'package:paperless_mobile/features/documents/view/widgets/document_preview.dart';
import 'package:paperless_mobile/features/documents/view/widgets/items/document_item.dart'; import 'package:paperless_mobile/features/documents/view/widgets/items/document_item.dart';