More standardization
This commit is contained in:
@@ -12,7 +12,8 @@
|
||||
[goog.i18n.NumberFormat.Format]
|
||||
[cljs-time.core :as t]
|
||||
[clojure.string :as str]
|
||||
[goog.crypt.base64 :as base64])
|
||||
[goog.crypt.base64 :as base64]
|
||||
[reagent.core :as r])
|
||||
(:import
|
||||
(goog.i18n NumberFormat)
|
||||
(goog.i18n.NumberFormat Format)))
|
||||
@@ -100,6 +101,85 @@
|
||||
(defn with-keys [children]
|
||||
(map-indexed (fn [i c] ^{:key i} c) children))
|
||||
|
||||
|
||||
(def css-transition-group
|
||||
(reagent/adapt-react-class js/ReactTransitionGroup.CSSTransition))
|
||||
|
||||
|
||||
(defn appearing [{:keys [visible? enter-class exit-class timeout]} & children ]
|
||||
(let [final-state (reagent/atom visible?)]
|
||||
(fn [{:keys [visible?]} & children]
|
||||
[css-transition-group {:in visible? :class-names {:exit exit-class :enter enter-class} :timeout timeout :onEnter (fn [] (reset! final-state true )) :onExited (fn [] (reset! final-state false))}
|
||||
(if (or @final-state visible?)
|
||||
(first children)
|
||||
[:span])])))
|
||||
|
||||
|
||||
(defn multi-field [{:keys [override-key override-value-key change-event default-key data value template on-change allow-change?]} ]
|
||||
(let [value-repr (r/atom (mapv
|
||||
(fn [x]
|
||||
(assoc x :key (random-uuid) :new? false))
|
||||
value))]
|
||||
(fn [{:keys [override-key override-value-key change-event default-key data value template on-change allow-change?]} ]
|
||||
(let [value @value-repr
|
||||
already-has-new-row? (= [:key :new?] (keys (last value)))
|
||||
value (if already-has-new-row?
|
||||
value
|
||||
(conj value {:key (random-uuid)
|
||||
:new? true}))]
|
||||
[:div
|
||||
(for [[i override] (map vector (range) value)
|
||||
:let [is-disabled? (if (= false allow-change?)
|
||||
(not (boolean (:new? override)))
|
||||
nil)]]
|
||||
^{:key (:key override)}
|
||||
[:div.level
|
||||
[:div.level-left
|
||||
[:div.level-item
|
||||
(if (:new? override)
|
||||
|
||||
[:div.icon.is-medium {:class (if (not= i (dec (count value)))
|
||||
"has-text-info")}
|
||||
[:i.fa.fa-plus]]
|
||||
[:div.icon.is-medium])]
|
||||
[:<> (for [[idx template] (map vector (range ) template)]
|
||||
^{:key idx}
|
||||
|
||||
[:div.level-item
|
||||
[update template 1 assoc
|
||||
:value (get-in override (get-in template [1 :field]))
|
||||
:disabled is-disabled?
|
||||
:on-change (fn [e]
|
||||
|
||||
(reset! value-repr
|
||||
(into []
|
||||
(filter (fn [r]
|
||||
(not= [:key :new?] (keys r)))
|
||||
(assoc-in value (into [i] (get-in template [1 :field])) (.. e -target -value ) ))))
|
||||
(on-change (mapv
|
||||
(fn [v]
|
||||
(dissoc v :new? :key))
|
||||
@value-repr)))]])
|
||||
]
|
||||
[:div.level-item
|
||||
[:a.button
|
||||
|
||||
{:disabled is-disabled?
|
||||
:on-click (fn []
|
||||
|
||||
(when-not is-disabled?
|
||||
(reset! value-repr (into []
|
||||
(filter (fn [{:keys [key ] :as v}]
|
||||
(not= key (:key override)))
|
||||
value)))
|
||||
|
||||
(on-change (mapv
|
||||
(fn [v]
|
||||
(dissoc v :new? :key))
|
||||
@value-repr))))}
|
||||
[:span.icon [:span.icon-remove]]]]
|
||||
]])]))))
|
||||
|
||||
(defmethod do-bind "select" [dom {:keys [field allow-nil? subscription event class value spec] :as keys} & rest]
|
||||
(let [field (if (keyword? field) [field] field)
|
||||
event (if (keyword? event) [event] event)
|
||||
@@ -158,6 +238,20 @@
|
||||
keys (dissoc keys :field :subscription :event :spec)]
|
||||
(into [dom keys] (with-keys rest))))
|
||||
|
||||
(defmethod do-bind "multi-field" [dom {:keys [field event subscription class spec] :as keys} & rest]
|
||||
(let [field (if (keyword? field) [field] field)
|
||||
event (if (keyword? event) [event] event)
|
||||
keys (assoc keys
|
||||
:on-change (fn [value]
|
||||
(println value)
|
||||
(re-frame/dispatch (conj (conj event field) value)))
|
||||
:value (get-in subscription field)
|
||||
:class (str class
|
||||
(when (and spec (not (s/valid? spec (get-in subscription field))))
|
||||
" is-danger")))
|
||||
keys (dissoc keys :field :subscription :event :spec)]
|
||||
(into [dom keys] (with-keys rest))))
|
||||
|
||||
|
||||
(defmethod do-bind "typeahead-entity" [dom {:keys [field event text-event subscription class spec match->text] :as keys} & rest]
|
||||
(let [field (if (keyword? field) [field] field)
|
||||
@@ -309,24 +403,11 @@
|
||||
[:div.field-body]
|
||||
(with-keys (map (fn [x] [:div.field x]) controls)))])
|
||||
|
||||
|
||||
|
||||
(def css-transition-group
|
||||
(reagent/adapt-react-class js/ReactTransitionGroup.CSSTransition))
|
||||
|
||||
(def date-picker
|
||||
(do
|
||||
(reagent/adapt-react-class (aget js/DatePicker "default"))))
|
||||
|
||||
|
||||
(defn appearing [{:keys [visible? enter-class exit-class timeout]} & children ]
|
||||
|
||||
(let [final-state (reagent/atom visible?)]
|
||||
(fn [{:keys [visible?]} & children]
|
||||
[css-transition-group {:in visible? :class-names {:exit exit-class :enter enter-class} :timeout timeout :onEnter (fn [] (reset! final-state true )) :onExited (fn [] (reset! final-state false))}
|
||||
(if (or @final-state visible?)
|
||||
(first children)
|
||||
[:span])])))
|
||||
|
||||
(defn local-now []
|
||||
(t/to-default-time-zone (t/now)))
|
||||
|
||||
Reference in New Issue
Block a user