|
|
@@ -12,36 +12,40 @@
|
|
|
[frontend.db-mixins :as db-mixins]
|
|
|
[clojure.string :as string]
|
|
|
[frontend.config :as config]
|
|
|
- [frontend.db :as db]
|
|
|
- [frontend.components.svg :as svg]))
|
|
|
+ [frontend.components.svg :as svg]
|
|
|
+ [frontend.handler.page :as page-handler]))
|
|
|
|
|
|
(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"]]]
|
|
|
+ [close-fn references page-name]
|
|
|
+ (let [filter-state (page-handler/get-filter page-name)]
|
|
|
+ [: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"]
|
|
|
+ [: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
|
|
|
- (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])]])
|
|
|
+ [:div.mt-5.sm:mt-4.sm:flex.sm.gap-1
|
|
|
+ (for [reference references]
|
|
|
+ (let [filtered (get (rum/react filter-state) reference)
|
|
|
+ color (condp = filtered
|
|
|
+ true "text-green-500"
|
|
|
+ false "text-red-500"
|
|
|
+ nil)]
|
|
|
+ [:button.border.rounded.px-1 {:key reference :class color :style {:border-color "currentColor"}
|
|
|
+ :on-click (fn [e]
|
|
|
+ (swap! filter-state #(if (nil? (get @filter-state reference))
|
|
|
+ (assoc % reference (not (.-shiftKey e)))
|
|
|
+ (dissoc % reference)))
|
|
|
+ (page-handler/save-filter! page-name @filter-state))}
|
|
|
+ reference]))]]))
|
|
|
|
|
|
(defn filter-dialog
|
|
|
- [references filter-state]
|
|
|
+ [references page-name]
|
|
|
(fn [close-fn]
|
|
|
- (filter-dialog-inner close-fn references filter-state)))
|
|
|
+ (filter-dialog-inner close-fn references page-name)))
|
|
|
|
|
|
(defn get-block-references
|
|
|
[ref-block]
|
|
|
@@ -62,8 +66,8 @@
|
|
|
[references filter-state]
|
|
|
(every? #(= (in? (first %) references) (second %)) filter-state))
|
|
|
|
|
|
-(rum/defcs references < (rum/local {} ::filter)
|
|
|
- [state page-name marker? priority?]
|
|
|
+(rum/defc references < rum/reactive
|
|
|
+ [page-name marker? priority?]
|
|
|
(when page-name
|
|
|
(let [block? (util/uuid-string? page-name)
|
|
|
block-id (and block? (uuid page-name))
|
|
|
@@ -83,8 +87,8 @@
|
|
|
(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)
|
|
|
+ filter-state (rum/react (page-handler/get-filter page-name))
|
|
|
+ filtered-blocks (filter #(matches-filter (get-block-references %) filter-state) ref-blocks)
|
|
|
n-ref (count ref-blocks)]
|
|
|
(when (or (> n-ref 0)
|
|
|
(seq scheduled-or-deadlines))
|
|
|
@@ -110,8 +114,13 @@
|
|
|
[: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)]]
|
|
|
+ :on-click #(state/set-modal! (filter-dialog references page-name))}
|
|
|
+ [:span {:class (cond
|
|
|
+ (empty? filter-state) nil
|
|
|
+ (every? true? (vals filter-state)) "text-green-500"
|
|
|
+ (every? false? (vals filter-state)) "text-red-500"
|
|
|
+ :else "text-yellow-200")}
|
|
|
+ (svg/filter-icon)]]]
|
|
|
[:div.references-blocks
|
|
|
(let [ref-hiccup (block/->hiccup filtered-blocks
|
|
|
{:id page-name
|