fix(cli): clear chooser filters on empty input

Co-Authored-By: Virgil <virgil@lethean.io>
This commit is contained in:
Virgil 2026-04-02 12:40:30 +00:00
parent 81be3b701e
commit 3862b7c032
2 changed files with 30 additions and 2 deletions

View file

@ -304,7 +304,7 @@ func TestChoose_Bad_FilteredDefaultDoesNotFallBackToFirstVisible(t *testing.T) {
defer SetStdin(nil)
val := Choose("Pick", []string{"apple", "banana", "apricot"}, WithDefaultIndex[string](1), Filter[string]())
assert.Equal(t, "apricot", val)
assert.Equal(t, "banana", val)
}
func TestChoose_Bad_InvalidNumberUsesStderrHint(t *testing.T) {
@ -333,7 +333,23 @@ func TestChooseMulti_Bad_FilteredDefaultDoesNotFallBackToFirstVisible(t *testing
defer SetStdin(nil)
vals := ChooseMulti("Pick", []string{"apple", "banana", "apricot"}, WithDefaultIndex[string](1), Filter[string]())
assert.Equal(t, []string{"apricot"}, vals)
assert.Equal(t, []string{"banana"}, vals)
}
func TestChoose_Good_ClearFilter(t *testing.T) {
SetStdin(strings.NewReader("ap\n\n2\n"))
defer SetStdin(nil)
val := Choose("Pick", []string{"apple", "banana", "apricot"}, Filter[string]())
assert.Equal(t, "banana", val)
}
func TestChooseMulti_Good_ClearFilter(t *testing.T) {
SetStdin(strings.NewReader("ap\n\n2\n"))
defer SetStdin(nil)
vals := ChooseMulti("Pick", []string{"apple", "banana", "apricot"}, Filter[string]())
assert.Equal(t, []string{"banana"}, vals)
}
func TestChooseMulti_Good_Commas(t *testing.T) {

View file

@ -359,6 +359,7 @@ func Choose[T any](prompt string, items []T, opts ...ChooseOption[T]) T {
for i := range items {
visible[i] = i
}
allVisible := append([]int(nil), visible...)
for {
renderChoices(prompt, items, visible, cfg.displayFn, cfg.defaultN, cfg.filter)
@ -380,6 +381,11 @@ func Choose[T any](prompt string, items []T, opts ...ChooseOption[T]) T {
}
if response == "" {
if cfg.filter && len(visible) != len(allVisible) {
visible = append([]int(nil), allVisible...)
promptHint("Filter cleared.")
continue
}
if idx, ok := defaultVisibleIndex(visible, cfg.defaultN); ok {
return items[idx]
}
@ -453,6 +459,7 @@ func ChooseMulti[T any](prompt string, items []T, opts ...ChooseOption[T]) []T {
for i := range items {
visible[i] = i
}
allVisible := append([]int(nil), visible...)
for {
renderChoices(prompt, items, visible, cfg.displayFn, -1, cfg.filter)
@ -467,6 +474,11 @@ func ChooseMulti[T any](prompt string, items []T, opts ...ChooseOption[T]) []T {
// Empty response returns no selections
if response == "" {
if cfg.filter && len(visible) != len(allVisible) {
visible = append([]int(nil), allVisible...)
promptHint("Filter cleared.")
continue
}
if idx, ok := defaultVisibleIndex(visible, cfg.defaultN); ok {
return []T{items[idx]}
}