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

support optional most types.

when those values are set to the default value, then the fields are
deleted.
Lucas Stadler лет назад: 12
Родитель
Сommit
efd7dbcb97
1 измененных файлов с 24 добавлено и 25 удалено
  1. 24 25
      clj/clarity/cljs/clarity.cljs

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

30
      :else type)))
30
      :else type)))
31
31
32
(defmethod empty-value 'Boolean [{:keys [default]}]
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
(defmethod empty-value 'Number [{:keys [default]}]
37
(defmethod empty-value 'Number [{:keys [default]}]
39
  (or default 0))
38
  (or default 0))
60
                 [k (empty-value v)])
59
                 [k (empty-value v)])
61
               entries))))
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
(defmulti make-typed-input
72
(defmulti make-typed-input
74
  (fn [_ _ {type :type} & _]
73
  (fn [_ _ {type :type} & _]
77
      (map? type) (:type type)
76
      (map? type) (:type type)
78
      :else type)))
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
  (om/component
80
  (om/component
82
    (dom/input #js {:type "checkbox"
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
  (om/component
86
  (om/component
88
    (dom/input #js {:type "number"
87
    (dom/input #js {:type "number"
89
                    :value val
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
(def keyword-pattern "^:(\\w+|\\w+(\\.\\w+)*\\/\\w+)$")
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
  (om/component
94
  (om/component
96
    (dom/input #js {:type "text"
95
    (dom/input #js {:type "text"
97
                    :value val
96
                    :value val
98
                    :pattern keyword-pattern
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
  (om/component
101
  (om/component
103
    (dom/input #js {:type "text"
102
    (dom/input #js {:type "text"
104
                    :value val
103
                    :value val
105
                    :onChange (update-on-change! m key identity optional?)})))
104
                    :onChange (update-on-change! m key opts)})))
106
105
107
(defmethod make-typed-input 'Value [m owner {type :type}]
106
(defmethod make-typed-input 'Value [m owner {type :type}]
108
  (let [[_ value] type]
107
  (let [[_ value] type]
111
                   (into {:value (str value)
110
                   (into {:value (str value)
112
                          :readOnly "readOnly"}
111
                          :readOnly "readOnly"}
113
                         (cond
112
                         (cond
114
                           (instance? js/Boolean value) {:type "checkbox", :checked value}
113
                           (or (true? value) (false? value)) {:type "checkbox", :checked value}
115
                           (number? value) {:type "number"}
114
                           (number? value) {:type "number"}
116
                           (keyword? value) {:type "text", :pattern keyword-pattern}
115
                           (keyword? value) {:type "text", :pattern keyword-pattern}
117
                           :else {:type "text"})))))))
116
                           :else {:type "text"})))))))
120
  (let [[_ type] type]
119
  (let [[_ type] type]
121
    (make-typed-input m owner (assoc opts :type type))))
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
  (om/component
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
      (into-array
125
      (into-array
127
        (map (fn [[_ v]]
126
        (map (fn [[_ v]]
128
               (dom/option nil (str v)))
127
               (dom/option nil (str v)))