diff --git a/src/clj/auto_ap/handler.clj b/src/clj/auto_ap/handler.clj index 701c48a0..36f86bfc 100644 --- a/src/clj/auto_ap/handler.clj +++ b/src/clj/auto_ap/handler.clj @@ -104,14 +104,21 @@ match->handler)) (defn wrap-guess-route [handler] - (fn [{:keys [uri request-method] :as request}] + (fn [{:keys [uri request-method headers] :as request}] (let [matched-route (:handler (bidi.bidi/match-route all-routes uri - :request-method request-method))] + :request-method request-method)) + matched-hx-current-url-route (some->> (get headers "hx-current-url") + url/url + :path + (bidi/match-route ssr-routes/only-routes) + :handler)] (handler (assoc request :matched-route - matched-route))))) + matched-route + :matched-current-page-route + matched-hx-current-url-route))))) (defn test-match-route [method uri] (bidi.bidi/match-route all-routes diff --git a/src/clj/auto_ap/ssr/components/aside.clj b/src/clj/auto_ap/ssr/components/aside.clj index 9be94d74..e28f5119 100644 --- a/src/clj/auto_ap/ssr/components/aside.clj +++ b/src/clj/auto_ap/ssr/components/aside.clj @@ -78,12 +78,12 @@ [:ul {:class "space-y-1" :x-data (hx/json {:selected (cond - (#{::invoice-route/page} (:matched-route request)) + (#{::invoice-route/all-page ::invoice-route/unpaid-page ::invoice-route/voided-page ::invoice-route/paid-page} (:matched-route request)) "invoices" (#{:pos-sales :pos-expected-deposits :pos-tenders :pos-refunds :pos-cash-drawer-shifts} (:matched-route request)) "sales" - (#{::payment-routes/page} (:matched-route request)) + (#{::payment-routes/all-page ::payment-routes/pending-page ::payment-routes/cleared-page ::payment-routes/voided-page } (:matched-route request)) "payments" :else nil)})} @@ -99,25 +99,25 @@ (sub-menu- {:selector "invoices"} (menu-button- {:href (hu/url (bidi/path-for ssr-routes/only-routes - ::invoice-route/page) + ::invoice-route/all-page) {:date-range "month"}) - :active? (= ::invoice-route/page (:matched-route request))} + :active? (= ::invoice-route/all-page (:matched-route request))} "All") (menu-button- {:href (hu/url (bidi/path-for ssr-routes/only-routes - ::invoice-route/page) + ::invoice-route/paid-page) {:date-range "month"}) - :active? (= ::invoice-route/page (:matched-route request))} + :active? (= ::invoice-route/paid-page (:matched-route request))} "Paid") (menu-button- {:href (hu/url (bidi/path-for ssr-routes/only-routes ::invoice-route/unpaid-page) {:date-range "month"}) - :active? (= ::invoice-route/page (:matched-route request))} + :active? (= ::invoice-route/unpaid-page (:matched-route request))} "Unpaid") (menu-button- {:href (hu/url (bidi/path-for ssr-routes/only-routes ::invoice-route/voided-page) {:date-range "month"}) - :active? (= ::invoice-route/page (:matched-route request))} + :active? (= ::invoice-route/voided-page (:matched-route request))} "Voided")) (menu-button- {:icon svg/receipt-register-1 @@ -155,25 +155,22 @@ "Payments") (sub-menu- {:selector "payments"} (menu-button- {:href (hu/url (bidi/path-for ssr-routes/only-routes - ::payment-routes/page) + ::payment-routes/all-page) {:date-range "month"}) - :active? (= ::payment-routes/page (:matched-route request))} "All") + :active? (= ::payment-routes/all-page (:matched-route request))} "All") (menu-button- {:href (hu/url (bidi/path-for ssr-routes/only-routes - ::payment-routes/page) - {:status "pending" - :date-range "month"}) - :active? (= ::payment-routes/page (:matched-route request))} "Pending") + ::payment-routes/pending-page) + { :date-range "month"}) + :active? (= ::payment-routes/pending-page (:matched-route request))} "Pending") (menu-button- {:href (hu/url (bidi/path-for ssr-routes/only-routes - ::payment-routes/page) - {:status "cleared" - :date-range "month"}) - :active? (= ::payment-routes/page (:matched-route request))} "Cleared") + ::payment-routes/cleared-page) + { :date-range "month"}) + :active? (= ::payment-routes/cleared-page (:matched-route request))} "Cleared") (menu-button- {:href (hu/url (bidi/path-for ssr-routes/only-routes - ::payment-routes/page) - {:status "voided" - :date-range "month"}) - :active? (= ::payment-routes/page (:matched-route request))} "Voided")) + ::payment-routes/voided-page) + { :date-range "month"}) + :active? (= ::payment-routes/voided-page (:matched-route request))} "Voided")) [:li {:x-data (hx/json {:open false})} (menu-button- {"@click.prevent" "if (selected == 'transactions') {selected = null } else { selected = 'transactions'} " diff --git a/src/clj/auto_ap/ssr/invoices.clj b/src/clj/auto_ap/ssr/invoices.clj index 6525aa0c..222795aa 100644 --- a/src/clj/auto_ap/ssr/invoices.clj +++ b/src/clj/auto_ap/ssr/invoices.clj @@ -35,8 +35,8 @@ :refer [apply-middleware-to-all-handlers clj-date-schema dissoc-nil-transformer entity-id html-response main-transformer modal-response money ref->enum-schema - round-money strip wrap-entity wrap-merge-prior-hx - wrap-schema-enforce]] + round-money strip wrap-entity wrap-implied-route-param + wrap-merge-prior-hx wrap-schema-enforce]] [auto-ap.time :as atime] [auto-ap.utils :refer [by dollars=]] [bidi.bidi :as bidi] @@ -132,13 +132,13 @@ {:account-client-override/client [:db/id]}]}]}] [:transaction/_invoices :as :invoice/transaction] [:db/id] [:payment/_invoices :as :invoice/payments] [:db/id :payment/date :payment/amount - + {[:transaction/_payment :as :payment/transaction] [:db/id] - [ :payment/status :xform iol-ion.query/ident] [:db/ident] }] + [:payment/status :xform iol-ion.query/ident] [:db/ident]}] [:invoice/status :xform iol-ion.query/ident] [:db/ident] :invoice/vendor [:vendor/name :db/id]}]) -(defn fetch-ids [db {:keys [query-params] :as request}] +(defn fetch-ids [db {:keys [query-params route-params] :as request}] (let [valid-clients (extract-client-ids (:clients request) (:client-id request) (when (:client-code request) @@ -187,10 +187,10 @@ (merge-query {:query {:in ['?import-status] :where ['[?e :invoice/import-status ?import-status]]} :args [(:import-status query-params)]}) - (:status query-params) + (:status route-params) (merge-query {:query {:in ['?status] :where ['[?e :invoice/status ?status]]} - :args [(:status query-params)]}) + :args [(:status route-params)]}) (:vendor query-params) (merge-query {:query {:in ['?vendor-id] :where ['[?e :invoice/vendor ?vendor-id]]} @@ -476,7 +476,7 @@ (concat (->> i :invoice/payments (filter (fn [p] - (not= :payment-status/voided + (not= :payment-status/voided (:payment/status p)))) (mapcat (fn [p] (cond-> [{:link (hu/url (bidi/path-for ssr-routes/only-routes @@ -1028,9 +1028,26 @@ (->PayWizard nil nil nil)) + +(defn wrap-status-from-source [handler] + (fn [{:keys [matched-current-page-route] :as request}] + (let [ request (cond-> request + (= ::route/paid-page matched-current-page-route) (assoc-in [:route-params :status] :invoice-status/paid) + (= ::route/unpaid-page matched-current-page-route) (assoc-in [:route-params :status] :invoice-status/unpaid) + (= ::route/voided-page matched-current-page-route) (assoc-in [:route-params :status] :invoice-status/voided) + (= ::route/all-page matched-current-page-route) (assoc-in [:route-params :status] nil))] + (handler request)))) + (def key->handler (apply-middleware-to-all-handlers - {::route/page (helper/page-route grid-page) + {::route/all-page (-> (helper/page-route grid-page) + (wrap-implied-route-param :status nil)) + ::route/paid-page (-> (helper/page-route grid-page) + (wrap-implied-route-param :status :invoice-status/paid)) + ::route/unpaid-page (-> (helper/page-route grid-page) + (wrap-implied-route-param :status :invoice-status/unpaid)) + ::route/voided-page (-> (helper/page-route grid-page) + (wrap-implied-route-param :status :invoice-status/voided)) ::route/pay-button (-> pay-button (wrap-schema-enforce :query-schema query-schema)) ::route/delete (-> delete @@ -1096,6 +1113,7 @@ ::route/table (helper/table-route grid-page)} (fn [h] (-> h + (wrap-status-from-source) (wrap-apply-sort grid-page) (wrap-merge-prior-hx) (wrap-schema-enforce :query-schema query-schema) diff --git a/src/clj/auto_ap/ssr/payments.clj b/src/clj/auto_ap/ssr/payments.clj index a86a4ca4..d3ba918d 100644 --- a/src/clj/auto_ap/ssr/payments.clj +++ b/src/clj/auto_ap/ssr/payments.clj @@ -9,8 +9,8 @@ extract-client-ids notify-if-locked]] [auto-ap.logging :as alog] [auto-ap.permissions :refer [can?]] - [auto-ap.routes.payments :as route] [auto-ap.routes.invoice :as invoice-route] + [auto-ap.routes.payments :as route] [auto-ap.routes.utils :refer [wrap-admin wrap-client-redirect-unauthenticated]] [auto-ap.ssr-routes :as ssr-routes] @@ -25,7 +25,8 @@ :refer [apply-middleware-to-all-handlers clj-date-schema dissoc-nil-transformer entity-id html-response main-transformer modal-response ref->enum-schema strip - wrap-entity wrap-merge-prior-hx wrap-schema-enforce]] + wrap-entity wrap-implied-route-param wrap-merge-prior-hx + wrap-schema-enforce]] [auto-ap.time :as atime] [bidi.bidi :as bidi] [clj-time.coerce :as coerce] @@ -128,9 +129,8 @@ {:payment/type [:db/ident]} {:transaction/_payment [:db/id :transaction/date]}]) -(defn fetch-ids [db {:keys [query-params] :as request}] - (let [_ (alog/peek :qp (pr-str query-params)) - valid-clients (extract-client-ids (:clients request) +(defn fetch-ids [db {:keys [query-params route-params] :as request}] + (let [ valid-clients (extract-client-ids (:clients request) (:client request) (:client-id query-params) (when (:client-code query-params) @@ -213,10 +213,10 @@ :args [(:amount query-params)]}) - (:status query-params) + (:status route-params) (merge-query {:query {:in ['?status] :where ['[?e :payment/status ?status]]} - :args [(:status query-params)]}) + :args [(:status route-params)]}) (:payment-type query-params) (merge-query {:query {:in '[?payment-type] @@ -517,11 +517,26 @@ updated-count (count ids))})}))) - +(defn wrap-status-from-source [handler] + (fn [{:keys [matched-current-page-route] :as request}] + (let [ request (cond-> request + (= ::route/cleared-page matched-current-page-route) (assoc-in [:route-params :status] :payment-status/cleared) + (= ::route/pending-page matched-current-page-route) (assoc-in [:route-params :status] :payment-status/pending) + (= ::route/voided-page matched-current-page-route) (assoc-in [:route-params :status] :payment-status/voided) + (= ::route/all-page matched-current-page-route) (assoc-in [:route-params :status] nil))] + (handler request)))) (def key->handler (apply-middleware-to-all-handlers - {::route/page (helper/page-route grid-page) + {::route/cleared-page (-> (helper/page-route grid-page) + (wrap-implied-route-param :status :payment-status/cleared)) + ::route/pending-page (-> (helper/page-route grid-page) + (wrap-implied-route-param :status :payment-status/pending)) + ::route/voided-page (-> (helper/page-route grid-page) + (wrap-implied-route-param :status :payment-status/voided)) + ::route/all-page (-> (helper/page-route grid-page) + (wrap-implied-route-param :status nil)) + ::route/delete (-> delete (wrap-entity [:route-params :db/id] default-read) (wrap-schema-enforce :route-params [:map [:db/id entity-id]])) @@ -537,6 +552,7 @@ (-> h (wrap-apply-sort grid-page) (wrap-merge-prior-hx) + (wrap-status-from-source) (wrap-schema-enforce :query-schema query-schema) (wrap-schema-enforce :hx-schema query-schema) (wrap-client-redirect-unauthenticated))))) \ No newline at end of file diff --git a/src/clj/auto_ap/ssr/utils.clj b/src/clj/auto_ap/ssr/utils.clj index 1346edba..69bd6abd 100644 --- a/src/clj/auto_ap/ssr/utils.clj +++ b/src/clj/auto_ap/ssr/utils.clj @@ -575,5 +575,7 @@ (with-precision 2 (double (.setScale (bigdec d) 2 java.math.RoundingMode/HALF_UP)))) - +(defn wrap-implied-route-param [handler & {:as route-params}] + (fn [request] + (handler (update-in request [:route-params] merge route-params)))) \ No newline at end of file diff --git a/src/cljc/auto_ap/routes/invoice.cljc b/src/cljc/auto_ap/routes/invoice.cljc index 0241b95e..6a0e400f 100644 --- a/src/cljc/auto_ap/routes/invoice.cljc +++ b/src/cljc/auto_ap/routes/invoice.cljc @@ -1,5 +1,8 @@ (ns auto-ap.routes.invoice) -(def routes {"" {:get ::page} +(def routes {"" {:get ::all-page + "/unpaid" ::unpaid-page + "/paid" ::paid-page + "/voided" ::voided-page } "/pay-button" ::pay-button "/pay" {:get ::pay-wizard "/navigate" ::pay-wizard-navigate diff --git a/src/cljc/auto_ap/routes/payments.cljc b/src/cljc/auto_ap/routes/payments.cljc index c4343100..7014784e 100644 --- a/src/cljc/auto_ap/routes/payments.cljc +++ b/src/cljc/auto_ap/routes/payments.cljc @@ -1,5 +1,8 @@ (ns auto-ap.routes.payments) -(def routes {"" {:get ::page} +(def routes {"" {:get ::all-page + "/pending" ::pending-page + "/voided" ::voided-page + "/cleared" ::cleared-page} "/bulk-delete" {:get ::bulk-delete :delete ::bulk-delete-confirm} ["/" [#"\d+" :db/id]] {:delete ::delete}