Skip to content

Commit e8fef0d

Browse files
committed
enhance(ux): render blocks together with parent page for list view
1 parent 326d6db commit e8fef0d

File tree

3 files changed

+79
-59
lines changed

3 files changed

+79
-59
lines changed

src/main/frontend/components/page.cljs

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -722,7 +722,8 @@
722722
(when-not (or whiteboard? tag-dialog? linked-refs? (and block? (not db-based?)))
723723
[:div.fade-in.delay {:key "page-references"}
724724
(rum/with-key
725-
(reference/references page {:sidebar? sidebar?})
725+
(reference/references page {:sidebar? sidebar?
726+
:refs-count (:refs-count option)})
726727
(str title "-refs"))])
727728

728729
(when-not block-or-whiteboard?
@@ -750,11 +751,16 @@
750751
page-uuid? (when page-name (util/uuid-string? page-name))
751752
*loading? (atom true)
752753
page (db/get-page page-id-uuid-or-name)
753-
*page (atom page)]
754+
*page (atom page)
755+
*refs-count (atom nil)
756+
repo (state/get-current-repo)]
754757
(when (:block.temp/load-status page) (reset! *loading? false))
755-
(p/let [page-block (db-async/<get-block (state/get-current-repo) page-id-uuid-or-name)]
758+
(p/let [page-block (db-async/<get-block repo page-id-uuid-or-name)
759+
page-id (:db/id page-block)
760+
refs-count (db-async/<get-block-refs-count repo page-id)]
756761
(reset! *loading? false)
757762
(reset! *page (db/entity (:db/id page-block)))
763+
(reset! *refs-count refs-count)
758764
(when page-block
759765
(when-not (or preview-or-sidebar? (:tag-dialog? option))
760766
(if-let [page-uuid (and (not (:db/id page*))
@@ -764,15 +770,19 @@
764770
(route-handler/update-page-title-and-label! (state/get-route-match))))))
765771
(assoc state
766772
::loading? *loading?
767-
::*page *page)))
773+
::*page *page
774+
::*refs-count *refs-count)))
768775
:will-unmount (fn [state]
769776
(state/set-state! :editor/virtualized-scroll-fn nil)
770777
state)}
771778
[state option]
772779
(let [loading? (rum/react (::loading? state))
773-
page (rum/react (::*page state))]
780+
page (rum/react (::*page state))
781+
refs-count (rum/react (::*refs-count state))]
774782
(when (and page (not loading?))
775-
(page-inner (assoc option :page page)))))
783+
(page-inner (assoc option
784+
:page page
785+
:refs-count refs-count)))))
776786

777787
(rum/defcs page-cp
778788
[state option]

src/main/frontend/components/reference.cljs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,12 +57,13 @@
5757
(rum/defc references
5858
[entity config]
5959
(when-let [id (:db/id entity)]
60-
(let [[refs-total-count set-refs-total-count!] (hooks/use-state nil)]
60+
(let [[refs-total-count set-refs-total-count!] (hooks/use-state (:refs-count config))]
6161
(hooks/use-effect!
6262
#(c.m/run-task*
6363
(m/sp
64-
(let [result (c.m/<? (db-async/<get-block-refs-count (state/get-current-repo) id))]
65-
(set-refs-total-count! result))))
64+
(when-not (:refs-count config)
65+
(let [result (c.m/<? (db-async/<get-block-refs-count (state/get-current-repo) id))]
66+
(set-refs-total-count! result)))))
6667
[])
6768
(when (> refs-total-count 0)
6869
(ui/catch-error

src/main/frontend/components/views.cljs

Lines changed: 59 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1573,7 +1573,11 @@
15731573
db-id (cond (map? item) (:db/id item)
15741574
(number? item) item
15751575
:else nil)
1576-
[item set-item!] (hooks/use-state nil)
1576+
entity (when db-id
1577+
(let [e (db/entity db-id)]
1578+
(when (= :full (:block.temp/load-status e))
1579+
e)))
1580+
[item set-item!] (hooks/use-state entity)
15771581
opts (if list-view?
15781582
{:skip-refresh? true
15791583
:children? false}
@@ -1642,9 +1646,8 @@
16421646
(shui/table-footer (add-new-row (:view-entity option) table)))]]))))
16431647

