     (reify
       om/IDidUpdate
       (did-update [_ prev-props prev-state]
-        (.error js/console  "update called.")
         (let [el (om/get-node owner)]
           (visualize-insights-bar! el chart-builds)))
       om/IRender

        (.append "rect")
        (.attr #js {"width" square-size
                    "height" square-size
                    "class" #(.-classname %)
                    "transform"
                    (fn [item i]
                      (gstring/format "translate(%s,%s)" 0  (- (+ square-size))))}))
    (-> left-legend-item
        (.append "text")
        (.attr #js {"x" (+ square-size spacing)})
        (.text #(.-text %)))

    ;; right legend
    (-> right-legend-item
        (.append "rect")
        (.attr #js {"width" square-size
                    "height" square-size
                    "class" #(.-classname %)
                    "transform"
                    (fn [item i]
                      (gstring/format "translate(%s,%s)" 0  (- (+ square-size))))}))

    ;; positive bar
    (-> enter
        (.insert "rect")
        (.attr #js {"class" #(str "bar " (aget % "outcome"))
                    "y" #(y-pos-scale (aget % "build_time_minutes"))
                    "x" #(x-scale (aget % "build_num"))
                    "width" (.rangeBand x-scale)
                    "height" #(- y-middle (y-pos-scale (aget % "build_time_minutes")))}))

    ;; negative (queue time) bar
    (-> enter
        (.insert "rect")
        (.attr #js {"class" "bar queue"
                    "y" y-middle
                    "x" #(x-scale (aget % "build_num"))
                    "width" (.rangeBand x-scale)
                    "height" #(- (y-neg-scale (aget % "queued_time_minutes")) y-middle)}))))

(defn chartable-builds [builds]
  (->> builds
