Select bug: after creating a new record, child select stores the ID but loads no options if searchab
I’m running into a bug with Select. I have two selects: subfields.0 (parent) and subfields.b (child that depends on subfields.0). When I create a new record in subfields.b using createOptionUsing, the new ID is correctly placed in the form state. The issue is that if subfields.b has both searchable() and preload() enabled, its options list becomes empty right after creation.
1 Reply
public static function subfield0(): Select
{
return Select::make('subfields.0')
->label(__('tag110.subfields.a'))
->hiddenLabel()
->prefix('$a')
->placeholder(__('tag110.subfields.a'))
->searchable()
->getSearchResultsUsing(function (string $search): array {
return Corporate::query()
->when($search !== '', fn ($q) => $q->where('name', 'like', "%{$search}%"))
->orderBy('name')
->limit(50)
->get()
->mapWithKeys(fn ($c) => [(string) $c->getKey() => $c->name])
->all();
})
->getOptionLabelUsing(fn ($value): ?string => $value ? Corporate::query()->whereKey($value)->value('name') : null)
->live()
->afterStateUpdated(function ($state, Set $set) {
$corp = \App\Models\Corporate::find($state);
$set('subfields.a', $corp?->name);
$set('subfields.b', null); // reset
})
->createOptionForm([
TextInput::make('name')
->label(__('tag110.subfields.a'))
->required()
->unique('corporates', 'name')
->maxLength(255),
])
->createOptionUsing(function (array $data) {
$corp = Corporate::create($data); // <- Model
return (string) $corp->getKey(); // <- id string para el state
})
->options(Corporate::all()->mapWithKeys(fn ($corp) => [(string) $corp->getKey() => $corp->name]))
->preload();
}
public static function subfieldAHidden(): Hidden
{
return Hidden::make('subfields.a');
}
public static function subfield0(): Select
{
return Select::make('subfields.0')
->label(__('tag110.subfields.a'))
->hiddenLabel()
->prefix('$a')
->placeholder(__('tag110.subfields.a'))
->searchable()
->getSearchResultsUsing(function (string $search): array {
return Corporate::query()
->when($search !== '', fn ($q) => $q->where('name', 'like', "%{$search}%"))
->orderBy('name')
->limit(50)
->get()
->mapWithKeys(fn ($c) => [(string) $c->getKey() => $c->name])
->all();
})
->getOptionLabelUsing(fn ($value): ?string => $value ? Corporate::query()->whereKey($value)->value('name') : null)
->live()
->afterStateUpdated(function ($state, Set $set) {
$corp = \App\Models\Corporate::find($state);
$set('subfields.a', $corp?->name);
$set('subfields.b', null); // reset
})
->createOptionForm([
TextInput::make('name')
->label(__('tag110.subfields.a'))
->required()
->unique('corporates', 'name')
->maxLength(255),
])
->createOptionUsing(function (array $data) {
$corp = Corporate::create($data); // <- Model
return (string) $corp->getKey(); // <- id string para el state
})
->options(Corporate::all()->mapWithKeys(fn ($corp) => [(string) $corp->getKey() => $corp->name]))
->preload();
}
public static function subfieldAHidden(): Hidden
{
return Hidden::make('subfields.a');
}
public static function subfieldB(): \Filament\Forms\Components\Select
{
return \Filament\Forms\Components\Select::make('subfields.b')
->label(__('tag110.subfields.b'))
->placeholder(__('tag110.subfields.b'))
->hiddenLabel()
->prefix('$b')
->preload()
->live()
->options(function (Get $get) {
$get('_refresh_options');
return \App\Models\SubordinateUnit::query()
->where('corporate_id', (string) ($get('subfields.0') ?? ''))
->orderBy('name')
->pluck('name', 'id')
->mapWithKeys(fn ($name, $id) => [(string) $id => $name])
->toArray();
})
->getOptionLabelUsing(fn ($value): ?string => $value ? \App\Models\SubordinateUnit::query()->whereKey($value)->value('name') : null)
->afterStateHydrated(fn (\Filament\Forms\Components\Select $c, $state) => $c->state($state !== null ? (string) $state : null))
->createOptionForm([
\Filament\Forms\Components\TextInput::make('name')
->label(__('tag110.subfields.b'))
->required()
->unique('subordinate_units', 'name')
->maxLength(255),
])
->createOptionUsing(function (array $data, Get $get, Set $set): string {
$corpId = (string) ($get('subfields.0') ?? '');
if ($corpId === '') {
throw new \Exception('Selecciona $0 primero.');
}
$data['corporate_id'] = $corpId;
return (string) \App\Models\SubordinateUnit::create($data)->getKey();
})
->disabled(fn (Get $get) => blank($get('subfields.0')));
}
public static function subfieldB(): \Filament\Forms\Components\Select
{
return \Filament\Forms\Components\Select::make('subfields.b')
->label(__('tag110.subfields.b'))
->placeholder(__('tag110.subfields.b'))
->hiddenLabel()
->prefix('$b')
->preload()
->live()
->options(function (Get $get) {
$get('_refresh_options');
return \App\Models\SubordinateUnit::query()
->where('corporate_id', (string) ($get('subfields.0') ?? ''))
->orderBy('name')
->pluck('name', 'id')
->mapWithKeys(fn ($name, $id) => [(string) $id => $name])
->toArray();
})
->getOptionLabelUsing(fn ($value): ?string => $value ? \App\Models\SubordinateUnit::query()->whereKey($value)->value('name') : null)
->afterStateHydrated(fn (\Filament\Forms\Components\Select $c, $state) => $c->state($state !== null ? (string) $state : null))
->createOptionForm([
\Filament\Forms\Components\TextInput::make('name')
->label(__('tag110.subfields.b'))
->required()
->unique('subordinate_units', 'name')
->maxLength(255),
])
->createOptionUsing(function (array $data, Get $get, Set $set): string {
$corpId = (string) ($get('subfields.0') ?? '');
if ($corpId === '') {
throw new \Exception('Selecciona $0 primero.');
}
$data['corporate_id'] = $corpId;
return (string) \App\Models\SubordinateUnit::create($data)->getKey();
})
->disabled(fn (Get $get) => blank($get('subfields.0')));
}