Skip to content

Commit 85c30ee

Browse files
authored
feat: select child resources based on parent key (#31)
* add new text input mmodel * add new input step to project model, update wizard step to handle that update * add note about error handling; * remove debugging stmt * store projects in memory so we can mimic adding new ones * refetch projects if we go back to that step from environment step * make fetching resources more generic * fetch environments based on project selected * fetch flags based on environment selected
1 parent fbc9d0f commit 85c30ee

4 files changed

Lines changed: 140 additions & 22 deletions

File tree

internal/setup/environments.go

Lines changed: 44 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,14 @@ type environment struct {
2626
func (p environment) FilterValue() string { return "" }
2727

2828
type environmentModel struct {
29-
choice string
30-
err error
31-
list list.Model
29+
choice string
30+
err error
31+
list list.Model
32+
parentKey string
3233
}
3334

34-
func NewEnvironment() tea.Model {
35-
environments := []environment{
35+
var environments = map[string][]environment{
36+
"proj1": {
3637
{
3738
Key: "env1",
3839
Name: "environment 1",
@@ -41,9 +42,38 @@ func NewEnvironment() tea.Model {
4142
Key: "env2",
4243
Name: "environment 2",
4344
},
44-
}
45+
},
46+
"proj2": {
47+
{
48+
Key: "env3",
49+
Name: "environment 3",
50+
},
51+
{
52+
Key: "env4",
53+
Name: "environment 4",
54+
},
55+
},
56+
"proj3": {
57+
{
58+
Key: "env5",
59+
Name: "environment 5",
60+
},
61+
{
62+
Key: "env6",
63+
Name: "environment 6",
64+
},
65+
},
66+
}
4567

46-
l := list.New(environmentsToItems(environments), envDelegate{}, 30, 14)
68+
func getEnvironments(projKey string) ([]environment, error) {
69+
envList := environments[projKey]
70+
createNewOption := environment{Key: CreateNewResourceKey, Name: "Create a new environment"}
71+
envList = append(envList, createNewOption)
72+
return envList, nil
73+
}
74+
75+
func NewEnvironment() tea.Model {
76+
l := list.New(nil, envDelegate{}, 30, 14)
4777
l.Title = "Select an environment"
4878
l.SetShowStatusBar(false)
4979
l.SetFilteringEnabled(false)
@@ -57,10 +87,16 @@ func (p environmentModel) Init() tea.Cmd {
5787
return nil
5888
}
5989

60-
// This method has drifted from the ProjectModel's version, but it should do something similar.
6190
func (m environmentModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
6291
var cmd tea.Cmd
6392
switch msg := msg.(type) {
93+
case fetchResources:
94+
envs, err := getEnvironments(m.parentKey)
95+
if err != nil {
96+
m.err = err
97+
return m, nil
98+
}
99+
m.list.SetItems(environmentsToItems(envs))
64100
case tea.KeyMsg:
65101
switch {
66102
case key.Matches(msg, keys.Enter):

internal/setup/flags.go

Lines changed: 74 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,14 @@ type flag struct {
2626
func (p flag) FilterValue() string { return "" }
2727

2828
type flagModel struct {
29-
choice string
30-
err error
31-
list list.Model
29+
choice string
30+
err error
31+
list list.Model
32+
parentKey string
3233
}
3334

34-
func NewFlag() tea.Model {
35-
flags := []flag{
35+
var flags = map[string][]flag{
36+
"env1": {
3637
{
3738
Key: "flag1",
3839
Name: "flag 1",
@@ -41,9 +42,61 @@ func NewFlag() tea.Model {
4142
Key: "flag2",
4243
Name: "flag 2",
4344
},
44-
}
45+
},
46+
"env2": {
47+
{
48+
Key: "flag3",
49+
Name: "flag 3",
50+
},
51+
{
52+
Key: "flag4",
53+
Name: "flag 4",
54+
},
55+
},
56+
"env3": {
57+
{
58+
Key: "flag5",
59+
Name: "flag 5",
60+
},
61+
{
62+
Key: "flag6",
63+
Name: "flag 6",
64+
},
65+
},
66+
"env4": {
67+
{
68+
Key: "flag7",
69+
Name: "flag 7",
70+
},
71+
{
72+
Key: "flag8",
73+
Name: "flag 8",
74+
},
75+
},
76+
"env5": {
77+
{
78+
Key: "flag9",
79+
Name: "flag 9",
80+
},
81+
{
82+
Key: "flag10",
83+
Name: "flag 10",
84+
},
85+
},
86+
"env6": {
87+
{
88+
Key: "flag11",
89+
Name: "flag 11",
90+
},
91+
{
92+
Key: "flag12",
93+
Name: "flag 12",
94+
},
95+
},
96+
}
4597

46-
l := list.New(flagsToItems(flags), flagDelegate{}, 30, 14)
98+
func NewFlag() tea.Model {
99+
l := list.New(nil, flagDelegate{}, 30, 14)
47100
l.Title = "Select a flag"
48101
l.SetShowStatusBar(false)
49102
l.SetFilteringEnabled(false)
@@ -61,6 +114,13 @@ func (p flagModel) Init() tea.Cmd {
61114
func (m flagModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
62115
var cmd tea.Cmd
63116
switch msg := msg.(type) {
117+
case fetchResources:
118+
fs, err := getFlags(m.parentKey)
119+
if err != nil {
120+
m.err = err
121+
return m, nil
122+
}
123+
m.list.SetItems(flagsToItems(fs))
64124
case tea.KeyMsg:
65125
switch {
66126
case key.Matches(msg, keys.Enter):
@@ -82,6 +142,13 @@ func (m flagModel) View() string {
82142
return "\n" + m.list.View()
83143
}
84144

145+
func getFlags(envKey string) ([]flag, error) {
146+
flagList := flags[envKey]
147+
createNewOption := flag{Key: CreateNewResourceKey, Name: "Create a new flag"}
148+
flagList = append(flagList, createNewOption)
149+
return flagList, nil
150+
}
151+
85152
type flagDelegate struct{}
86153

87154
func (d flagDelegate) Height() int { return 1 }

internal/setup/projects.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import (
1111
"github.com/charmbracelet/lipgloss"
1212
)
1313

14+
const CreateNewResourceKey string = "create-new"
15+
1416
var (
1517
projectStyle = lipgloss.NewStyle().PaddingLeft(4)
1618
selectedItemStyle = lipgloss.NewStyle().PaddingLeft(2).Foreground(lipgloss.Color("170"))
@@ -50,14 +52,13 @@ func (p projectModel) Init() tea.Cmd {
5052

5153
func (m projectModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
5254
var cmd tea.Cmd
53-
// if we've selected the option to create a new project, delegate to the textInput model
5455
if m.showInput {
5556
m.textInput, cmd = m.textInput.Update(msg)
56-
57-
// catch the enter key here to update the projectModel when a final value is provided
5857
switch msg := msg.(type) {
5958
case tea.KeyMsg:
6059
switch {
60+
// catch the enter key here to update the model when a final value is provided
61+
// if we've selected the option to create a new project, delegate to the textInput model
6162
case key.Matches(msg, keys.Enter):
6263
iModel, ok := m.textInput.(inputModel)
6364
if ok {
@@ -87,7 +88,7 @@ func (m projectModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
8788

8889
i, ok := m.list.SelectedItem().(project)
8990
if ok {
90-
if i.Key == "create-new-project" {
91+
if i.Key == CreateNewResourceKey {
9192
iModel := newTextInputModel("desired-proj-key", "Enter project name")
9293
m.textInput = iModel
9394
m.showInput = true
@@ -167,7 +168,7 @@ var projects = []project{
167168

168169
func getProjects() ([]project, error) {
169170
projectList := projects
170-
createNewOption := project{Key: "create-new-project", Name: "Create a new project"}
171+
createNewOption := project{Key: CreateNewResourceKey, Name: "Create a new project"}
171172
projectList = append(projectList, createNewOption)
172173
return projectList, nil
173174

internal/setup/wizard.go

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,15 +101,29 @@ func (m WizardModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
101101
m.steps[projectsStep] = p
102102
// only progress if we don't want to show input
103103
if !p.showInput {
104-
m.currStep += 1
104+
// pre-load environments based on project selected
105+
envModel := m.steps[environmentsStep]
106+
e, ok := envModel.(environmentModel)
107+
if ok {
108+
e.parentKey = m.currProjectKey
109+
m.steps[environmentsStep], _ = e.Update(fetchResources{})
110+
m.currStep += 1
111+
}
105112
}
106113
}
107114
case environmentsStep:
108115
envModel, _ := m.steps[environmentsStep].Update(msg)
109116
p, ok := envModel.(environmentModel)
110117
if ok {
111118
m.currEnvironmentKey = p.choice
112-
m.currStep += 1
119+
// pre-load flags based on environment selected
120+
fModel := m.steps[flagsStep]
121+
f, ok := fModel.(flagModel)
122+
if ok {
123+
f.parentKey = m.currEnvironmentKey
124+
m.steps[flagsStep], _ = f.Update(fetchResources{})
125+
m.currStep += 1
126+
}
113127
}
114128
case flagsStep:
115129
model, _ := m.steps[flagsStep].Update(msg)

0 commit comments

Comments
 (0)