Merge branch 'feature/clientframework' into develop

This commit is contained in:
Simon Brooke 2017-03-18 08:56:28 +00:00
commit dd85254607
13 changed files with 228 additions and 81 deletions

View file

@ -5,35 +5,36 @@
:dependencies [[org.clojure/clojure "1.8.0"]
[org.clojure/clojurescript "1.9.229" :scope "provided"]
[ring/ring-servlet "1.5.0"]
[ring/ring-servlet "1.5.1"]
[clj-oauth "1.5.5"]
[ch.qos.logback/logback-classic "1.1.8"]
[re-frame "0.9.1"]
[ch.qos.logback/logback-classic "1.2.2"]
[re-frame "0.9.2"]
[cljs-ajax "0.5.8"]
[secretary "1.2.3"]
[reagent-utils "0.2.0"]
[reagent "0.6.0"]
[reagent-utils "0.2.1"]
[reagent "0.6.1"]
[korma "0.4.3"]
[selmer "1.10.3"]
[markdown-clj "0.9.91"]
[ring-middleware-format "0.7.0"]
[metosin/ring-http-response "0.8.0"]
[bouncer "1.0.0"]
[org.webjars/bootstrap "4.0.0-alpha.5"]
[selmer "1.10.6"]
[markdown-clj "0.9.98"]
[ring-middleware-format "0.7.2"]
[metosin/ring-http-response "0.8.2"]
[bouncer "1.0.1"]
[org.webjars/bootstrap "4.0.0-alpha.6-1"]
[org.webjars/font-awesome "4.7.0"]
[org.webjars.bower/tether "1.3.7"]
[org.webjars.bower/tether "1.4.0"]
[org.clojure/tools.logging "0.3.1"]
[compojure "1.5.1"]
[compojure "1.5.2"]
[metosin/compojure-api "1.1.10"]
[ring-webjars "0.1.1"]
[ring/ring-defaults "0.2.1"]
[ring/ring-defaults "0.2.3"]
[luminus/ring-ttl-session "0.3.1"]
[mount "0.1.11"]
[cprop "0.1.9"]
[cprop "0.1.10"]
[org.clojure/tools.cli "0.3.5"]
[migratus "0.8.32"]
[migratus "0.8.33"]
[luminus-nrepl "0.1.4"]
[luminus-migrations "0.2.9"]
[conman "0.6.2"]
[luminus-migrations "0.3.0"]
[conman "0.6.3"]
[org.postgresql/postgresql "9.4.1212"]
]
@ -111,21 +112,21 @@
:project/dev {:dependencies [[prone "1.1.4"]
[ring/ring-mock "0.3.0"]
[ring/ring-devel "1.5.0"]
[ring/ring-devel "1.5.1"]
[luminus-jetty "0.1.4"]
[pjstadig/humane-test-output "0.8.1"]
[org.clojure/core.cache "0.6.5"]
[org.apache.httpcomponents/httpcore "4.4.5"]
[org.apache.httpcomponents/httpcore "4.4.6"]
[clj-webdriver/clj-webdriver "0.7.2"]
[org.seleniumhq.selenium/selenium-server "3.0.1"]
[org.seleniumhq.selenium/selenium-server "3.3.1"]
[doo "0.1.7"]
[binaryage/devtools "0.8.3"]
[figwheel-sidecar "0.5.8"]
[binaryage/devtools "0.9.2"]
[figwheel-sidecar "0.5.9"]
[com.cemerick/piggieback "0.2.2-SNAPSHOT"]
[directory-naming/naming-java "0.8"]]
:plugins [[com.jakemccrary/lein-test-refresh "0.14.0"]
[lein-doo "0.1.7"]
[lein-figwheel "0.5.8"]
[lein-figwheel "0.5.9"]
[org.clojure/clojurescript "1.9.229"]]
:cljsbuild
{:builds

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

View file

@ -34,6 +34,11 @@
</div>
<!-- scripts and styles -->
<!-- ATTENTION \/ -->
<!-- Leaflet -->
<link rel="stylesheet" href="http://cdn.leafletjs.com/leaflet-0.7.3/leaflet.css" />
<script src="http://cdn.leafletjs.com/leaflet-0.7.3/leaflet.js"></script>
<!-- ATTENTION /\ -->
<script type="text/javascript">
var context = "{{servlet-context}}";

View file

@ -34,6 +34,26 @@
;;; redundant, and if they are the namespace probably needs to be renamed to 'entities'.
;;; See also resources/migrations/20161014170335-basic-setup.up.sql
(defn create-districts-table!
"Create a table to hold the electoral districts in which electors are registered.
Note that, as this app is being developed for the independence referendum in which
polling is across the whole of Scotland, this part of the design isn't fully thought
through; if later adapted to general or local elections, some breakdown or hierarchy
of polling districts into constituencies will be required."
[]
(sql/db-do-commands
yyydb/*db*
(sql/create-table-ddl
:districts
;; it may be necessary to have a serial abstract primary key but I suspect
;; polling districts already have numbers assigned by the Electoral Commission and
;; it would be sensible to use those. TODO: check.
[:id "integer not null primary key"]
[:name "varchar(64) not null"]
;; TODO: it would make sense to hold polygon data for polling districts so we can reflect
;; them on the map, but I haven't thought through how to do that yet.
)))
(kc/defentity district
(kc/pk :id)

View file

@ -44,4 +44,4 @@
:return Long
:header-params [x :- Long, y :- Long]
:summary "x^y with header-parameters"
(ok (long (Math/pow x y))))))
(ok (long (Math/pow x y)))))))

View file

@ -9,66 +9,23 @@
[youyesyet.ajax :refer [load-interceptors!]]
[youyesyet.handlers]
[youyesyet.subscriptions]
[youyesyet.ui-utils :as ui]
[youyesyet.views.about :as about]
[youyesyet.views.home :as home]
[youyesyet.views.map :as maps])
(:import goog.History))
(defn nav-link [uri title page collapsed?]
(let [selected-page (rf/subscribe [:page])]
[:li.nav-item
{:class (when (= page @selected-page) "active")}
[:a.nav-link
{:href uri
:on-click #(reset! collapsed? true)} title]]))
(defn navbar []
(r/with-let [collapsed? (r/atom true)]
[:div {:id "nav"}
[:img {:id "nav-icon"
:src "img/threelines.png"
:on-click #(swap! collapsed? not)}]
[:menu.nav {:id "nav-menu" :class (if @collapsed? "hidden" "shown")}
(nav-link "#/" "Home" :home collapsed?)
(nav-link "#/library" "Library" :library collapsed?)
(nav-link "#/register" "Register" :register collapsed?)
(nav-link "#/login" "Login" :login collapsed?)
(nav-link "#/about" "About" :about collapsed?)]]))
(defn back-link []
[:div.back-link-container {:id "back-link-container"}
[:a {:href "javascript:history.back()" :id "back-link"} "Back"]])
(defn big-link [text target]
[:div.big-link-container
[:a.big-link {:href target} text]])
(defn about-page []
[:div.container {:id "main-container"}
(back-link)
[:div.row
[:div.col-md-12
"this is the story of youyesyet... work in progress"]]])
(about/panel))
(defn home-page []
[:div.container {:id "main-container"}
(big-link "About" "#/about")
[:div.jumbotron
[:h1 "Welcome to youyesyet"]
[:p "Time to start building your site!"]
[:p [:a.btn.btn-primary.btn-lg {:href "http://luminusweb.net"} "Learn more »"]]]])
(when-let [docs @(rf/subscribe [:docs])]
[:div.row
[:div.col-md-12
[:div {:dangerouslySetInnerHTML
{:__html (md->html docs)}}]]])
(home/panel))
(defn map-page []
(maps/map-div))
(maps/panel))
(def pages
{:home #'home-page
@ -78,7 +35,7 @@
(defn page []
[:div
[:header
[navbar]
[ui/navbar]
[:h1 "You yes yet?"]]
[(pages @(rf/subscribe [:page]))]])
@ -92,7 +49,6 @@
(secretary/defroute "/about" []
(rf/dispatch [:set-active-page :about]))
(secretary/defroute "/map" []
(rf/dispatch [:set-active-page :map]))

View file

@ -0,0 +1,59 @@
(ns youyesyet.ui-utils
(:require [reagent.core :as r]
[re-frame.core :as rf]))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;
;;;; youyesyet.ui-utils: User interface stuff common to many views.
;;;;
;;;; This program is free software; you can redistribute it and/or
;;;; modify it under the terms of the GNU General Public License
;;;; as published by the Free Software Foundation; either version 2
;;;; of the License, or (at your option) any later version.
;;;;
;;;; This program is distributed in the hope that it will be useful,
;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;;;; GNU General Public License for more details.
;;;;
;;;; You should have received a copy of the GNU General Public License
;;;; along with this program; if not, write to the Free Software
;;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
;;;; USA.
;;;;
;;;; Copyright (C) 2016 Simon Brooke for Radical Independence Campaign
;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn back-link []
[:div.back-link-container {:id "back-link-container"}
[:a {:href "javascript:history.back()" :id "back-link"} "Back"]])
(defn big-link [text target]
[:div.big-link-container
[:a.big-link {:href target} text]])
(defn nav-link [uri title page collapsed?]
(let [selected-page (rf/subscribe [:page])]
[:li.nav-item
{:class (when (= page @selected-page) "active")}
[:a.nav-link
{:href uri
:on-click #(reset! collapsed? true)} title]]))
(defn navbar []
(r/with-let [collapsed? (r/atom true)]
[:div {:id "nav"}
[:img {:id "nav-icon"
:src "img/threelines.png"
:on-click #(swap! collapsed? not)}]
[:menu.nav {:id "nav-menu" :class (if @collapsed? "hidden" "shown")}
(nav-link "#/" "Home" :home collapsed?)
(nav-link "#/library" "Library" :library collapsed?)
(nav-link "#/register" "Register" :register collapsed?)
(nav-link "#/login" "Login" :login collapsed?)
(nav-link "#/about" "About" :about collapsed?)]]))

View file

@ -0,0 +1,54 @@
(ns youyesyet.views.about
(:require [re-frame.core :refer [reg-sub]]
[youyesyet.ui-utils :as ui]))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;
;;;; youyesyet.views.electors: about/credits view for youyesyet.
;;;;
;;;; This program is free software; you can redistribute it and/or
;;;; modify it under the terms of the GNU General Public License
;;;; as published by the Free Software Foundation; either version 2
;;;; of the License, or (at your option) any later version.
;;;;
;;;; This program is distributed in the hope that it will be useful,
;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;;;; GNU General Public License for more details.
;;;;
;;;; You should have received a copy of the GNU General Public License
;;;; along with this program; if not, write to the Free Software
;;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
;;;; USA.
;;;;
;;;; Copyright (C) 2016 Simon Brooke for Radical Independence Campaign
;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; The pattern from the re-com demo (https://github.com/Day8/re-com) is to have
;;; one source file/namespace per view. Each namespace contains a function 'panel'
;;; whose output is an enlive-style specification of the view to be redered.
(defn panel
"Generate the about panel."
[]
[:div.container {:id "main-container"}
[:h2 "Pre-alpha/proof of concept"]
[:p {:class "centre"}
[:img {:src "img/ric-logo.png" :width "24" :height "24"}]
" A project of the "
[:a {:href "https://radical.scot/"} "Radical Independence Campaign"]]
[:p {:class "centre"}
[:img {:src "img/clojure-icon.gif" :alt "Clojure" :height "24" :width "24"}]
" Powered by "
[:a {:href "http://clojure.org"} "Clojure"]]
[:p {:class "centre"}
[:img {:src "img/github-logo-transparent.png" :alt "GitHub" :height "24" :width "24"}]
" Find me/fork me on "
[:a {:href "https://github.com/simon-brooke/youyesyet"} "GitHub"]]
[:p {:class "centre"}
[:img {:src "img/gnu.small.png" :alt "Free Software Foundation" :height "24" :width "24"}]
" Licensed under the "
[:a {:href "http://www.gnu.org/licenses/gpl-2.0.html"}
"GNU General Public License v2.0"]]])

View file

@ -0,0 +1,48 @@
(ns youyesyet.views.home
(:require [re-frame.core :refer [reg-sub]]
[youyesyet.ui-utils :as ui]))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;
;;;; youyesyet.views.electors: home view for youyesyet.
;;;;
;;;; This program is free software; you can redistribute it and/or
;;;; modify it under the terms of the GNU General Public License
;;;; as published by the Free Software Foundation; either version 2
;;;; of the License, or (at your option) any later version.
;;;;
;;;; This program is distributed in the hope that it will be useful,
;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;;;; GNU General Public License for more details.
;;;;
;;;; You should have received a copy of the GNU General Public License
;;;; along with this program; if not, write to the Free Software
;;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
;;;; USA.
;;;;
;;;; Copyright (C) 2016 Simon Brooke for Radical Independence Campaign
;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; The pattern from the re-com demo (https://github.com/Day8/re-com) is to have
;;; one source file/namespace per view. Each namespace contains a function 'panel'
;;; whose output is an enlive-style specification of the view to be redered.
;;; I propose to follow this pattern. This file will provide the home view.
(defn panel
"Generate the home panel."
[]
[:div.container {:id "main-container"}
(ui/big-link "About" "#/about")
(ui/big-link "Map" "#/map")
[:div.jumbotron
[:h1 "You Yes Yet?"]
[:p "Time to start building your site!"]
[:p [:a.btn.btn-primary.btn-lg {:href "http://luminusweb.net"} "Learn more »"]]]])
(when-let [docs @(rf/subscribe [:docs])]
[:div.row
[:div.col-md-12
[:div {:dangerouslySetInnerHTML
{:__html (md->html docs)}}]]])

View file

@ -44,7 +44,11 @@
;; which provider to use
(def *map-provider* :osm)
(def osm-url "http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png")
(def osm-attrib "Map data &copy; <a href='http://openstreetmap.org'>OpenStreetMap</a> contributors")
;; My gods mapbox is user-hostile!
(defn map-did-mount-mapbox
"Did-mount function loading map tile data from MapBox (proprietary)."
[]
@ -60,8 +64,8 @@
"Did-mount function loading map tile data from Open Street Map (open)."
[]
(let [map (.setView (.map js/L "map") #js [55.86 -4.25] 13)]
(.addTo (.tileLayer js/L "http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
(clj->js {:attribution "Map data &copy; <a href=\"http://openstreetmap.org\">OpenStreetMap</a> contributors"
(.addTo (.tileLayer js/L osm-url
(clj->js {:attribution osm-attrib
:maxZoom 18}))
map)))
@ -79,10 +83,10 @@
(defn map-render
"Render the actual div containing the map."
[]
[:div#map {:style {:height "360px"}}])
[:div#map {:style {:height "500px"}}])
(defn map-div
(defn panel
"A reagent class for the map object."
[]
(reagent/create-class {:reagent-render map-render