Skip to main content
← Back to Table of Contents

Summary

Rich user picker extending SelectField with a design optimized for user selection. Features avatars, names, emails, and verified badges in both the dropdown and trigger. Supports single selection with a rich trigger and multiple selection with removable avatar tags.
ClassBjanczak\FilamentFlexFields\Filament\Forms\Components\UserSelect
State typestring|int|null (single) or list<string|int> (multiple)
FieldTypeuser_select
ParentSelectField — inherits select API
Playgrounduser-select slug in Flex Fields playground
For read-only user display in tables, use UserColumn instead.

Basic usage

use Bjanczak\FilamentFlexFields\Filament\Forms\Components\UserSelect;
use App\Models\User;

UserSelect::make('assignee_id')
    ->label('Assignee')
    ->optionModel(User::class)
    ->nameColumn('name')
    ->emailColumn('email')
    ->avatarColumn('avatar_url')
    ->verificationColumn('email_verified_at')
    ->searchable();

Multi-Select Relationship

UserSelect::make('team_members')
    ->relationship('members', 'name')
    ->multiple()
    ->searchable()
    ->maxVisibleAvatars(5);

State & validation

Stored value

State is a scalar ID (single) or an array of IDs (multiple). Values must match model primary keys when using optionModel() or relationship().
$record->assignee_id; // 1
$record->team_members; // [1, 2, 3]

Validation rules

Inherits standard Filament Select validation. Option keys must exist in search results or static options().

Configuration API

All methods accept Closure unless noted.
MethodTypeDefaultDescription
optionModel(string $model)SetupnullEloquent model for search/options
nameColumn(string $column)Setup'name'Model attribute for user name
emailColumn(string $column)SetupnullModel attribute for email/subtitle
avatarColumn(string $column)SetupnullModel attribute for avatar URL
verificationColumn(string $col)SetupnullModel attribute for verified status
getAvatarUrlUsing(Closure $cb)ResolverCustom avatar URL resolver
getNameUsing(Closure $cb)ResolverCustom name resolver
isVerifiedUsing(Closure $cb)ResolverCustom verified status resolver
multiple(bool $condition)SetupfalseEnable multi-select mode
searchable(bool $condition)SetupfalseEnable AJAX/local search
maxVisibleAvatars(int $limit)Setup5Max avatars shown in multi-trigger

Real-world examples

Custom Avatar Integration

UserSelect::make('owner_id')
    ->optionModel(User::class)
    ->getAvatarUrlUsing(fn (User $record) => $record->getFilamentAvatarUrl())
    ->isVerifiedUsing(fn (User $record) => $record->hasVerifiedEmail());

Static Rich Options

UserSelect::make('reviewer_id')
    ->options([
        1 => [
            'label' => 'Jane Doe',
            'description' => 'jane@example.com',
            'image' => '/avatars/jane.jpg',
            'verified' => true,
        ],
    ]);

Playground

/admin/flex-fields-playground/user-select See Playground for setup.
ComponentWhen to use instead
UserColumnRead-only user display in tables
SelectFieldGeneric selection without user semantics
ChoiceCardsLarge card-style selection

CSS classes (reference)

ClassRole
fff-user-selectRoot wrapper
fff-user-select--singleSingle-select modifier
fff-user-select--multipleMulti-select modifier
fff-user-select-option--listDropdown option row
fff-user-select-option--triggerSelection trigger row
fff-user-select-option--tagMulti-select tag chip
fff-user-select__selected-tagsTag container below field
fff-user-select__avatarAvatar image/initials wrapper
fff-user-select__verified-badgeVerified seal icon