瀏覽代碼

:art: Candidate values of the database relation fields are no longer subject to view filtering https://github.com/siyuan-note/siyuan/issues/10411

Daniel 1 年之前
父節點
當前提交
bc6d6b17f7
共有 2 個文件被更改,包括 25 次插入6 次删除
  1. 2 1
      kernel/api/av.go
  2. 23 5
      kernel/model/attribute_view.go

+ 2 - 1
kernel/api/av.go

@@ -48,7 +48,7 @@ func getAttributeViewPrimaryKeyValues(c *gin.Context) {
 		pageSize = int(pageSizeArg.(float64))
 	}
 
-	rows, err := model.GetAttributeViewPrimaryKeyValues(id, page, pageSize)
+	attributeViewName, rows, err := model.GetAttributeViewPrimaryKeyValues(id, page, pageSize)
 	if nil != err {
 		ret.Code = -1
 		ret.Msg = err.Error()
@@ -56,6 +56,7 @@ func getAttributeViewPrimaryKeyValues(c *gin.Context) {
 	}
 
 	ret.Data = map[string]interface{}{
+		"name": attributeViewName,
 		"rows": rows,
 	}
 }

+ 23 - 5
kernel/model/attribute_view.go

@@ -38,7 +38,7 @@ import (
 	"github.com/siyuan-note/siyuan/kernel/util"
 )
 
-func GetAttributeViewPrimaryKeyValues(avID string, page, pageSize int) (ret *av.KeyValues, err error) {
+func GetAttributeViewPrimaryKeyValues(avID string, page, pageSize int) (attributeViewName string, keyValues *av.KeyValues, err error) {
 	waitForSyncingStorages()
 
 	attrView, err := av.ParseAttributeView(avID)
@@ -46,17 +46,35 @@ func GetAttributeViewPrimaryKeyValues(avID string, page, pageSize int) (ret *av.
 		logging.LogErrorf("parse attribute view [%s] failed: %s", avID, err)
 		return
 	}
+	attributeViewName = attrView.Name
+
+	keyValues = attrView.GetBlockKeyValues()
+	// 不在视图中的值要过滤掉
+	tmp := map[string]*av.Value{}
+	for _, kv := range keyValues.Values {
+		for _, view := range attrView.Views {
+			switch view.LayoutType {
+			case av.LayoutTypeTable:
+				if gulu.Str.Contains(kv.Block.ID, view.Table.RowIDs) {
+					tmp[kv.Block.ID] = kv
+				}
+			}
+		}
+	}
+	keyValues.Values = []*av.Value{}
+	for _, v := range tmp {
+		keyValues.Values = append(keyValues.Values, v)
+	}
 
-	ret = attrView.GetBlockKeyValues()
 	if 1 > pageSize {
 		pageSize = 50
 	}
 	start := (page - 1) * pageSize
 	end := start + pageSize
-	if len(ret.Values) < end {
-		end = len(ret.Values)
+	if len(keyValues.Values) < end {
+		end = len(keyValues.Values)
 	}
-	ret.Values = ret.Values[start:end]
+	keyValues.Values = keyValues.Values[start:end]
 	return
 }