Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 16 additions & 11 deletions packages/actions/src/Concerns/CanBeAuthorized.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Gate;
use LogicException;
use UnitEnum;

trait CanBeAuthorized
{
Expand All @@ -20,16 +21,18 @@ trait CanBeAuthorized

protected bool | Closure $hasAuthorizationNotification = false;

protected bool | string | Closure | null $authorizeIndividualRecords = null;
protected bool | string | UnitEnum | Closure | null $authorizeIndividualRecords = null;

/**
* @param Model | class-string | array<mixed> | null $arguments
*/
public function authorize(mixed $abilities, Model | string | array | null $arguments = null): static
{
if ($abilities instanceof BackedEnum) {
$abilities = $abilities->value;
}
$abilities = match (true) {
$abilities instanceof BackedEnum => $abilities->value,
$abilities instanceof UnitEnum => $abilities->name,
default => $abilities,
};

if (is_string($abilities) || is_array($abilities)) {
$this->authorization = [
Expand All @@ -45,14 +48,16 @@ public function authorize(mixed $abilities, Model | string | array | null $argum
}

/**
* @param string | BackedEnum | array<string> $abilities
* @param string | UnitEnum | array<string | UnitEnum> $abilities
* @param Model | array<mixed> | null $arguments
*/
public function authorizeAny(string | BackedEnum | array $abilities, Model | array | null $arguments = null): static
public function authorizeAny(string | UnitEnum | array $abilities, Model | array | null $arguments = null): static
{
if ($abilities instanceof BackedEnum) {
$abilities = $abilities->value;
}
$abilities = match (true) {
$abilities instanceof BackedEnum => $abilities->value,
$abilities instanceof UnitEnum => $abilities->name,
default => $abilities,
};

$this->authorization = [
'type' => 'any',
Expand Down Expand Up @@ -211,7 +216,7 @@ public function isAuthorizedOrNotHiddenWhenUnauthorized(): bool
return $this->isAuthorized();
}

public function authorizeIndividualRecords(bool | string | Closure | null $callback = true): static
public function authorizeIndividualRecords(bool | string | UnitEnum | Closure | null $callback = true): static
{
$this->authorizeIndividualRecords = $callback;

Expand All @@ -220,7 +225,7 @@ public function authorizeIndividualRecords(bool | string | Closure | null $callb

public function getIndividualRecordAuthorizationResponse(Model $record): Response
{
if (is_string($this->authorizeIndividualRecords)) {
if (is_string($this->authorizeIndividualRecords) || ($this->authorizeIndividualRecords instanceof UnitEnum)) {
return Gate::inspect($this->authorizeIndividualRecords, Arr::wrap($record));
}

Expand Down
4 changes: 2 additions & 2 deletions packages/panels/src/helpers.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
*
* @throws AuthorizationException
*/
function authorize(UnitEnum | string $action, Model | string $model, bool $shouldCheckPolicyExistence = true): Response
function authorize(string | UnitEnum $action, Model | string $model, bool $shouldCheckPolicyExistence = true): Response
{
return get_authorization_response($action, $model, $shouldCheckPolicyExistence)->authorize();
}
Expand All @@ -28,7 +28,7 @@ function authorize(UnitEnum | string $action, Model | string $model, bool $shoul
/**
* @param Model|class-string<Model> $model
*/
function get_authorization_response(UnitEnum | string $action, Model | string $model, bool $shouldCheckPolicyExistence = true): Response
function get_authorization_response(string | UnitEnum $action, Model | string $model, bool $shouldCheckPolicyExistence = true): Response
{
$user = Filament::auth()->user();

Expand Down
3 changes: 2 additions & 1 deletion tests/src/Forms/Components/CheckboxListTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
use Filament\Schemas\Concerns\InteractsWithSchemas;
use Filament\Schemas\Contracts\HasSchemas;
use Filament\Schemas\Schema;
use Filament\Tests\Fixtures\Enums\StringBackedEnum;
use Filament\Tests\Fixtures\Models\Company;
use Filament\Tests\Fixtures\Models\Team;
use Filament\Tests\Fixtures\Models\User;
Expand Down Expand Up @@ -182,7 +183,7 @@

it('can get `getOptions()` from enum class string', function (): void {
$checkboxList = CheckboxList::make('options')
->options(\Filament\Tests\Fixtures\Enums\StringBackedEnum::class);
->options(StringBackedEnum::class);

$options = $checkboxList->getOptions();

Expand Down
3 changes: 2 additions & 1 deletion tests/src/Forms/Components/SelectTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
use Filament\Schemas\Concerns\InteractsWithSchemas;
use Filament\Schemas\Contracts\HasSchemas;
use Filament\Schemas\Schema;
use Filament\Tests\Fixtures\Enums\StringBackedEnum;
use Filament\Tests\Fixtures\Livewire\Livewire;
use Filament\Tests\Fixtures\Models\Company;
use Filament\Tests\Fixtures\Models\Post;
Expand Down Expand Up @@ -1402,7 +1403,7 @@ public function render(): View

it('can get `getOptions()` from enum class string', function (): void {
$select = Select::make('category')
->options(\Filament\Tests\Fixtures\Enums\StringBackedEnum::class);
->options(StringBackedEnum::class);

$options = $select->getOptions();

Expand Down
3 changes: 2 additions & 1 deletion tests/src/Infolists/Components/CodeEntryTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
use Filament\Schemas\Schema;
use Filament\Tests\TestCase;
use Livewire\Component;
use Phiki\Grammar\Grammar;

use function Filament\Tests\livewire;

Expand Down Expand Up @@ -61,7 +62,7 @@ public function infolist(Schema $schema): Schema
])
->components([
CodeEntry::make('php_code')
->grammar(\Phiki\Grammar\Grammar::Php),
->grammar(Grammar::Php),
]);
}

Expand Down
10 changes: 6 additions & 4 deletions tests/src/Tables/Filters/SelectFilterTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,12 @@

use Filament\Actions\Concerns\InteractsWithActions;
use Filament\Actions\Contracts\HasActions;
use Filament\Forms\Components\Select;
use Filament\Schemas\Concerns\InteractsWithSchemas;
use Filament\Schemas\Contracts\HasSchemas;
use Filament\Tables;
use Filament\Tables\Table;
use Filament\Tests\Fixtures\Enums\StringBackedEnum;
use Filament\Tests\Fixtures\Models\Post;
use Filament\Tests\Fixtures\Models\User;
use Filament\Tests\Tables\TestCase;
Expand Down Expand Up @@ -254,7 +256,7 @@ public function render(): View

it('can get `getOptions()` from enum class string', function (): void {
$filter = Tables\Filters\SelectFilter::make('status')
->options(\Filament\Tests\Fixtures\Enums\StringBackedEnum::class);
->options(StringBackedEnum::class);

$options = $filter->getOptions();

Expand Down Expand Up @@ -400,7 +402,7 @@ public function render(): View

$formField = $filter->getFormField();

expect($formField)->toBeInstanceOf(\Filament\Forms\Components\Select::class);
expect($formField)->toBeInstanceOf(Select::class);
expect($formField->getName())->toBe('value');
});

Expand All @@ -411,7 +413,7 @@ public function render(): View

$formField = $filter->getFormField();

expect($formField)->toBeInstanceOf(\Filament\Forms\Components\Select::class);
expect($formField)->toBeInstanceOf(Select::class);
expect($formField->getName())->toBe('values');
expect($formField->isMultiple())->toBeTrue();
});
Expand All @@ -424,7 +426,7 @@ public function render(): View

$formField = $filter->getFormField();

expect($formField)->toBeInstanceOf(\Filament\Forms\Components\Select::class);
expect($formField)->toBeInstanceOf(Select::class);
expect($formField->isSearchable())->toBeTrue();
expect($formField->isPreloaded())->toBeTrue();
});
Expand Down
Loading