Update for beta 16

This commit is contained in:
Alexander Skvortsov 2021-03-13 16:54:03 -05:00
parent 80efe35b16
commit 85de81627d
7 changed files with 96 additions and 114 deletions

View File

@ -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),
];

View File

@ -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;
}
});
}

View File

@ -0,0 +1,23 @@
<?php
namespace Flarum\Tags\Filter;
use Flarum\Filter\FilterState;
use Flarum\Query\QueryCriteria;
use Flarum\Tags\Tag;
class HideHiddenTagsFromAllDiscussionsPage
{
public function __invoke(FilterState $filter, QueryCriteria $queryCriteria)
{
if (count($filter->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'));
});
}
}

View File

@ -0,0 +1,28 @@
<?php
/*
* This file is part of Flarum.
*
* For detailed copyright and license information, please view the
* LICENSE file that was distributed with this source code.
*/
namespace Flarum\Tags\Filter;
use Flarum\Filter\FilterInterface;
use Flarum\Filter\FilterState;
class PostTagFilter implements FilterInterface
{
public function getFilterKey(): string
{
return 'tag';
}
public function filter(FilterState $filterState, string $filterValue, bool $negate)
{
$filterState->getQuery()
->join('discussion_tag', 'discussion_tag.discussion_id', '=', 'posts.discussion_id')
->where('discussion_tag.tag_id', $filterValue);
}
}

View File

@ -1,54 +0,0 @@
<?php
/*
* This file is part of Flarum.
*
* For detailed copyright and license information, please view the
* LICENSE file that was distributed with this source code.
*/
namespace Flarum\Tags\Listener;
use Flarum\Discussion\Event\Searching;
use Flarum\Event\ConfigureDiscussionGambits;
use Flarum\Tags\Gambit\TagGambit;
use Flarum\Tags\Tag;
use Illuminate\Contracts\Events\Dispatcher;
class FilterDiscussionListByTags
{
/**
* @param Dispatcher $events
*/
public function subscribe(Dispatcher $events)
{
$events->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'));
});
}
}

View File

@ -1,37 +0,0 @@
<?php
/*
* This file is part of Flarum.
*
* For detailed copyright and license information, please view the
* LICENSE file that was distributed with this source code.
*/
namespace Flarum\Tags\Listener;
use Flarum\Event\ConfigurePostsQuery;
use Illuminate\Contracts\Events\Dispatcher;
use Illuminate\Support\Arr;
class FilterPostsQueryByTag
{
/**
* @param Dispatcher $events
*/
public function subscribe(Dispatcher $events)
{
$events->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);
}
}
}

View File

@ -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) {