diff --git a/src/clj/auto_ap/datomic.clj b/src/clj/auto_ap/datomic.clj index d2e38c2e..4729db20 100644 --- a/src/clj/auto_ap/datomic.clj +++ b/src/clj/auto_ap/datomic.clj @@ -601,7 +601,8 @@ (:sort args))) (defn apply-sort-3 [args results] - (let [sort-bys (conj (:sort args) + + (let [sort-bys (conj (into [] (:sort args)) {:sort-key "default" :asc (if (contains? args :default-asc?) (:default-asc? args) true)}) @@ -609,16 +610,17 @@ comparator (fn [xs ys] (reduce (fn [_ i] + (let [comparison (if (:asc (nth sort-bys i)) (compare (nth xs i) (nth ys i)) (compare (nth ys i) (nth xs i)))] - + (if (not= 0 comparison) (reduced comparison) 0))) 0 (range length)))] - (sort comparator results ))) + (sort comparator results))) (defn apply-pagination-raw [args results] {:entries (->> results diff --git a/src/clj/auto_ap/query_params.clj b/src/clj/auto_ap/query_params.clj index c269e7cf..9e3453db 100644 --- a/src/clj/auto_ap/query_params.clj +++ b/src/clj/auto_ap/query_params.clj @@ -4,6 +4,9 @@ [clj-time.core :as time] [clojure.string :as str])) +(defn wrap-copy-qp-pqp [handler] + (fn [request] + (handler (assoc request :parsed-query-params (:query-params request))))) (defn wrap-parse-query-params [handler parser] (fn parsed-handler [request] @@ -42,13 +45,13 @@ [])) (defn parse-long [l] - (try + (try (Long/parseLong l) (catch Exception e nil))) (defn parse-double [l] - (try + (try (Double/parseDouble l) (catch Exception e nil))) @@ -74,7 +77,7 @@ "all" (assoc query-params - start-date-key (time/plus (time/now) (time/years -3)) + start-date-key (time/plus (time/now) (time/years -6)) end-date-key (time/now)) query-params) @@ -88,18 +91,18 @@ presently-sorted? ((set (map :sort-key current-sort)) key-to-toggle) new-sort (if presently-sorted? (mapv - (fn [s] - (if (= (:sort-key s) - key-to-toggle) - (-> s - (update :asc - #(boolean (not %))) - (update :sort-icon (fn [x] - (if (= x svg/sort-down) - svg/sort-up - svg/sort-down)))) - s)) - current-sort) + (fn [s] + (if (= (:sort-key s) + key-to-toggle) + (-> s + (update :asc + #(boolean (not %))) + (update :sort-icon (fn [x] + (if (= x svg/sort-down) + svg/sort-up + svg/sort-down)))) + s)) + current-sort) (conj current-sort {:sort-key key-to-toggle :asc true :name (:name (first (filter #(= (str key-to-toggle) (:sort-key %)) (:headers grid-spec)))) diff --git a/src/clj/auto_ap/ssr/admin/clients.clj b/src/clj/auto_ap/ssr/admin/clients.clj index 1ff2b337..6054c981 100644 --- a/src/clj/auto_ap/ssr/admin/clients.clj +++ b/src/clj/auto_ap/ssr/admin/clients.clj @@ -5,6 +5,7 @@ pull-many query2]] [auto-ap.graphql.utils :refer [extract-client-ids]] [auto-ap.logging :as alog] + [auto-ap.query-params :refer [wrap-copy-qp-pqp]] [auto-ap.routes.admin.clients :as route] [auto-ap.routes.indicators :as indicators] [auto-ap.routes.queries :as q] @@ -27,7 +28,7 @@ :refer [apply-middleware-to-all-handlers entity-id form-validation-error html-response main-transformer many-entity modal-response ref->enum-schema strip temp-id - wrap-entity wrap-schema-enforce]] + wrap-entity wrap-schema-enforce wrap-merge-prior-hx]] [auto-ap.time :as atime] [bidi.bidi :as bidi] [cheshire.core :as cheshire] @@ -77,7 +78,7 @@ (com/text-input {:name "name" :id "name" :class "hot-filter" - :value (:name (:parsed-query-params request)) + :value (:name (:query-params request)) :placeholder "Best Restaurant LLC" :size :small})) @@ -85,14 +86,14 @@ (com/text-input {:name "code" :id "code" :class "hot-filter" - :value (:code (:parsed-query-params request)) + :value (:code (:query-params request)) :placeholder "BRLC" :size :small})) (com/field {:label "Group"} (com/text-input {:name "group" :id "group" :class "hot-filter" - :value (:group (:parsed-query-params request)) + :value (:group (:query-params request)) :placeholder "NTG" :size :small})) (com/field {:label "Select"} @@ -150,7 +151,7 @@ :client/location-matches [:location-match/matches :location-match/location :db/id]}]) (defn fetch-ids [db request] - (let [query-params (:parsed-query-params request) + (let [query-params (:query-params request) valid-clients (extract-client-ids #_(:clients request) (map first (dc/q '[:find ?c :where [?c :client/code]] (dc/db conn))) (:client-id query-params) @@ -1842,8 +1843,8 @@ (def key->handler (apply-middleware-to-all-handlers - {::route/page (helper/page-route grid-page) - ::route/table (helper/table-route grid-page) + {::route/page (helper/page-route grid-page :parse-query-params? false) + ::route/table (helper/table-route grid-page :parse-query-params? false) ::route/new-location (add-new-primitive-handler [:step-params :client/locations] "" location-row) @@ -1904,7 +1905,10 @@ (mm/wrap-wizard client-wizard))} (fn [h] (-> h + (wrap-copy-qp-pqp) (wrap-apply-sort grid-page) + (wrap-merge-prior-hx) (wrap-schema-enforce :query-schema query-schema) + (wrap-schema-enforce :hx-schema query-schema) (wrap-admin) (wrap-client-redirect-unauthenticated))))) diff --git a/src/clj/auto_ap/ssr/grid_page_helper.clj b/src/clj/auto_ap/ssr/grid_page_helper.clj index 506be5f0..3fb9e12c 100644 --- a/src/clj/auto_ap/ssr/grid_page_helper.clj +++ b/src/clj/auto_ap/ssr/grid_page_helper.clj @@ -21,6 +21,8 @@ [malli.transform :as mt] [taoensso.encore :refer [filter-vals]])) + + (defn row* [gridspec user entity {:keys [flash? delete-after-settle? request class] :as options}] (let [cells (if (:check-boxes? gridspec) [(com/data-grid-cell {} (com/checkbox {:name "id" :value ((:id-fn gridspec) entity) @@ -75,6 +77,10 @@ "default sort")) (defn table* [grid-spec user {{:keys [start per-page flash-id sort]} :parsed-query-params :as request}] + (alog/info ::TABLE-QP + :qp (:query-params request) + :pqp (:parsed-query-params request) + :sort sort) (let [start (or start 0) per-page (or per-page 25) [entities total] ((:fetch-page grid-spec) @@ -206,9 +212,9 @@ set)] (handler (assoc request :trimmed-clients valid-clients))))) -(defn table-route [grid-spec] - (-> (fn table [{:keys [identity] :as request}] - (alog/peek ::TABLE-QP (:parsed-query-params request)) +(defn table-route [grid-spec & {:keys [parse-query-params?] :or {parse-query-params? true}}] + (cond-> (fn table [{:keys [identity] :as request}] + (let [unparse-query-params (or (:unparse-query grid-spec) default-unparse-query-params)] (html-response (table* @@ -233,41 +239,45 @@ "selected" "all-selected")))} ;; TODO seems hacky to special case selected and all-selected here :oob (when-let [oob-render (:oob-render grid-spec)] (oob-render request))))) - (wrap-trim-client-ids) - (query-params/wrap-parse-query-params (or (:parse-query-params grid-spec) + true (wrap-trim-client-ids) + parse-query-params? (query-params/wrap-parse-query-params (or (:parse-query-params grid-spec) (default-parse-query-params grid-spec))) - (wrap-secure) - (wrap-client-redirect-unauthenticated))) + true (wrap-secure) + true (wrap-client-redirect-unauthenticated))) -(defn page-route [grid-spec] - (-> (fn page [{:keys [identity] :as request}] - (base-page - request - (com/page {:nav (:nav grid-spec) - :page-specific (when-let [page-specific-nav (:page-specific-nav grid-spec)] - [:div#page-specific-nav (page-specific-nav request)]) - :client-selection (:client-selection request) - :clients (:clients request) - :client (:client request) - :identity (:identity request) - :request request} - (apply com/breadcrumbs {} (:breadcrumbs grid-spec)) - [:div {:x-data (hx/json {:selected [] :all_selected false}) - "x-bind:hx-vals" "JSON.stringify({selected: $data.selected, 'all-selected': $data.all_selected})" - :x-init "$watch('selected', s=> $dispatch('selectedChanged', {selected: s, all_selected: all_selected}) ); +(defn page-route [grid-spec & {:keys [parse-query-params?] :or {parse-query-params? true}}] + + (cond-> (fn page [{:keys [identity] :as request}] + (alog/info ::page-route + :pqp (:parsed-query-params request) + :qp (:query-params request)) + (base-page + request + (com/page {:nav (:nav grid-spec) + :page-specific (when-let [page-specific-nav (:page-specific-nav grid-spec)] + [:div#page-specific-nav (page-specific-nav request)]) + :client-selection (:client-selection request) + :clients (:clients request) + :client (:client request) + :identity (:identity request) + :request request} + (apply com/breadcrumbs {} (:breadcrumbs grid-spec)) + [:div {:x-data (hx/json {:selected [] :all_selected false}) + "x-bind:hx-vals" "JSON.stringify({selected: $data.selected, 'all-selected': $data.all_selected})" + :x-init "$watch('selected', s=> $dispatch('selectedChanged', {selected: s, all_selected: all_selected}) ); $watch('all_selected', a=>$dispatch('selectedChanged', {selected: selected, all_selected: a}))"} - - (table* grid-spec - identity - request)]) - (if (string? (:title grid-spec)) - (:title grid-spec) - ((:title grid-spec) request)))) - (wrap-trim-client-ids) - (query-params/wrap-parse-query-params (or (:parse-query-params grid-spec) - (default-parse-query-params grid-spec))) - (wrap-secure) - (wrap-client-redirect-unauthenticated))) + + (table* grid-spec + identity + request)]) + (if (string? (:title grid-spec)) + (:title grid-spec) + ((:title grid-spec) request)))) + true (wrap-trim-client-ids) + parse-query-params? (query-params/wrap-parse-query-params (or (:parse-query-params grid-spec) + (default-parse-query-params grid-spec))) + true (wrap-secure) + true (wrap-client-redirect-unauthenticated))) (def request-spec (m/schema [:map])) (def entity-spec (m/schema [:map])) @@ -281,8 +291,8 @@ (def grid-spec (m/schema [:map [:id :string] [:nav [:=> - [:cat request-spec] - vector?]] + [:cat request-spec] + vector?]] [:page-specific-nav {:optional true :default (fn [request])} @@ -339,8 +349,8 @@ (handler (update request :query-params (fn [qp] ((comp - (query-params/apply-remove-sort) - (query-params/apply-toggle-sort grid-spec) - (query-params/parse-key :sort #(query-params/parse-sort grid-spec %))) + (query-params/apply-remove-sort) + (query-params/apply-toggle-sort grid-spec) + (query-params/parse-key :sort #(query-params/parse-sort grid-spec %))) qp)))))) diff --git a/src/clj/auto_ap/ssr/invoices.clj b/src/clj/auto_ap/ssr/invoices.clj index 16b499ad..2e9369e5 100644 --- a/src/clj/auto_ap/ssr/invoices.clj +++ b/src/clj/auto_ap/ssr/invoices.clj @@ -7,6 +7,7 @@ [auto-ap.datomic.accounts :as d-accounts] [auto-ap.datomic.bank-accounts :as d-bank-accounts] [auto-ap.datomic.invoices :as d-invoices] + [auto-ap.query-params :refer [wrap-copy-qp-pqp]] [auto-ap.graphql.checks :as gq-checks :refer [base-payment invoice-payments print-checks-internal @@ -236,6 +237,7 @@ query-params) true (merge-query {:query {:find ['?sort-default '?e]}})))] + (->> (observable-query query) (apply-sort-3 (assoc query-params :default-asc? false)) (apply-pagination query-params)))) @@ -715,7 +717,6 @@ (map :invoice-id invoices)) (into {}))] (every? (fn [%] - (println "TEST" (:amount %) (outstanding-balances (:invoice-id %))) (not (does-amount-exceed-outstanding? (:amount %) (outstanding-balances (:invoice-id %))))) invoices)))]]] [:has-warning? :boolean] @@ -1176,13 +1177,13 @@ (def key->handler (apply-middleware-to-all-handlers (-> - {::route/all-page (-> (helper/page-route grid-page) + {::route/all-page (-> (helper/page-route grid-page :parse-query-params? false) (wrap-implied-route-param :status nil)) - ::route/paid-page (-> (helper/page-route grid-page) + ::route/paid-page (-> (helper/page-route grid-page :parse-query-params? false) (wrap-implied-route-param :status :invoice-status/paid)) - ::route/unpaid-page (-> (helper/page-route grid-page) + ::route/unpaid-page (-> (helper/page-route grid-page :parse-query-params? false) (wrap-implied-route-param :status :invoice-status/unpaid)) - ::route/voided-page (-> (helper/page-route grid-page) + ::route/voided-page (-> (helper/page-route grid-page :parse-query-params? false) (wrap-implied-route-param :status :invoice-status/voided)) ::route/unvoid (-> unvoid-invoice (wrap-entity [:route-params :db/id] default-read) @@ -1211,10 +1212,11 @@ (mm/wrap-wizard pay-wizard) (mm/wrap-decode-multi-form-state)) - ::route/table (helper/table-route grid-page)} + ::route/table (helper/table-route grid-page :parse-query-params? false)} (merge new-invoice-wizard/key->handler)) (fn [h] (-> h + (wrap-copy-qp-pqp) (wrap-status-from-source) (wrap-apply-sort grid-page) (wrap-merge-prior-hx) diff --git a/src/clj/auto_ap/ssr/payments.clj b/src/clj/auto_ap/ssr/payments.clj index 14778f31..aa6ba9d4 100644 --- a/src/clj/auto_ap/ssr/payments.clj +++ b/src/clj/auto_ap/ssr/payments.clj @@ -7,6 +7,7 @@ [auto-ap.graphql.utils :refer [assert-can-see-client exception->notification extract-client-ids notify-if-locked]] + [auto-ap.query-params :refer [wrap-copy-qp-pqp]] [auto-ap.logging :as alog] [auto-ap.permissions :refer [can?]] [auto-ap.routes.invoice :as invoice-route] @@ -38,8 +39,8 @@ [malli.transform :as mt])) (defn exact-match-id* [request] - (if (nat-int? (:exact-match-id (:parsed-query-params request))) - [:div {:x-data (hx/json {:exact_match (:exact-match-id (:parsed-query-params request))}) :id "exact-match-id-tag"} + (if (nat-int? (:exact-match-id (:query-params request))) + [:div {:x-data (hx/json {:exact_match (:exact-match-id (:query-params request))}) :id "exact-match-id-tag"} (com/hidden {:name "exact-match-id" "x-model" "exact_match"}) (com/pill {:color :primary} @@ -68,7 +69,7 @@ :value (:vendor (:query-params request)) :value-fn :db/id :content-fn :vendor/name})) - (date-range-field* request) + (date-range-field* (assoc request :parsed-query-params (:query-params request))) (com/field {:label "Check #"} (com/text-input {:name "check-number" :id "check-number" @@ -130,7 +131,7 @@ {:transaction/_payment [:db/id :transaction/date]}]) (defn fetch-ids [db {:keys [query-params route-params] :as request}] - (let [ valid-clients (extract-client-ids (:clients request) + (let [valid-clients (extract-client-ids (:clients request) (:client request) (:client-id query-params) (when (:client-code query-params) @@ -530,13 +531,13 @@ (def key->handler (apply-middleware-to-all-handlers - {::route/cleared-page (-> (helper/page-route grid-page) + {::route/cleared-page (-> (helper/page-route grid-page :parse-query-params? false) (wrap-implied-route-param :status :payment-status/cleared)) - ::route/pending-page (-> (helper/page-route grid-page) + ::route/pending-page (-> (helper/page-route grid-page :parse-query-params? false) (wrap-implied-route-param :status :payment-status/pending)) - ::route/voided-page (-> (helper/page-route grid-page) + ::route/voided-page (-> (helper/page-route grid-page :parse-query-params? false) (wrap-implied-route-param :status :payment-status/voided)) - ::route/all-page (-> (helper/page-route grid-page) + ::route/all-page (-> (helper/page-route grid-page :parse-query-params? false) (wrap-implied-route-param :status nil)) ::route/delete (-> delete @@ -549,9 +550,10 @@ (wrap-admin)) - ::route/table (helper/table-route grid-page)} + ::route/table (helper/table-route grid-page :parse-query-params? false)} (fn [h] (-> h + (wrap-copy-qp-pqp) (wrap-apply-sort grid-page) (wrap-merge-prior-hx) (wrap-status-from-source) diff --git a/src/clj/auto_ap/ssr/utils.clj b/src/clj/auto_ap/ssr/utils.clj index 56fb3bbd..56885f6a 100644 --- a/src/clj/auto_ap/ssr/utils.clj +++ b/src/clj/auto_ap/ssr/utils.clj @@ -255,7 +255,7 @@ end-date-key (time/now)) "all" - (assoc m start-date-key (time/plus (time/now) (time/years -3)) + (assoc m start-date-key (time/plus (time/now) (time/years -6)) end-date-key (time/now)) m)