/** * 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(); } } })