Преглед на файлове

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