diff --git a/internal/tui/components/autocomplete/autocomplete.go b/internal/tui/components/cmp/autocomplete.go similarity index 99% rename from internal/tui/components/autocomplete/autocomplete.go rename to internal/tui/components/cmp/autocomplete.go index f17bb6258..3d64c5037 100644 --- a/internal/tui/components/autocomplete/autocomplete.go +++ b/internal/tui/components/cmp/autocomplete.go @@ -1,4 +1,5 @@ -package autocomplete +// Package cmp houses the generic completion component +package cmp import ( "strings" diff --git a/internal/data/autocomplete/labels.go b/internal/tui/components/cmp/labels.go similarity index 99% rename from internal/data/autocomplete/labels.go rename to internal/tui/components/cmp/labels.go index 93f6d29ab..3658b820b 100644 --- a/internal/data/autocomplete/labels.go +++ b/internal/tui/components/cmp/labels.go @@ -1,4 +1,4 @@ -package autocomplete +package cmp import ( "strings" diff --git a/internal/data/autocomplete/mentions.go b/internal/tui/components/cmp/mentions.go similarity index 99% rename from internal/data/autocomplete/mentions.go rename to internal/tui/components/cmp/mentions.go index b20a37b9c..6efed710a 100644 --- a/internal/data/autocomplete/mentions.go +++ b/internal/tui/components/cmp/mentions.go @@ -1,4 +1,4 @@ -package autocomplete +package cmp import ( "strings" diff --git a/internal/data/autocomplete/source.go b/internal/tui/components/cmp/source.go similarity index 96% rename from internal/data/autocomplete/source.go rename to internal/tui/components/cmp/source.go index 2559bccc4..c41d188c2 100644 --- a/internal/data/autocomplete/source.go +++ b/internal/tui/components/cmp/source.go @@ -1,4 +1,4 @@ -package autocomplete +package cmp import tea "charm.land/bubbletea/v2" diff --git a/internal/data/autocomplete/source_test.go b/internal/tui/components/cmp/source_test.go similarity index 99% rename from internal/data/autocomplete/source_test.go rename to internal/tui/components/cmp/source_test.go index 2676db6a7..41d2eea42 100644 --- a/internal/data/autocomplete/source_test.go +++ b/internal/tui/components/cmp/source_test.go @@ -1,4 +1,4 @@ -package autocomplete +package cmp import ( "testing" diff --git a/internal/data/autocomplete/utils.go b/internal/tui/components/cmp/utils.go similarity index 90% rename from internal/data/autocomplete/utils.go rename to internal/tui/components/cmp/utils.go index 6fea27afd..2c63014c7 100644 --- a/internal/data/autocomplete/utils.go +++ b/internal/tui/components/cmp/utils.go @@ -1,4 +1,4 @@ -package autocomplete +package cmp import ( "strings" diff --git a/internal/data/autocomplete/whitespace.go b/internal/tui/components/cmp/whitespace.go similarity index 99% rename from internal/data/autocomplete/whitespace.go rename to internal/tui/components/cmp/whitespace.go index cea5c4eca..8737a3bd6 100644 --- a/internal/data/autocomplete/whitespace.go +++ b/internal/tui/components/cmp/whitespace.go @@ -1,4 +1,4 @@ -package autocomplete +package cmp import ( "strings" diff --git a/internal/tui/components/detailedit/controller.go b/internal/tui/components/cmpcontroller/controller.go similarity index 81% rename from internal/tui/components/detailedit/controller.go rename to internal/tui/components/cmpcontroller/controller.go index a47b7a417..5bad06129 100644 --- a/internal/tui/components/detailedit/controller.go +++ b/internal/tui/components/cmpcontroller/controller.go @@ -1,4 +1,6 @@ -package detailedit +// Package cmpcontroller is used to load completions (e.g. from the network) +// for the various modes and using the cmp package to display them +package cmpcontroller import ( "strings" @@ -11,8 +13,7 @@ import ( "charm.land/lipgloss/v2" "github.com/dlvhdr/gh-dash/v4/internal/data" - dataautocomplete "github.com/dlvhdr/gh-dash/v4/internal/data/autocomplete" - popupautocomplete "github.com/dlvhdr/gh-dash/v4/internal/tui/components/autocomplete" + "github.com/dlvhdr/gh-dash/v4/internal/tui/components/cmp" "github.com/dlvhdr/gh-dash/v4/internal/tui/components/inputbox" "github.com/dlvhdr/gh-dash/v4/internal/tui/context" ) @@ -54,7 +55,7 @@ type EnterOptions struct { Mode Mode Prompt string InitialValue string - Source dataautocomplete.Source + Source cmp.Source Repo RepoRef SuggestionKind SuggestionKind EnterFetch FetchPolicy @@ -86,7 +87,7 @@ type RepoUsersFetchFailedMsg struct { type Controller struct { ctx *context.ProgramContext inputBox inputbox.Model - ac *popupautocomplete.Model + cmp *cmp.Model mode Mode prompt string repo RepoRef @@ -100,13 +101,13 @@ type Controller struct { func New(ctx *context.ProgramContext) Controller { inputBox := inputbox.NewModel(ctx) - ac := popupautocomplete.NewModel(ctx) - inputBox.SetAutocomplete(&ac) + cmp := cmp.NewModel(ctx) + inputBox.SetAutocomplete(&cmp) return Controller{ ctx: ctx, inputBox: inputBox, - ac: &ac, + cmp: &cmp, } } @@ -133,13 +134,13 @@ func (c Controller) View() string { func (c *Controller) SetWidth(width int) { c.inputBox.SetWidth(width) - c.ac.SetWidth(width - 4) + c.cmp.SetWidth(width - 4) } func (c *Controller) UpdateProgramContext(ctx *context.ProgramContext) { c.ctx = ctx c.inputBox.UpdateProgramContext(ctx) - c.ac.UpdateProgramContext(ctx) + c.cmp.UpdateProgramContext(ctx) } func (c Controller) Exit() Controller { @@ -176,7 +177,7 @@ func (c Controller) Enter(opts EnterOptions) (Controller, tea.Cmd) { case SuggestionUsers: if users, ok := data.CachedRepoUsers(opts.Repo.NameWithOwner); ok { c.repoUsers = users - c.ac.SetSuggestions(userSuggestions(users)) + c.cmp.SetSuggestions(userSuggestions(users)) c.showSuggestionsFromCurrentContext() } else if opts.EnterFetch != FetchNone { cmds = append([]tea.Cmd{c.fetchUsers(opts.EnterFetch == FetchWithLoading)}, cmds...) @@ -184,7 +185,7 @@ func (c Controller) Enter(opts EnterOptions) (Controller, tea.Cmd) { case SuggestionLabels: if labels, ok := data.CachedRepoLabels(opts.Repo.NameWithOwner); ok { c.repoLabels = labels - c.ac.SetSuggestions(labelSuggestions(labels)) + c.cmp.SetSuggestions(labelSuggestions(labels)) c.showSuggestionsFromCurrentContext() } else if opts.EnterFetch != FetchNone { cmds = append([]tea.Cmd{c.fetchLabels(opts.EnterFetch == FetchWithLoading)}, cmds...) @@ -211,29 +212,29 @@ func (c Controller) Update(msg tea.Msg) (Controller, tea.Cmd, *Submit, bool) { case RepoLabelsFetchedMsg: c.repoLabels = msg.Labels - c.ac.SetSuggestions(labelSuggestions(msg.Labels)) - cmds = append(cmds, c.ac.SetFetchSuccess()) + c.cmp.SetSuggestions(labelSuggestions(msg.Labels)) + cmds = append(cmds, c.cmp.SetFetchSuccess()) if c.mode == ModeLabel { c.showSuggestionsFromCurrentContext() } return c, tea.Batch(cmds...), nil, true case RepoLabelsFetchFailedMsg: - return c, c.ac.SetFetchError(msg.Err), nil, true + return c, c.cmp.SetFetchError(msg.Err), nil, true case RepoUsersFetchedMsg: c.repoUsers = msg.Users - c.ac.SetSuggestions(userSuggestions(msg.Users)) - cmds = append(cmds, c.ac.SetFetchSuccess()) + c.cmp.SetSuggestions(userSuggestions(msg.Users)) + cmds = append(cmds, c.cmp.SetFetchSuccess()) if c.mode == ModeComment || c.mode == ModeApprove || c.mode == ModeAssign { c.showSuggestionsFromCurrentContext() } return c, tea.Batch(cmds...), nil, true case RepoUsersFetchFailedMsg: - return c, c.ac.SetFetchError(msg.Err), nil, true + return c, c.cmp.SetFetchError(msg.Err), nil, true - case popupautocomplete.FetchSuggestionsRequestedMsg: + case cmp.FetchSuggestionsRequestedMsg: if !c.Active() || c.suggestionKind == SuggestionNone { return c, nil, nil, false } @@ -255,7 +256,7 @@ func (c Controller) Update(msg tea.Msg) (Controller, tea.Cmd, *Submit, bool) { } switch { - case key.Matches(msg, popupautocomplete.RefreshSuggestionsKey): + case key.Matches(msg, cmp.RefreshSuggestionsKey): if c.suggestionKind == SuggestionNone { return c, nil, nil, true } @@ -305,7 +306,7 @@ func (c Controller) Update(msg tea.Msg) (Controller, tea.Cmd, *Submit, bool) { } } - var previousContext dataautocomplete.Context + var previousContext cmp.Context if c.usesAutocomplete() { previousContext = c.inputBox.CurrentAutocompleteContext() } @@ -316,10 +317,10 @@ func (c Controller) Update(msg tea.Msg) (Controller, tea.Cmd, *Submit, bool) { if c.usesAutocomplete() { currentContext := c.inputBox.CurrentAutocompleteContext() if currentContext != previousContext { - if c.hideOnEmpty && currentContext == (dataautocomplete.Context{}) { - c.ac.Hide() + if c.hideOnEmpty && currentContext == (cmp.Context{}) { + c.cmp.Hide() } else { - c.ac.Show(currentContext.Content, c.inputBox.AutocompleteItemsToExclude()) + c.cmp.Show(currentContext.Content, c.inputBox.AutocompleteItemsToExclude()) } } } @@ -328,9 +329,9 @@ func (c Controller) Update(msg tea.Msg) (Controller, tea.Cmd, *Submit, bool) { } switch msg.(type) { - case spinner.TickMsg, popupautocomplete.ClearFetchStatusMsg: + case spinner.TickMsg, cmp.ClearFetchStatusMsg: var acCmd tea.Cmd - *c.ac, acCmd = c.ac.Update(msg) + *c.cmp, acCmd = c.cmp.Update(msg) return c, acCmd, nil, c.Active() || c.suggestionKind != SuggestionNone } @@ -363,9 +364,9 @@ func (c *Controller) setDiscardPrompt() { } func (c *Controller) resetAutocompleteState() { - c.ac.Reset() - c.ac.Hide() - c.ac.SetSuggestions(nil) + c.cmp.Reset() + c.cmp.Hide() + c.cmp.SetSuggestions(nil) } func (c Controller) showSuggestionsFromCurrentContext() { @@ -373,11 +374,11 @@ func (c Controller) showSuggestionsFromCurrentContext() { return } currentContext := c.inputBox.CurrentAutocompleteContext() - if c.hideOnEmpty && currentContext == (dataautocomplete.Context{}) { - c.ac.Hide() + if c.hideOnEmpty && currentContext == (cmp.Context{}) { + c.cmp.Hide() return } - c.ac.Show(currentContext.Content, c.inputBox.AutocompleteItemsToExclude()) + c.cmp.Show(currentContext.Content, c.inputBox.AutocompleteItemsToExclude()) } func (c Controller) usesAutocomplete() bool { @@ -392,7 +393,7 @@ func (c Controller) usesAutocomplete() bool { func (c Controller) fetchLabels(showLoading bool) tea.Cmd { var spinnerTickCmd tea.Cmd if showLoading { - spinnerTickCmd = c.ac.SetFetchLoading() + spinnerTickCmd = c.cmp.SetFetchLoading() } fetchCmd := func() tea.Msg { @@ -412,7 +413,7 @@ func (c Controller) fetchLabels(showLoading bool) tea.Cmd { func (c Controller) fetchUsers(showLoading bool) tea.Cmd { var spinnerTickCmd tea.Cmd if showLoading { - spinnerTickCmd = c.ac.SetFetchLoading() + spinnerTickCmd = c.cmp.SetFetchLoading() } fetchCmd := func() tea.Msg { @@ -429,10 +430,10 @@ func (c Controller) fetchUsers(showLoading bool) tea.Cmd { return fetchCmd } -func userSuggestions(users []data.User) []popupautocomplete.Suggestion { - suggestions := make([]popupautocomplete.Suggestion, 0, len(users)) +func userSuggestions(users []data.User) []cmp.Suggestion { + suggestions := make([]cmp.Suggestion, 0, len(users)) for _, user := range users { - suggestions = append(suggestions, popupautocomplete.Suggestion{ + suggestions = append(suggestions, cmp.Suggestion{ Value: user.Login, Detail: strings.TrimSpace(user.Name), }) @@ -440,10 +441,10 @@ func userSuggestions(users []data.User) []popupautocomplete.Suggestion { return suggestions } -func labelSuggestions(labels []data.Label) []popupautocomplete.Suggestion { - suggestions := make([]popupautocomplete.Suggestion, 0, len(labels)) +func labelSuggestions(labels []data.Label) []cmp.Suggestion { + suggestions := make([]cmp.Suggestion, 0, len(labels)) for _, label := range labels { - suggestions = append(suggestions, popupautocomplete.Suggestion{ + suggestions = append(suggestions, cmp.Suggestion{ Value: label.Name, Detail: strings.TrimSpace(label.Description), }) diff --git a/internal/tui/components/detailedit/controller_test.go b/internal/tui/components/cmpcontroller/controller_test.go similarity index 81% rename from internal/tui/components/detailedit/controller_test.go rename to internal/tui/components/cmpcontroller/controller_test.go index 0bac31467..8c726cd80 100644 --- a/internal/tui/components/detailedit/controller_test.go +++ b/internal/tui/components/cmpcontroller/controller_test.go @@ -1,4 +1,4 @@ -package detailedit +package cmpcontroller import ( "testing" @@ -8,8 +8,7 @@ import ( "github.com/dlvhdr/gh-dash/v4/internal/config" "github.com/dlvhdr/gh-dash/v4/internal/data" - dataautocomplete "github.com/dlvhdr/gh-dash/v4/internal/data/autocomplete" - popupautocomplete "github.com/dlvhdr/gh-dash/v4/internal/tui/components/autocomplete" + "github.com/dlvhdr/gh-dash/v4/internal/tui/components/cmp" "github.com/dlvhdr/gh-dash/v4/internal/tui/context" "github.com/dlvhdr/gh-dash/v4/internal/tui/theme" ) @@ -41,10 +40,10 @@ func testRepo() RepoRef { } } -func suggestions(values ...string) []popupautocomplete.Suggestion { - items := make([]popupautocomplete.Suggestion, 0, len(values)) +func suggestions(values ...string) []cmp.Suggestion { + items := make([]cmp.Suggestion, 0, len(values)) for _, value := range values { - items = append(items, popupautocomplete.Suggestion{Value: value}) + items = append(items, cmp.Suggestion{Value: value}) } return items } @@ -52,14 +51,14 @@ func suggestions(values ...string) []popupautocomplete.Suggestion { func TestEnterCommentModeResetsAutocompleteState(t *testing.T) { data.ClearUserCache() c := newTestController(t) - c.ac.SetSuggestions(suggestions("bug", "feature")) - c.ac.Show("bug", nil) - require.True(t, c.ac.HasSuggestions()) + c.cmp.SetSuggestions(suggestions("bug", "feature")) + c.cmp.Show("bug", nil) + require.True(t, c.cmp.HasSuggestions()) c, _ = c.Enter(EnterOptions{ Mode: ModeComment, Prompt: "comment", - Source: dataautocomplete.UserMentionSource{}, + Source: cmp.UserMentionSource{}, Repo: testRepo(), SuggestionKind: SuggestionUsers, EnterFetch: FetchNone, @@ -67,29 +66,29 @@ func TestEnterCommentModeResetsAutocompleteState(t *testing.T) { HideAutocompleteWhenContextEmpty: true, }) - require.False(t, c.ac.HasSuggestions()) - require.False(t, c.ac.IsVisible()) + require.False(t, c.cmp.HasSuggestions()) + require.False(t, c.cmp.IsVisible()) } func TestEnterAssignModeResetsAutocompleteState(t *testing.T) { data.ClearUserCache() c := newTestController(t) - c.ac.SetSuggestions(suggestions("bug", "feature")) - c.ac.Show("bug", nil) - require.True(t, c.ac.HasSuggestions()) + c.cmp.SetSuggestions(suggestions("bug", "feature")) + c.cmp.Show("bug", nil) + require.True(t, c.cmp.HasSuggestions()) c, _ = c.Enter(EnterOptions{ Mode: ModeAssign, Prompt: "assign", - Source: dataautocomplete.WhitespaceSource{}, + Source: cmp.WhitespaceSource{}, Repo: testRepo(), SuggestionKind: SuggestionUsers, EnterFetch: FetchNone, HideAutocompleteWhenContextEmpty: false, }) - require.False(t, c.ac.HasSuggestions()) - require.False(t, c.ac.IsVisible()) + require.False(t, c.cmp.HasSuggestions()) + require.False(t, c.cmp.IsVisible()) } func TestEnterLabelModePrepopulatesCurrentLabels(t *testing.T) { @@ -100,7 +99,7 @@ func TestEnterLabelModePrepopulatesCurrentLabels(t *testing.T) { Mode: ModeLabel, Prompt: "label", InitialValue: "bug, docs, ", - Source: dataautocomplete.LabelSource{}, + Source: cmp.LabelSource{}, Repo: testRepo(), SuggestionKind: SuggestionLabels, EnterFetch: FetchNone, @@ -115,7 +114,7 @@ func TestRepoUsersFetchedUpdatesControllerState(t *testing.T) { c, _ = c.Enter(EnterOptions{ Mode: ModeAssign, Prompt: "assign", - Source: dataautocomplete.WhitespaceSource{}, + Source: cmp.WhitespaceSource{}, Repo: testRepo(), SuggestionKind: SuggestionUsers, EnterFetch: FetchNone, @@ -128,7 +127,7 @@ func TestRepoUsersFetchedUpdatesControllerState(t *testing.T) { require.True(t, handled) require.Len(t, c.repoUsers, 1) require.Equal(t, "alice", c.repoUsers[0].Login) - require.True(t, c.ac.IsVisible()) + require.True(t, c.cmp.IsVisible()) } func TestRepoLabelsFetchedUpdatesControllerState(t *testing.T) { @@ -137,7 +136,7 @@ func TestRepoLabelsFetchedUpdatesControllerState(t *testing.T) { Mode: ModeLabel, Prompt: "label", InitialValue: "bu", - Source: dataautocomplete.LabelSource{}, + Source: cmp.LabelSource{}, Repo: testRepo(), SuggestionKind: SuggestionLabels, EnterFetch: FetchNone, @@ -150,7 +149,7 @@ func TestRepoLabelsFetchedUpdatesControllerState(t *testing.T) { require.True(t, handled) require.Len(t, c.repoLabels, 1) require.Equal(t, "bug", c.repoLabels[0].Name) - require.True(t, c.ac.IsVisible()) + require.True(t, c.cmp.IsVisible()) } func TestEnterSilentFetchReturnsCommand(t *testing.T) { @@ -160,7 +159,7 @@ func TestEnterSilentFetchReturnsCommand(t *testing.T) { _, cmd := c.Enter(EnterOptions{ Mode: ModeAssign, Prompt: "assign", - Source: dataautocomplete.WhitespaceSource{}, + Source: cmp.WhitespaceSource{}, Repo: testRepo(), SuggestionKind: SuggestionUsers, EnterFetch: FetchSilent, @@ -176,14 +175,14 @@ func TestForceRefreshClearsRelevantCache(t *testing.T) { c, _ = c.Enter(EnterOptions{ Mode: ModeLabel, Prompt: "label", - Source: dataautocomplete.LabelSource{}, + Source: cmp.LabelSource{}, Repo: testRepo(), SuggestionKind: SuggestionLabels, EnterFetch: FetchNone, HideAutocompleteWhenContextEmpty: false, }) - _, cmd, _, handled := c.Update(popupautocomplete.FetchSuggestionsRequestedMsg{Force: true}) + _, cmd, _, handled := c.Update(cmp.FetchSuggestionsRequestedMsg{Force: true}) require.True(t, handled) require.NotNil(t, cmd) } @@ -195,20 +194,20 @@ func TestCommentModeHidesPopupWhenMentionContextDisappears(t *testing.T) { Mode: ModeComment, Prompt: "comment", InitialValue: "@ali", - Source: dataautocomplete.UserMentionSource{}, + Source: cmp.UserMentionSource{}, Repo: testRepo(), SuggestionKind: SuggestionUsers, EnterFetch: FetchNone, ConfirmDiscardOnCancel: true, HideAutocompleteWhenContextEmpty: true, }) - c.ac.SetSuggestions(suggestions("alice")) + c.cmp.SetSuggestions(suggestions("alice")) c.showSuggestionsFromCurrentContext() - require.True(t, c.ac.IsVisible()) + require.True(t, c.cmp.IsVisible()) c.inputBox.SetValue("done") c.showSuggestionsFromCurrentContext() - require.False(t, c.ac.IsVisible()) + require.False(t, c.cmp.IsVisible()) } func TestCommentModeHidesPopupWhenMentionContextDisappearsWhitespace(t *testing.T) { @@ -218,18 +217,18 @@ func TestCommentModeHidesPopupWhenMentionContextDisappearsWhitespace(t *testing. Mode: ModeComment, Prompt: "comment", InitialValue: "@ali ", - Source: dataautocomplete.UserMentionSource{}, + Source: cmp.UserMentionSource{}, Repo: testRepo(), SuggestionKind: SuggestionUsers, EnterFetch: FetchNone, ConfirmDiscardOnCancel: true, HideAutocompleteWhenContextEmpty: true, }) - c.ac.SetSuggestions(suggestions("alice")) + c.cmp.SetSuggestions(suggestions("alice")) c.Update(c.inputBox.Focus()) c.inputBox.CursorEnd() c.showSuggestionsFromCurrentContext() - require.False(t, c.ac.IsVisible()) + require.False(t, c.cmp.IsVisible()) } func TestCommentModeShowsPopupForBareAtMention(t *testing.T) { @@ -238,18 +237,18 @@ func TestCommentModeShowsPopupForBareAtMention(t *testing.T) { c, _ = c.Enter(EnterOptions{ Mode: ModeComment, Prompt: "comment", - Source: dataautocomplete.UserMentionSource{}, + Source: cmp.UserMentionSource{}, Repo: testRepo(), SuggestionKind: SuggestionUsers, EnterFetch: FetchNone, ConfirmDiscardOnCancel: true, HideAutocompleteWhenContextEmpty: true, }) - c.ac.SetSuggestions(suggestions("alice")) + c.cmp.SetSuggestions(suggestions("alice")) c, _, _, handled := c.Update(tea.KeyPressMsg{Text: "@"}) require.True(t, handled) - require.True(t, c.ac.IsVisible()) + require.True(t, c.cmp.IsVisible()) } func TestAssignModeShowsPopupForEmptyContext(t *testing.T) { @@ -259,16 +258,16 @@ func TestAssignModeShowsPopupForEmptyContext(t *testing.T) { Mode: ModeAssign, Prompt: "assign", InitialValue: "", - Source: dataautocomplete.WhitespaceSource{}, + Source: cmp.WhitespaceSource{}, Repo: testRepo(), SuggestionKind: SuggestionUsers, EnterFetch: FetchNone, HideAutocompleteWhenContextEmpty: false, }) - c.ac.SetSuggestions(suggestions("alice")) + c.cmp.SetSuggestions(suggestions("alice")) c.showSuggestionsFromCurrentContext() - require.True(t, c.ac.IsVisible()) + require.True(t, c.cmp.IsVisible()) } func TestEscapeInCommentModeShowsDiscardPrompt(t *testing.T) { @@ -276,7 +275,7 @@ func TestEscapeInCommentModeShowsDiscardPrompt(t *testing.T) { c, _ = c.Enter(EnterOptions{ Mode: ModeComment, Prompt: "comment", - Source: dataautocomplete.UserMentionSource{}, + Source: cmp.UserMentionSource{}, Repo: testRepo(), SuggestionKind: SuggestionUsers, EnterFetch: FetchNone, @@ -294,7 +293,7 @@ func TestConfirmDiscardExitsMode(t *testing.T) { c, _ = c.Enter(EnterOptions{ Mode: ModeApprove, Prompt: "approve", - Source: dataautocomplete.WhitespaceSource{}, + Source: cmp.WhitespaceSource{}, Repo: testRepo(), SuggestionKind: SuggestionUsers, EnterFetch: FetchNone, @@ -313,7 +312,7 @@ func TestRejectDiscardRestoresPrompt(t *testing.T) { c, _ = c.Enter(EnterOptions{ Mode: ModeComment, Prompt: "comment", - Source: dataautocomplete.UserMentionSource{}, + Source: cmp.UserMentionSource{}, Repo: testRepo(), SuggestionKind: SuggestionUsers, EnterFetch: FetchNone, @@ -333,7 +332,7 @@ func TestCtrlDReturnsSubmit(t *testing.T) { Mode: ModeAssign, Prompt: "assign", InitialValue: "alice bob", - Source: dataautocomplete.WhitespaceSource{}, + Source: cmp.WhitespaceSource{}, Repo: testRepo(), SuggestionKind: SuggestionUsers, EnterFetch: FetchNone, @@ -366,7 +365,7 @@ func TestPasteInCommentMode(t *testing.T) { c, _ = c.Enter(EnterOptions{ Mode: ModeComment, Prompt: "comment", - Source: dataautocomplete.UserMentionSource{}, + Source: cmp.UserMentionSource{}, Repo: testRepo(), SuggestionKind: SuggestionUsers, EnterFetch: FetchNone, @@ -388,7 +387,7 @@ func TestPasteInAssignMode(t *testing.T) { c, _ = c.Enter(EnterOptions{ Mode: ModeAssign, Prompt: "assign", - Source: dataautocomplete.WhitespaceSource{}, + Source: cmp.WhitespaceSource{}, Repo: testRepo(), SuggestionKind: SuggestionUsers, EnterFetch: FetchNone, diff --git a/internal/tui/components/inputbox/inputbox.go b/internal/tui/components/inputbox/inputbox.go index 38bc6e924..6e87aec0f 100644 --- a/internal/tui/components/inputbox/inputbox.go +++ b/internal/tui/components/inputbox/inputbox.go @@ -9,24 +9,23 @@ import ( tea "charm.land/bubbletea/v2" "charm.land/lipgloss/v2" - dataautocomplete "github.com/dlvhdr/gh-dash/v4/internal/data/autocomplete" - "github.com/dlvhdr/gh-dash/v4/internal/tui/components/autocomplete" + "github.com/dlvhdr/gh-dash/v4/internal/tui/components/cmp" "github.com/dlvhdr/gh-dash/v4/internal/tui/context" ) type Model struct { - ctx *context.ProgramContext - textArea textarea.Model - inputHelp help.Model - prompt string - autocomplete *autocomplete.Model - autocompleteSource dataautocomplete.Source + ctx *context.ProgramContext + textArea textarea.Model + inputHelp help.Model + prompt string + cmp *cmp.Model + cmpSource cmp.Source } var inputKeys = []key.Binding{ key.NewBinding(key.WithKeys("ctrl+d"), key.WithHelp("Ctrl+d", "submit")), key.NewBinding(key.WithKeys("ctrl+c", "esc"), key.WithHelp("Ctrl+c/esc", "cancel")), - autocomplete.ToggleSuggestions, + cmp.ToggleSuggestions, } func NewModel(ctx *context.ProgramContext) Model { @@ -59,28 +58,28 @@ func NewModel(ctx *context.ProgramContext) Model { } } -func (m *Model) SetAutocomplete(ac *autocomplete.Model) { - m.autocomplete = ac +func (m *Model) SetAutocomplete(cmp *cmp.Model) { + m.cmp = cmp } -func (m *Model) SetAutocompleteSource(src dataautocomplete.Source) { - m.autocompleteSource = src +func (m *Model) SetAutocompleteSource(src cmp.Source) { + m.cmpSource = src } -func (m Model) CurrentAutocompleteContext() dataautocomplete.Context { - if m.autocompleteSource == nil { - return dataautocomplete.Context{} +func (m Model) CurrentAutocompleteContext() cmp.Context { + if m.cmpSource == nil { + return cmp.Context{} } - return m.autocompleteSource.ExtractContext(m.textArea.Value(), m.GetAbsoluteCursorPosition()) + return m.cmpSource.ExtractContext(m.textArea.Value(), m.GetAbsoluteCursorPosition()) } func (m Model) AutocompleteItemsToExclude() []string { - if m.autocompleteSource == nil { + if m.cmpSource == nil { return nil } - return m.autocompleteSource.ItemsToExclude(m.textArea.Value(), m.GetAbsoluteCursorPosition()) + return m.cmpSource.ItemsToExclude(m.textArea.Value(), m.GetAbsoluteCursorPosition()) } func (m Model) Update(msg tea.Msg) (Model, tea.Cmd) { @@ -89,34 +88,34 @@ func (m Model) Update(msg tea.Msg) (Model, tea.Cmd) { switch msg := msg.(type) { case tea.KeyMsg: // Allow toggling suggestions at any time - if m.autocomplete != nil && key.Matches(msg, autocomplete.ToggleSuggestions) { - if m.autocomplete.IsVisible() { - m.autocomplete.Suppress() + if m.cmp != nil && key.Matches(msg, cmp.ToggleSuggestions) { + if m.cmp.IsVisible() { + m.cmp.Suppress() return m, nil } - m.autocomplete.Unsuppress() + m.cmp.Unsuppress() currentContext := m.CurrentAutocompleteContext() - m.autocomplete.Show(currentContext.Content, m.AutocompleteItemsToExclude()) + m.cmp.Show(currentContext.Content, m.AutocompleteItemsToExclude()) return m, nil } // Allow navigation/selection even if the popup is hidden (as long as there are filtered results) - if m.autocomplete != nil && - (m.autocomplete.IsVisible() || m.autocomplete.HasSuggestions()) { + if m.cmp != nil && + (m.cmp.IsVisible() || m.cmp.HasSuggestions()) { switch { - case key.Matches(msg, autocomplete.PrevKey): - m.autocomplete.Prev() + case key.Matches(msg, cmp.PrevKey): + m.cmp.Prev() return m, nil - case key.Matches(msg, autocomplete.NextKey): - m.autocomplete.Next() + case key.Matches(msg, cmp.NextKey): + m.cmp.Next() return m, nil - case m.autocomplete.Selected() != "" && key.Matches(msg, autocomplete.SelectKey): - selected := m.autocomplete.Selected() - if selected != "" && m.autocompleteSource != nil { + case m.cmp.Selected() != "" && key.Matches(msg, cmp.SelectKey): + selected := m.cmp.Selected() + if selected != "" && m.cmpSource != nil { currentValue := m.textArea.Value() currentContext := m.CurrentAutocompleteContext() - newValue, newCursorPos := m.autocompleteSource.InsertSuggestion( + newValue, newCursorPos := m.cmpSource.InsertSuggestion( currentValue, selected, currentContext.Start, @@ -124,10 +123,10 @@ func (m Model) Update(msg tea.Msg) (Model, tea.Cmd) { ) m.textArea.SetValue(newValue) m.textArea.SetCursorColumn(newCursorPos.X) - // Refresh autocomplete to exclude the newly-added item + // Refresh cmp to exclude the newly-added item if m.AutocompleteItemsToExclude() != nil { newContext := m.CurrentAutocompleteContext() - m.autocomplete.Show(newContext.Content, m.AutocompleteItemsToExclude()) + m.cmp.Show(newContext.Content, m.AutocompleteItemsToExclude()) } } return m, nil @@ -158,9 +157,9 @@ func (m Model) View() string { } func (m Model) ViewWithAutocomplete() string { - autocompleteView := "" - if m.autocomplete != nil && m.autocomplete.IsVisible() { - autocompleteView = m.autocomplete.View() + cmpView := "" + if m.cmp != nil && m.cmp.IsVisible() { + cmpView = m.cmp.View() } return lipgloss.NewStyle(). @@ -173,7 +172,7 @@ func (m Model) ViewWithAutocomplete() string { lipgloss.Left, fmt.Sprintf("%s\n", m.prompt), m.textArea.View(), - autocompleteView, + cmpView, lipgloss.NewStyle(). MarginTop(1). Render(m.inputHelp.ShortHelpView(inputKeys)), diff --git a/internal/tui/components/issueview/issueview.go b/internal/tui/components/issueview/issueview.go index e9937ca35..99131c836 100644 --- a/internal/tui/components/issueview/issueview.go +++ b/internal/tui/components/issueview/issueview.go @@ -11,9 +11,9 @@ import ( "charm.land/lipgloss/v2" "github.com/dlvhdr/gh-dash/v4/internal/data" - dataautocomplete "github.com/dlvhdr/gh-dash/v4/internal/data/autocomplete" "github.com/dlvhdr/gh-dash/v4/internal/tui/common" - "github.com/dlvhdr/gh-dash/v4/internal/tui/components/detailedit" + "github.com/dlvhdr/gh-dash/v4/internal/tui/components/cmp" + "github.com/dlvhdr/gh-dash/v4/internal/tui/components/cmpcontroller" "github.com/dlvhdr/gh-dash/v4/internal/tui/components/issuerow" "github.com/dlvhdr/gh-dash/v4/internal/tui/components/issuessection" "github.com/dlvhdr/gh-dash/v4/internal/tui/components/tasks" @@ -34,13 +34,13 @@ type Model struct { issue *issuerow.Issue sectionId int width int - editor detailedit.Controller + editor cmpcontroller.Controller } func NewModel(ctx *context.ProgramContext) Model { return Model{ issue: nil, - editor: detailedit.New(ctx), + editor: cmpcontroller.New(ctx), } } @@ -56,28 +56,28 @@ func (m Model) Update(msg tea.Msg) (Model, tea.Cmd, *IssueAction) { sid := tasks.SectionIdentifier{Id: m.sectionId, Type: issuessection.SectionType} switch submit.Mode { - case detailedit.ModeComment: + case cmpcontroller.ModeComment: if len(strings.TrimSpace(submit.Value)) != 0 { return m, tasks.CommentOnIssue(m.ctx, sid, m.issue.Data, submit.Value), nil } return m, nil, nil - case detailedit.ModeAssign: - usernames := dataautocomplete.AllWords(submit.Value) + case cmpcontroller.ModeAssign: + usernames := cmp.AllWords(submit.Value) if len(usernames) > 0 { return m, tasks.AssignIssue(m.ctx, sid, m.issue.Data, usernames), nil } return m, nil, nil - case detailedit.ModeUnassign: - usernames := dataautocomplete.AllWords(submit.Value) + case cmpcontroller.ModeUnassign: + usernames := cmp.AllWords(submit.Value) if len(usernames) > 0 { return m, tasks.UnassignIssue(m.ctx, sid, m.issue.Data, usernames), nil } return m, nil, nil - case detailedit.ModeLabel: - labels := dataautocomplete.CurrentLabels(submit.Value) + case cmpcontroller.ModeLabel: + labels := cmp.CurrentLabels(submit.Value) if len(labels) > 0 || len(m.issue.Data.Labels.Nodes) > 0 { return m, tasks.LabelIssue( m.ctx, @@ -257,7 +257,7 @@ func (m *Model) IsTextInputBoxFocused() bool { } func (m *Model) GetIsCommenting() bool { - return m.editor.Mode() == detailedit.ModeComment + return m.editor.Mode() == cmpcontroller.ModeComment } func (m *Model) SetIsCommenting(isCommenting bool) tea.Cmd { @@ -266,19 +266,19 @@ func (m *Model) SetIsCommenting(isCommenting bool) tea.Cmd { } if !isCommenting { - if m.editor.Mode() == detailedit.ModeComment { + if m.editor.Mode() == cmpcontroller.ModeComment { m.editor = m.editor.Exit() } return nil } - editor, cmd := m.editor.Enter(detailedit.EnterOptions{ - Mode: detailedit.ModeComment, + editor, cmd := m.editor.Enter(cmpcontroller.EnterOptions{ + Mode: cmpcontroller.ModeComment, Prompt: constants.CommentPrompt, - Source: dataautocomplete.UserMentionSource{}, + Source: cmp.UserMentionSource{}, Repo: m.repoRef(), - SuggestionKind: detailedit.SuggestionUsers, - EnterFetch: detailedit.FetchSilent, + SuggestionKind: cmpcontroller.SuggestionUsers, + EnterFetch: cmpcontroller.FetchSilent, ConfirmDiscardOnCancel: true, HideAutocompleteWhenContextEmpty: true, }) @@ -287,7 +287,7 @@ func (m *Model) SetIsCommenting(isCommenting bool) tea.Cmd { } func (m *Model) GetIsAssigning() bool { - return m.editor.Mode() == detailedit.ModeAssign + return m.editor.Mode() == cmpcontroller.ModeAssign } func (m *Model) SetIsAssigning(isAssigning bool) tea.Cmd { @@ -296,7 +296,7 @@ func (m *Model) SetIsAssigning(isAssigning bool) tea.Cmd { } if !isAssigning { - if m.editor.Mode() == detailedit.ModeAssign { + if m.editor.Mode() == cmpcontroller.ModeAssign { m.editor = m.editor.Exit() } return nil @@ -307,14 +307,14 @@ func (m *Model) SetIsAssigning(isAssigning bool) tea.Cmd { initialValue = m.ctx.User } - editor, cmd := m.editor.Enter(detailedit.EnterOptions{ - Mode: detailedit.ModeAssign, + editor, cmd := m.editor.Enter(cmpcontroller.EnterOptions{ + Mode: cmpcontroller.ModeAssign, Prompt: constants.AssignPrompt, InitialValue: initialValue, - Source: dataautocomplete.WhitespaceSource{}, + Source: cmp.WhitespaceSource{}, Repo: m.repoRef(), - SuggestionKind: detailedit.SuggestionUsers, - EnterFetch: detailedit.FetchSilent, + SuggestionKind: cmpcontroller.SuggestionUsers, + EnterFetch: cmpcontroller.FetchSilent, HideAutocompleteWhenContextEmpty: false, }) m.editor = editor @@ -327,7 +327,7 @@ func (m *Model) SetIsLabeling(isLabeling bool) tea.Cmd { } if !isLabeling { - if m.editor.Mode() == detailedit.ModeLabel { + if m.editor.Mode() == cmpcontroller.ModeLabel { m.editor = m.editor.Exit() } return nil @@ -339,14 +339,14 @@ func (m *Model) SetIsLabeling(isLabeling bool) tea.Cmd { } labels = append(labels, "") - editor, cmd := m.editor.Enter(detailedit.EnterOptions{ - Mode: detailedit.ModeLabel, + editor, cmd := m.editor.Enter(cmpcontroller.EnterOptions{ + Mode: cmpcontroller.ModeLabel, Prompt: constants.LabelPrompt, InitialValue: strings.Join(labels, ", "), - Source: dataautocomplete.LabelSource{}, + Source: cmp.LabelSource{}, Repo: m.repoRef(), - SuggestionKind: detailedit.SuggestionLabels, - EnterFetch: detailedit.FetchSilent, + SuggestionKind: cmpcontroller.SuggestionLabels, + EnterFetch: cmpcontroller.FetchSilent, HideAutocompleteWhenContextEmpty: false, }) m.editor = editor @@ -363,7 +363,7 @@ func (m *Model) userAssignedToIssue(login string) bool { } func (m *Model) GetIsUnassigning() bool { - return m.editor.Mode() == detailedit.ModeUnassign + return m.editor.Mode() == cmpcontroller.ModeUnassign } func (m *Model) SetIsUnassigning(isUnassigning bool) tea.Cmd { @@ -372,14 +372,14 @@ func (m *Model) SetIsUnassigning(isUnassigning bool) tea.Cmd { } if !isUnassigning { - if m.editor.Mode() == detailedit.ModeUnassign { + if m.editor.Mode() == cmpcontroller.ModeUnassign { m.editor = m.editor.Exit() } return nil } - editor, cmd := m.editor.Enter(detailedit.EnterOptions{ - Mode: detailedit.ModeUnassign, + editor, cmd := m.editor.Enter(cmpcontroller.EnterOptions{ + Mode: cmpcontroller.ModeUnassign, Prompt: constants.UnassignPrompt, InitialValue: strings.Join(m.issueAssignees(), "\n"), Repo: m.repoRef(), @@ -401,9 +401,9 @@ func (m *Model) UpdateProgramContext(ctx *context.ProgramContext) { m.editor.UpdateProgramContext(ctx) } -func (m *Model) repoRef() detailedit.RepoRef { +func (m *Model) repoRef() cmpcontroller.RepoRef { owner, repo := m.issue.Data.GetRepoNameAndOwner() - return detailedit.RepoRef{ + return cmpcontroller.RepoRef{ NameWithOwner: m.issue.Data.GetRepoNameWithOwner(), Owner: owner, Name: repo, diff --git a/internal/tui/components/prview/prview.go b/internal/tui/components/prview/prview.go index e0581c5c2..0094b2a0f 100644 --- a/internal/tui/components/prview/prview.go +++ b/internal/tui/components/prview/prview.go @@ -11,10 +11,10 @@ import ( "charm.land/lipgloss/v2" "github.com/dlvhdr/gh-dash/v4/internal/data" - dataautocomplete "github.com/dlvhdr/gh-dash/v4/internal/data/autocomplete" "github.com/dlvhdr/gh-dash/v4/internal/tui/common" "github.com/dlvhdr/gh-dash/v4/internal/tui/components/carousel" - "github.com/dlvhdr/gh-dash/v4/internal/tui/components/detailedit" + "github.com/dlvhdr/gh-dash/v4/internal/tui/components/cmp" + "github.com/dlvhdr/gh-dash/v4/internal/tui/components/cmpcontroller" "github.com/dlvhdr/gh-dash/v4/internal/tui/components/prrow" "github.com/dlvhdr/gh-dash/v4/internal/tui/components/prssection" "github.com/dlvhdr/gh-dash/v4/internal/tui/components/tasks" @@ -37,7 +37,7 @@ type Model struct { pr *prrow.PullRequest width int carousel carousel.Model - editor detailedit.Controller + editor cmpcontroller.Controller summaryViewMore bool } @@ -52,7 +52,7 @@ func NewModel(ctx *context.ProgramContext) Model { return Model{ pr: nil, carousel: c, - editor: detailedit.New(ctx), + editor: cmpcontroller.New(ctx), } } @@ -68,35 +68,35 @@ func (m Model) Update(msg tea.Msg) (Model, tea.Cmd) { sid := tasks.SectionIdentifier{Id: m.sectionId, Type: prssection.SectionType} switch submit.Mode { - case detailedit.ModeComment: + case cmpcontroller.ModeComment: if len(strings.TrimSpace(submit.Value)) != 0 { return m, tasks.CommentOnPR(m.ctx, sid, m.pr.Data.Primary, submit.Value) } return m, nil - case detailedit.ModeApprove: + case cmpcontroller.ModeApprove: comment := "" if len(strings.TrimSpace(submit.Value)) != 0 { comment = submit.Value } return m, tasks.ApprovePR(m.ctx, sid, m.pr.Data.Primary, comment) - case detailedit.ModeAssign: - usernames := dataautocomplete.AllWords(submit.Value) + case cmpcontroller.ModeAssign: + usernames := cmp.AllWords(submit.Value) if len(usernames) > 0 { return m, tasks.AssignPR(m.ctx, sid, m.pr.Data.Primary, usernames) } return m, nil - case detailedit.ModeUnassign: - usernames := dataautocomplete.AllWords(submit.Value) + case cmpcontroller.ModeUnassign: + usernames := cmp.AllWords(submit.Value) if len(usernames) > 0 { return m, tasks.UnassignPR(m.ctx, sid, m.pr.Data.Primary, usernames) } return m, nil - case detailedit.ModeLabel: - labels := dataautocomplete.CurrentLabels(submit.Value) + case cmpcontroller.ModeLabel: + labels := cmp.CurrentLabels(submit.Value) if len(labels) > 0 || len(m.pr.Data.Primary.Labels.Nodes) > 0 { return m, m.label(labels) } @@ -557,7 +557,7 @@ func (m *Model) IsTextInputBoxFocused() bool { } func (m *Model) GetIsCommenting() bool { - return m.editor.Mode() == detailedit.ModeComment + return m.editor.Mode() == cmpcontroller.ModeComment } func (m *Model) UpdateProgramContext(ctx *context.ProgramContext) { @@ -577,19 +577,19 @@ func (m *Model) SetIsCommenting(isCommenting bool) tea.Cmd { } if !isCommenting { - if m.editor.Mode() == detailedit.ModeComment { + if m.editor.Mode() == cmpcontroller.ModeComment { m.editor = m.editor.Exit() } return nil } - editor, cmd := m.editor.Enter(detailedit.EnterOptions{ - Mode: detailedit.ModeComment, + editor, cmd := m.editor.Enter(cmpcontroller.EnterOptions{ + Mode: cmpcontroller.ModeComment, Prompt: constants.CommentPrompt, - Source: dataautocomplete.UserMentionSource{}, + Source: cmp.UserMentionSource{}, Repo: m.repoRef(), - SuggestionKind: detailedit.SuggestionUsers, - EnterFetch: detailedit.FetchSilent, + SuggestionKind: cmpcontroller.SuggestionUsers, + EnterFetch: cmpcontroller.FetchSilent, ConfirmDiscardOnCancel: true, HideAutocompleteWhenContextEmpty: true, }) @@ -602,7 +602,7 @@ func (m *Model) getIndentedContentWidth() int { } func (m *Model) GetIsApproving() bool { - return m.editor.Mode() == detailedit.ModeApprove + return m.editor.Mode() == cmpcontroller.ModeApprove } func (m *Model) SetIsApproving(isApproving bool) tea.Cmd { @@ -611,20 +611,20 @@ func (m *Model) SetIsApproving(isApproving bool) tea.Cmd { } if !isApproving { - if m.editor.Mode() == detailedit.ModeApprove { + if m.editor.Mode() == cmpcontroller.ModeApprove { m.editor = m.editor.Exit() } return nil } - editor, cmd := m.editor.Enter(detailedit.EnterOptions{ - Mode: detailedit.ModeApprove, + editor, cmd := m.editor.Enter(cmpcontroller.EnterOptions{ + Mode: cmpcontroller.ModeApprove, Prompt: constants.ApprovalPrompt, InitialValue: m.ctx.Config.Defaults.PrApproveComment, - Source: dataautocomplete.WhitespaceSource{}, + Source: cmp.WhitespaceSource{}, Repo: m.repoRef(), - SuggestionKind: detailedit.SuggestionUsers, - EnterFetch: detailedit.FetchSilent, + SuggestionKind: cmpcontroller.SuggestionUsers, + EnterFetch: cmpcontroller.FetchSilent, ConfirmDiscardOnCancel: true, HideAutocompleteWhenContextEmpty: false, }) @@ -633,7 +633,7 @@ func (m *Model) SetIsApproving(isApproving bool) tea.Cmd { } func (m *Model) GetIsAssigning() bool { - return m.editor.Mode() == detailedit.ModeAssign + return m.editor.Mode() == cmpcontroller.ModeAssign } func (m *Model) SetIsAssigning(isAssigning bool) tea.Cmd { @@ -642,7 +642,7 @@ func (m *Model) SetIsAssigning(isAssigning bool) tea.Cmd { } if !isAssigning { - if m.editor.Mode() == detailedit.ModeAssign { + if m.editor.Mode() == cmpcontroller.ModeAssign { m.editor = m.editor.Exit() } return nil @@ -653,14 +653,14 @@ func (m *Model) SetIsAssigning(isAssigning bool) tea.Cmd { initialValue = m.ctx.User } - editor, cmd := m.editor.Enter(detailedit.EnterOptions{ - Mode: detailedit.ModeAssign, + editor, cmd := m.editor.Enter(cmpcontroller.EnterOptions{ + Mode: cmpcontroller.ModeAssign, Prompt: constants.AssignPrompt, InitialValue: initialValue, - Source: dataautocomplete.WhitespaceSource{}, + Source: cmp.WhitespaceSource{}, Repo: m.repoRef(), - SuggestionKind: detailedit.SuggestionUsers, - EnterFetch: detailedit.FetchSilent, + SuggestionKind: cmpcontroller.SuggestionUsers, + EnterFetch: cmpcontroller.FetchSilent, HideAutocompleteWhenContextEmpty: false, }) m.editor = editor @@ -677,7 +677,7 @@ func (m *Model) userAssignedToPr(login string) bool { } func (m *Model) GetIsUnassigning() bool { - return m.editor.Mode() == detailedit.ModeUnassign + return m.editor.Mode() == cmpcontroller.ModeUnassign } func (m *Model) SetIsUnassigning(isUnassigning bool) tea.Cmd { @@ -686,14 +686,14 @@ func (m *Model) SetIsUnassigning(isUnassigning bool) tea.Cmd { } if !isUnassigning { - if m.editor.Mode() == detailedit.ModeUnassign { + if m.editor.Mode() == cmpcontroller.ModeUnassign { m.editor = m.editor.Exit() } return nil } - editor, cmd := m.editor.Enter(detailedit.EnterOptions{ - Mode: detailedit.ModeUnassign, + editor, cmd := m.editor.Enter(cmpcontroller.EnterOptions{ + Mode: cmpcontroller.ModeUnassign, Prompt: constants.UnassignPrompt, InitialValue: strings.Join(m.prAssignees(), "\n"), Repo: m.repoRef(), @@ -738,7 +738,7 @@ func (m *Model) SetEnrichedPR(data data.EnrichedPullRequestData) { } func (m *Model) GetIsLabeling() bool { - return m.editor.Mode() == detailedit.ModeLabel + return m.editor.Mode() == cmpcontroller.ModeLabel } // SetIsLabeling enters or exits labeling mode @@ -748,7 +748,7 @@ func (m *Model) SetIsLabeling(isLabeling bool) tea.Cmd { } if !isLabeling { - if m.editor.Mode() == detailedit.ModeLabel { + if m.editor.Mode() == cmpcontroller.ModeLabel { m.editor = m.editor.Exit() } return nil @@ -760,23 +760,23 @@ func (m *Model) SetIsLabeling(isLabeling bool) tea.Cmd { } labels = append(labels, "") - editor, cmd := m.editor.Enter(detailedit.EnterOptions{ - Mode: detailedit.ModeLabel, + editor, cmd := m.editor.Enter(cmpcontroller.EnterOptions{ + Mode: cmpcontroller.ModeLabel, Prompt: constants.LabelPrompt, InitialValue: strings.Join(labels, ", "), - Source: dataautocomplete.LabelSource{}, + Source: cmp.LabelSource{}, Repo: m.repoRef(), - SuggestionKind: detailedit.SuggestionLabels, - EnterFetch: detailedit.FetchSilent, + SuggestionKind: cmpcontroller.SuggestionLabels, + EnterFetch: cmpcontroller.FetchSilent, HideAutocompleteWhenContextEmpty: false, }) m.editor = editor return cmd } -func (m *Model) repoRef() detailedit.RepoRef { +func (m *Model) repoRef() cmpcontroller.RepoRef { owner, repo := m.pr.Data.Primary.GetRepoNameAndOwner() - return detailedit.RepoRef{ + return cmpcontroller.RepoRef{ NameWithOwner: m.pr.Data.Primary.GetRepoNameWithOwner(), Owner: owner, Name: repo, diff --git a/internal/tui/components/search/search.go b/internal/tui/components/search/search.go index e5872a296..2cc665966 100644 --- a/internal/tui/components/search/search.go +++ b/internal/tui/components/search/search.go @@ -7,6 +7,7 @@ import ( tea "charm.land/bubbletea/v2" "charm.land/lipgloss/v2" + "github.com/dlvhdr/gh-dash/v4/internal/tui/components/cmp" "github.com/dlvhdr/gh-dash/v4/internal/tui/context" ) @@ -14,6 +15,7 @@ type Model struct { ctx *context.ProgramContext initialValue string textInput textinput.Model + cmp *cmp.Model } type SearchOptions struct {