a lot of streamlining for validation
This commit is contained in:
@@ -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]
|
||||
|
||||
Reference in New Issue
Block a user