Browse Source

fix: page rename undo/redo

Tienson Qin 1 year ago
parent
commit
029ed109b9

+ 3 - 1
e2e-tests/history.spec.ts

@@ -44,7 +44,9 @@ test('undo/redo of a renamed page should be preserved', async ({ page, block })
 
 
   await renamePage(page, randomString(10))
   await renamePage(page, randomString(10))
 
 
-  await page.keyboard.press(modKey + '+z')
+  await page.keyboard.press(modKey + '+z') // undo rename page
+  await page.waitForTimeout(100)
+  await page.keyboard.press(modKey + '+z') // undo text edit
   await page.waitForTimeout(100)
   await page.waitForTimeout(100)
 
 
   await expect(page.locator('text="text 1"')).toHaveCount(0)
   await expect(page.locator('text="text 1"')).toHaveCount(0)

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

@@ -253,12 +253,12 @@
                        (db/page-exists? @*title-value))
                        (db/page-exists? @*title-value))
         rename-fn (fn [old-name new-name]
         rename-fn (fn [old-name new-name]
                     (if (and whiteboard-page? (config/db-based-graph? (state/get-current-repo)))
                     (if (and whiteboard-page? (config/db-based-graph? (state/get-current-repo)))
-                      (do
-                        (db/transact! [{:db/id (:db/id page)
-                                        :block/original-name new-name
-                                        :block/name (util/page-name-sanity-lc new-name)
-                                        :block/updated-at (util/time-ms)}])
-                        (route-handler/redirect-to-whiteboard! new-name))
+                      (p/do!
+                       (db/transact! [{:db/id (:db/id page)
+                                       :block/original-name new-name
+                                       :block/name (util/page-name-sanity-lc new-name)
+                                       :block/updated-at (util/time-ms)}])
+                       (route-handler/redirect-to-whiteboard! new-name))
                       (page-handler/rename! old-name new-name)))
                       (page-handler/rename! old-name new-name)))
         rollback-fn #(let [old-name (if untitled? "" old-name)]
         rollback-fn #(let [old-name (if untitled? "" old-name)]
                        (reset! *title-value old-name)
                        (reset! *title-value old-name)
@@ -286,9 +286,9 @@
                         (rollback-fn))
                         (rollback-fn))
 
 
                     :else
                     :else
-                    (do
-                      (rename-fn (or title page-name) @*title-value)
-                      (reset! *edit? false)))
+                    (p/do!
+                     (rename-fn (or title page-name) @*title-value)
+                     (js/setTimeout #(reset! *edit? false) 100)))
                   (util/stop e))]
                   (util/stop e))]
     [:input.edit-input.p-0.focus:outline-none.ring-none
     [:input.edit-input.p-0.focus:outline-none.ring-none
      {:type          "text"
      {:type          "text"

+ 0 - 1
src/main/frontend/handler/code.cljs

@@ -14,7 +14,6 @@
 (defn save-code-editor!
 (defn save-code-editor!
   []
   []
   (let [{:keys [config state editor]} (get @state/state :editor/code-block-context)]
   (let [{:keys [config state editor]} (get @state/state :editor/code-block-context)]
-    (state/set-state! :editor/skip-saving-current-block? true)
     (state/set-block-component-editing-mode! false)
     (state/set-block-component-editing-mode! false)
     (when editor
     (when editor
       (.save editor)
       (.save editor)

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

@@ -1315,8 +1315,7 @@
    (save-current-block! {}))
    (save-current-block! {}))
   ([{:keys [force? skip-properties? current-block] :as opts}]
   ([{:keys [force? skip-properties? current-block] :as opts}]
    ;; non English input method
    ;; non English input method
-   (let [result (when-not (or (state/editor-in-composition?)
-                              @(:editor/skip-saving-current-block? @state/state))
+   (let [result (when-not (state/editor-in-composition?)
                   (when (state/get-current-repo)
                   (when (state/get-current-repo)
                     (when-not (state/get-editor-action)
                     (when-not (state/get-editor-action)
                       (try
                       (try
@@ -1347,7 +1346,6 @@
                               (save-block-aux! db-block value opts))))
                               (save-block-aux! db-block value opts))))
                         (catch :default error
                         (catch :default error
                           (log/error :save-block-failed error))))))]
                           (log/error :save-block-failed error))))))]
-     (state/set-state! :editor/skip-saving-current-block? false)
      result)))
      result)))
 
 
 (defn- clean-content!
 (defn- clean-content!

+ 20 - 8
src/main/frontend/modules/editor/undo_redo.cljs

@@ -4,7 +4,9 @@
             [frontend.util.page :as page-util]
             [frontend.util.page :as page-util]
             [frontend.state :as state]
             [frontend.state :as state]
             [clojure.set :as set]
             [clojure.set :as set]
-            [medley.core :as medley]))
+            [medley.core :as medley]
+            [frontend.handler.route :as route-handler]
+            [promesa.core :as p]))
 
 
 ;;;; APIs
 ;;;; APIs
 
 
