mirror of
https://github.com/Xevion/paperless-mobile.git
synced 2025-12-06 07:15:43 -06:00
feat: Re-implement set filters count
This commit is contained in:
@@ -22,7 +22,6 @@ import 'package:paperless_mobile/features/saved_view/view/saved_view_list.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/app_localizations.dart';
|
import 'package:paperless_mobile/generated/l10n/app_localizations.dart';
|
||||||
import 'package:paperless_mobile/helpers/message_helpers.dart';
|
import 'package:paperless_mobile/helpers/message_helpers.dart';
|
||||||
import 'package:sliver_tools/sliver_tools.dart';
|
|
||||||
|
|
||||||
class DocumentFilterIntent {
|
class DocumentFilterIntent {
|
||||||
final DocumentFilter? filter;
|
final DocumentFilter? filter;
|
||||||
@@ -120,30 +119,60 @@ class _DocumentsPageState extends State<DocumentsPage>
|
|||||||
builder: (context, state) {
|
builder: (context, state) {
|
||||||
final appliedFiltersCount = state.filter.appliedFiltersCount;
|
final appliedFiltersCount = state.filter.appliedFiltersCount;
|
||||||
final show = state.selection.isEmpty;
|
final show = state.selection.isEmpty;
|
||||||
|
final canReset = state.filter.appliedFiltersCount > 0;
|
||||||
return AnimatedScale(
|
return AnimatedScale(
|
||||||
scale: show ? 1 : 0,
|
scale: show ? 1 : 0,
|
||||||
duration: const Duration(milliseconds: 200),
|
duration: const Duration(milliseconds: 200),
|
||||||
curve: Curves.easeIn,
|
curve: Curves.easeIn,
|
||||||
child: b.Badge(
|
child: Column(
|
||||||
position: b.BadgePosition.topEnd(top: -12, end: -6),
|
mainAxisAlignment: MainAxisAlignment.end,
|
||||||
showBadge: appliedFiltersCount > 0,
|
children: [
|
||||||
badgeContent: Text(
|
if (canReset)
|
||||||
'$appliedFiltersCount',
|
Padding(
|
||||||
style: const TextStyle(
|
padding: const EdgeInsets.all(8.0),
|
||||||
color: Colors.white,
|
child: FloatingActionButton.small(
|
||||||
),
|
key: UniqueKey(),
|
||||||
),
|
backgroundColor: Theme.of(context)
|
||||||
animationType: b.BadgeAnimationType.fade,
|
.colorScheme
|
||||||
badgeColor: Colors.red,
|
.onPrimaryContainer,
|
||||||
child: _currentTab == 0
|
onPressed: () {
|
||||||
? FloatingActionButton(
|
context.read<DocumentsCubit>().updateFilter();
|
||||||
child: const Icon(Icons.filter_alt_outlined),
|
},
|
||||||
onPressed: _openDocumentFilter,
|
child: Icon(
|
||||||
)
|
Icons.refresh,
|
||||||
: FloatingActionButton(
|
color: Theme.of(context)
|
||||||
child: const Icon(Icons.add),
|
.colorScheme
|
||||||
onPressed: () => _onCreateSavedView(state.filter),
|
.primaryContainer,
|
||||||
|
),
|
||||||
),
|
),
|
||||||
|
),
|
||||||
|
b.Badge(
|
||||||
|
position: b.BadgePosition.topEnd(top: -12, end: -6),
|
||||||
|
showBadge: appliedFiltersCount > 0,
|
||||||
|
badgeContent: Text(
|
||||||
|
'$appliedFiltersCount',
|
||||||
|
style: const TextStyle(
|
||||||
|
color: Colors.white,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
animationType: b.BadgeAnimationType.fade,
|
||||||
|
badgeColor: Colors.red,
|
||||||
|
child: AnimatedSwitcher(
|
||||||
|
duration: const Duration(milliseconds: 250),
|
||||||
|
child: (_currentTab == 0)
|
||||||
|
? FloatingActionButton(
|
||||||
|
child:
|
||||||
|
const Icon(Icons.filter_alt_outlined),
|
||||||
|
onPressed: _openDocumentFilter,
|
||||||
|
)
|
||||||
|
: FloatingActionButton(
|
||||||
|
child: const Icon(Icons.add),
|
||||||
|
onPressed: () =>
|
||||||
|
_onCreateSavedView(state.filter),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import 'package:hive/hive.dart';
|
import 'package:hive/hive.dart';
|
||||||
import 'package:paperless_api/paperless_api.dart';
|
import 'package:paperless_api/paperless_api.dart';
|
||||||
|
import 'package:paperless_api/src/models/query_parameters/date_range_queries/date_range_unit.dart';
|
||||||
|
|
||||||
class PaperlessApiHiveTypeIds {
|
class PaperlessApiHiveTypeIds {
|
||||||
PaperlessApiHiveTypeIds._();
|
PaperlessApiHiveTypeIds._();
|
||||||
|
|||||||
@@ -3,6 +3,8 @@ import 'package:equatable/equatable.dart';
|
|||||||
import 'package:hive/hive.dart';
|
import 'package:hive/hive.dart';
|
||||||
import 'package:json_annotation/json_annotation.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_api/src/models/query_parameters/date_range_queries/date_range_query.dart';
|
||||||
|
import 'package:paperless_api/src/models/query_parameters/date_range_queries/date_range_query_field.dart';
|
||||||
|
|
||||||
part 'document_filter.g.dart';
|
part 'document_filter.g.dart';
|
||||||
|
|
||||||
@@ -187,16 +189,45 @@ class DocumentFilter extends Equatable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int get appliedFiltersCount => [
|
int get appliedFiltersCount => [
|
||||||
documentType != initial.documentType,
|
documentType.maybeWhen(
|
||||||
correspondent != initial.correspondent,
|
unset: () => 0,
|
||||||
storagePath != initial.storagePath,
|
orElse: () => 1,
|
||||||
tags != initial.tags,
|
),
|
||||||
added != initial.added,
|
correspondent.maybeWhen(
|
||||||
created != initial.created,
|
unset: () => 0,
|
||||||
modified != initial.modified,
|
orElse: () => 1,
|
||||||
asnQuery != initial.asnQuery,
|
),
|
||||||
((query.queryText ?? '') != (initial.query.queryText ?? '')),
|
storagePath.maybeWhen(
|
||||||
].fold(0, (previousValue, element) => previousValue += element ? 1 : 0);
|
unset: () => 0,
|
||||||
|
orElse: () => 1,
|
||||||
|
),
|
||||||
|
tags.maybeWhen(
|
||||||
|
ids: (include, exclude) => include.length + exclude.length,
|
||||||
|
anyAssigned: (tagIds) => tagIds.length,
|
||||||
|
notAssigned: () => 1,
|
||||||
|
orElse: () => 0,
|
||||||
|
),
|
||||||
|
switch (added) {
|
||||||
|
RelativeDateRangeQuery() => 1,
|
||||||
|
AbsoluteDateRangeQuery() => 1,
|
||||||
|
UnsetDateRangeQuery() => 0,
|
||||||
|
},
|
||||||
|
switch (created) {
|
||||||
|
RelativeDateRangeQuery() => 1,
|
||||||
|
AbsoluteDateRangeQuery() => 1,
|
||||||
|
UnsetDateRangeQuery() => 0,
|
||||||
|
},
|
||||||
|
switch (modified) {
|
||||||
|
RelativeDateRangeQuery() => 1,
|
||||||
|
AbsoluteDateRangeQuery() => 1,
|
||||||
|
UnsetDateRangeQuery() => 0,
|
||||||
|
},
|
||||||
|
asnQuery.maybeWhen(
|
||||||
|
unset: () => 0,
|
||||||
|
orElse: () => 1,
|
||||||
|
),
|
||||||
|
(query.queryText?.isNotEmpty ?? false) ? 1 : 0,
|
||||||
|
].fold(0, (previousValue, element) => previousValue + element);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
List<Object?> get props => [
|
List<Object?> get props => [
|
||||||
|
|||||||
@@ -5,6 +5,9 @@ import 'package:json_annotation/json_annotation.dart';
|
|||||||
import 'package:paperless_api/paperless_api.dart';
|
import 'package:paperless_api/paperless_api.dart';
|
||||||
import 'package:paperless_api/src/constants.dart';
|
import 'package:paperless_api/src/constants.dart';
|
||||||
import 'package:paperless_api/src/converters/local_date_time_json_converter.dart';
|
import 'package:paperless_api/src/converters/local_date_time_json_converter.dart';
|
||||||
|
import 'package:paperless_api/src/models/query_parameters/date_range_queries/date_range_query.dart';
|
||||||
|
import 'package:paperless_api/src/models/query_parameters/date_range_queries/date_range_query_field.dart';
|
||||||
|
import 'package:paperless_api/src/models/query_parameters/date_range_queries/date_range_unit.dart';
|
||||||
|
|
||||||
part 'filter_rule_model.g.dart';
|
part 'filter_rule_model.g.dart';
|
||||||
|
|
||||||
@@ -73,7 +76,9 @@ class FilterRule with EquatableMixin {
|
|||||||
);
|
);
|
||||||
case hasAnyTag:
|
case hasAnyTag:
|
||||||
return filter.copyWith(
|
return filter.copyWith(
|
||||||
tags: value == "true" ? const TagsQuery.anyAssigned() : const TagsQuery.notAssigned(),
|
tags: value == "true"
|
||||||
|
? const TagsQuery.anyAssigned()
|
||||||
|
: const TagsQuery.notAssigned(),
|
||||||
);
|
);
|
||||||
case includeTagsRule:
|
case includeTagsRule:
|
||||||
assert(filter.tags is IdsTagsQuery);
|
assert(filter.tags is IdsTagsQuery);
|
||||||
@@ -105,7 +110,8 @@ class FilterRule with EquatableMixin {
|
|||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
return filter.copyWith(
|
return filter.copyWith(
|
||||||
created: AbsoluteDateRangeQuery(before: _dateTimeConverter.fromJson(value!)),
|
created: AbsoluteDateRangeQuery(
|
||||||
|
before: _dateTimeConverter.fromJson(value!)),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
case createdAfterRule:
|
case createdAfterRule:
|
||||||
@@ -116,7 +122,8 @@ class FilterRule with EquatableMixin {
|
|||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
return filter.copyWith(
|
return filter.copyWith(
|
||||||
created: AbsoluteDateRangeQuery(after: _dateTimeConverter.fromJson(value!)),
|
created: AbsoluteDateRangeQuery(
|
||||||
|
after: _dateTimeConverter.fromJson(value!)),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
case addedBeforeRule:
|
case addedBeforeRule:
|
||||||
@@ -127,7 +134,8 @@ class FilterRule with EquatableMixin {
|
|||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
return filter.copyWith(
|
return filter.copyWith(
|
||||||
added: AbsoluteDateRangeQuery(before: _dateTimeConverter.fromJson(value!)),
|
added: AbsoluteDateRangeQuery(
|
||||||
|
before: _dateTimeConverter.fromJson(value!)),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
case addedAfterRule:
|
case addedAfterRule:
|
||||||
@@ -138,7 +146,8 @@ class FilterRule with EquatableMixin {
|
|||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
return filter.copyWith(
|
return filter.copyWith(
|
||||||
added: AbsoluteDateRangeQuery(after: _dateTimeConverter.fromJson(value!)),
|
added: AbsoluteDateRangeQuery(
|
||||||
|
after: _dateTimeConverter.fromJson(value!)),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
case modifiedBeforeRule:
|
case modifiedBeforeRule:
|
||||||
@@ -149,7 +158,8 @@ class FilterRule with EquatableMixin {
|
|||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
return filter.copyWith(
|
return filter.copyWith(
|
||||||
modified: AbsoluteDateRangeQuery(before: _dateTimeConverter.fromJson(value!)),
|
modified: AbsoluteDateRangeQuery(
|
||||||
|
before: _dateTimeConverter.fromJson(value!)),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
case modifiedAfterRule:
|
case modifiedAfterRule:
|
||||||
@@ -160,7 +170,8 @@ class FilterRule with EquatableMixin {
|
|||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
return filter.copyWith(
|
return filter.copyWith(
|
||||||
added: AbsoluteDateRangeQuery(after: _dateTimeConverter.fromJson(value!)),
|
added: AbsoluteDateRangeQuery(
|
||||||
|
after: _dateTimeConverter.fromJson(value!)),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
case titleAndContentRule:
|
case titleAndContentRule:
|
||||||
@@ -273,7 +284,8 @@ class FilterRule with EquatableMixin {
|
|||||||
filterRules.add(FilterRule(titleRule, filter.query.queryText!));
|
filterRules.add(FilterRule(titleRule, filter.query.queryText!));
|
||||||
break;
|
break;
|
||||||
case QueryType.titleAndContent:
|
case QueryType.titleAndContent:
|
||||||
filterRules.add(FilterRule(titleAndContentRule, filter.query.queryText!));
|
filterRules
|
||||||
|
.add(FilterRule(titleAndContentRule, filter.query.queryText!));
|
||||||
break;
|
break;
|
||||||
case QueryType.extended:
|
case QueryType.extended:
|
||||||
filterRules.add(FilterRule(extendedRule, filter.query.queryText!));
|
filterRules.add(FilterRule(extendedRule, filter.query.queryText!));
|
||||||
@@ -299,8 +311,8 @@ class FilterRule with EquatableMixin {
|
|||||||
}
|
}
|
||||||
} else if (created is RelativeDateRangeQuery) {
|
} else if (created is RelativeDateRangeQuery) {
|
||||||
filterRules.add(
|
filterRules.add(
|
||||||
FilterRule(
|
FilterRule(extendedRule,
|
||||||
extendedRule, created.toQueryParameter(DateRangeQueryField.created).values.first),
|
created.toQueryParameter(DateRangeQueryField.created).values.first),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -319,7 +331,8 @@ class FilterRule with EquatableMixin {
|
|||||||
}
|
}
|
||||||
} else if (added is RelativeDateRangeQuery) {
|
} else if (added is RelativeDateRangeQuery) {
|
||||||
filterRules.add(
|
filterRules.add(
|
||||||
FilterRule(extendedRule, added.toQueryParameter(DateRangeQueryField.added).values.first),
|
FilterRule(extendedRule,
|
||||||
|
added.toQueryParameter(DateRangeQueryField.added).values.first),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -333,18 +346,25 @@ class FilterRule with EquatableMixin {
|
|||||||
}
|
}
|
||||||
if (modified.before != null) {
|
if (modified.before != null) {
|
||||||
filterRules.add(
|
filterRules.add(
|
||||||
FilterRule(modifiedBeforeRule, apiDateFormat.format(modified.before!)),
|
FilterRule(
|
||||||
|
modifiedBeforeRule, apiDateFormat.format(modified.before!)),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
} else if (modified is RelativeDateRangeQuery) {
|
} else if (modified is RelativeDateRangeQuery) {
|
||||||
filterRules.add(
|
filterRules.add(
|
||||||
FilterRule(
|
FilterRule(
|
||||||
extendedRule, modified.toQueryParameter(DateRangeQueryField.modified).values.first),
|
extendedRule,
|
||||||
|
modified
|
||||||
|
.toQueryParameter(DateRangeQueryField.modified)
|
||||||
|
.values
|
||||||
|
.first),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Join values of all extended filter rules if exist
|
//Join values of all extended filter rules if exist
|
||||||
if (filterRules.where((e) => e.ruleType == FilterRule.extendedRule).isNotEmpty) {
|
if (filterRules
|
||||||
|
.where((e) => e.ruleType == FilterRule.extendedRule)
|
||||||
|
.isNotEmpty) {
|
||||||
final mergedExtendedRule = filterRules
|
final mergedExtendedRule = filterRules
|
||||||
.where((r) => r.ruleType == FilterRule.extendedRule)
|
.where((r) => r.ruleType == FilterRule.extendedRule)
|
||||||
.map((e) => e.value)
|
.map((e) => e.value)
|
||||||
@@ -368,5 +388,6 @@ class FilterRule with EquatableMixin {
|
|||||||
|
|
||||||
Map<String, dynamic> toJson() => _$FilterRuleToJson(this);
|
Map<String, dynamic> toJson() => _$FilterRuleToJson(this);
|
||||||
|
|
||||||
factory FilterRule.fromJson(Map<String, dynamic> json) => _$FilterRuleFromJson(json);
|
factory FilterRule.fromJson(Map<String, dynamic> json) =>
|
||||||
|
_$FilterRuleFromJson(json);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,32 +1,33 @@
|
|||||||
|
export 'bulk_edit_model.dart';
|
||||||
|
export 'document_filter.dart';
|
||||||
|
export 'document_meta_data_model.dart';
|
||||||
|
export 'document_model.dart';
|
||||||
|
export 'field_suggestions.dart';
|
||||||
|
export 'filter_rule_model.dart';
|
||||||
|
export 'group_model.dart';
|
||||||
export 'labels/correspondent_model.dart';
|
export 'labels/correspondent_model.dart';
|
||||||
export 'labels/document_type_model.dart';
|
export 'labels/document_type_model.dart';
|
||||||
export 'labels/label_model.dart';
|
export 'labels/label_model.dart';
|
||||||
export 'labels/matching_algorithm.dart';
|
export 'labels/matching_algorithm.dart';
|
||||||
export 'labels/storage_path_model.dart';
|
export 'labels/storage_path_model.dart';
|
||||||
export 'labels/tag_model.dart';
|
export 'labels/tag_model.dart';
|
||||||
export 'query_parameters/id_query_parameter.dart';
|
|
||||||
export 'query_parameters/query_type.dart';
|
|
||||||
export 'query_parameters/sort_field.dart';
|
|
||||||
export 'query_parameters/sort_order.dart';
|
|
||||||
export 'query_parameters/date_range_queries/date_range_queries.dart';
|
|
||||||
export 'query_parameters/tags_query/tags_query.dart';
|
|
||||||
export 'query_parameters/text_query.dart';
|
|
||||||
export 'bulk_edit_model.dart';
|
|
||||||
export 'document_filter.dart';
|
|
||||||
export 'document_meta_data_model.dart';
|
|
||||||
export 'document_model.dart';
|
|
||||||
export 'filter_rule_model.dart';
|
|
||||||
export 'paged_search_result.dart';
|
export 'paged_search_result.dart';
|
||||||
export 'paperless_server_exception.dart';
|
export 'paperless_server_exception.dart';
|
||||||
export 'paperless_server_information_model.dart';
|
export 'paperless_server_information_model.dart';
|
||||||
export 'paperless_server_statistics_model.dart';
|
export 'paperless_server_statistics_model.dart';
|
||||||
|
export 'permissions/inherited_permissions.dart';
|
||||||
|
export 'permissions/permissions.dart';
|
||||||
|
export 'permissions/user_permission_extension.dart';
|
||||||
|
export 'permissions/user_permissions.dart';
|
||||||
|
export 'query_parameters/date_range_queries/date_range_query.dart';
|
||||||
|
export 'query_parameters/date_range_queries/date_range_unit.dart';
|
||||||
|
export 'query_parameters/id_query_parameter.dart';
|
||||||
|
export 'query_parameters/query_type.dart';
|
||||||
|
export 'query_parameters/sort_field.dart';
|
||||||
|
export 'query_parameters/sort_order.dart';
|
||||||
|
export 'query_parameters/tags_query/tags_query.dart';
|
||||||
|
export 'query_parameters/text_query.dart';
|
||||||
export 'saved_view_model.dart';
|
export 'saved_view_model.dart';
|
||||||
export 'task/task.dart';
|
export 'task/task.dart';
|
||||||
export 'task/task_status.dart';
|
export 'task/task_status.dart';
|
||||||
export 'field_suggestions.dart';
|
|
||||||
export 'permissions/permissions.dart';
|
|
||||||
export 'permissions/user_permissions.dart';
|
|
||||||
export 'permissions/inherited_permissions.dart';
|
|
||||||
export 'group_model.dart';
|
|
||||||
export 'user_model.dart';
|
export 'user_model.dart';
|
||||||
export 'permissions/user_permission_extension.dart';
|
|
||||||
|
|||||||
@@ -1,72 +0,0 @@
|
|||||||
import 'package:hive/hive.dart';
|
|
||||||
import 'package:json_annotation/json_annotation.dart';
|
|
||||||
import 'package:paperless_api/config/hive/hive_type_ids.dart';
|
|
||||||
import 'package:paperless_api/src/constants.dart';
|
|
||||||
import 'package:paperless_api/src/converters/local_date_time_json_converter.dart';
|
|
||||||
|
|
||||||
import 'date_range_query.dart';
|
|
||||||
import 'date_range_query_field.dart';
|
|
||||||
|
|
||||||
part 'absolute_date_range_query.g.dart';
|
|
||||||
|
|
||||||
@JsonSerializable()
|
|
||||||
@HiveType(typeId: PaperlessApiHiveTypeIds.absoluteDateRangeQuery)
|
|
||||||
class AbsoluteDateRangeQuery extends DateRangeQuery {
|
|
||||||
@LocalDateTimeJsonConverter()
|
|
||||||
@HiveField(0)
|
|
||||||
final DateTime? after;
|
|
||||||
|
|
||||||
@LocalDateTimeJsonConverter()
|
|
||||||
@HiveField(1)
|
|
||||||
final DateTime? before;
|
|
||||||
|
|
||||||
const AbsoluteDateRangeQuery({this.after, this.before});
|
|
||||||
|
|
||||||
@override
|
|
||||||
List<Object?> get props => [after, before];
|
|
||||||
|
|
||||||
@override
|
|
||||||
Map<String, String> toQueryParameter(DateRangeQueryField field) {
|
|
||||||
final Map<String, String> params = {};
|
|
||||||
|
|
||||||
// Add/subtract one day in the following because paperless uses gt/lt not gte/lte
|
|
||||||
if (after != null) {
|
|
||||||
params.putIfAbsent('${field.name}__date__gt',
|
|
||||||
() => apiDateFormat.format(after!.subtract(const Duration(days: 1))));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (before != null) {
|
|
||||||
params.putIfAbsent('${field.name}__date__lt',
|
|
||||||
() => apiDateFormat.format(before!.add(const Duration(days: 1))));
|
|
||||||
}
|
|
||||||
return params;
|
|
||||||
}
|
|
||||||
|
|
||||||
AbsoluteDateRangeQuery copyWith({
|
|
||||||
DateTime? before,
|
|
||||||
DateTime? after,
|
|
||||||
}) {
|
|
||||||
return AbsoluteDateRangeQuery(
|
|
||||||
before: before ?? this.before,
|
|
||||||
after: after ?? this.after,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
factory AbsoluteDateRangeQuery.fromJson(json) => _$AbsoluteDateRangeQueryFromJson(json);
|
|
||||||
|
|
||||||
@override
|
|
||||||
Map<String, dynamic> toJson() => _$AbsoluteDateRangeQueryToJson(this);
|
|
||||||
|
|
||||||
@override
|
|
||||||
bool matches(DateTime dt) {
|
|
||||||
//TODO: Check if after and before are inclusive or exclusive definitions.
|
|
||||||
bool matches = true;
|
|
||||||
if (after != null) {
|
|
||||||
matches &= dt.isAfter(after!) || dt == after;
|
|
||||||
}
|
|
||||||
if (before != null) {
|
|
||||||
matches &= dt.isBefore(before!) || dt == before;
|
|
||||||
}
|
|
||||||
return matches;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
export 'date_range_query.dart';
|
|
||||||
export 'unset_date_range_query.dart';
|
|
||||||
export 'absolute_date_range_query.dart';
|
|
||||||
export 'relative_date_range_query.dart';
|
|
||||||
export 'date_range_unit.dart';
|
|
||||||
export 'date_range_query_field.dart';
|
|
||||||
@@ -1,8 +1,17 @@
|
|||||||
import 'package:equatable/equatable.dart';
|
import 'package:equatable/equatable.dart';
|
||||||
|
import 'package:hive/hive.dart';
|
||||||
|
import 'package:jiffy/jiffy.dart';
|
||||||
|
import 'package:json_annotation/json_annotation.dart';
|
||||||
|
import 'package:paperless_api/config/hive/hive_type_ids.dart';
|
||||||
|
import 'package:paperless_api/src/constants.dart';
|
||||||
|
import 'package:paperless_api/src/converters/local_date_time_json_converter.dart';
|
||||||
|
|
||||||
import 'date_range_query_field.dart';
|
import 'date_range_query_field.dart';
|
||||||
|
import 'date_range_unit.dart';
|
||||||
|
|
||||||
abstract class DateRangeQuery extends Equatable {
|
part 'date_range_query.g.dart';
|
||||||
|
|
||||||
|
sealed class DateRangeQuery extends Equatable {
|
||||||
const DateRangeQuery();
|
const DateRangeQuery();
|
||||||
|
|
||||||
Map<String, String> toQueryParameter(DateRangeQueryField field);
|
Map<String, String> toQueryParameter(DateRangeQueryField field);
|
||||||
@@ -11,3 +20,166 @@ abstract class DateRangeQuery extends Equatable {
|
|||||||
|
|
||||||
bool matches(DateTime dt);
|
bool matches(DateTime dt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class UnsetDateRangeQuery extends DateRangeQuery {
|
||||||
|
const UnsetDateRangeQuery();
|
||||||
|
@override
|
||||||
|
List<Object?> get props => [];
|
||||||
|
|
||||||
|
@override
|
||||||
|
Map<String, String> toQueryParameter(DateRangeQueryField field) => const {};
|
||||||
|
|
||||||
|
@override
|
||||||
|
Map<String, dynamic> toJson() => const {};
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool matches(DateTime dt) => true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@JsonSerializable()
|
||||||
|
@HiveType(typeId: PaperlessApiHiveTypeIds.relativeDateRangeQuery)
|
||||||
|
class RelativeDateRangeQuery extends DateRangeQuery {
|
||||||
|
@HiveField(0)
|
||||||
|
final int offset;
|
||||||
|
@HiveField(1)
|
||||||
|
final DateRangeUnit unit;
|
||||||
|
|
||||||
|
const RelativeDateRangeQuery([
|
||||||
|
this.offset = 1,
|
||||||
|
this.unit = DateRangeUnit.day,
|
||||||
|
]);
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object?> get props => [offset, unit];
|
||||||
|
|
||||||
|
@override
|
||||||
|
Map<String, String> toQueryParameter(DateRangeQueryField field) {
|
||||||
|
return {
|
||||||
|
'query': '${field.name}:[-$offset ${unit.name} to now]',
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
RelativeDateRangeQuery copyWith({
|
||||||
|
int? offset,
|
||||||
|
DateRangeUnit? unit,
|
||||||
|
}) {
|
||||||
|
return RelativeDateRangeQuery(
|
||||||
|
offset ?? this.offset,
|
||||||
|
unit ?? this.unit,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns the datetime when subtracting the offset given the unit from now.
|
||||||
|
DateTime get dateTime {
|
||||||
|
switch (unit) {
|
||||||
|
case DateRangeUnit.day:
|
||||||
|
return Jiffy().subtract(days: offset).dateTime;
|
||||||
|
case DateRangeUnit.week:
|
||||||
|
return Jiffy().subtract(weeks: offset).dateTime;
|
||||||
|
case DateRangeUnit.month:
|
||||||
|
return Jiffy().subtract(months: offset).dateTime;
|
||||||
|
case DateRangeUnit.year:
|
||||||
|
return Jiffy().subtract(years: offset).dateTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Map<String, dynamic> toJson() => _$RelativeDateRangeQueryToJson(this);
|
||||||
|
|
||||||
|
factory RelativeDateRangeQuery.fromJson(Map<String, dynamic> json) =>
|
||||||
|
_$RelativeDateRangeQueryFromJson(json);
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool matches(DateTime dt) {
|
||||||
|
return dt.isAfter(dateTime) || dt == dateTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@JsonSerializable()
|
||||||
|
@HiveType(typeId: PaperlessApiHiveTypeIds.absoluteDateRangeQuery)
|
||||||
|
class AbsoluteDateRangeQuery extends DateRangeQuery {
|
||||||
|
@LocalDateTimeJsonConverter()
|
||||||
|
@HiveField(0)
|
||||||
|
final DateTime? after;
|
||||||
|
|
||||||
|
@LocalDateTimeJsonConverter()
|
||||||
|
@HiveField(1)
|
||||||
|
final DateTime? before;
|
||||||
|
|
||||||
|
const AbsoluteDateRangeQuery({this.after, this.before});
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object?> get props => [after, before];
|
||||||
|
|
||||||
|
@override
|
||||||
|
Map<String, String> toQueryParameter(DateRangeQueryField field) {
|
||||||
|
final Map<String, String> params = {};
|
||||||
|
|
||||||
|
// Add/subtract one day in the following because paperless uses gt/lt not gte/lte
|
||||||
|
if (after != null) {
|
||||||
|
params.putIfAbsent('${field.name}__date__gt',
|
||||||
|
() => apiDateFormat.format(after!.subtract(const Duration(days: 1))));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (before != null) {
|
||||||
|
params.putIfAbsent('${field.name}__date__lt',
|
||||||
|
() => apiDateFormat.format(before!.add(const Duration(days: 1))));
|
||||||
|
}
|
||||||
|
return params;
|
||||||
|
}
|
||||||
|
|
||||||
|
AbsoluteDateRangeQuery copyWith({
|
||||||
|
DateTime? before,
|
||||||
|
DateTime? after,
|
||||||
|
}) {
|
||||||
|
return AbsoluteDateRangeQuery(
|
||||||
|
before: before ?? this.before,
|
||||||
|
after: after ?? this.after,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
factory AbsoluteDateRangeQuery.fromJson(json) =>
|
||||||
|
_$AbsoluteDateRangeQueryFromJson(json);
|
||||||
|
|
||||||
|
@override
|
||||||
|
Map<String, dynamic> toJson() => _$AbsoluteDateRangeQueryToJson(this);
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool matches(DateTime dt) {
|
||||||
|
//TODO: Check if after and before are inclusive or exclusive definitions.
|
||||||
|
bool matches = true;
|
||||||
|
if (after != null) {
|
||||||
|
matches &= dt.isAfter(after!) || dt == after;
|
||||||
|
}
|
||||||
|
if (before != null) {
|
||||||
|
matches &= dt.isBefore(before!) || dt == before;
|
||||||
|
}
|
||||||
|
return matches;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class UnsetDateRangeQueryAdapter extends TypeAdapter<UnsetDateRangeQuery> {
|
||||||
|
@override
|
||||||
|
final int typeId = 113;
|
||||||
|
|
||||||
|
@override
|
||||||
|
UnsetDateRangeQuery read(BinaryReader reader) {
|
||||||
|
// reader.readByte();
|
||||||
|
return const UnsetDateRangeQuery();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void write(BinaryWriter writer, UnsetDateRangeQuery obj) {
|
||||||
|
writer.writeByte(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
int get hashCode => typeId.hashCode;
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool operator ==(Object other) =>
|
||||||
|
identical(this, other) ||
|
||||||
|
other is UnsetDateRangeQueryAdapter &&
|
||||||
|
runtimeType == other.runtimeType &&
|
||||||
|
typeId == other.typeId;
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,68 +0,0 @@
|
|||||||
import 'package:hive/hive.dart';
|
|
||||||
import 'package:jiffy/jiffy.dart';
|
|
||||||
import 'package:json_annotation/json_annotation.dart';
|
|
||||||
import 'package:paperless_api/config/hive/hive_type_ids.dart';
|
|
||||||
|
|
||||||
import 'date_range_query.dart';
|
|
||||||
import 'date_range_query_field.dart';
|
|
||||||
import 'date_range_unit.dart';
|
|
||||||
part 'relative_date_range_query.g.dart';
|
|
||||||
|
|
||||||
@JsonSerializable()
|
|
||||||
@HiveType(typeId: PaperlessApiHiveTypeIds.relativeDateRangeQuery)
|
|
||||||
class RelativeDateRangeQuery extends DateRangeQuery {
|
|
||||||
@HiveField(0)
|
|
||||||
final int offset;
|
|
||||||
@HiveField(1)
|
|
||||||
final DateRangeUnit unit;
|
|
||||||
|
|
||||||
const RelativeDateRangeQuery([
|
|
||||||
this.offset = 1,
|
|
||||||
this.unit = DateRangeUnit.day,
|
|
||||||
]);
|
|
||||||
|
|
||||||
@override
|
|
||||||
List<Object?> get props => [offset, unit];
|
|
||||||
|
|
||||||
@override
|
|
||||||
Map<String, String> toQueryParameter(DateRangeQueryField field) {
|
|
||||||
return {
|
|
||||||
'query': '${field.name}:[-$offset ${unit.name} to now]',
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
RelativeDateRangeQuery copyWith({
|
|
||||||
int? offset,
|
|
||||||
DateRangeUnit? unit,
|
|
||||||
}) {
|
|
||||||
return RelativeDateRangeQuery(
|
|
||||||
offset ?? this.offset,
|
|
||||||
unit ?? this.unit,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Returns the datetime when subtracting the offset given the unit from now.
|
|
||||||
DateTime get dateTime {
|
|
||||||
switch (unit) {
|
|
||||||
case DateRangeUnit.day:
|
|
||||||
return Jiffy().subtract(days: offset).dateTime;
|
|
||||||
case DateRangeUnit.week:
|
|
||||||
return Jiffy().subtract(weeks: offset).dateTime;
|
|
||||||
case DateRangeUnit.month:
|
|
||||||
return Jiffy().subtract(months: offset).dateTime;
|
|
||||||
case DateRangeUnit.year:
|
|
||||||
return Jiffy().subtract(years: offset).dateTime;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Map<String, dynamic> toJson() => _$RelativeDateRangeQueryToJson(this);
|
|
||||||
|
|
||||||
factory RelativeDateRangeQuery.fromJson(Map<String, dynamic> json) =>
|
|
||||||
_$RelativeDateRangeQueryFromJson(json);
|
|
||||||
|
|
||||||
@override
|
|
||||||
bool matches(DateTime dt) {
|
|
||||||
return dt.isAfter(dateTime) || dt == dateTime;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -2,44 +2,3 @@ import 'package:hive/hive.dart';
|
|||||||
import 'package:paperless_api/src/models/query_parameters/date_range_queries/date_range_query_field.dart';
|
import 'package:paperless_api/src/models/query_parameters/date_range_queries/date_range_query_field.dart';
|
||||||
|
|
||||||
import 'date_range_query.dart';
|
import 'date_range_query.dart';
|
||||||
|
|
||||||
class UnsetDateRangeQuery extends DateRangeQuery {
|
|
||||||
const UnsetDateRangeQuery();
|
|
||||||
@override
|
|
||||||
List<Object?> get props => [];
|
|
||||||
|
|
||||||
@override
|
|
||||||
Map<String, String> toQueryParameter(DateRangeQueryField field) => const {};
|
|
||||||
|
|
||||||
@override
|
|
||||||
Map<String, dynamic> toJson() => const {};
|
|
||||||
|
|
||||||
@override
|
|
||||||
bool matches(DateTime dt) => true;
|
|
||||||
}
|
|
||||||
|
|
||||||
class UnsetDateRangeQueryAdapter extends TypeAdapter<UnsetDateRangeQuery> {
|
|
||||||
@override
|
|
||||||
final int typeId = 113;
|
|
||||||
|
|
||||||
@override
|
|
||||||
UnsetDateRangeQuery read(BinaryReader reader) {
|
|
||||||
reader.readByte();
|
|
||||||
return const UnsetDateRangeQuery();
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
void write(BinaryWriter writer, UnsetDateRangeQuery obj) {
|
|
||||||
writer.writeByte(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
int get hashCode => typeId.hashCode;
|
|
||||||
|
|
||||||
@override
|
|
||||||
bool operator ==(Object other) =>
|
|
||||||
identical(this, other) ||
|
|
||||||
other is UnsetDateRangeQueryAdapter &&
|
|
||||||
runtimeType == other.runtimeType &&
|
|
||||||
typeId == other.typeId;
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -23,9 +23,6 @@ dependencies:
|
|||||||
freezed_annotation: ^2.2.0
|
freezed_annotation: ^2.2.0
|
||||||
hive: ^2.2.3
|
hive: ^2.2.3
|
||||||
|
|
||||||
dependency_overrides:
|
|
||||||
graphs: 2.2.0
|
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
flutter_test:
|
flutter_test:
|
||||||
sdk: flutter
|
sdk: flutter
|
||||||
|
|||||||
@@ -761,7 +761,7 @@ packages:
|
|||||||
source: hosted
|
source: hosted
|
||||||
version: "2.1.2"
|
version: "2.1.2"
|
||||||
graphs:
|
graphs:
|
||||||
dependency: "direct overridden"
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: graphs
|
name: graphs
|
||||||
sha256: f9e130f3259f52d26f0cfc0e964513796dafed572fa52e45d2f8d6ca14db39b2
|
sha256: f9e130f3259f52d26f0cfc0e964513796dafed572fa52e45d2f8d6ca14db39b2
|
||||||
|
|||||||
@@ -93,7 +93,6 @@ dependencies:
|
|||||||
|
|
||||||
dependency_overrides:
|
dependency_overrides:
|
||||||
intl: ^0.18.0
|
intl: ^0.18.0
|
||||||
graphs: 2.2.0
|
|
||||||
http: ^1.0.0
|
http: ^1.0.0
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user