Просмотр исходного кода

fix: delete page result in invalid data

When children blocks have references of their parent page
Tienson Qin 2 недель назад
Родитель
Сommit
bc6ab38679

+ 5 - 1
deps/outliner/src/logseq/outliner/page.cljs

@@ -22,7 +22,11 @@
 (defn- db-refs->page
   "Replace [[page name]] with page name"
   [page-entity]
-  (let [refs (:block/_refs page-entity)
+  (let [refs (->> (:block/_refs page-entity)
+                  ;; remove child or self that refed this page
+                  (remove (fn [ref]
+                            (or (= (:db/id ref) (:db/id page-entity))
+                                (= (:db/id (:block/page ref)) (:db/id page-entity))))))
         id-ref->page #(db-content/content-id-ref->page % [page-entity])]
     (when (seq refs)
       (let [tx-data (mapcat (fn [{:block/keys [raw-title] :as ref}]

+ 16 - 0
deps/outliner/test/logseq/outliner/page_test.cljs

@@ -2,6 +2,7 @@
   (:require [cljs.test :refer [deftest is testing]]
             [datascript.core :as d]
             [logseq.common.config :as common-config]
+            [logseq.common.util.page-ref :as page-ref]
             [logseq.db :as ldb]
             [logseq.db.frontend.db :as db-db]
             [logseq.db.test.helper :as db-test]
@@ -95,6 +96,21 @@
          (outliner-page/create! conn "foo/bar" {}))
         "Page can't have '/'n title")))
 
+(deftest delete-page
+  (let [conn (db-test/create-conn-with-blocks
+              [{:page {:block/title "D1"}
+                :blocks [{:block/title "b1"}]}])
+        d1 (ldb/get-page @conn "D1")
+        b1 (db-test/find-block-by-content @conn "b1")]
+    (ldb/transact! conn [{:db/id (:db/id b1)
+                          :block/title (str "b1 " (page-ref/->page-ref (:block/uuid d1)))
+                          :block/refs #{(:db/id d1)}}])
+    (is (contains? (set (map :db/id (:block/refs (d/entity @conn (:db/id b1)))))
+                   (:db/id d1)))
+    (outliner-page/delete! conn (:block/uuid d1))
+    (is (nil? (d/entity @conn (:db/id d1))))
+    (is (nil? (d/entity @conn (:db/id b1))))))
+
 (deftest create-journal
   (let [conn (db-test/create-conn)
         [_ page-uuid] (outliner-page/create! conn "Dec 16th, 2024" {})]