162 lines
6.3 KiB
Clojure
162 lines
6.3 KiB
Clojure
(ns auto-ap.views.pages.admin.rules.table
|
|
(:require [auto-ap.subs :as subs]
|
|
[auto-ap.views.utils :refer [dispatch-event ->$ with-user action-cell-width]]
|
|
[auto-ap.views.pages.admin.rules.form :as form]
|
|
[auto-ap.views.components.paginator :refer [paginator]]
|
|
[auto-ap.views.components.sort-by-list :refer [sort-by-list]]
|
|
[auto-ap.views.pages.admin.rules.results-modal :as results-modal]
|
|
[auto-ap.views.components.sorter :refer [sorted-column toggle-sort-by sort-icon]]
|
|
[auto-ap.views.components.buttons :as buttons]
|
|
[auto-ap.views.components.grid :as grid]
|
|
[auto-ap.events :as events]
|
|
[auto-ap.status :as status]
|
|
[re-frame.core :as re-frame]
|
|
[reagent.core :as reagent]
|
|
[reagent.core :as r]
|
|
[auto-ap.views.components.modal :as modal]
|
|
[auto-ap.views.pages.data-page :as data-page]))
|
|
|
|
(re-frame/reg-event-fx
|
|
::run-clicked
|
|
[with-user]
|
|
(fn [{:keys [user db]} [_ which]]
|
|
{:graphql
|
|
{:token user
|
|
:owns-state {:multi ::run
|
|
:which (:id which)}
|
|
:query-obj {:venia/operation {:operation/type :query
|
|
:operation/name "RunTransactionRule"}
|
|
:venia/queries [{:query/data [:run-transaction-rule
|
|
{:transaction-rule-id (:id which)}
|
|
[:id
|
|
:date
|
|
:amount
|
|
[:client [:name]]
|
|
[:bank-account [:name]]
|
|
:description-original]]}]}
|
|
:on-success [::succeeded-run (:id which)]}}))
|
|
|
|
|
|
(re-frame/reg-event-fx
|
|
::succeeded-run
|
|
(fn [{:keys [db]} [_ transaction-rule-id result]]
|
|
{:dispatch [::results-modal/opening (:run-transaction-rule result) transaction-rule-id true]}))
|
|
|
|
(re-frame/reg-sub
|
|
::specific-table-params
|
|
(fn [db]
|
|
(::table-params db)))
|
|
|
|
(re-frame/reg-event-db
|
|
::unmounted
|
|
(fn [db]
|
|
(status/reset-multi db ::run)))
|
|
|
|
(re-frame/reg-sub
|
|
::table-params
|
|
:<- [::specific-table-params]
|
|
:<- [::subs/query-params]
|
|
(fn [[specific-table-params query-params]]
|
|
(merge (select-keys query-params #{:start :sort}) specific-table-params )))
|
|
|
|
(re-frame/reg-event-fx
|
|
::params-changed
|
|
[(re-frame/path [::table-params])]
|
|
(fn [{table-params :db} [_ params :as z]]
|
|
{:db (merge table-params params)}))
|
|
|
|
|
|
(re-frame/reg-event-fx
|
|
::deleted-transaction-rule
|
|
(fn []
|
|
{:dispatch [::modal/modal-closed]}))
|
|
|
|
(re-frame/reg-event-fx
|
|
::delete-transaction-rule
|
|
[with-user]
|
|
(fn [{:keys [db user]} [_ id]]
|
|
{:graphql
|
|
{:token user
|
|
:owns-state {:single ::delete-transaction-rule}
|
|
:query-obj {:venia/operation {:operation/type :mutation
|
|
:operation/name "DeleteTransactionRule"}
|
|
:venia/queries [{:query/data [:delete-transaction-rule
|
|
{:transaction-rule-id id}]}]}
|
|
:on-success [::deleted-transaction-rule]}}))
|
|
|
|
|
|
;; TODO count how many transactions
|
|
(re-frame/reg-event-fx
|
|
::request-delete
|
|
(fn [_ [_ which]]
|
|
{:dispatch [::modal/modal-requested {:title "Confirmation"
|
|
:body [:div "Are you sure you want to delete transaction rule '" (:description which) "'? Any previously transactions will remain updated, but the rule association will be lost."]
|
|
:cancel? true
|
|
:confirm {:value "Delete Transaction Rule"
|
|
:class "is-danger"
|
|
:status-from [::status/single ::delete-transaction-rule]
|
|
:on-click (dispatch-event [::delete-transaction-rule (:id which)] )}
|
|
:close-event [::status/completed ::delete-transaction-rule]}]}))
|
|
|
|
|
|
|
|
(defn table* [{:keys [id data-page]}]
|
|
(let [{:keys [data]} @(re-frame/subscribe [::data-page/page data-page])
|
|
selected-client @(re-frame/subscribe [::subs/client])
|
|
states @(re-frame/subscribe [::status/multi ::run])]
|
|
[grid/grid {:data-page data-page
|
|
:column-count 6}
|
|
[grid/controls data]
|
|
[grid/table {:fullwidth true }
|
|
[grid/header
|
|
[grid/row {}
|
|
[grid/sortable-header-cell {:sort-key "client"
|
|
:sort-name "Client"}
|
|
"Client"]
|
|
|
|
[grid/sortable-header-cell {:sort-key "bank-account"
|
|
:sort-name "Bank Account"}
|
|
"Bank Account"]
|
|
|
|
[grid/sortable-header-cell {:sort-key "description"
|
|
:sort-name "Description"}
|
|
"Description"]
|
|
|
|
[grid/header-cell {:style {:width "12em"}} "Amount"]
|
|
|
|
[grid/sortable-header-cell {:sort-key "note"
|
|
:sort-name "Note"}
|
|
"Note"]
|
|
|
|
[grid/header-cell {:style {:width (action-cell-width 3)}}]]]
|
|
[grid/body
|
|
(for [{:keys [client bank-account description amount-lte amount-gte note id] :as r} (:data data)]
|
|
^{:key id}
|
|
[grid/row {:class (:class r) :id id}
|
|
[grid/cell {} (:name client)]
|
|
[grid/cell {} (:name bank-account)]
|
|
[grid/cell {} description]
|
|
[grid/cell {:class "has-text-right"}
|
|
(cond (and amount-gte amount-lte)
|
|
(str (->$ amount-gte) " - " (->$ amount-lte))
|
|
|
|
amount-gte
|
|
(str ">=" (->$ amount-gte))
|
|
|
|
amount-lte
|
|
(str "<=" (->$ amount-lte))
|
|
|
|
:else
|
|
"")]
|
|
[grid/cell {} note]
|
|
[grid/cell {}
|
|
[:div.buttons
|
|
[buttons/fa-icon {:event [::run-clicked r] :icon :fa-play :class (status/class-for (get states (:id r)))}]
|
|
[buttons/sl-icon {:event [::request-delete r] :icon :icon-bin-2}]
|
|
[buttons/fa-icon {:event [::form/editing r] :icon :fa-pencil}]]]])]]]))
|
|
|
|
(defn table [params]
|
|
(r/create-class {:component-will-unmount (dispatch-event [::unmounted])
|
|
:reagent-render (fn [params]
|
|
[table* params])}))
|