Tienson Qin 3 лет назад
Родитель
Сommit
ec8109f8d0

+ 21 - 12
src/main/frontend/modules/outliner/core.cljs

@@ -370,20 +370,29 @@
 
 ;;; ### insert-blocks, delete-blocks, move-blocks
 
-(defn- fix-top-level-blocks
+(defn fix-top-level-blocks
   "Blocks with :block/level"
   [blocks]
-  (loop [blocks blocks
-         last-top-level-block nil
-         result []]
-    (if-let [block (first blocks)]
-      (if (= 1 (:block/level block))
-        (let [block' (assoc block
-                            :block/left {:db/id (:db/id last-top-level-block)}
-                            :block/parent (:block/parent last-top-level-block))]
-          (recur (rest blocks) block (conj result block')))
-        (recur (rest blocks) last-top-level-block (conj result block)))
-      result)))
+  (let [top-level-blocks (filter #(= (:block/level %) 1) blocks)
+        id->block (zipmap (map :db/id top-level-blocks) top-level-blocks)
+        uuid->block (zipmap (map :block/uuid top-level-blocks) top-level-blocks)]
+    (if (every? (fn [block]
+                  (let [left (:block/left block)
+                        id (if (map? left) (:db/id left) (second left))]
+                    (some? (or (get id->block id) (get uuid->block id))))) (rest top-level-blocks))
+      ;; no need to fix
+      blocks
+      (loop [blocks blocks
+             last-top-level-block nil
+             result []]
+        (if-let [block (first blocks)]
+          (if (= 1 (:block/level block))
+            (let [block' (assoc block
+                                :block/left {:db/id (:db/id last-top-level-block)}
+                                :block/parent (:block/parent last-top-level-block))]
+              (recur (rest blocks) block (conj result block')))
+            (recur (rest blocks) last-top-level-block (conj result block)))
+          result)))))
 
 (defn- insert-blocks-aux
   [blocks target-block {:keys [sibling? replace-empty-target? keep-uuid? move? outliner-op]}]

+ 31 - 0
src/test/frontend/modules/outliner/core_test.cljs

@@ -215,6 +215,37 @@
       (outliner-core/indent-outdent-blocks! [(get-block 13) (get-block 14)] false))
     (is (= [2 12 13 14 16] (get-children 22)))))
 
+(deftest test-fix-top-level-blocks
+  (testing "no need to fix"
+    (let [blocks [{:block/uuid #uuid "62aa668b-e258-445d-aef6-5510054ff495",
+                   :block/properties {},
+                   :block/left #:db{:id 144},
+                   :block/format :markdown,
+                   :block/level 1,
+                   :block/content "a",
+                   :db/id 145,
+                   :block/parent #:db{:id 144},
+                   :block/page #:db{:id 144}}
+                  {:block/uuid #uuid "62aa668d-65d1-440c-849b-a0717f691193",
+                   :block/properties {},
+                   :block/left #:db{:id 145},
+                   :block/format :markdown,
+                   :block/level 1,
+                   :block/content "b",
+                   :db/id 146,
+                   :block/parent #:db{:id 144},
+                   :block/page #:db{:id 144}}
+                  {:block/uuid #uuid "62aa668e-f866-48ee-b8fe-737e101c548d",
+                   :block/properties {},
+                   :block/left #:db{:id 146},
+                   :block/format :markdown,
+                   :block/level 1,
+                   :block/content "c",
+                   :db/id 147,
+                   :block/parent #:db{:id 144},
+                   :block/page #:db{:id 144}}]]
+      (= blocks (outliner-core/fix-top-level-blocks blocks)))))
+
 (deftest test-outdent-blocks
   (testing "
   [1 [[2 [[3]