diff --git a/deps/db/src/logseq/db.cljs b/deps/db/src/logseq/db.cljs index 4ca02a5de..484757196 100644 --- a/deps/db/src/logseq/db.cljs +++ b/deps/db/src/logseq/db.cljs @@ -528,6 +528,42 @@ '[:db/id :block/name :block/original-name] ids))))) +(defn get-page-alias + [db page-id] + (->> + (d/q + '[:find [?e ...] + :in $ ?page % + :where + (alias ?page ?e)] + db + page-id + (:alias rules/rules)) + distinct)) + +(defn get-page-refs + [db id] + (let [alias (->> (get-page-alias db id) + (cons id) + distinct) + refs (->> (mapcat (fn [id] (:block/_path-refs (d/entity db id))) alias) + distinct)] + (d/pull-many db '[*] (map :db/id refs)))) + +(defn get-block-refs + [db id] + (let [block (d/entity db id)] + (if (:block/name block) + (get-page-refs db id) + (let [refs (:block/_refs (d/entity db id))] + (d/pull-many db '[*] (map :db/id refs)))))) + +(defn get-block-refs-count + [db id] + (some-> (d/entity db id) + :block/_refs + count)) + (comment (defn db-based-graph? "Whether the current graph is db-only" diff --git a/src/main/frontend/components/block.cljs b/src/main/frontend/components/block.cljs index 864ebfab0..5367c13a6 100644 --- a/src/main/frontend/components/block.cljs +++ b/src/main/frontend/components/block.cljs @@ -816,7 +816,7 @@ (db-async/ refs-count 0)) - (let [refs-cp (state/get-component :block/linked-references)] + (when-let [refs-cp (state/get-component :block/linked-references)] (refs-cp uuid)))]))])) (rum/defc single-block-cp @@ -3132,7 +3140,7 @@ *navigating-block (get state ::navigating-block) navigating-block (rum/react *navigating-block) navigated? (and (not= (:block/uuid block) navigating-block) navigating-block)] - (when-not (state/sub-block-unloaded? (:block/uuid block)) + (when-not (state/sub-async-query-loading (:block/uuid block)) (let [[original-block block] (build-block config block {:navigating-block navigating-block :navigated? navigated?}) config' (if original-block (assoc config :original-block original-block) diff --git a/src/main/frontend/components/page.cljs b/src/main/frontend/components/page.cljs index 292ad5584..88f0c62a8 100644 --- a/src/main/frontend/components/page.cljs +++ b/src/main/frontend/components/page.cljs @@ -457,10 +457,9 @@ (let [page-name (:page-name (first (:rum/args state))) page-name' (get-sanity-page-name state page-name)] (db-async/ (db/get-page-referenced-blocks (:block/name e)) - db-utils/group-by-page) - (db/get-block-referenced-blocks block-id)) - ref-hiccup (block/->hiccup ref-blocks - {:id (str block-id) - :ref? true - :breadcrumb-show? true - :group-by-page? true - :editor-box editor/box} - {})] - [:div.references-blocks - (content/content block-id - {:hiccup ref-hiccup})])) + (when-let [e (db/entity [:block/uuid block-id])] + (when-not (state/sub-async-query-loading (str (:db/id e) "-refs")) + (let [page? (some? (:block/name e)) + ref-blocks (if page? + (-> (db/get-page-referenced-blocks (:block/name e)) + db-utils/group-by-page) + (db/get-block-referenced-blocks block-id))] + (when (> (count ref-blocks) 0) + (let [ref-hiccup (block/->hiccup ref-blocks + {:id (str block-id) + :ref? true + :breadcrumb-show? true + :group-by-page? true + :editor-box editor/box} + {})] + [:div.references-blocks + (content/content block-id + {:hiccup ref-hiccup})])))))) (rum/defc references-inner [page-name filters filtered-ref-blocks] @@ -191,59 +198,65 @@ (rum/defcs references* < rum/reactive db-mixins/query (rum/local nil ::ref-pages) {:init (fn [state] - (let [page-name (first (:rum/args state)) + (let [page-name (->> (first (:rum/args state)) + util/page-name-sanity-lc) + page (db/entity [:block/name page-name]) filters (when page-name (atom nil))] + (when page (db-async/ (group-by second filter-state) - (update-vals #(map first %)))) - filtered-ref-blocks (->> (block-handler/filter-blocks ref-blocks filters) - (block-handler/get-filtered-ref-blocks-with-parents ref-blocks)) - total (count top-level-blocks) - filtered-top-blocks (filter (fn [b] (top-level-blocks-ids (:db/id b))) filtered-ref-blocks) - filter-n (count filtered-top-blocks) - parent->blocks (group-by (fn [x] (:db/id (x :block/parent))) filtered-ref-blocks) - result (->> (group-by :block/page filtered-top-blocks) - (map (fn [[page blocks]] - (let [blocks (sort-by (fn [b] (not= (:db/id page) (:db/id (:block/parent b)))) blocks) - result (map (fn [block] - (let [filtered-children (get-filtered-children block parent->blocks) - refs (when-not (contains? top-level-blocks-ids (:db/id (:block/parent block))) - (block-handler/get-blocks-refed-pages aliases (cons block filtered-children))) - block' (assoc (tree/block-entity->map block) :block/children filtered-children)] - [block' refs])) blocks) - blocks' (map first result) - page' (if (contains? aliases-exclude-self (:db/id page)) - {:db/id (:db/id page) - :block/alias? true - :block/journal-day (:block/journal-day page)} - page)] - [[page' blocks'] (mapcat second result)])))) - filtered-ref-blocks' (map first result) - ref-pages (->> - (mapcat second result) - (map :block/original-name) - frequencies)] - (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)]])))) + (let [repo (state/get-current-repo) + page-name (util/page-name-sanity-lc page-name) + page-entity (db/entity repo [:block/name page-name])] + (when page-entity + (when-not (state/sub-async-query-loading (str (:db/id page-entity) "-refs")) + (let [page-props-v (state/sub-page-properties-changed page-name) + *ref-pages (::ref-pages state) + filters-atom (get state ::filters) + filter-state (rum/react filters-atom) + ref-blocks (db/get-page-referenced-blocks page-name) + page-id (:db/id page-entity) + aliases (db/page-alias-set repo page-name) + aliases-exclude-self (set (remove #{page-id} aliases)) + top-level-blocks (filter (fn [b] (some aliases (set (map :db/id (:block/refs b))))) ref-blocks) + top-level-blocks-ids (set (map :db/id top-level-blocks)) + filters (when (seq filter-state) + (-> (group-by second filter-state) + (update-vals #(map first %)))) + filtered-ref-blocks (->> (block-handler/filter-blocks ref-blocks filters) + (block-handler/get-filtered-ref-blocks-with-parents ref-blocks)) + total (count top-level-blocks) + filtered-top-blocks (filter (fn [b] (top-level-blocks-ids (:db/id b))) filtered-ref-blocks) + filter-n (count filtered-top-blocks) + parent->blocks (group-by (fn [x] (:db/id (x :block/parent))) filtered-ref-blocks) + result (->> (group-by :block/page filtered-top-blocks) + (map (fn [[page blocks]] + (let [blocks (sort-by (fn [b] (not= (:db/id page) (:db/id (:block/parent b)))) blocks) + result (map (fn [block] + (let [filtered-children (get-filtered-children block parent->blocks) + refs (when-not (contains? top-level-blocks-ids (:db/id (:block/parent block))) + (block-handler/get-blocks-refed-pages aliases (cons block filtered-children))) + block' (assoc (tree/block-entity->map block) :block/children filtered-children)] + [block' refs])) blocks) + blocks' (map first result) + page' (if (contains? aliases-exclude-self (:db/id page)) + {:db/id (:db/id page) + :block/alias? true + :block/journal-day (:block/journal-day page)} + page)] + [[page' blocks'] (mapcat second result)])))) + filtered-ref-blocks' (map first result) + ref-pages (->> + (mapcat second result) + (map :block/original-name) + frequencies)] + (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)]]))))))) (rum/defc references [page-name] diff --git a/src/main/frontend/components/whiteboard.cljs b/src/main/frontend/components/whiteboard.cljs index f0fb2723e..0d6d8abd3 100644 --- a/src/main/frontend/components/whiteboard.cljs +++ b/src/main/frontend/components/whiteboard.cljs @@ -48,7 +48,7 @@ tldr (whiteboard-handler/page-name->tldr! page-name) generate-preview (when loaded? (resolve 'frontend.extensions.tldraw/generate-preview))] - (when (and generate-preview (not (state/sub-block-unloaded? page-name))) + (when (and generate-preview (not (state/sub-async-query-loading page-name))) (generate-preview tldr)))) ;; TODO: use frontend.ui instead of making a new one diff --git a/src/main/frontend/db/async.cljs b/src/main/frontend/db/async.cljs index 285ed7f99..2ecf8663a 100644 --- a/src/main/frontend/db/async.cljs +++ b/src/main/frontend/db/async.cljs @@ -120,13 +120,31 @@ :else (when-let [^Object sqlite @db-browser/*worker] - (state/update-state! :restore/unloaded-blocks (fn [s] (conj s name'))) + (state/update-state! :db/async-queries (fn [s] (conj s name'))) (p/let [result (.get-block-and-children sqlite graph name' children?) {:keys [block children] :as result'} (edn/read-string result) conn (db/get-db graph false) _ (d/transact! conn (cons block children))] - (state/update-state! :restore/unloaded-blocks (fn [s] (disj s name'))) + (state/update-state! :db/async-queries (fn [s] (disj s name'))) (react/refresh-affected-queries! graph [[:frontend.worker.react/block (:db/id block)]]) (if children? block result')))))) + +(defn > (react/q repo [:frontend.worker.react/refs page-id] - {:use-cache? false - :query-fn (fn [] + {:query-fn (fn [] (let [entities (mapcat (fn [id] (:block/_path-refs (db-utils/entity id))) pages) blocks (map (fn [e] diff --git a/src/main/frontend/db_worker.cljs b/src/main/frontend/db_worker.cljs index e49556fd1..48a995381 100644 --- a/src/main/frontend/db_worker.cljs +++ b/src/main/frontend/db_worker.cljs @@ -291,6 +291,16 @@ (when-let [conn (worker-state/get-datascript-conn repo)] (pr-str (sqlite-common-db/get-block-and-children @conn name children?)))) + (get-block-refs + [_this repo id] + (when-let [conn (worker-state/get-datascript-conn repo)] + (pr-str (ldb/get-block-refs @conn id)))) + + (get-block-refs-count + [_this repo id] + (when-let [conn (worker-state/get-datascript-conn repo)] + (ldb/get-block-refs-count @conn id))) + (transact [_this repo tx-data tx-meta context] (when repo (worker-state/set-db-latest-tx-time! repo)) diff --git a/src/main/frontend/extensions/tldraw.cljs b/src/main/frontend/extensions/tldraw.cljs index 9087951dc..bbdd32c9b 100644 --- a/src/main/frontend/extensions/tldraw.cljs +++ b/src/main/frontend/extensions/tldraw.cljs @@ -207,7 +207,7 @@ (db-async/atom {}) (let [^js sqlite @db-browser/*worker] diff --git a/src/main/frontend/state.cljs b/src/main/frontend/state.cljs index 0e3e56ebe..db52fc82a 100644 --- a/src/main/frontend/state.cljs +++ b/src/main/frontend/state.cljs @@ -311,7 +311,7 @@ :system/info {} ;; Whether block is selected :ui/select-query-cache (atom {}) - :restore/unloaded-blocks (atom #{})}))) + :db/async-queries (atom #{})}))) ;; Block ast state ;; =============== @@ -2305,12 +2305,12 @@ Similar to re-frame subscriptions" [] (storage/remove :user-groups)) -(defn sub-block-unloaded? - [block-uuid] +(defn sub-async-query-loading + [k] + (assert (some? k)) (rum/react - (r/cached-derived-atom (:restore/unloaded-blocks @state) [(get-current-repo) ::block-unloaded (str block-uuid)] - (fn [s] - (contains? s (str block-uuid)))))) + (r/cached-derived-atom (:db/async-queries @state) [(get-current-repo) ::async-query (str k)] + (fn [s] (contains? s (str k)))))) (defn get-color-accent [] (get @state :ui/radix-color))