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:
@@ -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",
|
||||||
|
@@ -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),
|
||||||
|
|
||||||
];
|
];
|
||||||
|
@@ -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')
|
||||||
|
});
|
||||||
|
@@ -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>
|
||||||
|
@@ -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);
|
||||||
});
|
});
|
||||||
|
40
extensions/nicknames/src/AddNicknameValidation.php
Normal file
40
extensions/nicknames/src/AddNicknameValidation.php
Normal 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());
|
||||||
|
}
|
||||||
|
}
|
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user