diff --git a/backend/tests/uxbox/tests/test_common_pages.clj b/backend/tests/uxbox/tests/test_common_pages.clj index 8866a6ab9..05161dbf7 100644 --- a/backend/tests/uxbox/tests/test_common_pages.clj +++ b/backend/tests/uxbox/tests/test_common_pages.clj @@ -54,14 +54,25 @@ (t/is (= [id-b id-c id-a] (get-in res [:objects uuid/zero :shapes]))))))) (t/deftest process-change-mod-obj - (let [data cp/default-page-data - chg {:type :mod-obj - :id uuid/zero - :operations [{:type :set - :attr :name - :val "foobar"}]} - res (cp/process-changes data [chg])] - (t/is (= "foobar" (get-in res [:objects uuid/zero :name]))))) + (t/testing "simple mod-obj" + (let [data cp/default-page-data + chg {:type :mod-obj + :id uuid/zero + :operations [{:type :set + :attr :name + :val "foobar"}]} + res (cp/process-changes data [chg])] + (t/is (= "foobar" (get-in res [:objects uuid/zero :name]))))) + + (t/testing "mod-obj for not existing shape" + (let [data cp/default-page-data + chg {:type :mod-obj + :id (uuid/next) + :operations [{:type :set + :attr :name + :val "foobar"}]} + res (cp/process-changes data [chg])] + (t/is (= res cp/default-page-data))))) (t/deftest process-change-del-obj-1 diff --git a/common/uxbox/common/pages.cljc b/common/uxbox/common/pages.cljc index 63537b292..cd0d0d8a4 100644 --- a/common/uxbox/common/pages.cljc +++ b/common/uxbox/common/pages.cljc @@ -194,30 +194,40 @@ (defn process-changes [data items] (->> (us/verify ::changes items) - (reduce #(or (process-change %1 %2) %1) data))) + (reduce #(do + ;; (prn "process-change" (:type %2) (:id %2)) + (or (process-change %1 %2) %1)) + data))) (declare insert-at-index) (defmethod process-change :add-obj - [data {:keys [id obj frame-id index] :as change}] - (assert (contains? (:objects data) frame-id) "process-change/add-obj") - (let [obj (assoc obj + [data {:keys [id obj frame-id parent-id index] :as change}] + (let [parent-id (or parent-id frame-id) + objects (:objects data)] + (when (and (contains? objects parent-id) + (contains? objects frame-id)) + (let [obj (assoc obj :frame-id frame-id + :parent-id parent-id :id id)] - (-> data - (update :objects assoc id obj) - (update-in [:objects frame-id :shapes] - (fn [shapes] - (cond - (some #{id} shapes) shapes - (nil? index) (conj shapes id) - :else (insert-at-index shapes index [id]))))))) + (-> data + (update :objects assoc id obj) + (update-in [:objects parent-id :shapes] + (fn [shapes] + (cond + (some #{id} shapes) shapes + (nil? index) (conj shapes id) + :else (insert-at-index shapes index [id]))))))))) (defmethod process-change :mod-obj [data {:keys [id operations] :as change}] (assert (contains? (:objects data) id) "process-change/mod-obj") - (update-in data [:objects id] - #(reduce process-operation % operations))) + (update data :objects + (fn [objects] + (if-let [obj (get objects id)] + (assoc objects id (reduce process-operation obj operations)) + objects)))) (defmethod process-change :mov-obj [data {:keys [id frame-id] :as change}]