More work on inbox, refactorings (bloc separation of concerns), fixed saved views wrong sort order

This commit is contained in:
Anton Stubenbord
2022-11-29 01:09:36 +01:00
parent 5edbdabf26
commit 50190f035e
43 changed files with 605 additions and 463 deletions

View File

@@ -1,11 +1,11 @@
import 'package:flutter/widgets.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:paperless_mobile/di_initializer.dart';
import 'package:paperless_mobile/features/documents/bloc/saved_view_cubit.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/labels/storage_path/bloc/storage_path_cubit.dart';
import 'package:paperless_mobile/features/labels/tags/bloc/tags_cubit.dart';
import 'package:paperless_mobile/features/saved_view/bloc/saved_view_cubit.dart';
class GlobalStateBlocProvider extends StatelessWidget {
final List<BlocProvider> additionalProviders;

View File

@@ -1,7 +1,6 @@
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/bloc/paperless_statistics_cubit.dart';
import 'package:paperless_mobile/core/model/error_message.dart';
import 'package:paperless_mobile/features/documents/bloc/documents_cubit.dart';
import 'package:paperless_mobile/features/documents/model/document_filter.dart';
@@ -24,8 +23,6 @@ class EditTagPage extends StatelessWidget {
label: tag,
onSubmit: (tag) async {
await BlocProvider.of<TagCubit>(context).replace(tag);
//If inbox property was added/removed from tag, the number of documents in inbox may increase/decrease.
BlocProvider.of<PaperlessStatisticsCubit>(context).updateStatistics();
},
onDelete: (tag) => _onDelete(tag, context),
fromJson: Tag.fromJson,

View File

@@ -1,80 +1,43 @@
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/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/tags_query.dart';
import 'package:paperless_mobile/features/labels/tags/model/tag.model.dart';
import 'package:paperless_mobile/util.dart';
class TagWidget extends StatelessWidget {
final Tag tag;
final void Function()? afterTagTapped;
final VoidCallback? afterTagTapped;
final VoidCallback onSelected;
final bool isSelected;
final bool isClickable;
const TagWidget({
super.key,
required this.tag,
required this.afterTagTapped,
this.isClickable = true,
required this.onSelected,
required this.isSelected,
});
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.only(right: 4.0),
child: BlocBuilder<DocumentsCubit, DocumentsState>(
builder: (context, state) {
final isIdsQuery = state.filter.tags is IdsTagsQuery;
return FilterChip(
selected: isIdsQuery
? (state.filter.tags as IdsTagsQuery)
.includedIds
.contains(tag.id)
: false,
selectedColor: tag.color,
onSelected: (_) => _addTagToFilter(context),
visualDensity: const VisualDensity(vertical: -2),
materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
label: Text(
tag.name,
style: TextStyle(color: tag.textColor),
),
checkmarkColor: tag.textColor,
backgroundColor: tag.color,
side: BorderSide.none,
);
},
child: AbsorbPointer(
absorbing: !isClickable,
child: FilterChip(
selected: isSelected,
selectedColor: tag.color,
onSelected: (_) => onSelected(),
visualDensity: const VisualDensity(vertical: -2),
materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
label: Text(
tag.name,
style: TextStyle(color: tag.textColor),
),
checkmarkColor: tag.textColor,
backgroundColor: tag.color,
side: BorderSide.none,
),
),
);
}
void _addTagToFilter(BuildContext context) {
if (!isClickable) {
return;
}
final cubit = BlocProvider.of<DocumentsCubit>(context);
try {
final tagsQuery = cubit.state.filter.tags is IdsTagsQuery
? cubit.state.filter.tags as IdsTagsQuery
: const IdsTagsQuery();
if (tagsQuery.includedIds.contains(tag.id)) {
cubit.updateCurrentFilter(
(filter) => filter.copyWith(
tags: tagsQuery.withIdsRemoved([tag.id!]),
),
);
} else {
cubit.updateCurrentFilter(
(filter) => filter.copyWith(
tags: tagsQuery.withIdQueriesAdded([IncludeTagIdQuery(tag.id!)]),
),
);
}
if (afterTagTapped != null) {
afterTagTapped!();
}
} on ErrorMessage catch (error, stackTrace) {
showErrorMessage(context, error, stackTrace);
}
}
}

View File

@@ -1,5 +1,3 @@
import 'dart:developer';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:paperless_mobile/features/labels/model/label_state.dart';
@@ -10,8 +8,10 @@ import 'package:paperless_mobile/features/labels/tags/view/widgets/tag_widget.da
class TagsWidget extends StatefulWidget {
final Iterable<int> tagIds;
final bool isMultiLine;
final void Function()? afterTagTapped;
final VoidCallback? afterTagTapped;
final void Function(int tagId) onTagSelected;
final bool isClickable;
final bool Function(int id) isSelectedPredicate;
const TagsWidget({
Key? key,
@@ -19,6 +19,8 @@ class TagsWidget extends StatefulWidget {
this.afterTagTapped,
this.isMultiLine = true,
this.isClickable = true,
required this.isSelectedPredicate,
required this.onTagSelected,
}) : super(key: key);
@override
@@ -37,6 +39,8 @@ class _TagsWidgetState extends State<TagsWidget> {
tag: state.getLabel(id)!,
afterTagTapped: widget.afterTagTapped,
isClickable: widget.isClickable,
isSelected: widget.isSelectedPredicate(id),
onSelected: () => widget.onTagSelected(id),
),
)
.toList();

View File

@@ -1,6 +1,5 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:paperless_mobile/core/bloc/paperless_statistics_cubit.dart';
import 'package:paperless_mobile/features/labels/bloc/global_state_bloc_provider.dart';
import 'package:paperless_mobile/di_initializer.dart';
import 'package:paperless_mobile/features/documents/bloc/documents_cubit.dart';
@@ -218,7 +217,6 @@ class _LabelsPageState extends State<LabelsPage>
builder: (_) => GlobalStateBlocProvider(
additionalProviders: [
BlocProvider.value(value: BlocProvider.of<DocumentsCubit>(context)),
BlocProvider.value(value: getIt<PaperlessStatisticsCubit>()),
],
child: EditTagPage(tag: tag),
),