From a0f737e3a8bb6bfd5e04afe7ac357306ff3c3f27 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Mon, 5 Jan 2026 16:02:11 +0800 Subject: [PATCH] enhance(ux): block collapse state should be isolated in container --- src/main/frontend/components/block.cljs | 40 ++++++++++++++--------- src/main/frontend/components/query.cljs | 8 +++-- src/main/frontend/components/views.cljs | 7 +++-- src/main/frontend/state.cljs | 42 ++++++++++++++++--------- 4 files changed, 61 insertions(+), 36 deletions(-) diff --git a/src/main/frontend/components/block.cljs b/src/main/frontend/components/block.cljs index 65f454c03b..d10979779a 100644 --- a/src/main/frontend/components/block.cljs +++ b/src/main/frontend/components/block.cljs @@ -1744,6 +1744,7 @@ doc-mode? (state/sub :document/mode?) control-show? (util/react *control-show?) ref? (:ref? config) + container-id (:container-id config) empty-content? (block-content-empty? block) fold-button-right? (state/enable-fold-button-right?) own-number-list? (:own-order-number-list? config) @@ -1774,9 +1775,10 @@ :on-click (fn [event] (util/stop event) (state/clear-edit!) + (state/set-state! :editor/container-id container-id) (p/do! (if ref? - (state/toggle-collapsed-block! uuid) + (state/toggle-collapsed-block! uuid container-id) (if collapsed? (editor-handler/expand-block! uuid) (editor-handler/collapse-block! uuid))) @@ -2984,7 +2986,7 @@ (:view? config) (root-block? config block) (and (or (ldb/class? block) (ldb/property? block)) (:page-title? config))) - (state/sub-block-collapsed uuid) + (state/sub-block-collapsed uuid container-id) :else db-collapsed?) @@ -3244,10 +3246,12 @@ (boolean result))) (defn- set-collapsed-block! - [block-id v] + [block-id v container-id] (if (false? v) - (editor-handler/expand-block! block-id {:skip-db-collpsing? true}) - (state/set-collapsed-block! block-id v))) + (do + (editor-handler/expand-block! block-id {:skip-db-collpsing? true}) + (state/set-collapsed-block! block-id v container-id)) + (state/set-collapsed-block! block-id v container-id))) (rum/defcs loaded-block-container < rum/reactive db-mixins/query (rum/local false ::show-block-left-menu?) @@ -3257,19 +3261,23 @@ (let [[config block] (:rum/args state) block-id (:block/uuid block) linked-block? (or (:block/link block) - (:original-block config))] + (:original-block config)) + container-id (if (or linked-block? (nil? (:container-id config))) + (state/get-next-container-id) + (:container-id config))] (when-not (:property-block? config) (cond (and (:page-title? config) (or (ldb/class? block) (ldb/property? block)) (not config/publishing?)) - (let [collapsed? (state/get-block-collapsed block-id)] - (set-collapsed-block! block-id (if (some? collapsed?) collapsed? true))) + (let [collapsed? (state/get-block-collapsed block-id container-id)] + (set-collapsed-block! block-id (if (some? collapsed?) collapsed? true) container-id)) (root-block? config block) - (set-collapsed-block! block-id false) + (set-collapsed-block! block-id false container-id) (or (:view? config) (:ref? config) (:custom-query? config)) (set-collapsed-block! block-id - (boolean (editor-handler/block-default-collapsed? block config))) + (boolean (editor-handler/block-default-collapsed? block config)) + container-id) :else nil)) @@ -3277,14 +3285,15 @@ (assoc state ::control-show? (atom false) ::navigating-block (atom (:block/uuid block))) - (or linked-block? (nil? (:container-id config))) - (assoc ::container-id (state/get-next-container-id))))) + (and container-id (or linked-block? (nil? (:container-id config)))) + (assoc ::container-id container-id)))) :will-unmount (fn [state] ;; restore root block's collapsed state (let [[config block] (:rum/args state) - block-id (:block/uuid block)] + block-id (:block/uuid block) + container-id (or (:container-id config) (::container-id state))] (when (root-block? config block) - (set-collapsed-block! block-id nil))) + (set-collapsed-block! block-id nil container-id))) state)} [state config block & {:as opts}] (let [repo (state/get-current-repo) @@ -3318,7 +3327,8 @@ (p/let [block (db-async/ result-count 1) " results" " result"))])])) (defn- calculate-collapsed? - [current-block current-block-uuid {:keys [collapsed?]}] - (let [temp-collapsed? (state/sub-block-collapsed current-block-uuid) + [current-block current-block-uuid {:keys [collapsed? container-id]}] + (let [temp-collapsed? (state/sub-block-collapsed current-block-uuid container-id) collapsed?' (if (some? temp-collapsed?) temp-collapsed? (or collapsed? @@ -185,7 +185,9 @@ (:block/uuid config)) current-block (db/entity [:block/uuid current-block-uuid]) ;; Get query result - collapsed?' (calculate-collapsed? current-block current-block-uuid {:collapsed? false}) + collapsed?' (calculate-collapsed? current-block current-block-uuid + {:collapsed? false + :container-id (:container-id config)}) built-in-collapsed? (and collapsed? built-in-query?) config' (assoc config :current-block current-block diff --git a/src/main/frontend/components/views.cljs b/src/main/frontend/components/views.cljs index bde2e50684..c268d36f81 100644 --- a/src/main/frontend/components/views.cljs +++ b/src/main/frontend/components/views.cljs @@ -1649,9 +1649,10 @@ (when (and (get-in table [:data-fns :add-new-object!]) (or (empty? rows) items-rendered?)) (shui/table-footer (add-new-row (:view-entity option) table)))]])))) -(rum/defc list-view < rum/static - [{:keys [config ref-matched-children-ids disable-virtualized?] :as option} view-entity {:keys [rows]} *scroller-ref] - (let [lazy-item-render (fn [rows idx] +(rum/defcs list-view < rum/static mixins/container-id + [state {:keys [config ref-matched-children-ids disable-virtualized?] :as option} view-entity {:keys [rows]} *scroller-ref] + (let [config (assoc config :container-id (:container-id state)) + lazy-item-render (fn [rows idx] (lazy-item rows idx (assoc option :list-view? true) (fn [block] (let [config' (cond-> diff --git a/src/main/frontend/state.cljs b/src/main/frontend/state.cljs index 79dd2022a9..5b2bd81a83 100644 --- a/src/main/frontend/state.cljs +++ b/src/main/frontend/state.cljs @@ -124,7 +124,7 @@ ;; 2. zoom-in view ;; 3. queries ;; 4. references - ;; graph => {:block-id bool} + ;; graph => {container-id {:block-id bool}} :ui/collapsed-blocks {} :ui/sidebar-collapsed-blocks {} :ui/root-component nil @@ -1924,23 +1924,39 @@ Similar to re-frame subscriptions" (->> (sub :sidebar/blocks) (filter #(= (first %) current-repo))))) +(defn get-current-editor-container-id + [] + @(:editor/container-id @state)) + +(defn- resolve-container-id + [container-id] + (or container-id (get-current-editor-container-id) :unknown-container)) + (defn toggle-collapsed-block! - [block-id] - (let [current-repo (get-current-repo)] - (update-state! [:ui/collapsed-blocks current-repo block-id] not))) + ([block-id] (toggle-collapsed-block! block-id nil)) + ([block-id container-id] + (let [current-repo (get-current-repo) + container-id (resolve-container-id container-id)] + (update-state! [:ui/collapsed-blocks current-repo container-id block-id] not)))) (defn set-collapsed-block! - [block-id value] - (let [current-repo (get-current-repo)] - (set-state! [:ui/collapsed-blocks current-repo block-id] value))) + ([block-id value] (set-collapsed-block! block-id value nil)) + ([block-id value container-id] + (when (nil? container-id) + (js/console.trace)) + (let [current-repo (get-current-repo) + container-id (resolve-container-id container-id)] + (set-state! [:ui/collapsed-blocks current-repo container-id block-id] value)))) (defn sub-block-collapsed - [block-id] - (sub [:ui/collapsed-blocks (get-current-repo) block-id])) + ([block-id] (sub-block-collapsed block-id nil)) + ([block-id container-id] + (sub [:ui/collapsed-blocks (get-current-repo) (resolve-container-id container-id) block-id]))) (defn get-block-collapsed - [block-id] - (get-in @state [:ui/collapsed-blocks (get-current-repo) block-id])) + ([block-id] (get-block-collapsed block-id nil)) + ([block-id container-id] + (get-in @state [:ui/collapsed-blocks (get-current-repo) (resolve-container-id container-id) block-id]))) (defn get-modal-id [] @@ -2048,10 +2064,6 @@ Similar to re-frame subscriptions" id)) (get-next-container-id))) -(defn get-current-editor-container-id - [] - @(:editor/container-id @state)) - (comment (defn remove-container-key! [key]