Przeglądaj źródła

support adding dynamic fields.

Lucas Stadler 12 lat temu
rodzic
commit
f49013a086
1 zmienionych plików z 26 dodań i 0 usunięć
  1. 26 0
      clj/clarity/cljs/clarity.cljs

+ 26 - 0
clj/clarity/cljs/clarity.cljs

@ -134,6 +134,31 @@
134 134
      (om/build make-typed-input m {:opts {:type (om/value t), :key k, :val (k m)
135 135
                                           :optional? optional?}}))))
136 136
137
(defn read-string-safe [s default]
138
  (let [r (r/push-back-reader s)]
139
    (r/read r false default false)))
140
141
(defn update-dynamic-field! [type owner]
142
  (fn [ev]
143
    (let [k (om/get-state owner :key)
144
          t (read-string-safe (om/get-state owner :type) nil)]
145
      (when (and k t)
146
        (om/transact! type [4] (fn [optional]
147
                                 (assoc optional k t)))
148
        (om/set-state! owner :key nil)
149
        (om/set-state! owner :type nil)))))
150
151
(defn make-dynamic-field [m owner type]
152
  (om/component
153
    (dom/div #js {:className "field"}
154
      (dom/input #js {:type "button", :value "+"
155
                      :onClick (update-dynamic-field! type owner)})
156
      (dom/input #js {:type "text", :pattern keyword-pattern, :placeholder ":a.key/word"
157
                      :value (om/get-state owner :key)
158
                      :onChange #(om/set-state! owner :key (read-keyword (.. % -target -value)))})
159
      (dom/input #js {:type "text", :value (om/get-state owner :type)
160
                      :onChange #(om/set-state! owner :type (.. % -target -value))}))))
161
137 162
(defmethod make-typed-input 'HMap [m owner {type :type}]
138 163
  (let [hmap (apply hash-map (rest type))
139 164
        required (:mandatory hmap)
@ -143,6 +168,7 @@
143 168
        (dom/span nil "{")
144 169
        (into-array (map (make-typed-field m false) required))
145 170
        (into-array (map (make-typed-field m true) optional))
171
        (om/build make-dynamic-field m {:opts type})
146 172
        (dom/span nil "}")))))
147 173
148 174
(def app-state