diff --git a/backend/src/uxbox/services/mutations/files.clj b/backend/src/uxbox/services/mutations/files.clj index d4c0ddbf8e..d128d46f64 100644 --- a/backend/src/uxbox/services/mutations/files.clj +++ b/backend/src/uxbox/services/mutations/files.clj @@ -136,7 +136,7 @@ (s/def ::content ::imgs/upload) (s/def ::add-file-image-from-url - (s/keys :req-un [::profile-id ::file-id ::name ::url] + (s/keys :req-un [::profile-id ::file-id ::url] :opt-un [::id])) (s/def ::upload-file-image @@ -148,7 +148,8 @@ (db/with-atomic [conn db/pool] (files/check-edition-permissions! conn profile-id file-id) (let [content (images/download-image url) - params' (merge params {:content content})] + params' (merge params {:content content + :name (:filename content)})] (create-file-image conn params')))) (sm/defmutation ::upload-file-image diff --git a/backend/src/uxbox/services/mutations/images.clj b/backend/src/uxbox/services/mutations/images.clj index f4f51587c8..af59411902 100644 --- a/backend/src/uxbox/services/mutations/images.clj +++ b/backend/src/uxbox/services/mutations/images.clj @@ -128,7 +128,7 @@ (s/def ::content ::upload) (s/def ::add-image-from-url - (s/keys :req-un [::profile-id ::library-id ::name ::url] + (s/keys :req-un [::profile-id ::library-id ::url] :opt-un [::id])) (s/def ::upload-image @@ -141,7 +141,8 @@ (let [lib (select-library-for-update conn library-id)] (teams/check-edition-permissions! conn profile-id (:team-id lib)) (let [content (images/download-image url) - params' (merge params {:content content})] + params' (merge params {:content content + :name (:filename content)})] (create-image conn params'))))) (sm/defmutation ::upload-image diff --git a/backend/tests/uxbox/tests/test_services_files.clj b/backend/tests/uxbox/tests/test_services_files.clj index 90636ac475..796d7c2e6b 100644 --- a/backend/tests/uxbox/tests/test_services_files.clj +++ b/backend/tests/uxbox/tests/test_services_files.clj @@ -140,7 +140,6 @@ data {::sm/type :add-file-image-from-url :profile-id (:id prof) :file-id (:id file) - :name "testfile" :url url} out (th/try-on! (sm/handle data))] @@ -149,7 +148,7 @@ (let [result (:result out)] (t/is (= (:id file) (:file-id result))) - (t/is (= (:name data) (:name result))) + (t/is (not (nil? (:name result)))) (t/is (= 787 (:width result))) (t/is (= 2000 (:height result))) (t/is (= "image/jpeg" (:mtype result))) diff --git a/backend/tests/uxbox/tests/test_services_images.clj b/backend/tests/uxbox/tests/test_services_images.clj index baf5e57c83..ec7b2b7574 100644 --- a/backend/tests/uxbox/tests/test_services_images.clj +++ b/backend/tests/uxbox/tests/test_services_images.clj @@ -116,7 +116,6 @@ :id image-id-1 :profile-id (:id prof) :library-id (:id lib) - :name "testfile" :url url} out (th/try-on! (sm/handle data))] @@ -124,7 +123,7 @@ (t/is (nil? (:error out))) (t/is (= image-id-1 (get-in out [:result :id]))) - (t/is (= "testfile" (get-in out [:result :name]))) + (t/is (not (nil? (get-in out [:result :name])))) (t/is (= "image/jpeg" (get-in out [:result :mtype]))) (t/is (= "image/jpeg" (get-in out [:result :thumb-mtype]))) (t/is (= 787 (get-in out [:result :width]))) diff --git a/frontend/src/uxbox/main/data/workspace.cljs b/frontend/src/uxbox/main/data/workspace.cljs index c0d59e9939..1b8dea2eb1 100644 --- a/frontend/src/uxbox/main/data/workspace.cljs +++ b/frontend/src/uxbox/main/data/workspace.cljs @@ -1463,6 +1463,7 @@ ;; Persistence +(def add-image-from-url dwp/add-image-from-url) (def upload-image dwp/upload-image) (def rename-page dwp/rename-page) (def delete-page dwp/delete-page) diff --git a/frontend/src/uxbox/main/data/workspace/persistence.cljs b/frontend/src/uxbox/main/data/workspace/persistence.cljs index 4a36b5fd98..0ce638645c 100644 --- a/frontend/src/uxbox/main/data/workspace/persistence.cljs +++ b/frontend/src/uxbox/main/data/workspace/persistence.cljs @@ -301,6 +301,38 @@ ;; and update-photo at main/data/users.cljs ;; https://tree.taiga.io/project/uxboxproject/us/440 +(defn add-image-from-url + ([url] (add-image-from-url url identity)) + ([url on-added] + (us/verify fn? on-added) + (ptk/reify ::add-image-from-url + ptk/WatchEvent + (watch [_ state stream] + (let [file-id (get-in state [:workspace-page :file-id]) + + on-success #(do (st/emit! dm/hide) + (on-added %)) + + on-error #(do (st/emit! dm/hide) + (if (.-message %) + (rx/of (dm/error (.-message %))) + (rx/of (dm/error (tr "errors.unexpected-error"))))) + + prepare + (fn [url] + {:file-id file-id + :url url})] + + (st/emit! (dm/show {:content (tr "image.loading") + :type :info + :timeout nil})) + (->> (rx/of url) + (rx/map prepare) + (rx/mapcat #(rp/mutation! :add-file-image-from-url %)) + (rx/do on-success) + (rx/map image-uploaded) + (rx/catch on-error))))))) + (defn upload-image ([file] (upload-image file identity)) ([file on-uploaded] diff --git a/frontend/src/uxbox/main/ui/workspace/viewport.cljs b/frontend/src/uxbox/main/ui/workspace/viewport.cljs index a891c2dcd4..8590b05d53 100644 --- a/frontend/src/uxbox/main/ui/workspace/viewport.cljs +++ b/frontend/src/uxbox/main/ui/workspace/viewport.cljs @@ -337,13 +337,15 @@ on-drag-enter (fn [e] (when (or (dnd/has-type? e "uxbox/shape") - (dnd/has-type? e "Files")) + (dnd/has-type? e "Files") + (dnd/has-type? e "text/uri-list")) (dom/prevent-default e))) on-drag-over (fn [e] (when (or (dnd/has-type? e "uxbox/shape") - (dnd/has-type? e "Files")) + (dnd/has-type? e "Files") + (dnd/has-type? e "text/uri-list")) (dom/prevent-default e))) on-uploaded @@ -361,8 +363,9 @@ on-drop (fn [event] (dom/prevent-default event) - (if (dnd/has-type? event "uxbox/shape") + (cond + (dnd/has-type? event "uxbox/shape") (let [shape (dnd/get-data event "uxbox/shape") point (gpt/point (.-clientX event) (.-clientY event)) viewport-coord (translate-point-to-viewport point) @@ -372,6 +375,15 @@ (assoc :x final-x) (assoc :y final-y))))) + (dnd/has-type? event "text/uri-list") + (let [data (dnd/get-data event "text/uri-list") + lines (str/lines data) + urls (filter #(and (not (str/blank? %)) + (not (str/starts-with? % "#"))) + lines)] + (run! #(st/emit! (dw/add-image-from-url % on-uploaded)) urls)) + + :else (let [files (dnd/get-files event)] (run! #(st/emit! (dw/upload-image % on-uploaded)) files))))