Files
animethemes-server/app/Filament/Actions/Models/Auth/User/GiveRoleAction.php
T
2025-10-01 17:18:31 -03:00

62 lines
1.6 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Filament\Actions\Models\Auth\User;
use App\Filament\Actions\BaseAction;
use App\Filament\Components\Fields\Select;
use App\Models\Auth\Role;
use App\Models\Auth\User;
use Filament\Schemas\Schema;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Arr;
class GiveRoleAction extends BaseAction
{
final public const string FIELD_ROLE = 'role';
public static function getDefaultName(): ?string
{
return 'user-give-role';
}
protected function setUp(): void
{
parent::setUp();
$this->label(__('filament.actions.user.give_role.name'));
$this->action(fn (User $record, array $data) => $this->handle($record, $data));
}
/**
* @param array<string, mixed> $data
*/
public function handle(User $user, array $data): void
{
$role = Role::findById(intval(Arr::get($data, self::FIELD_ROLE)));
$user->assignRole($role);
}
public function getSchema(Schema $schema): Schema
{
$roles = Role::query()
->whereDoesntHave(Role::RELATION_USERS, fn (Builder $query) => $query->whereKey($this->getRecord()->getKey()))
->get([Role::ATTRIBUTE_ID, Role::ATTRIBUTE_NAME])
->keyBy(Role::ATTRIBUTE_ID)
->map(fn (Role $role) => $role->name)
->toArray();
return $schema
->components([
Select::make(self::FIELD_ROLE)
->label(__('filament.resources.singularLabel.role'))
->searchable()
->required()
->options($roles),
]);
}
}