diff --git a/common/src/app/common/types/tokens_lib.cljc b/common/src/app/common/types/tokens_lib.cljc index 369ffd37f..f53c806d3 100644 --- a/common/src/app/common/types/tokens_lib.cljc +++ b/common/src/app/common/types/tokens_lib.cljc @@ -1227,18 +1227,15 @@ Will return a value that matches this schema: :none))) (get-active-themes-set-tokens [this] - (let [sets-order (get-ordered-set-names this) - active-themes (get-active-themes this) - order-theme-set (fn [theme] - (filter #(contains? (set (:sets theme)) %) sets-order))] - (reduce - (fn [tokens theme] - (reduce - (fn [tokens' cur] - (merge tokens' (:tokens (get-set this cur)))) - tokens (order-theme-set theme))) - (d/ordered-map) - active-themes))) + (let [theme-set-names (get-active-themes-set-names this) + all-set-names (get-ordered-set-names this) + active-set-names (filter theme-set-names all-set-names) + tokens (reduce (fn [tokens set-name] + (let [set (get-set this set-name)] + (merge tokens (:tokens set)))) + (d/ordered-map) + active-set-names)] + tokens)) (encode-dtcg [this] (let [themes-xform diff --git a/common/test/common_tests/types/tokens_lib_test.cljc b/common/test/common_tests/types/tokens_lib_test.cljc index 6779ac08e..0b80eed16 100644 --- a/common/test/common_tests/types/tokens_lib_test.cljc +++ b/common/test/common_tests/types/tokens_lib_test.cljc @@ -441,32 +441,225 @@ (t/is (nil? token')) (t/is (dt/is-after? (:modified-at token-set') (:modified-at token-set))))) -(t/deftest list-active-themes-tokens-in-order - (let [tokens-lib (-> (ctob/make-tokens-lib) - (ctob/add-theme (ctob/make-token-theme :name "out-of-order-theme" - ;; Out of order sets in theme - :sets ["unknown-set" "set-b" "set-a"])) - (ctob/set-active-themes #{"/out-of-order-theme"}) +(t/deftest get-ordered-sets + (let [tokens-lib (-> (ctob/make-tokens-lib) + (ctob/add-set (ctob/make-token-set :name "group-1/set-a")) + (ctob/add-set (ctob/make-token-set :name "group-1/set-b")) + (ctob/add-set (ctob/make-token-set :name "group-2/set-a")) + (ctob/add-set (ctob/make-token-set :name "group-1/set-c"))) - (ctob/add-set (ctob/make-token-set :name "set-a")) - (ctob/add-token-in-set "set-a" (ctob/make-token :name "set-a-token" - :type :boolean - :value true)) - (ctob/add-set (ctob/make-token-set :name "set-b")) - (ctob/add-token-in-set "set-b" (ctob/make-token :name "set-b-token" - :type :boolean - :value true)) - ;; Ignore this set - (ctob/add-set (ctob/make-token-set :name "inactive-set")) - (ctob/add-token-in-set "inactive-set" (ctob/make-token :name "inactive-set-token" - :type :boolean - :value true))) + ordered-sets (ctob/get-ordered-set-names tokens-lib)] - expected-order (ctob/get-ordered-set-names tokens-lib) - expected-tokens (ctob/get-active-themes-set-tokens tokens-lib) - expected-token-names (mapv key expected-tokens)] - (t/is (= '("set-a" "set-b" "inactive-set") expected-order)) - (t/is (= ["set-a-token" "set-b-token"] expected-token-names)))) + (t/is (= ordered-sets '("group-1/set-a" + "group-1/set-b" + "group-1/set-c" + "group-2/set-a"))))) + +(t/deftest list-active-themes-tokens-no-theme + (let [tokens-lib (-> (ctob/make-tokens-lib) + (ctob/add-set (ctob/make-token-set :name "set-a" + :tokens {"token-1" + (ctob/make-token :name "token-1" + :type :border-radius + :value 10) + "token-2" + (ctob/make-token :name "token-2" + :type :border-radius + :value 20)})) + (ctob/add-set (ctob/make-token-set :name "set-b" + :tokens {"token-1" + (ctob/make-token :name "token-1" + :type :border-radius + :value 100) + "token-3" + (ctob/make-token :name "token-3" + :type :border-radius + :value 300)})) + (ctob/add-set (ctob/make-token-set :name "set-c" + :tokens {"token-1" + (ctob/make-token :name "token-1" + :type :border-radius + :value 1000) + "token-2" + (ctob/make-token :name "token-2" + :type :border-radius + :value 2000) + "token-3" + (ctob/make-token :name "token-3" + :type :border-radius + :value 3000) + "token-4" + (ctob/make-token :name "token-4" + :type :border-radius + :value 4000)})) + (ctob/update-theme ctob/hidden-token-theme-group ctob/hidden-token-theme-name + #(ctob/enable-sets % #{"set-a" "set-b"}))) + + tokens (ctob/get-active-themes-set-tokens tokens-lib)] + + (t/is (= (mapv key tokens) ["token-1" "token-2" "token-3"])) + (t/is (= (get-in tokens ["token-1" :value]) 100)) + (t/is (= (get-in tokens ["token-2" :value]) 20)) + (t/is (= (get-in tokens ["token-3" :value]) 300)))) + +(t/deftest list-active-themes-tokens-one-theme + (let [tokens-lib (-> (ctob/make-tokens-lib) + (ctob/add-set (ctob/make-token-set :name "set-a" + :tokens {"token-1" + (ctob/make-token :name "token-1" + :type :border-radius + :value 10) + "token-2" + (ctob/make-token :name "token-2" + :type :border-radius + :value 20)})) + (ctob/add-set (ctob/make-token-set :name "set-b" + :tokens {"token-1" + (ctob/make-token :name "token-1" + :type :border-radius + :value 100) + "token-3" + (ctob/make-token :name "token-3" + :type :border-radius + :value 300)})) + (ctob/add-set (ctob/make-token-set :name "set-c" + :tokens {"token-1" + (ctob/make-token :name "token-1" + :type :border-radius + :value 1000) + "token-2" + (ctob/make-token :name "token-2" + :type :border-radius + :value 2000) + "token-3" + (ctob/make-token :name "token-3" + :type :border-radius + :value 3000) + "token-4" + (ctob/make-token :name "token-4" + :type :border-radius + :value 4000)})) + (ctob/add-theme (ctob/make-token-theme :name "single-theme" + :sets #{"set-b" "set-c" "set-a"})) + (ctob/set-active-themes #{"/single-theme"})) + + tokens (ctob/get-active-themes-set-tokens tokens-lib)] + + ;; Note that sets order inside the theme is undefined. What matters is order in that the + ;; sets have been added to the library. + (t/is (= (mapv key tokens) ["token-1" "token-2" "token-3" "token-4"])) + (t/is (= (get-in tokens ["token-1" :value]) 1000)) + (t/is (= (get-in tokens ["token-2" :value]) 2000)) + (t/is (= (get-in tokens ["token-3" :value]) 3000)) + (t/is (= (get-in tokens ["token-4" :value]) 4000)))) + +(t/deftest list-active-themes-tokens-two-themes + (let [tokens-lib (-> (ctob/make-tokens-lib) + (ctob/add-set (ctob/make-token-set :name "set-a" + :tokens {"token-1" + (ctob/make-token :name "token-1" + :type :border-radius + :value 10) + "token-2" + (ctob/make-token :name "token-2" + :type :border-radius + :value 20)})) + (ctob/add-set (ctob/make-token-set :name "set-b" + :tokens {"token-1" + (ctob/make-token :name "token-1" + :type :border-radius + :value 100) + "token-3" + (ctob/make-token :name "token-3" + :type :border-radius + :value 300)})) + (ctob/add-set (ctob/make-token-set :name "set-c" + :tokens {"token-1" + (ctob/make-token :name "token-1" + :type :border-radius + :value 1000) + "token-2" + (ctob/make-token :name "token-2" + :type :border-radius + :value 2000) + "token-3" + (ctob/make-token :name "token-3" + :type :border-radius + :value 3000) + "token-4" + (ctob/make-token :name "token-4" + :type :border-radius + :value 4000)})) + (ctob/add-theme (ctob/make-token-theme :name "theme-1" + :sets #{"set-b"})) + (ctob/add-theme (ctob/make-token-theme :name "theme-2" + :sets #{"set-b" "set-a"})) + (ctob/set-active-themes #{"/theme-1" "/theme-2"})) + + tokens (ctob/get-active-themes-set-tokens tokens-lib)] + + ;; Note that themes order is irrelevant. What matters is the union of the active sets + ;; and the order of the sets in the library. + (t/is (= (mapv key tokens) ["token-1" "token-2" "token-3"])) + (t/is (= (get-in tokens ["token-1" :value]) 100)) + (t/is (= (get-in tokens ["token-2" :value]) 20)) + (t/is (= (get-in tokens ["token-3" :value]) 300)))) + +(t/deftest list-active-themes-tokens-bug-taiga-10617 + (let [tokens-lib (-> (ctob/make-tokens-lib) + (ctob/add-set (ctob/make-token-set :name "Mode / Dark" + :tokens {"red" + (ctob/make-token :name "red" + :type :color + :value "#700000")})) + (ctob/add-set (ctob/make-token-set :name "Mode / Light" + :tokens {"red" + (ctob/make-token :name "red" + :type :color + :value "#ff0000")})) + (ctob/add-set (ctob/make-token-set :name "Device / Desktop" + :tokens {"border1" + (ctob/make-token :name "border1" + :type :border-radius + :value 30)})) + (ctob/add-set (ctob/make-token-set :name "Device / Mobile" + :tokens {"border1" + (ctob/make-token :name "border1" + :type :border-radius + :value 50)})) + (ctob/add-theme (ctob/make-token-theme :group "App" + :name "Mobile" + :sets #{"Mode / Dark" "Device / Mobile"})) + (ctob/add-theme (ctob/make-token-theme :group "App" + :name "Web" + :sets #{"Mode / Dark" "Mode / Light" "Device / Desktop"})) + (ctob/add-theme (ctob/make-token-theme :group "Brand" + :name "Brand A" + :sets #{"Mode / Dark" "Mode / Light" "Device / Desktop" "Device / Mobile"})) + (ctob/add-theme (ctob/make-token-theme :group "Brand" + :name "Brand B" + :sets #{})) + (ctob/set-active-themes #{"App/Web" "Brand/Brand A"})) + + tokens (ctob/get-active-themes-set-tokens tokens-lib)] + + (t/is (= (mapv key tokens) ["red" "border1"])) + (t/is (= (get-in tokens ["red" :value]) "#ff0000")) + (t/is (= (get-in tokens ["border1" :value]) 50)))) + +(t/deftest list-active-themes-tokens-no-tokens + (let [tokens-lib (-> (ctob/make-tokens-lib) + (ctob/add-set (ctob/make-token-set :name "set-a"))) + + tokens (ctob/get-active-themes-set-tokens tokens-lib)] + + (t/is (empty? tokens)))) + +(t/deftest list-active-themes-tokens-no-sets + (let [tokens-lib (ctob/make-tokens-lib) + tokens (ctob/get-active-themes-set-tokens tokens-lib)] + + (t/is (empty? tokens)))) (t/deftest sets-at-path-active-state (let [tokens-lib (-> (ctob/make-tokens-lib)