Tienson Qin 1 год назад
Родитель
Сommit
aa98bc431d
2 измененных файлов с 97 добавлено и 109 удалено
  1. 1 15
      src/main/frontend/components/block.cljs
  2. 96 94
      src/main/frontend/handler/editor.cljs

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

@@ -1780,20 +1780,7 @@
 
    (every? #(= % ["Horizontal_Rule"]) body)))
 
-(def save-block-should-update
-  (fn [old-state new-state]
-    ;; Don't refresh content until UI get notified from the worker
-    (let [old-edit? (:edit? (last (:rum/args old-state)))
-          new-edit? (:edit? (last (:rum/args new-state)))
-          old-tx-id (:block/tx-id (nth (:rum/args old-state) 1))
-          new-tx-id (:block/tx-id (nth (:rum/args new-state) 1))]
-      (or (not old-edit?)
-          (and old-edit? (not= old-tx-id new-tx-id))
-          (and (not (state/editing?)) (not= old-edit? new-edit?))))))
-
-
 (rum/defcs block-control < rum/reactive
-  {:should-update save-block-should-update}
   [state config block {:keys [uuid block-id collapsed? *control-show? edit? selected?]}]
   (let [doc-mode?          (state/sub :document/mode?)
         control-show?      (util/react *control-show?)
@@ -2515,8 +2502,7 @@
                (reset! *refs-count count))
              (assoc state
                     ::hide-block-refs? (atom default-hide?)
-                    ::refs-count *refs-count)))
-   :should-update save-block-should-update}
+                    ::refs-count *refs-count)))}
   [state config {:block/keys [uuid format] :as block} {:keys [edit-input-id block-id edit? hide-block-refs-count? selected? *ref]}]
   (let [*hide-block-refs? (get state ::hide-block-refs?)
         *refs-count (get state ::refs-count)

+ 96 - 94
src/main/frontend/handler/editor.cljs

@@ -67,7 +67,8 @@
             [rum.core :as rum]
             [frontend.fs.capacitor-fs :as capacitor-fs]
             [logseq.db :as ldb]
-            [frontend.db.query-dsl :as query-dsl]))
+            [frontend.db.query-dsl :as query-dsl]
+            [frontend.db.transact :as db-transact]))
 
 ;; FIXME: should support multiple images concurrently uploading
 
