can edit.

This commit is contained in:
Bryce Covert
2018-04-14 09:46:36 -07:00
parent b6b7b1932a
commit 5ab67c5887
3 changed files with 139 additions and 27 deletions

View File

@@ -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)]

View File

@@ -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)))

View File

@@ -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 []