Merge branch 'feature/6' into develop
This commit is contained in:
commit
c6751c1d83
2
env/dev/cljs/geocsv/app.cljs
vendored
2
env/dev/cljs/geocsv/app.cljs
vendored
|
@ -1,6 +1,6 @@
|
||||||
(ns^:figwheel-no-load geocsv.app
|
(ns^:figwheel-no-load geocsv.app
|
||||||
(:require
|
(:require
|
||||||
[geocsv.core :as core]
|
[geocsv.client.core :as core]
|
||||||
[cljs.spec.alpha :as s]
|
[cljs.spec.alpha :as s]
|
||||||
[expound.alpha :as expound]
|
[expound.alpha :as expound]
|
||||||
[devtools.core :as devtools]))
|
[devtools.core :as devtools]))
|
||||||
|
|
|
@ -107,7 +107,7 @@
|
||||||
:cljsbuild{:builds
|
:cljsbuild{:builds
|
||||||
{:app
|
{:app
|
||||||
{:source-paths ["src/cljs" "src/cljc" "env/dev/cljs"]
|
{:source-paths ["src/cljs" "src/cljc" "env/dev/cljs"]
|
||||||
:figwheel {:on-jsload "geocsv.core/mount-components"}
|
:figwheel {:on-jsload "geocsv.client.core/mount-components"}
|
||||||
:compiler
|
:compiler
|
||||||
{:output-dir "target/cljsbuild/public/js/out"
|
{:output-dir "target/cljsbuild/public/js/out"
|
||||||
:closure-defines {"re_frame.trace.trace_enabled_QMARK_" true}
|
:closure-defines {"re_frame.trace.trace_enabled_QMARK_" true}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
(ns geocsv.ajax
|
(ns geocsv.client.ajax
|
||||||
(:require
|
(:require
|
||||||
[ajax.core :as ajax]
|
[ajax.core :as ajax]
|
||||||
[luminus-transit.time :as time]
|
[luminus-transit.time :as time]
|
|
@ -1,15 +1,15 @@
|
||||||
(ns geocsv.core
|
(ns geocsv.client.core
|
||||||
(:require
|
(:require
|
||||||
[day8.re-frame.http-fx]
|
[day8.re-frame.http-fx]
|
||||||
[reagent.core :as r]
|
[reagent.core :as r]
|
||||||
[re-frame.core :as rf]
|
[re-frame.core :as rf]
|
||||||
[geocsv.gis :as gis]
|
[geocsv.client.gis :as gis]
|
||||||
[geocsv.views.map :as mv]
|
[geocsv.client.views.map :as mv]
|
||||||
[goog.events :as events]
|
[goog.events :as events]
|
||||||
[goog.history.EventType :as HistoryEventType]
|
[goog.history.EventType :as HistoryEventType]
|
||||||
[markdown.core :refer [md->html]]
|
[markdown.core :refer [md->html]]
|
||||||
[geocsv.ajax :as ajax]
|
[geocsv.client.ajax :as ajax]
|
||||||
[geocsv.events]
|
[geocsv.client.events]
|
||||||
[reitit.core :as reitit]
|
[reitit.core :as reitit]
|
||||||
[reitit.frontend.easy :as rfe]
|
[reitit.frontend.easy :as rfe]
|
||||||
[clojure.string :as s])
|
[clojure.string :as s])
|
|
@ -1,6 +1,6 @@
|
||||||
(ns ^{:doc "geocsv app initial database."
|
(ns ^{:doc "geocsv app initial database."
|
||||||
:author "Simon Brooke"}
|
:author "Simon Brooke"}
|
||||||
geocsv.db)
|
geocsv.client.db)
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;;;;
|
;;;;
|
||||||
|
@ -37,5 +37,7 @@
|
||||||
"Operator"
|
"Operator"
|
||||||
"Other-key-customers"
|
"Other-key-customers"
|
||||||
"Power-supplier"} ;; need to be fetched from server side
|
"Power-supplier"} ;; need to be fetched from server side
|
||||||
|
:latitude 56
|
||||||
|
:longitude -4
|
||||||
:map {:map-centre [56 -4]
|
:map {:map-centre [56 -4]
|
||||||
:map-zoom 6}})
|
:map-zoom 6}})
|
|
@ -1,9 +1,9 @@
|
||||||
(ns geocsv.events
|
(ns geocsv.client.events
|
||||||
(:require [ajax.core :as ajax]
|
(:require [ajax.core :as ajax]
|
||||||
[ajax.json :refer [json-request-format json-response-format]]
|
[ajax.json :refer [json-request-format json-response-format]]
|
||||||
[cemerick.url :refer [url url-encode]]
|
[cemerick.url :refer [url url-encode]]
|
||||||
[geocsv.db :refer [default-db]]
|
[geocsv.client.db :refer [default-db]]
|
||||||
[geocsv.gis :refer [refresh-map-pins]]
|
[geocsv.client.gis :refer [compute-centre refresh-map-pins]]
|
||||||
[re-frame.core :as rf]
|
[re-frame.core :as rf]
|
||||||
[reitit.frontend.easy :as rfe]
|
[reitit.frontend.easy :as rfe]
|
||||||
[reitit.frontend.controllers :as rfc]))
|
[reitit.frontend.controllers :as rfc]))
|
||||||
|
@ -40,7 +40,6 @@
|
||||||
:query nil
|
:query nil
|
||||||
:anchor nil))
|
:anchor nil))
|
||||||
|
|
||||||
|
|
||||||
;;dispatchers: keep in alphabetical order, please.
|
;;dispatchers: keep in alphabetical order, please.
|
||||||
(rf/reg-event-fx
|
(rf/reg-event-fx
|
||||||
:bad-data
|
:bad-data
|
||||||
|
@ -138,12 +137,15 @@
|
||||||
;; TODO: why is this an `-fx`? Does it need to be?
|
;; TODO: why is this an `-fx`? Does it need to be?
|
||||||
(fn
|
(fn
|
||||||
[{db :db} [_ response]]
|
[{db :db} [_ response]]
|
||||||
(let [data (js->clj response)]
|
(let [db' (assoc db :data (js->clj response))]
|
||||||
(js/console.log (str "processing fetched JSON data"))
|
(js/console.log (str "processing fetched JSON data"))
|
||||||
{:db (if
|
{:db (if-let [data (:data db')]
|
||||||
(:view db)
|
(let [centre (compute-centre data)]
|
||||||
(refresh-map-pins (assoc db :data data))
|
(if
|
||||||
db)})))
|
(:view db')
|
||||||
|
(refresh-map-pins (merge db' centre))
|
||||||
|
db)
|
||||||
|
db))})))
|
||||||
|
|
||||||
(rf/reg-event-fx
|
(rf/reg-event-fx
|
||||||
:process-pin-image-names
|
:process-pin-image-names
|
|
@ -1,6 +1,6 @@
|
||||||
(ns ^{:doc "geocsv app map stuff."
|
(ns ^{:doc "geocsv app map stuff."
|
||||||
:author "Simon Brooke"}
|
:author "Simon Brooke"}
|
||||||
geocsv.gis
|
geocsv.client.gis
|
||||||
(:require [ajax.core :refer [GET]]
|
(:require [ajax.core :refer [GET]]
|
||||||
[ajax.json :refer [json-request-format json-response-format]]
|
[ajax.json :refer [json-request-format json-response-format]]
|
||||||
[cljs.reader :refer [read-string]]
|
[cljs.reader :refer [read-string]]
|
||||||
|
@ -158,17 +158,52 @@
|
||||||
(.removeLayer view %)))
|
(.removeLayer view %)))
|
||||||
view))
|
view))
|
||||||
|
|
||||||
|
(defn compute-zoom
|
||||||
|
"See [explanation here](https://leafletjs.com/examples/zoom-levels/). Brief
|
||||||
|
summary: it's hard, but it doesn't need to be precise."
|
||||||
|
[min-lat max-lat min-lng max-lng]
|
||||||
|
(let [n (min (/ 360 (- max-lng min-lng)) (/ 180 (- max-lat min-lat)))]
|
||||||
|
(first
|
||||||
|
(remove
|
||||||
|
nil?
|
||||||
|
(map
|
||||||
|
#(if (> (reduce * (repeat 2 %)) n) %)
|
||||||
|
(range))))))
|
||||||
|
|
||||||
|
(defn compute-centre
|
||||||
|
"Compute, and return as a map with keys `:latitude` and `:longitude`, the
|
||||||
|
centre of the locations of these records as indicated by the values of their
|
||||||
|
`:latitude` and `:longitude` keys."
|
||||||
|
[records]
|
||||||
|
(let [lats (filter number? (map :latitude records))
|
||||||
|
min-lat (apply min lats)
|
||||||
|
max-lat (apply max lats)
|
||||||
|
lngs (filter number? (map :longitude records))
|
||||||
|
min-lng (apply min lngs)
|
||||||
|
max-lng (apply max lngs)]
|
||||||
|
(if-not
|
||||||
|
(or (empty? lats) (empty? lngs))
|
||||||
|
{:latitude (+ min-lat (/ (- max-lat min-lat) 2))
|
||||||
|
:longitude (+ min-lng (/ (- max-lng min-lng) 2))
|
||||||
|
:zoom (compute-zoom min-lat max-lat min-lng max-lng)}
|
||||||
|
{})))
|
||||||
|
|
||||||
(defn refresh-map-pins
|
(defn refresh-map-pins
|
||||||
"Refresh the map pins on the current map. Side-effecty; liable to be
|
"Refresh the map pins on the current map. Side-effecty; liable to be
|
||||||
problematic."
|
problematic."
|
||||||
[db]
|
[db]
|
||||||
(let [view (map-remove-pins @(subscribe [:view]))
|
(let [view (map-remove-pins @(subscribe [:view]))
|
||||||
data (:data db)]
|
data (:data db)
|
||||||
|
centre (compute-centre data)]
|
||||||
(if
|
(if
|
||||||
view
|
view
|
||||||
(let [added (remove nil? (map #(add-map-pin db %1 %2 view) data (range)))]
|
(let [added (remove nil? (map #(add-map-pin db %1 %2 view) data (range)))]
|
||||||
(js/console.log (str "Adding " (count added) " pins"))
|
(js/console.log (str "Adding " (count added) " pins"))
|
||||||
db)
|
(if
|
||||||
|
(:latitude centre)
|
||||||
|
(do
|
||||||
|
(js/console.log (str "computed centre: " centre))
|
||||||
|
(.setView view (clj->js [(:latitude centre) (:longitude centre)]) (:zoom centre))
|
||||||
|
(merge db centre))
|
||||||
|
db))
|
||||||
(do (js/console.log "View is not yet ready") db))))
|
(do (js/console.log "View is not yet ready") db))))
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
(ns ^{:doc "a map onto which to project CSV data."
|
(ns ^{:doc "a map onto which to project CSV data."
|
||||||
:author "Simon Brooke"}
|
:author "Simon Brooke"}
|
||||||
geocsv.views.map
|
geocsv.client.views.map
|
||||||
(:require [cljsjs.leaflet]
|
(:require [cljsjs.leaflet]
|
||||||
[re-frame.core :refer [reg-sub subscribe dispatch dispatch-sync]]
|
[re-frame.core :refer [reg-sub subscribe dispatch dispatch-sync]]
|
||||||
[reagent.core :as reagent]
|
[reagent.core :as reagent]
|
||||||
[recalcitrant.core :refer [error-boundary]]
|
[recalcitrant.core :refer [error-boundary]]
|
||||||
[geocsv.gis :refer [refresh-map-pins get-current-location]]))
|
[geocsv.client.gis :refer [refresh-map-pins get-current-location]]))
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;;;;
|
;;;;
|
||||||
|
@ -61,9 +61,8 @@
|
||||||
(let [view (.setView
|
(let [view (.setView
|
||||||
(.map js/L
|
(.map js/L
|
||||||
"map"
|
"map"
|
||||||
;; (clj->js {:zoomControl false})
|
(clj->js {:zoomControl false}))
|
||||||
)
|
#js [@(subscribe [:latitude]) @(subscribe [:longitude])]
|
||||||
#js [56 -4] ;;[@(subscribe [:latitude]) @(subscribe [:longitude])]
|
|
||||||
@(subscribe [:zoom]))]
|
@(subscribe [:zoom]))]
|
||||||
(.addTo (.tileLayer js/L osm-url
|
(.addTo (.tileLayer js/L osm-url
|
||||||
(clj->js {:attribution osm-attrib
|
(clj->js {:attribution osm-attrib
|
Loading…
Reference in a new issue