enhance(ux): block collapse state should be isolated in container

This commit is contained in:
Tienson Qin
2026-01-05 16:02:11 +08:00
parent bb9a51d020
commit a0f737e3a8
4 changed files with 61 additions and 36 deletions

View File

@@ -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/<get-block (state/get-current-repo)
id
{:children? (not
(if-some [result (state/get-block-collapsed (:block/uuid block))]
(if-some [result (state/get-block-collapsed (:block/uuid block)
(:container-id config))]
result
(:block/collapsed? block)))
:skip-refresh? false})]

View File

@@ -111,8 +111,8 @@
(str result-count (if (> 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

View File

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

View File

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