diff --git a/packages/forms/src/Commands/FileGenerators/Concerns/CanGenerateModelForms.php b/packages/forms/src/Commands/FileGenerators/Concerns/CanGenerateModelForms.php index 51781f5ac7d..af4fc372bec 100644 --- a/packages/forms/src/Commands/FileGenerators/Concerns/CanGenerateModelForms.php +++ b/packages/forms/src/Commands/FileGenerators/Concerns/CanGenerateModelForms.php @@ -95,6 +95,33 @@ public function getFormComponents(?string $model = null, array $exceptColumns = default => TextInput::class, }; + $enumCasts = $this->getEnumCasts($model); + + 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")]; + } else { + $options = array_combine( + $type['values'], + array_map( + fn($value) => (string)str($value) + ->kebab() + ->replace(['-', '_'], ' ') + ->ucfirst(), + $type['values'] + ) + ); + $componentData['options'] = [$options]; + } + + if ($column['default']) { + $componentData['default'] = [$this->parseDefaultExpression($column, $model)]; + } + } + if (str($componentName)->endsWith('_id')) { $guessedRelationshipName = $this->guessBelongsToRelationshipName($componentName, $model); diff --git a/packages/support/src/Commands/Concerns/CanReadModelSchemas.php b/packages/support/src/Commands/Concerns/CanReadModelSchemas.php index 5b21cc91963..d15a49c84bb 100644 --- a/packages/support/src/Commands/Concerns/CanReadModelSchemas.php +++ b/packages/support/src/Commands/Concerns/CanReadModelSchemas.php @@ -152,6 +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)], default => [], }; @@ -228,4 +229,14 @@ public function getRecordTitleAttribute(): ?string { return null; } + + /** + * @param string $model + * @return array + */ + protected function getEnumCasts(string $model): array + { + $casts = app($model)->getCasts(); + return array_filter($casts, fn ($cast) => enum_exists($cast)); + } }