Skip to content

Instantly share code, notes, and snippets.

@mmower
Created September 20, 2017 21:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mmower/645b4fbea602478b23849209447b4a7a to your computer and use it in GitHub Desktop.
Save mmower/645b4fbea602478b23849209447b4a7a to your computer and use it in GitHub Desktop.
(ns ring.views
(:require [re-frame.core :as re-frame]
[re-com.core :refer [v-box h-box input-text label checkbox gap info-button] :refer-macros [handler-fn]]
[re-frame-datatable.core :as dt]
[klang.core :refer-macros [info!]]
[clojure.string :as str]
[ring.subs :as subs]))
(defn search-url [q]
(str "https://www.google.co.uk/search?q=" q))
(defn search-link-val [val]
[:a {:target "_blank" :href (search-url val)} val])
(defn render-email [em]
(let [[first & rest :as emails] (str/split em ",")]
(if rest
[h-box
:children [(search-link-val first)
[info-button :info [v-box :children [(map search-link-val emails)]]]]]
(search-link-val first))))
(defn dt-results-table []
[dt/datatable
:people
[:results]
[{::dt/column-key [:ke]
::dt/sorting {::dt/enabled? true}
::dt/column-label "#"}
{::dt/column-key [:gn]
::dt/column-label "First Name"
::dt/sorting {::dt/enabled? true}}
{::dt/column-key [:ln]
::dt/column-label "Last Name"
::dt/sorting {::dt/enabled? true}}
{::dt/column-key [:em]
::dt/column-label "Email"
::dt/render-fn render-email}
{::dt/column-key [:co]
::dt/column-label "Company"
::dt/sorting {::dt/enabled? true}
::dt/render-fn search-link-val}
{::dt/column-key [:ti]
::dt/column-label "Title"
::dt/sorting {::dt/enabled? true}}
{::dt/column-key [:rt]
::dt/column-label "Contact Of"
::dt/sorting {::dt/enabled? true}}]
{::dt/pagination {::dt/enabled? true
::dt/per-page 250}
::dt/table-classes ["ui" "celled" "stripped" "table"]}])
(defn query-box []
(let [query @(re-frame/subscribe [:query])]
[h-box
:children [[v-box
:children [[label
:label "First Name:"]
[input-text
:model (:gn query)
:on-change (fn [v]
(re-frame/dispatch [:set-query :gn v]))
:change-on-blur? false]]]
[v-box
:children [[label
:label "Last Name:"]
[input-text
:model (:ln query)
:on-change #(re-frame/dispatch [:set-query :ln %])
:change-on-blur? false]]]
[v-box
:children [[label
:label "Email:"]
[input-text
:model (:em query)
:on-change #(re-frame/dispatch [:set-query :em %])
:change-on-blur? false]]] [v-box
:children [[label
:label "Company:"]
[input-text
:model (:co query)
:on-change #(re-frame/dispatch [:set-query :co %])
:change-on-blur? false]]]
[v-box
:children [[label
:label "Title:"]
[input-text
:model (:ti query)
:on-change #(re-frame/dispatch [:set-query :ti %])
:change-on-blur? false]]]]]))
(defn results-box []
[v-box :children [[dt/default-pagination-controls :people [:results]]
[dt-results-table]
[dt/default-pagination-controls :people [:results]]]])
(defn main-panel []
(let [show-ui-spinner? @(re-frame/subscribe [:show-ui-spinner?])
contacts-count @(re-frame/subscribe [:contacts-count])
query @(re-frame/subscribe [:query])
results-count @(re-frame/subscribe [:result-count])]
[v-box :children [[h-box
:gap "16px"
:children [(str "Contacts:" contacts-count)
(str "Results:" results-count)]]
(if show-ui-spinner?
[:p.lead "Loading contact data..."]
[query-box])
[results-box]]]))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment