|  | @@ -10,10 +10,60 @@
 | 
	
		
			
				|  |  |              [frontend.date :as date]
 | 
	
		
			
				|  |  |              [frontend.components.editor :as editor]
 | 
	
		
			
				|  |  |              [frontend.db-mixins :as db-mixins]
 | 
	
		
			
				|  |  | -            [clojure.string :as string]))
 | 
	
		
			
				|  |  | +            [clojure.string :as string]
 | 
	
		
			
				|  |  | +            [frontend.config :as config]
 | 
	
		
			
				|  |  | +            [frontend.db :as db]
 | 
	
		
			
				|  |  | +            [frontend.components.svg :as svg]))
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +(rum/defc filter-dialog-inner < rum/reactive
 | 
	
		
			
				|  |  | +  [close-fn references filter-state]
 | 
	
		
			
				|  |  | +  [:div
 | 
	
		
			
				|  |  | +   [:div.sm:flex.sm:items-start
 | 
	
		
			
				|  |  | +    [: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"]]]
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +   [:div.mt-5.sm:mt-4.sm:flex.sm.gap-1
 | 
	
		
			
				|  |  | +    (for [reference references]
 | 
	
		
			
				|  |  | +      [:button {:key reference :style {:padding "0px 5px" :border-width "1px" :border-radius "5px" :color (let [filtered (get (rum/react filter-state) reference)]
 | 
	
		
			
				|  |  | +                                                                                                            (condp = filtered
 | 
	
		
			
				|  |  | +                                                                                                              true "green"
 | 
	
		
			
				|  |  | +                                                                                                              false "red"
 | 
	
		
			
				|  |  | +                                                                                                              ""))}
 | 
	
		
			
				|  |  | +                :on-click (fn [e]
 | 
	
		
			
				|  |  | +                            (swap! filter-state #(if (nil? (get @filter-state reference))
 | 
	
		
			
				|  |  | +                                                   (assoc % reference (not (.-shiftKey e)))
 | 
	
		
			
				|  |  | +                                                   (dissoc % reference))))}
 | 
	
		
			
				|  |  | +       reference])]])
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +(defn filter-dialog
 | 
	
		
			
				|  |  | +  [references filter-state]
 | 
	
		
			
				|  |  | +  (fn [close-fn]
 | 
	
		
			
				|  |  | +    (filter-dialog-inner close-fn references filter-state)))
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +(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 in?
 | 
	
		
			
				|  |  | +  [elm coll]
 | 
	
		
			
				|  |  | +  (true? (some #(= elm %) coll)))
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +(defn matches-filter
 | 
	
		
			
				|  |  | +  [references filter-state]
 | 
	
		
			
				|  |  | +  (every? #(= (in? (first %) references) (second %)) filter-state))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -(rum/defc references < rum/reactive db-mixins/query
 | 
	
		
			
				|  |  | -  [page-name marker? priority?]
 | 
	
		
			
				|  |  | +(rum/defcs references < (rum/local {} ::filter)
 | 
	
		
			
				|  |  | +  [state page-name marker? priority?]
 | 
	
		
			
				|  |  |    (when page-name
 | 
	
		
			
				|  |  |      (let [block? (util/uuid-string? page-name)
 | 
	
		
			
				|  |  |            block-id (and block? (uuid page-name))
 | 
	
	
		
			
				|  | @@ -32,6 +82,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)))
 | 
	
		
			
				|  |  | +          filter-state (::filter state)
 | 
	
		
			
				|  |  | +          filtered-blocks (filter #(matches-filter (get-block-references %) (rum/react filter-state)) ref-blocks)
 | 
	
		
			
				|  |  |            n-ref (count ref-blocks)]
 | 
	
		
			
				|  |  |        (when (or (> n-ref 0)
 | 
	
		
			
				|  |  |                  (seq scheduled-or-deadlines))
 | 
	
	
		
			
				|  | @@ -53,10 +106,14 @@
 | 
	
		
			
				|  |  |                                   {:hiccup ref-hiccup}))]))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |            (ui/foldable
 | 
	
		
			
				|  |  | -           [:h2.font-bold.opacity-50 (let []
 | 
	
		
			
				|  |  | -                                       (str n-ref " Linked References"))]
 | 
	
		
			
				|  |  | +           [:div.flex.flex-row.flex-1.justify-between
 | 
	
		
			
				|  |  | +            [:h2.font-bold.opacity-50 (let []
 | 
	
		
			
				|  |  | +                                        (str n-ref " Linked References"))]
 | 
	
		
			
				|  |  | +            [:a {:title "Filter"
 | 
	
		
			
				|  |  | +                 :on-click #(state/set-modal! (filter-dialog references filter-state))}
 | 
	
		
			
				|  |  | +             (svg/filter-icon)]]
 | 
	
		
			
				|  |  |             [:div.references-blocks
 | 
	
		
			
				|  |  | -            (let [ref-hiccup (block/->hiccup ref-blocks
 | 
	
		
			
				|  |  | +            (let [ref-hiccup (block/->hiccup filtered-blocks
 | 
	
		
			
				|  |  |                                               {:id page-name
 | 
	
		
			
				|  |  |                                                :start-level 2
 | 
	
		
			
				|  |  |                                                :ref? true
 |