From 4b9ac6f1e559bdffcf7889a3be2b966be8960c44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Moya?= Date: Wed, 27 Jan 2021 16:08:46 +0100 Subject: [PATCH] :bug: Fix when trying to relocate a shape and their children --- common/app/common/pages.cljc | 1 + common/app/common/pages/helpers.cljc | 14 ++++++++++++++ frontend/src/app/main/data/workspace.cljs | 4 ++++ frontend/src/app/main/data/workspace/groups.cljs | 16 +--------------- .../ui/workspace/sidebar/options/multiple.cljs | 3 ++- 5 files changed, 22 insertions(+), 16 deletions(-) diff --git a/common/app/common/pages.cljc b/common/app/common/pages.cljc index f295c4e76..1332a7c08 100644 --- a/common/app/common/pages.cljc +++ b/common/app/common/pages.cljc @@ -46,6 +46,7 @@ (d/export helpers/get-parent) (d/export helpers/get-parents) (d/export helpers/generate-child-parent-index) +(d/export helpers/clean-loops) (d/export helpers/calculate-invalid-targets) (d/export helpers/valid-frame-target) (d/export helpers/position-on-parent) diff --git a/common/app/common/pages/helpers.cljc b/common/app/common/pages/helpers.cljc index b43429eb8..8957dbe0f 100644 --- a/common/app/common/pages/helpers.cljc +++ b/common/app/common/pages/helpers.cljc @@ -169,6 +169,20 @@ (assoc index id (:parent-id obj))) {} objects)) +(defn clean-loops + "Clean a list of ids from circular references." + [objects ids] + (loop [ids ids + id (first ids) + others (rest ids)] + (if-not id + ids + (recur (cond-> ids + (some #(contains? ids %) (get-parents id objects)) + (disj id)) + (first others) + (rest others))))) + (defn calculate-invalid-targets [shape-id objects] (let [result #{shape-id} diff --git a/frontend/src/app/main/data/workspace.cljs b/frontend/src/app/main/data/workspace.cljs index a6e5ea64d..d11001cc0 100644 --- a/frontend/src/app/main/data/workspace.cljs +++ b/frontend/src/app/main/data/workspace.cljs @@ -816,6 +816,10 @@ (watch [_ state stream] (let [page-id (:current-page-id state) objects (dwc/lookup-page-objects state page-id) + + ;; Ignore any shape whose parent is also intented to be moved + ids (cp/clean-loops objects ids) + parents (loop [res #{parent-id} ids (seq ids)] (if (nil? ids) diff --git a/frontend/src/app/main/data/workspace/groups.cljs b/frontend/src/app/main/data/workspace/groups.cljs index 4924d8e69..bf930e16d 100644 --- a/frontend/src/app/main/data/workspace/groups.cljs +++ b/frontend/src/app/main/data/workspace/groups.cljs @@ -95,20 +95,6 @@ ;; GROUPS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(defn- clean-selected - "A helper that cleans selected from circular references." - [objects selected] - (loop [selected selected - id (first selected) - items (rest selected)] - (if-not id - selected - (recur (cond-> selected - (some #(contains? selected %) (cp/get-parents id objects)) - (disj id)) - (first items) - (rest items))))) - (def group-selected (ptk/reify ::group-selected ptk/WatchEvent @@ -116,7 +102,7 @@ (let [page-id (:current-page-id state) objects (dwc/lookup-page-objects state page-id) selected (get-in state [:workspace-local :selected]) - selected (clean-selected objects selected) + selected (cp/clean-loops objects selected) shapes (shapes-for-grouping objects selected)] (when-not (empty? shapes) (let [[group rchanges uchanges] (prepare-create-group page-id shapes "Group-" false)] diff --git a/frontend/src/app/main/ui/workspace/sidebar/options/multiple.cljs b/frontend/src/app/main/ui/workspace/sidebar/options/multiple.cljs index ca7c0eaf3..ec223fcc5 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/options/multiple.cljs +++ b/frontend/src/app/main/ui/workspace/sidebar/options/multiple.cljs @@ -148,7 +148,8 @@ (merge-attrs (select-keys shape attrs)) (merge-attrs (ut/get-text-attrs-multi content attrs)))] :children (let [children (->> (:shapes shape []) (map #(get objects %)))] - (get-attrs children objects attr-type)))] + (get-attrs children objects attr-type)) + [])] result))] (reduce extract-attrs [[] []] shapes)))