🔧 Use id instead of name for tokens crud

This commit is contained in:
Andrés Moya
2025-07-02 09:11:40 +02:00
committed by Andrés Moya
parent 1c79e726af
commit 57330f53e2
15 changed files with 252 additions and 186 deletions

View File

@@ -425,7 +425,7 @@
[:map {:title "SetTokenChange"} [:map {:title "SetTokenChange"}
[:type [:= :set-token]] [:type [:= :set-token]]
[:set-name :string] [:set-name :string]
[:token-name :string] [:token-id ::sm/uuid]
[:token [:maybe ctob/schema:token-attrs]]]] [:token [:maybe ctob/schema:token-attrs]]]]
[:set-base-font-size [:set-base-font-size
@@ -1001,20 +1001,20 @@
(assoc data :tokens-lib tokens-lib)) (assoc data :tokens-lib tokens-lib))
(defmethod process-change :set-token (defmethod process-change :set-token
[data {:keys [set-name token-name token]}] [data {:keys [set-name token-id token]}]
(update data :tokens-lib (update data :tokens-lib
(fn [lib] (fn [lib]
(let [lib' (ctob/ensure-tokens-lib lib)] (let [lib' (ctob/ensure-tokens-lib lib)]
(cond (cond
(not token) (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)) (ctob/add-token-in-set lib' set-name (ctob/make-token token))
:else :else
(ctob/update-token-in-set lib' set-name token-name (fn [prev-token] (ctob/update-token-in-set lib' set-name token-id (fn [prev-token]
(ctob/make-token (merge prev-token token))))))))) (ctob/make-token (merge prev-token token)))))))))
(defmethod process-change :set-token-set (defmethod process-change :set-token-set
[data {:keys [set-name group? token-set]}] [data {:keys [set-name group? token-set]}]

View File

@@ -881,30 +881,30 @@
(update :undo-changes conj {:type :set-tokens-lib :tokens-lib prev-tokens-lib}) (update :undo-changes conj {:type :set-tokens-lib :tokens-lib prev-tokens-lib})
(apply-changes-local)))) (apply-changes-local))))
(defn set-token [changes set-name token-name token] (defn set-token [changes set-name token-id token]
(assert-library! changes) (assert-library! changes)
(let [library-data (::library-data (meta changes)) (let [library-data (::library-data (meta changes))
prev-token (some-> (get library-data :tokens-lib) prev-token (some-> (get library-data :tokens-lib)
(ctob/get-set set-name) (ctob/get-set set-name)
(ctob/get-token token-name))] (ctob/get-token token-id))]
(-> changes (-> changes
(update :redo-changes conj {:type :set-token (update :redo-changes conj {:type :set-token
:set-name set-name :set-name set-name
:token-name token-name :token-id token-id
:token token}) :token token})
(update :undo-changes conj (if prev-token (update :undo-changes conj (if prev-token
{:type :set-token {:type :set-token
:set-name set-name :set-name set-name
:token-name (or :token-id (or
;; Undo of edit ;; Undo of edit
(:name token) (:id token)
;; Undo of delete ;; Undo of delete
token-name) token-id)
:token prev-token} :token prev-token}
;; Undo of create token ;; Undo of create token
{:type :set-token {:type :set-token
:set-name set-name :set-name set-name
:token-name token-name :token-id token-id
:token nil})) :token nil}))
(apply-changes-local)))) (apply-changes-local))))

View File

