diff --git a/composer.json b/composer.json index df8008fb..da0b3b71 100644 --- a/composer.json +++ b/composer.json @@ -17,6 +17,7 @@ ], "require": { "php": "^8.0", + "doctrine/dbal": "^3.6.4", "filament/filament": "^2.0", "illuminate/contracts": "^9.0|^10.0", "livewire/livewire": "^2.12", diff --git a/src/Commands/FilamentModuleCommand.php b/src/Commands/FilamentModuleCommand.php index 6f4cf7db..e3c6d96e 100644 --- a/src/Commands/FilamentModuleCommand.php +++ b/src/Commands/FilamentModuleCommand.php @@ -38,7 +38,6 @@ public function handle(): int \Log::info($exception->getMessage().' Creating It ...'); Artisan::call('module:make', ['name' => [$this->argument('module')]]); $this->module = app('modules')->findOrFail($this->getModuleName()); - } finally { } $context = Str::of($this->argument('context') ?? 'Filament')->studly(); diff --git a/src/Commands/FilamentModuleMakeResourceCommand.php b/src/Commands/FilamentModuleMakeResourceCommand.php index 972c039c..7ed7c73d 100644 --- a/src/Commands/FilamentModuleMakeResourceCommand.php +++ b/src/Commands/FilamentModuleMakeResourceCommand.php @@ -3,6 +3,7 @@ namespace Savannabits\FilamentModules\Commands; use Filament\Commands\MakeResourceCommand; +use Illuminate\Filesystem\Filesystem; use Illuminate\Support\Str; use Nwidart\Modules\Module; use Nwidart\Modules\Traits\ModuleCommandTrait; @@ -25,14 +26,14 @@ public function handle(): int $path = module_path($module, 'Filament/Resources/'); $namespace = $this->getModuleNamespace().'\\Filament\\Resources'; - $model = (string) Str::of($this->argument('name') ?? $this->askRequired('Model (e.g. `BlogPost`)', 'name')) + $model = Str::of($this->argument('name') ?? $this->askRequired('Model (e.g. `BlogPost`)', 'name')) ->studly() ->beforeLast('Resource') ->trim('/') ->trim('\\') ->trim(' ') ->studly() - ->replace('/', '\\'); + ->replace('/', '\\')->toString(); if (blank($model)) { $model = 'Resource'; @@ -41,13 +42,12 @@ public function handle(): int $modelClass = (string) Str::of($model)->afterLast('\\'); $modelNamespace = Str::of($model)->contains('\\') ? (string) Str::of($model)->beforeLast('\\') : - ''; + $this->getModuleNamespace().'\\Entities'; $pluralModelClass = (string) Str::of($modelClass)->pluralStudly(); - $resource = "{$model}Resource"; + $resource = "{$modelClass}Resource"; $resourceClass = "{$modelClass}Resource"; - $resourceNamespace = $modelNamespace; - $namespace .= $resourceNamespace !== '' ? "\\{$resourceNamespace}" : ''; + $resourceNamespace = $namespace.($resourceClass !== '' ? "\\{$resourceClass}" : ''); $listResourcePageClass = "List{$pluralModelClass}"; $manageResourcePageClass = "Manage{$pluralModelClass}"; $createResourcePageClass = "Create{$modelClass}"; @@ -145,8 +145,10 @@ public function handle(): int $this->copyStubToApp('Resource', $resourcePath, [ 'eloquentQuery' => $this->indentString($eloquentQuery, 1), 'formSchema' => $this->indentString($this->option('generate') ? $this->getResourceFormSchema( - 'App\\Models'.($modelNamespace !== '' ? "\\{$modelNamespace}" : '').'\\'.$modelClass, + "$modelNamespace\\$model", ) : '//', 4), + 'modelNamespace' => $modelNamespace, + 'resourceSlug' => Str::slug($pluralModelClass), 'model' => $model === 'Resource' ? 'Resource as ResourceModel' : $model, 'modelClass' => $model === 'Resource' ? 'ResourceModel' : $modelClass, 'namespace' => $namespace, @@ -154,10 +156,11 @@ public function handle(): int 'relations' => $this->indentString($relations, 1), 'resource' => "{$namespace}\\{$resourceClass}", 'resourceClass' => $resourceClass, + 'resourceNamespace' => $resourceNamespace, 'tableActions' => $this->indentString($tableActions, 4), 'tableBulkActions' => $this->indentString($tableBulkActions, 4), 'tableColumns' => $this->indentString($this->option('generate') ? $this->getResourceTableColumns( - 'App\Models'.($modelNamespace !== '' ? "\\{$modelNamespace}" : '').'\\'.$modelClass, + "$modelNamespace\\$model", ) : '//', 4), 'tableFilters' => $this->indentString( $this->option('soft-deletes') ? 'Tables\Filters\TrashedFilter::make(),' : '//', @@ -174,8 +177,9 @@ public function handle(): int ]); } else { $this->copyStubToApp('ResourceListPage', $listResourcePagePath, [ - 'namespace' => "{$namespace}\\{$resourceClass}\\Pages", - 'resource' => "{$namespace}\\{$resourceClass}", + 'namespace' => "{$resourceNamespace}\\Pages", + 'resource' => $resource, + 'resourceNamespace' => $resourceNamespace, 'resourceClass' => $resourceClass, 'resourcePageClass' => $listResourcePageClass, ]); @@ -183,8 +187,9 @@ public function handle(): int $this->copyStubToApp('ResourcePage', $createResourcePagePath, [ 'baseResourcePage' => 'Filament\\Resources\\Pages\\CreateRecord', 'baseResourcePageClass' => 'CreateRecord', - 'namespace' => "{$namespace}\\{$resourceClass}\\Pages", - 'resource' => "{$namespace}\\{$resourceClass}", + 'namespace' => "{$resourceNamespace}\\Pages", + 'resource' => $resource, + 'resourceNamespace' => $resourceNamespace, 'resourceClass' => $resourceClass, 'resourcePageClass' => $createResourcePageClass, ]); @@ -193,8 +198,9 @@ public function handle(): int if ($this->option('view')) { $this->copyStubToApp('ResourceViewPage', $viewResourcePagePath, [ - 'namespace' => "{$namespace}\\{$resourceClass}\\Pages", - 'resource' => "{$namespace}\\{$resourceClass}", + 'namespace' => "{$resourceNamespace}\\Pages", + 'resource' => $resource, + 'resourceNamespace' => $resourceNamespace, 'resourceClass' => $resourceClass, 'resourcePageClass' => $viewResourcePageClass, ]); @@ -213,12 +219,15 @@ public function handle(): int $this->copyStubToApp('ResourceEditPage', $editResourcePagePath, [ 'actions' => $this->indentString($editPageActions, 3), - 'namespace' => "{$namespace}\\{$resourceClass}\\Pages", - 'resource' => "{$namespace}\\{$resourceClass}", + 'namespace' => "{$resourceNamespace}\\Pages", + 'resource' => $resource, + 'resourceNamespace' => $resourceNamespace, 'resourceClass' => $resourceClass, 'resourcePageClass' => $editResourcePageClass, ]); } + $resourceManagersDir = Str::of($resourceNamespace)->replace('\\', '/')->rtrim('/')->append('/RelationManagers'); + $this->ensureSubdirectoryExists($resourceManagersDir); $this->info("Successfully created {$resource}!"); @@ -229,4 +238,13 @@ public function getModuleNamespace() { return $this->laravel['modules']->config('namespace').'\\'.$this->getModuleName(); } + + private function ensureSubdirectoryExists(string $path): void + { + $filesystem = app(Filesystem::class); + $filesystem->ensureDirectoryExists( + Str::of($path)->rtrim('/')->toString(), + ); + + } } diff --git a/stubs/Resource.stub b/stubs/Resource.stub index f0199930..3e31ec60 100644 --- a/stubs/Resource.stub +++ b/stubs/Resource.stub @@ -2,9 +2,9 @@ namespace {{ namespace }}; -use {{ resource }}\Pages; -use {{ resource }}\RelationManagers; -use App\Models\{{ model }}; +use {{ resourceNamespace }}\Pages; +use {{ resourceNamespace }}\RelationManagers; +use {{ modelNamespace }}\{{ model }}; use Filament\Forms; use Filament\Resources\Form; use Filament\Resources\Resource; @@ -19,6 +19,7 @@ class {{ resourceClass }} extends Resource use ContextualResource; protected static ?string $model = {{ modelClass }}::class; + protected static ?string $slug = '{{ resourceSlug }}'; protected static ?string $navigationIcon = 'heroicon-o-collection'; diff --git a/stubs/ResourceEditPage.stub b/stubs/ResourceEditPage.stub index 7da213a9..ee3d4577 100644 --- a/stubs/ResourceEditPage.stub +++ b/stubs/ResourceEditPage.stub @@ -2,7 +2,7 @@ namespace {{ namespace }}; -use {{ resource }}; +use {{ resourceNamespace }}; use Filament\Pages\Actions; use Filament\Resources\Pages\EditRecord; diff --git a/stubs/ResourceListPage.stub b/stubs/ResourceListPage.stub index 23e11ee8..bf24b978 100644 --- a/stubs/ResourceListPage.stub +++ b/stubs/ResourceListPage.stub @@ -2,7 +2,7 @@ namespace {{ namespace }}; -use {{ resource }}; +use {{ resourceNamespace }}; use Filament\Pages\Actions; use Filament\Resources\Pages\ListRecords; diff --git a/stubs/ResourceManagePage.stub b/stubs/ResourceManagePage.stub index d62f3371..19ba481b 100644 --- a/stubs/ResourceManagePage.stub +++ b/stubs/ResourceManagePage.stub @@ -2,7 +2,7 @@ namespace {{ namespace }}; -use {{ resource }}; +use {{ resourceNamespace }}; use Filament\Pages\Actions; use Filament\Resources\Pages\ManageRecords; diff --git a/stubs/ResourcePage.stub b/stubs/ResourcePage.stub index 9f8ee9a7..1de36366 100644 --- a/stubs/ResourcePage.stub +++ b/stubs/ResourcePage.stub @@ -2,7 +2,7 @@ namespace {{ namespace }}; -use {{ resource }}; +use {{ resourceNamespace }}; use Filament\Pages\Actions; use {{ baseResourcePage }}; diff --git a/stubs/ResourceViewPage.stub b/stubs/ResourceViewPage.stub index b8e3f69c..e457bf23 100644 --- a/stubs/ResourceViewPage.stub +++ b/stubs/ResourceViewPage.stub @@ -2,7 +2,7 @@ namespace {{ namespace }}; -use {{ resource }}; +use {{ resourceNamespace }}; use Filament\Pages\Actions; use Filament\Resources\Pages\ViewRecord;