From eb09f0c30f9bbe041b07fc7b4dadbe77be890fd5 Mon Sep 17 00:00:00 2001 From: Gabriel Horner Date: Fri, 10 Apr 2026 11:30:06 -0400 Subject: [PATCH] fix: recycled/deleted page can't be restored by user When a user deletes a page and then restores it by creating it again with cmd-k, the page wasn't restored. The previously recycled page and its block are now restored when the page is re-created --- deps/outliner/src/logseq/outliner/page.cljs | 4 +-- src/main/frontend/handler/common/page.cljs | 2 +- .../frontend/handler/common/page_test.cljs | 36 +++++++++++++++++++ 3 files changed, 39 insertions(+), 3 deletions(-) create mode 100644 src/test/frontend/handler/common/page_test.cljs diff --git a/deps/outliner/src/logseq/outliner/page.cljs b/deps/outliner/src/logseq/outliner/page.cljs index 12577a1431..730869e293 100644 --- a/deps/outliner/src/logseq/outliner/page.cljs +++ b/deps/outliner/src/logseq/outliner/page.cljs @@ -408,7 +408,7 @@ (defn create! [conn title opts] - (let [{:keys [tx-meta tx-data title' page-uuid]} (create @conn title opts)] + (let [{:keys [tx-meta tx-data title page-uuid]} (create @conn title opts)] (when (seq tx-data) (ldb/transact! conn tx-data tx-meta)) - [title' page-uuid])) + [title page-uuid])) diff --git a/src/main/frontend/handler/common/page.cljs b/src/main/frontend/handler/common/page.cljs index a27e3ada88..c53b704dd0 100644 --- a/src/main/frontend/handler/common/page.cljs +++ b/src/main/frontend/handler/common/page.cljs @@ -66,7 +66,7 @@ :else (when-not (string/blank? title') (p/let [existing-page (when-not class? (db/get-page title'))] - (if existing-page + (if (and existing-page (not (ldb/recycled? existing-page))) existing-page (p/let [options' (cond-> (update options :tags concat (:block/tags parsed-result)) (nil? (:split-namespace? options)) diff --git a/src/test/frontend/handler/common/page_test.cljs b/src/test/frontend/handler/common/page_test.cljs new file mode 100644 index 0000000000..1103cea19f --- /dev/null +++ b/src/test/frontend/handler/common/page_test.cljs @@ -0,0 +1,36 @@ +(ns frontend.handler.common.page-test + (:require [clojure.test :refer [async is use-fixtures]] + [datascript.core :as d] + [frontend.db :as db] + [frontend.handler.common.page :as page-common-handler] + [frontend.test.helper :as test-helper :include-macros true :refer [deftest-async]] + [logseq.db :as ldb] + [logseq.db.test.helper :as db-test] + [logseq.outliner.page :as outliner-page] + [promesa.core :as p])) + +(use-fixtures :each + {:before (fn [] + (async done + (test-helper/start-test-db!) + (done))) + :after test-helper/destroy-test-db!}) + +(deftest-async create-page-restores-recycled-page + (test-helper/load-test-files [{:page {:block/title "foo"} + :blocks [{:block/title "child block"}]}]) + (p/let [conn (db/get-db test-helper/test-db false) + page (db-test/find-page-by-title @conn "foo") + page-uuid (:block/uuid page) + _ (outliner-page/delete! conn page-uuid {}) + recycled-page (d/entity @conn [:block/uuid page-uuid]) + _ (is (ldb/recycled? recycled-page) + "Page should be recycled after deletion") + restored-page (page-common-handler/