1
0
Эх сурвалжийг харах

fix: page merge

Page rename should be called from worker.
Tienson Qin 1 жил өмнө
parent
commit
6192378c28

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

@@ -22,7 +22,8 @@
             [frontend.worker.rtc.core :as rtc-core]
             [clojure.core.async :as async]
             [frontend.worker.async-util :include-macros true :refer [<?]]
-            [frontend.worker.util :as worker-util]))
+            [frontend.worker.util :as worker-util]
+            [frontend.worker.handler.page.rename :as worker-page-rename]))
 
 (defonce *sqlite state/*sqlite)
 (defonce *sqlite-conns state/*sqlite-conns)
@@ -364,6 +365,13 @@
    (when-let [conn (state/get-datascript-conn repo)]
      (search/page-search repo @conn q limit)))
 
+  (page-rename
+   [this repo old-name new-name]
+   (when-let [conn (state/get-datascript-conn repo)]
+     (let [config (state/get-config repo)
+           result (worker-page-rename/rename! repo conn config old-name new-name)]
+       (bean/->js {:result result}))))
+
   (file-writes-finished?
    [this]
    (empty? @file/*writes))

+ 5 - 3
src/main/frontend/handler/common/page.cljs

@@ -108,13 +108,14 @@
 
 
 (defn after-page-deleted!
-  [repo page-name file-path]
+  [repo page-name file-path tx-meta]
   (let [repo-dir (config/get-repo-dir repo)]
       ;; TODO: move favorite && unfavorite to worker too
     (unfavorite-page! page-name)
 
-    (when (= (some-> (state/get-current-page) common-util/page-name-sanity-lc)
-             (common-util/page-name-sanity-lc page-name))
+    (when (and (not= :rename-page (:real-outliner-op tx-meta))
+               (= (some-> (state/get-current-page) common-util/page-name-sanity-lc)
+                  (common-util/page-name-sanity-lc page-name)))
       (route-handler/redirect-to-home!))
 
     ;; TODO: why need this?
@@ -146,6 +147,7 @@
         page (db/entity [:block/name new-page-name])
         redirect? (= (some-> (state/get-current-page) common-util/page-name-sanity-lc)
                      (common-util/page-name-sanity-lc old-page-name))]
+
     ;; Redirect to the newly renamed page
     (when redirect?
       (route-handler/redirect! {:to          (if (model/whiteboard-page? page) :whiteboard :page)

+ 3 - 16
src/main/frontend/handler/editor.cljs

@@ -270,28 +270,15 @@
                       (assoc :block/uuid (:block/uuid block)))
            opts' (assoc opts :outliner-op :save-block)
            original-block (db/entity (:db/id block))
-           original-props (:block/properties original-block)
-           result (ui-outliner-tx/transact!
+           original-props (:block/properties original-block)]
+       (ui-outliner-tx/transact!
                    opts'
                    (outliner-save-block! block')
                    ;; page properties changed
                    (when-let [page-name (and (:block/pre-block? block')
                                              (not= original-props (:block/properties block'))
                                              (some-> (:block/page block') :db/id (db-utils/pull) :block/name))]
-                     (state/set-page-properties-changed! page-name)))]
-
-       ;; file based graph only
-       ;; sanitized page name changed
-       (when-let [title (get-in block' [:block/properties :title])]
-         (if (string? title)
-           (when-let [old-page-name (:block/name (db/entity (:db/id (:block/page block'))))]
-             (when (and (:block/pre-block? block')
-                        (not (string/blank? title))
-                        (not= (util/page-name-sanity-lc title) old-page-name))
-               (state/pub-event! [:page/title-property-changed old-page-name title true])))
-           (js/console.error (str "Title is not a string: " title))))
-
-       result))))
+                     (state/set-page-properties-changed! page-name)))))))
 
 ;; id: block dom id, "ls-block-counter-uuid"
 (defn- another-block-with-same-id-exists?

+ 2 - 5
src/main/frontend/handler/events.cljs

@@ -345,16 +345,13 @@
 (defmethod handle :modal/set-git-username-and-email [[_ _content]]
   (state/set-modal! git-component/set-git-username-and-email))
 
-(defmethod handle :page/title-property-changed [[_ old-title new-title]]
-  (page-handler/rename! old-title new-title))
-
 (defmethod handle :page/create [[_ page-name opts]]
   (if (= page-name (date/today))
     (page-handler/create-today-journal!)
     (page-handler/<create! page-name opts)))
 
-(defmethod handle :page/deleted [[_ repo page-name file-path]]
-  (page-common-handler/after-page-deleted! repo page-name file-path))
+(defmethod handle :page/deleted [[_ repo page-name file-path tx-meta]]
+  (page-common-handler/after-page-deleted! repo page-name file-path tx-meta))
 
 (defmethod handle :page/renamed [[_ repo data]]
   (page-common-handler/after-page-renamed! repo data))

+ 14 - 14
src/main/frontend/handler/page.cljs

@@ -18,7 +18,6 @@
             [frontend.handler.property :as property-handler]
             [frontend.handler.ui :as ui-handler]
             [frontend.handler.web.nfs :as web-nfs]
-            [frontend.worker.handler.page.rename :as worker-page-rename]
             [frontend.mobile.util :as mobile-util]
             [frontend.state :as state]
             [frontend.util :as util]
@@ -36,7 +35,9 @@
             [logseq.common.path :as path]
             [frontend.handler.property.util :as pu]
             [electron.ipc :as ipc]
-            [frontend.context.i18n :refer [t]]))
+            [frontend.context.i18n :refer [t]]
+            [frontend.persist-db.browser :as db-browser]
+            [cljs-bean.core :as bean]))
 
 (def create! page-common-handler/create!)
 (def <create! page-common-handler/<create!)
@@ -71,18 +72,17 @@
         (favorite-page! page-name)))))
 
 (defn rename!
-  [old-name new-name & {:as opts}]
-  (let [repo (state/get-current-repo)
-        conn (db/get-db repo false)
-        config (state/get-config repo)
-        result (worker-page-rename/rename! repo conn config old-name new-name opts)]
-    (case result
-      :invalid-empty-name
-      (notification/show! "Please use a valid name, empty name is not allowed!" :error)
-      :merge-whiteboard-pages
-      (notification/show! "Can't merge whiteboard pages" :error)
-      nil)
-    result))
+  [old-name new-name & {:as _opts}]
+  (when-let [^js worker @db-browser/*worker]
+    (p/let [repo (state/get-current-repo)
+            result (.page-rename worker repo old-name new-name)
+            result' (:result (bean/->clj result))]
+      (case result'
+        :invalid-empty-name
+        (notification/show! "Please use a valid name, empty name is not allowed!" :error)
+        :merge-whiteboard-pages
+        (notification/show! "Can't merge whiteboard pages" :error)
+        nil))))
 
 (defn reorder-favorites!
   [favorites]

+ 1 - 1
src/main/frontend/modules/outliner/pipeline.cljs

@@ -90,7 +90,7 @@
                               :tx-meta (:tx-meta tx-report)}]))))
 
     (when (= (:outliner-op tx-meta) :delete-page)
-      (state/pub-event! [:page/deleted repo (:deleted-page tx-meta) (:file-path tx-meta)]))
+      (state/pub-event! [:page/deleted repo (:deleted-page tx-meta) (:file-path tx-meta) tx-meta]))
 
     (when (= (:outliner-op tx-meta) :rename-page)
       (state/pub-event! [:page/renamed repo (:data tx-meta)]))

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

@@ -197,7 +197,7 @@
 
 (defn delete!
   "Deletes a page and then either calls the ok-handler or the error-handler if unable to delete"
-  [repo conn page-name ok-handler & {:keys [persist-op? error-handler]
+  [repo conn page-name ok-handler & {:keys [persist-op? rename? error-handler]
                                      :or {persist-op? true
                                           error-handler (fn [{:keys [msg]}] (js/console.error msg))}}]
   (when (and repo page-name)
@@ -239,6 +239,8 @@
                          (cond-> {:outliner-op :delete-page
                                   :deleted-page page-name
                                   :persist-op? persist-op?}
+                           rename?
+                           (assoc :real-outliner-op :rename-page)
                            file-path
                            (assoc :file-path file-path)))
 

+ 20 - 13
src/main/frontend/worker/handler/page/rename.cljs

@@ -89,8 +89,10 @@
        (distinct)
        (vec)))
 
+(declare rename-page-aux)
+
 (defn- based-merge-pages!
-  [repo conn config from-page-name to-page-name persist-op?]
+  [repo conn config from-page-name to-page-name {:keys [old-name new-name persist-op?]}]
   (when (and (ldb/page-exists? @conn from-page-name)
              (ldb/page-exists? @conn to-page-name)
              (not= from-page-name to-page-name))
@@ -124,12 +126,12 @@
                                 (replace-page-ref from-page to-page)
                                 (page-rename/replace-page-ref db config from-page-name to-page-name))
           tx-data (concat blocks-tx-data replace-ref-tx-data)]
-      (ldb/transact! conn tx-data {:persist-op? persist-op?})
-      (rename-update-namespace! repo conn config from-page
-                                (common-util/get-page-original-name from-page)
-                                (common-util/get-page-original-name to-page)))
 
-    (worker-page/delete! repo conn from-page-name (fn [_]))))
+      (rename-page-aux repo conn config old-name new-name
+                       :merge? true
+                       :other-tx tx-data))
+
+    (worker-page/delete! repo conn from-page-name (fn [_]) {:rename? true})))
 
 (defn- compute-new-file-path
   "Construct the full path given old full path and the file sanitized body.
@@ -156,7 +158,7 @@
 
 (defn- rename-page-aux
   "Only accepts unsanitized page names"
-  [repo conn config old-name new-name]
+  [repo conn config old-name new-name & {:keys [merge? other-tx]}]
   (let [db                  @conn
         old-page-name       (common-util/page-name-sanity-lc old-name)
         new-page-name       (common-util/page-name-sanity-lc new-name)
@@ -164,12 +166,14 @@
         page                (d/pull @conn '[*] [:block/name old-page-name])]
     (when (and repo page)
       (let [old-original-name   (:block/original-name page)
-            page-txs            [{:db/id               (:db/id page)
-                                  :block/uuid          (:block/uuid page)
-                                  :block/name          new-page-name
-                                  :block/original-name new-name}]
+            page-txs            (when-not merge?
+                                  [{:db/id               (:db/id page)
+                                    :block/uuid          (:block/uuid page)
+                                    :block/name          new-page-name
+                                    :block/original-name new-name}])
             {:keys [old-path new-path tx-data]} (update-file-tx db old-page-name new-name)
             txs (concat page-txs
+                        other-tx
                         (when-not db-based?
                           (->>
                            (concat
@@ -265,11 +269,14 @@
           (ldb/transact! conn
                          [{:db/id (:db/id page-e)
                            :block/original-name new-name}]
-                         {:persist-op? persist-op?})
+                         {:persist-op? persist-op?
+                          :outliner-op :rename-page})
 
           (and (not= old-page-name new-page-name)
                (d/entity @conn [:block/name new-page-name])) ; merge page
-          (based-merge-pages! repo conn config old-page-name new-page-name persist-op?)
+          (based-merge-pages! repo conn config old-page-name new-page-name {:old-name old-name
+                                                                            :new-name new-name
+                                                                            :persist-op? persist-op?})
 
           :else                          ; rename
           (rename-namespace-pages! repo conn config old-name new-name))