diff --git a/common/src/app/common/files/helpers.cljc b/common/src/app/common/files/helpers.cljc index 5ac14ac501..360d8428d3 100644 --- a/common/src/app/common/files/helpers.cljc +++ b/common/src/app/common/files/helpers.cljc @@ -117,6 +117,12 @@ ([shape] (d/not-empty? (:shapes shape)))) +(defn has-layout? + "Returns true if the provided shape has a layout assigned" + [objects id] + (let [shape (get objects id)] + (boolean (and shape (:layout shape))))) + (defn group-like-shape? ([objects id] (group-like-shape? (get objects id))) @@ -127,6 +133,24 @@ ;; ---- ACCESSORS +(defn get-selected-type + "Returns the type of the shape if only one, or :multiple if more + than one" + [objects selected] + (if (= 1 (count selected)) + (let [shape (get objects (first selected))] + (:type shape)) + :multiple)) + +(defn get-shape-type + "Returns the type of the shape, or 'root' if it's Root Frame, always + as string" + [objects id] + (let [shape (get objects id)] + (if (root? shape) + :root + (dm/get-prop shape :type)))) + (defn get-children-ids [objects id] (letfn [(get-children-ids-rec [id processed] diff --git a/frontend/src/app/main/data/event.cljs b/frontend/src/app/main/data/event.cljs index 51d59b6f97..888bd6e1d0 100644 --- a/frontend/src/app/main/data/event.cljs +++ b/frontend/src/app/main/data/event.cljs @@ -242,3 +242,7 @@ (l/error :hint "error on event batching stream" :cause cause)) (fn [] (l/debug :hitn "events batching stream terminated"))))))))) + +(defn event + [props] + (ptk/data-event ::events props)) diff --git a/frontend/src/app/main/data/viewer.cljs b/frontend/src/app/main/data/viewer.cljs index c18444623a..fc03e684b8 100644 --- a/frontend/src/app/main/data/viewer.cljs +++ b/frontend/src/app/main/data/viewer.cljs @@ -80,8 +80,9 @@ (rx/of (fetch-bundle (d/without-nils params)) ;; Only fetch threads for logged-in users (when (some? (:profile state)) - (fetch-comment-threads params)))) - + (fetch-comment-threads params)) + (when (:share-id params) + (rx/of (ptk/event ::ev/event {::ev/name "shared-prototipe-visited"}))))) ptk/EffectEvent (effect [_ _ _] ;; Set the window name, the window name is used on inter-tab diff --git a/frontend/src/app/main/data/workspace/clipboard.cljs b/frontend/src/app/main/data/workspace/clipboard.cljs index 1e22e48199..1808e8a97e 100644 --- a/frontend/src/app/main/data/workspace/clipboard.cljs +++ b/frontend/src/app/main/data/workspace/clipboard.cljs @@ -902,13 +902,30 @@ undo-id (js/Symbol)] (rx/concat - (->> (filter ctc/instance-head? orig-shapes) - (map (fn [{:keys [component-file]}] - (ptk/event ::ev/event - {::ev/name "use-library-component" - ::ev/origin "paste" - :external-library (not= file-id component-file)}))) - (rx/from)) + (->> (rx/from orig-shapes) + (rx/map (fn [shape] + (let [parent-type (cfh/get-shape-type all-objects (:parent-id shape)) + external-lib? (not= file-id (:component-file shape)) + origin "workspace:paste"] + + ;; NOTE: we don't emit the create-shape event all the time for + ;; avoid send a lot of events (that are not necessary); this + ;; decision is made explicitly by the responsible team. + (if (ctc/instance-head? shape) + (ev/event {::ev/name "use-library-component" + ::ev/origin origin + :is-external-library external-lib? + :parent-shape-type parent-type}) + (if (cfh/has-layout? objects (:parent-id shape)) + (ev/event {::ev/name "layout-add-element" + ::ev/origin origin + :element-type (get shape :type) + :parent-type parent-type}) + (ev/event {::ev/name "create-shape" + ::ev/origin origin + :shape-type (get shape :type) + :parent-shape-type parent-type}))))))) + (rx/of (dwu/start-undo-transaction undo-id) (dch/commit-changes changes) (dws/select-shapes selected) diff --git a/frontend/src/app/main/data/workspace/interactions.cljs b/frontend/src/app/main/data/workspace/interactions.cljs index 99ceee9475..3919c5564d 100644 --- a/frontend/src/app/main/data/workspace/interactions.cljs +++ b/frontend/src/app/main/data/workspace/interactions.cljs @@ -62,6 +62,8 @@ (defn add-flow-selected-frame [] (ptk/reify ::add-flow-selected-frame + ev/Event + (-data [_] {::ev/name "add-prototype-interaction"}) ptk/WatchEvent (watch [_ state _] (let [selected (dsh/lookup-selected state)] @@ -187,9 +189,10 @@ (when (and (not (connected-frame? objects (:id frame))) (nil? flow)) (rx/of (add-flow (:id frame)))) - (when first? + (if first? ;; When the first interaction of the page is created we emit the event "create-prototype" - (rx/of (ptk/event ::ev/event {::ev/name "create-prototype"}))))))))) + (rx/of (ev/event {::ev/name "create-prototype"})) + (rx/of (ev/event {::ev/name "add-prototype-interaction"}))))))))) (defn remove-interaction ([shape index] diff --git a/frontend/src/app/main/data/workspace/selection.cljs b/frontend/src/app/main/data/workspace/selection.cljs index e69f10bc62..884f2e85d3 100644 --- a/frontend/src/app/main/data/workspace/selection.cljs +++ b/frontend/src/app/main/data/workspace/selection.cljs @@ -479,15 +479,32 @@ ids) undo-id (js/Symbol)] (rx/concat - (->> (map (d/getf objects) ids) - (filter ctk/instance-head?) - (map (fn [{:keys [component-file]}] - (ptk/event ::ev/event - {::ev/name "use-library-component" - ::ev/origin "duplicate" - :external-library (not= file-id component-file)}))) - (rx/from)) - ;; Warning: This order is important for the focus mode. + (->> (rx/from ids) + (rx/map (fn [shape-id] + (let [shape (get objects shape-id) + parent-type (cfh/get-shape-type objects (:parent-id shape)) + external-lib? (not= file-id (:component-file shape)) + origin "workspace:duplicate-shapes"] + + ;; NOTE: we don't emit the create-shape event all the time for + ;; avoid send a lot of events (that are not necessary); this + ;; decision is made explicitly by the responsible team. + (if (ctk/instance-head? shape) + (ev/event {::ev/name "use-library-component" + ::ev/origin origin + :is-external-library external-lib? + :parent-shape-type parent-type}) + (if (cfh/has-layout? objects (:parent-id shape)) + (ev/event {::ev/name "layout-add-element" + ::ev/origin origin + :element-type (get shape :type) + :parent-type parent-type}) + (ev/event {::ev/name "create-shape" + ::ev/origin origin + :shape-type (get shape :type) + :parent-shape-type parent-type}))))))) + + ;; Warning: This order is important for the focus mode. (->> (rx/of (dwu/start-undo-transaction undo-id) (dch/commit-changes changes) diff --git a/frontend/src/app/main/data/workspace/shape_layout.cljs b/frontend/src/app/main/data/workspace/shape_layout.cljs index 529561c513..a58c81c332 100644 --- a/frontend/src/app/main/data/workspace/shape_layout.cljs +++ b/frontend/src/app/main/data/workspace/shape_layout.cljs @@ -294,7 +294,13 @@ (seq padding-attrs) (assoc :changed-sub-attr padding-attrs))) (ptk/data-event :layout/update {:ids ids}) - (dwu/commit-undo-transaction undo-id))))))) + (dwu/commit-undo-transaction undo-id) + (when (or (:layout-align-content changes) (:layout-justify-content changes)) + (ptk/event ::ev/event + {::ev/name "layout-change-alignment"})) + (when (or (:layout-padding changes) (:layout-gap changes)) + (ptk/event ::ev/event + {::ev/name "layout-change-margin"})))))))) (defn add-layout-track ([ids type value] diff --git a/frontend/src/app/main/data/workspace/shapes.cljs b/frontend/src/app/main/data/workspace/shapes.cljs index 27cb972a64..f755a3eb22 100644 --- a/frontend/src/app/main/data/workspace/shapes.cljs +++ b/frontend/src/app/main/data/workspace/shapes.cljs @@ -142,8 +142,16 @@ (when (cfh/text-shape? shape) (->> (rx/of (dwe/start-edition-mode (:id shape))) (rx/observe-on :async))) - (when (cfh/frame-shape? shape) - (rx/of (ptk/event ::ev/event {::ev/name "add-frame"}))))))))) + + (rx/of (ev/event {::ev/name "create-shape" + ::ev/origin "workspace:add-shape" + :type (get shape :type) + :parent-type (cfh/get-shape-type objects (:parent-id shape))})) + + (when (cfh/has-layout? objects (:parent-id shape)) + (rx/of (ev/event {::ev/name "layout-add-element" + ::ev/origin "workspace:add-shape" + :element-type (get shape :type)}))))))))) (defn move-shapes-into-frame [frame-id shapes] @@ -284,6 +292,9 @@ (dch/commit-changes changes) (dws/select-shapes (d/ordered-set (:id frame-shape))) (ptk/data-event :layout/update {:ids [(:id frame-shape)]}) + (ev/event {::ev/name "create-board" + :converted-from (cfh/get-selected-type objects selected) + :parent-type (cfh/get-shape-type objects (:parent-id frame-shape))}) (dwu/commit-undo-transaction undo-id)))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/frontend/src/app/main/data/workspace/transforms.cljs b/frontend/src/app/main/data/workspace/transforms.cljs index a68e484c99..d526bfb8b4 100644 --- a/frontend/src/app/main/data/workspace/transforms.cljs +++ b/frontend/src/app/main/data/workspace/transforms.cljs @@ -28,6 +28,7 @@ [app.common.types.shape.layout :as ctl] [app.common.uuid :as uuid] [app.main.data.changes :as dch] + [app.main.data.event :as ev] [app.main.data.helpers :as dsh] [app.main.data.workspace.collapse :as dwc] [app.main.data.workspace.modifiers :as dwm] @@ -1083,9 +1084,20 @@ ids :cell cell))] - (when (and (some? frame-id) (d/not-empty? changes)) - (rx/of (dch/commit-changes changes) - (dwc/expand-collapse frame-id))))))) + (rx/concat + (let [shapes (mapv #(get objects %) ids) + moved-count (count (filter #(not= (:parent-id %) frame-id) shapes)) + emit-layout-event? (and (cfh/has-layout? objects frame-id) + (pos? moved-count))] + (when emit-layout-event? + (rx/of (ev/event {::ev/name "layout-add-element" + ::ev/origin "workspace:move-shapes-to-frame" + :element-type (cfh/get-selected-type objects ids) + :moved moved-count})))) + + (when (and (some? frame-id) (d/not-empty? changes)) + (rx/of (dch/commit-changes changes) + (dwc/expand-collapse frame-id)))))))) (defn- get-displacement "Retrieve the correct displacement delta point for the diff --git a/frontend/src/app/main/ui/inspect/right_sidebar.cljs b/frontend/src/app/main/ui/inspect/right_sidebar.cljs index 5530464505..8ef94c8e0d 100644 --- a/frontend/src/app/main/ui/inspect/right_sidebar.cljs +++ b/frontend/src/app/main/ui/inspect/right_sidebar.cljs @@ -110,7 +110,8 @@ (mf/use-effect (mf/deps shapes handle-change-tab) (fn [] - (when-not (seq shapes) + (if (seq shapes) + (st/emit! (ptk/event ::ev/event {::ev/name "inspect-mode-click-element"})) (handle-change-tab :info)))) [:aside {:class (stl/css-case :settings-bar-right true