Browse Source

fix: don't crash the app if there're parent cycles

Tienson Qin 1 year ago
parent
commit
beca765134

+ 14 - 13
src/main/frontend/components/class.cljs

@@ -6,18 +6,19 @@
             [rum.core :as rum]))
 
 (defn class-children-aux
-  [class {:keys [default-collapsed?] :as opts}]
-  (let [children (:logseq.property/_parent class)]
-    (when (seq children)
-      [:ul
-       (for [child (sort-by :block/title children)]
-         (let [title [:li.ml-2 (block/page-reference false (:block/title child) {:show-brackets? false} nil)]]
-           (if (seq (:logseq.property/_parent child))
-             (ui/foldable
-              title
-              (class-children-aux child opts)
-              {:default-collapsed? default-collapsed?})
-             title)))])))
+  [class children-pages {:keys [default-collapsed?] :as opts}]
+  (when (contains? children-pages (:db/id class))
+    (let [children (:logseq.property/_parent class)]
+     (when (seq children)
+       [:ul
+        (for [child (sort-by :block/title children)]
+          (let [title [:li.ml-2 (block/page-reference false (:block/title child) {:show-brackets? false} nil)]]
+            (if (seq (:logseq.property/_parent child))
+              (ui/foldable
+               title
+               (class-children-aux child children-pages opts)
+               {:default-collapsed? default-collapsed?})
+              title)))]))))
 
 (rum/defc class-children
   [class]
@@ -28,6 +29,6 @@
       [:div.mt-4
        (ui/foldable
         [:h2.font-medium "Children (" (count children-pages) ")"]
-        [:div.mt-2.ml-1 (class-children-aux class {:default-collapsed? default-collapsed?})]
+        [:div.mt-2.ml-1 (class-children-aux class children-pages {:default-collapsed? default-collapsed?})]
         {:default-collapsed? false
          :title-trigger? true})])))

+ 2 - 1
src/main/frontend/components/property/value.cljs

@@ -948,7 +948,8 @@
                            page-ancestors (when parent?
                                             (let [ancestor-pages (loop [parents [block]]
                                                                    (if-let [parent (:logseq.property/parent (last parents))]
-                                                                     (recur (conj parents parent))
+                                                                     (when-not (contains? (set parents) parent)
+                                                                       (recur (conj parents parent)))
                                                                      parents))]
                                               (->> (reverse ancestor-pages)
                                                    (remove (fn [e] (= (:db/id block) (:db/id e))))

+ 3 - 2
src/main/frontend/db/model.cljs

@@ -788,8 +788,9 @@ independent of format as format specific heading characters are stripped"
           (parent ?parent ?children)]
         (conn/get-db repo)
         eid
-     (:parent rules/rules))
-   distinct))
+        (:parent rules/rules))
+   (remove #{eid})
+   set))
 
 (defn get-class-objects
   [repo class-id]