Browse Source

fix: only delete macro entities when last reference

part of LOG-2904
Gabriel Horner 2 years ago
parent
commit
7a4f5712ba

+ 7 - 3
src/main/frontend/modules/outliner/core.cljs

@@ -141,10 +141,14 @@
 (declare move-blocks)
 
 (defn- remove-macros-when-save
-  [txs-state block-entity]
+  [repo txs-state block-entity]
   (swap! txs-state (fn [txs]
                      (vec (concat txs
-                                  (map #(vector :db.fn/retractEntity (:db/id %)) (:block/macros block-entity)))))))
+                                  ;; Only delete if last reference
+                                  (keep #(when (<= (count (:block/_macros (db/entity repo (:db/id %))))
+                                                   1)
+                                           (vector :db.fn/retractEntity (:db/id %)))
+                                        (:block/macros block-entity)))))))
 
 (defn- create-object-when-save
   [txs-state block-entity m structured-tags?]
@@ -328,7 +332,7 @@
         ;; Update block's page attributes
         (update-page-when-save-block txs-state block-entity m-without-tags)
         ;; Remove macros as they are replaced by new ones
-        (remove-macros-when-save txs-state block-entity)
+        (remove-macros-when-save repo txs-state block-entity)
 
         ;; Remove orphaned refs from block
         (remove-orphaned-refs-when-save txs-state block-entity m-without-tags))

+ 8 - 3
src/main/frontend/modules/outliner/datascript.cljs

@@ -110,7 +110,7 @@
 
 (defn update-refs-and-macros
   "When a block is deleted, refs are updated and macros associated with the block are deleted"
-  [txs opts]
+  [txs repo opts]
   (if (and (= :delete-blocks (:outliner-op opts))
            (empty? (:uuid-changed opts)))
     (let [retracted-block-ids (->> (keep (fn [tx]
@@ -143,7 +143,12 @@
                             (apply concat))
           retracted-tx' (mapcat :tx retracted-tx)
           revert-tx (mapcat :revert-tx retracted-tx)
-          macros-tx (mapcat #(map (fn [macro] [:db.fn/retractEntity (:db/id macro)]) (:block/macros %))
+          macros-tx (mapcat (fn [b]
+                              ;; Only delete if last reference
+                              (keep #(when (<= (count (:block/_macros (db/entity repo (:db/id %))))
+                                                   1)
+                                           (vector :db.fn/retractEntity (:db/id %)))
+                                        (:block/macros b)))
                             retracted-blocks)]
       (when (seq retracted-tx')
         (state/set-state! [:editor/last-replace-ref-content-tx (state/get-current-repo)]
@@ -184,7 +189,7 @@
 
               (and (= :delete-blocks (:outliner-op opts))
                    (empty? (:uuid-changed opts)))
-              (update-refs-and-macros opts)
+              (update-refs-and-macros repo opts)
 
               true
               (distinct))]