mirror of
https://github.com/logseq/logseq.git
synced 2026-05-28 14:39:48 +00:00
fix: support both page filter and view filter
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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))
|
||||
|
||||
|
||||
Reference in New Issue
Block a user