| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- (ns frontend.handler.dnd
- "Provides fns for drag and drop"
- (:require [frontend.db :as db]
- [frontend.handler.block :as block-handler]
- [frontend.handler.editor :as editor-handler]
- [frontend.handler.property :as property-handler]
- [frontend.modules.outliner.op :as outliner-op]
- [frontend.modules.outliner.ui :as ui-outliner-tx]
- [frontend.ref :as ref]
- [frontend.state :as state]
- [logseq.db :as ldb]))
- (defn move-blocks
- [^js event blocks target-block original-block move-to]
- (let [target-block (db/entity (:db/id target-block))
- blocks' (map #(db/entity (:db/id %)) blocks)
- first-block (first blocks')
- top? (= move-to :top)
- nested? (= move-to :nested)
- alt-key? (and event (.-altKey event))
- current-format (get first-block :block/format :markdown)
- target-format (get target-block :block/format :markdown)
- target-block (if nested? target-block
- (or original-block target-block))]
- (cond
- ;; alt pressed, make a block-ref
- (and alt-key? (= (count blocks) 1))
- (do
- (property-handler/file-persist-block-id! (state/get-current-repo) (:block/uuid first-block))
- (editor-handler/api-insert-new-block!
- (ref/->block-ref (:block/uuid first-block))
- {:block-uuid (:block/uuid target-block)
- :sibling? (not nested?)
- :before? top?}))
- ;; format mismatch
- (and current-format target-format (not= current-format target-format))
- (state/pub-event! [:notification/show
- {:content [:div "Those two pages have different formats."]
- :status :warning
- :clear? true}])
- (every? map? (conj blocks' target-block))
- (let [blocks' (block-handler/get-top-level-blocks blocks')]
- (ui-outliner-tx/transact!
- {:outliner-op :move-blocks}
- (editor-handler/save-current-block!)
- (if top?
- (let [first-child?
- (= (:block/uuid (:block/parent target-block))
- (:block/uuid (ldb/get-left-sibling target-block)))]
- (if first-child?
- (when-let [parent (:block/parent target-block)]
- (outliner-op/move-blocks! blocks' parent false))
- (if-let [before-node (ldb/get-left-sibling target-block)]
- (outliner-op/move-blocks! blocks' before-node true)
- (when-let [parent (:block/parent target-block)]
- (outliner-op/move-blocks! blocks' parent false)))))
- (outliner-op/move-blocks! blocks' target-block (not nested?)))))
- :else
- nil)))
|