From 5202f4cca3dcdc13da9834f0699a78270afa2674 Mon Sep 17 00:00:00 2001 From: Max Date: Sat, 3 Feb 2024 21:03:59 +0800 Subject: [PATCH] Update list action and API to include additional parameters --- widgets/list/action.go | 2 +- widgets/list/api.go | 2 +- widgets/list/fields.go | 20 +++++++++++++++++++- widgets/list/list.go | 17 +++++++++++++++-- widgets/list/process.go | 23 ++++++++++++++++++----- 5 files changed, 54 insertions(+), 10 deletions(-) diff --git a/widgets/list/action.go b/widgets/list/action.go index 67123062..d7054cc3 100644 --- a/widgets/list/action.go +++ b/widgets/list/action.go @@ -13,7 +13,7 @@ var processActionDefaults = map[string]*action.Process{ Name: "yao.list.Setting", Guard: "bearer-jwt", Process: "yao.list.Xgen", - Default: []interface{}{nil}, + Default: []interface{}{nil, nil}, }, "Component": { Name: "yao.list.Component", diff --git a/widgets/list/api.go b/widgets/list/api.go index d8de639f..706b4d59 100644 --- a/widgets/list/api.go +++ b/widgets/list/api.go @@ -81,7 +81,7 @@ func exportAPI() error { Path: "/:id/setting", Method: "GET", Process: "yao.list.Setting", - In: []interface{}{"$param.id"}, + In: []interface{}{"$param.id", ":query"}, Out: api.Out{Status: 200, Type: "application/json"}, } http.Paths = append(http.Paths, path) diff --git a/widgets/list/fields.go b/widgets/list/fields.go index b500a2cb..996ab596 100644 --- a/widgets/list/fields.go +++ b/widgets/list/fields.go @@ -4,7 +4,9 @@ import ( "fmt" "strings" + "github.com/yaoapp/gou/helper" "github.com/yaoapp/gou/model" + "github.com/yaoapp/kun/maps" "github.com/yaoapp/yao/widgets/table" ) @@ -88,10 +90,15 @@ func (fields *FieldsDSL) BindTable(tab *table.DSL) error { } // Xgen trans to xgen setting -func (fields *FieldsDSL) Xgen(layout *LayoutDSL) (map[string]interface{}, error) { +func (fields *FieldsDSL) Xgen(layout *LayoutDSL, query map[string]interface{}) (map[string]interface{}, error) { res := map[string]interface{}{} lists := map[string]interface{}{} messages := []string{} + replacements := maps.Map{} + if query != nil { + replacements = maps.Of(map[string]interface{}{"$parent": query}).Dot() + } + if layout.List != nil && layout.List.Columns != nil { for i, f := range layout.List.Columns { @@ -114,9 +121,20 @@ func (fields *FieldsDSL) Xgen(layout *LayoutDSL) (map[string]interface{}, error) if _, has := field.Edit.Props["$on:change"]; has { delete(field.Edit.Props, "$on:change") } + } lists[name] = field.Map() + + // Bind Parent Data + if query != nil { + if field.Edit != nil && field.Edit.Props != nil { + lists[name] = helper.Bind(lists[name], replacements) + } + if field.View != nil && field.View.Props != nil { + lists[name] = helper.Bind(lists[name], replacements) + } + } } } diff --git a/widgets/list/list.go b/widgets/list/list.go index e1b93eb1..e5cea1a6 100644 --- a/widgets/list/list.go +++ b/widgets/list/list.go @@ -7,9 +7,11 @@ import ( jsoniter "github.com/json-iterator/go" "github.com/yaoapp/gou/application" + "github.com/yaoapp/gou/helper" "github.com/yaoapp/gou/process" "github.com/yaoapp/kun/exception" "github.com/yaoapp/kun/log" + "github.com/yaoapp/kun/maps" "github.com/yaoapp/yao/config" "github.com/yaoapp/yao/share" "github.com/yaoapp/yao/widgets/component" @@ -197,7 +199,7 @@ func MustGet(list interface{}) *DSL { } // Xgen trans to xgen setting -func (dsl *DSL) Xgen(data map[string]interface{}, excludes map[string]bool) (map[string]interface{}, error) { +func (dsl *DSL) Xgen(data map[string]interface{}, excludes map[string]bool, query map[string]interface{}) (map[string]interface{}, error) { if dsl.Layout == nil { dsl.Layout = &LayoutDSL{List: &ViewLayoutDSL{}} @@ -212,7 +214,7 @@ func (dsl *DSL) Xgen(data map[string]interface{}, excludes map[string]bool) (map return nil, err } - fields, err := dsl.Fields.Xgen(layout) + fields, err := dsl.Fields.Xgen(layout, query) if err != nil { return nil, err } @@ -236,9 +238,20 @@ func (dsl *DSL) Xgen(data map[string]interface{}, excludes map[string]bool) (map onChange := map[string]interface{}{} // Hooks setting["fields"] = fields setting["config"] = dsl.Config + + replacements := maps.Map{} + if query != nil { + replacements = maps.Of(map[string]interface{}{"$parent": query}).Dot() + } + for _, cProp := range dsl.CProps { err := cProp.Replace(setting, func(cProp component.CloudPropsDSL) interface{} { + if query != nil { // Replace Query + newQuery := helper.Bind(cProp.Query, replacements) + cProp.Query = newQuery.(map[string]interface{}) + } + if cProp.Type == "Upload" { return fmt.Sprintf("/api/__yao/list/%s%s", dsl.ID, cProp.UploadPath()) } diff --git a/widgets/list/process.go b/widgets/list/process.go index 705d02cb..930a68a6 100644 --- a/widgets/list/process.go +++ b/widgets/list/process.go @@ -25,15 +25,14 @@ func exportProcess() { } func processXgen(process *gouProcess.Process) interface{} { - list := MustGet(process) - data := process.ArgsMap(1, map[string]interface{}{}) + query := process.ArgsMap(1, map[string]interface{}{}) + data := process.ArgsMap(2, map[string]interface{}{}) excludes := app.Permissions(process, "lists", list.ID) - setting, err := list.Xgen(data, excludes) + setting, err := list.Xgen(data, excludes, query) if err != nil { exception.New(err.Error(), 500).Throw() } - return setting } @@ -147,7 +146,21 @@ func processUpload(process *gouProcess.Process) interface{} { func processSetting(process *gouProcess.Process) interface{} { list := MustGet(process) - process.Args = append(process.Args, process.Args[0]) // list name + name := process.ArgsString(0) + params := process.ArgsMap(1, map[string]interface{}{}) + query := map[string]string{} + for key, value := range params { + switch v := value.(type) { + case string: + query[key] = v + case []string: + query[key] = strings.Join(v, ",") + default: + query[key] = fmt.Sprintf("%v", value) + } + } + + process.Args = []interface{}{name, name, query} // list name return list.Action.Setting.MustExec(process) }