#41 Updated client to cope with dwelling changs
This commit is contained in:
		
							parent
							
								
									88c5c74c52
								
							
						
					
					
						commit
						2e81c7b664
					
				|  | @ -83,14 +83,14 @@ WHERE id = :id | ||||||
| -- :name create-canvasser! :! :n | -- :name create-canvasser! :! :n | ||||||
| -- :doc creates a new canvasser record | -- :doc creates a new canvasser record | ||||||
| INSERT INTO canvassers | INSERT INTO canvassers | ||||||
| (username, fullname, elector_id, address_id, phone, email, authority_id, authorised) | (username, fullname, elector_id, dwelling_id, phone, email, authority_id, authorised) | ||||||
| VALUES (:username, :fullname, :elector_id, :address_id, :phone, :email, :authority_id, :authorised) | VALUES (:username, :fullname, :elector_id, :dwelling_id, :phone, :email, :authority_id, :authorised) | ||||||
| RETURNING id | RETURNING id | ||||||
| 
 | 
 | ||||||
| -- :name update-canvasser! :! :n | -- :name update-canvasser! :! :n | ||||||
| -- :doc update an existing canvasser record | -- :doc update an existing canvasser record | ||||||
| UPDATE canvassers | UPDATE canvassers | ||||||
| SET username = :username, fullname = :fullname, elector_id = :elector_id, address_id = :address_id, phone = :phone, email = :email, authority_id = :authority_id, authorised = :authorised | SET username = :username, fullname = :fullname, elector_id = :elector_id, dwelling_id = :dwelling_id, phone = :phone, email = :email, authority_id = :authority_id, authorised = :authorised | ||||||
| WHERE id = :id | WHERE id = :id | ||||||
| 
 | 
 | ||||||
| -- :name get-canvasser :? :1 | -- :name get-canvasser :? :1 | ||||||
|  | @ -138,17 +138,52 @@ DELETE FROM districts | ||||||
| WHERE id = :id | WHERE id = :id | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | -- :name get-dwelling :? :1 | ||||||
|  | -- :doc retrieve a dwelling given the id. | ||||||
|  | SELECT * FROM dwellings | ||||||
|  | WHERE id = :id | ||||||
|  | 
 | ||||||
|  | -- :name delete-dwelling! :! :n | ||||||
|  | -- :doc delete a dwelling given the id | ||||||
|  | DELETE FROM dwellings | ||||||
|  | WHERE id = :id | ||||||
|  | 
 | ||||||
|  | -- :name create-dwelling! :! :n | ||||||
|  | -- :doc creates a new dwelling record | ||||||
|  | INSERT INTO dwellings | ||||||
|  | (id, address_id, sub_address) | ||||||
|  | VALUES (:id, :address_id, :sub_address) | ||||||
|  | RETURNING id | ||||||
|  | 
 | ||||||
|  | -- :name update-dwelling! :! :n | ||||||
|  | -- :doc update an existing dwelling record | ||||||
|  | UPDATE dwellings | ||||||
|  | SET address_id = :address_id, | ||||||
|  |   sub_address = :sub_address | ||||||
|  | WHERE id = :id | ||||||
|  | 
 | ||||||
|  | -- :name get-dwelling :? :1 | ||||||
|  | -- :doc retrieve a dwelling given the id. | ||||||
|  | SELECT * FROM dwellings | ||||||
|  | WHERE id = :id | ||||||
|  | 
 | ||||||
|  | -- :name delete-dwelling! :! :n | ||||||
|  | -- :doc delete a dwelling given the id | ||||||
|  | DELETE FROM dwellings | ||||||
|  | WHERE id = :id | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| -- :name create-elector! :! :n | -- :name create-elector! :! :n | ||||||
| -- :doc creates a new elector record | -- :doc creates a new elector record | ||||||
| INSERT INTO electors | INSERT INTO electors | ||||||
| (name, address_id, phone, email) | (name, dwelling_id, phone, email) | ||||||
| VALUES (:name, :address_id, :phone, :email) | VALUES (:name, :dwelling_id, :phone, :email) | ||||||
| RETURNING id | RETURNING id | ||||||
| 
 | 
 | ||||||
