mirror of
https://github.com/logseq/logseq.git
synced 2026-05-03 10:26:35 +00:00
Remove dom dependency for outliner.core
This commit is contained in:
@@ -16,7 +16,8 @@
|
||||
[frontend.util.drawer :as drawer]
|
||||
[frontend.handler.file-based.property.util :as property-util]
|
||||
[frontend.handler.property.util :as pu]
|
||||
[dommy.core :as dom]))
|
||||
[dommy.core :as dom]
|
||||
[goog.object :as gobj]))
|
||||
|
||||
;; Fns
|
||||
|
||||
@@ -57,170 +58,12 @@
|
||||
[{:block/keys [level] :as _block}]
|
||||
(not= level 1))
|
||||
|
||||
(defn indent-outdent-block!
|
||||
[block direction]
|
||||
(ui-outliner-tx/transact!
|
||||
{:outliner-op :move-blocks}
|
||||
(outliner-core/indent-outdent-blocks! (db/get-db false) [block] (= direction :right))))
|
||||
|
||||
(defn select-block!
|
||||
[block-uuid]
|
||||
(let [blocks (js/document.getElementsByClassName (str "id" block-uuid))]
|
||||
(when (seq blocks)
|
||||
(state/exit-editing-and-set-selected-blocks! blocks))))
|
||||
|
||||
(def *swipe (atom nil))
|
||||
(def *touch-start (atom nil))
|
||||
|
||||
(defn- target-disable-swipe?
|
||||
[target]
|
||||
(let [user-defined-tags (get-in (state/get-config)
|
||||
[:mobile :gestures/disabled-in-block-with-tags])]
|
||||
(or (.closest target ".dsl-query")
|
||||
(.closest target ".drawer")
|
||||
(.closest target ".draw-wrap")
|
||||
(some #(.closest target (util/format "[data-refs-self*=%s]" %))
|
||||
user-defined-tags))))
|
||||
|
||||
(defn on-touch-start
|
||||
[event uuid]
|
||||
(let [target (.-target event)
|
||||
input (state/get-input)
|
||||
input-id (state/get-edit-input-id)
|
||||
selection-type (.-type (.getSelection js/document))]
|
||||
(reset! *touch-start (js/Date.now))
|
||||
(when-not (and input
|
||||
(string/ends-with? input-id (str uuid)))
|
||||
(state/clear-edit!))
|
||||
(when-not (target-disable-swipe? target)
|
||||
(when (not= selection-type "Range")
|
||||
(when-let [touches (.-targetTouches event)]
|
||||
(when (= (.-length touches) 1)
|
||||
(let [touch (aget touches 0)
|
||||
x (.-clientX touch)
|
||||
y (.-clientY touch)]
|
||||
(reset! *swipe {:x0 x :y0 y :xi x :yi y :tx x :ty y :direction nil}))))))))
|
||||
|
||||
(defn on-touch-move
|
||||
[event block uuid edit? *show-left-menu? *show-right-menu?]
|
||||
(when-let [touches (.-targetTouches event)]
|
||||
(let [selection-type (.-type (.getSelection js/document))]
|
||||
(when-not (= selection-type "Range")
|
||||
(when (or (not @state/*editor-editing-ref)
|
||||
(< (- (js/Date.now) @*touch-start) 600))
|
||||
(when (and (= (.-length touches) 1) @*swipe)
|
||||
(let [{:keys [x0 xi direction]} @*swipe
|
||||
touch (aget touches 0)
|
||||
tx (.-clientX touch)
|
||||
ty (.-clientY touch)
|
||||
direction (if (nil? direction)
|
||||
(if (> tx x0)
|
||||
:right
|
||||
:left)
|
||||
direction)]
|
||||
(swap! *swipe #(-> %
|
||||
(assoc :tx tx)
|
||||
(assoc :ty ty)
|
||||
(assoc :xi tx)
|
||||
(assoc :yi ty)
|
||||
(assoc :direction direction)))
|
||||
(when (< (* (- xi x0) (- tx xi)) 0)
|
||||
(swap! *swipe #(-> %
|
||||
(assoc :x0 tx)
|
||||
(assoc :y0 ty))))
|
||||
(let [{:keys [x0 y0]} @*swipe
|
||||
dx (- tx x0)
|
||||
dy (- ty y0)]
|
||||
(when (and (< (. js/Math abs dy) 30)
|
||||
(> (. js/Math abs dx) 30))
|
||||
(let [left (gdom/getElement (str "block-left-menu-" uuid))
|
||||
right (gdom/getElement (str "block-right-menu-" uuid))]
|
||||
|
||||
(cond
|
||||
(= direction :right)
|
||||
(do
|
||||
(reset! *show-left-menu? true)
|
||||
(when left
|
||||
(when (>= dx 0)
|
||||
(set! (.. left -style -width) (str dx "px")))
|
||||
(when (< dx 0)
|
||||
(set! (.. left -style -width) (str (max (+ 40 dx) 0) "px")))
|
||||
|
||||
(let [indent (gdom/getFirstElementChild left)]
|
||||
(when (indentable? block)
|
||||
(if (>= (.-clientWidth left) 40)
|
||||
(set! (.. indent -style -opacity) "100%")
|
||||
(set! (.. indent -style -opacity) "30%"))))))
|
||||
|
||||
(= direction :left)
|
||||
(do
|
||||
(reset! *show-right-menu? true)
|
||||
(when right
|
||||
(when (<= dx 0)
|
||||
(set! (.. right -style -width) (str (- dx) "px")))
|
||||
(when (> dx 0)
|
||||
(set! (.. right -style -width) (str (max (- 80 dx) 0) "px")))
|
||||
|
||||
(let [outdent (gdom/getFirstElementChild right)
|
||||
more (when-not edit?
|
||||
(gdom/getLastElementChild right))]
|
||||
(when (and outdent (outdentable? block))
|
||||
(if (and (>= (.-clientWidth right) 40)
|
||||
(< (.-clientWidth right) 80))
|
||||
(set! (.. outdent -style -opacity) "100%")
|
||||
(set! (.. outdent -style -opacity) "30%")))
|
||||
|
||||
(when more
|
||||
(if (>= (.-clientWidth right) 80)
|
||||
(set! (.. more -style -opacity) "100%")
|
||||
(set! (.. more -style -opacity) "30%"))))))
|
||||
:else
|
||||
nil)))))))))))
|
||||
|
||||
(defn on-touch-end
|
||||
[_event block uuid *show-left-menu? *show-right-menu?]
|
||||
(when @*swipe
|
||||
(let [left-menu (gdom/getElement (str "block-left-menu-" uuid))
|
||||
right-menu (gdom/getElement (str "block-right-menu-" uuid))
|
||||
{:keys [x0 tx]} @*swipe
|
||||
dx (- tx x0)]
|
||||
(try
|
||||
(when (> (. js/Math abs dx) 10)
|
||||
(cond
|
||||
(and left-menu (>= (.-clientWidth left-menu) 40))
|
||||
(when (indentable? block)
|
||||
(haptics/with-haptics-impact
|
||||
(indent-outdent-block! block :right)
|
||||
:light))
|
||||
|
||||
(and right-menu (<= 40 (.-clientWidth right-menu) 79))
|
||||
(when (outdentable? block)
|
||||
(haptics/with-haptics-impact
|
||||
(indent-outdent-block! block :left)
|
||||
:light))
|
||||
|
||||
(and right-menu (>= (.-clientWidth right-menu) 80))
|
||||
(haptics/with-haptics-impact
|
||||
(do (state/set-state! :mobile/show-action-bar? true)
|
||||
(state/set-state! :mobile/actioned-block block)
|
||||
(select-block! uuid))
|
||||
:light)
|
||||
|
||||
:else
|
||||
nil))
|
||||
(catch :default e
|
||||
(js/console.error e))
|
||||
(finally
|
||||
(reset! *show-left-menu? false)
|
||||
(reset! *show-right-menu? false)
|
||||
(reset! *swipe nil))))))
|
||||
|
||||
(defn on-touch-cancel
|
||||
[*show-left-menu? *show-right-menu?]
|
||||
(reset! *show-left-menu? false)
|
||||
(reset! *show-right-menu? false)
|
||||
(reset! *swipe nil))
|
||||
|
||||
(defn get-blocks-refed-pages
|
||||
[aliases [block & children]]
|
||||
(let [children-refs (mapcat :block/refs children)
|
||||
@@ -410,3 +253,229 @@
|
||||
(drawer/remove-logbook)))]
|
||||
(state/clear-selection!)
|
||||
(edit-block-aux repo block content block-node text-range opts)))))
|
||||
|
||||
(defn- get-original-block-by-dom
|
||||
[node]
|
||||
(when-let [id (some-> node
|
||||
(gobj/get "parentNode")
|
||||
(util/rec-get-node "ls-block")
|
||||
(dom/attr "originalblockid")
|
||||
uuid)]
|
||||
(db/entity [:block/uuid id])))
|
||||
|
||||
(defn- get-original-block
|
||||
"Get the original block from the current editing block or selected blocks"
|
||||
[linked-block]
|
||||
(cond
|
||||
(and
|
||||
(= (:block/uuid linked-block)
|
||||
(:block/uuid (state/get-edit-block)))
|
||||
(state/get-input)) ; editing block
|
||||
(get-original-block-by-dom (state/get-input))
|
||||
|
||||
(seq (state/get-selection-blocks))
|
||||
(->> (state/get-selection-blocks)
|
||||
(remove nil?)
|
||||
(keep #(when-let [id (dom/attr % "blockid")]
|
||||
(when (= (uuid id) (:block/uuid linked-block))
|
||||
(when-let [original-id (some-> (dom/attr % "originalblockid") uuid)]
|
||||
(db/entity [:block/uuid original-id])))))
|
||||
;; FIXME: what if there're multiple same blocks in the selection
|
||||
first)))
|
||||
|
||||
(defn get-top-level-blocks
|
||||
"Get only the top level blocks and their original blocks."
|
||||
[blocks]
|
||||
{:pre [(seq blocks)]}
|
||||
(let [level-blocks (outliner-core/blocks-with-level blocks)]
|
||||
(->> (filter (fn [b] (= 1 (:block/level b))) level-blocks)
|
||||
(map (fn [b]
|
||||
(let [original (get-original-block b)]
|
||||
(or (and original (db/entity (:db/id original))) b)))))))
|
||||
|
||||
(defn get-current-editing-original-block
|
||||
[]
|
||||
(when-let [input (state/get-input)]
|
||||
(get-original-block-by-dom (util/rec-get-node input "ls-block"))))
|
||||
|
||||
(defn get-first-block-original
|
||||
[]
|
||||
(or
|
||||
(get-current-editing-original-block)
|
||||
(when-let [node (some-> (first (state/get-selection-blocks)))]
|
||||
(get-original-block-by-dom node))))
|
||||
|
||||
(defn- get-last-block-original
|
||||
[last-top-block]
|
||||
(or
|
||||
(get-current-editing-original-block)
|
||||
(when-let [last-block-node (->> (state/get-selection-blocks)
|
||||
(filter (fn [node]
|
||||
(= (dom/attr node "blockid") (str (:block/uuid last-top-block)))))
|
||||
last)]
|
||||
(get-original-block-by-dom last-block-node))))
|
||||
|
||||
(defn indent-outdent-block!
|
||||
[block direction]
|
||||
(ui-outliner-tx/transact!
|
||||
{:outliner-op :move-blocks
|
||||
:real-outliner-op :indent-outdent}
|
||||
(outliner-core/indent-outdent-blocks! (state/get-current-repo)
|
||||
(db/get-db false)
|
||||
(get-top-level-blocks [block])
|
||||
(= direction :right)
|
||||
{:get-first-block-original get-first-block-original})))
|
||||
|
||||
(def *swipe (atom nil))
|
||||
|
||||
(def *touch-start (atom nil))
|
||||
|
||||
(defn- target-disable-swipe?
|
||||
[target]
|
||||
(let [user-defined-tags (get-in (state/get-config)
|
||||
[:mobile :gestures/disabled-in-block-with-tags])]
|
||||
(or (.closest target ".dsl-query")
|
||||
(.closest target ".drawer")
|
||||
(.closest target ".draw-wrap")
|
||||
(some #(.closest target (util/format "[data-refs-self*=%s]" %))
|
||||
user-defined-tags))))
|
||||
|
||||
(defn on-touch-start
|
||||
[event uuid]
|
||||
(let [target (.-target event)
|
||||
input (state/get-input)
|
||||
input-id (state/get-edit-input-id)
|
||||
selection-type (.-type (.getSelection js/document))]
|
||||
(reset! *touch-start (js/Date.now))
|
||||
(when-not (and input
|
||||
(string/ends-with? input-id (str uuid)))
|
||||
(state/clear-edit!))
|
||||
(when-not (target-disable-swipe? target)
|
||||
(when (not= selection-type "Range")
|
||||
(when-let [touches (.-targetTouches event)]
|
||||
(when (= (.-length touches) 1)
|
||||
(let [touch (aget touches 0)
|
||||
x (.-clientX touch)
|
||||
y (.-clientY touch)]
|
||||
(reset! *swipe {:x0 x :y0 y :xi x :yi y :tx x :ty y :direction nil}))))))))
|
||||
|
||||
(defn on-touch-move
|
||||
[event block uuid edit? *show-left-menu? *show-right-menu?]
|
||||
(when-let [touches (.-targetTouches event)]
|
||||
(let [selection-type (.-type (.getSelection js/document))]
|
||||
(when-not (= selection-type "Range")
|
||||
(when (or (not @state/*editor-editing-ref)
|
||||
(< (- (js/Date.now) @*touch-start) 600))
|
||||
(when (and (= (.-length touches) 1) @*swipe)
|
||||
(let [{:keys [x0 xi direction]} @*swipe
|
||||
touch (aget touches 0)
|
||||
tx (.-clientX touch)
|
||||
ty (.-clientY touch)
|
||||
direction (if (nil? direction)
|
||||
(if (> tx x0)
|
||||
:right
|
||||
:left)
|
||||
direction)]
|
||||
(swap! *swipe #(-> %
|
||||
(assoc :tx tx)
|
||||
(assoc :ty ty)
|
||||
(assoc :xi tx)
|
||||
(assoc :yi ty)
|
||||
(assoc :direction direction)))
|
||||
(when (< (* (- xi x0) (- tx xi)) 0)
|
||||
(swap! *swipe #(-> %
|
||||
(assoc :x0 tx)
|
||||
(assoc :y0 ty))))
|
||||
(let [{:keys [x0 y0]} @*swipe
|
||||
dx (- tx x0)
|
||||
dy (- ty y0)]
|
||||
(when (and (< (. js/Math abs dy) 30)
|
||||
(> (. js/Math abs dx) 30))
|
||||
(let [left (gdom/getElement (str "block-left-menu-" uuid))
|
||||
right (gdom/getElement (str "block-right-menu-" uuid))]
|
||||
|
||||
(cond
|
||||
(= direction :right)
|
||||
(do
|
||||
(reset! *show-left-menu? true)
|
||||
(when left
|
||||
(when (>= dx 0)
|
||||
(set! (.. left -style -width) (str dx "px")))
|
||||
(when (< dx 0)
|
||||
(set! (.. left -style -width) (str (max (+ 40 dx) 0) "px")))
|
||||
|
||||
(let [indent (gdom/getFirstElementChild left)]
|
||||
(when (indentable? block)
|
||||
(if (>= (.-clientWidth left) 40)
|
||||
(set! (.. indent -style -opacity) "100%")
|
||||
(set! (.. indent -style -opacity) "30%"))))))
|
||||
|
||||
(= direction :left)
|
||||
(do
|
||||
(reset! *show-right-menu? true)
|
||||
(when right
|
||||
(when (<= dx 0)
|
||||
(set! (.. right -style -width) (str (- dx) "px")))
|
||||
(when (> dx 0)
|
||||
(set! (.. right -style -width) (str (max (- 80 dx) 0) "px")))
|
||||
|
||||
(let [outdent (gdom/getFirstElementChild right)
|
||||
more (when-not edit?
|
||||
(gdom/getLastElementChild right))]
|
||||
(when (and outdent (outdentable? block))
|
||||
(if (and (>= (.-clientWidth right) 40)
|
||||
(< (.-clientWidth right) 80))
|
||||
(set! (.. outdent -style -opacity) "100%")
|
||||
(set! (.. outdent -style -opacity) "30%")))
|
||||
|
||||
(when more
|
||||
(if (>= (.-clientWidth right) 80)
|
||||
(set! (.. more -style -opacity) "100%")
|
||||
(set! (.. more -style -opacity) "30%"))))))
|
||||
:else
|
||||
nil)))))))))))
|
||||
|
||||
|
||||
(defn on-touch-end
|
||||
[_event block uuid *show-left-menu? *show-right-menu?]
|
||||
(when @*swipe
|
||||
(let [left-menu (gdom/getElement (str "block-left-menu-" uuid))
|
||||
right-menu (gdom/getElement (str "block-right-menu-" uuid))
|
||||
{:keys [x0 tx]} @*swipe
|
||||
dx (- tx x0)]
|
||||
(try
|
||||
(when (> (. js/Math abs dx) 10)
|
||||
(cond
|
||||
(and left-menu (>= (.-clientWidth left-menu) 40))
|
||||
(when (indentable? block)
|
||||
(haptics/with-haptics-impact
|
||||
(indent-outdent-block! block :right)
|
||||
:light))
|
||||
|
||||
(and right-menu (<= 40 (.-clientWidth right-menu) 79))
|
||||
(when (outdentable? block)
|
||||
(haptics/with-haptics-impact
|
||||
(indent-outdent-block! block :left)
|
||||
:light))
|
||||
|
||||
(and right-menu (>= (.-clientWidth right-menu) 80))
|
||||
(haptics/with-haptics-impact
|
||||
(do (state/set-state! :mobile/show-action-bar? true)
|
||||
(state/set-state! :mobile/actioned-block block)
|
||||
(select-block! uuid))
|
||||
:light)
|
||||
|
||||
:else
|
||||
nil))
|
||||
(catch :default e
|
||||
(js/console.error e))
|
||||
(finally
|
||||
(reset! *show-left-menu? false)
|
||||
(reset! *show-right-menu? false)
|
||||
(reset! *swipe nil))))))
|
||||
|
||||
(defn on-touch-cancel
|
||||
[*show-left-menu? *show-right-menu?]
|
||||
(reset! *show-left-menu? false)
|
||||
(reset! *show-right-menu? false)
|
||||
(reset! *swipe nil))
|
||||
|
||||
Reference in New Issue
Block a user