12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- package budget2
- import "zhiyuan/pkg/db"
- type Control struct {
- Name string `json:"n"`
- Type string `json:"t"`
- Value interface{} `json:"v"`
- Param map[string]interface{} `json:"p"`
- }
- func (control *Control) PraseForMap(value map[string]interface{}) {
- control.Name = db.ToString(value["n"])
- control.Type = db.ToString(value["t"])
- control.Value = value["v"]
- if param, ok := value["p"].(map[string]interface{}); ok {
- control.Param = param
- } else {
- control.Param = make(map[string]interface{})
- }
- }
- func (control *Control) ToMap() map[string]interface{} {
- return map[string]interface{}{
- "n": control.Name,
- "t": control.Type,
- "v": control.Value,
- "p": control.Param,
- }
- }
- func (control *Control) Handle(typ string, value interface{}, context *Context) interface{} {
- switch control.Type {
- case "group", "popover":
- if v, ok := value.(map[string]interface{}); ok {
- index, _ := db.ToInt64(v["index"])
- value := v["value"]
- controls := make([]interface{}, 0)
- values := control.Value
- if s, ok := control.Param["controls"].([]interface{}); ok {
- controls = s
- }
- if _, ok := values.([]interface{}); !ok {
- values = make([]interface{}, len(controls))
- }
- if result, ok := values.([]interface{}); ok {
- if len(result) < len(controls) {
- values = append(result, make([]interface{}, len(controls)-len(result)))
- }
- }
- if index < int64(len(controls)) {
- var control Control
- if c, ok := controls[index].(Control); ok {
- control = c
- } else if c, ok := controls[index].(*Control); ok {
- control = *c
- } else if c, ok := controls[index].(map[string]interface{}); ok {
- control.PraseForMap(c)
- }
- if result, ok := values.([]interface{}); ok {
- result[index] = control.Handle(typ, value, context)
- return result
- }
- }
- }
- case "text":
- return control.Value
- default:
- switch typ {
- case "input":
- return value
- }
- }
- return control.Value
- }
- func ControlGroup(name string, controls []Control) Control {
- values := make([]interface{}, 0)
- for _, control := range controls {
- values = append(values, control.Value)
- }
- return Control{
- Name: name,
- Type: "group",
- Value: values,
- Param: map[string]interface{}{
- "controls": controls,
- },
- }
- }
|