From 1984d84c6e46b20c1517c48a9ef3e718793466ad Mon Sep 17 00:00:00 2001 From: Rahman Ramsi Date: Sat, 21 Dec 2024 09:57:53 +0800 Subject: [PATCH] fix: allow admin user to edit themself --- app/Models/User.php | 2 +- app/Panel/Conference/Resources/UserResource.php | 11 +++++------ app/Policies/UserPolicy.php | 4 ++++ 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/app/Models/User.php b/app/Models/User.php index 9b9e6e23..609f71a5 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -276,7 +276,7 @@ function ($object) use ($roles, $model, $teamPivot) { public function syncRoles(...$roles) { if ($this->getModel()->exists) { - $this->roles()->detach($this->roles->pluck('id')->toArray()); + $this->roles()->detach($this->roles->filter(fn($role) => $role->name != UserRole::Admin->value)->pluck('id')->toArray()); $this->setRelation('roles', collect()); } diff --git a/app/Panel/Conference/Resources/UserResource.php b/app/Panel/Conference/Resources/UserResource.php index f8b28735..4f75357e 100644 --- a/app/Panel/Conference/Resources/UserResource.php +++ b/app/Panel/Conference/Resources/UserResource.php @@ -36,6 +36,7 @@ use Filament\Tables\Table; use Illuminate\Database\Eloquent\Builder; use Illuminate\Support\Arr; +use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Str; use STS\FilamentImpersonate\Tables\Actions\Impersonate; @@ -66,7 +67,6 @@ public static function getNavigationGroup(): string public static function getEloquentQuery(): Builder { return static::getModel()::query() - ->where('id', '!=', auth()->id()) ->with(['meta', 'media', 'bans']); } @@ -159,12 +159,14 @@ public static function form(Form $form): Form titleAttribute: 'name', modifyQueryUsing: fn ($query) => $query->where('name', '!=', UserRole::Admin) ) - ->saveRelationshipsUsing(function (Forms\Components\CheckboxList $component, ?array $state) { + ->saveRelationshipsUsing(function (Forms\Components\CheckboxList $component, ?array $state, User $record) { + $roles = $state ? Role::whereIn('id', $state)->pluck('name')->toArray() : []; $roles = array_diff($roles, [UserRole::Admin->value]); $component->getModelInstance()->syncRoles($roles); + }), ]), ]) @@ -259,10 +261,7 @@ public static function table(Table $table): Table ->deferFilters() ->actions([ EditAction::make() - ->modalWidth('full') - ->hidden(fn (User $record) => $record->hasRole(UserRole::Admin)) - ->mutateRecordDataUsing(fn ($data, User $record) => array_merge($data, ['meta' => $record->getAllMeta()->toArray()])) - ->using(fn (array $data, User $record) => UserUpdateAction::run($data, $record)), + ->modalWidth('full'), DeleteAction::make() ->using(function (?array $data, User $record, DeleteAction $action) { try { diff --git a/app/Policies/UserPolicy.php b/app/Policies/UserPolicy.php index 79c406fb..f609c14f 100644 --- a/app/Policies/UserPolicy.php +++ b/app/Policies/UserPolicy.php @@ -47,6 +47,10 @@ public function update(User $user, User $model) return true; } + if ($model->hasRole(UserRole::Admin)) { + return false; + } + if ($user->can('User:update')) { return true; }