|
|
@ -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)))
|