159 lines
4.0 KiB
Go
159 lines
4.0 KiB
Go
package createView
|
|
|
|
import (
|
|
"encoding/json"
|
|
"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"
|
|
"os"
|
|
"path/filepath"
|
|
"regexp"
|
|
"strings"
|
|
"time"
|
|
"work_cation/cfg"
|
|
"work_cation/global"
|
|
"work_cation/models"
|
|
"work_cation/repo"
|
|
"work_cation/service"
|
|
)
|
|
|
|
func UpdateErlangCard(w fyne.Window, baseInfo *models.BaseCard) fyne.CanvasObject {
|
|
// 读取类型文件数据
|
|
infoPath := filepath.Join(cfg.T.CardDir, baseInfo.UUID, cfg.T.CardInfo)
|
|
bytes, err := os.ReadFile(infoPath)
|
|
if err != nil {
|
|
return widget.NewLabel(err.Error())
|
|
}
|
|
var data models.ErlangCards
|
|
err = json.Unmarshal(bytes, &data)
|
|
if err != nil {
|
|
return widget.NewLabel(err.Error())
|
|
}
|
|
return createUpdateErlangCard(w, &data)
|
|
}
|
|
|
|
func CreateErlangCard(w fyne.Window) fyne.CanvasObject {
|
|
return createUpdateErlangCard(w, nil)
|
|
}
|
|
|
|
func createUpdateErlangCard(w fyne.Window, erlangCard *models.ErlangCards) fyne.CanvasObject {
|
|
if erlangCard == nil {
|
|
// 创建数据
|
|
erlangCard = &models.ErlangCards{BaseCard: models.NewBaseCard(models.ToolTypeErlang, repo.User.GetUserInfo(global.DB).ID)}
|
|
|
|
}
|
|
var (
|
|
// 基础表单
|
|
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
|
|
}
|