Mercurial > packages > magicforger
diff src/Generator/View/IndexViewGenerator.php @ 34:f65ab84ee47f default
merge with codex
| author | luka |
|---|---|
| date | Wed, 10 Sep 2025 21:00:47 -0400 |
| parents | 45f384a24553 |
| children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/Generator/View/IndexViewGenerator.php Wed Sep 10 21:00:47 2025 -0400 @@ -0,0 +1,173 @@ +<?php + +namespace Wizard\MagicForger\Generator\View; + +use Illuminate\Support\Str; +use Symfony\Component\Console\Attribute\AsCommand; +use Wizard\MagicForger\Generator\BaseGenerator; +use Wizard\MagicForger\Helpers\RelationshipNavigator; + +#[AsCommand(name: 'mf:index_view')] +class IndexViewGenerator extends BaseGenerator +{ + /** + * The name and signature of the console command. + * + * @var string + */ + protected $name = 'mf:index_view'; + + /** + * The console command description. + * + * @var string + */ + protected $description = 'Generates the IndexView File for a table.'; + + /** + * The type of class being generated. + * + * @var string + */ + protected $type = 'IndexView'; + + /** + * Execute the console command. + */ + public function handle() + { + parent::handle(); + } + + /** + * Get the stub file for the generator. + * + * @return string + */ + protected function getStub() + { + return $this->resolveStubPath('/stubs/index.stub'); + } + + /** + * Resolve the fully-qualified path to the stub. + * + * @param string $stub + * @return string + */ + protected function resolveStubPath($stub) + { + return is_file($customPath = $this->laravel->basePath(trim($stub, '/'))) + ? $customPath + : __DIR__.$stub; + } + + protected function getClassName($name) + { + return $this->index_view_name($name); + } + + /** + * Get the stub file for the generator. + * + * @return string + */ + protected function getPath($name = null) + { + return str_replace(['Resources\\', '\\'], ['resources/', '/'], $this->getViewNamespace($this->getTableInput()).'index.blade.php'); + } + + protected function renderColumns() + { + $renders = []; + $values = []; + + $columns = $this->getTableColumns($this->getCurrentTable()); + $relations = RelationshipNavigator::getRelations($this->getCurrentTable()); + // gether the select columns based on the relations + $selects = []; + + foreach ($relations['belongsTo'] as $relation) { + $selects[$relation['column']] = $relation['table']; + } + + foreach ($columns as $column) { + $name = $column['name']; + if (in_array($name, $this->columns_to_ignore)) { + continue; + } + + // Get the expected header name + $replacements = [ + '{{header}}' => Str::headline($name), + '{{column_name}}' => $name, + '{{valueClass}}' => 'p-2', + ]; + + $type = $column['type_name']; + + // date + if (in_array($type, ['date'])) { + $replacements['{{value}}'] = '{{ $item->'.$name.'?->format(\'Y-m-d\') ?? "" }}'; + } + // time + if (in_array($type, ['timestamp'])) { + $replacements['{{value}}'] = '{{ $item->'.$name.'?->format(\'Y-m-d H:i\') ?? "" }}'; + } + // checkbox + if (in_array($type, ['tinyint'])) { + $replacements['{{valueClass}}'] .= ' text-center'; + $replacements['{{value}}'] = '{{ $item->'.$name.' ?? "0" }}'; + } + // select + elseif (in_array($type, ['bigint']) && array_key_exists($name, $selects)) { + $replacements['{{header}}'] = Str::headline(Str::singular($selects[$name])); + $replacements['{{value}}'] = '{{ $item->'.Str::singular($selects[$name]).'?->name ?? "" }}'; + } + // bigint, float + elseif (in_array($type, ['bigint', 'float', 'int'])) { + $replacements['{{valueClass}}'] .= ' text-start'; + } else { + // text area + // varchar, , etc + } + + $snippet = $this->getSnippet('index/value'); + // Replace placeholders with actual values + $values[] = str_replace( + array_keys($replacements), + $replacements, + $snippet + ); + + } + + return ['values' => $values]; + } + + /** + * Get available insertions including model relationships. + */ + public function get_available_inserts(): array + { + // Merge parent insertions (attributes, fillable, etc.) + $inserts = parent::get_available_inserts(); + + // Gather and render relationships for this model + $rendered = $this->renderColumns(); + + // Build code blocks for each relation type + $headers = ''; + $values = ''; + $colCount = ''; + + if (! empty($rendered)) { + $values = ! empty($rendered['values']) ? implode("\n ", $rendered['values']) : ''; + } + + // Assign to stub placeholders + $inserts['{{ columnInsertPoint }}'] = $values; + + return $inserts; + } +}
