about summary refs log tree commit diff
path: root/users/grfn/bbbg/src/bbbg/handlers/events.clj
diff options
context:
space:
mode:
Diffstat (limited to 'users/grfn/bbbg/src/bbbg/handlers/events.clj')
-rw-r--r--users/grfn/bbbg/src/bbbg/handlers/events.clj121
1 files changed, 82 insertions, 39 deletions
diff --git a/users/grfn/bbbg/src/bbbg/handlers/events.clj b/users/grfn/bbbg/src/bbbg/handlers/events.clj
index 6fe5b8727b..ff34d7f9e6 100644
--- a/users/grfn/bbbg/src/bbbg/handlers/events.clj
+++ b/users/grfn/bbbg/src/bbbg/handlers/events.clj
@@ -3,26 +3,64 @@
    [bbbg.db :as db]
    [bbbg.db.event :as db.event]
    [bbbg.event :as event]
-   [bbbg.handlers.core :refer [authenticated? page-response]]
+   [bbbg.handlers.core :refer [*authenticated?* page-response]]
    [bbbg.meetup.import :refer [import-attendees!]]
-   [bbbg.util.display :refer [format-date]]
+   [bbbg.util.display :refer [format-date pluralize]]
    [bbbg.util.time :as t]
    [bbbg.views.flash :as flash]
    [compojure.coercions :refer [as-uuid]]
    [compojure.core :refer [context GET POST]]
    [java-time :refer [local-date]]
-   [ring.util.response :refer [not-found redirect]]))
+   [ring.util.response :refer [not-found redirect]])
+  (:import
+   java.time.format.FormatStyle))
 
-(defn events-index [{:keys [events authenticated?]}]
-  [:div
-   (when authenticated?
-     [:a {:href "/events/new"}
+(defn- num-attendees [event]
+  (str
+   (:num-attendees event)
+   (if (= (t/->LocalDate (::event/date event))
+          (local-date))
+     " Signed In"
+     (str " Attendee" (when-not (= 1 (:num-attendees event)) "s")))))
+
+(def index-type->label
+  {:upcoming "Upcoming"
+   :past "Past"})
+(def other-index-type
+  {:upcoming :past
+   :past :upcoming})
+
+(defn events-index
+  [{:keys [events num-events type]}]
+  [:div.page
+   [:div.page-header
+    [:h1
+     (pluralize
+      num-events
+      (str (index-type->label type) " Event"))]
+    [:a {:href (str "/events"
+                    (when (= :upcoming type)
+                      "/past"))}
+     "View "
+     (index-type->label (other-index-type type))
+     " Events"]]
+   (when *authenticated?*
+     [:a.button {:href "/events/new"}
       "Create New Event"])
    [:ul.events-list
-    (for [event events]
+    (for [event (sort-by
+                 ::event/date
+                 (comp - compare)
+                 events)]
       [:li
-       [:a {:href (str "/events/" (::event/id event))}
-        (format-date (::event/date event))]])]])
+       [:p
+        [:a {:href (str "/events/" (::event/id event))}
+         (format-date (::event/date event)
+                      FormatStyle/FULL)]]
+       [:p
+        (pluralize (:num-rsvps event) "RSVP")
+        ", "
+        (num-attendees event)]])]])
 
 (defn- import-attendee-list-form-group []
   [:div.form-group
@@ -41,19 +79,15 @@
              :value "Import"}]]])
 
 (defn event-page [{:keys [event]}]
-  [:div.event-page
-   [:h1 (format-date (::event/date event))]
-   [:div.stats
-    [:p (:num-rsvps event) " RSVP"
-     (when-not (= 1 (:num-rsvps event)) "s")]
-    [:p (:num-attendees event)
-     (if (= (t/->LocalDate (::event/date event))
-            (local-date))
-       " Signed In"
-       (str " Attendee" (when-not (= 1 (:num-attendees event)) "s")))]]
-   [:div
+  [:div.page
+   [:div.page-header
+    [:h1 (format-date (::event/date event)
+                      FormatStyle/FULL)]
     [:a {:href (str "/signup-forms/" (::event/id event) )}
      "Go to Signup Form"]]
+   [:div.stats
+    [:p (pluralize (:num-rsvps event) "RSVP")]
+    [:p (num-attendees event)]]
    [:div
     (import-attendees-form event)]])
 
@@ -65,27 +99,36 @@
 (defn event-form
   ([] (event-form {}))
   ([event]
-   [:form {:method "POST"
-           :action "/events"
-           :enctype "multipart/form-data"}
-    [:div.form-group
-     [:label "Date"
-      [:input {:type "date"
-               :id "date"
-               :name "date"
-               :value (str (::event/date event))}]]]
-    (import-attendee-list-form-group)
-    [:div.form-group
-     [:input {:type "submit"
-              :value "Create Event"}]]]))
+   [:div.page
+    [:form {:method "POST"
+            :action "/events"
+            :enctype "multipart/form-data"}
+     [:div.form-group
+      [:label "Date"
+       [:input {:type "date"
+                :id "date"
+                :name "date"
+                :value (str (::event/date event))}]]]
+     (import-attendee-list-form-group)
+     [:div.form-group
+      [:input {:type "submit"
+               :value "Create Event"}]]]]))
+
+(defn- events-list-handler [db query type]
+  (let [events (db/list db (db.event/with-stats query))
+        num-events (db/count db query)]
+    (page-response
+     (events-index {:events events
+                    :num-events num-events
+                    :type type}))))
 
 (defn events-routes [{:keys [db]}]
   (context "/events" []
-    (GET "/" request
-      (let [events (db/list db :event)]
-        (page-response
-         (events-index {:events events
-                        :authenticated? (authenticated? request)}))))
+    (GET "/" []
+      (events-list-handler db (db.event/upcoming) :upcoming))
+
+    (GET "/past" []
+      (events-list-handler db (db.event/past) :past))
 
     (GET "/new" [date]
       (page-response