| 
1 | 1 | (ns demo.main  | 
2 | 2 |   (:require [reagent.core :as r]  | 
 | 3 | +            [reagent.dom :as rdom]  | 
3 | 4 |             [demo.utils :as u]))  | 
4 | 5 | 
 
  | 
5 |  | -(def start-time (atom nil))  | 
6 |  | -(def last-measure (atom nil))  | 
 | 6 | +(defn is-selected? [selected id]  | 
 | 7 | +  (= id @selected))  | 
7 | 8 | 
 
  | 
8 |  | -(defn start-measure [name]  | 
9 |  | -  (reset! start-time (.now js/performance))  | 
10 |  | -  (reset! last-measure name))  | 
11 |  | - | 
12 |  | -(defn stop-measure []  | 
13 |  | -  (if-let [last @last-measure]  | 
14 |  | -    (.setTimeout js/window  | 
15 |  | -                 (fn []  | 
16 |  | -                   (reset! last-measure nil)  | 
17 |  | -                   (let [stop (.now js/performance)]  | 
18 |  | -                     (.log js/console (str last " took " (- stop @start-time)))))  | 
19 |  | -                 0)))  | 
20 |  | - | 
21 |  | -(defn row [data selected? on-click on-delete]  | 
22 |  | -  [:tr  | 
23 |  | -   {:class (if selected? "danger")}  | 
24 |  | -   [:td.col-md-1 (:id data)]  | 
25 |  | -   [:td.col-md-4  | 
26 |  | -    [:a {:on-click (fn [e] (on-click (:id data)))}  | 
27 |  | -     (:label data)]]  | 
28 |  | -   [:td.col-md-1  | 
29 |  | -    [:a {:on-click (fn [e] (on-delete (:id data)))}  | 
30 |  | -     [:span.glyphicon.glyphicon-remove  | 
31 |  | -      {:aria-hidden "true"}]]]  | 
32 |  | -   [:td.col-md-6]])  | 
 | 9 | +(defn row [data selected on-click on-delete]  | 
 | 10 | +  (let [selected? @(r/track is-selected? selected (:id data))]  | 
 | 11 | +    [:tr  | 
 | 12 | +     {:class (if selected? "danger")}  | 
 | 13 | +     [:td.col-md-1 (:id data)]  | 
 | 14 | +     [:td.col-md-4  | 
 | 15 | +      [:a {:on-click (fn [e] (on-click (:id data)))}  | 
 | 16 | +       (:label data)]]  | 
 | 17 | +     [:td.col-md-1  | 
 | 18 | +      [:a {:on-click (fn [e] (on-delete (:id data)))}  | 
 | 19 | +       [:span.glyphicon.glyphicon-remove  | 
 | 20 | +        {:aria-hidden "true"}]]]  | 
 | 21 | +     [:td.col-md-6]]))  | 
33 | 22 | 
 
  | 
