Browse Source

:art: Supports searching database blocks by the view title https://github.com/siyuan-note/siyuan/issues/9348

Daniel 1 year ago
parent
commit
d38311c48c
5 changed files with 40 additions and 28 deletions
  1. 4 0
      kernel/av/av.go
  2. 17 24
      kernel/model/attribute_view.go
  3. 3 2
      kernel/model/import.go
  4. 2 2
      kernel/model/transaction.go
  5. 14 0
      kernel/treenode/node.go

+ 4 - 0
kernel/av/av.go

@@ -493,3 +493,7 @@ var (
 	ErrViewNotFound = errors.New("view not found")
 	ErrViewNotFound = errors.New("view not found")
 	ErrKeyNotFound  = errors.New("key not found")
 	ErrKeyNotFound  = errors.New("key not found")
 )
 )
+
+const (
+	NodeAttrNameAvs = "custom-avs" // 用于标记块所属的属性视图,逗号分隔 av id
+)

+ 17 - 24
kernel/model/attribute_view.go

@@ -70,7 +70,7 @@ func GetBlockAttributeViewKeys(blockID string) (ret []*BlockAttributeViewKeys) {
 
 
 	ret = []*BlockAttributeViewKeys{}
 	ret = []*BlockAttributeViewKeys{}
 	attrs := GetBlockAttrs(blockID)
 	attrs := GetBlockAttrs(blockID)
-	avs := attrs[NodeAttrNameAvs]
+	avs := attrs[av.NodeAttrNameAvs]
 	if "" == avs {
 	if "" == avs {
 		return
 		return
 	}
 	}
@@ -352,16 +352,13 @@ func setAttributeViewName(operation *Operation) (err error) {
 		return
 		return
 	}
 	}
 
 
-	attrView.Name = operation.Data.(string)
-
-	data, err := gulu.JSON.MarshalJSON(attrView)
+	view, err := attrView.GetView()
 	if nil != err {
 	if nil != err {
 		return
 		return
 	}
 	}
 
 
-	if err = gulu.JSON.UnmarshalJSON(data, attrView); nil != err {
-		return
-	}
+	attrView.Name = operation.Data.(string)
+	view.Name = operation.Data.(string)
 
 
 	err = av.SaveAttributeView(attrView)
 	err = av.SaveAttributeView(attrView)
 	return
 	return
