From 245342fa8f833c2ad0335e7ab1b0999436400143 Mon Sep 17 00:00:00 2001 From: Josha von Gizycki Date: Thu, 27 Sep 2018 16:47:52 +0200 Subject: [PATCH] turn widget rendering upside down --- src/wanijo/framework/form.clj | 132 +++++++++++++++------------------- 1 file changed, 57 insertions(+), 75 deletions(-) diff --git a/src/wanijo/framework/form.clj b/src/wanijo/framework/form.clj index 1f25a0a..e83d1c2 100644 --- a/src/wanijo/framework/form.clj +++ b/src/wanijo/framework/form.clj @@ -82,71 +82,57 @@ true (:params req))) -(defn render-input [id {:keys [label required spec]} value req-value validate?] - (list - (when (and validate? (not (spec/valid? spec req-value))) - (spec-to-errmsg label spec req-value)) - (hform/label id label) - (hform/text-field {:required (or required false)} - id - (if validate? req-value value)))) - -(defn render-checkbox [id {:keys [label spec]} value req-value validate?] - (list - (when (and validate? (not (spec/valid? spec req-value))) - (spec-to-errmsg label spec value)) - (hform/label id label) - (hform/check-box id - (and (some? value) (not= 0 value)) - (if validate? req-value value)))) - -(defn render-textarea [id - {:keys [label required spec]} - value - req-value - validate?] - (list - (when (and validate? (not (spec/valid? spec req-value))) - (spec-to-errmsg label spec value)) - (hform/label id label) - (hform/text-area {:required (or required false)} +(defn input-widget [id def value] + (hform/text-field {:required (or (:required def) false)} id - (if validate? req-value value)))) - -(defn render-select [id {:keys [label spec options]} value req-value validate?] - (list - (when (and validate? (not (spec/valid? spec req-value))) - (spec-to-errmsg label spec value)) - (hform/label id label) - (hform/drop-down id - options - (if validate? req-value value)))) - -(defn render-multiselect [id - {:keys [label spec options]} - value - req-value - validate?] - (list - (when (and validate? (not (spec/valid? spec req-value))) - (spec-to-errmsg label spec value)) - (hform/label id label) - [:select {:multiple "multiple" - :size 5 - :name (name id) - :id (name id)} - (for [option options] - [:option {:value (second option) - :selected (in? (if validate? req-value value) - (second option))} - (first option)])])) - -(def render-mapping - {:input render-input - :checkbox render-checkbox - :textarea render-textarea - :select render-select - :mselect render-multiselect}) + value)) + +(defn checkbox-widget [id def value] + (hform/check-box id + (and (some? value) + (not= 0 value)) + value)) + +(defn textarea-widget [id def value] + (hform/text-area {:required (or (:required def) false)} + id + value)) + +(defn select-widget [id def value] + (hform/drop-down id + (:options def) + value)) + +(defn multiselect-widget [id def value] + (let [options (:options def)] + [:select {:multiple "multiple" + :size 5 + :name (name id) + :id (name id)} + (for [option options] + [:option {:value (second option) + :selected (in? value (second option))} + (first option)])])) + +(def widget-mapping + {:input input-widget + :checkbox checkbox-widget + :textarea textarea-widget + :select select-widget + :mselect multiselect-widget}) + +(defn widget + [id def value req-value validate?] + (let [{:keys [label spec widget options]} def + widget (cond (some? widget) widget + (some? options) :select + :else :input) + renderer (widget widget-mapping)] + (list + (when (and validate? (not (spec/valid? spec req-value))) + (spec-to-errmsg label spec req-value)) + (hform/label id label) + (renderer id def (if validate? req-value value))))) (defn form-hash [def values] (str (hash [def values]))) @@ -158,18 +144,14 @@ validate? (= form-hash submitted-hash)] (conj (map (fn [[field-id field-def]] - (let [{:keys [options widget to-form]} field-def + (let [{:keys [options to-form]} field-def value (field-id values) - req-value (get-in req [:params field-id]) - widget (cond (some? widget) widget - (some? options) :select - :else :input) - widget-renderer (widget render-mapping)] - (widget-renderer field-id - field-def - (if to-form (to-form value) value) - req-value - validate?))) + req-value (get-in req [:params field-id])] + (widget field-id + field-def + (if to-form (to-form value) value) + req-value + validate?))) (:fields form-def)) (hform/hidden-field "__form-hash" form-hash) (anti-forgery-field))))