diff --git a/extensions/tags/extend.php b/extensions/tags/extend.php index db1092a27..6eb72285d 100644 --- a/extensions/tags/extend.php +++ b/extensions/tags/extend.php @@ -12,6 +12,8 @@ use Flarum\Api\Serializer\DiscussionSerializer; use Flarum\Api\Serializer\ForumSerializer; use Flarum\Discussion\Discussion; use Flarum\Discussion\Event\Saving; +use Flarum\Discussion\Filter\DiscussionFilterer; +use Flarum\Discussion\Search\DiscussionSearcher; use Flarum\Extend; use Flarum\Flags\Flag; use Flarum\Tags\Access; @@ -19,11 +21,13 @@ use Flarum\Tags\Api\Controller; use Flarum\Tags\Api\Serializer\TagSerializer; use Flarum\Tags\Content; use Flarum\Tags\Event\DiscussionWasTagged; +use Flarum\Tags\Filter\HideHiddenTagsFromAllDiscussionsPage; +use Flarum\Tags\Filter\PostTagFilter; use Flarum\Tags\Listener; use Flarum\Tags\LoadForumTagsRelationship; use Flarum\Tags\Post\DiscussionTaggedPost; +use Flarum\Tags\Query\TagFilterGambit; use Flarum\Tags\Tag; -use Illuminate\Contracts\Events\Dispatcher; return [ (new Extend\Frontend('forum')) @@ -102,11 +106,16 @@ return [ (new Extend\Event()) ->listen(Saving::class, Listener\SaveTagsToDatabase::class) - ->listen(DiscussionWasTagged::class, Listener\CreatePostWhenTagsAreChanged::class), + ->listen(DiscussionWasTagged::class, Listener\CreatePostWhenTagsAreChanged::class) + ->subscribe(Listener\UpdateTagMetadata::class), - function (Dispatcher $events) { - $events->subscribe(Listener\FilterDiscussionListByTags::class); - $events->subscribe(Listener\FilterPostsQueryByTag::class); - $events->subscribe(Listener\UpdateTagMetadata::class); - }, + (new Extend\Filter(PostFilterer::class)) + ->addFilter(PostTagFilter::class), + + (new Extend\Filter(DiscussionFilterer::class)) + ->addFilter(TagFilterGambit::class) + ->addFilterMutator(HideHiddenTagsFromAllDiscussionsPage::class), + + (new Extend\SimpleFlarumSearch(DiscussionSearcher::class)) + ->addGambit(TagFilterGambit::class), ]; diff --git a/extensions/tags/js/src/forum/addTagFilter.js b/extensions/tags/js/src/forum/addTagFilter.js index 85576ea78..056669bb5 100644 --- a/extensions/tags/js/src/forum/addTagFilter.js +++ b/extensions/tags/js/src/forum/addTagFilter.js @@ -64,7 +64,7 @@ export default function() { params.include.push('tags'); if (this.params.tags) { - params.filter.q = (params.filter.q || '') + ' tag:' + this.params.tags; + params.filter.tag = this.params.tags; } }); } diff --git a/extensions/tags/src/Filter/HideHiddenTagsFromAllDiscussionsPage.php b/extensions/tags/src/Filter/HideHiddenTagsFromAllDiscussionsPage.php new file mode 100644 index 000000000..56af207d9 --- /dev/null +++ b/extensions/tags/src/Filter/HideHiddenTagsFromAllDiscussionsPage.php @@ -0,0 +1,23 @@ +getActiveFilters()) > 0) { + return; + } + + $filter->getQuery()->whereNotIn('discussions.id', function ($query) { + return $query->select('discussion_id') + ->from('discussion_tag') + ->whereIn('tag_id', Tag::where('is_hidden', 1)->pluck('id')); + }); + } +} diff --git a/extensions/tags/src/Filter/PostTagFilter.php b/extensions/tags/src/Filter/PostTagFilter.php new file mode 100644 index 000000000..9374d0969 --- /dev/null +++ b/extensions/tags/src/Filter/PostTagFilter.php @@ -0,0 +1,28 @@ +getQuery() + ->join('discussion_tag', 'discussion_tag.discussion_id', '=', 'posts.discussion_id') + ->where('discussion_tag.tag_id', $filterValue); + } +} diff --git a/extensions/tags/src/Listener/FilterDiscussionListByTags.php b/extensions/tags/src/Listener/FilterDiscussionListByTags.php deleted file mode 100755 index 9fc8b9bf7..000000000 --- a/extensions/tags/src/Listener/FilterDiscussionListByTags.php +++ /dev/null @@ -1,54 +0,0 @@ -listen(ConfigureDiscussionGambits::class, [$this, 'addTagGambit']); - $events->listen(Searching::class, [$this, 'hideTagsFromDiscussionList']); - } - - /** - * @param ConfigureDiscussionGambits $event - */ - public function addTagGambit(ConfigureDiscussionGambits $event) - { - $event->gambits->add(TagGambit::class); - } - - /** - * @param Searching $event - */ - public function hideTagsFromDiscussionList(Searching $event) - { - $query = $event->search->getQuery(); - - if (count($event->search->getActiveGambits()) > 0) { - return; - } - - $query->whereNotIn('discussions.id', function ($query) { - return $query->select('discussion_id') - ->from('discussion_tag') - ->whereIn('tag_id', Tag::where('is_hidden', 1)->pluck('id')); - }); - } -} diff --git a/extensions/tags/src/Listener/FilterPostsQueryByTag.php b/extensions/tags/src/Listener/FilterPostsQueryByTag.php deleted file mode 100644 index c95fb69ab..000000000 --- a/extensions/tags/src/Listener/FilterPostsQueryByTag.php +++ /dev/null @@ -1,37 +0,0 @@ -listen(ConfigurePostsQuery::class, [$this, 'filterQuery']); - } - - /** - * @param ConfigurePostsQuery $event - */ - public function filterQuery(ConfigurePostsQuery $event) - { - if ($tagId = Arr::get($event->filter, 'tag')) { - $event->query - ->join('discussion_tag', 'discussion_tag.discussion_id', '=', 'posts.discussion_id') - ->where('discussion_tag.tag_id', $tagId); - } - } -} diff --git a/extensions/tags/src/Gambit/TagGambit.php b/extensions/tags/src/Query/TagFilterGambit.php similarity index 58% rename from extensions/tags/src/Gambit/TagGambit.php rename to extensions/tags/src/Query/TagFilterGambit.php index 45542db5f..60c2ae1ee 100644 --- a/extensions/tags/src/Gambit/TagGambit.php +++ b/extensions/tags/src/Query/TagFilterGambit.php @@ -7,20 +7,17 @@ * LICENSE file that was distributed with this source code. */ -namespace Flarum\Tags\Gambit; +namespace Flarum\Tags\Query; +use Flarum\Filter\FilterInterface; +use Flarum\Filter\FilterState; use Flarum\Search\AbstractRegexGambit; -use Flarum\Search\AbstractSearch; +use Flarum\Search\SearchState; use Flarum\Tags\TagRepository; use Illuminate\Database\Query\Builder; -class TagGambit extends AbstractRegexGambit +class TagFilterGambit extends AbstractRegexGambit implements FilterInterface { - /** - * {@inheritdoc} - */ - protected $pattern = 'tag:(.+)'; - /** * @var TagRepository */ @@ -34,14 +31,30 @@ class TagGambit extends AbstractRegexGambit $this->tags = $tags; } - /** - * {@inheritdoc} - */ - protected function conditions(AbstractSearch $search, array $matches, $negate) - { - $slugs = explode(',', trim($matches[1], '"')); + protected function getGambitPattern() { + return 'tag:(.+)'; + } - $search->getQuery()->where(function (Builder $query) use ($slugs, $negate) { + protected function conditions(SearchState $search, array $matches, $negate) + { + $this->constrain($search->getQuery(), $matches[1], $negate); + } + + public function getFilterKey(): string + { + return 'tag'; + } + + public function filter(FilterState $filterState, string $filterValue, bool $negate) + { + $this->constrain($filterState->getQuery(), $filterValue, $negate); + } + + protected function constrain(Builder $query, $rawSlugs, $negate) + { + $slugs = explode(',', trim($rawSlugs, '"')); + + $query->where(function (Builder $query) use ($slugs, $negate) { foreach ($slugs as $slug) { if ($slug === 'untagged') { $query->whereIn('discussions.id', function (Builder $query) {