1
0
mirror of https://github.com/flarum/core.git synced 2025-08-06 08:27:42 +02:00

Finished working version

This commit is contained in:
Matthew Kilgore
2020-11-30 20:48:10 -05:00
parent c7f0b19cfa
commit 271f5ca922
8 changed files with 113 additions and 22 deletions

View File

@@ -22,6 +22,7 @@
}, },
"flarum-extension": { "flarum-extension": {
"title": "Nicknames", "title": "Nicknames",
"category": "feature",
"icon": { "icon": {
"name": "fas fa-user-tag", "name": "fas fa-user-tag",
"backgroundColor": "#8E4529", "backgroundColor": "#8E4529",

View File

@@ -11,19 +11,19 @@
namespace Flarum\Nicknames; namespace Flarum\Nicknames;
use Flarum\Api\Serializer\UserSerializer;
use Flarum\Event\ConfigureUserGambits; use Flarum\Event\ConfigureUserGambits;
use Flarum\Extend; use Flarum\Extend;
use Flarum\User\Event\Saving; use Flarum\User\Event\Saving;
use Flarum\User\User; use Flarum\User\User;
use Flarum\User\UserValidator;
return [ return [
(new Extend\Frontend('forum')) (new Extend\Frontend('forum'))
->js(__DIR__.'/js/dist/forum.js') ->js(__DIR__.'/js/dist/forum.js'),
->css(__DIR__.'/resources/less/forum.less'),
(new Extend\Frontend('admin')) (new Extend\Frontend('admin'))
->js(__DIR__.'/js/dist/admin.js') ->js(__DIR__.'/js/dist/admin.js'),
->css(__DIR__.'/resources/less/admin.less'),
(new Extend\User()) (new Extend\User())
->displayNameDriver('nickname', NicknameDriver::class), ->displayNameDriver('nickname', NicknameDriver::class),
@@ -35,5 +35,13 @@ return [
->listen(Saving::class, SaveNicknameToDatabase::class) ->listen(Saving::class, SaveNicknameToDatabase::class)
->listen(ConfigureUserGambits::class, SetUserNicknameGambit::class), ->listen(ConfigureUserGambits::class, SetUserNicknameGambit::class),
new Extend\Locales(__DIR__ . '/resources/locale'), (new Extend\ApiSerializer(UserSerializer::class))
->attribute('canEditOwnNickname', function($serializer, $user) {
$actor = $serializer->getActor();
return $actor->id === $user->id && $serializer->getActor()->can('editOwnNickname', $user);
}),
(new Extend\Validator(UserValidator::class))
->configure(AddNicknameValidation::class),
]; ];

View File

@@ -1,3 +1,29 @@
app.initializers.add('flarum/nickname', () => { app.initializers.add('flarum/nicknames', () => {
console.log('[flarum/nickname] Hello, admin!'); app.extensionData
}); .for('flarum-nicknames')
.registerSetting({
setting: 'flarum-nicknames.unique',
type: 'boolean',
label: app.translator.trans('flarum-nicknames.admin.settings.unique_label')
})
.registerSetting({
setting: 'flarum-nicknames.regex',
type: 'text',
label: app.translator.trans('flarum-nicknames.admin.settings.regex_label')
})
.registerSetting({
setting: 'flarum-nicknames.min',
type: 'number',
label: app.translator.trans('flarum-nicknames.admin.settings.min_label')
})
.registerSetting({
setting: 'flarum-nicknames.max',
type: 'number',
label: app.translator.trans('flarum-nicknames.admin.settings.max_label')
})
.registerPermission({
icon: 'fas fa-user-tag',
label: app.translator.trans('flarum-nicknames.admin.permissions.edit_own_nickname_label'),
permission: 'user.editOwnNickname'
}, 'start')
});

View File

@@ -13,7 +13,7 @@ export default class NicknameModal extends Modal {
} }
title() { title() {
return app.translator.trans('flarum-nicknames.forum.nickname.change'); return app.translator.trans('flarum-nicknames.forum.change_nickname.title');
} }
content() { content() {
@@ -34,7 +34,7 @@ export default class NicknameModal extends Modal {
className: 'Button Button--primary Button--block', className: 'Button Button--primary Button--block',
type: 'submit', type: 'submit',
loading: this.loading, loading: this.loading,
}, app.translator.trans('flarum-nicknames.forum.nickname.submit_button'))} }, app.translator.trans('flarum-nicknames.forum.change_nickname.submit_button'))}
</div> </div>
</div> </div>
</div> </div>

View File

@@ -2,17 +2,23 @@ import { extend } from 'flarum/extend';
import Button from 'flarum/components/Button'; import Button from 'flarum/components/Button';
import EditUserModal from 'flarum/components/EditUserModal'; import EditUserModal from 'flarum/components/EditUserModal';
import SettingsPage from 'flarum/components/SettingsPage'; import SettingsPage from 'flarum/components/SettingsPage';
import Model from 'flarum/Model';
import User from 'flarum/models/User';
import extractText from 'flarum/utils/extractText'; import extractText from 'flarum/utils/extractText';
import Stream from 'flarum/utils/Stream'; import Stream from 'flarum/utils/Stream';
import NickNameModal from './components/NicknameModal'; import NickNameModal from './components/NicknameModal';
app.initializers.add('flarum/nicknames', () => { app.initializers.add('flarum/nicknames', () => {
User.prototype.canEditOwnNickname = Model.attribute('canEditOwnNickname');
extend(SettingsPage.prototype, 'accountItems', function (items) { extend(SettingsPage.prototype, 'accountItems', function (items) {
items.add('changeNickname', if (this.user.canEditOwnNickname()) {
<Button className="Button" onclick={() => app.modal.show(NickNameModal)}> items.add('changeNickname',
{app.translator.trans('flarum-nicknames.forum.settings.change_nickname_button')} <Button className="Button" onclick={() => app.modal.show(NickNameModal)}>
</Button> {app.translator.trans('flarum-nicknames.forum.settings.change_nickname_button')}
); </Button>
);
}
}); });
extend(EditUserModal.prototype, 'oninit', function () { extend(EditUserModal.prototype, 'oninit', function () {
@@ -22,9 +28,9 @@ app.initializers.add('flarum/nicknames', () => {
extend(EditUserModal.prototype, 'fields', function (items) { extend(EditUserModal.prototype, 'fields', function (items) {
items.add('nickname', items.add('nickname',
<div className="Form-group"> <div className="Form-group">
<label>{app.translator.trans('flarum-nicknames.forum.edit_user.password_heading')}</label> <label>{app.translator.trans('flarum-nicknames.forum.edit_user.nicknames_heading')}</label>
<input className="FormControl" <input className="FormControl"
placeholder={extractText(app.translator.trans('flarum-nicknames.forum.edit_user.password_text'))} placeholder={extractText(app.translator.trans('flarum-nicknames.forum.edit_user.nicknames_text'))}
bidi={this.nickname} /> bidi={this.nickname} />
</div>, 100); </div>, 100);
}); });

View File

@@ -0,0 +1,40 @@
<?php
namespace Flarum\Nicknames;
use Flarum\Settings\SettingsRepositoryInterface;
use Illuminate\Validation\Validator;
class AddNicknameValidation
{
/**
* @var SettingsRepositoryInterface
*/
protected $settings;
public function __construct(SettingsRepositoryInterface $settings)
{
$this->settings = $settings;
}
public function __invoke($flarumValidator, Validator $validator)
{
$unique_nickname = ($this->settings->get('flarum-nicknames.unique')) ? 'unique:users,nickname' : '';
$validator->setRules([
'nickname' => [
$unique_nickname,
function ($attribute, $value, $fail) {
$regex = $this->settings->get('flarum-nicknames.regex');
if ($regex && !preg_match_all("/$regex/", $value)) {
$fail(app('translator')->trans('flarum-nicknames.api.invalid_nickname_message'));
}
},
'min:' . $this->settings->get('flarum-nicknames.min', 1),
'max:' . $this->settings->get('flarum-nicknames.max', 150),
],
] + $validator->getRules());
}
}

View File

@@ -6,8 +6,18 @@ namespace Flarum\Nicknames;
use Flarum\Database\AbstractModel; use Flarum\Database\AbstractModel;
use Flarum\Http\SlugDriverInterface; use Flarum\Http\SlugDriverInterface;
use Flarum\User\User; use Flarum\User\User;
use Flarum\User\UserRepository;
class IdOnlyUserSlugDriver implements SlugDriverInterface { class IdOnlyUserSlugDriver implements SlugDriverInterface {
/**
* @var $users UserRepository
*/
protected $users;
public function __construct(UserRepository $users)
{
$this->users = $users;
}
public function toSlug(AbstractModel $instance): string public function toSlug(AbstractModel $instance): string
{ {
@@ -16,6 +26,6 @@ class IdOnlyUserSlugDriver implements SlugDriverInterface {
public function fromSlug(string $slug, User $actor): AbstractModel public function fromSlug(string $slug, User $actor): AbstractModel
{ {
return User::where('id', $slug)->whereVisibleTo($actor)->firstOrFail(); return $this->users->findOrFail($slug, $actor);
} }
} }

View File

@@ -13,15 +13,15 @@ class SaveNicknameToDatabase {
$actor = $event->actor; $actor = $event->actor;
$isSelf = $actor->id === $user->id; $isSelf = $actor->id === $user->id;
$canEdit = $actor->can('edit', $user);
$attributes = Arr::get($data, 'attributes', []); $attributes = Arr::get($data, 'attributes', []);
if (isset($attributes['nickname'])) { if (isset($attributes['nickname'])) {
if (!$isSelf) { if ($isSelf) {
$actor->assertPermission($canEdit); $actor->assertCan('editOwnNickname', $user);
} else {
$actor->assertCan('edit', $user);
} }
$user->nickname = $attributes['nickname']; $user->nickname = $attributes['nickname'];
$user->save();
} }
} }
} }