Skip to content

Commit 8c7437e

Browse files
authored
fix: Select no options message with dynamic initial options (#18896)
1 parent a4fd02e commit 8c7437e

File tree

5 files changed

+125
-4
lines changed

5 files changed

+125
-4
lines changed

packages/forms/dist/components/select.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/support/resources/js/utilities/select.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -439,10 +439,14 @@ export class Select {
439439
if (totalRenderedCount === 0) {
440440
// Show a message if:
441441
// - There is an active search query (show "no search results" message), or
442-
// - The field has hasInitialNoOptionsMessage enabled (show "no options" message)
442+
// - The field has `hasInitialNoOptionsMessage` enabled (show "no options" message), or
443+
// - The field has dynamic options and no options were returned (show "no options" message)
443444
if (this.searchQuery) {
444445
this.showNoResultsMessage()
445-
} else if (this.hasInitialNoOptionsMessage) {
446+
} else if (
447+
this.hasInitialNoOptionsMessage ||
448+
this.hasDynamicOptions
449+
) {
446450
this.showNoOptionsMessage()
447451
}
448452
// If in multiple mode and no search query, hide the dropdown

packages/tables/dist/components/columns/select.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tests/src/Fixtures/Pages/SelectTest.php

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,60 @@ public function form(Schema $form): Schema
7070
])
7171
->native(false)
7272
->extraAttributes(['data-testid' => 'clearable-select']),
73+
74+
Select::make('dynamic_empty_options')
75+
->label('Dynamic Empty Options')
76+
->options(fn (): array => [])
77+
->native(false)
78+
->noOptionsMessage('No options available')
79+
->extraAttributes(['data-testid' => 'dynamic-empty-options-select']),
80+
81+
Select::make('dynamic_with_options')
82+
->label('Dynamic With Options')
83+
->options(fn (): array => [
84+
'option1' => 'Option 1',
85+
'option2' => 'Option 2',
86+
])
87+
->native(false)
88+
->noOptionsMessage('No options available')
89+
->extraAttributes(['data-testid' => 'dynamic-with-options-select']),
90+
91+
Select::make('dynamic_options_and_search_empty')
92+
->label('Dynamic Options And Search Empty')
93+
->options(fn (): array => [])
94+
->getSearchResultsUsing(fn (string $search): array => [])
95+
->getOptionLabelUsing(fn ($value): ?string => null)
96+
->native(false)
97+
->searchable()
98+
->noOptionsMessage('No options available')
99+
->extraAttributes(['data-testid' => 'dynamic-options-and-search-empty-select']),
100+
101+
Select::make('static_empty_options')
102+
->label('Static Empty Options')
103+
->options([])
104+
->native(false)
105+
->noOptionsMessage('No options available')
106+
->extraAttributes(['data-testid' => 'static-empty-options-select']),
107+
108+
Select::make('dynamic_options_with_results')
109+
->label('Dynamic Options With Results')
110+
->options(fn (): array => [
111+
'dynamic1' => 'Dynamic Option 1',
112+
'dynamic2' => 'Dynamic Option 2',
113+
])
114+
->getSearchResultsUsing(fn (string $search): array => [
115+
'result1' => 'Search Result 1',
116+
])
117+
->getOptionLabelUsing(fn ($value): ?string => match ($value) {
118+
'dynamic1' => 'Dynamic Option 1',
119+
'dynamic2' => 'Dynamic Option 2',
120+
'result1' => 'Search Result 1',
121+
default => null,
122+
})
123+
->native(false)
124+
->searchable()
125+
->noOptionsMessage('No options available')
126+
->extraAttributes(['data-testid' => 'dynamic-options-with-results-select']),
73127
])
74128
->statePath('data');
75129
}

tests/src/Forms/Components/SelectTest.php

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1021,3 +1021,66 @@ public function render(): View
10211021
->assertSee('Banana')
10221022
->assertNoSmoke();
10231023
});
1024+
1025+
it('shows "no options" message when dynamic options returns empty array', function (): void {
1026+
$this->actingAs(User::factory()->create());
1027+
1028+
visit('/select-test')
1029+
->assertSee('Dynamic Empty Options')
1030+
->click('[data-testid="dynamic-empty-options-select"] .fi-select-input-btn')
1031+
->waitForText('No options available')
1032+
->assertSee('No options available')
1033+
->assertDontSee('Loading')
1034+
->assertNoSmoke();
1035+
});
1036+
1037+
it('shows options when dynamic options returns options', function (): void {
1038+
$this->actingAs(User::factory()->create());
1039+
1040+
visit('/select-test')
1041+
->assertSee('Dynamic With Options')
1042+
->click('[data-testid="dynamic-with-options-select"] .fi-select-input-btn')
1043+
->waitForText('Option 1')
1044+
->assertSee('Option 1')
1045+
->assertSee('Option 2')
1046+
->assertDontSee('No options available')
1047+
->assertDontSee('Loading')
1048+
->assertNoSmoke();
1049+
});
1050+
1051+
it('shows "no options" message when dynamic options and search returns empty array', function (): void {
1052+
$this->actingAs(User::factory()->create());
1053+
1054+
visit('/select-test')
1055+
->assertSee('Dynamic Options And Search Empty')
1056+
->click('[data-testid="dynamic-options-and-search-empty-select"] .fi-select-input-btn')
1057+
->waitForText('No options available')
1058+
->assertSee('No options available')
1059+
->assertDontSee('Loading')
1060+
->assertNoSmoke();
1061+
});
1062+
1063+
it('shows "no options" message when static options is empty array', function (): void {
1064+
$this->actingAs(User::factory()->create());
1065+
1066+
visit('/select-test')
1067+
->assertSee('Static Empty Options')
1068+
->click('[data-testid="static-empty-options-select"] .fi-select-input-btn')
1069+
->waitForText('No options available')
1070+
->assertSee('No options available')
1071+
->assertNoSmoke();
1072+
});
1073+
1074+
it('shows options when dynamic options returns non-empty array', function (): void {
1075+
$this->actingAs(User::factory()->create());
1076+
1077+
visit('/select-test')
1078+
->assertSee('Dynamic Options With Results')
1079+
->click('[data-testid="dynamic-options-with-results-select"] .fi-select-input-btn')
1080+
->waitForText('Dynamic Option 1')
1081+
->assertSee('Dynamic Option 1')
1082+
->assertSee('Dynamic Option 2')
1083+
->assertDontSee('No options available')
1084+
->assertDontSee('Loading')
1085+
->assertNoSmoke();
1086+
});

0 commit comments

Comments
 (0)