Jelajahi Sumber

enhance: separate references/queries collapse state from db

addresses #3744
Tienson Qin 3 tahun lalu
induk
melakukan
9f8028d51b

+ 17 - 15
src/main/frontend/components/block.cljs

@@ -1383,9 +1383,8 @@
        (map editor-handler/expand-block! block-ids)))))
 
 (rum/defc block-children < rum/reactive
-  [config children collapsed? *default-collapsed?]
+  [config children collapsed?]
   (let [ref? (:ref? config)
-        collapsed? (if ref? (rum/react *default-collapsed?) collapsed?)
         children (and (coll? children) (filter map? children))]
     (when (and (coll? children)
                (seq children)
@@ -1422,7 +1421,7 @@
    (every? #(= % ["Horizontal_Rule"]) body)))
 
 (rum/defcs block-control < rum/reactive
-  [state config block uuid block-id body children collapsed? *default-collapsed? *control-show? edit?]
+  [state config block uuid block-id body children collapsed? *control-show? edit?]
   (let [doc-mode? (state/sub :document/mode?)
         has-children-blocks? (and (coll? children) (seq children))
         has-child? (and
@@ -1435,6 +1434,7 @@
                            has-children-blocks?)
                        (util/react *control-show?))
         ref? (:ref? config)
+        block? (:block? config)
         empty-content? (block-content-empty? block)]
     [:div.mr-1.flex.flex-row.items-center.sm:mr-2
      {:style {:height 24
@@ -1446,10 +1446,11 @@
        :on-click (fn [event]
                    (util/stop event)
                    (when-not (and (not collapsed?) (not has-child?))
-                     (when ref? (swap! *default-collapsed? not))
-                     (if collapsed?
-                       (editor-handler/expand-block! uuid)
-                       (editor-handler/collapse-block! uuid))))}
+                     (if (or ref? block?)
+                       (state/toggle-collapsed-block! uuid)
+                       (if collapsed?
+                         (editor-handler/expand-block! uuid)
+                         (editor-handler/collapse-block! uuid)))))}
       [:span {:class (if control-show? "control-show" "control-hide")}
        (ui/rotating-arrow collapsed?)]]
      (let [bullet [:a {:on-click (fn [event]
@@ -2171,10 +2172,11 @@
 (rum/defcs block-container < rum/reactive
   {:init (fn [state]
            (let [[config block] (:rum/args state)]
+             (state/set-collapsed-block! (:block/uuid block)
+                                         (editor-handler/block-default-collapsed? block config))
              (assoc state
                     ::init-collapsed? (get-in block [:block/properties :collapsed])
-                    ::control-show? (atom false)
-                    ::default-collapsed? (atom (editor-handler/block-default-collapsed? block config)))))
+                    ::control-show? (atom false))))
    :should-update (fn [old-state new-state]
                     (let [compare-keys [:block/uuid :block/properties
                                         :block/parent :block/left
@@ -2198,11 +2200,11 @@
                  config)
         heading? (and (= type :heading) heading-level (<= heading-level 6))
         *control-show? (get state ::control-show?)
-        *default-collapsed? (get state ::default-collapsed?)
-        collapsed? (if (not= init-collapsed? (:collapsed properties))
-                     (:collapsed properties)
-                     @*default-collapsed?)
         ref? (boolean (:ref? config))
+        block? (boolean (:block? config))
+        collapsed? (if (or ref? block?)
+                     (state/sub-collapsed uuid)
+                     (:collapsed properties))
         breadcrumb-show? (:breadcrumb-show? config)
         slide? (boolean (:slide? config))
         custom-query? (boolean (:custom-query? config))
@@ -2265,11 +2267,11 @@
        :on-mouse-leave (fn [e]
                          (block-mouse-leave e *control-show? block-id doc-mode?))}
       (when (not slide?)
-        (block-control config block uuid block-id body children collapsed? *default-collapsed? *control-show? edit?))
+        (block-control config block uuid block-id body children collapsed? *control-show? edit?))
 
       (block-content-or-editor config block edit-input-id block-id heading-level edit?)]
 
-     (block-children config children collapsed? *default-collapsed?)
+     (block-children config children collapsed?)
 
      (dnd-separator-wrapper block block-id slide? false false)]))
 

+ 11 - 2
src/main/frontend/handler/editor.cljs

@@ -3378,12 +3378,21 @@
          (map (fn [x] (dissoc x :block/children))))
        (remove nil?)))))
 
+(defn- skip-collapsing-in-db?
+  []
+  (let [config (:config (state/get-editor-args))]
+    (or (:ref? config) (:block? config))))
+
 (defn collapse-block! [block-id]
   (when (collapsable? block-id)
-    (set-block-property! block-id :collapsed true)))
+    (when-not (skip-collapsing-in-db?)
+      (set-block-property! block-id :collapsed true))
+    (state/set-collapsed-block! block-id true)))
 
 (defn expand-block! [block-id]
-  (remove-block-property! block-id :collapsed))
+  (when-not (skip-collapsing-in-db?)
+    (remove-block-property! block-id :collapsed))
+  (state/set-collapsed-block! block-id false))
 
 (defn expand!
   ([e] (expand! e false))

+ 22 - 0
src/main/frontend/state.cljs

@@ -70,6 +70,14 @@
       :ui/wide-mode? false
       ;; :show-all, :hide-block-body, :hide-block-children
       :ui/cycle-collapse :show-all
+
+      ;; ui/collapsed-blocks is to separate the collapse/expand state from db for:
+      ;; 1. right sidebar
+      ;; 2. zoom-in view
+      ;; 3. queries
+      ;; 4. references
+      ;; graph => {:block-id bool}
+      :ui/collapsed-blocks {}
       :ui/sidebar-collapsed-blocks {}
       :ui/root-component nil
       :ui/file-component nil
@@ -1628,3 +1636,17 @@
   (when-let [current-repo (get-current-repo)]
     (->> (sub :sidebar/blocks)
          (filter #(= (first %) current-repo)))))
+
+(defn toggle-collapsed-block!
+  [block-id]
+  (let [current-repo (get-current-repo)]
+    (update-state! [:ui/collapsed-blocks current-repo 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)))
+
+(defn sub-collapsed
+  [block-id]
+  (sub [:ui/collapsed-blocks (get-current-repo) block-id]))