16441648
(rum/defc list-view < rum/static
1645-
[{:keys [config ref-matched-children-ids view-feature-type] :as option} view-entity {:keys [rows]} *scroller-ref]
1646-
(let [references-view? (contains? #{:linked-references :unlinked-references} view-feature-type)
1647-
lazy-item-render (fn [rows idx]
1649+
[{:keys [config ref-matched-children-ids groups?] :as option} view-entity {:keys [rows]} *scroller-ref]
1650+
(let [lazy-item-render (fn [rows idx]
16481651
(lazy-item rows idx (assoc option :list-view? true)
16491652
(fn [block]
16501653
(let [config' (cond->
@@ -1654,9 +1657,9 @@
16541657
(= :linked-references (:logseq.property.view/feature-type view-entity))
16551658
(assoc :ref-matched-children-ids ref-matched-children-ids))]
16561659
(block-container config' block)))))
1657-
list-cp (fn [rows]
1660+
list-cp (fn [rows groups?]
16581661
(when (seq rows)
1659-
(if references-view?
1662+
(if groups?
16601663
[:div.content
16611664
(for [[idx _row] (medley/indexed rows)]
16621665
(lazy-item-render rows idx))]
@@ -1674,7 +1677,7 @@
16741677
breadcrumb (state/get-component :block/breadcrumb)
16751678
all-numbers? (every? number? rows)]
16761679
(if all-numbers?
1677-
(list-cp rows)
1680+
(list-cp rows groups?)
16781681
(for [[idx row] (medley/indexed rows)]
16791682
(if (and (vector? row) (uuid? (first row)))
16801683
(let [[first-block-id blocks] row]
@@ -1684,7 +1687,7 @@
16841687
(breadcrumb (assoc config :list-view? true)
16851688
(state/get-current-repo) first-block-id
16861689
{:show-page? false})]
1687-
(list-cp blocks)])
1690+
(list-cp blocks groups?)])
16881691
(rum/with-key
16891692
(lazy-item-render rows idx)
16901693
(str "partition-" idx)))))))
@@ -1809,11 +1812,12 @@
18091812
(ui/icon "arrows-up-down")))
18101813

18111814
(rum/defc view-cp
1812-
[view-entity table option* {:keys [*scroller-ref display-type row-selection]}]
1815+
[view-entity table option* {:keys [*scroller-ref display-type row-selection groups?]}]
18131816
(let [[viewid] (hooks/use-state #(random-uuid))
18141817
option (assoc option*
18151818
:view-entity view-entity
1816-
:viewid viewid)]
1819+
:viewid viewid
1820+
:groups? groups?)]
18171821
[:div {:id viewid}
18181822
(case display-type
18191823
:logseq.property.view/type.list
@@ -2096,46 +2100,51 @@
20962100
:skipAnimationFrameInResizeObserver true
20972101
:total-count (count (:rows table))
20982102
:item-content (fn [idx]
2099-
(let [[value group] (nth (:rows table) idx)]
2100-
(let [add-new-object! (when (fn? add-new-object!)
2101-
(fn [_]
2102-
(add-new-object! view-entity table
2103-
{:properties {(:db/ident group-by-property) (or (and (map? value) (:db/id value)) value)}})))
2104-
table' (shui/table-option (-> table-map
2105-
(assoc-in [:data-fns :add-new-object!] add-new-object!)
2106-
(assoc :data group ; data for this group
2107-
)))
2108-
readable-property-value #(cond (and (map? %) (or (:block/title %) (:logseq.property/value %)))
2109-
(db-property/property-value-content %)
2110-
(= (:db/ident %) :logseq.property/empty-placeholder)
2111-
"Empty"
2112-
:else
2113-
(str %))
2114-
group-by-page? (or (= :block/page group-by-property-ident)
2115-
(and (not db-based?) (contains? #{:linked-references :unlinked-references} display-type)))]
2116-
(rum/with-key
2117-
(ui/foldable
2118-
[:div
2119-
{:class (when-not list-view? "my-2")}
2120-
(cond
2121-
group-by-page?
2122-
(if value
2123-
(let [c (state/get-component :block/page-cp)]
2124-
(c {:disable-preview? true} value))
2125-
[:div.text-muted-foreground.text-sm
2126-
"Pages"])
2127-
2128-
(some? value)
2129-
(let [icon (pu/get-block-property-value value :logseq.property/icon)]
2130-
[:div.flex.flex-row.gap-1.items-center
2131-
(when icon (icon-component/icon icon {:color? true}))
2132-
(readable-property-value value)])
2133-
:else
2134-
(str "No " (:block/title group-by-property)))]
2135-
(let [render (view-cp view-entity (assoc table' :rows group) option view-opts)]
2136-
(if list-view? [:div.-ml-2 render] render))
2137-
{:title-trigger? false})
2138-
(str (:db/id view-entity) "-group-idx-" idx)))))})])
2103+
(let [[value group] (nth (:rows table) idx)
2104+
add-new-object! (when (fn? add-new-object!)
2105+
(fn [_]
2106+
(add-new-object! view-entity table
2107+
{:properties {(:db/ident group-by-property) (or (and (map? value) (:db/id value)) value)}})))
2108+
table' (shui/table-option (-> table-map
2109+
(assoc-in [:data-fns :add-new-object!] add-new-object!)
2110+
(assoc :data group ; data for this group
2111+
)))
2112+
readable-property-value #(cond (and (map? %) (or (:block/title %) (:logseq.property/value %)))
2113+
(db-property/property-value-content %)
2114+
(= (:db/ident %) :logseq.property/empty-placeholder)
2115+
"Empty"
2116+
:else
2117+
(str %))
2118+
group-by-page? (or (= :block/page group-by-property-ident)
2119+
(and (not db-based?) (contains? #{:linked-references :unlinked-references} display-type)))]
2120+
(rum/with-key
2121+
(ui/foldable
2122+
[:div
2123+
{:class (when-not list-view? "my-2")}
2124+
(cond
2125+
group-by-page?
2126+
(if value
2127+
(let [c (state/get-component :block/page-cp)]
2128+
(c {:disable-preview? true} value))
2129+
[:div.text-muted-foreground.text-sm
2130+
"Pages"])
2131+
2132+
(some? value)
2133+
(let [icon (pu/get-block-property-value value :logseq.property/icon)]
2134+
[:div.flex.flex-row.gap-1.items-center
2135+
(when icon (icon-component/icon icon {:color? true}))
2136+
(readable-property-value value)])
2137+
:else
2138+
(str "No " (:block/title group-by-property)))]
2139+
(fn []
2140+
(let [render (view-cp view-entity
2141+
(assoc table' :rows group)
2142+
option
2143+
(assoc view-opts :groups? (or group-by-page?
2144+
group-by-property-ident)))]
2145+
(if list-view? [:div.-ml-2 render] render)))
2146+
{:title-trigger? false})
2147+
(str (:db/id view-entity) "-group-idx-" idx))))})])
21392148
(view-cp view-entity table
21402149
(assoc option :group-by-property-ident group-by-property-ident)
21412150
view-opts)))])

0 commit comments

Comments
 (0)