From cab906151fb142d1b000ee8be1fb3101b8087661 Mon Sep 17 00:00:00 2001 From: Kynan Ware <47394200+BagToad@users.noreply.github.com> Date: Tue, 6 May 2025 15:32:30 -0600 Subject: [PATCH] fix(a11y prompter): select prompt default value is readable --- internal/prompter/accessible_prompter_test.go | 25 ++++++++++++++++++- internal/prompter/prompter.go | 12 ++++++--- 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/internal/prompter/accessible_prompter_test.go b/internal/prompter/accessible_prompter_test.go index 8ae449dc9..c47969c04 100644 --- a/internal/prompter/accessible_prompter_test.go +++ b/internal/prompter/accessible_prompter_test.go @@ -78,6 +78,29 @@ func TestAccessiblePrompter(t *testing.T) { assert.Equal(t, expectedIndex, selectValue) }) + t.Run("Select - default value is in prompt and in readable format", func(t *testing.T) { + console := newTestVirtualTerminal(t) + p := newTestAccessiblePrompter(t, console) + dummyDefaultValue := "12345abcdefg" + options := []string{"1", "2", dummyDefaultValue} + + go func() { + // Wait for prompt to appear + _, err := console.ExpectString("Select a number (default: 12345abcdefg)") + require.NoError(t, err) + + // Just press enter to accept the default + _, err = console.SendLine("") + require.NoError(t, err) + }() + + selectValue, err := p.Select("Select a number", dummyDefaultValue, options) + require.NoError(t, err) + + expectedIndex := slices.Index(options, dummyDefaultValue) + assert.Equal(t, expectedIndex, selectValue) + }) + t.Run("MultiSelect", func(t *testing.T) { console := newTestVirtualTerminal(t) p := newTestAccessiblePrompter(t, console) @@ -171,7 +194,7 @@ func TestAccessiblePrompter(t *testing.T) { go func() { // Wait for prompt to appear - _, err := console.ExpectString("Enter some characters (default: 12345abcdefg):") + _, err := console.ExpectString("Enter some characters (default: 12345abcdefg)") require.NoError(t, err) // Enter nothing diff --git a/internal/prompter/prompter.go b/internal/prompter/prompter.go index 4a6a4ff6d..c5bf04691 100644 --- a/internal/prompter/prompter.go +++ b/internal/prompter/prompter.go @@ -79,12 +79,15 @@ func (p *accessiblePrompter) newForm(groups ...*huh.Group) *huh.Form { // addDefaultsToPrompt adds default values to the prompt string. func (p *accessiblePrompter) addDefaultsToPrompt(prompt string, defaultValues []string) string { + // We don't show empty default values in the prompt. + defaultValues = slices.DeleteFunc(defaultValues, func(s string) bool { + return s == "" + }) + if len(defaultValues) == 1 { - prompt = fmt.Sprintf("%s (default: %s):", prompt, defaultValues[0]) + prompt = fmt.Sprintf("%s (default: %s)", prompt, defaultValues[0]) } else if len(defaultValues) > 1 { - prompt = fmt.Sprintf("%s (defaults: %s):", prompt, strings.Join(defaultValues, ", ")) - } else { - prompt = fmt.Sprintf("%s:", prompt) + prompt = fmt.Sprintf("%s (defaults: %s)", prompt, strings.Join(defaultValues, ", ")) } return prompt @@ -93,6 +96,7 @@ func (p *accessiblePrompter) addDefaultsToPrompt(prompt string, defaultValues [] func (p *accessiblePrompter) Select(prompt, defaultValue string, options []string) (int, error) { var result int formOptions := []huh.Option[int]{} + prompt = p.addDefaultsToPrompt(prompt, []string{defaultValue}) for i, o := range options { // If this option is the default value, assign its index // to the result variable. huh will treat it as a default selection.