implemented crud

This commit is contained in:
Bryce Covert
2019-05-07 18:18:57 -07:00
parent a1abb4b05e
commit 8c50085fcc
11 changed files with 355 additions and 22 deletions

View File

@@ -63,6 +63,11 @@
(fn [client]
(->> client :bank-accounts (filter #(= (:type %) :check)) (sort-by :sort-order))))
(re-frame/reg-sub
::real-bank-accounts-for-client
(fn [db [_ {:keys [id]}]]
(sort-by :sort-order (-> db :clients (get id) :bank-accounts ))))
(re-frame/reg-sub
::locations-for-client

View File

@@ -4,9 +4,14 @@
[auto-ap.views.components.admin.side-bar :refer [admin-side-bar]]
[auto-ap.views.components.layouts :refer [appearing-side-bar side-bar-layout]]
[auto-ap.views.pages.admin.rules.table :as table]
[auto-ap.views.pages.admin.rules.form :as form]
[auto-ap.views.pages.admin.rules.common :refer [default-read]]
[auto-ap.views.utils :refer [dispatch-event with-user]]
[auto-ap.utils :refer [replace-by]]
[re-frame.core :as re-frame]))
;; SUBS
(re-frame/reg-sub
::notification
(fn [db]
@@ -22,13 +27,22 @@
(fn [db]
(-> db (::params {}))))
(def rule-read [:description-matches])
(re-frame/reg-event-db
::edit-completed
(fn [db [_ edit-transaction-rule]]
(println edit-transaction-rule)
(-> db
(update-in [::page :transaction-rules]
replace-by :id (assoc edit-transaction-rule :class "live-added")))))
;; EVENTS
(re-frame/reg-event-db
::received
(fn [db [_ data]]
(println data)
(-> db
(update ::page merge (first (:rule-page data)))
(update ::page merge (:transaction-rule-page data))
(assoc-in [:status :loading] false))))
(re-frame/reg-event-fx
@@ -39,14 +53,22 @@
(assoc-in [:status :loading] true)
(assoc-in [::params] params))
:graphql {:token user
:query-obj {:venia/queries [[:rule_page
:query-obj {:venia/queries [[:transaction_rule_page
(assoc params :client-id (:id @(re-frame/subscribe [::subs/client])))
[[:rules rule-read]
[[:transaction-rules default-read]
:total
:start
:end]]]}
:on-success [::received]}}))
(re-frame/reg-event-fx
::new-rule-clicked
(fn [{:keys [db]} _]
{:dispatch [::form/adding {:client @(re-frame/subscribe [::subs/client])}]}))
;; VIEWS
(def rules-content
(with-meta
(fn []
@@ -57,17 +79,19 @@
[:h1.title "Transaction Rules"]
(when (= "admin" (:user/role user))
[:div.is-pulled-right
[:button.button.is-outlined.is-primary {:on-click (dispatch-event [::create-rule-clicked])} "New Rule"]])
[:button.button.is-outlined.is-primary {:on-click (dispatch-event [::new-rule-clicked])} "New Rule"]])
[table/table {:id :transactions
:params (re-frame/subscribe [::params])
:rule-page (re-frame/subscribe [::page])
:status (re-frame/subscribe [::subs/status])
:on-params-change (fn [params]
(re-frame/dispatch [::params-change params]))}]
]))
{:component-will-mount #(re-frame/dispatch-sync [::params-change {}]) }))
(defn admin-rules-page []
(let [{:keys [active?]} @(re-frame/subscribe [::forms/form ::new-client])]
(let [{:keys [active?]} @(re-frame/subscribe [::forms/form ::form/form])]
[side-bar-layout {:side-bar [admin-side-bar {}]
:main [rules-content]
:right-side-bar [appearing-side-bar {:visible? active?} [:div]] }]))
:right-side-bar [appearing-side-bar {:visible? active?}
[form/form {:rule-saved [::edit-completed]}]] }]))

View File

@@ -0,0 +1,10 @@
(ns auto-ap.views.pages.admin.rules.common)
(def default-read [:id
:description
:note
:amount-gte
:amount-lte
[:client [:name :id]]
[:bank-account [:name :id]]
])

View File

