Makes a whole separate page for recent jobs.
This commit is contained in:
@@ -59,6 +59,10 @@
|
||||
[:span {:class "icon"}
|
||||
[:i {:class "fa fa-download"}]]
|
||||
|
||||
[:span {:class "name"} "Import Batches"]]]]
|
||||
[:span {:class "name"} "Import Batches"]]]
|
||||
[:li.menu-item
|
||||
[:a {:href (bidi/path-for routes/routes :admin-jobs) :class (str "item" (active-when ap = :admin-jobs))}
|
||||
[:span {:class "icon icon-cog-play-1" :style {:font-size "25px"}}]
|
||||
[:span {:class "name"} "Background Jobs"]]]]
|
||||
|
||||
(into [:div ] (r/children (r/current-component)))]))
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
[auto-ap.views.pages.reports :refer [reports-page]]
|
||||
[auto-ap.views.pages.error :refer [error-page]]
|
||||
[auto-ap.views.pages.ledger.balance-sheet :refer [balance-sheet-page]]
|
||||
[auto-ap.views.pages.admin.jobs :refer [jobs-page]]
|
||||
[auto-ap.views.pages.ledger.external-import :refer [external-import-page]]
|
||||
[auto-ap.views.pages.ledger.external-ledger :refer [external-ledger-page]]
|
||||
[auto-ap.views.pages.ledger.profit-and-loss :refer [profit-and-loss-page]]
|
||||
@@ -109,6 +110,9 @@
|
||||
(defmethod page :admin-import-batches [_]
|
||||
[import-batches-page])
|
||||
|
||||
(defmethod page :admin-jobs [_]
|
||||
[jobs-page])
|
||||
|
||||
(defmethod page :yodlee2 [_]
|
||||
(yodlee2/admin-yodlee-provider-accounts-page))
|
||||
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
(ns auto-ap.views.pages.admin.import-batches
|
||||
(:require
|
||||
[auto-ap.status :as status]
|
||||
[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]]
|
||||
@@ -33,67 +32,6 @@
|
||||
(set/rename-keys (:result result)
|
||||
{:import-batches :data})])}}))
|
||||
|
||||
(re-frame/reg-sub
|
||||
::msg
|
||||
(fn [db]
|
||||
(::msg db)))
|
||||
|
||||
(re-frame/reg-event-db
|
||||
::success-intuit
|
||||
(fn [db [_ n]]
|
||||
(assoc db ::msg (str "Your job " (:request-import n) " has been scheduled." ))))
|
||||
|
||||
|
||||
|
||||
(re-frame/reg-event-fx ::request-intuit
|
||||
[with-user ]
|
||||
(fn [{:keys [user]} [_ _]]
|
||||
{:graphql {:token user
|
||||
:owns-state {:single ::intuit}
|
||||
:query "mutation RequestIntuitImport{request_import(which: \":intuit\")}"
|
||||
:on-success [::success-intuit]
|
||||
}}))
|
||||
|
||||
(re-frame/reg-event-db
|
||||
::success-yodlee2
|
||||
(fn [db [_ n]]
|
||||
(assoc db ::msg (str "Your job " (:request-import n) " has been scheduled." ))))
|
||||
|
||||
(re-frame/reg-event-fx
|
||||
::request-yodlee2
|
||||
[with-user ]
|
||||
(fn [{:keys [user]} [_ _]]
|
||||
{:graphql {:token user
|
||||
:owns-state {:single ::yodlee2}
|
||||
:query "mutation RequestIntuitImport{request_import(which: \":yodlee2\")}"
|
||||
:on-success [::success-yodlee2]
|
||||
}}))
|
||||
|
||||
|
||||
|
||||
(re-frame/reg-event-db
|
||||
::success-plaid
|
||||
(fn [db [_ n]]
|
||||
(assoc db ::msg (str "Your job " (:request-import n) " has been scheduled." ))))
|
||||
|
||||
(re-frame/reg-event-fx
|
||||
::request-plaid
|
||||
[with-user ]
|
||||
(fn [{:keys [user]} [_ _]]
|
||||
{:graphql {:token user
|
||||
:owns-state {:single ::plaid}
|
||||
:query "mutation RequestIntuitImport{request_import(which: \":plaid\")}"
|
||||
:on-success [::success-plaid]}}))
|
||||
|
||||
(re-frame/reg-event-fx
|
||||
::request-yodlee2-accounts
|
||||
[with-user ]
|
||||
(fn [{:keys [user]} [_ _]]
|
||||
{:graphql {:token user
|
||||
:owns-state {:single ::yodlee2-accounts}
|
||||
:query "mutation RequestIntuitImport{request_import(which: \":yodlee2-accounts\")}"
|
||||
:on-success [::success-yodlee2-accounts]}}))
|
||||
|
||||
|
||||
(re-frame/reg-event-fx
|
||||
::mounted
|
||||
@@ -115,10 +53,6 @@
|
||||
(with-meta
|
||||
(fn []
|
||||
(let [user @(re-frame/subscribe [::subs/user])
|
||||
intuit-request-import-status @(re-frame/subscribe [::status/single ::intuit])
|
||||
yodlee2-request-import-status @(re-frame/subscribe [::status/single ::yodlee2])
|
||||
yodlee2-accounts-request-import-status @(re-frame/subscribe [::status/single ::yodlee2-accounts])
|
||||
plaid-request-import-status @(re-frame/subscribe [::status/single ::plaid])
|
||||
message @(re-frame/subscribe [::msg])]
|
||||
[:div
|
||||
[:h1.title "Import Batches"]
|
||||
@@ -127,32 +61,7 @@
|
||||
(when (= "admin" (:user/role user))
|
||||
[:div
|
||||
[:div.is-pulled-right
|
||||
[:div.buttons
|
||||
|
||||
[:button.button.is-primary-two {:aria-haspopup true
|
||||
:type "button"
|
||||
:on-click (dispatch-event [::request-yodlee2])
|
||||
:disabled (status/disabled-for yodlee2-request-import-status)
|
||||
:class (status/class-for yodlee2-request-import-status)}
|
||||
"Start Yodlee2 Import"]
|
||||
[:button.button.is-primary-two {:aria-haspopup true
|
||||
:type "button"
|
||||
:on-click (dispatch-event [::request-intuit])
|
||||
:disabled (status/disabled-for intuit-request-import-status)
|
||||
:class (status/class-for intuit-request-import-status)}
|
||||
"Start Intuit Import"]
|
||||
[:button.button.is-primary-two {:aria-haspopup true
|
||||
:type "button"
|
||||
:on-click (dispatch-event [::request-plaid])
|
||||
:disabled (status/disabled-for plaid-request-import-status)
|
||||
:class (status/class-for plaid-request-import-status)}
|
||||
"Start Plaid Import"]
|
||||
[:button.button.is-primary-two {:aria-haspopup true
|
||||
:type "button"
|
||||
:on-click (dispatch-event [::request-yodlee2-accounts])
|
||||
:disabled (status/disabled-for yodlee2-accounts-request-import-status)
|
||||
:class (status/class-for yodlee2-accounts-request-import-status)}
|
||||
"Start Yodlee Accounts"]]]
|
||||
[:div.buttons]]
|
||||
[table/table {:id :import-batches
|
||||
:data-page ::page}]])]))
|
||||
{:component-did-mount (dispatch-event [::mounted ])
|
||||
|
||||
135
src/cljs/auto_ap/views/pages/admin/jobs.cljs
Normal file
135
src/cljs/auto_ap/views/pages/admin/jobs.cljs
Normal file
@@ -0,0 +1,135 @@
|
||||
(ns auto-ap.views.pages.admin.jobs
|
||||
(:require
|
||||
[auto-ap.status :as status]
|
||||
[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.jobs.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]))
|
||||
|
||||
|
||||
(def default-read [:name :start-date :end-date :status])
|
||||
(def job-types [:yodlee2 :yodlee2-accounts :intuit :plaid])
|
||||
|
||||
(re-frame/reg-event-fx
|
||||
::params-change
|
||||
[with-user ]
|
||||
(fn [{:keys [user]} [_ params]]
|
||||
{:graphql {:token user
|
||||
:owns-state {:single [::data-page/page ::page]}
|
||||
:query-obj {:venia/queries [{:query/data [:jobs_page
|
||||
{:filters {:sort (:sort params)
|
||||
:start (:start params 0)
|
||||
:per-page (:per-page params)}}
|
||||
[[:data default-read]
|
||||
:total
|
||||
:start
|
||||
:end]]
|
||||
:query/alias :result}]}
|
||||
:on-success (fn [result]
|
||||
[::data-page/received ::page
|
||||
(set/rename-keys (:result result)
|
||||
{:jobs :data})])}}))
|
||||
|
||||
(re-frame/reg-sub
|
||||
::msg
|
||||
(fn [db]
|
||||
(::msg db)))
|
||||
|
||||
(re-frame/reg-event-fx
|
||||
::success
|
||||
(fn [{:keys [db]} [_ n]]
|
||||
{:db (assoc db ::msg (:message (:request-job n)))
|
||||
:dispatch [::params-change]}))
|
||||
|
||||
(re-frame/reg-event-fx
|
||||
::request
|
||||
[with-user ]
|
||||
(fn [{:keys [user]} [_ which]]
|
||||
{:graphql {:token user
|
||||
:owns-state {:single which}
|
||||
:query-obj
|
||||
{:venia/operation {:operation/type :mutation
|
||||
:operation/name "RequestJob"}
|
||||
:venia/queries [{:query/data
|
||||
[:request-job
|
||||
{:which (name which)}
|
||||
[:message]]}]}
|
||||
:on-success [::success]}}))
|
||||
|
||||
|
||||
(re-frame/reg-event-fx
|
||||
::mounted
|
||||
(fn [_]
|
||||
{::track/register {:id ::params
|
||||
:subscription [::data-page/params ::page]
|
||||
:event-fn (fn [params]
|
||||
[::params-change params])}}))
|
||||
|
||||
(re-frame/reg-event-fx
|
||||
::unmounted
|
||||
(fn [{:keys [db]}]
|
||||
{:dispatch-n (into [[::data-page/dispose ::page]]
|
||||
(map (fn [jt]
|
||||
[::status/dispose-single jt]
|
||||
)
|
||||
job-types))
|
||||
::track/dispose {:id ::params}
|
||||
:db (dissoc db ::msg)}))
|
||||
|
||||
(defn job-button [{:keys [which]} content]
|
||||
(let [status @(re-frame/subscribe [::status/single which])]
|
||||
(println status)
|
||||
[:button.button.is-primary-two {:type "button"
|
||||
:on-click (dispatch-event [::request which])
|
||||
:disabled (status/disabled-for status)
|
||||
:class (status/class-for status)}
|
||||
content]))
|
||||
|
||||
(defn notification []
|
||||
[:<>
|
||||
(when-let [msg @(re-frame/subscribe [::msg])]
|
||||
[:div.notification.is-info.is-light msg])
|
||||
(doall (for [status job-types
|
||||
:let [state @(re-frame/subscribe [::status/single status])]]
|
||||
^{:key (str status) }
|
||||
[:div
|
||||
(cond (:info state)
|
||||
[:div.notification.is-info.is-light (:info state)]
|
||||
|
||||
(seq (:error state))
|
||||
[:div.notification.is-info.is-warning.is-light (:message (first (:error state)))]
|
||||
|
||||
:else
|
||||
nil)]))])
|
||||
|
||||
;; VIEWS
|
||||
(def jobs-content
|
||||
(with-meta
|
||||
(fn []
|
||||
(let [user @(re-frame/subscribe [::subs/user])]
|
||||
[:div
|
||||
[:h1.title "Jobs"]
|
||||
[notification]
|
||||
|
||||
(when (= "admin" (:user/role user))
|
||||
[:div
|
||||
[:div.is-pulled-right
|
||||
[:div.buttons
|
||||
[job-button {:which :yodlee2} "Start Yodlee Import"]
|
||||
[job-button {:which :yodlee2-accounts} "Start Yodlee Account Import"]
|
||||
[job-button {:which :intuit} "Start Intuit"]
|
||||
[job-button {:which :plaid} "Start Plaid"]]]
|
||||
[table/table {:id :jobs
|
||||
:data-page ::page}]])]))
|
||||
{:component-did-mount (dispatch-event [::mounted ])
|
||||
:component-will-unmount #(re-frame/dispatch-sync [::unmounted])}))
|
||||
|
||||
(defn jobs-page []
|
||||
[side-bar-layout {:side-bar [admin-side-bar {}]
|
||||
:main [jobs-content]}])
|
||||
|
||||
72
src/cljs/auto_ap/views/pages/admin/jobs/table.cljs
Normal file
72
src/cljs/auto_ap/views/pages/admin/jobs/table.cljs
Normal file
@@ -0,0 +1,72 @@
|
||||
(ns auto-ap.views.pages.admin.jobs.table
|
||||
(:require
|
||||
[auto-ap.status :as status]
|
||||
[auto-ap.subs :as subs]
|
||||
[auto-ap.views.components.grid :as grid]
|
||||
[auto-ap.views.pages.data-page :as data-page]
|
||||
[auto-ap.views.utils
|
||||
:refer [action-cell-width date->str dispatch-event pretty-long]]
|
||||
[cljs-time.core :as time]
|
||||
[re-frame.core :as re-frame]
|
||||
[reagent.core :as r]))
|
||||
|
||||
(re-frame/reg-sub
|
||||
::specific-table-params
|
||||
(fn [db]
|
||||
(::table-params db)))
|
||||
|
||||
|
||||
(re-frame/reg-event-db
|
||||
::unmounted
|
||||
(fn [db]
|
||||
(status/reset-multi db ::run)))
|
||||
|
||||
(re-frame/reg-sub
|
||||
::table-params
|
||||
:<- [::specific-table-params]
|
||||
:<- [::subs/query-params]
|
||||
(fn [[specific-table-params query-params]]
|
||||
(merge (select-keys query-params #{:start :sort}) specific-table-params )))
|
||||
|
||||
(defn table* [{:keys [data-page]}]
|
||||
(let [{:keys [data]} @(re-frame/subscribe [::data-page/page data-page])]
|
||||
[grid/grid {:data-page data-page
|
||||
:column-count 6}
|
||||
[grid/controls data]
|
||||
[grid/table {:fullwidth true }
|
||||
[grid/header
|
||||
[grid/row {}
|
||||
[grid/header-cell {}
|
||||
"Start Date"]
|
||||
|
||||
[grid/header-cell
|
||||
"End Date"]
|
||||
|
||||
[grid/header-cell
|
||||
"Duration"]
|
||||
[grid/header-cell
|
||||
"Job Name"]
|
||||
|
||||
[grid/header-cell {}
|
||||
"Status"]
|
||||
|
||||
[grid/header-cell {:style {:width (action-cell-width 3)}}]]]
|
||||
[grid/body
|
||||
(for [{:keys [start-date end-date status name] :as r} (:data data)]
|
||||
^{:key (str start-date)}
|
||||
[grid/row {:class (:class r) :id (str start-date)}
|
||||
[grid/cell {} (some-> start-date (date->str pretty-long))]
|
||||
[grid/cell {} (some-> end-date (date->str pretty-long))]
|
||||
[grid/cell {} (when (and start-date end-date)
|
||||
(str (time/in-minutes (time/interval start-date end-date)) " minutes"))]
|
||||
[grid/cell {} name]
|
||||
[grid/cell {} status]
|
||||
|
||||
[grid/button-cell {}
|
||||
]
|
||||
])]]]))
|
||||
|
||||
(defn table []
|
||||
(r/create-class {:component-will-unmount (dispatch-event [::unmounted])
|
||||
:reagent-render (fn [params]
|
||||
[table* params])}))
|
||||
Reference in New Issue
Block a user