1
0
Fork 0
mirror of https://github.com/wallabag/wallabag.git synced 2025-09-30 19:22:12 +00:00
This commit is contained in:
Kevin Decherf 2025-09-25 21:52:48 -07:00 committed by GitHub
commit acce31465b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 77 additions and 0 deletions

View file

@ -205,6 +205,77 @@ class EntryFilterType extends AbstractType
'choices' => array_flip($this->repository->findDistinctLanguageByUser($user->getId())), 'choices' => array_flip($this->repository->findDistinctLanguageByUser($user->getId())),
'label' => 'entry.filters.language_label', 'label' => 'entry.filters.language_label',
]) ])
->add('tags', TextFilterType::class, [
'apply_filter' => function (QueryInterface $filterQuery, $field, $values) {
$arr = explode(',', $values['value']);
$inLabels = array_filter($arr, function($v) {
$label = trim($v);
return \strlen($label) > 2 && 0 !== \strpos($label, '-') && false === \strpos($label, '%');
});
$notInLabels = array_map(function($m) {
return ltrim($m, '-');
}, array_filter($arr, function($v) {
$label = trim($v);
return \strlen($label) > 2 && 0 === \strpos($label, '-') && false === \strpos($label, '%');
}));
$likeLabels = array_filter($arr, function($v) {
$label = trim($v);
return \strlen($label) > 2 && 0 !== \strpos($label, '-') && false !== \strpos($label, '%');
});
$notLikeLabels = array_map(function($m) {
return ltrim($m, '-');
}, array_filter($arr, function($v) {
$label = trim($v);
return \strlen($label) > 2 && 0 === \strpos($label, '-') && false !== \strpos($label, '%');
}));
if ([] === $inLabels && [] === $notInLabels && [] === $likeLabels && [] === $notLikeLabels) {
return;
}
\assert($filterQuery instanceof ORMQuery);
$filterQuery->getQueryBuilder()->leftJoin('e.tags', 't');
$andExpr = $filterQuery->getExpr()->andX();
$orExpr = $filterQuery->getExpr()->orX();
$andNotExpr = $filterQuery->getExpr()->andX();
if ([] !== $inLabels) {
$orExpr->add($filterQuery->getExpr()->in('t.label', ':inLabels'));
$filterQuery->getQueryBuilder()->setParameter(':inLabels', $inLabels);
}
if ([] !== $likeLabels) {
foreach ($likeLabels as $k => $label) {
$orExpr->add($filterQuery->getExpr()->like('t.label', ':likeLabel' . $k));
$filterQuery->getQueryBuilder()->setParameter(':likeLabel' . $k, $label);
}
}
if ([] !== $notInLabels) {
$sub = $this->repository->createQueryBuilder('e0')->select('e0.id')->leftJoin('e0.tags', 't0')->andWhere('e0.user = :userId')->andWhere('t0.label IN (:notInLabels)');
$andNotExpr->add($filterQuery->getExpr()->notIn('e.id', $sub->getDQL()));
$filterQuery->getQueryBuilder()->setParameter(':notInLabels', $notInLabels);
}
if ([] !== $notLikeLabels) {
$orSubExpr = $filterQuery->getExpr()->orX();
$sub = $this->repository->createQueryBuilder("e1")->select("e1.id")->leftJoin("e1.tags", "t1")->andWhere("e1.user = :userId");
foreach ($notLikeLabels as $k => $label) {
$orSubExpr->add($filterQuery->getExpr()->like('t1.label', ":notLikeLabel$k"));
$filterQuery->getQueryBuilder()->setParameter(":notLikeLabel$k", $label);
}
$sub->andWhere($orSubExpr);
$andNotExpr->add($filterQuery->getExpr()->notIn('e.id', $sub->getDQL()));
}
$andExpr->add($orExpr);
$andExpr->add($andNotExpr);
return $filterQuery->createCondition($andExpr);
},
'label' => 'entry.filters.tags_label',
])
; ;
} }

View file

@ -276,6 +276,11 @@
<label for="entry_filter_createdAt_right_date" class="active">{{ 'entry.filters.created_at.to'|trans }}</label> <label for="entry_filter_createdAt_right_date" class="active">{{ 'entry.filters.created_at.to'|trans }}</label>
</div> </div>
<div class="input-field col s12">
{{ form_widget(form.tags, {'type': 'text', 'attr' : {'placeholder': 'tag1,tag2'} }) }}
{{ form_label(form.tags) }}
</div>
<div class="col s6"> <div class="col s6">
<button type="reset" class="center waves-effect waves-green btn-flat">{{ 'entry.filters.action.clear'|trans }}</button> <button type="reset" class="center waves-effect waves-green btn-flat">{{ 'entry.filters.action.clear'|trans }}</button>
</div> </div>

View file

@ -269,6 +269,7 @@ entry:
is_public_help: Public link is_public_help: Public link
language_label: Language language_label: Language
http_status_label: HTTP status http_status_label: HTTP status
tags_label: Tags
reading_time: reading_time:
label: Reading time in minutes label: Reading time in minutes
from: from from: from