Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Filament List Entry Laravel Package

fauzie811/filament-list-entry

fauzie811/filament-list-entry is a Filament package for Laravel that provides a reusable list entry component, making it easy to render records as clean, compact, customizable list items in admin panels and dashboards.

View on GitHub
Deep Wiki
Context7

Getting Started

fauzie811/filament-list-entry is a Filament form component for editing a flat list of values inside a single form field (tags, aliases, keywords, short notes, codes). It is not a relation manager and not a full repeater — it stores the list as one dehydrated array on the record.

Minimal setup:

composer require fauzie811/filament-list-entry
  • Check first: composer.json for the supported Filament major (v3 vs v4) and Laravel constraint, then the package README for the exact namespace of the component class (Fauzie811\FilamentListEntry\Forms\Components\...).
  • Publish config only if a tag exists — php artisan vendor:publish --tag="filament-list-entry-config". Most installs of a single-purpose form field do not need it.
  • No migrations. The component writes to a column you already own; you decide the storage format (typically a JSON/array-cast column).

First use case — an editable tag list on a Post resource:

use Fauzie811\FilamentListEntry\Forms\Components\ListEntry;

ListEntry::make('tags')
    ->label('Tags');

with protected $casts = ['tags' => 'array']; on the model. That's the whole loop: add the field, cast the column, save the form.

Implementation Patterns

JSON column is the default storage shape. The field's state is an array of scalars, so a json/array-cast column round-trips cleanly. If you must store a delimited string, do the transform in a mutator on the model rather than fighting the field's state.

Pair it with a table column, not a repeat. For display, render the same array read-only:

TextColumn::make('tags')->badge()->separator(',')
// or ->formatStateUsing(fn ($state) => implode(', ', (array) $state))

Use it in the places a simple scalar field goes. Because it is a Forms\Components\Field, it composes with wizards, ->hidden(), ->disabled(), Section layouts, and the action modal forms. Repeater also works there but carries per-entry schema weight you don't need for a single value.

Choose between this and Repeater deliberately. One value per row → this component. Two or more fields per row, per-row validation sets, or per-row actions → Filament's Repeater. Mixing the two (a list-entry inside a repeater) is legal but makes state debugging noticeably harder.

Validation lives on the wildcard path. Attach rules to the field and expect keys like data.tags.0 in the error bag:

ListEntry::make('tags')
    ->rules(['array', 'max:10'])
    ->rule(fn () => function ($attribute, $value, $fail) {
        // $attribute is like data.tags
    });

Testing. Standard Livewire form test — livewire(CreatePost::class)->fillForm(['tags' => ['php', 'laravel']])->call('create')->assertHasNoFormErrors(); then assert the persisted JSON.

Gotchas and Tips

  • Forgotten cast is the #1 failure. Without 'tags' => 'array', you get Array to string conversion on save or a literal ["a","b"] string in the DB. Verify with Model::find($id)->getRawOriginal('tags').
  • Filament major mismatch. A v1.x field built for Filament v3 will not load under v4 (namespace/schema API changes). If install succeeds but the class is missing at runtime, check the constraint before debugging your code.
  • Empty vs. null state. A cleared list may dehydrate to [] or null depending on the component's defaults. If the column is NOT NULL, normalise in the model ($attributes['tags'] ?? []) or use ->default([]).
  • v1.0.1 is a patch release with no breaking notes published (v1.0.0...v1.0.1). There is nothing to migrate; constrain to ^1.0 and take patches. The changelog link is the only artifact — diff src/ against your installed version if you need to know precisely what moved.
  • Debugging state: ->afterStateUpdated(fn ($state) => dump($state)) and ->dehydrateStateUsing(...) are the fastest way to see what the field hands to the model. Filament's ->live() also lets you react to list edits (e.g. slug previews).
  • Large lists degrade the form, not the DB. Each entry is its own form component in the Livewire tree. Past a few hundred entries, switch to a relation manager + table with search rather than pushing this field further.
  • Extension points are thin by design. There is no plugin boot step to hook; customisation is limited to the field's fluent API (addButtonLabel, minItems/maxItems, reorderable where exposed) and to wrapping it in your own component class if you need a different entry schema.
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
adachsoft/changelog-linter
adachsoft/collection
payerurl/telegrambot-crypto-payment-instant-payout
dskripchenko/laravel-hybrid-search
riorizkyrainey/lara-ced
mehedimi/static-vel
zharp/zharp
nonsapiens/bigquery-model-sync
lgu-bayambang-ict-office/lgu-laravel-development-standards
andydefer/laravel-support
se7enxweb/flysystem
lampwick/laravel
jeslage/statamic-emojis
micahdshackelford/rmap-laravel
draftsmaninc/draftsman
square-bit/laravel-volition
himito/laravel-mailman
htinlynn/genius-helper
maco-studios/hephaestus
elmogy/larafast