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

@@ -31,12 +31,12 @@
ref->enum-schema
ref->select-options
temp-id
wrap-entity
wrap-form-4xx-2
wrap-schema-decode]]
[bidi.bidi :as bidi]
[clojure.string :as str]
[datomic.api :as dc]
[hiccup2.core :as hiccup]
[malli.core :as mc]))
(defn filters [request]
@@ -291,16 +291,21 @@
;; ensure that adding a new one results in a new row
(defn dialog* [& {:keys [entity form-params form-errors]}]
(fc/start-form entity form-errors
[:div {:x-data (hx/json {"accountName" (:account/name entity)
"accountCode" (:account/numeric-code entity)})}
(defn dialog* [{:keys [entity form-params form-errors]}]
(fc/start-form form-params form-errors
[:div {:x-data (hx/json {"accountName" (or (:account/name form-params) (:account/numeric-code entity))
"accountCode" (or (:account/numeric-code form-params) (:account/numeric-code entity) )})
:hx-target "this"}
(com/modal
{}
[:form#edit-form (merge {:hx-ext "response-targets"
:hx-swap "outerHTML swap:300ms"
:hx-target-400 "#form-errors .error-content"}
form-params)
[:form#edit-form (-> {:hx-ext "response-targets"
:hx-swap "outerHTML swap:300ms"
:hx-target-400 "#form-errors .error-content"}
(assoc (if (:db/id entity)
:hx-put
:hx-post)
(str (bidi/path-for ssr-routes/only-routes
:admin-transaction-rule-edit-save))))
[:fieldset {:class "hx-disable"}
(com/modal-card
{}
@@ -318,6 +323,7 @@
(com/validated-field {:label "Numeric code"
:errors (fc/field-errors)}
(com/text-input {:name (fc/field-name)
:value (fc/field-value)
:x-model "accountCode"
:autofocus true
:class "w-32"}))
@@ -388,9 +394,7 @@
]
[: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 account")])]])]))
@@ -403,34 +407,15 @@
[]
(client-override* fc/*current*))))
(defn account-edit-dialog [request]
(let [account (some-> request :route-params :db/id (#(dc/pull (dc/db conn) default-read %)))]
(html-response (dialog* :entity account
:form-params {:hx-put (str (bidi/path-for ssr-routes/only-routes
:admin-account-edit-save))})
:headers {"hx-trigger" "modalopen"})))
(defn account-new-dialog [_]
(html-response (dialog* :entity {}
:form-errors {}
:form-params {:hx-post (str (bidi/path-for ssr-routes/only-routes
:admin-account-new-save))})
(defn account-dialog [{:keys [entity form-params form-errors]}]
(html-response (dialog* {:entity entity
:form-params (or (when (seq form-params)
form-params)
entity
{})
:form-errors form-errors})
:headers {"hx-trigger" "modalopen"}))
(defn account-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)
:form-params (if (:db/id entity)
{:hx-put (str (bidi/path-for ssr-routes/only-routes
:admin-transaction-rule-edit-save))}
{:hx-post (str (bidi/path-for ssr-routes/only-routes
:admin-transaction-rule-edit-save))}))
:headers {"hx-retarget" "#edit-form fieldset"
"hx-reselect" "#edit-form fieldset"})))
(def account-schema (mc/schema
[:map
@@ -439,14 +424,14 @@
[:account/name [:string {:min 1}]]
[:account/location [:maybe :string]]
[:account/type (ref->enum-schema "account-type")]
[:account/applicability (ref->enum-schema "account-applicability")]
[:account/applicability (ref->enum-schema "account-applicability")] ;
[:account/invoice-allowance (ref->enum-schema "allowance")]
[:account/vendor-allowance (ref->enum-schema "allowance")]
[:account/client-overrides {:optional true}
[:maybe
(many-entity {}
[:db/id [:or entity-id temp-id]]
[:account-client-override/client [:or entity-id :string]]
[:account-client-override/client entity-id]
[:account-client-override/name [:string {:min 2}]])]]]))
(def key->handler
@@ -460,12 +445,14 @@
:default 0} [nat-int? {:default 0}]]])
wrap-admin wrap-client-redirect-unauthenticated)
:admin-account-save (-> account-save
(wrap-entity [:form-params :db/id] default-read)
(wrap-schema-decode :form-schema account-schema)
(wrap-nested-form-params)
(wrap-form-4xx-2 account-save-error))
:admin-account-edit-dialog (-> account-edit-dialog
(wrap-form-4xx-2 (wrap-entity account-dialog [:form-params :db/id] default-read)))
:admin-account-edit-dialog (-> account-dialog
(wrap-entity [:route-params :db/id] default-read)
(wrap-schema-decode :route-schema [:map [:db/id entity-id]]))
:admin-account-new-dialog account-new-dialog})
:admin-account-new-dialog account-dialog})
(fn [h]
(-> h
(wrap-admin)