drawPlot:function()

in ambari-web/app/views/common/chart.js [137:243]


  drawPlot:function () {
    this.clearPlot();

    var renderer = this;
    this.x.domain([renderer.getMinDate({}), renderer.getMaxDate({})]);

    var rule = $('<div></div>').addClass("rule").css('height', renderer.get('ruleHeight')).mouseenter(function () { $(this).hide(); });
    $(this.get('chartContainerSelector')).prepend(rule);

    var vis = d3.select(this.get('chartContainerSelector'))
      .append("svg:svg")
      .attr("width", renderer.get('w') + 5)
      .attr("height", renderer.get('h'))
      .attr("rendererId", this.get('elementId'))
      .on("mousemove", function () {

        var area = d3.select(this).select("path.line");
        var d = area.data()[0];
        var x = d3.mouse(this)[0];

        var renderer = Em.View.views[d3.select(this).attr('rendererId')];
        var container = $(this).parent();
        var scale = renderer.x;

        // first move rule
        var rule = $(container).children("div.rule");
        rule.css("left", (168 + x) + "px"); // 168 - left container margin
        rule.show();

        x = x + 5; // some correction
        var selectedDate = scale.invert(x);

        // search date between this coordinates
        var prevVal = false;
        var nextVal = d[0];

        $.each(d, function (i, point) {
          if (renderer.getDate(point).getTime() <= selectedDate.getTime()) {
            prevVal = nextVal;
            nextVal = point;
          } else {
            return;
          }
        });

        var len1 = Math.abs(x - scale(renderer.getDate(prevVal)));
        var len2 = Math.abs(x - scale(renderer.getDate(nextVal)));

        var clearing = 5;
        var pointToShow = false;
        // if the first point if closer
        if ((len1 < len2) && (len1 <= clearing)) {
          pointToShow = prevVal;
        } else if (len2 <= clearing) { // the second point is closer
          pointToShow = nextVal;
        }

        $.each(renderer.get('nodeAttributes'), function (i, v) {
          var value = !pointToShow ? "" : pointToShow[v] + "%";
          $(rule).children("div." + v).html(value);
        });
      });

    vis.append("svg:g")
      .attr("class", "axis")
      .attr("transform", "translate(0," + this.get('p') + ")")
      .call(renderer.axis)

    $.each(this.get('nodeAttributes'), function (i, v) {
      var element = $('<div></div>').addClass(v).addClass("stateValue").html("");
      rule.append(element);
    });

    var shift = this.getDefaultShift();
    vis.append("svg:path")
      .attr("class", "horizontal-line")
      .data([
      {}
    ])
      .attr("transform", "translate(0," + (shift - this.get('areaHeight')) + ")")
      .attr("d", renderer.line())
      .style("stroke", "#000");

    $.each(this.get('nodeAttributes'), function (i, v) {
      vis.append("svg:path").data([
        {}
      ])
        .attr("class", "line")
        .attr("getter", v)
        .attr("transform", "translate(0, " + shift + ")")
        .attr("d", renderer.area())
        .style("fill", function () {
          return "#31a354";
        });

      vis.append("svg:path")
        .attr("class", "horizontal-line")
        .data([
        {}
      ])
        .attr("transform", "translate(0," + shift + ")")
        .attr("d", renderer.line())
        .style("stroke", "#000");

      shift += renderer.get('areaHeight');
    });
  },