diff --git a/frontend/src/app/main/data/workspace/variants.cljs b/frontend/src/app/main/data/workspace/variants.cljs index 8193e33a6c..49bfa2dacf 100644 --- a/frontend/src/app/main/data/workspace/variants.cljs +++ b/frontend/src/app/main/data/workspace/variants.cljs @@ -296,48 +296,52 @@ (defn add-new-variant "Create a new variant and add it to the variant-container" - [shape-id] - (ptk/reify ::add-new-variant - ptk/WatchEvent - (watch [it state _] - (let [page-id (:current-page-id state) - data (dsh/lookup-file-data state) - objects (-> (dsh/get-page data page-id) - (get :objects)) - shape (get objects shape-id) - shape (if (ctc/is-variant-container? shape) - (get objects (last (:shapes shape))) - shape) - component-id (:component-id shape) - component (ctkl/get-component data component-id) + ([shape-id] + (add-new-variant shape-id false)) + ([shape-id multiselect?] + (ptk/reify ::add-new-variant + ptk/WatchEvent + (watch [it state _] + (let [page-id (:current-page-id state) + data (dsh/lookup-file-data state) + objects (-> (dsh/get-page data page-id) + (get :objects)) + shape (get objects shape-id) + shape (if (ctc/is-variant-container? shape) + (get objects (last (:shapes shape))) + shape) + component-id (:component-id shape) + component (ctkl/get-component data component-id) - container-id (:parent-id shape) - variant-container (get objects container-id) - has-layout? (ctsl/any-layout? variant-container) + container-id (:parent-id shape) + variant-container (get objects container-id) + has-layout? (ctsl/any-layout? variant-container) - new-component-id (uuid/next) - new-shape-id (uuid/next) + new-component-id (uuid/next) + new-shape-id (uuid/next) - prop-num (dec (count (:variant-properties component))) + prop-num (dec (count (:variant-properties component))) - changes (-> (pcb/empty-changes it page-id) - (pcb/with-library-data data) - (pcb/with-objects objects) - (pcb/with-page-id page-id) - (clv/generate-add-new-variant shape (:variant-id component) new-component-id new-shape-id prop-num)) + changes (-> (pcb/empty-changes it page-id) + (pcb/with-library-data data) + (pcb/with-objects objects) + (pcb/with-page-id page-id) + (clv/generate-add-new-variant shape (:variant-id component) new-component-id new-shape-id prop-num)) - undo-id (js/Symbol)] - (rx/concat - (rx/of - (dwu/start-undo-transaction undo-id) - (dch/commit-changes changes) - (when-not has-layout? - (resposition-and-resize-variant new-shape-id)) - (dwu/commit-undo-transaction undo-id) - (ptk/data-event :layout/update {:ids [(:parent-id shape)]}) - (dws/select-shape new-shape-id)) - (->> (rx/of (focus-property new-shape-id prop-num)) - (rx/delay 250))))))) + undo-id (js/Symbol)] + (rx/concat + (rx/of + (dwu/start-undo-transaction undo-id) + (dch/commit-changes changes) + (when-not has-layout? + (resposition-and-resize-variant new-shape-id)) + (dwu/commit-undo-transaction undo-id) + (ptk/data-event :layout/update {:ids [(:parent-id shape)]}) + (if multiselect? + (dws/shift-select-shapes new-shape-id) + (dws/select-shape new-shape-id))) + (->> (rx/of (focus-property new-shape-id prop-num)) + (rx/delay 250)))))))) (defn transform-in-variant "Given the id of a main shape of a component, creates a variant structure for @@ -491,8 +495,9 @@ (rx/concat (rx/of (ptk/event ::ev/event {::ev/name "add-new-variant" :trigger "shortcut-duplicate"}) - (dwu/start-undo-transaction undo-id)) - (rx/from (map add-new-variant selected-ids)) + (dwu/start-undo-transaction undo-id) + (add-new-variant (first selected-ids) false)) + (rx/from (map #(add-new-variant % true) (rest selected-ids))) (rx/of (dwu/commit-undo-transaction undo-id))) (rx/of (dws/duplicate-selected true)))))))