Fin Modal Table Select
CommunityA 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.
Author:
Finity Labs
Package health
BetaAutomated checks of this plugin's Composer package
15 checks
- Failed: GitHub Actions pinned to SHA — View details on Plumb
- Skipped: GitLab CI includes pinned to SHA
- Passed: Open security advisories
- Passed: Dependabot PR responsiveness — No open Dependabot PRs.
- Skipped: Renovate MR responsiveness
- Failed: Dependabot or Renovate configured — No dependency updater configuration found. View details on Plumb
- Skipped: Dependency update cooldown configured
- Failed: Provides a security policy — View details on Plumb
- Passed: Abandoned or archived — No consulted source marks the package abandoned (packagist, github).
- Passed: Commit and release recency — Active: last commit 0 days ago; last release 28 days ago.
-
Passed:
composer.lock not committed by library
—
composer.lockis absent from the released dist archive. - Warning: Dist archive is lean
-
Passed:
Current Laravel version supported
—
Package dependencies resolve together with current Laravel
13.0. -
Passed:
Current PHP version supported
—
Constraint
^8.2supports current PHP8.5. - Skipped: Current Symfony version supported
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
.
Documentation
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 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:
Prefilled invoice header — fillsFields() fills read-only entries and an editable phone from the picked company:
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:
#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
From the same author
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.
Author:
Finity Labs
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.
Author:
Finity Labs
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.
Author:
Finity Labs
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.
Author:
Finity Labs
Featured Plugins
A selection of plugins curated by the Filament team
Sharp Theme
A theme that gives panels a precise, technical look with square corners, strong borders, and clear contrast.
Filament
Advanced Tables (formerly Filter Sets)
Supercharge your tables with powerful features like user-customizable views, quick filters, multi-column sorting, advanced table searching, convenient view management, and more. Compatible with Resource Panel Tables, Relation Managers, Table Widgets, and Table Builder!
Kenneth Sese
Custom Fields
Eliminate custom field migrations forever. Let your users create and manage form fields directly in Filament admin panels with 20+ built-in field types, validation, and zero database changes.
Relaticle