diff --git a/kernel/model/flashcard.go b/kernel/model/flashcard.go index 46774ec32..d5cd2d250 100644 --- a/kernel/model/flashcard.go +++ b/kernel/model/flashcard.go @@ -135,6 +135,72 @@ func RemoveFlashcards(deckID string, blockIDs []string) (err error) { deck := Decks[deckID] deckLock.Unlock() + var rootIDs []string + blockRoots := map[string]string{} + for _, blockID := range blockIDs { + bt := treenode.GetBlockTree(blockID) + if nil == bt { + continue + } + + rootIDs = append(rootIDs, bt.RootID) + blockRoots[blockID] = bt.RootID + } + rootIDs = gulu.Str.RemoveDuplicatedElem(rootIDs) + + trees := map[string]*parse.Tree{} + for _, blockID := range blockIDs { + rootID := blockRoots[blockID] + + tree := trees[rootID] + if nil == tree { + tree, _ = loadTreeByBlockID(blockID) + } + if nil == tree { + continue + } + trees[rootID] = tree + + node := treenode.GetNodeInTree(tree, blockID) + if nil == node { + continue + } + + oldAttrs := parse.IAL2Map(node.KramdownIAL) + + deckAttrs := node.IALAttr("custom-riff-decks") + var deckIDs []string + for _, dID := range strings.Split(deckAttrs, ",") { + if dID != deckID { + deckIDs = append(deckIDs, dID) + } + } + + deckIDs = gulu.Str.RemoveDuplicatedElem(deckIDs) + val := strings.Join(deckIDs, ",") + val = strings.TrimPrefix(val, ",") + val = strings.TrimSuffix(val, ",") + if "" == val { + node.RemoveIALAttr("custom-riff-decks") + } else { + node.SetIALAttr("custom-riff-decks", val) + } + + if err = indexWriteJSONQueue(tree); nil != err { + return + } + + cache.PutBlockIAL(blockID, parse.IAL2Map(node.KramdownIAL)) + + newAttrs := parse.IAL2Map(node.KramdownIAL) + doOp := &Operation{Action: "updateAttrs", Data: map[string]interface{}{"old": oldAttrs, "new": newAttrs}, ID: blockID} + trans := []*Transaction{{ + DoOperations: []*Operation{doOp}, + UndoOperations: []*Operation{}, + }} + pushBroadcastAttrTransactions(trans) + } + for _, blockID := range blockIDs { deck.RemoveCard(blockID) }