Revisions on grid page to make parameters easier to grok

This commit is contained in:
2023-09-25 16:26:42 -07:00
parent e23cc6e8fd
commit d5565f7cf8
9 changed files with 107 additions and 89 deletions

View File

@@ -623,14 +623,16 @@
(defn apply-pagination-raw [args results] (defn apply-pagination-raw [args results]
{:entries (->> results {:entries (->> results
(drop (:start args 0)) (drop (or (:start args) 0))
(take (:count args (or (:per-page args) default-pagination-size)))) (take (or (:count args) (:per-page args) default-pagination-size)))
:count (count results)}) :count (count results)})
(defn apply-pagination [args results] (defn apply-pagination [args results]
{:ids (->> results {:ids (->> results
(drop (:start args 0)) (drop (or (:start args) 0))
(take (:count args (or (:per-page args) default-pagination-size))) (take (or (:count args )
(:per-page args)
default-pagination-size))
(map last)) (map last))
:count (count results)}) :count (count results)})

View File

@@ -10,7 +10,8 @@
query2]] query2]]
[auto-ap.graphql.utils :refer [can-see-client? extract-client-ids]] [auto-ap.graphql.utils :refer [can-see-client? extract-client-ids]]
[clj-time.coerce :as c] [clj-time.coerce :as c]
[datomic.api :as dc])) [datomic.api :as dc]
[clojure.set :as set]))
(def default-read '[:db/id :report/client :report/created :report/url :report/name :report/creator]) (def default-read '[:db/id :report/client :report/created :report/url :report/name :report/creator])
@@ -21,16 +22,11 @@
(when (:client-code args) (when (:client-code args)
[:client/code (:client-code args)])) [:client/code (:client-code args)]))
query (cond-> {:query {:find [] query (cond-> {:query {:find []
:in ['$ ] :in '[$ [?c ...]]
:where []} :where '[[?e :report/client ?c]]}
:args [db]} :args [db valid-clients]}
(seq (:clients args))
(merge-query {:query {:in ['[?xx ...]]
:where ['[?e :report/client ?xx]]}
:args [valid-clients]})
(:sort args) (add-sorter-fields {"client" ['[?e :report/client ?c] (:sort args) (add-sorter-fields {"client" ['[?e :report/client ?c]
'[?c :client/name ?sort-client]] '[?c :client/name ?sort-client]]
"created" ['[?e :report/created ?sort-created]] "created" ['[?e :report/created ?sort-created]]
@@ -48,16 +44,21 @@
(defn graphql-results [ids db args] (defn graphql-results [ids db args]
(let [results (->> (pull-many db default-read ids) (let [results (->> (pull-many db default-read ids)
(map #(update % :report/created c/from-date)) (map #(update % :report/created c/from-date))
(group-by :db/id))] (group-by :db/id))
valid-clients (extract-client-ids (:clients args)
(:client-id args)
(when (:client-code args)
[:client/code (:client-code args)]))]
(->> ids (->> ids
(map results) (map results)
(filter identity) (filter identity)
(map first) (map first)
(filter (fn [r] (filter (fn [r]
(every? (let [used-clients (set (map :db/id (:report/client r)))]
#(can-see-client? (:id args) %) (= used-clients
(map :db/id (:report/client r)))))))) (set/intersection valid-clients
used-clients))))))))
(defn get-graphql [args] (defn get-graphql [args]
(let [db (dc/db conn) (let [db (dc/db conn)

View File

@@ -40,7 +40,8 @@
'[?client-id :client/code ?client-code]]} '[?client-id :client/code ?client-code]]}
:args [ (:client-code args)]}) :args [ (:client-code args)]})
(:sort args) (add-sorter-fields {"status" ['[?e :yodlee-provider-account/status ?sort-status]]} (:sort args) (add-sorter-fields {"status" ['[?e :yodlee-provider-account/status ?sort-status]]
"last-updated" ['[?e :yodlee-provider-account/last-updated ?sort-last-updated]]}
args) args)
true true
(merge-query {:query {:find ['?e ] (merge-query {:query {:find ['?e ]

View File

@@ -111,7 +111,8 @@
(sort-by (fn [[client _ amount]] (sort-by (fn [[client _ amount]]
[(:client/code client ) amount])) [(:client/code client ) amount]))
(into [])) (into []))
paginated (apply-pagination-raw args all)] paginated (apply-pagination-raw {:start (:start (:parsed-query-params args))
:per-page (:per-page (:parsed-query-params args))} all)]
[(:entries paginated) (:count paginated)])) [(:entries paginated) (:count paginated)]))
(def grid-page {:id "vendor-table" (def grid-page {:id "vendor-table"

View File

@@ -142,7 +142,12 @@
:nav (com/company-aside-nav) :nav (com/company-aside-nav)
:id-fn :db/id :id-fn :db/id
:fetch-page (fn [user args] :fetch-page (fn [user args]
(get-page (assoc args :id user))) (get-page {:client (:client args)
:clients (:clients args)
:start (:start (:parsed-query-params args))
:sort (:sort (:parsed-query-params args))
:per-page (:per-page (:parsed-query-params args))
}))
:breadcrumbs [[:a {:href (bidi/path-for ssr-routes/only-routes :breadcrumbs [[:a {:href (bidi/path-for ssr-routes/only-routes
:company)} :company)}
"My Company"] "My Company"]
@@ -175,8 +180,8 @@
"Reauthenticate")]]) "Reauthenticate")]])
:headers [{:key "plaid-item" :headers [{:key "plaid-item"
:name "Plaid Item" :name "Plaid Item"
:sort-key "id" :sort-key "external-id"
:render :db/id} :render :plaid-item/external-id}
{:key "status" {:key "status"
:name "Status" :name "Status"
:sort-key "status" :sort-key "status"

View File

@@ -19,7 +19,13 @@
:nav (com/company-aside-nav) :nav (com/company-aside-nav)
:id-fn :db/id :id-fn :db/id
:fetch-page (fn [user args] :fetch-page (fn [user args]
(r/get-graphql (into args {:id user}))) (prn args)
(r/get-graphql {:client (:client args)
:clients (:clients args)
:start (:start (:parsed-query-params args))
:per-page (:per-page (:parsed-query-params args))
:sort (:sort (:parsed-query-params args))
}))
:breadcrumbs [[:a {:href (bidi/path-for ssr-routes/only-routes :breadcrumbs [[:a {:href (bidi/path-for ssr-routes/only-routes
:company)} :company)}
"My Company"] "My Company"]

View File

@@ -81,7 +81,12 @@ fastlink.open({fastLinkURL: '%s',
:nav (com/company-aside-nav) :nav (com/company-aside-nav)
:id-fn :db/id :id-fn :db/id
:fetch-page (fn [user args] :fetch-page (fn [user args]
(yodlee2/get-graphql (assoc args :id user))) (yodlee2/get-graphql
{:client (:client args)
:clients (:clients args)
:sort (:sort (:parsed-query-params args))
:start (:start (:parsed-query-params args))
:per-page (:per-page (:parsed-query-params args))}))
:breadcrumbs [[:a {:href (bidi/path-for ssr-routes/only-routes :breadcrumbs [[:a {:href (bidi/path-for ssr-routes/only-routes
:company)} :company)}
"My Company"] "My Company"]

View File

@@ -59,7 +59,7 @@
)) ))
"default sort")) "default sort"))
(defn table* [grid-spec user {:keys [start per-page clients flash-id sort] :as params}] (defn table* [grid-spec user {{:keys [start per-page clients flash-id sort]} :parsed-query-params :as params}]
(let [start (or start 0) (let [start (or start 0)
per-page (or per-page 30) per-page (or per-page 30)
[entities total] ((:fetch-page grid-spec) [entities total] ((:fetch-page grid-spec)
@@ -119,16 +119,20 @@
(defn parse-sort [grid-spec q] (defn parse-sort [grid-spec q]
(if (not-empty q) (if (not-empty q)
(into [] (->>
(map (fn [k] (str/split q #",")
(let [[k v] (str/split k #":")] (map (fn [k]
{:sort-key (str k) (let [[key asc?] (str/split k #":")
:asc (boolean (= "asc" v)) matching-header (first (filter #(= (str key) (:sort-key %)) (:headers grid-spec)))]
:name (:name (first (filter #(= (str k) (:sort-key %)) (:headers grid-spec)))) {:sort-key (str key)
:sort-icon (if (= (boolean (= "asc" v)) true) :asc (boolean (= "asc" asc?))
svg/sort-down :matching-header matching-header
svg/sort-up)})) :name (:name matching-header)
(str/split q #","))) :sort-icon (if (= (boolean (= "asc" asc?)) true)
svg/sort-down
svg/sort-up)})))
(filter :matching-header)
(into []))
[])) []))
(defn toggle-sort [grid-spec q k] (defn toggle-sort [grid-spec q k]
@@ -159,36 +163,38 @@
(defn params->query-string [q] (defn params->query-string [q]
(-> q (-> q
(dissoc :client :session :client-selection :clients :query-params) :parsed-query-params
(update :sort sort->query) (update :sort sort->query)
(url/map->query))) (url/map->query)))
(defn extract-params [grid-spec {:keys [query-params hx-query-params identity session] :as request}] (defn extract-params [grid-spec {:keys [query-params hx-query-params identity session] :as request}]
(let [{hx-start "start" hx-per-page "per-page" hx-sort "sort" } hx-query-params (let [{hx-start "start" hx-per-page "per-page" hx-sort "sort" } hx-query-params
{q-start "start" q-per-page "per-page" q-sort "sort" q-toggle-sort "toggle-sort"} query-params] {q-start "start" q-per-page "per-page" q-sort "sort" q-toggle-sort "toggle-sort"} query-params
(cond-> {} raw-query-params (merge (or hx-query-params {}) query-params)
hx-start (assoc :start (some-> hx-start not-empty (Long/parseLong )))
q-start (assoc :start (some-> q-start not-empty (Long/parseLong )))
hx-per-page (assoc :per-page (some-> hx-per-page not-empty (Long/parseLong )))
q-per-page (assoc :per-page (some-> q-per-page not-empty (Long/parseLong )))
hx-sort (assoc :sort (parse-sort grid-spec hx-sort))
q-sort (assoc :sort (parse-sort grid-spec q-sort))
(not-empty q-toggle-sort) (update :sort #(toggle-sort grid-spec % q-toggle-sort) )
(seq query-params) (assoc :query-params query-params)
(:session request) (assoc :session (:session request))
(:client-selection (:session request)) (assoc :client-selection (:client-selection (:session request)))
(:clients request) (assoc :clients (:clients request))
(:client request) (assoc :client (:client request)))))
(defn table [grid-spec {:keys [query-params hx-query-params identity session] :as request}] parsed-query-params (cond-> (into {} (map (fn [[k v]] [(keyword k) v]) raw-query-params))
(let [params (extract-params grid-spec request) hx-start (assoc :start (some-> hx-start not-empty (Long/parseLong )))
query-string (params->query-string params)] q-start (assoc :start (some-> q-start not-empty (Long/parseLong )))
hx-per-page (assoc :per-page (some-> hx-per-page not-empty (Long/parseLong )))
q-per-page (assoc :per-page (some-> q-per-page not-empty (Long/parseLong )))
hx-sort (assoc :sort (doto (parse-sort grid-spec hx-sort) println))
q-sort (assoc :sort (doto (parse-sort grid-spec q-sort) println ))
(not-empty q-toggle-sort) (update :sort #(toggle-sort grid-spec % q-toggle-sort) )
true (dissoc :toggle-sort))]
{:raw-query-params raw-query-params
:parsed-query-params parsed-query-params
:client-selection (:client-selection (:session request))
:clients (:clients request)
:client (:client request)
:request request}))
(defn table [grid-spec {:keys [identity] :as request}]
(let [params (extract-params grid-spec request)]
(html-response (table* (html-response (table*
grid-spec grid-spec
identity identity
params params)
) :headers {"hx-push-url" (str "?" (params->query-string params))})))
:headers {"hx-push-url" (str "?" query-string)})))
(defn page [grid-spec {:keys [identity] :as request}] (defn page [grid-spec {:keys [identity] :as request}]
(let [params (extract-params grid-spec request)] (let [params (extract-params grid-spec request)]

View File

@@ -11,6 +11,12 @@
[bidi.bidi :as bidi] [bidi.bidi :as bidi]
[clj-time.coerce :as coerce])) [clj-time.coerce :as coerce]))
;; TODO more filters
;; TODO refunds
;; TODO expected deposits
;; TODO navigate between pages shouldnt copy sort if not applicable
;; TODO remove sort button should work
(defn filters [params] (defn filters [params]
[:form {"hx-trigger" "change delay:1000ms" [:form {"hx-trigger" "change delay:1000ms"
"hx-get" (bidi/path-for ssr-routes/only-routes "hx-get" (bidi/path-for ssr-routes/only-routes
@@ -20,17 +26,17 @@
[:div [:div
(com/field {:label "Starting"} (com/field {:label "Starting"}
(com/date-input {:name "start-date" (com/date-input {:name "start-date"
:value (:start-date params) :value (:start-date (:parsed-query-params params))
:placeholder "Date"}))] :placeholder "Date"}))]
[:div [:div
(com/field {:label "Ending"} (com/field {:label "Ending"}
(com/date-input {:name "end-date" (com/date-input {:name "end-date"
:value nil :value (:end-date (:parsed-query-params params))
:placeholder "Date"}))] :placeholder "Date"}))]
[:div [:div
(com/field {:label "Total"} (com/field {:label "Total"}
(com/money-input {:name "total-gte" (com/money-input {:name "total-gte"
:value nil :value (:total-gte (:parsed-query-params params))
:placeholder "Total >="}))]]]) :placeholder "Total >="}))]]])
(def grid-page {:id "sales-table" (def grid-page {:id "sales-table"
@@ -38,18 +44,22 @@
:page-specific-nav filters :page-specific-nav filters
:id-fn :db/id :id-fn :db/id
:fetch-page (fn [user args] :fetch-page (fn [user args]
(d-sales/get-graphql (-> args (d-sales/get-graphql
(assoc :date-range {:start (some-> args {:clients (:clients args)
:query-params :start (:start (:parsed-query-params args))
(get "start-date") :sort (:sort (:parsed-query-params args))
(atime/parse atime/iso-date)) :per-page (:per-page (:parsed-query-params args))
:end (some-> args :date-range {:start (some-> args
:query-params :raw-query-params
(get "end-date") (get "start-date")
(atime/parse atime/iso-date))} (atime/parse atime/iso-date))
:total-gte (some-> args :query-params (get "total-gte") (#(if (string? %) (Double/parseDouble %) (double %)))))))) :end (some-> args
:raw-query-params
(get "end-date")
(atime/parse atime/iso-date))}
:total-gte (some-> args :raw-query-params (get "total-gte") not-empty (#(if (string? %) (Double/parseDouble %) (double %)))) }))
:breadcrumbs [[:a {:href (bidi/path-for ssr-routes/only-routes :breadcrumbs [[:a {:href (bidi/path-for ssr-routes/only-routes
:company)} :company)}
"POS"] "POS"]
[:a {:href (bidi/path-for ssr-routes/only-routes [:a {:href (bidi/path-for ssr-routes/only-routes
@@ -114,25 +124,6 @@
(def table (partial helper/table grid-page)) (def table (partial helper/table grid-page))
(def page (partial helper/page grid-page)) (def page (partial helper/page grid-page))
#_(defn delete-report [{:keys [form-params identity]}]
(let [[id-to-delete key] (first (dc/q '[:find ?i ?k
:in $ ?i
:where [?i :report/key ?k]]
(dc/db conn)
(some-> (get form-params "id") not-empty Long/parseLong)))
report (dc/pull (dc/db conn) r/default-read id-to-delete)]
(assert-can-see-client identity (:report/client report))
(when id-to-delete
(s3/delete-object :bucket-name (:data-bucket env)
:key key)
@(dc/transact conn [[:db/retractEntity id-to-delete]]))
(html-response
(row* identity
report
{:flash? true
:delete-after-settle? true}))))
(def key->handler (def key->handler
{:pos-sales (wrap-client-redirect-unauthenticated (wrap-secure page)) {:pos-sales (wrap-client-redirect-unauthenticated (wrap-secure page))
:pos-sales-table (wrap-client-redirect-unauthenticated (wrap-secure table))}) :pos-sales-table (wrap-client-redirect-unauthenticated (wrap-secure table))})