Просмотр исходного кода

attach block left and parent for <pull & <get-block

Tienson Qin 2 лет назад
Родитель
Сommit
8f845a7145

+ 9 - 13
deps/db/src/logseq/db/sqlite/common_db.cljs

@@ -28,17 +28,13 @@
                :file/path (:v e)
                :file/content (:file/content (d/entity db (:e e)))}))))
 
-(defn- get-block-with-refs
+(defn with-parent-and-left
   [db block]
-  (update block :block/refs (fn [refs]
-                               (map (fn [ref]
-                                      (let [e (d/entity db (:db/id ref))]
-                                        (if (and e (:block/name e))
-                                          (assoc ref
-                                                 :block/uuid (:block/uuid e)
-                                                 :block/original-name (:block/name e)
-                                                 :block/name (:block/name e))
-                                          ref))) refs))))
+  (if (:block/name block)
+    block
+    (assoc block
+          :block/left (select-keys (d/entity db (:db/id (:block/left block))) [:db/id :block/uuid])
+          :block/parent (select-keys (d/entity db (:db/id (:block/parent block))) [:db/id :block/uuid]))))
 
 (defn get-block-and-children
   [db name children?]
@@ -51,10 +47,10 @@
                 (let [id (uuid name)]
                   (d/entity db [:block/uuid id])))]
     (if (and block (not (:block/name block))) ; not a page
-      (let [block' (d/pull db '[*] (:db/id block))
-            block-with-refs (get-block-with-refs db block')]
+      (let [block' (->> (d/pull db '[*] (:db/id block))
+                        (with-parent-and-left db))]
         (cond->
-         {:block block-with-refs}
+         {:block block'}
           children?
           (assoc :children (get-children (:block/_parent block)))))
       (when-let [block (or block (d/entity db [:block/name name]))]

+ 10 - 0
src/main/frontend/db/async.cljs

@@ -145,6 +145,16 @@
             block
             result'))))))
 
+(defn <get-right-sibling
+  [graph db-id]
+  (assert (integer? db-id))
+  (when-let [^Object worker @db-browser/*worker]
+    (p/let [result-str (.get-right-sibling worker graph db-id)
+            result (edn/read-string result-str)
+            conn (db/get-db graph false)
+            _ (d/transact! conn result)]
+      result)))
+
 (defn <get-block-refs
   [graph eid]
   (assert (integer? eid))

+ 8 - 5
src/main/frontend/db_worker.cljs

@@ -282,7 +282,8 @@
    (when-let [conn (worker-state/get-datascript-conn repo)]
      (let [selector (edn/read-string selector-str)
            id (edn/read-string id-str)
-           result (d/pull @conn selector id)]
+           result (->> (d/pull @conn selector id)
+                       (sqlite-common-db/with-parent-and-left @conn))]
        (pr-str result))))
 
   (pull-many
@@ -291,11 +292,13 @@
      (let [selector (edn/read-string selector-str)
            ids (edn/read-string ids-str)
            result (d/pull-many @conn selector ids)]
-       (let []
-         (pr-str result)))))
+       (pr-str result))))
 
-  (get-block-neighbors
-   [_this repo id])
+  (get-right-sibling
+   [_this repo db-id]
+   (when-let [conn (worker-state/get-datascript-conn repo)]
+     (let [result (ldb/get-right-sibling @conn db-id)]
+       (pr-str result))))
 
   (get-block-and-children
    [_this repo name children?]

+ 23 - 21
src/main/frontend/handler/editor.cljs

@@ -764,16 +764,18 @@
                                     (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)]
+                  (p/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)
+                          block-right (db-async/<get-right-sibling repo (:db/id block))
+                          parent-right (when prev-block (db-async/<get-right-sibling repo (:db/id prev-block)))]
                     (ui-outliner-tx/transact!
                      transact-opts
                      (cond
@@ -786,7 +788,7 @@
                        (let [new-properties (merge (:block/properties (db/entity (:db/id prev-block)))
                                                    (:block/properties (db/entity (:db/id block))))]
                          (if (seq (:block/_refs (db/entity (:db/id block))))
-                           (let [block-right (outliner-core/get-right-sibling (db/get-db) (:db/id block))]
+                           (do
                              (delete-block-fn prev-block)
                              (save-block! repo block new-content {})
                              (outliner-save-block! {:db/id (:db/id block)
@@ -812,7 +814,7 @@
 
                              ;; parent will be removed
                              (when (= (:db/id prev-block) (:db/id (:block/parent block)))
-                               (when-let [parent-right (outliner-core/get-right-sibling (db/get-db) (:db/id prev-block))]
+                               (when parent-right
                                  (outliner-save-block! {:db/id (:db/id parent-right)
                                                         :block/left (:db/id block)})))
 
@@ -2673,15 +2675,15 @@
   (state/set-edit-content! (state/get-edit-input-id) (.-value input)))
 
 (defn- delete-concat [current-block]
-  (let [repo (state/get-current-repo)
-        ^js input (state/get-input)
-        current-pos (cursor/pos input)
-        value (gobj/get input "value")
-        collapsed? (util/collapsed? current-block)
-        next-block (when-let [e (db-model/get-next (db/get-db repo) (:db/id current-block))]
-                     (db/pull (:db/id e)))
-        next-block-right (when next-block (outliner-core/get-right-sibling (db/get-db) (:db/id next-block)))
-        db-based? (config/db-based-graph? repo)]
+  (p/let [repo (state/get-current-repo)
+          ^js input (state/get-input)
+          current-pos (cursor/pos input)
+          value (gobj/get input "value")
+          collapsed? (util/collapsed? current-block)
+          next-block (when-let [e (db-model/get-next (db/get-db repo) (:db/id current-block))]
+                       (db/pull (:db/id e)))
+          next-block-right (when next-block (db-async/<get-right-sibling repo (:db/id next-block)))
+          db-based? (config/db-based-graph? repo)]
     (cond
       (nil? next-block)
       nil

+ 18 - 16
src/main/logseq/api.cljs

@@ -56,6 +56,7 @@
   [id-or-name]
   (when id-or-name
     (let [eid (cond
+                (uuid? id-or-name) [:block/uuid id-or-name]
                 (and (vector? id-or-name) (= (count id-or-name) 2)) id-or-name
                 (number? id-or-name) id-or-name
                 (and (string? id-or-name) (util/uuid-string? id-or-name)) [:block/uuid (uuid id-or-name)]
@@ -632,7 +633,7 @@
     (when (string/blank? block-uuid-or-page-name)
       (throw (js/Error. "Page title or block UUID shouldn't be empty.")))
     (p/let [block? (util/uuid-string? (str block-uuid-or-page-name))
-            block (<ensure-page-loaded block-uuid-or-page-name)]
+            block (<pull-block (str block-uuid-or-page-name))]
       (if (and block? (not block))
         (throw (js/Error. "Block not exists"))
         (p/let [{:keys [before sibling focus customUUID properties autoOrderedList]} (bean/->clj opts)
@@ -700,21 +701,21 @@
 (def ^:export remove_block
   (fn [block-uuid ^js _opts]
     (p/let [repo            (state/get-current-repo)
-            _ (<ensure-page-loaded block-uuid)]
+            _ (<pull-block  block-uuid)]
       (editor-handler/delete-block-aux!
        {:block/uuid (sdk-utils/uuid-or-throw-error block-uuid) :repo repo} true))))
 
 (def ^:export update_block
   (fn [block-uuid content ^js opts]
     (p/let [repo (state/get-current-repo)
-            _ (<ensure-page-loaded block-uuid)]
+            _ (<pull-block block-uuid)]
       (editor-handler/save-block! repo
                                   (sdk-utils/uuid-or-throw-error block-uuid) content (bean/->clj opts)))))
 
 (def ^:export move_block
   (fn [src-block-uuid target-block-uuid ^js opts]
-    (p/let [_ (<ensure-page-loaded src-block-uuid)
-            _ (<ensure-page-loaded target-block-uuid)]
+    (p/let [_ (<pull-block src-block-uuid)
+            _ (<pull-block target-block-uuid)]
       (let [{:keys [before children]} (bean/->clj opts)
            move-to      (cond
                           (boolean before)
@@ -747,20 +748,21 @@
 (def ^:export get_previous_sibling_block
   (fn [block-uuid]
     (p/let [id (sdk-utils/uuid-or-throw-error block-uuid)
-            _ (<ensure-page-loaded id)]
-      (when-let [block (db-model/query-block-by-uuid (sdk-utils/uuid-or-throw-error block-uuid))]
-       (let [{:block/keys [parent left]} block
-             block (when-not (= parent left) (db-utils/pull (:db/id left)))]
-         (and block (bean/->js (sdk-utils/normalize-keyword-for-json block))))))))
+            block (<pull-block id)]
+      (when block
+       (p/let [{:block/keys [parent left]} block
+               block (when-not (= parent left) (<pull-block (:db/id left)))]
+         (when block
+           (bean/->js (sdk-utils/normalize-keyword-for-json block))))))))
 
 (def ^:export get_next_sibling_block
   (fn [block-uuid]
     (p/let [id (sdk-utils/uuid-or-throw-error block-uuid)
-            _ (<ensure-page-loaded id)]
-      (when-let [block (db-model/query-block-by-uuid id)]
-       (when-let [right-sibling (outliner-core/get-right-sibling (db/get-db) (:db/id block))]
-         (let [block (db/pull (:db/id right-sibling))]
-           (bean/->js (sdk-utils/normalize-keyword-for-json block))))))))
+            block (<pull-block id)]
+      (when block
+        (p/let [sibling (db-async/<get-right-sibling (state/get-current-repo) (:db/id block))]
+          (when sibling
+            (bean/->js (sdk-utils/normalize-keyword-for-json sibling))))))))
 
 (def ^:export set_block_collapsed
   (fn [block-uuid ^js opts]
@@ -861,7 +863,7 @@
 
 (defn ^:export prepend_block_in_page
   [uuid-or-page-name content ^js opts]
-  (p/let [_               (<ensure-page-loaded uuid-or-page-name)
+  (p/let [_               (<pull-block uuid-or-page-name)
           page?           (not (util/uuid-string? uuid-or-page-name))
           page-not-exist? (and page? (nil? (db-model/get-page uuid-or-page-name)))
           _               (and page-not-exist? (page-handler/<create! uuid-or-page-name