data_form.go 4.1 KB

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