summaryrefslogtreecommitdiff
path: root/openstack_dashboard/dashboards/infrastructure/static/infrastructure/js/horizon.d3linechart.js
diff options
context:
space:
mode:
Diffstat (limited to 'openstack_dashboard/dashboards/infrastructure/static/infrastructure/js/horizon.d3linechart.js')
-rw-r--r--openstack_dashboard/dashboards/infrastructure/static/infrastructure/js/horizon.d3linechart.js200
1 files changed, 200 insertions, 0 deletions
diff --git a/openstack_dashboard/dashboards/infrastructure/static/infrastructure/js/horizon.d3linechart.js b/openstack_dashboard/dashboards/infrastructure/static/infrastructure/js/horizon.d3linechart.js
new file mode 100644
index 00000000..f84cee82
--- /dev/null
+++ b/openstack_dashboard/dashboards/infrastructure/static/infrastructure/js/horizon.d3linechart.js
@@ -0,0 +1,200 @@
+/*
+ Draw line chart in d3.
+
+ It support 2 types of usage:
+ * as a standard line chart
+ * as a line chart in a modal window
+
+ To use as a standard line chart the following data attributes need to be
+ provided for a div:
+ data-chart-type - must be "line_chart"
+ data-url - (string) url for the json data for the chart
+ data-series - (string) the list of series separated by comma
+
+ Example:
+ <div data-chart-type="line_chart"
+ data-url="/data_url"
+ data-series="cpu,ram,storage,network">
+ </div>
+
+ To use as a line chart in a modal windows the following data attributes
+ need to be provided for a link:
+ data-chart-type - must be "modal_line_chart"
+ data-url - (string) url for the json data for the chart
+ data-series - (string) the list of series separated by comma
+
+ Example:
+ <a data-chart-type="modal_line_chart"
+ data-url="/data_url"
+ data-series="network">
+ Click me!
+ </a>
+*/
+
+horizon.d3_line_chart = {
+
+ init: function() {
+ var self = this;
+
+ self.init_line_charts();
+ self.init_modal_chart_links();
+ },
+
+ init_line_charts: function() {
+ var self = this;
+
+ line_charts = $("div[data-chart-type='line_chart']");
+ $.each(line_charts, function(index, line_chart) {
+ if($(line_chart).data('modal') != true) {
+ var template = horizon.templates.compiled_templates["#modal_chart_template"];
+ self.init_svg(line_chart);
+ self.draw(self.data(line_chart));
+ }
+ });
+ },
+
+ init_modal_chart_links: function() {
+ var self = this;
+
+ $(document).on('click', "a[data-chart-type='modal_line_chart']", function(event) {
+ event.preventDefault();
+
+ var template = horizon.templates.compiled_templates["#modal_chart_template"];
+ $('#modal_wrapper').append(template.render({classes: "modal"}));
+
+ var modal = $('.modal:last');
+ modal.modal();
+
+ $(modal).on('click', 'ul#interval_selector li a', function(event){
+ event.preventDefault();
+
+ self.url_options.interval = $(event.target).data('interval');
+ self.draw(self.url_options);
+ $("ul#interval_selector li").removeClass("active");
+ $(event.target).parent().addClass("active");
+ })
+
+ self.init_svg("#modal_chart");
+ self.url_options = self.data($(event.target))
+ self.draw(self.url_options)
+ });
+ },
+
+ init_svg: function(chart_div) {
+ var self = this;
+
+ self.margin = {top: 20, right: 80, bottom: 30, left: 50};
+ self.width = 550 - self.margin.left - self.margin.right;
+ self.height = 300 - self.margin.top - self.margin.bottom;
+
+ self.svg = d3.select(chart_div)
+ .append("svg")
+ .attr("width", self.width + self.margin.left + self.margin.right)
+ .attr("height", self.height + self.margin.top + self.margin.bottom)
+ .append("g")
+ .attr("transform", "translate(" + self.margin.left + "," + self.margin.top + ")");
+
+ self.x = d3.time.scale().range([0, self.width]);
+ self.y = d3.scale.linear().range([self.height, 0]);
+
+ self.xAxis = d3.svg.axis()
+ .scale(self.x)
+ .orient("bottom").ticks(6);
+ self.yAxis = d3.svg.axis()
+ .scale(self.y)
+ .orient("left");
+
+ self.parse_date = d3.time.format("%Y-%m-%dT%H:%M:%S.%L").parse;
+
+ self.line = d3.svg.line().interpolate("linear")
+ .x(function(d) { return self.x(d.date); })
+ .y(function(d) { return self.y(d.value); });
+
+ self.color = d3.scale.category10();
+ },
+
+ draw: function(url_options) {
+ var self = this;
+ var url_options = url_options || {};
+ url_options.interval = url_options.interval || "1w";
+
+ d3.json(self.json_url(url_options), function(error, data) {
+ data.forEach(function(d) { d.date = self.parse_date(d.date); });
+
+ self.color.domain(d3.keys(data[0]).filter(function(key) { return key !== 'date'; }));
+
+ var usage_values = self.color.domain().map(function(name) {
+ return {
+ name: name,
+ values: data.map(function(d) {
+ return {date: d.date, value: d[name]};
+ })
+ };
+ });
+
+ self.svg.selectAll(".axis").remove();
+ self.x.domain(d3.extent(data, function(d) { return d.date; }));
+ self.y.domain([0, 15]);
+
+ self.svg.append("g")
+ .attr("transform", "translate(0," + self.height + ")")
+ .attr("class", "axis")
+ .call(self.xAxis);
+ self.svg.append("g")
+ .attr("class", "axis")
+ .call(self.yAxis)
+
+ var usages = self.svg.selectAll(".usage")
+ .data(usage_values, function(d) { return self.key(d) });
+
+ var usage = usages.enter().append("g")
+ .attr("class", "usage");
+
+ usage.append("path")
+ .attr("d", function(d) { return self.line(d.values); })
+ .style("stroke", function(d) { return self.color(d.name); })
+ .style("fill", "none")
+ .style("stroke-width", 3);
+
+ var legend = usage.append('g')
+ .attr('class', 'legend');
+
+ legend.append('rect')
+ .attr('x', self.width - 60)
+ .attr('y', function(d, i){ return (i * 20) + 30 ;})
+ .attr('width', 10)
+ .attr('height', 10)
+ .style('fill', function(d) { return self.color(d.name); });
+
+ legend.append('text')
+ .attr('x', self.width - 40)
+ .attr('y', function(d, i){ return (i * 20) + 39;})
+ .text(function(d){ return d.name.replace(/_/g, " "); });
+
+ usages.exit().remove();
+ });
+ },
+
+ data: function(element) {
+ return {
+ url: $(element).data("url"),
+ series: $(element).data("series")
+ };
+ },
+
+ json_url: function(url_options) {
+ var options = $.extend({}, url_options);
+ var url = options.url
+ delete options.url
+ return url + '?' + $.param(options);
+ },
+
+ key: function(data){
+ return data.name + data.values.length + data.values[0].date + data.values[data.values.length-1].date
+ },
+
+};
+
+horizon.addInitFunction(function () {
+ horizon.d3_line_chart.init();
+});