Skip to content

Commit

Permalink
feat: advanced project configuration in cli
Browse files Browse the repository at this point in the history
Signed-off-by: Ivan Dagelic <[email protected]>
  • Loading branch information
idagelic committed Apr 25, 2024
1 parent e54342a commit 851b1ba
Show file tree
Hide file tree
Showing 6 changed files with 344 additions and 73 deletions.
40 changes: 24 additions & 16 deletions pkg/cmd/workspace/util/creation_data.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,10 @@ func GetCreationDataFromPrompt(workspaceNames []string, userGitProviders []serve
var providerRepo serverapiclient.GitRepository
var providerRepoUrl string
var err error
var confirmCheck bool
var workspaceName string
var primaryContainerImageUrl string
var primaryOsUser string
doneCheck := true

if !manual && userGitProviders != nil && len(userGitProviders) > 0 {
providerRepo, err = getRepositoryFromWizard(userGitProviders, 0)
Expand Down Expand Up @@ -69,17 +72,6 @@ func GetCreationDataFromPrompt(workspaceNames []string, userGitProviders []serve
projectList = append(projectList, workspaceCreationPromptResponse.SecondaryProjects...)
}

suggestedName := create.GetSuggestedWorkspaceName(*workspaceCreationPromptResponse.PrimaryProject.Source.Repository.Url)

workspaceCreationPromptResponse, err = create.RunWorkspaceNameForm(workspaceCreationPromptResponse, suggestedName, workspaceNames)
if err != nil {
return "", nil, err
}

if workspaceCreationPromptResponse.WorkspaceName == "" {
return "", nil, errors.New("workspace name is required")
}

for i, project := range projectList {
if project.Source == nil || project.Source.Repository == nil || project.Source.Repository.Url == nil {
return "", nil, errors.New("repository is required")
Expand All @@ -88,14 +80,30 @@ func GetCreationDataFromPrompt(workspaceNames []string, userGitProviders []serve
projectList[i].Name = projectName
}

if len(projectList) > 1 {
create.DisplaySummaryView(workspaceCreationPromptResponse.WorkspaceName, projectList, &confirmCheck)
if !confirmCheck {
suggestedName := create.GetSuggestedWorkspaceName(*workspaceCreationPromptResponse.PrimaryProject.Source.Repository.Url)

workspaceName, primaryContainerImageUrl, primaryOsUser = create.GetWorkspaceDataFromPrompt(suggestedName, workspaceNames, !multiProject)

if workspaceName == "" {
return "", nil, errors.New("workspace name is required")
}

if primaryContainerImageUrl != "" {
projectList[0].Image = &primaryContainerImageUrl
}

if primaryOsUser != "" {
projectList[0].User = &primaryOsUser
}

if multiProject {
create.DisplayMultiSubmitForm(workspaceName, &projectList, &doneCheck)
if !doneCheck {
return "", nil, errors.New("operation cancelled")
}
}

return workspaceCreationPromptResponse.WorkspaceName, projectList, nil
return workspaceName, projectList, nil
}

func GetProjectNameFromRepo(repoUrl string) string {
Expand Down
66 changes: 66 additions & 0 deletions pkg/views/workspace/create/configuration.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
// Copyright 2024 Daytona Platforms Inc.
// SPDX-License-Identifier: Apache-2.0

package create

import (
"errors"
"log"

"github.com/charmbracelet/huh"
"github.com/charmbracelet/lipgloss"
"github.com/daytonaio/daytona/pkg/serverapiclient"
"github.com/daytonaio/daytona/pkg/views"
selection "github.com/daytonaio/daytona/pkg/views/workspace/selection"
)

var configurationHelpLine = lipgloss.NewStyle().Foreground(views.Gray).Render("enter: next f10: configuration view")

func ConfigureProjects(projectList []serverapiclient.CreateWorkspaceRequestProject) ([]serverapiclient.CreateWorkspaceRequestProject, error) {
var containerImageUrl string
var osUser string
var doneCheck bool

projectName := selection.GetProjectRequestFromPrompt(projectList)
if projectName == "" {
return projectList, errors.New("project ID is required")
}

GetProjectConfigurationGroup(&containerImageUrl, &osUser)

form := huh.NewForm(
GetProjectConfigurationGroup(&containerImageUrl, &osUser),
GetDoneCheckGroup(&doneCheck),
).WithTheme(views.GetCustomTheme())

err := form.Run()
if err != nil {
log.Fatal(err)
}

for i := range projectList {
if projectList[i].Name == projectName {
projectList[i].Image = &containerImageUrl
projectList[i].User = &osUser
}
}

if !doneCheck {
projectList, err = ConfigureProjects(projectList)
if err != nil {
return projectList, err
}
}

return projectList, nil
}

func GetDoneCheckGroup(doneCheck *bool) *huh.Group {
group := huh.NewGroup(
huh.NewConfirm().
Title("Done configuring projects?").
Value(doneCheck),
)

return group
}
34 changes: 26 additions & 8 deletions pkg/views/workspace/create/summary.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,26 @@ type SummaryModel struct {
projectList []serverapiclient.CreateWorkspaceRequestProject
}

func DisplaySummaryView(workspaceName string, projectList []serverapiclient.CreateWorkspaceRequestProject, confirmCheck *bool) {
m := NewSummaryModel(workspaceName, projectList, confirmCheck)
var configureCheck bool

func DisplayMultiSubmitForm(workspaceName string, projectList *[]serverapiclient.CreateWorkspaceRequestProject, doneCheck *bool) {
m := NewSummaryModel(workspaceName, *projectList, doneCheck)

if _, err := tea.NewProgram(m).Run(); err != nil {
fmt.Println("Error running program:", err)
os.Exit(1)
}

if !configureCheck {
return
}

configuredProjects, err := ConfigureProjects(*projectList)
if err != nil {
log.Fatal(err)
}

*projectList = configuredProjects
}

func RenderSummary(workspaceName string, projectList []serverapiclient.CreateWorkspaceRequestProject) string {
Expand Down Expand Up @@ -64,7 +77,7 @@ func RenderSummary(workspaceName string, projectList []serverapiclient.CreateWor
return output
}

func NewSummaryModel(workspaceName string, projectList []serverapiclient.CreateWorkspaceRequestProject, confirmCheck *bool) SummaryModel {
func NewSummaryModel(workspaceName string, projectList []serverapiclient.CreateWorkspaceRequestProject, doneCheck *bool) SummaryModel {
m := SummaryModel{width: maxWidth}
m.lg = lipgloss.DefaultRenderer()
m.styles = NewStyles(m.lg)
Expand All @@ -76,9 +89,9 @@ func NewSummaryModel(workspaceName string, projectList []serverapiclient.CreateW
huh.NewConfirm().
Title("Good to go?").
Negative("Abort").
Value(confirmCheck),
Value(doneCheck),
),
).WithTheme(views.GetCustomTheme())
).WithShowHelp(false).WithTheme(views.GetCustomTheme())

return m
}
Expand All @@ -94,14 +107,19 @@ func (m SummaryModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
case "q", "ctrl+c":
m.quitting = true
return m, tea.Quit
case "f10":
m.quitting = true
m.form.State = huh.StateCompleted
configureCheck = true
return m, tea.Quit
}
}

var cmds []tea.Cmd

// Process the form
activeForm, cmd := m.form.Update(msg)
if f, ok := activeForm.(*huh.Form); ok {
form, cmd := m.form.Update(msg)
if f, ok := form.(*huh.Form); ok {
m.form = f
cmds = append(cmds, cmd)
}
Expand All @@ -120,5 +138,5 @@ func (m SummaryModel) View() string {
return ""
}

return view_util.GetBorderedMessage(RenderSummary(m.workspaceName, m.projectList)) + "\n" + m.form.View()
return view_util.GetBorderedMessage(RenderSummary(m.workspaceName, m.projectList)) + "\n" + m.form.View() + configurationHelpLine
}
49 changes: 0 additions & 49 deletions pkg/views/workspace/create/view.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
package create

import (
"errors"
"fmt"
"strings"
"unicode"
Expand Down Expand Up @@ -187,54 +186,6 @@ func RunProjectForm(workspaceCreationPromptResponse WorkspaceCreationPromptRespo
return result, nil
}

func RunWorkspaceNameForm(workspaceCreationPromptResponse WorkspaceCreationPromptResponse, suggestedName string, workspaceNames []string) (WorkspaceCreationPromptResponse, error) {
m := Model{width: maxWidth, workspaceCreationPromptResponse: workspaceCreationPromptResponse}
m.lg = lipgloss.DefaultRenderer()
m.styles = NewStyles(m.lg)

workspaceName := suggestedName

workspaceNamePrompt :=
huh.NewInput().
Title("Workspace name").
Value(&workspaceName).
Key("workspaceName").
Validate(func(str string) error {
result, err := util.GetValidatedWorkspaceName(str)
if err != nil {
return err
}
for _, name := range workspaceNames {
if name == result {
return errors.New("workspace name already exists")
}
}
workspaceName = result
return nil
})

dTheme := views.GetCustomTheme()

m.form = huh.NewForm(
huh.NewGroup(
workspaceNamePrompt,
),
).WithTheme(dTheme).
WithWidth(maxWidth).
WithShowHelp(false).
WithShowErrors(true)

err := m.form.Run()
if err != nil {
return WorkspaceCreationPromptResponse{}, err
}

result := workspaceCreationPromptResponse
result.WorkspaceName = workspaceName

return result, nil
}

func GetSuggestedWorkspaceName(repo string) string {
var result strings.Builder
input := repo
Expand Down
Loading

0 comments on commit 851b1ba

Please sign in to comment.