(cloud) big performance improvements for page load.
This commit is contained in:
@@ -16,7 +16,13 @@
|
||||
(js->clj (.parse js/JSON (b64/decodeString (second (str/split token #"\." ))))))
|
||||
|
||||
|
||||
(defn client-query [token]
|
||||
(defn client-query []
|
||||
(cond-> [:id :name :code :email :locations :feature-flags
|
||||
[:emails [:id :email :description]]
|
||||
[:bank-accounts [:id :code :bank-name :name :type :visible
|
||||
:locations :include-in-reports :current-balance]]]))
|
||||
|
||||
(defn client-detail-query [token]
|
||||
(cond-> [:id :name :signature-file :code :email :matches :week-a-debits :week-a-credits :week-b-debits :week-b-credits :locations :locked-until :square-auth-token :feature-flags
|
||||
[:square-integration-status [:last-updated :last-attempt :message :state :id]]
|
||||
[:square-locations [:square-id :id :name :client-location]]
|
||||
@@ -68,7 +74,7 @@
|
||||
:query-params (auto-ap.views.utils/query-params)
|
||||
:user token)
|
||||
:graphql {:token token
|
||||
:query-obj {:venia/queries [[:client (client-query token)]]}
|
||||
:query-obj {:venia/queries [[:client (client-query)]]}
|
||||
:on-success [::received-initial]
|
||||
:on-error [::failed-initial]}}))))
|
||||
|
||||
@@ -100,7 +106,7 @@
|
||||
(fn [{:keys [db]}]
|
||||
(let [token (-> db :user)]
|
||||
{:graphql {:token token
|
||||
:query-obj {:venia/queries [[:client (client-query token)]]}
|
||||
:query-obj {:venia/queries [[:client (client-query)]]}
|
||||
:on-success [::received-refreshed-clients]}})))
|
||||
|
||||
(re-frame/reg-event-fx
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
[auto-ap.status :as status]
|
||||
[auto-ap.subs :as subs]
|
||||
[auto-ap.shared-views.admin.side-bar :refer [admin-side-bar]]
|
||||
[auto-ap.views.pages.data-page :as data-page]
|
||||
[auto-ap.views.components.grid :as grid]
|
||||
[auto-ap.views.components.layouts :refer [side-bar-layout]]
|
||||
[auto-ap.views.pages.admin.clients.form :as form]
|
||||
@@ -13,8 +14,12 @@
|
||||
[auto-ap.views.utils :refer [with-user]]
|
||||
[bidi.bidi :as bidi]
|
||||
[clojure.string :as str]
|
||||
[clojure.set :as set]
|
||||
[re-frame.core :as re-frame]
|
||||
[vimsical.re-frame.fx.track :as track]))
|
||||
[vimsical.re-frame.fx.track :as track]
|
||||
[auto-ap.events :as events]
|
||||
[auto-ap.forms :as forms]
|
||||
[auto-ap.db :as db]))
|
||||
|
||||
(re-frame/reg-event-db
|
||||
::received-intuit-bank-accounts
|
||||
@@ -24,10 +29,15 @@
|
||||
(re-frame/reg-event-fx
|
||||
::mounted
|
||||
[with-user]
|
||||
(fn [{:keys [user]} _]
|
||||
{::track/register {:id ::params
|
||||
:subscription [::params]
|
||||
:event-fn (fn [params] [::params-change params])}
|
||||
(fn [{:keys [user db]} _]
|
||||
{::track/register [{:id ::params
|
||||
:subscription [::data-page/params ::page]
|
||||
:event-fn (fn [params] [::params-change params])}
|
||||
{:id ::active-route
|
||||
:subscription [::subs/active-route]
|
||||
:event-fn (fn [params] [::params-change params])}]
|
||||
:db (-> db
|
||||
(forms/stop-form [::form/form]))
|
||||
:graphql {:token user
|
||||
:query-obj {:venia/queries [[:intuit_bank_accounts [:external_id :id :name]]]}
|
||||
:owns-state {:single [::load-intuit-bank-accounts]}
|
||||
@@ -37,34 +47,31 @@
|
||||
::unmounted
|
||||
(fn [{:keys [db]} _]
|
||||
{:db (dissoc db ::table/params ::side-bar/filter-params)
|
||||
::track/dispose {:id ::params}}))
|
||||
::track/dispose [{:id ::params}
|
||||
{:id ::active-route}]}))
|
||||
|
||||
(re-frame/reg-sub
|
||||
::params
|
||||
:<- [::table/params]
|
||||
:<- [::side-bar/filter-params]
|
||||
(fn [[table-params filter-params]]
|
||||
(cond-> {}
|
||||
(seq filter-params) (merge filter-params)
|
||||
(seq table-params) (merge table-params))))
|
||||
(defn data-params->query-params [params]
|
||||
{:start (:start params 0)
|
||||
:per-page (:per-page params)
|
||||
:sort (:sort params)
|
||||
:name-like (:name-like params)
|
||||
:code (:code params)})
|
||||
|
||||
(re-frame/reg-event-fx
|
||||
::params-change
|
||||
(fn [_ [_ params]]
|
||||
{:set-uri-params params}))
|
||||
|
||||
(re-frame/reg-sub
|
||||
::page
|
||||
:<- [::params]
|
||||
:<- [::subs/clients]
|
||||
(fn [[params all-clients]]
|
||||
(let [matching-clients (cond->> all-clients
|
||||
(not-empty (:name params)) (filter #(str/includes? (str/lower-case (or (:name %) ""))
|
||||
(str/lower-case (:name params))))
|
||||
(not-empty (:code params)) (filter #(= (str/lower-case (or (:code %) ""))
|
||||
(str/lower-case (:code params)))))]
|
||||
(assoc (grid/virtual-paginate-controls (:start params ) (:per-page params) matching-clients)
|
||||
:data (grid/virtual-paginate (:start params) (:per-page params) matching-clients)))))
|
||||
[with-user]
|
||||
(fn [{:keys [user]} [_ params]]
|
||||
{:graphql {:token user
|
||||
:owns-state {:single [::data-page/page ::page]}
|
||||
:query-obj {:venia/queries [[:client-page
|
||||
{:filters (data-params->query-params params)}
|
||||
[[:clients (events/client-detail-query user)]
|
||||
:total
|
||||
:start
|
||||
:end]]]}
|
||||
:on-success (fn [result]
|
||||
[::data-page/received ::page (set/rename-keys (:client-page result)
|
||||
{:clients :data})])}}))
|
||||
|
||||
(def admin-clients-content
|
||||
(with-meta
|
||||
@@ -77,14 +84,14 @@
|
||||
:content [:<>
|
||||
[:div.is-pulled-right
|
||||
[:a.button.is-primary.is-outlined {:href (bidi/path-for routes/routes :admin-specific-client :id "new")} "New client"]]
|
||||
[table/clients-table {:page @(re-frame/subscribe [::page])
|
||||
:status @(re-frame/subscribe [::status/single ::page])}]]}
|
||||
[table/clients-table {:data-page ::page
|
||||
:id :clients}]]}
|
||||
|
||||
{:key :admin-specific-client
|
||||
:breadcrumb [:span [:a {:href (bidi/path-for routes/routes :admin-clients)}
|
||||
"Clients"]
|
||||
" / "
|
||||
(or (:name @(re-frame/subscribe [::form/client]))
|
||||
(or (:name (:data @(re-frame/subscribe [::forms/form ::form/form])))
|
||||
[:i "New client"])]
|
||||
:content [form/new-client-form]}
|
||||
]}]])
|
||||
@@ -94,6 +101,6 @@
|
||||
|
||||
(defn admin-clients-page []
|
||||
[side-bar-layout {:side-bar [admin-side-bar {}
|
||||
[side-bar/client-side-bar]]
|
||||
[side-bar/client-side-bar {:data-page ::page}]]
|
||||
:main [admin-clients-content]}])
|
||||
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
:refer [search-backed-typeahead]]
|
||||
[auto-ap.views.utils
|
||||
:refer [date-picker
|
||||
with-user
|
||||
dispatch-event]]
|
||||
[bidi.bidi :as bidi]
|
||||
[cljs-time.coerce :as coerce]
|
||||
@@ -206,42 +207,46 @@
|
||||
:bank-code bank-code})
|
||||
(:bank-accounts new-client-data))})))
|
||||
|
||||
(re-frame/reg-sub
|
||||
::client
|
||||
:<- [::subs/route-params]
|
||||
:<- [::subs/clients-by-id]
|
||||
(fn [[rp clients-by-id]]
|
||||
(or (get clients-by-id (:id rp))
|
||||
{})))
|
||||
|
||||
(re-frame/reg-event-fx
|
||||
::mounted
|
||||
[(re-frame/inject-cofx ::inject/sub [::client])]
|
||||
(fn [{:keys [db] ::keys [client]} _]
|
||||
{:db (-> db
|
||||
(forms/stop-form ::form)
|
||||
(forms/start-form ::form (-> client
|
||||
(assoc :selected-square-locations (->> (:square-locations client)
|
||||
(filter :client-location )
|
||||
(mapv (fn [sl]
|
||||
{:id (:id sl)
|
||||
:square-location sl
|
||||
:client-location (:client-location sl)}))))
|
||||
(update :locations #(mapv (fn [l] {:location l
|
||||
:id (random-uuid)}) %))
|
||||
[with-user (re-frame/inject-cofx ::inject/sub [::subs/route-params])]
|
||||
(fn [{:keys [user db] ::subs/keys [route-params]} _]
|
||||
{:graphql {:token user
|
||||
:query-obj {:venia/queries [[:admin-client
|
||||
{:id (js/parseInt (:id route-params))}
|
||||
(events/client-detail-query user)]]}
|
||||
:on-success (fn [result]
|
||||
[::received (:admin-client result)])}
|
||||
:db (-> db
|
||||
(forms/stop-form ::form))}))
|
||||
|
||||
(update :feature-flags #(mapv (fn [l] {:feature-flag l
|
||||
:id (random-uuid)}) %))
|
||||
(update :matches #(mapv (fn [l] {:match l
|
||||
:id (random-uuid)}) %))
|
||||
(update :bank-accounts
|
||||
(fn [bas]
|
||||
(mapv (fn [ba]
|
||||
(update ba :locations (fn [ls]
|
||||
(map (fn [l] {:location l
|
||||
:id (random-uuid)})
|
||||
ls))))
|
||||
bas))))))}))
|
||||
(re-frame/reg-event-db
|
||||
::received
|
||||
(fn [db [_ client]]
|
||||
(-> db
|
||||
(forms/stop-form ::form)
|
||||
(forms/start-form ::form (-> client
|
||||
(assoc :selected-square-locations (->> (:square-locations client)
|
||||
(filter :client-location )
|
||||
(mapv (fn [sl]
|
||||
{:id (:id sl)
|
||||
:square-location sl
|
||||
:client-location (:client-location sl)}))))
|
||||
(update :locations #(mapv (fn [l] {:location l
|
||||
:id (random-uuid)}) %))
|
||||
|
||||
(update :feature-flags #(mapv (fn [l] {:feature-flag l
|
||||
:id (random-uuid)}) %))
|
||||
(update :matches #(mapv (fn [l] {:match l
|
||||
:id (random-uuid)}) %))
|
||||
(update :bank-accounts
|
||||
(fn [bas]
|
||||
(mapv (fn [ba]
|
||||
(update ba :locations (fn [ls]
|
||||
(map (fn [l] {:location l
|
||||
:id (random-uuid)})
|
||||
ls))))
|
||||
bas))))))))
|
||||
|
||||
(re-frame/reg-event-fx
|
||||
::save-new-client
|
||||
@@ -249,7 +254,7 @@
|
||||
(fn [_ _]
|
||||
|
||||
(let [new-client-req @(re-frame/subscribe [::new-client-request])
|
||||
user @(re-frame/subscribe [::subs/token])]
|
||||
user @(re-frame/subscribe [::subs/token])]
|
||||
|
||||
{:graphql
|
||||
{:token user
|
||||
@@ -258,7 +263,7 @@
|
||||
:operation/name "EditClient"}
|
||||
:venia/queries [{:query/data [:edit-client
|
||||
{:edit-client new-client-req}
|
||||
(events/client-query user)]}]}
|
||||
(events/client-detail-query user)]}]}
|
||||
:on-success [::save-complete]
|
||||
:on-error [::forms/save-error ::form]}})))
|
||||
|
||||
@@ -727,8 +732,7 @@
|
||||
|
||||
|
||||
(defn form-content []
|
||||
(let [_ @(re-frame/subscribe [::client])
|
||||
{new-client :data} @(re-frame/subscribe [::forms/form ::form])]
|
||||
(let [{new-client :data} @(re-frame/subscribe [::forms/form ::form])]
|
||||
|
||||
^{:key (or (:id new-client)
|
||||
"new")}
|
||||
@@ -750,5 +754,6 @@
|
||||
(def new-client-form
|
||||
(with-meta
|
||||
(fn []
|
||||
[form-content])
|
||||
(let [_ @(re-frame/subscribe [::subs/route-params])]
|
||||
[form-content]))
|
||||
{:component-did-mount #(re-frame/dispatch [::mounted])}))
|
||||
|
||||
@@ -2,78 +2,22 @@
|
||||
(:require
|
||||
[re-frame.core :as re-frame]
|
||||
[auto-ap.views.utils :refer [dispatch-value-change]]
|
||||
[auto-ap.subs :as subs]))
|
||||
[auto-ap.views.pages.data-page :as data-page]))
|
||||
|
||||
(re-frame/reg-sub
|
||||
::specific-filters
|
||||
(fn [db ]
|
||||
(::filters db nil)))
|
||||
|
||||
(re-frame/reg-sub
|
||||
::filters
|
||||
:<- [::specific-filters]
|
||||
:<- [::subs/query-params]
|
||||
(fn [[specific-filters _ query-params] ]
|
||||
(let [url-filters (-> query-params
|
||||
(select-keys #{:name
|
||||
:code}))
|
||||
url-filters {:name (str (:name url-filters))
|
||||
:code (str (:code url-filters))}]
|
||||
(merge url-filters specific-filters ))))
|
||||
|
||||
(re-frame/reg-sub
|
||||
::filter
|
||||
:<- [::filters]
|
||||
(fn [filters [_ which]]
|
||||
(get filters which)))
|
||||
|
||||
(re-frame/reg-sub
|
||||
::filter-params
|
||||
:<- [::settled-filters]
|
||||
:<- [::filters]
|
||||
:<- [::subs/active-page]
|
||||
(fn [[settled-filters filters _ ]]
|
||||
(let [filters (or settled-filters filters)]
|
||||
{:name (:name filters)
|
||||
:code (:code filters)})))
|
||||
|
||||
(re-frame/reg-sub
|
||||
::settled-filters
|
||||
(fn [db ]
|
||||
(::settled-filters db)))
|
||||
|
||||
(re-frame/reg-event-fx
|
||||
::filters-settled
|
||||
(fn [{:keys [db]} _]
|
||||
{: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}})))
|
||||
|
||||
|
||||
(defn client-side-bar []
|
||||
(defn client-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])
|
||||
:on-change (dispatch-value-change [::filter-changed :name])} ]]]
|
||||
:value @(re-frame/subscribe [::data-page/filter data-page :name-like])
|
||||
:on-change (dispatch-value-change [::data-page/filter-changed data-page :name-like])} ]]]
|
||||
|
||||
[:p.menu-label "Code"]
|
||||
|
||||
[:div.field
|
||||
[:div.control [:input.input {:placeholder "CBC"
|
||||
:value @(re-frame/subscribe [::filter :code])
|
||||
:on-change (dispatch-value-change [::filter-changed :code])} ]]]])
|
||||
:value @(re-frame/subscribe [::data-page/filter data-page :code])
|
||||
:on-change (dispatch-value-change [::data-page/filter-changed data-page :code])} ]]]])
|
||||
|
||||
|
||||
|
||||
@@ -8,7 +8,8 @@
|
||||
[auto-ap.views.components.buttons :as buttons]
|
||||
[auto-ap.status :as status]
|
||||
[bidi.bidi :as bidi]
|
||||
[auto-ap.routes :as routes]))
|
||||
[auto-ap.routes :as routes]
|
||||
[auto-ap.views.pages.data-page :as data-page]))
|
||||
|
||||
(re-frame/reg-sub
|
||||
::specific-params
|
||||
@@ -76,14 +77,16 @@
|
||||
nil
|
||||
))
|
||||
|
||||
(defn clients-table [{:keys [page status]}]
|
||||
(let [states @(re-frame/subscribe [::status/multi ::setup-sales-queries])]
|
||||
(defn clients-table [{:keys [data-page status]}]
|
||||
(let [states @(re-frame/subscribe [::status/multi ::setup-sales-queries])
|
||||
{:keys [data]} @(re-frame/subscribe [::data-page/page data-page])]
|
||||
[grid/grid {:on-params-change (fn [p]
|
||||
(re-frame/dispatch [::params-changed p]))
|
||||
:data-page data-page
|
||||
:status status
|
||||
:params @(re-frame/subscribe [::params])
|
||||
:column-count 5}
|
||||
[grid/controls page]
|
||||
[grid/controls data]
|
||||
[grid/table {:fullwidth true}
|
||||
[grid/header
|
||||
[grid/row {}
|
||||
@@ -95,7 +98,7 @@
|
||||
[grid/header-cell {:style {:width (action-cell-width 2)}}]]
|
||||
]
|
||||
[grid/body
|
||||
(for [{:keys [id name email square-integration-status locked-until code locations bank-accounts]} (:data page)]
|
||||
(for [{:keys [id name email square-integration-status locked-until code locations bank-accounts]} (:data data)]
|
||||
^{:key (str name "-" id )}
|
||||
[grid/row {:id id}
|
||||
[grid/cell {} name]
|
||||
|
||||
@@ -15,7 +15,9 @@
|
||||
[re-frame.core :as re-frame]
|
||||
[recharts]
|
||||
[reagent.core :as r]
|
||||
[react]))
|
||||
[react]
|
||||
[vimsical.re-frame.cofx.inject :as inject]
|
||||
[auto-ap.status :as status]))
|
||||
|
||||
(def pie-chart (r/adapt-react-class recharts/PieChart))
|
||||
(def pie (r/adapt-react-class recharts/Pie))
|
||||
@@ -238,23 +240,28 @@
|
||||
|
||||
(re-frame/reg-event-fx
|
||||
::mounted
|
||||
(fn [{:keys [db]} _]
|
||||
{:db (assoc db ::top-expense-categories nil)
|
||||
:graphql {:token (-> db :user)
|
||||
:query-obj {:venia/queries [[:expense_account_stats
|
||||
{:client-id (:id @(re-frame/subscribe [::subs/client]))}
|
||||
[[:account [:id :name]] :total]]
|
||||
[:invoice_stats
|
||||
{:client-id (:id @(re-frame/subscribe [::subs/client]))}
|
||||
[:name :paid :unpaid]]
|
||||
[:cash-flow
|
||||
{:client-id (:id @(re-frame/subscribe [::subs/client]))}
|
||||
[:beginning-balance
|
||||
:outstanding-payments
|
||||
[:invoices-due-soon [:due :outstanding-balance [:vendor [:id :name]] :invoice-number]]
|
||||
[:upcoming-credits [:date :amount :identifier]]
|
||||
[:upcoming-debits [:date :amount :identifier]]]]]}
|
||||
:on-success [::received]}}))
|
||||
[(re-frame/inject-cofx ::inject/sub [::subs/client])]
|
||||
(fn [{:keys [db] ::subs/keys [client]} _]
|
||||
(cond->
|
||||
{:db (assoc db ::top-expense-categories nil
|
||||
::cash-flow nil
|
||||
::invoice-stats nil)}
|
||||
client (assoc :graphql {:token (-> db :user)
|
||||
:owns-state {:single ::page}
|
||||
:query-obj {:venia/queries [[:expense_account_stats
|
||||
{:client-id (:id client)}
|
||||
[[:account [:id :name]] :total]]
|
||||
[:invoice_stats
|
||||
{:client-id (:id client)}
|
||||
[:name :paid :unpaid]]
|
||||
[:cash-flow
|
||||
{:client-id (:id client)}
|
||||
[:beginning-balance
|
||||
:outstanding-payments
|
||||
[:invoices-due-soon [:due :outstanding-balance [:vendor [:id :name]] :invoice-number]]
|
||||
[:upcoming-credits [:date :amount :identifier]]
|
||||
[:upcoming-debits [:date :amount :identifier]]]]]}
|
||||
:on-success [::received]}))))
|
||||
|
||||
(defn cash-flow-range-button [{:keys [name value chart-options]}]
|
||||
[:a.button {:class (when (= value (:cash-flow-range chart-options))
|
||||
@@ -298,51 +305,56 @@
|
||||
|
||||
(defn home-content []
|
||||
(let [client-id (-> @(re-frame/subscribe [::subs/client]) :id)
|
||||
chart-options @(re-frame/subscribe [::chart-options])]
|
||||
chart-options @(re-frame/subscribe [::chart-options])
|
||||
state @(re-frame/subscribe [::status/single ::page])]
|
||||
^{:key client-id}
|
||||
[side-bar-layout {:side-bar [:div
|
||||
|
||||
]
|
||||
:main [:div [:h1.title "Home"]
|
||||
[:h1.title.is-4 "Top expense categories"]
|
||||
(let [expense-categories @(re-frame/subscribe [::top-expense-categories])]
|
||||
(make-pie-chart {:width 800 :height 500 :data (clj->js
|
||||
(map (fn [x] {:name (:name (:account x)) :value (:total x)}) expense-categories))}))
|
||||
[:h1.title.is-4 "Upcoming Bills"]
|
||||
(make-bar-chart {:width 800 :height 500 :data (clj->js
|
||||
@(re-frame/subscribe [::invoice-stats]))})
|
||||
(if client-id
|
||||
(if (= :loading (:state state))
|
||||
[:div.loader.is-loading.big.is-centered]
|
||||
|
||||
[:h1.title.is-4 "Cash Flow"]
|
||||
[:div.buttons.has-addons
|
||||
[cash-flow-range-button {:name "7 days"
|
||||
:value :seven-days
|
||||
:chart-options chart-options}]
|
||||
[cash-flow-range-button {:name "30 days"
|
||||
:value :thirty-days
|
||||
:chart-options chart-options}]
|
||||
[:<>
|
||||
[:h1.title.is-4 "Top expense categories"]
|
||||
(let [expense-categories @(re-frame/subscribe [::top-expense-categories])]
|
||||
(make-pie-chart {:width 800 :height 500 :data (clj->js
|
||||
(map (fn [x] {:name (:name (:account x)) :value (:total x)}) expense-categories))}))
|
||||
[:h1.title.is-4 "Upcoming Bills"]
|
||||
(make-bar-chart {:width 800 :height 500 :data (clj->js
|
||||
@(re-frame/subscribe [::invoice-stats]))})
|
||||
|
||||
[cash-flow-range-button {:name "60 days"
|
||||
:value :sixty-days
|
||||
:chart-options chart-options}]
|
||||
[:h1.title.is-4 "Cash Flow"]
|
||||
[:div.buttons.has-addons
|
||||
[cash-flow-range-button {:name "7 days"
|
||||
:value :seven-days
|
||||
:chart-options chart-options}]
|
||||
[cash-flow-range-button {:name "30 days"
|
||||
:value :thirty-days
|
||||
:chart-options chart-options}]
|
||||
|
||||
[cash-flow-range-button {:name "90 days"
|
||||
:value :ninety-days
|
||||
:chart-options chart-options}]
|
||||
[cash-flow-range-button {:name "120 days"
|
||||
:value :one-hundred-twenty-days
|
||||
:chart-options chart-options}]
|
||||
[cash-flow-range-button {:name "150 days"
|
||||
:value :one-hundred-fifty-days
|
||||
:chart-options chart-options}]
|
||||
[cash-flow-range-button {:name "180 days"
|
||||
:value :one-hundred-eighty-days
|
||||
:chart-options chart-options}]]
|
||||
|
||||
|
||||
(make-cash-flow-chart {:width 800 :height 500
|
||||
:data (clj->js @(re-frame/subscribe [::cash-flow]))})
|
||||
[cash-flow-range-button {:name "60 days"
|
||||
:value :sixty-days
|
||||
:chart-options chart-options}]
|
||||
|
||||
[cash-flow-grid]]}]))
|
||||
[cash-flow-range-button {:name "90 days"
|
||||
:value :ninety-days
|
||||
:chart-options chart-options}]
|
||||
[cash-flow-range-button {:name "120 days"
|
||||
:value :one-hundred-twenty-days
|
||||
:chart-options chart-options}]
|
||||
[cash-flow-range-button {:name "150 days"
|
||||
:value :one-hundred-fifty-days
|
||||
:chart-options chart-options}]
|
||||
[cash-flow-range-button {:name "180 days"
|
||||
:value :one-hundred-eighty-days
|
||||
:chart-options chart-options}]]
|
||||
|
||||
(make-cash-flow-chart {:width 800 :height 500
|
||||
:data (clj->js @(re-frame/subscribe [::cash-flow]))})
|
||||
|
||||
[cash-flow-grid]])
|
||||
[:h2.title.is-6 "Please select a customer to see reports."])]}]))
|
||||
|
||||
|
||||
(defn home-page []
|
||||
|
||||
Reference in New Issue
Block a user