diff --git a/kernel/model/file.go b/kernel/model/file.go index ac7977c31..bf83d133d 100644 --- a/kernel/model/file.go +++ b/kernel/model/file.go @@ -1671,8 +1671,7 @@ func removeDoc(box *Box, p string, luteEngine *lute.Lute) { continue } - syncDelete2AttributeView(removeTree.Root) - syncDelete2Block(removeTree.Root) + syncDelete2AvBlock(removeTree.Root) } if existChildren { diff --git a/kernel/model/history.go b/kernel/model/history.go index cb9857690..1685a99ed 100644 --- a/kernel/model/history.go +++ b/kernel/model/history.go @@ -248,6 +248,7 @@ func RollbackDocHistory(boxID, historyPath string) (err error) { return } + var avIDs []string tree, _ := loadTree(srcPath, util.NewLute()) if nil != tree { historyDir := strings.TrimPrefix(historyPath, util.HistoryDir+string(os.PathSeparator)) @@ -266,8 +267,11 @@ func RollbackDocHistory(boxID, historyPath string) (err error) { logging.LogErrorf("copy av [%s] failed: %s", srcAvPath, copyErr) } } + + avIDs = append(avIDs, avNode.AttributeViewID) } } + avIDs = gulu.Str.RemoveDuplicatedElem(avIDs) tree.Box = boxID tree.Path = filepath.ToSlash(strings.TrimPrefix(destPath, util.DataDir+string(os.PathSeparator)+boxID)) @@ -305,6 +309,11 @@ func RollbackDocHistory(boxID, historyPath string) (err error) { "refText": refText, } util.PushEvent(evt) + + // 刷新属性视图 + for _, avID := range avIDs { + util.PushReloadAttrView(avID) + } }() return nil } diff --git a/kernel/model/transaction.go b/kernel/model/transaction.go index 5ec9002bb..3bcc5c297 100644 --- a/kernel/model/transaction.go +++ b/kernel/model/transaction.go @@ -799,14 +799,26 @@ func (tx *Transaction) doDelete(operation *Operation) (ret *TxErr) { } if needSyncDel2AvBlock { - syncDelete2AttributeView(node) - syncDelete2Block(node) + syncDelete2AvBlock(node) } return } -func syncDelete2Block(node *ast.Node) { - var changedAvIDs []string +func syncDelete2AvBlock(node *ast.Node) { + changedAvIDs := syncDelete2AttributeView(node) + avIDs := syncDelete2Block(node) + changedAvIDs = append(changedAvIDs, avIDs...) + changedAvIDs = gulu.Str.RemoveDuplicatedElem(changedAvIDs) + + go func() { + time.Sleep(256 * time.Millisecond) + for _, avID := range changedAvIDs { + util.PushReloadAttrView(avID) + } + }() +} + +func syncDelete2Block(node *ast.Node) (changedAvIDs []string) { ast.Walk(node, func(n *ast.Node, entering bool) ast.WalkStatus { if !entering || ast.NodeAttributeView != n.Type { return ast.WalkContinue @@ -850,14 +862,12 @@ func syncDelete2Block(node *ast.Node) { } return ast.WalkContinue }) + changedAvIDs = gulu.Str.RemoveDuplicatedElem(changedAvIDs) - for _, avID := range changedAvIDs { - util.PushReloadAttrView(avID) - } + return } -func syncDelete2AttributeView(node *ast.Node) { - changedAvIDs := hashset.New() +func syncDelete2AttributeView(node *ast.Node) (changedAvIDs []string) { ast.Walk(node, func(n *ast.Node, entering bool) ast.WalkStatus { if !entering || !n.IsBlock() { return ast.WalkContinue @@ -891,15 +901,14 @@ func syncDelete2AttributeView(node *ast.Node) { if changedAv { av.SaveAttributeView(attrView) - changedAvIDs.Add(avID) + changedAvIDs = append(changedAvIDs, avID) } } return ast.WalkContinue }) - for _, avID := range changedAvIDs.Values() { - util.PushReloadAttrView(avID.(string)) - } + changedAvIDs = gulu.Str.RemoveDuplicatedElem(changedAvIDs) + return } func (tx *Transaction) doInsert(operation *Operation) (ret *TxErr) {