| -- :name update-elector! :! :n | -- :name update-elector! :! :n | ||||||
| -- :doc update an existing elector record | -- :doc update an existing elector record | ||||||
| UPDATE electors | UPDATE electors | ||||||
| SET name = :name, address_id = :address_id, phone = :phone, email = :email | SET name = :name, dwelling_id = :dwelling_id, phone = :phone, email = :email | ||||||
| WHERE id = :id | WHERE id = :id | ||||||
| 
 | 
 | ||||||
| -- :name get-elector :? :1 | -- :name get-elector :? :1 | ||||||
|  | @ -254,8 +289,8 @@ WHERE id = :id | ||||||
| -- :name create-visit! :! :n | -- :name create-visit! :! :n | ||||||
| -- :doc creates a new visit record | -- :doc creates a new visit record | ||||||
| INSERT INTO visits | INSERT INTO visits | ||||||
| (address_id, canvasser_id) | (dwelling_id, canvasser_id) | ||||||
| VALUES (:address_id, :canvasser_id) | VALUES (:dwelling_id, :canvasser_id) | ||||||
| RETURNING id | RETURNING id | ||||||
| 
 | 
 | ||||||
| -- visits is audit data; we don't update it. | -- visits is audit data; we don't update it. | ||||||
|  |  | ||||||
|  | @ -14,6 +14,7 @@ | ||||||
|             [youyesyet.canvasser-app.subscriptions] |             [youyesyet.canvasser-app.subscriptions] | ||||||
|             [youyesyet.canvasser-app.ui-utils :as ui] |             [youyesyet.canvasser-app.ui-utils :as ui] | ||||||
|             [youyesyet.canvasser-app.views.about :as about] |             [youyesyet.canvasser-app.views.about :as about] | ||||||
|  |             [youyesyet.canvasser-app.views.building :as building] | ||||||
|             [youyesyet.canvasser-app.views.electors :as electors] |             [youyesyet.canvasser-app.views.electors :as electors] | ||||||
|             [youyesyet.canvasser-app.views.followup :as followup] |             [youyesyet.canvasser-app.views.followup :as followup] | ||||||
|             [youyesyet.canvasser-app.views.issue :as issue] |             [youyesyet.canvasser-app.views.issue :as issue] | ||||||
|  | @ -50,6 +51,9 @@ | ||||||
| (defn about-page [] | (defn about-page [] | ||||||
|   (about/panel)) |   (about/panel)) | ||||||
| 
 | 
 | ||||||
|  | (defn building-page [] | ||||||
|  |   (building/panel)) | ||||||
|  | 
 | ||||||
| (defn electors-page [] | (defn electors-page [] | ||||||
|   (electors/panel)) |   (electors/panel)) | ||||||
| 
 | 
 | ||||||
|  | @ -67,6 +71,7 @@ | ||||||
| 
 | 
 | ||||||
