mirror of
https://github.com/flarum/framework.git
synced 2025-05-23 07:09:57 +08:00
Allow admins to delete users
This commit is contained in:
@ -39,7 +39,8 @@ export default class UserCard extends Component {
|
|||||||
children: controls,
|
children: controls,
|
||||||
className: 'UserCard-controls App-primaryControl',
|
className: 'UserCard-controls App-primaryControl',
|
||||||
menuClassName: 'Dropdown-menu--right',
|
menuClassName: 'Dropdown-menu--right',
|
||||||
buttonClassName: this.props.controlsButtonClassName
|
buttonClassName: this.props.controlsButtonClassName,
|
||||||
|
icon: 'ellipsis-v'
|
||||||
}) : ''}
|
}) : ''}
|
||||||
|
|
||||||
<div className="UserCard-profile">
|
<div className="UserCard-profile">
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import Button from 'flarum/components/Button';
|
import Button from 'flarum/components/Button';
|
||||||
import Separator from 'flarum/components/Separator';
|
import Separator from 'flarum/components/Separator';
|
||||||
import EditUserModal from 'flarum/components/EditUserModal';
|
import EditUserModal from 'flarum/components/EditUserModal';
|
||||||
import DeleteUserModal from 'flarum/components/DeleteUserModal';
|
import UserPage from 'flarum/components/UserPage';
|
||||||
import ItemList from 'flarum/utils/ItemList';
|
import ItemList from 'flarum/utils/ItemList';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -80,7 +80,7 @@ export default {
|
|||||||
destructiveControls(user) {
|
destructiveControls(user) {
|
||||||
const items = new ItemList();
|
const items = new ItemList();
|
||||||
|
|
||||||
if (user.canDelete()) {
|
if (user.id() !== '1' && user.canDelete()) {
|
||||||
items.add('delete', Button.component({
|
items.add('delete', Button.component({
|
||||||
icon: 'times',
|
icon: 'times',
|
||||||
children: app.trans('core.delete'),
|
children: app.trans('core.delete'),
|
||||||
@ -95,7 +95,15 @@ export default {
|
|||||||
* Delete the user.
|
* Delete the user.
|
||||||
*/
|
*/
|
||||||
deleteAction() {
|
deleteAction() {
|
||||||
app.modal.show(new DeleteUserModal({user: this}));
|
if (confirm('Are you sure you want to delete this user? All of the user\'s posts will be deleted.')) {
|
||||||
|
this.delete().then(() => {
|
||||||
|
if (app.current instanceof UserPage && app.current.user === this) {
|
||||||
|
app.history.back();
|
||||||
|
} else {
|
||||||
|
window.location.reload();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -37,7 +37,9 @@ class UserMetadataUpdater
|
|||||||
*/
|
*/
|
||||||
public function whenPostWasDeleted(PostWasDeleted $event)
|
public function whenPostWasDeleted(PostWasDeleted $event)
|
||||||
{
|
{
|
||||||
$this->updateCommentsCount($event->post->user, -1);
|
if ($event->post->user->exists) {
|
||||||
|
$this->updateCommentsCount($event->post->user, -1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -8,6 +8,7 @@ use Flarum\Events\RegisterUserPreferences;
|
|||||||
use Illuminate\Contracts\Hashing\Hasher;
|
use Illuminate\Contracts\Hashing\Hasher;
|
||||||
use Flarum\Core\Formatter\FormatterManager;
|
use Flarum\Core\Formatter\FormatterManager;
|
||||||
use Flarum\Events\UserWasDeleted;
|
use Flarum\Events\UserWasDeleted;
|
||||||
|
use Flarum\Events\PostWasDeleted;
|
||||||
use Flarum\Events\UserWasRegistered;
|
use Flarum\Events\UserWasRegistered;
|
||||||
use Flarum\Events\UserWasRenamed;
|
use Flarum\Events\UserWasRenamed;
|
||||||
use Flarum\Events\UserEmailWasChanged;
|
use Flarum\Events\UserEmailWasChanged;
|
||||||
@ -95,8 +96,31 @@ class User extends Model
|
|||||||
{
|
{
|
||||||
parent::boot();
|
parent::boot();
|
||||||
|
|
||||||
|
// Don't allow the root admin to be deleted.
|
||||||
|
static::deleting(function (User $user) {
|
||||||
|
if ($user->id == 1) {
|
||||||
|
throw new DomainException('Cannot delete the root admin');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
static::deleted(function ($user) {
|
static::deleted(function ($user) {
|
||||||
$user->raise(new UserWasDeleted($user));
|
$user->raise(new UserWasDeleted($user));
|
||||||
|
|
||||||
|
// Delete all of the posts by the user. Before we delete them
|
||||||
|
// in a big batch query, we will loop through them and raise a
|
||||||
|
// PostWasDeleted event for each post.
|
||||||
|
$posts = $user->posts()->allTypes();
|
||||||
|
|
||||||
|
foreach ($posts->get() as $post) {
|
||||||
|
$user->raise(new PostWasDeleted($post));
|
||||||
|
}
|
||||||
|
|
||||||
|
$posts->delete();
|
||||||
|
|
||||||
|
$user->read()->detach();
|
||||||
|
$user->groups()->detach();
|
||||||
|
$user->accessTokens()->delete();
|
||||||
|
$user->notifications()->delete();
|
||||||
});
|
});
|
||||||
|
|
||||||
event(new RegisterUserPreferences);
|
event(new RegisterUserPreferences);
|
||||||
@ -479,13 +503,23 @@ class User extends Model
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Define the relationship with the user's activity.
|
* Define the relationship with the user's posts.
|
||||||
*
|
*
|
||||||
* @return \Illuminate\Database\Eloquent\Relations\HasMany
|
* @return \Illuminate\Database\Eloquent\Relations\HasMany
|
||||||
*/
|
*/
|
||||||
public function activity()
|
public function posts()
|
||||||
{
|
{
|
||||||
return $this->hasMany('Flarum\Core\Activity\Activity');
|
return $this->hasMany('Flarum\Core\Posts\Post');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Define the relationship with the user's read discussions.
|
||||||
|
*
|
||||||
|
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
|
||||||
|
*/
|
||||||
|
public function read()
|
||||||
|
{
|
||||||
|
return $this->belongsToMany('Flarum\Core\Discussions\Discussion', 'users_discussions');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Reference in New Issue
Block a user