@@ -381,8 +382,8 @@
         (state/set-edit-content! edit-input-id new-content)))
     (p/let [_ (let [sibling? (not= (:db/id left-block) (:db/id (:block/parent block)))]
        (outliner-insert-block! config left-block prev-block {:sibling? sibling?
-                                                             :keep-uuid? true}))])
-    prev-block))
+                                                             :keep-uuid? true})
+       prev-block)])))
 
 (defn insert-new-block-aux!
   [config
@@ -407,8 +408,8 @@
         sibling? (when block-self? false)]
     (p/let [_ (outliner-insert-block! config current-block next-block {:sibling? sibling?
                                                                        :keep-uuid? true})]
-      (util/set-change-value input fst-block-text))
-    (assoc next-block :block/content snd-block-text)))
+      (util/set-change-value input fst-block-text)
+      (assoc next-block :block/content snd-block-text))))
 
 (defn clear-when-saved!
   []
@@ -470,10 +471,10 @@
                          insert-new-block-before-block-aux!
 
                          :else
-                         insert-new-block-aux!)
-             last-block (insert-fn config block'' value)]
-         (clear-when-saved!)
-         (edit-block! last-block 0))))))
+                         insert-new-block-aux!)]
+         (p/let [last-block (insert-fn config block'' value)]
+           (clear-when-saved!)
+           (edit-block! last-block 0)))))))
 
 (defn api-insert-new-block!
   [content {:keys [page block-uuid sibling? before? properties
@@ -775,98 +776,99 @@
 (declare expand-block!)
 (defn delete-block!
   [repo delete-children?]
-  (let [{:keys [id block-id block-parent-id value format config]} (get-state)]
-    (when block-id
-      (when-let [block-e (db/entity [:block/uuid block-id])]
-        (let [prev-block (db-model/get-prev (db/get-db) (:db/id block-e))]
-          (cond
-            (nil? prev-block)
-            nil
+  (when (db-transact/request-finished?)
+    (let [{:keys [id block-id block-parent-id value format config]} (get-state)]
+      (when block-id
+        (when-let [block-e (db/entity [:block/uuid block-id])]
+          (let [prev-block (db-model/get-prev (db/get-db) (:db/id block-e))]
+            (cond
+              (nil? prev-block)
+              nil
 
-            :else
-            (let [has-children? (seq (:block/_parent block-e))
-                  block (db/pull (:db/id block-e))
-                  left (otree/-get-left (outliner-core/block (db/get-db) block) (db/get-db false))
-                  left-has-children? (and left
-                                          (when-let [block-id (:block/uuid (:data left))]
-                                            (let [block (db/entity [:block/uuid block-id])]
-                                              (seq (:block/_parent block)))))
-                  delete-block-fn (fn [block]
-                                    (delete-block-aux! block delete-children? {:children-check? false}))]
-              (when-not (and has-children? left-has-children?)
-                (when block-parent-id
-                  (let [block-parent (gdom/getElement block-parent-id)
-                        sibling-block (if (:embed? config)
-                                        (util/get-prev-block-non-collapsed
-                                         block-parent
-                                         {:container (util/rec-get-blocks-container block-parent)})
-                                        (util/get-prev-block-non-collapsed-non-embed block-parent))
-                        {:keys [prev-block new-content]} (move-to-prev-block repo sibling-block format id value)
-                        concat-prev-block? (boolean (and prev-block new-content))
-                        transact-opts {:outliner-op :delete-blocks}
-                        db-based? (config/db-based-graph? repo)
-                        db (db/get-db repo)]
-                    (ui-outliner-tx/transact!
-                     transact-opts
-                     (cond
-                       (and prev-block (:block/name prev-block)
-                            (not= (:db/id prev-block) (:db/id (:block/parent block)))
-                            (db-model/hidden-page? (:block/page block))) ; embed page
-                       nil
-
-                       concat-prev-block?
-                       (let [prev-e (db/entity (:db/id prev-block))
-                             current-e (db/entity (:db/id block))
-                             new-properties (merge (:block/properties prev-e)
-                                                   (:block/properties current-e))
-                             new-tags (->> (concat (:block/tags prev-e) (:block/tags current-e)))]
-                         (if (seq (:block/_refs (db/entity (:db/id block))))
-                           (do
-                             (delete-block-fn prev-block)
-                             (save-block! repo block new-content {})
-                             (outliner-save-block! {:db/id (:db/id block)
-                                                    :block/parent (:db/id (:block/parent prev-block))
-                                                    :block/left (or (:db/id (:block/left prev-block))
-                                                                    (:db/id (:block/parent prev-block)))})
+              :else
+              (let [has-children? (seq (:block/_parent block-e))
+                    block (db/pull (:db/id block-e))
+                    left (otree/-get-left (outliner-core/block (db/get-db) block) (db/get-db false))
+                    left-has-children? (and left
+                                            (when-let [block-id (:block/uuid (:data left))]
+                                              (let [block (db/entity [:block/uuid block-id])]
+                                                (seq (:block/_parent block)))))
+                    delete-block-fn (fn [block]
+                                      (delete-block-aux! block delete-children? {:children-check? false}))]
+                (when-not (and has-children? left-has-children?)
+                  (when block-parent-id
+                    (let [block-parent (gdom/getElement block-parent-id)
+                          sibling-block (if (:embed? config)
+                                          (util/get-prev-block-non-collapsed
+                                           block-parent
+                                           {:container (util/rec-get-blocks-container block-parent)})
+                                          (util/get-prev-block-non-collapsed-non-embed block-parent))
+                          {:keys [prev-block new-content]} (move-to-prev-block repo sibling-block format id value)
+                          concat-prev-block? (boolean (and prev-block new-content))
+                          transact-opts {:outliner-op :delete-blocks}
+                          db-based? (config/db-based-graph? repo)
+                          db (db/get-db repo)]
+                      (ui-outliner-tx/transact!
+                       transact-opts
+                       (cond
+                         (and prev-block (:block/name prev-block)
+                              (not= (:db/id prev-block) (:db/id (:block/parent block)))
+                              (db-model/hidden-page? (:block/page block))) ; embed page
+                         nil
+
+                         concat-prev-block?
+                         (let [prev-e (db/entity (:db/id prev-block))
+                               current-e (db/entity (:db/id block))
+                               new-properties (merge (:block/properties prev-e)
+                                                     (:block/properties current-e))
+                               new-tags (->> (concat (:block/tags prev-e) (:block/tags current-e)))]
+                           (if (seq (:block/_refs (db/entity (:db/id block))))
+                             (do
+                               (delete-block-fn prev-block)
+                               (save-block! repo block new-content {})
+                               (outliner-save-block! {:db/id (:db/id block)
+                                                      :block/parent (:db/id (:block/parent prev-block))
+                                                      :block/left (or (:db/id (:block/left prev-block))
+                                                                      (:db/id (:block/parent prev-block)))})
 
                              ;; block->right needs to point its `left` to block->left
-                             (let [block-right (outliner-core/get-right-sibling db (:db/id block))]
-                               (when (and block-right (not= (:db/id (:block/parent prev-block))
-                                                            (:db/id (:block/parent block))))
-                                 (outliner-save-block! {:db/id (:db/id block-right)
-                                                        :block/left (:db/id (:block/left block))})))
+                               (let [block-right (outliner-core/get-right-sibling db (:db/id block))]
+                                 (when (and block-right (not= (:db/id (:block/parent prev-block))
+                                                              (:db/id (:block/parent block))))
+                                   (outliner-save-block! {:db/id (:db/id block-right)
+                                                          :block/left (:db/id (:block/left block))})))
 
                              ;; update prev-block's children to point to the refed block
-                             (when (or (:block/collapsed? prev-block)
-                                       (= (:db/id prev-block) (:db/id (:block/parent block))))
-                               (let [children (:block/_parent prev-block)]
-                                 (doseq [child children]
-                                   (when-not (= (:db/id child) (:db/id block))
-                                     (outliner-save-block! {:db/id (:db/id child)
-                                                            :block/parent (:db/id block)
-                                                            :block/left (:db/id block)})))))
+                               (when (or (:block/collapsed? prev-block)
+                                         (= (:db/id prev-block) (:db/id (:block/parent block))))
+                                 (let [children (:block/_parent prev-block)]
+                                   (doseq [child children]
+                                     (when-not (= (:db/id child) (:db/id block))
+                                       (outliner-save-block! {:db/id (:db/id child)
+                                                              :block/parent (:db/id block)
+                                                              :block/left (:db/id block)})))))
 
                              ;; parent will be removed
-                             (when (= (:db/id prev-block) (:db/id (:block/parent block)))
-                               (when-let [parent-right (when prev-block (outliner-core/get-right-sibling db (:db/id prev-block)))]
-                                 (outliner-save-block! {:db/id (:db/id parent-right)
-                                                        :block/left (:db/id block)})))
+                               (when (= (:db/id prev-block) (:db/id (:block/parent block)))
+                                 (when-let [parent-right (when prev-block (outliner-core/get-right-sibling db (:db/id prev-block)))]
+                                   (outliner-save-block! {:db/id (:db/id parent-right)
+                                                          :block/left (:db/id block)})))
+
+                               (when db-based?
+                                 (outliner-save-block! {:db/id (:db/id block)
+                                                        :block/properties new-properties
+                                                        :block/tags new-tags})))
+
+                             (do
+                               (delete-block-fn block)
+                               (save-block! repo prev-block new-content {})
+                               (when db-based?
+                                 (outliner-save-block! {:db/id (:db/id prev-block)
+                                                        :block/properties new-properties
+                                                        :block/tags new-tags})))))
 
-                             (when db-based?
-                               (outliner-save-block! {:db/id (:db/id block)
-                                                      :block/properties new-properties
-                                                      :block/tags new-tags})))
-
-                           (do
-                             (delete-block-fn block)
-                             (save-block! repo prev-block new-content {})
-                             (when db-based?
-                               (outliner-save-block! {:db/id (:db/id prev-block)
-                                                      :block/properties new-properties
-                                                      :block/tags new-tags})))))
-
-                       :else
-                       (delete-block-fn block)))))))))))))
+                         :else
+                         (delete-block-fn block))))))))))))))
 
 (defn delete-blocks!
   [repo block-uuids blocks dom-blocks]
@@ -2854,7 +2856,7 @@
 
       ;; just delete
       :else
-      (when-not (mobile-util/native-ios?)
+      (when (and input (not (mobile-util/native-ios?)))
         (util/stop e)
         (delete-and-update
          input (util/safe-dec-current-pos-from-end (.-value input) current-pos) current-pos)))))