Работа над валидацией полей, работа над выполнением действий
This commit is contained in:
parent
e37cabadcc
commit
dc263b76bf
8 changed files with 220 additions and 23 deletions
|
|
@ -1,10 +1,9 @@
|
|||
package fields
|
||||
|
||||
import (
|
||||
"bubble/types"
|
||||
"fmt"
|
||||
"github.com/charmbracelet/bubbles/textinput"
|
||||
tea "github.com/charmbracelet/bubbletea"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
// CheckboxModel структура описывающая модель выбора из двух состояний да и нет
|
||||
|
|
@ -12,20 +11,19 @@ type CheckboxModel struct {
|
|||
label string //Имя поля
|
||||
description string //Описание поля
|
||||
checked bool //Выбранное состояние
|
||||
validate textinput.ValidateFunc //Функция валидации
|
||||
validate types.BoolValidateFunc //Функция валидации
|
||||
err error //Поле ошибки валидации
|
||||
}
|
||||
|
||||
// NewCheckboxModel создаем новую модель выбора
|
||||
func NewCheckboxModel(label, description string, checked bool, validator textinput.ValidateFunc) *CheckboxModel {
|
||||
func NewCheckboxModel(label, description string, checked bool, validator types.BoolValidateFunc) *CheckboxModel {
|
||||
checkbox := &CheckboxModel{
|
||||
label: label,
|
||||
description: description,
|
||||
validate: validator,
|
||||
checked: checked,
|
||||
}
|
||||
checkbox.err = validator(strconv.FormatBool(checked))
|
||||
|
||||
checkbox.CheckboxValidate()
|
||||
return checkbox
|
||||
}
|
||||
|
||||
|
|
@ -42,7 +40,7 @@ func (m *CheckboxModel) Update(msg tea.Msg) (FieldModel, tea.Cmd) {
|
|||
case " ", "enter":
|
||||
//Если был нажат enter или space, то меняем текущее значение на противоположное
|
||||
m.checked = !m.checked
|
||||
m.err = m.validate(strconv.FormatBool(m.checked))
|
||||
m.CheckboxValidate()
|
||||
}
|
||||
}
|
||||
return m, nil
|
||||
|
|
@ -83,3 +81,9 @@ func (m *CheckboxModel) GetLabel() string {
|
|||
func (m *CheckboxModel) GetValue() interface{} {
|
||||
return m.checked
|
||||
}
|
||||
|
||||
func (m *CheckboxModel) CheckboxValidate() {
|
||||
if m.validate != nil {
|
||||
m.err = m.validate(m.checked)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -16,11 +16,21 @@ type SelectModel struct {
|
|||
open bool //Открыт ли список
|
||||
chosen string //Выбранный элемент
|
||||
optionsCount int //Количество элементов к показу
|
||||
validate textinput.ValidateFunc
|
||||
err error
|
||||
}
|
||||
|
||||
// NewSelectModel создаем новую поля выбора опции
|
||||
func NewSelectModel(label, value, description string, options []string) *SelectModel {
|
||||
func NewSelectModel(label, value, description string, options []string, validator textinput.ValidateFunc) *SelectModel {
|
||||
//Проверка, что указанный по умолчанию элемент есть в списке опции
|
||||
selectModel := &SelectModel{
|
||||
options: options,
|
||||
label: label,
|
||||
description: description,
|
||||
focus: len(options),
|
||||
validate: validator,
|
||||
optionsCount: 10,
|
||||
}
|
||||
found := false
|
||||
for i := range options {
|
||||
if options[i] == value {
|
||||
|
|
@ -30,14 +40,9 @@ func NewSelectModel(label, value, description string, options []string) *SelectM
|
|||
if !found {
|
||||
value = ""
|
||||
}
|
||||
return &SelectModel{
|
||||
options: options,
|
||||
label: label,
|
||||
description: description,
|
||||
focus: len(options),
|
||||
chosen: value,
|
||||
optionsCount: 10,
|
||||
}
|
||||
selectModel.chosen = value
|
||||
selectModel.SelectValidate()
|
||||
return selectModel
|
||||
}
|
||||
|
||||
func (m *SelectModel) Init() tea.Cmd {
|
||||
|
|
@ -75,6 +80,7 @@ func (m *SelectModel) Update(msg tea.Msg) (FieldModel, tea.Cmd) {
|
|||
m.chosen = m.options[m.focus]
|
||||
m.open = false
|
||||
m.focus = 0
|
||||
m.SelectValidate()
|
||||
return m, nil
|
||||
}
|
||||
} else {
|
||||
|
|
@ -100,7 +106,9 @@ func (m *SelectModel) Update(msg tea.Msg) (FieldModel, tea.Cmd) {
|
|||
|
||||
func (m *SelectModel) View() string {
|
||||
res := fmt.Sprintf("%s: %s", m.label, m.chosen)
|
||||
if m.description != "" {
|
||||
if m.err != nil && !m.open {
|
||||
res += fmt.Sprintf("\nОшибка валидации: %s", m.err)
|
||||
} else if m.description != "" {
|
||||
res += fmt.Sprintf("\n%s", m.description)
|
||||
}
|
||||
if m.open && len(m.options) > 0 {
|
||||
|
|
@ -141,3 +149,9 @@ func (m *SelectModel) GetLabel() string {
|
|||
func (m *SelectModel) GetValue() interface{} {
|
||||
return m.chosen
|
||||
}
|
||||
|
||||
func (m *SelectModel) SelectValidate() {
|
||||
if m.validate != nil {
|
||||
m.err = m.validate(m.chosen)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue