progress on migrating all grids.
This commit is contained in:
@@ -1,17 +1,21 @@
|
||||
(ns auto-ap.ssr.grid-page-helper
|
||||
(:require
|
||||
[auto-ap.graphql.utils :refer [extract-client-ids]]
|
||||
[auto-ap.query-params :as query-params]
|
||||
[auto-ap.routes.utils
|
||||
:refer [wrap-client-redirect-unauthenticated wrap-secure]]
|
||||
[auto-ap.ssr-routes :as ssr-routes]
|
||||
[auto-ap.ssr.components :as com]
|
||||
[auto-ap.ssr.svg :as svg]
|
||||
[auto-ap.ssr.ui :refer [base-page]]
|
||||
[auto-ap.ssr.utils :refer [html-response]]
|
||||
[auto-ap.time :as atime]
|
||||
[malli.core :as m]
|
||||
[bidi.bidi :as bidi]
|
||||
[cemerick.url :as url]
|
||||
[clojure.string :as str]
|
||||
[hiccup2.core :as hiccup]
|
||||
[clj-time.core :as time]
|
||||
[auto-ap.time :as atime]
|
||||
[auto-ap.query-params :as query-params]))
|
||||
[malli.transform :as mt2]))
|
||||
|
||||
(defn row* [gridspec user entity {:keys [flash? delete-after-settle? request] :as options}]
|
||||
(let [cells (->> gridspec
|
||||
@@ -125,23 +129,12 @@
|
||||
(com/data-grid-header {}))})))
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
(defn sort->query [s]
|
||||
(str/join "," (map (fn [k] (format "%s:%s" (:sort-key k) (if (= true (:asc k))
|
||||
"asc"
|
||||
"desc")))
|
||||
s)))
|
||||
|
||||
(defn params->query-string [q]
|
||||
(-> q
|
||||
:parsed-query-params
|
||||
(update :sort sort->query)
|
||||
(url/map->query)))
|
||||
|
||||
(defn default-unparse-query-params [query-params]
|
||||
(reduce
|
||||
(fn [query-params [k value]]
|
||||
@@ -169,37 +162,6 @@
|
||||
query-params
|
||||
query-params))
|
||||
|
||||
|
||||
|
||||
|
||||
(defn table [grid-spec {:keys [identity] :as request}]
|
||||
(let [unparse-query-params (or (:unparse-query grid-spec)
|
||||
default-unparse-query-params)]
|
||||
(html-response (table*
|
||||
grid-spec
|
||||
identity
|
||||
request)
|
||||
:headers {"hx-push-url" (str "?" (url/map->query (unparse-query-params (:parsed-query-params request))))}
|
||||
:oob (when-let [oob-render (:oob-render grid-spec)]
|
||||
(oob-render request)))))
|
||||
|
||||
|
||||
(defn page [grid-spec {: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 (:session request))
|
||||
:clients (:clients request)
|
||||
:client (:client request)
|
||||
:identity (:identity request)}
|
||||
(apply com/breadcrumbs {} (:breadcrumbs grid-spec))
|
||||
(table* grid-spec
|
||||
identity
|
||||
request))
|
||||
(:title grid-spec)))
|
||||
|
||||
(defn default-parse-query-params [grid-spec]
|
||||
(comp
|
||||
(query-params/apply-remove-sort)
|
||||
@@ -211,3 +173,116 @@
|
||||
(query-params/parse-key :start query-params/parse-long)
|
||||
(query-params/parse-key :start-date query-params/parse-date)
|
||||
(query-params/parse-key :end-date query-params/parse-date)))
|
||||
|
||||
(defn wrap-trim-client-ids [handler]
|
||||
(fn trim-client-ids [request]
|
||||
(let [valid-clients (extract-client-ids (:clients request)
|
||||
(:client request)
|
||||
(:client-id (:parsed-query-params request))
|
||||
(when (:client-code (:parsed-query-params request))
|
||||
[:client/code (:client-code (:parsed-query-params request))]))
|
||||
valid-clients (->> valid-clients
|
||||
(take 20)
|
||||
set)]
|
||||
(handler (assoc request :trimmed-clients valid-clients)))))
|
||||
|
||||
(defn table-route [grid-spec]
|
||||
(-> (fn table [{:keys [identity] :as request}]
|
||||
(let [unparse-query-params (or (:unparse-query grid-spec)
|
||||
default-unparse-query-params)]
|
||||
(html-response (table*
|
||||
grid-spec
|
||||
identity
|
||||
request)
|
||||
:headers {"hx-push-url" (str "?" (url/map->query (unparse-query-params (:parsed-query-params request))))}
|
||||
: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)
|
||||
(default-parse-query-params grid-spec)))
|
||||
(wrap-secure)
|
||||
(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 (:session request))
|
||||
:clients (:clients request)
|
||||
:client (:client request)
|
||||
:identity (:identity request)}
|
||||
(apply com/breadcrumbs {} (:breadcrumbs grid-spec))
|
||||
(table* grid-spec
|
||||
identity
|
||||
request))
|
||||
(:title grid-spec)))
|
||||
(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)))
|
||||
|
||||
(def request-spec (m/schema [:map]))
|
||||
(def entity-spec (m/schema [:map]))
|
||||
(def header-spec (m/schema [:map
|
||||
[:key :string]
|
||||
[:name :string]
|
||||
[:sort-key {:optional true} :string]
|
||||
[:render [:=> [:cat entity-spec] :any]]
|
||||
[:hide? {:optional true} [:=> [:cat entity-spec] :boolean]]]))
|
||||
(def grid-spec (m/schema [:map
|
||||
[:id :string]
|
||||
[:nav vector?]
|
||||
[:page-specific-nav
|
||||
{:optional true
|
||||
:default (fn [request])}
|
||||
[:maybe [:=>
|
||||
[:cat request-spec]
|
||||
vector?]]]
|
||||
[:id-fn {:default :db/id
|
||||
:optional true}
|
||||
[:=>
|
||||
[:cat map?]
|
||||
nat-int?]]
|
||||
[:fetch-page [:=>
|
||||
[:cat request-spec]
|
||||
[:cat [:vector entity-spec] :int]]]
|
||||
[:parse-query-params
|
||||
{:optional true}
|
||||
[:=>
|
||||
[:cat [:map-of :keyword :any]]
|
||||
[:map-of :keyword :any]]]
|
||||
[:oob-render
|
||||
{:optional true
|
||||
:default (fn [request])}
|
||||
[:=>
|
||||
[:cat request-spec]
|
||||
vector?]]
|
||||
[:breadcrumbs [:vector vector?]]
|
||||
[:title :string]
|
||||
[:entity-name :string]
|
||||
[:route :keyword]
|
||||
[:action-buttons
|
||||
{:default (fn [request])
|
||||
:optional true}
|
||||
[:=>
|
||||
[:cat request-spec]
|
||||
[:maybe [:vector vector?]]]]
|
||||
[:row-buttons
|
||||
{:default (fn [request entity])
|
||||
:optional true}
|
||||
[:=>
|
||||
[:cat request-spec entity-spec]
|
||||
[:maybe [:vector vector?]]]]
|
||||
[:headers [:vector header-spec]]]))
|
||||
|
||||
(defn build [grid-page]
|
||||
(when-not (m/validate grid-spec grid-page)
|
||||
(throw (ex-info "Could not validate grid"
|
||||
(m/explain grid-spec grid-page))))
|
||||
(m/decode grid-spec grid-page (mt2/default-value-transformer {::mt2/add-optional-keys true})))
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user