Pārlūkot izejas kodu

fix: re-order selected blocks before bulk indent and delete

Tienson Qin 4 gadi atpakaļ
vecāks
revīzija
4c83040ec1

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

@@ -683,11 +683,23 @@
         end-block-parent (get-end-block-parent end-block blocks)]
     (outliner-core/block end-block-parent)))
 
+(defn- reorder-blocks
+  [blocks]
+  (if (<= (count blocks) 1)
+    blocks
+    (let [[f s & others] blocks]
+      (if (= (or (:block/left s)
+                 (:block/parent s))
+             {:db/id (:db/id f)})
+        blocks
+        (reverse blocks)))))
+
 (defn delete-blocks!
   [repo block-uuids]
   (when (seq block-uuids)
     (let [lookup-refs (map (fn [id] [:block/uuid id]) block-uuids)
-          blocks (db/pull-many repo '[*] lookup-refs)]
+          blocks (db/pull-many repo '[*] lookup-refs)
+          blocks (reorder-blocks blocks)]
       (let [start-node (outliner-core/block (first blocks))
             end-node (get-top-level-end-node blocks)]
         (outliner-core/delete-nodes start-node end-node lookup-refs)
@@ -1544,29 +1556,29 @@
         (cond
           (seq blocks)
           (do
-            (util/stop e)
             (let [lookup-refs (->> (map (fn [block] (when-let [id (dom/attr block "blockid")]
                                                      [:block/uuid (medley/uuid id)])) blocks)
-                                  (remove nil?))
-                 blocks (db/pull-many repo '[*] lookup-refs)
-                 end-node (get-top-level-end-node blocks)
-                 end-node-parent (tree/-get-parent end-node)
-                 top-level-nodes (->> (filter #(= (get-in end-node-parent [:data :db/id])
-                                                  (get-in % [:block/parent :db/id])) blocks)
-                                      (map outliner-core/block))]
-             (outliner-core/indent-outdent-nodes top-level-nodes (= direction :right))
-             (let [opts {:key :block/change
-                         :data blocks}]
-               (db/refresh! repo opts)
-               (let [blocks (doall
-                             (map
+                                   (remove nil?))
+                  blocks (db/pull-many repo '[*] lookup-refs)
+                  blocks (reorder-blocks blocks)
+                  end-node (get-top-level-end-node blocks)
+                  end-node-parent (tree/-get-parent end-node)
+                  top-level-nodes (->> (filter #(= (get-in end-node-parent [:data :db/id])
+                                                   (get-in % [:block/parent :db/id])) blocks)
+                                       (map outliner-core/block))]
+              (outliner-core/indent-outdent-nodes top-level-nodes (= direction :right))
+              (let [opts {:key :block/change
+                          :data blocks}]
+                (db/refresh! repo opts)
+                (let [blocks (doall
+                              (map
                                (fn [block]
                                  (when-let [id (gobj/get block "id")]
                                    (when-let [block (gdom/getElement id)]
                                      (dom/add-class! block "selected noselect")
                                      block)))
                                blocks-dom-nodes))]
-                 (state/set-selection-blocks! blocks)))))
+                  (state/set-selection-blocks! blocks)))))
 
           (gdom/getElement "date-time-picker")
           nil

+ 1 - 4
src/main/frontend/modules/outliner/core.cljs

@@ -7,13 +7,10 @@
             [frontend.modules.outliner.utils :as outliner-u]
             [frontend.modules.outliner.state :as outliner-state]
             [frontend.state :as state]
-            [frontend.debug :as debug]
             [clojure.set :as set]
             [clojure.zip :as zip]
-            [frontend.modules.outliner.file :as outliner-file]
             [frontend.modules.outliner.datascript :as ds]
-            [frontend.util :as util :refer-macros [profile]]
-            [datascript.core :as d]))
+            [frontend.util :as util]))
 
 (defrecord Block [data])