@@ -0,0 +1,149 @@
(ns auto-ap.views.pages.admin.rules.form
(:require [auto-ap.entities.transaction-rule :as entity]
[auto-ap.events :as events]
[auto-ap.forms :as forms]
[auto-ap.subs :as subs]
[auto-ap.utils :refer [dollars=]]
[auto-ap.views.components.dropdown :refer [drop-down]]
[auto-ap.views.components.expense-accounts-field :as expense-accounts-field :refer [expense-accounts-field recalculate-amounts]]
[auto-ap.views.components.layouts :as layouts]
[auto-ap.views.components.typeahead :refer [typeahead-entity]]
[auto-ap.views.pages.admin.rules.common :refer [default-read]]
[auto-ap.views.utils :refer [date->str date-picker dispatch-event standard with-user]]
[cljs-time.core :as c]
[clojure.spec.alpha :as s]
[clojure.string :as str]
[re-frame.core :as re-frame]))
;; SUBS
(re-frame/reg-sub
::can-submit
:<- [::forms/form ::form]
(fn [{:keys [data status]} _]
(s/valid? ::entity/transaction-rule data)))
(re-frame/reg-sub
::query
:<- [::forms/form ::form]
(fn [{:keys [data] }]
{:venia/operation {:operation/type :mutation
:operation/name "UpsertTransactionRule"}
:venia/queries [{:query/data [:upsert-transaction-rule
{:transaction-rule (-> data
(select-keys [:id
:description
:amount-lte
:amount-gte
:note])
(assoc :client-id (:id (:client data)))
(assoc :bank-account-id (:id (:bank-account data))))}
default-read]}]}))
;; EVENTS
(re-frame/reg-event-db
::adding
(fn [db [_ new]]
(-> db (forms/start-form ::form (assoc new
:description nil)))))
(re-frame/reg-event-db
::editing
(fn [db [_ which]]
(-> db (forms/start-form ::form {}))))
(re-frame/reg-event-db
::changed
(forms/change-handler ::form
(fn [data field value]
[])))
(re-frame/reg-event-fx
::saving
[with-user (forms/triggers-loading ::form) (forms/in-form ::form)]
(fn [{:keys [user] {:keys [data]} :db} [_ params]]
{:graphql
{:token user
:query-obj @(re-frame/subscribe [::query])
:on-success [::succeeded params]
:on-error [::forms/save-error ::form]}}))
(re-frame/reg-event-fx
::succeeded
[(forms/triggers-stop ::form)]
(fn [{:keys [db]} [_ {:keys [rule-saved]} result]]
{:db (forms/start-form db ::form {:client @(re-frame/subscribe [::subs/client])})
:dispatch (conj rule-saved (:upsert-transaction-rule result))}))
;; VIEWS
(def rule-form (forms/vertical-form {:can-submit [::can-submit]
:change-event [::changed]
:submit-event [::saving ]
:id ::form}))
(defn form [{:keys [can-change-amount?] :as params}]
[layouts/side-bar {:on-close (dispatch-event [::forms/form-closing ::form ])}
(let [{:keys [data active? error id]} @(re-frame/subscribe [::forms/form ::form])
{:keys [form field raw-field error-notification submit-button ]} rule-form
exists? (:id data)
chooseable-expense-accounts @(re-frame/subscribe [::subs/chooseable-expense-accounts])
accounts-by-id @(re-frame/subscribe [::subs/accounts-for-client-by-id])]
^{:key id}
[form (assoc params :title "New Invoice")
(when-not @(re-frame/subscribe [::subs/client])
[field "Client"
[typeahead-entity {:matches @(re-frame/subscribe [::subs/clients])
:match->text :name
:type "typeahead-entity"
:auto-focus (if @(re-frame/subscribe [::subs/client]) false true)
:field [:client]
:spec ::entity/client}]])
[field "Bank account"
[typeahead-entity {:matches @(re-frame/subscribe [::subs/real-bank-accounts-for-client (:client data)])
:match->text :name
:auto-focus (if @(re-frame/subscribe [::subs/client]) true false)
:type "typeahead-entity"
:field [:bank-account]
:spec ::entity/bank-account}]]
[field "Description"
[:input.input {:type "text"
:field [:description]
:spec ::entity/description}]]
[:div.field
[:p.help "Amount"]
[:div.control
[:div.columns
[:div.column
[raw-field
[:input.input {:type "number"
:placeholder ">="
:field [:amount-gte]
:spec ::entity/amount-gte
:step "0.01"}]]]
[:div.column
[raw-field
[:input.input {:type "number"
:placeholder "<="
:field [:amount-lte]
:spec ::entity/amount-lte
:step "0.01"}]]]]]]
[field "Note"
[:input.input {:type "text"
:field [:note]
:spec ::entity/note}]]
[error-notification]
[submit-button "Save"]])])

View File

@@ -1,5 +1,76 @@
(ns auto-ap.views.pages.admin.rules.table)
(ns auto-ap.views.pages.admin.rules.table
(:require [auto-ap.subs :as subs]
[auto-ap.views.components.paginator :refer [paginator]]
[auto-ap.views.components.sorter :refer [sorted-column]]
[re-frame.core :as re-frame]))
(defn table [{:keys [id rule-page on-params-change params status]}]
(let [opc (fn [p]
(on-params-change (merge @params p )))]
(fn [{:keys [id rule-page on-params-change params status]}]
(let [{:keys [sort-by asc]} @params
{:keys [transaction-rules start end count total]} @rule-page
selected-client @(re-frame/subscribe [::subs/client])]
[:div
[paginator {:start start :end end :count count :total total
:on-change (fn [p ]
(on-params-change (merge @params p)))}]
[:table.table.is-fullwidth.compact
[:thead
[:tr
[sorted-column {:on-sort opc
:style {:width "25%" :cursor "pointer"}
:sort-key "client"
:sort-by sort-by
:asc asc}
"Client"]
(defn table [x]
[:div])
[sorted-column {:on-sort opc
:style {:width "25%" :cursor "pointer"}
:sort-key "bank-account"
:sort-by sort-by
:asc asc}
"Bank Account"]
[sorted-column {:on-sort opc
:style {:width "25%" :cursor "pointer"}
:sort-key "description"
:sort-by sort-by
:asc asc}
"Description"]
[sorted-column {:on-sort opc
:style {:width "8em" :cursor "pointer"}
:class "has-text-right"
:sort-key "amount-gte"
:sort-by sort-by
:asc asc}
">="]
[sorted-column {:on-sort opc
:class "has-text-right"
:style {:width "8em" :cursor "pointer"}
:sort-key "amount-lte"
:sort-by sort-by
:asc asc}
"<="]
[sorted-column {:on-sort opc
:style {:width "25%" :cursor "pointer"}
:sort-key "note"
:sort-by sort-by
:asc asc}
"Note"]]]
[:tbody
(if (:loading @status)
[:tr
[:td {:col-span 5}
[:i.fa.fa-spin.fa-spinner]]]
(for [{:keys [client bank-account description amount-lte amount-gte note] :as r} transaction-rules]
^{:key id}
[:tr {:class (:class r)}
[:td (:name client)]
[:td (:name bank-account)]
[:td description]
[:td.has-text-right amount-gte ]
[:td.has-text-right amount-lte]
[:td note]]))]]]))))