@@ -141,10 +143,14 @@
           current-editor-cursor (get @(get @state/state :history/tx->editor-cursor) tx-id)
           current-editor-cursor (get @(get @state/state :history/tx->editor-cursor) tx-id)
           editor-cursor current-editor-cursor]
           editor-cursor current-editor-cursor]
       (push-redo e)
       (push-redo e)
-      (transact! new-txs (merge {:undo? true}
-                                tx-meta))
-      (when (:whiteboard/transact? tx-meta)
-        (state/pub-event! [:whiteboard/undo e]))
+      (p/do!
+       (transact! new-txs (merge {:undo? true}
+                                 tx-meta))
+       (when (:whiteboard/transact? tx-meta)
+         (state/pub-event! [:whiteboard/undo e]))
+       (when (= :rename-page (:outliner-op tx-meta))
+         (when-let [old-page (:old-name (:data tx-meta))]
+           (route-handler/redirect-to-page! old-page))))
       (assoc e
       (assoc e
              :txs-op new-txs
              :txs-op new-txs
              :editor-cursor editor-cursor))))
              :editor-cursor editor-cursor))))
@@ -155,10 +161,16 @@
     (let [new-txs (get-txs true txs)
     (let [new-txs (get-txs true txs)
           current-editor-cursor (get @(get @state/state :history/tx->editor-cursor) tx-id)]
           current-editor-cursor (get @(get @state/state :history/tx->editor-cursor) tx-id)]
       (push-undo e)
       (push-undo e)
-      (transact! new-txs (merge {:redo? true}
-                                tx-meta))
-      (when (:whiteboard/transact? tx-meta)
+      (p/do!
+       (transact! new-txs (merge {:redo? true}
+                                 tx-meta))
+       (when (:whiteboard/transact? tx-meta)
         (state/pub-event! [:whiteboard/redo e]))
         (state/pub-event! [:whiteboard/redo e]))
+
+       (when (= :rename-page (:outliner-op tx-meta))
+         (when-let [new-page (:new-name (:data tx-meta))]
+           (route-handler/redirect-to-page! new-page))))
+
       (assoc e
       (assoc e
              :txs-op new-txs
              :txs-op new-txs
              :editor-cursor current-editor-cursor))))
              :editor-cursor current-editor-cursor))))

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

@@ -58,12 +58,6 @@
       (when (seq pages)
       (when (seq pages)
         (mark-pages-as-loaded! repo pages)))
         (mark-pages-as-loaded! repo pages)))
 
 
-    (when (= (:outliner-op tx-meta) :delete-page)
-      (state/pub-event! [:page/deleted repo (:deleted-page tx-meta) (:file-path tx-meta)]))
-
-    (when (= (:outliner-op tx-meta) :rename-page)
-      (state/pub-event! [:page/renamed repo (:data tx-meta)]))
-
     (if (or from-disk? new-graph?)
     (if (or from-disk? new-graph?)
       (do
       (do
         (react/clear-query-state!)
         (react/clear-query-state!)
@@ -87,6 +81,12 @@
                               :tx-data (:tx-data tx-report)
                               :tx-data (:tx-data tx-report)
                               :tx-meta (:tx-meta tx-report)}]))))
                               :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)]))
+
+    (when (= (:outliner-op tx-meta) :rename-page)
+      (state/pub-event! [:page/renamed repo (:data tx-meta)]))
+
     (when-let [deleting-block-id (:ui/deleting-block @state/state)]
     (when-let [deleting-block-id (:ui/deleting-block @state/state)]
       (when (some (fn [datom] (and
       (when (some (fn [datom] (and
                                (= :block/uuid (:a datom))
                                (= :block/uuid (:a datom))

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

@@ -145,9 +145,6 @@
       ;; for audio record
       ;; for audio record
       :editor/record-status                  "NONE"
       :editor/record-status                  "NONE"
 
 
-      ;; Whether to skip saving the current block
-      :editor/skip-saving-current-block?     (atom false)
-
       :editor/code-block-context             {}
       :editor/code-block-context             {}
 
 
       :db/properties-changed-pages           {}
       :db/properties-changed-pages           {}