[add] widget table API

This commit is contained in:
Max 2022-09-26 21:50:04 +08:00
parent 3e8587af02
commit fd63167935
7 changed files with 259 additions and 3 deletions

View file

@ -15,7 +15,7 @@ var processActionDefaults = map[string]*ProcessActionDSL{
"Setting": {
Name: "yao.table.Setting",
Process: "yao.table.Xgen",
Default: []interface{}{},
Default: []interface{}{nil},
},
"Component": {
Name: "yao.table.Component",

View file

@ -1,3 +1,198 @@
package table
// export api
import (
jsoniter "github.com/json-iterator/go"
"github.com/yaoapp/gou"
"github.com/yaoapp/yao/share"
)
// export API
func exportAPI() error {
http := gou.HTTP{
Name: "Widget Table API",
Description: "Widget Table API",
Version: share.VERSION,
Guard: "-",
Group: "__yao/table",
Paths: []gou.Path{},
}
// GET /api/__yao/table/:id/setting -> Default process: yao.table.Xgen
path := gou.Path{
Label: "Setting",
Description: "Setting",
Path: "/:id/setting",
Method: "GET",
Process: "yao.table.Setting",
In: []string{"$param.id"},
Out: gou.Out{Status: 200, Type: "application/json"},
}
http.Paths = append(http.Paths, path)
// GET /api/__yao/table/:id/search -> Default process: yao.table.Search $param.id :query $query.page $query.pagesize
path = gou.Path{
Label: "Search",
Description: "Search",
Path: "/:id/search",
Method: "GET",
Process: "yao.table.Search",
In: []string{"$param.id", ":query-param", "$query.page", "$query.pagesize"},
Out: gou.Out{Status: 200, Type: "application/json"},
}
http.Paths = append(http.Paths, path)
// GET /api/__yao/table/:id/get -> Default process: yao.table.Get $param.id :query
path = gou.Path{
Label: "Get",
Description: "Get",
Path: "/:id/get",
Method: "GET",
Process: "yao.table.Get",
In: []string{"$param.id", ":query-param"},
Out: gou.Out{Status: 200, Type: "application/json"},
}
http.Paths = append(http.Paths, path)
// GET /api/__yao/table/:id/find/:primary -> Default process: yao.table.Find $param.id $param.primary :query
path = gou.Path{
Label: "Find",
Description: "Find",
Path: "/:id/find/:primary",
Method: "GET",
Process: "yao.table.Find",
In: []string{"$param.id", "$param.primary", ":query-param"},
Out: gou.Out{Status: 200, Type: "application/json"},
}
http.Paths = append(http.Paths, path)
// GET /api/__yao/table/:id/component/:xpath/:method -> Default process: yao.table.Component $param.id $param.xpath $param.method :query
path = gou.Path{
Label: "Find",
Description: "Find",
Path: "/:id/component/:xpath/:method",
Method: "GET",
Process: "yao.table.Component",
In: []string{"$param.id", "$param.xpath", "$param.method", ":query"},
Out: gou.Out{Status: 200, Type: "application/json"},
}
http.Paths = append(http.Paths, path)
// POST /api/__yao/table/:id/save -> Default process: yao.table.Save $param.id :payload
path = gou.Path{
Label: "Save",
Description: "Save",
Path: "/:id/save",
Method: "POST",
Process: "yao.table.Save",
In: []string{"$param.id", ":payload"},
Out: gou.Out{Status: 200, Type: "application/json"},
}
http.Paths = append(http.Paths, path)
// POST /api/__yao/table/:id/create -> Default process: yao.table.Create $param.id :payload
path = gou.Path{
Label: "Create",
Description: "Create",
Path: "/:id/create",
Method: "POST",
Process: "yao.table.Create",
In: []string{"$param.id", ":payload"},
Out: gou.Out{Status: 200, Type: "application/json"},
}
http.Paths = append(http.Paths, path)
// POST /api/__yao/table/:id/insert -> Default process: yao.table.Insert :payload
path = gou.Path{
Label: "Insert",
Description: "Insert",
Path: "/:id/insert",
Method: "POST",
Process: "yao.table.Insert",
In: []string{"$param.id", "$payload.columns", "$payload.values"},
Out: gou.Out{Status: 200, Type: "application/json"},
}
http.Paths = append(http.Paths, path)
// POST /api/__yao/table/:id/update/:primary -> Default process: yao.table.Update $param.id $param.primary :payload
path = gou.Path{
Label: "Update",
Description: "Update",
Path: "/:id/update/:primary",
Method: "POST",
Process: "yao.table.Update",
In: []string{"$param.id", "$param.primary", ":payload"},
Out: gou.Out{Status: 200, Type: "application/json"},
}
http.Paths = append(http.Paths, path)
// POST /api/__yao/table/:id/update/where -> Default process: yao.table.UpdateWhere $param.id :query :payload
path = gou.Path{
Label: "Update Where",
Description: "Update Where",
Path: "/:id/update/where",
Method: "POST",
Process: "yao.table.UpdateWhere",
In: []string{"$param.id", ":query-param", ":payload"},
Out: gou.Out{Status: 200, Type: "application/json"},
}
http.Paths = append(http.Paths, path)
// POST /api/__yao/table/:id/update/in -> Default process: yao.table.UpdateIn $param.id $query.ids :payload
path = gou.Path{
Label: "Update In",
Description: "Update In",
Path: "/:id/update/in",
Method: "POST",
Process: "yao.table.UpdateIn",
In: []string{"$param.id", "$query.ids", ":payload"},
Out: gou.Out{Status: 200, Type: "application/json"},
}
http.Paths = append(http.Paths, path)
// POST /api/__yao/table/:id/delete/:primary -> Default process: yao.table.Delete $param.id $param.primary
path = gou.Path{
Label: "Delete",
Description: "Delete",
Path: "/:id/delete/:primary",
Method: "POST",
Process: "yao.table.Delete",
In: []string{"$param.id", "$param.primary"},
Out: gou.Out{Status: 200, Type: "application/json"},
}
http.Paths = append(http.Paths, path)
// POST /api/__yao/table/:id/delete/where -> Default process: yao.table.DeleteWhere $param.id :query
path = gou.Path{
Label: "Delete Where",
Description: "Delete Where",
Path: "/:id/delete/where",
Method: "POST",
Process: "yao.table.DeleteWhere",
In: []string{"$param.id", ":query-param"},
Out: gou.Out{Status: 200, Type: "application/json"},
}
http.Paths = append(http.Paths, path)
// POST /api/__yao/table/:id/delete/in -> Default process: yao.table.DeleteIn $param.id $query.ids
path = gou.Path{
Label: "Delete In",
Description: "Delete In",
Path: "/:id/delete/in",
Method: "POST",
Process: "yao.table.DeleteIn",
In: []string{"$param.id", "$query.ids"},
Out: gou.Out{Status: 200, Type: "application/json"},
}
http.Paths = append(http.Paths, path)
// api source
source, err := jsoniter.Marshal(http)
if err != nil {
return err
}
// load apis
_, err = gou.LoadAPIReturn(string(source), "widgets.table")
return err
}

View file

@ -3,5 +3,5 @@ package table
// Export process & api
func Export() error {
exportProcess()
return nil
return exportAPI()
}

View file

@ -70,6 +70,7 @@ func processComponent(process *gou.Process) interface{} {
func processSetting(process *gou.Process) interface{} {
tab := MustGet(process)
process.Args = append(process.Args, process.Args[0]) // table name
return tab.Action.Setting.MustExec(process)
}

View file

@ -348,6 +348,23 @@ func TestProcessComponentError(t *testing.T) {
assert.Contains(t, err.Error(), "fields.filter.edit.props.状态.::not-exist")
}
func TestProcessSetting(t *testing.T) {
load(t)
clear(t)
testData(t)
args := []interface{}{"pet"}
res, err := gou.NewProcess("yao.table.Setting", args...).Exec()
if err != nil {
t.Fatal(err)
}
data := any.Of(res).MapStr().Dot()
assert.Equal(t, "/api/xiang/import/pet", data.Get("header.preset.import.api.import"))
assert.Equal(t, "跳转", data.Get("header.preset.import.operation.0.title"))
assert.Equal(t, "/api/__yao/table/pet/component/fields.table.入院状态.view.props.xProps/remote", data.Get("fields.table.入院状态.view.props.xProps.remote.api"))
assert.Equal(t, "/api/__yao/table/pet/component/fields.table.入院状态.edit.props.xProps/remote", data.Get("fields.table.入院状态.edit.props.xProps.remote.api"))
}
func TestProcessXgen(t *testing.T) {
load(t)
clear(t)

View file

@ -4,6 +4,7 @@ import (
"github.com/yaoapp/yao/config"
"github.com/yaoapp/yao/widgets/app"
"github.com/yaoapp/yao/widgets/login"
"github.com/yaoapp/yao/widgets/table"
)
// Load the widgets
@ -30,5 +31,15 @@ func Load(cfg config.Config) error {
return err
}
// table widget
err = table.Load(cfg)
if err != nil {
return err
}
err = table.Export()
if err != nil {
return err
}
return nil
}

View file

@ -1,13 +1,45 @@
package widgets
import (
"os"
"testing"
"github.com/stretchr/testify/assert"
"github.com/yaoapp/yao/config"
"github.com/yaoapp/yao/lang"
"github.com/yaoapp/yao/model"
"github.com/yaoapp/yao/script"
"github.com/yaoapp/yao/share"
)
func TestLoad(t *testing.T) {
prepare(t)
err := Load(config.Conf)
assert.Nil(t, err)
}
func prepare(t *testing.T, language ...string) {
// langs
if len(language) < 1 {
os.Unsetenv("YAO_LANG")
} else {
os.Setenv("YAO_LANG", language[0])
}
lang.Load(config.Conf)
share.DBConnect(config.Conf.DB) // removed later
// load scripts
err := script.Load(config.Conf)
if err != nil {
t.Fatal(err)
}
// load models
err = model.Load(config.Conf)
if err != nil {
t.Fatal(err)
}
}