mirror of
https://github.com/Xevion/paperless-mobile.git
synced 2025-12-10 06:07:57 -06:00
WIP - Refactoring date range picker dialog
This commit is contained in:
@@ -1,14 +1,5 @@
|
||||
import 'package:equatable/equatable.dart';
|
||||
import 'package:paperless_api/src/constants.dart';
|
||||
import 'package:paperless_api/src/models/query_parameters/asn_query.dart';
|
||||
import 'package:paperless_api/src/models/query_parameters/correspondent_query.dart';
|
||||
import 'package:paperless_api/src/models/query_parameters/date_range_query.dart';
|
||||
import 'package:paperless_api/src/models/query_parameters/document_type_query.dart';
|
||||
import 'package:paperless_api/src/models/query_parameters/query_type.dart';
|
||||
import 'package:paperless_api/src/models/query_parameters/sort_field.dart';
|
||||
import 'package:paperless_api/src/models/query_parameters/sort_order.dart';
|
||||
import 'package:paperless_api/src/models/query_parameters/storage_path_query.dart';
|
||||
import 'package:paperless_api/src/models/query_parameters/tags_query.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
|
||||
class DocumentFilter extends Equatable {
|
||||
static const _oneDay = Duration(days: 1);
|
||||
@@ -23,23 +14,24 @@ class DocumentFilter extends Equatable {
|
||||
|
||||
final int pageSize;
|
||||
final int page;
|
||||
final DocumentTypeQuery documentType;
|
||||
final CorrespondentQuery correspondent;
|
||||
final StoragePathQuery storagePath;
|
||||
final AsnQuery asnQuery;
|
||||
final IdQueryParameter documentType;
|
||||
final IdQueryParameter correspondent;
|
||||
final IdQueryParameter storagePath;
|
||||
final IdQueryParameter asnQuery;
|
||||
final TagsQuery tags;
|
||||
final SortField sortField;
|
||||
final SortOrder sortOrder;
|
||||
final DateRangeQuery added;
|
||||
final DateRangeQuery created;
|
||||
final DateRangeQuery added;
|
||||
final DateRangeQuery modified;
|
||||
final QueryType queryType;
|
||||
final String? queryText;
|
||||
|
||||
const DocumentFilter({
|
||||
this.documentType = const DocumentTypeQuery.unset(),
|
||||
this.correspondent = const CorrespondentQuery.unset(),
|
||||
this.storagePath = const StoragePathQuery.unset(),
|
||||
this.asnQuery = const AsnQuery.unset(),
|
||||
this.documentType = const IdQueryParameter.unset(),
|
||||
this.correspondent = const IdQueryParameter.unset(),
|
||||
this.storagePath = const IdQueryParameter.unset(),
|
||||
this.asnQuery = const IdQueryParameter.unset(),
|
||||
this.tags = const IdsTagsQuery(),
|
||||
this.sortField = SortField.created,
|
||||
this.sortOrder = SortOrder.descending,
|
||||
@@ -49,6 +41,7 @@ class DocumentFilter extends Equatable {
|
||||
this.queryText,
|
||||
this.added = const UnsetDateRangeQuery(),
|
||||
this.created = const UnsetDateRangeQuery(),
|
||||
this.modified = const UnsetDateRangeQuery(),
|
||||
});
|
||||
|
||||
Map<String, String> toQueryParameters() {
|
||||
@@ -57,13 +50,14 @@ class DocumentFilter extends Equatable {
|
||||
'page_size': pageSize.toString(),
|
||||
};
|
||||
|
||||
params.addAll(documentType.toQueryParameter());
|
||||
params.addAll(correspondent.toQueryParameter());
|
||||
params.addAll(documentType.toQueryParameter('document_type'));
|
||||
params.addAll(correspondent.toQueryParameter('correspondent'));
|
||||
params.addAll(storagePath.toQueryParameter('storage_path'));
|
||||
params.addAll(asnQuery.toQueryParameter('archive_serial_number'));
|
||||
params.addAll(tags.toQueryParameter());
|
||||
params.addAll(storagePath.toQueryParameter());
|
||||
params.addAll(asnQuery.toQueryParameter());
|
||||
params.addAll(added.toQueryParameter());
|
||||
params.addAll(created.toQueryParameter());
|
||||
params.addAll(added.toQueryParameter(DateRangeQueryField.added));
|
||||
params.addAll(created.toQueryParameter(DateRangeQueryField.created));
|
||||
params.addAll(modified.toQueryParameter(DateRangeQueryField.modified));
|
||||
//TODO: Rework when implementing extended queries.
|
||||
if (queryText?.isNotEmpty ?? false) {
|
||||
params.putIfAbsent(queryType.queryParam, () => queryText!);
|
||||
@@ -84,15 +78,16 @@ class DocumentFilter extends Equatable {
|
||||
int? pageSize,
|
||||
int? page,
|
||||
bool? onlyNoDocumentType,
|
||||
DocumentTypeQuery? documentType,
|
||||
CorrespondentQuery? correspondent,
|
||||
StoragePathQuery? storagePath,
|
||||
AsnQuery? asnQuery,
|
||||
IdQueryParameter? documentType,
|
||||
IdQueryParameter? correspondent,
|
||||
IdQueryParameter? storagePath,
|
||||
IdQueryParameter? asnQuery,
|
||||
TagsQuery? tags,
|
||||
SortField? sortField,
|
||||
SortOrder? sortOrder,
|
||||
DateRangeQuery? added,
|
||||
DateRangeQuery? created,
|
||||
DateRangeQuery? modified,
|
||||
QueryType? queryType,
|
||||
String? queryText,
|
||||
}) {
|
||||
@@ -105,11 +100,12 @@ class DocumentFilter extends Equatable {
|
||||
tags: tags ?? this.tags,
|
||||
sortField: sortField ?? this.sortField,
|
||||
sortOrder: sortOrder ?? this.sortOrder,
|
||||
added: added ?? this.added,
|
||||
queryType: queryType ?? this.queryType,
|
||||
queryText: queryText ?? this.queryText,
|
||||
asnQuery: asnQuery ?? this.asnQuery,
|
||||
added: added ?? this.added,
|
||||
created: created ?? this.created,
|
||||
modified: modified ?? this.modified,
|
||||
);
|
||||
}
|
||||
|
||||
@@ -139,8 +135,9 @@ class DocumentFilter extends Equatable {
|
||||
correspondent != initial.correspondent,
|
||||
storagePath != initial.storagePath,
|
||||
tags != initial.tags,
|
||||
(added != initial.added),
|
||||
(created != initial.created),
|
||||
added != initial.added,
|
||||
created != initial.created,
|
||||
modified != initial.modified,
|
||||
asnQuery != initial.asnQuery,
|
||||
(queryType != initial.queryType || queryText != initial.queryText),
|
||||
].fold(0, (previousValue, element) => previousValue += element ? 1 : 0);
|
||||
@@ -158,6 +155,7 @@ class DocumentFilter extends Equatable {
|
||||
sortOrder,
|
||||
added,
|
||||
created,
|
||||
modified,
|
||||
queryType,
|
||||
queryText,
|
||||
];
|
||||
|
||||
@@ -1,12 +1,6 @@
|
||||
import 'package:equatable/equatable.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_api/src/constants.dart';
|
||||
import 'package:paperless_api/src/models/document_filter.dart';
|
||||
import 'package:paperless_api/src/models/query_parameters/correspondent_query.dart';
|
||||
import 'package:paperless_api/src/models/query_parameters/date_range_query.dart';
|
||||
import 'package:paperless_api/src/models/query_parameters/document_type_query.dart';
|
||||
import 'package:paperless_api/src/models/query_parameters/query_type.dart';
|
||||
import 'package:paperless_api/src/models/query_parameters/storage_path_query.dart';
|
||||
import 'package:paperless_api/src/models/query_parameters/tags_query.dart';
|
||||
|
||||
class FilterRule with EquatableMixin {
|
||||
static const int titleRule = 0;
|
||||
@@ -57,9 +51,6 @@ class FilterRule with EquatableMixin {
|
||||
}
|
||||
|
||||
DocumentFilter applyToFilter(final DocumentFilter filter) {
|
||||
if (value == null) {
|
||||
return filter;
|
||||
}
|
||||
//TODO: Check in profiling mode if this is inefficient enough to cause stutters...
|
||||
switch (ruleType) {
|
||||
case titleRule:
|
||||
@@ -67,20 +58,20 @@ class FilterRule with EquatableMixin {
|
||||
case documentTypeRule:
|
||||
return filter.copyWith(
|
||||
documentType: value == null
|
||||
? const DocumentTypeQuery.notAssigned()
|
||||
: DocumentTypeQuery.fromId(int.parse(value!)),
|
||||
? const IdQueryParameter.notAssigned()
|
||||
: IdQueryParameter.fromId(int.parse(value!)),
|
||||
);
|
||||
case correspondentRule:
|
||||
return filter.copyWith(
|
||||
correspondent: value == null
|
||||
? const CorrespondentQuery.notAssigned()
|
||||
: CorrespondentQuery.fromId(int.parse(value!)),
|
||||
? const IdQueryParameter.notAssigned()
|
||||
: IdQueryParameter.fromId(int.parse(value!)),
|
||||
);
|
||||
case storagePathRule:
|
||||
return filter.copyWith(
|
||||
storagePath: value == null
|
||||
? const StoragePathQuery.notAssigned()
|
||||
: StoragePathQuery.fromId(int.parse(value!)),
|
||||
? const IdQueryParameter.notAssigned()
|
||||
: IdQueryParameter.fromId(int.parse(value!)),
|
||||
);
|
||||
case hasAnyTag:
|
||||
return filter.copyWith(
|
||||
@@ -101,48 +92,69 @@ class FilterRule with EquatableMixin {
|
||||
.withIdQueriesAdded([ExcludeTagIdQuery(int.parse(value!))]),
|
||||
);
|
||||
case createdBeforeRule:
|
||||
if (filter.created is FixedDateRangeQuery) {
|
||||
if (filter.created is AbsoluteDateRangeQuery) {
|
||||
return filter.copyWith(
|
||||
created: (filter.created as FixedDateRangeQuery)
|
||||
created: (filter.created as AbsoluteDateRangeQuery)
|
||||
.copyWith(before: DateTime.parse(value!)),
|
||||
);
|
||||
} else {
|
||||
return filter.copyWith(
|
||||
created:
|
||||
FixedDateRangeQuery.created(before: DateTime.parse(value!)),
|
||||
created: AbsoluteDateRangeQuery(before: DateTime.parse(value!)),
|
||||
);
|
||||
}
|
||||
case createdAfterRule:
|
||||
if (filter.created is FixedDateRangeQuery) {
|
||||
if (filter.created is AbsoluteDateRangeQuery) {
|
||||
return filter.copyWith(
|
||||
created: (filter.created as FixedDateRangeQuery)
|
||||
created: (filter.created as AbsoluteDateRangeQuery)
|
||||
.copyWith(after: DateTime.parse(value!)),
|
||||
);
|
||||
} else {
|
||||
return filter.copyWith(
|
||||
created: FixedDateRangeQuery.created(after: DateTime.parse(value!)),
|
||||
created: AbsoluteDateRangeQuery(after: DateTime.parse(value!)),
|
||||
);
|
||||
}
|
||||
case addedBeforeRule:
|
||||
if (filter.added is FixedDateRangeQuery) {
|
||||
if (filter.added is AbsoluteDateRangeQuery) {
|
||||
return filter.copyWith(
|
||||
added: (filter.added as FixedDateRangeQuery)
|
||||
added: (filter.added as AbsoluteDateRangeQuery)
|
||||
.copyWith(before: DateTime.parse(value!)),
|
||||
);
|
||||
} else {
|
||||
return filter.copyWith(
|
||||
added: FixedDateRangeQuery.added(before: DateTime.parse(value!)),
|
||||
added: AbsoluteDateRangeQuery(before: DateTime.parse(value!)),
|
||||
);
|
||||
}
|
||||
case addedAfterRule:
|
||||
if (filter.added is FixedDateRangeQuery) {
|
||||
if (filter.added is AbsoluteDateRangeQuery) {
|
||||
return filter.copyWith(
|
||||
added: (filter.added as FixedDateRangeQuery)
|
||||
added: (filter.added as AbsoluteDateRangeQuery)
|
||||
.copyWith(after: DateTime.parse(value!)),
|
||||
);
|
||||
} else {
|
||||
return filter.copyWith(
|
||||
added: FixedDateRangeQuery.added(after: DateTime.parse(value!)),
|
||||
added: AbsoluteDateRangeQuery(after: DateTime.parse(value!)),
|
||||
);
|
||||
}
|
||||
case modifiedBeforeRule:
|
||||
if (filter.modified is AbsoluteDateRangeQuery) {
|
||||
return filter.copyWith(
|
||||
modified: (filter.modified as AbsoluteDateRangeQuery)
|
||||
.copyWith(before: DateTime.parse(value!)),
|
||||
);
|
||||
} else {
|
||||
return filter.copyWith(
|
||||
modified: AbsoluteDateRangeQuery(before: DateTime.parse(value!)),
|
||||
);
|
||||
}
|
||||
case modifiedAfterRule:
|
||||
if (filter.modified is AbsoluteDateRangeQuery) {
|
||||
return filter.copyWith(
|
||||
modified: (filter.modified as AbsoluteDateRangeQuery)
|
||||
.copyWith(after: DateTime.parse(value!)),
|
||||
);
|
||||
} else {
|
||||
return filter.copyWith(
|
||||
added: AbsoluteDateRangeQuery(after: DateTime.parse(value!)),
|
||||
);
|
||||
}
|
||||
case titleAndContentRule:
|
||||
@@ -171,7 +183,7 @@ class FilterRule with EquatableMixin {
|
||||
switch (field) {
|
||||
case 'created':
|
||||
newFilter = newFilter.copyWith(
|
||||
created: LastNDateRangeQuery.created(
|
||||
created: RelativeDateRangeQuery(
|
||||
n,
|
||||
DateRangeUnit.values.byName(unit),
|
||||
),
|
||||
@@ -179,7 +191,7 @@ class FilterRule with EquatableMixin {
|
||||
break;
|
||||
case 'added':
|
||||
newFilter = newFilter.copyWith(
|
||||
created: LastNDateRangeQuery.added(
|
||||
added: RelativeDateRangeQuery(
|
||||
n,
|
||||
DateRangeUnit.values.byName(unit),
|
||||
),
|
||||
@@ -187,7 +199,7 @@ class FilterRule with EquatableMixin {
|
||||
break;
|
||||
case 'modified':
|
||||
newFilter = newFilter.copyWith(
|
||||
created: LastNDateRangeQuery.modified(
|
||||
modified: RelativeDateRangeQuery(
|
||||
n,
|
||||
DateRangeUnit.values.byName(unit),
|
||||
),
|
||||
@@ -262,7 +274,7 @@ class FilterRule with EquatableMixin {
|
||||
|
||||
// Parse created at
|
||||
final created = filter.created;
|
||||
if (created is FixedDateRangeQuery) {
|
||||
if (created is AbsoluteDateRangeQuery) {
|
||||
if (created.after != null) {
|
||||
filterRules.add(
|
||||
FilterRule(createdAfterRule, apiDateFormat.format(created.after!)),
|
||||
@@ -273,15 +285,16 @@ class FilterRule with EquatableMixin {
|
||||
FilterRule(createdBeforeRule, apiDateFormat.format(created.before!)),
|
||||
);
|
||||
}
|
||||
} else if (created is LastNDateRangeQuery) {
|
||||
} else if (created is RelativeDateRangeQuery) {
|
||||
filterRules.add(
|
||||
FilterRule(extendedRule, created.toQueryParameter().values.first),
|
||||
FilterRule(extendedRule,
|
||||
created.toQueryParameter(DateRangeQueryField.created).values.first),
|
||||
);
|
||||
}
|
||||
|
||||
// Parse added at
|
||||
final added = filter.added;
|
||||
if (added is FixedDateRangeQuery) {
|
||||
if (added is AbsoluteDateRangeQuery) {
|
||||
if (added.after != null) {
|
||||
filterRules.add(
|
||||
FilterRule(addedAfterRule, apiDateFormat.format(added.after!)),
|
||||
@@ -292,15 +305,16 @@ class FilterRule with EquatableMixin {
|
||||
FilterRule(addedBeforeRule, apiDateFormat.format(added.before!)),
|
||||
);
|
||||
}
|
||||
} else if (added is LastNDateRangeQuery) {
|
||||
} else if (added is RelativeDateRangeQuery) {
|
||||
filterRules.add(
|
||||
FilterRule(extendedRule, added.toQueryParameter().values.first),
|
||||
FilterRule(extendedRule,
|
||||
added.toQueryParameter(DateRangeQueryField.added).values.first),
|
||||
);
|
||||
}
|
||||
|
||||
// Parse modified at
|
||||
final modified = filter.added;
|
||||
if (modified is FixedDateRangeQuery) {
|
||||
final modified = filter.modified;
|
||||
if (modified is AbsoluteDateRangeQuery) {
|
||||
if (modified.after != null) {
|
||||
filterRules.add(
|
||||
FilterRule(modifiedAfterRule, apiDateFormat.format(modified.after!)),
|
||||
@@ -312,9 +326,14 @@ class FilterRule with EquatableMixin {
|
||||
modifiedBeforeRule, apiDateFormat.format(modified.before!)),
|
||||
);
|
||||
}
|
||||
} else if (modified is LastNDateRangeQuery) {
|
||||
} else if (modified is RelativeDateRangeQuery) {
|
||||
filterRules.add(
|
||||
FilterRule(extendedRule, modified.toQueryParameter().values.first),
|
||||
FilterRule(
|
||||
extendedRule,
|
||||
modified
|
||||
.toQueryParameter(DateRangeQueryField.modified)
|
||||
.values
|
||||
.first),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -4,15 +4,12 @@ export 'labels/label_model.dart';
|
||||
export 'labels/matching_algorithm.dart';
|
||||
export 'labels/storage_path_model.dart';
|
||||
export 'labels/tag_model.dart';
|
||||
export 'query_parameters/asn_query.dart';
|
||||
export 'query_parameters/correspondent_query.dart';
|
||||
export 'query_parameters/document_type_query.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/storage_path_query.dart';
|
||||
export 'query_parameters/tags_query.dart';
|
||||
export 'query_parameters/date_range_query.dart';
|
||||
export 'bulk_edit_model.dart';
|
||||
export 'document_filter.dart';
|
||||
export 'document_meta_data_model.dart';
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
import 'package:paperless_api/src/models/query_parameters/id_query_parameter.dart';
|
||||
|
||||
class AsnQuery extends IdQueryParameter {
|
||||
const AsnQuery.fromId(super.id) : super.fromId();
|
||||
const AsnQuery.unset() : super.unset();
|
||||
const AsnQuery.notAssigned() : super.notAssigned();
|
||||
const AsnQuery.anyAssigned() : super.anyAssigned();
|
||||
|
||||
@override
|
||||
String get queryParameterKey => 'archive_serial_number';
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
import 'package:paperless_api/src/models/query_parameters/id_query_parameter.dart';
|
||||
|
||||
class CorrespondentQuery extends IdQueryParameter {
|
||||
const CorrespondentQuery.fromId(super.id) : super.fromId();
|
||||
const CorrespondentQuery.unset() : super.unset();
|
||||
const CorrespondentQuery.notAssigned() : super.notAssigned();
|
||||
const CorrespondentQuery.anyAssigned() : super.anyAssigned();
|
||||
|
||||
@override
|
||||
String get queryParameterKey => 'correspondent';
|
||||
}
|
||||
@@ -3,7 +3,7 @@ import 'package:paperless_api/src/constants.dart';
|
||||
|
||||
abstract class DateRangeQuery extends Equatable {
|
||||
const DateRangeQuery();
|
||||
Map<String, String> toQueryParameter();
|
||||
Map<String, String> toQueryParameter(DateRangeQueryField field);
|
||||
}
|
||||
|
||||
class UnsetDateRangeQuery extends DateRangeQuery {
|
||||
@@ -12,87 +12,74 @@ class UnsetDateRangeQuery extends DateRangeQuery {
|
||||
List<Object?> get props => [];
|
||||
|
||||
@override
|
||||
Map<String, String> toQueryParameter() => const {};
|
||||
Map<String, String> toQueryParameter(DateRangeQueryField field) => const {};
|
||||
}
|
||||
|
||||
class FixedDateRangeQuery extends DateRangeQuery {
|
||||
final String _querySuffix;
|
||||
|
||||
class AbsoluteDateRangeQuery extends DateRangeQuery {
|
||||
final DateTime? after;
|
||||
final DateTime? before;
|
||||
|
||||
const FixedDateRangeQuery._(this._querySuffix, {this.after, this.before})
|
||||
: assert(after != null || before != null);
|
||||
|
||||
const FixedDateRangeQuery.created({DateTime? after, DateTime? before})
|
||||
: this._('created', after: after, before: before);
|
||||
|
||||
const FixedDateRangeQuery.added({DateTime? after, DateTime? before})
|
||||
: this._('added', after: after, before: before);
|
||||
|
||||
const FixedDateRangeQuery.modified({DateTime? after, DateTime? before})
|
||||
: this._('modified', after: after, before: before);
|
||||
const AbsoluteDateRangeQuery({this.after, this.before});
|
||||
|
||||
@override
|
||||
List<Object?> get props => [_querySuffix, after, before];
|
||||
List<Object?> get props => [after, before];
|
||||
|
||||
@override
|
||||
Map<String, String> toQueryParameter() {
|
||||
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('${_querySuffix}__date__gt',
|
||||
params.putIfAbsent('${field.name}__date__gt',
|
||||
() => apiDateFormat.format(after!.subtract(const Duration(days: 1))));
|
||||
}
|
||||
|
||||
if (before != null) {
|
||||
params.putIfAbsent('${_querySuffix}__date__lt',
|
||||
params.putIfAbsent('${field.name}__date__lt',
|
||||
() => apiDateFormat.format(before!.add(const Duration(days: 1))));
|
||||
}
|
||||
return params;
|
||||
}
|
||||
|
||||
FixedDateRangeQuery copyWith({
|
||||
AbsoluteDateRangeQuery copyWith({
|
||||
DateTime? before,
|
||||
DateTime? after,
|
||||
}) {
|
||||
return FixedDateRangeQuery._(
|
||||
_querySuffix,
|
||||
return AbsoluteDateRangeQuery(
|
||||
before: before ?? this.before,
|
||||
after: after ?? this.after,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class LastNDateRangeQuery extends DateRangeQuery {
|
||||
class RelativeDateRangeQuery extends DateRangeQuery {
|
||||
final int offset;
|
||||
final DateRangeUnit unit;
|
||||
final int n;
|
||||
final String _field;
|
||||
|
||||
const LastNDateRangeQuery._(
|
||||
this._field, {
|
||||
required this.n,
|
||||
required this.unit,
|
||||
});
|
||||
|
||||
const LastNDateRangeQuery.created(int n, DateRangeUnit unit)
|
||||
: this._('created', unit: unit, n: n);
|
||||
const LastNDateRangeQuery.added(int n, DateRangeUnit unit)
|
||||
: this._('added', unit: unit, n: n);
|
||||
const LastNDateRangeQuery.modified(int n, DateRangeUnit unit)
|
||||
: this._('modified', unit: unit, n: n);
|
||||
const RelativeDateRangeQuery(
|
||||
this.offset,
|
||||
this.unit,
|
||||
);
|
||||
|
||||
@override
|
||||
// TODO: implement props
|
||||
List<Object?> get props => [_field, n, unit];
|
||||
List<Object?> get props => [offset, unit];
|
||||
|
||||
@override
|
||||
Map<String, String> toQueryParameter() {
|
||||
Map<String, String> toQueryParameter(DateRangeQueryField field) {
|
||||
return {
|
||||
'query': '[$_field:$n ${unit.name} to now]',
|
||||
'query': '[${field.name}:$offset ${unit.name} to now]',
|
||||
};
|
||||
}
|
||||
|
||||
RelativeDateRangeQuery copyWith({
|
||||
int? offset,
|
||||
DateRangeUnit? unit,
|
||||
}) {
|
||||
return RelativeDateRangeQuery(
|
||||
offset ?? this.offset,
|
||||
unit ?? this.unit,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
enum DateRangeUnit {
|
||||
@@ -101,3 +88,9 @@ enum DateRangeUnit {
|
||||
month,
|
||||
year;
|
||||
}
|
||||
|
||||
enum DateRangeQueryField {
|
||||
created,
|
||||
added,
|
||||
modified;
|
||||
}
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
import 'package:paperless_api/src/models/query_parameters/id_query_parameter.dart';
|
||||
|
||||
class DocumentTypeQuery extends IdQueryParameter {
|
||||
const DocumentTypeQuery.fromId(super.id) : super.fromId();
|
||||
const DocumentTypeQuery.unset() : super.unset();
|
||||
const DocumentTypeQuery.notAssigned() : super.notAssigned();
|
||||
const DocumentTypeQuery.anyAssigned() : super.anyAssigned();
|
||||
|
||||
@override
|
||||
String get queryParameterKey => 'document_type';
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
import 'package:equatable/equatable.dart';
|
||||
|
||||
abstract class IdQueryParameter extends Equatable {
|
||||
class IdQueryParameter extends Equatable {
|
||||
final int? _assignmentStatus;
|
||||
final int? _id;
|
||||
|
||||
@@ -28,16 +28,14 @@ abstract class IdQueryParameter extends Equatable {
|
||||
|
||||
int? get id => _id;
|
||||
|
||||
String get queryParameterKey;
|
||||
|
||||
Map<String, String> toQueryParameter() {
|
||||
Map<String, String> toQueryParameter(String field) {
|
||||
final Map<String, String> params = {};
|
||||
if (onlyNotAssigned || onlyAssigned) {
|
||||
params.putIfAbsent(
|
||||
'${queryParameterKey}__isnull', () => _assignmentStatus!.toString());
|
||||
'${field}__isnull', () => _assignmentStatus!.toString());
|
||||
}
|
||||
if (isSet) {
|
||||
params.putIfAbsent("${queryParameterKey}__id", () => id!.toString());
|
||||
params.putIfAbsent("${field}__id", () => id!.toString());
|
||||
}
|
||||
return params;
|
||||
}
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
import 'package:paperless_api/src/models/query_parameters/id_query_parameter.dart';
|
||||
|
||||
class StoragePathQuery extends IdQueryParameter {
|
||||
const StoragePathQuery.fromId(super.id) : super.fromId();
|
||||
const StoragePathQuery.unset() : super.unset();
|
||||
const StoragePathQuery.notAssigned() : super.notAssigned();
|
||||
const StoragePathQuery.anyAssigned() : super.anyAssigned();
|
||||
|
||||
@override
|
||||
String get queryParameterKey => 'storage_path';
|
||||
}
|
||||
@@ -4,6 +4,7 @@ import 'dart:math';
|
||||
import 'package:http/src/boundary_characters.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:http/http.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
import 'package:paperless_api/src/constants.dart';
|
||||
import 'package:paperless_api/src/models/bulk_edit_model.dart';
|
||||
import 'package:paperless_api/src/models/document_filter.dart';
|
||||
@@ -11,7 +12,6 @@ import 'package:paperless_api/src/models/document_meta_data_model.dart';
|
||||
import 'package:paperless_api/src/models/document_model.dart';
|
||||
import 'package:paperless_api/src/models/paged_search_result.dart';
|
||||
import 'package:paperless_api/src/models/paperless_server_exception.dart';
|
||||
import 'package:paperless_api/src/models/query_parameters/asn_query.dart';
|
||||
import 'package:paperless_api/src/models/query_parameters/sort_field.dart';
|
||||
import 'package:paperless_api/src/models/query_parameters/sort_order.dart';
|
||||
import 'package:paperless_api/src/models/similar_document_model.dart';
|
||||
@@ -139,7 +139,7 @@ class PaperlessDocumentsApiImpl implements PaperlessDocumentsApi {
|
||||
final filterParams = filter.toQueryParameters();
|
||||
final response = await baseClient.get(
|
||||
Uri(
|
||||
path: "/api/documents/?$filterParams",
|
||||
path: "/api/documents/",
|
||||
queryParameters: filterParams,
|
||||
),
|
||||
);
|
||||
@@ -190,7 +190,7 @@ class PaperlessDocumentsApiImpl implements PaperlessDocumentsApi {
|
||||
const DocumentFilter asnQueryFilter = DocumentFilter(
|
||||
sortField: SortField.archiveSerialNumber,
|
||||
sortOrder: SortOrder.descending,
|
||||
asnQuery: AsnQuery.anyAssigned(),
|
||||
asnQuery: IdQueryParameter.anyAssigned(),
|
||||
page: 1,
|
||||
pageSize: 1,
|
||||
);
|
||||
|
||||
@@ -1,14 +1,5 @@
|
||||
import 'package:paperless_api/src/models/document_filter.dart';
|
||||
import 'package:paperless_api/src/models/filter_rule_model.dart';
|
||||
import 'package:paperless_api/src/models/query_parameters/correspondent_query.dart';
|
||||
import 'package:paperless_api/src/models/query_parameters/document_type_query.dart';
|
||||
import 'package:paperless_api/src/models/query_parameters/query_type.dart';
|
||||
import 'package:paperless_api/src/models/query_parameters/sort_field.dart';
|
||||
import 'package:paperless_api/src/models/query_parameters/sort_order.dart';
|
||||
import 'package:paperless_api/src/models/query_parameters/storage_path_query.dart';
|
||||
import 'package:paperless_api/src/models/query_parameters/tags_query.dart';
|
||||
import 'package:paperless_api/src/models/saved_view_model.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:paperless_api/paperless_api.dart';
|
||||
|
||||
void main() {
|
||||
group('Validate parsing logic from [SavedView] to [DocumentFilter]:', () {
|
||||
@@ -74,10 +65,10 @@ void main() {
|
||||
}).toDocumentFilter(),
|
||||
equals(
|
||||
DocumentFilter.initial.copyWith(
|
||||
correspondent: const CorrespondentQuery.fromId(42),
|
||||
documentType: const DocumentTypeQuery.fromId(69),
|
||||
storagePath: const StoragePathQuery.fromId(14),
|
||||
tags: IdsTagsQuery(
|
||||
correspondent: const IdQueryParameter.fromId(42),
|
||||
documentType: const IdQueryParameter.fromId(69),
|
||||
storagePath: const IdQueryParameter.fromId(14),
|
||||
tags: const IdsTagsQuery(
|
||||
[
|
||||
IncludeTagIdQuery(1),
|
||||
IncludeTagIdQuery(2),
|
||||
@@ -85,10 +76,14 @@ void main() {
|
||||
ExcludeTagIdQuery(4),
|
||||
],
|
||||
),
|
||||
createdDateBefore: DateTime.parse("2022-10-27"),
|
||||
createdDateAfter: DateTime.parse("2022-09-27"),
|
||||
addedDateBefore: DateTime.parse("2022-09-26"),
|
||||
addedDateAfter: DateTime.parse("2000-01-01"),
|
||||
created: AbsoluteDateRangeQuery(
|
||||
before: DateTime.parse("2022-10-27"),
|
||||
after: DateTime.parse("2022-09-27"),
|
||||
),
|
||||
added: AbsoluteDateRangeQuery(
|
||||
before: DateTime.parse("2022-09-26"),
|
||||
after: DateTime.parse("2000-01-01"),
|
||||
),
|
||||
sortField: SortField.created,
|
||||
sortOrder: SortOrder.descending,
|
||||
queryText: "Never gonna give you up",
|
||||
@@ -114,39 +109,41 @@ void main() {
|
||||
});
|
||||
|
||||
test('Values are correctly parsed if not assigned.', () {
|
||||
final actual = SavedView.fromJson({
|
||||
"id": 1,
|
||||
"name": "test_name",
|
||||
"show_on_dashboard": false,
|
||||
"show_in_sidebar": false,
|
||||
"sort_field": SortField.created.name,
|
||||
"sort_reverse": true,
|
||||
"filter_rules": [
|
||||
{
|
||||
'rule_type': FilterRule.correspondentRule,
|
||||
'value': null,
|
||||
},
|
||||
{
|
||||
'rule_type': FilterRule.documentTypeRule,
|
||||
'value': null,
|
||||
},
|
||||
{
|
||||
'rule_type': FilterRule.hasAnyTag,
|
||||
'value': false.toString(),
|
||||
},
|
||||
{
|
||||
'rule_type': FilterRule.storagePathRule,
|
||||
'value': null,
|
||||
},
|
||||
],
|
||||
}).toDocumentFilter();
|
||||
final expected = DocumentFilter.initial.copyWith(
|
||||
correspondent: const IdQueryParameter.notAssigned(),
|
||||
documentType: const IdQueryParameter.notAssigned(),
|
||||
storagePath: const IdQueryParameter.notAssigned(),
|
||||
tags: const OnlyNotAssignedTagsQuery(),
|
||||
);
|
||||
expect(
|
||||
SavedView.fromJson({
|
||||
"id": 1,
|
||||
"name": "test_name",
|
||||
"show_on_dashboard": false,
|
||||
"show_in_sidebar": false,
|
||||
"sort_field": SortField.created.name,
|
||||
"sort_reverse": true,
|
||||
"filter_rules": [
|
||||
{
|
||||
'rule_type': FilterRule.correspondentRule,
|
||||
'value': null,
|
||||
},
|
||||
{
|
||||
'rule_type': FilterRule.documentTypeRule,
|
||||
'value': null,
|
||||
},
|
||||
{
|
||||
'rule_type': FilterRule.hasAnyTag,
|
||||
'value': false.toString(),
|
||||
},
|
||||
{
|
||||
'rule_type': FilterRule.storagePathRule,
|
||||
'value': null,
|
||||
},
|
||||
],
|
||||
}).toDocumentFilter(),
|
||||
equals(DocumentFilter.initial.copyWith(
|
||||
correspondent: const CorrespondentQuery.notAssigned(),
|
||||
documentType: const DocumentTypeQuery.notAssigned(),
|
||||
storagePath: const StoragePathQuery.notAssigned(),
|
||||
tags: const OnlyNotAssignedTagsQuery(),
|
||||
)),
|
||||
actual,
|
||||
equals(expected),
|
||||
);
|
||||
});
|
||||
});
|
||||
@@ -156,10 +153,10 @@ void main() {
|
||||
expect(
|
||||
SavedView.fromDocumentFilter(
|
||||
DocumentFilter(
|
||||
correspondent: const CorrespondentQuery.fromId(1),
|
||||
documentType: const DocumentTypeQuery.fromId(2),
|
||||
storagePath: const StoragePathQuery.fromId(3),
|
||||
tags: IdsTagsQuery([
|
||||
correspondent: const IdQueryParameter.fromId(1),
|
||||
documentType: const IdQueryParameter.fromId(2),
|
||||
storagePath: const IdQueryParameter.fromId(3),
|
||||
tags: const IdsTagsQuery([
|
||||
IncludeTagIdQuery(4),
|
||||
IncludeTagIdQuery(5),
|
||||
ExcludeTagIdQuery(6),
|
||||
@@ -168,10 +165,14 @@ void main() {
|
||||
]),
|
||||
sortField: SortField.added,
|
||||
sortOrder: SortOrder.ascending,
|
||||
addedDateAfter: DateTime.parse("2020-01-01"),
|
||||
addedDateBefore: DateTime.parse("2020-03-01"),
|
||||
createdDateAfter: DateTime.parse("2020-02-01"),
|
||||
createdDateBefore: DateTime.parse("2020-04-01"),
|
||||
created: AbsoluteDateRangeQuery(
|
||||
before: DateTime.parse("2020-04-01"),
|
||||
after: DateTime.parse("2020-02-01"),
|
||||
),
|
||||
added: AbsoluteDateRangeQuery(
|
||||
before: DateTime.parse("2020-03-01"),
|
||||
after: DateTime.parse("2020-01-01"),
|
||||
),
|
||||
queryText: "Never gonna let you down",
|
||||
queryType: QueryType.title,
|
||||
),
|
||||
@@ -210,16 +211,14 @@ void main() {
|
||||
expect(
|
||||
SavedView.fromDocumentFilter(
|
||||
const DocumentFilter(
|
||||
correspondent: CorrespondentQuery.unset(),
|
||||
documentType: DocumentTypeQuery.unset(),
|
||||
storagePath: StoragePathQuery.unset(),
|
||||
correspondent: IdQueryParameter.unset(),
|
||||
documentType: IdQueryParameter.unset(),
|
||||
storagePath: IdQueryParameter.unset(),
|
||||
tags: IdsTagsQuery(),
|
||||
sortField: SortField.created,
|
||||
sortOrder: SortOrder.descending,
|
||||
addedDateAfter: null,
|
||||
addedDateBefore: null,
|
||||
createdDateAfter: null,
|
||||
createdDateBefore: null,
|
||||
added: UnsetDateRangeQuery(),
|
||||
created: UnsetDateRangeQuery(),
|
||||
queryText: null,
|
||||
),
|
||||
name: "test_name",
|
||||
@@ -243,9 +242,9 @@ void main() {
|
||||
expect(
|
||||
SavedView.fromDocumentFilter(
|
||||
const DocumentFilter(
|
||||
correspondent: CorrespondentQuery.notAssigned(),
|
||||
documentType: DocumentTypeQuery.notAssigned(),
|
||||
storagePath: StoragePathQuery.notAssigned(),
|
||||
correspondent: IdQueryParameter.notAssigned(),
|
||||
documentType: IdQueryParameter.notAssigned(),
|
||||
storagePath: IdQueryParameter.notAssigned(),
|
||||
tags: OnlyNotAssignedTagsQuery(),
|
||||
sortField: SortField.created,
|
||||
sortOrder: SortOrder.ascending,
|
||||
|
||||
Reference in New Issue
Block a user