diff --git a/README.md b/README.md index 6a90f89..5be2722 100644 --- a/README.md +++ b/README.md @@ -317,6 +317,28 @@ $panel ) ``` +### Customizing the Models + +The default models used by the plugin can be configured and overridden similarly to the plugin resource as seen above. + +Simply extend the default models and then pass the classes when registering the plugin in the panel: + +```php +use App\Models\Menu; +use App\Models\MenuItem; +use App\Models\MenuLocation; +use Datlechin\FilamentMenuBuilder\FilamentMenuBuilderPlugin; + +$panel + ... + ->plugin( + FilamentMenuBuilderPlugin::make() + ->usingMenuModel(Menu::class) + ->usingMenuItemModel(MenuItem::class) + ->usingMenuLocationModel(MenuLocation::class) + ) +``` + ### Using Menus Getting the assigned menu for a registered location can be done using the `Menu` model. Below we will call the menu assigned to the `primary` location: diff --git a/src/Concerns/HasLocationAction.php b/src/Concerns/HasLocationAction.php index d41385e..43d2323 100644 --- a/src/Concerns/HasLocationAction.php +++ b/src/Concerns/HasLocationAction.php @@ -3,7 +3,6 @@ namespace Datlechin\FilamentMenuBuilder\Concerns; use Datlechin\FilamentMenuBuilder\FilamentMenuBuilderPlugin; -use Datlechin\FilamentMenuBuilder\Models\MenuLocation; use Filament\Actions\Action; use Filament\Forms\Components; use Filament\Notifications\Notification; @@ -45,7 +44,7 @@ public function getLocationAction(): Action continue; } - MenuLocation::updateOrCreate( + FilamentMenuBuilderPlugin::get()->getMenuLocationModel()::updateOrCreate( ['location' => $location], ['menu_id' => $menu] ); @@ -82,7 +81,7 @@ public function getLocationAction(): Action protected function getMenuLocations(): Collection { - return $this->menuLocations ??= MenuLocation::all(); + return $this->menuLocations ??= FilamentMenuBuilderPlugin::get()->getMenuLocationModel()::all(); } protected function getRegisteredLocations(): Collection diff --git a/src/FilamentMenuBuilderPlugin.php b/src/FilamentMenuBuilderPlugin.php index f270d1e..5231737 100644 --- a/src/FilamentMenuBuilderPlugin.php +++ b/src/FilamentMenuBuilderPlugin.php @@ -5,6 +5,9 @@ namespace Datlechin\FilamentMenuBuilder; use Datlechin\FilamentMenuBuilder\Contracts\MenuPanel; +use Datlechin\FilamentMenuBuilder\Models\Menu; +use Datlechin\FilamentMenuBuilder\Models\MenuItem; +use Datlechin\FilamentMenuBuilder\Models\MenuLocation; use Datlechin\FilamentMenuBuilder\Resources\MenuResource; use Filament\Contracts\Plugin; use Filament\Panel; @@ -13,6 +16,12 @@ class FilamentMenuBuilderPlugin implements Plugin { protected string $resource = MenuResource::class; + protected string $menuModel = Menu::class; + + protected string $menuItemModel = MenuItem::class; + + protected string $menuLocationModel = MenuLocation::class; + protected array $locations = []; protected array | Closure $menuFields = []; @@ -59,6 +68,27 @@ public function usingResource(string $resource): static return $this; } + public function usingMenuModel(string $model): static + { + $this->menuModel = $model; + + return $this; + } + + public function usingMenuItemModel(string $model): static + { + $this->menuItemModel = $model; + + return $this; + } + + public function usingMenuLocationModel(string $model): static + { + $this->menuLocationModel = $model; + + return $this; + } + public function addLocation(string $key, string $label): static { $this->locations[$key] = $label; @@ -113,6 +143,21 @@ public function getResource(): string return $this->resource; } + public function getMenuModel(): string + { + return $this->menuModel; + } + + public function getMenuItemModel(): string + { + return $this->menuItemModel; + } + + public function getMenuLocationModel(): string + { + return $this->menuLocationModel; + } + /** * @return MenuPanel[] */ diff --git a/src/Livewire/MenuItems.php b/src/Livewire/MenuItems.php index 9cb1700..9aa188a 100644 --- a/src/Livewire/MenuItems.php +++ b/src/Livewire/MenuItems.php @@ -7,7 +7,6 @@ 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; @@ -48,7 +47,7 @@ public function reorder(array $order, ?string $parentId = null): void return; } - MenuItem::query() + FilamentMenuBuilderPlugin::get()->getMenuItemModel()::query() ->whereIn('id', $order) ->update([ 'order' => DB::raw( @@ -80,7 +79,7 @@ public function editAction(): Action ->size(ActionSize::Small) ->modalHeading(fn (array $arguments): string => __('filament-actions::edit.single.modal.heading', ['label' => $arguments['title']])) ->icon('heroicon-m-pencil-square') - ->fillForm(fn (array $arguments): array => MenuItem::query() + ->fillForm(fn (array $arguments): array => FilamentMenuBuilderPlugin::get()->getMenuItemModel()::query() ->where('id', $arguments['id']) ->with('linkable') ->first() @@ -108,7 +107,7 @@ public function editAction(): Action ->schema(FilamentMenuBuilderPlugin::get()->getMenuItemFields()), ]) ->action( - fn (array $data, array $arguments) => MenuItem::query() + fn (array $data, array $arguments) => FilamentMenuBuilderPlugin::get()->getMenuItemModel()::query() ->where('id', $arguments['id']) ->update($data), ) @@ -130,7 +129,7 @@ public function deleteAction(): Action ->modalSubmitActionLabel(__('filament-actions::delete.single.modal.actions.delete.label')) ->modalIcon(FilamentIcon::resolve('actions::delete-action.modal') ?? 'heroicon-o-trash') ->action(function (array $arguments): void { - $menuItem = MenuItem::query()->where('id', $arguments['id'])->first(); + $menuItem = FilamentMenuBuilderPlugin::get()->getMenuItemModel()::query()->where('id', $arguments['id'])->first(); $menuItem?->delete(); }); diff --git a/src/Models/Menu.php b/src/Models/Menu.php index ba864fc..4fa4c2e 100644 --- a/src/Models/Menu.php +++ b/src/Models/Menu.php @@ -4,6 +4,7 @@ namespace Datlechin\FilamentMenuBuilder\Models; +use Datlechin\FilamentMenuBuilder\FilamentMenuBuilderPlugin; use Illuminate\Contracts\Database\Query\Builder; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\HasMany; @@ -26,12 +27,12 @@ protected function casts(): array public function locations(): HasMany { - return $this->hasMany(MenuLocation::class); + return $this->hasMany(FilamentMenuBuilderPlugin::get()->getMenuLocationModel()); } public function menuItems(): HasMany { - return $this->hasMany(MenuItem::class) + return $this->hasMany(FilamentMenuBuilderPlugin::get()->getMenuItemModel()) ->whereNull('parent_id') ->orderBy('parent_id') ->orderBy('order') @@ -40,7 +41,8 @@ public function menuItems(): HasMany public static function location(string $location): ?self { - return MenuLocation::with(['menu' => fn (Builder $query) => $query->where('is_visible', true)]) + return FilamentMenuBuilderPlugin::get() + ->getMenuLocationModel()::with(['menu' => fn (Builder $query) => $query->where('is_visible', true)]) ->where('location', $location) ->first()?->menu; } diff --git a/src/Models/MenuItem.php b/src/Models/MenuItem.php index 69a79d6..d8dde6e 100644 --- a/src/Models/MenuItem.php +++ b/src/Models/MenuItem.php @@ -6,6 +6,7 @@ use Datlechin\FilamentMenuBuilder\Contracts\MenuPanelable; use Datlechin\FilamentMenuBuilder\Enums\LinkTarget; +use Datlechin\FilamentMenuBuilder\FilamentMenuBuilderPlugin; use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; @@ -38,7 +39,7 @@ protected static function booted(): void public function menu(): BelongsTo { - return $this->belongsTo(Menu::class); + return $this->belongsTo(FilamentMenuBuilderPlugin::get()->getMenuModel()); } public function parent(): BelongsTo diff --git a/src/Models/MenuLocation.php b/src/Models/MenuLocation.php index d1798c7..661dc70 100644 --- a/src/Models/MenuLocation.php +++ b/src/Models/MenuLocation.php @@ -4,6 +4,7 @@ namespace Datlechin\FilamentMenuBuilder\Models; +use Datlechin\FilamentMenuBuilder\FilamentMenuBuilderPlugin; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; @@ -18,6 +19,6 @@ public function getTable(): string public function menu(): BelongsTo { - return $this->belongsTo(Menu::class); + return $this->belongsTo(FilamentMenuBuilderPlugin::get()->getMenuModel()); } } diff --git a/src/Resources/MenuResource.php b/src/Resources/MenuResource.php index b6f8731..b92d96b 100644 --- a/src/Resources/MenuResource.php +++ b/src/Resources/MenuResource.php @@ -5,7 +5,6 @@ namespace Datlechin\FilamentMenuBuilder\Resources; use Datlechin\FilamentMenuBuilder\FilamentMenuBuilderPlugin; -use Datlechin\FilamentMenuBuilder\Models\Menu; use Filament\Forms\Components; use Filament\Forms\Components\Component; use Filament\Forms\Form; @@ -15,10 +14,13 @@ class MenuResource extends Resource { - protected static ?string $model = Menu::class; - protected static ?string $navigationIcon = 'heroicon-o-bars-3'; + public static function getModel(): string + { + return FilamentMenuBuilderPlugin::get()->getMenuModel(); + } + public static function form(Form $form): Form { return $form