More standardization

This commit is contained in:
Bryce Covert
2020-08-05 00:29:21 -07:00
parent e1ffeda851
commit 0fd8d4a1c1
8 changed files with 299 additions and 285 deletions

View File

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