diff --git a/common/src/app/common/types/file.cljc b/common/src/app/common/types/file.cljc index 98e8fbae0..5d8b8cd1c 100644 --- a/common/src/app/common/types/file.cljc +++ b/common/src/app/common/types/file.cljc @@ -204,7 +204,7 @@ (defn find-ref-shape "Locate the nearest component in the local file or libraries, and retrieve the shape referenced by the instance shape." - [file page libraries shape & {:keys [include-deleted? with-context?] :or {include-deleted? false with-context? false}}] + [file container libraries shape & {:keys [include-deleted? with-context?] :or {include-deleted? false with-context? false}}] (let [find-ref-shape-in-head (fn [head-shape] (let [component-file (find-component-file file libraries (:component-file head-shape)) @@ -213,7 +213,7 @@ (when (some? component) (get-ref-shape (:data component-file) component shape :with-context? with-context?))))] - (some find-ref-shape-in-head (ctn/get-parent-heads (:objects page) shape)))) + (some find-ref-shape-in-head (ctn/get-parent-heads (:objects container) shape)))) (defn find-ref-component "Locate the nearest component in the local file or libraries that is referenced by the @@ -265,14 +265,13 @@ (true? (= (:id component) (:id ref-component))))) (defn find-swap-slot - [shape page file libraries] - (dm/assert! "expected shape is head" (ctk/instance-head? shape)) + [shape container file libraries] ;; (js/console.log "find-swap-slot" (clj->js shape)) (if-let [swap-slot (ctk/get-swap-slot shape)] ;; (do (js/console.log "uno" (str swap-slot)) swap-slot) swap-slot (let [ref-shape (find-ref-shape file - page + container libraries shape :include-deleted? true @@ -292,11 +291,12 @@ (find-swap-slot ref-shape ref-container ref-file libraries))))))) (defn match-swap-slot? - [shape-main shape-inst page-inst page-main file libraries] - (let [slot-main (find-swap-slot shape-main page-main file libraries) - slot-inst (find-swap-slot shape-inst page-inst file libraries)] - (or (= slot-main slot-inst) - (= (:id shape-main) slot-inst)))) + [shape-main shape-inst container-inst container-main file libraries] + (let [slot-main (find-swap-slot shape-main container-main file libraries) + slot-inst (find-swap-slot shape-inst container-inst file libraries)] + (when (some? slot-inst) + (or (= slot-main slot-inst) + (= (:id shape-main) slot-inst))))) (defn get-component-shapes "Retrieve all shapes of the component" diff --git a/frontend/src/app/main/data/workspace/libraries.cljs b/frontend/src/app/main/data/workspace/libraries.cljs index e174df3e7..c197e19ab 100644 --- a/frontend/src/app/main/data/workspace/libraries.cljs +++ b/frontend/src/app/main/data/workspace/libraries.cljs @@ -699,6 +699,7 @@ (watch [it state _] (log/info :msg "RESET-COMPONENT of shape" :id (str id)) (let [file (wsh/get-local-file state) + file-full (wsh/get-local-file-full state) libraries (wsh/get-libraries state) page-id (:current-page-id state) @@ -711,7 +712,7 @@ (-> (pcb/empty-changes it) (pcb/with-container container) (pcb/with-objects (:objects container)) - (dwlh/generate-sync-shape-direct libraries container id true components-v2))] + (dwlh/generate-sync-shape-direct file-full libraries container id true components-v2))] (log/debug :msg "RESET-COMPONENT finished" :js/rchanges (log-changes (:redo-changes changes) @@ -750,6 +751,7 @@ (log/info :msg "UPDATE-COMPONENT of shape" :id (str id) :undo-group undo-group) (let [page-id (get state :current-page-id) local-file (wsh/get-local-file state) + full-file (wsh/get-local-file-full state) container (cfh/get-container local-file :page page-id) shape (ctn/get-shape container id) components-v2 (features/active-feature? state "components/v2")] @@ -761,7 +763,7 @@ (-> (pcb/empty-changes it) (pcb/set-undo-group undo-group) (pcb/with-container container) - (dwlh/generate-sync-shape-inverse libraries container id components-v2)) + (dwlh/generate-sync-shape-inverse full-file libraries container id components-v2)) file-id (:component-file shape) file (wsh/get-file state file-id) diff --git a/frontend/src/app/main/data/workspace/libraries_helpers.cljs b/frontend/src/app/main/data/workspace/libraries_helpers.cljs index 8864214a6..97a0ac73f 100644 --- a/frontend/src/app/main/data/workspace/libraries_helpers.cljs +++ b/frontend/src/app/main/data/workspace/libraries_helpers.cljs @@ -425,8 +425,9 @@ (defmethod generate-sync-shape :components [_ changes _library-id state container shape components-v2] (let [shape-id (:id shape) + file (wsh/get-local-file-full state) libraries (wsh/get-libraries state)] - (generate-sync-shape-direct changes libraries container shape-id false components-v2))) + (generate-sync-shape-direct changes file libraries container shape-id false components-v2))) (defmethod generate-sync-shape :colors [_ changes library-id state _ shape _] @@ -594,7 +595,7 @@ (defn generate-sync-shape-direct "Generate changes to synchronize one shape that is the root of a component instance, and all its children, from the given component." - [changes libraries container shape-id reset? components-v2] + [changes file libraries container shape-id reset? components-v2] (log/debug :msg "Sync shape direct" :shape-inst (str shape-id) :reset? reset?) (let [shape-inst (ctn/get-shape container shape-id) library (dm/get-in libraries [(:component-file shape-inst) :data]) @@ -623,6 +624,8 @@ shape-inst component library + file + libraries shape-main root-inst root-main @@ -655,7 +658,7 @@ nil)))))) (defn- generate-sync-shape-direct-recursive - [changes container shape-inst component library shape-main root-inst root-main reset? initial-root? redirect-shaperef components-v2] + [changes container shape-inst component library file libraries shape-main root-inst root-main reset? initial-root? redirect-shaperef components-v2] (log/debug :msg "Sync shape direct recursive" :shape-inst (str (:name shape-inst) " " (pretty-uuid (:id shape-inst))) :component (:name component)) @@ -752,6 +755,8 @@ child-inst component library + file + libraries child-main root-inst root-main @@ -782,6 +787,10 @@ (compare-children changes children-inst children-main + container + component-container + file + libraries only-inst only-main both @@ -812,7 +821,7 @@ (defn generate-sync-shape-inverse "Generate changes to update the component a shape is linked to, from the values in the shape and all its children." - [changes libraries container shape-id components-v2] + [changes file libraries container shape-id components-v2] (log/debug :msg "Sync shape inverse" :shape (str shape-id)) (let [redirect-shaperef (partial redirect-shaperef container libraries) shape-inst (ctn/get-shape container shape-id) @@ -843,6 +852,8 @@ shape-inst component library + file + libraries shape-main root-inst root-main @@ -852,7 +863,7 @@ changes))) (defn- generate-sync-shape-inverse-recursive - [changes container shape-inst component library shape-main root-inst root-main initial-root? redirect-shaperef components-v2] + [changes container shape-inst component library file libraries shape-main root-inst root-main initial-root? redirect-shaperef components-v2] (log/trace :msg "Sync shape inverse recursive" :shape (str (:name shape-inst)) :component (:name component)) @@ -935,6 +946,8 @@ child-inst component library + file + libraries child-main root-inst root-main @@ -962,6 +975,10 @@ (compare-children changes children-inst children-main + container + component-container + file + libraries only-inst only-main both @@ -986,7 +1003,7 @@ ;; ---- Operation generation helpers ---- (defn- compare-children - [changes children-inst children-main only-inst-cb only-main-cb both-cb swapped-cb moved-cb inverse? reset?] + [changes children-inst children-main container-inst container-main file libraries only-inst-cb only-main-cb both-cb swapped-cb moved-cb inverse? reset?] (log/trace :msg "Compare children") (loop [children-inst (seq (or children-inst [])) children-main (seq (or children-main [])) @@ -1007,7 +1024,7 @@ :else (if (or (ctk/is-main-of? child-main child-inst) - (ctk/match-swap-slot? child-main child-inst)) + (ctf/match-swap-slot? child-main child-inst container-inst container-main file libraries)) (recur (next children-inst) (next children-main) (if (or (ctk/is-main-of? child-main child-inst) reset?) @@ -1015,10 +1032,10 @@ (swapped-cb changes child-inst child-main))) (let [child-inst' (d/seek #(or (ctk/is-main-of? child-main %) - (ctk/match-swap-slot? child-main %)) + (ctf/match-swap-slot? child-main % container-inst container-main file libraries)) children-inst) child-main' (d/seek #(or (ctk/is-main-of? % child-inst) - (ctk/match-swap-slot? % child-inst)) + (ctf/match-swap-slot? % child-inst container-inst container-main file libraries)) children-main)] (cond (nil? child-inst') diff --git a/frontend/src/app/main/data/workspace/state_helpers.cljs b/frontend/src/app/main/data/workspace/state_helpers.cljs index c33f62d18..b04fa88f6 100644 --- a/frontend/src/app/main/data/workspace/state_helpers.cljs +++ b/frontend/src/app/main/data/workspace/state_helpers.cljs @@ -110,6 +110,11 @@ [state] (get state :workspace-data)) +(defn get-local-file-full + [state] + (-> (get state :workspace-file) + (assoc :data (get state :workspace-data)))) + (defn get-file "Get the data content of the given file (it may be the current file or one library)."