34 | 23 | (defn main []  | 
35 | 24 |   (let [id-atom (atom 0)  | 
36 | 25 |         data (r/atom [])  | 
37 | 26 |         selected (r/atom nil)  | 
38 |  | -        print-duration  | 
39 |  | -        (fn print-duration [_]  | 
40 |  | -          (stop-measure))  | 
41 | 27 |         run  | 
42 | 28 |         (fn run [_]  | 
43 |  | -          (start-measure "run")  | 
44 | 29 |           (reset! data (vec (u/build-data id-atom 1000)))  | 
45 | 30 |           (reset! selected nil))  | 
46 | 31 |         run-lots  | 
47 | 32 |         (fn run-lots [_]  | 
48 |  | -          (start-measure "runLots")  | 
49 | 33 |           (reset! data (vec (u/build-data id-atom 10000)))  | 
50 | 34 |           (reset! selected nil))  | 
51 | 35 |         add  | 
52 | 36 |         (fn add [_]  | 
53 |  | -          (start-measure "add")  | 
54 | 37 |           (swap! data u/add id-atom))  | 
55 | 38 |         update-some  | 
56 | 39 |         (fn update-some []  | 
57 |  | -          (start-measure "update")  | 
58 | 40 |           (swap! data u/update-some))  | 
59 | 41 |         clear  | 
60 | 42 |         (fn clear []  | 
61 |  | -          (start-measure "clear")  | 
62 | 43 |           (reset! selected nil)  | 
63 | 44 |           (reset! data []))  | 
64 | 45 |         swap-rows  | 
65 | 46 |         (fn swap-rows []  | 
66 |  | -          (start-measure "swapRows")  | 
67 | 47 |           (swap! data u/swap-rows))  | 
68 | 48 |         select  | 
69 | 49 |         (fn select [id]  | 
70 |  | -          (start-measure "select")  | 
71 | 50 |           (reset! selected id))  | 
72 | 51 |         delete  | 
73 | 52 |         (fn delete [id]  | 
74 |  | -          (start-measure "delete")  | 
75 | 53 |           (swap! data u/delete-row id))]  | 
76 |  | -    (r/create-class  | 
77 |  | -      {:component-did-update print-duration  | 
78 |  | -       :component-did-mount print-duration  | 
79 |  | -       :reagent-render  | 
80 |  | -       (fn []  | 
81 |  | -         [:div.container  | 
82 |  | -          [:div.jumbotron  | 
83 |  | -           [:div.row  | 
84 |  | -            [:div.col-md-6  | 
85 |  | -             [:h1 "Reagent"]]  | 
86 |  | -            [:div.col-md-6  | 
87 |  | -             [:div.row  | 
88 |  | -              [:div.col-sm-6.smallpad  | 
89 |  | -               [:button.btn.btn-primary.btn-block  | 
90 |  | -                {:type "button"  | 
91 |  | -                 :id "run"  | 
92 |  | -                 :on-click run}  | 
93 |  | -                "Create 1,000 rows"]]  | 
94 |  | -              [:div.col-sm-6.smallpad  | 
95 |  | -               [:button.btn.btn-primary.btn-block  | 
96 |  | -                {:type "button"  | 
97 |  | -                 :id "runlots"  | 
98 |  | -                 :on-click run-lots}  | 
99 |  | -                "Create 10,000 rows"]]  | 
100 |  | -              [:div.col-sm-6.smallpad  | 
101 |  | -               [:button.btn.btn-primary.btn-block  | 
102 |  | -                {:type "button"  | 
103 |  | -                 :id "add"  | 
104 |  | -                 :on-click add}  | 
105 |  | -                "Append 1,000 rows"]]  | 
106 |  | -              [:div.col-sm-6.smallpad  | 
107 |  | -               [:button.btn.btn-primary.btn-block  | 
108 |  | -                {:type "button"  | 
109 |  | -                 :id "update"  | 
110 |  | -                 :on-click update-some}  | 
111 |  | -                "Update every 10th row"]]  | 
112 |  | -              [:div.col-sm-6.smallpad  | 
113 |  | -               [:button.btn.btn-primary.btn-block  | 
114 |  | -                {:type "button"  | 
115 |  | -                 :id "clear"  | 
116 |  | -                 :on-click clear}  | 
117 |  | -                "Clear"]]  | 
118 |  | -              [:div.col-sm-6.smallpad  | 
119 |  | -               [:button.btn.btn-primary.btn-block  | 
120 |  | -                {:type "button"  | 
121 |  | -                 :id "swaprows"  | 
122 |  | -                 :on-click swap-rows}  | 
123 |  | -                "Swap rows"]]]]]]  | 
124 |  | -          [:table.table.table-hover.table-striped.test-data  | 
125 |  | -           [:tbody  | 
126 |  | -            (let [s @selected]  | 
127 |  | -              (for [d @data]  | 
128 |  | -                ^{:key (:id d)}  | 
129 |  | -                [row  | 
130 |  | -                 d  | 
131 |  | -                 (identical? (:id d) s)  | 
132 |  | -                 select  | 
133 |  | -                 delete]))]]  | 
134 |  | -          [:span.preloadicon.glyphicon.glyphicon-remove  | 
135 |  | -           {:aria-hidden "true"}]])})))  | 
 | 54 | +    (fn []  | 
 | 55 | +      [:div.container  | 
 | 56 | +       [:div.jumbotron  | 
 | 57 | +        [:div.row  | 
 | 58 | +         [:div.col-md-6  | 
 | 59 | +          [:h1 "Reagent"]]  | 
 | 60 | +         [:div.col-md-6  | 
 | 61 | +          [:div.row  | 
 | 62 | +           [:div.col-sm-6.smallpad  | 
 | 63 | +            [:button.btn.btn-primary.btn-block  | 
 | 64 | +             {:type "button"  | 
 | 65 | +              :id "run"  | 
 | 66 | +              :on-click run}  | 
 | 67 | +             "Create 1,000 rows"]]  | 
 | 68 | +           [:div.col-sm-6.smallpad  | 
 | 69 | +            [:button.btn.btn-primary.btn-block  | 
 | 70 | +             {:type "button"  | 
 | 71 | +              :id "runlots"  | 
 | 72 | +              :on-click run-lots}  | 
 | 73 | +             "Create 10,000 rows"]]  | 
 | 74 | +           [:div.col-sm-6.smallpad  | 
 | 75 | +            [:button.btn.btn-primary.btn-block  | 
 | 76 | +             {:type "button"  | 
 | 77 | +              :id "add"  | 
 | 78 | +              :on-click add}  | 
 | 79 | +             "Append 1,000 rows"]]  | 
 | 80 | +           [:div.col-sm-6.smallpad  | 
 | 81 | +            [:button.btn.btn-primary.btn-block  | 
 | 82 | +             {:type "button"  | 
 | 83 | +              :id "update"  | 
 | 84 | +              :on-click update-some}  | 
 | 85 | +             "Update every 10th row"]]  | 
 | 86 | +           [:div.col-sm-6.smallpad  | 
 | 87 | +            [:button.btn.btn-primary.btn-block  | 
 | 88 | +             {:type "button"  | 
 | 89 | +              :id "clear"  | 
 | 90 | +              :on-click clear}  | 
 | 91 | +             "Clear"]]  | 
 | 92 | +           [:div.col-sm-6.smallpad  | 
 | 93 | +            [:button.btn.btn-primary.btn-block  | 
 | 94 | +             {:type "button"  | 
 | 95 | +              :id "swaprows"  | 
 | 96 | +              :on-click swap-rows}  | 
 | 97 | +             "Swap rows"]]]]]]  | 
 | 98 | +       [:table.table.table-hover.table-striped.test-data  | 
 | 99 | +        [:tbody  | 
 | 100 | +         (for [d @data]  | 
 | 101 | +           ^{:key (:id d)}  | 
 | 102 | +           [row  | 
 | 103 | +            d  | 
 | 104 | +            selected  | 
 | 105 | +            select  | 
 | 106 | +            delete])]]  | 
 | 107 | +       [:span.preloadicon.glyphicon.glyphicon-remove  | 
 | 108 | +        {:aria-hidden "true"}]])))  | 
136 | 109 | 
 
  | 
137 |  | -(r/render [main] (.getElementById js/document "main"))  | 
 | 110 | +(rdom/render [main] (.getElementById js/document "main"))  | 
0 commit comments