From f25557950b823561116b87f3bbff4442ee2024f9 Mon Sep 17 00:00:00 2001 From: Maas Lalani Date: Tue, 18 Jun 2024 12:56:49 -0400 Subject: [PATCH] feat: Filtering on Select and MultiSelect fields --- examples/readme/confirm/main.go | 1 - examples/readme/multiselect/main.go | 1 + examples/readme/select/main.go | 1 + field_multiselect.go | 15 ++++++++++++--- field_select.go | 10 ++++++---- 5 files changed, 20 insertions(+), 8 deletions(-) diff --git a/examples/readme/confirm/main.go b/examples/readme/confirm/main.go index 68d875d5..ebbb3360 100644 --- a/examples/readme/confirm/main.go +++ b/examples/readme/confirm/main.go @@ -12,7 +12,6 @@ func main() { Description("Please confirm. "). Affirmative("Yes!"). Negative("No."). - Inline(true). Value(&happy) huh.NewForm(huh.NewGroup(confirm)).Run() diff --git a/examples/readme/multiselect/main.go b/examples/readme/multiselect/main.go index 5f66840b..5245a173 100644 --- a/examples/readme/multiselect/main.go +++ b/examples/readme/multiselect/main.go @@ -5,6 +5,7 @@ import "github.com/charmbracelet/huh" func main() { var toppings []string s := huh.NewMultiSelect[string](). + Filtering(true). Options( huh.NewOption("Lettuce", "Lettuce").Selected(true), huh.NewOption("Tomatoes", "Tomatoes").Selected(true), diff --git a/examples/readme/select/main.go b/examples/readme/select/main.go index f5c81aa5..12d01b93 100644 --- a/examples/readme/select/main.go +++ b/examples/readme/select/main.go @@ -6,6 +6,7 @@ func main() { var country string s := huh.NewSelect[string](). Title("Pick a country."). + Filtering(true). Options( huh.NewOption("United States", "US"), huh.NewOption("Germany", "DE"), diff --git a/field_multiselect.go b/field_multiselect.go index 022d75e7..505acf96 100644 --- a/field_multiselect.go +++ b/field_multiselect.go @@ -117,6 +117,13 @@ func (m *MultiSelect[T]) Filterable(filterable bool) *MultiSelect[T] { return m } +// Filtering sets the filtering state of the multi-select field. +func (m *MultiSelect[T]) Filtering(filtering bool) *MultiSelect[T] { + m.filtering = filtering + m.filter.Focus() + return m +} + // Limit sets the limit of the multi-select field. func (m *MultiSelect[T]) Limit(limit int) *MultiSelect[T] { m.limit = limit @@ -513,9 +520,11 @@ func (m *MultiSelect[T]) WithTheme(theme *Theme) Field { return m } m.theme = theme - m.filter.Cursor.Style = m.theme.Focused.TextInput.Cursor - m.filter.Cursor.TextStyle = m.theme.Focused.TextInput.CursorText - m.filter.PromptStyle = m.theme.Focused.TextInput.Prompt + m.filter.Cursor.Style = theme.Focused.TextInput.Cursor + m.filter.Cursor.TextStyle = theme.Focused.TextInput.CursorText + m.filter.PromptStyle = theme.Focused.TextInput.Prompt + m.filter.TextStyle = theme.Focused.TextInput.Text + m.filter.PlaceholderStyle = theme.Focused.TextInput.Placeholder m.updateViewportHeight() return m } diff --git a/field_select.go b/field_select.go index dd04d374..2cd33f47 100644 --- a/field_select.go +++ b/field_select.go @@ -355,7 +355,7 @@ func (s *Select[T]) titleView() string { sb = strings.Builder{} ) if s.filtering { - sb.WriteString(styles.Title.Render(s.filter.View())) + sb.WriteString(s.filter.View()) } else if s.filter.Value() != "" && !s.inline { sb.WriteString(styles.Title.Render(s.title) + styles.Description.Render("/"+s.filter.Value())) } else { @@ -496,9 +496,11 @@ func (s *Select[T]) WithTheme(theme *Theme) Field { return s } s.theme = theme - s.filter.Cursor.Style = s.theme.Focused.TextInput.Cursor - s.filter.Cursor.TextStyle = s.theme.Focused.TextInput.CursorText - s.filter.PromptStyle = s.theme.Focused.TextInput.Prompt + s.filter.Cursor.Style = theme.Focused.TextInput.Cursor + s.filter.Cursor.TextStyle = theme.Focused.TextInput.CursorText + s.filter.PromptStyle = theme.Focused.TextInput.Prompt + s.filter.TextStyle = theme.Focused.TextInput.Text + s.filter.PlaceholderStyle = theme.Focused.TextInput.Placeholder s.updateViewportHeight() return s }