From 7724a2514a3561a801bd07e4672fe60c99245b76 Mon Sep 17 00:00:00 2001
From: Simon Brooke <simon@journeyman.cc>
Date: Tue, 28 Aug 2018 14:27:44 +0100
Subject: [PATCH] Stuck with an on-click handler that isn't happening

---
 resources/templates/base.html                 |  1 +
 src/cljs/youyesyet/canvasser_app/core.cljs    | 40 +++++++++----------
 .../youyesyet/canvasser_app/handlers.cljs     | 29 ++++++++++----
 .../youyesyet/canvasser_app/ui_utils.cljs     |  8 +++-
 .../canvasser_app/views/building.cljs         |  2 +-
 .../canvasser_app/views/dwelling.cljs         |  9 ++++-
 .../youyesyet/canvasser_app/views/gdpr.cljs   | 28 ++++++++++---
 7 files changed, 78 insertions(+), 39 deletions(-)

diff --git a/resources/templates/base.html b/resources/templates/base.html
index c14f6de..3f9928e 100644
--- a/resources/templates/base.html
+++ b/resources/templates/base.html
@@ -5,6 +5,7 @@
     <!-- head: if you want entire custom head content, override this block. -->
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
     <meta name="viewport" content="width=device-width, initial-scale=1"/>
+    <meta name="referrer" content="same-origin">
     {% style "/css/yyy-common.css" %}
     {% style "/css/yyy-site.css" %}
     {% style "/css/spinner.css" %}
diff --git a/src/cljs/youyesyet/canvasser_app/core.cljs b/src/cljs/youyesyet/canvasser_app/core.cljs
index 81b4e36..89493ac 100644
--- a/src/cljs/youyesyet/canvasser_app/core.cljs
+++ b/src/cljs/youyesyet/canvasser_app/core.cljs
@@ -118,61 +118,57 @@
 ;; Routes
 (secretary/set-config! :prefix "#")
 
-(defn log-and-dispatch [arg]
-  (js/console.log (str "Dispatching " arg))
-  (rf/dispatch arg))
-
 (secretary/defroute "/" []
-  (log-and-dispatch [:set-active-page :map]))
+  (ui/log-and-dispatch [:set-active-page :map]))
 
 (secretary/defroute "/about" []
-  (log-and-dispatch [:set-active-page :about]))
+  (ui/log-and-dispatch [:set-active-page :about]))
 
 (secretary/defroute "/dwelling" []
-  (log-and-dispatch [:set-active-page :dwelling]))
+  (ui/log-and-dispatch [:set-active-page :dwelling]))
 
 (secretary/defroute "/dwelling/:dwelling" {dwelling-id :dwelling}
-  (log-and-dispatch [:set-dwelling dwelling-id])
-  (log-and-dispatch [:set-active-page :dwelling]))
+  (ui/log-and-dispatch [:set-dwelling dwelling-id])
+  (ui/log-and-dispatch [:set-active-page :dwelling]))
 
 (secretary/defroute "/building/:address" {address-id :address}
-  (log-and-dispatch [:set-address address-id]))
+  (ui/log-and-dispatch [:set-address address-id]))
 
 (secretary/defroute "/elector" []
-  (log-and-dispatch [:set-active-page :elector]))
+  (ui/log-and-dispatch [:set-active-page :elector]))
 
 (secretary/defroute "/elector/:elector" {elector-id :elector}
-  (log-and-dispatch [:set-elector-and-page {:elector-id elector-id :page :elector}]))
+  (ui/log-and-dispatch [:set-elector-and-page {:elector-id elector-id :page :elector}]))
 
 (secretary/defroute "/elector/:elector/:consent" {elector-id :elector consent :consent}
-  (log-and-dispatch [:set-consent-and-page {:elector-id elector-id :consent (and true consent) :page :elector}]))
+  (ui/log-and-dispatch [:set-active-page {:page :elector}]))
 
 (secretary/defroute "/elector" []
-  (log-and-dispatch [:set-active-page :elector]))
+  (ui/log-and-dispatch [:set-active-page :elector]))
 
 (secretary/defroute "/followup" []
-  (log-and-dispatch [:set-active-page :followup]))
+  (ui/log-and-dispatch [:set-active-page :followup]))
 
 (secretary/defroute "/gdpr" []
-  (log-and-dispatch [:set-active-page :gdpr]))
+  (ui/log-and-dispatch [:set-active-page :gdpr]))
 
 (secretary/defroute "/gdpr/:elector" {elector-id :elector}
-  (log-and-dispatch [:set-elector-and-page {:elector-id elector-id :page :gdpr}]))
+  (ui/log-and-dispatch [:set-elector-and-page {:elector-id elector-id :page :gdpr}]))
 
 (secretary/defroute "/issues" []
-  (log-and-dispatch [:set-active-page :issues]))
+  (ui/log-and-dispatch [:set-active-page :issues]))
 
 (secretary/defroute "/issues/:elector" {elector-id :elector}
-  (log-and-dispatch [:set-elector-and-page {:elector-id elector-id :page :issues}]))
+  (ui/log-and-dispatch [:set-elector-and-page {:elector-id elector-id :page :issues}]))
 
 (secretary/defroute "/issue/:issue" {issue :issue}
-  (log-and-dispatch [:set-and-go-to-issue issue]))
+  (ui/log-and-dispatch [:set-and-go-to-issue issue]))
 
 (secretary/defroute "/map" []
-  (log-and-dispatch [:set-active-page :map]))
+  (ui/log-and-dispatch [:set-active-page :map]))
 
 (secretary/defroute "/set-intention/:elector/:intention" {elector-id :elector intention :intention}
-  (log-and-dispatch [:set-intention {:elector-id elector-id :intention intention}]))
+  (ui/log-and-dispatch [:set-intention {:elector-id elector-id :intention intention}]))
 
 ;; -------------------------
 ;; History
