From b98f693959fec867619f6d94e007f521663dc01d Mon Sep 17 00:00:00 2001 From: Pablo Alba Date: Mon, 13 Nov 2023 14:15:59 +0100 Subject: [PATCH] :bug: Fix when a component annotation is changed on a library, update dialog appears --- common/src/app/common/types/component.cljc | 20 +++++++++ .../src/app/common/types/components_list.cljc | 43 +++++++++++-------- 2 files changed, 44 insertions(+), 19 deletions(-) diff --git a/common/src/app/common/types/component.cljc b/common/src/app/common/types/component.cljc index 319d4fd00..ae580a0d9 100644 --- a/common/src/app/common/types/component.cljc +++ b/common/src/app/common/types/component.cljc @@ -177,3 +177,23 @@ :remote-synced :shape-ref :touched)) + + +(defn- extract-ids [shape] + (if (map? shape) + (let [current-id (:id shape) + child-ids (mapcat extract-ids (:children shape))] + (cons current-id child-ids)) + [])) + +(defn diff-components + "Compare two components, and return a set of the keys with different values" + [comp1 comp2] + (let [eq (fn [key val1 val2] + (if (= key :objects) + (= (extract-ids val1) (extract-ids val2)) + (= val1 val2)))] + (->> (concat (keys comp1) (keys comp2)) + (distinct) + (filter #(not (eq % (get comp1 %) (get comp2 %)))) + set))) diff --git a/common/src/app/common/types/components_list.cljc b/common/src/app/common/types/components_list.cljc index d3eab792a..916450e43 100644 --- a/common/src/app/common/types/components_list.cljc +++ b/common/src/app/common/types/components_list.cljc @@ -10,7 +10,8 @@ [app.common.data.macros :as dm] [app.common.features :as cfeat] [app.common.time :as dt] - [app.common.types.component :as ctk])) + [app.common.types.component :as ctk] + [clojure.set :as set])) (defn components ([file-data] (components file-data nil)) @@ -51,31 +52,35 @@ (let [wrap-objects-fn cfeat/*wrap-with-objects-map-fn*] (d/update-in-when file-data [:components id] (fn [component] - (let [objects (some-> objects wrap-objects-fn)] - (cond-> component - (some? name) - (assoc :name name) + (let [objects (some-> objects wrap-objects-fn) + new-comp (cond-> component + (some? name) + (assoc :name name) - (some? path) - (assoc :path path) + (some? path) + (assoc :path path) - (some? main-instance-id) - (assoc :main-instance-id main-instance-id) + (some? main-instance-id) + (assoc :main-instance-id main-instance-id) - (some? main-instance-page) - (assoc :main-instance-page main-instance-page) + (some? main-instance-page) + (assoc :main-instance-page main-instance-page) - (some? objects) - (assoc :objects objects) + (some? objects) + (assoc :objects objects) - (some? annotation) - (assoc :annotation annotation) + (some? annotation) + (assoc :annotation annotation) - (nil? annotation) - (dissoc :annotation) + (nil? annotation) + (dissoc :annotation)) + diff (set/difference + (ctk/diff-components component new-comp) + #{:annotation})] ;; The set of properties that doesn't mark a component as touched - :always - (touch))))))) + (if (empty? diff) + new-comp + (touch new-comp))))))) (defn get-component ([file-data component-id]