Просмотр исходного кода

support adding dynamic fields.

Lucas Stadler лет назад: 12
Родитель
Сommit
f49013a086
1 измененных файлов с 26 добавлено и 0 удалено
  1. 26 0
      clj/clarity/cljs/clarity.cljs

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

134
      (om/build make-typed-input m {:opts {:type (om/value t), :key k, :val (k m)
134
      (om/build make-typed-input m {:opts {:type (om/value t), :key k, :val (k m)
135
                                           :optional? optional?}}))))
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
(defmethod make-typed-input 'HMap [m owner {type :type}]
162
(defmethod make-typed-input 'HMap [m owner {type :type}]
138
  (let [hmap (apply hash-map (rest type))
163
  (let [hmap (apply hash-map (rest type))
139
        required (:mandatory hmap)
164
        required (:mandatory hmap)
143
        (dom/span nil "{")
168
        (dom/span nil "{")
144
        (into-array (map (make-typed-field m false) required))
169
        (into-array (map (make-typed-field m false) required))
145
        (into-array (map (make-typed-field m true) optional))
170
        (into-array (map (make-typed-field m true) optional))
171
        (om/build make-dynamic-field m {:opts type})
146
        (dom/span nil "}")))))
172
        (dom/span nil "}")))))
147
173
148
(def app-state
174
(def app-state