mirror of
https://github.com/logseq/logseq.git
synced 2026-05-21 03:12:38 +00:00
view pagination
This commit is contained in:
59
deps/db/src/logseq/db/frontend/view.cljs
vendored
59
deps/db/src/logseq/db/frontend/view.cljs
vendored
@@ -239,8 +239,10 @@
|
||||
(keep (fn [id] (non-hidden-e id))))
|
||||
nil)))
|
||||
|
||||
(defonce *view-cache (atom {}))
|
||||
(defn get-view-data
|
||||
[db view-id]
|
||||
[repo db view-id {:keys [offset limit]
|
||||
:or {limit 50}}]
|
||||
(time
|
||||
(let [view (d/entity db view-id)
|
||||
feat-type (:logseq.property.view/feature-type view)
|
||||
@@ -256,28 +258,35 @@
|
||||
all-pages? (= feat-type :all-pages)
|
||||
filters (:logseq.property.table/filters view)]
|
||||
(when index-attr
|
||||
(let [entities (get-entities db view feat-type index-attr)
|
||||
sorting (let [sorting* (:logseq.property.table/sorting view)]
|
||||
(if (or (= sorting* :logseq.property/empty-placeholder) (empty? sorting*))
|
||||
[{:id :block/updated-at, :asc? false}]
|
||||
sorting*))
|
||||
data (->>
|
||||
;; filter
|
||||
(cond->> entities
|
||||
(seq filters)
|
||||
(filter (fn [row] (row-matched? db row filters))))
|
||||
;; sort
|
||||
(sort-rows db sorting)
|
||||
;; pagination
|
||||
(take 100)
|
||||
;; convert entity to map for serialization
|
||||
(map (fn [e]
|
||||
(cond->
|
||||
(-> (into {} e)
|
||||
(assoc
|
||||
:id (:db/id e)
|
||||
:db/id (:db/id e)))
|
||||
all-pages?
|
||||
(assoc :block.temp/refs-count (count (:block/_refs e)))))))]
|
||||
{:count (count entities)
|
||||
(let [data* (if-let [cache (get-in @*view-cache [repo view-id])]
|
||||
cache
|
||||
(let [entities (get-entities db view feat-type index-attr)
|
||||
sorting (let [sorting* (:logseq.property.table/sorting view)]
|
||||
(if (or (= sorting* :logseq.property/empty-placeholder) (empty? sorting*))
|
||||
[{:id :block/updated-at, :asc? false}]
|
||||
sorting*))
|
||||
|
||||
result (->>
|
||||
;; filter
|
||||
(cond->> entities
|
||||
(seq filters)
|
||||
(filter (fn [row] (row-matched? db row filters))))
|
||||
;; sort
|
||||
(sort-rows db sorting))]
|
||||
(swap! *view-cache assoc-in [repo view-id] result)
|
||||
result))
|
||||
data (->> data*
|
||||
;; pagination
|
||||
(drop offset)
|
||||
(take limit)
|
||||
;; convert entity to map for serialization
|
||||
(map (fn [e]
|
||||
(cond->
|
||||
(-> (into {} e)
|
||||
(assoc
|
||||
:id (:db/id e)
|
||||
:db/id (:db/id e)))
|
||||
all-pages?
|
||||
(assoc :block.temp/refs-count (count (:block/_refs e)))))))]
|
||||
{:count (count data*)
|
||||
:data (vec data)})))))
|
||||
|
||||
@@ -1688,15 +1688,16 @@
|
||||
(str "view-" (:db/id view-entity')))))
|
||||
|
||||
(defn- <load-view-data
|
||||
[view]
|
||||
(p/let [data-str (.get-view-data ^js @state/*db-worker (state/get-current-repo) (:db/id view))]
|
||||
[view offset]
|
||||
(p/let [data-str (.get-view-data ^js @state/*db-worker (state/get-current-repo) (:db/id view)
|
||||
(ldb/write-transit-str {:offset offset :limit 100}))]
|
||||
(ldb/read-transit-str data-str)))
|
||||
|
||||
(rum/defc view < rum/static
|
||||
[{:keys [view-parent view-feature-type view-entity] :as option}]
|
||||
(let [[view-entity set-view-entity!] (hooks/use-state view-entity)
|
||||
[views set-views!] (hooks/use-state nil)
|
||||
[count set-count!] (hooks/use-state (count (:data option)))]
|
||||
[items-count set-count!] (hooks/use-state (count (:data option)))]
|
||||
(hooks/use-effect!
|
||||
(fn []
|
||||
(let [repo (state/get-current-repo)]
|
||||
@@ -1714,15 +1715,19 @@
|
||||
new-view)))]
|
||||
(when (and current-view
|
||||
(nil? (:data option)))
|
||||
(p/let [{:keys [count data]} (<load-view-data current-view)
|
||||
(p/let [{:keys [count data]} (<load-view-data current-view 0)
|
||||
set-data! (:set-data! option)]
|
||||
(set-data! data)
|
||||
(set-count! count))))))
|
||||
[])
|
||||
(view-container view-entity (assoc option
|
||||
:items-count count
|
||||
:items-count items-count
|
||||
:views views
|
||||
:set-views! set-views!
|
||||
:set-view-entity! set-view-entity!
|
||||
:end-reached (fn []
|
||||
(prn :debug :end-reached))))))
|
||||
(when view-entity
|
||||
(p/let [prev-data (:data option)
|
||||
{:keys [_count data]} (<load-view-data view-entity (count prev-data))
|
||||
set-data! (:set-data! option)]
|
||||
(set-data! (into prev-data data)))))))))
|
||||
|
||||
@@ -909,9 +909,10 @@
|
||||
:error])))))
|
||||
|
||||
(get-view-data
|
||||
[_this repo view-id]
|
||||
[_this repo view-id opts-str]
|
||||
(let [conn (worker-state/get-datascript-conn repo)
|
||||
data (ldb/get-view-data @conn view-id)]
|
||||
opts (ldb/read-transit-str opts-str)
|
||||
data (ldb/get-view-data repo @conn view-id opts)]
|
||||
(ldb/write-transit-str data)))
|
||||
|
||||
(dangerousRemoveAllDbs
|
||||
|
||||
Reference in New Issue
Block a user