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 947e8ad456..4de3430986 100644 --- a/frontend/src/app/main/data/workspace/tokens/library_edit.cljs +++ b/frontend/src/app/main/data/workspace/tokens/library_edit.cljs @@ -23,6 +23,7 @@ [app.main.data.workspace.shapes :as dwsh] [app.main.data.workspace.tokens.propagation :as dwtp] [app.util.i18n :refer [tr]] + [app.util.storage :as storage] [beicon.v2.core :as rx] [cuerdas.core :as str] [potok.v2.core :as ptk])) @@ -67,6 +68,41 @@ ;; TOKENS TREE - Type folders ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Helper functions for localStorage persistence +(defn- get-unfolded-token-types-from-storage + [file-id set-id] + (get-in storage/user [:app.main.ui.workspace.tokens/unfolded-token-types file-id set-id] #{})) + +(defn- save-unfolded-token-types-in-storage + [file-id set-id types] + (swap! storage/user update :app.main.ui.workspace.tokens/unfolded-token-types + assoc-in [file-id set-id] (vec types))) + +;; Helper functions for app state persistence +(defn- make-unfolded-token-types-state + [file-id set-id types] + {:file-id file-id + :set-id set-id + :types (set (or types #{}))}) + +(defn- get-unfolded-token-types-from-state + [state] + (let [value (get-in state [:workspace-tokens :unfolded-token-types])] + (or (:types value) #{}))) + +(defn restore-unfolded-token-types + "Loads unfolded token types from localStorage for the current file and set" + [] + (ptk/reify ::restore-unfolded-token-types + ptk/UpdateEvent + (update [_ state] + (let [file-id (:current-file-id state) + set-id (get-in state [:workspace-tokens :selected-token-set-id]) + stored (get-unfolded-token-types-from-storage file-id set-id)] + (assoc-in state + [:workspace-tokens :unfolded-token-types] + (make-unfolded-token-types-state file-id set-id stored)))))) + (defn open-token-type ([types type] (conj (or types #{}) type)) @@ -74,8 +110,16 @@ (ptk/reify ::open-token-type ptk/UpdateEvent (update [_ state] - (update-in state [:workspace-tokens :unfolded-token-types] - #(open-token-type % type)))))) + (let [file-id (:current-file-id state) + set-id (get-in state [:workspace-tokens :selected-token-set-id]) + types (get-unfolded-token-types-from-state state) + new-types (open-token-type types type) + new-state (assoc-in state + [:workspace-tokens :unfolded-token-types] + (make-unfolded-token-types-state file-id set-id new-types))] + (save-unfolded-token-types-in-storage file-id set-id + new-types) + new-state))))) (defn close-token-type ([types type] @@ -84,27 +128,47 @@ (ptk/reify ::close-token-type ptk/UpdateEvent (update [_ state] - (update-in state [:workspace-tokens :unfolded-token-types] - #(close-token-type % type)))))) + (let [file-id (:current-file-id state) + set-id (get-in state [:workspace-tokens :selected-token-set-id]) + types (get-unfolded-token-types-from-state state) + new-types (close-token-type types type) + new-state (assoc-in state + [:workspace-tokens :unfolded-token-types] + (make-unfolded-token-types-state file-id set-id new-types))] + (save-unfolded-token-types-in-storage file-id set-id + new-types) + new-state))))) -(defn toggle-token-type +(defn + toggle-token-type [type] (ptk/reify ::toggle-token-type ptk/UpdateEvent (update [_ state] - (update-in state [:workspace-tokens :unfolded-token-types] - (fn [types] - (if (contains? (or types #{}) type) - (close-token-type types type) - (open-token-type types type))))))) + (let [file-id (:current-file-id state) + set-id (get-in state [:workspace-tokens :selected-token-set-id]) + types (get-unfolded-token-types-from-state state) + new-types (if (contains? types type) + (close-token-type types type) + (open-token-type types type)) + new-state (assoc-in state + [:workspace-tokens :unfolded-token-types] + (make-unfolded-token-types-state file-id set-id new-types))] + (save-unfolded-token-types-in-storage file-id set-id + new-types) + new-state)))) (defn clear-tokens-types [] (ptk/reify ::clear-tokens-types ptk/UpdateEvent (update [_ state] - (assoc-in state [:workspace-tokens :unfolded-token-types] [])))) - + (let [file-id (:current-file-id state) + set-id (get-in state [:workspace-tokens :selected-token-set-id])] + (save-unfolded-token-types-in-storage file-id set-id #{}) + (assoc-in state + [:workspace-tokens :unfolded-token-types] + (make-unfolded-token-types-state file-id set-id #{})))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; TOKENS TREE - Toggle tree nodes @@ -658,7 +722,12 @@ (ptk/reify ::set-selected-token-set-id ptk/UpdateEvent (update [_ state] - (update state :workspace-tokens assoc :selected-token-set-id id)))) + (let [file-id (:current-file-id state) + stored (get-unfolded-token-types-from-storage file-id id)] + (-> state + (update :workspace-tokens assoc :selected-token-set-id id) + (assoc-in [:workspace-tokens :unfolded-token-types] + (make-unfolded-token-types-state file-id id stored))))))) (defn start-token-set-edition [edition-id] 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 83228ecaac..a9b6914b9f 100644 --- a/frontend/src/app/main/ui/workspace/tokens/management/group.cljs +++ b/frontend/src/app/main/ui/workspace/tokens/management/group.cljs @@ -76,9 +76,14 @@ (get dwta/token-properties type) folded-token-paths (mf/deref ref:folded-token-paths) - unfolded-token-types (mf/deref ref:unfolded-token-types) + unfolded-token-types-state (mf/deref ref:unfolded-token-types) - is-type-unfolded (contains? (set unfolded-token-types) type) + current-file (mf/deref refs/file) + + is-same-file-set? (and (= (:file-id unfolded-token-types-state) (:id current-file)) + (= (:set-id unfolded-token-types-state) selected-token-set-id)) + is-type-unfolded (and is-same-file-set? + (contains? (set (:types unfolded-token-types-state)) type)) editing-ref (mf/deref refs/workspace-editor-state) edition (mf/deref refs/selected-edition) @@ -157,6 +162,10 @@ :level :warning :timeout 3000}))))))))] + (mf/use-effect + (fn [] + (st/emit! (dwtl/restore-unfolded-token-types)))) + [:div {:class (stl/css :token-section-wrapper) :data-testid (dm/str "section-" (name type))} [:> layer-button* {:label title diff --git a/frontend/src/app/main/ui/workspace/tokens/sets.cljs b/frontend/src/app/main/ui/workspace/tokens/sets.cljs index 49938e462b..56621eceac 100644 --- a/frontend/src/app/main/ui/workspace/tokens/sets.cljs +++ b/frontend/src/app/main/ui/workspace/tokens/sets.cljs @@ -17,7 +17,6 @@ (defn- on-select-token-set-click [id] (st/emit! (dwtl/clear-tokens-paths) - (dwtl/clear-tokens-types) (dwtl/set-selected-token-set-id id))) (defn- on-toggle-token-set-click [name]