🎉 Save tokens tree state in local storage (#8922)

This commit is contained in:
Xaviju 2026-04-15 11:24:01 +02:00 committed by GitHub
parent 5dec75fe62
commit 431056404c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 93 additions and 16 deletions

View File

@ -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]

View File

@ -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

View File

@ -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]