mirror of
https://github.com/flarum/core.git
synced 2025-08-11 02:44:04 +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'),
|
->belongsToMany('tags', Tag::class, 'discussion_tag'),
|
||||||
|
|
||||||
(new Extend\ApiSerializer(ForumSerializer::class))
|
(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))
|
(new Extend\ApiSerializer(DiscussionSerializer::class))
|
||||||
->hasMany('tags', TagSerializer::class)
|
->hasMany('tags', TagSerializer::class)
|
||||||
|
@@ -5,5 +5,10 @@ export default function () {
|
|||||||
icon: 'fas fa-tag',
|
icon: 'fas fa-tag',
|
||||||
label: app.translator.trans('flarum-tags.admin.permissions.tag_discussions_label'),
|
label: app.translator.trans('flarum-tags.admin.permissions.tag_discussions_label'),
|
||||||
permission: 'discussion.tag',
|
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>
|
</div>
|
||||||
<div className="TagDiscussionModal-form-submit App-primaryControl">
|
<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')}
|
{app.translator.trans('flarum-tags.forum.choose_tags.submit_button')}
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</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) {
|
toggleTag(tag) {
|
||||||
const index = this.selected.indexOf(tag);
|
const index = this.selected.indexOf(tag);
|
||||||
|
|
||||||
|
@@ -34,6 +34,10 @@ class GlobalPolicy extends AbstractPolicy
|
|||||||
public function can(User $actor, string $ability)
|
public function can(User $actor, string $ability)
|
||||||
{
|
{
|
||||||
if (in_array($ability, ['viewDiscussions', 'startDiscussion'])) {
|
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');
|
$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');
|
$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;
|
throw new PermissionDeniedException;
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->validateTagCount('primary', $primaryCount);
|
if (! $actor->can('bypassTagCounts', $discussion)) {
|
||||||
$this->validateTagCount('secondary', $secondaryCount);
|
$this->validateTagCount('primary', $primaryCount);
|
||||||
|
$this->validateTagCount('secondary', $secondaryCount);
|
||||||
|
}
|
||||||
|
|
||||||
$discussion->afterSave(function ($discussion) use ($newTagIds) {
|
$discussion->afterSave(function ($discussion) use ($newTagIds) {
|
||||||
$discussion->tags()->sync($newTagIds);
|
$discussion->tags()->sync($newTagIds);
|
||||||
|
Reference in New Issue
Block a user