Revisions on grid page to make parameters easier to grok
This commit is contained in:
@@ -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)})
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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 ]
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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"]
|
||||||
|
|||||||
@@ -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"]
|
||||||
|
|||||||
@@ -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)]
|
||||||
|
|||||||
@@ -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))})
|
||||||
|
|||||||
Reference in New Issue
Block a user