|
|
|
@ -9,14 +9,17 @@
|
|
|
|
|
|
|
|
|
|
(spec/def ::label string?)
|
|
|
|
|
(spec/def ::required boolean?)
|
|
|
|
|
(spec/def ::spec keyword?)
|
|
|
|
|
(spec/def ::spec
|
|
|
|
|
(spec/or :registered-spec keyword?
|
|
|
|
|
:predicate ifn?))
|
|
|
|
|
(spec/def ::options
|
|
|
|
|
(spec/or :empty empty?
|
|
|
|
|
:options (spec/coll-of (spec/tuple string? string?))))
|
|
|
|
|
(spec/def ::widget
|
|
|
|
|
#{:input :select :checkbox :textarea :mselect :hidden})
|
|
|
|
|
(spec/def ::from-req
|
|
|
|
|
(spec/and fn? #(= 1 (->> % meta :arglists (map count) first))))
|
|
|
|
|
(spec/and ifn? ;;#(= 1 (->> % meta :arglists (map count) first))
|
|
|
|
|
))
|
|
|
|
|
(spec/def ::to-form ::from-req)
|
|
|
|
|
(spec/def ::field
|
|
|
|
|
(spec/keys :req-un [::label]
|
|
|
|
@ -122,7 +125,8 @@
|
|
|
|
|
(str (hash [def values])))
|
|
|
|
|
|
|
|
|
|
(defn render-widgets [form-def values req]
|
|
|
|
|
{:pre [(spec/valid? ::form form-def)]}
|
|
|
|
|
(when-not (spec/valid? ::form form-def)
|
|
|
|
|
(throw (ex-info "Form def fails spec" (spec/explain-data ::form form-def))))
|
|
|
|
|
(let [form-hash (form-hash form-def values)
|
|
|
|
|
submitted-hash (get-in req [:params :__form-hash])
|
|
|
|
|
validate? (= form-hash submitted-hash)]
|
|
|
|
@ -141,7 +145,8 @@
|
|
|
|
|
(anti-forgery-field))))
|
|
|
|
|
|
|
|
|
|
(defn form-data [form-def req]
|
|
|
|
|
{:pre [(spec/valid? ::form form-def)]}
|
|
|
|
|
(when-not (spec/valid? ::form form-def)
|
|
|
|
|
(throw (ex-info "Form def fails spec" (spec/explain-data ::form form-def))))
|
|
|
|
|
(reduce (fn [coll [id field]]
|
|
|
|
|
(let [value (get-in req [:params id])]
|
|
|
|
|
(assoc coll
|
|
|
|
|