(ns auto-ap.views.pages.payments.side-bar (:require [auto-ap.routes :as routes] [auto-ap.subs :as subs] [auto-ap.views.utils :refer [active-when]] [auto-ap.views.components.vendor-filter :refer [vendor-filter]] [auto-ap.views.components.date-range-filter :refer [date-range-filter]] [auto-ap.views.components.number-filter :refer [number-filter]] [auto-ap.views.components.bank-account-filter :refer [bank-account-filter]] [auto-ap.views.components.typeahead :refer [typeahead-entity]] [bidi.bidi :as bidi] [re-frame.core :as re-frame])) (re-frame/reg-sub ::specific-filters (fn [db ] (::filters db {}))) (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 :amount-gte :amount-lte :date-range :check-number-like :invoice-number})) 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...")}) :date-range (:date-range url-filters) :amount-range {:raw {:amount-gte (:amount-gte url-filters) :amount-lte (:amount-lte url-filters)} :settled {:amount-gte (:amount-gte url-filters) :amount-lte (:amount-lte url-filters)}} :check-number-like {:raw (:check-number-like url-filters) :settled (:check-number-like url-filters)} :invoice-number {:raw (:invoice-number url-filters) :settled (:invoice-number url-filters)}}] (println "URL filters" url-filters) (merge url-filters specific-filters )))) (re-frame/reg-sub ::filter :<- [::filters] (fn [filters [_ which]] (filters which))) (re-frame/reg-sub ::filter-params :<- [::filters] (fn [filters] {:vendor-id (:id (:vendor filters)) :date-range (:date-range filters) :amount-gte (:amount-gte (:settled (:amount-range filters))) :amount-lte (:amount-lte (:settled (:amount-range filters))) :check-number-like (:settled (:check-number-like filters)) :invoice-number (:settled (:invoice-number 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)}))) (re-frame/reg-event-fx ::check-number-like-settled [(re-frame/path [::filters :check-number-like])] (fn [{:keys [db]} [_ description]] {:db (assoc db :settled description) :dispatch [::filter-changed :check-number-like [:settled] description]})) (re-frame/reg-event-fx ::invoice-number-settled [(re-frame/path [::filters :invoice-number])] (fn [{:keys [db]} [_ description]] {:db (assoc db :settled description) :dispatch [::filter-changed :invoice-number [:settled] description]})) (re-frame/reg-event-fx ::amount-range-settled [(re-frame/path [::filters :amount-range])] (fn [{:keys [db]} [_ which value]] {:db (assoc-in db [:settled which] value) :dispatch [::filter-changed :amount-range [:settled] (assoc (:settled db) which value)]})) (re-frame/reg-event-fx ::check-number-like-changed [(re-frame/path [::filters :check-number-like])] (fn [{:keys [db]} [_ description]] {:dispatch-debounce {:event [::check-number-like-settled description] :time 500 :key ::check-number-like} :db (assoc db :raw description)})) (re-frame/reg-event-fx ::invoice-number-changed [(re-frame/path [::filters :invoice-number])] (fn [{:keys [db]} [_ description]] {:dispatch-debounce {:event [::invoice-number-settled description] :time 500 :key ::invoice-number} :db (assoc db :raw description)})) (re-frame/reg-event-fx ::amount-range-changed [(re-frame/path [::filters :amount-range])] (fn [{:keys [db]} [_ [which] value]] {:dispatch-debounce {:event [::amount-range-settled which value] :time 500 :key ::amount-range} :db (assoc-in db [:raw which] value)})) (defn check-number-filter [] [:div.field [:div.control [:input.input {:placeholder "10001" :value (:raw @(re-frame/subscribe [::filter :check-number-like])) :on-change (fn [x] (re-frame/dispatch [::check-number-like-changed (.. x -target -value) ]))} ]]]) (defn invoice-number-filter [] [:div.field [:div.control [:input.input {:placeholder "SJ-12345" :value (:raw @(re-frame/subscribe [::filter :invoice-number])) :on-change (fn [x] (re-frame/dispatch [::invoice-number-changed (.. x -target -value) ]))} ]]]) (defn side-bar [] (let [ap @(re-frame/subscribe [::subs/active-page]) user @(re-frame/subscribe [::subs/user])] [:div [: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])}]] [:p.menu-label "Date Range"] [:div [date-range-filter {:on-change-event [::filter-changed :date-range] :value @(re-frame/subscribe [::filter :date-range])}]] [:p.menu-label "Amount"] [:div (println (:raw @(re-frame/subscribe [::filter :amount-range]))) [number-filter {:on-change-event [::amount-range-changed] :value (:raw @(re-frame/subscribe [::filter :amount-range]))}]] [:p.menu-label "Check #"] [:div [check-number-filter]] [:p.menu-label "Invoice #"] [:div [invoice-number-filter]]]]))