From a73606155bb0867bdb09ac627e82488a8a8d4e29 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Fri, 6 Dec 2024 18:51:39 +0800 Subject: [PATCH] enhance: allow existing page and property to be used as tags --- deps/db/src/logseq/db/frontend/class.cljs | 3 ++- src/main/frontend/handler/db_based/page.cljs | 19 ++++++------- src/main/frontend/modules/outliner/ui.cljc | 3 ++- .../worker/handler/page/db_based/page.cljs | 27 ++++++++++++------- 4 files changed, 32 insertions(+), 20 deletions(-) diff --git a/deps/db/src/logseq/db/frontend/class.cljs b/deps/db/src/logseq/db/frontend/class.cljs index e377ceeff5..9faa948533 100644 --- a/deps/db/src/logseq/db/frontend/class.cljs +++ b/deps/db/src/logseq/db/frontend/class.cljs @@ -93,5 +93,6 @@ [db page-m] {:pre [(string? (:block/title page-m))]} (let [db-ident (create-user-class-ident-from-name (:block/title page-m)) - db-ident' (db-ident/ensure-unique-db-ident db db-ident)] + db-ident' (or (:db/ident page-m) + (db-ident/ensure-unique-db-ident db db-ident))] (sqlite-util/build-new-class (assoc page-m :db/ident db-ident')))) diff --git a/src/main/frontend/handler/db_based/page.cljs b/src/main/frontend/handler/db_based/page.cljs index 397e86606e..57aa0fad8e 100644 --- a/src/main/frontend/handler/db_based/page.cljs +++ b/src/main/frontend/handler/db_based/page.cljs @@ -33,15 +33,16 @@ (defn add-tag [repo block-id tag-entity] (let [opts {:outliner-op :save-block}] - (ui-outliner-tx/transact! opts - (p/do! - (editor-handler/save-current-block!) - ;; Check after save-current-block to get most up to date block content - (when (valid-tag? repo (db/entity repo [:block/uuid block-id]) tag-entity) - (let [tx-data [[:db/add [:block/uuid block-id] :block/tags (:db/id tag-entity)] - ;; TODO: Move this to outliner.core to consistently add refs for tags - [:db/add [:block/uuid block-id] :block/refs (:db/id tag-entity)]]] - (db/transact! repo tx-data {:outliner-op :save-block}))))))) + (ui-outliner-tx/transact! + opts + (p/do! + (editor-handler/save-current-block!) + ;; Check after save-current-block to get most up to date block content + (when (valid-tag? repo (db/entity repo [:block/uuid block-id]) tag-entity) + (let [tx-data [[:db/add [:block/uuid block-id] :block/tags (:db/id tag-entity)] + ;; TODO: Move this to outliner.core to consistently add refs for tags + [:db/add [:block/uuid block-id] :block/refs (:db/id tag-entity)]]] + (db/transact! repo tx-data {:outliner-op :save-block}))))))) (defn convert-to-tag! [page-entity] diff --git a/src/main/frontend/modules/outliner/ui.cljc b/src/main/frontend/modules/outliner/ui.cljc index 2b0be76bab..b1dd689a93 100644 --- a/src/main/frontend/modules/outliner/ui.cljc +++ b/src/main/frontend/modules/outliner/ui.cljc @@ -4,7 +4,8 @@ [frontend.db.transact] [frontend.db.conn] [logseq.outliner.op] - [frontend.modules.outliner.op]))) + [frontend.modules.outliner.op] + [logseq.db]))) (defmacro transact! [opts & body] diff --git a/src/main/frontend/worker/handler/page/db_based/page.cljs b/src/main/frontend/worker/handler/page/db_based/page.cljs index 67540ade86..cc05465cff 100644 --- a/src/main/frontend/worker/handler/page/db_based/page.cljs +++ b/src/main/frontend/worker/handler/page/db_based/page.cljs @@ -169,15 +169,24 @@ (let [db @conn date-formatter (:logseq.property.journal/title-format (d/entity db :logseq.class/Journal)) title (sanitize-title title*) - type (cond class? - :logseq.class/Tag - whiteboard? - :logseq.class/Whiteboard - today-journal? - :logseq.class/Journal - :else - :logseq.class/Page)] - (when-not (ldb/page-exists? db title #{type}) + types (cond class? + #{:logseq.class/Tag :logseq.class/Property :logseq.class/Page} + whiteboard? + #{:logseq.class/Whiteboard} + today-journal? + #{:logseq.class/Journal} + :else + #{:logseq.class/Page})] + (if-let [existing-page-id (first (ldb/page-exists? db title types))] + (let [existing-page (d/entity db existing-page-id) + tx-meta {:persist-op? persist-op? + :outliner-op :save-block}] + (when (and class? + (not (ldb/class? existing-page)) + (or (ldb/property? existing-page) (ldb/internal-page? existing-page))) + ;; convert existing property or page to class + (let [tx-data (db-class/build-new-class db (select-keys existing-page [:block/title :block/uuid :db/ident :block/created-at]))] + (ldb/transact! conn tx-data tx-meta)))) (let [format :markdown page (-> (gp-block/page-name->map title @conn true date-formatter {:class? class?