    :get-initial-state
    (fn [{:keys [props]}]
      {:ordered-columns (vec (map-indexed
-                              (fn [index col] (assoc col :index index :showing? true
-                                                         :width (or (:starting-width col) 100)
-                                                         :starting-width (or (:starting-width col) 100)))
-                              (:columns props)))
-      :dragging? false
-      :filtered-data (:data props)})
+                             (fn [index col]
+                               (assoc col
+                                      :index index :showing? true
+                                      :width (or (:starting-width col) 100)
+                                      :starting-width (or (:starting-width col) 100)))
+                             (:columns props)))
+      :dragging? false})
    :render
    (fn [{:keys [this state props refs]}]
      (let [paginator-above (= :above (:paginator props))
            paginator-below (= :below (:paginator props))
            paginator [Paginator {:ref "paginator"
-                                 :num-rows-visible (count (:filtered-data @state))
                                  :num-total-rows (count (:data props))
-                                 :onChange #(react/call :handle-pagination-change this)}]]
+                                 :onChange #(react/call :set-body-rows this)}]]
        [:div {}
         (when (or (:filterable? props) (:reorderable-columns? props))
           [:div {:style {:padding "0 0 1em 1em"}}
            (when (:filterable? props)
              [:div {:style {:float "left" :marginRight "1em"}}
-              [Filterer {:ref "filterer" :onFilter (fn [text] (react/call :filter-data this text))}]])
+              [Filterer {:ref "filterer" :onFilter #(react/call :set-body-rows this)}]])
            (when (:reorderable-columns? props)
              [:div {:style {:float "left"}}
               [comps/Button {:icon :gear :title-text "Select Columns..." :ref "col-edit-button"

        (when paginator-above [:div {:style {:paddingBottom (:paginator-space props)}} paginator])
        [:div {:style {:overflowX "auto"}}
         [:div {:style {:position "relative"
                        :minWidth (reduce + (map :width (filter :showing? (:ordered-columns @state))))
                        :cursor (when (:dragging? @state) "col-resize")}}
          (render-header state props)
          [Body (assoc props
                  :ref "body"
                  :columns (filter :showing? (:ordered-columns @state))
                  :initial-rows (react/call :get-sliced-data this true))]]]
        (when paginator-below [:div {:style {:paddingTop (:paginator-space props)}} paginator])]))
   :get-sliced-data
   (fn [{:keys [state refs]} & [initial-render?]]
     (let [[n c] (if initial-render?
                   [1 initial-rows-per-page]
                   (react/call :get-current-slice (@refs "paginator")))
           filtered-data (:filtered-data @state)
           sorted-data (if-let [keyfn (:key-fn @state)] (sort-by keyfn filtered-data) filtered-data)
           ordered-data (if (= :desc (:sort-order @state)) (reverse sorted-data) sorted-data)]
       (take c (drop (* (dec n) c) ordered-data))))
   :filter-data
   (fn [{:keys [state props]} & [filter-text]]
     (let [filtered-data
           (if (empty? filter-text)
             (:data props)
             (filter (fn [row]
                       (utils/matches-filter-text
                         (apply str (map-indexed
                                      (fn [i column]
                                        (if-let [f (:filter-by column)]
                                          (if (= f :none) "" (f (nth row i)))
                                          (str (nth row i))))
                                      (:columns props)))
                         filter-text))
               (:data props)))]
       (swap! state assoc :filtered-data filtered-data)))
   :handle-pagination-change
   (fn [{:keys [this refs]}]
     (react/call :set-rows (@refs "body") (react/call :get-sliced-data this)))
   :component-will-receive-props
   (fn [{:keys [state next-props refs]}]
     (swap! state assoc :filtered-data (:data next-props))
     (react/call :make-desynced (@refs "filterer")))
   :component-did-mount
   (fn [{:keys [this state]}]


         [:div {:style {:float "left" :display "inline-block" :width "33.33%" :padding "2.15em 0em"
                        :verticalAlign "middle"}}
          [:b {} (str left-num " - " right-num)]
          (str " of " (pluralize num-rows-visible " result")
               (when-not (= num-rows-visible (:num-total-rows props))
                 (str " (filtered from " (:num-total-rows props) " total)")))]
         (style/create-unselectable
          :div {:style {:float "left" :display "inline-block" :width "33.33%"
                        :padding "1.6em 0em" :verticalAlign "middle" :textAlign "center"}}
           [:div {:style {:display "inline-block" :padding "0.55em 0.9em"
                          :color (if allow-prev
                                   (:button-blue style/colors)
                                   (:border-gray style/colors))
                          :cursor (when allow-prev "pointer")}
                  :onClick (when allow-prev #(swap! state update-in [:current-page] dec))}
            (icons/font-icon {:style {:fontSize "70%"}} :angle-left)
            [:span {:style {:paddingLeft "1em"}} "Prev"]]
           [:span {}
            (map (fn [n]
                   (let [selected? (= n current-page)]
