From 3d71457a20eccd0de7756cc97280c31b9be32d61 Mon Sep 17 00:00:00 2001 From: Brandon Date: Thu, 8 Aug 2024 08:27:57 -0500 Subject: [PATCH 1/5] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20Add=20s?= =?UTF-8?q?upport=20for=20custom=20menu=20and=20menu=20item=20fields?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/FilamentMenuBuilderPlugin.php | 26 ++++++++++++++++++++++++++ src/Livewire/MenuItems.php | 3 +++ src/Resources/MenuResource.php | 2 ++ 3 files changed, 31 insertions(+) diff --git a/src/FilamentMenuBuilderPlugin.php b/src/FilamentMenuBuilderPlugin.php index 847b239..f20f829 100644 --- a/src/FilamentMenuBuilderPlugin.php +++ b/src/FilamentMenuBuilderPlugin.php @@ -12,6 +12,8 @@ class FilamentMenuBuilderPlugin implements Plugin { protected array $locations = []; + protected array $menuFields = []; + protected array $menuItemFields = []; /** * @var MenuPanel[] @@ -76,6 +78,20 @@ public function addMenuPanels(array $menuPanels): static return $this; } + public function addMenuFields(array | Closure $schema): static + { + $this->menuFields = $schema; + + return $this; + } + + public function addMenuItemFields(array | Closure $schema): static + { + $this->menuItemFields = $schema; + + return $this; + } + /** * @return MenuPanel[] */ @@ -90,4 +106,14 @@ public function getLocations(): array { return $this->locations; } + + public function getMenuFields(): array + { + return $this->menuFields; + } + + public function getMenuItemFields(): array + { + return $this->menuItemFields; + } } diff --git a/src/Livewire/MenuItems.php b/src/Livewire/MenuItems.php index 41fc7d2..2a08cf7 100644 --- a/src/Livewire/MenuItems.php +++ b/src/Livewire/MenuItems.php @@ -5,11 +5,13 @@ namespace Datlechin\FilamentMenuBuilder\Livewire; use Datlechin\FilamentMenuBuilder\Enums\LinkTarget; +use Datlechin\FilamentMenuBuilder\FilamentMenuBuilderPlugin; use Datlechin\FilamentMenuBuilder\Models\Menu; use Datlechin\FilamentMenuBuilder\Models\MenuItem; use Filament\Actions\Action; use Filament\Actions\Concerns\InteractsWithActions; use Filament\Actions\Contracts\HasActions; +use Filament\Forms\Components\Group; use Filament\Forms\Components\Placeholder; use Filament\Forms\Components\Select; use Filament\Forms\Components\TextInput; @@ -100,6 +102,7 @@ public function editAction(): Action ->label(__('filament-menu-builder::menu-builder.open_in.label')) ->options(LinkTarget::class) ->default(LinkTarget::Self), + Group::make()->schema(FilamentMenuBuilderPlugin::get()->getMenuItemFields()), ]) ->action( fn (array $data, array $arguments) => MenuItem::query() diff --git a/src/Resources/MenuResource.php b/src/Resources/MenuResource.php index 50c96f6..0680ae9 100644 --- a/src/Resources/MenuResource.php +++ b/src/Resources/MenuResource.php @@ -7,6 +7,7 @@ use Datlechin\FilamentMenuBuilder\FilamentMenuBuilderPlugin; use Datlechin\FilamentMenuBuilder\Models\Menu; use Filament\Forms\Components\CheckboxList; +use Filament\Forms\Components\Group; use Filament\Forms\Components\TextInput; use Filament\Forms\Components\Toggle; use Filament\Forms\Form; @@ -41,6 +42,7 @@ public static function form(Form $form): Form Toggle::make('is_visible') ->label(__('filament-menu-builder::menu-builder.resource.is_visible.label')) ->default(true), + Group::make()->schema(FilamentMenuBuilderPlugin::get()->getMenuFields()), ]); } From 12307f8cb565b865b4378ab58987317143de3878 Mon Sep 17 00:00:00 2001 From: Brandon Date: Thu, 8 Aug 2024 08:52:36 -0500 Subject: [PATCH 2/5] =?UTF-8?q?=F0=9F=9A=A8=20Run=20Pint?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/FilamentMenuBuilderPlugin.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/FilamentMenuBuilderPlugin.php b/src/FilamentMenuBuilderPlugin.php index f20f829..9e40567 100644 --- a/src/FilamentMenuBuilderPlugin.php +++ b/src/FilamentMenuBuilderPlugin.php @@ -12,7 +12,9 @@ class FilamentMenuBuilderPlugin implements Plugin { protected array $locations = []; + protected array $menuFields = []; + protected array $menuItemFields = []; /** From 6b41e457e38e5a4e0454981738b2ee6d90905258 Mon Sep 17 00:00:00 2001 From: Brandon Date: Thu, 8 Aug 2024 08:54:40 -0500 Subject: [PATCH 3/5] =?UTF-8?q?=F0=9F=8E=A8=20Do=20not=20show=20the=20menu?= =?UTF-8?q?=20and=20menu=20item=20field=20groups=20if=20empty?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Livewire/MenuItems.php | 5 ++++- src/Resources/MenuResource.php | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/Livewire/MenuItems.php b/src/Livewire/MenuItems.php index 2a08cf7..4c40df5 100644 --- a/src/Livewire/MenuItems.php +++ b/src/Livewire/MenuItems.php @@ -11,6 +11,7 @@ use Filament\Actions\Action; use Filament\Actions\Concerns\InteractsWithActions; use Filament\Actions\Contracts\HasActions; +use Filament\Forms\Components\Component as FormComponent; use Filament\Forms\Components\Group; use Filament\Forms\Components\Placeholder; use Filament\Forms\Components\Select; @@ -102,7 +103,9 @@ public function editAction(): Action ->label(__('filament-menu-builder::menu-builder.open_in.label')) ->options(LinkTarget::class) ->default(LinkTarget::Self), - Group::make()->schema(FilamentMenuBuilderPlugin::get()->getMenuItemFields()), + Group::make() + ->visible(fn (FormComponent $component) => $component->evaluate(FilamentMenuBuilderPlugin::get()->getMenuItemFields()) !== []) + ->schema(FilamentMenuBuilderPlugin::get()->getMenuItemFields()), ]) ->action( fn (array $data, array $arguments) => MenuItem::query() diff --git a/src/Resources/MenuResource.php b/src/Resources/MenuResource.php index 0680ae9..e3d186d 100644 --- a/src/Resources/MenuResource.php +++ b/src/Resources/MenuResource.php @@ -7,6 +7,7 @@ use Datlechin\FilamentMenuBuilder\FilamentMenuBuilderPlugin; use Datlechin\FilamentMenuBuilder\Models\Menu; use Filament\Forms\Components\CheckboxList; +use Filament\Forms\Components\Component; use Filament\Forms\Components\Group; use Filament\Forms\Components\TextInput; use Filament\Forms\Components\Toggle; @@ -42,7 +43,9 @@ public static function form(Form $form): Form Toggle::make('is_visible') ->label(__('filament-menu-builder::menu-builder.resource.is_visible.label')) ->default(true), - Group::make()->schema(FilamentMenuBuilderPlugin::get()->getMenuFields()), + Group::make() + ->visible(fn (Component $component) => $component->evaluate(FilamentMenuBuilderPlugin::get()->getMenuFields()) !== []) + ->schema(FilamentMenuBuilderPlugin::get()->getMenuFields()), ]); } From f0a264e94b1463453f0641e5ec7b9a6bc8310d5e Mon Sep 17 00:00:00 2001 From: Brandon Date: Thu, 8 Aug 2024 09:03:25 -0500 Subject: [PATCH 4/5] =?UTF-8?q?=F0=9F=8E=A8=20Update=20property=20and=20ge?= =?UTF-8?q?tter=20types?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/FilamentMenuBuilderPlugin.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/FilamentMenuBuilderPlugin.php b/src/FilamentMenuBuilderPlugin.php index 9e40567..a08333c 100644 --- a/src/FilamentMenuBuilderPlugin.php +++ b/src/FilamentMenuBuilderPlugin.php @@ -13,9 +13,9 @@ class FilamentMenuBuilderPlugin implements Plugin { protected array $locations = []; - protected array $menuFields = []; + protected array | Closure $menuFields = []; - protected array $menuItemFields = []; + protected array | Closure $menuItemFields = []; /** * @var MenuPanel[] @@ -109,12 +109,12 @@ public function getLocations(): array return $this->locations; } - public function getMenuFields(): array + public function getMenuFields(): array | Closure { return $this->menuFields; } - public function getMenuItemFields(): array + public function getMenuItemFields(): array | Closure { return $this->menuItemFields; } From 629dc3c1a6e26743bcfbf24161ede2fef9991d53 Mon Sep 17 00:00:00 2001 From: Brandon Date: Thu, 8 Aug 2024 09:56:58 -0500 Subject: [PATCH 5/5] =?UTF-8?q?=F0=9F=93=9D=20Add=20custom=20field=20docum?= =?UTF-8?q?entation=20to=20the=20README?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/README.md b/README.md index 1f4879a..688e394 100644 --- a/README.md +++ b/README.md @@ -158,6 +158,69 @@ $panel ![Model Menu Panel](./art/model-menu.png) +### Custom Fields + +In some cases, you may want to extend menu and menu items with custom fields. To do this, start by passing an array of form components to the `addMenuFields` and `addMenuItemFields` methods when registering the plugin: + +```php +use Filament\Forms\Components\TextInput; +use Filament\Forms\Components\Toggle; +use Datlechin\FilamentMenuBuilder\FilamentMenuBuilderPlugin; + +$panel + ... + ->plugin( + FilamentMenuBuilderPlugin::make() + ->addMenuFields([ + Toggle::make('is_logged_in'), + ]) + ->addMenuItemFields([ + TextInput::make('classes'), + ]), + ) +``` + +Next, create a migration adding the additional columns to the appropriate tables: + +```php +use Illuminate\Database\Migrations\Migration; +use Illuminate\Database\Schema\Blueprint; +use Illuminate\Support\Facades\Schema; + +return new class extends Migration +{ + /** + * Run the migrations. + */ + public function up(): void + { + Schema::table(config('filament-menu-builder.tables.menus'), function (Blueprint $table) { + $table->boolean('is_logged_in')->default(false); + }); + + Schema::table(config('filament-menu-builder.tables.menu_items'), function (Blueprint $table) { + $table->string('classes')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table(config('filament-menu-builder.tables.menus'), function (Blueprint $table) { + $table->dropColumn('is_logged_in'); + }); + + Schema::table(config('filament-menu-builder.tables.menu_items'), function (Blueprint $table) { + $table->dropColumn('classes'); + }); + } +} +``` + +Once done, simply run `php artisan migrate`. + ## Changelog Please see [CHANGELOG](CHANGELOG.md) for more information on what has changed recently.