fix: support both page filter and view filter

This commit is contained in:
Tienson Qin
2025-02-19 22:14:59 +08:00
parent 030fbff1c3
commit e5c339e443
3 changed files with 86 additions and 56 deletions

View File

@@ -13,7 +13,6 @@
[frontend.modules.outliner.op :as outliner-op]
[frontend.modules.outliner.ui :as ui-outliner-tx]
[frontend.state :as state]
[frontend.ui :as ui]
[logseq.db :as ldb]
[logseq.db.frontend.property :as db-property]
[logseq.outliner.property :as outliner-property]
@@ -151,18 +150,19 @@
(rum/defc property-related-objects-inner < rum/static
[config property objects properties]
(let [[loading? set-loading?] (rum/use-state property)
(let [[loading? set-loading?] (rum/use-state nil)
[data set-data!] (rum/use-state objects)
columns (views/build-columns config properties)]
(hooks/use-effect!
(fn []
(set-loading? true)
(p/let [result (db-async/<get-property-objects (state/get-current-repo) (:db/ident property))]
(set-data! (mapv (fn [m]
(let [e (db/entity (:db/id m))]
(assoc e :id (:db/id m)))) result))
(set-loading? false)))
(when (nil? loading?)
(set-loading? true)
(p/let [result (db-async/<get-property-objects (state/get-current-repo) (:db/ident property))]
(set-data! (mapv (fn [m]
(let [e (db/entity (:db/id m))]
(assoc e :id (:db/id m)))) result))
(set-loading? false))))
[])
(views/view {:config config

View File

@@ -68,58 +68,85 @@
(rum/defc references-cp
[page-entity *filters total filter-n filtered-ref-blocks *ref-pages]
(if (config/db-based-graph?)
(let [blocks (->> (mapcat second filtered-ref-blocks)
(map (fn [b] (assoc (db/entity (:db/id b)) :id (:db/id b)))))
columns' (columns {} blocks)]
(when (seq blocks)
(views/view
{:view-parent page-entity
:view-identity :linked-references
:data blocks
:columns columns'})))
(let [filters @*filters
threshold (state/get-linked-references-collapsed-threshold)
default-collapsed? (or (>= total threshold) (ldb/class? page-entity))
*collapsed? (atom nil)]
(ui/foldable
[:div.flex.flex-row.flex-1.justify-between.items-center
[:div.font-medium.opacity-50
(t :linked-references/reference-count (when (or (seq (:included filters))
(seq (:excluded filters))) filter-n) total)]
[:a.filter.fade-link
{:title (t :linked-references/filter-heading)
:on-mouse-over (fn [_e]
(when @*collapsed? ; collapsed
(let [filters @*filters
*collapsed? (atom nil)
db-based? (config/db-based-graph?)
reference-filter (if db-based?
(shui/button
{:title "Page filter"
:variant "ghost"
:class "text-muted-foreground !px-1"
:size :sm
:on-click (fn [e]
(shui/popup-show! (.-target e)
(fn []
[:div.p-4
(filters/filter-dialog page-entity *filters *ref-pages)])
{:align "end"}))}
(ui/icon "filter-cog"
{:class (cond
(and (empty? (:included filters)) (empty? (:excluded filters)))
""
(and (seq (:included filters)) (empty? (:excluded filters)))
"text-success"
(and (empty? (:included filters)) (seq (:excluded filters)))
"text-error"
:else
"text-warning")}))
[:a.filter.fade-link
{:title (t :linked-references/filter-heading)
:on-mouse-over (fn [_e]
(when @*collapsed? ; collapsed
;; expand
(reset! @*collapsed? false)))
:on-pointer-down (fn [e]
(util/stop-propagation e)
(shui/popup-show! (.-target e)
(fn []
[:div.p-4
(filters/filter-dialog page-entity *filters *ref-pages)])
{:align "end"}))}
(ui/icon "filter" {:class (cond
(and (empty? (:included filters)) (empty? (:excluded filters)))
"opacity-60 hover:opacity-100"
(reset! @*collapsed? false)))
:on-pointer-down (fn [e]
(util/stop-propagation e)
(shui/popup-show! (.-target e)
(fn []
[:div.p-4
(filters/filter-dialog page-entity *filters *ref-pages)])
{:align "end"}))}
(ui/icon "filter" {:class (cond
(and (empty? (:included filters)) (empty? (:excluded filters)))
"opacity-60 hover:opacity-100"
(and (seq (:included filters)) (empty? (:excluded filters)))
"text-success"
(and (seq (:included filters)) (empty? (:excluded filters)))
"text-success"
(and (empty? (:included filters)) (seq (:excluded filters)))
"text-error"
:else
"text-warning")
:size 22})]]
(and (empty? (:included filters)) (seq (:excluded filters)))
"text-error"
:else
"text-warning")
:size 22})])]
(if db-based?
(let [blocks (->> (mapcat second filtered-ref-blocks)
(map (fn [b] (assoc (db/entity (:db/id b)) :id (:db/id b)))))
columns' (columns {} blocks)]
(when (seq blocks)
(views/view
{:view-parent page-entity
:view-identity :linked-references
:additional-actions [reference-filter]
:data blocks
:columns columns'})))
(let [threshold (state/get-linked-references-collapsed-threshold)
default-collapsed? (or (>= total threshold) (ldb/class? page-entity))]
(ui/foldable
[:div.flex.flex-row.flex-1.justify-between.items-center
[:div.font-medium.opacity-50
(t :linked-references/reference-count (when (or (seq (:included filters))
(seq (:excluded filters))) filter-n) total)]
reference-filter]
(fn []
(references-inner page-entity filters filtered-ref-blocks))
(fn []
(references-inner page-entity filters filtered-ref-blocks))
{:default-collapsed? default-collapsed?
:title-trigger? true
:init-collapsed (fn [collapsed-atom]
(reset! *collapsed? collapsed-atom))}))))
{:default-collapsed? default-collapsed?
:title-trigger? true
:init-collapsed (fn [collapsed-atom]
(reset! *collapsed? collapsed-atom))})))))
(defn- get-filtered-children
[block parent->blocks]

View File

@@ -1508,7 +1508,7 @@
(rum/defc view-head < rum/static
[view-parent view-entity table columns input sorting
set-input! add-new-object!
{:keys [view-identity title-key]
{:keys [view-identity title-key additional-actions]
:as option}]
(let [[hover? set-hover?] (hooks/use-state nil)]
[:div.flex.flex-1.flex-wrap.items-center.justify-between.gap-1
@@ -1523,6 +1523,9 @@
[:div.view-actions.flex.items-center.gap-1.transition-opacity.ease-in.duration-300
{:class (if hover? "opacity-100" "opacity-0")}
(when (seq additional-actions)
[:<> (for [action additional-actions]
action)])
(when (seq sorting)
(view-sorting table columns sorting))