From cbcc8141a81f36ffc77b4db4e0f6bc4fc2d1c9eb Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Fri, 8 Mar 2024 23:49:27 +0800 Subject: [PATCH] :art: Database table view in-table search https://github.com/siyuan-note/siyuan/issues/10419 --- kernel/api/av.go | 8 +++++++- kernel/model/attribute_view.go | 27 ++++++++++++++++++++++++++- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/kernel/api/av.go b/kernel/api/av.go index 0a036c8e0..5c379d1dd 100644 --- a/kernel/api/av.go +++ b/kernel/api/av.go @@ -485,7 +485,13 @@ func renderAttributeView(c *gin.Context) { pageSize = int(pageSizeArg.(float64)) } - view, attrView, err := model.RenderAttributeView(id, viewID, page, pageSize) + query := "" + queryArg := arg["query"] + if nil != queryArg { + query = queryArg.(string) + } + + view, attrView, err := model.RenderAttributeView(id, viewID, query, page, pageSize) if nil != err { ret.Code = -1 ret.Msg = err.Error() diff --git a/kernel/model/attribute_view.go b/kernel/model/attribute_view.go index fb93825cc..e9dba2d23 100644 --- a/kernel/model/attribute_view.go +++ b/kernel/model/attribute_view.go @@ -596,7 +596,7 @@ func RenderHistoryAttributeView(avID, created string) (viewable av.Viewable, att return } -func RenderAttributeView(avID, viewID string, page, pageSize int) (viewable av.Viewable, attrView *av.AttributeView, err error) { +func RenderAttributeView(avID, viewID, query string, page, pageSize int) (viewable av.Viewable, attrView *av.AttributeView, err error) { waitForSyncingStorages() if avJSONPath := av.GetAttributeViewDataPath(avID); !filelock.IsExist(avJSONPath) { @@ -614,6 +614,31 @@ func RenderAttributeView(avID, viewID string, page, pageSize int) (viewable av.V } viewable, err = renderAttributeView(attrView, viewID, page, pageSize) + + query = strings.TrimSpace(query) + if "" != query { + keywords := strings.Split(query, " ") + var rows []*av.TableRow + switch viewable.GetType() { + case av.LayoutTypeTable: + table := viewable.(*av.Table) + for _, row := range table.Rows { + hit := false + for _, cell := range row.Cells { + for _, keyword := range keywords { + if strings.Contains(strings.ToLower(cell.Value.String()), strings.ToLower(keyword)) { + hit = true + break + } + } + } + if hit { + rows = append(rows, row) + } + } + table.Rows = rows + } + } return }