Added new query options for tags, added pdf preview on documents scanner page

This commit is contained in:
Anton Stubenbord
2022-11-18 00:59:14 +01:00
parent e9019bca9c
commit 070a57aafd
32 changed files with 454 additions and 205 deletions
@@ -1,38 +1,136 @@
import 'package:equatable/equatable.dart';
import 'package:paperless_mobile/extensions/dart_extensions.dart';
class TagsQuery with EquatableMixin {
final List<int> _ids;
final bool? _isTagged;
abstract class TagsQuery with EquatableMixin {
const TagsQuery();
String toQueryParameter();
}
const TagsQuery.fromIds(List<int> ids)
: _isTagged = null,
_ids = ids;
const TagsQuery.anyAssigned()
: _isTagged = true,
_ids = const [];
const TagsQuery.notAssigned()
: _isTagged = false,
_ids = const [];
const TagsQuery.unset() : this.fromIds(const []);
bool get onlyNotAssigned => _isTagged == false;
bool get onlyAssigned => _isTagged == true;
bool get isUnset => _ids.isEmpty && _isTagged == null;
bool get isSet => _ids.isNotEmpty && _isTagged == null;
List<int> get ids => _ids;
class OnlyNotAssignedTagsQuery extends TagsQuery {
const OnlyNotAssignedTagsQuery();
@override
List<Object?> get props => [];
@override
String toQueryParameter() {
if (onlyNotAssigned || onlyAssigned) {
return '&is_tagged=$_isTagged';
return '&is_tagged=0';
}
}
class AnyAssignedTagsQuery extends TagsQuery {
const AnyAssignedTagsQuery();
@override
List<Object?> get props => [];
@override
String toQueryParameter() {
return '&is_tagged=1';
}
}
class IdsTagsQuery extends TagsQuery {
final Iterable<TagIdQuery> _idQueries;
const IdsTagsQuery([this._idQueries = const []]);
const IdsTagsQuery.unset() : _idQueries = const [];
IdsTagsQuery.included(Iterable<int> ids)
: _idQueries = ids.map((id) => IncludeTagIdQuery(id));
IdsTagsQuery.fromIds(Iterable<int> ids) : this.included(ids);
IdsTagsQuery.excluded(Iterable<int> ids)
: _idQueries = ids.map((id) => ExcludeTagIdQuery(id));
IdsTagsQuery withIdQueriesAdded(Iterable<TagIdQuery> idQueries) {
final intersection = _idQueries
.map((idQ) => idQ.id)
.toSet()
.intersection(_idQueries.map((idQ) => idQ.id).toSet());
return IdsTagsQuery(
[...withIdsRemoved(intersection).queries, ...idQueries],
);
}
IdsTagsQuery withIdsRemoved(Iterable<int> ids) {
return IdsTagsQuery(
_idQueries.where((idQuery) => !ids.contains(idQuery.id)),
);
}
Iterable<TagIdQuery> get queries => _idQueries;
Iterable<int> get includedIds {
return _idQueries.whereType<IncludeTagIdQuery>().map((e) => e.id);
}
Iterable<int> get excludedIds {
return _idQueries.whereType<ExcludeTagIdQuery>().map((e) => e.id);
}
///
/// Returns a new instance with the type of the given [id] toggled.
/// E.g. if the provided [id] is currently registered as a [IncludeTagIdQuery],
/// then the new isntance will contain a [ExcludeTagIdQuery] with given id.
///
IdsTagsQuery withIdQueryToggled(int id) {
return IdsTagsQuery(
_idQueries.map((idQ) => idQ.id == id ? idQ.toggle() : idQ),
);
}
Iterable<int> get ids => [...includedIds, ...excludedIds];
@override
String toQueryParameter() {
final StringBuffer sb = StringBuffer("");
if (includedIds.isNotEmpty) {
sb.write('&tags__id__all=${includedIds.join(',')}');
}
return isUnset ? "" : '&tags__id__all=${ids.join(',')}';
if (excludedIds.isNotEmpty) {
sb.write('&tags__id__none=${excludedIds.join(',')}');
}
return sb.toString();
}
@override
List<Object?> get props => [_isTagged, _ids];
List<Object?> get props => [_idQueries];
}
abstract class TagIdQuery with EquatableMixin {
final int id;
TagIdQuery(this.id);
String get methodName;
@override
List<Object?> get props => [id, methodName];
TagIdQuery toggle();
}
class IncludeTagIdQuery extends TagIdQuery {
IncludeTagIdQuery(super.id);
@override
String get methodName => 'include';
@override
TagIdQuery toggle() {
return ExcludeTagIdQuery(id);
}
}
class ExcludeTagIdQuery extends TagIdQuery {
ExcludeTagIdQuery(super.id);
@override
String get methodName => 'exclude';
@override
TagIdQuery toggle() {
return IncludeTagIdQuery(id);
}
}