pretty good progress in being able to add/edit all bank accounts.
This commit is contained in:
@@ -54,7 +54,7 @@
|
|||||||
|
|
||||||
:bank_account
|
:bank_account
|
||||||
{:fields {:id {:type :id }
|
{:fields {:id {:type :id }
|
||||||
:type {:type :bank_account_type}
|
:type {:type :ident}
|
||||||
:number {:type 'String}
|
:number {:type 'String}
|
||||||
:routing {:type 'String}
|
:routing {:type 'String}
|
||||||
:code {:type 'String}
|
:code {:type 'String}
|
||||||
|
|||||||
@@ -50,7 +50,7 @@
|
|||||||
:bank-account/check-number (:check_number %)
|
:bank-account/check-number (:check_number %)
|
||||||
|
|
||||||
:bank-account/yodlee-account-id (:yodlee_account_id %)
|
:bank-account/yodlee-account-id (:yodlee_account_id %)
|
||||||
:bank-account/type :bank-account-type/check
|
:bank-account/type (keyword "bank-account-type" (name (:type %)))
|
||||||
}
|
}
|
||||||
) (:bank_accounts edit_client))
|
) (:bank_accounts edit_client))
|
||||||
|
|
||||||
|
|||||||
@@ -22,7 +22,7 @@
|
|||||||
|
|
||||||
(s/def ::checking-bank-account (s/and (s/keys :req-un [::code ::name ::bank-name ::bank-code ::routing ::number ::type])
|
(s/def ::checking-bank-account (s/and (s/keys :req-un [::code ::name ::bank-name ::bank-code ::routing ::number ::type])
|
||||||
#(= (:type %) :check)))
|
#(= (:type %) :check)))
|
||||||
(s/def ::cash-account (s/and (s/keys :req-un [::type])
|
(s/def ::cash-account (s/and (s/keys :req-un [::type ::code ::name])
|
||||||
#(= (:type %) :cash)))
|
#(= (:type %) :cash)))
|
||||||
(s/def ::bank-account (s/or :cash ::cash-account :checking ::checking-bank-account))
|
(s/def ::bank-account (s/or :cash ::cash-account :checking ::checking-bank-account))
|
||||||
(s/def ::bank-accounts (s/coll-of ::bank-account))
|
(s/def ::bank-accounts (s/coll-of ::bank-account))
|
||||||
|
|||||||
@@ -61,6 +61,33 @@
|
|||||||
(start-form ::new-client (assoc (get (:clients db) client-id) :new-account {:type :check}))
|
(start-form ::new-client (assoc (get (:clients db) client-id) :new-account {:type :check}))
|
||||||
(assoc-in [:admin :adding-client? ] true))}))
|
(assoc-in [:admin :adding-client? ] true))}))
|
||||||
|
|
||||||
|
(re-frame/reg-sub
|
||||||
|
::new-client-request
|
||||||
|
:<- [::form ::new-client]
|
||||||
|
(fn [{new-client-data :data} _]
|
||||||
|
{:id (:id new-client-data),
|
||||||
|
:name (:name new-client-data)
|
||||||
|
:code (:code new-client-data) ;; TODO add validation can't change
|
||||||
|
:email (:email new-client-data)
|
||||||
|
:locations (:locations new-client-data)
|
||||||
|
:address {:street1 (:street1 (:address new-client-data))
|
||||||
|
:street2 (:street2 (:address new-client-data)),
|
||||||
|
:city (:city (:address new-client-data))
|
||||||
|
:state (:state (:address new-client-data))
|
||||||
|
:zip (:zip (:address new-client-data))}
|
||||||
|
:bank-accounts (map (fn [{:keys [number name check-number type id code bank-name routing bank-code new?]}]
|
||||||
|
{:number number
|
||||||
|
:name name
|
||||||
|
:check-number check-number
|
||||||
|
:type type
|
||||||
|
:id id
|
||||||
|
:code (if new?
|
||||||
|
(str (:code new-client-data) "-" code)
|
||||||
|
code)
|
||||||
|
:bank-name bank-name
|
||||||
|
:routing routing
|
||||||
|
:bank-code bank-code})
|
||||||
|
(:bank-accounts new-client-data))}))
|
||||||
|
|
||||||
|
|
||||||
(re-frame/reg-event-fx
|
(re-frame/reg-event-fx
|
||||||
@@ -68,27 +95,7 @@
|
|||||||
[(re-frame/path [::forms ::new-client])]
|
[(re-frame/path [::forms ::new-client])]
|
||||||
(fn [{{new-client-data :data :as new-client-form} :db} _]
|
(fn [{{new-client-data :data :as new-client-form} :db} _]
|
||||||
|
|
||||||
(let [new-client-req {:id (:id new-client-data),
|
(let [new-client-req @(re-frame/subscribe [::new-client-request])
|
||||||
:name (:name new-client-data)
|
|
||||||
:code (:code new-client-data) ;; TODO add validation can't change
|
|
||||||
:email (:email new-client-data)
|
|
||||||
:locations (:locations new-client-data)
|
|
||||||
:address {:street1 (:street1 (:address new-client-data))
|
|
||||||
:street2 (:street2 (:address new-client-data)),
|
|
||||||
:city (:city (:address new-client-data))
|
|
||||||
:state (:state (:address new-client-data))
|
|
||||||
:zip (:zip (:address new-client-data))}
|
|
||||||
:bank-accounts (map (fn [{:keys [number name check-number type id code bank-name routing bank-code]}]
|
|
||||||
{:number number
|
|
||||||
:name name
|
|
||||||
:check-number check-number
|
|
||||||
:type type
|
|
||||||
:id id
|
|
||||||
:code (str (:code new-client-data) "-" code)
|
|
||||||
:bank-name bank-name
|
|
||||||
:routing routing
|
|
||||||
:bank-code bank-code})
|
|
||||||
(:bank-accounts new-client-data))}
|
|
||||||
user @(re-frame/subscribe [::subs/token])]
|
user @(re-frame/subscribe [::subs/token])]
|
||||||
|
|
||||||
(if (s/valid? ::entity/client new-client-req)
|
(if (s/valid? ::entity/client new-client-req)
|
||||||
@@ -102,7 +109,7 @@
|
|||||||
:operation/name "EditClient"}
|
:operation/name "EditClient"}
|
||||||
:venia/queries [{:query/data [:edit-client
|
:venia/queries [{:query/data [:edit-client
|
||||||
{:edit-client new-client-req}
|
{:edit-client new-client-req}
|
||||||
[:id :name :code :email :locations [:address [:street1 :street2 :city :state :zip]] [:bank-accounts [:id :number :check-number :name :code :bank-code :bank-name :routing]]]]}]}
|
[:id :name :code :email :locations [:address [:street1 :street2 :city :state :zip]] [:bank-accounts [:id :number :check-number :name :code :bank-code :bank-name :routing :type]]]]}]}
|
||||||
:on-success [::save-complete]
|
:on-success [::save-complete]
|
||||||
:on-error [::save-error]}}
|
:on-error [::save-error]}}
|
||||||
{:db new-client-form}))))
|
{:db new-client-form}))))
|
||||||
@@ -138,10 +145,28 @@
|
|||||||
(update :locations conj (:location client))
|
(update :locations conj (:location client))
|
||||||
(dissoc :location))))
|
(dissoc :location))))
|
||||||
|
|
||||||
|
|
||||||
(re-frame/reg-event-db
|
(re-frame/reg-event-db
|
||||||
::add-new-bank-account
|
::add-new-bank-account
|
||||||
[(re-frame/path [::forms ::new-client :data])]
|
[(re-frame/path [::forms ::new-client :data])]
|
||||||
|
(fn [client [_ type]]
|
||||||
|
(update client :bank-accounts conj {:type type :active? true :new? true})))
|
||||||
|
|
||||||
|
(re-frame/reg-event-db
|
||||||
|
::bank-account-activated
|
||||||
|
[(re-frame/path [::forms ::new-client :data :bank-accounts])]
|
||||||
|
(fn [bank-accounts [_ index]]
|
||||||
|
(update bank-accounts index assoc :active? true)))
|
||||||
|
|
||||||
|
(re-frame/reg-event-db
|
||||||
|
::bank-account-deactivated
|
||||||
|
[(re-frame/path [::forms ::new-client :data :bank-accounts])]
|
||||||
|
(fn [bank-accounts [_ index]]
|
||||||
|
(update bank-accounts index assoc :active? false)))
|
||||||
|
|
||||||
|
|
||||||
|
(re-frame/reg-event-db
|
||||||
|
::save-new-bank-account
|
||||||
|
[(re-frame/path [::forms ::new-client :data])]
|
||||||
(fn [{:keys [new-account] :as client} _]
|
(fn [{:keys [new-account] :as client} _]
|
||||||
(let [new-account (-> new-account
|
(let [new-account (-> new-account
|
||||||
(update :check-number #(if (seq %) (js/parseInt %) nil))
|
(update :check-number #(if (seq %) (js/parseInt %) nil))
|
||||||
@@ -155,10 +180,12 @@
|
|||||||
(assoc :new-account {:type :check}))))))
|
(assoc :new-account {:type :check}))))))
|
||||||
|
|
||||||
(re-frame/reg-event-db
|
(re-frame/reg-event-db
|
||||||
::remove-new-bank-account
|
::bank-account-removed
|
||||||
[(re-frame/path [::forms ::new-client :data])]
|
[(re-frame/path [::forms ::new-client :data :bank-accounts ])]
|
||||||
(fn [db [_ code]]
|
(fn [bank-accounts [_ index]]
|
||||||
(update db :bank-accounts
|
(vec (concat (take index bank-accounts)
|
||||||
|
(drop (inc index) bank-accounts)))
|
||||||
|
#_(update db :bank-accounts
|
||||||
(fn [bas]
|
(fn [bas]
|
||||||
(filter #(not= (:code %) code) bas)))))
|
(filter #(not= (:code %) code) bas)))))
|
||||||
|
|
||||||
@@ -197,6 +224,123 @@
|
|||||||
(defn side-bar-form [_ children]
|
(defn side-bar-form [_ children]
|
||||||
[:div [:a.delete.is-pulled-right {:on-click (dispatch-event [::form-closing ::new-client])}] [:div children]])
|
[:div [:a.delete.is-pulled-right {:on-click (dispatch-event [::form-closing ::new-client])}] [:div children]])
|
||||||
|
|
||||||
|
(defn bank-account-card [new-client {:keys [active? new? type code name number check-number id] :as bank-account} index]
|
||||||
|
(println new-client)
|
||||||
|
[:div.card {:style {:margin-bottom "1em"}}
|
||||||
|
[:header.card-header
|
||||||
|
[:p.card-header-title {:style {:text-overflow "ellipsis"}}
|
||||||
|
[:span.icon
|
||||||
|
(if ({:check ":check"} type)
|
||||||
|
[:span.icon-check-payment-sign]
|
||||||
|
[:span.icon-accounting-bill])]
|
||||||
|
code ": " name]
|
||||||
|
(if active?
|
||||||
|
[:a.card-header-icon
|
||||||
|
{:on-click (dispatch-event [::bank-account-deactivated index])}
|
||||||
|
[:span.icon
|
||||||
|
[:span.fa.fa-angle-up]]]
|
||||||
|
[:a.card-header-icon
|
||||||
|
{:on-click (dispatch-event [::bank-account-activated index])}
|
||||||
|
[:span.icon
|
||||||
|
[:span.fa.fa-angle-down]]])]
|
||||||
|
(when active?
|
||||||
|
[:div.card-content
|
||||||
|
[:label.label "General"]
|
||||||
|
[horizontal-field
|
||||||
|
nil
|
||||||
|
[:div.control
|
||||||
|
[:p.help "Account Code"]
|
||||||
|
(if new?
|
||||||
|
[:div.field.has-addons.is-extended
|
||||||
|
[:p.control [:a.button.is-static (:code new-client) "-" ]]
|
||||||
|
[:p.control
|
||||||
|
[bind-field
|
||||||
|
[:input.input {:type "code"
|
||||||
|
:field [:bank-accounts index :code]
|
||||||
|
:spec ::entity/code
|
||||||
|
:event ::change-new
|
||||||
|
:subscription new-client}]]]]
|
||||||
|
[:div.field [:p.control code]])]
|
||||||
|
|
||||||
|
[:div.control
|
||||||
|
[:p.help "Nickname"]
|
||||||
|
[bind-field
|
||||||
|
[:input.input {:placeholder "BOA Checking #1"
|
||||||
|
:type "text"
|
||||||
|
:field [:bank-accounts index :name]
|
||||||
|
:event ::change-new
|
||||||
|
:subscription new-client}]]]]
|
||||||
|
(when (#{:check ":check"} (doto type println) )
|
||||||
|
[:div
|
||||||
|
|
||||||
|
[:label.label "Bank"]
|
||||||
|
[horizontal-field
|
||||||
|
nil
|
||||||
|
[:div.control
|
||||||
|
[:p.help "Bank Name"]
|
||||||
|
[bind-field
|
||||||
|
[:input.input {:placeholder "Bank of America"
|
||||||
|
:type "text"
|
||||||
|
:field [:bank-accounts index :bank-name]
|
||||||
|
:event ::change-new
|
||||||
|
:subscription new-client}]]]
|
||||||
|
[:div.control
|
||||||
|
[:p.help "Routing #"]
|
||||||
|
[bind-field
|
||||||
|
[:input.input {:placeholder "104819123"
|
||||||
|
:type "text"
|
||||||
|
:field [:bank-accounts index :routing]
|
||||||
|
:event ::change-new
|
||||||
|
:subscription new-client}]]]
|
||||||
|
[:div.control
|
||||||
|
[:p.help "Bank code"]
|
||||||
|
[bind-field
|
||||||
|
[:input.input {:placeholder "12/10123"
|
||||||
|
:type "text"
|
||||||
|
:field [:bank-accounts index :bank-code]
|
||||||
|
:event ::change-new
|
||||||
|
:subscription new-client}]]]]
|
||||||
|
|
||||||
|
[:label.label "Checking account"]
|
||||||
|
[horizontal-field
|
||||||
|
nil
|
||||||
|
[:div.control
|
||||||
|
[:p.help "Account #"]
|
||||||
|
[bind-field
|
||||||
|
[:input.input {:placeholder "123456789"
|
||||||
|
:type "text"
|
||||||
|
:field [:bank-accounts index :number]
|
||||||
|
:event ::change-new
|
||||||
|
:subscription new-client}]]]
|
||||||
|
[:div.control
|
||||||
|
[:p.help "Check Number"]
|
||||||
|
[bind-field
|
||||||
|
[:input.input {:placeholder "10000"
|
||||||
|
:type "text"
|
||||||
|
:field [:bank-accounts index :check-number]
|
||||||
|
:event ::change-new
|
||||||
|
:subscription new-client}]]]]
|
||||||
|
[:div.field
|
||||||
|
[:label.label "Yodlee Account"]
|
||||||
|
[:div.control
|
||||||
|
[bind-field
|
||||||
|
[:input.input {:placeholder "Yodlee Account #"
|
||||||
|
:type "text"
|
||||||
|
:field [:bank-accounts :yodlee-account-id]
|
||||||
|
:event ::change-new
|
||||||
|
:subscription new-client}]]]
|
||||||
|
]]
|
||||||
|
|
||||||
|
)]
|
||||||
|
|
||||||
|
)
|
||||||
|
(when active?
|
||||||
|
[:footer.card-footer
|
||||||
|
[:a.card-footer-item {:href "#" :on-click (dispatch-event [::bank-account-deactivated index])} "Done"]
|
||||||
|
(when new?
|
||||||
|
[:a.card-footer-item.is-warning {:href "#" :on-click (dispatch-event [::bank-account-removed index])} "Remove"])])]
|
||||||
|
)
|
||||||
|
|
||||||
(defn new-client-form []
|
(defn new-client-form []
|
||||||
(let [{error :error new-client :data } @(re-frame/subscribe [::form ::new-client])]
|
(let [{error :error new-client :data } @(re-frame/subscribe [::form ::new-client])]
|
||||||
|
|
||||||
@@ -253,124 +397,20 @@
|
|||||||
[address-field {:field [:address]
|
[address-field {:field [:address]
|
||||||
:event ::change-new
|
:event ::change-new
|
||||||
:subscription new-client}]]
|
:subscription new-client}]]
|
||||||
[:nav.panel
|
|
||||||
[:p.panel-heading "Bank accounts"]
|
[:h2.subtitle "Bank accounts"]
|
||||||
(for [{:keys [type code name number check-number id]} (:bank-accounts new-client)]
|
(for [[bank-account index] (map vector (:bank-accounts new-client) (range))]
|
||||||
(if id
|
^{:key index}
|
||||||
^{:key code}
|
[bank-account-card new-client bank-account index])
|
||||||
|
|
||||||
[:a.panel-block {:style {:position "relative"}}
|
[:div.columns
|
||||||
[:span.panel-icon
|
[:div.column.is-half
|
||||||
(if (= type :check)
|
[:a.button.is-primary.is-outlined.is-fullwidth {:on-click (dispatch-event [::add-new-bank-account :check])} "Add Checking Account"]]
|
||||||
[:span.icon-check-payment-sign]
|
[:div.column.is-half
|
||||||
[:span.icon-accounting-bill])]
|
[:a.button.is-primary.is-outlined.is-fullwidth {:on-click (dispatch-event [::add-new-bank-account :cash])} "Add Cash Account"]]]
|
||||||
code ": " name]
|
|
||||||
|
|
||||||
^{:key code}
|
|
||||||
[:li [:strong "* " code ": " name] [:button.button {:on-click (dispatch-event [::remove-new-bank-account code])} [:span.icon [:i.fa.fa-times]]]]))
|
|
||||||
[:div.panel-block
|
|
||||||
[:nav.level
|
|
||||||
[:div.level-item.has-text-centered
|
|
||||||
[:button.button.is-outlined.is-primary.is-fullwidth "Add Checking Account"]]
|
|
||||||
[:div.level-item.has-text-centered
|
|
||||||
|
|
||||||
[:button.button.is-outlined.is-primary.is-fullwidth "Add Cash Account"]]]]
|
|
||||||
#_(for [[index {:keys [name code number check-number]}] (map vector (range) (:new-bank-accounts new-client))]
|
|
||||||
^{:key index} [:li [:strong "* " code ": " name] [:button.button {:on-click (dispatch-event [::remove-new-bank-account index])} [:span.icon [:i.fa.fa-times]]]])]
|
|
||||||
|
|
||||||
#_[:h2.subtitle "Add bank account"]
|
#_[:h2.subtitle "Add bank account"]
|
||||||
#_[:div {:style {:padding-bottom "0.75em" :padding-top "0.75em" :background "hsl(0, 0%, 96%)"}}
|
|
||||||
[:label.label "General"]
|
|
||||||
[horizontal-field
|
|
||||||
nil
|
|
||||||
[:div.control
|
|
||||||
[:p.help "Account Code"]
|
|
||||||
[:div.field.has-addons.is-extended
|
|
||||||
[:p.control [:a.button.is-static (:code new-client) "-" ]]
|
|
||||||
[:p.control
|
|
||||||
[bind-field
|
|
||||||
[:input.input {:type "code"
|
|
||||||
:field [:new-account :code]
|
|
||||||
:spec ::entity/code
|
|
||||||
:event ::change-new
|
|
||||||
:subscription new-client}]]]]]
|
|
||||||
|
|
||||||
[:div.control
|
|
||||||
[:p.help "Nickname"]
|
|
||||||
[bind-field
|
|
||||||
[:input.input {:placeholder "BOA Checking #1"
|
|
||||||
:type "text"
|
|
||||||
:field [:new-account :name]
|
|
||||||
:event ::change-new
|
|
||||||
:subscription new-client}]]]]
|
|
||||||
|
|
||||||
[:label.label "Bank"]
|
|
||||||
[horizontal-field
|
|
||||||
nil
|
|
||||||
[:div.control
|
|
||||||
[:p.help "Bank Name"]
|
|
||||||
[bind-field
|
|
||||||
[:input.input {:placeholder "Bank of America"
|
|
||||||
:type "text"
|
|
||||||
:field [:new-account :bank-name]
|
|
||||||
:event ::change-new
|
|
||||||
:subscription new-client}]]]
|
|
||||||
[:div.control
|
|
||||||
[:p.help "Routing #"]
|
|
||||||
[bind-field
|
|
||||||
[:input.input {:placeholder "104819123"
|
|
||||||
:type "text"
|
|
||||||
:field [:new-account :routing]
|
|
||||||
:event ::change-new
|
|
||||||
:subscription new-client}]]]
|
|
||||||
[:div.control
|
|
||||||
[:p.help "Bank code"]
|
|
||||||
[bind-field
|
|
||||||
[:input.input {:placeholder "12/10123"
|
|
||||||
:type "text"
|
|
||||||
:field [:new-account :bank-code]
|
|
||||||
:event ::change-new
|
|
||||||
:subscription new-client}]]]]
|
|
||||||
|
|
||||||
[:label.label "Checking account"]
|
|
||||||
[horizontal-field
|
|
||||||
nil
|
|
||||||
[:div.control
|
|
||||||
[:p.help "Account #"]
|
|
||||||
[bind-field
|
|
||||||
[:input.input {:placeholder "123456789"
|
|
||||||
:type "text"
|
|
||||||
:field [:new-account :number]
|
|
||||||
:event ::change-new
|
|
||||||
:subscription new-client}]]]
|
|
||||||
[:div.control
|
|
||||||
[:p.help "Check Number"]
|
|
||||||
[bind-field
|
|
||||||
[:input.input {:placeholder "10000"
|
|
||||||
:type "text"
|
|
||||||
:field [:new-account :check-number]
|
|
||||||
:event ::change-new
|
|
||||||
:subscription new-client}]]]]
|
|
||||||
|
|
||||||
[:div.field
|
|
||||||
[:label.label "Yodlee Account"]
|
|
||||||
[:div.control
|
|
||||||
[bind-field
|
|
||||||
[:input.input {:placeholder "Yodlee Account #"
|
|
||||||
:type "text"
|
|
||||||
:field [:new-account :yodlee-account-id]
|
|
||||||
:event ::change-new
|
|
||||||
:subscription new-client}]]]
|
|
||||||
]
|
|
||||||
[:div.field
|
|
||||||
[:div.control
|
|
||||||
#_(println (s/explain-data ::entity/bank-account (:new-account new-client)))
|
|
||||||
[:button.button.is-primary {:disabled (if (and (doto (s/valid? ::entity/bank-account (:new-account new-client)) println)
|
|
||||||
(not ((set (map :code (:new-bank-accounts new-client)))
|
|
||||||
(str (:code new-client) "-" (-> new-client :new-account :code)))))
|
|
||||||
""
|
|
||||||
"disabled")
|
|
||||||
:on-click (dispatch-event [::add-new-bank-account])} "Add"]]]]
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -380,8 +420,10 @@
|
|||||||
(when error
|
(when error
|
||||||
[:div.notification.is-warning.animated.fadeInUp
|
[:div.notification.is-warning.animated.fadeInUp
|
||||||
error])
|
error])
|
||||||
|
|
||||||
|
(println (s/explain-data ::entity/client @(re-frame/subscribe [::new-client-request])))
|
||||||
|
|
||||||
[:submit.button.is-large.is-primary {:disabled (if (s/valid? ::entity/client new-client)
|
[:submit.button.is-large.is-primary {:disabled (if (s/valid? ::entity/client @(re-frame/subscribe [::new-client-request]))
|
||||||
""
|
""
|
||||||
"disabled")
|
"disabled")
|
||||||
:on-click (dispatch-event [::save-new-client])
|
:on-click (dispatch-event [::save-new-client])
|
||||||
|
|||||||
Reference in New Issue
Block a user