Skip to content

Commit

Permalink
Merge pull request #25 from Log1x/enhance/configurable-models
Browse files Browse the repository at this point in the history
πŸ§‘β€πŸ’» Add support for overriding the plugin models
  • Loading branch information
datlechin authored Aug 20, 2024
2 parents d99c473 + 18ab4cf commit 7a8d4d4
Show file tree
Hide file tree
Showing 8 changed files with 87 additions and 16 deletions.
22 changes: 22 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
5 changes: 2 additions & 3 deletions src/Concerns/HasLocationAction.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -45,7 +44,7 @@ public function getLocationAction(): Action
continue;
}

MenuLocation::updateOrCreate(
FilamentMenuBuilderPlugin::get()->getMenuLocationModel()::updateOrCreate(
['location' => $location],
['menu_id' => $menu]
);
Expand Down Expand Up @@ -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
Expand Down
45 changes: 45 additions & 0 deletions src/FilamentMenuBuilderPlugin.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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 = [];
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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[]
*/
Expand Down
9 changes: 4 additions & 5 deletions src/Livewire/MenuItems.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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(
Expand Down Expand Up @@ -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()
Expand Down Expand Up @@ -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),
)
Expand All @@ -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();
});
Expand Down
8 changes: 5 additions & 3 deletions src/Models/Menu.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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')
Expand All @@ -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;
}
Expand Down
3 changes: 2 additions & 1 deletion src/Models/MenuItem.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down
3 changes: 2 additions & 1 deletion src/Models/MenuLocation.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

namespace Datlechin\FilamentMenuBuilder\Models;

use Datlechin\FilamentMenuBuilder\FilamentMenuBuilderPlugin;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;

Expand All @@ -18,6 +19,6 @@ public function getTable(): string

public function menu(): BelongsTo
{
return $this->belongsTo(Menu::class);
return $this->belongsTo(FilamentMenuBuilderPlugin::get()->getMenuModel());
}
}
8 changes: 5 additions & 3 deletions src/Resources/MenuResource.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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
Expand Down

0 comments on commit 7a8d4d4

Please sign in to comment.