Skip to content

Commit 0738679

Browse files
committed
checkbox intermediate status
1 parent 630746f commit 0738679

File tree

2 files changed

+57
-31
lines changed

2 files changed

+57
-31
lines changed

‎project.clj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
(defproject org.clojars.intception/om-widgets "0.3.36"
1+
(defproject org.clojars.intception/om-widgets "0.3.37"
22
:description "Widgets for OM/React"
33
:url "https://github.com/orgs/intception/"
44
:license {:name "Eclipse Public License"

‎src/om_widgets/checkbox.cljs

Lines changed: 56 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -14,34 +14,59 @@
1414
(defn- check
1515
[app owner]
1616
(reify
17+
om/IDidMount
18+
(did-mount [this]
19+
(set! (.-indeterminate (om/get-node owner)) (om/get-state owner :intermediate)))
20+
21+
om/IDidUpdate
22+
(did-update [this prev-props prev-state]
23+
(set! (.-indeterminate (om/get-node owner)) (om/get-state owner :intermediate)))
24+
1725
om/IRenderState
18-
(render-state [this {:keys [label id class-name title path disabled on-change checked-value unchecked-value toggle-value]}]
26+
(render-state [this {:keys [id path disabled on-change checked-value unchecked-value toggle-value]}]
27+
(html
28+
[:input {:type "checkbox"
29+
:id (name id)
30+
:disabled disabled
31+
:checked (checked? (utils/om-get app path) checked-value)
32+
:onChange (fn [e]
33+
(let [value (if (.. e -target -checked) checked-value unchecked-value)
34+
dest (get @(om/get-props owner) path)]
35+
36+
(if toggle-value
37+
(if (contains? dest checked-value)
38+
(utils/om-update! (om/get-props owner) path (disj dest checked-value))
39+
(utils/om-update! (om/get-props owner) path (conj dest checked-value)))
40+
(utils/om-update! (om/get-props owner) path value))
41+
42+
;; TODO this is done to force a refresh
43+
(when (utils/atom? (om/get-props owner))
44+
(om/set-state! owner ::force-refresh (not (om/get-state owner ::force-refresh))))
45+
46+
(when on-change (on-change value))))}]))))
47+
48+
49+
(defn- check-box
50+
[app owner]
51+
(reify
52+
om/IRenderState
53+
(render-state [this {:keys [label id class-name title path disabled on-change checked-value unchecked-value toggle-value intermediate]}]
1954
(html
2055
[:div (-> {:class [class-name
2156
(when (checked? (utils/om-get app path) checked-value) "active")]}
2257
(merge (when title) {:title title}))
2358
[:label {:class ["om-widgets-label"
2459
(when disabled "text-muted")]
2560
:htmlFor (name id)}
26-
[:input {:type "checkbox"
27-
:id (name id)
28-
:disabled disabled
29-
:checked (checked? (utils/om-get app path) checked-value)
30-
:onChange (fn [e]
31-
(let [value (if (.. e -target -checked) checked-value unchecked-value)
32-
dest (get @(om/get-props owner) path)]
33-
34-
(if toggle-value
35-
(if (contains? dest checked-value)
36-
(utils/om-update! (om/get-props owner) path (disj dest checked-value))
37-
(utils/om-update! (om/get-props owner) path (conj dest checked-value)))
38-
(utils/om-update! (om/get-props owner) path value))
39-
40-
;; TODO this is done to force a refresh
41-
(when (utils/atom? (om/get-props owner))
42-
(om/set-state! owner ::force-refresh (not (om/get-state owner ::force-refresh))))
61+
(om/build check app {:state {:id id
62+
:path path
63+
:disabled disabled
64+
:on-change on-change
65+
:checked-value checked-value
66+
:intermediate intermediate
67+
:unchecked-value unchecked-value
68+
:toggle-value toggle-value}})
4369

44-
(when on-change (on-change value))))}]
4570
label]]))))
4671

4772
;; ---------------------------------------------------------------------
@@ -64,18 +89,19 @@
6489
;; ---------------------------------------------------------------------
6590
;; Public
6691
(defn checkbox
67-
[app path {:keys [label id title disabled class-name on-change onChange checked-value unchecked-value toggle-value] :as opts
92+
[app path {:keys [label id title disabled class-name on-change onChange checked-value unchecked-value toggle-value intermediate] :as opts
6893
:or {class-name "checkbox"
6994
checked-value true
7095
unchecked-value false
7196
toggle-value false}}]
72-
(om/build check app {:state {:label label
73-
:title title
74-
:id (or id path)
75-
:class-name class-name
76-
:checked-value checked-value
77-
:unchecked-value unchecked-value
78-
:toggle-value toggle-value
79-
:disabled disabled
80-
:on-change (or on-change onChange)
81-
:path path}}))
97+
(om/build check-box app {:state {:label label
98+
:title title
99+
:id (or id path)
100+
:class-name class-name
101+
:checked-value checked-value
102+
:unchecked-value unchecked-value
103+
:toggle-value toggle-value
104+
:intermediate intermediate
105+
:disabled disabled
106+
:on-change (or on-change onChange)
107+
:path path}}))

0 commit comments

Comments
 (0)