From 0d543345707d6dcce6d334ec25e526db431ec68c Mon Sep 17 00:00:00 2001 From: Dan Harrin Date: Mon, 2 Jan 2023 23:31:39 +0600 Subject: [PATCH] Allow widgets to be generated outside of the app --- packages/app/src/Commands/MakePageCommand.php | 4 +- .../Commands/MakeRelationManagerCommand.php | 2 +- .../app/src/Commands/MakeResourceCommand.php | 2 +- packages/app/src/FilamentServiceProvider.php | 1 - .../Commands/Aliases/MakeWidgetCommand.php | 4 +- .../src/Commands/MakeWidgetCommand.php | 88 ++++++++++--------- .../widgets/src/WidgetsServiceProvider.php | 25 ++++++ .../{app => widgets}/stubs/ChartWidget.stub | 0 .../stubs/StatsOverviewWidget.stub | 0 .../{app => widgets}/stubs/TableWidget.stub | 0 packages/{app => widgets}/stubs/Widget.stub | 0 .../{app => widgets}/stubs/WidgetView.stub | 0 12 files changed, 79 insertions(+), 47 deletions(-) rename packages/{app => widgets}/src/Commands/Aliases/MakeWidgetCommand.php (76%) rename packages/{app => widgets}/src/Commands/MakeWidgetCommand.php (65%) rename packages/{app => widgets}/stubs/ChartWidget.stub (100%) rename packages/{app => widgets}/stubs/StatsOverviewWidget.stub (100%) rename packages/{app => widgets}/stubs/TableWidget.stub (100%) rename packages/{app => widgets}/stubs/Widget.stub (100%) rename packages/{app => widgets}/stubs/WidgetView.stub (100%) diff --git a/packages/app/src/Commands/MakePageCommand.php b/packages/app/src/Commands/MakePageCommand.php index 7aabacd967..91d0a5d6b0 100644 --- a/packages/app/src/Commands/MakePageCommand.php +++ b/packages/app/src/Commands/MakePageCommand.php @@ -79,7 +79,7 @@ class MakePageCommand extends Command $context = (count($contexts) > 1) ? $contexts[$this->choice( 'Which context would you like to create this in?', array_map( - fn (Context $context) => $context->getId(), + fn (Context $context): string => $context->getId(), $contexts, ), Filament::getDefaultContext()->getId(), @@ -94,7 +94,7 @@ class MakePageCommand extends Command $view = str($page) ->prepend( (string) str($resource === null ? "{$namespace}\\" : "{$resourceNamespace}\\{$resource}\\pages\\") - ->replace('App\\', '') + ->replaceFirst('App\\', '') ) ->replace('\\', '/') ->explode('/') diff --git a/packages/app/src/Commands/MakeRelationManagerCommand.php b/packages/app/src/Commands/MakeRelationManagerCommand.php index 1717d090e4..786823bf40 100644 --- a/packages/app/src/Commands/MakeRelationManagerCommand.php +++ b/packages/app/src/Commands/MakeRelationManagerCommand.php @@ -55,7 +55,7 @@ class MakeRelationManagerCommand extends Command $context = (count($contexts) > 1) ? $contexts[$this->choice( 'Which context would you like to create this in?', array_map( - fn (Context $context) => $context->getId(), + fn (Context $context): string => $context->getId(), $contexts, ), Filament::getDefaultContext()->getId(), diff --git a/packages/app/src/Commands/MakeResourceCommand.php b/packages/app/src/Commands/MakeResourceCommand.php index 93785d49ed..42571ee50a 100644 --- a/packages/app/src/Commands/MakeResourceCommand.php +++ b/packages/app/src/Commands/MakeResourceCommand.php @@ -60,7 +60,7 @@ class MakeResourceCommand extends Command $context = (count($contexts) > 1) ? $contexts[$this->choice( 'Which context would you like to create this in?', array_map( - fn (Context $context) => $context->getId(), + fn (Context $context): string => $context->getId(), $contexts, ), Filament::getDefaultContext()->getId(), diff --git a/packages/app/src/FilamentServiceProvider.php b/packages/app/src/FilamentServiceProvider.php index 453fc1b0c9..9ba1dd5339 100644 --- a/packages/app/src/FilamentServiceProvider.php +++ b/packages/app/src/FilamentServiceProvider.php @@ -93,7 +93,6 @@ class FilamentServiceProvider extends PackageServiceProvider Commands\MakeRelationManagerCommand::class, Commands\MakeResourceCommand::class, Commands\MakeUserCommand::class, - Commands\MakeWidgetCommand::class, ]; $aliases = []; diff --git a/packages/app/src/Commands/Aliases/MakeWidgetCommand.php b/packages/widgets/src/Commands/Aliases/MakeWidgetCommand.php similarity index 76% rename from packages/app/src/Commands/Aliases/MakeWidgetCommand.php rename to packages/widgets/src/Commands/Aliases/MakeWidgetCommand.php index cba3231c72..366f0f3a3c 100644 --- a/packages/app/src/Commands/Aliases/MakeWidgetCommand.php +++ b/packages/widgets/src/Commands/Aliases/MakeWidgetCommand.php @@ -1,8 +1,8 @@ option('resource') ?? $this->ask('(Optional) Resource (e.g. `BlogPostResource`)'); + if (class_exists(Resource::class)) { + $resourceInput = $this->option('resource') ?? $this->ask('(Optional) Resource (e.g. `BlogPostResource`)'); - if ($resourceInput !== null) { - $resource = (string) str($resourceInput) - ->studly() - ->trim('/') - ->trim('\\') - ->trim(' ') - ->replace('/', '\\'); + if ($resourceInput !== null) { + $resource = (string) str($resourceInput) + ->studly() + ->trim('/') + ->trim('\\') + ->trim(' ') + ->replace('/', '\\'); - if (! str($resource)->endsWith('Resource')) { - $resource .= 'Resource'; + if (! str($resource)->endsWith('Resource')) { + $resource .= 'Resource'; + } + + $resourceClass = (string) str($resource) + ->afterLast('\\'); + } + } + + $context = null; + + if (class_exists(Context::class)) { + $context = $this->option('context'); + + if ($context) { + $context = Filament::getContext($context); } - $resourceClass = (string) str($resource) - ->afterLast('\\'); + if (! $context) { + $contexts = Filament::getContexts(); + + /** @var ?Context $context */ + $context = $contexts[$this->choice( + 'Where would you like to create this widget?', + array_unique(array_merge( + array_map( + fn (Context $context): string => $context->getWidgetNamespace() ?? 'App\\Filament\\Widgets', + $contexts, + ), + ['' => 'App\\Http\\Livewire' . ($widgetNamespace ? '\\' . $widgetNamespace : '')], + )), + )] ?? null; + } } - $context = $this->option('context'); - - if ($context) { - $context = Filament::getContext($context); - } - - if (! $context) { - $contexts = Filament::getContexts(); - - /** @var Context $context */ - $context = (count($contexts) > 1) ? $contexts[$this->choice( - 'Which context would you like to create this in?', - array_map( - fn (Context $context) => $context->getId(), - $contexts, - ), - Filament::getDefaultContext()->getId(), - )] : Arr::first($contexts); - } - - $path = $context->getWidgetDirectory() ?? app_path('Filament/Widgets/'); - $namespace = $context->getWidgetNamespace() ?? 'App\\Filament\\Widgets'; - $resourcePath = $context->getResourceDirectory() ?? app_path('Filament/Resources/'); - $resourceNamespace = $context->getResourceNamespace() ?? 'App\\Filament\\Resources'; + $path = $context ? ($context->getWidgetDirectory() ?? app_path('Filament/Widgets/')) : app_path('Http/Livewire/'); + $namespace = $context ? ($context->getWidgetNamespace() ?? 'App\\Filament\\Widgets') : 'App\\Http\\Livewire'; + $resourcePath = $context ? ($context->getResourceDirectory() ?? app_path('Filament/Resources/')) : null; + $resourceNamespace = $context ? ($context->getResourceNamespace() ?? 'App\\Filament\\Resources') : null; $view = str($widget)->prepend( - (string) str($resource === null ? "{$namespace}\\" : "{$resourceNamespace}\\{$resource}\\widgets\\") - ->replace('App\\', '') + (string) str($resource === null ? ($context ? "{$namespace}\\" : 'livewire\\') : "{$resourceNamespace}\\{$resource}\\widgets\\") + ->replaceFirst('App\\', '') ) ->replace('\\', '/') ->explode('/') diff --git a/packages/widgets/src/WidgetsServiceProvider.php b/packages/widgets/src/WidgetsServiceProvider.php index ac88e7815c..5bd22e2989 100644 --- a/packages/widgets/src/WidgetsServiceProvider.php +++ b/packages/widgets/src/WidgetsServiceProvider.php @@ -14,6 +14,7 @@ class WidgetsServiceProvider extends PackageServiceProvider { $package ->name('filament-widgets') + ->hasCommands($this->getCommands()) ->hasViews(); } @@ -26,4 +27,28 @@ class WidgetsServiceProvider extends PackageServiceProvider ], 'filament/widgets'); }); } + + /** + * @return array + */ + protected function getCommands(): array + { + $commands = [ + Commands\MakeWidgetCommand::class, + ]; + + $aliases = []; + + foreach ($commands as $command) { + $class = 'Filament\\Widgets\\Commands\\Aliases\\' . class_basename($command); + + if (! class_exists($class)) { + continue; + } + + $aliases[] = $class; + } + + return array_merge($commands, $aliases); + } } diff --git a/packages/app/stubs/ChartWidget.stub b/packages/widgets/stubs/ChartWidget.stub similarity index 100% rename from packages/app/stubs/ChartWidget.stub rename to packages/widgets/stubs/ChartWidget.stub diff --git a/packages/app/stubs/StatsOverviewWidget.stub b/packages/widgets/stubs/StatsOverviewWidget.stub similarity index 100% rename from packages/app/stubs/StatsOverviewWidget.stub rename to packages/widgets/stubs/StatsOverviewWidget.stub diff --git a/packages/app/stubs/TableWidget.stub b/packages/widgets/stubs/TableWidget.stub similarity index 100% rename from packages/app/stubs/TableWidget.stub rename to packages/widgets/stubs/TableWidget.stub diff --git a/packages/app/stubs/Widget.stub b/packages/widgets/stubs/Widget.stub similarity index 100% rename from packages/app/stubs/Widget.stub rename to packages/widgets/stubs/Widget.stub diff --git a/packages/app/stubs/WidgetView.stub b/packages/widgets/stubs/WidgetView.stub similarity index 100% rename from packages/app/stubs/WidgetView.stub rename to packages/widgets/stubs/WidgetView.stub