supports validation on complete
This commit is contained in:
@@ -34,45 +34,49 @@
|
||||
(get-in field-path)
|
||||
first))
|
||||
|
||||
(defn builder [{:keys [value on-change can-submit data-sub error-messages change-event submit-event id fullwidth? schema] :as z}]
|
||||
(defn builder [{:keys [value on-change can-submit data-sub error-messages change-event submit-event id fullwidth? schema validation-error-string]}]
|
||||
(when (and change-event on-change)
|
||||
(throw "Either the form is to be managed by ::forms, or it should have value and on-change passed in"))
|
||||
(let [data-sub (or data-sub [::forms/form id])
|
||||
change-event (when-not on-change
|
||||
(let [data-sub (or data-sub [::forms/form id])
|
||||
change-event (when-not on-change
|
||||
(or change-event [::forms/change id]))
|
||||
{:keys [data error visited] form-key :id} @(re-frame/subscribe data-sub)
|
||||
data (or value data)
|
||||
status @(re-frame/subscribe [::status/single id])
|
||||
can-submit (if can-submit @(re-frame/subscribe can-submit)
|
||||
{:keys [data error visited attempted-submit?] form-key :id} @(re-frame/subscribe data-sub)
|
||||
data (or value data)
|
||||
status @(re-frame/subscribe [::status/single id])
|
||||
can-submit (if can-submit @(re-frame/subscribe can-submit)
|
||||
true)
|
||||
problems (when schema
|
||||
problems (when schema
|
||||
(m/explain schema data))]
|
||||
|
||||
|
||||
(r/create-element Provider #js {:value #js {:can-submit can-submit
|
||||
:error-messages (or error-messages
|
||||
(r/create-element Provider #js {:value #js {:can-submit can-submit
|
||||
:error-messages (or error-messages
|
||||
nil)
|
||||
:on-change on-change
|
||||
:change-event change-event
|
||||
:blur-event [::forms/visited id]
|
||||
:visited visited
|
||||
:submit-event submit-event
|
||||
:problems problems
|
||||
:error error
|
||||
:status status
|
||||
:id id
|
||||
:data data
|
||||
:fullwidth? fullwidth?}}
|
||||
:on-change on-change
|
||||
:change-event change-event
|
||||
:blur-event [::forms/visited id]
|
||||
:visited visited
|
||||
:submit-event submit-event
|
||||
:problems problems
|
||||
:attempted-submit? attempted-submit?
|
||||
:error error
|
||||
:status status
|
||||
:id id
|
||||
:data data
|
||||
:fullwidth? fullwidth?}}
|
||||
(r/as-element
|
||||
^{:key form-key}
|
||||
[:form {:on-submit (fn [e]
|
||||
(when (.-stopPropagation e)
|
||||
(.stopPropagation e)
|
||||
(.preventDefault e))
|
||||
(when can-submit
|
||||
(re-frame/dispatch-sync (vec (conj submit-event {})))))}
|
||||
(if (and schema (not (m/validate schema data)))
|
||||
(do
|
||||
(re-frame/dispatch-sync [::status/dispose-single id])
|
||||
(re-frame/dispatch [::status/error id [{:message (or validation-error-string "Please fix the errors and try again.")}]])
|
||||
(re-frame/dispatch [::forms/attempted-submit id]))
|
||||
(when can-submit
|
||||
(re-frame/dispatch-sync (vec (conj submit-event {}))))))}
|
||||
(into [:fieldset {:disabled (boolean (= :loading (:state status)))}]
|
||||
(r/children (r/current-component)))]
|
||||
(r/children (r/current-component)))]
|
||||
))))
|
||||
|
||||
(defn virtual-builder []
|
||||
@@ -155,9 +159,10 @@
|
||||
|
||||
:else
|
||||
nil)
|
||||
visited? (get (aget consume-form "visited") full-field-path)]
|
||||
visited? (get (aget consume-form "visited") full-field-path)
|
||||
attempted-submit? (aget consume-form "attempted-submit?")]
|
||||
(when-let [error-message (and
|
||||
visited?
|
||||
(or visited? attempted-submit?)
|
||||
(spec-error-message (aget consume-form "problems") full-field-path (aget consume-form "error-messages")))]
|
||||
[:div
|
||||
[:p.help.has-text-danger error-message]]))))]))])
|
||||
@@ -184,9 +189,10 @@
|
||||
:else
|
||||
nil)
|
||||
visited? (get (aget consume-form "visited") full-field-path)
|
||||
attempted-submit? (aget consume-form "attempted-submit?")
|
||||
value (get-in (aget consume-form "data") full-field-path)
|
||||
on-change (aget consume-form "on-change")]
|
||||
(-> child-props
|
||||
(-> child-props
|
||||
(assoc :on-change
|
||||
(if on-change
|
||||
(partial form-change-handler (aget consume-form "data") full-field-path (aget consume-form "on-change"))
|
||||
@@ -196,7 +202,7 @@
|
||||
(update :class (fn [class]
|
||||
(str class
|
||||
(cond
|
||||
(not visited?)
|
||||
(and (not visited?) (not attempted-submit?))
|
||||
""
|
||||
(not (valid-field? (aget consume-form "problems") full-field-path))
|
||||
" is-danger"
|
||||
@@ -317,5 +323,3 @@
|
||||
(when-let [error (aget consume "error")]
|
||||
^{:key error}
|
||||
[:div.has-text-danger.animated.fadeInUp {} error])))]))
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user