From 5ab67c588737a344bc1c1d77fe798ac0ba438ef3 Mon Sep 17 00:00:00 2001 From: Bryce Covert Date: Sat, 14 Apr 2018 09:46:36 -0700 Subject: [PATCH] can edit. --- src/clj/auto_ap/db/reminders.clj | 25 ++-- src/clj/auto_ap/routes/reminders.clj | 20 ++- .../auto_ap/views/pages/admin/reminders.cljs | 121 ++++++++++++++++-- 3 files changed, 139 insertions(+), 27 deletions(-) diff --git a/src/clj/auto_ap/db/reminders.clj b/src/clj/auto_ap/db/reminders.clj index 313b4928..6cf9b8e8 100644 --- a/src/clj/auto_ap/db/reminders.clj +++ b/src/clj/auto_ap/db/reminders.clj @@ -1,5 +1,5 @@ (ns auto-ap.db.reminders - (:require [auto-ap.db.utils :refer [clj->db db->clj get-conn query]] + (:require [auto-ap.db.utils :refer [clj->db db->clj get-conn query execute!]] [clj-time.core :as time] [amazonica.aws.simpleemail :as ses] [clojure.java.jdbc :as j] @@ -9,6 +9,8 @@ [honeysql.core :as sql] [honeysql.helpers :as helpers])) +(def all-keys #{:id :vendor-id :email :body :subject :sent :scheduled}) + (defn insert [row] (db->clj (first (j/insert! (get-conn) :reminders @@ -17,12 +19,19 @@ (def base-query (sql/build :select :reminders.* :from :reminders)) -(defn get-all [] - (map db->clj (j/query (get-conn) - (str - " SELECT reminders.*, vendors.name as vendor_name " - " FROM reminders INNER join vendors on reminders.vendor_id = vendors.id " - " ORDER BY sent DESC, scheduled DESC")))) +(defn get-by-id [id] + (query (-> base-query + (helpers/merge-where [:= :id id])))) + +(defn update! [id data] + (println data) + (-> (sql/build + :update :reminders + :set (select-keys data all-keys ) + :where [:= :id id]) + execute!) + (get-by-id id)) + (defn delete-all [] (j/delete! (get-conn) :reminders [])) @@ -48,7 +57,7 @@ (defn finish [id] (j/update! (get-conn) :reminders {:sent (time/now)} ["id = ?" id] )) -(def all-keys #{:id :vendor-id :email :body :subject :sent :scheduled}) + (defn add-sort-by [q sort-by asc] (let [sort-by-key (keyword sort-by)] diff --git a/src/clj/auto_ap/routes/reminders.clj b/src/clj/auto_ap/routes/reminders.clj index 5788b87c..5e6ae69b 100644 --- a/src/clj/auto_ap/routes/reminders.clj +++ b/src/clj/auto_ap/routes/reminders.clj @@ -10,7 +10,7 @@ [clj-time.periodic :as p] [clj-time.predicates :as pred] [clojure.data.json :as json] - [compojure.core :refer [GET POST context defroutes + [compojure.core :refer [GET PUT POST context defroutes wrap-routes]]) (:import (org.joda.time DateTime))) @@ -52,6 +52,7 @@ (defroutes routes (context "/reminders" [] + (POST "/send" {:keys [query-params headers body] :as x} (let [notification-type (get headers "x-amz-sns-message-type")] (println "Received notification " notification-type) @@ -70,9 +71,14 @@ {:status 200 :body "{}" :headers {"Content-Type" "application/edn"}}) - - (wrap-routes (GET "/" {:keys [query-params]} - {:status 200 - :body (pr-str (map replace-joda (reminders/get-all))) - :headers {"Content-Type" "application/edn"}}) - wrap-secure))) + (wrap-routes + (PUT "/:id" {:keys [ edn-params] {:keys [id] } :route-params} + (let [id (if (int? id) + id + (Integer/parseInt id))] + (assert (not (:sent (reminders/get-by-id id)))) + (reminders/update! id edn-params) + {:status 200 + :body "{}" + :headers {"Content-Type" "application/edn"}})) + wrap-secure))) diff --git a/src/cljs/auto_ap/views/pages/admin/reminders.cljs b/src/cljs/auto_ap/views/pages/admin/reminders.cljs index 5fa80c02..abbfd966 100644 --- a/src/cljs/auto_ap/views/pages/admin/reminders.cljs +++ b/src/cljs/auto_ap/views/pages/admin/reminders.cljs @@ -3,14 +3,18 @@ (:require [re-frame.core :as re-frame] [auto-ap.views.components.paginator :refer [paginator]] [auto-ap.views.components.sorter :refer [sorted-column]] + [auto-ap.entities.vendors :as entity] [reagent.core :as reagent] [auto-ap.subs :as subs] - [auto-ap.events.admin.reminders :as events] - [auto-ap.views.utils :refer [login-url dispatch-value-change dispatch-event date-time->str date->str]] + [auto-ap.views.utils :refer [login-url dispatch-value-change dispatch-event date-time->str date->str horizontal-field bind-field]] [cljs.reader :as edn] [auto-ap.routes :as routes] [bidi.bidi :as bidi])) +(re-frame/reg-sub + ::editing-reminder + (fn [db] + (::editing-reminder db))) (re-frame/reg-sub ::reminder-page @@ -22,6 +26,16 @@ (fn [db] (::reminder-params db))) +(re-frame/reg-event-db + ::edit + (fn [db [_ which]] + (assoc db ::editing-reminder which))) + +(re-frame/reg-event-db + ::change + (fn [db [_ field v]] + (assoc-in db (into [::editing-reminder] field) v))) + (re-frame/reg-event-fx ::mounted (fn [{:keys [db]} _] @@ -34,6 +48,29 @@ {:db (update db ::reminder-params merge params) :dispatch [::invalidated]})) +(re-frame/reg-event-fx + ::save + (fn [{:keys [db]}] + (let [edited-reminder (::editing-reminder db)] + (println edited-reminder) + {:http {:token (:user db) + :method :put + :body (pr-str (dissoc edited-reminder :sent :scheduled)) + :headers {"Content-Type" "application/edn"} + :uri (str "/api/reminders/" (:id edited-reminder)) + :on-success [::save-complete] + :on-error [::save-error]}}))) + +(re-frame/reg-event-fx + ::save-complete + (fn [{:keys [db]}] + {:dispatch [::edit nil]})) + +(re-frame/reg-event-fx + ::save-error + (fn [{:keys [db]}] + {:dispatch [::change [:error] true]})) + (re-frame/reg-event-fx ::invalidated (fn [{:keys [db]}] @@ -54,14 +91,70 @@ (fn [db [_ reminders]] (assoc db ::reminder-page (first (:reminder-page reminders))))) +(defn edit-dialog [] + (let [editing-reminder @(re-frame/subscribe [::editing-reminder])] + [:div.modal.is-active + [:div.modal-background {:on-click (fn [] (re-frame/dispatch [::edit nil]))}] + + [:div.modal-card + [:header.modal-card-head + [:p.modal-card-title + (str "Reminder for " (:name (:vendor editing-reminder)))] + (when (:error editing-reminder) + [:span.icon.has-text-danger + [:i.fa.fa-exclamation-triangle]]) + [:button.delete {:on-click (fn [] (re-frame/dispatch [::edit nil]))}]] + [:section.modal-card-body + [horizontal-field + [:label.label "Email"] + [:div.control + [bind-field + [:input.input {:type "text" + :field :email + :event ::change + :subscription editing-reminder}]]]] + [horizontal-field + [:label.label "Subject"] + [:div.control + [bind-field + [:input.input {:type "text" + :field :subject + :event ::change + :subscription editing-reminder}]]]] + + [horizontal-field + [:label.label "Body"] + [:div.control + + [bind-field + [:textarea.textarea.is-expanded {:type "text" + :field :body + :event ::change + :subscription editing-reminder}]]]] + + (when (:saving? editing-reminder) [:div.is-overlay {:style {"backgroundColor" "rgba(150,150,150, 0.5)"}}])] + + [:footer.modal-card-foot + [:button.button.is-primary {:on-click (fn [] (re-frame/dispatch [::save])) + #_#_:disabled (when (not (s/valid? ::entity/vendor editing-reminder )) + "disabled")} + [:span "Save"] + (when (:saving? editing-reminder) + [:span.icon + [:i.fa.fa-spin.fa-spinner]])]]]])) + (defn reminders-table [] (let [{:keys [reminders start end total count]} @(re-frame/subscribe [::reminder-page]) {:keys [sort-by asc]} @(re-frame/subscribe [::reminder-params]) reminders (or reminders [])] [:div [:div.is-pulled-right - [paginator {:start start :end end :total total :count count :on-change (fn [params] - (re-frame/dispatch [::params-changed params]))}]] + [paginator {:start start + :end end + :total total + :count count + :on-change (fn [params] + (re-frame/dispatch [::params-changed params]))}]] [:table {:class "table", :style {:width "100%"}} [:thead [:tr @@ -71,19 +164,23 @@ ["email" "Email"]]] ^{:key name} [sorted-column {:on-sort (fn [params] (re-frame/dispatch [::params-changed params])) - :style {:width "20%" :cursor "pointer"} - :sort-key sort-key - :sort-by sort-by - :asc asc} - name])]] - [:tbody (for [{:keys [id vendor scheduled sent email ]} reminders] + :style {:width "20%" :cursor "pointer"} + :sort-key sort-key + :sort-by sort-by + :asc asc} + name])]] + [:tbody (for [{:keys [id vendor scheduled sent email ] :as r} reminders] ^{:key id} - [:tr + [:tr (when-not sent + {:on-click (fn [] (re-frame/dispatch [::edit r])) :style {:cursor "pointer"}}) [:td (:name vendor)] [:td (date->str scheduled)] [:td (when sent [:span [:span.icon [:i.fa.fa-check]] "Sent " (date-time->str sent)]) ] - [:td email]])]]])) + [:td email]])]] + + (when @(re-frame/subscribe [::editing-reminder]) + [edit-dialog])])) (defn admin-reminders-page []