| (def pages | (def pages | ||||||
|   {:about #'about-page |   {:about #'about-page | ||||||
|  |    :building #'building-page | ||||||
|    :electors #'electors-page |    :electors #'electors-page | ||||||
|    :followup #'followup-page |    :followup #'followup-page | ||||||
|    :issues #'issues-page |    :issues #'issues-page | ||||||
|  | @ -105,10 +110,10 @@ | ||||||
| (secretary/defroute "/about" [] | (secretary/defroute "/about" [] | ||||||
|   (rf/dispatch [:set-active-page :about])) |   (rf/dispatch [:set-active-page :about])) | ||||||
| 
 | 
 | ||||||
| (secretary/defroute "/electors" [] | (secretary/defroute "/electors/:dwelling" {dwelling-id :dwelling} | ||||||
|   (rf/dispatch [:set-active-page :electors])) |   (rf/dispatch [:set-dwelling dwelling-id])) | ||||||
| 
 | 
 | ||||||
| (secretary/defroute "/electors/:address" {address-id :address} | (secretary/defroute "/building/:address" {address-id :address} | ||||||
|   (rf/dispatch [:set-address address-id])) |   (rf/dispatch [:set-address address-id])) | ||||||
| 
 | 
 | ||||||
| (secretary/defroute "/followup" [] | (secretary/defroute "/followup" [] | ||||||
|  |  | ||||||
|  | @ -112,7 +112,29 @@ | ||||||
|  (fn [db [_ address-id]] |  (fn [db [_ address-id]] | ||||||
|    (let [id (read-string address-id) |    (let [id (read-string address-id) | ||||||
|          address (first (remove nil? (map #(if (= id (:id %)) %) (:addresses db))))] |          address (first (remove nil? (map #(if (= id (:id %)) %) (:addresses db))))] | ||||||
|      (assoc (clear-messages db) :address address :page :electors)))) |      (if | ||||||
|  |        (= (count (:dwellings address)) 1) | ||||||
|  |        (assoc (clear-messages db) | ||||||
|  |          :address address | ||||||
|  |          :dwelling (first (:dwellings address)) | ||||||
|  |          :page :electors) | ||||||
|  |        (assoc (clear-messages db) | ||||||
|  |          :address address | ||||||
|  |          :dwelling nil | ||||||
|  |          :page :building))))) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | (reg-event-db | ||||||
|  |   :set-dwelling | ||||||
|  |   (fn [db [_ dwelling-id]] | ||||||
|  |     (let [id (read-string dwelling-id) | ||||||
|  |           dwelling (first | ||||||
|  |                      (remove | ||||||
|  |                        nil? | ||||||
|  |                        (map | ||||||
|  |                          #(if (= id (:id %)) %) | ||||||
|  |                          (mapcat :dwellings (:addresses db)))))] | ||||||
|  |       (assoc (clear-messages db) :dwelling dwelling :page :electors)))) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| (reg-event-db | (reg-event-db | ||||||
|  |  | ||||||
|  | @ -33,49 +33,53 @@ | ||||||
| 
 | 
 | ||||||
| (def default-db | (def default-db | ||||||
|   {;;; the currently selected address, if any. |   {;;; the currently selected address, if any. | ||||||
|    :address {:id 1 :address "13 Imaginary Terrace, IM1 3TE" :latitude 55.8253043 :longitude -4.2569057 |     :address {:id 1 :address "13 Imaginary Terrace, IM1 3TE" :latitude 55.8253043 :longitude -4.2569057 | ||||||
|              :electors [{:id 1 :name "Alan Anderson" :gender :male :intention :no} |               :dwellings [{:id 1 | ||||||
|                         {:id 2 :name "Ann Anderson" :gender :female} |                            :electors [{:id 1 :name "Alan Anderson" :gender :male :intention :no} | ||||||
|                         {:id 3 :name "Alex Anderson" :gender :fluid :intention :yes} |                                       {:id 2 :name "Ann Anderson" :gender :female} | ||||||
|                         {:id 4 :name "Andy Anderson" :intention :yes}]} |                                       {:id 3 :name "Alex Anderson" :gender :fluid :intention :yes} | ||||||
|    ;;; a list of the addresses in the current location at which there |                                       {:id 4 :name "Andy Anderson" :intention :yes}]}]} | ||||||
|    ;;; are electors registered. |     ;;; a list of the addresses in the current location at which there | ||||||
|    :addresses [{:id 1 :address "13 Imaginary Terrace, IM1 3TE" :latitude 55.8253043 :longitude -4.2570944 |     ;;; are electors registered. | ||||||
|                 :electors [{:id 1 :name "Alan Anderson" :gender :male :intention :no} |     :addresses [{:id 1 :address "13 Imaginary Terrace, IM1 3TE" :latitude 55.8253043 :longitude -4.2570944 | ||||||
|                            {:id 2 :name "Ann Anderson" :gender :female} |                  :dwellings [{:id 1 | ||||||
|                            {:id 3 :name "Alex Anderson" :gender :fluid :intention :yes} |                               :electors [{:id 1 :name "Alan Anderson" :gender :male :intention :no} | ||||||
|                            {:id 4 :name "Andy Anderson" :intention :yes}]} |                                          {:id 2 :name "Ann Anderson" :gender :female} | ||||||
|                {:id 2 :address "15 Imaginary Terrace, IM1 3TE" :latitude 55.8252354 :longitude -4.2572778 |                                          {:id 3 :name "Alex Anderson" :gender :fluid :intention :yes} | ||||||
|                 :electors [{:id 1 :name "Beryl Brown" :gender :female} |                                          {:id 4 :name "Andy Anderson" :intention :yes}]}]} | ||||||
|                            {:id 2 :name "Betty Black" :gender :female}]} |                 {:id 2  :address "15 Imaginary Terrace, IM1 3TE" :latitude 55.8252354 :longitude -4.2572778 | ||||||
|                {:id 3 :address "17 Imaginary Terrace, IM1 3TE" :latitude 55.825166 :longitude -4.257026 |                  :dwellings [{:id 2 | ||||||
|                 :electors [{:id 1 :name "Catriona Crathie" :gender :female :intention :yes} |                               :electors [{:id 1 :name "Beryl Brown" :gender :female} | ||||||
|                            {:id 2 :name "Colin Caruthers" :gender :male :intention :yes} |                                          {:id 2 :name "Betty Black" :gender :female}]}]} | ||||||
|                            {:id 3 :name "Calum Crathie" :intention :yes}]} | 
 | ||||||
|                {:id 4 :address "19 Imaginary Terrace, IM1 3TE" :latitude 55.82506950000001 :longitude -4.2570239 |                 {:id 3 :address "17 Imaginary Terrace, IM1 3TE" :latitude 55.825166 :longitude -4.257026 | ||||||
|                 :electors [{:id 1 :name "David Dewar" :gender :male :intention :no}]}] |                  :dwellings [{:id 3 :sub-address "Flat 1" | ||||||
|    ;;; electors at the currently selected address |                               :electors [{:id 1 :name "Catriona Crathie" :gender :female :intention :yes} | ||||||
|    :electors [{:id 1 :name "Alan Anderson" :gender :male :intention :no} |                                          {:id 2 :name "Colin Caruthers" :gender :male :intention :yes} | ||||||
|               {:id 2 :name "Ann Anderson" :gender :female} |                                          {:id 3 :name "Calum Crathie" :intention :yes}]} | ||||||
|               {:id 3 :name "Alex Anderson" :gender :fluid :intention :yes} |                              {:id 4 :sub-address "Flat 2" | ||||||
|               {:id 4 :name "Andy Anderson" :intention :yes}] |                               :electors [{:id 1 :name "David Dewar" :gender :male :intention :no}]}]}] | ||||||
|    ;;; any error to display |     ;;; electors at the currently selected dwelling | ||||||
|    :error nil |     :electors [{:id 1 :name "Alan Anderson" :gender :male :intention :no} | ||||||
|    ;;; the issue from among the issues which is currently selected. |                {:id 2 :name "Ann Anderson" :gender :female} | ||||||
|    ;;; any confirmation message to display |                {:id 3 :name "Alex Anderson" :gender :fluid :intention :yes} | ||||||
|    :feedback nil |                {:id 4 :name "Andy Anderson" :intention :yes}] | ||||||
|    ;;; the currently selected issue |     ;;; any error to display | ||||||
|    :issue "Currency" |     :error nil | ||||||
|    ;;; the issues selected for the issues page on this day. |     ;;; the issue from among the issues which is currently selected. | ||||||
|    :issues {"Currency" "Scotland could keep the Pound, or use the Euro. But we could also set up a new currency of our own. Yada yada yada" |     ;;; any confirmation message to display | ||||||
|             "Monarchy" "Scotland could keep the Queen. This is an issue to be decided after independence. Yada yada yada" |     :feedback nil | ||||||
|             "Defence" "Scotland will not have nuclear weapons, and will probably not choose to engage in far-off wars. But we could remain members of NATO"} |     ;;; the currently selected issue | ||||||
|    ;;; message of the day |     :issue "Currency" | ||||||
|    :motd "This is a test version only. There is no real data." |     ;;; the issues selected for the issues page on this day. | ||||||
|    ;;; the options from among which electors can select. |     :issues {"Currency" "Scotland could keep the Pound, or use the Euro. But we could also set up a new currency of our own. Yada yada yada" | ||||||
|    :options [{:id :yes :description "Yes"} {:id :no :description "No"}] |              "Monarchy" "Scotland could keep the Queen. This is an issue to be decided after independence. Yada yada yada" | ||||||
|    ;;; the queue of items waiting to be transmitted. |              "Defence" "Scotland will not have nuclear weapons, and will probably not choose to engage in far-off wars. But we could remain members of NATO"} | ||||||
|    :outqueue () |     ;;; message of the day | ||||||
|    ;;; the currently displayed page within the app. |     :motd "This is a test version only. There is no real data." | ||||||
|    :page :home |     ;;; the options from among which electors can select. | ||||||
|    }) |     :options [{:id :yes :description "Yes"} {:id :no :description "No"}] | ||||||
|  |     ;;; the queue of items waiting to be transmitted. | ||||||
|  |     :outqueue () | ||||||
|  |     ;;; the currently displayed page within the app. | ||||||
|  |     :page :home}) | ||||||
|  |  | ||||||
|  | @ -46,6 +46,11 @@ | ||||||
|  (fn [db _] |  (fn [db _] | ||||||
|    (:changes db))) |    (:changes db))) | ||||||
| 
 | 
 | ||||||
|  | (reg-sub | ||||||
|  |   :dwelling | ||||||
|  |   (fn [db _] | ||||||
|  |     (:dwelling db))) | ||||||
|  | 
 | ||||||
| (reg-sub | (reg-sub | ||||||
|   :elector |   :elector | ||||||
|   (fn [db _] |   (fn [db _] | ||||||
|  |  | ||||||
|  | @ -1,7 +1,8 @@ | ||||||
| (ns ^{:doc "Canvasser app households in building panel." | (ns ^{:doc "Canvasser app households in building panel." | ||||||
|       :author "Simon Brooke"} |       :author "Simon Brooke"} | ||||||
|   youyesyet.canvasser-app.views.building |   youyesyet.canvasser-app.views.building | ||||||
|   (:require [re-frame.core :refer [reg-sub]])) |   (:require [re-frame.core :refer [reg-sub subscribe]] | ||||||
|  |             [youyesyet.canvasser-app.ui-utils :as ui])) | ||||||
| 
 | 
 | ||||||
| ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||||||
| ;;;; | ;;;; | ||||||
|  | @ -30,10 +31,22 @@ | ||||||
| ;;; The pattern from the re-com demo (https://github.com/Day8/re-com) is to have | ;;; 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' | ;;; 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. | ;;; whose output is an enlive-style specification of the view to be redered. | ||||||
| ;;; I propose to follow this pattern. This file will (eventually) provide the building view. | ;;; I propose to follow this pattern. This file will provide the building view. | ||||||
| 
 |  | ||||||
| 
 | 
 | ||||||
| (defn panel | (defn panel | ||||||
|   "Generate the building panel." |   "Generate the building panel." | ||||||
|   [] |   [] | ||||||
|   []) |   (let [address @(subscribe [:address]) | ||||||
|  |         dwellings (:dwellings address)] | ||||||
|  |     [:div | ||||||
|  |      [:h1 (str "Flats at " (:address address))] | ||||||
|  |      [:div.container {:id "main-container"} | ||||||
|  |       (ui/back-link) | ||||||
|  |       [:div {:id "dwelling-list"} | ||||||
|  |        (map | ||||||
|  |          (fn | ||||||
|  |            [dwelling] | ||||||
|  |            (ui/big-link | ||||||
|  |              (:sub-address dwelling) | ||||||
|  |              (str "#/electors/" (:id dwelling))) ) | ||||||
|  |          (:dwellings address))]]])) | ||||||
|  |  | ||||||
|  | @ -32,7 +32,7 @@ | ||||||
| ;;; The pattern from the re-com demo (https://github.com/Day8/re-com) is to have | ;;; 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' | ;;; 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. | ;;; whose output is an enlive-style specification of the view to be redered. | ||||||
| ;;; I propose to follow this pattern. This file will (eventually) provide the electors view. | ;;; I propose to follow this pattern. This file will provide the electors view. | ||||||
| 
 | 
 | ||||||
| ;;; See https://github.com/simon-brooke/youyesyet/blob/master/doc/specification/userspec.md#electors-view | ;;; See https://github.com/simon-brooke/youyesyet/blob/master/doc/specification/userspec.md#electors-view | ||||||
| 
 | 
 | ||||||
|  | @ -107,14 +107,16 @@ | ||||||
| (defn panel | (defn panel | ||||||
|   "Generate the electors panel." |   "Generate the electors panel." | ||||||
|   [] |   [] | ||||||
|   (let [address @(subscribe [:address]) |   (let [dwelling @(subscribe [:dwelling]) | ||||||
|         addresses @(subscribe [:addresses]) |         address @(subscribe [:address]) | ||||||
|         electors (sort-by :id (:electors address)) |         sub-address (:sub-address dwelling) | ||||||
|         options @(subscribe [:options]) |         electors (sort-by :id (:electors dwelling)) | ||||||
|         changes @(subscribe [:changes])] |         options @(subscribe [:options])] | ||||||
|     (if address |     (if address | ||||||
|       [:div |       [:div | ||||||
|        [:h1 (:address address)] |        [:h1 (if sub-address | ||||||
|  |               (str sub-address ", " (:address address)) | ||||||
|  |               (:address address))] | ||||||
|        [:div.container {:id "main-container"} |        [:div.container {:id "main-container"} | ||||||
|         [:table |         [:table | ||||||
|          [:tbody |          [:tbody | ||||||
|  |  | ||||||
|  | @ -31,7 +31,7 @@ | ||||||
| ;;; The pattern from the re-com demo (https://github.com/Day8/re-com) is to have | ;;; 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' | ;;; 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. | ;;; whose output is an enlive-style specification of the view to be redered. | ||||||
| ;;; I propose to follow this pattern. This file will (eventually) provide the issues view. | ;;; I propose to follow this pattern. This file will provide the issues view. | ||||||
| 
 | 
 | ||||||
| ;;; See https://github.com/simon-brooke/youyesyet/blob/master/doc/specification/userspec.md#issues-view | ;;; See https://github.com/simon-brooke/youyesyet/blob/master/doc/specification/userspec.md#issues-view | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -57,7 +57,14 @@ | ||||||
| (defn pin-image | (defn pin-image | ||||||
|   "select the name of a suitable pin image for this address" |   "select the name of a suitable pin image for this address" | ||||||
|   [address] |   [address] | ||||||
|   (let [intentions (set (remove nil? (map #(:intention %) (:electors address))))] |   (let [intentions | ||||||
|  |         (set | ||||||
|  |           (remove | ||||||
|  |             nil? | ||||||
|  |             (map | ||||||
|  |               #(:intention %) | ||||||
|  |               (map :electors | ||||||
|  |                    (:dwellings address)))))] | ||||||
|     (case (count intentions) |     (case (count intentions) | ||||||
|       0 "unknown-pin" |       0 "unknown-pin" | ||||||
|       1 (str (name (first intentions)) "-pin") |       1 (str (name (first intentions)) "-pin") | ||||||
|  | @ -70,7 +77,7 @@ | ||||||
|   so back links work." |   so back links work." | ||||||
|   [id] |   [id] | ||||||
|   (js/console.log (str "Click handler for address #" id)) |   (js/console.log (str "Click handler for address #" id)) | ||||||
|   (set! window.location.href (str "#electors/" id))) |   (set! window.location.href (str "#building/" id))) | ||||||
| ;; This way is probably more idiomatic React, but history doesn't work: | ;; This way is probably more idiomatic React, but history doesn't work: | ||||||
| ;; (defn map-pin-click-handler | ;; (defn map-pin-click-handler | ||||||
| ;;  [id] | ;;  [id] | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue