Add separate "start discussions without approval" permission

- Register required permissions so that "start discussions without approval" can only be set for groups that already have permission to "start discussions" (and same for reply)
- Change the "hidden" trash badge into a more descriptive gavel badge for discussions that are awaiting approval

closes flarum/core#904
This commit is contained in:
Toby Zerner 2016-05-27 14:40:59 +09:30
parent 0ab8bb95cc
commit 4282b9be20
7 changed files with 69 additions and 6 deletions

View File

@ -13,6 +13,23 @@ System.register('flarum/approval/main', ['flarum/extend', 'flarum/app', 'flarum/
execute: function () {
app.initializers.add('approval', function () {
extend(app, 'getRequiredPermissions', function (required, permission) {
if (permission === 'discussion.startWithoutApproval') {
required.push('startDiscussion');
}
if (permission === 'discussion.replyWithoutApproval') {
required.push('discussion.reply');
}
});
extend(PermissionGrid.prototype, 'startItems', function (items) {
items.add('startDiscussionsWithoutApproval', {
icon: 'check',
label: app.translator.trans('flarum-approval.admin.permissions.start_discussions_without_approval_label'),
permission: 'discussion.startWithoutApproval'
}, 95);
});
extend(PermissionGrid.prototype, 'replyItems', function (items) {
items.add('replyWithoutApproval', {
icon: 'check',

View File

@ -3,6 +3,23 @@ import app from 'flarum/app';
import PermissionGrid from 'flarum/components/PermissionGrid';
app.initializers.add('approval', () => {
extend(app, 'getRequiredPermissions', function(required, permission) {
if (permission === 'discussion.startWithoutApproval') {
required.push('startDiscussion');
}
if (permission === 'discussion.replyWithoutApproval') {
required.push('discussion.reply');
}
});
extend(PermissionGrid.prototype, 'startItems', items => {
items.add('startDiscussionsWithoutApproval', {
icon: 'check',
label: app.translator.trans('flarum-approval.admin.permissions.start_discussions_without_approval_label'),
permission: 'discussion.startWithoutApproval'
}, 95);
});
extend(PermissionGrid.prototype, 'replyItems', items => {
items.add('replyWithoutApproval', {
icon: 'check',

View File

@ -1,7 +1,7 @@
'use strict';
System.register('flarum/approval/main', ['flarum/extend', 'flarum/app', 'flarum/models/Discussion', 'flarum/models/Post', 'flarum/components/DiscussionListItem', 'flarum/components/CommentPost', 'flarum/components/Button', 'flarum/utils/PostControls'], function (_export, _context) {
var extend, override, app, Discussion, Post, DiscussionListItem, CommentPost, Button, PostControls;
System.register('flarum/approval/main', ['flarum/extend', 'flarum/app', 'flarum/models/Discussion', 'flarum/models/Post', 'flarum/components/Badge', 'flarum/components/DiscussionListItem', 'flarum/components/CommentPost', 'flarum/components/Button', 'flarum/utils/PostControls'], function (_export, _context) {
var extend, override, app, Discussion, Post, Badge, DiscussionListItem, CommentPost, Button, PostControls;
return {
setters: [function (_flarumExtend) {
extend = _flarumExtend.extend;
@ -12,6 +12,8 @@ System.register('flarum/approval/main', ['flarum/extend', 'flarum/app', 'flarum/
Discussion = _flarumModelsDiscussion.default;
}, function (_flarumModelsPost) {
Post = _flarumModelsPost.default;
}, function (_flarumComponentsBadge) {
Badge = _flarumComponentsBadge.default;
}, function (_flarumComponentsDiscussionListItem) {
DiscussionListItem = _flarumComponentsDiscussionListItem.default;
}, function (_flarumComponentsCommentPost) {
@ -26,6 +28,13 @@ System.register('flarum/approval/main', ['flarum/extend', 'flarum/app', 'flarum/
app.initializers.add('flarum-approval', function () {
Discussion.prototype.isApproved = Discussion.attribute('isApproved');
extend(Discussion.prototype, 'badges', function (items) {
if (!this.isApproved()) {
items.remove('hidden');
items.add('awaitingApproval', m(Badge, { type: 'awaitingApproval', icon: 'gavel', label: app.translator.trans('flarum-approval.forum.badge.awaiting_approval_tooltip') }));
}
});
Post.prototype.isApproved = Post.attribute('isApproved');
Post.prototype.canApprove = Post.attribute('canApprove');
@ -67,6 +76,10 @@ System.register('flarum/approval/main', ['flarum/extend', 'flarum/app', 'flarum/
PostControls.approveAction = function () {
this.save({ isApproved: true });
if (this.number() === 1) {
this.discussion().pushAttributes({ isApproved: true });
}
};
}, -10); // set initializer priority to run after reports
}

View File

@ -2,6 +2,7 @@ import { extend, override } from 'flarum/extend';
import app from 'flarum/app';
import Discussion from 'flarum/models/Discussion';
import Post from 'flarum/models/Post';
import Badge from 'flarum/components/Badge';
import DiscussionListItem from 'flarum/components/DiscussionListItem';
import CommentPost from 'flarum/components/CommentPost';
import Button from 'flarum/components/Button';
@ -10,6 +11,13 @@ import PostControls from 'flarum/utils/PostControls';
app.initializers.add('flarum-approval', () => {
Discussion.prototype.isApproved = Discussion.attribute('isApproved');
extend(Discussion.prototype, 'badges', function(items) {
if (!this.isApproved()) {
items.remove('hidden');
items.add('awaitingApproval', <Badge type="awaitingApproval" icon="gavel" label={app.translator.trans('flarum-approval.forum.badge.awaiting_approval_tooltip')}/>);
}
});
Post.prototype.isApproved = Post.attribute('isApproved');
Post.prototype.canApprove = Post.attribute('canApprove');
@ -52,5 +60,9 @@ app.initializers.add('flarum-approval', () => {
PostControls.approveAction = function() {
this.save({isApproved: true});
if (this.number() === 1) {
this.discussion().pushAttributes({isApproved: true});
}
};
}, -10); // set initializer priority to run after reports

View File

@ -5,3 +5,6 @@
opacity: 0.5;
}
}
.DiscussionListItem--unapproved {
.DiscussionListItem--hidden();
}

View File

@ -10,7 +10,7 @@
namespace Flarum\Approval\Listener;
use Flarum\Event\ConfigureClientView;
use Flarum\Event\ConfigureWebApp;
use Illuminate\Contracts\Events\Dispatcher;
class AddClientAssets
@ -20,13 +20,13 @@ class AddClientAssets
*/
public function subscribe(Dispatcher $events)
{
$events->listen(ConfigureClientView::class, [$this, 'addAssets']);
$events->listen(ConfigureWebApp::class, [$this, 'addAssets']);
}
/**
* @param ConfigureClientView $event
*/
public function addAssets(ConfigureClientView $event)
public function addAssets(ConfigureWebApp $event)
{
if ($event->isForum()) {
$event->addAssets([

View File

@ -32,7 +32,8 @@ class UnapproveNewContent
$post = $event->post;
if (! $post->exists) {
if ($event->actor->can('replyWithoutApproval', $post->discussion)) {
if (($post->discussion->number_index == 0 && $event->actor->can('startWithoutApproval', $post->discussion))
|| $event->actor->can('replyWithoutApproval', $post->discussion)) {
if ($post->is_approved === null) {
$post->is_approved = true;
}