control.go 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package budget2
  2. import "zhiyuan/pkg/db"
  3. type Control struct {
  4. Name string `json:"n"`
  5. Type string `json:"t"`
  6. Value interface{} `json:"v"`
  7. Param map[string]interface{} `json:"p"`
  8. }
  9. func (control *Control) PraseForMap(value map[string]interface{}) {
  10. control.Name = db.ToString(value["n"])
  11. control.Type = db.ToString(value["t"])
  12. control.Value = value["v"]
  13. if param, ok := value["p"].(map[string]interface{}); ok {
  14. control.Param = param
  15. } else {
  16. control.Param = make(map[string]interface{})
  17. }
  18. }
  19. func (control *Control) ToMap() map[string]interface{} {
  20. return map[string]interface{}{
  21. "n": control.Name,
  22. "t": control.Type,
  23. "v": control.Value,
  24. "p": control.Param,
  25. }
  26. }
  27. func (control *Control) Handle(typ string, value interface{}, context *Context) interface{} {
  28. switch control.Type {
  29. case "group", "popover":
  30. if v, ok := value.(map[string]interface{}); ok {
  31. index, _ := db.ToInt64(v["index"])
  32. value := v["value"]
  33. controls := make([]interface{}, 0)
  34. values := control.Value
  35. if s, ok := control.Param["controls"].([]interface{}); ok {
  36. controls = s
  37. }
  38. if _, ok := values.([]interface{}); !ok {
  39. values = make([]interface{}, len(controls))
  40. }
  41. if result, ok := values.([]interface{}); ok {
  42. if len(result) < len(controls) {
  43. values = append(result, make([]interface{}, len(controls)-len(result)))
  44. }
  45. }
  46. if index < int64(len(controls)) {
  47. var control Control
  48. if c, ok := controls[index].(Control); ok {
  49. control = c
  50. } else if c, ok := controls[index].(*Control); ok {
  51. control = *c
  52. } else if c, ok := controls[index].(map[string]interface{}); ok {
  53. control.PraseForMap(c)
  54. }
  55. if result, ok := values.([]interface{}); ok {
  56. result[index] = control.Handle(typ, value, context)
  57. return result
  58. }
  59. }
  60. }
  61. case "text":
  62. return control.Value
  63. default:
  64. switch typ {
  65. case "input":
  66. return value
  67. }
  68. }
  69. return control.Value
  70. }
  71. func ControlGroup(name string, controls []Control) Control {
  72. values := make([]interface{}, 0)
  73. for _, control := range controls {
  74. values = append(values, control.Value)
  75. }
  76. return Control{
  77. Name: name,
  78. Type: "group",
  79. Value: values,
  80. Param: map[string]interface{}{
  81. "controls": controls,
  82. },
  83. }
  84. }