mirror of
https://github.com/Xevion/paperless-mobile.git
synced 2025-12-06 19:15:47 -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/generated/l10n/app_localizations.dart';
|
||||
import 'package:paperless_mobile/helpers/message_helpers.dart';
|
||||
import 'package:sliver_tools/sliver_tools.dart';
|
||||
|
||||
class DocumentFilterIntent {
|
||||
final DocumentFilter? filter;
|
||||
@@ -120,11 +119,34 @@ class _DocumentsPageState extends State<DocumentsPage>
|
||||
builder: (context, state) {
|
||||
final appliedFiltersCount = state.filter.appliedFiltersCount;
|
||||
final show = state.selection.isEmpty;
|
||||
final canReset = state.filter.appliedFiltersCount > 0;
|
||||
return AnimatedScale(
|
||||
scale: show ? 1 : 0,
|
||||
duration: const Duration(milliseconds: 200),
|
||||
curve: Curves.easeIn,
|
||||
child: b.Badge(
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.end,
|
||||
children: [
|
||||
if (canReset)
|
||||
Padding(
|
||||
padding: const EdgeInsets.all(8.0),
|
||||
child: FloatingActionButton.small(
|
||||
key: UniqueKey(),
|
||||
backgroundColor: Theme.of(context)
|
||||
.colorScheme
|
||||
.onPrimaryContainer,
|
||||
onPressed: () {
|
||||
context.read<DocumentsCubit>().updateFilter();
|
||||
},
|
||||
child: Icon(
|
||||
Icons.refresh,
|
||||
color: Theme.of(context)
|
||||
.colorScheme
|
||||
.primaryContainer,
|
||||
),
|
||||
),
|
||||
),
|
||||
b.Badge(
|
||||
position: b.BadgePosition.topEnd(top: -12, end: -6),
|
||||
showBadge: appliedFiltersCount > 0,
|
||||
badgeContent: Text(
|
||||
@@ -135,16 +157,23 @@ class _DocumentsPageState extends State<DocumentsPage>
|
||||
),
|
||||
animationType: b.BadgeAnimationType.fade,
|
||||
badgeColor: Colors.red,
|
||||
child: _currentTab == 0
|
||||
child: AnimatedSwitcher(
|
||||
duration: const Duration(milliseconds: 250),
|
||||
child: (_currentTab == 0)
|
||||
? FloatingActionButton(
|
||||
child: const Icon(Icons.filter_alt_outlined),
|
||||
child:
|
||||
const Icon(Icons.filter_alt_outlined),
|
||||
onPressed: _openDocumentFilter,
|
||||
)
|
||||
: FloatingActionButton(
|
||||
child: const Icon(Icons.add),
|
||||
onPressed: () => _onCreateSavedView(state.filter),
|
||||
onPressed: () =>
|
||||
_onCreateSavedView(state.filter),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import 'package:hive/hive.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 {
|
||||
PaperlessApiHiveTypeIds._();
|
||||
|
||||
@@ -3,6 +3,8 @@ import 'package:equatable/equatable.dart';
|
||||
import 'package:hive/hive.dart';
|
||||
import 'package:json_annotation/json_annotation.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';
|
||||
|
||||
@@ -187,16 +189,45 @@ class DocumentFilter extends Equatable {
|
||||
}
|
||||
|
||||
int get appliedFiltersCount => [
|
||||
documentType != initial.documentType,
|
||||
correspondent != initial.correspondent,
|
||||
storagePath != initial.storagePath,
|
||||
tags != initial.tags,
|
||||
added != initial.added,
|
||||
created != initial.created,
|
||||
modified != initial.modified,
|
||||
asnQuery != initial.asnQuery,
|
||||
((query.queryText ?? '') != (initial.query.queryText ?? '')),
|
||||
].fold(0, (previousValue, element) => previousValue += element ? 1 : 0);
|
||||
documentType.maybeWhen(
|
||||
unset: () => 0,
|
||||
orElse: () => 1,
|
||||
),
|
||||
correspondent.maybeWhen(
|
||||
unset: () => 0,
|
||||
orElse: () => 1,
|
||||
),
|
||||
storagePath.maybeWhen(
|
||||
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
|
||||
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/src/constants.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';
|
||||
|
||||
@@ -73,7 +76,9 @@ class FilterRule with EquatableMixin {
|
||||
);
|
||||
case hasAnyTag:
|
||||
return filter.copyWith(
|
||||
tags: value == "true" ? const TagsQuery.anyAssigned() : const TagsQuery.notAssigned(),
|
||||
tags: value == "true"
|
||||
? const TagsQuery.anyAssigned()
|
||||
: const TagsQuery.notAssigned(),
|
||||
);
|
||||
case includeTagsRule:
|
||||
assert(filter.tags is IdsTagsQuery);
|
||||
@@ -105,7 +110,8 @@ class FilterRule with EquatableMixin {
|
||||
);
|
||||
} else {
|
||||
return filter.copyWith(
|
||||
created: AbsoluteDateRangeQuery(before: _dateTimeConverter.fromJson(value!)),
|
||||
created: AbsoluteDateRangeQuery(
|
||||
before: _dateTimeConverter.fromJson(value!)),
|
||||
);
|
||||
}
|
||||
case createdAfterRule:
|
||||
@@ -116,7 +122,8 @@ class FilterRule with EquatableMixin {
|
||||
);
|
||||
} else {
|
||||
return filter.copyWith(
|
||||
created: AbsoluteDateRangeQuery(after: _dateTimeConverter.fromJson(value!)),
|
||||
created: AbsoluteDateRangeQuery(
|
||||
after: _dateTimeConverter.fromJson(value!)),
|
||||
);
|
||||
}
|
||||
case addedBeforeRule:
|
||||
@@ -127,7 +134,8 @@ class FilterRule with EquatableMixin {
|
||||
);
|
||||
} else {
|
||||
return filter.copyWith(
|
||||
added: AbsoluteDateRangeQuery(before: _dateTimeConverter.fromJson(value!)),
|
||||
added: AbsoluteDateRangeQuery(
|
||||
before: _dateTimeConverter.fromJson(value!)),
|
||||
);
|
||||
}
|
||||
case addedAfterRule:
|
||||
@@ -138,7 +146,8 @@ class FilterRule with EquatableMixin {
|
||||
);
|
||||
} else {
|
||||
return filter.copyWith(
|
||||
added: AbsoluteDateRangeQuery(after: _dateTimeConverter.fromJson(value!)),
|
||||
added: AbsoluteDateRangeQuery(
|
||||
after: _dateTimeConverter.fromJson(value!)),
|
||||
);
|
||||
}
|
||||
case modifiedBeforeRule:
|
||||
@@ -149,7 +158,8 @@ class FilterRule with EquatableMixin {
|
||||
);
|
||||
} else {
|
||||
return filter.copyWith(
|
||||
modified: AbsoluteDateRangeQuery(before: _dateTimeConverter.fromJson(value!)),
|
||||
modified: AbsoluteDateRangeQuery(
|
||||
before: _dateTimeConverter.fromJson(value!)),
|
||||
);
|
||||
}
|
||||
case modifiedAfterRule:
|
||||
@@ -160,7 +170,8 @@ class FilterRule with EquatableMixin {
|
||||
);
|
||||
} else {
|
||||
return filter.copyWith(
|
||||
added: AbsoluteDateRangeQuery(after: _dateTimeConverter.fromJson(value!)),
|
||||
added: AbsoluteDateRangeQuery(
|
||||
after: _dateTimeConverter.fromJson(value!)),
|
||||
);
|
||||
}
|
||||
case titleAndContentRule:
|
||||
@@ -273,7 +284,8 @@ class FilterRule with EquatableMixin {
|
||||
filterRules.add(FilterRule(titleRule, filter.query.queryText!));
|
||||
break;
|
||||
case QueryType.titleAndContent:
|
||||
filterRules.add(FilterRule(titleAndContentRule, filter.query.queryText!));
|
||||
filterRules
|
||||
.add(FilterRule(titleAndContentRule, filter.query.queryText!));
|
||||
break;
|
||||
case QueryType.extended:
|
||||
filterRules.add(FilterRule(extendedRule, filter.query.queryText!));
|
||||
@@ -299,8 +311,8 @@ class FilterRule with EquatableMixin {
|
||||
}
|
||||
} else if (created is RelativeDateRangeQuery) {
|
||||
filterRules.add(
|
||||
FilterRule(
|
||||
extendedRule, created.toQueryParameter(DateRangeQueryField.created).values.first),
|
||||
FilterRule(extendedRule,
|
||||
created.toQueryParameter(DateRangeQueryField.created).values.first),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -319,7 +331,8 @@ class FilterRule with EquatableMixin {
|
||||
}
|
||||
} else if (added is RelativeDateRangeQuery) {
|
||||
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) {
|
||||
filterRules.add(
|
||||
FilterRule(modifiedBeforeRule, apiDateFormat.format(modified.before!)),
|
||||
FilterRule(
|
||||
modifiedBeforeRule, apiDateFormat.format(modified.before!)),
|
||||
);
|
||||
}
|
||||
} else if (modified is RelativeDateRangeQuery) {
|
||||
filterRules.add(
|
||||
FilterRule(
|
||||
extendedRule, modified.toQueryParameter(DateRangeQueryField.modified).values.first),
|
||||
extendedRule,
|
||||
modified
|
||||
.toQueryParameter(DateRangeQueryField.modified)
|
||||
.values
|
||||
.first),
|
||||
);
|
||||
}
|
||||
|
||||
//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
|
||||
.where((r) => r.ruleType == FilterRule.extendedRule)
|
||||
.map((e) => e.value)
|
||||
@@ -368,5 +388,6 @@ class FilterRule with EquatableMixin {
|
||||
|
||||
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/document_type_model.dart';
|
||||
export 'labels/label_model.dart';
|
||||
export 'labels/matching_algorithm.dart';
|
||||
export 'labels/storage_path_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 'paperless_server_exception.dart';
|
||||
export 'paperless_server_information_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 'task/task.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 '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: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_unit.dart';
|
||||
|
||||
abstract class DateRangeQuery extends Equatable {
|
||||
part 'date_range_query.g.dart';
|
||||
|
||||
sealed class DateRangeQuery extends Equatable {
|
||||
const DateRangeQuery();
|
||||
|
||||
Map<String, String> toQueryParameter(DateRangeQueryField field);
|
||||
@@ -11,3 +20,166 @@ abstract class DateRangeQuery extends Equatable {
|
||||
|
||||
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 '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
|
||||
hive: ^2.2.3
|
||||
|
||||
dependency_overrides:
|
||||
graphs: 2.2.0
|
||||
|
||||
dev_dependencies:
|
||||
flutter_test:
|
||||
sdk: flutter
|
||||
|
||||
@@ -761,7 +761,7 @@ packages:
|
||||
source: hosted
|
||||
version: "2.1.2"
|
||||
graphs:
|
||||
dependency: "direct overridden"
|
||||
dependency: transitive
|
||||
description:
|
||||
name: graphs
|
||||
sha256: f9e130f3259f52d26f0cfc0e964513796dafed572fa52e45d2f8d6ca14db39b2
|
||||
|
||||
@@ -93,7 +93,6 @@ dependencies:
|
||||
|
||||
dependency_overrides:
|
||||
intl: ^0.18.0
|
||||
graphs: 2.2.0
|
||||
http: ^1.0.0
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user