mirror of
https://github.com/penpot/penpot.git
synced 2025-03-10 14:51:37 -05:00
🐛 Fix copy and paste a main on another main doesn't work
This commit is contained in:
parent
899093dd55
commit
5157928cdb
2 changed files with 39 additions and 20 deletions
|
@ -416,12 +416,6 @@
|
||||||
(some ctk/main-instance? children)
|
(some ctk/main-instance? children)
|
||||||
(some ctk/main-instance? parents))))
|
(some ctk/main-instance? parents))))
|
||||||
|
|
||||||
(defn has-any-main-children?
|
|
||||||
"Check if the shape is a main component or has any children that is a main component."
|
|
||||||
[objects shape]
|
|
||||||
(let [children (cfh/get-children-with-self objects (:id shape))]
|
|
||||||
(some ctk/main-instance? children)))
|
|
||||||
|
|
||||||
(defn valid-shape-for-component?
|
(defn valid-shape-for-component?
|
||||||
"Check if a main component can be generated from this shape in terms of nested components:
|
"Check if a main component can be generated from this shape in terms of nested components:
|
||||||
- A main can't be the ancestor of another main
|
- A main can't be the ancestor of another main
|
||||||
|
@ -431,10 +425,29 @@
|
||||||
(not (has-any-main? objects shape))
|
(not (has-any-main? objects shape))
|
||||||
(not (has-any-copy-parent? objects shape))))
|
(not (has-any-copy-parent? objects shape))))
|
||||||
|
|
||||||
|
|
||||||
|
(defn collect-main-shapes [shape objects]
|
||||||
|
(if (ctk/main-instance? shape)
|
||||||
|
[shape]
|
||||||
|
(if-let [children (cfh/get-children objects (:id shape))]
|
||||||
|
(mapcat collect-main-shapes children objects)
|
||||||
|
[])))
|
||||||
|
|
||||||
(defn- invalid-structure-for-component?
|
(defn- invalid-structure-for-component?
|
||||||
"Check if the structure generated nesting children in parent is invalid in terms of nested components"
|
"Check if the structure generated nesting children in parent is invalid in terms of nested components"
|
||||||
[objects parent children]
|
[objects parent children pasting? libraries]
|
||||||
(let [selected-main-instance? (some true? (map #(has-any-main-children? objects %) children))
|
(let [; When we are pasting, the main shapes will be pasted as copies, unless the
|
||||||
|
; original component doesn't exist or is deleted. So for this function purposes, they
|
||||||
|
; are removed from the list
|
||||||
|
remove? (fn [shape]
|
||||||
|
(let [component (get-in libraries [(:component-file shape) :data :components (:component-id shape)])]
|
||||||
|
(and component (not (:deleted component)))))
|
||||||
|
|
||||||
|
selected-components (cond->> (mapcat collect-main-shapes children objects)
|
||||||
|
pasting?
|
||||||
|
(remove #(remove? %)))
|
||||||
|
|
||||||
|
selected-main-instance? (seq selected-components)
|
||||||
parent-in-component? (in-any-component? objects parent)
|
parent-in-component? (in-any-component? objects parent)
|
||||||
comps-nesting-loop? (not (->> children
|
comps-nesting-loop? (not (->> children
|
||||||
(map #(cfh/components-nesting-loop? objects (:id %) (:id parent)))
|
(map #(cfh/components-nesting-loop? objects (:id %) (:id parent)))
|
||||||
|
@ -450,13 +463,15 @@
|
||||||
|
|
||||||
(defn find-valid-parent-and-frame-ids
|
(defn find-valid-parent-and-frame-ids
|
||||||
"Navigate trough the ancestors until find one that is valid. Returns [ parent-id frame-id ]"
|
"Navigate trough the ancestors until find one that is valid. Returns [ parent-id frame-id ]"
|
||||||
[parent-id objects children]
|
([parent-id objects children]
|
||||||
(letfn [(get-frame [parent-id]
|
(find-valid-parent-and-frame-ids parent-id objects children false nil))
|
||||||
(if (cfh/frame-shape? objects parent-id) parent-id (get-in objects [parent-id :frame-id])))]
|
([parent-id objects children pasting? libraries]
|
||||||
(let [parent (get objects parent-id)
|
(letfn [(get-frame [parent-id]
|
||||||
|
(if (cfh/frame-shape? objects parent-id) parent-id (get-in objects [parent-id :frame-id])))]
|
||||||
|
(let [parent (get objects parent-id)
|
||||||
;; We can always move the children to the parent they already have
|
;; We can always move the children to the parent they already have
|
||||||
no-changes?
|
no-changes?
|
||||||
(->> children (every? #(= parent-id (:parent-id %))))]
|
(->> children (every? #(= parent-id (:parent-id %))))]
|
||||||
(if (or no-changes? (not (invalid-structure-for-component? objects parent children)))
|
(if (or no-changes? (not (invalid-structure-for-component? objects parent children pasting? libraries)))
|
||||||
[parent-id (get-frame parent-id)]
|
[parent-id (get-frame parent-id)]
|
||||||
(recur (:parent-id parent) objects children)))))
|
(recur (:parent-id parent) objects children pasting? libraries))))))
|
||||||
|
|
|
@ -1967,8 +1967,13 @@
|
||||||
|
|
||||||
page-objects (:objects page)
|
page-objects (:objects page)
|
||||||
|
|
||||||
|
libraries (wsh/get-libraries state)
|
||||||
|
ldata (wsh/get-local-file state)
|
||||||
|
|
||||||
|
full-libs (assoc-in libraries [(:id ldata) :data] ldata)
|
||||||
|
|
||||||
[parent-id
|
[parent-id
|
||||||
frame-id] (ctn/find-valid-parent-and-frame-ids candidate-parent-id page-objects (vals objects))
|
frame-id] (ctn/find-valid-parent-and-frame-ids candidate-parent-id page-objects (vals objects) true full-libs)
|
||||||
|
|
||||||
index (if (= candidate-parent-id parent-id)
|
index (if (= candidate-parent-id parent-id)
|
||||||
index
|
index
|
||||||
|
@ -1978,8 +1983,7 @@
|
||||||
|
|
||||||
all-objects (merge page-objects objects)
|
all-objects (merge page-objects objects)
|
||||||
|
|
||||||
libraries (wsh/get-libraries state)
|
|
||||||
ldata (wsh/get-file state file-id)
|
|
||||||
|
|
||||||
drop-cell (when (ctl/grid-layout? all-objects parent-id)
|
drop-cell (when (ctl/grid-layout? all-objects parent-id)
|
||||||
(gslg/get-drop-cell frame-id all-objects position))
|
(gslg/get-drop-cell frame-id all-objects position))
|
||||||
|
|
Loading…
Add table
Reference in a new issue