(ns auto-ap.views.pages.transactions (:require [auto-ap.events :as events] [auto-ap.forms :as forms] [auto-ap.subs :as subs] [auto-ap.views.components.bank-account-filter :refer [bank-account-filter]] [auto-ap.views.components.layouts :refer [appearing-side-bar side-bar-layout]] [auto-ap.views.components.modal :refer [action-modal]] [auto-ap.views.components.paginator :refer [paginator]] [auto-ap.views.components.sorter :refer [sorted-column]] [auto-ap.views.pages.transactions.form :as edit] [auto-ap.views.pages.transactions.table :as table] [auto-ap.views.pages.transactions.common :refer [transaction-read]] [auto-ap.utils :refer [replace-by]] [auto-ap.views.pages.transactions.manual :as manual] [auto-ap.views.utils :refer [bind-field date->str dispatch-event nf]] [goog.string :as gstring] [re-frame.core :as re-frame])) (re-frame/reg-event-db ::edit-completed (fn [db [_ edit-transaction]] (-> db (update-in [::transaction-page :transactions] replace-by :id (assoc edit-transaction :class "live-added"))))) (re-frame/reg-event-fx ::manual-import-completed (fn [{:keys [db]} [_ {:keys [imported errors]}]] {:dispatch [::params-change {}] :db (-> db (assoc-in [::notification :message] (str "Successfully imported " imported " transactions")) (assoc-in [::notification :errors] errors))})) (re-frame/reg-sub ::transaction-page (fn [db] (-> db ::transaction-page))) (re-frame/reg-sub ::params (fn [db] (-> db (::params {})))) (re-frame/reg-event-fx ::params-change (fn [cofx [_ params]] {:db (-> (:db cofx) (assoc-in [:status :loading] true) (assoc-in [::params] params)) :graphql {:token (-> cofx :db :user) :query-obj {:venia/queries [[:transaction_page (assoc params :client-id (:id @(re-frame/subscribe [::subs/client]))) [[:transactions transaction-read] :total :start :end]]]} :on-success [::received]}})) (re-frame/reg-event-db ::received (fn [db [_ data]] (-> db (assoc ::transaction-page (first (:transaction-page data))) (assoc-in [:status :loading] false)))) (re-frame/reg-event-db ::change-selected-bank-account (fn [db [_ key value]] (let [[key] key updated (assoc-in db [::transaction-page :bank-account-filter key] value)] (if (and (= key :id) (not= value (get-in db [::params :bank-account-id]))) (do (re-frame/dispatch [::params-change (assoc (::params updated) :bank-account-id value)]) (assoc-in updated [::params :bank-account-id] value)) updated)))) (re-frame/reg-sub ::notification (fn [db] (-> db ::notification))) (def transactions-content (with-meta (fn [] (let [notification (re-frame/subscribe [::notification]) current-client @(re-frame/subscribe [::subs/client]) user @(re-frame/subscribe [::subs/user])] [:div [:h1.title "Transactions"] (when (= "admin" (:user/role user)) (list (when (:message @notification) (list [:div.notification (:message @notification)] (when (seq (:errors @notification)) [:div.notification.is-danger [:h3 (count (:errors @notification)) " errors:"] [:ul (for [transaction (:errors @notification) error (:errors transaction)] [:li (:description-original transaction) "-" (:details error)])]]))) [:div.is-pulled-right [:div.buttons (comment [:button.button.is-danger {:on-click (dispatch-event [::manual/opening])} "Manage Rules"]) [:button.button.is-danger {:on-click (dispatch-event [::manual/opening])} "Manual Yodlee Import"]]])) [table/table {:id :transactions :params (re-frame/subscribe [::params]) :transaction-page (re-frame/subscribe [::transaction-page]) :status (re-frame/subscribe [::subs/status]) :on-params-change (fn [params] (re-frame/dispatch [::params-change params]))}] [manual/modal {:import-completed [::manual-import-completed ]}]])) {:component-will-mount #(re-frame/dispatch-sync [::params-change {}]) })) (defn transactions-page [] (let [{transaction-bar-active? :active?} @(re-frame/subscribe [::forms/form ::edit/edit-transaction])] [side-bar-layout {:side-bar [:div [:p.menu-label "Bank Account"] [:div [bank-account-filter {:on-change-event [::change-selected-bank-account] :value (:bank-acount-filter @(re-frame/subscribe [::transaction-page])) :bank-accounts @(re-frame/subscribe [::subs/bank-accounts])}]]] :main [transactions-content] :right-side-bar [appearing-side-bar {:visible? transaction-bar-active?} [edit/form {:edit-completed [::edit-completed]}]]}]))