diff --git a/src/cljs/youyesyet/canvasser_app/handlers.cljs b/src/cljs/youyesyet/canvasser_app/handlers.cljs
index 833305f..3ab4419 100644
--- a/src/cljs/youyesyet/canvasser_app/handlers.cljs
+++ b/src/cljs/youyesyet/canvasser_app/handlers.cljs
@@ -209,8 +209,10 @@
    [{db :db} [_ response]]
    (js/console.log (str "Updating locality data: " (count response) " addresses " ))
    (refresh-map-pins)
-   {:dispatch-later [{:ms 60000 :dispatch [:fetch-locality]}
-                     {:ms 1000 :dispatch [:get-current-location]}]
+   {
+;;      :dispatch-later [{:ms 60000 :dispatch [:fetch-locality]}
+;;                      ;; {:ms 1000 :dispatch [:get-current-location]}
+;;                      ]
     :db (assoc
           (remove-from-feedback db :fetch-locality)
           :addresses (js->clj response))}))
@@ -380,15 +382,28 @@
             :page :building))))))
 
 
+(reg-event-db
+  :update-elector
+  (fn [db [_ args]]
+    (if (:signature (:elector db))
+      (do
+        (js/console.log "Updating elector signature")
+        (add-to-feedback
+          (add-to-outqueue
+            db
+            {:elector (:elector db)
+             :action :update-elector-signature})
+          :send-request))
+      (assoc db :error "Please supply a telephone number to call"))))
+
+
 (reg-event-db
   :set-consent-and-page
   (fn [db [_ args]]
     (let [page (:page args)
-          consent (:consent args)
-          elector-id (coerce-to-number (:elector-id args))
-          elector (get-elector elector-id db)]
-      (js/console.log (str "Setting page to " page ", consent to " consent " for " (:name elector)))
-      (assoc (clear-messages db) :elector (assoc elector :consent true) :page page))))
+          elector (:elector args)]
+      (dispatch [:update-elector {:elector elector}])
+      (assoc (clear-messages db) :elector elector :page page))))
 
 
 (reg-event-db
diff --git a/src/cljs/youyesyet/canvasser_app/ui_utils.cljs b/src/cljs/youyesyet/canvasser_app/ui_utils.cljs
index 12ab66f..cd37ead 100644
--- a/src/cljs/youyesyet/canvasser_app/ui_utils.cljs
+++ b/src/cljs/youyesyet/canvasser_app/ui_utils.cljs
@@ -28,6 +28,11 @@
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
 
+(defn log-and-dispatch [arg]
+  (js/console.log (str "Dispatching " arg))
+  (rf/dispatch arg))
+
+
 (defn back-link
   "Generate a back link to the preceding page, or, if `target` is specified,
   to a particular page."
@@ -40,8 +45,9 @@
 
 (defn big-link
   [text & {:keys [target handler]}]
+  (js/console.log (str "Big link with target '" target "'; handler '" handler "'"))
   [:div.big-link-container {:key (gensym "big-link")}
-   [:a.big-link (merge
+   [:a.big-link (merge {:href target :on-click handler}
                   (if target {:href target}{})
                   (if handler {:on-click handler}{}))
     text]])
diff --git a/src/cljs/youyesyet/canvasser_app/views/building.cljs b/src/cljs/youyesyet/canvasser_app/views/building.cljs
index d2cac79..3cc7446 100644
--- a/src/cljs/youyesyet/canvasser_app/views/building.cljs
+++ b/src/cljs/youyesyet/canvasser_app/views/building.cljs
@@ -41,7 +41,7 @@
     [:div
      [:h1 (str "Flats at " (:address address))]
      [:div.container {:id "main-container"}
-      (ui/back-link)
+      (ui/back-link "#map")
       [:div {:id "dwelling-list"}
        (map
          (fn
diff --git a/src/cljs/youyesyet/canvasser_app/views/dwelling.cljs b/src/cljs/youyesyet/canvasser_app/views/dwelling.cljs
index 73f28b3..88d5bee 100644
--- a/src/cljs/youyesyet/canvasser_app/views/dwelling.cljs
+++ b/src/cljs/youyesyet/canvasser_app/views/dwelling.cljs
@@ -80,11 +80,16 @@
 (defn panel
   "Generate the electors panel."
   []
+  (js/console.log "dwelling.panel")
   (let [dwelling @(subscribe [:dwelling])
         address @(subscribe [:address])
         sub-address (:sub-address dwelling)
         electors (sort-by :id (:electors dwelling))
-        options @(subscribe [:options])]
+        options @(subscribe [:options])
+        back (if
+               (> (count (:dwellings address)) 1)
+               "#building"
+               "#map")]
     (if address
       [:div
        [:h1 (if sub-address
@@ -95,7 +100,7 @@
          [:tbody
           (genders-row electors)
           (names-row electors)]]
-        (ui/back-link)]]
+        (ui/back-link back)]]
       (ui/error-panel "No address selected"))))
 
 
diff --git a/src/cljs/youyesyet/canvasser_app/views/gdpr.cljs b/src/cljs/youyesyet/canvasser_app/views/gdpr.cljs
index 65e1e5a..9da0ad3 100644
--- a/src/cljs/youyesyet/canvasser_app/views/gdpr.cljs
+++ b/src/cljs/youyesyet/canvasser_app/views/gdpr.cljs
@@ -30,6 +30,11 @@
 
 ;; OK, the idea here is a GDPR consent form to be signed by the elector
 
+(def sig-pad
+  ;; something the signature pad will be bound to
+  (atom nil))
+
+
 (defn gdpr-render
   []
   (let [elector @(subscribe [:elector])]
@@ -51,21 +56,32 @@
           [:canvas {:id "signature-pad"}]]]]]]
      (ui/back-link "#dwelling")
      (ui/big-link "I consent"
-                  :target (str "#elector/" (:id elector) "/true")
-                  :handler #(fn [] (dispatch [:set-consent-and-page {:elector-id (:id elector) :page :elector}])))
-     ;; TODO: need to save the signature
+                  ;; :target (str "#elector/" (:id elector) "/true/")
+                  :handler #(fn
+                              []
+                              (ui/log-and-dispatch
+                                [:set-consent-and-page
+                                 {:elector-id (:id elector)
+                                  :page :elector
+                                  :elector (merge
+                                             elector
+                                             :signature
+                                             (.toDataURL
+                                               sig-pad
+                                               "image/svg+xml")
+                                             )}])))
      (ui/big-link "I DO NOT consent"
-                  :target (str "#elector/" (:id elector) "/true"))]))
-                  ;; :handler #(fn [] (dispatch [:set-elector-and-page {:elector-id (:id elector) :page :elector}])))]))
+                  :target (str "#elector/" (:id elector) "/false"))]))
 
 
 (defn gdpr-did-mount
   []
-  (js/SignaturePad. (.getElementById js/document "signature-pad")))
+  (reset! sig-pad (js/SignaturePad. (.getElementById js/document "signature-pad"))))
 
 
 (defn panel
   "A reagent class for the GDPR consent form"
   []
+  (js/console.log "gdpr.panel")
   (reagent/create-class {:reagent-render gdpr-render
                          :component-did-mount gdpr-did-mount}))