From bab61e8cbd4e1c79054f8674537f594b08674760 Mon Sep 17 00:00:00 2001 From: Max Date: Wed, 14 Dec 2022 00:18:41 +0800 Subject: [PATCH] [add] widget.fields & widget.filters --- widgets/action.go | 2 +- widgets/field.go | 145 ++++++++++++++++++++++++++++++++++++++++ widgets/field/column.go | 5 ++ widgets/field/filter.go | 5 ++ widgets/process.go | 12 ++++ widgets/process_test.go | 20 ++++++ 6 files changed, 188 insertions(+), 1 deletion(-) create mode 100644 widgets/field.go diff --git a/widgets/action.go b/widgets/action.go index e2f1fd45..620db0ef 100644 --- a/widgets/action.go +++ b/widgets/action.go @@ -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, diff --git a/widgets/field.go b/widgets/field.go new file mode 100644 index 00000000..877175a8 --- /dev/null +++ b/widgets/field.go @@ -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 +} diff --git a/widgets/field/column.go b/widgets/field/column.go index 73741e34..3c659a33 100644 --- a/widgets/field/column.go +++ b/widgets/field/column.go @@ -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 } diff --git a/widgets/field/filter.go b/widgets/field/filter.go index e8e98bf3..6d12f1f8 100644 --- a/widgets/field/filter.go +++ b/widgets/field/filter.go @@ -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 } diff --git a/widgets/process.go b/widgets/process.go index 3a7c99c9..f65677e5 100644 --- a/widgets/process.go +++ b/widgets/process.go @@ -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() {} diff --git a/widgets/process_test.go b/widgets/process_test.go index 83010a4b..5ce3fd56 100644 --- a/widgets/process_test.go +++ b/widgets/process_test.go @@ -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)