chore: update build and tui assets
This commit is contained in:
98
internal/tui/confirmation.go
Normal file
98
internal/tui/confirmation.go
Normal file
@ -0,0 +1,98 @@
|
||||
package tui
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
tea "github.com/charmbracelet/bubbletea"
|
||||
|
||||
"dbbackup/internal/config"
|
||||
"dbbackup/internal/logger"
|
||||
)
|
||||
|
||||
// ConfirmationModel for yes/no confirmations
|
||||
type ConfirmationModel struct {
|
||||
config *config.Config
|
||||
logger logger.Logger
|
||||
parent tea.Model
|
||||
title string
|
||||
message string
|
||||
cursor int
|
||||
choices []string
|
||||
confirmed bool
|
||||
}
|
||||
|
||||
func NewConfirmationModel(cfg *config.Config, log logger.Logger, parent tea.Model, title, message string) ConfirmationModel {
|
||||
return ConfirmationModel{
|
||||
config: cfg,
|
||||
logger: log,
|
||||
parent: parent,
|
||||
title: title,
|
||||
message: message,
|
||||
choices: []string{"Yes", "No"},
|
||||
}
|
||||
}
|
||||
|
||||
func (m ConfirmationModel) Init() tea.Cmd {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m ConfirmationModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
|
||||
switch msg := msg.(type) {
|
||||
case tea.KeyMsg:
|
||||
switch msg.String() {
|
||||
case "ctrl+c", "q", "esc", "n":
|
||||
return m.parent, nil
|
||||
|
||||
case "left", "h":
|
||||
if m.cursor > 0 {
|
||||
m.cursor--
|
||||
}
|
||||
|
||||
case "right", "l":
|
||||
if m.cursor < len(m.choices)-1 {
|
||||
m.cursor++
|
||||
}
|
||||
|
||||
case "enter", "y":
|
||||
if msg.String() == "y" || m.cursor == 0 {
|
||||
m.confirmed = true
|
||||
// Execute cluster backup
|
||||
executor := NewBackupExecution(m.config, m.logger, m.parent, "cluster", "", 0)
|
||||
return executor, executor.Init()
|
||||
}
|
||||
return m.parent, nil
|
||||
}
|
||||
}
|
||||
|
||||
return m, nil
|
||||
}
|
||||
|
||||
func (m ConfirmationModel) View() string {
|
||||
var s strings.Builder
|
||||
|
||||
header := titleStyle.Render(m.title)
|
||||
s.WriteString(fmt.Sprintf("\n%s\n\n", header))
|
||||
|
||||
s.WriteString(fmt.Sprintf("%s\n\n", m.message))
|
||||
|
||||
// Show choices
|
||||
for i, choice := range m.choices {
|
||||
cursor := " "
|
||||
if m.cursor == i {
|
||||
cursor = ">"
|
||||
s.WriteString(selectedStyle.Render(fmt.Sprintf("%s [%s]", cursor, choice)))
|
||||
} else {
|
||||
s.WriteString(fmt.Sprintf("%s [%s]", cursor, choice))
|
||||
}
|
||||
s.WriteString(" ")
|
||||
}
|
||||
|
||||
s.WriteString("\n\n⌨️ ←/→: Select • Enter/y: Confirm • n/ESC: Cancel\n")
|
||||
|
||||
return s.String()
|
||||
}
|
||||
|
||||
func (m ConfirmationModel) IsConfirmed() bool {
|
||||
return m.confirmed
|
||||
}
|
||||
Reference in New Issue
Block a user