Supports vendors not loading

This commit is contained in:
2022-04-11 17:26:03 -07:00
parent e4da1376f8
commit 2e4e693bc6
19 changed files with 412 additions and 657 deletions

View File

@@ -13,9 +13,8 @@
(re-frame/reg-sub
::filters
:<- [::specific-filters]
:<- [::subs/vendors-by-id]
:<- [::subs/query-params]
(fn [[specific-filters vendors-by-id query-params] ]
(fn [[specific-filters query-params] ]
(let [url-filters (-> query-params
(select-keys #{:name-like :code-like})
(update :name-like #(some-> % str))

View File

@@ -1,26 +1,22 @@
(ns auto-ap.views.pages.admin.rules
(:require [auto-ap.forms :as forms]
[auto-ap.subs :as subs]
[auto-ap.views.components.admin.side-bar :refer [admin-side-bar]]
[auto-ap.views.pages.admin.rules.side-bar :as 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.results-modal :as results-modal]
[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]]
[vimsical.re-frame.cofx.inject :as inject]
[vimsical.re-frame.fx.track :as track]
[auto-ap.events :as events]
[auto-ap.utils :refer [replace-by merge-by]]
[re-frame.core :as re-frame]
[auto-ap.status :as status]
[auto-ap.effects.forward :as forward]
[auto-ap.views.pages.data-page :as data-page]
[clojure.set :as set]
[auto-ap.views.components.buttons :as buttons]))
(:require
[auto-ap.effects.forward :as forward]
[auto-ap.events :as events]
[auto-ap.forms :as forms]
[auto-ap.subs :as subs]
[auto-ap.views.components.admin.side-bar :refer [admin-side-bar]]
[auto-ap.views.components.buttons :as buttons]
[auto-ap.views.components.layouts
:refer [appearing-side-bar side-bar-layout]]
[auto-ap.views.pages.admin.rules.common :refer [default-read]]
[auto-ap.views.pages.admin.rules.form :as form]
[auto-ap.views.pages.admin.rules.side-bar :as side-bar]
[auto-ap.views.pages.admin.rules.table :as table]
[auto-ap.views.pages.data-page :as data-page]
[auto-ap.views.utils :refer [dispatch-event with-user]]
[clojure.set :as set]
[re-frame.core :as re-frame]
[vimsical.re-frame.fx.track :as track]))
;; EVENTS
@@ -29,7 +25,7 @@
(re-frame/reg-event-fx
::params-change
[with-user ]
(fn [{:keys [db user] :as cofx} [_ params]]
(fn [{:keys [user]} [_ params]]
{:graphql {:token user
:owns-state {:single [::data-page/page ::page]}
:query-obj {:venia/queries [{:query/data [:transaction_rule_page
@@ -52,13 +48,13 @@
(re-frame/reg-event-fx
::new-rule-clicked
(fn [{:keys [db]} _]
(fn [_ _]
{:dispatch [::form/adding {:client @(re-frame/subscribe [::subs/client])}]}))
(re-frame/reg-event-fx
::mounted
(fn [{:keys [db]}]
(fn [_]
{:dispatch-n [[::events/yodlee-merchants-needed]]
::forward/register [{:id ::page
:events #{::form/updated}
@@ -75,7 +71,7 @@
(re-frame/reg-event-fx
::unmounted
(fn [{:keys [db]}]
(fn [_]
{:dispatch [::data-page/dispose ::page]
::forward/dispose [{:id ::page}
{:id ::deleted-transaction-rule}]
@@ -85,8 +81,7 @@
(def rules-content
(with-meta
(fn []
(let [current-client @(re-frame/subscribe [::subs/client])
user @(re-frame/subscribe [::subs/user])]
(let [user @(re-frame/subscribe [::subs/user])]
[:div
[:h1.title "Transaction Rules"]
(when (= "admin" (:user/role user))

View File

@@ -1,20 +1,17 @@
(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]))
(:require
[auto-ap.status :as status]
[auto-ap.subs :as subs]
[auto-ap.views.components.buttons :as buttons]
[auto-ap.views.components.grid :as grid]
[auto-ap.views.components.modal :as modal]
[auto-ap.views.pages.admin.rules.form :as form]
[auto-ap.views.pages.admin.rules.results-modal :as results-modal]
[auto-ap.views.pages.data-page :as data-page]
[auto-ap.views.utils
:refer [->$ action-cell-width dispatch-event with-user]]
[re-frame.core :as re-frame]
[reagent.core :as r]))
(re-frame/reg-event-fx
::run-clicked

View File

@@ -1,93 +1,76 @@
(ns auto-ap.views.pages.admin.vendors
(:require [re-frame.core :as re-frame]
[reagent.core :as reagent]
[clojure.string :as str]
[auto-ap.views.components.buttons :as buttons]
[auto-ap.views.pages.admin.vendors.side-bar :as side-bar]
[auto-ap.subs :as subs]
[auto-ap.events :as events]
[auto-ap.forms :as forms]
[auto-ap.utils :refer [by]]
[auto-ap.entities.vendors :as entity]
[auto-ap.views.components.address :refer [address-field]]
[auto-ap.views.components.grid :as grid]
[auto-ap.views.components.admin.side-bar :refer [admin-side-bar]]
[auto-ap.views.components.layouts :refer [side-bar-layout]]
[clojure.spec.alpha :as s]
[auto-ap.views.utils :refer [login-url dispatch-value-change dispatch-event bind-field horizontal-field action-cell-width]]
[auto-ap.views.pages.admin.vendors.table :as table]
[auto-ap.views.pages.admin.vendors.merge-dialog :as merge-dialog]
[cljs.reader :as edn]
[auto-ap.routes :as routes]
[bidi.bidi :as bidi]
[auto-ap.status :as status]
[vimsical.re-frame.fx.track :as track]
[auto-ap.effects.forward :as forward])
(:require-macros [cljs.core.async.macros :refer [go]]
[auto-ap.entities.vendors :as vendor]))
(:require
[auto-ap.effects.forward :as forward]
[auto-ap.subs :as subs]
[auto-ap.views.components.admin.side-bar :refer [admin-side-bar]]
[auto-ap.views.components.layouts :refer [side-bar-layout]]
[auto-ap.views.pages.admin.vendors.merge-dialog :as merge-dialog]
[auto-ap.views.pages.admin.vendors.side-bar :as side-bar]
[auto-ap.views.pages.admin.vendors.table :as table]
[auto-ap.views.pages.data-page :as data-page]
[auto-ap.views.utils :refer [dispatch-event with-user]]
[clojure.set :as set]
[re-frame.core :as re-frame]
[vimsical.re-frame.fx.track :as track]
[auto-ap.views.components.vendor-dialog :as vendor-dialog]))
(re-frame/reg-event-fx
::invalidated
(fn [{:keys [db]}]
{:graphql {:token (:user db)
:owns-state {:single ::vendor-page}
:query-obj {:venia/queries [[:vendor events/vendor-query]]}
:on-success [::received-vendors]}}))
(re-frame/reg-event-fx
::mounted
(fn [{:keys [db]} _]
{:dispatch [::invalidated]
::track/register {:id ::params
:subscription [::params]
:event-fn (fn [params] [::params-change params])}
::forward/register {:id ::merge-complete
:events #{::merge-dialog/complete}
:event-fn (fn [_]
[::invalidated])}}))
(re-frame/reg-event-db
::received-vendors
(fn [db [_ vendors]]
(assoc db :vendors (by :id (:vendor vendors )))))
(re-frame/reg-event-fx
::unmounted
(fn [{:keys [db]} _]
{:db (dissoc db ::table/params ::side-bar/filter-params)
::forward/dispose {:id ::merge-complete}
::track/dispose {:id ::params}}))
(re-frame/reg-sub
::params
:<- [::side-bar/filter-params]
:<- [::table/params]
(fn [[filter-params table-params]]
(cond-> {}
(seq filter-params) (merge filter-params)
(seq table-params) (merge table-params))))
(def default-read [:id :name :hidden :terms [:default-account [:name :id :location]]
[:account-overrides [[:client [:id :name]] :id [:account [:id :numeric-code :name]]]]
[:automatically-paid-when-due [:id :name]]
[:terms-overrides [[:client [:id :name]] :id :terms]]
[:schedule-payment-dom [[:client [:id :name]] :id :dom]]
[:usage [:client-id :count]]
[:primary-contact [:name :phone :email :id]]
[:secondary-contact [:id :name :phone :email]]
:print-as :invoice-reminder-schedule :code
:legal-entity-first-name :legal-entity-middle-name :legal-entity-last-name
:legal-entity-tin :legal-entity-tin-type
:legal-entity-1099-type
[:address [:street1 :street2 :city :state :zip]]])
(re-frame/reg-event-fx
::params-change
(fn [_ [_ params]]
{:set-uri-params params}))
(re-frame/reg-sub
::vendor-page
:<- [::params]
:<- [::subs/sorted-all-vendors]
(fn [[params all-vendors]]
(let [matching-vendors (cond->> all-vendors
(:name-like params) (filter #(str/includes? (str/lower-case (or (:name %) ""))
(str/lower-case (:name-like params)))))]
(assoc (grid/virtual-paginate-controls (:start params ) (:per-page params) matching-vendors)
:data (grid/virtual-paginate (:start params) (:per-page params) matching-vendors)))))
[with-user]
(fn [{:keys [user]} [_ params]]
{:graphql {:token user
:owns-state {:single [::data-page/page ::page]}
:query-obj {:venia/queries [{:query/data [:vendor
{:sort (:sort params)
:start (:start params 0)
:per-page (:per-page params)
:name-like (:name-like params)}
[[:vendors default-read]
:total
:start
:end]]
:query/alias :result}]}
:on-success (fn [result]
[::data-page/received ::page
(set/rename-keys (:result result)
{:vendors :data})])}}))
(re-frame/reg-event-fx
::mounted
(fn [_ _]
{::forward/register [{:id ::merge-complete
:events #{::merge-dialog/complete}
:event-fn (fn [_]
[::params-change {}])}
{:id ::save-complete
:events #{::vendor-dialog/save-complete}
:event-fn (fn [_]
[::params-change {}])}]
::track/register {:id ::params
:subscription [::data-page/params ::page]
:event-fn (fn [params]
[::params-change params])}}))
(re-frame/reg-event-fx
::unmounted
(fn [_ _]
{:dispatch [::data-page/dispose ::page]
::forward/dispose [{:id ::merge-complete} {:id ::save-complete}]
::track/dispose {:id ::params}}))
(defn admin-vendors-content []
[(with-meta
@@ -95,17 +78,15 @@
[:div.inbox-messages
(when-let [banner (:banner @(re-frame/subscribe [::subs/admin]))]
[:div.notification banner])
(let [vendors (re-frame/subscribe [::subs/vendors])
editing-vendor (:vendor @(re-frame/subscribe [::subs/admin]))]
[:div
[:h1.title "Vendors"]
[:div.is-pulled-right [:a.button.is-primary.is-outlined {:on-click (dispatch-event [::merge-dialog/show])} "Merge vendors"]]
[table/vendors-table {:page @(re-frame/subscribe [::vendor-page])
:status @(re-frame/subscribe [::status/single ::vendor-page])}]])])
[:div
[:h1.title "Vendors"]
[:div.is-pulled-right [:a.button.is-primary.is-outlined {:on-click (dispatch-event [::merge-dialog/show])} "Merge vendors"]]
[table/vendors-table {:id :vendors
:data-page ::page}]]])
{:component-did-mount #(re-frame/dispatch [::mounted])
:component-will-unmount #(re-frame/dispatch-sync [::unmounted])})])
(defn admin-vendors-page []
[side-bar-layout {:side-bar [admin-side-bar {}
[side-bar/vendor-side-bar]]
[side-bar/vendor-side-bar {:data-page ::page}]]
:main [admin-vendors-content]}])

View File

@@ -0,0 +1,15 @@
(ns auto-ap.views.pages.admin.vendors.common)
(def default-read [:id :name :hidden :terms [:default-account [:name :id :location]]
[:account-overrides [[:client [:id :name]] :id [:account [:id :numeric-code :name]]]]
[:automatically-paid-when-due [:id :name]]
[:terms-overrides [[:client [:id :name]] :id :terms]]
[:schedule-payment-dom [[:client [:id :name]] :id :dom]]
[:usage [:client-id :count]]
[:primary-contact [:name :phone :email :id]]
[:secondary-contact [:id :name :phone :email]]
:print-as :invoice-reminder-schedule :code
:legal-entity-first-name :legal-entity-middle-name :legal-entity-last-name
:legal-entity-tin :legal-entity-tin-type
:legal-entity-1099-type
[:address [:street1 :street2 :city :state :zip]]])

View File

@@ -2,69 +2,17 @@
(:require
[re-frame.core :as re-frame]
[auto-ap.subs :as subs]
[auto-ap.views.utils :refer [active-when dispatch-value-change]]))
(re-frame/reg-sub
::specific-filters
(fn [db ]
(::filters db nil)))
(re-frame/reg-sub
::filters
:<- [::specific-filters]
:<- [::subs/vendors-by-id]
:<- [::subs/query-params]
(fn [[specific-filters vendors-by-id query-params] ]
(let [url-filters (-> query-params
(select-keys #{:name-like})
(update :name-like #(some-> % str)))]
(merge url-filters specific-filters ))))
(re-frame/reg-sub
::filter
:<- [::filters]
(fn [filters [_ which]]
(get filters which)))
(re-frame/reg-sub
::settled-filters
(fn [db ]
(::settled-filters db)))
(re-frame/reg-sub
::filter-params
:<- [::settled-filters]
:<- [::filters]
:<- [::subs/active-page]
(fn [[settled-filters filters ap ]]
(let [filters (or settled-filters filters)]
{:name-like (:name-like filters)})))
(re-frame/reg-event-fx
::filters-settled
(fn [{:keys [db]} [_ & params]]
{:db (assoc db ::settled-filters @(re-frame/subscribe [::filters]))}))
(re-frame/reg-event-fx
::filter-changed
(fn [{:keys [db]} [_ & params]]
(let [[a b c] params
[which val] (if (= 3 (count params))
[(into [a] b) c]
[[a] b])]
{:db (assoc-in db (into [::filters] which) val)
:dispatch-debounce {:event [::filters-settled]
:time 800
:key ::filters}})))
[auto-ap.views.utils :refer [dispatch-value-change]]
[auto-ap.views.pages.data-page :as data-page]))
(defn vendor-side-bar []
(defn vendor-side-bar [{:keys [data-page]}]
[:div
[:p.menu-label "Name"]
[:div.field
[:div.control [:input.input {:placeholder "Harry's Food Products"
:value @(re-frame/subscribe [::filter :name-like])
:on-change (dispatch-value-change [::filter-changed :name-like])} ]]]])
[:div
[:div.field
[:div.control [:input.input {:placeholder "HOME DEPOT"
:value @(re-frame/subscribe [::data-page/filter data-page :name-like])
:on-change (dispatch-value-change [::data-page/filter-changed data-page :name-like])} ]]]]])

View File

@@ -1,34 +1,21 @@
(ns auto-ap.views.pages.admin.vendors.table
(:require
[re-frame.core :as re-frame]
[reagent.core :as reagent]
(:require
[auto-ap.subs :as subs]
[auto-ap.status :as status]
[auto-ap.views.components.vendor-dialog :refer [vendor-dialog] :as vendor-dialog]
[auto-ap.views.components.buttons :as buttons]
[auto-ap.views.components.grid :as grid]
[auto-ap.views.utils :refer [login-url dispatch-value-change dispatch-event bind-field horizontal-field action-cell-width]]
[auto-ap.views.components.buttons :as buttons]))
[auto-ap.views.components.vendor-dialog :as vendor-dialog]
[auto-ap.views.pages.data-page :as data-page]
[auto-ap.views.utils :refer [action-cell-width]]
[re-frame.core :as re-frame]))
(re-frame/reg-event-fx
::params-changed
(fn [{:keys [db]} [_ p]]
{:db (assoc db ::params p)}))
(re-frame/reg-sub
::params
(fn [db]
(-> db ::params)))
(defn vendors-table [{:keys [status page]}]
(let [params @(re-frame/subscribe [::params])
(defn vendors-table [{:keys [data-page]}]
(let [{:keys [data]} @(re-frame/subscribe [::data-page/page data-page])
accounts @(re-frame/subscribe [::subs/all-accounts-by-id])]
(println "DATA COUNT" (keys data))
[grid/grid {:status status
:on-params-change (fn [p]
(re-frame/dispatch [::params-changed p]))
:params params
[grid/grid {:data-page data-page
:column-count 4}
[grid/controls page]
[grid/controls data]
[grid/table {:fullwidth true}
[grid/header
[grid/row {}
@@ -37,7 +24,7 @@
[grid/header-cell {} "Default Account"]
[grid/header-cell {:style {:width (action-cell-width 1)}}]]]
[grid/body
(for [v (:data page)]
(for [v (:data data)]
^{:key (str (:id v))}
[grid/row {:class (:class v) :id (:id v)}
[grid/cell {} (:name v)

View File

@@ -3,18 +3,17 @@
[auto-ap.subs :as subs]
[auto-ap.views.components.grid :as grid]
[auto-ap.views.components.layouts :refer [side-bar-layout]]
[auto-ap.views.components.typeahead :refer [typeahead-v3]]
[auto-ap.history :refer [history]]
[cemerick.url :as url]
[auto-ap.views.utils
:refer
[->$ date->str days-until dispatch-event local-now standard]]
[bidi.bidi :as bidi]
[cljs-time.coerce :as coerce]
[cljs-time.core :as t]
[clojure.string :as str]
[pushy.core :as pushy]
[re-frame.core :as re-frame]
[recharts]
[downshift :as ds :refer [useCombobox]]
[reagent.core :as r]
[react]))
@@ -39,7 +38,7 @@
:data data
:dataKey "value"
:inner-radius 20}
(map (fn [x y]
(map (fn [_ y]
^{:key y}
[cell {:key y :fill (colors y)}]) data (range))
]
@@ -57,7 +56,7 @@
(defn make-cash-flow-chart [{:keys [width height data] }]
(let [redirect-fn (fn [x]
(pushy/set-token! auto-ap.history/history (str (bidi/path-for routes/routes :unpaid-invoices) "?" (get (js->clj x) "query-params")))
(pushy/set-token! history (str (bidi/path-for routes/routes :unpaid-invoices) "?" (get (js->clj x) "query-params")))
)]
[bar-chart {:width width :height height :data data :fill "#FFFFFF" :stackOffset "sign"}
[tool-tip]
@@ -161,29 +160,29 @@
(fn [[{:keys [effective-balance credits-yesterday] } :as acc] day]
(let [invoices-due-today (invoices-due-soon (date->str (t/plus start-date (t/days day))) 0.0)
credits-due-today (upcoming-credits (date->str (t/plus start-date (t/days day))) 0.0)
debits-due-today (upcoming-debits (date->str (t/plus start-date (t/days day))) 0.0)]
(let [today (t/plus start-date (t/days day))]
(conj acc
{:name (date->str today)
:date today
:effective-balance (+ (- effective-balance invoices-due-today )
debits-due-today
credits-yesterday)
:credits-yesterday credits-due-today
:credits credits-due-today
:debits debits-due-today
:invoices (- invoices-due-today)
:query-params (cemerick.url/map->query {:due-range {:start (date->str today standard)
:end (date->str today standard)}})}))))
(list {:name (date->str start-date)
:date start-date
:effective-balance effective-balance
:invoices (- (invoices-due-soon (date->str start-date) 0.0))
:credits (upcoming-credits (date->str start-date) 0.0)
:credits-yesterday (upcoming-credits (date->str start-date) 0.0)
:debits (upcoming-debits (date->str start-date) 0.0)
debits-due-today (upcoming-debits (date->str (t/plus start-date (t/days day))) 0.0)
today (t/plus start-date (t/days day))]
(conj acc
{:name (date->str today)
:date today
:effective-balance (+ (- effective-balance invoices-due-today )
debits-due-today
credits-yesterday)
:credits-yesterday credits-due-today
:credits credits-due-today
:debits debits-due-today
:invoices (- invoices-due-today)
:query-params (url/map->query {:due-range {:start (date->str today standard)
:end (date->str today standard)}})})))
(list {:name (date->str start-date)
:date start-date
:effective-balance effective-balance
:invoices (- (invoices-due-soon (date->str start-date) 0.0))
:credits (upcoming-credits (date->str start-date) 0.0)
:credits-yesterday (upcoming-credits (date->str start-date) 0.0)
:debits (upcoming-debits (date->str start-date) 0.0)
:outstanding-payments (- outstanding-payments)
:query-params (cemerick.url/map->query {:due-range {:end (date->str start-date standard)}})})
:query-params (url/map->query {:due-range {:end (date->str start-date standard)}})})
(condp = (:cash-flow-range chart-options)
:seven-days
(range 1 7)
@@ -210,9 +209,8 @@
::cash-flow-page
:<- [::cash-flow-table-params]
:<- [::cash-flow-data]
:<- [::subs/vendors-by-id]
(fn [[params cash-flow-data vendors-by-id]]
(let [ {:keys [outstanding-payments invoices-due-soon upcoming-credits upcoming-debits]} cash-flow-data
(fn [[params cash-flow-data]]
(let [ {:keys [invoices-due-soon upcoming-credits upcoming-debits]} cash-flow-data
rows (concat (map (fn [c]
{:date (:date c)
:days-until (days-until (:date c))
@@ -230,7 +228,7 @@
{:date (:due c)
:days-until (days-until (:due c))
:amount (:outstanding-balance c)
:name (str (:name (get vendors-by-id (:id (:vendor c)))) " (" (:invoice-number c) ")")
:name (str (:name (:vendor c)) " (" (:invoice-number c) ")")
:type "Invoice"})
invoices-due-soon))]
(assoc (grid/virtual-paginate-controls (:start params ) (:per-page params) rows)
@@ -253,7 +251,7 @@
{:client-id (:id @(re-frame/subscribe [::subs/client]))}
[:beginning-balance
:outstanding-payments
[:invoices-due-soon [:due :outstanding-balance [:vendor [:id]] :invoice-number]]
[:invoices-due-soon [:due :outstanding-balance [:vendor [:id :name]] :invoice-number]]
[:upcoming-credits [:date :amount :identifier]]
[:upcoming-debits [:date :amount :identifier]]]]]}
:on-success [::received]}}))
@@ -300,8 +298,6 @@
(defn home-content []
(let [client-id (-> @(re-frame/subscribe [::subs/client]) :id)
accounts-by-id @(re-frame/subscribe [::subs/accounts-by-id])
accounts-index @(re-frame/subscribe [::subs/accounts-index])
chart-options @(re-frame/subscribe [::chart-options])]
^{:key client-id}
[side-bar-layout {:side-bar [:div

View File

@@ -1,75 +0,0 @@
(ns auto-ap.views.pages.new-invoice
(:require [re-frame.core :as re-frame]
[auto-ap.subs :as subs]
[auto-ap.events :as events]))
(defn new-invoice-page []
(let [form-data (re-frame/subscribe [::subs/new-invoice-form])]
[:div
[:form
[:h1.title "New InvoiceR"]
[:div.field
[:label.label "Vendor"]
[:div.control
[:input.input {:type "text"
:auto-focus true
:placeholder "CINTAS"
:value (:vendor @form-data)
:on-change (fn [e]
(re-frame/dispatch [::events/change-form-state
[:new-invoice :vendor]
(.. e -target -value)]))}]]]
[:div.field
[:label.label "Customer"]
[:div.control
[:input.input {:type "text"
:placeholder "Brown Chicken Brown Cow"
:value (:client @form-data)
:on-change (fn [e]
(re-frame/dispatch [::events/change-form-state
[:new-invoice :client]
(.. e -target -value)]))}]]]
[:div.field
[:label.label "Invoice #"]
[:div.control
[:input.input {:type "text"
:placeholder "12345"
:value (:invoice-number @form-data)
:on-change (fn [e]
(re-frame/dispatch [::events/change-form-state
[:new-invoice :invoice-number]
(.. e -target -value)]))}]]]
[:div.field
[:label.label "Date"]
[:div.control
[:input.input {:type "text"
:placeholder "11/11/2011"
:value (:date @form-data)
:on-change (fn [e]
(re-frame/dispatch [::events/change-form-state
[:new-invoice :date]
(.. e -target -value)]))}]]]
[:div.field
[:label.label "Total"]
[:div.control
[:input.input {:type "text"
:placeholder "$14.50"
:value (:total @form-data)
:on-change (fn [e]
(re-frame/dispatch [::events/change-form-state
[:new-invoice :total]
(.. e -target -value)]))}]]]
[:div.control
[:submit.button.is-large.is-primary {
:disabled (if (and (:total @form-data) (:date @form-data) (:client @form-data) (:invoice-number @form-data)
(:vendor @form-data))
""
"disabled")
:on-click
(fn [x]
(.preventDefault x)
(re-frame/dispatch [::events/submit-new-invoice @form-data]))}
[:span
(when (:loading? @form-data)
[:i.fa.fa-spin.fa-spinner])
"Save"]]]]]))

View File

@@ -8,13 +8,18 @@
:as expense-accounts-field
:refer [expense-accounts-field]]
[auto-ap.views.components.modal :as modal]
[auto-ap.views.components.typeahead :refer [typeahead-v3]]
[auto-ap.views.components.typeahead.vendor
:refer [search-backed-typeahead]]
[auto-ap.views.pages.data-page :as data-page]
[auto-ap.views.pages.transactions.common
:refer [data-params->query-params]]
[auto-ap.views.utils :refer [dispatch-event with-user]]
[clojure.string :as str]
[re-frame.core :as re-frame]
[auto-ap.views.pages.data-page :as data-page]))
[reagent.core :as r]
[vimsical.re-frame.fx.track :as track]
[auto-ap.events :as events]
[vimsical.re-frame.cofx.inject :as inject]))
(re-frame/reg-sub
::can-submit
@@ -31,8 +36,8 @@
(re-frame/reg-event-fx
::code-selected
[with-user (forms/in-form ::form) ]
(fn [{:keys [user db]} [_ checked]]
[with-user (forms/in-form ::form) (re-frame/inject-cofx ::inject/sub [::subs/client])]
(fn [{:keys [user db] ::subs/keys [client]} [_ checked]]
(let [checked-params (get checked "header")
specific-transactions (map :id (vals (dissoc checked "header")))
data (:data db)]
@@ -43,6 +48,7 @@
:operation/name "BulkCodeTransactions"}
:venia/queries [[:bulk-code-transactions
{:filters (some-> checked-params data-params->query-params)
:client_id (:id client)
:ids specific-transactions
:vendor (:id (:vendor data))
:approval-status (:transaction-approval-status data)
@@ -67,33 +73,56 @@
::changed
(forms/change-handler ::form
(fn [data field value]
(cond (and (= [:vendor] field)
(cond (and (= [:vendor-preferences] field)
value)
[[:accounts] (expense-accounts-field/default-account (:accounts data)
@(re-frame/subscribe [::subs/vendor-default-account (:id value) (:client data)])
(:default-account value)
(:total data)
[])]
:else
[]))))
(re-frame/reg-event-fx
::changed-vendor
[(forms/in-form ::form)]
(fn [{{{:keys [client]} :data} :db} [_ vendor]]
(when (and (:id client) (:id vendor))
{:dispatch [::events/vendor-preferences-requested {:client-id (:id client)
:vendor-id (:id vendor)
:on-success [::changed [:vendor-preferences]]
:on-failure [:hello]}]})))
(re-frame/reg-event-fx
::mounted
(fn []
{::track/register {:id ::vendor-change
:subscription [::forms/field ::form [:vendor]]
:event-fn (fn [v]
[::changed-vendor v])}}))
(re-frame/reg-event-fx
::unmounted
(fn []
{::track/dispose {:id ::vendor-change}}))
(def code-form (forms/vertical-form {:submit-event [::code-selected]
:change-event [::changed]
:can-submit [::can-submit]
:id ::form}))
(defn form []
:change-event [::changed]
:can-submit [::can-submit]
:id ::form}))
(defn form-content [_]
(let [{:keys [data]} @(re-frame/subscribe [::forms/form ::form])
{:keys [form-inline field]} code-form
]
{:keys [form-inline field]} code-form]
(form-inline {}
[:<>
(field "Vendor"
[typeahead-v3 {:entities-by-id @(re-frame/subscribe [::subs/vendors-by-id])
:entity-index @(re-frame/subscribe [::subs/searchable-vendors-index])
:entity->text :name
:type "typeahead-v3"
:auto-focus true
:field [:vendor]}])
[search-backed-typeahead {:search-query (fn [i]
[:search_vendor
{:query i}
[:name :id]])
:type "typeahead-v3"
:auto-focus true
:field [:vendor]}])
(field "Approval Status"
[button-radio
@@ -115,6 +144,13 @@
:field [:accounts]}])
{:key (some-> data :vendor :id str)})
])))
(defn form [_]
(r/create-class
{:display-name "transaction-bulk-update-form"
:component-did-mount #(re-frame/dispatch [::mounted])
:component-will-unmount #(re-frame/dispatch [::unmounted])
:reagent-render (fn [p]
[form-content p])}))
(re-frame/reg-event-fx
::code-requested

View File

@@ -1,23 +1,25 @@
(ns auto-ap.views.pages.transactions.form
(:require [auto-ap.forms :as forms]
[auto-ap.status :as status]
[auto-ap.subs :as subs]
[auto-ap.views.components.button-radio :refer [button-radio]]
[auto-ap.views.components.expense-accounts-field
:as
expense-accounts-field
:refer
[expense-accounts-field]]
[auto-ap.views.components.layouts :as layouts]
[auto-ap.views.components.typeahead :refer [typeahead-v3]]
[auto-ap.views.pages.transactions.common :refer [transaction-read]]
[auto-ap.views.utils
:refer
[->$ date->str dispatch-event pretty with-user]]
[clojure.string :as str]
[re-frame.core :as re-frame]
[react :as react]
[reagent.core :as r]))
(:require
[auto-ap.forms :as forms]
[auto-ap.status :as status]
[auto-ap.subs :as subs]
[auto-ap.views.components.button-radio :refer [button-radio]]
[auto-ap.views.components.expense-accounts-field
:as expense-accounts-field
:refer [expense-accounts-field]]
[auto-ap.views.components.layouts :as layouts]
[auto-ap.views.components.typeahead :refer [typeahead-v3]]
[auto-ap.views.components.typeahead.vendor
:refer [search-backed-typeahead]]
[auto-ap.views.pages.transactions.common :refer [transaction-read]]
[auto-ap.views.utils
:refer [->$ date->str dispatch-event pretty with-user]]
[clojure.string :as str]
[re-frame.core :as re-frame]
[react :as react]
[reagent.core :as r]
[vimsical.re-frame.fx.track :as track]
[auto-ap.events :as events]))
;; SUBS
(re-frame/reg-sub
@@ -76,11 +78,11 @@
(forms/change-handler ::form
(fn [data field value]
(let [locations @(re-frame/subscribe [::subs/locations-for-client (:id (:client data))])]
(if (and (= [:vendor] field)
(if (and (= [:vendor-preferences] field)
value
(expense-accounts-field/can-replace-with-default? (:accounts data)))
[[:accounts] (expense-accounts-field/default-account (:accounts data)
@(re-frame/subscribe [::subs/vendor-default-account (:id value) (:client data)])
(:default-account (:vendor-preferences data))
(:amount data)
locations)]
[])))))
@@ -185,17 +187,28 @@
{}))
(re-frame/reg-event-db
::manual-match
[(forms/in-form ::form)]
(fn [edit-transaction]
(update-in edit-transaction [:data] dissoc :potential-payment-matches)))
(re-frame/reg-event-fx
::changed-vendor
[(forms/in-form ::form)]
(fn [{{{:keys [client]} :data} :db} [_ vendor]]
(when (and (:id client) (:id vendor))
{:dispatch [::events/vendor-preferences-requested {:client-id (:id client)
:vendor-id (:id vendor)
:on-success [::changed [:vendor-preferences]]
:on-failure [:hello]}]})))
(re-frame/reg-event-db
::transaction-rule-closed
[(forms/in-form ::form)]
(fn [edit-transaction]
(update-in edit-transaction [:data] dissoc :potential-transaction-rule-matches)))
(re-frame/reg-event-fx
::mounted
(fn []
{::track/register {:id ::vendor-change
:subscription [::forms/field ::form [:vendor]]
:event-fn (fn [v]
[::changed-vendor v])}}))
(re-frame/reg-event-fx
::unmounted
(fn []
{::track/dispose {:id ::vendor-change}}))
;; VIEWS
@@ -324,7 +337,7 @@
[:a {:on-click (fn [] (on-tab-clicked (:key props)))} (:title props)]])))])
(defn form [_]
(defn form-content [_]
[layouts/side-bar {:on-close (dispatch-event [::forms/form-closing ::form])}
(let [{:keys [data] } @(re-frame/subscribe [::forms/form ::form])
locations @(re-frame/subscribe [::subs/locations-for-client (:id (:client data))])
@@ -404,14 +417,15 @@
[tab {:title "Details" :key :details}
[:div
(field "Vendor"
[typeahead-v3 {:entities-by-id @(re-frame/subscribe [::subs/vendors-by-id])
:entity-index @(re-frame/subscribe [::subs/searchable-vendors-index])
:entity->text :name
:type "typeahead-v3"
:auto-focus true
:field [:vendor]
:disabled (or (boolean (:payment data))
should-disable-for-client?)}])
[search-backed-typeahead {:search-query (fn [i]
[:search_vendor
{:query i}
[:name :id]])
:type "typeahead-v3"
:auto-focus true
:field [:vendor]
:disabled (or (boolean (:payment data))
should-disable-for-client?)}])
(with-meta
(field nil
[expense-accounts-field
@@ -442,3 +456,11 @@
(when-not should-disable-for-client?
(submit-button "Save"))]]]])
{:key (:id data)}))])
(defn form [_]
(r/create-class
{:display-name "transaction-form"
:component-did-mount #(re-frame/dispatch [::mounted])
:component-will-unmount #(re-frame/dispatch [::unmounted])
:reagent-render (fn [p]
[form-content p])}))

View File

@@ -40,6 +40,9 @@
:which (:id which)}
:query-obj {:venia/queries
(cond-> [{:query/data [:potential-payment-matches
{:transaction_id (:id which)}
[:id :memo :check-number [:vendor [:name]]]]}
{:query/data [:potential-payment-matches
{:transaction_id (:id which)}
[:id :memo :check-number [:vendor [:name]]]]}]
(or (= "admin" role)
@@ -55,8 +58,7 @@
(into [{:query/data [:potential-transaction-rule-matches
{:transaction_id (:id which)}
[:id :note]]}]))}
:on-success [::editing-matches-found which]
:on-error [::editing-matches-failed which]}}))
:on-success [::editing-matches-found which]}}))
(re-frame/reg-sub
::table-params