From 152cad487e0ce84bbf6fdbf9c1af378543eb9d1b Mon Sep 17 00:00:00 2001 From: BC Date: Sun, 27 Jan 2019 09:52:06 -0800 Subject: [PATCH] Adding more filters, for fun. --- src/clj/auto_ap/datomic/transactions.clj | 13 ++++++-- src/clj/auto_ap/graphql.clj | 1 + src/cljs/auto_ap/subs.cljs | 13 ++++++++ .../views/components/bank_account_filter.cljs | 19 ++++++++++++ .../auto_ap/views/pages/transactions.cljs | 31 ++++++++++++++----- 5 files changed, 68 insertions(+), 9 deletions(-) create mode 100644 src/cljs/auto_ap/views/components/bank_account_filter.cljs diff --git a/src/clj/auto_ap/datomic/transactions.clj b/src/clj/auto_ap/datomic/transactions.clj index 5228bb27..e0acd265 100644 --- a/src/clj/auto_ap/datomic/transactions.clj +++ b/src/clj/auto_ap/datomic/transactions.clj @@ -58,7 +58,7 @@ (defn raw-graphql-ids [db args] (let [query (cond-> {:query {:find ['?e] :in ['$ ] - :where ['[?e :transaction/id]]} + :where []} :args [db]} (:sort-by args) (add-sorter-field {"client" ['[?e :transaction/client ?c] @@ -73,16 +73,25 @@ (merge-query {:query {:in ['[?xx ...]] :where ['[?e :transaction/client ?xx]]} :args [(set (map :db/id (limited-clients (:id args))))]}) + (:bank-account-id args) + (merge-query {:query {:in ['?bank-account-id] + :where ['[?e :transaction/bank-account ?bank-account-id]]} + :args [(:bank-account-id args)]}) (:client-id args) (merge-query {:query {:in ['?client-id] :where ['[?e :transaction/client ?client-id]]} :args [(:client-id args)]}) + + (:original-id args) (merge-query {:query {:in ['?original-id] :where ['[?e :transaction/client ?c] '[?c :client/original-id ?original-id]]} - :args [(:original-id args)]}))] + :args [(:original-id args)]}) + + true + (merge-query {:query {:where ['[?e :transaction/id]]}}))] (cond->> query true (d/query) (:sort-by args) (apply-sort args second) diff --git a/src/clj/auto_ap/graphql.clj b/src/clj/auto_ap/graphql.clj index 488c0f63..c004d53f 100644 --- a/src/clj/auto_ap/graphql.clj +++ b/src/clj/auto_ap/graphql.clj @@ -225,6 +225,7 @@ :transaction_page {:type '(list :transaction_page) :args {:client_id {:type :id} + :bank_account_id {:type :id} :start {:type 'Int} :sort_by {:type 'String} :asc {:type 'Boolean}} diff --git a/src/cljs/auto_ap/subs.cljs b/src/cljs/auto_ap/subs.cljs index 69c0abc9..6d3b4491 100644 --- a/src/cljs/auto_ap/subs.cljs +++ b/src/cljs/auto_ap/subs.cljs @@ -15,6 +15,19 @@ (when (:user db) (vals (:clients db))))) +(re-frame/reg-sub + ::bank-accounts + :<- [::clients] + :<- [::client] + (fn [[clients client]] + (println client) + (if client + (:bank-accounts client) + (reduce (fn [result {:keys [bank-accounts]}] + (into result bank-accounts)) + [] + clients)))) + (re-frame/reg-sub ::clients-by-id (fn [db] diff --git a/src/cljs/auto_ap/views/components/bank_account_filter.cljs b/src/cljs/auto_ap/views/components/bank_account_filter.cljs new file mode 100644 index 00000000..5dac8aa2 --- /dev/null +++ b/src/cljs/auto_ap/views/components/bank_account_filter.cljs @@ -0,0 +1,19 @@ +(ns auto-ap.views.components.bank-account-filter + (:require + [clojure.spec.alpha :as s] + [auto-ap.entities.invoice :as invoice] + [auto-ap.views.components.typeahead :refer [typeahead]] + [auto-ap.views.utils :refer [bind-field]])) + +(defn bank-account-filter [{:keys [value on-change-event bank-accounts]}] + [:div.field + [:div.control + [bind-field + [typeahead {:matches (map (fn [x] [(:id x) (:name x)]) bank-accounts) + :type "typeahead" + :auto-focus true + :field [:id] + :text-field [:name] + :event on-change-event + :spec (s/nilable ::invoice/vendor-id) + :subscription value}]]]]) diff --git a/src/cljs/auto_ap/views/pages/transactions.cljs b/src/cljs/auto_ap/views/pages/transactions.cljs index 1bcfbac6..72b505b9 100644 --- a/src/cljs/auto_ap/views/pages/transactions.cljs +++ b/src/cljs/auto_ap/views/pages/transactions.cljs @@ -8,6 +8,7 @@ [auto-ap.views.components.modal :refer [action-modal]] [auto-ap.views.components.paginator :refer [paginator]] [auto-ap.views.components.layouts :refer [side-bar-layout]] + [auto-ap.views.components.bank-account-filter :refer [bank-account-filter]] [auto-ap.events :as events] [auto-ap.views.utils :refer [dispatch-event date->str bind-field]] [auto-ap.utils :refer [by]] @@ -61,20 +62,30 @@ (fn [cofx [_ params]] {:dispatch [::params-change @(re-frame/subscribe [::params])]})) +(re-frame/reg-event-db + ::change-selected-bank-account + (fn [db [_ key value]] + (let [[key] key + updated (assoc-in db [::transaction-page :bank-account-filter key] value)] + (if (and (= key :id) + (not= value (get-in db [::params :bank-account-id]))) + (do + (re-frame/dispatch [::params-change (assoc (::params updated) :bank-account-id value)]) + (assoc-in updated [::params :bank-account-id] value)) + updated)))) + (defn transaction-table [{:keys [id transaction-page status on-params-change vendors params check-boxes checked on-check-changed expense-event]}] - (let [state (reagent/atom (or @params {})) - opc (fn [p] - (swap! state merge p) - (on-params-change p))] + (let [opc (fn [p] + (on-params-change (merge @params p )))] (fn [{:keys [id transaction-page status on-params-change vendors checked]}] - (let [{:keys [sort-by asc]} @state + (let [{:keys [sort-by asc]} @params {:keys [transactions start end count total]} @transaction-page selected-client @(re-frame/subscribe [::subs/client]) percentage-size (if selected-client "25%" "33%")] [:div [paginator {:start start :end end :count count :total total :on-change (fn [p ] - (on-params-change (swap! state merge p)))}] + (on-params-change (merge @params p)))}] "Showing " (inc start) "-" end "/" total [:table.table.is-fullwidth @@ -237,6 +248,12 @@ [manual-yodlee-import-modal]])) {:component-will-mount #(re-frame/dispatch-sync [::params-change {}]) })) (defn transactions-page [] - [side-bar-layout {:side-bar [:div] + [side-bar-layout {:side-bar [:div + [:p.menu-label "Bank Account"] + + [:div + [bank-account-filter {:on-change-event [::change-selected-bank-account] + :value (:bank-acount-filter @(re-frame/subscribe [::transaction-page])) + :bank-accounts @(re-frame/subscribe [::subs/bank-accounts])}]]] :main [transactions-content]}])