Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Dynamic Forms #69

Open
tetienne opened this issue Dec 18, 2023 · 11 comments
Open

Dynamic Forms #69

tetienne opened this issue Dec 18, 2023 · 11 comments
Labels
enhancement New feature or request

Comments

@tetienne
Copy link

Is your feature request related to a problem? Please describe.
My current CLI ask several questions to the end user, and each question depends on the choice of the previous one. For instance, select an AWS cluster, then an AWS service.
So I cannot use the form feature of huh (or can I?). Because of this, I cannot display the help message for my prompt.

Describe the solution you'd like
Add a parameter ShowHelpMessage for the fields also.

Describe alternatives you've considered
Create a form for each single question.

Additional context
N/A

@meowgorithm
Copy link
Member

Hi! This is something we'd to explore in a more official capacity, but for now you can achieve a similar effect using multiple forms. For an example to help get started see #75.

@meowgorithm meowgorithm changed the title Disply help message when not using form Conditional/lazy evaluation Dec 19, 2023
@meowgorithm meowgorithm added the enhancement New feature or request label Dec 19, 2023
@tetienne
Copy link
Author

Thx for the exemple. So no magic yet here :)

@alinagard
Copy link

+1 to this enhancement!!

@kpym
Copy link

kpym commented Jan 7, 2024

You can may be use WithHideFunc to conditionally show some questions. Here is the rewriten example of #75 (with corrected "Carrot" option for "vegetables" 🙂).

package main

import (
	"fmt"

	"github.com/charmbracelet/huh"
)

func main() {

	var (
		category string
		choice   string
	)

	huh.NewForm(
		huh.NewGroup(
			huh.NewSelect[string]().
				Title("What are you in the mood for?").
				Value(&category).
				Options(
					huh.NewOption("Some fruit", "fruits"),
					huh.NewOption("A vegetable", "vegetables"),
					huh.NewOption("A drink", "drinks"),
				),
		),
		huh.NewGroup(
			huh.NewSelect[string]().
				Title("Okay, what kind of fruits are you in the mood for?").
				Value(&choice).
				Options(
					huh.NewOption("Tangerine", "tangerine"),
					huh.NewOption("Canteloupe", "canteloupe"),
					huh.NewOption("Pomelo", "pomelo"),
					huh.NewOption("Grapefruit", "grapefruit"),
				),
		).WithHideFunc(func() bool {
			return category != "fruits"
		}),
		huh.NewGroup(
			huh.NewSelect[string]().
				Title("Okay, what kind of vegetables are you in the mood for?").
				Value(&choice).
				Options(
					huh.NewOption("Carrot", "carrot"),
					huh.NewOption("Jicama", "jicama"),
					huh.NewOption("Kohlrabi", "kohlrabi"),
					huh.NewOption("Fennel", "fennel"),
					huh.NewOption("Ginger", "ginger"),
				),
		).WithHideFunc(func() bool {
			return category != "vegetables"
		}),
		huh.NewGroup(
			huh.NewSelect[string]().
				Title("Okay, what kind of drinks are you in the mood for?").
				Value(&choice).
				Options(
					huh.NewOption("Coffee", "coffee"),
					huh.NewOption("Tea", "tea"),
					huh.NewOption("Bubble Tea", "bubble-tea"),
					huh.NewOption("Agua Fresca", "agua-fresca"),
				),
		).WithHideFunc(func() bool {
			return category != "drinks"
		}),
	).Run()

	fmt.Printf("One %s coming right up!\n", choice)
}

@iloveicedgreentea
Copy link

I would like to extend this request to include external updates such as API calls. I mentioned some details here #183

@meowgorithm
Copy link
Member

Yep, that's definitely something we'll need to support, which also means we'll probably need a spinner if the func that computes the data runs over a certain time threshold.

@maaslalani
Copy link
Contributor

Just a heads up we're making good progress on dynamic forms. It looks like the API will be mostly allowing any option Title, Description, Option to be "Func"-able, i.e. take a function to populate the field from. It will automatically cache the options if desired as well.

dynamic-forms.mov

@iloveicedgreentea
Copy link

Awesome really looking forward to it. I really enjoy working with Huh, it has been great and everyone has been super impressed of the things we used it for

@yann-soubeyrand
Copy link

Hello, I’d like to have a group where I can dynamically add/remove input fields with key bindings (like pressing n to add a field and pressing d to remove the current field). Will the work on this issue cover this use case or is it something completely unrelated?

@nilansaha
Copy link

I am aware of the example on conditional form but is there any way to populate the options in a group conditionally as well? @maaslalani

@neilyoung
Copy link

neilyoung commented Sep 30, 2024

Dynamics work fine, but since WithHidefunc only works for groups, there is kind of an interruption in the user experience. I personally would like to have an overview about all my decisions made through the order process, but once a new group appears on screen, the history is lost. Is there any way around, so that all previous decisions are still visible –and could even be reverted later on?

Edit: So to say a "WithHideFunc" per "NewSelect" would be great.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

9 participants