1
0
mirror of https://github.com/flarum/core.git synced 2025-08-09 18:07:02 +02:00

Add permission to bypass tag count requirements (#111)

This commit is contained in:
Sami Mazouz
2021-01-26 23:08:47 +01:00
committed by GitHub
parent fe4803a07c
commit b985aa8631
5 changed files with 27 additions and 5 deletions

View File

@@ -47,7 +47,10 @@ return [
->belongsToMany('tags', Tag::class, 'discussion_tag'),
(new Extend\ApiSerializer(ForumSerializer::class))
->hasMany('tags', TagSerializer::class),
->hasMany('tags', TagSerializer::class)
->attribute('canBypassTagCounts', function (ForumSerializer $serializer) {
return $serializer->getActor()->can('bypassTagCounts');
}),
(new Extend\ApiSerializer(DiscussionSerializer::class))
->hasMany('tags', TagSerializer::class)

View File

@@ -5,5 +5,10 @@ export default function () {
icon: 'fas fa-tag',
label: app.translator.trans('flarum-tags.admin.permissions.tag_discussions_label'),
permission: 'discussion.tag',
}, 'moderate', 95);
}, 'moderate', 95)
.registerPermission({
icon: 'fas fa-tags',
label: app.translator.trans('flarum-tags.admin.permissions.bypass_tag_counts_label'),
permission: 'bypassTagCounts',
}, 'start', 89);
}

View File

@@ -177,7 +177,7 @@ export default class TagDiscussionModal extends Modal {
</div>
</div>
<div className="TagDiscussionModal-form-submit App-primaryControl">
<Button type="submit" className="Button Button--primary" disabled={primaryCount < this.minPrimary || secondaryCount < this.minSecondary} icon="fas fa-check">
<Button type="submit" className="Button Button--primary" disabled={!this.meetsRequirements(primaryCount, secondaryCount)} icon="fas fa-check">
{app.translator.trans('flarum-tags.forum.choose_tags.submit_button')}
</Button>
</div>
@@ -218,6 +218,14 @@ export default class TagDiscussionModal extends Modal {
];
}
meetsRequirements(primaryCount, secondaryCount) {
if (app.forum.attribute('canBypassTagCounts')) {
return true;
}
return primaryCount >= this.minPrimary && secondaryCount >= this.minSecondary;
}
toggleTag(tag) {
const index = this.selected.indexOf(tag);

View File

@@ -34,6 +34,10 @@ class GlobalPolicy extends AbstractPolicy
public function can(User $actor, string $ability)
{
if (in_array($ability, ['viewDiscussions', 'startDiscussion'])) {
if ($actor->hasPermission($ability) && $actor->hasPermission('bypassTagCounts')) {
return $this->allow();
}
$enoughPrimary = count(Tag::getIdsWhereCan($actor, $ability, true, false)) >= $this->settings->get('flarum-tags.min_primary_tags');
$enoughSecondary = count(Tag::getIdsWhereCan($actor, $ability, false, true)) >= $this->settings->get('flarum-tags.min_secondary_tags');

View File

@@ -111,8 +111,10 @@ class SaveTagsToDatabase
throw new PermissionDeniedException;
}
$this->validateTagCount('primary', $primaryCount);
$this->validateTagCount('secondary', $secondaryCount);
if (! $actor->can('bypassTagCounts', $discussion)) {
$this->validateTagCount('primary', $primaryCount);
$this->validateTagCount('secondary', $secondaryCount);
}
$discussion->afterSave(function ($discussion) use ($newTagIds) {
$discussion->tags()->sync($newTagIds);