From f72cbf99a02d299cbd8717b7fbd3a8adf6b6de90 Mon Sep 17 00:00:00 2001 From: Jeffrey Chen <78434827+TCOTC@users.noreply.github.com> Date: Thu, 26 Feb 2026 22:13:06 +0800 Subject: [PATCH 1/2] :recycle: Remove unused parameters (#17091) --- kernel/api/av.go | 2 +- kernel/model/attribute_view.go | 12 ++++-------- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/kernel/api/av.go b/kernel/api/av.go index ab4cfc2c3..b8942873a 100644 --- a/kernel/api/av.go +++ b/kernel/api/av.go @@ -456,7 +456,7 @@ func addAttributeViewBlocks(c *gin.Context) { ignoreDefaultFill = arg["ignoreDefaultFill"].(bool) } - err := model.AddAttributeViewBlock(nil, srcs, avID, blockID, viewID, groupID, previousID, ignoreDefaultFill, map[string]interface{}{}) + err := model.AddAttributeViewBlock(nil, srcs, avID, blockID, viewID, groupID, previousID, ignoreDefaultFill) if err != nil { ret.Code = -1 ret.Msg = err.Error() diff --git a/kernel/model/attribute_view.go b/kernel/model/attribute_view.go index 5bcf8fe1a..f927a637b 100644 --- a/kernel/model/attribute_view.go +++ b/kernel/model/attribute_view.go @@ -3457,18 +3457,14 @@ func setAttributeViewColumnCalc(operation *Operation) (err error) { } func (tx *Transaction) doInsertAttrViewBlock(operation *Operation) (ret *TxErr) { - if nil == operation.Context { - operation.Context = map[string]interface{}{} - } - - err := AddAttributeViewBlock(tx, operation.Srcs, operation.AvID, operation.BlockID, operation.ViewID, operation.GroupID, operation.PreviousID, operation.IgnoreDefaultFill, operation.Context) + err := AddAttributeViewBlock(tx, operation.Srcs, operation.AvID, operation.BlockID, operation.ViewID, operation.GroupID, operation.PreviousID, operation.IgnoreDefaultFill) if err != nil { return &TxErr{code: TxErrHandleAttributeView, id: operation.AvID, msg: err.Error()} } return } -func AddAttributeViewBlock(tx *Transaction, srcs []map[string]interface{}, avID, dbBlockID, viewID, groupID, previousItemID string, ignoreDefaultFill bool, context map[string]interface{}) (err error) { +func AddAttributeViewBlock(tx *Transaction, srcs []map[string]interface{}, avID, dbBlockID, viewID, groupID, previousItemID string, ignoreDefaultFill bool) (err error) { slices.Reverse(srcs) // https://github.com/siyuan-note/siyuan/issues/11286 now := time.Now().UnixMilli() @@ -3503,14 +3499,14 @@ func AddAttributeViewBlock(tx *Transaction, srcs []map[string]interface{}, avID, if nil != src["content"] { srcContent = src["content"].(string) } - if avErr := addAttributeViewBlock(now, avID, dbBlockID, viewID, groupID, previousItemID, srcItemID, boundBlockID, srcContent, isDetached, ignoreDefaultFill, tree, tx, context); nil != avErr { + if avErr := addAttributeViewBlock(now, avID, dbBlockID, viewID, groupID, previousItemID, srcItemID, boundBlockID, srcContent, isDetached, ignoreDefaultFill, tree, tx); nil != avErr { return avErr } } return } -func addAttributeViewBlock(now int64, avID, dbBlockID, viewID, groupID, previousItemID, addingItemID, addingBoundBlockID, addingBlockContent string, isDetached, ignoreDefaultFill bool, tree *parse.Tree, tx *Transaction, context map[string]interface{}) (err error) { +func addAttributeViewBlock(now int64, avID, dbBlockID, viewID, groupID, previousItemID, addingItemID, addingBoundBlockID, addingBlockContent string, isDetached, ignoreDefaultFill bool, tree *parse.Tree, tx *Transaction) (err error) { var node *ast.Node if !isDetached { node = treenode.GetNodeInTree(tree, addingBoundBlockID) From 8c8aaa6a69885cd60d3d4c9385eb5a68b8950970 Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Fri, 27 Feb 2026 10:28:37 +0800 Subject: [PATCH 2/2] :bug: Outdent of list items causes database bind blocks to be deleted https://github.com/siyuan-note/siyuan/issues/17108 Signed-off-by: Daniel <845765@qq.com> --- kernel/model/file.go | 2 +- kernel/model/transaction.go | 92 ++++++++++++++++++++----------------- 2 files changed, 52 insertions(+), 42 deletions(-) diff --git a/kernel/model/file.go b/kernel/model/file.go index 9bdfd1ad5..adcd019d9 100644 --- a/kernel/model/file.go +++ b/kernel/model/file.go @@ -1603,7 +1603,7 @@ func removeDoc(box *Box, p string, luteEngine *lute.Lute) (ret *parse.Tree) { continue } - syncDelete2AvBlock(removeTree.Root, removeTree, nil) + syncDelete2AvBlock(removeTree.Root, removeTree, true, nil) } if existChildren { diff --git a/kernel/model/transaction.go b/kernel/model/transaction.go index 3162924f9..a94c37be4 100644 --- a/kernel/model/transaction.go +++ b/kernel/model/transaction.go @@ -1011,12 +1011,12 @@ func (tx *Transaction) doDelete0(operation *Operation, tree *parse.Tree) { } if needSyncDel2AvBlock { - syncDelete2AvBlock(node, tree, tx) + syncDelete2AvBlock(node, tree, true, tx) } } -func syncDelete2AvBlock(node *ast.Node, nodeTree *parse.Tree, tx *Transaction) { - changedAvIDs := syncDelete2AttributeView(node) +func syncDelete2AvBlock(node *ast.Node, nodeTree *parse.Tree, delChildrenWhenDelParent bool, tx *Transaction) { + changedAvIDs := syncDelete2AttributeView(node, delChildrenWhenDelParent) avIDs := tx.syncDelete2Block(node, nodeTree) changedAvIDs = append(changedAvIDs, avIDs...) changedAvIDs = gulu.Str.RemoveDuplicatedElem(changedAvIDs) @@ -1078,48 +1078,18 @@ func (tx *Transaction) syncDelete2Block(node *ast.Node, nodeTree *parse.Tree) (c return } -func syncDelete2AttributeView(node *ast.Node) (changedAvIDs []string) { +func syncDelete2AttributeView(node *ast.Node, delChildrenWhenDelParent bool) (changedAvIDs []string) { + if !delChildrenWhenDelParent { + changedAvIDs = deleteAttrView(node, changedAvIDs) + return + } + ast.Walk(node, func(n *ast.Node, entering bool) ast.WalkStatus { if !entering || !n.IsBlock() { return ast.WalkContinue } - avs := n.IALAttr(av.NodeAttrNameAvs) - if "" == avs { - return ast.WalkContinue - } - - avIDs := strings.Split(avs, ",") - for _, avID := range avIDs { - attrView, parseErr := av.ParseAttributeView(avID) - if nil != parseErr { - continue - } - - changedAv := false - blockValues := attrView.GetBlockKeyValues() - if nil == blockValues { - continue - } - - for i, blockValue := range blockValues.Values { - if nil == blockValue.Block { - continue - } - - if blockValue.Block.ID == n.ID { - blockValues.Values = append(blockValues.Values[:i], blockValues.Values[i+1:]...) - changedAv = true - break - } - } - - if changedAv { - regenAttrViewGroups(attrView) - av.SaveAttributeView(attrView) - changedAvIDs = append(changedAvIDs, avID) - } - } + changedAvIDs = append(changedAvIDs, deleteAttrView(n, changedAvIDs)...) return ast.WalkContinue }) @@ -1127,6 +1097,46 @@ func syncDelete2AttributeView(node *ast.Node) (changedAvIDs []string) { return } +func deleteAttrView(n *ast.Node, changedAvIDs []string) []string { + avs := n.IALAttr(av.NodeAttrNameAvs) + if "" == avs { + return nil + } + + avIDs := strings.Split(avs, ",") + for _, avID := range avIDs { + attrView, parseErr := av.ParseAttributeView(avID) + if nil != parseErr { + continue + } + + changedAv := false + blockValues := attrView.GetBlockKeyValues() + if nil == blockValues { + continue + } + + for i, blockValue := range blockValues.Values { + if nil == blockValue.Block { + continue + } + + if blockValue.Block.ID == n.ID { + blockValues.Values = append(blockValues.Values[:i], blockValues.Values[i+1:]...) + changedAv = true + break + } + } + + if changedAv { + regenAttrViewGroups(attrView) + av.SaveAttributeView(attrView) + changedAvIDs = append(changedAvIDs, avID) + } + } + return changedAvIDs +} + func (tx *Transaction) doLargeInsert(operations []*Operation) { tree, _ := tx.loadTree(operations[0].ID) if nil == tree { @@ -1482,7 +1492,7 @@ func (tx *Transaction) doUpdate(operation *Operation) (ret *TxErr) { removedNodes := getRemovedNodes(oldNode, updatedNode) for _, n := range removedNodes { - syncDelete2AvBlock(n, tree, tx) + syncDelete2AvBlock(n, tree, false, tx) } // 将不属于折叠标题的块移动到折叠标题下方,需要展开折叠标题