From 4282b9be2093500d657e73f9070c1ee97fa69903 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Fri, 27 May 2016 14:40:59 +0930 Subject: [PATCH] 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 --- extensions/approval/js/admin/dist/extension.js | 17 +++++++++++++++++ extensions/approval/js/admin/src/main.js | 17 +++++++++++++++++ extensions/approval/js/forum/dist/extension.js | 17 +++++++++++++++-- extensions/approval/js/forum/src/main.js | 12 ++++++++++++ extensions/approval/less/forum/extension.less | 3 +++ .../approval/src/Listener/AddClientAssets.php | 6 +++--- .../src/Listener/UnapproveNewContent.php | 3 ++- 7 files changed, 69 insertions(+), 6 deletions(-) diff --git a/extensions/approval/js/admin/dist/extension.js b/extensions/approval/js/admin/dist/extension.js index 42252b38b..c4098e167 100644 --- a/extensions/approval/js/admin/dist/extension.js +++ b/extensions/approval/js/admin/dist/extension.js @@ -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', diff --git a/extensions/approval/js/admin/src/main.js b/extensions/approval/js/admin/src/main.js index 18fdec7a4..5d1d12a9f 100644 --- a/extensions/approval/js/admin/src/main.js +++ b/extensions/approval/js/admin/src/main.js @@ -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', diff --git a/extensions/approval/js/forum/dist/extension.js b/extensions/approval/js/forum/dist/extension.js index a392204f8..ff2c9a67e 100644 --- a/extensions/approval/js/forum/dist/extension.js +++ b/extensions/approval/js/forum/dist/extension.js @@ -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 } diff --git a/extensions/approval/js/forum/src/main.js b/extensions/approval/js/forum/src/main.js index 55a2ffe5c..e8de8dcba 100644 --- a/extensions/approval/js/forum/src/main.js +++ b/extensions/approval/js/forum/src/main.js @@ -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', ); + } + }); + 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 diff --git a/extensions/approval/less/forum/extension.less b/extensions/approval/less/forum/extension.less index 7e4d43e7d..2f1d8a514 100644 --- a/extensions/approval/less/forum/extension.less +++ b/extensions/approval/less/forum/extension.less @@ -5,3 +5,6 @@ opacity: 0.5; } } +.DiscussionListItem--unapproved { + .DiscussionListItem--hidden(); +} diff --git a/extensions/approval/src/Listener/AddClientAssets.php b/extensions/approval/src/Listener/AddClientAssets.php index 1da8d7cf6..61372ac43 100644 --- a/extensions/approval/src/Listener/AddClientAssets.php +++ b/extensions/approval/src/Listener/AddClientAssets.php @@ -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([ diff --git a/extensions/approval/src/Listener/UnapproveNewContent.php b/extensions/approval/src/Listener/UnapproveNewContent.php index 2b7f41b44..15d707eae 100644 --- a/extensions/approval/src/Listener/UnapproveNewContent.php +++ b/extensions/approval/src/Listener/UnapproveNewContent.php @@ -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; }