From be0d1c19faddc39adbc26bc7259b3fa34df33eba Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Wed, 5 May 2021 13:22:42 +0200 Subject: [PATCH 1/8] :recycle: New namespace for state helpers --- frontend/src/app/main/data/workspace.cljs | 37 +++++++++--------- .../src/app/main/data/workspace/colors.cljs | 8 ++-- .../src/app/main/data/workspace/common.cljs | 32 ++++----------- .../app/main/data/workspace/drawing/box.cljs | 14 +++---- .../main/data/workspace/drawing/curve.cljs | 12 +++--- .../src/app/main/data/workspace/groups.cljs | 11 +++--- .../app/main/data/workspace/libraries.cljs | 23 +++++------ .../app/main/data/workspace/path/drawing.cljs | 3 +- .../app/main/data/workspace/selection.cljs | 29 +++++++------- .../main/data/workspace/state_helpers.cljs | 39 +++++++++++++++++++ .../app/main/data/workspace/svg_upload.cljs | 9 +++-- .../src/app/main/data/workspace/texts.cljs | 25 ++++++------ .../app/main/data/workspace/transforms.cljs | 25 ++++++------ 13 files changed, 149 insertions(+), 118 deletions(-) create mode 100644 frontend/src/app/main/data/workspace/state_helpers.cljs diff --git a/frontend/src/app/main/data/workspace.cljs b/frontend/src/app/main/data/workspace.cljs index 92f68d2de7..ae8714609e 100644 --- a/frontend/src/app/main/data/workspace.cljs +++ b/frontend/src/app/main/data/workspace.cljs @@ -28,6 +28,7 @@ [app.main.data.workspace.path :as dwdp] [app.main.data.workspace.persistence :as dwp] [app.main.data.workspace.selection :as dws] + [app.main.data.workspace.state-helpers :as wsh] [app.main.data.workspace.svg-upload :as svg] [app.main.data.workspace.transforms :as dwt] [app.main.data.workspace.undo :as dwu] @@ -361,7 +362,7 @@ (initialize [state local] (let [page-id (:current-page-id state) - objects (dwc/lookup-page-objects state page-id) + objects (wsh/lookup-page-objects state page-id) shapes (cp/select-toplevel-shapes objects {:include-frames? true}) srect (gsh/selection-rect shapes) local (assoc local :vport size :zoom 1)] @@ -553,7 +554,7 @@ ptk/UpdateEvent (update [_ state] (let [page-id (:current-page-id state) - objects (dwc/lookup-page-objects state page-id) + objects (wsh/lookup-page-objects state page-id) shapes (cp/select-toplevel-shapes objects {:include-frames? true}) srect (gsh/selection-rect shapes)] @@ -576,7 +577,7 @@ (if (empty? selected) state (let [page-id (:current-page-id state) - objects (dwc/lookup-page-objects state page-id) + objects (wsh/lookup-page-objects state page-id) srect (->> selected (map #(get objects %)) (gsh/selection-rect))] @@ -675,7 +676,7 @@ ptk/WatchEvent (watch [_ state stream] (let [page-id (:current-page-id state) - objects (dwc/lookup-page-objects state page-id) + objects (wsh/lookup-page-objects state page-id) selected (get-in state [:workspace-local :selected]) rchanges (mapv (fn [id] (let [obj (get objects id) @@ -882,7 +883,7 @@ ptk/WatchEvent (watch [_ state stream] (let [page-id (:current-page-id state) - objects (dwc/lookup-page-objects state page-id) + objects (wsh/lookup-page-objects state page-id) ;; Ignore any shape whose parent is also intented to be moved ids (cp/clean-loops objects ids) @@ -1000,7 +1001,7 @@ (if-not (= 1 (count selected)) (rx/empty) - (let [objects (dwc/lookup-page-objects state) + (let [objects (wsh/lookup-page-objects state) {:keys [id type shapes]} (get objects (first selected))] (case type @@ -1046,7 +1047,7 @@ ptk/WatchEvent (watch [_ state stream] (let [page-id (:current-page-id state) - objects (dwc/lookup-page-objects state page-id) + objects (wsh/lookup-page-objects state page-id) selected (get-in state [:workspace-local :selected]) moved (if (= 1 (count selected)) (align-object-to-frame objects (first selected) axis) @@ -1077,7 +1078,7 @@ ptk/WatchEvent (watch [_ state stream] (let [page-id (:current-page-id state) - objects (dwc/lookup-page-objects state page-id) + objects (wsh/lookup-page-objects state page-id) selected (get-in state [:workspace-local :selected]) moved (-> (map #(get objects %) selected) (gal/distribute-space axis objects)) @@ -1116,7 +1117,7 @@ ptk/WatchEvent (watch [_ state stream] (let [page-id (:current-page-id state) - objects (dwc/lookup-page-objects state page-id) + objects (wsh/lookup-page-objects state page-id) shape (get objects id) bbox (-> shape :points gsh/points->selrect) @@ -1311,7 +1312,7 @@ (ptk/reify ::copy-selected ptk/WatchEvent (watch [_ state stream] - (let [objects (dwc/lookup-page-objects state) + (let [objects (wsh/lookup-page-objects state) selected (->> (get-in state [:workspace-local :selected]) (cp/clean-loops objects)) pdata (reduce (partial collect-object-ids objects) {} selected) @@ -1377,7 +1378,7 @@ ptk/WatchEvent (watch [_ state stream] (try - (let [objects (dwc/lookup-page-objects state) + (let [objects (wsh/lookup-page-objects state) paste-data (wapi/read-from-paste-event event) image-data (wapi/extract-images paste-data) text-data (wapi/extract-text paste-data) @@ -1413,7 +1414,7 @@ (defn selected-frame? [state] (let [selected (get-in state [:workspace-local :selected]) page-id (:current-page-id state) - objects (dwc/lookup-page-objects state page-id)] + objects (wsh/lookup-page-objects state page-id)] (and (and (= 1 (count selected)) (= :frame (get-in objects [(first selected) :type])))))) @@ -1450,7 +1451,7 @@ item)) (calculate-paste-position [state mouse-pos in-viewport?] - (let [page-objects (dwc/lookup-page-objects state) + (let [page-objects (wsh/lookup-page-objects state) selected-objs (map #(get objects %) selected) has-frame? (d/seek #(= (:type %) :frame) selected-objs) page-selected (get-in state [:workspace-local :selected]) @@ -1518,7 +1519,7 @@ :touched)))))) page-id (:current-page-id state) - unames (-> (dwc/lookup-page-objects state page-id) + unames (-> (wsh/lookup-page-objects state page-id) (dwc/retrieve-used-names)) rchanges (->> (dws/prepare-duplicate-changes objects page-id unames selected delta) @@ -1574,7 +1575,7 @@ width (max 8 (min (* 7 (count text)) 700)) height 16 page-id (:current-page-id state) - frame-id (-> (dwc/lookup-page-objects state page-id) + frame-id (-> (wsh/lookup-page-objects state page-id) (cp/frame-id-by-position @ms/mouse-position)) shape (gsh/setup-selrect {:id id @@ -1649,7 +1650,7 @@ ptk/UpdateEvent (update [_ state] (let [page-id (:current-page-id state) - objects (dwc/lookup-page-objects state page-id) + objects (wsh/lookup-page-objects state page-id) selected-shape-id (-> state (get-in [:workspace-local :selected]) first) selected-shape (get objects selected-shape-id) selected-shape-frame-id (:frame-id selected-shape) @@ -1672,7 +1673,7 @@ (watch [_ state stream] (let [position @ms/mouse-position page-id (:current-page-id state) - objects (dwc/lookup-page-objects state page-id) + objects (wsh/lookup-page-objects state page-id) frame (dwc/get-frame-at-point objects position) shape-id (first (get-in state [:workspace-local :selected])) @@ -1699,7 +1700,7 @@ ptk/WatchEvent (watch [_ state stream] (let [page-id (get state :current-page-id) - options (dwc/lookup-page-options state page-id) + options (wsh/lookup-page-options state page-id) previus-color (:background options)] (rx/of (dch/commit-changes [{:type :set-option diff --git a/frontend/src/app/main/data/workspace/colors.cljs b/frontend/src/app/main/data/workspace/colors.cljs index d43d36905c..a8431bc998 100644 --- a/frontend/src/app/main/data/workspace/colors.cljs +++ b/frontend/src/app/main/data/workspace/colors.cljs @@ -11,9 +11,9 @@ [app.common.spec :as us] [app.common.uuid :as uuid] [app.main.data.modal :as md] - [app.main.data.workspace.common :as dwc] - [app.main.data.workspace.texts :as dwt] [app.main.data.workspace.changes :as dch] + [app.main.data.workspace.state-helpers :as wsh] + [app.main.data.workspace.texts :as dwt] [app.main.repo :as rp] [app.main.store :as st] [app.main.streams :as ms] @@ -127,7 +127,7 @@ ptk/WatchEvent (watch [_ state s] (let [page-id (:current-page-id state) - objects (dwc/lookup-page-objects state page-id) + objects (wsh/lookup-page-objects state page-id) is-text? #(= :text (:type (get objects %))) text-ids (filter is-text? ids) @@ -159,7 +159,7 @@ ptk/WatchEvent (watch [_ state s] (let [page-id (:current-page-id state) - objects (dwc/lookup-page-objects state page-id) + objects (wsh/lookup-page-objects state page-id) attrs (cond-> {} (contains? color :color) diff --git a/frontend/src/app/main/data/workspace/common.cljs b/frontend/src/app/main/data/workspace/common.cljs index b5d8ced0d2..8e8f3ca142 100644 --- a/frontend/src/app/main/data/workspace/common.cljs +++ b/frontend/src/app/main/data/workspace/common.cljs @@ -13,6 +13,7 @@ [app.common.spec :as us] [app.common.uuid :as uuid] [app.main.data.workspace.changes :as dch] + [app.main.data.workspace.state-helpers :as wsh] [app.main.data.workspace.undo :as dwu] [app.main.streams :as ms] [app.main.worker :as uw] @@ -37,25 +38,8 @@ ;; --- Helpers -(defn lookup-page-objects - ([state] - (lookup-page-objects state (:current-page-id state))) - ([state page-id] - (get-in state [:workspace-data :pages-index page-id :objects]))) - -(defn lookup-page-options - ([state] - (lookup-page-options state (:current-page-id state))) - ([state page-id] - (get-in state [:workspace-data :pages-index page-id :options]))) - (defn interrupt? [e] (= e :interrupt)) -(defn lookup-component-objects - ([state component-id] - (get-in state [:workspace-data :components component-id :objects]))) - - ;; --- Selection Index Handling (defn initialize-indices @@ -198,7 +182,7 @@ ptk/WatchEvent (watch [_ state stream] (let [page-id (:current-page-id state) - objects (lookup-page-objects state page-id)] + objects (wsh/lookup-page-objects state page-id)] (rx/of (expand-all-parents ids objects)))))) (declare clear-edition-mode) @@ -209,7 +193,7 @@ (ptk/reify ::start-edition-mode ptk/UpdateEvent (update [_ state] - (let [objects (lookup-page-objects state)] + (let [objects (wsh/lookup-page-objects state)] ;; Can only edit objects that exist (if (contains? objects id) (-> state @@ -219,7 +203,7 @@ ptk/WatchEvent (watch [_ state stream] - (let [objects (lookup-page-objects state)] + (let [objects (wsh/lookup-page-objects state)] (->> stream (rx/filter interrupt?) (rx/take 1) @@ -300,7 +284,7 @@ ptk/WatchEvent (watch [_ state stream] (let [page-id (:current-page-id state) - objects (lookup-page-objects state page-id) + objects (wsh/lookup-page-objects state page-id) id (or (:id attrs) (uuid/next)) name (-> objects @@ -329,7 +313,7 @@ ptk/WatchEvent (watch [_ state stream] (let [page-id (:current-page-id state) - objects (lookup-page-objects state page-id) + objects (wsh/lookup-page-objects state page-id) to-move-shapes (->> (cp/select-toplevel-shapes objects {:include-frames? false}) (filterv #(= (:frame-id %) uuid/zero)) (mapv :id) @@ -361,7 +345,7 @@ ptk/WatchEvent (watch [_ state stream] (let [page-id (:current-page-id state) - objects (lookup-page-objects state page-id) + objects (wsh/lookup-page-objects state page-id) get-empty-parents (fn [parents] @@ -479,7 +463,7 @@ x (:x data (- vbc-x (/ width 2))) y (:y data (- vbc-y (/ height 2))) page-id (:current-page-id state) - frame-id (-> (lookup-page-objects state page-id) + frame-id (-> (wsh/lookup-page-objects state page-id) (cp/frame-id-by-position {:x frame-x :y frame-y})) shape (-> (cp/make-minimal-shape type) (merge data) diff --git a/frontend/src/app/main/data/workspace/drawing/box.cljs b/frontend/src/app/main/data/workspace/drawing/box.cljs index bc5309f942..6e37c1d93d 100644 --- a/frontend/src/app/main/data/workspace/drawing/box.cljs +++ b/frontend/src/app/main/data/workspace/drawing/box.cljs @@ -6,17 +6,17 @@ (ns app.main.data.workspace.drawing.box (:require - [beicon.core :as rx] - [potok.core :as ptk] [app.common.geom.point :as gpt] [app.common.geom.shapes :as gsh] - [app.common.uuid :as uuid] + [app.common.math :as mth] [app.common.pages :as cp] - [app.main.data.workspace.common :as dwc] + [app.common.uuid :as uuid] + [app.main.data.workspace.drawing.common :as common] + [app.main.data.workspace.state-helpers :as wsh] [app.main.snap :as snap] [app.main.streams :as ms] - [app.main.data.workspace.drawing.common :as common] - [app.common.math :as mth])) + [beicon.core :as rx] + [potok.core :as ptk])) (defn truncate-zero [num default] (if (mth/almost-zero? num) default num)) @@ -60,7 +60,7 @@ initial @ms/mouse-position page-id (:current-page-id state) - objects (dwc/lookup-page-objects state page-id) + objects (wsh/lookup-page-objects state page-id) layout (get state :workspace-layout) zoom (get-in state [:workspace-local :zoom] 1) diff --git a/frontend/src/app/main/data/workspace/drawing/curve.cljs b/frontend/src/app/main/data/workspace/drawing/curve.cljs index 8808b0d0f7..333404214f 100644 --- a/frontend/src/app/main/data/workspace/drawing/curve.cljs +++ b/frontend/src/app/main/data/workspace/drawing/curve.cljs @@ -6,16 +6,16 @@ (ns app.main.data.workspace.drawing.curve (:require - [beicon.core :as rx] - [potok.core :as ptk] [app.common.geom.point :as gpt] [app.common.geom.shapes :as gsh] [app.common.geom.shapes.path :as gsp] + [app.common.pages :as cp] + [app.main.data.workspace.drawing.common :as common] + [app.main.data.workspace.state-helpers :as wsh] [app.main.streams :as ms] [app.util.path.simplify-curve :as ups] - [app.main.data.workspace.drawing.common :as common] - [app.main.data.workspace.common :as dwc] - [app.common.pages :as cp])) + [beicon.core :as rx] + [potok.core :as ptk])) (def simplify-tolerance 0.3) @@ -45,7 +45,7 @@ ptk/UpdateEvent (update [_ state] - (let [objects (dwc/lookup-page-objects state) + (let [objects (wsh/lookup-page-objects state) content (get-in state [:workspace-drawing :object :content] []) position (get-in content [0 :params] nil) frame-id (cp/frame-id-by-position objects position)] diff --git a/frontend/src/app/main/data/workspace/groups.cljs b/frontend/src/app/main/data/workspace/groups.cljs index 886ff2fbda..bb2127d9b4 100644 --- a/frontend/src/app/main/data/workspace/groups.cljs +++ b/frontend/src/app/main/data/workspace/groups.cljs @@ -3,9 +3,10 @@ [app.common.data :as d] [app.common.geom.shapes :as gsh] [app.common.pages :as cp] - [app.main.data.workspace.common :as dwc] [app.main.data.workspace.changes :as dch] + [app.main.data.workspace.common :as dwc] [app.main.data.workspace.selection :as dws] + [app.main.data.workspace.state-helpers :as wsh] [beicon.core :as rx] [potok.core :as ptk])) @@ -101,7 +102,7 @@ ptk/WatchEvent (watch [_ state stream] (let [page-id (:current-page-id state) - objects (dwc/lookup-page-objects state page-id) + objects (wsh/lookup-page-objects state page-id) selected (get-in state [:workspace-local :selected]) selected (cp/clean-loops objects selected) shapes (shapes-for-grouping objects selected)] @@ -115,7 +116,7 @@ ptk/WatchEvent (watch [_ state stream] (let [page-id (:current-page-id state) - objects (dwc/lookup-page-objects state page-id) + objects (wsh/lookup-page-objects state page-id) selected (get-in state [:workspace-local :selected]) group-id (first selected) group (get objects group-id)] @@ -130,7 +131,7 @@ ptk/WatchEvent (watch [_ state stream] (let [page-id (:current-page-id state) - objects (dwc/lookup-page-objects state page-id) + objects (wsh/lookup-page-objects state page-id) selected (get-in state [:workspace-local :selected]) selected (cp/clean-loops objects selected) shapes (shapes-for-grouping objects selected)] @@ -185,7 +186,7 @@ ptk/WatchEvent (watch [_ state stream] (let [page-id (:current-page-id state) - objects (dwc/lookup-page-objects state page-id) + objects (wsh/lookup-page-objects state page-id) selected (get-in state [:workspace-local :selected])] (when (= (count selected) 1) (let [group (get objects (first selected)) diff --git a/frontend/src/app/main/data/workspace/libraries.cljs b/frontend/src/app/main/data/workspace/libraries.cljs index 1d120c9a99..c12671fdf9 100644 --- a/frontend/src/app/main/data/workspace/libraries.cljs +++ b/frontend/src/app/main/data/workspace/libraries.cljs @@ -7,24 +7,25 @@ (ns app.main.data.workspace.libraries (:require [app.common.data :as d] - [app.common.spec :as us] - [app.common.uuid :as uuid] - [app.common.pages :as cp] [app.common.geom.point :as gpt] [app.common.geom.shapes :as geom] - [app.main.data.messages :as dm] - [app.main.data.workspace.common :as dwc] - [app.main.data.workspace.changes :as dch] - [app.main.data.workspace.libraries-helpers :as dwlh] [app.common.pages :as cp] + [app.common.pages :as cp] + [app.common.spec :as us] + [app.common.uuid :as uuid] + [app.main.data.messages :as dm] + [app.main.data.workspace.changes :as dch] + [app.main.data.workspace.common :as dwc] + [app.main.data.workspace.libraries-helpers :as dwlh] + [app.main.data.workspace.state-helpers :as wsh] [app.main.repo :as rp] [app.main.store :as st] [app.main.streams :as ms] [app.util.color :as color] [app.util.i18n :refer [tr]] + [app.util.logging :as log] [app.util.router :as rt] [app.util.time :as dt] - [app.util.logging :as log] [beicon.core :as rx] [cljs.spec.alpha :as s] [potok.core :as ptk])) @@ -237,7 +238,7 @@ (watch [_ state stream] (let [file-id (:current-file-id state) page-id (:current-page-id state) - objects (dwc/lookup-page-objects state page-id) + objects (wsh/lookup-page-objects state page-id) selected (get-in state [:workspace-local :selected]) selected (cp/clean-loops objects selected)] (let [[group rchanges uchanges] @@ -343,7 +344,7 @@ delta (gpt/subtract position orig-pos) page-id (:current-page-id state) - objects (dwc/lookup-page-objects state page-id) + objects (wsh/lookup-page-objects state page-id) unames (atom (dwc/retrieve-used-names objects)) frame-id (cp/frame-id-by-position objects (gpt/add orig-pos delta)) @@ -411,7 +412,7 @@ ptk/WatchEvent (watch [_ state stream] (let [page-id (:current-page-id state) - objects (dwc/lookup-page-objects state page-id) + objects (wsh/lookup-page-objects state page-id) shapes (cp/get-object-with-children id objects) rchanges (map (fn [obj] diff --git a/frontend/src/app/main/data/workspace/path/drawing.cljs b/frontend/src/app/main/data/workspace/path/drawing.cljs index 08fdad18ee..1931a8d276 100644 --- a/frontend/src/app/main/data/workspace/path/drawing.cljs +++ b/frontend/src/app/main/data/workspace/path/drawing.cljs @@ -19,6 +19,7 @@ [app.main.data.workspace.path.streams :as streams] [app.main.data.workspace.path.tools :as tools] [app.main.data.workspace.path.undo :as undo] + [app.main.data.workspace.state-helpers :as wsh] [app.main.streams :as ms] [app.util.path.commands :as upc] [app.util.path.geom :as upg] @@ -259,7 +260,7 @@ (ptk/reify ::setup-frame-path ptk/UpdateEvent (update [_ state] - (let [objects (dwc/lookup-page-objects state) + (let [objects (wsh/lookup-page-objects state) content (get-in state [:workspace-drawing :object :content] []) position (get-in content [0 :params] nil) frame-id (cp/frame-id-by-position objects position)] diff --git a/frontend/src/app/main/data/workspace/selection.cljs b/frontend/src/app/main/data/workspace/selection.cljs index 5db6c36e69..8664efb556 100644 --- a/frontend/src/app/main/data/workspace/selection.cljs +++ b/frontend/src/app/main/data/workspace/selection.cljs @@ -6,10 +6,6 @@ (ns app.main.data.workspace.selection (:require - [beicon.core :as rx] - [cljs.spec.alpha :as s] - [potok.core :as ptk] - [linked.set :as lks] [app.common.data :as d] [app.common.geom.point :as gpt] [app.common.geom.shapes :as geom] @@ -17,11 +13,16 @@ [app.common.pages :as cp] [app.common.spec :as us] [app.common.uuid :as uuid] - [app.main.data.workspace.common :as dwc] - [app.main.data.workspace.changes :as dch] [app.main.data.modal :as md] + [app.main.data.workspace.changes :as dch] + [app.main.data.workspace.common :as dwc] + [app.main.data.workspace.state-helpers :as wsh] [app.main.streams :as ms] - [app.main.worker :as uw])) + [app.main.worker :as uw] + [beicon.core :as rx] + [cljs.spec.alpha :as s] + [linked.set :as lks] + [potok.core :as ptk])) (s/def ::set-of-uuid (s/every uuid? :kind set?)) @@ -101,7 +102,7 @@ ptk/WatchEvent (watch [_ state stream] (let [page-id (:current-page-id state) - objects (dwc/lookup-page-objects state page-id)] + objects (wsh/lookup-page-objects state page-id)] (rx/of (dwc/expand-all-parents [id] objects))))))) (defn deselect-shape @@ -118,7 +119,7 @@ ptk/UpdateEvent (update [_ state] (let [page-id (:current-page-id state) - objects (dwc/lookup-page-objects state page-id) + objects (wsh/lookup-page-objects state page-id) selection (-> state (get-in [:workspace-local :selected] #{}) (conj id))] @@ -136,7 +137,7 @@ ptk/WatchEvent (watch [_ state stream] - (let [objects (dwc/lookup-page-objects state)] + (let [objects (wsh/lookup-page-objects state)] (rx/of (dwc/expand-all-parents ids objects)))))) (defn select-all @@ -145,7 +146,7 @@ ptk/WatchEvent (watch [_ state stream] (let [page-id (:current-page-id state) - objects (dwc/lookup-page-objects state page-id) + objects (wsh/lookup-page-objects state page-id) new-selected (let [selected-objs (->> (get-in state [:workspace-local :selected]) (map #(get objects %))) @@ -205,7 +206,7 @@ ptk/WatchEvent (watch [_ state stream] (let [page-id (:current-page-id state) - objects (dwc/lookup-page-objects state) + objects (wsh/lookup-page-objects state) selected (get-in state [:workspace-local :selected]) initial-set (if preserve? selected @@ -229,7 +230,7 @@ ptk/WatchEvent (watch [_ state stream] (let [page-id (:current-page-id state) - objects (dwc/lookup-page-objects state page-id) + objects (wsh/lookup-page-objects state page-id) group (get objects group-id) children (map #(get objects %) (:shapes group)) @@ -379,7 +380,7 @@ ptk/WatchEvent (watch [_ state stream] (let [page-id (:current-page-id state) - objects (dwc/lookup-page-objects state page-id) + objects (wsh/lookup-page-objects state page-id) selected (get-in state [:workspace-local :selected]) delta (gpt/point 0 0) diff --git a/frontend/src/app/main/data/workspace/state_helpers.cljs b/frontend/src/app/main/data/workspace/state_helpers.cljs new file mode 100644 index 0000000000..98b5718f46 --- /dev/null +++ b/frontend/src/app/main/data/workspace/state_helpers.cljs @@ -0,0 +1,39 @@ +;; This Source Code Form is subject to the terms of the Mozilla Public +;; License, v. 2.0. If a copy of the MPL was not distributed with this +;; file, You can obtain one at http://mozilla.org/MPL/2.0/. +;; +;; Copyright (c) UXBOX Labs SL + +(ns app.main.data.workspace.state-helpers + (:require + #_[app.common.data :as d] + #_[app.common.geom.proportions :as gpr] + #_[app.common.geom.shapes :as gsh] + #_[app.common.pages :as cp] + #_[app.common.spec :as us] + #_[app.common.uuid :as uuid] + #_[app.main.data.workspace.changes :as dch] + #_[app.main.data.workspace.undo :as dwu] + #_[app.main.streams :as ms] + #_[app.main.worker :as uw] + #_[app.util.logging :as log] + #_[beicon.core :as rx] + #_[cljs.spec.alpha :as s] + #_[potok.core :as ptk])) + +(defn lookup-page-objects + ([state] + (lookup-page-objects state (:current-page-id state))) + ([state page-id] + (get-in state [:workspace-data :pages-index page-id :objects]))) + +(defn lookup-page-options + ([state] + (lookup-page-options state (:current-page-id state))) + ([state page-id] + (get-in state [:workspace-data :pages-index page-id :options]))) + +(defn lookup-component-objects + ([state component-id] + (get-in state [:workspace-data :components component-id :objects]))) + diff --git a/frontend/src/app/main/data/workspace/svg_upload.cljs b/frontend/src/app/main/data/workspace/svg_upload.cljs index a3950b64b5..f2ccb7c42c 100644 --- a/frontend/src/app/main/data/workspace/svg_upload.cljs +++ b/frontend/src/app/main/data/workspace/svg_upload.cljs @@ -9,16 +9,17 @@ [app.common.data :as d] [app.common.geom.matrix :as gmt] [app.common.geom.point :as gpt] - [app.common.geom.shapes :as gsh] [app.common.geom.proportions :as gpr] + [app.common.geom.shapes :as gsh] [app.common.pages :as cp] [app.common.uuid :as uuid] - [app.main.data.workspace.common :as dwc] [app.main.data.workspace.changes :as dch] + [app.main.data.workspace.common :as dwc] + [app.main.data.workspace.state-helpers :as wsh] [app.main.repo :as rp] [app.util.color :as uc] - [app.util.path.parser :as upp] [app.util.object :as obj] + [app.util.path.parser :as upp] [app.util.svg :as usvg] [app.util.uri :as uu] [beicon.core :as rx] @@ -416,7 +417,7 @@ (watch [_ state stream] (try (let [page-id (:current-page-id state) - objects (dwc/lookup-page-objects state page-id) + objects (wsh/lookup-page-objects state page-id) frame-id (cp/frame-id-by-position objects position) selected (get-in state [:workspace-local :selected]) diff --git a/frontend/src/app/main/data/workspace/texts.cljs b/frontend/src/app/main/data/workspace/texts.cljs index c993d431a0..032690fc46 100644 --- a/frontend/src/app/main/data/workspace/texts.cljs +++ b/frontend/src/app/main/data/workspace/texts.cljs @@ -6,16 +6,17 @@ (ns app.main.data.workspace.texts (:require - [app.common.math :as mth] [app.common.attrs :as attrs] - [app.common.text :as txt] - [app.common.geom.shapes :as gsh] - [app.common.pages :as cp] [app.common.data :as d] - [app.main.data.workspace.selection :as dws] - [app.main.data.workspace.common :as dwc] - [app.main.data.workspace.transforms :as dwt] + [app.common.geom.shapes :as gsh] + [app.common.math :as mth] + [app.common.pages :as cp] + [app.common.text :as txt] [app.main.data.workspace.changes :as dch] + [app.main.data.workspace.common :as dwc] + [app.main.data.workspace.selection :as dws] + [app.main.data.workspace.state-helpers :as wsh] + [app.main.data.workspace.transforms :as dwt] [app.main.data.workspace.undo :as dwu] [app.main.fonts :as fonts] [app.util.object :as obj] @@ -23,8 +24,8 @@ [app.util.timers :as ts] [beicon.core :as rx] [cljs.spec.alpha :as s] - [goog.object :as gobj] [cuerdas.core :as str] + [goog.object :as gobj] [potok.core :as ptk])) (defn update-editor @@ -136,7 +137,7 @@ (ptk/reify ::update-root-attrs ptk/WatchEvent (watch [_ state stream] - (let [objects (dwc/lookup-page-objects state) + (let [objects (wsh/lookup-page-objects state) shape (get objects id) update-fn #(update-shape % txt/is-root-node? attrs/merge attrs) @@ -156,7 +157,7 @@ ptk/WatchEvent (watch [_ state stream] (when-not (some? (get-in state [:workspace-editor-state id])) - (let [objects (dwc/lookup-page-objects state) + (let [objects (wsh/lookup-page-objects state) shape (get objects id) merge-fn (fn [node attrs] @@ -183,7 +184,7 @@ ptk/WatchEvent (watch [_ state stream] (when-not (some? (get-in state [:workspace-editor-state id])) - (let [objects (dwc/lookup-page-objects state) + (let [objects (wsh/lookup-page-objects state) shape (get objects id) update-fn #(update-shape % txt/is-text-node? attrs/merge attrs) @@ -205,7 +206,7 @@ (ptk/reify ::start-edit-if-selected ptk/UpdateEvent (update [_ state] - (let [objects (dwc/lookup-page-objects state) + (let [objects (wsh/lookup-page-objects state) selected (->> state :workspace-local :selected (map #(get objects %)))] (cond-> state (and (= 1 (count selected)) diff --git a/frontend/src/app/main/data/workspace/transforms.cljs b/frontend/src/app/main/data/workspace/transforms.cljs index 279682c2f4..459b4be9a1 100644 --- a/frontend/src/app/main/data/workspace/transforms.cljs +++ b/frontend/src/app/main/data/workspace/transforms.cljs @@ -7,16 +7,17 @@ (ns app.main.data.workspace.transforms "Events related with shapes transformations" (:require - [app.common.math :as mth] [app.common.data :as d] [app.common.geom.matrix :as gmt] [app.common.geom.point :as gpt] [app.common.geom.shapes :as gsh] + [app.common.math :as mth] [app.common.pages :as cp] [app.common.spec :as us] - [app.main.data.workspace.common :as dwc] [app.main.data.workspace.changes :as dch] + [app.main.data.workspace.common :as dwc] [app.main.data.workspace.selection :as dws] + [app.main.data.workspace.state-helpers :as wsh] [app.main.data.workspace.undo :as dwu] [app.main.refs :as refs] [app.main.snap :as snap] @@ -140,7 +141,7 @@ layout (:workspace-layout state) page-id (:current-page-id state) zoom (get-in state [:workspace-local :zoom] 1) - objects (dwc/lookup-page-objects state page-id) + objects (wsh/lookup-page-objects state page-id) resizing-shapes (map #(get objects %) ids) text-shapes-ids (->> resizing-shapes (filter #(= :text (:type %))) @@ -242,7 +243,7 @@ (watch [_ state stream] (let [position @ms/mouse-position page-id (:current-page-id state) - objects (dwc/lookup-page-objects state page-id) + objects (wsh/lookup-page-objects state page-id) frame-id (cp/frame-id-by-position objects position) moving-shapes (->> ids @@ -282,7 +283,7 @@ ptk/WatchEvent (watch [_ state stream] (let [page-id (:current-page-id state) - objects (dwc/lookup-page-objects state page-id) + objects (wsh/lookup-page-objects state page-id) ids (if (nil? ids) (get-in state [:workspace-local :selected]) ids) shapes (mapv #(get objects %) ids) stopper (rx/filter ms/mouse-up? stream) @@ -396,7 +397,7 @@ (update [_ state] (let [modifiers (or modifiers (get-in state [:workspace-local :modifiers] {})) page-id (:current-page-id state) - objects (dwc/lookup-page-objects state page-id) + objects (wsh/lookup-page-objects state page-id) not-frame-id? (fn [shape-id] @@ -448,7 +449,7 @@ (watch [_ state stream] (let [page-id (:current-page-id state) - objects (dwc/lookup-page-objects state page-id) + objects (wsh/lookup-page-objects state page-id) rotate-shape (fn [shape] (let [delta (- rotation (:rotation shape))] (set-rotation delta [shape])))] @@ -462,7 +463,7 @@ (ptk/reify ::apply-modifiers ptk/WatchEvent (watch [_ state stream] - (let [objects (dwc/lookup-page-objects state) + (let [objects (wsh/lookup-page-objects state) children-ids (->> ids (mapcat #(cp/get-children % objects))) ids-with-children (d/concat [] children-ids ids)] (rx/of (dwu/start-undo-transaction) @@ -485,7 +486,7 @@ (update [_ state] (let [page-id (:current-page-id state) - objects (dwc/lookup-page-objects state page-id) + objects (wsh/lookup-page-objects state page-id) update-children (fn [objects ids modifiers] @@ -509,7 +510,7 @@ ptk/WatchEvent (watch [_ state stream] (let [page-id (:current-page-id state) - objects (dwc/lookup-page-objects state page-id) + objects (wsh/lookup-page-objects state page-id) ids (d/concat [] ids (mapcat #(cp/get-children % objects) ids))] (rx/of (apply-modifiers ids)))))) @@ -517,7 +518,7 @@ (ptk/reify ::flip-horizontal-selected ptk/WatchEvent (watch [_ state stream] - (let [objects (dwc/lookup-page-objects state) + (let [objects (wsh/lookup-page-objects state) selected (get-in state [:workspace-local :selected]) shapes (map #(get objects %) selected) selrect (gsh/selection-rect (->> shapes (map gsh/transform-shape))) @@ -534,7 +535,7 @@ (ptk/reify ::flip-vertical-selected ptk/WatchEvent (watch [_ state stream] - (let [objects (dwc/lookup-page-objects state) + (let [objects (wsh/lookup-page-objects state) selected (get-in state [:workspace-local :selected]) shapes (map #(get objects %) selected) selrect (gsh/selection-rect (->> shapes (map gsh/transform-shape))) From a91a57581f66f703c1d5f01963654a182154a949 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Wed, 5 May 2021 14:22:59 +0200 Subject: [PATCH 2/8] :bug: Fix issues with non updated selected --- frontend/src/app/main/data/workspace.cljs | 35 +++++++++---------- .../src/app/main/data/workspace/colors.cljs | 4 +-- .../src/app/main/data/workspace/common.cljs | 2 +- .../src/app/main/data/workspace/groups.cljs | 8 ++--- .../app/main/data/workspace/libraries.cljs | 2 +- .../app/main/data/workspace/selection.cljs | 9 +++-- .../main/data/workspace/state_helpers.cljs | 23 +++++------- .../app/main/data/workspace/svg_upload.cljs | 2 +- .../src/app/main/data/workspace/texts.cljs | 2 +- .../app/main/data/workspace/transforms.cljs | 10 +++--- frontend/src/app/main/refs.cljs | 24 ++++++------- frontend/src/app/main/ui/workspace.cljs | 7 ++-- .../app/main/ui/workspace/colorpalette.cljs | 19 +++++----- .../app/main/ui/workspace/sidebar/assets.cljs | 5 +-- .../src/app/main/ui/workspace/viewport.cljs | 4 +-- frontend/tests/app/test_components_basic.cljs | 34 +++++++++--------- 16 files changed, 91 insertions(+), 99 deletions(-) diff --git a/frontend/src/app/main/data/workspace.cljs b/frontend/src/app/main/data/workspace.cljs index ae8714609e..d87f453d63 100644 --- a/frontend/src/app/main/data/workspace.cljs +++ b/frontend/src/app/main/data/workspace.cljs @@ -573,7 +573,7 @@ (ptk/reify ::zoom-to-selected-shape ptk/UpdateEvent (update [_ state] - (let [selected (get-in state [:workspace-local :selected])] + (let [selected (wsh/lookup-selected state)] (if (empty? selected) state (let [page-id (:current-page-id state) @@ -623,7 +623,7 @@ (ptk/reify ::update-selected-shapes ptk/WatchEvent (watch [_ state stream] - (let [selected (get-in state [:workspace-local :selected])] + (let [selected (wsh/lookup-selected state)] (rx/from (map #(update-shape % attrs) selected)))))) ;; --- Shape Movement (using keyboard shorcuts) @@ -661,7 +661,7 @@ (ptk/reify ::delete-selected ptk/WatchEvent (watch [_ state stream] - (let [selected (get-in state [:workspace-local :selected])] + (let [selected (wsh/lookup-selected state)] (rx/of (dwc/delete-shapes selected) (dws/deselect-all)))))) @@ -677,7 +677,7 @@ (watch [_ state stream] (let [page-id (:current-page-id state) objects (wsh/lookup-page-objects state page-id) - selected (get-in state [:workspace-local :selected]) + selected (wsh/lookup-selected state) rchanges (mapv (fn [id] (let [obj (get objects id) parent (get objects (:parent-id obj)) @@ -988,7 +988,7 @@ (ptk/reify ::relocate-selected-shapes ptk/WatchEvent (watch [_ state stream] - (let [selected (get-in state [:workspace-local :selected])] + (let [selected (wsh/lookup-selected state)] (rx/of (relocate-shapes selected parent-id to-index)))))) @@ -997,7 +997,7 @@ (ptk/reify ::start-editing-selected ptk/WatchEvent (watch [_ state stream] - (let [selected (get-in state [:workspace-local :selected])] + (let [selected (wsh/lookup-selected state)] (if-not (= 1 (count selected)) (rx/empty) @@ -1048,7 +1048,7 @@ (watch [_ state stream] (let [page-id (:current-page-id state) objects (wsh/lookup-page-objects state page-id) - selected (get-in state [:workspace-local :selected]) + selected (wsh/lookup-selected state) moved (if (= 1 (count selected)) (align-object-to-frame objects (first selected) axis) (align-objects-list objects selected axis)) @@ -1079,7 +1079,7 @@ (watch [_ state stream] (let [page-id (:current-page-id state) objects (wsh/lookup-page-objects state page-id) - selected (get-in state [:workspace-local :selected]) + selected (wsh/lookup-selected state) moved (-> (map #(get objects %) selected) (gal/distribute-space axis objects)) @@ -1232,7 +1232,7 @@ (let [mdata (cond-> params (some? shape) (assoc :selected - (get-in state [:workspace-local :selected])))] + (wsh/lookup-selected state)))] (assoc-in state [:workspace-local :context-menu] mdata))))) (defn show-shape-context-menu @@ -1242,7 +1242,7 @@ (ptk/reify ::show-shape-context-menu ptk/WatchEvent (watch [_ state stream] - (let [selected (get-in state [:workspace-local :selected])] + (let [selected (wsh/lookup-selected state)] (rx/concat (when-not (selected (:id shape)) (rx/of (dws/select-shape (:id shape)))) @@ -1313,7 +1313,7 @@ ptk/WatchEvent (watch [_ state stream] (let [objects (wsh/lookup-page-objects state) - selected (->> (get-in state [:workspace-local :selected]) + selected (->> (wsh/lookup-selected state) (cp/clean-loops objects)) pdata (reduce (partial collect-object-ids objects) {} selected) initial {:type :copied-shapes @@ -1412,9 +1412,8 @@ (js/console.error "Clipboard error:" err)))))) (defn selected-frame? [state] - (let [selected (get-in state [:workspace-local :selected]) - page-id (:current-page-id state) - objects (wsh/lookup-page-objects state page-id)] + (let [selected (wsh/lookup-selected state) + objects (wsh/lookup-page-objects state)] (and (and (= 1 (count selected)) (= :frame (get-in objects [(first selected) :type])))))) @@ -1454,7 +1453,7 @@ (let [page-objects (wsh/lookup-page-objects state) selected-objs (map #(get objects %) selected) has-frame? (d/seek #(= (:type %) :frame) selected-objs) - page-selected (get-in state [:workspace-local :selected]) + page-selected (wsh/lookup-selected state) wrapper (gsh/selection-rect selected-objs) orig-pos (gpt/point (:x1 wrapper) (:y1 wrapper))] (cond @@ -1635,7 +1634,7 @@ ptk/WatchEvent (watch [_ state stream] (let [initial-pos @ms/mouse-position - selected (get-in state [:workspace-local :selected]) + selected (wsh/lookup-selected state) stopper (rx/filter ms/mouse-up? stream)] (when (= 1 (count selected)) (rx/concat @@ -1651,7 +1650,7 @@ (update [_ state] (let [page-id (:current-page-id state) objects (wsh/lookup-page-objects state page-id) - selected-shape-id (-> state (get-in [:workspace-local :selected]) first) + selected-shape-id (-> state wsh/lookup-selected first) selected-shape (get objects selected-shape-id) selected-shape-frame-id (:frame-id selected-shape) start-frame (get objects selected-shape-frame-id) @@ -1676,7 +1675,7 @@ objects (wsh/lookup-page-objects state page-id) frame (dwc/get-frame-at-point objects position) - shape-id (first (get-in state [:workspace-local :selected])) + shape-id (-> state wsh/lookup-selected first) shape (get objects shape-id)] (when-not (= position initial-pos) diff --git a/frontend/src/app/main/data/workspace/colors.cljs b/frontend/src/app/main/data/workspace/colors.cljs index a8431bc998..2e40b5b98b 100644 --- a/frontend/src/app/main/data/workspace/colors.cljs +++ b/frontend/src/app/main/data/workspace/colors.cljs @@ -191,7 +191,7 @@ (ptk/reify ::picker-for-selected-shape ptk/WatchEvent (watch [_ state stream] - (let [ids (get-in state [:workspace-local :selected]) + (let [ids (wsh/lookup-selected state) stop? (rx/filter (ptk/type? ::stop-picker) stream) update-events @@ -227,7 +227,7 @@ (ptk/reify ::start-gradient ptk/UpdateEvent (update [_ state] - (let [id (first (get-in state [:workspace-local :selected]))] + (let [id (-> state wsh/lookup-selected first)] (-> state (assoc-in [:workspace-local :current-gradient] gradient) (assoc-in [:workspace-local :current-gradient :shape-id] id)))))) diff --git a/frontend/src/app/main/data/workspace/common.cljs b/frontend/src/app/main/data/workspace/common.cljs index 8e8f3ca142..10c5b97448 100644 --- a/frontend/src/app/main/data/workspace/common.cljs +++ b/frontend/src/app/main/data/workspace/common.cljs @@ -291,7 +291,7 @@ (retrieve-used-names) (generate-unique-name (:name attrs))) - selected (get-in state [:workspace-local :selected]) + selected (wsh/lookup-selected state) [rchanges uchanges] (add-shape-changes page-id diff --git a/frontend/src/app/main/data/workspace/groups.cljs b/frontend/src/app/main/data/workspace/groups.cljs index bb2127d9b4..f34e1475c2 100644 --- a/frontend/src/app/main/data/workspace/groups.cljs +++ b/frontend/src/app/main/data/workspace/groups.cljs @@ -103,7 +103,7 @@ (watch [_ state stream] (let [page-id (:current-page-id state) objects (wsh/lookup-page-objects state page-id) - selected (get-in state [:workspace-local :selected]) + selected (wsh/lookup-selected state) selected (cp/clean-loops objects selected) shapes (shapes-for-grouping objects selected)] (when-not (empty? shapes) @@ -117,7 +117,7 @@ (watch [_ state stream] (let [page-id (:current-page-id state) objects (wsh/lookup-page-objects state page-id) - selected (get-in state [:workspace-local :selected]) + selected (wsh/lookup-selected state) group-id (first selected) group (get objects group-id)] (when (and (= 1 (count selected)) @@ -132,7 +132,7 @@ (watch [_ state stream] (let [page-id (:current-page-id state) objects (wsh/lookup-page-objects state page-id) - selected (get-in state [:workspace-local :selected]) + selected (wsh/lookup-selected state) selected (cp/clean-loops objects selected) shapes (shapes-for-grouping objects selected)] (when-not (empty? shapes) @@ -187,7 +187,7 @@ (watch [_ state stream] (let [page-id (:current-page-id state) objects (wsh/lookup-page-objects state page-id) - selected (get-in state [:workspace-local :selected])] + selected (wsh/lookup-selected state)] (when (= (count selected) 1) (let [group (get objects (first selected)) diff --git a/frontend/src/app/main/data/workspace/libraries.cljs b/frontend/src/app/main/data/workspace/libraries.cljs index c12671fdf9..c0370fdb6d 100644 --- a/frontend/src/app/main/data/workspace/libraries.cljs +++ b/frontend/src/app/main/data/workspace/libraries.cljs @@ -239,7 +239,7 @@ (let [file-id (:current-file-id state) page-id (:current-page-id state) objects (wsh/lookup-page-objects state page-id) - selected (get-in state [:workspace-local :selected]) + selected (wsh/lookup-selected state) selected (cp/clean-loops objects selected)] (let [[group rchanges uchanges] (dwlh/generate-add-component selected objects page-id file-id)] diff --git a/frontend/src/app/main/data/workspace/selection.cljs b/frontend/src/app/main/data/workspace/selection.cljs index 8664efb556..f73e224677 100644 --- a/frontend/src/app/main/data/workspace/selection.cljs +++ b/frontend/src/app/main/data/workspace/selection.cljs @@ -121,7 +121,7 @@ (let [page-id (:current-page-id state) objects (wsh/lookup-page-objects state page-id) selection (-> state - (get-in [:workspace-local :selected] #{}) + wsh/lookup-selected (conj id))] (-> state (assoc-in [:workspace-local :selected] @@ -148,7 +148,7 @@ (let [page-id (:current-page-id state) objects (wsh/lookup-page-objects state page-id) new-selected (let [selected-objs - (->> (get-in state [:workspace-local :selected]) + (->> (wsh/lookup-selected state) (map #(get objects %))) frame-ids @@ -207,7 +207,7 @@ (watch [_ state stream] (let [page-id (:current-page-id state) objects (wsh/lookup-page-objects state) - selected (get-in state [:workspace-local :selected]) + selected (wsh/lookup-selected state) initial-set (if preserve? selected lks/empty-linked-set) @@ -381,8 +381,7 @@ (watch [_ state stream] (let [page-id (:current-page-id state) objects (wsh/lookup-page-objects state page-id) - - selected (get-in state [:workspace-local :selected]) + selected (wsh/lookup-selected state) delta (gpt/point 0 0) unames (dwc/retrieve-used-names objects) diff --git a/frontend/src/app/main/data/workspace/state_helpers.cljs b/frontend/src/app/main/data/workspace/state_helpers.cljs index 98b5718f46..c7efb8627b 100644 --- a/frontend/src/app/main/data/workspace/state_helpers.cljs +++ b/frontend/src/app/main/data/workspace/state_helpers.cljs @@ -6,20 +6,7 @@ (ns app.main.data.workspace.state-helpers (:require - #_[app.common.data :as d] - #_[app.common.geom.proportions :as gpr] - #_[app.common.geom.shapes :as gsh] - #_[app.common.pages :as cp] - #_[app.common.spec :as us] - #_[app.common.uuid :as uuid] - #_[app.main.data.workspace.changes :as dch] - #_[app.main.data.workspace.undo :as dwu] - #_[app.main.streams :as ms] - #_[app.main.worker :as uw] - #_[app.util.logging :as log] - #_[beicon.core :as rx] - #_[cljs.spec.alpha :as s] - #_[potok.core :as ptk])) + [app.common.data :as d])) (defn lookup-page-objects ([state] @@ -37,3 +24,11 @@ ([state component-id] (get-in state [:workspace-data :components component-id :objects]))) +(defn lookup-selected + [state] + (let [selected (get-in state [:workspace-local :selected]) + objects (lookup-page-objects state) + is-present? (fn [id] (contains? objects id))] + (into (d/ordered-set) + (filter is-present?) + selected))) diff --git a/frontend/src/app/main/data/workspace/svg_upload.cljs b/frontend/src/app/main/data/workspace/svg_upload.cljs index f2ccb7c42c..6d34597f34 100644 --- a/frontend/src/app/main/data/workspace/svg_upload.cljs +++ b/frontend/src/app/main/data/workspace/svg_upload.cljs @@ -419,7 +419,7 @@ (let [page-id (:current-page-id state) objects (wsh/lookup-page-objects state page-id) frame-id (cp/frame-id-by-position objects position) - selected (get-in state [:workspace-local :selected]) + selected (wsh/lookup-selected state) [vb-x vb-y vb-width vb-height] (svg-dimensions svg-data) x (- x vb-x (/ vb-width 2)) diff --git a/frontend/src/app/main/data/workspace/texts.cljs b/frontend/src/app/main/data/workspace/texts.cljs index 032690fc46..c35e621bdc 100644 --- a/frontend/src/app/main/data/workspace/texts.cljs +++ b/frontend/src/app/main/data/workspace/texts.cljs @@ -207,7 +207,7 @@ ptk/UpdateEvent (update [_ state] (let [objects (wsh/lookup-page-objects state) - selected (->> state :workspace-local :selected (map #(get objects %)))] + selected (->> state wsh/lookup-selected (mapv #(get objects %)))] (cond-> state (and (= 1 (count selected)) (= (-> selected first :type) :text)) diff --git a/frontend/src/app/main/data/workspace/transforms.cljs b/frontend/src/app/main/data/workspace/transforms.cljs index 459b4be9a1..707b06d547 100644 --- a/frontend/src/app/main/data/workspace/transforms.cljs +++ b/frontend/src/app/main/data/workspace/transforms.cljs @@ -210,7 +210,7 @@ ptk/WatchEvent (watch [_ state stream] (let [initial (deref ms/mouse-position) - selected (get-in state [:workspace-local :selected]) + selected (wsh/lookup-selected state) stopper (rx/filter ms/mouse-up? stream)] (->> ms/mouse-position (rx/take-until stopper) @@ -284,7 +284,7 @@ (watch [_ state stream] (let [page-id (:current-page-id state) objects (wsh/lookup-page-objects state page-id) - ids (if (nil? ids) (get-in state [:workspace-local :selected]) ids) + ids (if (nil? ids) (wsh/lookup-selected state) ids) shapes (mapv #(get objects %) ids) stopper (rx/filter ms/mouse-up? stream) layout (get state :workspace-layout) @@ -361,7 +361,7 @@ ptk/WatchEvent (watch [_ state stream] (if (= same-event (get-in state [:workspace-local :current-move-selected])) - (let [selected (get-in state [:workspace-local :selected]) + (let [selected (wsh/lookup-selected state) move-events (->> stream (rx/filter (ptk/type? ::move-selected)) (rx/filter #(= direction (deref %)))) @@ -519,7 +519,7 @@ ptk/WatchEvent (watch [_ state stream] (let [objects (wsh/lookup-page-objects state) - selected (get-in state [:workspace-local :selected]) + selected (wsh/lookup-selected state) shapes (map #(get objects %) selected) selrect (gsh/selection-rect (->> shapes (map gsh/transform-shape))) origin (gpt/point (:x selrect) (+ (:y selrect) (/ (:height selrect) 2)))] @@ -536,7 +536,7 @@ ptk/WatchEvent (watch [_ state stream] (let [objects (wsh/lookup-page-objects state) - selected (get-in state [:workspace-local :selected]) + selected (wsh/lookup-selected state) shapes (map #(get objects %) selected) selrect (gsh/selection-rect (->> shapes (map gsh/transform-shape))) origin (gpt/point (+ (:x selrect) (/ (:width selrect) 2)) (:y selrect))] diff --git a/frontend/src/app/main/refs.cljs b/frontend/src/app/main/refs.cljs index 7212dbc325..5f3b09cc8b 100644 --- a/frontend/src/app/main/refs.cljs +++ b/frontend/src/app/main/refs.cljs @@ -7,13 +7,14 @@ (ns app.main.refs "A collection of derived refs." (:require - [beicon.core :as rx] - [okulary.core :as l] [app.common.data :as d] [app.common.pages :as cp] [app.common.uuid :as uuid] [app.main.constants :as c] - [app.main.store :as st])) + [app.main.data.workspace.state-helpers :as wsh] + [app.main.store :as st] + [beicon.core :as rx] + [okulary.core :as l])) ;; ---- Global refs @@ -71,7 +72,7 @@ (l/derived :workspace-drawing st/state)) (def selected-shapes - (l/derived :selected workspace-local)) + (l/derived wsh/lookup-selected st/state)) (defn make-selected-ref [id] @@ -85,7 +86,6 @@ :edition :edit-path :tooltip - :selected :panning :picking-color? :transform @@ -211,30 +211,28 @@ workspace-page-objects =)) (def selected-data - (l/derived #(let [selected (get-in % [:workspace-local :selected]) - page-id (:current-page-id %) - objects (get-in % [:workspace-data :pages-index page-id :objects])] + (l/derived #(let [selected (wsh/lookup-selected %) + objects (wsh/lookup-page-objects %)] (hash-map :selected selected - :page-id page-id :objects objects)) st/state =)) (defn is-child-selected? [id] - (letfn [(selector [{:keys [selected page-id objects]}] + (letfn [(selector [{:keys [selected objects]}] (let [children (cp/get-children id objects)] (some #(contains? selected %) children)))] (l/derived selector selected-data =))) (def selected-objects - (letfn [(selector [{:keys [selected page-id objects]}] + (letfn [(selector [{:keys [selected objects]}] (->> selected (map #(get objects %)) (filterv (comp not nil?))))] (l/derived selector selected-data =))) (def selected-shapes-with-children - (letfn [(selector [{:keys [selected page-id objects]}] + (letfn [(selector [{:keys [selected objects]}] (let [children (->> selected (mapcat #(cp/get-children % objects)) (filterv (comp not nil?)))] @@ -242,7 +240,7 @@ (l/derived selector selected-data =))) (def selected-objects-with-children - (letfn [(selector [{:keys [selected page-id objects]}] + (letfn [(selector [{:keys [selected objects]}] (let [children (->> selected (mapcat #(cp/get-children % objects)) (filterv (comp not nil?))) diff --git a/frontend/src/app/main/ui/workspace.cljs b/frontend/src/app/main/ui/workspace.cljs index fa6226f918..6833c69d06 100644 --- a/frontend/src/app/main/ui/workspace.cljs +++ b/frontend/src/app/main/ui/workspace.cljs @@ -60,8 +60,10 @@ (mf/defc workspace-content {::mf/wrap-props false} [props] - (let [local (mf/deref refs/viewport-data) - {:keys [zoom vbox vport options-mode selected]} local + (let [selected (mf/deref refs/selected-shapes) + local (mf/deref refs/viewport-data) + + {:keys [zoom vbox vport options-mode]} local file (obj/get props "file") layout (obj/get props "layout")] [:* @@ -80,6 +82,7 @@ [:& viewport {:file file :local local + :selected selected :layout layout}]]] [:& left-toolbar {:layout layout}] diff --git a/frontend/src/app/main/ui/workspace/colorpalette.cljs b/frontend/src/app/main/ui/workspace/colorpalette.cljs index d4a951f62a..176cb0d469 100644 --- a/frontend/src/app/main/ui/workspace/colorpalette.cljs +++ b/frontend/src/app/main/ui/workspace/colorpalette.cljs @@ -7,8 +7,9 @@ (ns app.main.ui.workspace.colorpalette (:require [app.common.math :as mth] - [app.main.data.workspace.colors :as mdc] [app.main.data.workspace :as udw] + [app.main.data.workspace.colors :as mdc] + [app.main.data.workspace.state-helpers :as wsh] [app.main.refs :as refs] [app.main.store :as st] [app.main.ui.components.color-bullet :as cb] @@ -16,11 +17,9 @@ [app.main.ui.context :as ctx] [app.main.ui.icons :as i] [app.util.color :as uc] - [app.util.dom :as dom] - [app.util.i18n :as i18n :refer [t]] + [app.util.i18n :refer [tr]] [app.util.keyboard :as kbd] [app.util.object :as obj] - [beicon.core :as rx] [cuerdas.core :as str] [goog.events :as events] [okulary.core :as l] @@ -50,7 +49,7 @@ [{:keys [color size local?]}] (let [select-color (fn [event] - (let [ids (get-in @st/state [:workspace-local :selected])] + (let [ids (wsh/lookup-selected @st/state)] (if (kbd/shift? event) (st/emit! (mdc/change-stroke ids (merge uc/empty-color color))) (st/emit! (mdc/change-fill ids (merge uc/empty-color color))))))] @@ -74,8 +73,6 @@ close-fn #(st/emit! (udw/toggle-layout-flags :colorpalette)) container (mf/use-ref nil) - locale (mf/deref i18n/locale) - on-left-arrow-click (mf/use-callback (mf/deps max-offset visible) @@ -143,7 +140,7 @@ [:li.palette-library {:on-click #(st/emit! (mdc/change-palette-selected :file))} (when (= selected :file) i/tick) - [:div.library-name (str (t locale "workspace.libraries.colors.file-library") + [:div.library-name (str (tr "workspace.libraries.colors.file-library") (str/format " (%s)" (count file-colors)))] [:div.color-sample (for [[idx color] (map-indexed vector (take 7 (vals file-colors))) ] @@ -153,7 +150,7 @@ [:li.palette-library {:on-click #(st/emit! (mdc/change-palette-selected :recent))} (when (= selected :recent) i/tick) - [:div.library-name (str (t locale "workspace.libraries.colors.recent-colors") + [:div.library-name (str (tr "workspace.libraries.colors.recent-colors") (str/format " (%s)" (count recent-colors)))] [:div.color-sample (for [[idx color] (map-indexed vector (take 7 (reverse recent-colors))) ] @@ -165,12 +162,12 @@ [:li {:on-click #(st/emit! (mdc/change-palette-size :big))} (when (= size :big) i/tick) - (t locale "workspace.libraries.colors.big-thumbnails")] + (tr "workspace.libraries.colors.big-thumbnails")] [:li {:on-click #(st/emit! (mdc/change-palette-size :small))} (when (= size :small) i/tick) - (t locale "workspace.libraries.colors.small-thumbnails")]]] + (tr "workspace.libraries.colors.small-thumbnails")]]] [:div.color-palette-actions {:on-click #(swap! state assoc :show-menu true)} diff --git a/frontend/src/app/main/ui/workspace/sidebar/assets.cljs b/frontend/src/app/main/ui/workspace/sidebar/assets.cljs index 059c816bbf..fb13896df2 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/assets.cljs +++ b/frontend/src/app/main/ui/workspace/sidebar/assets.cljs @@ -21,6 +21,7 @@ [app.main.data.workspace.common :as dwc] [app.main.data.workspace.undo :as dwu] [app.main.data.workspace.libraries :as dwl] + [app.main.data.workspace.state-helpers :as wsh] [app.main.data.workspace.texts :as dwt] [app.main.exports :as exports] [app.main.refs :as refs] @@ -514,7 +515,7 @@ apply-color (fn [color-id event] - (let [ids (get-in @st/state [:workspace-local :selected])] + (let [ids (wsh/lookup-selected @st/state)] (if (kbd/shift? event) (st/emit! (dc/change-stroke ids color)) (st/emit! (dc/change-fill ids color))))) @@ -713,7 +714,7 @@ apply-typography (fn [typography event] - (let [ids (get-in @st/state [:workspace-local :selected]) + (let [ids (wsh/lookup-selected @st/state) attrs (merge {:typography-ref-file file-id :typography-ref-id (:id typography)} diff --git a/frontend/src/app/main/ui/workspace/viewport.cljs b/frontend/src/app/main/ui/workspace/viewport.cljs index 8c959a0f67..6e2363cb65 100644 --- a/frontend/src/app/main/ui/workspace/viewport.cljs +++ b/frontend/src/app/main/ui/workspace/viewport.cljs @@ -35,7 +35,7 @@ ;; --- Viewport (mf/defc viewport - [{:keys [local layout file] :as props}] + [{:keys [local selected layout file] :as props}] (let [;; When adding data from workspace-local revisit `app.main.ui.workspace` to check ;; that the new parameter is sent {:keys [edit-path @@ -44,7 +44,6 @@ options-mode panning picking-color? - selected selrect show-distances? tooltip @@ -53,7 +52,6 @@ vport zoom]} local - ;; CONTEXT page-id (mf/use-ctx ctx/current-page-id) diff --git a/frontend/tests/app/test_components_basic.cljs b/frontend/tests/app/test_components_basic.cljs index 31c158c626..2c6eba8886 100644 --- a/frontend/tests/app/test_components_basic.cljs +++ b/frontend/tests/app/test_components_basic.cljs @@ -1,18 +1,20 @@ (ns app.test-components-basic - (:require [cljs.test :as t :include-macros true] - [cljs.pprint :refer [pprint]] - [clojure.stacktrace :as stk] - [beicon.core :as rx] - [linked.core :as lks] - [app.test-helpers.events :as the] - [app.test-helpers.pages :as thp] - [app.test-helpers.libraries :as thl] - [app.common.geom.point :as gpt] - [app.common.data :as d] - [app.common.pages.helpers :as cph] - [app.main.data.workspace :as dw] - [app.main.data.workspace.libraries :as dwl] - [app.main.data.workspace.libraries-helpers :as dwlh])) + (:require + [app.common.data :as d] + [app.common.geom.point :as gpt] + [app.common.pages.helpers :as cph] + [app.main.data.workspace :as dw] + [app.main.data.workspace.libraries :as dwl] + [app.main.data.workspace.libraries-helpers :as dwlh] + [app.main.data.workspace.state-helpers :as wsh] + [app.test-helpers.events :as the] + [app.test-helpers.libraries :as thl] + [app.test-helpers.pages :as thp] + [beicon.core :as rx] + [cljs.pprint :refer [pprint]] + [cljs.test :as t :include-macros true] + [clojure.stacktrace :as stk] + [linked.core :as lks])) (t/use-fixtures :each {:before thp/reset-idmap!}) @@ -307,8 +309,8 @@ (gpt/point 100 100))) (rx/do (fn [new-state] - (let [new-instance-id (-> (get-in new-state - [:workspace-local :selected]) + (let [new-instance-id (-> new-state + wsh/lookup-selected first) [[instance2 shape2] From 437a6cf476e732b60d0704937518c4f299b50d16 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Wed, 5 May 2021 14:47:41 +0200 Subject: [PATCH 3/8] :bug: Fix problem with interactions on deleted frames --- .../app/main/ui/workspace/viewport/interactions.cljs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/frontend/src/app/main/ui/workspace/viewport/interactions.cljs b/frontend/src/app/main/ui/workspace/viewport/interactions.cljs index 900d6a3967..6c894fab61 100644 --- a/frontend/src/app/main/ui/workspace/viewport/interactions.cljs +++ b/frontend/src/app/main/ui/workspace/viewport/interactions.cljs @@ -181,19 +181,22 @@ draw-interaction-to (:draw-interaction-to local) draw-interaction-to-frame (:draw-interaction-to-frame local) first-selected (first selected-shapes)] - [:* + + [:g.interactions + [:g.non-selected (for [shape active-shapes] (let [interaction (get-click-interaction shape) dest-shape (get objects (:destination interaction)) selected? (contains? selected (:id shape))] - (when-not selected? + (when-not (or selected? (not dest-shape)) [:& interaction-path {:key (:id shape) :orig-shape shape :dest-shape dest-shape :selected selected :selected? false - :zoom zoom}]))) + :zoom zoom}])))] + [:g.selected (if (and draw-interaction-to first-selected) [:& interaction-path {:key "interactive" :orig-shape first-selected @@ -216,5 +219,5 @@ [:& interaction-handle {:key (:id shape) :shape shape :selected selected - :zoom zoom}])))))])) + :zoom zoom}])))))]])) From d96573675126a4fb829fb88d0e9daf2025a46792 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Wed, 5 May 2021 16:14:57 +0200 Subject: [PATCH 4/8] :bug: Fix problems with interactions in view mode --- frontend/src/app/main/ui/viewer/shapes.cljs | 70 ++++++++++++++------- 1 file changed, 46 insertions(+), 24 deletions(-) diff --git a/frontend/src/app/main/ui/viewer/shapes.cljs b/frontend/src/app/main/ui/viewer/shapes.cljs index bbcc521ce7..19e2de04b6 100644 --- a/frontend/src/app/main/ui/viewer/shapes.cljs +++ b/frontend/src/app/main/ui/viewer/shapes.cljs @@ -7,37 +7,53 @@ (ns app.main.ui.viewer.shapes "The main container for a frame in viewer mode" (:require - [rumext.alpha :as mf] [app.common.data :as d] + [app.common.geom.matrix :as gmt] + [app.common.geom.point :as gpt] + [app.common.geom.shapes :as geom] [app.common.pages :as cp] [app.main.data.viewer :as dv] [app.main.refs :as refs] [app.main.store :as st] - [app.main.ui.shapes.filters :as filters] [app.main.ui.shapes.circle :as circle] + [app.main.ui.shapes.filters :as filters] [app.main.ui.shapes.frame :as frame] [app.main.ui.shapes.group :as group] - [app.main.ui.shapes.svg-raw :as svg-raw] [app.main.ui.shapes.image :as image] [app.main.ui.shapes.path :as path] [app.main.ui.shapes.rect :as rect] + [app.main.ui.shapes.shape :refer [shape-container]] + [app.main.ui.shapes.svg-raw :as svg-raw] [app.main.ui.shapes.text :as text] + [app.util.dom :as dom] [app.util.object :as obj] - [app.common.geom.matrix :as gmt] - [app.common.geom.point :as gpt] - [app.common.geom.shapes :as geom] - [app.main.ui.shapes.shape :refer [shape-container]])) + [rumext.alpha :as mf])) (defn on-mouse-down - [event {:keys [interactions] :as shape}] + [event interactions] (let [interaction (first (filter #(= (:event-type %) :click) interactions))] (case (:action-type interaction) :navigate (let [frame-id (:destination interaction)] + (dom/stop-propagation event) (st/emit! (dv/go-to-frame frame-id))) nil))) +(mf/defc interaction + [{:keys [shape interactions show-interactions?]}] + (let [{:keys [x y width height]} shape] + (when-not (empty? interactions) + [:rect {:x (- x 1) + :y (- y 1) + :width (+ width 2) + :height (+ height 2) + :fill "#31EFB8" + :stroke "#31EFB8" + :stroke-width (if show-interactions? 1 0) + :fill-opacity (if show-interactions? 0.2 0) + :style {:pointer-events "none"}}]))) + (defn generic-wrapper-factory "Wrap some svg shape and add interaction controls" [component show-interactions?] @@ -45,35 +61,37 @@ {::mf/wrap-props false} [props] (let [shape (unchecked-get props "shape") + objects (unchecked-get props "objects") {:keys [x y width height]} (:selrect shape) + frame? (= :frame (:type shape)) childs (unchecked-get props "childs") frame (unchecked-get props "frame") + interactions (->> (:interactions shape) + (filter #(contains? objects (:destination %)))) + on-mouse-down (mf/use-callback - (mf/deps shape) - #(on-mouse-down % shape)) + (mf/deps interactions) + (fn [event] + (on-mouse-down event interactions))) svg-element? (and (= :svg-raw (:type shape)) (not= :svg (get-in shape [:content :tag])))] (if-not svg-element? [:> shape-container {:shape shape - :on-mouse-down on-mouse-down - :cursor (when (seq (:interactions shape)) "pointer")} + :cursor (when-not (empty? interactions) "pointer") + :on-mouse-down on-mouse-down} + [:& component {:shape shape :frame frame :childs childs :is-child-selected? true}] - (when (:interactions shape) - [:rect {:x (- x 1) - :y (- y 1) - :width (+ width 2) - :height (+ height 2) - :fill "#31EFB8" - :stroke "#31EFB8" - :stroke-width (if show-interactions? 1 0) - :fill-opacity (if show-interactions? 0.2 0)}])] + + [:& interaction {:shape shape + :interactions interactions + :show-interactions? show-interactions?}]] ;; Don't wrap svg elements inside a otherwise some can break [:& component {:shape shape @@ -127,6 +145,7 @@ props (obj/merge! #js {} props #js {:shape shape :childs childs + :objects objects :show-interactions? show-interactions?})] [:> frame-wrapper props])))) @@ -141,6 +160,7 @@ childs (mapv #(get objects %) (:shapes shape)) props (obj/merge! #js {} props #js {:childs childs + :objects objects :show-interactions? show-interactions?})] [:> group-wrapper props])))) @@ -155,6 +175,7 @@ childs (mapv #(get objects %) (:shapes shape)) props (obj/merge! #js {} props #js {:childs childs + :objects objects :show-interactions? show-interactions?})] [:> svg-raw-wrapper props])))) @@ -179,7 +200,8 @@ (when (and shape (not (:hidden shape))) (let [shape (-> (geom/transform-shape shape) (geom/translate-to-frame frame)) - opts #js {:shape shape}] + opts #js {:shape shape + :objects objects}] (case (:type shape) :frame [:g.empty] :text [:> text-wrapper opts] @@ -187,8 +209,8 @@ :path [:> path-wrapper opts] :image [:> image-wrapper opts] :circle [:> circle-wrapper opts] - :group [:> group-container {:shape shape :frame frame}] - :svg-raw [:> svg-raw-container {:shape shape :frame frame}]))))))) + :group [:> group-container {:shape shape :frame frame :objects objects}] + :svg-raw [:> svg-raw-container {:shape shape :frame frame :objects objects}]))))))) (mf/defc frame-svg {::mf/wrap [mf/memo]} From a3ead3aa6d95ab26975343780b1195272b789868 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Wed, 5 May 2021 16:40:40 +0200 Subject: [PATCH 5/8] :bug: Fix error on collaboratibe editing --- frontend/src/app/main/data/workspace/common.cljs | 6 ------ frontend/src/app/main/data/workspace/notifications.cljs | 6 +++--- frontend/src/app/main/ui/viewer/shapes.cljs | 6 ++++-- 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/frontend/src/app/main/data/workspace/common.cljs b/frontend/src/app/main/data/workspace/common.cljs index 10c5b97448..c9f8bfcd8b 100644 --- a/frontend/src/app/main/data/workspace/common.cljs +++ b/frontend/src/app/main/data/workspace/common.cljs @@ -28,12 +28,6 @@ (s/def ::shape-attrs ::cp/shape-attrs) (s/def ::set-of-string (s/every string? :kind set?)) (s/def ::ordered-set-of-uuid (s/every uuid? :kind d/ordered-set?)) -;; --- Protocols - -(declare setup-selection-index) -(declare update-indices) -(declare reset-undo) -(declare append-undo) ;; --- Helpers diff --git a/frontend/src/app/main/data/workspace/notifications.cljs b/frontend/src/app/main/data/workspace/notifications.cljs index 6ec98cc444..95afceb6d1 100644 --- a/frontend/src/app/main/data/workspace/notifications.cljs +++ b/frontend/src/app/main/data/workspace/notifications.cljs @@ -7,12 +7,12 @@ (ns app.main.data.workspace.notifications (:require [app.common.data :as d] - [app.common.uri :as u] [app.common.geom.point :as gpt] [app.common.pages :as cp] [app.common.spec :as us] + [app.common.uri :as u] [app.config :as cf] - [app.main.data.workspace.common :as dwc] + [app.main.data.workspace.changes :as dch] [app.main.data.workspace.libraries :as dwl] [app.main.data.workspace.persistence :as dwp] [app.main.repo :as rp] @@ -217,7 +217,7 @@ (let [changes-by-pages (group-by :page-id changes) process-page-changes (fn [[page-id changes]] - (dwc/update-indices page-id changes))] + (dch/update-indices page-id changes))] (rx/merge (rx/of (dwp/shapes-changes-persisted file-id msg)) diff --git a/frontend/src/app/main/ui/viewer/shapes.cljs b/frontend/src/app/main/ui/viewer/shapes.cljs index 19e2de04b6..54dde52d74 100644 --- a/frontend/src/app/main/ui/viewer/shapes.cljs +++ b/frontend/src/app/main/ui/viewer/shapes.cljs @@ -42,7 +42,8 @@ (mf/defc interaction [{:keys [shape interactions show-interactions?]}] - (let [{:keys [x y width height]} shape] + (let [{:keys [x y width height]} (:selrect shape) + frame? (= :frame (:type shape))] (when-not (empty? interactions) [:rect {:x (- x 1) :y (- y 1) @@ -52,7 +53,8 @@ :stroke "#31EFB8" :stroke-width (if show-interactions? 1 0) :fill-opacity (if show-interactions? 0.2 0) - :style {:pointer-events "none"}}]))) + :style {:pointer-events (when frame? "none")} + :transform (geom/transform-matrix shape)}]))) (defn generic-wrapper-factory "Wrap some svg shape and add interaction controls" From 4bf0ae0a9d668c13e8258f1626ca1e30ed64711a Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Thu, 6 May 2021 10:27:05 +0200 Subject: [PATCH 6/8] :sparkles: Deactivate profile-activity middleware. --- backend/src/app/http.clj | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/backend/src/app/http.clj b/backend/src/app/http.clj index 4ad574102c..a3fbc02c62 100644 --- a/backend/src/app/http.clj +++ b/backend/src/app/http.clj @@ -125,8 +125,7 @@ ["/assets" {:middleware [[middleware/format-response-body] [middleware/errors errors/handle] [middleware/cookies] - (:middleware session) - middleware/activity-logger]} + (:middleware session)]} ["/by-id/:id" {:get (:objects-handler assets)}] ["/by-file-media-id/:id" {:get (:file-objects-handler assets)}] ["/by-file-media-id/:id/thumbnail" {:get (:file-thumbnails-handler assets)}]] @@ -152,8 +151,7 @@ ["/auth/oauth/:provider" {:post (:handler oauth)}] ["/auth/oauth/:provider/callback" {:get (:callback-handler oauth)}] - ["/rpc" {:middleware [(:middleware session) - middleware/activity-logger]} + ["/rpc" {:middleware [(:middleware session)]} ["/query/:type" {:get (:query-handler rpc) :post (:query-handler rpc)}] ["/mutation/:type" {:post (:mutation-handler rpc)}]]]])) From 2c3a3845acb29b3cba627888a3f534b1991b8174 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Thu, 6 May 2021 11:04:53 +0200 Subject: [PATCH 7/8] :bug: Fix problem with embed fonts --- frontend/src/app/main/ui/shapes/text.cljs | 8 +------ .../src/app/main/ui/shapes/text/embed.cljs | 21 +++++++++-------- .../app/main/ui/workspace/shapes/frame.cljs | 9 ++++++++ .../ui/workspace/viewport/pixel_overlay.cljs | 23 ++++--------------- frontend/src/app/util/http.cljs | 12 +++++++--- 5 files changed, 35 insertions(+), 38 deletions(-) diff --git a/frontend/src/app/main/ui/shapes/text.cljs b/frontend/src/app/main/ui/shapes/text.cljs index 6449c3e64f..f26386dae1 100644 --- a/frontend/src/app/main/ui/shapes/text.cljs +++ b/frontend/src/app/main/ui/shapes/text.cljs @@ -10,7 +10,6 @@ [app.common.geom.shapes :as geom] [app.main.ui.context :as muc] [app.main.ui.shapes.attrs :as attrs] - [app.main.ui.shapes.text.embed :as ste] [app.main.ui.shapes.text.styles :as sts] [app.util.color :as uc] [app.util.object :as obj] @@ -30,15 +29,12 @@ {::mf/wrap-props false} [props] (let [node (obj/get props "node") - embed? (obj/get props "embed-fonts?") children (obj/get props "children") shape (obj/get props "shape") style (sts/generate-root-styles shape node)] [:div.root.rich-text {:style style :xmlns "http://www.w3.org/1999/xhtml"} - (when embed? - [:& ste/embed-fontfaces-style {:node node}]) children])) (mf/defc render-paragraph-set @@ -94,7 +90,6 @@ [props ref] (let [{:keys [id x y width height content] :as shape} (obj/get props "shape") grow-type (obj/get props "grow-type") ;; This is only needed in workspace - embed-fonts? (mf/use-ctx muc/embed-ctx) ;; We add 8px to add a padding for the exporter ;; width (+ width 8) ] @@ -109,5 +104,4 @@ :ref ref} [:& render-node {:index 0 :shape shape - :node content - :embed-fonts? embed-fonts?}]])) + :node content}]])) diff --git a/frontend/src/app/main/ui/shapes/text/embed.cljs b/frontend/src/app/main/ui/shapes/text/embed.cljs index b487bb25f2..8c5fc62848 100644 --- a/frontend/src/app/main/ui/shapes/text/embed.cljs +++ b/frontend/src/app/main/ui/shapes/text/embed.cljs @@ -62,12 +62,14 @@ "Given a font and the variant-id, retrieves the style CSS for it." [{:keys [id backend family variants] :as font} font-variant-id] (if (= :google backend) - (->> (http/send! {:method :get - :mode :no-cors - :uri (fonts/gfont-url family [{:id font-variant-id}]) - :response-type :text}) - (rx/map :body) - (http/as-promise)) + (let [uri (fonts/gfont-url family [{:id font-variant-id}])] + (->> (http/send! {:method :get + :mode :cors + :omit-default-headers true + :uri uri + :response-type :text}) + (rx/map :body) + (http/as-promise))) (let [{:keys [name weight style suffix] :as variant} (d/seek #(= (:id %) font-variant-id) variants) result (str/fmt font-face-template {:family family :style style @@ -89,7 +91,7 @@ (with-cache {:key uris :max-age (dt/duration {:hours 4})} (->> (rx/from (seq uris)) (rx/mapcat (fn [uri] - (->> (http/send! {:method :get :uri uri :response-type :blob}) + (->> (http/send! {:method :get :uri uri :response-type :blob :omit-default-headers true}) (rx/map :body) (rx/mapcat wapi/read-file-as-data-url) (rx/map #(vector uri %))))) @@ -124,9 +126,10 @@ (mf/defc embed-fontfaces-style {::mf/wrap-props false - ::mf/wrap [mf/memo]} + ::mf/wrap [#(mf/memo' % (mf/check-props ["shapes"]))]} [props] - (let [node (obj/get props "node") + (let [shapes (obj/get props "shapes") + node {:children (->> shapes (map :content))} fonts (-> node get-node-fonts memoize) style (mf/use-state nil)] diff --git a/frontend/src/app/main/ui/workspace/shapes/frame.cljs b/frontend/src/app/main/ui/workspace/shapes/frame.cljs index 71a38987af..91e31c6edf 100644 --- a/frontend/src/app/main/ui/workspace/shapes/frame.cljs +++ b/frontend/src/app/main/ui/workspace/shapes/frame.cljs @@ -14,6 +14,7 @@ [app.main.ui.context :as muc] [app.main.ui.shapes.frame :as frame] [app.main.ui.shapes.shape :refer [shape-container]] + [app.main.ui.shapes.text.embed :as ste] [app.util.dom :as dom] [app.util.keyboard :as kbd] [app.util.timers :as ts] @@ -76,14 +77,22 @@ (let [shape (unchecked-get props "shape") objects (unchecked-get props "objects") edition (mf/deref refs/selected-edition) + embed-fonts? (mf/use-ctx muc/embed-ctx) shape (gsh/transform-shape shape) children (mapv #(get objects %) (:shapes shape)) + text-childs (->> objects + vals + (filterv #(and (= :text (:type %)) + (= (:id shape) (:frame-id %))))) + ds-modifier (get-in shape [:modifiers :displacement])] (when (and shape (not (:hidden shape))) [:g.frame-wrapper {:display (when (:hidden shape) "none")} [:> shape-container {:shape shape} + (when embed-fonts? + [:& ste/embed-fontfaces-style {:shapes text-childs}]) [:& frame-shape {:shape shape :childs children}]]]))))) diff --git a/frontend/src/app/main/ui/workspace/viewport/pixel_overlay.cljs b/frontend/src/app/main/ui/workspace/viewport/pixel_overlay.cljs index ab46aeb73c..9601b2b982 100644 --- a/frontend/src/app/main/ui/workspace/viewport/pixel_overlay.cljs +++ b/frontend/src/app/main/ui/workspace/viewport/pixel_overlay.cljs @@ -130,7 +130,7 @@ (mf/deps img-ref) (fn [] (let [img-node (mf/ref-val img-ref) - svg-node #_(mf/ref-val svg-ref) (dom/get-element "render") + svg-node (dom/get-element "render") xml (-> (js/XMLSerializer.) (.serializeToString svg-node) js/encodeURIComponent @@ -157,21 +157,19 @@ #(rx/dispose! sub)))) (mf/use-effect - #_(mf/deps svg-ref) (fn [] (let [config #js {:attributes true :childList true :subtree true :characterData true} - svg-node #_(mf/ref-val svg-ref) (dom/get-element "render") + svg-node (dom/get-element "render") observer (js/MutationObserver. handle-svg-change) ] (.observe observer svg-node config) (handle-svg-change) ;; Disconnect on unmount - #(.disconnect observer) - ))) + #(.disconnect observer)))) [:* [:div.pixel-overlay @@ -191,17 +189,4 @@ :height (:height vport 0) :style {:position "absolute" :width "100%" - :height "100%"}}] - - #_[:& (mf/provider muc/embed-ctx) {:value true} - [:svg.viewport - {:ref svg-ref - :preserveAspectRatio "xMidYMid meet" - :width (:width vport 0) - :height (:height vport 0) - :view-box (format-viewbox vbox) - :style {:position "absolute" - :width "100%" - :height "100%" - :background-color (get options :background "#E8E9EA")}} - [:& overlay-frames]]]]]])) + :height "100%"}}]]]])) diff --git a/frontend/src/app/util/http.cljs b/frontend/src/app/util/http.cljs index 5c4eeba6ca..a5c4920b0c 100644 --- a/frontend/src/app/util/http.cljs +++ b/frontend/src/app/util/http.cljs @@ -52,7 +52,7 @@ {"x-frontend-version" (:full @cfg/version)}) (defn fetch - [{:keys [method uri query headers body timeout mode] + [{:keys [method uri query headers body timeout mode omit-default-headers] :or {timeout 10000 mode :cors headers {}}}] (rx/Observable.create (fn [subscriber] @@ -67,9 +67,15 @@ uri (cond-> uri (string? uri) (u/uri) (some? query) (assoc :query query)) - headers (->> (d/merge headers default-headers) - (-update-headers body)) + + headers (cond-> headers + (not omit-default-headers) + (d/merge default-headers)) + + headers (-update-headers body headers) + body (-get-body-data body) + params #js {:method (translate-method method) :headers (clj->js headers) :body body From 269efc98c3c59d3e21233189f8e258d8b5137b41 Mon Sep 17 00:00:00 2001 From: "alonso.torres" Date: Thu, 6 May 2021 11:57:00 +0200 Subject: [PATCH 8/8] :books: Updates changes --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.md b/CHANGES.md index a6395d0cc6..d45f28d5c1 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -39,6 +39,7 @@ - Fix visual problem with group invite [Taiga #1290](https://tree.taiga.io/project/penpot/issue/1290) - Fix issues with promote owner panel [Taiga #763](https://tree.taiga.io/project/penpot/issue/763) - Allow use library colors when defining gradients [Taiga #1614](https://tree.taiga.io/project/penpot/issue/1614) +- Fix group selrect not updating after alignment [#895](https://github.com/penpot/penpot/issues/895) ### :arrow_up: Deps updates