From 3a23d5e3fac36fc4b0fd7aacd261d6564f7c4523 Mon Sep 17 00:00:00 2001 From: Andrew Suzuki Date: Sun, 5 Jun 2016 23:22:00 -0400 Subject: [PATCH] five front-end metric slider filters; debounce pool requests --- src/cljs/ulysses/components/basic.cljs | 10 +++++- src/cljs/ulysses/db.cljs | 7 +++- src/cljs/ulysses/handlers.cljs | 24 ++++++------- src/cljs/ulysses/pages/builder.cljs | 48 +++++++++++++++++++++++--- src/cljs/ulysses/subs.cljs | 18 ++++++++++ src/cljs/ulysses/utils.cljs | 40 ++++++++++++++++++++- 6 files changed, 128 insertions(+), 19 deletions(-) diff --git a/src/cljs/ulysses/components/basic.cljs b/src/cljs/ulysses/components/basic.cljs index 5d1e140..7a566e9 100644 --- a/src/cljs/ulysses/components/basic.cljs +++ b/src/cljs/ulysses/components/basic.cljs @@ -1,6 +1,6 @@ (ns ulysses.components.basic (:require [reagent.core :as reagent] - [ulysses.utils :refer [d-p map-subels classes-attr]] + [ulysses.utils :refer [d-p map-subels classes-attr str->int]] [ulysses.routes :refer [url-for]] [re-frame.core :refer [dispatch subscribe]] [clojure.string :as string])) @@ -104,6 +104,14 @@ ;; misc ;; ---------------------------------------------------------------------------- +(defn range-slider + [& {:keys [min max value on-change]}] + [:input {:type :range + :min min + :max max + :value value + :on-change #(on-change (-> % .-target .-value str->int))}]) + (defn loading-or-no-results "show a loading... message if loading, otherwise show a not found message. message(s) can be customized: diff --git a/src/cljs/ulysses/db.cljs b/src/cljs/ulysses/db.cljs index f6cfab0..ca437f4 100644 --- a/src/cljs/ulysses/db.cljs +++ b/src/cljs/ulysses/db.cljs @@ -85,7 +85,12 @@ ; builder pool filters :builder-filters {:faculty-title-set ["director"] - :faculty-years-uconn 0} + :faculty-years-uconn 0 + :metrics {:publicationCount 0 + :grantCount 0 + :grantFunds 0 + :recentGrantCount 0 + :recentGrantFunds 0}} ; user workspace-faculty hover (id) :builder-workspace-faculty-hover nil}) diff --git a/src/cljs/ulysses/handlers.cljs b/src/cljs/ulysses/handlers.cljs index 9a1871e..4668646 100644 --- a/src/cljs/ulysses/handlers.cljs +++ b/src/cljs/ulysses/handlers.cljs @@ -17,9 +17,9 @@ new-id scroll-to request - faculties-pool-params update-db-pagination - debounce-request-grant-ops]])) + debounce-request-grant-ops + debounce-request-faculties-pool]])) ;; ---------------------------------------------------------------------------- ;; general @@ -120,16 +120,10 @@ (register-handler :request-faculties-pool - (fn [db [_]] - (let [grant-op-id (-> db :route-args :grant-op-id)] - (when (valid-request-id? grant-op-id) - (request db - [:faculty :pool] - :params (merge {:fundingOppType "NihRfa" - :fundingOppId grant-op-id} - (faculties-pool-params db)) - :handler #(dispatch [:receive-faculties-pool %]))) - (assoc db :builder-faculties-pool [])))) + (fn [db _] + (debounce-request-faculties-pool db) + ; (assoc db :builder-faculties-pool []))) + db)) (register-handler :receive-faculties-pool @@ -353,6 +347,12 @@ (assoc-in db [:builder-filters :faculty-years-uconn] (or (str->int years-uconn) 0)))) +(register-handler + :builder-filter-faculty-metric + (fn [db [_ metric value]] + (assoc-in db [:builder-filters :metrics metric] + value))) + ;; builder faculty workspace hover ---- (register-handler diff --git a/src/cljs/ulysses/pages/builder.cljs b/src/cljs/ulysses/pages/builder.cljs index 21f6473..1ad0fdf 100644 --- a/src/cljs/ulysses/pages/builder.cljs +++ b/src/cljs/ulysses/pages/builder.cljs @@ -1,6 +1,11 @@ (ns ulysses.pages.builder (:require [re-frame.core :as re-frame :refer [subscribe dispatch]] - [ulysses.components.basic :refer [hink link loading-or-no-results fa tabs]] + [ulysses.components.basic :refer [hink + link + loading-or-no-results + fa + tabs + range-slider]] [ulysses.components.misc :refer [grant-op-meta]] [ulysses.components.word-cloud :refer [word-cloud]] [ulysses.utils :refer [map-subels map-lookup str->int classes-attr]] @@ -49,6 +54,17 @@ (fn [t] [:option {:value t} t]) faculty-titles)]) +(defn metric-slider + [metric filters] + (let [value (get-in filters [:metrics metric])] + [:div + ; [:div value "+"] + [range-slider + :min 0 :max 100 :value value + :on-change + (fn [v] + (dispatch [:builder-filter-faculty-metric metric v]))]])) + (defn sidebar-section [title & body] [:div.builder-panel-sidebar-section @@ -59,18 +75,42 @@ [faculty-titles filters] [:div.builder-panel-sidebar [:h3 "Filters"] - [sidebar-section "Titles" [faculty-title-multiselect faculty-titles filters]] - [sidebar-section "Years at UConn" [faculty-years-uconn + filters]] + [sidebar-section + "Publication Count" + [metric-slider + :publicationCount + filters]] + [sidebar-section + "Grant Count" + [metric-slider + :grantCount + filters]] + [sidebar-section + "Grant Funds" + [metric-slider + :grantFunds + filters]] + [sidebar-section + "Recent Grant Count" + [metric-slider + :recentGrantCount + filters]] + [sidebar-section + "Recent Grant Funds" + [metric-slider + :recentGrantFunds filters]]]) + (defn workspace-row [faculty] (let [{:keys [id name title year_hired]} faculty] [:tr.faculty-row @@ -198,7 +238,7 @@ faculties (subscribe [:faculties]) faculty-titles (subscribe [:faculty-titles]) - faculties-pool (subscribe [:builder-faculties-pool]) + faculties-pool (subscribe [:builder-faculties-pool-filtered]) workspaces (subscribe [:workspaces-current]) workspace (subscribe [:builder-workspace]) diff --git a/src/cljs/ulysses/subs.cljs b/src/cljs/ulysses/subs.cljs index 11cfce5..766c92a 100644 --- a/src/cljs/ulysses/subs.cljs +++ b/src/cljs/ulysses/subs.cljs @@ -1,6 +1,7 @@ (ns ulysses.subs (:require-macros [reagent.ratom :refer [reaction]]) (:require [re-frame.core :as re-frame :refer [register-sub]] + [ulysses.utils :refer [remap metric-maxes]] [ulysses.config :as config])) ;; ---------------------------------------------------------------------------- @@ -112,6 +113,23 @@ ;; derived data ;; ---------------------------------------------------------------------------- +(register-sub + :builder-faculties-pool-filtered + (fn [db _] + (reaction + (let [{:keys [builder-faculties-pool builder-filters]} @db] + (let [{:keys [metrics]} builder-filters + maxes (metric-maxes metrics builder-faculties-pool) + metrics-n (remap #(/ % 100) metrics)] + (filter + (fn [f] + (every? + (fn [[k v]] + (< v (/ (get-in f [:metrics k]) + (get maxes k)))) + metrics-n)) + builder-faculties-pool)))))) + (register-sub :workspaces-current (fn [db _] diff --git a/src/cljs/ulysses/utils.cljs b/src/cljs/ulysses/utils.cljs index 3355104..c48fc29 100644 --- a/src/cljs/ulysses/utils.cljs +++ b/src/cljs/ulysses/utils.cljs @@ -38,6 +38,11 @@ [f m] (into {} (for [[k v] m] [k (f v)]))) +(defn remap-kv + "map the values of a hashmap, given key and value" + [f m] + (into {} (for [[k v] m] [k (f k v)]))) + (defn map-subels "reagent util: apply f to each item in collection, associating :key metadata (first tries :id of each el; @@ -273,7 +278,7 @@ (assoc :page-last last_page))) (defn faculties-pool-params - "make a params map with titleSet[0..n] and yearsUconn" + "make a pool request params map with titleSet[0..n] and yearsUconn" [db] (->> [:builder-filters :faculty-title-set] (get-in db) @@ -284,6 +289,19 @@ (merge {:yearsAtUconn (get-in db [:builder-filters :faculty-years-uconn])}))) +(defn metric-maxes + "given metrics builder filters (0-100) and faculties, + return the maximum values for each metric" + [metrics faculties] + (let [fm (map :metrics faculties)] + (remap-kv + (fn [metric _] + (->> fm + (map (fn [f] (get f metric))) + (filter integer?) + (apply max))) + metrics))) + ;; ---------------------------------------------------------------------------- ;; data transforms ;; ---------------------------------------------------------------------------- @@ -362,6 +380,8 @@ (finish e))})) ; user db) ; (no direct db change) +; grant ops requests + (def request-grant-ops-channel (debounce-standard (fn [db page] @@ -384,6 +404,24 @@ [db page] (put! request-grant-ops-channel [db page])) +; faculty requests + +(def request-faculties-pool-channel + (debounce-standard + (fn [db] + (let [grant-op-id (-> db :route-args :grant-op-id)] + (when (valid-request-id? grant-op-id) + (request db + [:faculty :pool] + :params (merge {:fundingOppType "NihRfa" + :fundingOppId grant-op-id} + (faculties-pool-params db)) + :handler #(dispatch [:receive-faculties-pool %]))))))) + +(defn debounce-request-faculties-pool + [db] + (put! request-faculties-pool-channel [db])) + ;; ---------------------------------------------------------------------------- ;; direct dom mutations ;; ----------------------------------------------------------------------------