Files
work_cation/views/createView/createErlangCard.go
T

133 lines
3.4 KiB
Go

package createView
import (
"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"
"strings"
"time"
"work_cation/global"
"work_cation/models"
"work_cation/repo"
"work_cation/service"
)
func CreateErlangCard(w fyne.Window) fyne.CanvasObject {
var (
// 创建数据
erlangCard = &models.ErlangCards{BaseCard: models.NewBaseCard(models.ToolTypeErlang, repo.User.GetUserInfo(global.DB).ID)}
// 基础表单
formBase = &widget.Form{}
// 变量表单
formVars = &widget.Form{}
)
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)
time.AfterFunc(2*time.Second, func() { w.Close() })
})
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)
}
erlCard.VarName = newVarList
form2.Refresh()
}
func countVarOccurrences(input string) int {
re := regexp.MustCompile(`\$var`)
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
}