simplify sorting
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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))))
|
||||
|
||||
@@ -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)))))
|
||||
|
||||
@@ -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))))))
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user