From 0e6cbe22de6cb3eac0179dfd3a40635dc1d218b6 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Fri, 2 May 2025 08:50:39 +0800 Subject: [PATCH] fix: view does not update when adding or removing objects --- src/main/frontend/components/views.cljs | 27 ++++++++++++++---- src/main/frontend/db/model.cljs | 37 ++++++++----------------- src/main/frontend/worker/react.cljs | 2 +- 3 files changed, 35 insertions(+), 31 deletions(-) diff --git a/src/main/frontend/components/views.cljs b/src/main/frontend/components/views.cljs index 3f124b2238..004cdf8883 100644 --- a/src/main/frontend/components/views.cljs +++ b/src/main/frontend/components/views.cljs @@ -21,6 +21,7 @@ [frontend.db :as db] [frontend.db-mixins :as db-mixins] [frontend.db.async :as db-async] + [frontend.db.react :as react] [frontend.handler.db-based.export :as db-export-handler] [frontend.handler.db-based.property :as db-property-handler] [frontend.handler.editor :as editor-handler] @@ -39,7 +40,6 @@ [logseq.db :as ldb] [logseq.db.common.view :as db-view] [logseq.db.frontend.property :as db-property] - [logseq.db.frontend.property :as db-property] [logseq.shui.hooks :as hooks] [logseq.shui.ui :as shui] [medley.core :as medley] @@ -2037,7 +2037,8 @@ (:logseq.property.linked-references/includes view-parent) (:logseq.property.linked-references/excludes view-parent) (:filters view-parent) - query-entity-ids])) + query-entity-ids + (:data-changes-version option)])) (if loading? [:div.flex.flex-col.space-2.gap-2.my-2 (repeat 3 (shui/skeleton {:class "h-6 w-full"}))] @@ -2061,10 +2062,24 @@ :load-view-data load-view-data :set-view-entity! set-view-entity!))]))) +(defn sub-view-data-changes + [view-parent view-feature-type] + (when view-parent + (when-let [repo (state/get-current-repo)] + (when-let [k (case view-feature-type + :class-objects :frontend.worker.react/objects + :linked-references :frontend.worker.react/refs + nil)] + (let [*version (atom 0)] + (react/q repo [k (:db/id view-parent)] + {:query-fn (fn [_] (swap! *version inc))} + nil)))))) + (rum/defc sub-view < rum/reactive db-mixins/query [view-entity option] - (let [view (or (some-> (:db/id view-entity) db/sub-block) view-entity)] - (view-aux view option))) + (let [view (or (some-> (:db/id view-entity) db/sub-block) view-entity) + data-changes-version (some-> (sub-view-data-changes (:view-parent option) (:view-feature-type option)) rum/react)] + (view-aux view (assoc option :data-changes-version data-changes-version)))) (rum/defc view < rum/static [{:keys [view-parent view-feature-type view-entity] :as option}] @@ -2075,7 +2090,7 @@ (hooks/use-effect! #(c.m/run-task* (m/sp - (when-not query? ; TODO: move query logic to worker + (when-not query? (let [repo (state/get-current-repo)] (when (and db-based? (not view-entity)) (c.m/> - (react/q repo - [:frontend.worker.react/refs eid] - {:query-fn (fn [] - (let [entities (mapcat (fn [id] - (:block/_refs (db-utils/entity id))) ids) - blocks (map (fn [e] - {:block/parent (:block/parent e) - :block/order (:block/order e) - :block/page (:block/page e) - :block/collapsed? (:block/collapsed? e)}) entities)] - {:entities entities - :blocks blocks}))} - nil) - react - :entities - (remove (fn [block] - (or - (= (:db/id block) eid) - (= eid (:db/id (:block/page block))) - (ldb/hidden? (:block/page block)) - (contains? (set (map :db/id (:block/tags block))) (:db/id entity)) - (some? (get block (:db/ident entity)))))) - (util/distinct-by :db/id))))))) + ids (page-alias-set repo eid) + entities (mapcat (fn [id] + (:block/_refs (db-utils/entity id))) ids)] + (->> entities + (remove (fn [block] + (or + (= (:db/id block) eid) + (= eid (:db/id (:block/page block))) + (ldb/hidden? (:block/page block)) + (contains? (set (map :db/id (:block/tags block))) (:db/id entity)) + (some? (get block (:db/ident entity)))))) + (util/distinct-by :db/id))))))) (defn get-block-referenced-blocks ([block-id] diff --git a/src/main/frontend/worker/react.cljs b/src/main/frontend/worker/react.cljs index 7eb6dc2e1c..1ebe15aad1 100644 --- a/src/main/frontend/worker/react.cljs +++ b/src/main/frontend/worker/react.cljs @@ -15,7 +15,7 @@ ;; ::refs ;; get BLOCKS referencing PAGE or BLOCK (s/def ::refs (s/tuple #(= ::refs %) int?)) -;; get class's Objects +;; get class's objects (s/def ::objects (s/tuple #(= ::objects %) int?)) ;; custom react-query (s/def ::custom any?)