Selaa lähdekoodia

Filter by references, pages and individual blocks

samfundev 5 vuotta sitten
vanhempi
sitoutus
fe38063918

+ 5 - 3
src/main/frontend/components/block.cljs

@@ -45,7 +45,8 @@
             [reitit.frontend.easy :as rfe]
             [frontend.commands :as commands]
             [lambdaisland.glogi :as log]
-            [frontend.context.i18n :as i18n]))
+            [frontend.context.i18n :as i18n]
+            [frontend.filtering :as filtering]))
 
 (defn safe-read-string
   [s]
@@ -1923,13 +1924,14 @@
    (if (:group-by-page? config)
      [:div.flex.flex-col
       (for [[page blocks] blocks]
-        (let [page (db/entity (:db/id page))]
+        (let [page (db/entity (:db/id page))
+              filtered-blocks (filter #(filtering/matches-filter (filtering/get-block-references %) (:filter-state config)) blocks)]
           [:div.my-2 (cond-> {:key (str "page-" (:db/id page))}
                        (:ref? config)
                        (assoc :class "color-level px-7 py-2 rounded"))
            (ui/foldable
             (page-cp config page)
-            (blocks-container blocks config))]))]
+            (blocks-container filtered-blocks config))]))]
      (blocks-container blocks config))])
 
 (comment

+ 11 - 25
src/main/frontend/components/reference.cljs

@@ -13,7 +13,8 @@
             [clojure.string :as string]
             [frontend.config :as config]
             [frontend.components.svg :as svg]
-            [frontend.handler.page :as page-handler]))
+            [frontend.handler.page :as page-handler]
+            [frontend.filtering :as filtering]))
 
 (rum/defc filter-dialog-inner < rum/reactive
   [close-fn references page-name]
@@ -23,11 +24,10 @@
       [:div.mx-auto.flex-shrink-0.flex.items-center.justify-center.h-12.w-12.rounded-full.bg-gray-200.text-gray-500.sm:mx-0.sm:h-10.sm:w-10
        (svg/filter-icon)]
       [:div.mt-3.text-center.sm:mt-0.sm:ml-4.sm:text-left
-       [:h3#modal-headline.text-lg.leading-6.font-medium.text-gray-900
-        "Filter"]
-       [:span.text-xs "Click to include and shift-click to exclude. Click again to remove. "]]]
-
-     [:div.mt-5.sm:mt-4.sm:flex.sm.gap-1
+       [:h3#modal-headline.text-lg.leading-6.font-medium.text-gray-900 "Filter"]
+       [:span.text-xs
+        "Click to include and shift-click to exclude. Click again to remove."]]]
+     [:div.mt-5.sm:mt-4.sm:flex.sm.gap-1.flex-wrap
       (for [reference references]
         (let [filtered (get (rum/react filter-state) reference)
               color (condp = filtered
@@ -47,21 +47,6 @@
   (fn [close-fn]
     (filter-dialog-inner close-fn references page-name)))
 
-(defn get-block-references
-  [ref-block]
-  (map #(if (= (first %) "Tag")
-          (second %)
-          (second (:url (second %))))
-       (filter
-        #(and
-          (some (partial = (first %)) ["Tag", "Link"])
-          (or (= (first %) "Tag") (= (first (:url (second %))) "Search")))
-        (:block/title (first (val ref-block))))))
-
-(defn matches-filter
-  [references filter-state]
-  (every? #(= (util/in? (first %) references) (second %)) filter-state))
-
 (rum/defc references < rum/reactive
   [page-name marker? priority?]
   (when page-name
@@ -82,9 +67,9 @@
           scheduled-or-deadlines (if journal?
                                    (db/get-date-scheduled-or-deadlines (string/capitalize page-name))
                                    nil)
-          references (distinct (flatten (map get-block-references ref-blocks)))
+          references (distinct (flatten (map filtering/get-block-references (flatten (map val ref-blocks)))))
           filter-state (rum/react (page-handler/get-filter page-name))
-          filtered-blocks (filter #(matches-filter (get-block-references %) filter-state) ref-blocks)
+          filtered-ref-blocks (filter #(filtering/matches-filter (filtering/get-ref-block-references %) filter-state) ref-blocks)
           n-ref (count ref-blocks)]
       (when (or (> n-ref 0)
                 (seq scheduled-or-deadlines))
@@ -118,13 +103,14 @@
                               :else "text-yellow-200")}
               (svg/filter-icon)]]]
            [:div.references-blocks
-            (let [ref-hiccup (block/->hiccup filtered-blocks
+            (let [ref-hiccup (block/->hiccup filtered-ref-blocks
                                              {:id page-name
                                               :start-level 2
                                               :ref? true
                                               :breadcrumb-show? true
                                               :group-by-page? true
-                                              :editor-box editor/box}
+                                              :editor-box editor/box
+                                              :filter-state filter-state}
                                              {})]
               (content/content page-name
                                {:hiccup ref-hiccup}))])]]))))

+ 21 - 0
src/main/frontend/filtering.cljs

@@ -0,0 +1,21 @@
+(ns frontend.filtering
+  (:require [frontend.util :as util]))
+
+(defn get-block-references
+  [block]
+  (let [references
+        (map #(if (= (first %) "Tag") (second %) (second (:url (second %))))
+             (filter #(and (some (partial = (first %)) ["Tag" "Link"])
+                           (or (= (first %) "Tag")
+                               (= (first (:url (second %))) "Search")))
+                     (:block/title block)))
+        page-name (:page/original-name (:block/page block))]
+    (conj references page-name)))
+
+(defn get-ref-block-references
+  [ref-block]
+  (distinct (flatten (map get-block-references (val ref-block)))))
+
+(defn matches-filter
+  [references filter-state]
+  (every? #(= (util/in? (first %) references) (second %)) filter-state))