a lot of streamlining for validation

This commit is contained in:
2023-10-24 11:12:31 -07:00
parent 48347bb8c5
commit 91f7e79aed
7 changed files with 161 additions and 168 deletions

View File

@@ -26,6 +26,7 @@
many-entity
ref->enum-schema
ref->select-options
wrap-entity
wrap-form-4xx-2
wrap-schema-decode]]
[auto-ap.time :as atime]
@@ -34,9 +35,7 @@
[clojure.string :as str]
[config.core :refer [env]]
[datomic.api :as dc]
[hiccup2.core :as hiccup]
[malli.core :as mc]
[clj-time.format :as f]))
[malli.core :as mc]))
(defn filters [request]
[:form {"hx-trigger" "change delay:500ms, keyup changed from:.hot-filter delay:1000ms"
@@ -257,14 +256,17 @@
(def table* (partial helper/table* grid-page))
(defn impersonate [request]
(let [user (some-> request :params :db/id (#(dc/pull (dc/db conn) default-read %))) ]
(println (:entity request))
(if (:entity request)
{:status 200
:headers {"hx-redirect" (str "/?jwt=" (jwt/sign (auth/user->jwt user "FAKE_TOKEN")
(:jwt-secret env)
{:alg :hs512}))
:headers {"hx-redirect" (str "/?jwt=" (jwt/sign (auth/user->jwt (:entity request) "FAKE_TOKEN")
(:jwt-secret env)
{:alg :hs512}))
}
:session {:identity (dissoc (auth/user->jwt user "FAKE_TOKEN")
:exp)}}))
:session {:identity (dissoc (auth/user->jwt (:entity request) "FAKE_TOKEN")
:exp)}}
{:status 404}))
(defn client-row* [client]
(com/data-grid-row (-> {:x-ref "p"
:data-key "show"
@@ -288,19 +290,20 @@
(com/data-grid-cell {:class "align-top"}
(com/a-icon-button {"@click.prevent.stop" "show=false; setTimeout(() => $refs.p.remove(), 500)"} svg/x))))
(defn dialog* [{:keys [entity form-params form-errors]}]
;; TODO hydrate user name
(defn dialog* [{:keys [form-params form-errors entity]}]
(fc/start-form
entity form-errors
form-params form-errors
(com/modal
{}
[:form#edit-form (merge {:hx-ext "response-targets"
:hx-put (str (bidi/path-for ssr-routes/only-routes
:user-edit-save
:request-method :put))
:hx-swap "outerHTML swap:300ms"
:hx-target-400 "#form-errors .error-content"
:class "w-full"}
form-params)
{:hx-target "this"}
[:form#edit-form {:hx-ext "response-targets"
:hx-put (str (bidi/path-for ssr-routes/only-routes
:user-edit-save
:request-method :put))
:hx-swap "outerHTML swap:300ms"
:hx-target-400 "#form-errors .error-content"
:class "w-full"}
[:fieldset {:class "hx-disable"}
(com/modal-card
{}
@@ -329,9 +332,7 @@
:user-client-new)}
"Assign new client"))))]
[:div
[:div [:div#form-errors (when (:errors fc/*form-errors*)
[:span.error-content
(com/errors {:errors (:errors fc/*form-errors*)})])]]
(com/form-errors {:errors (:errors fc/*form-errors*)})
(com/validated-save-button {:errors (seq form-errors)}
"Save user")])]])))
@@ -348,22 +349,17 @@
(defn user-save-error [request]
;; TODO hydration
;; TODO consistency of error handling and passing, on all form examples
(let [entity (some-> request :last-form)]
(html-response (dialog* {:entity entity
:form-errors (:form-errors request)})
:headers {"hx-retarget" "#edit-form fieldset"
"hx-reselect" "#edit-form fieldset"})))
(html-response (dialog* {:form-params (:form-params request)
:entity (:entity request)
:form-errors (:form-errors request)})))
(defn user-edit-dialog [request]
(let [user (some-> request
:route-params
:db/id
(#(dc/pull (dc/db conn) default-read %)))]
(html-response
(dialog* {:entity user
:form-errors {}})
:headers {"hx-trigger" "modalopen"})))
(html-response
(dialog* {:form-params (:entity request)
:entity (:entity request)
:form-errors {}})
:headers {"hx-trigger" "modalopen"}))
(defn new-client [{ {:keys [index]} :query-params}]
(html-response
@@ -371,28 +367,34 @@
:new? true} []
(client-row* fc/*current*))))
(def user-form-schema
(mc/schema
[:map
[:db/id entity-id]
[:user/clients {:optional true}
[:maybe
(many-entity {} [:db/id entity-id])]]
[:user/role (ref->enum-schema "user-role")]]))
(def key->handler
(apply-middleware-to-all-handlers
{:users (helper/page-route grid-page)
:user-table (helper/table-route grid-page)
:user-edit-save (-> user-edit-save
(wrap-schema-decode :form-schema (mc/schema
[:map
[:db/id entity-id]
[:user/clients {:optional true}
[:maybe
(many-entity {} [:db/id entity-id])]]
[:user/role (ref->enum-schema "user-role")]]))
(wrap-entity [:form-params :db/id] default-read)
(wrap-schema-decode :form-schema user-form-schema)
(wrap-nested-form-params)
(wrap-form-4xx-2 user-save-error))
:user-client-new (-> new-client
(wrap-form-4xx-2 (wrap-entity user-save-error [:form-params :db/id] default-read)))
:user-client-new (-> new-client
(wrap-schema-decode :query-schema [:map
[:index {:optional true
:default 0} [nat-int? {:default 0}]]]))
:user-edit-dialog (-> user-edit-dialog
(wrap-entity [:route-params :db/id] default-read)
(wrap-schema-decode
:route-schema (mc/schema [:map [:db/id entity-id]])))
:user-impersonate (-> impersonate
(wrap-entity [:params :db/id] default-read)
(wrap-schema-decode
:params-schema (mc/schema [:map [:db/id entity-id]])))}
(fn [h]