123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 |
- /**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- import BaseChartComponent from 'yarn-ui/components/base-chart-component';
- import Mock from 'yarn-ui/utils/mock';
- export default BaseChartComponent.extend({
- MAX_BAR_HEIGHT: 120,
- MAX_BAR_WIDTH: 30,
- GAP: 5,
- filter: "",
- WIDTH_OF_SAMPLE: 200,
- bindTP: function(element) {
- element.on("mouseover", function() {
- this.tooltip
- .style("left", (d3.event.pageX) + "px")
- .style("top", (d3.event.pageY - 28) + "px");
- element.style("opacity", 1.0);
- }.bind(this))
- .on("mousemove", function() {
- // Handle pie chart case
- var text = element.attr("tooltiptext");
- this.tooltip.style("opacity", .9);
- this.tooltip.html(text)
- .style("left", (d3.event.pageX) + "px")
- .style("top", (d3.event.pageY - 28) + "px");
- }.bind(this))
- .on("mouseout", function() {
- this.tooltip.style("opacity", 0);
- element.style("opacity", 0.8);
- }.bind(this));
- element.on("click", function() {
- if (element.attr("link")) {
- this.tooltip.remove();
- document.location.href = element.attr("link");
- }
- }.bind(this));
- },
- printSamples: function(n, layout, g, colorTitles) {
- var yOffset = layout.margin * 3;
- for (var i = 0; i < n; i++) {
- var xOffset = layout.x2 - this.WIDTH_OF_SAMPLE - layout.margin;
- g.append("rect").
- attr("fill", this.colors[i]).
- attr("x", xOffset).
- attr("y", yOffset).
- attr("width", 20).
- attr("height", 20);
- g.append("text").
- attr("x", xOffset + 30).
- attr("y", yOffset + 10).
- text(colorTitles[i]);
- yOffset = yOffset + 30;
- }
- },
- // data:
- // [[{value=xx, bindText=xx}, {value=yy, bindText=yy}], [ ... ]]
- // __________________________________________________ ___________
- // bar-1 bar-2
- show: function (data, title, colorTitles) {
- var width = this.MAX_BAR_WIDTH;
- var height = this.MAX_BAR_HEIGHT;
- this.chart.g.remove();
- this.chart.g = this.chart.svg.append("g");
- var g = this.chart.g;
- var layout = this.getLayout();
- layout.margin = 50;
- var nBarPerRow = Math.floor((layout.x2 - layout.x1 - 3 * layout.margin -
- this.WIDTH_OF_SAMPLE) /
- (width + this.GAP));
- var xOffset;
- var yOffset = layout.margin * 2;
- var maxValue = 0;
- var maxN = 0;
- for (var i = 0; i < data.length; i++) {
- var total = 0;
- for (var j = 0; j < data[i].length; j++) {
- total += data[i][j].value;
- }
- if (total > maxValue) {
- maxValue = total;
- }
- if (data[i].length > maxN) {
- maxN = data[i].length;
- }
- }
- // print samples
- this.printSamples(maxN, layout, g, colorTitles);
- // print data
- data.sort(function(a, b) {
- return b[0].value - a[0].value;
- });
- for (var i = 0; i < data.length; i++) {
- if (i % nBarPerRow == 0) {
- xOffset = layout.margin;
- yOffset += layout.margin + height;
- }
- var leftTopY = yOffset;
- for (var j = 0; j < data[i].length; j++) {
- var dy = data[i][j].value * height / maxValue;
- if (dy > 0) {
- leftTopY = leftTopY - dy;
- var node = g.append("rect").
- attr("fill", this.colors[j]).
- attr("x", xOffset).
- attr("y", leftTopY).
- attr("width", width).
- attr("height", dy).
- attr("tooltiptext",
- (data[i][j].bindText) ? data[i][j].bindText : data[i][j].value).
- attr("link", data[i][j].link)
- .style("opacity", 0.8);
- this.bindTP(node);
- }
- }
- if (data[i].length == 1) {
- g.append("text")
- .text(data[i][0].value)
- .attr("y", leftTopY - 10)
- .attr("x", xOffset + width / 2)
- .attr("class", "heatmap-cell")
- .style("fill", "black");
- }
- xOffset += width + this.GAP;
- }
- layout.y2 = yOffset + layout.margin;
- this.adjustMaxHeight(layout.y2);
- this.renderTitleAndBG(g, title, layout, false);
- },
- draw: function(data, title, textWidth) {
- this.initChart(true);
- //Mock.initMockNodesData(this);
- // mock data
- var arr = [];
- for (var i = 0; i < 5; i++) {
- var subArr = [];
- for (var j = 0; j < Math.random() * 4 + 1; j++) {
- subArr.push({
- value : Math.abs(Math.random())
- });
- }
- arr.push(subArr);
- }
- this.show(
- arr, this.get("title"));
- },
- didInsertElement: function () {
- this.draw();
- },
- actions: {
- applyFilter: function(event) {
- this.filter = event.srcElement.value;
- this.didInsertElement();
- }
- }
- })
|