diff --git a/common/src/app/common/files/changes.cljc b/common/src/app/common/files/changes.cljc index 1e9d5d039a..612f040cf7 100644 --- a/common/src/app/common/files/changes.cljc +++ b/common/src/app/common/files/changes.cljc @@ -425,7 +425,7 @@ [:map {:title "SetTokenChange"} [:type [:= :set-token]] [:set-name :string] - [:token-name :string] + [:token-id ::sm/uuid] [:token [:maybe ctob/schema:token-attrs]]]] [:set-base-font-size @@ -1001,20 +1001,20 @@ (assoc data :tokens-lib tokens-lib)) (defmethod process-change :set-token - [data {:keys [set-name token-name token]}] + [data {:keys [set-name token-id token]}] (update data :tokens-lib (fn [lib] (let [lib' (ctob/ensure-tokens-lib lib)] (cond (not token) - (ctob/delete-token-from-set lib' set-name token-name) + (ctob/delete-token-from-set lib' set-name token-id) - (not (ctob/get-token-in-set lib' set-name token-name)) + (not (ctob/get-token-in-set lib' set-name token-id)) (ctob/add-token-in-set lib' set-name (ctob/make-token token)) :else - (ctob/update-token-in-set lib' set-name token-name (fn [prev-token] - (ctob/make-token (merge prev-token token))))))))) + (ctob/update-token-in-set lib' set-name token-id (fn [prev-token] + (ctob/make-token (merge prev-token token))))))))) (defmethod process-change :set-token-set [data {:keys [set-name group? token-set]}] diff --git a/common/src/app/common/files/changes_builder.cljc b/common/src/app/common/files/changes_builder.cljc index 35f95a78fe..eab1df7f5b 100644 --- a/common/src/app/common/files/changes_builder.cljc +++ b/common/src/app/common/files/changes_builder.cljc @@ -881,30 +881,30 @@ (update :undo-changes conj {:type :set-tokens-lib :tokens-lib prev-tokens-lib}) (apply-changes-local)))) -(defn set-token [changes set-name token-name token] +(defn set-token [changes set-name token-id token] (assert-library! changes) (let [library-data (::library-data (meta changes)) prev-token (some-> (get library-data :tokens-lib) (ctob/get-set set-name) - (ctob/get-token token-name))] + (ctob/get-token token-id))] (-> changes (update :redo-changes conj {:type :set-token :set-name set-name - :token-name token-name + :token-id token-id :token token}) (update :undo-changes conj (if prev-token {:type :set-token :set-name set-name - :token-name (or + :token-id (or ;; Undo of edit - (:name token) + (:id token) ;; Undo of delete - token-name) + token-id) :token prev-token} ;; Undo of create token {:type :set-token :set-name set-name - :token-name token-name + :token-id token-id :token nil})) (apply-changes-local)))) diff --git a/common/src/app/common/test_helpers/tokens.cljc b/common/src/app/common/test_helpers/tokens.cljc index 8254263abe..cf23a805ff 100644 --- a/common/src/app/common/test_helpers/tokens.cljc +++ b/common/src/app/common/test_helpers/tokens.cljc @@ -28,12 +28,12 @@ (ctf/update-file-data file #(update % :tokens-lib f))) (defn get-token - [file set-name token-name] + [file set-name token-id] (let [tokens-lib (:tokens-lib (:data file))] (when tokens-lib (-> tokens-lib (ctob/get-set set-name) - (ctob/get-token token-name))))) + (ctob/get-token token-id))))) (defn token-data-eq? "Compare token data without comparing unstable fields." diff --git a/common/src/app/common/types/tokens_lib.cljc b/common/src/app/common/types/tokens_lib.cljc index 8073e5b0b1..9f2dd2afee 100644 --- a/common/src/app/common/types/tokens_lib.cljc +++ b/common/src/app/common/types/tokens_lib.cljc @@ -160,10 +160,12 @@ ;; === Token Set (defprotocol ITokenSet + (token-by-id [_ id] "get a token by its id") + (token-by-name [_ id] "get a token by its name") (add-token [_ token] "add a token at the end of the list") - (update-token [_ token-name f] "update a token in the list") - (delete-token [_ token-name] "delete a token from the list") - (get-token [_ token-name] "return token by token-name") + (update-token [_ id f] "update a token in the list") + (delete-token [_ id] "delete a token from the list") + (get-token [_ id] "return token by id") (get-tokens [_] "return an ordered sequence of all tokens in the set") (get-tokens-map [_] "return a map of tokens in the set, indexed by token-name")) @@ -217,6 +219,13 @@ tokens)) ITokenSet + (token-by-id [_ id] + (some #(when (= (:id %) id) %) ;; TODO: this will be made in an efficient way when + (vals tokens))) ;; we refactor the tokens lib internal structure + + (token-by-name [_ name] + (get tokens name)) + (add-token [_ token] (let [token (check-token token)] (TokenSet. id @@ -225,8 +234,8 @@ (dt/now) (assoc tokens (:name token) token)))) - (update-token [this token-name f] - (if-let [token (get tokens token-name)] + (update-token [this id f] + (if-let [token (token-by-id this id)] (let [token' (-> (make-token (f token)) (assoc :modified-at (dt/now)))] (TokenSet. id @@ -240,15 +249,16 @@ (dissoc (:name token)))))) this)) - (delete-token [_ token-name] - (TokenSet. id - name - description - (dt/now) - (dissoc tokens token-name))) + (delete-token [this id] + (let [token (token-by-id this id)] + (TokenSet. id + name + description + (dt/now) + (dissoc tokens (:name token))))) - (get-token [_ token-name] - (get tokens token-name)) + (get-token [this id] + (token-by-id this id)) (get-tokens [_] (vals tokens)) @@ -802,9 +812,10 @@ (set-path-exists? [_ path] "if a set at `path` exists") (set-group-path-exists? [_ path] "if a set group at `path` exists") (add-token-in-set [_ set-name token] "add token to a set") - (get-token-in-set [_ set-name token-name] "get token in a set") - (update-token-in-set [_ set-name token-name f] "update a token in a set") - (delete-token-from-set [_ set-name token-name] "delete a token from a set") + (get-token-in-set [_ set-name token-id] "get token in a set") + (get-token-by-name [_ set-name token-name] "get token in a set searching by token name") + (update-token-in-set [_ set-name token-id f] "update a token in a set") + (delete-token-from-set [_ set-name token-id] "delete a token from a set") (toggle-set-in-theme [_ group-name theme-name set-name] "toggle a set used / not used in a theme") (get-active-themes-set-names [_] "set of set names that are active in the the active themes") (sets-at-path-all-active? [_ group-path] "compute active state for child sets at `group-path`. @@ -1151,16 +1162,21 @@ Will return a value that matches this schema: (add-token-in-set [this set-name token] (update-set this set-name #(add-token % token))) - (get-token-in-set [this set-name token-name] + (get-token-in-set [this set-name token-id] (some-> this (get-set set-name) - (get-token token-name))) + (get-token token-id))) - (update-token-in-set [this set-name token-name f] - (update-set this set-name #(update-token % token-name f))) + (get-token-by-name [this set-name token-name] + (some-> this + (get-set set-name) + (token-by-name token-name))) - (delete-token-from-set [this set-name token-name] - (update-set this set-name #(delete-token % token-name))) + (update-token-in-set [this set-name token-id f] + (update-set this set-name #(update-token % token-id f))) + + (delete-token-from-set [this set-name token-id] + (update-set this set-name #(delete-token % token-id))) (toggle-set-in-theme [this theme-group theme-name set-name] (if-let [_theme (get-in themes theme-group theme-name)] diff --git a/common/test/common_tests/logic/token_apply_test.cljc b/common/test/common_tests/logic/token_apply_test.cljc index 668330efb3..02b6fd9d12 100644 --- a/common/test/common_tests/logic/token_apply_test.cljc +++ b/common/test/common_tests/logic/token_apply_test.cljc @@ -32,39 +32,48 @@ :sets #{"test-token-set"})) (ctob/set-active-themes #{"/test-theme"}) (ctob/add-token-in-set "test-token-set" - (ctob/make-token :name "token-radius" + (ctob/make-token :id (thi/new-id! :token-radius) + :name "token-radius" :type :border-radius :value 10)) (ctob/add-token-in-set "test-token-set" - (ctob/make-token :name "token-rotation" + (ctob/make-token :id (thi/new-id! :token-rotation) + :name "token-rotation" :type :rotation :value 30)) (ctob/add-token-in-set "test-token-set" - (ctob/make-token :name "token-opacity" + (ctob/make-token :id (thi/new-id! :token-opacity) + :name "token-opacity" :type :opacity :value 0.7)) (ctob/add-token-in-set "test-token-set" - (ctob/make-token :name "token-stroke-width" + (ctob/make-token :id (thi/new-id! :token-stroke-width) + :name "token-stroke-width" :type :stroke-width :value 2)) (ctob/add-token-in-set "test-token-set" - (ctob/make-token :name "token-color" + (ctob/make-token :id (thi/new-id! :token-color) + :name "token-color" :type :color :value "#00ff00")) (ctob/add-token-in-set "test-token-set" - (ctob/make-token :name "token-dimensions" + (ctob/make-token :id (thi/new-id! :token-dimensions) + :name "token-dimensions" :type :dimensions :value 100)) (ctob/add-token-in-set "test-token-set" - (ctob/make-token :name "token-font-size" + (ctob/make-token :id (thi/new-id! :token-font-size) + :name "token-font-size" :type :font-size :value 24)) (ctob/add-token-in-set "test-token-set" - (ctob/make-token :name "token-letter-spacing" + (ctob/make-token :id (thi/new-id! :token-letter-spacing) + :name "token-letter-spacing" :type :letter-spacing :value 2)) (ctob/add-token-in-set "test-token-set" - (ctob/make-token :name "token-font-family" + (ctob/make-token :id (thi/new-id! :token-font-family) + :name "token-font-family" :type :font-family :value ["Helvetica" "Arial" "sans-serif"])))) (tho/add-frame :frame1) @@ -86,19 +95,19 @@ (t/deftest apply-tokens-to-shape (let [;; ==== Setup - file (setup-file) - page (thf/current-page file) - frame1 (ths/get-shape file :frame1) - text1 (ths/get-shape file :text1) - token-radius (tht/get-token file "test-token-set" "token-radius") - token-rotation (tht/get-token file "test-token-set" "token-rotation") - token-opacity (tht/get-token file "test-token-set" "token-opacity") - token-stroke-width (tht/get-token file "test-token-set" "token-stroke-width") - token-color (tht/get-token file "test-token-set" "token-color") - token-dimensions (tht/get-token file "test-token-set" "token-dimensions") - token-font-size (tht/get-token file "test-token-set" "token-font-size") - token-letter-spacing (tht/get-token file "test-token-set" "token-letter-spacing") - token-font-family (tht/get-token file "test-token-set" "token-font-family") + file (setup-file) + page (thf/current-page file) + frame1 (ths/get-shape file :frame1) + text1 (ths/get-shape file :text1) + token-radius (tht/get-token file "test-token-set" (thi/id :token-radius)) + token-rotation (tht/get-token file "test-token-set" (thi/id :token-rotation)) + token-opacity (tht/get-token file "test-token-set" (thi/id :token-opacity)) + token-stroke-width (tht/get-token file "test-token-set" (thi/id :token-stroke-width)) + token-color (tht/get-token file "test-token-set" (thi/id :token-color)) + token-dimensions (tht/get-token file "test-token-set" (thi/id :token-dimensions)) + token-font-size (tht/get-token file "test-token-set" (thi/id :token-font-size)) + token-letter-spacing (tht/get-token file "test-token-set" (thi/id :token-letter-spacing)) + token-font-family (tht/get-token file "test-token-set" (thi/id :token-font-family)) ;; ==== Action changes (-> (-> (pcb/empty-changes nil) diff --git a/common/test/common_tests/logic/token_test.cljc b/common/test/common_tests/logic/token_test.cljc index e4cec8becf..b99df0f8da 100644 --- a/common/test/common_tests/logic/token_test.cljc +++ b/common/test/common_tests/logic/token_test.cljc @@ -12,6 +12,7 @@ [app.common.test-helpers.ids-map :as thi] [app.common.test-helpers.tokens :as tht] [app.common.types.tokens-lib :as ctob] + [app.common.uuid :as uuid] [clojure.test :as t])) (t/use-fixtures :each thi/test-fixture) @@ -164,23 +165,24 @@ (t/deftest set-token-test (t/testing "delete token" (let [set-name "foo" - token-name "to.delete.color.red" + token-id (uuid/next) file (setup-file #(-> % (ctob/add-set (ctob/make-token-set :name set-name)) - (ctob/add-token-in-set set-name (ctob/make-token {:name token-name + (ctob/add-token-in-set set-name (ctob/make-token {:name "to.delete.color.red" + :id token-id :value "red" :type :color})))) changes (-> (pcb/empty-changes) (pcb/with-library-data (:data file)) - (pcb/set-token set-name token-name nil)) + (pcb/set-token set-name token-id nil)) redo (thf/apply-changes file changes) redo-lib (tht/get-tokens-lib redo) undo (thf/apply-undo-changes redo changes) undo-lib (tht/get-tokens-lib undo)] - (t/is (nil? (ctob/get-token-in-set redo-lib set-name token-name))) + (t/is (nil? (ctob/get-token-in-set redo-lib set-name token-id))) ;; Undo - (t/is (some? (ctob/get-token-in-set undo-lib set-name token-name))))) + (t/is (some? (ctob/get-token-in-set undo-lib set-name token-id))))) (t/testing "add token" (let [set-name "foo" @@ -190,15 +192,15 @@ file (setup-file #(-> % (ctob/add-set (ctob/make-token-set :name set-name)))) changes (-> (pcb/empty-changes) (pcb/with-library-data (:data file)) - (pcb/set-token set-name (:name token) token)) + (pcb/set-token set-name (:id token) token)) redo (thf/apply-changes file changes) redo-lib (tht/get-tokens-lib redo) undo (thf/apply-undo-changes redo changes) undo-lib (tht/get-tokens-lib undo)] - (t/is (= token (ctob/get-token-in-set redo-lib set-name (:name token)))) + (t/is (= token (ctob/get-token-in-set redo-lib set-name (:id token)))) ;; Undo - (t/is (nil? (ctob/get-token-in-set undo-lib set-name (:name token)))))) + (t/is (nil? (ctob/get-token-in-set undo-lib set-name (:id token)))))) (t/testing "update token" (let [set-name "foo" @@ -213,17 +215,15 @@ (ctob/add-token-in-set set-name prev-token))) changes (-> (pcb/empty-changes) (pcb/with-library-data (:data file)) - (pcb/set-token set-name (:name prev-token) token)) + (pcb/set-token set-name (:id prev-token) token)) redo (thf/apply-changes file changes) redo-lib (tht/get-tokens-lib redo) undo (thf/apply-undo-changes redo changes) undo-lib (tht/get-tokens-lib undo)] - (t/is (tht/token-data-eq? token (ctob/get-token-in-set redo-lib set-name (:name token)))) - (t/is (nil? (ctob/get-token-in-set redo-lib set-name (:name prev-token)))) + (t/is (tht/token-data-eq? token (ctob/get-token-in-set redo-lib set-name (:id token)))) ;; Undo - (t/is (tht/token-data-eq? prev-token (ctob/get-token-in-set undo-lib set-name (:name prev-token)))) - (t/is (nil? (ctob/get-token-in-set undo-lib set-name (:name token))))))) + (t/is (tht/token-data-eq? prev-token (ctob/get-token-in-set undo-lib set-name (:id prev-token))))))) (t/deftest set-token-set-test (t/testing "delete token set" @@ -276,11 +276,11 @@ undo-lib (tht/get-tokens-lib undo)] ;; Undo - (t/is (some? (ctob/get-token-in-set undo-lib set-name token-name))) - (t/is (nil? (ctob/get-token-in-set undo-lib new-set-name token-name))) + (t/is (some? (ctob/get-token-in-set undo-lib set-name (:id token)))) + (t/is (nil? (ctob/get-token-in-set undo-lib new-set-name (:id token)))) ;; Redo - (t/is (nil? (ctob/get-token-in-set redo-lib set-name token-name))) - (t/is (some? (ctob/get-token-in-set redo-lib new-set-name token-name)))))) + (t/is (nil? (ctob/get-token-in-set redo-lib set-name (:id token)))) + (t/is (some? (ctob/get-token-in-set redo-lib new-set-name (:id token))))))) (t/deftest generate-toggle-token-set-group-test (t/testing "toggling set group with no active sets inside will activate all child sets" diff --git a/common/test/common_tests/types/tokens_lib_test.cljc b/common/test/common_tests/types/tokens_lib_test.cljc index e2ac474139..7eee6e01f0 100644 --- a/common/test/common_tests/types/tokens_lib_test.cljc +++ b/common/test/common_tests/types/tokens_lib_test.cljc @@ -9,12 +9,13 @@ #?(:clj [app.common.fressian :as fres]) #?(:clj [app.common.json :as json]) #?(:clj [app.common.test-helpers.tokens :as tht]) - #?(:clj [app.common.uuid :as uuid]) + #?(:clj [clojure.datafy :refer [datafy]]) [app.common.data :as d] + [app.common.test-helpers.ids-map :as thi] [app.common.time :as dt] [app.common.transit :as tr] [app.common.types.tokens-lib :as ctob] - [clojure.datafy :refer [datafy]] + [app.common.uuid :as uuid] [clojure.test :as t])) (defn setup-virtual-time @@ -26,16 +27,19 @@ (t/use-fixtures :once setup-virtual-time) (t/deftest make-token - (let [now (dt/now) - token1 (ctob/make-token :name "test-token-1" - :type :boolean - :value true) - token2 (ctob/make-token :name "test-token-2" - :type :number - :value 66 - :description "test description" - :modified-at now)] + (let [now (dt/now) + token1 (ctob/make-token :id (thi/new-id! :token1) + :name "test-token-1" + :type :boolean + :value true) + token2 (ctob/make-token :id (thi/new-id! :token2) + :name "test-token-2" + :type :number + :value 66 + :description "test description" + :modified-at now)] + (t/is (= (:id token1) (thi/id :token1))) (t/is (= (:name token1) "test-token-1")) (t/is (= (:type token1) :boolean)) (t/is (= (:value token1) true)) @@ -43,6 +47,7 @@ (t/is (some? (:modified-at token1))) (t/is (ctob/check-token token1)) + (t/is (= (:id token2) (thi/id :token2))) (t/is (= (:name token2) "test-token-2")) (t/is (= (:type token2) :number)) (t/is (= (:value token2) 66)) @@ -317,11 +322,12 @@ (let [tokens-lib (-> (ctob/make-tokens-lib) (ctob/add-set (ctob/make-token-set :name "test-token-set" :tokens {"test-token" - (ctob/make-token :name "test-token" + (ctob/make-token :id (thi/new-id! :test-token) + :name "test-token" :type :boolean :value true)}))) token-set-copy (ctob/duplicate-set "test-token-set" tokens-lib {:suffix "copy"}) - token (ctob/get-token token-set-copy "test-token")] + token (ctob/get-token token-set-copy (thi/id :test-token))] (t/is (some? token-set-copy)) (t/is (= (ctob/get-name token-set-copy) "test-token-set-copy")) @@ -332,14 +338,15 @@ (let [tokens-lib (-> (ctob/make-tokens-lib) (ctob/add-set (ctob/make-token-set :name "test-token-set" :tokens {"test-token" - (ctob/make-token :name "test-token" + (ctob/make-token :id (thi/new-id! :test-token) + :name "test-token" :type :boolean :value true)}))) tokens-lib (ctob/add-set tokens-lib (ctob/duplicate-set "test-token-set" tokens-lib {:suffix "copy"})) token-set-copy (ctob/duplicate-set "test-token-set" tokens-lib {:suffix "copy"}) - token (ctob/get-token token-set-copy "test-token")] + token (ctob/get-token token-set-copy (thi/id :test-token))] (t/is (some? token-set-copy)) (t/is (= (ctob/get-name token-set-copy) "test-token-set-copy-2")) @@ -381,7 +388,8 @@ (t/deftest add-token (let [tokens-lib (-> (ctob/make-tokens-lib) (ctob/add-set (ctob/make-token-set :name "test-token-set"))) - token (ctob/make-token :name "test-token" + token (ctob/make-token :id (thi/new-id! :token) + :name "test-token" :type :boolean :value true) tokens-lib' (-> tokens-lib @@ -390,7 +398,7 @@ token-set (ctob/get-set tokens-lib "test-token-set") token-set' (ctob/get-set tokens-lib' "test-token-set") - token' (ctob/get-token token-set' "test-token")] + token' (ctob/get-token token-set' (thi/id :token))] (t/is (= (ctob/set-count tokens-lib') 1)) (t/is (= (count (ctob/get-tokens-map token-set')) 1)) @@ -401,33 +409,35 @@ (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" + (ctob/make-token :id (thi/new-id! :test-token-1) + :name "test-token-1" :type :boolean :value true)) (ctob/add-token-in-set "test-token-set" - (ctob/make-token :name "test-token-2" + (ctob/make-token :id (thi/new-id! :test-token-2) + :name "test-token-2" :type :boolean :value true))) tokens-lib' (-> tokens-lib - (ctob/update-token-in-set "test-token-set" "test-token-1" + (ctob/update-token-in-set "test-token-set" (thi/id :test-token-1) (fn [token] (assoc token :description "some description" :value false))) - (ctob/update-token-in-set "not-existing-set" "test-token-1" + (ctob/update-token-in-set "not-existing-set" (thi/id :test-token-1) (fn [token] (assoc token :name "no-effect"))) - (ctob/update-token-in-set "test-token-set" "not-existing-token" + (ctob/update-token-in-set "test-token-set" (uuid/next) (fn [token] (assoc token :name "no-effect")))) token-set (ctob/get-set tokens-lib "test-token-set") token-set' (ctob/get-set tokens-lib' "test-token-set") - token (ctob/get-token token-set "test-token-1") - token' (ctob/get-token token-set' "test-token-1")] + token (ctob/get-token token-set (thi/id :test-token-1)) + token' (ctob/get-token token-set' (thi/id :test-token-1))] (t/is (= (ctob/set-count tokens-lib') 1)) (t/is (= (count (ctob/get-tokens-map token-set')) 2)) @@ -442,24 +452,26 @@ (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" + (ctob/make-token :id (thi/new-id! :test-token-1) + :name "test-token-1" :type :boolean :value true)) (ctob/add-token-in-set "test-token-set" - (ctob/make-token :name "test-token-2" + (ctob/make-token :id (thi/new-id! :test-token-2) + :name "test-token-2" :type :boolean :value true))) tokens-lib' (-> tokens-lib - (ctob/update-token-in-set "test-token-set" "test-token-1" + (ctob/update-token-in-set "test-token-set" (thi/id :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 (ctob/get-token token-set "test-token-1") - token' (ctob/get-token token-set' "updated-name")] + token (ctob/get-token token-set (thi/id :test-token-1)) + token' (ctob/get-token token-set' (thi/id :test-token-1))] (t/is (= (ctob/set-count tokens-lib') 1)) (t/is (= (count (ctob/get-tokens-map token-set')) 2)) @@ -474,17 +486,18 @@ (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 :id (thi/new-id! :test-token) + :name "test-token" :type :boolean :value true))) tokens-lib' (-> tokens-lib - (ctob/delete-token-from-set "test-token-set" "test-token") - (ctob/delete-token-from-set "not-existing-set" "test-token") - (ctob/delete-token-from-set "test-set" "not-existing-token")) + (ctob/delete-token-from-set "test-token-set" (thi/id :test-token)) + (ctob/delete-token-from-set "not-existing-set" (thi/id :test-token)) + (ctob/delete-token-from-set "test-set" (uuid/next))) token-set (ctob/get-set tokens-lib "test-token-set") token-set' (ctob/get-set tokens-lib' "test-token-set") - token' (ctob/get-token token-set' "test-token")] + token' (ctob/get-token token-set' (thi/id :test-token))] (t/is (= (ctob/set-count tokens-lib') 1)) (t/is (= (count (ctob/get-tokens-map token-set')) 0)) @@ -908,20 +921,23 @@ (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" + (ctob/make-token :id (thi/new-id! :test-token-1) + :name "test-token-1" :type :boolean :value true)) (ctob/add-token-in-set "test-token-set" - (ctob/make-token :name "group1.test-token-2" + (ctob/make-token :id (thi/new-id! :test-token-2) + :name "group1.test-token-2" :type :boolean :value true)) (ctob/add-token-in-set "test-token-set" - (ctob/make-token :name "group1.test-token-3" + (ctob/make-token :id (thi/new-id! :test-token-3) + :name "group1.test-token-3" :type :boolean :value true))) tokens-lib' (-> tokens-lib - (ctob/update-token-in-set "test-token-set" "group1.test-token-2" + (ctob/update-token-in-set "test-token-set" (thi/id :test-token-2) (fn [token] (assoc token :description "some description" @@ -929,8 +945,8 @@ token-set (ctob/get-set tokens-lib "test-token-set") token-set' (ctob/get-set tokens-lib' "test-token-set") - token (ctob/get-token token-set "group1.test-token-2") - token' (ctob/get-token token-set' "group1.test-token-2")] + token (ctob/get-token token-set (thi/id :test-token-2)) + token' (ctob/get-token token-set' (thi/id :test-token-2))] (t/is (= (ctob/set-count tokens-lib') 1)) (t/is (= (:name token') "group1.test-token-2")) @@ -943,28 +959,31 @@ (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" + (ctob/make-token :id (thi/new-id! :test-token-1) + :name "test-token-1" :type :boolean :value true)) (ctob/add-token-in-set "test-token-set" - (ctob/make-token :name "group1.test-token-2" + (ctob/make-token :id (thi/new-id! :test-token-2) + :name "group1.test-token-2" :type :boolean :value true)) (ctob/add-token-in-set "test-token-set" - (ctob/make-token :name "group1.test-token-3" + (ctob/make-token :id (thi/new-id! :test-token-3) + :name "group1.test-token-3" :type :boolean :value true))) tokens-lib' (-> tokens-lib - (ctob/update-token-in-set "test-token-set" "group1.test-token-2" + (ctob/update-token-in-set "test-token-set" (thi/id :test-token-2) (fn [token] (assoc token :name "group1.updated-name")))) token-set (ctob/get-set tokens-lib "test-token-set") token-set' (ctob/get-set tokens-lib' "test-token-set") - token (ctob/get-token token-set "group1.test-token-2") - token' (ctob/get-token token-set' "group1.updated-name")] + token (ctob/get-token token-set (thi/id :test-token-2)) + token' (ctob/get-token token-set' (thi/id :test-token-2))] (t/is (= (ctob/set-count tokens-lib') 1)) (t/is (= (:name token') "group1.updated-name")) @@ -977,28 +996,31 @@ (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" + (ctob/make-token :id (thi/new-id! :test-token-1) + :name "test-token-1" :type :boolean :value true)) (ctob/add-token-in-set "test-token-set" - (ctob/make-token :name "group1.test-token-2" + (ctob/make-token :id (thi/new-id! :test-token-2) + :name "group1.test-token-2" :type :boolean :value true)) (ctob/add-token-in-set "test-token-set" - (ctob/make-token :name "group1.test-token-3" + (ctob/make-token :id (thi/new-id! :test-token-3) + :name "group1.test-token-3" :type :boolean :value true))) tokens-lib' (-> tokens-lib - (ctob/update-token-in-set "test-token-set" "group1.test-token-2" + (ctob/update-token-in-set "test-token-set" (thi/id :test-token-2) (fn [token] (assoc token :name "group2.updated-name")))) token-set (ctob/get-set tokens-lib "test-token-set") token-set' (ctob/get-set tokens-lib' "test-token-set") - token (ctob/get-token token-set "group1.test-token-2") - token' (ctob/get-token token-set' "group2.updated-name")] + token (ctob/get-token token-set (thi/id :test-token-2)) + token' (ctob/get-token token-set' (thi/id :test-token-2))] (t/is (= (ctob/set-count tokens-lib') 1)) (t/is (= (d/index-of (keys (ctob/get-tokens-map token-set')) "group2.updated-name") 1)) @@ -1012,19 +1034,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-1" + (ctob/make-token :id (thi/new-id! :test-token-1) + :name "test-token-1" :type :boolean :value true)) (ctob/add-token-in-set "test-token-set" - (ctob/make-token :name "group1.test-token-2" + (ctob/make-token :id (thi/new-id! :test-token-2) + :name "group1.test-token-2" :type :boolean :value true))) tokens-lib' (-> tokens-lib - (ctob/delete-token-from-set "test-token-set" "group1.test-token-2")) + (ctob/delete-token-from-set "test-token-set" (thi/id :test-token-2))) token-set (ctob/get-set tokens-lib "test-token-set") token-set' (ctob/get-set tokens-lib' "test-token-set") - token' (ctob/get-token token-set' "group1.test-token-2")] + token' (ctob/get-token token-set' (thi/id :test-token-2))] (t/is (= (ctob/set-count tokens-lib') 1)) (t/is (= (count (ctob/get-tokens-map token-set')) 1)) @@ -1241,7 +1265,7 @@ lib (ctob/parse-decoded-json json "single_set")] (t/is (= '("single_set") (ctob/get-ordered-set-names lib))) (t/testing "token added" - (t/is (some? (ctob/get-token-in-set lib "single_set" "color.red.100"))))))) + (t/is (some? (ctob/get-token-by-name lib "single_set" "color.red.100"))))))) #?(:clj (t/deftest parse-single-set-dtcg-json @@ -1250,7 +1274,7 @@ lib (ctob/parse-decoded-json json "single_set")] (t/is (= '("single_set") (ctob/get-ordered-set-names lib))) (t/testing "token added" - (t/is (some? (ctob/get-token-in-set lib "single_set" "color.red.100"))))))) + (t/is (some? (ctob/get-token-by-name lib "single_set" "color.red.100"))))))) #?(:clj (t/deftest parse-multi-set-legacy-json @@ -1264,23 +1288,23 @@ (t/is (= (:name token-theme) "theme-1")) (t/is (= (:sets token-theme) #{"light"}))) (t/testing "tokens exist in core set" - (t/is (tht/token-data-eq? (ctob/get-token-in-set lib "core" "colors.red.600") + (t/is (tht/token-data-eq? (ctob/get-token-by-name lib "core" "colors.red.600") {:name "colors.red.600" :type :color :value "#e53e3e" :description ""})) - (t/is (tht/token-data-eq? (ctob/get-token-in-set lib "core" "spacing.multi-value") + (t/is (tht/token-data-eq? (ctob/get-token-by-name lib "core" "spacing.multi-value") {:name "spacing.multi-value" :type :spacing :value "{dimension.sm} {dimension.xl}" :description "You can have multiple values in a single spacing token"})) - (t/is (tht/token-data-eq? (ctob/get-token-in-set lib "theme" "button.primary.background") + (t/is (tht/token-data-eq? (ctob/get-token-by-name lib "theme" "button.primary.background") {:name "button.primary.background" :type :color :value "{accent.default}" :description ""}))) (t/testing "invalid tokens got discarded" - (t/is (nil? (ctob/get-token-in-set lib "typography" "H1.Bold"))))))) + (t/is (nil? (ctob/get-token-by-name lib "typography" "H1.Bold"))))))) #?(:clj (t/deftest parse-multi-set-dtcg-json @@ -1294,23 +1318,23 @@ (t/is (= (:name token-theme) "theme-1")) (t/is (= (:sets token-theme) #{"light"}))) (t/testing "tokens exist in core set" - (t/is (tht/token-data-eq? (ctob/get-token-in-set lib "core" "colors.red.600") + (t/is (tht/token-data-eq? (ctob/get-token-by-name lib "core" "colors.red.600") {:name "colors.red.600" :type :color :value "#e53e3e" :description ""})) - (t/is (tht/token-data-eq? (ctob/get-token-in-set lib "core" "spacing.multi-value") + (t/is (tht/token-data-eq? (ctob/get-token-by-name lib "core" "spacing.multi-value") {:name "spacing.multi-value" :type :spacing :value "{dimension.sm} {dimension.xl}" :description "You can have multiple values in a single spacing token"})) - (t/is (tht/token-data-eq? (ctob/get-token-in-set lib "theme" "button.primary.background") + (t/is (tht/token-data-eq? (ctob/get-token-by-name lib "theme" "button.primary.background") {:name "button.primary.background" :type :color :value "{accent.default}" :description ""}))) (t/testing "invalid tokens got discarded" - (t/is (nil? (ctob/get-token-in-set lib "typography" "H1.Bold"))))))) + (t/is (nil? (ctob/get-token-by-name lib "typography" "H1.Bold"))))))) #?(:clj (t/deftest parse-multi-set-dtcg-json-default-team @@ -1325,7 +1349,7 @@ (t/is (= (:group first-theme) "")) (t/is (= (:name first-theme) ctob/hidden-theme-name))) (t/testing "token exist in dark set" - (t/is (tht/token-data-eq? (ctob/get-token-in-set lib "dark" "small") + (t/is (tht/token-data-eq? (ctob/get-token-by-name lib "dark" "small") {:name "small" :value "8" :type :border-radius diff --git a/frontend/src/app/main/data/workspace/tokens/library_edit.cljs b/frontend/src/app/main/data/workspace/tokens/library_edit.cljs index 8e22e87d52..446c011cd1 100644 --- a/frontend/src/app/main/data/workspace/tokens/library_edit.cljs +++ b/frontend/src/app/main/data/workspace/tokens/library_edit.cljs @@ -13,6 +13,7 @@ [app.common.logic.tokens :as clt] [app.common.types.shape :as cts] [app.common.types.tokens-lib :as ctob] + [app.common.uuid :as uuid] [app.main.data.changes :as dch] [app.main.data.event :as ev] [app.main.data.helpers :as dsh] @@ -347,24 +348,25 @@ changes (-> (pcb/empty-changes it) (pcb/with-library-data data) (pcb/set-token (ctob/get-name token-set) - (:name token) + (:id token) token))] + (js/console.log "Creating token" (clj->js changes)) (rx/of (dch/commit-changes changes) (ptk/data-event ::ev/event {::ev/name "create-token" :type token-type}))) (rx/of (create-token-with-set token))))))) (defn update-token - [name params] - (assert (string? name) "expected string for `name`") + [id params] + (assert (uuid? id) "expected uuid for `id`") (ptk/reify ::update-token ptk/WatchEvent (watch [it state _] (let [token-set (lookup-token-set state) data (dsh/lookup-file-data state) - token (ctob/get-token token-set name) + token (ctob/get-token token-set id) token' (->> (merge token params) (into {}) (ctob/make-token)) @@ -372,39 +374,41 @@ changes (-> (pcb/empty-changes it) (pcb/with-library-data data) (pcb/set-token (ctob/get-name token-set) - (:name token) + id token'))] (rx/of (dch/commit-changes changes) (ptk/data-event ::ev/event {::ev/name "edit-token" :type token-type})))))) (defn delete-token - [set-name token-name] + [set-name token-id] (dm/assert! (string? set-name)) - (dm/assert! (string? token-name)) + (dm/assert! (uuid? token-id)) (ptk/reify ::delete-token ptk/WatchEvent (watch [it state _] (let [data (dsh/lookup-file-data state) changes (-> (pcb/empty-changes it) (pcb/with-library-data data) - (pcb/set-token set-name token-name nil))] + (pcb/set-token set-name token-id nil))] (rx/of (dch/commit-changes changes)))))) (defn duplicate-token - [token-name] - (dm/assert! (string? token-name)) + [token-id] + (dm/assert! (uuid? token-id)) (ptk/reify ::duplicate-token ptk/WatchEvent (watch [_ state _] (when-let [token-set (lookup-token-set state)] - (when-let [token (ctob/get-token token-set token-name)] + (when-let [token (ctob/get-token token-set token-id)] (let [tokens (ctob/get-tokens token-set) unames (map :name tokens) suffix (tr "workspace.tokens.duplicate-suffix") - copy-name (cfh/generate-unique-name token-name unames :suffix suffix)] + copy-name (cfh/generate-unique-name (:name token) unames :suffix suffix)] - (rx/of (create-token (assoc token :name copy-name))))))))) + (rx/of (create-token (assoc token + :id (uuid/next) + :name copy-name))))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; TOKEN UI OPS diff --git a/frontend/src/app/main/data/workspace/tokens/selected_set.cljs b/frontend/src/app/main/data/workspace/tokens/selected_set.cljs index fab8fc64c4..c072ea3642 100644 --- a/frontend/src/app/main/data/workspace/tokens/selected_set.cljs +++ b/frontend/src/app/main/data/workspace/tokens/selected_set.cljs @@ -25,9 +25,9 @@ (get :tokens-lib) (ctob/get-set set-name)))) -(defn get-token-in-selected-set [state token-name] +(defn get-token-in-selected-set [state token-id] (some-> (get-selected-token-set state) - (ctob/get-token token-name))) + (ctob/get-token token-id))) (defn get-all-tokens-in-selected-set [state] (some-> (get-selected-token-set state) diff --git a/frontend/src/app/main/refs.cljs b/frontend/src/app/main/refs.cljs index fcf22ed020..9b27c73c11 100644 --- a/frontend/src/app/main/refs.cljs +++ b/frontend/src/app/main/refs.cljs @@ -505,9 +505,9 @@ (l/derived #(or (some-> % ctob/get-tokens-in-active-sets) {}) tokens-lib)) (def workspace-token-in-selected-set - (fn [token-name] + (fn [token-id] (l/derived - #(dwts/get-token-in-selected-set % token-name) + #(dwts/get-token-in-selected-set % token-id) st/state))) (def workspace-all-tokens-in-selected-set diff --git a/frontend/src/app/main/ui/workspace/tokens/management/context_menu.cljs b/frontend/src/app/main/ui/workspace/tokens/management/context_menu.cljs index 7fe47addf4..fa5ac80996 100644 --- a/frontend/src/app/main/ui/workspace/tokens/management/context_menu.cljs +++ b/frontend/src/app/main/ui/workspace/tokens/management/context_menu.cljs @@ -322,12 +322,12 @@ :token token}))))} {:title (tr "workspace.tokens.duplicate") :no-selectable true - :action #(st/emit! (dwtl/duplicate-token (:name token)))} + :action #(st/emit! (dwtl/duplicate-token (:id token)))} {:title (tr "workspace.tokens.delete") :no-selectable true :action #(st/emit! (dwtl/delete-token (ctob/prefixed-set-path-string->set-name-string selected-token-set-name) - (:name token)))}])) + (:id token)))}])) (defn- allowed-shape-attributes [shapes] (reduce into #{} (map #(ctt/shape-type->attributes (:type %)) shapes))) @@ -456,8 +456,8 @@ (let [objects (mf/deref refs/workspace-page-objects) selected (mf/deref refs/selected-shapes) - token-name (:token-name mdata) - token (mf/deref (refs/workspace-token-in-selected-set token-name)) + token-id (:token-id mdata) + token (mf/deref (refs/workspace-token-in-selected-set token-id)) token-type (:type token) selected-token-set-name (mf/deref refs/selected-token-set-name) diff --git a/frontend/src/app/main/ui/workspace/tokens/management/create/form.cljs b/frontend/src/app/main/ui/workspace/tokens/management/create/form.cljs index 1d2488c602..32941eae12 100644 --- a/frontend/src/app/main/ui/workspace/tokens/management/create/form.cljs +++ b/frontend/src/app/main/ui/workspace/tokens/management/create/form.cljs @@ -390,7 +390,7 @@ (fn [] (st/emit! (if (ctob/token? token) - (dwtl/update-token (:name token) + (dwtl/update-token (:id token) {:name final-name :value final-value :description final-description}) @@ -408,7 +408,9 @@ (fn [e] (dom/prevent-default e) (modal/hide!) - (st/emit! (dwtl/delete-token (ctob/prefixed-set-path-string->set-name-string selected-token-set-name) (:name token))))) + (st/emit! (dwtl/delete-token + (ctob/prefixed-set-path-string->set-name-string selected-token-set-name) + (:id token))))) on-cancel (mf/use-fn @@ -422,12 +424,14 @@ (fn [e] (when (k/enter? e) (on-delete-token e)))) + handle-key-down-cancel (mf/use-fn (mf/deps on-cancel) (fn [e] (when (k/enter? e) (on-cancel e)))) + handle-key-down-save (mf/use-fn (fn [e] diff --git a/frontend/src/app/main/ui/workspace/tokens/management/group.cljs b/frontend/src/app/main/ui/workspace/tokens/management/group.cljs index 2d1787c958..b84e363f70 100644 --- a/frontend/src/app/main/ui/workspace/tokens/management/group.cljs +++ b/frontend/src/app/main/ui/workspace/tokens/management/group.cljs @@ -64,7 +64,7 @@ {:type :token :position (dom/get-client-position event) :errors (:errors token) - :token-name (:name token)})))) + :token-id (:id token)})))) on-toggle-open-click (mf/use-fn diff --git a/frontend/test/frontend_tests/logic/components_and_tokens.cljs b/frontend/test/frontend_tests/logic/components_and_tokens.cljs index 7b1751a496..5afb4c902b 100644 --- a/frontend/test/frontend_tests/logic/components_and_tokens.cljs +++ b/frontend/test/frontend_tests/logic/components_and_tokens.cljs @@ -39,15 +39,18 @@ :sets #{"test-token-set"})) (ctob/set-active-themes #{"/test-theme"}) (ctob/add-token-in-set "test-token-set" - (ctob/make-token :name "test-token-1" + (ctob/make-token :id (cthi/new-id! :test-token-1) + :name "test-token-1" :type :border-radius :value 25)) (ctob/add-token-in-set "test-token-set" - (ctob/make-token :name "test-token-2" + (ctob/make-token :id (cthi/new-id! :test-token-2) + :name "test-token-2" :type :border-radius :value 50)) (ctob/add-token-in-set "test-token-set" - (ctob/make-token :name "test-token-3" + (ctob/make-token :id (cthi/new-id! :test-token-3) + :name "test-token-3" :type :border-radius :value 75)))) (ctho/add-frame :frame1) @@ -202,9 +205,9 @@ file (setup-file-with-copy) store (ths/setup-store file) - ;; ==== Action + ;; ==== Action events [(dwtl/set-selected-token-set-name "test-token-set") - (dwtl/update-token "test-token-1" + (dwtl/update-token (cthi/id :test-token-1) {:name "test-token-1" :type :border-radius :value 66})] @@ -323,27 +326,33 @@ :sets #{"test-token-set"})) (ctob/set-active-themes #{"/test-theme"}) (ctob/add-token-in-set "test-token-set" - (ctob/make-token :name "token-radius" + (ctob/make-token :id (cthi/new-id! :token-radius) + :name "token-radius" :type :border-radius :value 10)) (ctob/add-token-in-set "test-token-set" - (ctob/make-token :name "token-rotation" + (ctob/make-token :id (cthi/new-id! :token-rotation) + :name "token-rotation" :type :rotation :value 30)) (ctob/add-token-in-set "test-token-set" - (ctob/make-token :name "token-opacity" + (ctob/make-token :id (cthi/new-id! :token-opacity) + :name "token-opacity" :type :opacity :value 0.7)) (ctob/add-token-in-set "test-token-set" - (ctob/make-token :name "token-stroke-width" + (ctob/make-token :id (cthi/new-id! :token-stroke-width) + :name "token-stroke-width" :type :stroke-width :value 2)) (ctob/add-token-in-set "test-token-set" - (ctob/make-token :name "token-color" + (ctob/make-token :id (cthi/new-id! :token-color) + :name "token-color" :type :color :value "#00ff00")) (ctob/add-token-in-set "test-token-set" - (ctob/make-token :name "token-dimensions" + (ctob/make-token :id (cthi/new-id! :token-dimensions) + :name "token-dimensions" :type :dimensions :value 100)))) (ctho/add-frame :frame1) @@ -360,22 +369,22 @@ ;; ==== Action events [(dwtl/set-selected-token-set-name "test-token-set") - (dwtl/update-token "token-radius" + (dwtl/update-token (cthi/id :token-radius) {:name "token-radius" :value 30}) - (dwtl/update-token "token-rotation" + (dwtl/update-token (cthi/id :token-rotation) {:name "token-rotation" :value 45}) - (dwtl/update-token "token-opacity" + (dwtl/update-token (cthi/id :token-opacity) {:name "token-opacity" :value 0.9}) - (dwtl/update-token "token-stroke-width" + (dwtl/update-token (cthi/id :token-stroke-width) {:name "token-stroke-width" :value 8}) - (dwtl/update-token "token-color" + (dwtl/update-token (cthi/id :token-color) {:name "token-color" :value "#ff0000"}) - (dwtl/update-token "token-dimensions" + (dwtl/update-token (cthi/id :token-dimensions) {:name "token-dimensions" :value 200})] diff --git a/frontend/test/frontend_tests/tokens/import_export_test.cljs b/frontend/test/frontend_tests/tokens/import_export_test.cljs index 5cf90c8fca..c0482d43f7 100644 --- a/frontend/test/frontend_tests/tokens/import_export_test.cljs +++ b/frontend/test/frontend_tests/tokens/import_export_test.cljs @@ -25,7 +25,7 @@ (rx/subs! (fn [tokens-lib] (t/is (instance? ctob/TokensLib tokens-lib)) (t/is (= "red" (-> (ctob/get-set tokens-lib "core") - (ctob/get-token "color") + (ctob/token-by-name "color") (:value)))) (done)))))))) @@ -97,5 +97,5 @@ color.value tries to reference missing, which is not defined."))) (dwti/import-file-stream "") (rx/subs! (fn [tokens-lib] (t/is (instance? ctob/TokensLib tokens-lib)) - (t/is (= "{missing}" (:value (ctob/get-token-in-set tokens-lib "core" "color")))) + (t/is (= "{missing}" (:value (ctob/get-token-by-name tokens-lib "core" "color")))) (done))))))))