فهرست منبع

fix: pages of different types can use the same name

Tienson Qin 1 سال پیش
والد
کامیت
c1c6197b9b

+ 17 - 6
deps/db/src/logseq/db.cljs

@@ -175,11 +175,25 @@
 
 (def get-first-page-by-name sqlite-common-db/get-first-page-by-name)
 
+(def db-based-graph? entity-plus/db-based-graph?)
+
 (defn page-exists?
-  "Whether a page exists."
-  [db page-name]
+  "Whether a page exists with the `type`."
+  [db page-name type]
   (when page-name
-    (some? (get-first-page-by-name db page-name))))
+    (let [page-name (common-util/page-name-sanity-lc page-name)]
+      (if (db-based-graph? db)
+        (seq
+         (d/q
+          '[:find [?p ...]
+            :in $ ?name ?type
+            :where
+            [?p :block/name ?name]
+            [?p :block/type ?type]]
+          db
+          page-name
+          type))
+        (d/entity db [:block/name page-name])))))
 
 (defn get-page
   "Get a page given its unsanitized name"
@@ -492,9 +506,6 @@
   [db]
   (when db (:kv/value (d/entity db :logseq.kv/graph-uuid))))
 
-
-(def db-based-graph? entity-plus/db-based-graph?)
-
 ;; File based fns
 (defn get-namespace-pages
   "Accepts both sanitized and unsanitized namespaces"

+ 2 - 1
deps/outliner/src/logseq/outliner/property.cljs

@@ -93,7 +93,8 @@
           (not= schema (:block/schema property))
           (assoc :block/schema schema)
           (and (some? property-name) (not= property-name (:block/title property)))
-          (assoc :block/title property-name))
+          (assoc :block/title property-name
+                 :block/name (common-util/page-name-sanity-lc property-name)))
         property-tx-data
         (cond-> []
           (seq changed-property-attrs)

+ 1 - 5
deps/outliner/test/logseq/outliner/property_test.cljs

@@ -270,11 +270,7 @@
         _ (assert (:user.property/default (find-block-by-content conn "b1")))
         property-uuid (:block/uuid (d/entity @conn :user.property-default))
         _ (outliner-property/delete-closed-value! conn property-uuid [:block/uuid closed-value-uuid])]
