Ver Fonte

:art: Improve search jump focus block and then exit focus positioning https://github.com/siyuan-note/siyuan/issues/13577

Daniel há 6 meses atrás
pai
commit
9e2bab6718
3 ficheiros alterados com 40 adições e 0 exclusões
  1. 16 0
      kernel/api/block.go
  2. 1 0
      kernel/api/router.go
  3. 23 0
      kernel/model/block.go

+ 16 - 0
kernel/api/block.go

@@ -224,6 +224,22 @@ func setBlockReminder(c *gin.Context) {
 	}
 }
 
+func getUnfoldedParentID(c *gin.Context) {
+	ret := gulu.Ret.NewResult()
+	defer c.JSON(http.StatusOK, ret)
+
+	arg, ok := util.JsonArg(c, ret)
+	if !ok {
+		return
+	}
+
+	id := arg["id"].(string)
+	parentID := model.GetUnfoldedParentID(id)
+	ret.Data = map[string]interface{}{
+		"parentID": parentID,
+	}
+}
+
 func checkBlockFold(c *gin.Context) {
 	ret := gulu.Ret.NewResult()
 	defer c.JSON(http.StatusOK, ret)

+ 1 - 0
kernel/api/router.go

@@ -189,6 +189,7 @@ func ServeAPI(ginServer *gin.Engine) {
 	ginServer.Handle("POST", "/api/block/getDocInfo", model.CheckAuth, getDocInfo)
 	ginServer.Handle("POST", "/api/block/getDocsInfo", model.CheckAuth, getDocsInfo)
 	ginServer.Handle("POST", "/api/block/checkBlockExist", model.CheckAuth, checkBlockExist)
+	ginServer.Handle("POST", "/api/block/getUnfoldedParentID", model.CheckAuth, getUnfoldedParentID)
 	ginServer.Handle("POST", "/api/block/checkBlockFold", model.CheckAuth, checkBlockFold)
 	ginServer.Handle("POST", "/api/block/insertBlock", model.CheckAuth, model.CheckAdminRole, model.CheckReadonly, insertBlock)
 	ginServer.Handle("POST", "/api/block/prependBlock", model.CheckAuth, model.CheckAdminRole, model.CheckReadonly, prependBlock)

+ 23 - 0
kernel/model/block.go

@@ -257,6 +257,29 @@ func GetBlockSiblingID(id string) (parent, previous, next string) {
 	return
 }
 
+func GetUnfoldedParentID(id string) (parentID string) {
+	tree, err := LoadTreeByBlockID(id)
+	if err != nil {
+		return
+	}
+
+	node := treenode.GetNodeInTree(tree, id)
+	if nil == node {
+		return
+	}
+
+	if !node.IsBlock() {
+		return
+	}
+
+	for parent := treenode.HeadingParent(node); nil != parent && ast.NodeDocument != parent.Type; parent = treenode.HeadingParent(parent) {
+		if "1" != parent.IALAttr("fold") {
+			return parent.ID
+		}
+	}
+	return
+}
+
 func IsBlockFolded(id string) (isFolded, isRoot bool) {
 	tree, _ := LoadTreeByBlockID(id)
 	if nil == tree {