Browse Source

fix: distinct blocks when sort by left

Tienson Qin 3 years ago
parent
commit
21603f9d1d
3 changed files with 30 additions and 28 deletions
  1. 23 22
      src/main/frontend/db/model.cljs
  2. 5 5
      src/main/frontend/db/react.cljs
  3. 2 1
      src/main/frontend/state.cljs

+ 23 - 22
src/main/frontend/db/model.cljs

@@ -355,28 +355,29 @@
   ([blocks parent]
    (sort-by-left blocks parent {:check? true}))
   ([blocks parent {:keys [check?]}]
-   (when check?
-     (when (not= (count blocks) (count (set (map :block/left blocks))))
-       (let [duplicates (->> (map (comp :db/id :block/left) blocks)
-                             frequencies
-                             (filter (fn [[_k v]] (> v 1)))
-                             (map (fn [[k _v]]
-                                    (let [left (db-utils/pull k)]
-                                      {:left left
-                                       :duplicates (->>
-                                                    (filter (fn [block]
-                                                              (= k (:db/id (:block/left block))))
-                                                            blocks)
-                                                    (map #(select-keys % [:db/id :block/level :block/content :block/file])))}))))]
-         #_(util/pprint duplicates)))
-     (assert (= (count blocks) (count (set (map :block/left blocks)))) "Each block should have a different left node"))
-
-   (let [left->blocks (reduce (fn [acc b] (assoc acc (:db/id (:block/left b)) b)) {} blocks)]
-     (loop [block parent
-            result []]
-       (if-let [next (get left->blocks (:db/id block))]
-         (recur next (conj result next))
-         (vec result))))))
+   (let [blocks (util/distinct-by :db/id blocks)]
+     (when check?
+      (when (not= (count blocks) (count (set (map :block/left blocks))))
+        (let [duplicates (->> (map (comp :db/id :block/left) blocks)
+                              frequencies
+                              (filter (fn [[_k v]] (> v 1)))
+                              (map (fn [[k _v]]
+                                     (let [left (db-utils/pull k)]
+                                       {:left left
+                                        :duplicates (->>
+                                                     (filter (fn [block]
+                                                               (= k (:db/id (:block/left block))))
+                                                             blocks)
+                                                     (map #(select-keys % [:db/id :block/level :block/content :block/file])))}))))]
+          (util/pprint duplicates)))
+      (assert (= (count blocks) (count (set (map :block/left blocks)))) "Each block should have a different left node"))
+
+     (let [left->blocks (reduce (fn [acc b] (assoc acc (:db/id (:block/left b)) b)) {} blocks)]
+       (loop [block parent
+              result []]
+         (if-let [next (get left->blocks (:db/id block))]
+           (recur next (conj result next))
+           (vec result)))))))
 
 (defn try-sort-by-left
   [blocks parent]

+ 5 - 5
src/main/frontend/db/react.cljs

@@ -345,16 +345,16 @@
                        custom?
                        kv?))
               (let [{:keys [query query-fn]} cache
-                    query-or-refs? (state/edit-in-query-or-refs-component)]
+                    {:keys [custom-query?]} (state/edit-in-query-or-refs-component)]
                 (util/profile
                  (str "refresh! " (rest k))
                  (when (or query query-fn)
                    (try
-                     (let [f #(execute-query! repo-url db k tx cache {:skip-query-time-check? query-or-refs?})]
+                     (let [f #(execute-query! repo-url db k tx cache {:skip-query-time-check? custom-query?})]
                        ;; Detects whether user is editing in a custom query, if so, execute the query immediately
-                       (if (or query-or-refs? (not custom?))
-                         (f)
-                         (async/put! (state/get-reactive-custom-queries-chan) [f query])))
+                       (if (and custom? (not custom-query?))
+                         (async/put! (state/get-reactive-custom-queries-chan) [f query])
+                         (f)))
                      (catch js/Error e
                        (js/console.error e)))))))))))))
 

+ 2 - 1
src/main/frontend/state.cljs

@@ -1636,7 +1636,8 @@
 (defn edit-in-query-or-refs-component
   []
   (let [config (last (get-editor-args))]
-    (or (:custom-query? config) (:ref? config))))
+    {:custom-query? (:custom-query? config)
+     :ref? (:ref? config)}))
 
 (defn set-auth-id-token
   [id-token]