Skip to content

Commit

Permalink
Clean up and test
Browse files Browse the repository at this point in the history
  • Loading branch information
danharrin committed Feb 3, 2025
1 parent 2f06373 commit d82feb2
Show file tree
Hide file tree
Showing 8 changed files with 35 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -99,24 +99,26 @@ public function getFormComponents(?string $model = null, array $exceptColumns =

$enumCasts = $this->getEnumCasts($model);

if (isset($type['name']) && ($type['name'] === 'enum' || array_key_exists($componentName, $enumCasts))) {
if (isset($type['name']) && (($type['name'] === 'enum') || array_key_exists($componentName, $enumCasts))) {
$componentData['type'] = Select::class;

if (array_key_exists($componentName, $enumCasts)) {
$enumClass = $enumCasts[$componentName];
$componentData['options'] = [new Literal("\\{$enumClass}::class")];

$this->namespace->addUse($enumClass);

$componentData['options'] = [new Literal(class_basename($enumClass) . '::class')];
} else {
$options = array_combine(
$componentData['options'] = [array_combine(
$type['values'],
array_map(
fn($value) => (string)str($value)
fn (string $value): string => (string) str($value)
->kebab()
->replace(['-', '_'], ' ')
->ucfirst(),
$type['values']
)
);
$componentData['options'] = [$options];
$type['values'],
),
)];
}

if ($column['default']) {
Expand Down
10 changes: 7 additions & 3 deletions packages/support/src/Commands/Concerns/CanReadModelSchemas.php
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,7 @@ protected function parseColumnType(array $column): array

$values = is_null($values) ? [] : match ($type) {
'string', 'char', 'binary', 'bit' => ['length' => (int) $values[0]],
'enum' => ['values' => array_map(fn ($value) => trim($value, "'"), $values)],
'enum' => ['values' => array_map(fn (string $value): string => trim($value, '\''), $values)],
default => [],
};

Expand Down Expand Up @@ -231,12 +231,16 @@ public function getRecordTitleAttribute(): ?string
}

/**
* @param string $model
* @param class-string<Model> $model
* @return array<string>
*/
protected function getEnumCasts(string $model): array
{
$casts = app($model)->getCasts();
return array_filter($casts, fn ($cast) => enum_exists($cast));

return array_filter(
$casts,
fn (mixed $cast): bool => is_string($cast) ? enum_exists($cast) : false,
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ use Filament\Schemas\Schema;
use Filament\Support\Icons\Heroicon;
use Filament\Tables;
use Filament\Tables\Table;
use Filament\Tests\Fixtures\Enums\StringBackedEnum;
use Filament\Tests\Fixtures\Models\Post;

class PostResource extends Resource
Expand Down Expand Up @@ -42,6 +43,8 @@ class PostResource extends Resource
->columnSpanFull(),
Forms\Components\Textarea::make('json_array_of_objects')
->columnSpanFull(),
Forms\Components\Select::make('string_backed_enum')
->options(StringBackedEnum::class),
]);
}

Expand All @@ -59,6 +62,8 @@ class PostResource extends Resource
->sortable(),
Tables\Columns\TextColumn::make('title')
->searchable(),
Tables\Columns\TextColumn::make('string_backed_enum')
->searchable(),
Tables\Columns\TextColumn::make('created_at')
->dateTime()
->sortable()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ use Filament\Support\Icons\Heroicon;
use Filament\Tables\Columns\IconColumn;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;
use Filament\Tests\Fixtures\Enums\StringBackedEnum;
use Filament\Tests\Fixtures\Models\Post;

class PostResource extends Resource
Expand Down Expand Up @@ -50,6 +51,8 @@ class PostResource extends Resource
->columnSpanFull(),
Textarea::make('json_array_of_objects')
->columnSpanFull(),
Select::make('string_backed_enum')
->options(StringBackedEnum::class),
]);
}

Expand All @@ -67,6 +70,8 @@ class PostResource extends Resource
->sortable(),
TextColumn::make('title')
->searchable(),
TextColumn::make('string_backed_enum')
->searchable(),
TextColumn::make('created_at')
->dateTime()
->sortable()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ use Filament\Forms\Components\TextInput;
use Filament\Forms\Components\Textarea;
use Filament\Forms\Components\Toggle;
use Filament\Schemas\Schema;
use Filament\Tests\Fixtures\Enums\StringBackedEnum;

class PostForm
{
Expand All @@ -33,6 +34,8 @@ class PostForm
->columnSpanFull(),
Textarea::make('json_array_of_objects')
->columnSpanFull(),
Select::make('string_backed_enum')
->options(StringBackedEnum::class),
]);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ class PostsTable
->sortable(),
TextColumn::make('title')
->searchable(),
TextColumn::make('string_backed_enum')
->searchable(),
TextColumn::make('created_at')
->dateTime()
->sortable()
Expand Down
1 change: 1 addition & 0 deletions tests/database/migrations/create_posts_table.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ public function up(): void
$table->string('title');
$table->json('json')->nullable();
$table->json('json_array_of_objects')->nullable();
$table->string('string_backed_enum')->nullable();
$table->timestamps();
$table->softDeletes();
});
Expand Down
2 changes: 2 additions & 0 deletions tests/src/Fixtures/Models/Post.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
namespace Filament\Tests\Fixtures\Models;

use Filament\Tests\Database\Factories\PostFactory;
use Filament\Tests\Fixtures\Enums\StringBackedEnum;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
Expand All @@ -14,6 +15,7 @@ class Post extends Model
use SoftDeletes;

protected $casts = [
'string_backed_enum' => StringBackedEnum::class,
'is_published' => 'boolean',
'tags' => 'array',
'json' => 'array',
Expand Down

0 comments on commit d82feb2

Please sign in to comment.