Fin Modal Table Select plugin screenshot
Dark mode ready
Multilingual support
Supports v5.x

Fin Modal Table Select

Community

A drop-in replacement for Filament's ModalTableSelect that shows what you picked — as a table, cards, a stacked list, and more — prefills form fields from the selected record, and turns multi-selects into editable repeater rows. Everything stays stock Filament — the modal, the entries, the repeater — with dark mode and 58 locales out of the box.

Tags: Action Forms Form Field Form Layout Infolist Entry Tables Table Column
Supported versions:
5.x 4.x
Finity Labs avatar Author: Finity Labs

Package health

Beta

Automated checks of this plugin's Composer package

70 / 100
Security 52
Maintenance 90
Ecosystem 100
15 checks
Third-party plugin. This is built by the community, not the Filament team. Filament does not review, endorse, or vet the security of plugins outside the filament/ namespace. Review the source and install at your own risk. Found malware or an unresolved security issue the author won't address? Report it .
Powered by Plumb Last scanned 1 week ago

Documentation

finity-labs-fin-modal-table-select

FILAMENT 4.x FILAMENT 5.x Latest Version on Packagist Tests Code Style Total Downloads License

A drop-in replacement for Filament's native ModalTableSelect that shows what you've selected — and can push the selection into the rest of your form.

The stock component renders the selection as badges or comma-separated text. This one adds:

  • Nine display modes — a table with columns inherited from your modal's tableConfiguration(), a stacked list with per-item remove, a card grid, a thumbnail strip, per-record badge colors/icons, text lists, an infolist card, your own Blade view per item, or nothing at all (selection-only). The mode resolves automatically from what you configure.
  • fillsFields() — pick a company, get its name and tax number filled in, let the user overwrite the phone.
  • fillsRepeater() + SelectedItemsRepeater — pick products, get one editable row each (quantity, price). Re-picking never wipes what the user edited, and deleting a row deselects its record.
  • standalone() + standaloneRecords() — use the picker without an Eloquent relationship: records from a model query, or from a plain array (named routes, page classes, API data) with modal search and sort intact.

Everything user-facing stays stock Filament — the modal, the row entries, the repeater. This package only wires them together. All display modes support dark mode out of the box, and 58 locales ship with the package.

#Screenshots

Pick records in a full Filament table — search, sort, and filter inside the modal; the selection summary badge sits right on the field label:

The modal table select open over the invoice form, with rows checked

The invoice flow — every picked product becomes an editable repeater row (fillsRepeater() + SelectedItemsRepeater). Re-picking keeps your edited quantities and prices; deleting a row deselects the product:

Table-layout repeater filled from the selection, with editable quantity and price

Prefilled invoice headerfillsFields() fills read-only entries and an editable phone from the picked company:

Company picker prefilling name, tax number, and an editable phone

Nine ways to show the selection — badges with displayLimit(), stacked lists with per-item remove, inherited-column tables, text lists, per-record badge colors, card grids, thumbnails, and your own Blade view per item:

Badges with display limit, stacked list, and inherited-column table displays Text lists, per-record badges, card grid, thumbnails, and custom item views

#Quick example

use FinityLabs\FinModalTableSelect\Components\ModalTableSelect;

// Selected records as a table, columns inherited from the modal:
ModalTableSelect::make('categories')
    ->relationship('categories', 'name')
    ->multiple()
    ->tableConfiguration(CategoriesTable::class)
    ->displayAsTable()

// Invoice lines: pick products, edit quantity/price per row:
ModalTableSelect::make('product_picker')
    ->standalone(Product::class, 'name')
    ->multiple()
    ->tableConfiguration(ProductsTable::class)
    ->selectionOnly()
    ->fillsRepeater('items', fn (Product $record): array => [
        'product_id' => $record->getKey(),
        'name'       => $record->name,
        'unit_price' => $record->default_price,
        'quantity'   => 1,
    ], keyAttribute: 'product_id')

#Array-backed records

The picker can run over plain arrays — no Eloquent at all. The modal table still searches the searchable columns and sorts the sortable ones, the selected keys land in the field state, and every display mode works unchanged. The records closure gets Filament's dependency injection, so it can scope the list by sibling form state:

