mirror of
https://github.com/wallabag/wallabag.git
synced 2025-09-30 19:22:12 +00:00
Merge 9d92febd6f
into bed6d09ef2
This commit is contained in:
commit
acce31465b
3 changed files with 77 additions and 0 deletions
|
@ -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',
|
||||||
|
])
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue