mirror of
https://github.com/flarum/core.git
synced 2025-08-09 01:46:35 +02:00
Add permission to bypass tag count requirements (#111)
This commit is contained in:
@@ -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)
|
||||
|
@@ -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);
|
||||
}
|
||||
|
@@ -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);
|
||||
|
||||
|
@@ -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');
|
||||
|
||||
|
@@ -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);
|
||||
|
Reference in New Issue
Block a user