[add] widget.fields & widget.filters

This commit is contained in:
Max 2022-12-14 00:18:41 +08:00
parent 72b9a8b62d
commit bab61e8cbd
6 changed files with 188 additions and 1 deletions

View file

@ -55,7 +55,7 @@ func widgetActions(actions map[string]interface{}, widget WidgetAction, widgetID
items := widget.Actions()
if len(items) > 0 {
actions[dsl] = map[string]interface{}{
"items": widget.Actions(),
"items": items,
"DSL": dsl,
"ID": widgetID,
"name": name,

145
widgets/field.go Normal file
View file

@ -0,0 +1,145 @@
package widgets
import (
"fmt"
"os"
"sort"
"strings"
"github.com/yaoapp/yao/widgets/chart"
"github.com/yaoapp/yao/widgets/field"
"github.com/yaoapp/yao/widgets/form"
"github.com/yaoapp/yao/widgets/list"
"github.com/yaoapp/yao/widgets/table"
)
// Fields return loaded widgets fields
func Fields() []Item {
fields := map[string]interface{}{}
tableFields(fields)
formFields(fields)
listFields(fields)
chartFields(fields)
grouping := Grouping(fields)
items := Array(grouping, []Item{})
Sort(items, []string{"tables", "forms", "lists", "charts"})
return items
}
// Filters return loaded widgets filters
func Filters() []Item {
filters := map[string]interface{}{}
tableFilters(filters)
chartFilters(filters)
grouping := Grouping(filters)
items := Array(grouping, []Item{})
Sort(items, []string{"tables", "forms", "lists", "charts"})
return items
}
func tableFields(fields map[string]interface{}) {
for id, widget := range table.Tables {
dsl := fmt.Sprintf("tables%s%s.tab.json", string(os.PathSeparator), strings.ReplaceAll(id, ".", string(os.PathSeparator)))
widgetFields(fields, widget.Fields.Table, id, dsl, widget.Name)
}
}
func formFields(fields map[string]interface{}) {
for id, widget := range form.Forms {
dsl := fmt.Sprintf("forms%s%s.form.json", string(os.PathSeparator), strings.ReplaceAll(id, ".", string(os.PathSeparator)))
widgetFields(fields, widget.Fields.Form, id, dsl, widget.Name)
}
}
func chartFields(fields map[string]interface{}) {
for id, widget := range chart.Charts {
dsl := fmt.Sprintf("charts%s%s.chart.json", string(os.PathSeparator), strings.ReplaceAll(id, ".", string(os.PathSeparator)))
widgetFields(fields, widget.Fields.Chart, id, dsl, widget.Name)
}
}
func listFields(fields map[string]interface{}) {
for id, widget := range list.Lists {
dsl := fmt.Sprintf("lists%s%s.list.json", string(os.PathSeparator), strings.ReplaceAll(id, ".", string(os.PathSeparator)))
widgetFields(fields, widget.Fields.List, id, dsl, widget.Name)
}
}
func tableFilters(filters map[string]interface{}) {
for id, widget := range table.Tables {
dsl := fmt.Sprintf("tables%s%s.tab.json", string(os.PathSeparator), strings.ReplaceAll(id, ".", string(os.PathSeparator)))
widgetFilters(filters, widget.Fields.Filter, id, dsl, widget.Name)
}
}
func chartFilters(filters map[string]interface{}) {
for id, widget := range chart.Charts {
dsl := fmt.Sprintf("charts%s%s.chart.json", string(os.PathSeparator), strings.ReplaceAll(id, ".", string(os.PathSeparator)))
widgetFilters(filters, widget.Fields.Filter, id, dsl, widget.Name)
}
}
func widgetFields(items map[string]interface{}, fields map[string]field.ColumnDSL, widgetID string, dsl string, name string) map[string]interface{} {
fieldlist := []map[string]string{}
if fields != nil {
names := []string{}
mapping := map[string]string{}
for name, field := range fields {
if field.ID != "" {
mapping[name] = field.ID
names = append(names, name)
}
}
sort.Strings(names)
for _, name := range names {
fieldlist = append(fieldlist, map[string]string{
"name": name,
"id": mapping[name],
})
}
}
items[dsl] = map[string]interface{}{
"items": fieldlist,
"DSL": dsl,
"ID": widgetID,
"name": name,
}
return nil
}
func widgetFilters(items map[string]interface{}, fields map[string]field.FilterDSL, widgetID string, dsl string, name string) map[string]interface{} {
fieldlist := []map[string]string{}
if fields != nil {
names := []string{}
mapping := map[string]string{}
for name, field := range fields {
if field.ID != "" {
mapping[name] = field.ID
names = append(names, name)
}
}
sort.Strings(names)
for _, name := range names {
fieldlist = append(fieldlist, map[string]string{
"name": name,
"id": mapping[name],
})
}
}
items[dsl] = map[string]interface{}{
"items": fieldlist,
"DSL": dsl,
"ID": widgetID,
"name": name,
}
return nil
}

View file

@ -63,6 +63,11 @@ func (column ColumnDSL) Replace(data map[string]interface{}) (*ColumnDSL, error)
}
}
new.ID, err = column.Hash()
if err != nil {
return nil, err
}
return &new, nil
}

View file

@ -56,6 +56,11 @@ func (filter FilterDSL) Replace(data map[string]interface{}) (*FilterDSL, error)
}
}
new.ID, err = filter.Hash()
if err != nil {
return nil, err
}
return &new, nil
}

View file

@ -9,6 +9,8 @@ var WidgetHandlers = map[string]gou.ProcessHandler{
"apis": processApis,
"actions": processActions,
"models": processModels,
"fields": processFields,
"filters": processFilters,
}
func init() {
@ -30,6 +32,16 @@ func processModels(process *gou.Process) interface{} {
return Models()
}
// Get the loaded Fields
func processFields(process *gou.Process) interface{} {
return Fields()
}
// Get the loaded Filters
func processFilters(process *gou.Process) interface{} {
return Filters()
}
// Get the loaded flows
func processFlows() {}

View file

@ -38,6 +38,26 @@ func TestProcessModels(t *testing.T) {
assert.Greater(t, len(res.([]Item)), 0)
}
func TestProcessFields(t *testing.T) {
testData(t)
args := []interface{}{}
res, err := gou.NewProcess("widget.fields", args...).Exec()
if err != nil {
t.Fatal(err)
}
assert.Greater(t, len(res.([]Item)), 0)
}
func TestProcessFilters(t *testing.T) {
testData(t)
args := []interface{}{}
res, err := gou.NewProcess("widget.filters", args...).Exec()
if err != nil {
t.Fatal(err)
}
assert.Greater(t, len(res.([]Item)), 0)
}
func testData(t *testing.T) {
prepare(t)
err := Load(config.Conf)