@@ -28,12 +28,12 @@
(ctf/update-file-data file #(update % :tokens-lib f))) (ctf/update-file-data file #(update % :tokens-lib f)))
(defn get-token (defn get-token
[file set-name token-name] [file set-name token-id]
(let [tokens-lib (:tokens-lib (:data file))] (let [tokens-lib (:tokens-lib (:data file))]
(when tokens-lib (when tokens-lib
(-> tokens-lib (-> tokens-lib
(ctob/get-set set-name) (ctob/get-set set-name)
(ctob/get-token token-name))))) (ctob/get-token token-id)))))
(defn token-data-eq? (defn token-data-eq?
"Compare token data without comparing unstable fields." "Compare token data without comparing unstable fields."

View File

@@ -160,10 +160,12 @@
;; === Token Set ;; === Token Set
(defprotocol ITokenSet (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") (add-token [_ token] "add a token at the end of the list")
(update-token [_ token-name f] "update a token in the list") (update-token [_ id f] "update a token in the list")
(delete-token [_ token-name] "delete a token from the list") (delete-token [_ id] "delete a token from the list")
(get-token [_ token-name] "return token by token-name") (get-token [_ id] "return token by id")
(get-tokens [_] "return an ordered sequence of all tokens in the set") (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")) (get-tokens-map [_] "return a map of tokens in the set, indexed by token-name"))
@@ -217,6 +219,13 @@
tokens)) tokens))
ITokenSet 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] (add-token [_ token]
(let [token (check-token token)] (let [token (check-token token)]
(TokenSet. id (TokenSet. id
@@ -225,8 +234,8 @@
(dt/now) (dt/now)
(assoc tokens (:name token) token)))) (assoc tokens (:name token) token))))
(update-token [this token-name f] (update-token [this id f]
(if-let [token (get tokens token-name)] (if-let [token (token-by-id this id)]
(let [token' (-> (make-token (f token)) (let [token' (-> (make-token (f token))
(assoc :modified-at (dt/now)))] (assoc :modified-at (dt/now)))]
(TokenSet. id (TokenSet. id
@@ -240,15 +249,16 @@
(dissoc (:name token)))))) (dissoc (:name token))))))
this)) this))
(delete-token [_ token-name] (delete-token [this id]
(TokenSet. id (let [token (token-by-id this id)]
name (TokenSet. id
description name
(dt/now) description
(dissoc tokens token-name))) (dt/now)
(dissoc tokens (:name token)))))
(get-token [_ token-name] (get-token [this id]
(get tokens token-name)) (token-by-id this id))
(get-tokens [_] (get-tokens [_]
(vals tokens)) (vals tokens))
@@ -802,9 +812,10 @@
(set-path-exists? [_ path] "if a set at `path` exists") (set-path-exists? [_ path] "if a set at `path` exists")
(set-group-path-exists? [_ path] "if a set group 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") (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") (get-token-in-set [_ set-name token-id] "get token in a set")
(update-token-in-set [_ set-name token-name f] "update a token in a set") (get-token-by-name [_ set-name token-name] "get token in a set searching by token name")
(delete-token-from-set [_ set-name token-name] "delete a token from a set") (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") (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") (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`. (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] (add-token-in-set [this set-name token]
(update-set this set-name #(add-token % 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 (some-> this
(get-set set-name) (get-set set-name)
(get-token token-name))) (get-token token-id)))
(update-token-in-set [this set-name token-name f] (get-token-by-name [this set-name token-name]
(update-set this set-name #(update-token % token-name f))) (some-> this
(get-set set-name)
(token-by-name token-name)))
(delete-token-from-set [this set-name token-name] (update-token-in-set [this set-name token-id f]
(update-set this set-name #(delete-token % token-name))) (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] (toggle-set-in-theme [this theme-group theme-name set-name]
(if-let [_theme (get-in themes theme-group theme-name)] (if-let [_theme (get-in themes theme-group theme-name)]

View File

@@ -32,39 +32,48 @@
:sets #{"test-token-set"})) :sets #{"test-token-set"}))
(ctob/set-active-themes #{"/test-theme"}) (ctob/set-active-themes #{"/test-theme"})
(ctob/add-token-in-set "test-token-set" (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 :type :border-radius
:value 10)) :value 10))
(ctob/add-token-in-set "test-token-set" (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 :type :rotation
:value 30)) :value 30))
(ctob/add-token-in-set "test-token-set" (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 :type :opacity
:value 0.7)) :value 0.7))
(ctob/add-token-in-set "test-token-set" (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 :type :stroke-width
:value 2)) :value 2))
(ctob/add-token-in-set "test-token-set" (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 :type :color
:value "#00ff00")) :value "#00ff00"))
(ctob/add-token-in-set "test-token-set" (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 :type :dimensions
:value 100)) :value 100))
(ctob/add-token-in-set "test-token-set" (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 :type :font-size
:value 24)) :value 24))
(ctob/add-token-in-set "test-token-set" (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 :type :letter-spacing
:value 2)) :value 2))
(ctob/add-token-in-set "test-token-set" (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 :type :font-family
:value ["Helvetica" "Arial" "sans-serif"])))) :value ["Helvetica" "Arial" "sans-serif"]))))
(tho/add-frame :frame1) (tho/add-frame :frame1)
@@ -86,19 +95,19 @@
(t/deftest apply-tokens-to-shape (t/deftest apply-tokens-to-shape
(let [;; ==== Setup (let [;; ==== Setup
file (setup-file) file (setup-file)
page (thf/current-page file) page (thf/current-page file)
frame1 (ths/get-shape file :frame1) frame1 (ths/get-shape file :frame1)
text1 (ths/get-shape file :text1) text1 (ths/get-shape file :text1)
token-radius (tht/get-token file "test-token-set" "token-radius") token-radius (tht/get-token file "test-token-set" (thi/id :token-radius))
token-rotation (tht/get-token file "test-token-set" "token-rotation") token-rotation (tht/get-token file "test-token-set" (thi/id :token-rotation))
token-opacity (tht/get-token file "test-token-set" "token-opacity") token-opacity (tht/get-token file "test-token-set" (thi/id :token-opacity))
token-stroke-width (tht/get-token file "test-token-set" "token-stroke-width") token-stroke-width (tht/get-token file "test-token-set" (thi/id :token-stroke-width))
token-color (tht/get-token file "test-token-set" "token-color") token-color (tht/get-token file "test-token-set" (thi/id :token-color))
token-dimensions (tht/get-token file "test-token-set" "token-dimensions") token-dimensions (tht/get-token file "test-token-set" (thi/id :token-dimensions))
token-font-size (tht/get-token file "test-token-set" "token-font-size") 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" "token-letter-spacing") 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" "token-font-family") token-font-family (tht/get-token file "test-token-set" (thi/id :token-font-family))
;; ==== Action ;; ==== Action
changes (-> (-> (pcb/empty-changes nil) changes (-> (-> (pcb/empty-changes nil)

View File

@@ -12,6 +12,7 @@
[app.common.test-helpers.ids-map :as thi] [app.common.test-helpers.ids-map :as thi]
[app.common.test-helpers.tokens :as tht] [app.common.test-helpers.tokens :as tht]
[app.common.types.tokens-lib :as ctob] [app.common.types.tokens-lib :as ctob]
[app.common.uuid :as uuid]
[clojure.test :as t])) [clojure.test :as t]))
(t/use-fixtures :each thi/test-fixture) (t/use-fixtures :each thi/test-fixture)
@@ -164,23 +165,24 @@
(t/deftest set-token-test (t/deftest set-token-test
(t/testing "delete token" (t/testing "delete token"
(let [set-name "foo" (let [set-name "foo"
token-name "to.delete.color.red" token-id (uuid/next)
file (setup-file #(-> % file (setup-file #(-> %
(ctob/add-set (ctob/make-token-set :name set-name)) (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" :value "red"
:type :color})))) :type :color}))))
changes (-> (pcb/empty-changes) changes (-> (pcb/empty-changes)
(pcb/with-library-data (:data file)) (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 (thf/apply-changes file changes)
redo-lib (tht/get-tokens-lib redo) redo-lib (tht/get-tokens-lib redo)
undo (thf/apply-undo-changes redo changes) undo (thf/apply-undo-changes redo changes)
undo-lib (tht/get-tokens-lib undo)] 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 ;; 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" (t/testing "add token"
(let [set-name "foo" (let [set-name "foo"
@@ -190,15 +192,15 @@
file (setup-file #(-> % (ctob/add-set (ctob/make-token-set :name set-name)))) file (setup-file #(-> % (ctob/add-set (ctob/make-token-set :name set-name))))
changes (-> (pcb/empty-changes) changes (-> (pcb/empty-changes)
(pcb/with-library-data (:data file)) (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 (thf/apply-changes file changes)
redo-lib (tht/get-tokens-lib redo) redo-lib (tht/get-tokens-lib redo)
undo (thf/apply-undo-changes redo changes) undo (thf/apply-undo-changes redo changes)
undo-lib (tht/get-tokens-lib undo)] 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 ;; 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" (t/testing "update token"
(let [set-name "foo" (let [set-name "foo"
@@ -213,17 +215,15 @@
(ctob/add-token-in-set set-name prev-token))) (ctob/add-token-in-set set-name prev-token)))
changes (-> (pcb/empty-changes) changes (-> (pcb/empty-changes)
(pcb/with-library-data (:data file)) (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 (thf/apply-changes file changes)
redo-lib (tht/get-tokens-lib redo) redo-lib (tht/get-tokens-lib redo)
undo (thf/apply-undo-changes redo changes) undo (thf/apply-undo-changes redo changes)
undo-lib (tht/get-tokens-lib undo)] 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 (tht/token-data-eq? token (ctob/get-token-in-set redo-lib set-name (:id token))))
(t/is (nil? (ctob/get-token-in-set redo-lib set-name (:name prev-token))))
;; Undo ;; Undo
(t/is (tht/token-data-eq? prev-token (ctob/get-token-in-set undo-lib set-name (:name prev-token)))) (t/is (tht/token-data-eq? prev-token (ctob/get-token-in-set undo-lib set-name (:id prev-token)))))))
(t/is (nil? (ctob/get-token-in-set undo-lib set-name (:name token)))))))
(t/deftest set-token-set-test (t/deftest set-token-set-test
(t/testing "delete token set" (t/testing "delete token set"
@@ -276,11 +276,11 @@
undo-lib (tht/get-tokens-lib undo)] undo-lib (tht/get-tokens-lib undo)]
;; Undo ;; 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 (:id token))))
(t/is (nil? (ctob/get-token-in-set undo-lib new-set-name token-name))) (t/is (nil? (ctob/get-token-in-set undo-lib new-set-name (:id token))))
;; Redo ;; Redo
(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 (:id token))))
(t/is (some? (ctob/get-token-in-set redo-lib new-set-name token-name)))))) (t/is (some? (ctob/get-token-in-set redo-lib new-set-name (:id token)))))))
(t/deftest generate-toggle-token-set-group-test (t/deftest generate-toggle-token-set-group-test
(t/testing "toggling set group with no active sets inside will activate all child sets" (t/testing "toggling set group with no active sets inside will activate all child sets"

View File

@@ -9,12 +9,13 @@
#?(:clj [app.common.fressian :as fres]) #?(:clj [app.common.fressian :as fres])
#?(:clj [app.common.json :as json]) #?(:clj [app.common.json :as json])
#?(:clj [app.common.test-helpers.tokens :as tht]) #?(: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.data :as d]
[app.common.test-helpers.ids-map :as thi]
[app.common.time :as dt] [app.common.time :as dt]
[app.common.transit :as tr] [app.common.transit :as tr]
[app.common.types.tokens-lib :as ctob] [app.common.types.tokens-lib :as ctob]
[clojure.datafy :refer [datafy]] [app.common.uuid :as uuid]
[clojure.test :as t])) [clojure.test :as t]))
(defn setup-virtual-time (defn setup-virtual-time
@@ -26,16 +27,19 @@
(t/use-fixtures :once setup-virtual-time) (t/use-fixtures :once setup-virtual-time)
(t/deftest make-token (t/deftest make-token
(let [now (dt/now) (let [now (dt/now)
token1 (ctob/make-token :name "test-token-1" token1 (ctob/make-token :id (thi/new-id! :token1)
:type :boolean :name "test-token-1"
:value true) :type :boolean
token2 (ctob/make-token :name "test-token-2" :value true)
:type :number token2 (ctob/make-token :id (thi/new-id! :token2)
:value 66 :name "test-token-2"
:description "test description" :type :number
:modified-at now)] :value 66
:description "test description"
:modified-at now)]
(t/is (= (:id token1) (thi/id :token1)))
(t/is (= (:name token1) "test-token-1")) (t/is (= (:name token1) "test-token-1"))
(t/is (= (:type token1) :boolean)) (t/is (= (:type token1) :boolean))
(t/is (= (:value token1) true)) (t/is (= (:value token1) true))
@@ -43,6 +47,7 @@
(t/is (some? (:modified-at token1))) (t/is (some? (:modified-at token1)))
(t/is (ctob/check-token token1)) (t/is (ctob/check-token token1))
(t/is (= (:id token2) (thi/id :token2)))
(t/is (= (:name token2) "test-token-2")) (t/is (= (:name token2) "test-token-2"))
(t/is (= (:type token2) :number)) (t/is (= (:type token2) :number))
(t/is (= (:value token2) 66)) (t/is (= (:value token2) 66))
@@ -317,11 +322,12 @@
(let [tokens-lib (-> (ctob/make-tokens-lib) (let [tokens-lib (-> (ctob/make-tokens-lib)
(ctob/add-set (ctob/make-token-set :name "test-token-set" (ctob/add-set (ctob/make-token-set :name "test-token-set"
:tokens {"test-token" :tokens {"test-token"
(ctob/make-token :name "test-token" (ctob/make-token :id (thi/new-id! :test-token)
:name "test-token"
:type :boolean :type :boolean
:value true)}))) :value true)})))
token-set-copy (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 (some? token-set-copy))
(t/is (= (ctob/get-name token-set-copy) "test-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) (let [tokens-lib (-> (ctob/make-tokens-lib)
(ctob/add-set (ctob/make-token-set :name "test-token-set" (ctob/add-set (ctob/make-token-set :name "test-token-set"
:tokens {"test-token" :tokens {"test-token"
(ctob/make-token :name "test-token" (ctob/make-token :id (thi/new-id! :test-token)
:name "test-token"
:type :boolean :type :boolean
:value true)}))) :value true)})))
tokens-lib (ctob/add-set tokens-lib (ctob/duplicate-set "test-token-set" tokens-lib {:suffix "copy"})) 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-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 (some? token-set-copy))
(t/is (= (ctob/get-name token-set-copy) "test-token-set-copy-2")) (t/is (= (ctob/get-name token-set-copy) "test-token-set-copy-2"))
@@ -381,7 +388,8 @@
(t/deftest add-token (t/deftest add-token
(let [tokens-lib (-> (ctob/make-tokens-lib) (let [tokens-lib (-> (ctob/make-tokens-lib)
(ctob/add-set (ctob/make-token-set :name "test-token-set"))) (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 :type :boolean
:value true) :value true)
tokens-lib' (-> tokens-lib 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-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 (= (ctob/set-count tokens-lib') 1))
(t/is (= (count (ctob/get-tokens-map token-set')) 1)) (t/is (= (count (ctob/get-tokens-map token-set')) 1))
@@ -401,33 +409,35 @@
(let [tokens-lib (-> (ctob/make-tokens-lib) (let [tokens-lib (-> (ctob/make-tokens-lib)
(ctob/add-set (ctob/make-token-set :name "test-token-set")) (ctob/add-set (ctob/make-token-set :name "test-token-set"))
(ctob/add-token-in-set "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 :type :boolean
:value true)) :value true))
(ctob/add-token-in-set "test-token-set" (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 :type :boolean
:value true))) :value true)))
tokens-lib' (-> tokens-lib 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] (fn [token]
(assoc token (assoc token
:description "some description" :description "some description"
:value false))) :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] (fn [token]
(assoc token (assoc token
:name "no-effect"))) :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] (fn [token]
(assoc token (assoc token
:name "no-effect")))) :name "no-effect"))))
token-set (ctob/get-set tokens-lib "test-token-set") token-set (ctob/get-set tokens-lib "test-token-set")
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 (thi/id :test-token-1))
token' (ctob/get-token token-set' "test-token-1")] token' (ctob/get-token token-set' (thi/id :test-token-1))]
(t/is (= (ctob/set-count tokens-lib') 1)) (t/is (= (ctob/set-count tokens-lib') 1))
(t/is (= (count (ctob/get-tokens-map token-set')) 2)) (t/is (= (count (ctob/get-tokens-map token-set')) 2))
@@ -442,24 +452,26 @@
(let [tokens-lib (-> (ctob/make-tokens-lib) (let [tokens-lib (-> (ctob/make-tokens-lib)
(ctob/add-set (ctob/make-token-set :name "test-token-set")) (ctob/add-set (ctob/make-token-set :name "test-token-set"))
(ctob/add-token-in-set "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 :type :boolean
:value true)) :value true))
(ctob/add-token-in-set "test-token-set" (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 :type :boolean
:value true))) :value true)))
tokens-lib' (-> tokens-lib 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] (fn [token]
(assoc token (assoc token
:name "updated-name")))) :name "updated-name"))))
token-set (ctob/get-set tokens-lib "test-token-set") token-set (ctob/get-set tokens-lib "test-token-set")
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 (thi/id :test-token-1))
token' (ctob/get-token token-set' "updated-name")] token' (ctob/get-token token-set' (thi/id :test-token-1))]
(t/is (= (ctob/set-count tokens-lib') 1)) (t/is (= (ctob/set-count tokens-lib') 1))
(t/is (= (count (ctob/get-tokens-map token-set')) 2)) (t/is (= (count (ctob/get-tokens-map token-set')) 2))
@@ -474,17 +486,18 @@
(let [tokens-lib (-> (ctob/make-tokens-lib) (let [tokens-lib (-> (ctob/make-tokens-lib)
(ctob/add-set (ctob/make-token-set :name "test-token-set")) (ctob/add-set (ctob/make-token-set :name "test-token-set"))
(ctob/add-token-in-set "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 :type :boolean
:value true))) :value true)))
tokens-lib' (-> tokens-lib tokens-lib' (-> tokens-lib
(ctob/delete-token-from-set "test-token-set" "test-token") (ctob/delete-token-from-set "test-token-set" (thi/id :test-token))
(ctob/delete-token-from-set "not-existing-set" "test-token") (ctob/delete-token-from-set "not-existing-set" (thi/id :test-token))
(ctob/delete-token-from-set "test-set" "not-existing-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-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 (= (ctob/set-count tokens-lib') 1))
(t/is (= (count (ctob/get-tokens-map token-set')) 0)) (t/is (= (count (ctob/get-tokens-map token-set')) 0))
@@ -908,20 +921,23 @@
(let [tokens-lib (-> (ctob/make-tokens-lib) (let [tokens-lib (-> (ctob/make-tokens-lib)
(ctob/add-set (ctob/make-token-set :name "test-token-set")) (ctob/add-set (ctob/make-token-set :name "test-token-set"))
(ctob/add-token-in-set "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 :type :boolean
:value true)) :value true))
(ctob/add-token-in-set "test-token-set" (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 :type :boolean
:value true)) :value true))
(ctob/add-token-in-set "test-token-set" (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 :type :boolean
:value true))) :value true)))
tokens-lib' (-> tokens-lib 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] (fn [token]
(assoc token (assoc token
:description "some description" :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-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))
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 (= (ctob/set-count tokens-lib') 1))
(t/is (= (:name token') "group1.test-token-2")) (t/is (= (:name token') "group1.test-token-2"))
@@ -943,28 +959,31 @@
(let [tokens-lib (-> (ctob/make-tokens-lib) (let [tokens-lib (-> (ctob/make-tokens-lib)
(ctob/add-set (ctob/make-token-set :name "test-token-set")) (ctob/add-set (ctob/make-token-set :name "test-token-set"))
(ctob/add-token-in-set "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 :type :boolean
:value true)) :value true))
(ctob/add-token-in-set "test-token-set" (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 :type :boolean
:value true)) :value true))
(ctob/add-token-in-set "test-token-set" (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 :type :boolean
:value true))) :value true)))
tokens-lib' (-> tokens-lib 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] (fn [token]
(assoc token (assoc token
:name "group1.updated-name")))) :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-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))
token' (ctob/get-token token-set' "group1.updated-name")] token' (ctob/get-token token-set' (thi/id :test-token-2))]
(t/is (= (ctob/set-count tokens-lib') 1)) (t/is (= (ctob/set-count tokens-lib') 1))
(t/is (= (:name token') "group1.updated-name")) (t/is (= (:name token') "group1.updated-name"))
@@ -977,28 +996,31 @@
(let [tokens-lib (-> (ctob/make-tokens-lib) (let [tokens-lib (-> (ctob/make-tokens-lib)
(ctob/add-set (ctob/make-token-set :name "test-token-set")) (ctob/add-set (ctob/make-token-set :name "test-token-set"))
(ctob/add-token-in-set "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 :type :boolean
:value true)) :value true))
(ctob/add-token-in-set "test-token-set" (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 :type :boolean
:value true)) :value true))
(ctob/add-token-in-set "test-token-set" (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 :type :boolean
:value true))) :value true)))
tokens-lib' (-> tokens-lib 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] (fn [token]
(assoc token (assoc token
:name "group2.updated-name")))) :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-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))
token' (ctob/get-token token-set' "group2.updated-name")] token' (ctob/get-token token-set' (thi/id :test-token-2))]
(t/is (= (ctob/set-count tokens-lib') 1)) (t/is (= (ctob/set-count tokens-lib') 1))
(t/is (= (d/index-of (keys (ctob/get-tokens-map token-set')) "group2.updated-name") 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) (let [tokens-lib (-> (ctob/make-tokens-lib)
(ctob/add-set (ctob/make-token-set :name "test-token-set")) (ctob/add-set (ctob/make-token-set :name "test-token-set"))
(ctob/add-token-in-set "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 :type :boolean
:value true)) :value true))
(ctob/add-token-in-set "test-token-set" (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 :type :boolean
:value true))) :value true)))
tokens-lib' (-> tokens-lib 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-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 (= (ctob/set-count tokens-lib') 1))
(t/is (= (count (ctob/get-tokens-map token-set')) 1)) (t/is (= (count (ctob/get-tokens-map token-set')) 1))
@@ -1241,7 +1265,7 @@
lib (ctob/parse-decoded-json json "single_set")] lib (ctob/parse-decoded-json json "single_set")]
(t/is (= '("single_set") (ctob/get-ordered-set-names lib))) (t/is (= '("single_set") (ctob/get-ordered-set-names lib)))
(t/testing "token added" (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 #?(:clj
(t/deftest parse-single-set-dtcg-json (t/deftest parse-single-set-dtcg-json
@@ -1250,7 +1274,7 @@
lib (ctob/parse-decoded-json json "single_set")] lib (ctob/parse-decoded-json json "single_set")]
(t/is (= '("single_set") (ctob/get-ordered-set-names lib))) (t/is (= '("single_set") (ctob/get-ordered-set-names lib)))
(t/testing "token added" (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 #?(:clj
(t/deftest parse-multi-set-legacy-json (t/deftest parse-multi-set-legacy-json
@@ -1264,23 +1288,23 @@
(t/is (= (:name token-theme) "theme-1")) (t/is (= (:name token-theme) "theme-1"))
(t/is (= (:sets token-theme) #{"light"}))) (t/is (= (:sets token-theme) #{"light"})))
(t/testing "tokens exist in core set" (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" {:name "colors.red.600"
:type :color :type :color
:value "#e53e3e" :value "#e53e3e"
:description ""})) :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" {:name "spacing.multi-value"
:type :spacing :type :spacing
:value "{dimension.sm} {dimension.xl}" :value "{dimension.sm} {dimension.xl}"
:description "You can have multiple values in a single spacing token"})) :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" {:name "button.primary.background"
:type :color :type :color
:value "{accent.default}" :value "{accent.default}"
:description ""}))) :description ""})))
(t/testing "invalid tokens got discarded" (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 #?(:clj
(t/deftest parse-multi-set-dtcg-json (t/deftest parse-multi-set-dtcg-json
@@ -1294,23 +1318,23 @@
(t/is (= (:name token-theme) "theme-1")) (t/is (= (:name token-theme) "theme-1"))
(t/is (= (:sets token-theme) #{"light"}))) (t/is (= (:sets token-theme) #{"light"})))
(t/testing "tokens exist in core set" (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" {:name "colors.red.600"
:type :color :type :color
:value "#e53e3e" :value "#e53e3e"
:description ""})) :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" {:name "spacing.multi-value"
:type :spacing :type :spacing
:value "{dimension.sm} {dimension.xl}" :value "{dimension.sm} {dimension.xl}"
:description "You can have multiple values in a single spacing token"})) :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" {:name "button.primary.background"
:type :color :type :color
:value "{accent.default}" :value "{accent.default}"
:description ""}))) :description ""})))
(t/testing "invalid tokens got discarded" (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 #?(:clj
(t/deftest parse-multi-set-dtcg-json-default-team (t/deftest parse-multi-set-dtcg-json-default-team
@@ -1325,7 +1349,7 @@
(t/is (= (:group first-theme) "")) (t/is (= (:group first-theme) ""))
(t/is (= (:name first-theme) ctob/hidden-theme-name))) (t/is (= (:name first-theme) ctob/hidden-theme-name)))
(t/testing "token exist in dark set" (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" {:name "small"
:value "8" :value "8"
:type :border-radius :type :border-radius

View File

@@ -13,6 +13,7 @@
[app.common.logic.tokens :as clt] [app.common.logic.tokens :as clt]
[app.common.types.shape :as cts] [app.common.types.shape :as cts]
[app.common.types.tokens-lib :as ctob] [app.common.types.tokens-lib :as ctob]
[app.common.uuid :as uuid]
[app.main.data.changes :as dch] [app.main.data.changes :as dch]
[app.main.data.event :as ev] [app.main.data.event :as ev]
[app.main.data.helpers :as dsh] [app.main.data.helpers :as dsh]
@@ -347,24 +348,25 @@
changes (-> (pcb/empty-changes it) changes (-> (pcb/empty-changes it)
(pcb/with-library-data data) (pcb/with-library-data data)
(pcb/set-token (ctob/get-name token-set) (pcb/set-token (ctob/get-name token-set)
(:name token) (:id token)
token))] token))]
(js/console.log "Creating token" (clj->js changes))
(rx/of (dch/commit-changes changes) (rx/of (dch/commit-changes changes)
(ptk/data-event ::ev/event {::ev/name "create-token" :type token-type}))) (ptk/data-event ::ev/event {::ev/name "create-token" :type token-type})))
(rx/of (create-token-with-set token))))))) (rx/of (create-token-with-set token)))))))
(defn update-token (defn update-token
[name params] [id params]
(assert (string? name) "expected string for `name`") (assert (uuid? id) "expected uuid for `id`")
(ptk/reify ::update-token (ptk/reify ::update-token
ptk/WatchEvent ptk/WatchEvent
(watch [it state _] (watch [it state _]
(let [token-set (lookup-token-set state) (let [token-set (lookup-token-set state)
data (dsh/lookup-file-data 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) token' (->> (merge token params)
(into {}) (into {})
(ctob/make-token)) (ctob/make-token))
@@ -372,39 +374,41 @@
changes (-> (pcb/empty-changes it) changes (-> (pcb/empty-changes it)
(pcb/with-library-data data) (pcb/with-library-data data)
(pcb/set-token (ctob/get-name token-set) (pcb/set-token (ctob/get-name token-set)
(:name token) id
token'))] token'))]
(rx/of (dch/commit-changes changes) (rx/of (dch/commit-changes changes)
(ptk/data-event ::ev/event {::ev/name "edit-token" :type token-type})))))) (ptk/data-event ::ev/event {::ev/name "edit-token" :type token-type}))))))
(defn delete-token (defn delete-token
[set-name token-name] [set-name token-id]
(dm/assert! (string? set-name)) (dm/assert! (string? set-name))
(dm/assert! (string? token-name)) (dm/assert! (uuid? token-id))
(ptk/reify ::delete-token (ptk/reify ::delete-token
ptk/WatchEvent ptk/WatchEvent
(watch [it state _] (watch [it state _]
(let [data (dsh/lookup-file-data state) (let [data (dsh/lookup-file-data state)
changes (-> (pcb/empty-changes it) changes (-> (pcb/empty-changes it)
(pcb/with-library-data data) (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)))))) (rx/of (dch/commit-changes changes))))))
(defn duplicate-token (defn duplicate-token
[token-name] [token-id]
(dm/assert! (string? token-name)) (dm/assert! (uuid? token-id))
(ptk/reify ::duplicate-token (ptk/reify ::duplicate-token
ptk/WatchEvent ptk/WatchEvent
(watch [_ state _] (watch [_ state _]
(when-let [token-set (lookup-token-set 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) (let [tokens (ctob/get-tokens token-set)
unames (map :name tokens) unames (map :name tokens)
suffix (tr "workspace.tokens.duplicate-suffix") 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 ;; TOKEN UI OPS

View File

@@ -25,9 +25,9 @@
(get :tokens-lib) (get :tokens-lib)
(ctob/get-set set-name)))) (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) (some-> (get-selected-token-set state)
(ctob/get-token token-name))) (ctob/get-token token-id)))
(defn get-all-tokens-in-selected-set [state] (defn get-all-tokens-in-selected-set [state]
(some-> (get-selected-token-set state) (some-> (get-selected-token-set state)

View File

@@ -505,9 +505,9 @@
(l/derived #(or (some-> % ctob/get-tokens-in-active-sets) {}) tokens-lib)) (l/derived #(or (some-> % ctob/get-tokens-in-active-sets) {}) tokens-lib))
(def workspace-token-in-selected-set (def workspace-token-in-selected-set
(fn [token-name] (fn [token-id]
(l/derived (l/derived
#(dwts/get-token-in-selected-set % token-name) #(dwts/get-token-in-selected-set % token-id)
st/state))) st/state)))
(def workspace-all-tokens-in-selected-set (def workspace-all-tokens-in-selected-set

View File

@@ -322,12 +322,12 @@
:token token}))))} :token token}))))}
{:title (tr "workspace.tokens.duplicate") {:title (tr "workspace.tokens.duplicate")
:no-selectable true :no-selectable true
:action #(st/emit! (dwtl/duplicate-token (:name token)))} :action #(st/emit! (dwtl/duplicate-token (:id token)))}
{:title (tr "workspace.tokens.delete") {:title (tr "workspace.tokens.delete")
:no-selectable true :no-selectable true
:action #(st/emit! (dwtl/delete-token :action #(st/emit! (dwtl/delete-token
(ctob/prefixed-set-path-string->set-name-string selected-token-set-name) (ctob/prefixed-set-path-string->set-name-string selected-token-set-name)
(:name token)))}])) (:id token)))}]))
(defn- allowed-shape-attributes [shapes] (defn- allowed-shape-attributes [shapes]
(reduce into #{} (map #(ctt/shape-type->attributes (:type %)) shapes))) (reduce into #{} (map #(ctt/shape-type->attributes (:type %)) shapes)))
@@ -456,8 +456,8 @@
(let [objects (mf/deref refs/workspace-page-objects) (let [objects (mf/deref refs/workspace-page-objects)
selected (mf/deref refs/selected-shapes) selected (mf/deref refs/selected-shapes)
token-name (:token-name mdata) token-id (:token-id mdata)
token (mf/deref (refs/workspace-token-in-selected-set token-name)) token (mf/deref (refs/workspace-token-in-selected-set token-id))
token-type (:type token) token-type (:type token)
selected-token-set-name (mf/deref refs/selected-token-set-name) selected-token-set-name (mf/deref refs/selected-token-set-name)

View File

@@ -390,7 +390,7 @@
(fn [] (fn []
(st/emit! (st/emit!
(if (ctob/token? token) (if (ctob/token? token)
(dwtl/update-token (:name token) (dwtl/update-token (:id token)
{:name final-name {:name final-name
:value final-value :value final-value
:description final-description}) :description final-description})
@@ -408,7 +408,9 @@
(fn [e] (fn [e]
(dom/prevent-default e) (dom/prevent-default e)
(modal/hide!) (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 on-cancel
(mf/use-fn (mf/use-fn
@@ -422,12 +424,14 @@
(fn [e] (fn [e]
(when (k/enter? e) (when (k/enter? e)
(on-delete-token e)))) (on-delete-token e))))
handle-key-down-cancel handle-key-down-cancel
(mf/use-fn (mf/use-fn
(mf/deps on-cancel) (mf/deps on-cancel)
(fn [e] (fn [e]
(when (k/enter? e) (when (k/enter? e)
(on-cancel e)))) (on-cancel e))))
handle-key-down-save handle-key-down-save
(mf/use-fn (mf/use-fn
(fn [e] (fn [e]

View File

@@ -64,7 +64,7 @@
{:type :token {:type :token
:position (dom/get-client-position event) :position (dom/get-client-position event)
:errors (:errors token) :errors (:errors token)
:token-name (:name token)})))) :token-id (:id token)}))))
on-toggle-open-click on-toggle-open-click
(mf/use-fn (mf/use-fn

View File

@@ -39,15 +39,18 @@
:sets #{"test-token-set"})) :sets #{"test-token-set"}))
(ctob/set-active-themes #{"/test-theme"}) (ctob/set-active-themes #{"/test-theme"})
(ctob/add-token-in-set "test-token-set" (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 :type :border-radius
:value 25)) :value 25))
(ctob/add-token-in-set "test-token-set" (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 :type :border-radius
:value 50)) :value 50))
(ctob/add-token-in-set "test-token-set" (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 :type :border-radius
:value 75)))) :value 75))))
(ctho/add-frame :frame1) (ctho/add-frame :frame1)
@@ -202,9 +205,9 @@
file (setup-file-with-copy) file (setup-file-with-copy)
store (ths/setup-store file) store (ths/setup-store file)
;; ==== Action ;; ==== Action
events [(dwtl/set-selected-token-set-name "test-token-set") 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" {:name "test-token-1"
:type :border-radius :type :border-radius
:value 66})] :value 66})]
@@ -323,27 +326,33 @@
:sets #{"test-token-set"})) :sets #{"test-token-set"}))
(ctob/set-active-themes #{"/test-theme"}) (ctob/set-active-themes #{"/test-theme"})
(ctob/add-token-in-set "test-token-set" (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 :type :border-radius
:value 10)) :value 10))
(ctob/add-token-in-set "test-token-set" (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 :type :rotation
:value 30)) :value 30))
(ctob/add-token-in-set "test-token-set" (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 :type :opacity
:value 0.7)) :value 0.7))
(ctob/add-token-in-set "test-token-set" (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 :type :stroke-width
:value 2)) :value 2))
(ctob/add-token-in-set "test-token-set" (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 :type :color
:value "#00ff00")) :value "#00ff00"))
(ctob/add-token-in-set "test-token-set" (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 :type :dimensions
:value 100)))) :value 100))))
(ctho/add-frame :frame1) (ctho/add-frame :frame1)
@@ -360,22 +369,22 @@
;; ==== Action ;; ==== Action
events [(dwtl/set-selected-token-set-name "test-token-set") 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" {:name "token-radius"
:value 30}) :value 30})
(dwtl/update-token "token-rotation" (dwtl/update-token (cthi/id :token-rotation)
{:name "token-rotation" {:name "token-rotation"
:value 45}) :value 45})
(dwtl/update-token "token-opacity" (dwtl/update-token (cthi/id :token-opacity)
{:name "token-opacity" {:name "token-opacity"
:value 0.9}) :value 0.9})
(dwtl/update-token "token-stroke-width" (dwtl/update-token (cthi/id :token-stroke-width)
{:name "token-stroke-width" {:name "token-stroke-width"
:value 8}) :value 8})
(dwtl/update-token "token-color" (dwtl/update-token (cthi/id :token-color)
{:name "token-color" {:name "token-color"
:value "#ff0000"}) :value "#ff0000"})
(dwtl/update-token "token-dimensions" (dwtl/update-token (cthi/id :token-dimensions)
{:name "token-dimensions" {:name "token-dimensions"
:value 200})] :value 200})]

View File

@@ -25,7 +25,7 @@
(rx/subs! (fn [tokens-lib] (rx/subs! (fn [tokens-lib]
(t/is (instance? ctob/TokensLib tokens-lib)) (t/is (instance? ctob/TokensLib tokens-lib))
(t/is (= "red" (-> (ctob/get-set tokens-lib "core") (t/is (= "red" (-> (ctob/get-set tokens-lib "core")
(ctob/get-token "color") (ctob/token-by-name "color")
(:value)))) (:value))))
(done)))))))) (done))))))))
@@ -97,5 +97,5 @@ color.value tries to reference missing, which is not defined.")))
(dwti/import-file-stream "") (dwti/import-file-stream "")
(rx/subs! (fn [tokens-lib] (rx/subs! (fn [tokens-lib]
(t/is (instance? ctob/TokensLib 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)))))))) (done))))))))