From 0dca0473397c28349ac653e1bc5ef98cbd20b05c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Moya?= Date: Tue, 3 Sep 2024 14:20:55 +0200 Subject: [PATCH] fix token update --- common/src/app/common/data.cljc | 35 ++++++++++++ common/src/app/common/files/changes.cljc | 7 +-- .../src/app/common/files/changes_builder.cljc | 6 +-- common/src/app/common/types/tokens_lib.cljc | 30 +++++------ .../common_tests/types/tokens_lib_test.cljc | 53 ++++++++++++++++--- frontend/src/app/main/data/tokens.cljs | 3 +- 6 files changed, 104 insertions(+), 30 deletions(-) diff --git a/common/src/app/common/data.cljc b/common/src/app/common/data.cljc index c0086b73c..77e9af51b 100644 --- a/common/src/app/common/data.cljc +++ b/common/src/app/common/data.cljc @@ -564,6 +564,41 @@ new-elems (remove p? after)))) +(defn addm-at-index + "Insert an element in an ordered map at an arbitrary index" + [coll index key element] + (assert (ordered-map? coll)) + (-> (ordered-map) + (into (take index coll)) + (assoc key element) + (into (drop index coll)))) + +(defn insertm-at-index + "Insert a map {k v} of elements in an ordered map at an arbitrary index" + [coll index new-elems] + (assert (ordered-map? coll)) + (-> (ordered-map) + (into (take index coll)) + (into new-elems) + (into (drop index coll)))) + +(defn adds-at-index + "Insert an element in an ordered set at an arbitrary index" + [coll index element] + (assert (ordered-set? coll)) + (-> (ordered-set) + (into (take index coll)) + (conj element) + (into (drop index coll)))) + +(defn inserts-at-index + "Insert a list of elements in an ordered set at an arbitrary index" + [coll index new-elems] + (assert (ordered-set? coll)) + (-> (ordered-set) + (into (take index coll)) + (into new-elems) + (into (drop index coll)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Data Parsing / Conversion diff --git a/common/src/app/common/files/changes.cljc b/common/src/app/common/files/changes.cljc index dacaf7f09..ae9b6362f 100644 --- a/common/src/app/common/files/changes.cljc +++ b/common/src/app/common/files/changes.cljc @@ -312,6 +312,7 @@ [:set-id ::sm/uuid] [:set-name :string] [:id ::sm/uuid] + [:name :string] [:token ::cto/token]]] [:del-token @@ -798,15 +799,15 @@ (ctob/add-token-in-set set-name (ctob/make-token token)))))) (defmethod process-change :mod-token - [data {:keys [set-id set-name id token]}] + [data {:keys [set-name id name token]}] (-> data - (ctol/update-token data set-id id merge token) + (ctol/update-token id merge token) (update :tokens-lib #(-> % (ctob/ensure-tokens-lib) (ctob/update-token-in-set set-name - (:name token) + name (fn [old-token] (ctob/make-token (merge old-token token)))))))) diff --git a/common/src/app/common/files/changes_builder.cljc b/common/src/app/common/files/changes_builder.cljc index c0b64107c..09148d542 100644 --- a/common/src/app/common/files/changes_builder.cljc +++ b/common/src/app/common/files/changes_builder.cljc @@ -765,10 +765,10 @@ (apply-changes-local))) (defn update-token - [changes set-id set-name {:keys [id] :as token} prev-token] + [changes set-id set-name {:keys [id name] :as token} {prev-name :name :as prev-token}] (-> changes - (update :redo-changes conj {:type :mod-token :set-id set-id :set-name set-name :id id :token token}) - (update :undo-changes conj {:type :mod-token :set-id set-id :set-name set-name :id id :token (or prev-token token)}) + (update :redo-changes conj {:type :mod-token :set-id set-id :set-name set-name :id id :name prev-name :token token}) + (update :undo-changes conj {:type :mod-token :set-id set-id :set-name set-name :id id :name name :token (or prev-token token)}) (apply-changes-local))) (defn delete-token diff --git a/common/src/app/common/types/tokens_lib.cljc b/common/src/app/common/types/tokens_lib.cljc index 55fb52a51..7e34404c4 100644 --- a/common/src/app/common/types/tokens_lib.cljc +++ b/common/src/app/common/types/tokens_lib.cljc @@ -75,13 +75,13 @@ (TokenSet. name description (dt/now) - (cond-> tokens - (not= (:name token) (:name token')) - (dissoc (:name token)) - - :always ; TODO: if token is renamed, - (assoc (:name token') token')))) ; it sould remain in - this)) ; the same position + (if (= (:name token) (:name token')) + (assoc tokens (:name token') token') + (let [index (d/index-of (keys tokens) (:name token))] + (-> tokens + (dissoc (:name token)) + (d/addm-at-index index (:name token') token')))))) + this)) (delete-token [_ token-name] (TokenSet. name @@ -180,13 +180,13 @@ (let [set' (-> (make-token-set (f set)) (assoc :modified-at (dt/now)))] (check-token-set! set') - (TokensLib. (cond-> sets - (not= (:name set) (:name set')) - (dissoc (:name set)) - - :always ; TODO: if set is renamed, - (assoc (:name set') set')) ; it sould remain in - themes)) ; the same position + (TokensLib. (if (= (:name set) (:name set')) + (assoc sets (:name set') set') + (let [index (d/index-of (keys sets) (:name set))] + (-> sets + (dissoc (:name set)) + (d/addm-at-index index (:name set') set')))) + themes)) this)) (delete-set [_ set-name] @@ -220,7 +220,7 @@ #(update-token % token-name f)) themes) this)) - + (delete-token-from-set [this set-name token-name] (if (contains? sets set-name) (TokensLib. (update sets set-name diff --git a/common/test/common_tests/types/tokens_lib_test.cljc b/common/test/common_tests/types/tokens_lib_test.cljc index a57d10e5f..09ad19b17 100644 --- a/common/test/common_tests/types/tokens_lib_test.cljc +++ b/common/test/common_tests/types/tokens_lib_test.cljc @@ -6,6 +6,7 @@ (ns common-tests.types.tokens-lib-test (:require + [app.common.data :as d] [app.common.fressian :as fres] [app.common.time :as dt] [app.common.transit :as tr] @@ -143,18 +144,21 @@ (let [tokens-lib (-> (ctob/make-tokens-lib) (ctob/add-set (ctob/make-token-set :name "test-token-set")) (ctob/add-token-in-set "test-token-set" - (ctob/make-token :name "test-token" + (ctob/make-token :name "test-token-1" + :type :boolean + :value true)) + (ctob/add-token-in-set "test-token-set" + (ctob/make-token :name "test-token-2" :type :boolean :value true))) tokens-lib' (-> tokens-lib - (ctob/update-token-in-set "test-token-set" "test-token" + (ctob/update-token-in-set "test-token-set" "test-token-1" (fn [token] (assoc token - :name "updated-name" :description "some description" :value false))) - (ctob/update-token-in-set "not-existing-set" "test-token" + (ctob/update-token-in-set "not-existing-set" "test-token-1" (fn [token] (assoc token :name "no-effect"))) @@ -165,14 +169,47 @@ token-set (ctob/get-set tokens-lib "test-token-set") token-set' (ctob/get-set tokens-lib' "test-token-set") - token (get-in token-set [:tokens "test-token"]) + token (get-in token-set [:tokens "test-token-1"]) + token' (get-in token-set' [:tokens "test-token-1"])] + + (t/is (= (ctob/set-count tokens-lib') 1)) + (t/is (= (count (:tokens token-set')) 2)) + (t/is (= (d/index-of (keys (:tokens token-set')) "test-token-1") 0)) + (t/is (= (:name token') "test-token-1")) + (t/is (= (:description token') "some description")) + (t/is (= (:value token') false)) + (t/is (dt/is-after? (:modified-at token-set') (:modified-at token-set))) + (t/is (dt/is-after? (:modified-at token') (:modified-at token))))) + +(t/deftest rename-token + (let [tokens-lib (-> (ctob/make-tokens-lib) + (ctob/add-set (ctob/make-token-set :name "test-token-set")) + (ctob/add-token-in-set "test-token-set" + (ctob/make-token :name "test-token-1" + :type :boolean + :value true)) + (ctob/add-token-in-set "test-token-set" + (ctob/make-token :name "test-token-2" + :type :boolean + :value true))) + + tokens-lib' (-> tokens-lib + (ctob/update-token-in-set "test-token-set" "test-token-1" + (fn [token] + (assoc token + :name "updated-name")))) + + token-set (ctob/get-set tokens-lib "test-token-set") + token-set' (ctob/get-set tokens-lib' "test-token-set") + token (get-in token-set [:tokens "test-token-1"]) token' (get-in token-set' [:tokens "updated-name"])] (t/is (= (ctob/set-count tokens-lib') 1)) - (t/is (= (count (:tokens token-set')) 1)) + (t/is (= (count (:tokens token-set')) 2)) + (t/is (= (d/index-of (keys (:tokens token-set')) "updated-name") 0)) (t/is (= (:name token') "updated-name")) - (t/is (= (:description token') "some description")) - (t/is (= (:value token') false)) + (t/is (= (:description token') nil)) + (t/is (= (:value token') true)) (t/is (dt/is-after? (:modified-at token-set') (:modified-at token-set))) (t/is (dt/is-after? (:modified-at token') (:modified-at token))))) diff --git a/frontend/src/app/main/data/tokens.cljs b/frontend/src/app/main/data/tokens.cljs index 637b899b2..24145f6c9 100644 --- a/frontend/src/app/main/data/tokens.cljs +++ b/frontend/src/app/main/data/tokens.cljs @@ -234,7 +234,8 @@ create-set? (pcb/add-token-set token-set)) - prev-token (d/seek #(= (:id %) (:id token)) (:tokens token-set)) ; TODO + prev-token-id (d/seek #(= % (:id token)) (:tokens token-set)) + prev-token (get-token-data-from-token-id prev-token-id) create-token? (not prev-token) changes (if create-token?