-    (is (nil? (d/entity @conn [:block/uuid closed-value-uuid])))
-    (is (thrown-with-msg?
-         js/Error
-         #"can't be deleted"
-         (outliner-property/delete-closed-value! conn property-uuid [:block/uuid used-closed-value-uuid])))))
+    (is (nil? (d/entity @conn [:block/uuid closed-value-uuid])))))
 
 (deftest class-add-property!
   (let [conn (create-conn-with-blocks

+ 1 - 1
src/main/frontend/components/block.cljs

@@ -782,7 +782,7 @@
   "Component for a page. `page` argument contains :block/name which can be (un)sanitized page name.
    Keys for `config`:
    - `:preview?`: Is this component under preview mode? (If true, `page-preview-trigger` won't be registered to this `page-cp`)"
-  [state {:keys [label children preview? disable-preview?] :as config} page]
+  [state {:keys [label children preview? disable-preview?] :as config} _page]
   (let [entity (::entity state)]
     (when-let [entity (when entity (db/sub-block (:db/id entity)))]
       (if (or (ldb/page? entity) (:block/tags entity))

+ 5 - 3
src/main/frontend/components/editor.cljs

@@ -149,9 +149,11 @@
                           ;; reorder, shortest and starts-with first.
                           (let [matched-pages-with-new-page
                                 (fn [partial-matched-pages]
-                                  (if (or (db/page-exists? q)
-                                          (some (fn [p] (= (string/lower-case q)
-                                                           (string/lower-case (:block/title p)))) matched-pages))
+                                  (if (or (db/page-exists? q (if db-tag? "class" "page"))
+                                          (some (fn [p] (and
+                                                         (not (:page? p))
+                                                         (= (string/lower-case q)
+                                                            (string/lower-case (:block/title p))))) matched-pages))
                                     partial-matched-pages
                                     (if db-tag?
                                       (concat [{:block/title (str (t :new-tag) " " q)}]

+ 2 - 2
src/main/frontend/components/page.cljs

@@ -252,8 +252,8 @@
   (let [input-ref (rum/create-ref)
         collide? #(and (not= (util/page-name-sanity-lc page-name)
                              (util/page-name-sanity-lc @*title-value))
-                       (db/page-exists? page-name)
-                       (db/page-exists? @*title-value))
+                       (db/page-exists? page-name (:block/type page))
+                       (db/page-exists? @*title-value (:block/type page)))
         rollback-fn #(let [old-name (if untitled? "" old-name)]
                        (reset! *title-value old-name)
                        (gobj/set (rum/deref input-ref) "value" old-name)

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

@@ -33,8 +33,7 @@
             [logseq.db.frontend.order :as db-order]
             [logseq.outliner.core :as outliner-core]
             [dommy.core :as d]
-            [frontend.mixins :as mixins]
-            [logseq.db :as ldb]))
+            [frontend.mixins :as mixins]))
 
 (defn- <create-class-if-not-exists!
   [value]

+ 2 - 1
src/main/frontend/components/settings.cljs

@@ -539,7 +539,8 @@
         (config-handler/set-config! :default-home new-home)
         (notification/show! "Home default page updated successfully!" :success))
 
-      (db/page-exists? value)
+      ;; FIXME: home page should be db id instead of page name
+      (ldb/get-page (db/get-db) value)
       (let [home (get (state/get-config) :default-home {})
             new-home (assoc home :page value)]
         (config-handler/set-config! :default-home new-home)

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

@@ -369,10 +369,10 @@ independent of format as format specific heading characters are stripped"
 
 (defn page-exists?
   "Whether a page exists."
-  [page-name]
+  [page-name type]
   (let [repo (state/get-current-repo)]
     (when-let [db (conn/get-db repo)]
-     (ldb/page-exists? db page-name))))
+     (ldb/page-exists? db page-name type))))
 
 (defn page-empty?
   "Whether a page is empty. Does it has a non-page block?

+ 1 - 1
src/main/frontend/db_worker.cljs

@@ -203,7 +203,7 @@
           (let [initial-data (sqlite-create-graph/build-db-initial-data config)]
             (d/transact! conn initial-data {:initial-db? true})))
 
-        (when-not (ldb/page-exists? @conn common-config/views-page-name)
+        (when-not (ldb/page-exists? @conn common-config/views-page-name "hidden")
           (ldb/create-views-page! conn))
 
         (db-migrate/migrate conn search-db)

+ 1 - 1
src/main/frontend/extensions/zotero/handler.cljs

@@ -77,7 +77,7 @@
        (p->c
         (p/do!
          (when-not (str/blank? page-name)
-           (if (db/page-exists? (str/lower-case page-name))
+           (if (db/page-exists? (str/lower-case page-name) "page")
              ;; FIXME: Overwrite if it has a zotero tag (which means created by Zotero)
              (if (setting/setting :overwrite-mode?)
                (page-handler/<delete!

+ 2 - 1
src/main/frontend/handler/file_based/repo.cljs

@@ -22,6 +22,7 @@
             [clojure.core.async :as async]
             [medley.core :as medley]
             [logseq.common.path :as path]
+            [logseq.db :as ldb]
             [clojure.core.async.interop :refer [p->c]]))
 
 (defn- create-contents-file
@@ -88,7 +89,7 @@
                     default-content)
           file-rpath (path/path-join (config/get-journals-directory) (str file-name "."
                                                                           (config/get-file-extension format)))
-          page-exists? (db/page-exists? title)
+          page-exists? (ldb/get-page (db/get-db) title)
           empty-blocks? (db/page-empty? repo-url (util/page-name-sanity-lc title))]
       (when (or empty-blocks? (not page-exists?))
         (p/let [_ (nfs/check-directory-permission! repo-url)

+ 1 - 1
src/main/frontend/handler/journal.cljs

@@ -15,7 +15,7 @@
   (when (and page (state/enable-journals? (state/get-current-repo)))
     (p/do!
      (db-async/<get-block (state/get-current-repo) page :children? false)
-     (if (db-model/page-exists? page)
+     (if (db-model/page-exists? page "journal")
        (route-handler/redirect! {:to          :page
                                  :path-params {:name page}})
        (page-handler/<create! page)))))

+ 9 - 10
src/main/frontend/handler/page.cljs

@@ -359,18 +359,17 @@
           (p/do!
            (when db-based?
              (let [tag (string/trim chosen)
-                   edit-block (state/get-edit-block)
-                   get-page-fn (if class? db/get-case-page db/get-page)]
+                   edit-block (state/get-edit-block)]
                (when (:block/uuid edit-block)
-                 (p/let [_ (when-not (de/entity? chosen-result) ; page not exists yet
-                             (if class?
-                               (<create-class! tag {:redirect? false
-                                                    :create-first-block? false})
-                               (<create! tag {:redirect? false
-                                              :create-first-block? false})))
-                         tag-entity (or (when (de/entity? chosen-result) chosen-result) (get-page-fn tag))]
+                 (p/let [result (when-not (de/entity? chosen-result) ; page not exists yet
+                                  (if class?
+                                    (<create-class! tag {:redirect? false
+                                                         :create-first-block? false})
+                                    (<create! tag {:redirect? false
+                                                   :create-first-block? false})))]
                    (when class?
-                     (add-tag (state/get-current-repo) (:block/uuid edit-block) tag-entity))))))
+                     (let [tag-entity (or (when (de/entity? chosen-result) chosen-result) result)]
+                       (add-tag (state/get-current-repo) (:block/uuid edit-block) tag-entity)))))))
            (editor-handler/insert-command! id
                                            (if class? "" (str "#" wrapped-tag))
                                            format

+ 0 - 5
src/main/frontend/state.cljs

@@ -2381,11 +2381,6 @@ Similar to re-frame subscriptions"
   (storage/set :ui/radix-color color)
   (util/set-android-theme))
 
-(defn unset-color-accent! []
-  (swap! state assoc :ui/radix-color :logseq)
-  (storage/remove :ui/radix-color)
-  (util/set-android-theme))
-
 (defn set-editor-font! [font]
   (let [font (if (keyword? font) (name font) (str font))]
     (swap! state assoc :ui/editor-font font)

+ 12 - 3
src/main/frontend/worker/handler/page/db_based/page.cljs

@@ -73,12 +73,21 @@
            persist-op?              true}
     :as options}]
   (let [date-formatter (common-config/get-date-formatter config)
-        [title page-name] (get-title-and-pagename title)]
-    (when-not (ldb/get-case-page @conn page-name)
+        [title page-name] (get-title-and-pagename title)
+        type (cond class?
+                   "class"
+                   whiteboard?
+                   "whiteboard"
+                   today-journal?
+                   "journal"
+                   :else
+                   "page")]
+    (when-not (ldb/page-exists? @conn page-name type)
       (let [format    :markdown
             page      (-> (gp-block/page-name->map title @conn true date-formatter
                                                    {:class? class?
-                                                    :page-uuid (when (uuid? uuid) uuid)})
+                                                    :page-uuid (when (uuid? uuid) uuid)
+                                                    :skip-existing-page-check? true})
                           (assoc :block/format format))
             page-uuid (:block/uuid page)
             page-txs  (build-page-tx conn properties page (select-keys options [:whiteboard? :class? :tags]))

+ 3 - 4
src/main/frontend/worker/handler/page/db_based/rename.cljs

@@ -65,16 +65,15 @@
 
 (defn rename!
   [repo conn _config page-uuid new-name & {:keys [persist-op?]
-                                          :or {persist-op? true}}]
+                                           :or {persist-op? true}}]
   (let [db @conn]
     (when-let [page-e (d/entity db [:block/uuid page-uuid])]
       (let [old-name      (:block/title page-e)
             new-name      (string/trim new-name)
             old-page-name (common-util/page-name-sanity-lc old-name)
             new-page-name (common-util/page-name-sanity-lc new-name)
-            new-page-exists? (when-let [p (ldb/get-case-page db new-name)]
-                               (not= (:db/id p) (:db/id page-e)))
-            name-changed? (not= old-name new-name)]
+            name-changed? (not= old-name new-name)
+            new-page-exists? (and name-changed? (ldb/page-exists? db new-name (:block/type page-e)))]
         (cond
           (string/blank? new-name)
           :invalid-empty-name

+ 27 - 29
src/main/frontend/worker/handler/page/file_based/rename.cljs

@@ -163,35 +163,33 @@
 
 (defn- based-merge-pages!
   [repo conn config from-page-name to-page-name {:keys [old-name new-name]}]
-  (when (and (ldb/page-exists? @conn from-page-name)
-             (ldb/page-exists? @conn to-page-name)
-             (not= from-page-name to-page-name))
-    (let [db @conn
-          to-page (d/entity db [:block/name to-page-name])
-          to-id (:db/id to-page)
-          from-page (d/entity db [:block/name from-page-name])
-          from-id (:db/id from-page)
-          datoms (d/datoms @conn :avet :block/page from-id)
-          block-eids (mapv :e datoms)
-          blocks (d/pull-many db '[:db/id :block/page :block/refs :block/path-refs :block/order :block/parent] block-eids)
-          blocks-tx-data (map (fn [block]
-                                (let [id (:db/id block)]
-                                  (cond->
-                                   {:db/id id
-                                    :block/page {:db/id to-id}
-                                    :block/refs (rename-update-block-refs! (:block/refs block) from-id to-id)
-                                    :block/order (db-order/gen-key nil)}
-
-                                    (= (:block/parent block) {:db/id from-id})
-                                    (assoc :block/parent {:db/id to-id})))) blocks)
-          replace-ref-tx-data (replace-page-ref db config from-page to-page-name)
-          tx-data (concat blocks-tx-data replace-ref-tx-data)]
-
-      (rename-page-aux repo conn config old-name new-name
-                       :merge? true
-                       :other-tx tx-data)
-
-      (worker-page/delete! repo conn (:block/uuid from-page) {:rename? true}))))
+  (let [db @conn
+        to-page (d/entity db [:block/name to-page-name])
+        to-id (:db/id to-page)
+        from-page (d/entity db [:block/name from-page-name])
+        from-id (:db/id from-page)]
+    (when (and from-page to-page (not= from-page-name to-page-name))
+      (let [datoms (d/datoms @conn :avet :block/page from-id)
+            block-eids (mapv :e datoms)
+            blocks (d/pull-many db '[:db/id :block/page :block/refs :block/path-refs :block/order :block/parent] block-eids)
+            blocks-tx-data (map (fn [block]
+                                  (let [id (:db/id block)]
+                                    (cond->
+                                     {:db/id id
+                                      :block/page {:db/id to-id}
+                                      :block/refs (rename-update-block-refs! (:block/refs block) from-id to-id)
+                                      :block/order (db-order/gen-key nil)}
+
+                                      (= (:block/parent block) {:db/id from-id})
+                                      (assoc :block/parent {:db/id to-id})))) blocks)
+            replace-ref-tx-data (replace-page-ref db config from-page to-page-name)
+            tx-data (concat blocks-tx-data replace-ref-tx-data)]
+
+        (rename-page-aux repo conn config old-name new-name
+                         :merge? true
+                         :other-tx tx-data)
+
+        (worker-page/delete! repo conn (:block/uuid from-page) {:rename? true})))))
 
 (defn- compute-new-file-path
   "Construct the full path given old full path and the file sanitized body.