diff --git a/CHANGES.md b/CHANGES.md index 4986a1fbe6..8a6109586d 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -61,6 +61,7 @@ - Fix internal Error when selecting a set by name in the token theme editor [Taiga #12310](https://tree.taiga.io/project/penpot/issue/12310) - Fix drag & drop functionality is swapping instead or reordering [Taiga #12254](https://tree.taiga.io/project/penpot/issue/12254) - Fix variants not syncronizing tokens on switch [Taiga #12290](https://tree.taiga.io/project/penpot/issue/12290) +- Fix incorrect behavior of Alt + Drag for variants [Taiga #12309](https://tree.taiga.io/project/penpot/issue/12309) ## 2.10.1 diff --git a/common/src/app/common/logic/libraries.cljc b/common/src/app/common/logic/libraries.cljc index 757d92d1d4..95a87057be 100644 --- a/common/src/app/common/logic/libraries.cljc +++ b/common/src/app/common/logic/libraries.cljc @@ -2801,7 +2801,7 @@ (defn generate-duplicate-changes "Prepare objects to duplicate: generate new id, give them unique names, move to the desired position, and recalculate parents and frames as needed." - [changes all-objects page ids delta libraries library-data file-id & {:keys [variant-props]}] + [changes all-objects page ids delta libraries library-data file-id & {:keys [variant-props alt-duplication?]}] (let [shapes (map (d/getf all-objects) ids) unames (volatile! (cfh/get-used-names (:objects page))) update-unames! (fn [new-name] (vswap! unames conj new-name)) @@ -2811,10 +2811,22 @@ ;; we calculate a new one because the components will have created new shapes. ids-map (into {} (map #(vector % (uuid/next))) all-ids) + + ;; If there is an alt-duplication of a variant, change its parent to root + ;; so the copy is made as a child of root + ;; This is because inside a variant-container can't be a copy + shapes (map (fn [shape] + (if (and alt-duplication? (ctk/is-variant? shape)) + (assoc shape :parent-id uuid/zero :frame-id nil) + shape)) + shapes) + + changes (-> changes (pcb/with-page page) (pcb/with-objects all-objects) (pcb/with-library-data library-data)) + changes (->> shapes (reduce #(generate-duplicate-shape-change %1 diff --git a/frontend/src/app/main/data/workspace/selection.cljs b/frontend/src/app/main/data/workspace/selection.cljs index bf73d148ea..16459d7408 100644 --- a/frontend/src/app/main/data/workspace/selection.cljs +++ b/frontend/src/app/main/data/workspace/selection.cljs @@ -463,7 +463,7 @@ library-data (dsh/lookup-file-data state file-id) changes (-> (pcb/empty-changes it) - (cll/generate-duplicate-changes objects page ids delta libraries library-data file-id) + (cll/generate-duplicate-changes objects page ids delta libraries library-data file-id {:alt-duplication? alt-duplication?}) (cll/generate-duplicate-changes-update-indices objects ids)) tags (or (:tags changes) #{})