2025-12-26 17:45:37 +05:00
|
|
|
|
package fields
|
|
|
|
|
|
|
|
|
|
|
|
import (
|
2026-01-19 17:44:49 +05:00
|
|
|
|
"fmt"
|
2026-01-20 17:40:21 +05:00
|
|
|
|
"github.com/charmbracelet/bubbles/textinput"
|
2025-12-26 17:45:37 +05:00
|
|
|
|
tea "github.com/charmbracelet/bubbletea"
|
2026-01-20 17:40:21 +05:00
|
|
|
|
"strconv"
|
2025-12-26 17:45:37 +05:00
|
|
|
|
)
|
|
|
|
|
|
|
2026-01-20 17:40:21 +05:00
|
|
|
|
// CheckboxModel структура описывающая модель выбора из двух состояний да и нет
|
2025-12-26 17:45:37 +05:00
|
|
|
|
type CheckboxModel struct {
|
2026-01-20 17:40:21 +05:00
|
|
|
|
label string //Имя поля
|
|
|
|
|
|
description string //Описание поля
|
|
|
|
|
|
checked bool //Выбранное состояние
|
|
|
|
|
|
validate textinput.ValidateFunc //Функция валидации
|
|
|
|
|
|
err error //Поле ошибки валидации
|
2025-12-26 17:45:37 +05:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-20 17:40:21 +05:00
|
|
|
|
// NewCheckboxModel создаем новую модель выбора
|
|
|
|
|
|
func NewCheckboxModel(label, description string, checked bool, validator textinput.ValidateFunc) *CheckboxModel {
|
|
|
|
|
|
checkbox := &CheckboxModel{
|
|
|
|
|
|
label: label,
|
2026-01-19 17:44:49 +05:00
|
|
|
|
description: description,
|
2026-01-20 17:40:21 +05:00
|
|
|
|
validate: validator,
|
|
|
|
|
|
checked: checked,
|
2025-12-26 17:45:37 +05:00
|
|
|
|
}
|
2026-01-20 17:40:21 +05:00
|
|
|
|
checkbox.err = validator(strconv.FormatBool(checked))
|
|
|
|
|
|
|
|
|
|
|
|
return checkbox
|
2025-12-26 17:45:37 +05:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func (m *CheckboxModel) Init() tea.Cmd {
|
|
|
|
|
|
return nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-20 17:40:21 +05:00
|
|
|
|
// Update отслеживает действия с полем
|
2025-12-26 17:45:37 +05:00
|
|
|
|
func (m *CheckboxModel) Update(msg tea.Msg) (FieldModel, tea.Cmd) {
|
|
|
|
|
|
switch msg := msg.(type) {
|
|
|
|
|
|
case tea.KeyMsg:
|
2026-01-20 17:40:21 +05:00
|
|
|
|
//Отслеживает нажатия клавиш.
|
2025-12-26 17:45:37 +05:00
|
|
|
|
switch msg.String() {
|
|
|
|
|
|
case " ", "enter":
|
2026-01-20 17:40:21 +05:00
|
|
|
|
//Если был нажат enter или space, то меняем текущее значение на противоположное
|
|
|
|
|
|
m.checked = !m.checked
|
|
|
|
|
|
m.err = m.validate(strconv.FormatBool(m.checked))
|
2025-12-26 17:45:37 +05:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return m, nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func (m *CheckboxModel) View() string {
|
2026-01-20 17:40:21 +05:00
|
|
|
|
res := fmt.Sprintf("%s: ", m.label)
|
|
|
|
|
|
if m.checked {
|
2025-12-26 17:45:37 +05:00
|
|
|
|
res += "[x]"
|
|
|
|
|
|
} else {
|
|
|
|
|
|
res += "[ ]"
|
|
|
|
|
|
}
|
2026-01-20 17:40:21 +05:00
|
|
|
|
if m.err != nil {
|
|
|
|
|
|
res += fmt.Sprintf("\nОшибка валидации: %s", m.err)
|
|
|
|
|
|
} else if m.description != "" {
|
2026-01-19 17:44:49 +05:00
|
|
|
|
res += fmt.Sprintf("\n%s", m.description)
|
|
|
|
|
|
}
|
2025-12-26 17:45:37 +05:00
|
|
|
|
return res
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func (m *CheckboxModel) Focus() {
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func (m *CheckboxModel) Blur() {
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func (m *CheckboxModel) CaptureKeys() bool {
|
|
|
|
|
|
return false
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func (m *CheckboxModel) GetLabel() string {
|
2026-01-20 17:40:21 +05:00
|
|
|
|
return m.label
|
2025-12-26 17:45:37 +05:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func (m *CheckboxModel) GetValue() interface{} {
|
2026-01-20 17:40:21 +05:00
|
|
|
|
return m.checked
|
2025-12-26 17:45:37 +05:00
|
|
|
|
}
|