fix: view does not update when adding or removing objects

This commit is contained in:
Tienson Qin
2025-05-02 08:50:39 +08:00
parent b3f8c7270e
commit 0e6cbe22de
3 changed files with 35 additions and 31 deletions

View File

@@ -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/<? (db-async/<get-views repo (:db/id view-parent) view-feature-type))
@@ -2092,6 +2107,8 @@
(when (if db-based? view-entity (or view-entity view-parent
(= view-feature-type :all-pages)))
(let [option' (assoc option
:view-feature-type (or view-feature-type
(:logseq.property.view/feature-type view-entity))
:views views
:set-views! set-views!
:set-view-entity! set-view-entity!)]

View File

@@ -592,31 +592,18 @@ independent of format as format specific heading characters are stripped"
(when repo
(when (conn/get-db repo)
(let [entity (db-utils/entity eid)
ids (page-alias-set repo eid)]
(->>
(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]

View File

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