diff --git a/common/src/app/common/logic/variants.cljc b/common/src/app/common/logic/variants.cljc index 12238a1b73..95b5a108eb 100644 --- a/common/src/app/common/logic/variants.cljc +++ b/common/src/app/common/logic/variants.cljc @@ -99,7 +99,9 @@ (= prev-swap-slot swap-ref-id) (pcb/update-shapes [(:id orig-swapped-child)] - #(ctk/set-swap-slot % (:shape-ref related-shape-in-new)))) + #(-> % + (ctk/remove-swap-slot) + (ctk/set-swap-slot (:shape-ref related-shape-in-new))))) ;; Delete new non-swapped item (cls/generate-delete-shapes ldata page objects (d/ordered-set (:id related-shape-in-new)) {:allow-altering-copies true}) @@ -167,42 +169,51 @@ (:id orig-ref-shape)) ;; Creates a map to quickly find a child of the orig-ref-shape by its shape-path - o-ref-shapes-p-map (into {} (map (juxt :id :shape-path)) o-ref-shapes-wp)] - ;; Process each touched children of the original-shape - (reduce - (fn [changes orig-child-touched] - (let [;; If the orig-child-touched was swapped, get its swap-slot - swap-slot (ctk/get-swap-slot orig-child-touched) + o-ref-shapes-p-map (into {} (map (juxt :id :shape-path)) o-ref-shapes-wp) - ;; orig-child-touched is in a copy. Get the referenced shape on the main component - ;; If there is a swap slot, we will get the referenced shape in another way - orig-ref-shape (when-not swap-slot - ;; TODO Maybe just get it from o-ref-shapes-wp - (ctf/find-ref-shape nil container libraries orig-child-touched)) - orig-ref-id (if swap-slot - ;; If there is a swap slot, find the referenced shape id - (ctf/find-ref-id-for-swapped orig-child-touched container libraries) - ;; If there is not a swap slot, get the id from the orig-ref-shape - (:id orig-ref-shape)) + ;; Process each touched children of the original-shape + [changes parents-of-swapped] + (reduce + (fn [[changes parent-of-swapped] orig-child-touched] + (let [;; If the orig-child-touched was swapped, get its swap-slot + swap-slot (ctk/get-swap-slot orig-child-touched) - ;; Get the shape path of the referenced main - shape-path (get o-ref-shapes-p-map orig-ref-id) - ;; Get its related shape in the children of new-shape: the one that - ;; has the same shape-path - related-shape-in-new (get new-shapes-map shape-path)] - ;; If there is a related shape, keep its data - (if related-shape-in-new - (if swap-slot - ;; If the orig-child-touched was swapped, keep it - (keep-swapped-item changes related-shape-in-new orig-child-touched - ldata page orig-ref-id) - ;; If the orig-child-touched wasn't swapped, copy - ;; the touched attributes into it - (cll/update-attrs-on-switch - changes related-shape-in-new orig-child-touched - new-shape original-shape orig-ref-shape container)) - changes))) - changes - orig-touched))) + ;; orig-child-touched is in a copy. Get the referenced shape on the main component + ;; If there is a swap slot, we will get the referenced shape in another way + orig-ref-shape (when-not swap-slot + ;; TODO Maybe just get it from o-ref-shapes-wp + (ctf/find-ref-shape nil container libraries orig-child-touched)) + + orig-ref-id (if swap-slot + ;; If there is a swap slot, find the referenced shape id + (ctf/find-ref-id-for-swapped orig-child-touched container libraries) + ;; If there is not a swap slot, get the id from the orig-ref-shape + (:id orig-ref-shape)) + + ;; Get the shape path of the referenced main + shape-path (get o-ref-shapes-p-map orig-ref-id) + ;; Get its related shape in the children of new-shape: the one that + ;; has the same shape-path + related-shape-in-new (get new-shapes-map shape-path) + parents-of-swapped (if related-shape-in-new + (conj parent-of-swapped (:parent-id related-shape-in-new)) + parent-of-swapped) + ;; If there is a related shape, keep its data + changes + (if related-shape-in-new + (if swap-slot + ;; If the orig-child-touched was swapped, keep it + (keep-swapped-item changes related-shape-in-new orig-child-touched + ldata page orig-ref-id) + ;; If the orig-child-touched wasn't swapped, copy + ;; the touched attributes into it + (cll/update-attrs-on-switch + changes related-shape-in-new orig-child-touched + new-shape original-shape orig-ref-shape container)) + changes)] + [changes parents-of-swapped])) + [changes []] + orig-touched)] + [changes parents-of-swapped])) diff --git a/common/src/app/common/test_helpers/compositions.cljc b/common/src/app/common/test_helpers/compositions.cljc index 982a76b0e8..1a9d8f00af 100644 --- a/common/src/app/common/test_helpers/compositions.cljc +++ b/common/src/app/common/test_helpers/compositions.cljc @@ -300,9 +300,9 @@ {} (true? keep-touched?)) - changes (if keep-touched? - (clv/generate-keep-touched changes new-shape shape orig-shapes page libraries (:data file)) - changes) + [changes _] (if keep-touched? + (clv/generate-keep-touched changes new-shape shape orig-shapes page libraries (:data file)) + [changes nil]) file' (thf/apply-changes file changes)] diff --git a/frontend/src/app/main/data/workspace/libraries.cljs b/frontend/src/app/main/data/workspace/libraries.cljs index 99de5340bb..a3a2d1da8c 100644 --- a/frontend/src/app/main/data/workspace/libraries.cljs +++ b/frontend/src/app/main/data/workspace/libraries.cljs @@ -980,9 +980,11 @@ (cll/generate-component-swap objects shape ldata page libraries id-new-component index target-cell keep-props-values keep-touched?)) - changes (if keep-touched? - (clv/generate-keep-touched changes new-shape shape orig-shapes page libraries ldata) - changes)] + [changes parents-of-swapped] + (if keep-touched? + (clv/generate-keep-touched changes new-shape shape orig-shapes page libraries ldata) + [changes []]) + all-parents (into all-parents parents-of-swapped)] (rx/of (dwu/start-undo-transaction undo-id)