123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 |
- package budget
- import (
- "zhiyuan/pkg/db"
- )
- type Control struct {
- Type string `json:"type"`
- Value interface{} `json:"value"`
- Param map[string]interface{} `json:"param"`
- Event map[string]string `json:"event"`
- Last bool `json:"last"`
- }
- func (control *Control) PraseForArgs(args ...interface{}) {
- if len(args) > 0 {
- control.Type = db.ToString(args[0])
- }
- if len(args) > 1 {
- control.Value = args[1]
- }
- if len(args) > 2 {
- if p, ok := args[2].(map[string]interface{}); ok {
- control.Param = p
- } else {
- control.Param = make(map[string]interface{})
- }
- } else {
- control.Param = make(map[string]interface{})
- }
- if len(args) > 3 {
- if event, ok := args[3].(map[string]string); ok {
- control.Event = event
- } else {
- control.Event = make(map[string]string)
- if event, ok := args[3].(map[string]interface{}); ok {
- for key, val := range event {
- control.Event[key] = db.ToString(val)
- }
- }
- }
- } else {
- control.Event = make(map[string]string)
- }
- control.Last = true
- if len(args) > 4 {
- if p, ok := args[4].(bool); ok {
- control.Last = p
- }
- }
- }
- func (control *Control) PraseForMap(value map[string]interface{}) {
- control.Type = db.ToString(value["type"])
- control.Value = value["value"]
- if param, ok := value["param"].(map[string]interface{}); ok {
- control.Param = param
- } else {
- control.Param = make(map[string]interface{})
- }
- if event, ok := value["event"].(map[string]string); ok {
- control.Event = event
- } else {
- control.Event = make(map[string]string)
- if event, ok := value["event"].(map[string]interface{}); ok {
- for key, val := range event {
- control.Event[key] = db.ToString(val)
- }
- }
- }
- control.Last = db.ToBool(value["last"])
- }
- func (control *Control) ToMap() map[string]interface{} {
- return map[string]interface{}{
- "type": control.Type,
- "value": control.Value,
- "param": control.Param,
- "event": control.Event,
- "last": control.Last,
- }
- }
- func (control *Control) Handle(typ string, value interface{}, prop *PropForm, context *Context) error {
- 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)
- if s, ok := control.Param["controls"].([]interface{}); ok {
- controls = s
- }
- if _, ok := prop.Result.([]interface{}); !ok {
- prop.Result = make([]interface{}, len(controls))
- }
- if result, ok := prop.Result.([]interface{}); ok {
- if len(result) < len(controls) {
- prop.Result = 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 := prop.Result.([]interface{}); ok {
- props := new(PropForm)
- props.Key = context.Order.NewPropKey()
- props.Instance = prop.Instance
- props.Control = &control
- props.Result = result[index]
- props.AddUseKey(0)
- control.Handle(typ, value, props, context)
- result[index] = props.Result
- prop.Result = result
- }
- }
- }
- default:
- switch typ {
- case "input":
- prop.Result = value
- }
- }
- context.ModifyAfter(prop.Key)
- if event, ok := control.Event[typ]; ok {
- _, err := context.Exec(event)
- if err != nil {
- return err
- }
- }
- return nil
- }
|