data_form.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. package builder
  2. import (
  3. "html"
  4. "golang-fave/engine/wrapper"
  5. )
  6. const (
  7. DFKHidden = iota
  8. DFKText
  9. DFKEmail
  10. DFKPassword
  11. DFKTextArea
  12. DFKSubmit
  13. DFKMessage
  14. )
  15. type DataFormField struct {
  16. Caption string
  17. Kind int
  18. Name string
  19. Value string
  20. Placeholder string
  21. Hint string
  22. Target string
  23. Required bool
  24. CallBack func(field *DataFormField) string
  25. }
  26. func DataForm(wrap *wrapper.Wrapper, data []DataFormField) string {
  27. result := `<form class="data-form" action="/cp/" method="post" autocomplete="off">`
  28. result += `<div class="hidden">`
  29. for _, field := range data {
  30. if field.Kind == DFKHidden {
  31. if field.CallBack != nil {
  32. result += field.CallBack(&field)
  33. } else {
  34. result += `<input type="hidden" name="` + field.Name + `" value="` + html.EscapeString(field.Value) + `">`
  35. }
  36. }
  37. }
  38. result += `</div>`
  39. for _, field := range data {
  40. if field.Kind != DFKHidden && field.Kind != DFKSubmit && field.Kind != DFKMessage {
  41. if field.CallBack != nil {
  42. result += field.CallBack(&field)
  43. } else {
  44. required := ``
  45. if field.Required {
  46. required = ` required`
  47. }
  48. result += `<div class="form-group">`
  49. result += `<div class="row">`
  50. result += `<div class="col-3">`
  51. result += `<label for="lbl_` + field.Name + `">` + field.Caption + `</label>`
  52. result += `</div>`
  53. result += `<div class="col-9">`
  54. result += `<div>`
  55. if field.Kind == DFKText {
  56. result += `<input class="form-control" type="text" id="lbl_` + field.Name + `" name="` + field.Name + `" value="` + html.EscapeString(field.Value) + `" placeholder="` + field.Placeholder + `" autocomplete="off"` + required + `>`
  57. } else if field.Kind == DFKEmail {
  58. result += `<input class="form-control" type="email" id="lbl_` + field.Name + `" name="` + field.Name + `" value="` + html.EscapeString(field.Value) + `" placeholder="` + field.Placeholder + `" autocomplete="off"` + required + `>`
  59. } else if field.Kind == DFKPassword {
  60. result += `<input class="form-control" type="password" id="lbl_` + field.Name + `" name="` + field.Name + `" value="` + html.EscapeString(field.Value) + `" placeholder="` + field.Placeholder + `" autocomplete="off"` + required + `>`
  61. } else if field.Kind == DFKTextArea {
  62. result += `<textarea class="form-control" id="lbl_` + field.Name + `" name="` + field.Name + `" placeholder="` + field.Placeholder + `" autocomplete="off"` + required + `>` + html.EscapeString(field.Value) + `</textarea>`
  63. }
  64. result += `</div>`
  65. if field.Hint != "" {
  66. result += `<div><small>` + field.Hint + `</small></div>`
  67. }
  68. result += `</div>`
  69. result += `</div>`
  70. result += `</div>`
  71. }
  72. }
  73. }
  74. // TODO: optimize this...
  75. for _, field := range data {
  76. if field.Kind == DFKMessage {
  77. if field.CallBack != nil {
  78. result += field.CallBack(&field)
  79. } else {
  80. result += `<div class="row">`
  81. result += `<div class="col-3">`
  82. result += `</div>`
  83. result += `<div class="col-9">`
  84. result += `<div class="sys-messages"></div>`
  85. result += `</div>`
  86. result += `</div>`
  87. }
  88. }
  89. }
  90. for _, field := range data {
  91. if field.Kind == DFKSubmit {
  92. if field.CallBack != nil {
  93. result += field.CallBack(&field)
  94. } else {
  95. result += `<div class="row hidden">`
  96. result += `<div class="col-3">`
  97. result += `&nbsp;`
  98. result += `</div>`
  99. result += `<div class="col-9">`
  100. result += `<button type="submit" class="btn btn-primary" data-target="` + field.Target + `">` + html.EscapeString(field.Value) + `</button>`
  101. result += `</div>`
  102. result += `</div>`
  103. }
  104. }
  105. }
  106. result += `</form>`
  107. return result
  108. }