From 9c0232fede3cd2b4faf6cf49004504ac4d30e9ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Moya?= Date: Mon, 27 Jul 2026 17:52:25 +0200 Subject: [PATCH] :tada: Make tokens library readonly when it's in an external file --- frontend/src/app/main/ui/context.cljs | 1 + .../tokens/management/context_menu.cljs | 55 ++++---- .../ui/workspace/tokens/management/group.cljs | 6 +- .../tokens/management/token_tree.cljs | 15 +- .../app/main/ui/workspace/tokens/sets.cljs | 13 +- .../main/ui/workspace/tokens/sets/lists.cljs | 43 +++--- .../app/main/ui/workspace/tokens/sidebar.cljs | 59 ++++---- .../app/main/ui/workspace/tokens/themes.cljs | 10 +- frontend/src/app/plugins/tokens.cljs | 28 +++- frontend/src/app/plugins/utils.cljs | 20 ++- .../src/app/app.component.html | 130 ++++++++++-------- .../src/app/app.component.ts | 7 + plugins/apps/poc-tokens-plugin/src/plugin.ts | 8 ++ plugins/libs/plugin-types/index.d.ts | 8 ++ 14 files changed, 253 insertions(+), 150 deletions(-) diff --git a/frontend/src/app/main/ui/context.cljs b/frontend/src/app/main/ui/context.cljs index fd008e83e4..1557cc2fef 100644 --- a/frontend/src/app/main/ui/context.cljs +++ b/frontend/src/app/main/ui/context.cljs @@ -47,6 +47,7 @@ (def permissions (mf/create-context nil)) (def can-edit? (mf/create-context nil)) +(def can-edit-tokens? (mf/create-context nil)) (def active-tokens-by-type "Active tokens by type, used mainly for provide tokens data to the 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 cb33815c7d..789108ee48 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 @@ -19,6 +19,7 @@ [app.main.refs :as refs] [app.main.store :as st] [app.main.ui.components.dropdown :refer [dropdown]] + [app.main.ui.context :as ctx] [app.main.ui.ds.foundations.assets.icon :refer [icon*] :as i] [app.main.ui.hooks :as hooks] [app.util.clipboard :as clipboard] @@ -335,31 +336,39 @@ (defn default-actions [{:keys [token selected-token-set-id on-delete-token errors]}] (let [{:keys [modal]} (dwta/get-token-properties token) + + can-edit-tokens? + (mf/use-ctx ctx/can-edit-tokens?) + on-copy-name #(clipboard/to-clipboard (:name token)) on-duplicate-token #(st/emit! (dwtl/duplicate-token (:id token)))] - [{:title (tr "workspace.tokens.edit") - :no-selectable true - :action (fn [event] - (let [{:keys [key fields]} modal] - (dom/stop-propagation event) - (st/emit! (dwtl/assign-token-context-menu nil) - (modal/show key {:x (.-clientX ^js event) - :y (.-clientY ^js event) - :position :right - :fields fields - :initial-errors errors - :action "edit" - :selected-token-set-id selected-token-set-id - :token token}))))} - {:title (tr "workspace.tokens.duplicate") - :no-selectable true - :action on-duplicate-token} - {:title (tr "workspace.tokens.copy-name") - :no-selectable true - :action on-copy-name} - {:title (tr "workspace.tokens.delete") - :no-selectable true - :action #(on-delete-token token)}])) + (concat + [] + (when can-edit-tokens? + [{:title (tr "workspace.tokens.edit") + :no-selectable true + :action (fn [event] + (let [{:keys [key fields]} modal] + (dom/stop-propagation event) + (st/emit! (dwtl/assign-token-context-menu nil) + (modal/show key {:x (.-clientX ^js event) + :y (.-clientY ^js event) + :position :right + :fields fields + :initial-errors errors + :action "edit" + :selected-token-set-id selected-token-set-id + :token token}))))} + {:title (tr "workspace.tokens.duplicate") + :no-selectable true + :action on-duplicate-token}]) + [{:title (tr "workspace.tokens.copy-name") + :no-selectable true + :action on-copy-name}] + (when can-edit-tokens? + [{:title (tr "workspace.tokens.delete") + :no-selectable true + :action #(on-delete-token token)}])))) (defn- allowed-shape-attributes [shapes] (reduce into #{} (map #(ctt/shape-type->attributes (:type %) (:layout %)) shapes))) 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 020375c28e..743bad3564 100644 --- a/frontend/src/app/main/ui/workspace/tokens/management/group.cljs +++ b/frontend/src/app/main/ui/workspace/tokens/management/group.cljs @@ -92,8 +92,8 @@ (not (and (some? edition) (= :text (:type (get objects edition)))))) - can-edit? - (mf/use-ctx ctx/can-edit?) + can-edit-tokens? + (mf/use-ctx ctx/can-edit-tokens?) is-selected-inside-layout (d/nilv is-selected-inside-layout false) @@ -177,7 +177,7 @@ :aria-controls (dm/str "token-tree-" (name type)) :on-toggle-expand on-toggle-open-click :icon (token-section-icon type)} - (when can-edit? + (when can-edit-tokens? [:> icon-button* {:id (str "add-token-button-" title) :icon "add" :aria-label (tr "workspace.tokens.add-token" title) diff --git a/frontend/src/app/main/ui/workspace/tokens/management/token_tree.cljs b/frontend/src/app/main/ui/workspace/tokens/management/token_tree.cljs index fa917bb0fc..0b3bd77530 100644 --- a/frontend/src/app/main/ui/workspace/tokens/management/token_tree.cljs +++ b/frontend/src/app/main/ui/workspace/tokens/management/token_tree.cljs @@ -140,14 +140,17 @@ on-pill-context-menu on-node-context-menu]}] (let [separator "." - raw-tree (mf/with-memo [tokens] - (cpn/build-tree-root tokens separator)) - permissions (mf/use-ctx ctx/permissions) - can-edit? (:can-edit permissions) + raw-tree + (mf/with-memo [tokens] + (cpn/build-tree-root tokens separator)) + + can-edit-file? + (mf/use-ctx ctx/can-edit?) + on-node-context-menu (mf/use-fn - (mf/deps can-edit? on-node-context-menu) + (mf/deps can-edit-file? on-node-context-menu) (fn [event node] - (when can-edit? + (when can-edit-file? (on-node-context-menu event node)))) ordered-nodes (mf/with-memo [raw-tree] diff --git a/frontend/src/app/main/ui/workspace/tokens/sets.cljs b/frontend/src/app/main/ui/workspace/tokens/sets.cljs index 3aaa4a43e3..199423b361 100644 --- a/frontend/src/app/main/ui/workspace/tokens/sets.cljs +++ b/frontend/src/app/main/ui/workspace/tokens/sets.cljs @@ -38,8 +38,8 @@ token-sets (some-> tokens-lib (ctob/get-set-tree)) - can-edit? - (mf/use-ctx ctx/can-edit?) + can-edit-tokens? + (mf/use-ctx ctx/can-edit-tokens?) token-set-active? (mf/use-fn @@ -55,17 +55,17 @@ on-reset-edition (mf/use-fn - (mf/deps can-edit?) + (mf/deps can-edit-tokens?) (fn [_] - (when can-edit? + (when can-edit-tokens? (st/emit! (dwtl/clear-token-set-edition) (dwtl/clear-token-set-creation))))) on-start-edition (mf/use-fn - (mf/deps can-edit?) + (mf/deps can-edit-tokens?) (fn [id] - (when can-edit? + (when can-edit-tokens? (st/emit! (dwtl/start-token-set-edition id)))))] [:> controlled-sets-list* @@ -81,7 +81,6 @@ :edition-id edition-id :origin "set-panel" - :can-edit can-edit? :on-start-edition on-start-edition :on-reset-edition on-reset-edition diff --git a/frontend/src/app/main/ui/workspace/tokens/sets/lists.cljs b/frontend/src/app/main/ui/workspace/tokens/sets/lists.cljs index 8322d30be8..179d7f44c0 100644 --- a/frontend/src/app/main/ui/workspace/tokens/sets/lists.cljs +++ b/frontend/src/app/main/ui/workspace/tokens/sets/lists.cljs @@ -86,8 +86,8 @@ (mf/defc inline-add-button* [] - (let [can-edit? (mf/use-ctx ctx/can-edit?)] - (if can-edit? + (let [can-edit-tokens? (mf/use-ctx ctx/can-edit-tokens?)] + (if can-edit-tokens? [:div {:class (stl/css :empty-sets-wrapper)} [:> text* {:as "span" :typography "body-small" :class (stl/css :empty-state-message)} (tr "workspace.tokens.no-sets-yet")] @@ -110,7 +110,10 @@ [{:keys [id label is-editing is-active is-selected is-draggable is-collapsed path depth index on-toggle on-drop on-start-edition on-reset-edition on-edit-submit on-toggle-collapse]}] - (let [can-edit? + (let [can-edit-tokens? + (mf/use-ctx ctx/can-edit-tokens?) + + can-edit-file? (mf/use-ctx ctx/can-edit?) label-id @@ -118,11 +121,11 @@ on-context-menu (mf/use-fn - (mf/deps is-editing id path can-edit?) + (mf/deps is-editing id path can-edit-tokens?) (fn [event] (dom/prevent-default event) (dom/stop-propagation event) - (when (and can-edit? (not is-editing)) + (when (and can-edit-tokens? (not is-editing)) (st/emit! (dwtl/assign-token-set-context-menu {:position (dom/get-client-position event) :is-group true @@ -141,12 +144,12 @@ on-checkbox-click (mf/use-fn - (mf/deps on-toggle path can-edit?) + (mf/deps on-toggle path can-edit-file?) #(on-toggle path)) on-edit-submit' (mf/use-fn - (mf/deps path on-edit-submit can-edit?) + (mf/deps path on-edit-submit can-edit-tokens?) #(on-edit-submit path %)) on-drop @@ -196,7 +199,7 @@ label] [:> checkbox* {:on-click on-checkbox-click - :disabled (not can-edit?) + :disabled (not can-edit-file?) :checked (case is-active :all true :partial "mixed" @@ -207,7 +210,11 @@ [{:keys [id set label is-editing is-active is-selected is-draggable is-new path depth index on-select on-toggle on-drop on-start-edition on-reset-edition on-edit-submit]}] - (let [can-edit? (mf/use-ctx ctx/can-edit?) + (let [can-edit-tokens? + (mf/use-ctx ctx/can-edit-tokens?) + + can-edit-file? + (mf/use-ctx ctx/can-edit?) on-click (mf/use-fn @@ -220,11 +227,11 @@ on-context-menu (mf/use-fn - (mf/deps is-editing id path can-edit?) + (mf/deps is-editing id path can-edit-tokens?) (fn [event] (dom/prevent-default event) (dom/stop-propagation event) - (when (and can-edit? (not is-editing)) + (when (and can-edit-tokens? (not is-editing)) (st/emit! (dwtl/assign-token-set-context-menu {:position (dom/get-client-position event) :is-group false @@ -305,7 +312,7 @@ label] [:> checkbox* {:on-click on-checkbox-click - :disabled (not can-edit?) + :disabled (not can-edit-file?) :arial-label (tr "workspace.tokens.select-set") :checked is-active}]])])) @@ -455,12 +462,12 @@ (assert (fn? is-token-set-active) "expected a function for `is-token-set-active` prop") (assert (fn? is-token-set-group-active) "expected a function for `is-token-set-group-active` prop") - (let [theme-modal? (= origin "theme-modal") - can-edit? (mf/use-ctx ctx/can-edit?) - draggable? (and (not theme-modal?) can-edit?) - empty-state? (and theme-modal? - (empty? token-sets) - (not new-path)) + (let [theme-modal? (= origin "theme-modal") + can-edit-tokens? (mf/use-ctx ctx/can-edit-tokens?) + draggable? (and (not theme-modal?) can-edit-tokens?) + empty-state? (and theme-modal? + (empty? token-sets) + (not new-path)) ;; NOTE: on-reset-edition and on-start-edition function can ;; come as nil, in this case we need to provide a safe diff --git a/frontend/src/app/main/ui/workspace/tokens/sidebar.cljs b/frontend/src/app/main/ui/workspace/tokens/sidebar.cljs index dfbc3815d1..93929e7816 100644 --- a/frontend/src/app/main/ui/workspace/tokens/sidebar.cljs +++ b/frontend/src/app/main/ui/workspace/tokens/sidebar.cljs @@ -28,7 +28,8 @@ [app.util.dom :as dom] [app.util.i18n :refer [tr]] [rumext.v2 :as mf] - [shadow.resource])) + [shadow.resource] + [app.common.files.tokens :as cfo])) ;; Components ------------------------------------------------------------------ @@ -62,9 +63,8 @@ {::mf/private true} [{:keys [resize-height] :as props}] - (let [can-edit? - (mf/use-ctx ctx/can-edit?)] - + (let [can-edit-tokens? + (mf/use-ctx ctx/can-edit-tokens?)] [:* [:> token-set-context-menu*] [:section {:data-testid "token-management-sidebar" @@ -73,7 +73,7 @@ [:> themes-header*] [:div {:class (stl/css :sidebar-header)} [:> title-bar* {:title (tr "labels.sets")} - (when can-edit? + (when can-edit-tokens? [:> tsetslist/add-button*])]] [:> token-sets-list* props]]])) @@ -83,8 +83,8 @@ (let [show-menu* (mf/use-state false) show-menu? (deref show-menu*) - can-edit? - (mf/use-ctx ctx/can-edit?) + can-edit-tokens? + (mf/use-ctx ctx/can-edit-tokens?) open-menu (mf/use-fn @@ -124,7 +124,7 @@ :on-close close-menu :id "tokens-menu" :class (stl/css :import-export-menu)} - (when can-edit? + (when can-edit-tokens? [:> dropdown-menu-item* {:class (stl/css :import-export-menu-item) :on-click on-modal-show} [:div {:class (stl/css :import-menu-item)} @@ -133,8 +133,7 @@ :on-click on-export} (tr "labels.export")]] - - (when (and can-edit? (contains? cf/flags :token-base-font-size)) + (when (and can-edit-tokens? (contains? cf/flags :token-base-font-size)) [:> icon-button* {:variant "secondary" :icon i/settings :aria-label "Settings" @@ -146,18 +145,30 @@ on-lost-pointer-capture-pages :on-lost-pointer-capture on-pointer-move-pages :on-pointer-move size-pages-opened :size} - (use-resize-hook :tokens 200 38 "0.6" :y false nil)] + (use-resize-hook :tokens 200 38 "0.6" :y false nil) - [:div {:class (stl/css :sidebar-wrapper)} - [:> token-management-section* - {:resize-height size-pages-opened - :tokens-lib tokens-lib}] - [:article {:class (stl/css :tokens-section-wrapper) - :data-testid "tokens-sidebar"} - [:div {:class (stl/css :resize-area-horiz) - :on-pointer-down on-pointer-down-pages - :on-lost-pointer-capture on-lost-pointer-capture-pages - :on-pointer-move on-pointer-move-pages} - [:div {:class (stl/css :resize-handle-horiz)}]] - [:> tokens-section* props]] - [:> import-export-button*]])) + current-file-data + (mf/deref refs/workspace-data) + + can-edit-file? + (mf/use-ctx ctx/can-edit?) + + can-edit-tokens? + (mf/with-memo [can-edit-file? current-file-data] + (and can-edit-file? + (cfo/editable-tokens? current-file-data)))] + + [:> (mf/provider ctx/can-edit-tokens?) {:value can-edit-tokens?} + [:div {:class (stl/css :sidebar-wrapper)} + [:> token-management-section* + {:resize-height size-pages-opened + :tokens-lib tokens-lib}] + [:article {:class (stl/css :tokens-section-wrapper) + :data-testid "tokens-sidebar"} + [:div {:class (stl/css :resize-area-horiz) + :on-pointer-down on-pointer-down-pages + :on-lost-pointer-capture on-lost-pointer-capture-pages + :on-pointer-move on-pointer-move-pages} + [:div {:class (stl/css :resize-handle-horiz)}]] + [:> tokens-section* props]] + [:> import-export-button*]]])) diff --git a/frontend/src/app/main/ui/workspace/tokens/themes.cljs b/frontend/src/app/main/ui/workspace/tokens/themes.cljs index ce9a960b5f..711ddd8c29 100644 --- a/frontend/src/app/main/ui/workspace/tokens/themes.cljs +++ b/frontend/src/app/main/ui/workspace/tokens/themes.cljs @@ -23,8 +23,8 @@ (let [ordered-themes (mf/deref refs/workspace-token-themes-no-hidden) - can-edit? - (mf/use-ctx ctx/can-edit?) + can-edit-tokens? + (mf/use-ctx ctx/can-edit-tokens?) open-modal (mf/use-fn @@ -38,11 +38,11 @@ [:div {:class (stl/css :empty-theme-wrapper)} [:> text* {:as "span" :typography "body-small" :class (stl/css :empty-state-message)} (tr "workspace.tokens.no-themes")] - (when can-edit? + (when can-edit-tokens? [:button {:on-click open-modal :class (stl/css :create-theme-button)} (tr "workspace.tokens.create-one")])] - (if can-edit? + (if can-edit-tokens? [:div {:class (stl/css :theme-selector-wrapper)} [:> theme-selector*] [:> button* {:variant "secondary" @@ -50,6 +50,6 @@ :class (stl/css :edit-theme-button) :on-click open-modal} (tr "labels.edit")]] - [:div {:title (when-not can-edit? + [:div {:title (when-not can-edit-tokens? (tr "workspace.tokens.no-permission-themes"))} [:> theme-selector*]]))])) diff --git a/frontend/src/app/plugins/tokens.cljs b/frontend/src/app/plugins/tokens.cljs index 6d91da040d..2777bc0008 100644 --- a/frontend/src/app/plugins/tokens.cljs +++ b/frontend/src/app/plugins/tokens.cljs @@ -10,6 +10,7 @@ [app.common.files.tokens :as cfo] [app.common.json :as json] [app.common.schema :as sm] + [app.common.types.file :as ctf] [app.common.types.token :as cto] [app.common.types.tokens-lib :as ctob] [app.common.types.tokens-status :as ctos] @@ -205,6 +206,7 @@ (ctob/get-tokens set-id))) :set (fn [_ value] + (u/check-editable-tokens file-id) (st/emit! (-> (dwtl/update-token set-id id {:name value}) (se/add-event plugin-id))))} @@ -231,6 +233,7 @@ base)) :set (fn [_ value] + (u/check-editable-tokens file-id) (let [token (u/locate-token file-id set-id id) value (cond-> value (= :font-family (:type token)) @@ -268,6 +271,7 @@ :schema cfo/schema:token-description :set (fn [_ value] + (u/check-editable-tokens file-id) (st/emit! (-> (dwtl/update-token set-id id {:description value}) (se/add-event :plugin-id))))} @@ -278,6 +282,7 @@ ;; - use this function in dwtl/duplicate-token ;; - return the new token proxy using the locally forced id ;; - do the same with sets and themes + (u/check-editable-tokens file-id) (let [token (u/locate-token file-id set-id id) token' (ctob/make-token (-> (datafy token) (dissoc :id @@ -288,6 +293,7 @@ :remove (fn [] + (u/check-editable-tokens file-id) (st/emit! (-> (dwtl/delete-token set-id id) (se/add-event plugin-id)))) @@ -340,6 +346,7 @@ id) :set (fn [_ name] + (u/check-editable-tokens file-id) (let [set (u/locate-token-set file-id id)] (st/emit! (dwtl/rename-token-set set name))))} @@ -353,7 +360,7 @@ :schema ::sm/boolean :set (fn [_ value] - (st/emit! (dwtl/set-enabled-token-set id value)))} + (st/emit! (dwtl/set-enabled-token-set id value)))} ;; This can be done even with tokens in an external library :toggleActive (fn [_] @@ -416,6 +423,7 @@ (sm/update-properties assoc :decode/json cfo/convert-dtcg-token))])) :decode/options {:key-fn identity} :fn (fn [attrs] + (u/check-editable-tokens file-id) (let [tokens-lib (u/locate-tokens-lib file-id) token (ctob/make-token attrs) ;; Resolve against all tokens in the library (including those @@ -441,6 +449,7 @@ :duplicate (fn [] + (u/check-editable-tokens file-id) (let [id-ref (atom nil)] (st/emit! (dwtl/duplicate-token-set id {:id-ref id-ref})) (when (some? @id-ref) @@ -448,6 +457,7 @@ :remove (fn [] + (u/check-editable-tokens file-id) (st/emit! (dwtl/delete-token-set id)))))) (defn token-theme-proxy? [p] @@ -501,6 +511,7 @@ (:id theme))) :set (fn [_ group] + (u/check-editable-tokens file-id) (let [theme (u/locate-token-theme file-id id)] (st/emit! (dwtl/update-token-theme id (assoc theme :group group)))))} @@ -517,6 +528,7 @@ (:group theme))) :set (fn [_ name] + (u/check-editable-tokens file-id) (let [theme (u/locate-token-theme file-id id)] (when name (st/emit! (dwtl/update-token-theme id (assoc theme :name name))))))} @@ -554,6 +566,7 @@ {:enumerable false :schema [:tuple [:or [:fn token-set-proxy?] ::sm/uuid]] :fn (fn [set-arg] + (u/check-editable-tokens file-id) (let [set-name (token-set-name (resolve-token-set file-id set-arg)) theme (u/locate-token-theme file-id id)] (when (and set-name theme) @@ -563,6 +576,7 @@ {:enumerable false :schema [:tuple [:or [:fn token-set-proxy?] ::sm/uuid]] :fn (fn [set-arg] + (u/check-editable-tokens file-id) (let [set-name (token-set-name (resolve-token-set file-id set-arg)) theme (u/locate-token-theme file-id id)] (when (and set-name theme) @@ -570,6 +584,7 @@ :duplicate (fn [] + (u/check-editable-tokens file-id) (let [theme (u/locate-token-theme file-id id) theme' (ctob/make-token-theme (-> (datafy theme) (dissoc :id @@ -579,6 +594,7 @@ :remove (fn [] + (u/check-editable-tokens file-id) (st/emit! (dwtl/delete-token-theme id))))) (defn tokens-catalog @@ -588,6 +604,14 @@ :$plugin {:enumerable false :get (constantly plugin-id)} :$id {:enumerable false :get (constantly file-id)} + :isEditableTokens + {:this false + :enumerable false + :get + (fn [] + (let [file (u/locate-file file-id)] + (cfo/editable-tokens? (ctf/file-data file))))} + :themes {:this true :enumerable false @@ -619,6 +643,7 @@ nil) (sm/dissoc-key :id))]) ;; We don't allow plugins to set the id :fn (fn [attrs] + (u/check-editable-tokens file-id) (let [theme (ctob/make-token-theme attrs)] (st/emit! (dwtl/create-token-theme theme)) (token-theme-proxy plugin-id file-id (:id theme))))} @@ -638,6 +663,7 @@ (sm/merge [:map [:active {:optional true} ::sm/boolean]]))] :fn (fn [attrs] + (u/check-editable-tokens file-id) (let [active? (boolean (:active attrs)) attrs (-> attrs (dissoc :active) diff --git a/frontend/src/app/plugins/utils.cljs b/frontend/src/app/plugins/utils.cljs index 18b63bec44..7bfb0c82cf 100644 --- a/frontend/src/app/plugins/utils.cljs +++ b/frontend/src/app/plugins/utils.cljs @@ -9,6 +9,7 @@ (:require [app.common.data :as d] [app.common.data.macros :as dm] + [app.common.files.tokens :as cfo] [app.common.i18n :as i18n :refer [tr]] [app.common.schema :as sm] [app.common.schema.messages :as csm] @@ -67,13 +68,18 @@ (defn locate-tokens-lib [file-id] - (let [file (locate-file file-id)] - (->> file :data :tokens-lib))) + (let [file (locate-file file-id) + file-data (ctf/file-data file) + tokens-source-id (cfo/get-tokens-source file-data) + tokens-file (locate-file tokens-source-id) + tokens-file-data (ctf/file-data tokens-file)] + (cfo/get-tokens-lib tokens-file-data))) (defn locate-tokens-status [file-id] - (let [file (locate-file file-id)] - (->> file :data :tokens-status))) + (let [file (locate-file file-id) + file-data (ctf/file-data file)] + (cfo/get-tokens-status file-data))) (defn locate-token-theme [file-id id] @@ -271,6 +277,12 @@ (boolean (dm/get-in @st/state [:plugins :flags plugin-id :natural-child-ordering]))) +(defn check-editable-tokens + [file-id] + (let [file (locate-file file-id)] + (when-not (cfo/editable-tokens? (ctf/file-data file)) + (throw (js/Error. (dm/str "[PENPOT PLUGIN] Cannot modify tokens in an external library")))))) + (defn throw-validation-errors? [plugin-id] (boolean diff --git a/plugins/apps/poc-tokens-plugin/src/app/app.component.html b/plugins/apps/poc-tokens-plugin/src/app/app.component.html index 9bb6fc8b9a..1c4f6ae4ea 100644 --- a/plugins/apps/poc-tokens-plugin/src/app/app.component.html +++ b/plugins/apps/poc-tokens-plugin/src/app/app.component.html @@ -6,13 +6,15 @@

THEMES

- + @if (isEditableTokens) { + + }