diff --git a/src/clj/auto_ap/datomic/transaction_rules.clj b/src/clj/auto_ap/datomic/transaction_rules.clj index 49188fca..04650734 100644 --- a/src/clj/auto_ap/datomic/transaction_rules.clj +++ b/src/clj/auto_ap/datomic/transaction_rules.clj @@ -47,6 +47,11 @@ :where ['[?e :transaction-rule/client ?client-id]]} :args [(:client-id args)]}) + (:vendor-id args) + (merge-query {:query {:in ['?vendor-id] + :where ['[?e :transaction-rule/vendor ?vendor-id]]} + :args [(:vendor-id args)]}) + true (merge-query {:query {:find ['?e] :where ['[?e :transaction-rule/transaction-approval-status]]}}))] diff --git a/src/clj/auto_ap/graphql.clj b/src/clj/auto_ap/graphql.clj index 28112ea1..a76aac2a 100644 --- a/src/clj/auto_ap/graphql.clj +++ b/src/clj/auto_ap/graphql.clj @@ -472,6 +472,7 @@ :transaction_rule_page {:type :transaction_rule_page :args {:client_id {:type :id} + :vendor_id {:type :id} :start {:type 'Int} :sort {:type '(list :sort_item)} :asc {:type 'Boolean}} diff --git a/src/cljs/auto_ap/views/pages/admin/rules.cljs b/src/cljs/auto_ap/views/pages/admin/rules.cljs index a3d39ce7..491299cc 100644 --- a/src/cljs/auto_ap/views/pages/admin/rules.cljs +++ b/src/cljs/auto_ap/views/pages/admin/rules.cljs @@ -2,12 +2,14 @@ (: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] [auto-ap.events :as events] [auto-ap.utils :refer [replace-by]] [re-frame.core :as re-frame])) @@ -24,10 +26,6 @@ (fn [db] (-> db ::page))) -(re-frame/reg-sub - ::params - (fn [db] - (-> db (::params {})))) ;; EVENTS @@ -59,21 +57,41 @@ (mapv ungraphql-transaction-rule rules))))) (assoc-in [:status :loading] false)))) +(re-frame/reg-sub + ::last-params + (fn [db] + (-> db ::last-params))) + +(re-frame/reg-sub + ::params + :<- [::last-params] + :<- [::subs/client] + :<- [::side-bar/filter-params] + (fn [[last-params client filter-params table-params]] + (let [params (cond-> {} + client (assoc :client-id (:id client)) + (seq filter-params) (merge filter-params))] + (when (not= params last-params) + (re-frame/dispatch [::params-change])) + params))) + (re-frame/reg-event-fx ::params-change - [with-user] - (fn [{:keys [db user]} [_ params]] + [with-user (re-frame/inject-cofx ::inject/sub [::params])] + (fn [{:keys [db user] ::keys [params] :as cofx} _] {:db (-> db (assoc-in [:status :loading] true) - (assoc-in [::params] params)) + (assoc-in [::last-params] params)) :graphql {:token user :query-obj {:venia/queries [[:transaction_rule_page - (assoc params :client-id (:id @(re-frame/subscribe [::subs/client]))) + (or params {}) [[:transaction-rules default-read] :total :start :end]]]} - :on-success [::received]}})) + :on-success [::received]} + :set-uri-params (dissoc params + :client-id)})) (re-frame/reg-event-fx @@ -105,8 +123,12 @@ (re-frame/dispatch [::events/yodlee-merchants-needed])) })) (defn admin-rules-page [] - (let [{:keys [active?]} @(re-frame/subscribe [::forms/form ::form/form])] - [side-bar-layout {:side-bar [admin-side-bar {}] + (let [{:keys [active?]} @(re-frame/subscribe [::forms/form ::form/form]) + params @(re-frame/subscribe [::params])] + [side-bar-layout {:side-bar [admin-side-bar {} + [:<> + [side-bar/rule-side-bar] + ]] :main [rules-content] :right-side-bar [appearing-side-bar {:visible? active?} [form/form {:rule-saved [::edit-completed]}]] diff --git a/src/cljs/auto_ap/views/pages/admin/rules/side_bar.cljs b/src/cljs/auto_ap/views/pages/admin/rules/side_bar.cljs new file mode 100644 index 00000000..ae72bfe6 --- /dev/null +++ b/src/cljs/auto_ap/views/pages/admin/rules/side_bar.cljs @@ -0,0 +1,58 @@ +(ns auto-ap.views.pages.admin.rules.side-bar + (:require + [re-frame.core :as re-frame] + [auto-ap.subs :as subs] + [auto-ap.views.components.typeahead :refer [typeahead-entity]])) + +(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 #{:vendor-id})) + url-filters {:vendor (when-let [vendor-id (:vendor-id url-filters)] + {:id (str vendor-id) + :name (get-in vendors-by-id [(str vendor-id) :name] "Loading...")})}] + (merge url-filters specific-filters )))) + +(re-frame/reg-sub + ::filter + :<- [::filters] + (fn [filters [_ which]] + (get filters which))) + +(re-frame/reg-sub + ::filter-params + :<- [::filters] + :<- [::subs/active-page] + (fn [[filters ap ]] + {:vendor-id (:id (:vendor 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)}))) + + +(defn rule-side-bar [] + [:div + [:p.menu-label "Vendor"] + [:div + [typeahead-entity {:matches @(re-frame/subscribe [::subs/vendors]) + :on-change #(re-frame/dispatch [::filter-changed :vendor %]) + :match->text :name + :type "typeahead-entity" + :value @(re-frame/subscribe [::filter :vendor])}]]]) +