Browse Source

fix(ux): make linked references filters reactive when the page properties changed (#9638)

* enhance(ux): reactive page properties for the linked references filters
Charlie 2 years ago
parent
commit
10caacd830

+ 12 - 2
src/main/frontend/components/reference.cljs

@@ -183,16 +183,25 @@
             (concat children (rest blocks))
             (conj result fb))))))))
 
+(rum/defc sub-page-properties-changed < rum/static
+  [page-name v filters-atom]
+  (rum/use-effect!
+    (fn []
+      (reset! filters-atom
+              (page-handler/get-filters (util/page-name-sanity-lc page-name))))
+    [page-name v filters-atom])
+  [:<>])
+
 (rum/defcs references* < rum/reactive db-mixins/query
   (rum/local nil ::ref-pages)
   {:init (fn [state]
            (let [page-name (first (:rum/args state))
-                 filters (when page-name
-                           (atom (page-handler/get-filters (util/page-name-sanity-lc page-name))))]
+                 filters (when page-name (atom nil))]
              (assoc state ::filters filters)))}
   [state page-name]
   (when page-name
     (let [page-name (util/page-name-sanity-lc page-name)
+          page-props-v (state/sub-page-properties-changed page-name)
           *ref-pages (::ref-pages state)
           repo (state/get-current-repo)
           filters-atom (get state ::filters)
@@ -236,6 +245,7 @@
       (reset! *ref-pages ref-pages)
       (when (or (seq filter-state) (> filter-n 0))
         [:div.references.page-linked.flex-1.flex-row
+         (sub-page-properties-changed page-name page-props-v filters-atom)
          [:div.content.pt-6
           (references-cp page-name filters filters-atom filter-state total filter-n filtered-ref-blocks' *ref-pages)]]))))
 

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

@@ -353,7 +353,9 @@
         block (apply dissoc block db-schema/retract-attributes)]
     (profile
      "Save block: "
-     (let [original-uuid (:block/uuid (db/entity (:db/id block)))
+     (let [original-block (db/entity (:db/id block))
+           original-uuid (:block/uuid original-block)
+           original-props (:block/properties original-block)
            uuid-changed? (not= (:block/uuid block) original-uuid)
            block' (-> (wrap-parse-block block)
                       ;; :block/uuid might be changed when backspace/delete
@@ -365,7 +367,12 @@
                                                      :to original-uuid})))]
        (outliner-tx/transact!
         opts'
-        (outliner-core/save-block! block'))
+        (outliner-core/save-block! block')
+        ;; page properties changed
+        (when-let [page-name (and (:block/pre-block? block')
+                                  (not= original-props (:block/properties block'))
+                                  (some-> (:block/page block') :db/id (db-utils/pull) :block/name))]
+          (state/set-page-properties-changed! page-name)))
 
        ;; sanitized page name changed
        (when-let [title (get-in block' [:block/properties :title])]

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

@@ -137,6 +137,7 @@
 
      :editor/code-block-context             {}
 
+     :db/properties-changed-pages           {}
      :db/last-transact-time                 {}
      ;; whether database is persisted
      :db/persisted?                         {}
@@ -2183,3 +2184,13 @@ Similar to re-frame subscriptions"
 (defn clear-user-info!
   []
   (storage/remove :user-groups))
+
+(defn set-page-properties-changed!
+  [page-name]
+  (when-not (string/blank? page-name)
+    (update-state! [:db/properties-changed-pages page-name] #(inc %))))
+
+(defn sub-page-properties-changed
+  [page-name]
+  (when-not (string/blank? page-name)
+    (sub [:db/properties-changed-pages page-name])))