use Filament\Schemas\Components\Utilities\Get;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;
use FinityLabs\FinModalTableSelect\Components\ModalTableSelect;
use Illuminate\Support\Facades\Route;

class RoutesTable
{
    public static function configure(Table $table): Table
    {
        return $table->columns([          // columns and filters only — no query;
            TextColumn::make('label')     // the component supplies the records itself
                ->searchable()
                ->sortable(),
            TextColumn::make('route')->searchable(),
            TextColumn::make('uri'),
            TextColumn::make('panel')->badge(),
        ]);
    }
}

ModalTableSelect::make('route_names')
    ->tableConfiguration(RoutesTable::class)
    ->standaloneRecords(fn (Get $get): array => collect(Route::getRoutes()->getRoutesByName())
        ->filter(fn ($route, string $name): bool => blank($get('panel')) || str_starts_with($name, "filament.{$get('panel')}."))
        ->map(fn ($route, string $name): array => [
            'key' => $name,
            'label' => (string) str($name)->afterLast('.')->headline(),
            'route' => $name,
            'uri' => '/'.$route->uri(),
            'panel' => (string) str($name)->after('filament.')->before('.'),
        ])
        ->values()
        ->all(), titleAttribute: 'label')
    ->multiple()
    ->displayAsTable()

The state stores the record keys (here: route names) as strings — cast the column to array for multiple(). A saved key the closure no longer returns still renders as its raw key instead of disappearing. fillsFields(), fillsRepeater(), and all display modes accept the array records; closures receive them as fn (array $record) => ....

#Installation

composer require finity-labs/fin-modal-table-select

Custom Filament theme? Add the package views to your theme's @source list — see Installation.

#Documentation

Guide Covers
Installation Requirements, Tailwind setup, translations
Getting started Concepts, display-mode resolution, 30-second tour
Display modes Table, stacked list, cards, thumbnails, badges, lists, infolist, custom views
Filling form fields fillsFields() — prefill an invoice header from a company
Filling a repeater fillsRepeater() + SelectedItemsRepeater — the invoice-lines flow
Standalone mode Using the picker without a relationship
Reference Full API table, public methods, translation keys

#Compatibility

Package Filament PHP
1.x 4.x / 5.x 8.2+

#License

MIT

The author

Finity Labs avatar Author: Finity Labs

Full-Stack Developer with 20+ years of experience. Passionate about Laravel and FilamentPHP, creating custom internal tools and admin panels that streamline workflows and improve operational clarity.

Plugins
5
Stars
21

From the same author

Fin Sentinel plugin thumbnail

Fin Sentinel

A Filament plugin that catches exceptions and emails them to your team, gives you a one-liner debug mail channel, and lets you browse log files from the admin panel - no SSH required.

Finity Labs avatar Author: Finity Labs
73 / 100 package health score out of 100
1 star
Tag: Developer Tool Tag: Panels
Dark mode ready Multilingual support
Free
Get it now
Fin Avatar plugin thumbnail

Fin Avatar

A privacy-focused, high-performance SVG avatar generator for Filament. It generates avatars locally, ensuring zero external requests (GDPR compliant) and utilizing browser caching for instant loads.

Finity Labs avatar Author: Finity Labs
73 / 100 package health score out of 100
4 stars
Tag: Panels
Dark mode ready No multilingual support
Free
Get it now
Fin Codex plugin thumbnail

Fin Codex

In-app help for Filament panels. A help drawer on every page that opens on the articles written for that screen, a help center inside the panel, question-mark hints next to form fields, and an editor where your admins write and translate the articles without leaving Filament.

Finity Labs avatar Author: Finity Labs
73 / 100 package health score out of 100
1 star
Recently added: New Tag: Action More tags: +6
Dark mode ready Multilingual support
Free
Get it now
Fin Mail plugin thumbnail

Fin Mail

A powerful email template manager and composer for Filament. Build, manage, and send emails directly from your admin panel — with dynamic token replacement, multilingual templates, customizable themes, template versioning, email logging with status tracking, auth email overrides, and a reusable Send Email action that drops into any resource.

Finity Labs avatar Author: Finity Labs
73 / 100 package health score out of 100
13 stars
Tag: Developer Tool Tag: Form Editor Field More tags: +2
Dark mode ready Multilingual support
Free
Get it now