表单数据持久化
This commit is contained in:
+113
-77
@@ -1,97 +1,84 @@
|
||||
package views
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"fyne.io/fyne/v2"
|
||||
"fyne.io/fyne/v2/container"
|
||||
"fyne.io/fyne/v2/data/binding"
|
||||
"fyne.io/fyne/v2/dialog"
|
||||
"fyne.io/fyne/v2/widget"
|
||||
"regexp"
|
||||
"work_cation/global"
|
||||
"strings"
|
||||
"work_cation/models"
|
||||
"work_cation/models/repo"
|
||||
"work_cation/pkg/utils"
|
||||
"work_cation/service"
|
||||
)
|
||||
|
||||
var erlangCard *models.ErlangCards
|
||||
|
||||
func CreateErlangCard(w fyne.Window) fyne.CanvasObject {
|
||||
|
||||
// user := repo.UserRepo.GetUserInfo(global.DB)
|
||||
var erlangCard = models.ErlangCards{
|
||||
UUID: utils.CreateUUID(),
|
||||
UserIp: utils.Get192Ip(),
|
||||
if erlangCard == nil {
|
||||
erlangCard = &models.ErlangCards{
|
||||
UUID: utils.CreateUUID(),
|
||||
UserIp: utils.Get192Ip(),
|
||||
}
|
||||
}
|
||||
var (
|
||||
// 基础表单
|
||||
formBase = &widget.Form{}
|
||||
// 变量表单
|
||||
formVars = &widget.Form{}
|
||||
)
|
||||
|
||||
var items = []*widget.FormItem{
|
||||
{Text: "名称", Widget: widget.NewEntry()},
|
||||
{Text: "描述", Widget: widget.NewEntry()},
|
||||
{Text: "封面", Widget: widget.NewEntry(), HintText: "暂未支持可不填"},
|
||||
{Text: "是否默认展示", Widget: widget.NewEntry()},
|
||||
{Text: "模版内容", Widget: widget.NewEntry()},
|
||||
formBase.AppendItem(&widget.FormItem{Text: "名称", Widget: newDefaultEntry(&erlangCard.Title)})
|
||||
formBase.AppendItem(&widget.FormItem{Text: "描述", Widget: newDefaultEntry(&erlangCard.Text)})
|
||||
formBase.AppendItem(&widget.FormItem{Text: "封面", Widget: newDefaultEntry(&erlangCard.Covers), HintText: "暂未支持可不填"})
|
||||
formBase.AppendItem(&widget.FormItem{Text: "是否默认展示", Widget: newDefaultEntry(&erlangCard.IsShowOut)})
|
||||
formBase.AppendItem(&widget.FormItem{Text: "模版内容", Widget: newDefaultEntryCallback(&erlangCard.Template, func() { generateVariableForm1(erlangCard, formVars) })})
|
||||
|
||||
// 刷新变量表单
|
||||
generateVariableForm1(erlangCard, formVars)
|
||||
|
||||
// 保存按钮
|
||||
buttonSave := widget.NewButton("保存", func() {
|
||||
err := service.ErlangCard.Create(erlangCard)
|
||||
if err != nil {
|
||||
dialog.ShowError(err, w)
|
||||
return
|
||||
}
|
||||
dialog.ShowInformation("ok", "创建成功", w)
|
||||
// 更换
|
||||
erlangCard.UUID = utils.CreateUUID()
|
||||
})
|
||||
|
||||
return container.NewBorder(container.NewHBox(widget.NewLabel("新建"), widget.NewSeparator()),
|
||||
nil, nil, nil, container.NewScroll(
|
||||
container.NewVBox(
|
||||
formBase,
|
||||
formVars,
|
||||
buttonSave,
|
||||
)))
|
||||
}
|
||||
|
||||
// 刷新表单
|
||||
func generateVariableForm1(erlCard *models.ErlangCards, form2 *widget.Form) {
|
||||
varSum := countVarOccurrences(erlCard.Template)
|
||||
form2.Items = nil
|
||||
var newVarList []string
|
||||
for i := 0; i < varSum; i++ {
|
||||
var item string
|
||||
if i < len(erlCard.VarName) { // 如果有旧数据,则使用旧数据
|
||||
item = erlCard.VarName[i]
|
||||
}
|
||||
var index = i
|
||||
newItem := &widget.FormItem{Text: fmt.Sprintf("变量%d", i+1), Widget: newDefaultEntryCallback(&item, func() {
|
||||
erlCard.VarName[index] = item
|
||||
})}
|
||||
form2.AppendItem(newItem)
|
||||
newVarList = append(newVarList, item)
|
||||
}
|
||||
|
||||
var items2 []*widget.FormItem
|
||||
form2 := &widget.Form{
|
||||
Items: items2,
|
||||
SubmitText: "保存创建",
|
||||
OnSubmit: func() {
|
||||
for _, item := range items {
|
||||
switch item.Text {
|
||||
case "名称":
|
||||
erlangCard.Title = item.Widget.(*widget.Entry).Text
|
||||
case "描述":
|
||||
erlangCard.Text = item.Widget.(*widget.Entry).Text
|
||||
case "封面":
|
||||
erlangCard.Covers = []string{item.Widget.(*widget.Entry).Text}
|
||||
case "是否默认展示":
|
||||
erlangCard.IsShowOut = item.Widget.(*widget.Entry).Text == "1"
|
||||
case "模版内容":
|
||||
erlangCard.Template = item.Widget.(*widget.Entry).Text
|
||||
default:
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
if countVarOccurrences(erlangCard.Template) != len(items2) {
|
||||
dialog.ShowError(errors.New("变量名数量异常"), w)
|
||||
return
|
||||
}
|
||||
|
||||
for _, item2 := range items2 {
|
||||
fmt.Println("key:", item2.Text, "value:", item2.Widget.(*widget.Entry).Text)
|
||||
erlangCard.VarName = append(erlangCard.VarName, item2.Widget.(*widget.Entry).Text)
|
||||
}
|
||||
err := repo.ErlangCardRepo.Create(global.DB, &erlangCard)
|
||||
if err != nil {
|
||||
dialog.ShowError(err, w)
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
form := &widget.Form{
|
||||
Items: items,
|
||||
SubmitText: "生成变量表单",
|
||||
OnSubmit: func() {
|
||||
for _, item := range items {
|
||||
switch item.Text {
|
||||
case "模版内容":
|
||||
varSum := countVarOccurrences(item.Widget.(*widget.Entry).Text)
|
||||
for i := 0; i < varSum; i++ {
|
||||
newItem := &widget.FormItem{Text: fmt.Sprintf("变量%d", i+1), Widget: widget.NewEntry()}
|
||||
items2 = append(items2, newItem)
|
||||
form2.AppendItem(newItem)
|
||||
}
|
||||
default:
|
||||
}
|
||||
}
|
||||
|
||||
},
|
||||
}
|
||||
return container.NewBorder(widget.NewSeparator(), nil, nil, nil, container.NewScroll(
|
||||
container.NewVBox(
|
||||
form,
|
||||
form2,
|
||||
)))
|
||||
erlCard.VarName = newVarList
|
||||
form2.Refresh()
|
||||
}
|
||||
|
||||
func countVarOccurrences(input string) int {
|
||||
@@ -99,3 +86,52 @@ func countVarOccurrences(input string) int {
|
||||
matches := re.FindAllStringIndex(input, -1)
|
||||
return len(matches)
|
||||
}
|
||||
|
||||
func newDefaultEntry(value any) *widget.Entry {
|
||||
en := widget.NewEntry()
|
||||
switch v := value.(type) {
|
||||
case string:
|
||||
en.SetText(v)
|
||||
case bool:
|
||||
if v {
|
||||
en.SetText("1")
|
||||
} else {
|
||||
en.SetText("0")
|
||||
}
|
||||
case []string:
|
||||
en.SetText(strings.Join(v, ","))
|
||||
|
||||
case *string:
|
||||
data := binding.BindString(v)
|
||||
en.Bind(data)
|
||||
case *bool:
|
||||
data := binding.NewString()
|
||||
data.AddListener(binding.NewDataListener(func() {
|
||||
s, err := data.Get()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
*v = s == "1"
|
||||
}))
|
||||
if *v {
|
||||
data.Set("1")
|
||||
} else {
|
||||
data.Set("0")
|
||||
}
|
||||
en.Bind(data)
|
||||
case *[]string:
|
||||
data := binding.NewString()
|
||||
data.Set(strings.Join(*v, ","))
|
||||
en.Bind(data)
|
||||
default:
|
||||
}
|
||||
return en
|
||||
}
|
||||
|
||||
func newDefaultEntryCallback(value *string, callback func()) *widget.Entry {
|
||||
en := widget.NewEntry()
|
||||
data := binding.BindString(value)
|
||||
en.Bind(data)
|
||||
en.OnChanged = func(_ string) { callback() }
|
||||
return en
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user