Добавление и исправление комментариев, начало добавление валидации, сообщение прокрути viewport на форме

This commit is contained in:
XeRo 2026-01-20 17:40:21 +05:00
parent c7ff7662ba
commit e37cabadcc
14 changed files with 371 additions and 297 deletions

View file

@ -2,47 +2,62 @@ package fields
import (
"fmt"
"github.com/charmbracelet/bubbles/textinput"
tea "github.com/charmbracelet/bubbletea"
"strconv"
)
// CheckboxModel структура описывающая модель выбора из двух состояний да и нет
type CheckboxModel struct {
Label string
description string
Checked bool
label string //Имя поля
description string //Описание поля
checked bool //Выбранное состояние
validate textinput.ValidateFunc //Функция валидации
err error //Поле ошибки валидации
}
func NewCheckboxModel(label, description string, checked bool) *CheckboxModel {
return &CheckboxModel{
Label: label,
// NewCheckboxModel создаем новую модель выбора
func NewCheckboxModel(label, description string, checked bool, validator textinput.ValidateFunc) *CheckboxModel {
checkbox := &CheckboxModel{
label: label,
description: description,
Checked: checked,
validate: validator,
checked: checked,
}
checkbox.err = validator(strconv.FormatBool(checked))
return checkbox
}
func (m *CheckboxModel) Init() tea.Cmd {
return nil
}
// Update отслеживает действия с полем
func (m *CheckboxModel) Update(msg tea.Msg) (FieldModel, tea.Cmd) {
switch msg := msg.(type) {
case tea.KeyMsg:
//Отслеживает нажатия клавиш.
switch msg.String() {
case " ", "enter":
m.Checked = !m.Checked
//Если был нажат enter или space, то меняем текущее значение на противоположное
m.checked = !m.checked
m.err = m.validate(strconv.FormatBool(m.checked))
}
}
return m, nil
}
func (m *CheckboxModel) View() string {
res := ""
res += m.Label + ": "
if m.Checked {
res := fmt.Sprintf("%s: ", m.label)
if m.checked {
res += "[x]"
} else {
res += "[ ]"
}
if m.description != "" {
if m.err != nil {
res += fmt.Sprintf("\nОшибка валидации: %s", m.err)
} else if m.description != "" {
res += fmt.Sprintf("\n%s", m.description)
}
return res
@ -62,9 +77,9 @@ func (m *CheckboxModel) CaptureKeys() bool {
}
func (m *CheckboxModel) GetLabel() string {
return m.Label
return m.label
}
func (m *CheckboxModel) GetValue() interface{} {
return m.Checked
return m.checked
}