use prompter in shared editable code
This commit is contained in:
parent
a51aba0d22
commit
7860198dd7
4 changed files with 57 additions and 78 deletions
|
|
@ -21,10 +21,11 @@ type EditOptions struct {
|
|||
HttpClient func() (*http.Client, error)
|
||||
IO *iostreams.IOStreams
|
||||
BaseRepo func() (ghrepo.Interface, error)
|
||||
Prompter prShared.EditPrompter
|
||||
|
||||
DetermineEditor func() (string, error)
|
||||
FieldsToEditSurvey func(*prShared.Editable) error
|
||||
EditFieldsSurvey func(*prShared.Editable, string) error
|
||||
FieldsToEditSurvey func(prShared.EditPrompter, *prShared.Editable) error
|
||||
EditFieldsSurvey func(prShared.EditPrompter, *prShared.Editable, string) error
|
||||
FetchOptions func(*api.Client, ghrepo.Interface, *prShared.Editable) error
|
||||
|
||||
SelectorArgs []string
|
||||
|
|
@ -41,6 +42,7 @@ func NewCmdEdit(f *cmdutil.Factory, runF func(*EditOptions) error) *cobra.Comman
|
|||
FieldsToEditSurvey: prShared.FieldsToEditSurvey,
|
||||
EditFieldsSurvey: prShared.EditFieldsSurvey,
|
||||
FetchOptions: prShared.FetchOptions,
|
||||
Prompter: f.Prompter,
|
||||
}
|
||||
|
||||
var bodyFile string
|
||||
|
|
@ -152,7 +154,7 @@ func editRun(opts *EditOptions) error {
|
|||
// Prompt the user which fields they'd like to edit.
|
||||
editable := opts.Editable
|
||||
if opts.Interactive {
|
||||
err = opts.FieldsToEditSurvey(&editable)
|
||||
err = opts.FieldsToEditSurvey(opts.Prompter, &editable)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
@ -222,7 +224,7 @@ func editRun(opts *EditOptions) error {
|
|||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = opts.EditFieldsSurvey(&editable, editorCommand)
|
||||
err = opts.EditFieldsSurvey(opts.Prompter, &editable, editorCommand)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
|
|||
|
|
@ -511,7 +511,7 @@ func Test_editRun(t *testing.T) {
|
|||
input: &EditOptions{
|
||||
SelectorArgs: []string{"123"},
|
||||
Interactive: true,
|
||||
FieldsToEditSurvey: func(eo *prShared.Editable) error {
|
||||
FieldsToEditSurvey: func(p prShared.EditPrompter, eo *prShared.Editable) error {
|
||||
eo.Title.Edited = true
|
||||
eo.Body.Edited = true
|
||||
eo.Assignees.Edited = true
|
||||
|
|
@ -520,7 +520,7 @@ func Test_editRun(t *testing.T) {
|
|||
eo.Milestone.Edited = true
|
||||
return nil
|
||||
},
|
||||
EditFieldsSurvey: func(eo *prShared.Editable, _ string) error {
|
||||
EditFieldsSurvey: func(p prShared.EditPrompter, eo *prShared.Editable, _ string) error {
|
||||
eo.Title.Value = "new title"
|
||||
eo.Body.Value = "new body"
|
||||
eo.Assignees.Value = []string{"monalisa", "hubot"}
|
||||
|
|
|
|||
|
|
@ -24,6 +24,7 @@ type EditOptions struct {
|
|||
Surveyor Surveyor
|
||||
Fetcher EditableOptionsFetcher
|
||||
EditorRetriever EditorRetriever
|
||||
Prompter shared.EditPrompter
|
||||
|
||||
SelectorArg string
|
||||
Interactive bool
|
||||
|
|
@ -35,9 +36,10 @@ func NewCmdEdit(f *cmdutil.Factory, runF func(*EditOptions) error) *cobra.Comman
|
|||
opts := &EditOptions{
|
||||
IO: f.IOStreams,
|
||||
HttpClient: f.HttpClient,
|
||||
Surveyor: surveyor{},
|
||||
Surveyor: surveyor{P: f.Prompter},
|
||||
Fetcher: fetcher{},
|
||||
EditorRetriever: editorRetriever{config: f.Config},
|
||||
Prompter: f.Prompter,
|
||||
}
|
||||
|
||||
var bodyFile string
|
||||
|
|
@ -280,14 +282,16 @@ type Surveyor interface {
|
|||
EditFields(*shared.Editable, string) error
|
||||
}
|
||||
|
||||
type surveyor struct{}
|
||||
type surveyor struct {
|
||||
P shared.EditPrompter
|
||||
}
|
||||
|
||||
func (s surveyor) FieldsToEdit(editable *shared.Editable) error {
|
||||
return shared.FieldsToEditSurvey(editable)
|
||||
return shared.FieldsToEditSurvey(s.P, editable)
|
||||
}
|
||||
|
||||
func (s surveyor) EditFields(editable *shared.Editable, editorCmd string) error {
|
||||
return shared.EditFieldsSurvey(editable, editorCmd)
|
||||
return shared.EditFieldsSurvey(s.P, editable, editorCmd)
|
||||
}
|
||||
|
||||
type EditableOptionsFetcher interface {
|
||||
|
|
|
|||
|
|
@ -4,12 +4,9 @@ import (
|
|||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/AlecAivazis/survey/v2"
|
||||
"github.com/cli/cli/v2/api"
|
||||
"github.com/cli/cli/v2/internal/ghrepo"
|
||||
"github.com/cli/cli/v2/internal/prompter"
|
||||
"github.com/cli/cli/v2/pkg/set"
|
||||
"github.com/cli/cli/v2/pkg/surveyext"
|
||||
)
|
||||
|
||||
type Editable struct {
|
||||
|
|
@ -255,34 +252,42 @@ func (ep *EditableProjects) clone() EditableProjects {
|
|||
}
|
||||
}
|
||||
|
||||
func EditFieldsSurvey(editable *Editable, editorCommand string) error {
|
||||
type EditPrompter interface {
|
||||
Select(string, string, []string) (int, error)
|
||||
Input(string, string) (string, error)
|
||||
MarkdownEditor(string, string, bool) (string, error)
|
||||
MultiSelect(string, []string, []string) ([]int, error)
|
||||
Confirm(string, bool) (bool, error)
|
||||
}
|
||||
|
||||
func EditFieldsSurvey(p EditPrompter, editable *Editable, editorCommand string) error {
|
||||
var err error
|
||||
if editable.Title.Edited {
|
||||
editable.Title.Value, err = titleSurvey(editable.Title.Default)
|
||||
editable.Title.Value, err = p.Input("Title", editable.Title.Default)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
if editable.Body.Edited {
|
||||
editable.Body.Value, err = bodySurvey(editable.Body.Default, editorCommand)
|
||||
editable.Body.Value, err = p.MarkdownEditor("Body", editable.Body.Default, false)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
if editable.Reviewers.Edited {
|
||||
editable.Reviewers.Value, err = multiSelectSurvey("Reviewers", editable.Reviewers.Default, editable.Reviewers.Options)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
editable.Reviewers.Value, err = multiSelectSurvey(
|
||||
p, "Reviewers", editable.Reviewers.Default, editable.Reviewers.Options)
|
||||
}
|
||||
if editable.Assignees.Edited {
|
||||
editable.Assignees.Value, err = multiSelectSurvey("Assignees", editable.Assignees.Default, editable.Assignees.Options)
|
||||
editable.Assignees.Value, err = multiSelectSurvey(
|
||||
p, "Assignees", editable.Assignees.Default, editable.Assignees.Options)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
if editable.Labels.Edited {
|
||||
editable.Labels.Add, err = multiSelectSurvey("Labels", editable.Labels.Default, editable.Labels.Options)
|
||||
editable.Labels.Add, err = multiSelectSurvey(
|
||||
p, "Labels", editable.Labels.Default, editable.Labels.Options)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
@ -300,18 +305,19 @@ func EditFieldsSurvey(editable *Editable, editorCommand string) error {
|
|||
}
|
||||
}
|
||||
if editable.Projects.Edited {
|
||||
editable.Projects.Value, err = multiSelectSurvey("Projects", editable.Projects.Default, editable.Projects.Options)
|
||||
editable.Projects.Value, err = multiSelectSurvey(
|
||||
p, "Projects", editable.Projects.Default, editable.Projects.Options)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
if editable.Milestone.Edited {
|
||||
editable.Milestone.Value, err = milestoneSurvey(editable.Milestone.Default, editable.Milestone.Options)
|
||||
editable.Milestone.Value, err = milestoneSurvey(p, editable.Milestone.Default, editable.Milestone.Options)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
confirm, err := confirmSurvey()
|
||||
confirm, err := p.Confirm("Submit?", true)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
@ -322,7 +328,7 @@ func EditFieldsSurvey(editable *Editable, editorCommand string) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
func FieldsToEditSurvey(editable *Editable) error {
|
||||
func FieldsToEditSurvey(p EditPrompter, editable *Editable) error {
|
||||
contains := func(s []string, str string) bool {
|
||||
for _, v := range s {
|
||||
if v == str {
|
||||
|
|
@ -337,7 +343,7 @@ func FieldsToEditSurvey(editable *Editable) error {
|
|||
opts = append(opts, "Reviewers")
|
||||
}
|
||||
opts = append(opts, "Assignees", "Labels", "Projects", "Milestone")
|
||||
results, err := multiSelectSurvey("What would you like to edit?", []string{}, opts)
|
||||
results, err := multiSelectSurvey(p, "What would you like to edit?", []string{}, opts)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
@ -414,67 +420,34 @@ func FetchOptions(client *api.Client, repo ghrepo.Interface, editable *Editable)
|
|||
return nil
|
||||
}
|
||||
|
||||
func titleSurvey(title string) (string, error) {
|
||||
var result string
|
||||
q := &survey.Input{
|
||||
Message: "Title",
|
||||
Default: title,
|
||||
}
|
||||
err := survey.AskOne(q, &result)
|
||||
return result, err
|
||||
}
|
||||
|
||||
func bodySurvey(body, editorCommand string) (string, error) {
|
||||
var result string
|
||||
q := &surveyext.GhEditor{
|
||||
EditorCommand: editorCommand,
|
||||
Editor: &survey.Editor{
|
||||
Message: "Body",
|
||||
FileName: "*.md",
|
||||
Default: body,
|
||||
HideDefault: true,
|
||||
AppendDefault: true,
|
||||
},
|
||||
}
|
||||
err := survey.AskOne(q, &result)
|
||||
return result, err
|
||||
}
|
||||
|
||||
func multiSelectSurvey(message string, defaults, options []string) ([]string, error) {
|
||||
func multiSelectSurvey(p EditPrompter, message string, defaults, options []string) (results []string, err error) {
|
||||
if len(options) == 0 {
|
||||
return nil, nil
|
||||
}
|
||||
var results []string
|
||||
q := &survey.MultiSelect{
|
||||
Message: message,
|
||||
Options: options,
|
||||
Default: defaults,
|
||||
Filter: prompter.LatinMatchingFilter,
|
||||
|
||||
var selected []int
|
||||
selected, err = p.MultiSelect(message, defaults, options)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
err := survey.AskOne(q, &results)
|
||||
|
||||
for _, i := range selected {
|
||||
results = append(results, options[i])
|
||||
}
|
||||
|
||||
return results, err
|
||||
}
|
||||
|
||||
func milestoneSurvey(title string, opts []string) (string, error) {
|
||||
func milestoneSurvey(p EditPrompter, title string, opts []string) (result string, err error) {
|
||||
if len(opts) == 0 {
|
||||
return "", nil
|
||||
}
|
||||
var result string
|
||||
q := &survey.Select{
|
||||
Message: "Milestone",
|
||||
Options: opts,
|
||||
Default: title,
|
||||
var selected int
|
||||
selected, err = p.Select("Milestone", title, opts)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
err := survey.AskOne(q, &result)
|
||||
return result, err
|
||||
}
|
||||
|
||||
func confirmSurvey() (bool, error) {
|
||||
var result bool
|
||||
q := &survey.Confirm{
|
||||
Message: "Submit?",
|
||||
Default: true,
|
||||
}
|
||||
err := survey.AskOne(q, &result)
|
||||
return result, err
|
||||
result = opts[selected]
|
||||
return
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue