mirror of https://github.com/logseq/logseq
Fix pasting file - fixes #8926
Also remove unused mocks in formatted paste and clean up editor-on-paste!pull/8949/head
parent
37230c229f
commit
07a3adcb52
|
@ -181,6 +181,16 @@
|
||||||
(paste-text-in-one-block-at-point))
|
(paste-text-in-one-block-at-point))
|
||||||
(paste-copied-blocks-or-text text e html)))
|
(paste-copied-blocks-or-text text e html)))
|
||||||
|
|
||||||
|
(defn- paste-file-if-exists [id e]
|
||||||
|
(when id
|
||||||
|
(let [clipboard-data (gobj/get e "clipboardData")
|
||||||
|
files (.-files clipboard-data)]
|
||||||
|
(when-let [file (first files)]
|
||||||
|
(when-let [block (state/get-edit-block)]
|
||||||
|
(editor-handler/upload-asset id #js[file] (:block/format block)
|
||||||
|
editor-handler/*asset-uploading? true)))
|
||||||
|
(util/stop e))))
|
||||||
|
|
||||||
(defn editor-on-paste!
|
(defn editor-on-paste!
|
||||||
"Pastes with formatting and includes the following features:
|
"Pastes with formatting and includes the following features:
|
||||||
- handles internal pastes to correctly paste at the block level
|
- handles internal pastes to correctly paste at the block level
|
||||||
|
@ -194,29 +204,19 @@
|
||||||
[id]
|
[id]
|
||||||
(fn [e]
|
(fn [e]
|
||||||
(state/set-state! :editor/on-paste? true)
|
(state/set-state! :editor/on-paste? true)
|
||||||
(let [input (state/get-input)
|
|
||||||
clipboard-data (gobj/get e "clipboardData")
|
|
||||||
html (.getData clipboard-data "text/html")
|
|
||||||
text (.getData clipboard-data "text")
|
|
||||||
files (.-files text)
|
|
||||||
paste-file-if-exist (fn []
|
|
||||||
(when id
|
|
||||||
(let [_handled
|
|
||||||
(let [clipboard-data (gobj/get e "clipboardData")
|
(let [clipboard-data (gobj/get e "clipboardData")
|
||||||
files (.-files clipboard-data)]
|
html (.getData clipboard-data "text/html")
|
||||||
(when-let [file (first files)]
|
text (.getData clipboard-data "text")]
|
||||||
(when-let [block (state/get-edit-block)]
|
|
||||||
(editor-handler/upload-asset id #js[file] (:block/format block)
|
|
||||||
editor-handler/*asset-uploading? true))))]
|
|
||||||
(util/stop e))))]
|
|
||||||
(cond
|
(cond
|
||||||
(and (string/blank? text) (string/blank? html)) (paste-file-if-exist)
|
(and (string/blank? text) (string/blank? html))
|
||||||
(and (seq files) (state/preferred-pasting-file?)) (paste-file-if-exist)
|
(paste-file-if-exists id e)
|
||||||
|
(and (seq (.-files clipboard-data)) (state/preferred-pasting-file?))
|
||||||
|
(paste-file-if-exists id e)
|
||||||
:else
|
:else
|
||||||
(let [text' (or (when (gp-util/url? text)
|
(let [text' (or (when (gp-util/url? text)
|
||||||
(wrap-macro-url text))
|
(wrap-macro-url text))
|
||||||
text)]
|
text)]
|
||||||
(paste-text-or-blocks-aux input e text' html))))))
|
(paste-text-or-blocks-aux (state/get-input) e text' html))))))
|
||||||
|
|
||||||
(defn editor-on-paste-raw!
|
(defn editor-on-paste-raw!
|
||||||
"Raw pastes without _any_ formatting. Can also replace selected text with a paste"
|
"Raw pastes without _any_ formatting. Can also replace selected text with a paste"
|
||||||
|
|
|
@ -110,8 +110,7 @@
|
||||||
expected-paste "{{video https://www.youtube.com/watch?v=xu9p5ynlhZk}}"]
|
expected-paste "{{video https://www.youtube.com/watch?v=xu9p5ynlhZk}}"]
|
||||||
(test-helper/with-reset
|
(test-helper/with-reset
|
||||||
reset
|
reset
|
||||||
[utils/getClipText (fn [cb] (cb clipboard))
|
[state/get-input (constantly #js {:value "block"})
|
||||||
state/get-input (constantly #js {:value "block"})
|
|
||||||
;; paste-copied-blocks-or-text mocks below
|
;; paste-copied-blocks-or-text mocks below
|
||||||
commands/delete-selection! (constantly nil)
|
commands/delete-selection! (constantly nil)
|
||||||
commands/simple-insert! (fn [_input text] (p/resolved text))
|
commands/simple-insert! (fn [_input text] (p/resolved text))
|
||||||
|
@ -128,8 +127,7 @@
|
||||||
block-content "test:: before"]
|
block-content "test:: before"]
|
||||||
(test-helper/with-reset
|
(test-helper/with-reset
|
||||||
reset
|
reset
|
||||||
[utils/getClipText (fn [cb] (cb clipboard))
|
[state/get-input (constantly #js {:value block-content})
|
||||||
state/get-input (constantly #js {:value block-content})
|
|
||||||
;; paste-copied-blocks-or-text mocks below
|
;; paste-copied-blocks-or-text mocks below
|
||||||
commands/delete-selection! (constantly nil)
|
commands/delete-selection! (constantly nil)
|
||||||
commands/simple-insert! (fn [_input text] (p/resolved text))
|
commands/simple-insert! (fn [_input text] (p/resolved text))
|
||||||
|
@ -139,3 +137,21 @@
|
||||||
#js {:clipboardData #js {:getData (constantly clipboard)}})]
|
#js {:clipboardData #js {:getData (constantly clipboard)}})]
|
||||||
(is (= expected-paste result))
|
(is (= expected-paste result))
|
||||||
(reset)))))
|
(reset)))))
|
||||||
|
|
||||||
|
(deftest-async editor-on-paste-with-file-pasting
|
||||||
|
(let [clipboard "<meta charset='utf-8'><img src=\"https://user-images.githubusercontent.com/38045018/228234385-cbbcc6b2-1168-40da-ab3e-1e506edd5fce.png\"/>"
|
||||||
|
files [{:name "image.png" :type "image/png" :size 11836}]
|
||||||
|
pasted-file (atom nil)]
|
||||||
|
(test-helper/with-reset
|
||||||
|
reset
|
||||||
|
[state/preferred-pasting-file? (constantly true)
|
||||||
|
;; paste-file-if-exists mocks below
|
||||||
|
editor-handler/upload-asset (fn [_id file & _]
|
||||||
|
(reset! pasted-file file))
|
||||||
|
util/stop (constantly nil)
|
||||||
|
state/get-edit-block (constantly {})]
|
||||||
|
(p/let [_ ((paste-handler/editor-on-paste! :fake-id)
|
||||||
|
#js {:clipboardData #js {:getData (constantly clipboard)
|
||||||
|
:files files}})]
|
||||||
|
(is (= files (js->clj @pasted-file)))
|
||||||
|
(reset)))))
|
||||||
|
|
Loading…
Reference in New Issue