From b173d11cf94e009cb283f6df44cf3a2ec98b0fd3 Mon Sep 17 00:00:00 2001 From: samfundev Date: Fri, 25 Sep 2020 11:27:20 -0400 Subject: [PATCH] feat: Filter --- src/main/frontend/components/reference.cljs | 69 +++++++++++++++++++-- src/main/frontend/components/svg.cljs | 11 ++++ 2 files changed, 74 insertions(+), 6 deletions(-) diff --git a/src/main/frontend/components/reference.cljs b/src/main/frontend/components/reference.cljs index fe5e6fe932..55f3abe083 100644 --- a/src/main/frontend/components/reference.cljs +++ b/src/main/frontend/components/reference.cljs @@ -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 references < rum/reactive db-mixins/query - [page-name marker? priority?] +(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/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 diff --git a/src/main/frontend/components/svg.cljs b/src/main/frontend/components/svg.cljs index 526576ed24..277fe692b2 100644 --- a/src/main/frontend/components/svg.cljs +++ b/src/main/frontend/components/svg.cljs @@ -431,3 +431,14 @@ (def online (hero-icon "M8.111 16.404a5.5 5.5 0 017.778 0M12 20h.01m-7.08-7.071c3.904-3.905 10.236-3.905 14.141 0M1.394 9.393c5.857-5.857 15.355-5.857 21.213 0")) + +(rum/defc filter-icon + [] + [:svg + {:stroke "currentColor" + :fill "currentColor" + :view-box "0 0 16.06 16.06" + :width "16" + :height "16"} + [:path + {:d "M.53.53h15l-5 7v8h-5v-8z" :stroke-width "1.06" :stroke-linejoin "round"}]])