Files
integreat/src/cljs/auto_ap/views/pages/admin/rules/table.cljs
2020-09-05 08:18:29 -07:00

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