guava/filament-modal-relation-managers
Installation
composer require guava/filament-modal-relation-managers
Publish the config (if needed):
php artisan vendor:publish --provider="Guava\FilamentModalRelationManagers\FilamentModalRelationManagersServiceProvider"
First Use Case
Embed a relation manager in a modal for a Post model with a comments relation:
use Guava\FilamentModalRelationManagers\Actions\ModalRelationManager;
public static function getModalActions(): array
{
return [
ModalRelationManager::make('comments')
->modalHeading('Manage Comments')
->modalSubheading('Edit or add comments for this post')
->relationName('comments'),
];
}
Where to Look First
Basic Modal Integration Attach a relation manager to a Filament resource action:
ModalRelationManager::make('author')
->relationName('author')
->modalHeading('Edit Author')
->modalDescription('Update the author details for this post.')
Dynamic Modal Content Use closures for dynamic modal configuration:
ModalRelationManager::make('tags')
->relationName('tags')
->modalHeading(fn ($record) => "Tags for {$record->title}")
->modalWidth('50%')
Nested Relations
Handle nested relations (e.g., Post → Categories → Subcategories):
ModalRelationManager::make('categories')
->relationName('categories')
->modalRelationManager(
ModalRelationManager::make('subcategories')
->relationName('subcategories')
)
Custom Relation Managers
Extend existing relation managers (e.g., Table, Select, RelationManager):
ModalRelationManager::make('images')
->relationName('images')
->modalRelationManager(
Filament\Tables\Table::make('images')
->columns([...])
->actions([...])
)
Modal Events Listen to modal events for custom logic:
ModalRelationManager::make('reviews')
->relationName('reviews')
->modalOpened(fn ($modal) => Log::info('Modal opened for reviews'))
->modalClosed(fn ($modal) => Log::info('Modal closed for reviews'))
getActions() or getTableActions().modalWidth(), modalMaxWidth(), or modalHeight() for responsive layouts.query() to filter relations dynamically:
ModalRelationManager::make('users')
->relationName('users')
->query(fn ($query) => $query->where('active', true))
Filament\Forms\Components for custom forms inside modals.Relation Name Mismatch
relationName must match the actual relation defined in your model.public function comments()
{
return $this->hasMany(Comment::class);
}
Modal Not Triggering
getActions() or getTableActions() and check Filament’s permission policies.Nested Modal Conflicts
modalRelationManager() for nested relations and avoid circular references.CSRF Token Errors
APP_DEBUG=true) and inspect Filament logs for relation manager errors.php artisan tinker
>>> $post = Post::first();
>>> $post->comments
Default Modal Width
modalWidth('60%'). Override with:
ModalRelationManager::make('relation')->modalWidth('80%');
Modal Footer Actions
ModalRelationManager::make('relation')->disableSaveButton();
Relation Manager Type
Table, Select, and RelationManager out of the box. For custom types, extend the base class:
use Guava\FilamentModalRelationManagers\Actions\Concerns\HasModalRelationManager;
class CustomModalRelationManager extends ModalRelationManager
{
use HasModalRelationManager;
public static function make(string $name): static
{
return tap(new static(), fn ($action) => $action->name($name));
}
}
Custom Modal Content
Override the default modal content using modalContent():
ModalRelationManager::make('relation')
->modalContent(fn ($record) => view('custom.modal', ['record' => $record]))
Modal Events Extend functionality with events:
ModalRelationManager::make('relation')
->modalOpened(fn ($modal) => event(new ModalOpened($modal)))
->modalClosed(fn ($modal) => event(new ModalClosed($modal)));
Relation Manager Customization Pass a custom relation manager instance:
ModalRelationManager::make('relation')
->modalRelationManager(
Filament\Tables\Table::make('custom-table')
->columns([...])
->actions([...])
)
How can I help you explore Laravel packages today?