@@ -554,13 +551,13 @@ func addAttributeViewBlock(blockID string, operation *Operation, tree *parse.Tre
 	if !operation.IsDetached {
 	if !operation.IsDetached {
 		attrs := parse.IAL2Map(node.KramdownIAL)
 		attrs := parse.IAL2Map(node.KramdownIAL)
 
 
-		if "" == attrs[NodeAttrNameAvs] {
-			attrs[NodeAttrNameAvs] = operation.AvID
+		if "" == attrs[av.NodeAttrNameAvs] {
+			attrs[av.NodeAttrNameAvs] = operation.AvID
 		} else {
 		} else {
-			avIDs := strings.Split(attrs[NodeAttrNameAvs], ",")
+			avIDs := strings.Split(attrs[av.NodeAttrNameAvs], ",")
 			avIDs = append(avIDs, operation.AvID)
 			avIDs = append(avIDs, operation.AvID)
 			avIDs = gulu.Str.RemoveDuplicatedElem(avIDs)
 			avIDs = gulu.Str.RemoveDuplicatedElem(avIDs)
-			attrs[NodeAttrNameAvs] = strings.Join(avIDs, ",")
+			attrs[av.NodeAttrNameAvs] = strings.Join(avIDs, ",")
 		}
 		}
 
 
 		if err = setNodeAttrsWithTx(tx, node, tree, attrs); nil != err {
 		if err = setNodeAttrsWithTx(tx, node, tree, attrs); nil != err {
@@ -628,15 +625,15 @@ func (tx *Transaction) removeAttributeViewBlock(operation *Operation) (err error
 								node.RemoveIALAttr("custom-hidden")
 								node.RemoveIALAttr("custom-hidden")
 							}
 							}
 
 
-							if avs := attrs[NodeAttrNameAvs]; "" != avs {
+							if avs := attrs[av.NodeAttrNameAvs]; "" != avs {
 								avIDs := strings.Split(avs, ",")
 								avIDs := strings.Split(avs, ",")
 								avIDs = gulu.Str.RemoveElem(avIDs, operation.AvID)
 								avIDs = gulu.Str.RemoveElem(avIDs, operation.AvID)
 								if 0 == len(avIDs) {
 								if 0 == len(avIDs) {
-									delete(attrs, NodeAttrNameAvs)
-									node.RemoveIALAttr(NodeAttrNameAvs)
+									delete(attrs, av.NodeAttrNameAvs)
+									node.RemoveIALAttr(av.NodeAttrNameAvs)
 								} else {
 								} else {
-									attrs[NodeAttrNameAvs] = strings.Join(avIDs, ",")
-									node.SetIALAttr(NodeAttrNameAvs, strings.Join(avIDs, ","))
+									attrs[av.NodeAttrNameAvs] = strings.Join(avIDs, ",")
+									node.SetIALAttr(av.NodeAttrNameAvs, strings.Join(avIDs, ","))
 								}
 								}
 							}
 							}
 
 
@@ -1160,17 +1157,17 @@ func bindBlockAv(tx *Transaction, avID, blockID string) {
 	}
 	}
 
 
 	attrs := parse.IAL2Map(node.KramdownIAL)
 	attrs := parse.IAL2Map(node.KramdownIAL)
-	if "" == attrs[NodeAttrNameAvs] {
-		attrs[NodeAttrNameAvs] = avID
+	if "" == attrs[av.NodeAttrNameAvs] {
+		attrs[av.NodeAttrNameAvs] = avID
 	} else {
 	} else {
-		avIDs := strings.Split(attrs[NodeAttrNameAvs], ",")
+		avIDs := strings.Split(attrs[av.NodeAttrNameAvs], ",")
 		if gulu.Str.Contains(avID, avIDs) {
 		if gulu.Str.Contains(avID, avIDs) {
 			return
 			return
 		}
 		}
 
 
 		avIDs = append(avIDs, avID)
 		avIDs = append(avIDs, avID)
 		avIDs = gulu.Str.RemoveDuplicatedElem(avIDs)
 		avIDs = gulu.Str.RemoveDuplicatedElem(avIDs)
-		attrs[NodeAttrNameAvs] = strings.Join(avIDs, ",")
+		attrs[av.NodeAttrNameAvs] = strings.Join(avIDs, ",")
 	}
 	}
 
 
 	if nil != tx {
 	if nil != tx {
@@ -1346,7 +1343,3 @@ func updateAttributeViewColumnOption(operation *Operation) (err error) {
 	err = av.SaveAttributeView(attrView)
 	err = av.SaveAttributeView(attrView)
 	return
 	return
 }
 }
-
-const (
-	NodeAttrNameAvs = "custom-avs" // 用于标记块所属的属性视图,逗号分隔 av id
-)

+ 3 - 2
kernel/model/import.go

@@ -22,6 +22,7 @@ import (
 	"encoding/json"
 	"encoding/json"
 	"errors"
 	"errors"
 	"fmt"
 	"fmt"
+	"github.com/siyuan-note/siyuan/kernel/av"
 	"image"
 	"image"
 	"image/jpeg"
 	"image/jpeg"
 	"image/png"
 	"image/png"
@@ -154,7 +155,7 @@ func ImportSY(zipPath, boxID, toPath string) (err error) {
 			// 重新指向数据库属性值
 			// 重新指向数据库属性值
 			ial := parse.IAL2Map(n.KramdownIAL)
 			ial := parse.IAL2Map(n.KramdownIAL)
 			for k, _ := range ial {
 			for k, _ := range ial {
-				if strings.HasPrefix(k, NodeAttrNameAvs) {
+				if strings.HasPrefix(k, av.NodeAttrNameAvs) {
 					avBlockIDs[oldNodeID] = newNodeID
 					avBlockIDs[oldNodeID] = newNodeID
 				}
 				}
 			}
 			}
@@ -257,7 +258,7 @@ func ImportSY(zipPath, boxID, toPath string) (err error) {
 
 
 				ial := parse.IAL2Map(n.KramdownIAL)
 				ial := parse.IAL2Map(n.KramdownIAL)
 				for k, v := range ial {
 				for k, v := range ial {
-					if strings.HasPrefix(k, NodeAttrNameAvs) {
+					if strings.HasPrefix(k, av.NodeAttrNameAvs) {
 						newKey, newVal := k, v
 						newKey, newVal := k, v
 						for oldAvID, newAvID := range avIDs {
 						for oldAvID, newAvID := range avIDs {
 							newKey = strings.ReplaceAll(newKey, oldAvID, newAvID)
 							newKey = strings.ReplaceAll(newKey, oldAvID, newAvID)

+ 2 - 2
kernel/model/transaction.go

@@ -714,7 +714,7 @@ func (tx *Transaction) doDelete(operation *Operation) (ret *TxErr) {
 }
 }
 
 
 func syncDelete2AttributeView(node *ast.Node) {
 func syncDelete2AttributeView(node *ast.Node) {
-	avs := node.IALAttr(NodeAttrNameAvs)
+	avs := node.IALAttr(av.NodeAttrNameAvs)
 	if "" == avs {
 	if "" == avs {
 		return
 		return
 	}
 	}
@@ -1233,7 +1233,7 @@ func refreshDynamicRefTexts(updatedDefNodes map[string]*ast.Node, updatedTrees m
 
 
 	// 2. 更新属性视图主键内容
 	// 2. 更新属性视图主键内容
 	for _, updatedDefNode := range updatedDefNodes {
 	for _, updatedDefNode := range updatedDefNodes {
-		avs := updatedDefNode.IALAttr(NodeAttrNameAvs)
+		avs := updatedDefNode.IALAttr(av.NodeAttrNameAvs)
 		if "" == avs {
 		if "" == avs {
 			continue
 			continue
 		}
 		}

+ 14 - 0
kernel/treenode/node.go

@@ -18,6 +18,7 @@ package treenode
 
 
 import (
 import (
 	"bytes"
 	"bytes"
+	"github.com/siyuan-note/siyuan/kernel/av"
 	"strings"
 	"strings"
 	"sync"
 	"sync"
 
 
@@ -139,6 +140,19 @@ func NodeStaticContent(node *ast.Node, excludeTypes []string, includeTextMarkATi
 
 
 	if ast.NodeDocument == node.Type {
 	if ast.NodeDocument == node.Type {
 		return node.IALAttr("title")
 		return node.IALAttr("title")
+	} else if ast.NodeAttributeView == node.Type {
+		if "" != node.AttributeViewID {
+			attrView, err := av.ParseAttributeView(node.AttributeViewID)
+			if nil == err {
+				buf := bytes.Buffer{}
+				for _, v := range attrView.Views {
+					buf.WriteString(v.Name)
+					buf.WriteString(" ")
+				}
+				return strings.TrimSpace(buf.String())
+			}
+		}
+		return ""
 	}
 	}
 
 
 	buf := bytes.Buffer{}
 	buf := bytes.Buffer{}