allows adding
This commit is contained in:
@@ -340,6 +340,9 @@
|
|||||||
/* background-clip: padding-box; */
|
/* background-clip: padding-box; */
|
||||||
|
|
||||||
}
|
}
|
||||||
|
.modal-card {
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
|
||||||
.typeahead-suggestion {
|
.typeahead-suggestion {
|
||||||
display: block;
|
display: block;
|
||||||
|
|||||||
@@ -45,4 +45,13 @@
|
|||||||
(Integer/parseInt id))))
|
(Integer/parseInt id))))
|
||||||
|
|
||||||
|
|
||||||
|
(defn add-bank-account [id bank-account]
|
||||||
|
(let [company (get-by-id id)
|
||||||
|
company (update company :bank-accounts
|
||||||
|
(fn [ba]
|
||||||
|
(let [next-id (inc (apply max (conj (map :id ba) 0)))]
|
||||||
|
(conj (vec ba) (assoc bank-account :id next-id)))))]
|
||||||
|
(upsert id company)))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -36,6 +36,7 @@
|
|||||||
{:fields {:id {:type 'Int}
|
{:fields {:id {:type 'Int}
|
||||||
:name {:type 'String}
|
:name {:type 'String}
|
||||||
:email {:type 'String}
|
:email {:type 'String}
|
||||||
|
:address {:type :address}
|
||||||
:locations {:type '(list String)}
|
:locations {:type '(list String)}
|
||||||
:bank_accounts {:type '(list :bank_account)}}}
|
:bank_accounts {:type '(list :bank_account)}}}
|
||||||
|
|
||||||
@@ -49,6 +50,7 @@
|
|||||||
:bank_name {:type 'String}}}
|
:bank_name {:type 'String}}}
|
||||||
:address
|
:address
|
||||||
{:fields {:street1 {:type 'String}
|
{:fields {:street1 {:type 'String}
|
||||||
|
:street2 {:type 'String}
|
||||||
:city {:type 'String}
|
:city {:type 'String}
|
||||||
:state {:type 'String}
|
:state {:type 'String}
|
||||||
:zip {:type 'String}}}
|
:zip {:type 'String}}}
|
||||||
|
|||||||
@@ -15,10 +15,19 @@
|
|||||||
:body (pr-str (filter #(can-see-company? (:identity r) (:id %)) (companies/get-all)))
|
:body (pr-str (filter #(can-see-company? (:identity r) (:id %)) (companies/get-all)))
|
||||||
:headers {"Content-Type" "application/edn"}})
|
:headers {"Content-Type" "application/edn"}})
|
||||||
(wrap-spec
|
(wrap-spec
|
||||||
(PUT "/:id" {:keys [edn-params] {:keys [id]} :route-params :as r}
|
(PUT "/:id" {{:keys [address email locations new-bank-accounts]} :edn-params :keys [edn-params] {:keys [id ]} :route-params :as r}
|
||||||
(assert-can-see-company (:identity r) id)
|
(assert-can-see-company (:identity r) id)
|
||||||
{:status 200
|
(let [id (Integer/parseInt id)
|
||||||
:body (pr-str (companies/upsert id edn-params))
|
company (companies/get-by-id id)
|
||||||
:headers {"Content-Type" "application/edn"}})
|
updated-company (merge company {:address address
|
||||||
|
:email email
|
||||||
|
:locations locations})]
|
||||||
|
(companies/upsert id updated-company)
|
||||||
|
(doseq [bank-account new-bank-accounts]
|
||||||
|
(companies/add-bank-account id bank-account))
|
||||||
|
|
||||||
|
{:status 200
|
||||||
|
:body (pr-str (companies/get-by-id id))
|
||||||
|
:headers {"Content-Type" "application/edn"}}))
|
||||||
::entity/company))
|
::entity/company))
|
||||||
wrap-secure))
|
wrap-secure))
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
(s/def ::id int)
|
(s/def ::id int)
|
||||||
|
|
||||||
(s/def ::name ::shared/required-identifier)
|
(s/def ::name ::shared/required-identifier)
|
||||||
(s/def ::address ::address/address)
|
(s/def ::address (s/nilable ::address/address))
|
||||||
|
|
||||||
(s/def ::location string?)
|
(s/def ::location string?)
|
||||||
(s/def ::locations (s/coll-of ::location))
|
(s/def ::locations (s/coll-of ::location))
|
||||||
|
|||||||
@@ -37,7 +37,8 @@
|
|||||||
:graphql {:token token
|
:graphql {:token token
|
||||||
:query-obj {:venia/queries [[:company
|
:query-obj {:venia/queries [[:company
|
||||||
|
|
||||||
[:id :name :locations [:bank-accounts [:id :number :check-number :name :type] ]]]
|
[:id :name :locations [:bank-accounts [:id :number :check-number :name :type] ]
|
||||||
|
[:address [:street1 :street2 :city :state :zip]]]]
|
||||||
[:vendor
|
[:vendor
|
||||||
[:id :name :default-expense-account :primary-contact :primary-email :primary-phone :secondary-contact :secondary-email :secondary-phone :print-as :invoice-reminder-schedule :code]]]}
|
[:id :name :default-expense-account :primary-contact :primary-email :primary-phone :secondary-contact :secondary-email :secondary-phone :print-as :invoice-reminder-schedule :code]]]}
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
[auto-ap.views.utils :refer [dispatch-value-change dispatch-event bind-field horizontal-field]]))
|
[auto-ap.views.utils :refer [dispatch-value-change dispatch-event bind-field horizontal-field]]))
|
||||||
|
|
||||||
(defn address-field [{:keys [event field subscription]}]
|
(defn address-field [{:keys [event field subscription]}]
|
||||||
|
(println "sub" subscription)
|
||||||
[:span
|
[:span
|
||||||
[horizontal-field
|
[horizontal-field
|
||||||
nil
|
nil
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
(:require [re-frame.core :as re-frame]
|
(:require [re-frame.core :as re-frame]
|
||||||
[reagent.core :as reagent]
|
[reagent.core :as reagent]
|
||||||
[auto-ap.subs :as subs]
|
[auto-ap.subs :as subs]
|
||||||
[auto-ap.events.admin.companies :as events]
|
[auto-ap.events :as events]
|
||||||
[auto-ap.entities.companies :as entity]
|
[auto-ap.entities.companies :as entity]
|
||||||
[auto-ap.views.components.address :refer [address-field]]
|
[auto-ap.views.components.address :refer [address-field]]
|
||||||
[auto-ap.views.utils :refer [login-url dispatch-event dispatch-value-change bind-field horizontal-field]]
|
[auto-ap.views.utils :refer [login-url dispatch-event dispatch-value-change bind-field horizontal-field]]
|
||||||
@@ -12,6 +12,51 @@
|
|||||||
[auto-ap.routes :as routes]
|
[auto-ap.routes :as routes]
|
||||||
[bidi.bidi :as bidi]))
|
[bidi.bidi :as bidi]))
|
||||||
|
|
||||||
|
(re-frame/reg-event-fx
|
||||||
|
::edit
|
||||||
|
(fn [{:keys [db]} [_ company-id]]
|
||||||
|
{:dispatch [::events/modal-status :auto-ap.views.pages.admin.companies/edit {:visible? true}]
|
||||||
|
:db (assoc-in db [:admin :company]
|
||||||
|
(get (:companies db) company-id))}))
|
||||||
|
|
||||||
|
(re-frame/reg-event-fx
|
||||||
|
::save
|
||||||
|
(fn [{:keys [db]} _]
|
||||||
|
(let [edited-company (-> (get-in db [:admin :company])
|
||||||
|
(dissoc :location)
|
||||||
|
(dissoc :new-account))]
|
||||||
|
|
||||||
|
{:db (assoc-in db [:admin :company :saving?] true)
|
||||||
|
:http {:method :put
|
||||||
|
:token (:user db)
|
||||||
|
:body (pr-str edited-company)
|
||||||
|
:headers {"Content-Type" "application/edn"}
|
||||||
|
:uri (str "/api/companies/" (:id edited-company))
|
||||||
|
:on-success [::save-complete]
|
||||||
|
:on-error [::save-error]}})))
|
||||||
|
|
||||||
|
(re-frame/reg-event-fx
|
||||||
|
::save-complete
|
||||||
|
(fn [{:keys [db]} [_ company]]
|
||||||
|
{:dispatch [::events/modal-completed :auto-ap.views.pages.admin.companies/edit]
|
||||||
|
:db (-> db
|
||||||
|
|
||||||
|
(assoc-in [:admin :company] nil)
|
||||||
|
(assoc-in [:companies (:id company)] company))}))
|
||||||
|
|
||||||
|
(re-frame/reg-event-db
|
||||||
|
::save-error
|
||||||
|
(fn [db [_ company]]
|
||||||
|
(-> db
|
||||||
|
(assoc-in [:admin :company :saving?] false)
|
||||||
|
(assoc-in [:admin :company :error] true))))
|
||||||
|
|
||||||
|
(re-frame/reg-event-db
|
||||||
|
::change
|
||||||
|
(fn [db [_ path value]]
|
||||||
|
(assoc-in db (concat [:admin :company] path)
|
||||||
|
value)))
|
||||||
|
|
||||||
(re-frame/reg-event-fx
|
(re-frame/reg-event-fx
|
||||||
::add-location
|
::add-location
|
||||||
(fn [{:keys [db]} _]
|
(fn [{:keys [db]} _]
|
||||||
@@ -20,6 +65,28 @@
|
|||||||
(update-in [:admin :company :locations] conj (:location company))
|
(update-in [:admin :company :locations] conj (:location company))
|
||||||
(update-in [:admin :company] dissoc :location))})))
|
(update-in [:admin :company] dissoc :location))})))
|
||||||
|
|
||||||
|
(re-frame/reg-event-fx
|
||||||
|
::add-new-bank-account
|
||||||
|
(fn [{:keys [db]} _]
|
||||||
|
(let [company (:company @(re-frame/subscribe [::subs/admin]))
|
||||||
|
new-bank-account (:new-account company)
|
||||||
|
new-bank-account (-> new-bank-account
|
||||||
|
(update :check-number #(if (seq %) (js/parseInt %) nil))
|
||||||
|
(update :yodlee-account-id #(if (seq %) (js/parseInt %) nil))
|
||||||
|
(assoc :is-new? true))]
|
||||||
|
{:db (-> db
|
||||||
|
(update-in [:admin :company :new-bank-accounts] (fn [bank-accounts]
|
||||||
|
(conj bank-accounts new-bank-account)))
|
||||||
|
(update-in [:admin :company] dissoc :new-account))})))
|
||||||
|
|
||||||
|
(re-frame/reg-event-db
|
||||||
|
::remove-new-bank-account
|
||||||
|
(fn [db [_ index]]
|
||||||
|
(update-in db [:admin :company :new-bank-accounts]
|
||||||
|
(fn [bas]
|
||||||
|
(vec (concat (take index bas)
|
||||||
|
(drop (inc index) bas)))))))
|
||||||
|
|
||||||
(defn companies-table []
|
(defn companies-table []
|
||||||
(let [companies (re-frame/subscribe [::subs/companies])
|
(let [companies (re-frame/subscribe [::subs/companies])
|
||||||
editing-company (:company @(re-frame/subscribe [::subs/admin]))]
|
editing-company (:company @(re-frame/subscribe [::subs/admin]))]
|
||||||
@@ -30,7 +97,7 @@
|
|||||||
[:th "Email"]]]
|
[:th "Email"]]]
|
||||||
[:tbody (for [{:keys [id name email] :as c} @companies]
|
[:tbody (for [{:keys [id name email] :as c} @companies]
|
||||||
^{:key (str name "-" id )}
|
^{:key (str name "-" id )}
|
||||||
[:tr {:on-click (fn [] (re-frame/dispatch [::events/edit id]))
|
[:tr {:on-click (fn [] (re-frame/dispatch [::edit id]))
|
||||||
:style {"cursor" "pointer"}}
|
:style {"cursor" "pointer"}}
|
||||||
[:td name]
|
[:td name]
|
||||||
[:td email]])]]))
|
[:td email]])]]))
|
||||||
@@ -47,7 +114,7 @@
|
|||||||
[action-modal {:id ::edit
|
[action-modal {:id ::edit
|
||||||
:title (str "Edit " (:name editing-company))
|
:title (str "Edit " (:name editing-company))
|
||||||
:action-text "Save"
|
:action-text "Save"
|
||||||
:save-event [::events/save]}
|
:save-event [::save]}
|
||||||
[horizontal-field
|
[horizontal-field
|
||||||
[:label.label "Name"]
|
[:label.label "Name"]
|
||||||
[:div.control
|
[:div.control
|
||||||
@@ -55,7 +122,7 @@
|
|||||||
[:input.input {:type "text"
|
[:input.input {:type "text"
|
||||||
:field :name
|
:field :name
|
||||||
:spec ::entity/name
|
:spec ::entity/name
|
||||||
:event ::events/change
|
:event ::change
|
||||||
:subscription editing-company}]]]]
|
:subscription editing-company}]]]]
|
||||||
|
|
||||||
[horizontal-field
|
[horizontal-field
|
||||||
@@ -65,22 +132,9 @@
|
|||||||
[:input.input {:type "email"
|
[:input.input {:type "email"
|
||||||
:field :email
|
:field :email
|
||||||
:spec ::entity/name
|
:spec ::entity/name
|
||||||
:event ::events/change
|
:event ::change
|
||||||
:subscription editing-company}]]]]
|
:subscription editing-company}]]]]
|
||||||
|
|
||||||
[:h2.subtitle "Address"]
|
|
||||||
|
|
||||||
[address-field {:field [:address]
|
|
||||||
:event ::events/change
|
|
||||||
:subscription editing-company}]
|
|
||||||
|
|
||||||
[horizontal-field
|
|
||||||
[:label.label "Bank Accounts"]
|
|
||||||
[:div.control
|
|
||||||
[:ul
|
|
||||||
(for [{:keys [number check-number id]} (:bank-accounts editing-company)]
|
|
||||||
^{:key id} [:li number " - " check-number])]]]
|
|
||||||
|
|
||||||
[horizontal-field
|
[horizontal-field
|
||||||
[:label.label "Locations"]
|
[:label.label "Locations"]
|
||||||
[:div.control
|
[:div.control
|
||||||
@@ -89,12 +143,91 @@
|
|||||||
[bind-field
|
[bind-field
|
||||||
[:input.input {:type "text"
|
[:input.input {:type "text"
|
||||||
:field :location
|
:field :location
|
||||||
:event ::events/change
|
:event ::change
|
||||||
:subscription editing-company}]]]
|
:subscription editing-company}]]]
|
||||||
[:p.control [:button.button.is-primary {:on-click (dispatch-event [::add-location])} "Add"]]]
|
[:p.control [:button.button.is-primary {:on-click (dispatch-event [::add-location])} "Add"]]]
|
||||||
[:ul
|
[:ul
|
||||||
(for [location (:locations editing-company)]
|
(for [location (:locations editing-company)]
|
||||||
^{:key location} [:li location ])]]]
|
^{:key location} [:li location ])]]]
|
||||||
|
[:h2.subtitle "Address"]
|
||||||
|
|
||||||
|
[address-field {:field [:address]
|
||||||
|
:event ::change
|
||||||
|
:subscription editing-company}]
|
||||||
|
[:h2.subtitle "Add account"]
|
||||||
|
|
||||||
|
[horizontal-field
|
||||||
|
[:label.label "Bank"]
|
||||||
|
[:div.control
|
||||||
|
|
||||||
|
[bind-field
|
||||||
|
[:input.input {:placeholder "Bank Name"
|
||||||
|
:type "text"
|
||||||
|
:field [:new-account :bank-name]
|
||||||
|
:event ::change
|
||||||
|
:subscription editing-company}]]]
|
||||||
|
[:div.control
|
||||||
|
|
||||||
|
[bind-field
|
||||||
|
[:input.input {:placeholder "Routing"
|
||||||
|
:type "text"
|
||||||
|
:field [:new-account :routing]
|
||||||
|
:event ::change
|
||||||
|
:subscription editing-company}]]]
|
||||||
|
[:div.control
|
||||||
|
|
||||||
|
[bind-field
|
||||||
|
[:input.input {:placeholder "Code"
|
||||||
|
:type "text"
|
||||||
|
:field [:new-account :bank-code]
|
||||||
|
:event ::change
|
||||||
|
:subscription editing-company}]]]]
|
||||||
|
[horizontal-field
|
||||||
|
[:label.label "Account"]
|
||||||
|
[:div.control
|
||||||
|
[bind-field
|
||||||
|
[:input.input {:placeholder "Nickname"
|
||||||
|
:type "text"
|
||||||
|
:field [:new-account :name]
|
||||||
|
:event ::change
|
||||||
|
:subscription editing-company}]]]
|
||||||
|
[:div.control
|
||||||
|
[bind-field
|
||||||
|
[:input.input {:placeholder "Acct #"
|
||||||
|
:type "text"
|
||||||
|
:field [:new-account :number]
|
||||||
|
:event ::change
|
||||||
|
:subscription editing-company}]]]
|
||||||
|
[:div.control
|
||||||
|
[bind-field
|
||||||
|
[:input.input {:placeholder "Check #"
|
||||||
|
:type "text"
|
||||||
|
:field [:new-account :check-number]
|
||||||
|
:event ::change
|
||||||
|
:subscription editing-company}]]]]
|
||||||
|
[horizontal-field
|
||||||
|
[:label.label "Yodlee Account"]
|
||||||
|
[:div.control
|
||||||
|
[bind-field
|
||||||
|
[:input.input {:placeholder "Yodlee Account #"
|
||||||
|
:type "text"
|
||||||
|
:field [:new-account :yodlee-account-id]
|
||||||
|
:event ::change
|
||||||
|
:subscription editing-company}]]]
|
||||||
|
[:div.control
|
||||||
|
[:button.button.is-primary.is-pulled-right {:on-click (dispatch-event [::add-new-bank-account])} "Add"]]]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
[:h2.subtitle "Bank Accounts"]
|
||||||
|
[horizontal-field
|
||||||
|
nil
|
||||||
|
[:div.control
|
||||||
|
[:ul
|
||||||
|
|
||||||
|
(for [{:keys [name number check-number id]} (:bank-accounts editing-company)]
|
||||||
|
^{:key id} [:li name])
|
||||||
|
(for [[index {:keys [name number check-number]}] (map vector (range) (:new-bank-accounts editing-company))]
|
||||||
|
^{:key index} [:li [:strong "* " name] [:button.button {:on-click (dispatch-event [::remove-new-bank-account index])} [:span.icon [:i.fa.fa-times]]]])]]]
|
||||||
|
|
||||||
(when (:saving? editing-company) [:div.is-overlay {:style {"backgroundColor" "rgba(150,150,150, 0.5)"}}])]])])
|
(when (:saving? editing-company) [:div.is-overlay {:style {"backgroundColor" "rgba(150,150,150, 0.5)"}}])]])])
|
||||||
|
|||||||
Reference in New Issue
Block a user