GoSetup-bubble/setup/fields/input.go

74 lines
1.6 KiB
Go
Raw Permalink Normal View History

2025-12-26 17:45:37 +05:00
package fields
import (
"fmt"
"github.com/charmbracelet/bubbles/cursor"
"github.com/charmbracelet/bubbles/textinput"
tea "github.com/charmbracelet/bubbletea"
)
// InputModel структура описывающая модель поля ввода данных
2025-12-26 17:45:37 +05:00
type InputModel struct {
label string
description string
input textinput.Model
2025-12-26 17:45:37 +05:00
}
type FieldValidator func(value any) error
// NewInputModel создает новую модель поля ввода данных
func NewInputModel(label, value, description string, validator textinput.ValidateFunc) *InputModel {
2025-12-26 17:45:37 +05:00
t := textinput.New()
t.Validate = validator
2025-12-26 17:45:37 +05:00
t.SetValue(value)
t.Cursor.SetMode(cursor.CursorBlink)
return &InputModel{
label: label,
description: description,
input: t,
2025-12-26 17:45:37 +05:00
}
}
func (m *InputModel) Init() tea.Cmd {
return textinput.Blink
}
// Update отслеживает действия с полем
2025-12-26 17:45:37 +05:00
func (m *InputModel) Update(msg tea.Msg) (FieldModel, tea.Cmd) {
var cmd tea.Cmd
m.input, cmd = m.input.Update(msg)
return m, cmd
}
func (m *InputModel) View() string {
res := fmt.Sprintf("%s: %v", m.label, m.input.View())
if m.input.Err != nil {
res += fmt.Sprintf("\nОшибка валидации: %s", m.input.Err)
} else if m.description != "" {
res += fmt.Sprintf("\n%s", m.description)
}
2025-12-26 17:45:37 +05:00
return res
}
func (m *InputModel) Focus() {
m.input.Focus()
}
func (m *InputModel) Blur() {
m.input.Blur()
}
func (m *InputModel) CaptureKeys() bool {
//return m.input.Focused()
return false
}
func (m *InputModel) GetLabel() string {
return m.label
}
func (m *InputModel) GetValue() interface{} {
return m.input.Value()
}