diff --git a/src/cljs/auto_ap/views/pages/admin/yodlee.cljs b/src/cljs/auto_ap/views/pages/admin/yodlee.cljs index 5091c7b1..39c5f252 100644 --- a/src/cljs/auto_ap/views/pages/admin/yodlee.cljs +++ b/src/cljs/auto_ap/views/pages/admin/yodlee.cljs @@ -179,26 +179,33 @@ "N/A"))) (defn yodlee-accounts-table [accounts] - - [:div - [:table.table - [:thead - [:tr - [:th "Account Name"] - [:th "Account Number"] - [:th "Yodlee Account Number"] - [:th "Balance"] - [:th "Yodlee Status"]]] - [:tbody + (let [bank-accounts @(re-frame/subscribe [::bank-accounts-by-yodlee-account-id])] + [:div + [:table.table + [:thead + [:tr + [:th "Account Name"] + [:th "Account Number"] + [:th "Yodlee Account Number"] + [:th "Balance"] + [:th "Yodlee Status"] + [:th "Usage"]]] + [:tbody - (for [account accounts] - ^{:key (:id account)} [:tr - [:td (:accountName account)] - [:td (:accountNumber account)] - [:td (:id account)] - [:td.has-text-right (:amount (:balance account))] - [:td (str/join ", " (map :additionalStatus (:dataset account)))] - ])]]]) + (for [account accounts] + ^{:key (:id account)} [:tr + [:td (:accountName account)] + [:td (:accountNumber account)] + [:td (:id account)] + [:td.has-text-right (:amount (:balance account))] + [:td (str/join ", " (map :additionalStatus (:dataset account)))] + [:td + (when-let [bank-accounts (get bank-accounts (:id account))] + [:div.tags + (for [bank-account bank-accounts] + ^{:key (:id bank-account)} + [:div.tag (:name bank-account) " (" (:code bank-account) ")"])])] + ])]]])) (re-frame/reg-event-fx ::reauthenticate-mfa @@ -293,91 +300,103 @@ {:on-click (dispatch-event [::delete-requested account-id])} [:span.icon [:i.fa.fa-times]]]) +(re-frame/reg-sub + ::bank-accounts-by-yodlee-account-id + :<- [::subs/bank-accounts] + (fn [bank-accounts] + (group-by :yodlee-account-id bank-accounts))) + (defn yodlee-provider-accounts-table [] - - (if @(re-frame/subscribe [::provider-accounts-loading?]) - [:div "Loading..."] - [:div.columns - [:div.column.is-half - (doall - (for [account @(re-frame/subscribe [::provider-accounts]) - :let [{:keys [error status] :as g} @(re-frame/subscribe [::forms/form [::refresh-provider-account (:id account)]])]] - - ^{:key (:id account)} - [:div.card {:style {:margin-bottom "1em"}} - [:div.card-header - [:div.card-header-title "Provider account " (:id account)] - [:div.card-header-icon - [delete-button (:id account)]] - [:div.card-header-icon - (cond - (= :loading status) [:button.button.is-disabled.is-loading [:i.fa.fa-refresh]] - error [:button.button.is-disabled [:span.icon [:i.fa.fa-exclamation-triangle]]] - :else - [:button.button - {:on-click (dispatch-event [::refresh-provider-account (:id account)])} - [:span.icon [:i.fa.fa-refresh]]])]] - [:div.card-content - - (if (> (some-> (-> account :dataset first :lastUpdated) - (yodlee-date->date ) - (time/interval (time/now)) - (time/in-days )) - 1) - [:div.notification.is-info.is-light - [:div.level - [:div.level-left - [:div.level-item - [:p - "This account was last updated on " - (yodlee-date->str (-> account :dataset first :lastUpdated)) - ", and last attempted " - (yodlee-date->str (-> account :dataset first :lastUpdateAttempt)) - "."]]] - [:div.level-right [:button.button.is-success {:on-click (dispatch-event [::kick (:id account)] )} "Sync yodlee with bank" ]]] - - ]) + (let [bank-accounts @(re-frame/subscribe [::bank-accounts-by-yodlee-account-id])] + + (if @(re-frame/subscribe [::provider-accounts-loading?]) + [:div "Loading..."] + [:div.columns + [:div.column.is-half + (doall + (for [account @(re-frame/subscribe [::provider-accounts]) + :let [{:keys [error status] :as g} @(re-frame/subscribe [::forms/form [::refresh-provider-account (:id account)]]) + total-usages (mapcat (comp bank-accounts :id) (:accounts account))]] + ^{:key (:id account)} + [:div.card {:style {:margin-bottom "1em"}} + [:div.card-header + [:div.card-header-title "Provider account " (:id account)] + [:div.card-header-icon + (when (seq total-usages) + [:div.tags + [:div.tag.is-primary (count total-usages) " usages"]])] + [:div.card-header-icon + [delete-button (:id account)]] + [:div.card-header-icon + (cond + (= :loading status) [:button.button.is-disabled.is-loading [:i.fa.fa-refresh]] + error [:button.button.is-disabled [:span.icon [:i.fa.fa-exclamation-triangle]]] + :else + [:button.button + {:on-click (dispatch-event [::refresh-provider-account (:id account)])} + [:span.icon [:i.fa.fa-refresh]]])]] + [:div.card-content - [yodlee-accounts-table (:accounts account)] - (if (not= (-> account :dataset first :additionalStatus) - "AVAILABLE_DATA_RETRIEVED") - [:div - [:div.notification.is-info.is-warning - [:div.level - [:div.level-left - [:div.level-item - "This provider account's status is '" - (-> account :dataset first :additionalStatus) - "'. If this is in error, it might help to try reauthenticating by filling out the form below."]]]] - (let [{error :error account-data :data } @(re-frame/subscribe [::forms/form [::mfa-form (:id account)]]) - change-event [::forms/change [::mfa-form (:id account)]] - {:keys [form-inline field field-holder raw-field error-notification submit-button]} (forms/vertical-form {:can-submit [::can-submit] - :change-event change-event - :submit-event [::reauthenticate-mfa (:id account)] - :id [::mfa-form (:id account)]} )] - (form-inline {:title "Reauthenticate"} - [:<> - (error-notification) - (doall - (for [[row i] (map vector (-> account :loginForm last :row) (range)) - f (:field row) - :let [options (map :optionValue (:option f))]] - ^{:key (:id f)} - [:div - (field (:label row) - [:input.input {:type "text" :field [:login i (:id f)]}]) - (if (seq options) - [:ul - (for [o options] - ^{:key o} - [:li [:pre o]])])])) - (doall - (for [f (-> account :field)] - ^{:key (:id f)} - (field (:label f) - [:input.input {:type "text" :mfa [:form (:id f)] :value (-> f :field first :value)}]))) - (submit-button "Reauthenticate")]))])]]))]])) + (if (> (some-> (-> account :dataset first :lastUpdated) + (yodlee-date->date ) + (time/interval (time/now)) + (time/in-days )) + 1) + [:div.notification.is-info.is-light + [:div.level + [:div.level-left + [:div.level-item + [:p + "This account was last updated on " + (yodlee-date->str (-> account :dataset first :lastUpdated)) + ", and last attempted " + (yodlee-date->str (-> account :dataset first :lastUpdateAttempt)) + "."]]] + [:div.level-right [:button.button.is-success {:on-click (dispatch-event [::kick (:id account)] )} "Sync yodlee with bank" ]]] + + ]) + + + [yodlee-accounts-table (:accounts account)] + (if (not= (-> account :dataset first :additionalStatus) + "AVAILABLE_DATA_RETRIEVED") + [:div + [:div.notification.is-info.is-warning + [:div.level + [:div.level-left + [:div.level-item + "This provider account's status is '" + (-> account :dataset first :additionalStatus) + "'. If this is in error, it might help to try reauthenticating by filling out the form below."]]]] + (let [{error :error account-data :data } @(re-frame/subscribe [::forms/form [::mfa-form (:id account)]]) + change-event [::forms/change [::mfa-form (:id account)]] + {:keys [form-inline field field-holder raw-field error-notification submit-button]} (forms/vertical-form {:can-submit [::can-submit] + :change-event change-event + :submit-event [::reauthenticate-mfa (:id account)] + :id [::mfa-form (:id account)]} )] + (form-inline {:title "Reauthenticate"} + [:<> + (error-notification) + (doall + (for [[row i] (map vector (-> account :loginForm last :row) (range)) + f (:field row) + :let [options (map :optionValue (:option f))]] + ^{:key (:id f)} + [:div + (field (:label row) + [:input.input {:type "text" :field [:login i (:id f)]}]) + (if (seq options) + [:ul + (for [o options] + ^{:key o} + [:li [:pre o]])])])) + (doall + (for [f (-> account :field)] + ^{:key (:id f)} + (field (:label f) + [:input.input {:type "text" :mfa [:form (:id f)] :value (-> f :field first :value)}]))) + (submit-button "Reauthenticate")]))])]]))]]))) (defn admin-yodlee-content []