(ns auto-ap.views.pages.payments (:require [re-frame.core :as re-frame] [auto-ap.entities.clients :as client] [auto-ap.entities.vendors :as vendor] [reagent.core :as reagent] [goog.string :as gstring] [clojure.spec.alpha :as s] [vimsical.re-frame.cofx.inject :as inject] [auto-ap.views.components.sorter :refer [sorted-column]] [auto-ap.views.components.date-range-filter :refer [date-range-filter]] [auto-ap.views.components.layouts :refer [side-bar-layout]] [auto-ap.views.components.typeahead :refer [typeahead]] [auto-ap.views.components.paginator :refer [paginator]] [auto-ap.views.components.sort-by-list :refer [sort-by-list]] [auto-ap.events :as events] [auto-ap.views.utils :refer [dispatch-event date->str bind-field nf with-user]] [auto-ap.utils :refer [by]] [auto-ap.views.pages.payments.side-bar :as side-bar] [auto-ap.views.pages.payments.table :as table] [auto-ap.views.pages.check :as check] [auto-ap.subs :as subs])) (re-frame/reg-sub ::payment-page (fn [db] (-> db ::payment-page))) (re-frame/reg-sub ::last-params (fn [db] (-> db ::last-params))) (re-frame/reg-sub ::params :<- [::last-params] :<- [::subs/client] :<- [::side-bar/filter-params] :<- [::table/table-params] (fn [[last-params client filter-params table-params]] (let [params (cond-> {} client (assoc :client-id (:id client)) (seq filter-params) (merge filter-params) (seq table-params) (merge table-params))] (when (not= last-params params) (re-frame/dispatch [::params-change])) params))) (re-frame/reg-event-fx ::params-change [with-user (re-frame/inject-cofx ::inject/sub [::params])] (fn [{:keys [user db ::params]}[_ ]] (when (not= (::last-params db) params) {:db (-> db (assoc-in [:status :loading] true) (assoc-in [::last-params] params)) :graphql {:token user :query-obj {:venia/queries [[:payment_page params [[:payments [:id :status :amount :type :check_number :s3_url [:bank-account [:name]] :date [:vendor [:name :id]] [:client [:name :id]]]] :total :start :end]]]} :on-success [::received] :on-error [::events/page-failed]} :set-uri-params (dissoc params :client-id)}))) (re-frame/reg-event-fx ::void-check (fn [{:keys [db]} [_ payment]] {:graphql {:token (-> db :user) :query-obj {:venia/operation {:operation/type :mutation :operation/name "VoidPayment"} :venia/queries [{:query/data [:void-payment {:payment-id (:id payment)} [:id :status [:bank-account [:name]] :amount :check_number :s3_url :date [:vendor [:name :id]] [:client [:name :id]]]]}]} :on-success [::payment-voided]}})) (re-frame/reg-event-db ::payment-voided (fn [db [_ {:keys [void-payment]}]] (-> db (update-in [::payment-page :payments] (fn [payments] (mapv (fn [c] (if (= (:id c) (:id void-payment)) (assoc void-payment :class "live-removed") c)) payments)))))) (re-frame/reg-event-db ::received (fn [db [_ data]] (-> db (update ::payment-page merge (first (:payment-page data))) (assoc-in [:status :loading] false)))) (re-frame/reg-event-fx ::unmounted (fn [{:keys [db]} _] {:db (dissoc db ::last-params ::table/table-params ::side-bar/filters ::payment-page)})) (defn content [] (let [params @(re-frame/subscribe [::params])] [:div [:h1.title "Payments"] [table/table {:id :payments :payment-page (re-frame/subscribe [::payment-page]) :status (re-frame/subscribe [::subs/status]) :void-event [::void-check]}]])) (defn payments-page [] (reagent/create-class {:display-name "payments-page" :component-will-unmount #(re-frame/dispatch [::unmounted]) :reagent-render (fn [] [side-bar-layout {:side-bar [side-bar/side-bar] :main [content]}])}))