From 5c52f3fae000b939d32e2e05557a6bb2c3a9c436 Mon Sep 17 00:00:00 2001 From: David Bohn Date: Tue, 10 Nov 2015 10:05:34 +0100 Subject: [PATCH] Added Change Tags Item to PermissionGrid Fixed missing bower install and added TODO for translation Added check to allow edit of tags for author in backend Fixed code style, added translation key Extracted tag permissions into method and restored original extension.js Adressing chaining of policy issue --- .../js/admin/src/addTagChangePermission.js | 27 +++++++++++++ extensions/tags/js/admin/src/main.js | 2 + .../tags/src/Access/DiscussionPolicy.php | 38 +++++++++++++++++++ 3 files changed, 67 insertions(+) create mode 100644 extensions/tags/js/admin/src/addTagChangePermission.js diff --git a/extensions/tags/js/admin/src/addTagChangePermission.js b/extensions/tags/js/admin/src/addTagChangePermission.js new file mode 100644 index 000000000..4e0a6212e --- /dev/null +++ b/extensions/tags/js/admin/src/addTagChangePermission.js @@ -0,0 +1,27 @@ +import { extend } from 'flarum/extend'; +import PermissionGrid from 'flarum/components/PermissionGrid'; +import SettingDropdown from 'flarum/components/SettingDropdown'; + +export default function() { + extend(PermissionGrid.prototype, 'startItems', items => { + items.add('allowTagChange', { + icon: 'tags', + label: app.translator.trans('flarum-tags.admin.permissions.allow_edit_tags_label'), + setting: () => { + const minutes = parseInt(app.settings.allow_tag_change, 10); + + return SettingDropdown.component({ + defaultLabel: minutes + ? app.translator.transChoice('core.admin.permissions_controls.allow_some_minutes_button', minutes, {count: minutes}) + : app.translator.trans('core.admin.permissions_controls.allow_indefinitely_button'), + key: 'allow_tag_change', + options: [ + {value: '-1', label: app.translator.trans('core.admin.permissions_controls.allow_indefinitely_button')}, + {value: '10', label: app.translator.trans('core.admin.permissions_controls.allow_ten_minutes_button')}, + {value: 'reply', label: app.translator.trans('core.admin.permissions_controls.allow_until_reply_button')} + ] + }); + } + }, 90); + }); +} diff --git a/extensions/tags/js/admin/src/main.js b/extensions/tags/js/admin/src/main.js index 5d2559707..1847c517b 100644 --- a/extensions/tags/js/admin/src/main.js +++ b/extensions/tags/js/admin/src/main.js @@ -3,6 +3,7 @@ import addTagsPermissionScope from 'flarum/tags/addTagsPermissionScope'; import addTagPermission from 'flarum/tags/addTagPermission'; import addTagsPane from 'flarum/tags/addTagsPane'; import addTagsHomePageOption from 'flarum/tags/addTagsHomePageOption'; +import addTagChangePermission from 'flarum/tags/addTagChangePermission'; app.initializers.add('flarum-tags', app => { app.store.models.tags = Tag; @@ -11,4 +12,5 @@ app.initializers.add('flarum-tags', app => { addTagPermission(); addTagsPane(); addTagsHomePageOption(); + addTagChangePermission(); }); diff --git a/extensions/tags/src/Access/DiscussionPolicy.php b/extensions/tags/src/Access/DiscussionPolicy.php index f84c55707..1c5fd3fd3 100755 --- a/extensions/tags/src/Access/DiscussionPolicy.php +++ b/extensions/tags/src/Access/DiscussionPolicy.php @@ -10,10 +10,12 @@ namespace Flarum\Tags\Access; +use Carbon\Carbon; use Flarum\Core\Access\AbstractPolicy; use Flarum\Core\Discussion; use Flarum\Core\User; use Flarum\Event\ScopeHiddenDiscussionVisibility; +use Flarum\Settings\SettingsRepositoryInterface; use Flarum\Tags\Tag; use Illuminate\Contracts\Events\Dispatcher; use Illuminate\Database\Eloquent\Builder; @@ -21,11 +23,26 @@ use Illuminate\Database\Query\Expression; class DiscussionPolicy extends AbstractPolicy { + /** * {@inheritdoc} */ protected $model = Discussion::class; + /** + * @var SettingsRepositoryInterface + */ + protected $settings; + + /** + * @param SettingsRepositoryInterface $settings + * @param Gate $gate + */ + public function __construct(SettingsRepositoryInterface $settings) + { + $this->settings = $settings; + } + /** * {@inheritdoc} */ @@ -103,4 +120,25 @@ class DiscussionPolicy extends AbstractPolicy ->where('discussions.id', new Expression('discussion_id')); }); } + + /** + * This method checks, if the user is still allowed to edit the tags + * based on the configuration item + * @param User $actor + * @param Discussion $discussion + * @return bool + */ + public function tag(User $actor, Discussion $discussion) + { + if ($discussion->start_user_id == $actor->id) { + $allowEditTags = $this->settings->get('allow_tag_change'); + + if ($allowEditTags === '-1' + || ($allowEditTags === 'reply' && $discussion->participants_count <= 1) + || ($discussion->start_time->diffInMinutes(new Carbon) < $allowEditTags) + ) { + return true; + } + } + } }