ソースを参照

support optional most types.

when those values are set to the default value, then the fields are
deleted.
Lucas Stadler 12 年 前
コミット
efd7dbcb97
共有1 個のファイルを変更した24 個の追加25 個の削除を含む
  1. 24 25
      clj/clarity/cljs/clarity.cljs

+ 24 - 25
clj/clarity/cljs/clarity.cljs

@ -30,10 +30,9 @@
30 30
      :else type)))
31 31
32 32
(defmethod empty-value 'Boolean [{:keys [default]}]
33
  (js/Boolean.
34
    (if-not (nil? default)
35
      default
36
      false)))
33
  (if-not (nil? default)
34
    default
35
    false))
37 36
38 37
(defmethod empty-value 'Number [{:keys [default]}]
39 38
  (or default 0))
@ -60,15 +59,15 @@
60 59
                 [k (empty-value v)])
61 60
               entries))))
62 61
63
(defn update-on-change!
64
  ([m k] (update-on-change! m k identity))
65
  ([m k transform-fn] (update-on-change! m k transform-fn false))
66
  ([m k transform-fn optional?]
67
   (fn [ev]
68
     (let [new-val (transform-fn (.. ev -target -value))]
69
       (if (and optional? (empty? new-val))
70
         (om/update! m dissoc k)
71
         (om/transact! m k (fn [_ n] n) new-val))))))
62
(defn update-on-change! [m k {:keys [extract-fn transform-fn optional? type]
63
                              :or {extract-fn #(.-value %)
64
                                   transform-fn identity
65
                                   type 'String}}]
66
  (fn [ev]
67
    (let [new-val (transform-fn (extract-fn (.-target ev)))]
68
      (if (and optional? (= new-val (empty-value type)))
69
        (om/update! m dissoc k)
70
        (om/transact! m k (fn [_ n] n) new-val)))))
72 71
73 72
(defmulti make-typed-input
74 73
  (fn [_ _ {type :type} & _]
@ -77,32 +76,32 @@
77 76
      (map? type) (:type type)
78 77
      :else type)))
79 78
80
(defmethod make-typed-input 'Boolean [m owner {:keys [type key val]}]
79
(defmethod make-typed-input 'Boolean [m owner {:keys [type key val] :as opts}]
81 80
  (om/component
82 81
    (dom/input #js {:type "checkbox"
83
                    :checked (.valueOf (or val (empty-value type)))
84
                    :onChange #(om/transact! m key (fn [_ n] n) (js/Boolean. (.. % -target -checked)))})))
82
                    :checked (or val (empty-value type))
83
                    :onChange (update-on-change! m key (assoc opts :extract-fn #(.-checked %)))})))
85 84
86
(defmethod make-typed-input 'Number [m owner {:keys [key val]}]
85
(defmethod make-typed-input 'Number [m owner {:keys [key val] :as opts}]
87 86
  (om/component
88 87
    (dom/input #js {:type "number"
89 88
                    :value val
90
                    :onChange (update-on-change! m key js/parseFloat)})))
89
                    :onChange (update-on-change! m key (assoc opts :transform-fn js/parseFloat))})))
91 90
92 91
(def keyword-pattern "^:(\\w+|\\w+(\\.\\w+)*\\/\\w+)$")
93 92
94
(defmethod make-typed-input 'Keyword [m owner {:keys [key val]}]
93
(defmethod make-typed-input 'Keyword [m owner {:keys [key val] :as opts}]
95 94
  (om/component
96 95
    (dom/input #js {:type "text"
97 96
                    :value val
98 97
                    :pattern keyword-pattern
99
                    :onChange (update-on-change! m key #(or (read-keyword %) (empty-value type)))})))
98
                    :onChange (update-on-change! m key (assoc opts :transform-fn #(or (read-keyword %) (empty-value type))))})))
100 99
101
(defmethod make-typed-input 'String [m owner {:keys [type key val optional?]}]
100
(defmethod make-typed-input 'String [m owner {:keys [type key val] :as opts}]
102 101
  (om/component
103 102
    (dom/input #js {:type "text"
104 103
                    :value val
105
                    :onChange (update-on-change! m key identity optional?)})))
104
                    :onChange (update-on-change! m key opts)})))
106 105
107 106
(defmethod make-typed-input 'Value [m owner {type :type}]
108 107
  (let [[_ value] type]
@ -111,7 +110,7 @@
111 110
                   (into {:value (str value)
112 111
                          :readOnly "readOnly"}
113 112
                         (cond
114
                           (instance? js/Boolean value) {:type "checkbox", :checked value}
113
                           (or (true? value) (false? value)) {:type "checkbox", :checked value}
115 114
                           (number? value) {:type "number"}
116 115
                           (keyword? value) {:type "text", :pattern keyword-pattern}
117 116
                           :else {:type "text"})))))))
@ -120,9 +119,9 @@
120 119
  (let [[_ type] type]
121 120
    (make-typed-input m owner (assoc opts :type type))))
122 121
123
(defmethod make-typed-input 'U [m owner {:keys [type key val]}]
122
(defmethod make-typed-input 'U [m owner {:keys [type key val] :as opts}]
124 123
  (om/component
125
    (dom/select #js {:onChange (update-on-change! m key r/read-string)}
124
    (dom/select #js {:onChange (update-on-change! m key (assoc opts :transform-fn r/read-string))}
126 125
      (into-array
127 126
        (map (fn [[_ v]]
128 127
               (dom/option nil (str v)))