diff --git a/CHANGELOG.md b/CHANGELOG.md index 649898a..f74790a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,13 +1,29 @@ -# 0.0.3 (2013-11-03) +# 0.0.5 (2017-01-16) +* Add pie chart +* Improve responsive behaviour +* Add configurable data keys +* Add canvas scatterplot +* Add network chart +* Add example showcasing all the available charts +* Migrate codebase to TypeScript +* Add ts module definition +* Lots of bugfixes and improvements + +# 0.0.4 (2016-11-06) +* Add streaming scatterplot example +* Add minified version +* Some minor bug fixes + +# 0.0.3 (2016-11-03) * Add scatterplot. * Modify gauge and swimlane data formats * Add HTTPDatasource * Minor fixes and improvements -# 0.0.2 (2013-10-24) +# 0.0.2 (2016-10-24) * Fixed a bug with xAxisFormat in websocket streamgraph (#5c3d35d) * Minor bugfixes * Fixed code style issues and other minor changes -# 0.0.1 (2013-10-17) +# 0.0.1 (2016-10-17) First release of Proteic. :tada: \ No newline at end of file diff --git a/dist/proteic.css b/dist/proteic.css new file mode 100644 index 0000000..8f734b4 --- /dev/null +++ b/dist/proteic.css @@ -0,0 +1,49 @@ +.proteic .axis text { + font: 1.4em Montserrat, sans-serif; } + +.proteic .x.axis path { + stroke: #dbdad8; + stroke-width: 2px; + opacity: 1; } + +.proteic .x.axis line { + stroke-dasharray: 1, 5; } + +.proteic .x.axis .tick:nth-of-type(even) line { + stroke: #5e6b70; } + +.proteic .x.axis .tick:nth-of-type(even) text { + fill: #1a2127; } + +.proteic .x.axis.linear .tick:nth-of-type(odd) text { + fill: #5e6b70; } + +.proteic .x.axis.linear .tick:nth-of-type(odd) line { + stroke: #dbdad8; } + +.proteic .y.axis path { + display: none; } + +.proteic .y.axis .tick:nth-child(even) line { + stroke: #5e6b70; } + +.proteic .y.axis .tick:nth-child(even) text { + fill: #1a2127; } + +.proteic .y.axis .tick:nth-child(odd) text { + fill: #5e6b70; } + +.proteic .y.axis .tick:nth-child(odd) line { + stroke: #dbdad8; } + +.proteic .y.axis .tick line { + stroke-dasharray: 1, 5; } + +.text-indicator { + white-space: nowrap; + overflow: hidden; } + .text-indicator .value { + font: 2em Montserrat, sans-serif; } + .text-indicator .label { + font: 1em Montserrat, sans-serif; + text-overflow: ellipsis; } diff --git a/dist/proteic.js b/dist/proteic.js index e20dba2..3ad8a2e 100644 --- a/dist/proteic.js +++ b/dist/proteic.js @@ -2,19 +2,802 @@ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3')) : typeof define === 'function' && define.amd ? define(['exports', 'd3'], factory) : (factory((global.proteic = global.proteic || {}),global.d3)); -}(this, (function (exports,d3$1) { 'use strict'; +}(this, (function (exports,d3) { 'use strict'; -var paletteCategory1 = [ - '#e1c8df', - '#9ecd9d', - '#acd9d6', - '#e4e36b', - '#bfa1c5', - '#e4d3b8', - '#facba8', - '#ced4ea', - '#acd9d6' -]; +function __extends(d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +} + +var SvgContext = (function () { + function SvgContext(strategy, config) { + this.strategy = strategy; + this.strategy.setConfig(config); + this.strategy.initialize(); + } + SvgContext.prototype.draw = function (data) { + this.strategy.draw(data); + }; + SvgContext.prototype.addLoading = function () { + this.strategy.addLoading(); + }; + SvgContext.prototype.removeLoading = function () { + this.strategy.removeLoading(); + }; + return SvgContext; +}()); + +var Config = (function () { + function Config() { + this.properties = {}; + } + Config.prototype.put = function (key, value) { + this.properties[key] = value; + return this; + }; + Config.prototype.get = function (key) { + return this.properties[key]; + }; + return Config; +}()); + +function isNumeric(n) { + return !isNaN(parseFloat(n)) && isFinite(n); +} + +function isPercentage(n) { + var split = null; + var number = null; + if (!n || typeof n !== 'string') { + return false; + } + split = n.split('%'); + number = (+split[0]); + return split.length === 2 && + (number >= 0) && + (number <= 100); +} + + + +function copy(object) { + return object != null ? JSON.parse(JSON.stringify(object)) : null; +} +function deg2rad(deg) { + return deg * Math.PI / 180; +} + +function calculateWidth(widthConfig, selector) { + if (widthConfig === 'auto') { + return d3.select(selector) + .node() + .getBoundingClientRect() + .width; + } + else if (isNumeric(widthConfig)) { + return widthConfig; + } + else if (isPercentage(widthConfig)) { + var containerWidth = void 0, percentage = void 0; + containerWidth = d3.select(selector) + .node() + .getBoundingClientRect() + .width; + percentage = widthConfig.split('%')[0]; + return Math.round(percentage * containerWidth / 100); + } + else { + throw Error('Unknow config width value: ' + widthConfig); + } +} + +var Chart = (function () { + function Chart(strategy, data, userConfig, defaults) { + this.ds = null; + this.dispatcher = d3.dispatch('onmessage', 'onopen', 'onerror', 'addLoading', 'removeLoading'); + this.config = this.loadConfigFromUser(userConfig, defaults); + this.context = new SvgContext(strategy, this.config); + this.data = data; + } + Chart.prototype.draw = function (data) { + if (data === void 0) { data = this.data; } + this.context.draw(copy(data)); + this.data = data; + }; + Chart.prototype.datasource = function (ds) { + var _this = this; + this.ds = ds; + this.ds.configure(this.dispatcher); + this.dispatcher.on('addLoading', function () { return _this.context.addLoading(); }); + this.dispatcher.on('removeLoading', function () { return _this.context.removeLoading(); }); + this.dispatcher.on('onmessage', function (data) { return _this.keepDrawing(data); }); + this.dispatcher.on('onopen', function (event$$1) { + console.log('onopen', event$$1); + }); + this.dispatcher.on('onerror', function (error) { + console.log('onerror', error); + }); + }; + Chart.prototype.loadConfigFromUser = function (userData, defaults) { + var config = new Config(); + for (var v in defaults) { + config.put(v, (v in userData) ? userData[v] : defaults[v]); + } + var width = config.get('width'); + width = calculateWidth(width, config.get('selector')) - config.get('marginLeft') - config.get('marginRight'); + config.put('width', width); + return config; + }; + return Chart; +}()); + +var Component = (function () { + function Component() { + } + Component.prototype.configure = function (config, svg) { + this.config = config; + this.svg = svg; + }; + Component.prototype.clean = function () { + this.svg.selectAll('.serie').remove(); + }; + return Component; +}()); + +var XAxis = (function (_super) { + __extends(XAxis, _super); + function XAxis() { + return _super.call(this) || this; + } + XAxis.prototype.render = function () { + var width = this.config.get('width'), height = this.config.get('height'), xAxisFormat = this.config.get('xAxisFormat'), xAxisType = this.config.get('xAxisType'), xAxisLabel = this.config.get('xAxisLabel'), xAxisGrid = this.config.get('xAxisGrid'); + this.initializeXAxis(width, height, xAxisFormat, xAxisType, xAxisGrid); + this.svg + .append('g') + .attr('class', "x axis " + xAxisType) + .attr('transform', 'translate(0,' + height + ')') + .call(this._xAxis); + this.svg + .append('text') + .attr('class', 'xaxis-title') + .attr("text-anchor", "middle") + .attr('x', width / 2) + .attr('y', height + 40) + .text(xAxisLabel) + .style('font', '0.8em Montserrat, sans-serif'); + }; + XAxis.prototype.update = function (data) { + var _this = this; + var propertyX = this.config.get('propertyX'); + var xAxisType = this.config.get('xAxisType'); + if (xAxisType === 'linear') { + var min$$1 = d3.min(data, function (d) { return d[propertyX]; }), max$$1 = d3.max(data, function (d) { return d[propertyX]; }); + this.updateDomainByMinMax(min$$1, max$$1); + } + else if (xAxisType === 'time') { + var min$$1 = d3.min(data, function (d) { return (d[propertyX] || d[_this.config.get('propertyStart')]); }), max$$1 = d3.max(data, function (d) { return (d[propertyX] || d[_this.config.get('propertyEnd')]); }); + this.updateDomainByMinMax(min$$1, max$$1); + } + else { + var keys = d3.map(data, function (d) { return d[propertyX]; }).keys(); + this.updateDomainByKeys(keys); + } + this.transition(); + }; + XAxis.prototype.updateDomainByKeys = function (keys) { + this._xAxis.scale().domain(keys); + }; + XAxis.prototype.updateDomainByMinMax = function (min$$1, max$$1) { + this._xAxis.scale().domain([min$$1, max$$1]); + }; + XAxis.prototype.transition = function (time) { + if (time === void 0) { time = 200; } + this.svg.selectAll('.x.axis').transition().duration(time).call(this._xAxis); + this.svg.select('.x.axis path').raise(); + }; + XAxis.prototype.initializeXAxis = function (width, height, xAxisFormat, xAxisType, xAxisGrid) { + switch (xAxisType) { + case 'time': + this._xAxis = d3.axisBottom(d3.scaleTime().range([0, width])); + break; + case 'linear': + this._xAxis = d3.axisBottom(d3.scaleLinear().range([0, width])) + .tickFormat(d3.format(xAxisFormat)); + break; + case 'categorical': + this._xAxis = d3.axisBottom(d3.scaleBand().rangeRound([0, width]) + .padding(0.1).align(0.5)); + break; + default: + throw new Error('Not allowed type for XAxis. Only allowed "time", "linear" or "categorical". Got: ' + xAxisType); + } + if (xAxisGrid) { + this._xAxis + .tickSizeInner(-height) + .tickPadding(9); + } + }; + Object.defineProperty(XAxis.prototype, "xAxis", { + get: function () { + return this._xAxis; + }, + enumerable: true, + configurable: true + }); + return XAxis; +}(Component)); + +var Globals = (function () { + function Globals() { + } + return Globals; +}()); +Globals.COMPONENT_TRANSITION_TIME = 100; +Globals.COMPONENT_HIDE_SHOW_TRANSITION_TIME = 300; +Globals.COMPONENT_HIDE_OPACITY = 0.06; +Globals.COMPONENT_DATA_KEY_ATTRIBUTE = 'data-proteic-key'; +Globals.LEGEND_DATA_KEY_ATTRIBUTE = 'data-proteic-legend-key'; +Globals.LEGEND_HIDE_OPACITY = 0.3; +Globals.BREAKPOINT = 768; +Globals.ASPECT_RATIO = 0.7; +Globals.LOADING_ICON = 'data:image/gif;base64,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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA='; + +function simple2stacked(data) { + return d3.nest().key(function (d) { return d.x; }).rollup(function (array) { + var r = {}; + for (var i = 0; i < array.length; i++) { + var object = array[i]; + if (object) { + r[object.key] = object.y; + } + } + return r; + }).entries(data); +} +function simple2nested(data, key) { + if (key === void 0) { key = 'key'; } + return d3.nest().key(function (d) { return d[key]; }).entries(data); +} + +function simple2Linked(data) { + var linkedData = { links: [], nodes: [] }; + data.map(function (d) { return d.class === 'link' ? linkedData.links.push(d) : linkedData.nodes.push(d); }); + return linkedData; +} +function convertPropretiesToTimeFormat(data, properties, format$$1) { + data.forEach(function (d) { + properties.map(function (p) { + d[p] = d3.timeParse(format$$1)(d[p]); + }); + }); +} +function convertByXYFormat(data, xAxisFormat, xAxisType, yAxisFormat, yAxisType) { + data.forEach(function (d) { + switch (xAxisType) { + case 'time': + d.x = d3.timeParse(xAxisFormat)(d.x); + break; + case 'linear': + d.x = +d.x; + break; + } + switch (yAxisType) { + case 'time': + d.y = d3.timeParse(yAxisFormat)(d.y); + break; + case 'linear': + d.y = +d.y; + break; + } + }); + return data; +} + +var YAxis = (function (_super) { + __extends(YAxis, _super); + function YAxis(orient) { + var _this = _super.call(this) || this; + _this._orient = 'left'; + _this.selection = null; + if (orient != null) { + _this._orient = orient; + } + return _this; + } + Object.defineProperty(YAxis.prototype, "orient", { + get: function () { + return this._orient; + }, + enumerable: true, + configurable: true + }); + YAxis.prototype.render = function () { + var width = this.config.get('width'), height = this.config.get('height'), yAxisFormat = this.config.get('yAxisFormat'), yAxisType = this.config.get('yAxisType'), yAxisLabel = this.config.get('yAxisLabel'), yAxisGrid = this.config.get('yAxisGrid'); + this.initializeYAxis(width, height, yAxisFormat, yAxisType, yAxisGrid); + var yAxisG = this.svg + .append('g') + .attr('class', 'y axis') + .attr("transform", this.orient === 'left' + ? "translate( 0, 0 )" + : "translate( " + width + ", 0 )") + .call(this._yAxis); + this.svg + .append('text') + .attr('class', 'yaxis-title') + .attr("transform", "rotate(-90)") + .attr("text-anchor", "middle") + .attr('x', 0 - height / 2) + .attr('y', 0 - 55) + .text(yAxisLabel) + .style('font', '0.8em Montserrat, sans-serif'); + this.selection = yAxisG; + }; + YAxis.prototype.update = function (data) { + var propertyKey = this.config.get('propertyKey'); + var propertyY = this.config.get('propertyY'); + var yAxisType = this.config.get('yAxisType'), yAxisShow = this.config.get('yAxisShow'), layoutStacked = this.config.get('stacked'); + this.selection.attr('opacity', yAxisShow ? 1 : 0); + if (yAxisType === 'linear') { + if (layoutStacked) { + var keys = d3.map(data, function (d) { return d[propertyKey]; }).keys(); + var stack_1 = this.config.get('stack'); + var stackedData = stack_1.keys(keys)(simple2stacked(data)); + var min$$1 = d3.min(stackedData, function (serie) { return d3.min(serie, function (d) { return d[0]; }); }); + var max$$1 = d3.max(stackedData, function (serie) { return d3.max(serie, function (d) { return d[1]; }); }); + this.updateDomainByMinMax(min$$1, max$$1); + } + else { + var min$$1 = d3.min(data, function (d) { return d[propertyY]; }), max$$1 = d3.max(data, function (d) { return d[propertyY]; }); + this.updateDomainByMinMax(min$$1, max$$1); + } + } + else if (yAxisType === 'categorical') { + var keys = d3.map(data, function (d) { return d[propertyKey]; }).keys().sort(); + this._yAxis.scale().domain(keys); + } + else { + console.warn('could not recognize y axis type', yAxisType); + } + if (data !== null && data.length) { + this.transition(); + } + }; + YAxis.prototype.updateDomainByMinMax = function (min$$1, max$$1) { + this._yAxis.scale().domain([min$$1, max$$1]); + }; + YAxis.prototype.transition = function (time) { + if (time === void 0) { time = 200; } + this.selection.transition().duration(Globals.COMPONENT_TRANSITION_TIME).call(this._yAxis); + this.svg.selectAll('.y.axis path').raise(); + }; + YAxis.prototype.initializeYAxis = function (width, height, yAxisFormat, yAxisType, yAxisGrid) { + switch (yAxisType) { + case 'linear': + this._yAxis = (this.orient === 'left') + ? d3.axisLeft(d3.scaleLinear().range([height, 0])).tickFormat(d3.format(yAxisFormat)) + : d3.axisRight(d3.scaleLinear().range([height, 0])).tickFormat(d3.format(yAxisFormat)); + break; + case 'categorical': + this._yAxis = (this.orient === 'left') + ? d3.axisLeft(d3.scaleBand().rangeRound([height, 0]).padding(0.1).align(0.5)) + : d3.axisRight(d3.scaleBand().rangeRound([height, 0]).padding(0.1).align(0.5)); + break; + default: + throw new Error('Not allowed type for YAxis. Only allowed "time", "linear" or "categorical". Got: ' + yAxisType); + } + if (yAxisGrid && this.orient === 'left') { + this._yAxis + .tickSizeInner(-width) + .tickSizeOuter(0) + .tickPadding(20); + } + }; + Object.defineProperty(YAxis.prototype, "yAxis", { + get: function () { + return this._yAxis; + }, + enumerable: true, + configurable: true + }); + return YAxis; +}(Component)); + +var XYAxis = (function (_super) { + __extends(XYAxis, _super); + function XYAxis() { + var _this = _super.call(this) || this; + _this._x = new XAxis(); + _this._y = new YAxis(); + return _this; + } + XYAxis.prototype.render = function () { + this._y.render(); + this._x.render(); + }; + XYAxis.prototype.update = function (data) { + this._y.update(data); + this._x.update(data); + }; + XYAxis.prototype.configure = function (config, svg) { + _super.prototype.configure.call(this, config, svg); + this._y.configure(config, svg); + this._x.configure(config, svg); + }; + Object.defineProperty(XYAxis.prototype, "x", { + get: function () { + return this._x; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(XYAxis.prototype, "y", { + get: function () { + return this._y; + }, + enumerable: true, + configurable: true + }); + return XYAxis; +}(Component)); + +var Lineset = (function (_super) { + __extends(Lineset, _super); + function Lineset(x, y) { + var _this = _super.call(this) || this; + _this.x = x; + _this.y = y; + return _this; + } + Lineset.prototype.render = function () { + var _this = this; + var propertyX = this.config.get('propertyX'); + var propertyY = this.config.get('propertyY'); + var curve = this.config.get('curve'); + this.lineGenerator = d3.line() + .curve(curve) + .x(function (d) { return _this.x.xAxis.scale()(d[propertyX]); }) + .y(function (d) { return _this.y.yAxis.scale()(d[propertyY]); }); + }; + Lineset.prototype.update = function (data) { + var _this = this; + var propertyKey = this.config.get('propertyKey'); + var dataSeries = d3.nest().key(function (d) { return d[propertyKey]; }).entries(data); + var series = this.svg.selectAll('g.lineSeries'); + var colorScale = this.config.get('colorScale'); + var lines = series.data(dataSeries, function (d) { return d[propertyKey]; }) + .enter() + .append('g') + .attr('class', 'lineSeries') + .attr(Globals.COMPONENT_DATA_KEY_ATTRIBUTE, function (d) { return d[propertyKey]; }) + .attr('stroke', function (d) { return colorScale(d[propertyKey]); }) + .append('svg:path') + .style('stroke', function (d) { return colorScale(d[propertyKey]); }) + .style('stroke-width', 1.9) + .style('fill', 'none') + .attr('d', function (d) { return _this.lineGenerator(d.values); }) + .attr('class', 'line'); + this.svg.selectAll('.line') + .data(dataSeries, function (d) { return d[propertyKey]; }) + .attr('d', function (d) { return _this.lineGenerator(d.values); }) + .transition() + .duration(Globals.COMPONENT_TRANSITION_TIME) + .ease(d3.easeLinear); + }; + return Lineset; +}(Component)); + +var Pointset = (function (_super) { + __extends(Pointset, _super); + function Pointset(x, y) { + var _this = _super.call(this) || this; + _this.x = x; + _this.y = y; + return _this; + } + Pointset.prototype.render = function () { + }; + Pointset.prototype.update = function (data) { + var _this = this; + var propertyKey = this.config.get('propertyKey'); + var propertyX = this.config.get('propertyX'); + var propertyY = this.config.get('propertyY'); + var dataSeries = d3.nest() + .key(function (d) { return d[propertyKey]; }) + .entries(data), markers = null, markerShape = this.config.get('markerShape'), markerSize = this.config.get('markerSize'), markerOutlineWidth = this.config.get('markerOutlineWidth'), colorScale = this.config.get('colorScale'), points = null, series = null; + var shape = d3.symbol().size(markerSize); + series = this.svg.selectAll('g.points'); + switch (markerShape) { + case 'dot': + shape.type(d3.symbolCircle); + break; + case 'ring': + shape.type(d3.symbolCircle); + break; + case 'cross': + shape.type(d3.symbolCross); + break; + case 'diamond': + shape.type(d3.symbolDiamond); + break; + case 'square': + shape.type(d3.symbolSquare); + break; + case 'star': + shape.type(d3.symbolStar); + break; + case 'triangle': + shape.type(d3.symbolTriangle); + break; + case 'wye': + shape.type(d3.symbolWye); + break; + case 'circle': + shape.type(d3.symbolCircle); + break; + default: + shape.type(d3.symbolCircle); + } + points = series + .data(dataSeries, function (d) { return d.values; }, function (d) { return d[propertyX]; }); + points.enter() + .append('g') + .attr('class', 'points') + .attr(Globals.COMPONENT_DATA_KEY_ATTRIBUTE, function (d) { return d[propertyKey]; }) + .style('stroke', function (d) { return colorScale(d[propertyKey]); }) + .selectAll('circle') + .data(function (d) { return d.values; }) + .enter() + .append('path') + .attr('class', 'marker') + .attr('d', shape) + .style('stroke', function (d) { return colorScale(d[propertyKey]); }) + .style('fill', function (d) { return markerShape !== 'ring' ? colorScale(d[propertyKey]) : 'transparent'; }) + .attr('transform', function (d) { return "translate(" + _this.x.xAxis.scale()(d[propertyX]) + ", " + _this.y.yAxis.scale()(d[propertyY]) + ")"; }); + this.svg.selectAll('.marker') + .transition() + .duration(Globals.COMPONENT_TRANSITION_TIME) + .ease(d3.easeLinear) + .attr('transform', function (d) { return "translate(" + _this.x.xAxis.scale()(d[propertyX]) + ", " + _this.y.yAxis.scale()(d[propertyY]) + ")"; }); + points + .exit() + .remove(); + markers = this.svg.selectAll('.marker'); + markers + .on('mousedown.user', this.config.get('onDown')) + .on('mouseup.user', this.config.get('onUp')) + .on('mouseleave.user', this.config.get('onLeave')) + .on('mouseover.user', this.config.get('onHover')) + .on('click.user', this.config.get('onClick')); + }; + return Pointset; +}(Component)); + +var Areaset = (function (_super) { + __extends(Areaset, _super); + function Areaset(x, y) { + var _this = _super.call(this) || this; + _this.x = x; + _this.y = y; + return _this; + } + Areaset.prototype.render = function () { + var _this = this; + var height = this.config.get('height'), propertyX = this.config.get('propertyX'), propertyY = this.config.get('propertyY'), curve = this.config.get('curve'); + this.areaGenerator = d3.area() + .curve(curve) + .x(function (d) { return _this.x.xAxis.scale()(d[propertyX]); }) + .y0(height) + .y1(function (d) { return _this.y.yAxis.scale()(d[propertyY]); }); + }; + Areaset.prototype.update = function (data) { + var _this = this; + var propertyKey = this.config.get('propertyKey'); + var dataSeries = d3.nest().key(function (d) { return d[propertyKey]; }).entries(data); + var areas = this.svg.selectAll('g.area'); + var colorScale = this.config.get('colorScale'); + var height = this.config.get('height'); + var areaOpacity = this.config.get('areaOpacity'); + areas = areas.data(dataSeries, function (d) { return d[propertyKey]; }) + .enter() + .append('g') + .attr('class', 'area') + .attr(Globals.COMPONENT_DATA_KEY_ATTRIBUTE, function (d) { return d[propertyKey]; }) + .append('svg:path') + .style('fill', function (d) { return colorScale(d[propertyKey]); }) + .style('fill-opacity', areaOpacity) + .attr('d', function (d) { return _this.areaGenerator(d.values); }) + .attr('class', 'areaPath'); + this.svg.selectAll('.areaPath') + .data(dataSeries, function (d) { return d[propertyKey]; }) + .transition() + .duration(Globals.COMPONENT_TRANSITION_TIME) + .attr('d', function (d) { return _this.areaGenerator(d.values); }); + }; + return Areaset; +}(Component)); + +var Legend = (function (_super) { + __extends(Legend, _super); + function Legend() { + return _super.call(this) || this; + } + Legend.prototype.render = function () { + }; + Legend.prototype.update = function (data) { + var _this = this; + var dataSeries = d3.nest() + .key(function (d) { return d.key; }) + .entries(data), legend = null, entries = null, colorScale = this.config.get('colorScale'), height = this.config.get('height'), width = this.config.get('width'); + if (dataSeries.length === 1 && dataSeries[0].key === 'undefined') { + console.warn('Not showing legend, since there is a valid key'); + return; + } + this.svg.selectAll('g.legend').remove(); + legend = this.svg.append('g').attr('class', 'legend'); + entries = legend.selectAll('.legend-entry') + .data(dataSeries, function (d) { return d.key; }) + .enter() + .append('g') + .attr('class', 'legend-entry') + .attr(Globals.LEGEND_DATA_KEY_ATTRIBUTE, function (d) { return d.key; }); + entries.append('rect') + .attr('x', width + 10) + .attr('y', function (d, i) { return i * 25; }) + .attr('height', 20) + .attr('width', 20) + .style('fill', function (d) { return colorScale(d.key); }) + .style('stroke', function (d) { return colorScale(d.key); }) + .style('opacity', 0.8) + .on('click.default', function (d) { return _this.toggle(d); }); + entries.append('text') + .attr("x", width + 25 + 10) + .attr("y", function (d, i) { return i * 25 + 7; }) + .attr("dy", "0.55em") + .text(function (d) { return d.key; }) + .style('font', '14px Montserrat, sans-serif') + .on('click.default', function () { return _this.toggle; }); + }; + Legend.prototype.toggle = function (d) { + var key = d.key, element = this.svg.selectAll('*[' + Globals.COMPONENT_DATA_KEY_ATTRIBUTE + '="' + key + '"]'), colorScale = this.config.get('colorScale'); + if (!element.empty()) { + var opacity = element.style('opacity'); + opacity = (opacity == 1) ? Globals.COMPONENT_HIDE_OPACITY : 1; + var legendEntry = this.svg.select('.legend-entry[' + Globals.LEGEND_DATA_KEY_ATTRIBUTE + '="' + key + '"]'); + legendEntry.selectAll('rect') + .transition() + .duration(Globals.COMPONENT_HIDE_SHOW_TRANSITION_TIME) + .style('fill', (opacity === 1) ? function (d) { return colorScale(d.key); } : 'transparent'); + element + .transition() + .duration(Globals.COMPONENT_HIDE_SHOW_TRANSITION_TIME) + .style('opacity', opacity); + } + }; + return Legend; +}(Component)); + +var Container = (function () { + function Container(config) { + this.components = []; + this.config = config; + var selector = this.config.get('selector'), width = this.config.get('width'), height = this.config.get('height'), marginLeft = this.config.get('marginLeft'), marginRight = this.config.get('marginRight'), marginTop = this.config.get('marginTop'), marginBottom = this.config.get('marginBottom'); + width += marginLeft + marginRight; + height += marginTop + marginBottom; + this.initializeContainer(selector, width, height, marginLeft, marginTop); + } + Container.prototype.add = function (component) { + this.components.push(component); + component.configure(this.config, this.svg); + component.render(); + return this; + }; + Container.prototype.initializeContainer = function (selector, width, height, marginLeft, marginTop) { + this.svg = d3.select(selector) + .style('position', 'relative') + .style('width', width + "px") + .style('height', height + "px") + .append('svg:svg') + .attr('preserveAspectRatio', "xMinYMin meet") + .attr("viewBox", "0 0 " + width + " " + height) + .attr('width', '100%') + .attr('class', 'proteic') + .attr('width', width) + .attr('height', height) + .style('position', 'absolute') + .append('g') + .attr('class', 'chartContainer') + .attr('transform', 'translate(' + marginLeft + ',' + marginTop + ')'); + }; + Container.prototype.updateComponents = function (data) { + for (var i = 0; i < this.components.length; i++) { + var component = this.components[i]; + component.update(data); + } + }; + Container.prototype.translate = function (x, y) { + this.svg.attr('transform', "translate(" + x + ", " + y + ")"); + }; + Container.prototype.viewBox = function (w, h) { + this.svg.attr("viewBox", "0 0 " + w + " " + h); + }; + Container.prototype.zoom = function (z) { + this.svg.call(d3.zoom().scaleExtent([1 / 2, 4]).on("zoom", z)); + }; + Container.prototype.addLoadingIcon = function () { + var icon = Globals.LOADING_ICON; + this.svg.append('image').attr('id', 'loadingIcon') + .attr('width', '25%') + .attr('height', '25%') + .attr('x', '25%') + .attr('y', '25%') + .attr('xlink:href', icon); + }; + Container.prototype.removeLoadingIcon = function () { + this.svg.select('image[id="loadingIcon"]').transition().duration(200).remove(); + }; + return Container; +}()); + +var SvgChart = (function () { + function SvgChart() { + } + SvgChart.prototype.initialize = function () { + this.container = new Container(this.config); + }; + SvgChart.prototype.setConfig = function (config) { + this.config = config; + }; + SvgChart.prototype.addLoading = function () { + this.container.addLoadingIcon(); + }; + SvgChart.prototype.removeLoading = function () { + this.container.removeLoadingIcon(); + }; + return SvgChart; +}()); + +function sortByField(array, field) { + array.sort(function (e1, e2) { + var a = e1[field]; + var b = e2[field]; + return (a < b) ? -1 : (a > b) ? 1 : 0; + }); +} + +var SvgStrategyLinechart = (function (_super) { + __extends(SvgStrategyLinechart, _super); + function SvgStrategyLinechart() { + var _this = _super.call(this) || this; + _this.axes = new XYAxis(); + _this.lines = new Lineset(_this.axes.x, _this.axes.y); + return _this; + } + SvgStrategyLinechart.prototype.draw = function (data) { + var xAxisFormat = this.config.get('xAxisFormat'), xAxisType = this.config.get('xAxisType'), yAxisFormat = this.config.get('yAxisFormat'), yAxisType = this.config.get('yAxisType'); + convertByXYFormat(data, xAxisFormat, xAxisType, yAxisFormat, yAxisType); + sortByField(data, 'x'); + this.container.updateComponents(data); + }; + SvgStrategyLinechart.prototype.initialize = function () { + _super.prototype.initialize.call(this); + var markerSize = this.config.get('markerSize'), areaOpacity = this.config.get('areaOpacity'), legend = this.config.get('legend'); + this.container.add(this.axes).add(this.lines); + if (areaOpacity > 0) { + this.area = new Areaset(this.axes.x, this.axes.y); + this.container.add(this.area); + } + if (markerSize > 0) { + this.markers = new Pointset(this.axes.x, this.axes.y); + this.container.add(this.markers); + } + if (legend) { + this.legend = new Legend(); + this.container.add(this.legend); + } + }; + return SvgStrategyLinechart; +}(SvgChart)); var paletteCategory2 = [ '#b6dde2', @@ -27,7 +810,6 @@ var paletteCategory2 = [ '#f29a83', '#8d7e9e' ]; - var paletteCategory3 = [ '#6b68a9', '#8cc590', @@ -39,7 +821,6 @@ var paletteCategory3 = [ '#ccaf44', '#d0553c' ]; - var paletteCategory4 = [ '#f1a30d', '#1d4763', @@ -51,7 +832,6 @@ var paletteCategory4 = [ '#563a2d', '#87325d' ]; - var paletteCategory5 = [ '#f1a30d', '#0c3183', @@ -63,19 +843,6 @@ var paletteCategory5 = [ '#8d2d84', '#f09bbc' ]; - -var paletteCategory6 = [ - '#71bbc3', - '#1d4763', - '#8fbe46', - '#4e6936', - '#ee8998', - '#c1212d', - '#f5af3c', - '#e95e2e', - '#634484' -]; - var paletteCategory7 = [ '#ea671e', '#684592', @@ -87,7 +854,6 @@ var paletteCategory7 = [ '#5db68b', '#775e47' ]; - var paletteCategory8 = [ '#ebd646', '#a50f38', @@ -99,343 +865,6 @@ var paletteCategory8 = [ '#4d4e98', '#7c4d25' ]; - -var paletteSequentialYellow = [ - '#fff1c6', - '#fee5a7', - '#fcda87', - '#face64', - '#f8bf4b', - '#f6b030', - '#f4a009', - '#d28514', - '#b36c17', - '#955618', - '#7a4317', - '#613214', - '#49230f' -]; - -var paletteSequentialRedOrange = [ - '#ffecb8', - '#fbd68b', - '#f7bf5e', - '#f3a82f', - '#df7520', - '#cd4925', - '#be0a26', - '#a81023', - '#941320', - '#80141d', - '#6d1419', - '#5a1215', - '#470f0f' -]; - -var paletteSequentialRed = [ - '#fde4d4', - '#f1c4af', - '#f7bf5e', - '#db826a', - '#d0614d', - '#c73e36', - '#be0a26', - '#a81023', - '#941320', - '#80141d', - '#6d1419', - '#5a1215', - '#470f0f' -]; - -var paletteSequentialPink = [ - '#fbe3e3', - '#f9cfcc', - '#f0aaa9', - '#ed7e7e', - '#ea647b', - '#e74576', - '#e41270', - '#c70f65', - '#aa105c', - '#8d1253', - '#731448', - '#5a123c', - '#420e30' -]; - -var paletteSequentialPurplePink = [ - '#f9d8e6', - '#ebbed7', - '#dda4c7', - '#c890bb', - '#b27daf', - '#8a4c94', - '#622181', - '#622181', - '#50216b', - '#472060', - '#3e1f55', - '#361e4b', - '#2d1c41' -]; - -var paletteSequentialPurple = [ - '#f6e8f1', - '#dcc5de', - '#c2a3c9', - '#a980b3', - '#905e9f', - '#793f8e', - '#622181', - '#592175', - '#4f216b', - '#462060', - '#3d1f55', - '#351e4b', - '#2c1c41' -]; - -var paletteSequentialBlue = [ - '#e5f2f9', - '#d1e5f5', - '#afd3ed', - '#91afd7', - '#738bbf', - '#3c5a9e', - '#0c3183', - '#132a68', - '#10204c', - '#0b193b', - '#06142f', - '#051228', - '#061020' -]; - -var paletteSequentialLightBlue = [ - '#eff8fd', - '#d9eff6', - '#c2e5ef', - '#a8dae8', - '#90cbe4', - '#76b8e1', - '#5baddc', - '#4d96cc', - '#427ebc', - '#3a67ab', - '#324c88', - '#29366b', - '#1e2354' -]; - -var paletteSequentialBlueViolet = [ - '#edf7e7', - '#c8e3d2', - '#91cdbf', - '#41b5ab', - '#218ba4', - '#145d94', - '#0c3183', - '#0d2d76', - '#0d2a6a', - '#0e265e', - '#0d2253', - '#0c1e47', - '#0b1a3c' -]; - -var paletteSequentialTurquoise = [ - '#e2ecf6', - '#cadfe6', - '#b1d3d6', - '#94c6c6', - '#74b9b6', - '#4caca6', - '#00a096', - '#008d89', - '#007b7c', - '#006a6f', - '#005963', - '#004a57', - '#063b4c' -]; - -var paletteSequentialLightGreen = [ - '#faf9de', - '#e9efc3', - '#d7e4a7', - '#c5d989', - '#b1ce6a', - '#9cc34c', - '#84b92a', - '#6fa32b', - '#5a8f2a', - '#477c29', - '#346b27', - '#205b24', - '#074d21' -]; - -var paletteSequentialDarkGreen = [ - '#eaf3e5', - '#c7d5be', - '#a3ba9a', - '#80a078', - '#5c885a', - '#357442', - '#00632e', - '#00592b', - '#004e27', - '#004423', - '#033a1e', - '#053019', - '#052613' -]; - -var paletteSequentialGreenBrown = [ - '#f7eccd', - '#d9cba6', - '#bcad82', - '#a29162', - '#887946', - '#716330', - '#5b501f', - '#51461d', - '#483d1b', - '#3f3418', - '#362b15', - '#2d2311', - '#231a0d' -]; - -var paletteSequentialBrown = [ - '#f7eccd', - '#eed3ab', - '#e4bb89', - '#dba269', - '#ad7446', - '#834d2c', - '#5e2f19', - '#552a18', - '#4c2516', - '#432113', - '#3a1c11', - '#32180f', - '#29130b' -]; - -var paletteSequentialGrey = [ - '#e5e8ea', - '#bdbfc3', - '#999a9f', - '#77797f', - '#595c64', - '#3e444c', - '#253038', - '#20282e', - '#1a2024', - '#15181b', - '#0e1112', - '#070808', - '#000000' -]; - -var paletteSequentialVioletCb = [ - '#f4f3f9', - '#e0dced', - '#cbc6e0', - '#b7b0d4', - '#948cbf', - '#706baa', - '#4d4e98', - '#484889', - '#42427a', - '#3d3c6c', - '#37365e', - '#313050', - '#2c2a44' -]; - -var paletteSequentialPinkCb = [ - '#fbe5ee', - '#f8ccd5', - '#f4b2bc', - '#f096a3', - '#d56976', - '#bc3f52', - '#a50f38', - '#951735', - '#851b31', - '#761d2e', - '#671e2a', - '#581d26', - '#4a1c22' -]; - -var paletteSequentialBlueCb = [ - '#eaf6fc', - '#cfe4f4', - '#cfe4f4', - '#91bfe3', - '#6999bb', - '#417797', - '#065b78', - '#11536b', - '#174b5f', - '#194354', - '#1a3b49', - '#1a343f', - '#192d35' -]; - -var paletteSequentialGreenCb = [ - '#fff7d0', - '#e9e09b', - '#d1ca62', - '#b7b623', - '#9e9e28', - '#88872a', - '#72722a', - '#676726', - '#5c5c23', - '#51511f', - '#47471b', - '#3d3d17', - '#333413' -]; - -var paletteSequentialGreenBrownCb = [ - '#f2edde', - '#d8d1c0', - '#bfb699', - '#a09778', - '#837b5a', - '#686141', - '#4f4b2c', - '#3e3e1f', - '#2e3313', - '#292d14', - '#232613', - '#1e2012', - '#191a10' -]; - -var paletteDivergingSpectral1 = [ - '#98141f', - '#ab332c', - '#bf5040', - '#d5705b', - '#e4a57f', - '#f3d6a6', - '#f5f2b8', - '#cfdbb1', - '#a4c4a9', - '#71ada1', - '#4e868f', - '#2e637d', - '#06456c' -]; - var paletteDivergingSpectral2 = [ '#d43d4f', '#df564b', @@ -452,2606 +881,1163 @@ var paletteDivergingSpectral2 = [ '#3489be' ]; -var paletteDivergingSpectral3 = [ - '#651035', - '#ae1143', - '#c9314b', - '#dd7257', - '#eeb27a', - '#feeb9e', - '#f5f2b8', - '#cadfba', - '#96cabb', - '#50b4bb', - '#3eaecc', - '#206791', - '#0c2c63' -]; - -var paletteDivergingBrownTurquoise = [ - '#3f3128', - '#683828', - '#933624', - '#d5705b', - '#db9c5e', - '#feeb9e', - '#f5f2b8', - '#cfdbb1', - '#a4c4a9', - '#71ada1', - '#628f85', - '#53746d', - '#475b57' -]; - -var paletteDivergingOrangePink = [ - '#e7511e', - '#eb6929', - '#ee7f37', - '#f29446', - '#f9c083', - '#ffe9c3', - '#ffeee3', - '#f9cfc1', - '#f3a9ab', - '#db6882', - '#c71360', - '#891953', - '#4b1c47' -]; - -var paletteDivergingRedBlue = [ - '#b2172b', - '#c4443e', - '#d76a5a', - '#ed937e', - '#f4b8a2', - '#fcdbc7', - '#efefef', - '#bfcad5', - '#8ba7bc', - '#4d87a5', - '#3c7ca0', - '#28729b', - '#036896' -]; - -var paletteDivergingRedGrey = [ - '#b2172b', - '#c54532', - '#da6c3b', - '#f29446', - '#f8bc67', - '#fee08b', - '#efece5', - '#c9c5c1', - '#a5a19f', - '#808080', - '#666666', - '#333333', - '#000000' -]; - -var paletteDivergingOrangeViolet = [ - '#98141f', - '#ab332c', - '#f9bc47', - '#fdcf66', - '#fede8d', - '#ffecb3', - '#f9eff6', - '#e8d0e3', - '#a4c4a9', - '#a973aa', - '#834f96', - '#622181', - '#402357' -]; - -var paletteDivergingPurpleGreen = [ - '#59194b', - '#85134b', - '#c71360', - '#db6882', - '#eba7a8', - '#fce0ca', - '#faefe1', - '#dbd9aa', - '#b9c26e', - '#94ad31', - '#728b2b', - '#546c25', - '#39521f' -]; - -var paletteDivergingVioletGreen = [ - '#55296e', - '#75408e', - '#8a5fa0', - '#a081b5', - '#beadcf', - '#ddd7e7', - '#eae8ed', - '#c1d4bc', - '#93be86', - '#58a951', - '#3c853e', - '#23662f', - '#084a22' -]; - -var paletteDivergingRedGreen = [ - '#b2172b', - '#c5403c', - '#d96453', - '#ef8972', - '#f6b49c', - '#fcdbc7', - '#f9ebde', - '#dad6a8', - '#b9c16d', - '#94ad31', - '#728b2b', - '#546c25', - '#39521f' -]; - -var paletteDivergingBrownGreen = [ - '#735146', - '#846454', - '#977a65', - '#aa9177', - '#c2ad91', - '#dbcaad', - '#edebd6', - '#c4d6aa', - '#94bf7c', - '#58a951', - '#3c853e', - '#23662f', - '#084a22' -]; - -var paletteDivergingLightBrownTurquoise = [ - '#8b5219', - '#a46821', - '#bf812c', - '#cfa151', - '#e2c489', - '#f6e8c3', - '#f5f1df', - '#cbdccc', - '#9cc6b9', - '#60afa6', - '#359790', - '#1d7d75', - '#00665e' -]; - - -function category1() { - return d3$1.scaleOrdinal().range(paletteCategory1); -} - function category2() { - return d3$1.scaleOrdinal().range(paletteCategory2); + return d3.scaleOrdinal().range(paletteCategory2); } - function category3() { - return d3$1.scaleOrdinal().range(paletteCategory3); + return d3.scaleOrdinal().range(paletteCategory3); } - function category4() { - return d3$1.scaleOrdinal().range(paletteCategory4); + return d3.scaleOrdinal().range(paletteCategory4); } - function category5() { - return d3$1.scaleOrdinal().range(paletteCategory5); -} - -function category6() { - return d3$1.scaleOrdinal().range(paletteCategory6); + return d3.scaleOrdinal().range(paletteCategory5); } function category7() { - return d3$1.scaleOrdinal().range(paletteCategory7); + return d3.scaleOrdinal().range(paletteCategory7); } - function category8() { - return d3$1.scaleOrdinal().range(paletteCategory8); + return d3.scaleOrdinal().range(paletteCategory8); } -function sequentialYellow() { - return d3$1.scaleQuantile().range(paletteSequentialYellow); -} -function sequentialRedOrange() { - return d3$1.scaleQuantile().range(paletteSequentialRedOrange); -} -function sequentialRed() { - return d3$1.scaleQuantile().range(paletteSequentialRed); -} -function sequentialPink() { - return d3$1.scaleQuantile().range(paletteSequentialPink); -} -function sequentialPurplePink() { - return d3$1.scaleQuantile().range(paletteSequentialPurplePink); -} -function sequentialPurple() { - return d3$1.scaleQuantile().range(paletteSequentialPurple); -} -function sequentialBlue() { - return d3$1.scaleQuantile().range(paletteSequentialBlue); -} -function sequentialLightBlue() { - return d3$1.scaleQuantile().range(paletteSequentialLightBlue); -} -function sequentialBlueViolet() { - return d3$1.scaleQuantile().range(paletteSequentialBlueViolet); -} - -function sequentialTurquoise() { - return d3$1.scaleQuantile().range(paletteSequentialTurquoise); -} -function sequentialLightGreen() { - return d3$1.scaleQuantile().range(paletteSequentialLightGreen); -} -function sequentialDarkGreen() { - return d3$1.scaleQuantile().range(paletteSequentialDarkGreen); -} -function sequentialGreenBrown() { - return d3$1.scaleQuantile().range(paletteSequentialGreenBrown); -} -function sequentialBrown() { - return d3$1.scaleQuantile().range(paletteSequentialBrown); -} -function sequentialGrey() { - return d3$1.scaleQuantile().range(paletteSequentialGrey); -} -function sequentialVioletCb() { - return d3$1.scaleQuantile().range(paletteSequentialVioletCb); -} -function sequentialPinkCb() { - return d3$1.scaleQuantile().range(paletteSequentialPinkCb); -} -function sequentialBlueCb() { - return d3$1.scaleQuantile().range(paletteSequentialBlueCb); -} -function sequentialGreenCb() { - return d3$1.scaleQuantile().range(paletteSequentialGreenCb); -} -function sequentialGreenBrownCb() { - return d3$1.scaleQuantile().range(paletteSequentialGreenBrownCb); -} -function diverging_spectral1() { - return d3$1.scaleQuantile().range(paletteDivergingSpectral1); -} function diverging_spectral2() { - return d3$1.scaleQuantile().range(paletteDivergingSpectral2); -} - -function diverging_spectral3() { - return d3$1.scaleQuantile().range(paletteDivergingSpectral3); -} - -function diverging_brown_turquoise() { - return d3$1.scaleQuantile().range(paletteDivergingBrownTurquoise); -} - -function diverging_orange_pink() { - return d3$1.scaleQuantile().range(paletteDivergingOrangePink); -} - -function diverging_red_blue() { - return d3$1.scaleQuantile().range(paletteDivergingRedBlue); -} - -function diverging_red_grey() { - return d3$1.scaleQuantile().range(paletteDivergingRedGrey); -} - -function diverging_orange_violet() { - return d3$1.scaleQuantile().range(paletteDivergingOrangeViolet); -} - -function diverging_purple_green() { - return d3$1.scaleQuantile().range(paletteDivergingPurpleGreen); -} - -function diverging_violet_green() { - return d3$1.scaleQuantile().range(paletteDivergingVioletGreen); -} - -function diverging_red_green() { - return d3$1.scaleQuantile().range(paletteDivergingRedGreen); + return d3.scaleQuantile().range(paletteDivergingSpectral2); } -function diverging_brown_green() { - return d3$1.scaleQuantile().range(paletteDivergingBrownGreen); -} - -function diverging_lightBrown_turquoise() { - return d3$1.scaleQuantile().range(paletteDivergingLightBrownTurquoise); -} - -/** - * - * A Datasource is the name given to the connection set up to a data endpoint. This class defines the common methods for the datasources, - * such as start() and stop(). - * - * @export Default export: Datasource class - * - * @class Datasource The Datasource class - * - */ -var Datasource = function Datasource() { - this.filters = []; - this.properties = []; -}; - -/** - * Starts the stream of data - * - * - * @memberOf Datasource - */ -Datasource.prototype.start = function start () { - window.console.log('Starting datasource'); -}; - -/** - * - * If started, this method stops the stream of data - * - * @memberOf Datasource - - */ -Datasource.prototype.stop = function stop () { - window.console.log('Stopping datasource'); -}; - - -Datasource.prototype.property = function property (prop, newProp, cast) { - this.properties.push({ 'p': prop, 'newP': newProp, cast: cast }); - return this; -}; - - -Datasource.prototype.convert = function convert (data) { - var this$1 = this; - - var result = {}; - for (var i in this.properties) { - var p = this$1.properties[i].p; - var value = eval('data.' + this$1.properties[i].newP); - // if(this.properties[i].cast){ - //value = new this.properties[i].cast(value); - // } - - result[p] = value; +var Interpolation = (function () { + function Interpolation() { } - return result; -}; + return Interpolation; +}()); +Interpolation.CURVE_LINEAR = d3.curveLinear; +Interpolation.CURVE_LINEAR_CLOSED = d3.curveLinearClosed; +Interpolation.CURVE_MONOTONE_X = d3.curveMonotoneX; +Interpolation.CURVE_MONOTONE_Y = d3.curveMonotoneY; +Interpolation.CURVE_NATURAL = d3.curveNatural; +Interpolation.CURVE_STEP = d3.curveStep; +Interpolation.CURVE_STEP_AFTER = d3.curveStepAfter; +Interpolation.CURVE_STEP_BEFORE = d3.curveStepBefore; -/** - * Filters the incoming messages. Each data record that do not comply the filter condition will be discarded - * - * @param {any} filter A filter condition - * @returns this Datasource instance - * - * @memberOf Datasource - */ -Datasource.prototype.filter = function filter (filter) { - return this; +var defaults = { + selector: '#chart', + colorScale: category7(), + curve: Interpolation.CURVE_MONOTONE_X, + areaOpacity: 0, + xAxisType: 'linear', + xAxisFormat: '', + xAxisLabel: null, + xAxisGrid: true, + yAxisType: 'linear', + yAxisFormat: '', + yAxisLabel: null, + yAxisShow: true, + yAxisGrid: true, + marginTop: 20, + marginRight: 250, + marginBottom: 130, + marginLeft: 150, + markerShape: 'dot', + markerSize: 0, + markerOutlineWidth: 2, + width: '100%', + height: 250, + legend: true, + propertyX: 'x', + propertyY: 'y', + propertyKey: 'key', + onDown: function (d) { + }, + onHover: function (d) { + }, + onLeave: function (d) { + }, + onClick: function (d) { + }, + onUp: function (d) { + }, + maxNumberOfElements: 10, }; -/** - * - * This datasource set up a connection to a http server. - * @export - * @class HTTPDatasource - * @extends {Datasource} - - */ -var HTTPDatasource = (function (Datasource$$1) { - function HTTPDatasource(source) { - Datasource$$1.call(this); - this.source = source; - this.intervalId = -1; - this.started = false; +var Linechart = (function (_super) { + __extends(Linechart, _super); + function Linechart(data, userConfig) { + if (userConfig === void 0) { userConfig = {}; } + return _super.call(this, new SvgStrategyLinechart(), data, userConfig, defaults) || this; } - - if ( Datasource$$1 ) HTTPDatasource.__proto__ = Datasource$$1; - HTTPDatasource.prototype = Object.create( Datasource$$1 && Datasource$$1.prototype ); - HTTPDatasource.prototype.constructor = HTTPDatasource; - - /** - * Configure a dispatcher for this datasource. - * - * @param {any} dispatcher A d3 dispatcher. This dispatcher is in charge of receiving and sending events. - * - * @memberOf HTTPDatasource - */ - HTTPDatasource.prototype.configure = function configure (dispatcher) { - this.dispatcher = dispatcher; + Linechart.prototype.keepDrawing = function (datum) { + var maxNumberOfElements = this.config.get('maxNumberOfElements'), numberOfElements = this.data.length, position = -1, datumType = datum.constructor; + if (datumType === Array) { + this.data = this.data.concat(datum); + } + else { + this.data.push(datum); + } + if (numberOfElements > maxNumberOfElements) { + var position_1 = numberOfElements - maxNumberOfElements; + this.data = this.data.slice(position_1); + } + this.draw(copy(this.data)); }; + return Linechart; +}(Chart)); - /** - * - * Initialize an HTTP connection - * - * @memberOf HTTPDatasource - - */ - HTTPDatasource.prototype.start = function start () { - if (!this.started) { - Datasource$$1.prototype.start.call(this); - var pollingTime = this.source.pollingTime; - var url = this.source.url; - this._startPolling(url, pollingTime); - this.started = true; +var Barset = (function (_super) { + __extends(Barset, _super); + function Barset(x, y) { + var _this = _super.call(this) || this; + _this.x = x; + _this.y = y; + return _this; + } + Barset.prototype.render = function () { + }; + Barset.prototype.update = function (data) { + var bars = null, stacked = this.config.get('stacked'); + this.clean(); + if (stacked) { + this.updateStacked(data); + } + else { + this.updateGrouped(data); } + bars = this.svg.selectAll('g.barSeries rect'); + bars + .on('mousedown.user', this.config.get('onDown')) + .on('mouseup.user', this.config.get('onUp')) + .on('mouseleave.user', this.config.get('onLeave')) + .on('mouseover.user', this.config.get('onHover')) + .on('click.user', this.config.get('onClick')); }; - - - HTTPDatasource.prototype._startPolling = function _startPolling (url, time) { - var this$1 = this; - if ( time === void 0 ) time = 1000; - - var interval = window.setInterval; - this.intervalId = interval(function () { return this$1._startRequest(url); }, time); + Barset.prototype.updateStacked = function (data) { + var propertyKey = this.config.get('propertyKey'); + var keys = d3.map(data, function (d) { return d[propertyKey]; }).keys(); + var stack$$1 = this.config.get('stack'); + data = stack$$1.keys(keys)(simple2stacked(data)); + var colorScale = this.config.get('colorScale'), layer = this.svg.selectAll('.barSeries').data(data), layerEnter = layer.enter().append('g'), x = this.x.xAxis.scale(), y = this.y.yAxis.scale(); + layer.merge(layerEnter) + .attr('class', 'barSeries') + .attr(Globals.COMPONENT_DATA_KEY_ATTRIBUTE, function (d) { return d[propertyKey]; }) + .style('fill', function (d, i) { return d[propertyKey] !== undefined ? colorScale(d[propertyKey]) : colorScale(i); }) + .selectAll('rect') + .data(function (d) { return d; }) + .enter().append('rect') + .attr("x", function (d) { return x(d.data[propertyKey]); }) + .attr("y", function (d) { return y(d[1]); }) + .attr("height", function (d) { return y(d[0]) - y(d[1]); }) + .attr("width", x.bandwidth()); }; - - HTTPDatasource.prototype._startRequest = function _startRequest (url) { - var this$1 = this; - - - window.console.log('url', url); - d3$1.request(url).get(function (e, response) { return this$1._handleResponse(response); }); + Barset.prototype.updateGrouped = function (data) { + var propertyKey = this.config.get('propertyKey'); + var propertyX = this.config.get('propertyX'); + var propertyY = this.config.get('propertyY'); + var keys = d3.map(data, function (d) { return d[propertyKey]; }).keys(), colorScale = this.config.get('colorScale'), layer = null, x = this.x.xAxis.scale(), y = this.y.yAxis.scale(), xGroup = d3.scaleBand().domain(keys).range([0, x.bandwidth()]), height = this.config.get('height'); + data = simple2nested(data, 'key'); + layer = this.svg.selectAll('g.barSeries') + .data(data, function (d) { return d.values; }); + layer.enter() + .append('g') + .attr('class', 'barSeries') + .attr(Globals.COMPONENT_DATA_KEY_ATTRIBUTE, function (d) { return d[propertyKey]; }) + .selectAll('rect') + .data(function (d) { return d.values; }) + .enter() + .append('rect') + .attr('transform', function (d) { return 'translate(' + x(d[propertyX]) + ')'; }) + .attr('width', xGroup.bandwidth()) + .attr("x", function (d) { return xGroup(d[propertyKey]); }) + .attr("y", function (d) { return y(d[propertyY]); }) + .attr("height", function (d) { return height - y(d[propertyY]); }) + .style('fill', function (d, i) { return d[propertyKey] !== undefined ? colorScale(d[propertyKey]) : colorScale(i); }); }; - - HTTPDatasource.prototype._stopPolling = function _stopPolling () { - var clearInterval = window.clearInterval; - clearInterval(this.intervalId); + return Barset; +}(Component)); + +var SvgStrategyBarchart = (function (_super) { + __extends(SvgStrategyBarchart, _super); + function SvgStrategyBarchart() { + var _this = _super.call(this) || this; + _this.axes = new XYAxis(); + _this.bars = new Barset(_this.axes.x, _this.axes.y); + return _this; + } + SvgStrategyBarchart.prototype.draw = function (data) { + var xAxisFormat = this.config.get('xAxisFormat'), xAxisType = this.config.get('xAxisType'), yAxisFormat = this.config.get('yAxisFormat'), yAxisType = this.config.get('yAxisType'); + convertByXYFormat(data, xAxisFormat, xAxisType, yAxisFormat, yAxisType); + sortByField(data, 'x'); + this.container.updateComponents(data); + }; + SvgStrategyBarchart.prototype.initialize = function () { + _super.prototype.initialize.call(this); + var legend = this.config.get('legend'); + this.container.add(this.axes).add(this.bars); + if (legend) { + this.legend = new Legend(); + this.container.add(this.legend); + } }; + return SvgStrategyBarchart; +}(SvgChart)); - HTTPDatasource.prototype._handleResponse = function _handleResponse (xmlHttpRequest) { - var parseJson = window.JSON.parse; - if (xmlHttpRequest.readyState === 4 && xmlHttpRequest.status === 200) { - var response = parseJson(xmlHttpRequest.response); - this._handleOK(response); +var defaults$1 = { + selector: '#chart', + colorScale: category5(), + stacked: false, + xAxisType: 'categorical', + xAxisFormat: '', + xAxisLabel: '', + xAxisGrid: false, + yAxisType: 'linear', + yAxisFormat: '', + yAxisLabel: '', + yAxisShow: true, + yAxisGrid: true, + marginTop: 20, + marginRight: 250, + marginBottom: 130, + marginLeft: 150, + width: '100%', + height: 350, + legend: true, + propertyX: 'x', + propertyY: 'y', + propertyKey: 'key', + stack: d3.stack().value(function (d, k) { return d.value[k]; }), + onDown: function (d) { + }, + onHover: function (d) { + }, + onLeave: function (d) { + }, + onClick: function (d) { + }, + onUp: function (d) { + } +}; + +var Barchart = (function (_super) { + __extends(Barchart, _super); + function Barchart(data, userConfig) { + if (userConfig === void 0) { userConfig = {}; } + return _super.call(this, new SvgStrategyBarchart(), data, userConfig, defaults$1) || this; + } + Barchart.prototype.fire = function (event$$1, data) { + if (event$$1 === 'transition') { + if (data === 'grouped') { + this.config.put('stacked', false); + } + else if (data === 'stacked') { + this.config.put('stacked', true); + } + this.draw(); + } + }; + Barchart.prototype.keepDrawing = function (datum) { + var datumType = datum.constructor; + if (datumType === Array) { + this.data = datum; } else { - this._handleError(xmlHttpRequest); + var found = false; + for (var i = 0; i < this.data.length; i++) { + var d = this.data[i]; + if (d['x'] === datum['x'] && d['key'] === datum['key']) { + this.data[i] = datum; + found = true; + break; + } + } + if (!found) { + this.data.push(datum); + } } + this.draw(copy(this.data)); }; + return Barchart; +}(Chart)); - HTTPDatasource.prototype._handleOK = function _handleOK (data) { - if(this.properties.length > 0 ) { - data = this.convert(data); - } - this.dispatcher.call('onmessage', this, data); +var Dial = (function (_super) { + __extends(Dial, _super); + function Dial() { + return _super.call(this) || this; + } + Dial.prototype.render = function () { + var labels = null, invertColorScale = this.config.get('invertColorScale'), colorScale = this.config.get('colorScale'), width = this.config.get('width'), height = this.config.get('height'), ringWidth = this.config.get('ringWidth'), ringMargin = this.config.get('ringMargin'), ticks = this.config.get('ticks'), minAngle = this.config.get('minAngle'), maxAngle = this.config.get('maxAngle'), minLevel = this.config.get('minLevel'), maxLevel = this.config.get('maxLevel'), labelInset = this.config.get('labelInset'), scale = d3.scaleLinear() + .domain([minLevel, maxLevel]) + .range([0, 1]), scaleMarkers = scale.ticks(ticks), range$$1 = maxAngle - minAngle, r = ((width > height) ? + height : width) / 2, translation = (function () { return 'translate(' + r + ',' + r + ')'; }), tickData = d3.range(ticks).map(function () { return 1 / ticks; }), arc$$1 = d3.arc() + .innerRadius(r - ringWidth - ringMargin) + .outerRadius(r - ringMargin) + .startAngle(function (d, i) { return deg2rad(minAngle + ((d * i) * range$$1)); }) + .endAngle(function (d, i) { return deg2rad(minAngle + ((d * (i + 1)) * range$$1)); }); + colorScale.domain([0, 1]); + var arcs = this.svg.append('g') + .attr('class', 'arc') + .attr('transform', translation); + var arcPaths = arcs.selectAll('path') + .data(tickData) + .enter().append('path') + .attr('id', function (d, i) { return 'sector-' + i; }) + .attr('d', arc$$1); + arcPaths.attr('fill', function (d, i) { return colorScale(invertColorScale + ? (1 - d * i) + : (d * i)); }); + labels = this.svg.append('g') + .attr('class', 'labels') + .attr('transform', translation); + labels.selectAll('text') + .data(scaleMarkers) + .enter().append('text') + .attr('transform', function (d) { + var ratio = scale(d); + var newAngle = minAngle + (ratio * range$$1); + return 'rotate(' + newAngle + ') translate(0,' + (labelInset - r) + ')'; + }) + .text(function (d) { return d; }) + .style('text-anchor', 'middle') + .style('font', '18px Montserrat, sans-serif'); }; - - HTTPDatasource.prototype._handleError = function _handleError (data) { - this.dispatcher.call('onerror', this, data); + Dial.prototype.update = function () { }; + return Dial; +}(Component)); - /** - * If started, this method close the HTTP connection. - * - * @memberOf HTTPDatasource - * */ - HTTPDatasource.prototype.stop = function stop () { - if (this.started) { - this._stopPolling(); - this.started = false; +var DialNeedle = (function (_super) { + __extends(DialNeedle, _super); + function DialNeedle() { + return _super.call(this) || this; + } + DialNeedle.prototype.render = function () { + var labels = null, invertColorScale = this.config.get('invertColorScale'), colorScale = this.config.get('colorScale'), width = this.config.get('width'), height = this.config.get('height'), ringWidth = this.config.get('ringWidth'), ringMargin = this.config.get('ringMargin'), ticks = this.config.get('ticks'), minAngle = this.config.get('minAngle'), maxAngle = this.config.get('maxAngle'), minLevel = this.config.get('minLevel'), maxLevel = this.config.get('maxLevel'), labelInset = this.config.get('labelInset'), needleNutRadius = this.config.get('needleNutRadius'), needleLenghtRatio = this.config.get('needleLenghtRatio'), scale = d3.scaleLinear() + .domain([minLevel, maxLevel]) + .range([0, 1]), scaleMarkers = scale.ticks(ticks), range$$1 = maxAngle - minAngle, r = ((width > height) ? + height : width) / 2, needleLen = needleLenghtRatio * (r), translation = (function () { return 'translate(' + r + ',' + r + ')'; }), tickData = d3.range(ticks).map(function () { return 1 / ticks; }), arc$$1 = d3.arc() + .innerRadius(r - ringWidth - ringMargin) + .outerRadius(r - ringMargin) + .startAngle(function (d, i) { return deg2rad(minAngle + ((d * i) * range$$1)); }) + .endAngle(function (d, i) { return deg2rad(minAngle + ((d * (i + 1)) * range$$1)); }), angleScale = d3.scaleLinear() + .domain([minLevel, maxLevel]) + .range([90 + minAngle, 90 + maxAngle]); + this.svg.append('path') + .attr('class', 'needle') + .datum(0) + .attr('transform', function (d) { return "translate(" + r + ", " + r + ") rotate(" + (angleScale(d) - 90) + ")"; }) + .attr('d', "M " + (0 - needleNutRadius) + " " + 0 + " L " + 0 + " " + (0 - needleLen) + " L " + needleNutRadius + " " + 0) + .style('fill', '#666666'); + this.svg.append('circle') + .attr('class', 'needle') + .attr('transform', translation) + .attr('cx', 0) + .attr('cy', 0) + .attr('r', needleNutRadius) + .style('fill', '#666666'); + }; + DialNeedle.prototype.update = function (data) { + var datum = data[data.length - 1], width = this.config.get('width'), height = this.config.get('height'), needleNutRadius = this.config.get('needleNutRadius'), needleLenghtRatio = this.config.get('needleLenghtRatio'), propertyValue = this.config.get('propertyValue'), minAngle = this.config.get('minAngle'), maxAngle = this.config.get('maxAngle'), minLevel = this.config.get('minLevel'), maxLevel = this.config.get('maxLevel'), r = ((width > height) ? + height : width) / 2, needleLen = needleLenghtRatio * (r), angleScale = d3.scaleLinear() + .domain([minLevel, maxLevel]) + .range([90 + minAngle, 90 + maxAngle]); + this.svg.select('.needle') + .transition() + .attr('transform', function (d) { return "translate(" + r + ", " + r + ") rotate(" + (angleScale(datum[propertyValue]) - 90) + ")"; }) + .attr('d', "M " + (0 - needleNutRadius) + " " + 0 + " L " + 0 + " " + (0 - needleLen) + " L " + needleNutRadius + " " + 0); + }; + return DialNeedle; +}(Component)); + +var TextIndicator = (function (_super) { + __extends(TextIndicator, _super); + function TextIndicator() { + var _this; + return _this; + } + TextIndicator.prototype.update = function (data) { + var datum = data[data.length - 1]; + this.svg.select('.value') + .text(datum.value); + this.svg.select('.label') + .text(datum.label); + }; + TextIndicator.prototype.render = function () { + var indicator = this.svg.append('g') + .attr('class', 'text-indicator') + .attr('pointer-events', 'none') + .style('text-anchor', 'middle') + .style('alignment-baseline', 'central'); + indicator.append('text') + .attr('class', 'value') + .attr('x', 0) + .attr('y', 0) + .attr('pointer-events', 'none') + .text('') + .style('text-anchor', 'middle'); + indicator.append('text') + .attr('class', 'label') + .attr('x', 0) + .attr('y', 0) + .attr('pointer-events', 'none') + .text('') + .style('transform', 'translate(0, 1.5em') + .style('text-anchor', 'middle'); + }; + TextIndicator.prototype.translate = function (x, y) { + this.svg + .select('g.text-indicator') + .attr('transform', "translate(" + x + ", " + y + ")"); + }; + return TextIndicator; +}(Component)); + +var SvgStrategyGauge = (function (_super) { + __extends(SvgStrategyGauge, _super); + function SvgStrategyGauge() { + var _this = _super.call(this) || this; + _this.dial = new Dial(); + _this.dialNeedle = new DialNeedle(); + _this.textIndicator = new TextIndicator(); + return _this; + } + SvgStrategyGauge.prototype.draw = function (data) { + this.container.updateComponents(data); + }; + SvgStrategyGauge.prototype.initialize = function () { + _super.prototype.initialize.call(this); + this.container.add(this.dial).add(this.dialNeedle); + if (this.config.get('numericIndicator')) { + var width = this.config.get('width'), height = this.config.get('height'); + var r = ((width > height) ? height : width) / 2; + var indicatorOffset = r + 75; + this.container.add(this.textIndicator); + this.textIndicator.translate(r, indicatorOffset); } }; + return SvgStrategyGauge; +}(SvgChart)); - return HTTPDatasource; -}(Datasource)); - -/** - * - * This datasource set up a connection to a websocket server. - * @export - * @class WebsocketDatasource - * @extends {Datasource} +var defaults$2 = { + selector: '#chart', + colorScale: diverging_spectral2(), + invertColorScale: true, + minLevel: 0, + maxLevel: 100, + minAngle: -90, + maxAngle: 90, + ringWidth: 50, + ringMargin: 20, + labelInset: 10, + needleNutRadius: 25, + needleLenghtRatio: 0.8, + numericIndicator: true, + label: 'km/h', + marginTop: 20, + marginRight: 250, + marginBottom: 30, + marginLeft: 50, + width: '50%', + height: 250, + ticks: 10, + propertyValue: 'value' +}; - */ -var WebsocketDatasource = (function (Datasource$$1) { - function WebsocketDatasource(source) { - Datasource$$1.call(this); - this.source = source; +var Gauge = (function (_super) { + __extends(Gauge, _super); + function Gauge(data, userConfig) { + if (userConfig === void 0) { userConfig = {}; } + return _super.call(this, new SvgStrategyGauge(), data, userConfig, defaults$2) || this; } - - if ( Datasource$$1 ) WebsocketDatasource.__proto__ = Datasource$$1; - WebsocketDatasource.prototype = Object.create( Datasource$$1 && Datasource$$1.prototype ); - WebsocketDatasource.prototype.constructor = WebsocketDatasource; - - /** - * Configure a dispatcher for this datasource. - * - * @param {any} dispatcher A d3 dispatcher. This dispatcher is in charge of receiving and sending events. - * - * @memberOf WebsocketDatasource - */ - WebsocketDatasource.prototype.configure = function configure (dispatcher) { - this.dispatcher = dispatcher; + Gauge.prototype.keepDrawing = function (datum) { + this.data = [datum[0]]; + _super.prototype.draw.call(this); }; + return Gauge; +}(Chart)); - /** - * - * Initialize a websocket connection - * - * @memberOf WebsocketDatasource - - */ - WebsocketDatasource.prototype.start = function start () { - var this$1 = this; - - Datasource$$1.prototype.start.call(this); - this.ws = new window.WebSocket(this.source.endpoint); - - this.ws.onopen = function (e) { - this$1.dispatcher.call('onopen', this$1, e); - }; - this.ws.onerror = function (e) { - throw new Error('An error occurred trying to reach the websocket server' + e); - //this.dispatcher.call('onerror', this, e); - }; - this.ws.onmessage = function (e) { - var data = JSON.parse(e.data); - this$1.dispatcher.call('onmessage', this$1, data); - }; +var CanvasPointset = (function (_super) { + __extends(CanvasPointset, _super); + function CanvasPointset(x, y) { + var _this = _super.call(this) || this; + _this.x = x; + _this.y = y; + return _this; + } + CanvasPointset.prototype.update = function (data) { + var _this = this; + var propertyKey = this.config.get('propertyKey'); + var propertyX = this.config.get('propertyX'); + var propertyY = this.config.get('propertyY'); + var markerShape = this.config.get('markerShape'), markerSize = this.config.get('markerSize'), colorScale = this.config.get('colorScale'), points = null, series = null, dataContainer = null, width = this.config.get('width'), height = this.config.get('height'); + var shape = d3.symbol() + .size(markerSize) + .context(this.canvasCtx); + switch (markerShape) { + case 'dot': + shape.type(d3.symbolCircle); + break; + case 'ring': + shape.type(d3.symbolCircle); + break; + case 'cross': + shape.type(d3.symbolCross); + break; + case 'diamond': + shape.type(d3.symbolDiamond); + break; + case 'square': + shape.type(d3.symbolSquare); + break; + case 'star': + shape.type(d3.symbolStar); + break; + case 'triangle': + shape.type(d3.symbolTriangle); + break; + case 'wye': + shape.type(d3.symbolWye); + break; + case 'circle': + shape.type(d3.symbolCircle); + break; + default: + shape.type(d3.symbolCircle); + } + dataContainer = this.svg.append('proteic'); + series = dataContainer.selectAll('proteic.g.points'); + this.canvasCtx.clearRect(0, 0, width, height); + series + .data(data, function (d) { return d[propertyKey]; }) + .enter() + .call(function (s) { + var self = _this; + s.each(function (d) { + self.canvasCtx.save(); + self.canvasCtx.translate(self.x.xAxis.scale()(d[propertyX]), self.y.yAxis.scale()(d[propertyY])); + self.canvasCtx.beginPath(); + self.canvasCtx.strokeStyle = colorScale(d[propertyKey]); + self.canvasCtx.fillStyle = colorScale(d[propertyKey]); + shape(); + self.canvasCtx.closePath(); + self.canvasCtx.stroke(); + if (markerShape !== 'ring') { + self.canvasCtx.fill(); + } + self.canvasCtx.restore(); + }); + }); }; - /** - * If started, this method close the websocket connection. - * - * @memberOf WebsocketDatasource - * */ - WebsocketDatasource.prototype.stop = function stop () { - Datasource$$1.prototype.stop.call(this); - if (this.ws) { - this.ws.close(); + CanvasPointset.prototype.render = function () { + this.canvas = d3.select(this.config.get('selector')).append('canvas') + .attr('id', 'point-set-canvas') + .attr('width', this.config.get('width')) + .attr('height', this.config.get('height')) + .style('position', 'absolute') + .style('z-index', 2) + .style('transform', "translate(" + this.config.get('marginLeft') + "px, " + this.config.get('marginTop') + "px)"); + this.canvasCtx = this.canvas.node().getContext('2d'); + }; + return CanvasPointset; +}(Component)); + +var SvgStrategyScatterplot = (function (_super) { + __extends(SvgStrategyScatterplot, _super); + function SvgStrategyScatterplot() { + var _this = _super.call(this) || this; + _this.axes = new XYAxis(); + _this.markers = new Pointset(_this.axes.x, _this.axes.y); + _this.canvasMarkers = new CanvasPointset(_this.axes.x, _this.axes.y); + return _this; + } + SvgStrategyScatterplot.prototype.draw = function (data) { + var xAxisFormat = this.config.get('xAxisFormat'), xAxisType = this.config.get('xAxisType'), yAxisFormat = this.config.get('yAxisFormat'), yAxisType = this.config.get('yAxisType'); + convertByXYFormat(data, xAxisFormat, xAxisType, yAxisFormat, yAxisType); + sortByField(data, 'x'); + this.container.updateComponents(data); + }; + SvgStrategyScatterplot.prototype.initialize = function () { + _super.prototype.initialize.call(this); + var legend = this.config.get('legend'); + this.container.add(this.axes); + if (this.config.get('canvas')) { + this.container.add(this.canvasMarkers); + } + else { + this.container.add(this.markers); + } + if (legend) { + this.legend = new Legend(); + this.container.add(this.legend); } }; + return SvgStrategyScatterplot; +}(SvgChart)); - return WebsocketDatasource; -}(Datasource)); - -var defaults = { +var defaults$3 = { selector: '#chart', colorScale: category7(), - //Area - areaOpacity: 0.4, - - //Axes xAxisType: 'linear', - xAxisFormat: '', - xAxisLabel: null, + xAxisFormat: '.1f', + xAxisLabel: '', + xAxisGrid: true, yAxisType: 'linear', - yAxisFormat: '', - yAxisLabel: null, - //margins + yAxisFormat: '.1f', + yAxisLabel: '', + yAxisShow: true, + yAxisGrid: true, marginTop: 20, marginRight: 250, marginBottom: 130, marginLeft: 150, - //markers markerShape: 'circle', - markerSize: 5, - markerOutlineWidth: 2, - //Width & height - width: '100%', // %, auto, or numeric + markerSize: 15, + width: '100%', height: 250, - //Events - onDown: function onDown(d) { + legend: true, + propertyX: 'x', + propertyY: 'y', + propertyKey: 'key', + onDown: function (d) { }, - onHover: function onHover(d) { + onHover: function (d) { }, - onLeave: function onLeave(d) { + onLeave: function (d) { }, - onClick: function onClick(d) { + onClick: function (d) { }, - - maxNumberOfElements: 100, // used by keepDrawing method to reduce the number of elements in the current chart -}; - -var SvgContainer = function SvgContainer(config) { - this._config = config; - this.svg = this._initializeSvgContainer(config); - this.components = Array(); + onUp: function (d) { + }, + maxNumberOfElements: 100, + canvas: false }; -SvgContainer.prototype._initializeSvgContainer = function _initializeSvgContainer (config) { - var selector = config.selector, - width = config.width + config.marginLeft + config.marginRight, - height = config.height + config.marginTop + config.marginBottom, - svg = null; +var Scatterplot = (function (_super) { + __extends(Scatterplot, _super); + function Scatterplot(data, userConfig) { + if (userConfig === void 0) { userConfig = {}; } + return _super.call(this, new SvgStrategyScatterplot(), data, userConfig, defaults$3) || this; + } + Scatterplot.prototype.keepDrawing = function (datum) { + var datumType = datum.constructor; + if (datumType === Array) { + if (this.data) { + this.data = this.data.concat(datum); + } + else { + this.data = datum; + } + } + else { + this.data.push(datum); + } + this.draw(copy(this.data)); + }; + return Scatterplot; +}(Chart)); - svg = d3$1.select(selector) - .append('svg:svg') - .attr('width', width) - .attr('height', height) - .append('g') - .attr('class', 'chartContainer') - .attr('transform', 'translate(' + config.marginLeft + ',' + config.marginTop + ')'); +var Streamset = (function (_super) { + __extends(Streamset, _super); + function Streamset(xyAxes) { + var _this = _super.call(this) || this; + _this.xyAxes = xyAxes; + _this.areaGenerator = d3.area() + .curve(d3.curveCardinal) + .y0(function (d) { return _this.xyAxes.y.yAxis.scale()(d[0]); }) + .y1(function (d) { return _this.xyAxes.y.yAxis.scale()(d[1]); }); + return _this; + } + Streamset.prototype.render = function () { + }; + Streamset.prototype.update = function (data) { + var _this = this; + var propertyKey = this.config.get('propertyKey'); + var propertyX = this.config.get('propertyX'); + var propertyY = this.config.get('propertyY'); + this.clean(); + var colorScale = this.config.get('colorScale'), onDown = this.config.get('onDown'), onUp = this.config.get('onUp'), onLeave = this.config.get('onLeave'), onHover = this.config.get('onHover'), onClick = this.config.get('onClick'), keys = d3.map(data, function (d) { return d[propertyKey]; }).keys(), data4stack = simple2stacked(data), stack$$1 = this.config.get('stack'), dataSeries = stack$$1(data4stack), series = null; + this.areaGenerator.x(function (d) { return _this.xyAxes.x.xAxis.scale()((new Date(d.data[propertyKey]))); }); + series = this.svg.selectAll('.serie') + .data(dataSeries) + .enter() + .append('g') + .attr('class', 'serie') + .style('stroke', function (d, i) { return colorScale(d[propertyKey]); }) + .attr(Globals.COMPONENT_DATA_KEY_ATTRIBUTE, function (d) { return d[propertyKey]; }); + series + .append('path') + .attr('class', 'layer') + .attr('d', this.areaGenerator) + .style('fill', function (d, i) { return colorScale(d[propertyKey]); }); + series.exit().remove(); + series + .attr('opacity', 1) + .on('mousedown.user', onDown) + .on('mouseup.user', onUp) + .on('mouseleave.user', onLeave) + .on('mouseover.user', onHover) + .on('click.user', onClick); + }; + return Streamset; +}(Component)); + +var SvgStrategyStreamgraph = (function (_super) { + __extends(SvgStrategyStreamgraph, _super); + function SvgStrategyStreamgraph() { + var _this = _super.call(this) || this; + _this.axes = new XYAxis(); + _this.streams = new Streamset(_this.axes); + return _this; + } + SvgStrategyStreamgraph.prototype.draw = function (data) { + var xAxisFormat = this.config.get('xAxisFormat'), xAxisType = this.config.get('xAxisType'), yAxisFormat = this.config.get('yAxisFormat'), yAxisType = this.config.get('yAxisType'); + convertPropretiesToTimeFormat(data, ['x'], xAxisFormat); + sortByField(data, 'x'); + this.container.updateComponents(data); + }; + SvgStrategyStreamgraph.prototype.initialize = function () { + _super.prototype.initialize.call(this); + var markerSize = this.config.get('markerSize'), areaOpacity = this.config.get('areaOpacity'), legend = this.config.get('legend'); + this.container.add(this.axes).add(this.streams); + if (legend) { + this.legend = new Legend(); + this.container.add(this.legend); + } + }; + return SvgStrategyStreamgraph; +}(SvgChart)); - return svg; +var defaults$4 = { + selector: '#chart', + colorScale: category4(), + xAxisType: 'time', + xAxisFormat: '%y/%m/%d', + xAxisLabel: '', + xAxisGrid: true, + yAxisType: 'linear', + yAxisFormat: '', + yAxisLabel: '', + yAxisShow: false, + yAxisGrid: false, + marginTop: 20, + marginRight: 250, + marginBottom: 130, + marginLeft: 150, + width: '100%', + height: 250, + legend: true, + propertyX: 'x', + propertyY: 'y', + propertyKey: 'key', + stack: d3.stack().value(function (d, k) { return d.value[k]; }).order(d3.stackOrderInsideOut).offset(d3.stackOffsetWiggle), + stacked: true, + onDown: function (d) { + }, + onHover: function (d) { + }, + onLeave: function (d) { + }, + onClick: function (d) { + }, + onUp: function (d) { + }, + maxNumberOfElements: 100, }; - -SvgContainer.prototype.add = function add (component, render) { - if ( render === void 0 ) render = true; - - this.components.push(component); - - if (render) { - component.render(this.svg, this._config); - } - return this; -}; - -SvgContainer.prototype.transform = function transform (translation) { - this.svg.attr('transform', translation); - -}; - -function isNumeric(n) { - return !isNaN(parseFloat(n)) && isFinite(n); -} - -function isEven(n) { - return n % 2 === 0; -} - -function isPercentage(n) { - var split = null; - var number = null; - if (!n || typeof n !== 'string') { - return false; - } - split = n.split('%'); - number = (+split[0]); - return split.length === 2 && - (number >= 0) && - (number <= 100); -} - - - - - - - - -function deg2rad(deg) { - return deg * Math.PI / 180; -} - -function calculateWidth(widthConfig, selector) { - if (widthConfig === 'auto') { - return d3$1.select(selector) - .node() - .getBoundingClientRect() - .width; - } - else if (isNumeric(widthConfig)) { - return widthConfig; - } - else if (isPercentage(widthConfig)) { - var containerWidth, percentage; - containerWidth = d3$1.select(selector) - .node() - .getBoundingClientRect() - .width; - percentage = widthConfig.split('%')[0]; - return Math.round(percentage * containerWidth / 100); - } else { - throw Error('Unknow config width value: ' + widthConfig); - } -} - -var SvgAxis = function SvgAxis(context) { - this._loadConfig(context.config); - this.svgContainer = new SvgContainer(this.config); -}; - -SvgAxis.prototype.changeConfigProperty = function changeConfigProperty (p, v) { - this.config[p] = v; - if (p === 'width' || p === 'height') { - this.config.needRescaling = true; +var Streamgraph = (function (_super) { + __extends(Streamgraph, _super); + function Streamgraph(data, userConfig) { + if (userConfig === void 0) { userConfig = {}; } + return _super.call(this, new SvgStrategyStreamgraph(), data, userConfig, defaults$4) || this; } -}; - -SvgAxis.prototype.rescale = function rescale (width, height) { - if ( width === void 0 ) width = this.config.width; - if ( height === void 0 ) height = this.config.height; - - this.axes.rescale(width, height); - this.config.needRescaling = false; -}; - -/** - * - * Load the configuration context. It creates a configuration global from the parameters specified by users. - * If any parameter is empty, this will be replaced by its default option - * - * @param {any} config User configuration - * @param {any} defaults Defaults values for this chart - * - * @memberOf SvgAxis - - */ -SvgAxis.prototype._loadConfig = function _loadConfig (config, defaults) { - this.config = {}; - //Selector - this.config.selector = config.selector || defaults.selector; - //Margins - this.config.marginTop = config.marginTop || defaults.marginTop; - this.config.marginLeft = config.marginLeft || defaults.marginLeft; - this.config.marginRight = config.marginRight || defaults.marginRight; - this.config.marginBottom = config.marginBottom || defaults.marginBottom; - //Width & height - this.config.width = config.width - ? calculateWidth(config.width, this.config.selector) - this.config.marginLeft - this.config.marginRight - : calculateWidth(defaults.width, this.config.selector) - this.config.marginLeft - this.config.marginRight; - this.config.height = config.height || defaults.height; - //Axis - this.config.xAxisType = config.xAxisType || defaults.xAxisType; - this.config.xAxisFormat = config.xAxisFormat || defaults.xAxisFormat; - this.config.xAxisLabel = config.xAxisLabel || defaults.xAxisLabel; - this.config.yAxisType = config.yAxisType || defaults.yAxisType; - this.config.yAxisFormat = config.yAxisFormat || defaults.yAxisFormat; - this.config.yAxisLabel = config.yAxisLabel || defaults.yAxisLabel; - //Color - this.config.colorScale = config.colorScale || defaults.colorScale; - //Events - this.config.onDown = config.onDown || defaults.onDown; - this.config.onUp = config.onUp || defaults.onUp; - this.config.onHover = config.onHover || defaults.onHover; - this.config.onClick = config.onClick || defaults.onClick; - this.config.onLeave = config.onLeave || defaults.onLeave; -}; - -var XAxis = function XAxis(xAxisType, config) { - if (config === null) { - throw new Error('No chart context specified for XAxis'); - } - - this.xAxis = this._initializeXAxis(xAxisType, config); -}; - - -XAxis.prototype.rescale = function rescale (width, height) { - this.xAxis.scale().range([0, width]); -}; - -XAxis.prototype._initializeXAxis = function _initializeXAxis (xAxisType, config) { - if ( xAxisType === void 0 ) xAxisType = 'linear'; - - var x = null, - axis = null; - - // switch (xAxisType) { - // case 'time': - // x = scaleTime().range([0, config.width]); - // break; - // case 'linear': - // x = scaleLinear().range([0, config.width]); - // break; - // case 'categorical': - // x = scaleBand().rangeRound([0, config.width]) - // .padding(0.1) - // .align(0.5); - // break; - // default: - // throw new Error('Not allowed type for XAxis. Only allowed "time","linear" or "categorical". Got: ' + xAxisType); - // } - - switch (xAxisType) { - case 'time': - x = d3$1.scaleTime().range([0, config.width]); - axis = d3$1.axisBottom(x); - break; - case 'linear': - x = d3$1.scaleLinear().range([0, config.width]); - axis = d3$1.axisBottom(x).tickFormat(d3$1.format(config.xAxisFormat)); - break; - case 'categorical': - x = d3$1.scaleBand().rangeRound([0, config.width]) - .padding(0.1) - .align(0.5); - axis = d3$1.axisBottom(x); - break; - default: - throw new Error('Not allowed type for XAxis. Only allowed "time","linear" or "categorical". Got: ' + xAxisType); - } - - return d3$1.axisBottom(x); -}; - -XAxis.prototype.transition = function transition (svg, time) { - if ( time === void 0 ) time = 200; - - svg.selectAll('.x.axis').transition().duration(time).call(this.xAxis).on('end', this.xStyle); -}; - -XAxis.prototype.xStyle = function xStyle () { - d3$1.select(this).selectAll('g.tick text') - .style('font', '1.4em Montserrat, sans-serif') - .style('fill', function (d, i) { return !isEven(i) || i === 0 ? '#5e6b70' : '#1a2127'; }) - .style('fill', function (d) { return '#1a2127'; }); - - - d3$1.select(this).selectAll(['path', 'line']) - .attr('stroke', 'gray') - .attr('stroke-width', .3); - -}; - -/** - * This function is used when both x and y dial update their domains by x and y max/min values, respectively. - */ -XAxis.prototype.updateDomainByBBox = function updateDomainByBBox (b) { - var x = this.xAxis.scale(); - x.domain([b[0], b[1]]); -}; - -/** - * Used when x domain is caterogial (a set of keys) and y domain is linear. - */ -XAxis.prototype.updateDomainByKeys = function updateDomainByKeys (keys$$1, yBbox) { - var x = this.xAxis.scale(); - x.domain(keys$$1); -}; - -XAxis.prototype.render = function render (svg, config) { - var xAxis = this.xAxis, - width = config.width, - height = config.height; - svg - .append('g') - .attr('class', 'x axis') - .attr('transform', 'translate(0,' + config.height + ')') - .call(xAxis); - - svg - .append('text') - .attr('class', 'xaxis-title') - .attr("text-anchor", "middle") - .attr('x', width / 2) - .attr('y', height + 40) - .text(config.xAxisLabel) - .style('font', '0.8em Montserrat, sans-serif'); - - this.svg = svg; -}; - -var YAxis = function YAxis(yAxisType, config) { - if (config === null) { - throw new Error('No chart context specified for XAxis'); - } - - this.yAxis = this._initializeYAxis(yAxisType, config); -}; - -YAxis.prototype.rescale = function rescale (width, height) { - this.yAxis.tickSizeInner(-width); -}; - -YAxis.prototype._initializeYAxis = function _initializeYAxis (yAxisType, config) { - if ( yAxisType === void 0 ) yAxisType = 'linear'; - - var y = null, - axis = null; - switch (yAxisType) { - case 'linear': - y = d3$1.scaleLinear().range([config.height, 0]); - axis = d3$1.axisLeft(y).tickFormat(d3$1.format(config.yAxisFormat)); - break; - case 'categorical': - y = d3$1.scaleBand().rangeRound([config.height, 0]) - .padding(0.1) - .align(0.5); - axis = d3$1.axisLeft(y); - break; - default: - throw new Error('Not allowed type for YAxis. Only allowed "time","linear" or "categorical". Got: ' + yAxisType); - } - - return axis.tickSizeInner(-config.width) - .tickSizeOuter(0) - .tickPadding(20); -}; - -// _initializeYAxis(yAxisType = 'linear', config) { -// let y = null, -// yAxis = null; -// -// switch (yAxisType) { -// case 'linear': -// y = scaleLinear().range([config.height, 0]); -// break; -// case 'categorical': -// y = scaleBand().rangeRound([config.height, 0]) -// .padding(0.1) -// .align(0.5); -// break; -// default: -// throw new Error('Not allowed type for YAxis. Only allowed "time","linear" or "categorical". Got: ' + yAxisType); -// } -// return axisLeft(y) -// .tickSizeInner(-config.width) -// .tickSizeOuter(0) -// .tickPadding(20) -// .tickFormat((d) => d) -// .ticks(config.yticks, config.tickLabel); -// } - -YAxis.prototype.transition = function transition (svg, time) { - if ( time === void 0 ) time = 200; - - svg.selectAll('.y.axis').transition().duration(time).call(this.yAxis).on('end', this.yStyle); -}; - -YAxis.prototype.yStyle = function yStyle () { - d3$1.select(this).selectAll('g.tick text') - .style('font', '1.4em Montserrat, sans-serif') - .style('fill', function (d, i) { return !isEven(i) || i === 0 ? '#5e6b70' : '#1a2127'; }); - d3$1.select(this).selectAll('g.tick line') - .style('stroke', function (d, i) { return isEven(i) && i !== 0 ? '#5e6b70' : '#dbdad8'; }); -}; - -YAxis.prototype.updateDomainByBBox = function updateDomainByBBox (b) { - var y = this.yAxis.scale(); - y.domain(b); -}; - -YAxis.prototype.updateDomainByKeys = function updateDomainByKeys (keys$$1) { - var y = this.yAxis.scale(); - y.domain(keys$$1); -}; - -YAxis.prototype.render = function render (svg, config) { - var yAxis = this.yAxis, - width = config.width, - height = config.height; - svg - .append('g') - .attr('class', 'y axis') - .attr('stroke-dasharray', '1, 5') - .call(yAxis); - - svg - .append('text') - .attr('class', 'yaxis-title') - .attr("transform", "rotate(-90)") - .attr("text-anchor", "middle") - .attr('x', 0 - height / 2) - .attr('y', 0 - 55) - .text(config.yAxisLabel) - .style('font', '0.8em Montserrat, sans-serif'); - -}; - -var XYAxes = function XYAxes(xAxisType, yAxisType, config) { - if (config === null) { - throw new Error('No chart context specified for XAxis'); - } - - this.x = new XAxis(xAxisType, config); - this.y = new YAxis(yAxisType, config); -}; - -XYAxes.prototype.transition = function transition (svg, time) { - if ( time === void 0 ) time = 200; - - this.x.transition(svg, time); - this.y.transition(svg, time); -}; - -/** - * This function is used when both x and y dial update their domains by x and y max/min values, respectively. - */ -XYAxes.prototype.updateDomainByBBox = function updateDomainByBBox (b) { - this.x.updateDomainByBBox([b[0], b[1]]); - this.y.updateDomainByBBox([b[2], b[3]]); -}; - -/** - * Used when x domain is caterogial (a set of keys) and y domain is linear. - */ -XYAxes.prototype.updateDomainByKeysAndBBox = function updateDomainByKeysAndBBox (keys, bbox) { - this.x.updateDomainByKeys(keys); - this.y.updateDomainByBBox(bbox); -}; - -XYAxes.prototype.updateDomainByBBoxAndKeys = function updateDomainByBBoxAndKeys (bbox, keys){ - this.x.updateDomainByBBox(bbox); - this.y.updateDomainByKeys(keys); -}; - -XYAxes.prototype.render = function render (svg, config) { - this.x.render(svg, config); - this.y.render(svg, config); -}; - -XYAxes.prototype.rescale = function rescale (width, height){ - this.x.rescale(width, height); - this.y.rescale(width, height); -}; - -var Lineset = function Lineset(x, y) { - var this$1 = this; - - this.xAxis = x.xAxis; - this.yAxis = y.yAxis; - this.lineGenerator = d3$1.line() - .x(function (d) { return this$1.xAxis.scale()(d.x); }) - .y(function (d) { return this$1.yAxis.scale()(d.y); }); -}; - -Lineset.prototype.update = function update (svg, config, data) { - var this$1 = this; - - var dataSeries = d3$1.nest().key(function (d) { return d.key; }).entries(data), - series = null, - lines = null, - colorScale = config.colorScale; - - svg.selectAll('g.serie').remove(); - - series = svg.selectAll('g.serie'); - lines = series - .data(dataSeries, function (d) { return d.key; }) - .enter() - .append('g') - .attr('class', 'serie') - .attr('stroke', function (d, i) { return colorScale(i); }) - .append('svg:path') - .style('stroke', function (d, i) { return colorScale(i); }) - .style('stroke-width', 1.3) - .style('fill', 'none') - .attr('d', function (d) { return this$1.lineGenerator(d.values); }) - .attr('class', 'line'); - - this.svg = svg; -}; - -Lineset.prototype.render = function render (svg, config) { - //Do nothing, since lines render only when new data is received. -}; - -var Legend = function Legend() {}; - -Legend.prototype.update = function update (svg, config, data) { - var dataSeries = d3$1.nest() - .key(function (d) { return d.key; }) - .entries(data), - legend = null, - entries = null, - colorScale = config.colorScale, - height = config.height, - width = config.width; - - if(dataSeries.length === 1 && dataSeries[0].key === 'undefined'){ - console.warn('Not showing legend, since there is a valid key'); - return; - } - - svg.selectAll('g.legend').remove(); - - legend = svg.append('g').attr('class', 'legend'); - entries = legend.selectAll('.legend-entry') - .data(dataSeries, function (d) { return d.key; }) - .enter() - .append('g') - .attr('class', 'legend-entry'); - - - entries.append('rect') - .attr('x', width + 10) - .attr('y', function (d, i) { return i * 25; }) - .attr('height', 20) - .attr('width', 20) - .attr('fill', function (d, i) { return colorScale(i); }) - .style('opacity', 0.8); - - entries.append('text') - .attr("x", width + 25 + 10) - .attr("y", function (d, i) { return i * 25 + 7; }) - .attr("dy", "0.55em") - .text(function (d) { return d.key; }) - .style('font', '14px Montserrat, sans-serif'); - -}; - -Legend.prototype.render = function render (svg, config) { - //Do nothing, since legend render only when new data is received. -}; - -var Areaset = function Areaset(x, y) { - this.xAxis = x.xAxis; - this.yAxis = y.yAxis; -}; - -Areaset.prototype.update = function update (svg, config, data) { - var this$1 = this; - - var dataSeries = d3$1.nest() - .key(function (d) { return d.key; }) - .entries(data); - - var series = null - , areas = null - , area$$1 = config.area - , colorScale = config.colorScale - , height = config.height - , areaOpacity = config.areaOpacity; - - var areaGenerator = d3.area() - .x(function (d) { return this$1.xAxis.scale()(d.x); }) - .y0(height) - .y1(function (d) { return this$1.yAxis.scale()(d.y); }); - - svg.selectAll('g.area').remove(); - - series = svg.selectAll('g.area'); - areas = series - .data(dataSeries, function (d) { return d.key; }) - .enter() - .append('g') - .attr('class', 'area') - .append('svg:path') - .style('fill', function (d, i) { return colorScale(i); }) - .style('fill-opacity', areaOpacity) - .attr('d', function (d) { return areaGenerator(d.values); }); - - // series - // .insert('path', ':first-child') //if not :first-child, area overlaps markers. - // .attr('class', 'area') - // .data(dataSeries) - // .style('stroke', (d, i) => colorScale(i)) - // .style('fill', (d, i) => colorScale(i)) - // .style('fill-opacity', areaOpacity) - // .attr('d', (d) => areaGenerator(d.values)); - - this.svg = svg; -}; - -Areaset.prototype.render = function render (svg, config) { - //Do nothing, since areas render only when new data is received. -}; - -var Pointset = function Pointset(x, y) { - this.xAxis = x.xAxis; - this.yAxis = y.yAxis; -}; -Pointset.prototype.update = function update (svg, config, data) { - var this$1 = this; - - var dataSeries = d3$1.nest() - .key(function (d) { return d.key; }) - .entries(data), - markers = null, - markerShape = config.markerShape, - markerSize = config.markerSize, - markerOutlineWidth = config.markerOutlineWidth, - colorScale = config.colorScale, - points = null, - series = null; - - svg.selectAll('g.points').remove(); - - series = svg.selectAll('g.points'); - - switch (markerShape) { - case 'dot': - points = series - .data(dataSeries, function (d) { return d.key; }) - .enter() - .append('g') - .attr('class', 'points') - .style('fill', function (d, i) { return colorScale(i); }) - .selectAll('circle') - .data(function (d) { return d.values; }) - .enter() - .append('circle') - .attr('cx', function (d) { return this$1.xAxis.scale()(d.x); }) - .attr('cy', function (d) { return this$1.yAxis.scale()(d.y); }) - .attr('r', markerSize) - .attr('class', 'marker'); - break; - case 'ring': - window.console.warn('Deprecated "circle" marker shape: use "dot" or "ring" instead'); - points = series - .data(dataSeries, function (d) { return d.key; }) - .enter() - .append('g') - .attr('class', 'points') - .style('stroke', function (d, i) { return colorScale(i); }) - .selectAll('circle') - .data(function (d, i) { return d.values; }) - .enter() - .append('circle') - .attr('cx', function (d) { return this$1.xAxis.scale()(d.x); }) - .attr('cy', function (d) { return this$1.yAxis.scale()(d.y); }) - .attr('r', markerSize) - .attr('class', 'marker') - .style('fill', 'white') - .style('stroke-width', markerOutlineWidth); - break; - // Deprecated circle option - case 'circle': - window.console.warn('Deprecated "circle" marker shape: use "dot" or "ring" instead'); - points = series - .data(dataSeries, function (d) { return d.key; }) - .enter() - .append('g') - .attr('class', 'points') - .style('stroke', function (d, i) { return colorScale(i); }) - .selectAll('circle') - .data(function (d, i) { return d.values; }) - .enter() - .append('circle') - .attr('cx', function (d) { return this$1.xAxis.scale()(d.x); }) - .attr('cy', function (d) { return this$1.yAxis.scale()(d.y); }) - .attr('r', markerSize) - .attr('class', 'lineMarker') - .style('fill', 'white') - .style('stroke-width', markerOutlineWidth); - break; - default: - points = series - .data(dataSeries, function (d) { return d.key; }) - .enter() - .append('g') - .attr('class', 'points') - .style('stroke', function (d, i) { return colorScale(i); }) - .selectAll('circle') - .data(function (d, i) { return d.values; }) - .enter() - .append('circle') - .attr('cx', function (d) { return this$1.xAxis.scale()(d.x); }) - .attr('cy', function (d) { return this$1.yAxis.scale()(d.y); }) - .attr('r', markerSize) - .attr('class', 'lineMarker') - .style('fill', 'white') - .style('stroke-width', markerOutlineWidth); - } - - markers = svg.selectAll('g.points circle'); - markers - .on('mousedown.user', config.onDown) - .on('mouseup.user', config.onUp) - .on('mouseleave.user', config.onLeave) - .on('mouseover.user', config.onHover) - .on('click.user', config.onClick); - - //this.interactiveElements = markers; -}; - -Pointset.prototype.render = function render (svg, config) { - //Do nothing, since points render only when new data is received. -}; - -function simple2stacked(data) { - return d3$1.nest().key(function (d) { return d.x; }).rollup(function (array) { - var r = {}; - for (var i = 0; i < array.length; i++) { - var object = array[i]; - if (object) { - r[object.key] = object.y; - } - } - return r; - }).entries(data); -} - -function simple2nested(data, key) { - if ( key === void 0 ) key = 'key'; - - return d3$1.nest().key(function (d) { return d[key]; }).entries(data); -} - - - -function simple2Linked(data) { - var linkedData = { links: [], nodes: [] }; - data.map(function (d) { return d.key === 'link' ? linkedData.links.push(d) : linkedData.nodes.push(d); }); - return linkedData; -} - - -function convertPropretiesToTimeFormat(data, properties, format$$1) { - data.forEach(function (d) { - properties.map(function (p) { - d[p] = d3$1.timeParse(format$$1)(d[p]); - }); - }); -} - -function convertByXYFormat(data, config) { - data.forEach(function (d) { - //parse x coordinate - switch (config.xAxisType) { - case 'time': - d.x = d3$1.timeParse(config.xAxisFormat)(d.x); - break; - case 'linear': - d.x = +d.x; - break; - } - //parse Y coordinate - switch (config.yAxisType) { - case 'time': - d.y = d3$1.timeParse(config.yAxisFormat)(d.y); - break; - case 'linear': - d.y = +d.y; - break; - } - }); - return data; -} - -function sortByField (array, field){ - array.sort(function (e1, e2) { - var a = e1[field]; - var b = e2[field]; - return (a < b) ? -1 : (a > b) ? 1 : 0; - }); -} - -var SvgLinechartStrategy = (function (SvgAxis$$1) { - function SvgLinechartStrategy(context) { - SvgAxis$$1.call(this, context); - - this.axes = new XYAxes(this.config.xAxisType, 'linear', this.config); - - this.lines = new Lineset(this.axes.x, this.axes.y); - this.legend = new Legend(); - - //Include components in the chart container - this.svgContainer - .add(this.axes) - .add(this.legend) - .add(this.lines); - - if (this._checkArea(this.config)) { - this.areas = new Areaset(this.axes.x, this.axes.y); - this.svgContainer.add(this.areas); - } - - if (this._checkMarkers(this.config)) { - this.points = new Pointset(this.axes.x, this.axes.y); - this.svgContainer.add(this.points); - } - } - - if ( SvgAxis$$1 ) SvgLinechartStrategy.__proto__ = SvgAxis$$1; - SvgLinechartStrategy.prototype = Object.create( SvgAxis$$1 && SvgAxis$$1.prototype ); - SvgLinechartStrategy.prototype.constructor = SvgLinechartStrategy; - - /** - * Renders a linechart based on data object - * @param {Object} data Data Object. Contains an array with x and y properties. - * - */ - SvgLinechartStrategy.prototype.draw = function draw (data) { - var svg = this.svgContainer.svg, - config = this.config, - needRescaling = this.config.needRescaling, - bbox = null; - - //Transform data, if needed - convertByXYFormat(data, config); - - //Sort data - sortByField(data, 'x'); - - //rescale, if needed. - if (needRescaling) { - this.rescale(); - } - - - bbox = this._getDomainBBox(data); - - this.axes.updateDomainByBBox(bbox); - - //Create a transition effect for dial rescaling - this.axes.transition(svg, 200); - - // Update legend - this.legend.update(svg, config, data); - - //Now update lines - this.lines.update(svg, config, data); - - if (config.areaOpacity > 0) { - // Update areas - this.areas.update(svg, config, data); - } - - if (this._checkMarkers(config)) { - // Update points - this.points.update(svg, config, data); - } - - }; - - SvgLinechartStrategy.prototype._getDomainBBox = function _getDomainBBox (data) { - var minX = d3$1.min(data, function (d) { return d.x; }), - maxX = d3$1.max(data, function (d) { return d.x; }), - minY = d3$1.min(data, function (d) { return d.y; }), - maxY = d3$1.max(data, function (d) { return d.y; }); - return [minX, maxX, minY, maxY]; - }; - - - SvgLinechartStrategy.prototype._checkMarkers = function _checkMarkers (config) { - return config.markerSize > 0; - }; - SvgLinechartStrategy.prototype._checkArea = function _checkArea (config) { - return config.areaOpacity > 0; - }; - - /** - * This method adds config options to the chart context. - * @param {Object} config Config object - */ - SvgLinechartStrategy.prototype._loadConfig = function _loadConfig (config) { - SvgAxis$$1.prototype._loadConfig.call(this, config, defaults); - //Markers - this.config.markerOutlineWidth = config.markerOutlineWidth || defaults.markerOutlineWidth; - this.config.markerShape = config.markerShape || defaults.markerShape; - this.config.markerSize = (typeof config.markerSize === 'undefined' || config.markerSize < 0) ? defaults.markerSize : config.markerSize; - //Area - this.config.areaOpacity = (typeof config.areaOpacity === 'undefined' || config.markerSize < 0) ? defaults.areaOpacity : config.areaOpacity; - return this; - }; - - return SvgLinechartStrategy; -}(SvgAxis)); - -var defaults$1 = { - selector: '#chart', - colorScale: category5(), - //Stacked - stacked: true, - //Axes - xAxisType: 'linear', - xAxisFormat: '', - xAxisLabel: null, - yAxisType: 'linear', - yAxisFormat: '', - yAxisLabel: null, - //margins - marginTop: 20, - marginRight: 250, - marginBottom: 130, - marginLeft: 150, - //width & height - width: '100%', - height: 350, - //Events - onDown: function onDown(d) { - }, - onHover: function onHover(d) { - }, - onLeave: function onLeave(d) { - }, - onClick: function onClick(d) { - } -}; - -var Barset = function Barset(xAxis, yAxis) { - this.xAxis = xAxis; - this.yAxis = yAxis; - this.lineGenerator = d3$1.line() - .x(function (d) { return xAxis.scale()(d.x); }) - .y(function (d) { return yAxis.scale()(d.y); }); -}; - - -Barset.prototype.update = function update (svg, config, data, method) { - var bars = null; - - if (method === 'stacked') { - this._updateStacked(svg, config, data); - } else { - this._updateGrouped(svg, config, data); - } - bars = svg.selectAll('g.serie rect'); - bars - .on('mousedown.user', config.onDown) - .on('mouseup.user', config.onUp) - .on('mouseleave.user', config.onLeave) - .on('mouseover.user', config.onHover) - .on('click.user', config.onClick); - - /** - TODO: Add default events? - bars - .on('mousedown.default', config.onDown) - .on('mouseup.default', config.onUp) - .on('mouseleave.default', function (){ select(this).transition().duration(150).attr('fill-opacity', 1)}) - .on('mouseover.default',function (){ select(this).transition().duration(150).attr('fill-opacity', 0.9)}) - .on('click.default', config.onClick); - **/ - - this.interactiveElements = bars; -}; - -Barset.prototype._updateStacked = function _updateStacked (svg, config, dataSeries) { - this._cleanCurrentSeries(svg); - - var colorScale = config.colorScale, - layer = svg.selectAll('.serie').data(dataSeries), - layerEnter = layer.enter().append('g'), - layerMerge = null, - bar = null, - barEnter = null, - barMerge = null, - x = this.xAxis.scale(), - y = this.yAxis.scale(); - - layerMerge = layer.merge(layerEnter) - .attr('class', 'serie') - .attr('fill', function (d, i) { return colorScale(i); }); - - bar = layerMerge.selectAll('rect') - .data(function (d) { return d; }); - - barEnter = bar.enter().append('rect'); - - barMerge = bar.merge(barEnter) - .attr("x", function (d) { return x(d.data.key); }) - .attr("y", function (d) { return y(d[1]); }) - .attr("height", function (d) { return y(d[0]) - y(d[1]); }) - .attr("width", x.bandwidth()); -}; - - -Barset.prototype._updateGrouped = function _updateGrouped (svg, config, data) { - this._cleanCurrentSeries(svg); - - var keys = d3$1.map(data, function (d) { return d.key; }).keys(), - colorScale = config.colorScale, - layer = svg.selectAll('.serie').data(data), - layerEnter = null, - layerMerge = null, - bar = null, - barEnter = null, - barMerge = null, - x = this.xAxis.scale(), - y = this.yAxis.scale(), - xGroup = d3$1.scaleBand().domain(keys).range([0, x.bandwidth()]), - height = config.height; - - data = simple2nested(data, 'x'); - - layer = svg.selectAll('.serie').data(data); - - layerEnter = layer.enter().append('g') - .attr('transform', function (d) { return 'translate(' + x(d.key) + ')'; }); - - layerMerge = layer.merge(layerEnter) - .attr('class', 'serie') - .attr('transform', function (d) { return 'translate(' + x(d.key) + ')'; }); - - bar = layerMerge.selectAll('rect') - .data(function (d) { return d.values; }); - - barEnter = bar.enter().append('rect'); - - barMerge = bar.merge(barEnter) - .attr('width', xGroup.bandwidth()) - .attr("x", function (d) { return xGroup(d.key); }) - .attr('fill', function (d, i) { return colorScale(i); }) - .attr("y", function (d) { return y(d.y); }) - .attr("height", function (d) { return height - y(d.y); }); - -}; - -Barset.prototype._getKeysFromData = function _getKeysFromData (data) { - var keys = []; - for (var p in data[0]) { - if (p !== 'total' && p !== 'key') { - keys.push(p); - } - } - return keys; - -}; - -Barset.prototype._cleanCurrentSeries = function _cleanCurrentSeries (svg) { - svg.selectAll('.serie').remove(); -}; - -Barset.prototype.render = function render (svg, config) { - //Do nothing, since bars render only when new data is received. -}; - -var SvgBarchartStrategy = (function (SvgAxis$$1) { - function SvgBarchartStrategy(context) { - SvgAxis$$1.call(this, context); - - this.axes = new XYAxes('categorical', 'linear', this.config); - this.bars = new Barset(this.axes.x.xAxis, this.axes.y.yAxis); - - this.legend = new Legend(); - - this.svgContainer - .add(this.axes) - .add(this.bars) - .add(this.legend); - - } - - if ( SvgAxis$$1 ) SvgBarchartStrategy.__proto__ = SvgAxis$$1; - SvgBarchartStrategy.prototype = Object.create( SvgAxis$$1 && SvgAxis$$1.prototype ); - SvgBarchartStrategy.prototype.constructor = SvgBarchartStrategy; - - - /** - * Renders a barchart based on data object - * @param {Object} data Data Object. Contains an array with x and y properties. - * - */ - SvgBarchartStrategy.prototype.draw = function draw (data) { - if ( data === void 0 ) data = this.data; - - var svg = this.svgContainer.svg, - config = this.config, - keys = d3$1.map(data, function (d) { return d.key; }).keys(), - data4stack = simple2stacked(data), - data4render = null, - isStacked = this.config.stacked, - stack$$1 = d3$1.stack().keys(keys) - .value(function (d, k) { return d.value[k]; }) - .order(d3$1.stackOrderNone), - yMin = 0, - yMax = 0, - method = isStacked ? 'stacked' : 'grouped', - dataSeries = stack$$1(data4stack), - needRescaling = this.config.needRescaling; - - //rescale, if needed. - if (needRescaling) { - this.rescale(); - } - - - yMax = isStacked ? - d3$1.max(dataSeries, function (serie) { return d3$1.max(serie, function (d) { return d[1]; }); }) : - d3$1.max(data, function (d) { return d.y; }); - - this.axes.updateDomainByKeysAndBBox(d3$1.map(data, function (d) { return d.x; }).keys(), [yMin, yMax]); - this.axes.transition(svg, 200); - - data4render = isStacked ? dataSeries : data; - - this.bars.update(svg, config, data4render, method); - - this.legend.update(svg, config, data); - - this.data = data; // TODO: ? - - }; - - - SvgBarchartStrategy.prototype.transition2Stacked = function transition2Stacked () { - this.config.stacked = true; - }; - - SvgBarchartStrategy.prototype.transition2Grouped = function transition2Grouped () { - this.config.stacked = false; - }; - - /** - * This method adds config options to the chart context. - * @param {Object} config Config object - */ - SvgBarchartStrategy.prototype._loadConfig = function _loadConfig (config) { - SvgAxis$$1.prototype._loadConfig.call(this, config, defaults$1); - //Stacked - this.config.stacked = typeof (config.stacked) === 'undefined' ? defaults$1.stacked : config.stacked; return this; - }; - - return SvgBarchartStrategy; -}(SvgAxis)); - -var defaults$2 = { - selector: '#chart', - colorScale: category4(), - //Axes - xAxisType: 'time', - xAxisFormat: '%y/%m/%d', - xAxisLabel: null, - yAxisType: 'categorical', - yAxisFormat: '', - yAxisLabel: null, - //margins - marginTop: 20, - marginRight: 250, - marginBottom: 130, - marginLeft: 150, - //Width & height - width: '100%', // %, auto, or numeric - height: 250, - //Events - onDown: function onDown(d) { - }, - onHover: function onHover(d) { - }, - onLeave: function onLeave(d) { - }, - onClick: function onClick(d) { - }, - - maxNumberOfElements: 100, // used by keepDrawing method to reduce the number of elements in the current chart -}; - -var Streamset = function Streamset(xAxis, yAxis) { - var this$1 = this; - - this.xAxis = xAxis; - this.yAxis = yAxis; - - this.areaGenerator = d3$1.area() - .curve(d3$1.curveCardinal) - .x(function (d) { return this$1.xAxis.scale()((d3$1.timeParse(this$1.xDataFormat)(d.data.key))); }) // TODO: It seems d3.nest() transform Date object in - .y0(function (d) { return this$1.yAxis.scale()(d[0]); }) - .y1(function (d) { return this$1.yAxis.scale()(d[1]); }); -}; - - -Streamset.prototype.update = function update (svg, config, data) { - var series = null; - - //Update date format, used by areaGenerator function due to a problem when nesting with d3. - this.xDataFormat = config.xAxisFormat; - - svg.selectAll('.serie').remove(); - - series = svg.selectAll('.serie') - .data(data) - .enter() - .append('g') - .attr('class', 'serie') - .style('stroke', function (d, i) { return config.colorScale(i); }); - - series - .append('path') - .attr('class', 'layer') - .attr('d', this.areaGenerator) - .style('fill', function (d, i) { return config.colorScale(i); }); - - - series.exit().remove(); - - series - .attr('opacity', 1) - .on('mousedown.user', config.onDown) - .on('mouseup.user', config.onUp) - .on('mouseleave.user', config.onLeave) - .on('mouseover.user', config.onHover) - .on('click.user', config.onClick); -}; - -Streamset.prototype.render = function render (svg, config) { - //Do nothing, since lines render only when new data is received. -}; - -var SvgStreamgraphStrategy = (function (SvgAxis$$1) { - function SvgStreamgraphStrategy(context) { - SvgAxis$$1.call(this, context); - - this.x = new XAxis('time', this.config); - this.y = new YAxis('linear', this.config); - - this.streams = new Streamset(this.x.xAxis, this.y.yAxis); - - this.legend = new Legend(); - - //Include components in the chart container - this.svgContainer - .add(this.x) - .add(this.y, false) //No render y Axis - .add(this.legend) - .add(this.streams); - } - - if ( SvgAxis$$1 ) SvgStreamgraphStrategy.__proto__ = SvgAxis$$1; - SvgStreamgraphStrategy.prototype = Object.create( SvgAxis$$1 && SvgAxis$$1.prototype ); - SvgStreamgraphStrategy.prototype.constructor = SvgStreamgraphStrategy; - SvgStreamgraphStrategy.prototype.draw = function draw (data) { - var svg = this.svgContainer.svg, - config = this.config, - bbox = null, - keys = d3$1.map(data, function (d) { return d.key; }).keys(), - xDataFormat = this.config.xAxisFormat, - data4stack = simple2stacked(data), - stack$$1 = d3$1.stack() - .keys(keys) - .value(function (d, k) { return d.value[k]; }) - .order(d3$1.stackOrderInsideOut) - .offset(d3$1.stackOffsetWiggle), - dataSeries = stack$$1(data4stack), - needRescaling = this.config.needRescaling; - - convertPropretiesToTimeFormat(data, ['x'], xDataFormat); - - //Sort data - sortByField(data, 'x'); - - //rescale, if needed. - if (needRescaling) { - this.rescale(); + Streamgraph.prototype.keepDrawing = function (datum) { + var datumType = datum.constructor; + if (datumType === Array) { + this.data = this.data.concat(datum); } - - bbox = this._getDomainBBox(data, dataSeries); - - this.x.updateDomainByBBox([bbox[0], bbox[1]]); - this.y.updateDomainByBBox([bbox[2], bbox[3]]); - this.x.transition(svg, 200); - this.y.transition(svg, 200); - - // Update legend - this.legend.update(svg, config, data); - - // Update streams - this.streams.update(svg, config, dataSeries); - }; - - SvgStreamgraphStrategy.prototype._getDomainBBox = function _getDomainBBox (data, dataSeries) { - var minX = d3$1.min(data, function (d) { return new Date(d.x); }), - maxX = d3$1.max(data, function (d) { return new Date(d.x); }), - minY = d3$1.min(dataSeries, function (serie) { return d3$1.min(serie, function (d) { return d[0]; }); }), - maxY = d3$1.max(dataSeries, function (serie) { return d3$1.max(serie, function (d) { return d[1]; }); }); - - return [minX, maxX, minY, maxY]; - }; - - /** - * This method adds config options to the chart context. - * @param {Object} config Config object - */ - SvgStreamgraphStrategy.prototype._loadConfig = function _loadConfig (config) { - SvgAxis$$1.prototype._loadConfig.call(this, config,defaults$2); - return this; + else { + this.data.push(datum); + } + this.draw(copy(this.data)); }; + return Streamgraph; +}(Chart)); - return SvgStreamgraphStrategy; -}(SvgAxis)); - -var defaults$3 = { +var defaults$5 = { selector: '#chart', colorScale: category2(), - //Axes xAxisType: 'time', xAxisFormat: '%y/%m/%d', - xAxisLabel: null, - yAxisType: 'categorical', + xAxisLabel: '', + xAxisGrid: true, + yAxisType: 'linear', yAxisFormat: '', - yAxisLabel: null, - //margins + yAxisLabel: '', + yAxisShow: true, + yAxisGrid: true, marginTop: 20, marginRight: 250, marginBottom: 130, marginLeft: 150, - //Width & height - width: '100%', // %, auto, or numeric + width: '100%', height: 250, - //Events - onDown: function onDown(d) { - }, - onHover: function onHover(d) { - }, - onLeave: function onLeave(d) { + legend: true, + propertyX: 'x', + propertyY: 'y', + propertyKey: 'key', + stacked: true, + stack: d3.stack().value(function (d, k) { return d.value[k]; }).order(d3.stackOrderInsideOut).offset(d3.stackOffsetNone), + onDown: function (d) { }, - onClick: function onClick(d) { + onHover: function (d) { }, - maxNumberOfElements: 100, // used by keepDrawing method to reduce the number of elements in the current chart -}; - -var SvgStackedAreaStrategy = (function (SvgAxis$$1) { - function SvgStackedAreaStrategy(context) { - SvgAxis$$1.call(this, context); - - this.axes = new XYAxes('time', 'linear', this.config); - - this.streams = new Streamset(this.axes.x.xAxis, this.axes.y.yAxis); - - this.legend = new Legend(); - - //Include components in the chart container - this.svgContainer - .add(this.axes) - .add(this.legend) - .add(this.streams); - } - - if ( SvgAxis$$1 ) SvgStackedAreaStrategy.__proto__ = SvgAxis$$1; - SvgStackedAreaStrategy.prototype = Object.create( SvgAxis$$1 && SvgAxis$$1.prototype ); - SvgStackedAreaStrategy.prototype.constructor = SvgStackedAreaStrategy; - - - SvgStackedAreaStrategy.prototype.draw = function draw (data) { - var svg = this.svgContainer.svg, - config = this.config, - bbox = null, - keys = d3$1.map(data, function (d) { return d.key; }).keys(), - data4stack = simple2stacked(data), - xDataFormat = this.config.xAxisFormat, - stack$$1 = d3$1.stack() - .keys(keys) - .value(function (d, k) { return d.value[k]; }) - .order(d3$1.stackOrderInsideOut) - .offset(d3$1.stackOffNone), - dataSeries = stack$$1(data4stack), - needRescaling = this.config.needRescaling; - - //rescale, if needed. - if (needRescaling) { - this.rescale(); - } - - convertPropretiesToTimeFormat(data, ['x'], xDataFormat); - - //Sort data - sortByField(data, 'x'); - - bbox = this._getDomainBBox(data, dataSeries); - - this.axes.updateDomainByBBox(bbox); - this.axes.transition(svg, 200); - - // Update legend - this.legend.update(svg, config, data); + onLeave: function (d) { + }, + onClick: function (d) { + }, + onUp: function (d) { + }, + maxNumberOfElements: 100, +}; - // Update streams - this.streams.update(svg, config, dataSeries); +var StackedArea = (function (_super) { + __extends(StackedArea, _super); + function StackedArea(data, userConfig) { + if (userConfig === void 0) { userConfig = {}; } + return _super.call(this, new SvgStrategyStreamgraph(), data, userConfig, defaults$5) || this; + } + StackedArea.prototype.keepDrawing = function (datum) { + var datumType = datum.constructor; + if (datumType === Array) { + this.data = this.data.concat(datum); + } + else { + this.data.push(datum); + } + this.draw(copy(this.data)); }; + return StackedArea; +}(Chart)); - - SvgStackedAreaStrategy.prototype._getDomainBBox = function _getDomainBBox (data, dataSeries) { - var minX = d3$1.min(data, function (d) { return (d.x); }), - maxX = d3$1.max(data, function (d) { return (d.x); }), - minY = d3$1.min(dataSeries, function (serie) { return d3$1.min(serie, function (d) { return d[0]; }); }), - maxY = d3$1.max(dataSeries, function (serie) { return d3$1.max(serie, function (d) { return d[1]; }); }); - - return [minX, maxX, minY, maxY]; +var Timeboxset = (function (_super) { + __extends(Timeboxset, _super); + function Timeboxset(xyAxes) { + var _this = _super.call(this) || this; + _this.xyAxes = xyAxes; + return _this; + } + Timeboxset.prototype.render = function () { }; - - /** - * This method adds config options to the chart context. - * @param {Object} config Config object - */ - SvgStackedAreaStrategy.prototype._loadConfig = function _loadConfig (config) { - SvgAxis$$1.prototype._loadConfig.call(this, config,defaults$3); + Timeboxset.prototype.update = function (data) { + var propertyKey = this.config.get('propertyKey'); + var propertyStart = this.config.get('propertyStart'); + var propertyEnd = this.config.get('propertyEnd'); + var colorScale = this.config.get('colorScale'), height = this.config.get('height'), onDown = this.config.get('onDown'), onUp = this.config.get('onUp'), onLeave = this.config.get('onLeave'), onHover = this.config.get('onHover'), onClick = this.config.get('onClick'), keys = d3.map(data, function (d) { return d[propertyKey]; }).keys(), layer = this.svg.selectAll('.serie').data(data), layerEnter = null, layerMerge = null, box = null, boxEnter = null, boxMerge = null, extLanes = null, yLanes = null, yLanesBand = d3.scaleBand().range([0, keys.length + 1]).domain(keys), x = this.xyAxes.x.xAxis.scale(), y = this.xyAxes.y.yAxis.scale(); + data = simple2nested(data); + extLanes = d3.extent(data, function (d, i) { return i; }); + yLanes = d3.scaleLinear().domain([extLanes[0], extLanes[1] + 1]).range([0, height]); + layer = this.svg.selectAll('.serie').data(data); + layerEnter = layer.enter().append('g'); + layerMerge = layer.merge(layerEnter) + .attr('class', 'serie') + .attr(Globals.COMPONENT_DATA_KEY_ATTRIBUTE, function (d) { return d[propertyKey]; }); + box = layerMerge.selectAll('rect') + .data(function (d) { return d.values; }); + boxEnter = box.enter().append('rect'); + boxMerge = box.merge(boxEnter) + .attr('width', function (d) { return x(d[propertyEnd]) - x(d[propertyStart]); }) + .attr('x', function (d) { return x(d[propertyStart]); }) + .attr('y', function (d) { return y(d[propertyKey]); }) + .attr('height', function () { return 0.8 * yLanes(1); }) + .style('fill', function (d) { return colorScale(d[propertyKey]); }); + box = this.svg.selectAll('g.serie rect'); + box + .on('mousedown.user', onDown) + .on('mouseup.user', onUp) + .on('mouseleave.user', onLeave) + .on('mouseover.user', onHover) + .on('click.user', onClick); }; + return Timeboxset; +}(Component)); + +var SvgStrategySwimlane = (function (_super) { + __extends(SvgStrategySwimlane, _super); + function SvgStrategySwimlane() { + var _this = _super.call(this) || this; + _this.axes = new XYAxis(); + _this.boxes = new Timeboxset(_this.axes); + return _this; + } + SvgStrategySwimlane.prototype.draw = function (data) { + var xAxisFormat = this.config.get('xAxisFormat'); + convertPropretiesToTimeFormat(data, ['start', 'end'], xAxisFormat); + sortByField(data, 'start'); + this.container.updateComponents(data); + }; + SvgStrategySwimlane.prototype.initialize = function () { + _super.prototype.initialize.call(this); + var markerSize = this.config.get('markerSize'), areaOpacity = this.config.get('areaOpacity'), legend = this.config.get('legend'); + this.container.add(this.axes); + if (legend) { + this.legend = new Legend(); + this.container.add(this.legend).add(this.boxes); + } + }; + return SvgStrategySwimlane; +}(SvgChart)); - return SvgStackedAreaStrategy; -}(SvgAxis)); - -var defaults$4 = { +var defaults$6 = { selector: '#chart', colorScale: category3(), - //Axes xAxisType: 'time', xAxisFormat: '%y/%m/%d', - xAxisLabel: null, + xAxisLabel: '', + xAxisGrid: true, yAxisType: 'categorical', - yAxisFormat: '%s', - yAxisLabel: null, - //margins + yAxisFormat: 's', + yAxisLabel: '', + yAxisShow: true, + yAxisGrid: true, marginTop: 20, marginRight: 250, marginBottom: 30, marginLeft: 50, - //Width & height - width: '100%', // %, auto, or numeric + width: '100%', height: 250, - //Events - onDown: function onDown(d) { + legend: true, + propertyStart: 'start', + propertyEnd: 'end', + propertyKey: 'key', + onDown: function (d) { + }, + onHover: function (d) { }, - onHover: function onHover(d) { + onLeave: function (d) { }, - onLeave: function onLeave(d) { + onClick: function (d) { }, - onClick: function onClick(d) { + onUp: function (d) { } }; -var TimeBoxset = function TimeBoxset(xAxis, yAxis) { - this.xAxis = xAxis; - this.yAxis = yAxis; - -}; -TimeBoxset.prototype.update = function update (svg, config, data) { - var colorScale = config.colorScale, - keys = d3$1.map(data, function (d) { return d.key; }).keys(), - layer = svg.selectAll('.serie').data(data), - layerEnter = null, - layerMerge = null, - box = null, - boxEnter = null, - boxMerge = null, - extLanes = null, - yLanes = null, - yLanesBand = d3$1.scaleBand().range([0, keys.length + 1]).domain(keys), - x = this.xAxis.scale(), - y = this.yAxis.scale(); - - data = simple2nested(data); - extLanes = d3$1.extent(data, function (d, i) { return i; }); - yLanes = d3$1.scaleLinear().domain([extLanes[0], extLanes[1] + 1]).range([0, config.height]); - - layer = svg.selectAll('.serie').data(data); - layerEnter = layer.enter().append('g'); - - layerMerge = layer.merge(layerEnter) - .attr('class', 'serie'); - - - box = layerMerge.selectAll('rect') - .data(function (d) { return d.values; }); - - boxEnter = box.enter().append('rect'); +var Swimlane = (function (_super) { + __extends(Swimlane, _super); + function Swimlane(data, userConfig) { + if (userConfig === void 0) { userConfig = {}; } + return _super.call(this, new SvgStrategySwimlane(), data, userConfig, defaults$6) || this; + } + Swimlane.prototype.keepDrawing = function (datum) { + var datumType = datum.constructor; + if (datumType === Array) { + this.data = this.data.concat(datum); + } + else { + this.data.push(datum); + } + this.draw(copy(this.data)); + }; + return Swimlane; +}(Chart)); - boxMerge = box.merge(boxEnter) - .attr('width', function (d) { return x(d.end) - x(d.start); }) - .attr('x', function (d) { return x(d.start); }) - .attr('y', function (d) { return y(d.key); }) - .attr('fill', function (d) { return colorScale(parseInt(yLanesBand(d.key))); }) - .attr('height', function () { return 0.8 * yLanes(1); }); +var XRadialAxis = (function (_super) { + __extends(XRadialAxis, _super); + function XRadialAxis() { + return _super.call(this) || this; + } + XRadialAxis.prototype.update = function (data) { }; + XRadialAxis.prototype.render = function () { + this._xRadialAxis = d3.scaleLinear().range([0, 2 * Math.PI]); + }; + Object.defineProperty(XRadialAxis.prototype, "xRadialAxis", { + get: function () { + return this._xRadialAxis; + }, + enumerable: true, + configurable: true + }); + return XRadialAxis; +}(Component)); - box = svg.selectAll('g.serie rect'); +var YRadialAxis = (function (_super) { + __extends(YRadialAxis, _super); + function YRadialAxis() { + return _super.call(this) || this; + } + YRadialAxis.prototype.render = function () { + var width = this.config.get('width'), height = this.config.get('height'), radius = null; + radius = (Math.min(width, height) / 2) - 10; + this._yRadialAxis = d3.scaleSqrt().range([0, radius]); + }; - box - .on('mousedown.user', config.onDown) - .on('mouseup.user', config.onUp) - .on('mouseleave.user', config.onLeave) - .on('mouseover.user', config.onHover) - .on('click.user', config.onClick); - -}; - -TimeBoxset.prototype.render = function render (svg, config) { - //Do nothing, since lines render only when new data is received. -}; - -var SvgSwimlaneStrategy = (function (SvgAxis$$1) { - function SvgSwimlaneStrategy(context) { - SvgAxis$$1.call(this, context); - this.axes = new XYAxes('time', 'categorical', this.config); - this.boxs = new TimeBoxset(this.axes.x.xAxis, this.axes.y.yAxis); - this.legend = new Legend(); - - this.svgContainer - .add(this.axes) - .add(this.boxs) - .add(this.legend); - } - - if ( SvgAxis$$1 ) SvgSwimlaneStrategy.__proto__ = SvgAxis$$1; - SvgSwimlaneStrategy.prototype = Object.create( SvgAxis$$1 && SvgAxis$$1.prototype ); - SvgSwimlaneStrategy.prototype.constructor = SvgSwimlaneStrategy; - - SvgSwimlaneStrategy.prototype.draw = function draw (data) { - var svg = this.svgContainer.svg, - config = this.config, - dataFormat = this.config.xAxisFormat, - keys = d3$1.map(data, function (d) { return d.key; }).keys(), - bbox = null, - needRescaling = this.config.needRescaling; - - convertPropretiesToTimeFormat(data, ['start', 'end'], dataFormat); + YRadialAxis.prototype.update = function (data) { }; - //rescale, if needed. - if (needRescaling) { - this.rescale(); + Object.defineProperty(YRadialAxis.prototype, "yRadialAxis", { + get: function () { + return this._yRadialAxis; + }, + enumerable: true, + configurable: true + }); + return YRadialAxis; +}(Component)); + +var RadialAxes = (function (_super) { + __extends(RadialAxes, _super); + function RadialAxes() { + var _this = _super.call(this) || this; + _this._x = new XRadialAxis(); + _this._y = new YRadialAxis(); + return _this; } - - bbox = this._getBBox(data); - - this.axes.updateDomainByBBoxAndKeys(bbox, keys); - this.axes.transition(svg, 200); - - this.boxs.update(svg, config, data); - this.legend.update(svg, config, data); - - }; - - SvgSwimlaneStrategy.prototype._getBBox = function _getBBox (data) { - return [ - d3$1.min(data, function (d) { return (d.start); }), - d3$1.max(data, function (d) { return (d.end); }) - ]; - }; - - - SvgSwimlaneStrategy.prototype._loadConfig = function _loadConfig (config) { - SvgAxis$$1.prototype._loadConfig.call(this, config, defaults$4); - return this; - }; - - return SvgSwimlaneStrategy; -}(SvgAxis)); - -var defaults$5 = { - selector: '#chart', - colorScale: diverging_spectral2(), - invertColorScale: true, - minLevel: 0, - maxLevel: 100, - minAngle: -90, - maxAngle: 90, - ringWidth: 50, - ringMargin: 20, - labelInset: 10, - needleNutRadius: 25, - needleLenghtRatio: 0.8, - numericIndicator: true, - label: 'km/h', - //margins - marginTop: 20, - marginRight: 250, - marginBottom: 30, - marginLeft: 50, - //Width & height - width: '50%', // %, auto, or numeric - height: 250, - ticks: 10, // ticks for y dial. -}; - -var Dial = function Dial(axisType, config) { - var this$1 = this; - - if (config === null) { - throw new Error('No chart context specified for polarAxis'); - } - - this.r = ( - (config.width > config.height) ? - config.height : config.width - ) / 2; - this.translation = (function () { return 'translate(' + this$1.r + ',' + this$1.r + ')'; } - ); - config.colorScale.domain([0, 1]); - - this.scale = d3$1.scaleLinear() - .domain([config.minLevel, config.maxLevel]) - .range([0, 1]); - - this.scaleMarks = this.scale.ticks(config.ticks); - - this.range = config.maxAngle - config.minAngle; - - this.arc = d3$1.arc() - .innerRadius(this.r - config.ringWidth - config.ringMargin) - .outerRadius(this.r - config.ringMargin) - .startAngle(function (d, i) { - var ratio = d * i; - return deg2rad(config.minAngle + (ratio * this$1.range)); - }) - .endAngle(function (d, i) { - var ratio = d * (i + 1); - return deg2rad(config.minAngle + (ratio * this$1.range)); + RadialAxes.prototype.configure = function (config, svg) { + _super.prototype.configure.call(this, config, svg); + this._x.configure(config, svg); + this._y.configure(config, svg); + }; + RadialAxes.prototype.render = function () { + this._x.render(); + this._y.render(); + }; + RadialAxes.prototype.update = function (data) { + this._x.update(data); + this._y.update(data); + }; + Object.defineProperty(RadialAxes.prototype, "x", { + get: function () { + return this._x; + }, + enumerable: true, + configurable: true }); - - this.tickData = d3$1.range(config.ticks) - .map(function () { return 1 / config.ticks; }); -}; - -Dial.prototype.render = function render (svg, config) { - var this$1 = this; - - var labels = null; - - // Append the ring - var arcs = svg.append('g') - .attr('class', 'arc') - .attr('transform', this.translation); - - // Append the ring sectors - var arcPaths = arcs.selectAll('path') - .data(this.tickData) - .enter().append('path') - // ID for textPath linking - .attr('id', function (d, i) { return 'sector-' + i; }) - .attr('d', this.arc); - - // Fill colors - if (config.invertColorScale) { - arcPaths.attr('fill', function (d, i) { return config.colorScale(1 - d * i); }); - } else { - arcPaths.attr('fill', function (d, i) { return config.colorScale(d * i); }); - } - - // Apend the scale labels - labels = svg.append('g') - .attr('class', 'labels') - .attr('transform', this.translation); - - // // Append scale marker labels - labels.selectAll('text') - .data(this.scaleMarks) - .enter().append('text') - .attr('transform', function (d) { - var ratio = this$1.scale(d); - var newAngle = config.minAngle + (ratio * this$1.range); - return 'rotate(' + newAngle + ') translate(0,' + (config.labelInset - this$1.r) + ')'; - }) - .text(function (d) { return d; }) - .style('text-anchor', 'middle') - .style('font', '18px Montserrat, sans-serif'); -}; - -var DialNeedle = function DialNeedle(axisType, config) { - var this$1 = this; - - if (config === null) { - throw new Error('No chart context specified for polarAxis'); - } - - this.r = ( - (config.width > config.height) ? - config.height : config.width - ) / 2; - - this.needleLen = config.needleLenghtRatio * (this.r); - - this.translation = (function () { return 'translate(' + this$1.r + ',' + this$1.r + ')'; } - ); - config.colorScale.domain([0, 1]); - - this.scale = d3$1.scaleLinear() - .domain([config.minLevel, config.maxLevel]) - .range([0, 1]); - - this.angleScale = d3$1.scaleLinear() - .domain([config.minLevel, config.maxLevel]) - .range([90 + config.minAngle, 90 + config.maxAngle]); - - this.scaleMarks = this.scale.ticks(config.ticks); - - this.range = config.maxAngle - config.minAngle; - - this.arc = d3$1.arc() - .innerRadius(this.r - config.ringWidth - config.ringMargin) - .outerRadius(this.r - config.ringMargin) - .startAngle(function (d, i) { - var ratio = d * i; - return deg2rad(config.minAngle + (ratio * this$1.range)); - }) - .endAngle(function (d, i) { - var ratio = d * (i + 1); - return deg2rad(config.minAngle + (ratio * this$1.range)); + Object.defineProperty(RadialAxes.prototype, "y", { + get: function () { + return this._y; + }, + enumerable: true, + configurable: true }); - - this.tickData = d3$1.range(config.ticks) - .map(function () { return 1 / config.ticks; }); -}; - -DialNeedle.prototype.update = function update (svg, config, data, method) { - var this$1 = this; - - var datum = data[data.length - 1]; - - this.needle - .transition() - .attr('transform', function (d) { return ("translate(" + (this$1.r) + ", " + (this$1.r) + ") rotate(" + (this$1.angleScale(datum.value) - 90) + ")"); }) - .attr('d', ("M " + (0 - config.needleNutRadius) + " " + (0) + " L " + (0) + " " + (0 - this.needleLen) + " L " + (config.needleNutRadius) + " " + (0))); -}; - -DialNeedle.prototype.render = function render (svg, config) { - var this$1 = this; - - // Update the needle - this.needle = svg.append('path') - .attr('class', 'needle') - .datum(0) - .attr('transform', function (d) { return ("translate(" + (this$1.r) + ", " + (this$1.r) + ") rotate(" + (this$1.angleScale(d) - 90) + ")"); }) - .attr('d', ("M " + (0 - config.needleNutRadius) + " " + (0) + " L " + (0) + " " + (0 - this.needleLen) + " L " + (config.needleNutRadius) + " " + (0))) - .style('fill', '#666666'); - - // Append needle nut - svg.append('circle') - .attr('class', 'needle') - .attr('transform', this.translation) - .attr('cx', 0) - .attr('cy', 0) - .attr('r', config.needleNutRadius) - .style('fill', '#666666'); -}; - -var TextIndicator = function TextIndicator(config) { - if (config === null) { - throw new Error('No chart context specified for polarAxis'); - } - - this.translation = config.textIndicatorTranslation; -}; - -TextIndicator.prototype.update = function update (svg, value, label) { - svg.select('.value') - .text(value); - svg.select('.label') - .text(label); -}; - -TextIndicator.prototype.render = function render (svg, config) { - var indicator = svg.append('g') - .attr('class', 'text-indicator') - .attr('pointer-events', 'none') - .style('text-anchor', 'middle') - .style('alignment-baseline', 'central'); - - if (this.translation) { - indicator.attr('transform', this.translation); - } - - indicator.append('text') - .attr('class', 'value') - .attr('x', 0) - .attr('y', 0) - .attr('pointer-events', 'none') - .text('0') - .style('font', '48px Montserrat, sans-serif') - .style('text-anchor', 'middle'); - - indicator.append('text') - .attr('class', 'label') - .attr('x', 0) - .attr('y', 0) - .attr('pointer-events', 'none') - .text('') - .style('font', '24px Montserrat, sans-serif') - .style('transform', 'translate(0, 1.5em') - .style('text-anchor', 'middle'); -}; - -var SvgGaugeStrategy = function SvgGaugeStrategy(context) { - this._loadConfig(context.config); - this.svgContainer = new SvgContainer(this.config); - var config = this.config; - - this.dial = new Dial('linear', config); - this.needle = new DialNeedle('linear', config); - - this.svgContainer - .add(this.dial) - .add(this.needle); - - if (config.numericIndicator) { - var r = ( - (config.width > config.height) ? - config.height : config.width - ) / 2; - var indicatorOffset = r + 75; - config.textIndicatorTranslation = 'translate(' + r + ',' + indicatorOffset + ')'; - this.textIndicator = new TextIndicator(config); - this.svgContainer.add(this.textIndicator); - } -}; - - /** - * Renders a gauge chart based on data object - * @param{Object} data Data Object. Contains a numeric value. - * - */ -SvgGaugeStrategy.prototype.draw = function draw (data) { - var datum = data[data.length - 1], - svg = this.svgContainer.svg, - config = this.config; - - this.needle.update(svg, config, data); - if (config.numericIndicator) { - this.textIndicator.update(svg, datum.value, config.label); - } -}; - - /** - * This method adds config options to the chart context. - * @param{Object} config Config object - */ -SvgGaugeStrategy.prototype._loadConfig = function _loadConfig (config) { - this.config = {}; - //Selector - this.config.selector = config.selector || defaults$5.selector; - //Margins - this.config.marginTop = config.marginTop || defaults$5.marginTop; - this.config.marginLeft = config.marginLeft || defaults$5.marginLeft; - this.config.marginRight = config.marginRight || defaults$5.marginRight; - this.config.marginBottom = config.marginBottom || defaults$5.marginBottom; - //Width & height - this.config.width = config.width ? - calculateWidth(config.width, this.config.selector) - this.config.marginLeft - this.config.marginRight - : calculateWidth(defaults$5.width, this.config.selector) - this.config.marginLeft - this.config.marginRight; - this.config.height = config.height || defaults$5.height; - - this.config.colorScale = config.colorScale || defaults$5.colorScale; - this.config.minLevel = config.minLevel || defaults$5.minLevel; - this.config.maxLevel = config.maxLevel || defaults$5.maxLevel; - this.config.minAngle = config.minAngle || defaults$5.minAngle; - this.config.maxAngle = config.maxAngle || defaults$5.maxAngle; - this.config.ticks = config.ticks || defaults$5.ticks; - this.config.ringWidth = config.ringWidth || defaults$5.ringWidth; - this.config.ringMargin = config.ringMargin || defaults$5.ringMargin; - this.config.labelInset = config.labelInset || defaults$5.labelInset; - this.config.needleNutRadius = config.needleNutRadius || defaults$5.needleNutRadius; - this.config.needleLenghtRatio = config.needleLenghtRatio || defaults$5.needleLenghtRatio; - this.config.invertColorScale = typeof (config.invertColorScale) === 'undefined' ? defaults$5.invertColorScale : config.invertColorScale; - this.config.numericIndicator = typeof (config.numericIndicator) === 'undefined' ? defaults$5.numericIndicator : config.numericIndicator; - this.config.label = config.label || defaults$5.label; - - - return this; -}; - -var defaults$6 = { - selector: '#chart', - width: '100%', // %, auto, or numeric - height: 250, - yAxisLabel: null, - //margins - marginTop: 20, - marginRight: 250, - marginBottom: 30, - marginLeft: 50, -}; - -var Nodeset = function Nodeset(config) { - var this$1 = this; - - this.config = config; - var width = config.width, - height = config.height; - - this.simulation = d3$1.forceSimulation() - .force("link", d3$1.forceLink().id(function (d) { return d.id; })) - .force("charge", d3$1.forceManyBody()) - .force("center", d3$1.forceCenter(width / 2, height / 2)); - - - this.dragstarted = function (d) { - if (!d3$1.event.active) { this$1.simulation.alphaTarget(0.3).restart(); } - d.fx = d.x; - d.fy = d.y; - }; - - this.dragged = function (d) { - d.fx = d3$1.event.x; - d.fy = d3$1.event.y; - }; - - this.dragended = function (d) { - if (!d3$1.event.active) { this$1.simulation.alphaTarget(0); } - d.fx = null; - d.fy = null; - }; - -}; - -Nodeset.prototype.update = function update (svg, config, data) { - var this$1 = this; - - data = simple2Linked(data); - - var link = svg.append("g") - .attr("class", "links") - .selectAll("line") - .data(data.links) - .enter().append("line") - .attr("stroke-width", 2) - .attr("stroke", "#999") - .attr("stroke-opacity", 0.6); - - var node = svg.append("g") - .attr("class", "nodes") - .selectAll("circle") - .data(data.nodes) - .enter() - .append("circle") - .attr("r", 5) - .attr("fill", function (d) { return "#23436f"; }) - .call(d3$1.drag() - .on("start", this.dragstarted) - .on("drag", this.dragged) - .on("end", this.dragended)); - - node.append("title") - .text(function (d) { return d.id; }); - - this.simulation.nodes(data.nodes).on("tick", function (e) { return this$1.ticked(link, node); }); - - this.simulation.force("link").links(data.links); -}; - -Nodeset.prototype.ticked = function ticked (link, node) { - link - .attr("x1", function (d) { return d.source.x; }) - .attr("y1", function (d) { return d.source.y; }) - .attr("x2", function (d) { return d.target.x; }) - .attr("y2", function (d) { return d.target.y; }); - - node - .attr("cx", function (d) { return d.x; }) - .attr("cy", function (d) { return d.y; }); -}; - -Nodeset.prototype.render = function render (svg, config) { - //Do nothing, since lines render only when new data is received. -}; - -var SvgNetworkgraphStrategy = function SvgNetworkgraphStrategy(context) { - this._loadConfig(context.config); - - this.svgContainer = new SvgContainer(this.config); - - this.nodeset = new Nodeset(this.config); - - //Include components in the chart container - this.svgContainer - .add(this.nodeset); -}; - - /** - * Renders a linechart based on data object - * @param{Object} data Data Object. Contains an array with x and y properties. - * - */ -SvgNetworkgraphStrategy.prototype.draw = function draw (data) { - var svg = this.svgContainer.svg, - config = this.config; - - this.nodeset.update(svg, config, data); -}; - -/** - * This method adds config options to the chart context. - * @param{Object} config Config object - */ -SvgNetworkgraphStrategy.prototype._loadConfig = function _loadConfig (config) { - this.config = {}; - this.config.selector = config.selector || defaults$6.selector; - //Margins - this.config.marginTop = config.marginTop || defaults$6.marginTop; - this.config.marginLeft = config.marginLeft || defaults$6.marginLeft; - this.config.marginRight = config.marginRight || defaults$6.marginRight; - this.config.marginBottom = config.marginBottom || defaults$6.marginBottom; - this.config.width = config.width ? calculateWidth(config.width, this.config.selector) - this.config.marginLeft - this.config.marginRight - : calculateWidth(defaults$6.width, this.config.selector) - this.config.marginLeft - this.config.marginRight; - this.config.height = config.height || defaults$6.height; - - return this; -}; + return RadialAxes; +}(Component)); + +var SunburstDisk = (function (_super) { + __extends(SunburstDisk, _super); + function SunburstDisk(x, y) { + var _this = _super.call(this) || this; + _this.x = x; + _this.y = y; + return _this; + } + SunburstDisk.prototype.removePaths = function () { + this.svg.selectAll('path').remove(); + }; + SunburstDisk.prototype.getAncestors = function (node) { + var path = []; + var current = node; + while (current.parent) { + path.unshift(current); + current = current.parent; + } + return path; + }; + SunburstDisk.prototype.update = function (data) { + var _this = this; + var arcGen = d3.arc() + .startAngle(function (d) { return Math.max(0, Math.min(2 * Math.PI, _this.x.xRadialAxis(d.x0))); }) + .endAngle(function (d) { return Math.max(0, Math.min(2 * Math.PI, _this.x.xRadialAxis(d.x1))); }) + .innerRadius(function (d) { return Math.max(0, _this.y.yRadialAxis(d.y0)); }) + .outerRadius(function (d) { return Math.max(0, _this.y.yRadialAxis(d.y1)); }); + var colorScale = this.config.get('colorScale'); + this.removePaths(); + var root = d3.stratify() + .id(function (d) { return d.id; }) + .parentId(function (d) { return d.parent; })(data); + root.sum(function (d) { return d.value; }); + d3.partition()(root); + var paths = this.svg.selectAll('path') + .data(root.descendants()) + .enter().append('path') + .attr('d', arcGen) + .style('fill', function (d) { + if (!d.parent) { + return 'white'; + } + else { + return colorScale(d.data.label); + } + }) + .style('stroke', '#fff') + .style('stroke-width', '2') + .style('shape-rendering', 'crispEdge'); + paths + .on('mouseover.default', function (d) { + var ancestors = _this.getAncestors(d); + if (ancestors.length > 0) { + _this.svg.selectAll('path') + .style('opacity', 0.3); + } + _this.svg.selectAll('path') + .filter(function (node) { return ancestors.indexOf(node) >= 0; }) + .style('opacity', 1); + _this.svg.select('.text-indicator .label').text(d.data.label); + _this.svg.select('.text-indicator .value').text(d.value); + }) + .on('mouseout.default', function (d) { + _this.svg.selectAll('path').style('opacity', 1); + _this.svg.select('.text-indicator .label').style('font-weight', 'normal'); + _this.svg.select('.text-indicator .label').text(''); + _this.svg.select('.text-indicator .value').text(''); + }); + paths + .on('mousedown.user', this.config.get('onDown')) + .on('mouseup.user', this.config.get('onUp')) + .on('mouseleave.user', this.config.get('onLeave')) + .on('mouseover.user', this.config.get('onHover')) + .on('click.user', this.config.get('onClick')); + }; + SunburstDisk.prototype.render = function () { + }; + return SunburstDisk; +}(Component)); + +var SvgStrategySunburst = (function (_super) { + __extends(SvgStrategySunburst, _super); + function SvgStrategySunburst() { + var _this = _super.call(this) || this; + _this.axes = new RadialAxes(); + _this.disk = new SunburstDisk(_this.axes.x, _this.axes.y); + _this.textIndicator = new TextIndicator(); + return _this; + } + SvgStrategySunburst.prototype.draw = function (data) { + this.container.translate(this.config.get('width') / 2, this.config.get('height') / 2); + this.container.updateComponents(data); + }; + SvgStrategySunburst.prototype.initialize = function () { + _super.prototype.initialize.call(this); + this.container + .add(this.axes) + .add(this.disk) + .add(this.textIndicator); + }; + return SvgStrategySunburst; +}(SvgChart)); var defaults$7 = { selector: '#chart', @@ -3060,1188 +2046,509 @@ var defaults$7 = { marginRight: 20, marginBottom: 30, marginLeft: 50, - width: '50%', // %, auto, or numeric + width: '50%', height: 450, tickLabel: '', transitionDuration: 300, - maxNumberOfElements: 5, // used by keepDrawing to reduce the number of elements in the current chart + maxNumberOfElements: 5, sortData: { descending: false, prop: 'x' }, - //Events - onDown: function onDown(d) { - }, - onHover: function onHover(d) { - }, - onLeave: function onLeave(d) { - }, - onClick: function onClick(d) { - } -}; - -var XRadialAxis = function XRadialAxis(config) { - if (config === null) { - throw new Error('No chart context specified for XRadialAxis'); - } - - this.xRadialAxis = d3$1.scaleLinear().range([0, 2 * Math.PI]); -}; - -var YRadialAxis = function YRadialAxis(config) { - if (config === null) { - throw new Error('No chart context specified for XRadialAxis'); - } - - var radius = (Math.min(config.width, config.height) / 2) - 10; - - this.yRadialAxis = d3$1.scaleSqrt() - .range([0, radius]); -}; - -// -var RadialAxes = function RadialAxes(config) { - if (config === null) { - throw new Error('No chart context specified for RadialAxis'); - } - - this.x = new XRadialAxis(config); - this.y = new YRadialAxis(config); -}; - -var SunburstDisk = function SunburstDisk(xRadialAxis, yRadialAxis) { - var this$1 = this; - - this.x = xRadialAxis; - this.y = yRadialAxis; - this.arcGen = d3$1.arc() - .startAngle(function (d) { return Math.max(0, Math.min(2 * Math.PI, this$1.x(d.x0))); }) - .endAngle(function (d) { return Math.max(0, Math.min(2 * Math.PI, this$1.x(d.x1))); }) - .innerRadius(function (d) { return Math.max(0, this$1.y(d.y0)); }) - .outerRadius(function (d) { return Math.max(0, this$1.y(d.y1)); }); -}; - -SunburstDisk.prototype.update = function update (svg, config, data) { - var this$1 = this; - - - // Remove all the paths before redrawing - this._removePaths(svg); - - // Create layout partition - var root = d3$1.stratify() - .id(function (d) { return d.id; }) - .parentId(function (d) { return d.parent; }) - (data); - - root.sum(function (d) { return d.value; }); - d3$1.partition()(root); - - // Draw the paths (arcs) - var paths = svg.selectAll('path') - .data(root.descendants()) - .enter().append('path') - .attr('d', this.arcGen) - .style('fill', function (d) { - if (!d.parent) { - return 'white'; - } else { - return config.colorScale(d.data.label); - } - }) - .style('stroke', '#fff') - .style('stroke-width', '2') - .style('shape-rendering', 'crispEdge'); - - paths // TODO extract events to config? - .on('mouseover.default', function (d) { - var ancestors = this$1._getAncestors(d); - // Fade all the arcs - if (ancestors.length > 0) { - svg.selectAll('path') - .style('opacity', 0.3); - } - svg.selectAll('path') - .filter(function (node) { return ancestors.indexOf(node) >= 0; }) - .style('opacity', 1); - // Hightlight the hovered arc - svg.select('.text-indicator .label').text(d.data.label); - svg.select('.text-indicator .value').text(d.value); - }) - .on('mouseout.default', function (d) { - svg.selectAll('path').style('opacity', 1); - svg.select('.text-indicator .label').style('font-weight', 'normal'); - svg.select('.text-indicator .label').text(''); - svg.select('.text-indicator .value').text(''); - }) - ; - - paths - .on('mousedown.user', config.onDown) - .on('mouseup.user', config.onUp) - .on('mouseleave.user', config.onLeave) - .on('mouseover.user', config.onHover) - .on('click.user', config.onClick); - - // ??? - svg.select(self.frameElement).style('height', this.height + 'px'); -}; - -/** - * Removes all the paths (arcs). Doing this before each redraw prevents the - * transition to mess up the arcs. - * @private - */ -SunburstDisk.prototype._removePaths = function _removePaths (svg) { - svg.selectAll('path').remove(); -}; - -/** - * From: http://bl.ocks.org/kerryrodden/7090426 - * @param node - * @returns {Array} - * @private - */ -SunburstDisk.prototype._getAncestors = function _getAncestors (node) { - var path = []; - var current = node; - while (current.parent) { - path.unshift(current); - current = current.parent; - } - return path; -}; - -SunburstDisk.prototype.render = function render (svg, config) { - //Do nothing, since disk render only when new data is received. -}; - -var SvgSunburstStrategy = function SvgSunburstStrategy(context) { - this._loadConfig(context.config); - - this.svgContainer = new SvgContainer(this.config); - var config = - this.config, - translation = 'translate(' + config.width / 2 + ',' + (config.height / 2) + ')'; - - this.svgContainer.transform(translation); - - this.axes = new RadialAxes(config); - - this.disk = new SunburstDisk( - this.axes.x.xRadialAxis, - this.axes.y.yRadialAxis, - config - ); - - this.textIndicator = new TextIndicator(config); - - this.svgContainer - .add(this.disk) - .add(this.textIndicator); -}; - -SvgSunburstStrategy.prototype.draw = function draw (data) { - var svg = this.svgContainer.svg, - config = this.config; - - this.disk.update(svg, config, data); -}; - -/** - * This method adds config options to the chart context. - * @param{Object} config Config object - */ -SvgSunburstStrategy.prototype._loadConfig = function _loadConfig (config) { - this.config = {}; - //Selector - this.config.selector = config.selector || defaults$7.selector; - //Margins - this.config.marginTop = config.marginTop || defaults$7.marginTop; - this.config.marginLeft = config.marginLeft || defaults$7.marginLeft; - this.config.marginRight = config.marginRight || defaults$7.marginRight; - this.config.marginBottom = config.marginBottom || defaults$7.marginBottom; - //Width & height - this.config.width = config.width ? - calculateWidth(config.width, this.config.selector) - this.config.marginLeft - this.config.marginRight - : calculateWidth(defaults$7.width, this.config.selector) - this.config.marginLeft - this.config.marginRight; - this.config.height = config.height || defaults$7.height; - - this.config.colorScale = config.colorScale || defaults$7.colorScale; - - //Events - this.config.onDown = config.onDown || defaults$7.onDown; - this.config.onUp = config.onUp || defaults$7.onUp; - this.config.onHover = config.onHover || defaults$7.onHover; - this.config.onClick = config.onClick || defaults$7.onClick; - this.config.onLeave = config.onLeave || defaults$7.onLeave; - - return this; -}; - -var defaults$8 = { - selector: '#chart', - colorScale: category7(), - - //Axes - xAxisType: 'linear', - xAxisFormat: '.1f', - xAxisLabel: 'Sepal length (cm)', - yAxisType: 'linear', - yAxisFormat: '.1f', - yAxisLabel: 'Sepal width (cm)', - //margins - marginTop: 20, - marginRight: 250, - marginBottom: 130, - marginLeft: 150, - //markers - markerShape: 'dot', - markerSize: 3, - //Width & height - width: '100%', // %, auto, or numeric - height: 250, - //Events - onDown: function onDown(d) { + onDown: function (d) { }, - onHover: function onHover(d) { + onHover: function (d) { }, - onLeave: function onLeave(d) { + onLeave: function (d) { }, - onClick: function onClick(d) { + onClick: function (d) { }, - - maxNumberOfElements: 100, // used by keepDrawing method to reduce the number of elements in the current chart -}; - -var SvgScatterplotStrategy = (function (SvgAxis$$1) { - function SvgScatterplotStrategy(context) { - SvgAxis$$1.call(this, context); - this.axes = new XYAxes(this.config.xAxisType, 'linear', this.config); - this.points = new Pointset(this.axes.x, this.axes.y); - this.legend = new Legend(); - //Include components in the chart container - this.svgContainer - .add(this.axes) - .add(this.legend) - .add(this.points); - } - - if ( SvgAxis$$1 ) SvgScatterplotStrategy.__proto__ = SvgAxis$$1; - SvgScatterplotStrategy.prototype = Object.create( SvgAxis$$1 && SvgAxis$$1.prototype ); - SvgScatterplotStrategy.prototype.constructor = SvgScatterplotStrategy; - - /** - * Renders a scatterplot based on data object - * @param {Object} data Data Object. Contains an array with x and y properties. - * - */ - SvgScatterplotStrategy.prototype.draw = function draw (data) { - var svg = this.svgContainer.svg, - config = this.config, - needRescaling = this.config.needRescaling, - bbox = null; - - // //Transform data, if needed - convertByXYFormat(data, config); - - //Sort data - sortByField(data, 'x'); - - //rescale, if needed. - if (needRescaling) { - this.rescale(); + onUp: function (d) { } - - bbox = this._getDomainBBox(data); - - this.axes.updateDomainByBBox(bbox); - - //Create a transition effect for dial rescaling - this.axes.transition(svg, 200); - - // Update legend - this.legend.update(svg, config, data); - - // Update points - this.points.update(svg, config, data); - }; - - SvgScatterplotStrategy.prototype._getDomainBBox = function _getDomainBBox (data) { - var minX = d3$1.min(data, function (d) { return d.x; }), - maxX = d3$1.max(data, function (d) { return d.x; }), - minY = d3$1.min(data, function (d) { return d.y; }), - maxY = d3$1.max(data, function (d) { return d.y; }); - return [minX, maxX, minY, maxY]; - }; - - SvgScatterplotStrategy.prototype._checkMarkers = function _checkMarkers (config) { - return config.markerSize > 0; - }; - SvgScatterplotStrategy.prototype._checkArea = function _checkArea (config) { - return config.areaOpacity > 0; - }; - - /** - * This method adds config options to the chart context. - * @param {Object} config Config object - */ - SvgScatterplotStrategy.prototype._loadConfig = function _loadConfig (config) { - SvgAxis$$1.prototype._loadConfig.call(this, config, defaults$8); - //Markers - this.config.markerOutlineWidth = config.markerOutlineWidth || defaults$8.markerOutlineWidth; - this.config.markerShape = config.markerShape || defaults$8.markerShape; - this.config.markerSize = (typeof config.markerSize === 'undefined' || config.markerSize < 0) ? defaults$8.markerSize : config.markerSize; - //Area - this.config.areaOpacity = (typeof config.areaOpacity === 'undefined' || config.markerSize < 0) ? defaults$8.areaOpacity : config.areaOpacity; - return this; - }; - - return SvgScatterplotStrategy; -}(SvgAxis)); - -/** - * SvgStrategy wrapper class - */ -var SvgStrategy = function SvgStrategy(strategy) { - this.strategy = strategy; - }; - SvgStrategy.prototype.draw = function draw (data) { - this.strategy.draw(data); - }; - SvgStrategy.prototype.on = function on (events){ - this.strategy.on(events); - }; - -var strategies = { - Barchart: function Barchart(chartContext) { - return new SvgBarchartStrategy(chartContext); - }, - Linechart: function Linechart(chartContext) { - return new SvgLinechartStrategy(chartContext); - }, - Streamgraph: function Streamgraph(chartContext) { - return new SvgStreamgraphStrategy(chartContext); - }, - Gauge: function Gauge(chartContext) { - return new SvgGaugeStrategy(chartContext); - }, - Scatterplot: function Scatterplot(chartContext) { - return new SvgScatterplotStrategy(chartContext); - }, - Sunburst: function Sunburst(chartContext) { - return new SvgSunburstStrategy(chartContext); - }, - Swimlane: function Swimlane(chartContext) { - return new SvgSwimlaneStrategy(chartContext); - }, - StackedArea: function StackedArea(chartContext) { - return new SvgStackedAreaStrategy(chartContext); - }, - Networkgraph: function Networkgraph(chartContext) { - return new SvgNetworkgraphStrategy(chartContext); - } }; -var doctype = ''; - -function isExternal(url) { - return url && url.lastIndexOf('http', 0) === 0 && url.lastIndexOf(window.location.host) === -1; -} - -function inlineImages(el, callback) { - var images = el.querySelectorAll('image'); - var left = images.length; - if (left === 0) { - callback(); - } - for (var i = 0; i < images.length; i++) { - (function (image) { - var href = image.getAttribute('xlink:href'); - if (href) { - if (isExternal(href.value)) { - window.console.warn('Cannot render embedded images linking to external hosts: ' + href.value); - return; - } - } - var canvas = window.document.createElement('canvas'); - var ctx = canvas.getContext('2d'); - var img = new window.Image(); - href = href || image.getAttribute('href'); - img.src = href; - img.onload = function () { - canvas.width = img.width; - canvas.height = img.height; - ctx.drawImage(img, 0, 0); - image.setAttribute('xlink:href', canvas.toDataURL('image/png')); - left--; - if (left === 0) { - callback(); +var Sunburst = (function (_super) { + __extends(Sunburst, _super); + function Sunburst(data, userConfig) { + if (userConfig === void 0) { userConfig = {}; } + return _super.call(this, new SvgStrategySunburst(), data, userConfig, defaults$7) || this; + } + Sunburst.prototype.keepDrawing = function (datum) { + var datumType = datum.constructor; + if (datumType === Array) { + if (this.data) { + this.data = this.data.concat(datum); + } + else { + this.data = datum; + } } - }; - img.onerror = function () { - window.console.error('Could not load ' + href); - left--; - if (left === 0) { - callback(); + else { + this.data.push(datum); } - }; - })(images[i]); - } -} + this.draw(copy(this.data)); + }; + return Sunburst; +}(Chart)); -function styles(el, selectorRemap) { - var css = ''; - var sheets = document.styleSheets; - for (var i = 0; i < sheets.length; i++) { - if (isExternal(sheets[i].href)) { - window.console.warn('Cannot include styles from other hosts: ' + sheets[i].href); - continue; +var LinkedNodeset = (function (_super) { + __extends(LinkedNodeset, _super); + function LinkedNodeset() { + var _this = _super.call(this) || this; + _this.toggle = 0; + return _this; } - var rules = sheets[i].cssRules; - if (rules !== null) { - for (var j = 0; j < rules.length; j++) { - var rule = rules[j]; - if (typeof (rule.style) !== 'undefined') { - var match = null; - try { - match = el.querySelector(rule.selectorText); - } catch (err) { - window.console.warn('Invalid CSS selector "' + rule.selectorText + '"', err); - } - if (match) { - var selector = selectorRemap ? selectorRemap(rule.selectorText) : rule.selectorText; - css += selector + ' { ' + rule.style.cssText + ' }\n'; - } else if (rule.cssText.match(/^@font-face/)) { - css += rule.cssText + '\n'; - } + LinkedNodeset.prototype.render = function () { + var _this = this; + var width = this.config.get('width'), height = this.config.get('height'); + this.simulation = d3.forceSimulation() + .force("link", d3.forceLink().id(function (d) { return d.id; }).distance(50)) + .force("charge", d3.forceManyBody()) + .force("center", d3.forceCenter(width / 2, height / 2)); + this.dragstarted = function (d) { + if (!d3.event.active) + _this.simulation.alphaTarget(0.3).restart(); + d.fx = d.x; + d.fy = d.y; + }; + this.dragged = function (d) { + d.fx = d3.event['x']; + d.fy = d3.event['y']; + }; + this.dragended = function (d) { + if (!d3.event.active) + _this.simulation.alphaTarget(1); + d.fx = null; + d.fy = null; + }; + }; + LinkedNodeset.prototype.update = function (data) { + var _this = this; + var nodeRadius = this.config.get('nodeRadius'), colorScale = this.config.get('colorScale'), linkWeight = this.config.get('linkWeight'), nodeWeight = this.config.get('nodeWeight'), minLinkWeight = this.config.get('minLinkWeight'), maxLinkWeight = this.config.get('maxLinkWeight'), minNodeWeight = this.config.get('minNodeWeight'), maxNodeWeight = this.config.get('maxNodeWeight'), weighted = this.config.get('weighted'), linkScaleRadius = d3.scaleLinear().domain([minLinkWeight, maxLinkWeight]).range([0, 3]), nodeScaleRadius = d3.scaleLinear().domain([minNodeWeight, maxNodeWeight]).range([0, 15]), labelShow = this.config.get('labelShow'), labelField = this.config.get('labelField'), node = null, link = null, text = null; + data = simple2Linked(data); + this.svg.selectAll('g.links').remove(); + this.svg.selectAll('g.nodes').remove(); + this.svg.selectAll('g.labels').remove(); + link = this.svg.append('g') + .attr('class', 'serie') + .append("g") + .attr("class", "links") + .selectAll("line") + .data(data.links) + .enter() + .append("line") + .attr(Globals.COMPONENT_DATA_KEY_ATTRIBUTE, function (d) { console.log(d); return d.key; }) + .attr("stroke-width", function (d) { return (weighted && d.weight) ? linkScaleRadius(d.weight) : linkWeight; }) + .attr("stroke", "#999") + .attr("stroke-opacity", 1); + node = this.svg.select('g.serie').append("g") + .attr("class", "nodes") + .selectAll("circle") + .data(data.nodes) + .enter() + .append("circle") + .attr(Globals.COMPONENT_DATA_KEY_ATTRIBUTE, function (d) { return d.key; }) + .attr("r", function (d) { return (weighted && d.weight) ? nodeScaleRadius(d.weight) : nodeWeight; }) + .attr("fill", function (d) { return colorScale(d.key); }) + .attr("stroke", "white") + .call(d3.drag() + .on("start", this.dragstarted) + .on("drag", this.dragged) + .on("end", this.dragended)); + var chart = this; + node + .on('mousedown.user', this.config.get('onDown')) + .on('mouseup.user', this.config.get('onUp')) + .on('mouseleave.user', this.config.get('onLeave')) + .on('mouseover.user', this.config.get('onHover')) + .on('click.user', this.config.get('onClick')); + if (labelShow) { + text = this.svg.select('g.serie').append("g") + .attr("class", "labels") + .selectAll('text') + .data(data.nodes) + .enter() + .append('text') + .attr(Globals.COMPONENT_DATA_KEY_ATTRIBUTE, function (d) { return d.key; }) + .attr('dx', 10) + .attr('dy', '.35em') + .attr('font-size', '.85em') + .text(typeof labelField === 'string' ? function (d) { return d[labelField]; } : labelField) + .on('mousedown.user', this.config.get('onDown')) + .on('mouseup.user', this.config.get('onUp')) + .on('mouseleave.user', this.config.get('onLeave')) + .on('mouseover.user', this.config.get('onHover')) + .on('click.user', this.config.get('onClick')); } - } - } - } - return css; -} - -function svgAsDataUri(el, options, cb) { - options = options || {}; - options.scale = options.scale || 1; - var xmlns = 'http://www.w3.org/2000/xmlns/'; - - inlineImages(el, function () { - var outer = document.createElement('div'); - var clone = el.cloneNode(true); - var width, height; - if (el.tagName === 'svg') { - width = parseInt(clone.getAttribute('width') || clone.style.width || getComputedStyle(el).getPropertyValue('width')); - height = parseInt(clone.getAttribute('height') || clone.style.height || getComputedStyle(el).getPropertyValue('height')); - } else { - var box = el.getBBox(); - width = box.x + box.width; - height = box.y + box.height; - clone.setAttribute('transform', clone.getAttribute('transform').replace(/translate\(.*?\)/, '')); - - var svg$1 = document.createElementNS('http://www.w3.org/2000/svg', 'svg'); - svg$1.appendChild(clone); - clone = svg$1; - } - - clone.setAttribute('version', '1.1'); - clone.setAttributeNS(xmlns, 'xmlns', 'http://www.w3.org/2000/svg'); - clone.setAttributeNS(xmlns, 'xmlns:xlink', 'http://www.w3.org/1999/xlink'); - clone.setAttribute('width', width * options.scale); - clone.setAttribute('height', height * options.scale); - clone.setAttribute('viewBox', '0 0 ' + width + ' ' + height); - outer.appendChild(clone); - - var css = styles(el, options.selectorRemap); - var s = document.createElement('style'); - s.setAttribute('type', 'text/css'); - s.innerHTML = ''; - var defs = document.createElement('defs'); - defs.appendChild(s); - clone.insertBefore(defs, clone.firstChild); - - var svg = doctype + outer.innerHTML; - var uri = 'data:image/svg+xml;base64,' + window.btoa(window.unescape(encodeURIComponent(svg))); - if (cb) { - cb(uri); - } - }); -} - -/** - * Base class, which includes common methods for all the charts - * @export Chart - * @class Chart - */ -var Chart = function Chart(d, config) { - var clazz = this.constructor.name; - if (clazz === 'Chart') { - throw new Error(clazz + ' is non-instanciable'); - } - - this.events = {}; - - if (!d && !config) { - throw new Error('Missing constructor parameters'); + this.simulation.nodes(data.nodes).on("tick", function () { return labelShow ? _this.tickedWithText(link, node, text) : _this.ticked(link, node); }); + this.simulation.force("link").links(data.links); + }; + LinkedNodeset.prototype.tickedWithText = function (link, node, text) { + this.ticked(link, node); + text + .attr('x', function (d) { return d.x; }) + .attr('y', function (d) { return d.y; }); + }; + LinkedNodeset.prototype.ticked = function (link, node) { + link + .attr("x1", function (d) { return d.source.x; }) + .attr("y1", function (d) { return d.source.y; }) + .attr("x2", function (d) { return d.target.x; }) + .attr("y2", function (d) { return d.target.y; }); + node + .attr("cx", function (d) { return d.x; }) + .attr("cy", function (d) { return d.y; }); + }; + LinkedNodeset.prototype.zoom = function (event$$1) { + var transform = event$$1.transform; + this.svg.selectAll('.nodes circle').attr('transform', transform); + this.svg.selectAll('.links line').attr('transform', transform); + this.svg.selectAll('.labels text').attr('transform', transform); + }; + return LinkedNodeset; +}(Component)); + +var ZoomComponent = (function (_super) { + __extends(ZoomComponent, _super); + function ZoomComponent(zoomerComponent) { + var _this = _super.call(this) || this; + _this.zoomerComponent = zoomerComponent; + _this.zoom = d3.zoom().scaleExtent([1 / 2, 4]); + return _this; } + ZoomComponent.prototype.render = function () { + var _this = this; + var selector = this.config.get('selector'); + d3.select(selector).call(this.zoom); + this.zoom.on('zoom', function () { + _this.zoomerComponent.zoom(d3.event); + }); + }; + ZoomComponent.prototype.update = function (data) { + }; + return ZoomComponent; +}(Component)); - var dataFormat = d.constructor.name; - var nArguments = (d && config) ? 2 : 1; - - switch (dataFormat) { - case 'WebsocketDatasource': - case 'HTTPDatasource': - this.datasource = d; - this.data = []; - this._configureDatasource(); - break; - case 'Array': - this.data = d; - break; - default: - throw TypeError('Wrong data format'); +var SvgStrategyNetwork = (function (_super) { + __extends(SvgStrategyNetwork, _super); + function SvgStrategyNetwork() { + return _super.call(this) || this; } - //if only 1 parameter is specified, take default config. Else, take the second argument as config. - this.config = (nArguments === 1) ? {} : config; - - this._initializeSVGContext(); -}; - -/** - * Private method. Initialize the API by dinamically creating methods. It creates N method, one per configuration option - * - * @param {any} properties An array that contains the name of the methods - * - * @memberOf Chart - */ -Chart.prototype._initializeAPI = function _initializeAPI (properties) { - var clazz = this.constructor; - properties.forEach(function (method) { - clazz.prototype[method] = function (value) { - return this.change(method, value); - }; - }); -}; - -/** - * Return the chart context: data, configuration and type - * - * @returns chart Chart context - * - * @memberOf Chart - */ -Chart.prototype._getChartContext = function _getChartContext () { - return { - data: this.data, - config: this.config, - cType: this.constructor.name + SvgStrategyNetwork.prototype.draw = function (data) { + this.container.updateComponents(data); }; -}; - -/** - * Initialize the SVG context, by dinamically creating an tag in the specified selector. It is automatically invoked - * by the chart constructor and should not be used outside of this instance. - * - * @memberOf Chart - */ -Chart.prototype._initializeSVGContext = function _initializeSVGContext () { - this._svg = new SvgStrategy(strategies[this.constructor.name](this._getChartContext())); -}; - -/** - * Paint data into the chart. If no data is specified, it takes by default the last dataset (very useful when repaintng charts ) - * - * @param {any} data Data to be painted - * - * @memberOf Chart - */ -Chart.prototype.draw = function draw (data) { - if ( data === void 0 ) data = this.data; + SvgStrategyNetwork.prototype.initialize = function () { + _super.prototype.initialize.call(this); + var legend = this.config.get('legend'); + var zoom$$1 = this.config.get('zoom'); + this.linkedNodes = new LinkedNodeset(); + this.container.add(this.linkedNodes); + if (legend) { + this.legend = new Legend(); + this.container.add(this.legend); + } + if (zoom$$1) { + this.zoom = new ZoomComponent(this.linkedNodes); + this.container.add(this.zoom); + } + }; + return SvgStrategyNetwork; +}(SvgChart)); - this._svg.draw(data); +var defaults$8 = { + selector: '#chart', + colorScale: category7(), + marginTop: 20, + marginRight: 250, + marginBottom: 130, + marginLeft: 150, + width: '100%', + height: 250, + nodeRadius: 8.5, + legend: true, + linkWeight: 1, + nodeWeight: 8, + minLinkValue: 0, + maxLinkValue: 10, + minNodeWeight: 0, + maxNodeWeight: 100, + weighted: false, + labelShow: true, + labelField: 'id', + zoom: true, + onDown: function (d) { + }, + onHover: function (d) { + }, + onLeave: function (d) { + }, + onClick: function (d) { + }, + onUp: function (d) { + } }; -/** - * Make and download an image of the current state of the chart. - * - * @memberOf Chart - */ -Chart.prototype.download = function download () { - var this$1 = this; - - var selector = this._svg.strategy.config.selector + ' ' + 'svg'; - svgAsDataUri(d3.select(selector).node(), {}, function (uri, err) { - if (err) { - throw Error('Error converting to image ' + err); +var Network = (function (_super) { + __extends(Network, _super); + function Network(data, userConfig) { + if (userConfig === void 0) { userConfig = {}; } + return _super.call(this, new SvgStrategyNetwork(), data, userConfig, defaults$8) || this; + } + Network.prototype.keepDrawing = function (datum) { + var datumType = datum.constructor; + if (datumType === Array) { + this.data = this.data.concat(datum); } else { - var link = document.createElement('a'); - link.style = 'position: fixed; left -10000px;'; // making it invisible - link.href = uri; - link.download = this$1.constructor.name + '.svg'; - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); + this.data.push(datum); } - }); -}; - -Chart.prototype._keepDrawingByAdding = function _keepDrawingByAdding (datum) { - var datumType = datum.constructor; + this.draw(copy(this.data)); + }; + return Network; +}(Chart)); - if (datumType === Array) { - this.data = this.data.concat(datum); +var SectorSet = (function (_super) { + __extends(SectorSet, _super); + function SectorSet() { + return _super.call(this) || this; } - else { - this.data.push(datum); + SectorSet.prototype.render = function () { + }; + SectorSet.prototype.update = function (data) { + var propertyKey = this.config.get('propertyKey'); + var propertyX = this.config.get('propertyX'); + var width = this.config.get('width'); + var height = this.config.get('height'); + var radius = Math.min(width, height) / 2; + var colorScale = this.config.get('colorScale'); + var myPie = d3.pie().value(function (d) { return d[propertyX]; })(data); + var myArc = d3.arc().innerRadius(0).outerRadius(radius); + var arcs = this.svg.selectAll("g.slice").data(myPie); + var newBlock = arcs.enter(); + newBlock + .append("g") + .attr(Globals.COMPONENT_DATA_KEY_ATTRIBUTE, function (d) { return d.data[propertyKey]; }) + .append("path") + .attr('fill', function (d, i) { + return d.data[propertyKey] !== undefined ? colorScale(d.data[propertyKey]) : colorScale(i); + }) + .attr("d", myArc); + }; + return SectorSet; +}(Component)); + +var SvgStrategyPieChart = (function (_super) { + __extends(SvgStrategyPieChart, _super); + function SvgStrategyPieChart() { + var _this = _super.call(this) || this; + _this.sectors = new SectorSet(); + return _this; } - this.draw(JSON.parse(JSON.stringify(this.data))); -}; - + SvgStrategyPieChart.prototype.draw = function (data) { + this.container.translate(this.config.get('width') / 2, this.config.get('height') / 2); + this.container.updateComponents(data); + }; + SvgStrategyPieChart.prototype.initialize = function () { + _super.prototype.initialize.call(this); + this.container + .add(this.sectors); + var legend = this.config.get('legend'); + if (legend) { + this.legend = new Legend(); + this.container.add(this.legend); + } + }; + return SvgStrategyPieChart; +}(SvgChart)); -/** - * - * This method add a data record / array of data into the current data. - * @param {any} datum - * @param {any} method - * - * @memberOf Chart - - */ -Chart.prototype.keepDrawing = function keepDrawing (datum, method) { - if (method === 'add') { - this._keepDrawingByAdding(datum); - } - else { - this._keepDrawingByReplacing(datum); +var defaults$9 = { + selector: '#chart', + colorScale: category8(), + marginTop: 0, + marginRight: '100', + marginBottom: 0, + marginLeft: 0, + width: '500', + height: '500', + transitionDuration: 300, + maxNumberOfElements: 5, + legend: true, + propertyX: 'x', + propertyKey: 'key', + sortData: { + descending: false, + prop: 'x' + }, + onDown: function (d) { + }, + onHover: function (d) { + }, + onLeave: function (d) { + }, + onClick: function (d) { + }, + onUp: function (d) { } }; -Chart.prototype._configureDatasource = function _configureDatasource () { - var this$1 = this; - - this.dispatcher = d3$1.dispatch('onmessage', 'onopen', 'onerror'); - - this.datasource.configure(this.dispatcher); - - this.dispatcher.on('onmessage', function (data) { return this$1.keepDrawing(data); }); - //this.dispatcher.on('onmessage', (data) => console.log(data)); - - - this.dispatcher.on('onopen', function (event$$1) { - console.log('onopen', event$$1); - }); - - this.dispatcher.on('onerror', function (error) { - console.log('onerror', error); - }); -}; - -/** - * Change a configuration property. They all are also available through a method with the same name of the property. - * - * @param {any} property property name - * @param {any} value the new property value - * @returns the instance of the current chart - * - * @memberOf Chart - */ -Chart.prototype.change = function change (property, value) { - this._svg.strategy.changeConfigProperty(property, value); - return this; -}; - -/** - * Linechart implementation. This charts belongs to 'Basic' family. - * It is inherited on 'Basic'. - */ -var Linechart$1 = (function (Chart$$1) { - function Linechart(data, config) { - Chart$$1.call(this, data, config); - var keys = Object.keys(defaults); - this._initializeAPI(keys); - } - - if ( Chart$$1 ) Linechart.__proto__ = Chart$$1; - Linechart.prototype = Object.create( Chart$$1 && Chart$$1.prototype ); - Linechart.prototype.constructor = Linechart; - - /** - * Renders a data object on the chart. - * @param {Object} data This object contains the data that will be rendered on chart. If you do not - * specify this param, this.data will be used instead. - */ - Linechart.prototype.draw = function draw (data) { - if ( data === void 0 ) data = this.data; - - Chart$$1.prototype.draw.call(this, data); - }; - - /** - * Add new data to the current graph. If it is empty, this creates a new one. - * @param {Object} datum data to be rendered - */ - Linechart.prototype.keepDrawing = function keepDrawing (datum) { - Chart$$1.prototype.keepDrawing.call(this, datum, 'add'); - }; - - return Linechart; +var PieChart = (function (_super) { + __extends(PieChart, _super); + function PieChart(data, userConfig) { + if (userConfig === void 0) { userConfig = {}; } + return _super.call(this, new SvgStrategyPieChart, data, userConfig, defaults$9) || this; + } + PieChart.prototype.keepDrawing = function (datum) { + var datumType = datum.constructor; + if (datumType === Array) { + if (this.data) { + this.data = this.data.concat(datum); + } + else { + this.data = datum; + } + } + else { + this.data.push(datum); + } + this.draw(copy(this.data)); + }; + return PieChart; }(Chart)); -/** - * Barchart implementation. This charts belongs to 'Basic' family. - * It is inherited on 'Basic'. - */ -var Barchart$1 = (function (Chart$$1) { - function Barchart(data, config) { - Chart$$1.call(this, data, config); - var keys = Object.keys(defaults); - this._initializeAPI(keys); - } - - if ( Chart$$1 ) Barchart.__proto__ = Chart$$1; - Barchart.prototype = Object.create( Chart$$1 && Chart$$1.prototype ); - Barchart.prototype.constructor = Barchart; - - /** - * Renders a data object on the chart. - * @param {Object} data - This object contains the data that will be rendered on chart. If you do not - * specify this param, this.data will be used instead. - */ - Barchart.prototype.draw = function draw (data) { - if ( data === void 0 ) data = this.data; - - Chart$$1.prototype.draw.call(this, data); - }; - - Barchart.prototype.fire = function fire (event$$1, data) {//TODO: improve this section - if (event$$1 === 'transition') { - if (data === 'grouped') { - this._svg.strategy.transition2Grouped(); - } - else if (data === 'stacked') { - this._svg.strategy.transition2Stacked(); - } - - this._svg.strategy.draw(); +var Datasource = (function () { + function Datasource() { + this.dispatcher = null; + this.source = null; + this.isWaitingForData = true; } - }; - - /** - * Add new data to the current graph. If it is empty, this creates a new one. - * @param {Object} datum - data to be rendered - */ - Barchart.prototype.keepDrawing = function keepDrawing (datum) { - Chart$$1.prototype.keepDrawing.call(this, datum, 'replace'); - }; - - Barchart.prototype._keepDrawingByReplacing = function _keepDrawingByReplacing (datum) { - var this$1 = this; + Datasource.prototype.start = function () { + window.console.log('Starting datasource'); + }; + Datasource.prototype.stop = function () { + window.console.log('Stopping datasource'); + }; + Datasource.prototype.configure = function (dispatcher) { + this.dispatcher = dispatcher; + }; + Datasource.prototype.filter = function (filter) { + return this; + }; + return Datasource; +}()); - var datumType = datum.constructor; - if (datumType === Array) { - this.data = datum; +var WebsocketDatasource = (function (_super) { + __extends(WebsocketDatasource, _super); + function WebsocketDatasource(source) { + var _this = _super.call(this) || this; + _this.source = source; + return _this; } - else { - for (var i = 0; i < this.data.length; i++) { - var d = this$1.data[i]; - if (d.x === datum.x) { - this$1.data[i] = datum; - break; + WebsocketDatasource.prototype.configure = function (dispatcher) { + this.dispatcher = dispatcher; + }; + WebsocketDatasource.prototype.start = function () { + var _this = this; + _super.prototype.start.call(this); + this.ws = new WebSocket(this.source['endpoint']); + this.dispatcher.call('addLoading', this, {}); + this.ws.onopen = function (e) { + _this.dispatcher.call('onopen', _this, e); + }; + this.ws.onerror = function (e) { + throw new Error('An error occurred trying to reach the websocket server' + e); + }; + this.ws.onmessage = function (e) { + if (_this.isWaitingForData) { + _this.dispatcher.call('removeLoading', _this, e); + _this.isWaitingForData = false; + } + var data = JSON.parse(e.data); + _this.dispatcher.call('onmessage', _this, data); + }; + }; + WebsocketDatasource.prototype.stop = function () { + _super.prototype.stop.call(this); + if (this.ws) { + this.ws.close(); } - } - } - - this.draw(JSON.parse(JSON.stringify(this.data))); - }; - - return Barchart; -}(Chart)); - -/** - * Streamgraph implementation. This charts belongs to 'Flow' family. - * It is inherited on 'Flow'. - */ -var Streamgraph$1 = (function (Chart$$1) { - function Streamgraph(data, config) { - Chart$$1.call(this, data, config); - var keys = Object.keys(defaults$2); - this._initializeAPI(keys); - } - - if ( Chart$$1 ) Streamgraph.__proto__ = Chart$$1; - Streamgraph.prototype = Object.create( Chart$$1 && Chart$$1.prototype ); - Streamgraph.prototype.constructor = Streamgraph; - - /** - * Renders a data object on the chart. - * @param {Object} data This object contains the data that will be rendered on chart. If you do not - * specify this param, this.data will be used instead. - */ - Streamgraph.prototype.draw = function draw (data) { - if ( data === void 0 ) data = this.data; - - Chart$$1.prototype.draw.call(this, data); - }; - - /** - * Add new data to the current graph. If it is empty, this creates a new one. - * @param {Object} datum data to be rendered - */ - Streamgraph.prototype.keepDrawing = function keepDrawing (datum) { - Chart$$1.prototype.keepDrawing.call(this, datum, 'add'); - }; - - return Streamgraph; -}(Chart)); - -/** - * StackedArea implementation. This charts belongs to 'Flow' family. - * It is inherited on 'Flow'. - */ -var StackedArea$1 = (function (Chart$$1) { - function StackedArea(data, config) { - Chart$$1.call(this, data, config); - var keys = Object.keys(defaults$3); - this._initializeAPI(keys); - } - - if ( Chart$$1 ) StackedArea.__proto__ = Chart$$1; - StackedArea.prototype = Object.create( Chart$$1 && Chart$$1.prototype ); - StackedArea.prototype.constructor = StackedArea; - - /** - * Renders a data object on the chart. - * @param {Object} data This object contains the data that will be rendered on chart. If you do not - * specify this param, this.data will be used instead. - */ - StackedArea.prototype.draw = function draw (data) { - if ( data === void 0 ) data = this.data; - - Chart$$1.prototype.draw.call(this, data); - }; + }; + return WebsocketDatasource; +}(Datasource)); - /** - * Add new data to the current graph. If it is empty, this creates a new one. - * @param {Object} datum data to be rendered - */ - StackedArea.prototype.keepDrawing = function keepDrawing (datum) { - if (!this.datum) { - this.datum = []; +var HTTPDatasource = (function (_super) { + __extends(HTTPDatasource, _super); + function HTTPDatasource(source) { + var _this = _super.call(this) || this; + _this.source = source; + _this.intervalId = -1; + _this.started = false; + return _this; } - this.datum = this.datum.concat(datum); - Chart$$1.prototype.draw.call(this, this.datum); - }; - - return StackedArea; -}(Chart)); - -/** - * Linechart implementation. This charts belongs to 'Basic' family. - * It is inherited on 'Basic'. - */ -var Swimlane$1 = (function (Chart$$1) { - function Swimlane(data, config) { - Chart$$1.call(this, data, config); - var keys = Object.keys(defaults$4); - this._initializeAPI(keys); - } - - if ( Chart$$1 ) Swimlane.__proto__ = Chart$$1; - Swimlane.prototype = Object.create( Chart$$1 && Chart$$1.prototype ); - Swimlane.prototype.constructor = Swimlane; - - /** - * Renders a data object on the chart. - * @param {Object} data This object contains the data that will be rendered on chart. If you do not - * specify this param, this.data will be used instead. - */ - Swimlane.prototype.draw = function draw (data) { - if ( data === void 0 ) data = this.data; - - Chart$$1.prototype.draw.call(this, data); - }; - - /** - * Add new data to the current graph. If it is empty, this creates a new one. - * @param {Object} datum data to be rendered - */ - Swimlane.prototype.keepDrawing = function keepDrawing (datum) { - Chart$$1.prototype.keepDrawing.call(this, datum, 'add'); - }; - - return Swimlane; -}(Chart)); - -/** - * Gauge implementation. This charts belongs to 'Basic' family. - * It is inherited on 'Basic'. - */ -var Gauge$1 = (function (Chart$$1) { - function Gauge(data, config) { - Chart$$1.call(this, data, config); - } - - if ( Chart$$1 ) Gauge.__proto__ = Chart$$1; - Gauge.prototype = Object.create( Chart$$1 && Chart$$1.prototype ); - Gauge.prototype.constructor = Gauge; - - /** - * Renders a data object on the chart. - * @param {Object} data This object contains the data that will be rendered on chart. If you do not - * specify this param, this.data will be used instead. - */ - Gauge.prototype.draw = function draw (data) { - if ( data === void 0 ) data = this.data; - - Chart$$1.prototype.draw.call(this, data); - }; - - - /** - * Add new data to the current graph. If it is empty, this creates a new one. - * @param {Object} datum data to be rendered - */ - Gauge.prototype.keepDrawing = function keepDrawing (datum) { - this.data = [datum[0]]; - Chart$$1.prototype.draw.call(this); - }; - - return Gauge; -}(Chart)); - -/** - * Scatterplot implementation. This charts belongs to 'Basic' family. - * It is inherited on 'Basic'. - */ -var Scatterplot$1 = (function (Chart$$1) { - function Scatterplot(data, config) { - Chart$$1.call(this, data, config); - var keys = Object.keys(defaults$8); - this._initializeAPI(keys); - } - - if ( Chart$$1 ) Scatterplot.__proto__ = Chart$$1; - Scatterplot.prototype = Object.create( Chart$$1 && Chart$$1.prototype ); - Scatterplot.prototype.constructor = Scatterplot; - - /** - * Renders a data object on the chart. - * @param {Object} data This object contains the data that will be rendered on chart. If you do not - * specify this param, this.data will be used instead. - */ - Scatterplot.prototype.draw = function draw (data) { - if ( data === void 0 ) data = this.data; - - Chart$$1.prototype.draw.call(this, data); - }; - - /** - * Add new data to the current graph. If it is empty, this creates a new one. - * @param {Object} datum data to be rendered - */ - Scatterplot.prototype.keepDrawing = function keepDrawing (datum) { - Chart$$1.prototype.keepDrawing.call(this, datum, 'add'); - }; - - return Scatterplot; -}(Chart)); - -/** - * Sunburst implementation. This charts belongs to 'Hierarchical' family. - */ -var Sunburst$1 = (function (Chart$$1) { - function Sunburst(data, config) { - Chart$$1.call(this, data, config); - } - - if ( Chart$$1 ) Sunburst.__proto__ = Chart$$1; - Sunburst.prototype = Object.create( Chart$$1 && Chart$$1.prototype ); - Sunburst.prototype.constructor = Sunburst; - - /** - * Renders a data object on the chart. - * @param {Object} data This object contains the data that will be rendered on chart. If you do not - * specify this param, this.data will be used instead. - */ - Sunburst.prototype.draw = function draw (data) { - if ( data === void 0 ) data = this.data; - - Chart$$1.prototype.draw.call(this, data); - }; - - /** - * Add new data to the current graph. If it is empty, this creates a new one. - * @param {Object} datum data to be rendered - */ - Sunburst.prototype.keepDrawing = function keepDrawing (datum) { - Chart$$1.prototype.keepDrawing.call(this, datum, 'add'); - }; - - // /** - // * Add new data to the current graph. If it is empty, this creates a new one. - // * @param {Object} datum data to be rendered - // */ - // keepDrawing(datum) { - // if (this.data.constructor === Array) { this.data = {}; } - // let config = this.config; - // if (!datum) { - // console.warn('attemp to draw null datum'); - // return; - // } - // - // this._buildTree(datum[datum.length - 1].path, datum[datum.length - 1].value, this.data); - // - // this.draw(); - // - // return this.data; - // } - - /** - * Inserts the new nodes into the existing tree. - * From: http://bl.ocks.org/kerryrodden/7090426 - * - * @param pathString - * @param value - * @param data - * @private - */ - Sunburst.prototype._buildTree = function _buildTree (pathString, value, data) { - var path = pathString.split('/'); - var current = data; - for (var i = 1; i < path.length; i++) { - var children = current.children; - var name = path[i]; - var child; - if (i + 1 < path.length) { - var foundChild = false; - for (var j = 0; children !== undefined && j < children.length; j++) { - if (children[j].name === name) { - child = children[j]; - foundChild = true; - break; - } + HTTPDatasource.prototype.start = function () { + if (!this.started) { + _super.prototype.start.call(this); + var pollingTime = this.source.pollingTime; + var url = this.source.url; + this._startPolling(url, pollingTime); + this.started = true; + } + }; + HTTPDatasource.prototype._startPolling = function (url, time) { + var _this = this; + if (time === void 0) { time = 1000; } + var interval = window.setInterval; + this.intervalId = interval(function () { return _this._startRequest(url); }, time); + }; + HTTPDatasource.prototype._startRequest = function (url) { + var _this = this; + window.console.log('url', url); + d3.request(url).get(function (e, response) { return _this._handleResponse(response); }); + }; + HTTPDatasource.prototype._stopPolling = function () { + var clearInterval = window.clearInterval; + clearInterval(this.intervalId); + }; + HTTPDatasource.prototype._handleResponse = function (xmlHttpRequest) { + var parseJson = window.JSON.parse; + if (xmlHttpRequest.readyState === 4 && xmlHttpRequest.status === 200) { + var response = parseJson(xmlHttpRequest.response); + this._handleOK(response); } - if (!foundChild) { - child = { - 'name': name, - 'children': [] - }; - if (children === undefined) { - current.children = []; - } - delete current.value; - current.children.push(child); + else { + this._handleError(xmlHttpRequest); } - current = child; - } else { - child = { - 'name': name, - 'value': value - }; - if (children === undefined) { - current.children = []; + }; + HTTPDatasource.prototype._handleOK = function (data) { + if (this.properties.length > 0) { + data = this.convert(data); } - delete current.value; - current.children.push(child); - } - } - }; - - return Sunburst; -}(Chart)); - -/** - * Linechart implementation. This charts belongs to 'Basic' family. - * It is inherited on 'Basic'. - */ -var Networkgraph$1 = (function (Chart$$1) { - function Networkgraph(data, config) { - Chart$$1.call(this, data, config); - var keys = Object.keys(defaults$6); - this._initializeAPI(keys); - } - - if ( Chart$$1 ) Networkgraph.__proto__ = Chart$$1; - Networkgraph.prototype = Object.create( Chart$$1 && Chart$$1.prototype ); - Networkgraph.prototype.constructor = Networkgraph; - - /** - * Renders a data object on the chart. - * @param {Object} data This object contains the data that will be rendered on chart. If you do not - * specify this param, this.data will be used instead. - */ - Networkgraph.prototype.draw = function draw (data) { - if ( data === void 0 ) data = this.data; - - Chart$$1.prototype.draw.call(this, data); - }; - - /** - * Add new data to the current graph. If it is empty, this creates a new one. - * @param {Object} datum data to be rendered - */ - Networkgraph.prototype.keepDrawing = function keepDrawing (datum) { - Chart$$1.prototype.keepDrawing.call(this, datum, 'add'); - }; - - return Networkgraph; -}(Chart)); + this.dispatcher.call('onmessage', this, data); + }; + HTTPDatasource.prototype._handleError = function (data) { + this.dispatcher.call('onerror', this, data); + }; + HTTPDatasource.prototype.stop = function () { + if (this.started) { + this._stopPolling(); + this.started = false; + } + }; + return HTTPDatasource; +}(Datasource)); -exports.Datasource = Datasource; -exports.HTTPDatasource = HTTPDatasource; +exports.Linechart = Linechart; +exports.Barchart = Barchart; +exports.Gauge = Gauge; +exports.Scatterplot = Scatterplot; +exports.Streamgraph = Streamgraph; +exports.StackedArea = StackedArea; +exports.Swimlane = Swimlane; +exports.Sunburst = Sunburst; +exports.Network = Network; +exports.PieChart = PieChart; exports.WebsocketDatasource = WebsocketDatasource; -exports.Linechart = Linechart$1; -exports.Barchart = Barchart$1; -exports.Streamgraph = Streamgraph$1; -exports.StackedArea = StackedArea$1; -exports.Swimlane = Swimlane$1; -exports.Gauge = Gauge$1; -exports.Scatterplot = Scatterplot$1; -exports.Sunburst = Sunburst$1; -exports.Networkgraph = Networkgraph$1; -exports.category1 = category1; -exports.category2 = category2; -exports.category3 = category3; -exports.category4 = category4; -exports.category5 = category5; -exports.category6 = category6; -exports.category7 = category7; -exports.category8 = category8; -exports.sequentialYellow = sequentialYellow; -exports.sequentialRedOrange = sequentialRedOrange; -exports.sequentialRed = sequentialRed; -exports.sequentialPink = sequentialPink; -exports.sequentialPurplePink = sequentialPurplePink; -exports.sequentialPurple = sequentialPurple; -exports.sequentialBlue = sequentialBlue; -exports.sequentialLightBlue = sequentialLightBlue; -exports.sequentialBlueViolet = sequentialBlueViolet; -exports.sequentialTurquoise = sequentialTurquoise; -exports.sequentialLightGreen = sequentialLightGreen; -exports.sequentialDarkGreen = sequentialDarkGreen; -exports.sequentialGreenBrown = sequentialGreenBrown; -exports.sequentialBrown = sequentialBrown; -exports.sequentialGrey = sequentialGrey; -exports.sequentialVioletCb = sequentialVioletCb; -exports.sequentialPinkCb = sequentialPinkCb; -exports.sequentialBlueCb = sequentialBlueCb; -exports.sequentialGreenCb = sequentialGreenCb; -exports.sequentialGreenBrownCb = sequentialGreenBrownCb; -exports.diverging_spectral1 = diverging_spectral1; -exports.diverging_spectral2 = diverging_spectral2; -exports.diverging_spectral3 = diverging_spectral3; -exports.diverging_brown_turquoise = diverging_brown_turquoise; -exports.diverging_orange_pink = diverging_orange_pink; -exports.diverging_red_blue = diverging_red_blue; -exports.diverging_red_grey = diverging_red_grey; -exports.diverging_orange_violet = diverging_orange_violet; -exports.diverging_purple_green = diverging_purple_green; -exports.diverging_violet_green = diverging_violet_green; -exports.diverging_red_green = diverging_red_green; -exports.diverging_brown_green = diverging_brown_green; -exports.diverging_lightBrown_turquoise = diverging_lightBrown_turquoise; +exports.HTTPDatasource = HTTPDatasource; +exports.Globals = Globals; Object.defineProperty(exports, '__esModule', { value: true }); diff --git a/dist/proteic.js.map b/dist/proteic.js.map index fc349b0..56dd7df 100644 --- a/dist/proteic.js.map +++ b/dist/proteic.js.map @@ -1 +1 @@ -{"version":3,"file":null,"sources":["../src/utils/colors.js","../src/datasources/Datasource.js","../src/datasources/HTTPDatasource.js","../src/datasources/WebsocketDatasource.js","../src/utils/defaults/linechart.js","../src/svg/components/svgContainer.js","../src/utils/functions.js","../src/utils/screen.js","../src/svg/base/svgAxis.js","../src/svg/components/xAxis.js","../src/svg/components/yAxis.js","../src/svg/components/xyAxes.js","../src/svg/components/lineset.js","../src/svg/components/legend.js","../src/svg/components/areaset.js","../src/svg/components/pointset.js","../src/utils/dataTransformation.js","../src/utils/dataSorting.js","../src/svg/strategy_linechart.js","../src/utils/defaults/barchart.js","../src/svg/components/barset.js","../src/svg/strategy_barchart.js","../src/utils/defaults/streamgraph.js","../src/svg/components/streamset.js","../src/svg/strategy_streamgraph.js","../src/utils/defaults/stackedArea.js","../src/svg/strategy_stackedArea.js","../src/utils/defaults/swimlane.js","../src/svg/components/timeBoxset.js","../src/svg/strategy_swimlane.js","../src/utils/defaults/gauge.js","../src/svg/components/dial.js","../src/svg/components/dialNeedle.js","../src/svg/components/textIndicator.js","../src/svg/strategy_gauge.js","../src/utils/defaults/networkgraph.js","../src/svg/components/nodeset.js","../src/svg/strategy_networkgraph.js","../src/utils/defaults/sunburst.js","../src/svg/components/xRadialAxis.js","../src/svg/components/yRadialAxis.js","../src/svg/components/radialAxes.js","../src/svg/components/sunburstDisk.js","../src/svg/strategy_sunburst.js","../src/utils/defaults/scatterplot.js","../src/svg/strategy_scatterplot.js","../src/svg/SvgStrategy.js","../src/utils/image.js","../src/charts/base/Chart.js","../src/charts/linechart.js","../src/charts/barchart.js","../src/charts/streamgraph.js","../src/charts/stackedArea.js","../src/charts/swimlane.js","../src/charts/gauge.js","../src/charts/scatterplot.js","../src/charts/sunburst.js","../src/charts/networkgraph.js"],"sourcesContent":["import {scaleOrdinal, scaleQuantile} from 'd3';\n\nconst paletteCategory1 = [\n '#e1c8df',\n '#9ecd9d',\n '#acd9d6',\n '#e4e36b',\n '#bfa1c5',\n '#e4d3b8',\n '#facba8',\n '#ced4ea',\n '#acd9d6'\n];\n\nconst paletteCategory2 = [\n '#b6dde2',\n '#6394af',\n '#e4e9ab',\n '#8ea876',\n '#f7dce1',\n '#cc878f',\n '#fadaac',\n '#f29a83',\n '#8d7e9e'\n];\n\nconst paletteCategory3 = [\n '#6b68a9',\n '#8cc590',\n '#b9487d',\n '#bfa1c5',\n '#4e6936',\n '#71bbc3',\n '#484156',\n '#ccaf44',\n '#d0553c'\n];\n\nconst paletteCategory4 = [\n '#f1a30d',\n '#1d4763',\n '#84c7bc',\n '#c1212d',\n '#8fbe46',\n '#076837',\n '#563a2d',\n '#563a2d',\n '#87325d'\n];\n\nconst paletteCategory5 = [\n '#f1a30d',\n '#0c3183',\n '#acd9d6',\n '#c1212d',\n '#8fbe46',\n '#076837',\n '#8a6338',\n '#8d2d84',\n '#f09bbc'\n];\n\nconst paletteCategory6 = [\n '#71bbc3',\n '#1d4763',\n '#8fbe46',\n '#4e6936',\n '#ee8998',\n '#c1212d',\n '#f5af3c',\n '#e95e2e',\n '#634484'\n];\n\nconst paletteCategory7 = [\n '#ea671e',\n '#684592',\n '#84b92a',\n '#cd131c',\n '#3c5ba2',\n '#5baddc',\n '#ffde06',\n '#5db68b',\n '#775e47'\n];\n\nconst paletteCategory8 = [\n '#ebd646',\n '#a50f38',\n '#00a096',\n '#f09bbc',\n '#065b78',\n '#72722a',\n '#005231',\n '#4d4e98',\n '#7c4d25'\n];\n\nconst paletteSequentialYellow = [\n '#fff1c6',\n '#fee5a7',\n '#fcda87',\n '#face64',\n '#f8bf4b',\n '#f6b030',\n '#f4a009',\n '#d28514',\n '#b36c17',\n '#955618',\n '#7a4317',\n '#613214',\n '#49230f'\n];\n\nconst paletteSequentialRedOrange = [\n '#ffecb8',\n '#fbd68b',\n '#f7bf5e',\n '#f3a82f',\n '#df7520',\n '#cd4925',\n '#be0a26',\n '#a81023',\n '#941320',\n '#80141d',\n '#6d1419',\n '#5a1215',\n '#470f0f'\n];\n\nconst paletteSequentialRed = [\n '#fde4d4',\n '#f1c4af',\n '#f7bf5e',\n '#db826a',\n '#d0614d',\n '#c73e36',\n '#be0a26',\n '#a81023',\n '#941320',\n '#80141d',\n '#6d1419',\n '#5a1215',\n '#470f0f'\n];\n\nconst paletteSequentialPink = [\n '#fbe3e3',\n '#f9cfcc',\n '#f0aaa9',\n '#ed7e7e',\n '#ea647b',\n '#e74576',\n '#e41270',\n '#c70f65',\n '#aa105c',\n '#8d1253',\n '#731448',\n '#5a123c',\n '#420e30'\n];\n\nconst paletteSequentialPurplePink = [\n '#f9d8e6',\n '#ebbed7',\n '#dda4c7',\n '#c890bb',\n '#b27daf',\n '#8a4c94',\n '#622181',\n '#622181',\n '#50216b',\n '#472060',\n '#3e1f55',\n '#361e4b',\n '#2d1c41'\n];\n\nconst paletteSequentialPurple = [\n '#f6e8f1',\n '#dcc5de',\n '#c2a3c9',\n '#a980b3',\n '#905e9f',\n '#793f8e',\n '#622181',\n '#592175',\n '#4f216b',\n '#462060',\n '#3d1f55',\n '#351e4b',\n '#2c1c41'\n];\n\nconst paletteSequentialBlue = [\n '#e5f2f9',\n '#d1e5f5',\n '#afd3ed',\n '#91afd7',\n '#738bbf',\n '#3c5a9e',\n '#0c3183',\n '#132a68',\n '#10204c',\n '#0b193b',\n '#06142f',\n '#051228',\n '#061020'\n];\n\nconst paletteSequentialLightBlue = [\n '#eff8fd',\n '#d9eff6',\n '#c2e5ef',\n '#a8dae8',\n '#90cbe4',\n '#76b8e1',\n '#5baddc',\n '#4d96cc',\n '#427ebc',\n '#3a67ab',\n '#324c88',\n '#29366b',\n '#1e2354'\n];\n\nconst paletteSequentialBlueViolet = [\n '#edf7e7',\n '#c8e3d2',\n '#91cdbf',\n '#41b5ab',\n '#218ba4',\n '#145d94',\n '#0c3183',\n '#0d2d76',\n '#0d2a6a',\n '#0e265e',\n '#0d2253',\n '#0c1e47',\n '#0b1a3c'\n];\n\nconst paletteSequentialTurquoise = [\n '#e2ecf6',\n '#cadfe6',\n '#b1d3d6',\n '#94c6c6',\n '#74b9b6',\n '#4caca6',\n '#00a096',\n '#008d89',\n '#007b7c',\n '#006a6f',\n '#005963',\n '#004a57',\n '#063b4c'\n];\n\nconst paletteSequentialLightGreen = [\n '#faf9de',\n '#e9efc3',\n '#d7e4a7',\n '#c5d989',\n '#b1ce6a',\n '#9cc34c',\n '#84b92a',\n '#6fa32b',\n '#5a8f2a',\n '#477c29',\n '#346b27',\n '#205b24',\n '#074d21'\n];\n\nconst paletteSequentialDarkGreen = [\n '#eaf3e5',\n '#c7d5be',\n '#a3ba9a',\n '#80a078',\n '#5c885a',\n '#357442',\n '#00632e',\n '#00592b',\n '#004e27',\n '#004423',\n '#033a1e',\n '#053019',\n '#052613'\n];\n\nconst paletteSequentialGreenBrown = [\n '#f7eccd',\n '#d9cba6',\n '#bcad82',\n '#a29162',\n '#887946',\n '#716330',\n '#5b501f',\n '#51461d',\n '#483d1b',\n '#3f3418',\n '#362b15',\n '#2d2311',\n '#231a0d'\n];\n\nconst paletteSequentialBrown = [\n '#f7eccd',\n '#eed3ab',\n '#e4bb89',\n '#dba269',\n '#ad7446',\n '#834d2c',\n '#5e2f19',\n '#552a18',\n '#4c2516',\n '#432113',\n '#3a1c11',\n '#32180f',\n '#29130b'\n];\n\nconst paletteSequentialGrey = [\n '#e5e8ea',\n '#bdbfc3',\n '#999a9f',\n '#77797f',\n '#595c64',\n '#3e444c',\n '#253038',\n '#20282e',\n '#1a2024',\n '#15181b',\n '#0e1112',\n '#070808',\n '#000000'\n];\n\nconst paletteSequentialVioletCb = [\n '#f4f3f9',\n '#e0dced',\n '#cbc6e0',\n '#b7b0d4',\n '#948cbf',\n '#706baa',\n '#4d4e98',\n '#484889',\n '#42427a',\n '#3d3c6c',\n '#37365e',\n '#313050',\n '#2c2a44'\n];\n\nconst paletteSequentialPinkCb = [\n '#fbe5ee',\n '#f8ccd5',\n '#f4b2bc',\n '#f096a3',\n '#d56976',\n '#bc3f52',\n '#a50f38',\n '#951735',\n '#851b31',\n '#761d2e',\n '#671e2a',\n '#581d26',\n '#4a1c22'\n];\n\nconst paletteSequentialBlueCb = [\n '#eaf6fc',\n '#cfe4f4',\n '#cfe4f4',\n '#91bfe3',\n '#6999bb',\n '#417797',\n '#065b78',\n '#11536b',\n '#174b5f',\n '#194354',\n '#1a3b49',\n '#1a343f',\n '#192d35'\n];\n\nconst paletteSequentialGreenCb = [\n '#fff7d0',\n '#e9e09b',\n '#d1ca62',\n '#b7b623',\n '#9e9e28',\n '#88872a',\n '#72722a',\n '#676726',\n '#5c5c23',\n '#51511f',\n '#47471b',\n '#3d3d17',\n '#333413'\n];\n\nconst paletteSequentialGreenBrownCb = [\n '#f2edde',\n '#d8d1c0',\n '#bfb699',\n '#a09778',\n '#837b5a',\n '#686141',\n '#4f4b2c',\n '#3e3e1f',\n '#2e3313',\n '#292d14',\n '#232613',\n '#1e2012',\n '#191a10'\n];\n\nconst paletteDivergingSpectral1 = [\n '#98141f',\n '#ab332c',\n '#bf5040',\n '#d5705b',\n '#e4a57f',\n '#f3d6a6',\n '#f5f2b8',\n '#cfdbb1',\n '#a4c4a9',\n '#71ada1',\n '#4e868f',\n '#2e637d',\n '#06456c'\n];\n\nconst paletteDivergingSpectral2 = [\n '#d43d4f',\n '#df564b',\n '#eb6d45',\n '#f08e53',\n '#f8b96f',\n '#fee08b',\n '#f5f2b8',\n '#d7e5b1',\n '#b5d7aa',\n '#8ec8a3',\n '#6abda3',\n '#4fa4b5',\n '#3489be'\n];\n\nconst paletteDivergingSpectral3 = [\n '#651035',\n '#ae1143',\n '#c9314b',\n '#dd7257',\n '#eeb27a',\n '#feeb9e',\n '#f5f2b8',\n '#cadfba',\n '#96cabb',\n '#50b4bb',\n '#3eaecc',\n '#206791',\n '#0c2c63'\n];\n\nconst paletteDivergingBrownTurquoise = [\n '#3f3128',\n '#683828',\n '#933624',\n '#d5705b',\n '#db9c5e',\n '#feeb9e',\n '#f5f2b8',\n '#cfdbb1',\n '#a4c4a9',\n '#71ada1',\n '#628f85',\n '#53746d',\n '#475b57'\n];\n\nconst paletteDivergingOrangePink = [\n '#e7511e',\n '#eb6929',\n '#ee7f37',\n '#f29446',\n '#f9c083',\n '#ffe9c3',\n '#ffeee3',\n '#f9cfc1',\n '#f3a9ab',\n '#db6882',\n '#c71360',\n '#891953',\n '#4b1c47'\n];\n\nconst paletteDivergingRedBlue = [\n '#b2172b',\n '#c4443e',\n '#d76a5a',\n '#ed937e',\n '#f4b8a2',\n '#fcdbc7',\n '#efefef',\n '#bfcad5',\n '#8ba7bc',\n '#4d87a5',\n '#3c7ca0',\n '#28729b',\n '#036896'\n];\n\nconst paletteDivergingRedGrey = [\n '#b2172b',\n '#c54532',\n '#da6c3b',\n '#f29446',\n '#f8bc67',\n '#fee08b',\n '#efece5',\n '#c9c5c1',\n '#a5a19f',\n '#808080',\n '#666666',\n '#333333',\n '#000000'\n];\n\nconst paletteDivergingOrangeViolet = [\n '#98141f',\n '#ab332c',\n '#f9bc47',\n '#fdcf66',\n '#fede8d',\n '#ffecb3',\n '#f9eff6',\n '#e8d0e3',\n '#a4c4a9',\n '#a973aa',\n '#834f96',\n '#622181',\n '#402357'\n];\n\nconst paletteDivergingPurpleGreen = [\n '#59194b',\n '#85134b',\n '#c71360',\n '#db6882',\n '#eba7a8',\n '#fce0ca',\n '#faefe1',\n '#dbd9aa',\n '#b9c26e',\n '#94ad31',\n '#728b2b',\n '#546c25',\n '#39521f'\n];\n\nconst paletteDivergingVioletGreen = [\n '#55296e',\n '#75408e',\n '#8a5fa0',\n '#a081b5',\n '#beadcf',\n '#ddd7e7',\n '#eae8ed',\n '#c1d4bc',\n '#93be86',\n '#58a951',\n '#3c853e',\n '#23662f',\n '#084a22'\n];\n\nconst paletteDivergingRedGreen = [\n '#b2172b',\n '#c5403c',\n '#d96453',\n '#ef8972',\n '#f6b49c',\n '#fcdbc7',\n '#f9ebde',\n '#dad6a8',\n '#b9c16d',\n '#94ad31',\n '#728b2b',\n '#546c25',\n '#39521f'\n];\n\nconst paletteDivergingBrownGreen = [\n '#735146',\n '#846454',\n '#977a65',\n '#aa9177',\n '#c2ad91',\n '#dbcaad',\n '#edebd6',\n '#c4d6aa',\n '#94bf7c',\n '#58a951',\n '#3c853e',\n '#23662f',\n '#084a22'\n];\n\nconst paletteDivergingLightBrownTurquoise = [\n '#8b5219',\n '#a46821',\n '#bf812c',\n '#cfa151',\n '#e2c489',\n '#f6e8c3',\n '#f5f1df',\n '#cbdccc',\n '#9cc6b9',\n '#60afa6',\n '#359790',\n '#1d7d75',\n '#00665e'\n];\n\n\nexport function category1() {\n return scaleOrdinal().range(paletteCategory1);\n}\n\nexport function category2() {\n return scaleOrdinal().range(paletteCategory2);\n}\n\nexport function category3() {\n return scaleOrdinal().range(paletteCategory3);\n}\n\nexport function category4() {\n return scaleOrdinal().range(paletteCategory4);\n}\n\nexport function category5() {\n return scaleOrdinal().range(paletteCategory5);\n}\n\nexport function category6() {\n return scaleOrdinal().range(paletteCategory6);\n}\n\nexport function category7() {\n return scaleOrdinal().range(paletteCategory7);\n}\n\nexport function category8() {\n return scaleOrdinal().range(paletteCategory8);\n}\n\nexport function sequentialYellow() {\n return scaleQuantile().range(paletteSequentialYellow);\n}\n\nexport function sequentialRedOrange() {\n return scaleQuantile().range(paletteSequentialRedOrange);\n}\n\nexport function sequentialRed() {\n return scaleQuantile().range(paletteSequentialRed);\n}\n\nexport function sequentialPink() {\n return scaleQuantile().range(paletteSequentialPink);\n}\n\nexport function sequentialPurplePink() {\n return scaleQuantile().range(paletteSequentialPurplePink);\n}\n\nexport function sequentialPurple() {\n return scaleQuantile().range(paletteSequentialPurple);\n}\n\nexport function sequentialBlue() {\n return scaleQuantile().range(paletteSequentialBlue);\n}\n\nexport function sequentialLightBlue() {\n return scaleQuantile().range(paletteSequentialLightBlue);\n}\n\nexport function sequentialBlueViolet() {\n return scaleQuantile().range(paletteSequentialBlueViolet);\n}\n\nexport function sequentialTurquoise() {\n return scaleQuantile().range(paletteSequentialTurquoise);\n}\n\nexport function sequentialLightGreen() {\n return scaleQuantile().range(paletteSequentialLightGreen);\n}\n\nexport function sequentialDarkGreen() {\n return scaleQuantile().range(paletteSequentialDarkGreen);\n}\n\nexport function sequentialGreenBrown() {\n return scaleQuantile().range(paletteSequentialGreenBrown);\n}\n\nexport function sequentialBrown() {\n return scaleQuantile().range(paletteSequentialBrown);\n}\n\nexport function sequentialGrey() {\n return scaleQuantile().range(paletteSequentialGrey);\n}\n\nexport function sequentialVioletCb() {\n return scaleQuantile().range(paletteSequentialVioletCb);\n}\n\nexport function sequentialPinkCb() {\n return scaleQuantile().range(paletteSequentialPinkCb);\n}\n\nexport function sequentialBlueCb() {\n return scaleQuantile().range(paletteSequentialBlueCb);\n}\n\nexport function sequentialGreenCb() {\n return scaleQuantile().range(paletteSequentialGreenCb);\n}\n\nexport function sequentialGreenBrownCb() {\n return scaleQuantile().range(paletteSequentialGreenBrownCb);\n}\n\nexport function diverging_spectral1() {\n return scaleQuantile().range(paletteDivergingSpectral1);\n}\n\nexport function diverging_spectral2() {\n return scaleQuantile().range(paletteDivergingSpectral2);\n}\n\nexport function diverging_spectral3() {\n return scaleQuantile().range(paletteDivergingSpectral3);\n}\n\nexport function diverging_brown_turquoise() {\n return scaleQuantile().range(paletteDivergingBrownTurquoise);\n}\n\nexport function diverging_orange_pink() {\n return scaleQuantile().range(paletteDivergingOrangePink);\n}\n\nexport function diverging_red_blue() {\n return scaleQuantile().range(paletteDivergingRedBlue);\n}\n\nexport function diverging_red_grey() {\n return scaleQuantile().range(paletteDivergingRedGrey);\n}\n\nexport function diverging_orange_violet() {\n return scaleQuantile().range(paletteDivergingOrangeViolet);\n}\n\nexport function diverging_purple_green() {\n return scaleQuantile().range(paletteDivergingPurpleGreen);\n}\n\nexport function diverging_violet_green() {\n return scaleQuantile().range(paletteDivergingVioletGreen);\n}\n\nexport function diverging_red_green() {\n return scaleQuantile().range(paletteDivergingRedGreen);\n}\n\nexport function diverging_brown_green() {\n return scaleQuantile().range(paletteDivergingBrownGreen);\n}\n\nexport function diverging_lightBrown_turquoise() {\n return scaleQuantile().range(paletteDivergingLightBrownTurquoise);\n}","/**\n * \n * A Datasource is the name given to the connection set up to a data endpoint. This class defines the common methods for the datasources,\n * such as start() and stop().\n * \n * @export Default export: Datasource class\n * \n * @class Datasource The Datasource class\n * \n */\nexport default class Datasource {\n /**\n * Creates an instance of Datasource.\n * \n * \n * @memberOf Datasource\n \n */\n constructor() {\n this.filters = [];\n this.properties = [];\n }\n\n /**\n * Starts the stream of data\n * \n * \n * @memberOf Datasource\n */\n start() {\n window.console.log('Starting datasource');\n }\n\n /**\n * \n * If started, this method stops the stream of data\n * \n * @memberOf Datasource\n \n */\n stop() {\n window.console.log('Stopping datasource');\n }\n\n\n property(prop, newProp, cast) {\n this.properties.push({ 'p': prop, 'newP': newProp, cast: cast });\n return this;\n }\n\n\n convert(data) {\n let result = {};\n for (let i in this.properties) {\n let p = this.properties[i].p;\n let value = eval('data.' + this.properties[i].newP);\n // if(this.properties[i].cast){\n // value = new this.properties[i].cast(value);\n // }\n\n result[p] = value;\n }\n return result;\n }\n\n /**\n * Filters the incoming messages. Each data record that do not comply the filter condition will be discarded\n * \n * @param {any} filter A filter condition\n * @returns this Datasource instance\n * \n * @memberOf Datasource\n */\n filter(filter) {\n return this;\n }\n}","import Datasource from './Datasource';\nimport {request} from 'd3';\n\n/**\n * \n * This datasource set up a connection to a http server. \n * @export\n * @class HTTPDatasource\n * @extends {Datasource}\n\n */\nexport default class HTTPDatasource extends Datasource {\n\n /**\n * Creates an instance of HTTPDatasource. This datasource will try to connect to the speficied HTTP endpoint.\n *
\n     *    var source = {\n     *      endpoint: 'https://randomuser.me/api';\n     *    };\n     * \n     *    linechart = new proteic.Linechart(new proteic.HTTPwDatasource(source));\n     * 
\n * \n * If new data is available, this datasource will forward the data records to the chart, which automatically repaint the chart with these new records. \n * @param {any} source An http endpoint. If invalid, this class will throw an Error. \n * \n * @memberOf HTTPDatasource\n \n */\n constructor(source) {\n super();\n this.source = source;\n this.intervalId = -1;\n this.started = false;\n }\n\n /**\n * Configure a dispatcher for this datasource.\n * \n * @param {any} dispatcher A d3 dispatcher. This dispatcher is in charge of receiving and sending events.\n * \n * @memberOf HTTPDatasource\n */\n configure(dispatcher) {\n this.dispatcher = dispatcher;\n }\n\n /**\n * \n * Initialize an HTTP connection\n * \n * @memberOf HTTPDatasource\n \n */\n start() {\n if (!this.started) {\n super.start();\n let pollingTime = this.source.pollingTime;\n let url = this.source.url;\n this._startPolling(url, pollingTime);\n this.started = true;\n }\n }\n\n\n _startPolling(url, time = 1000) {\n let interval = window.setInterval;\n this.intervalId = interval(() => this._startRequest(url), time);\n }\n\n _startRequest(url) {\n\n window.console.log('url', url);\n request(url).get((e, response) => this._handleResponse(response));\n }\n\n _stopPolling() {\n let clearInterval = window.clearInterval;\n clearInterval(this.intervalId);\n }\n\n _handleResponse(xmlHttpRequest) {\n let parseJson = window.JSON.parse;\n if (xmlHttpRequest.readyState === 4 && xmlHttpRequest.status === 200) {\n let response = parseJson(xmlHttpRequest.response);\n this._handleOK(response);\n }\n else {\n this._handleError(xmlHttpRequest);\n }\n }\n\n _handleOK(data) {\n if(this.properties.length > 0 ) {\n data = this.convert(data);\n }\n this.dispatcher.call('onmessage', this, data);\n }\n\n _handleError(data) {\n this.dispatcher.call('onerror', this, data);\n }\n\n /**\n * If started, this method close the HTTP connection.\n * \n * @memberOf HTTPDatasource\n * */\n stop() {\n if (this.started) {\n this._stopPolling();\n this.started = false;\n }\n }\n}","import Datasource from './Datasource';\n\n/**\n * \n * This datasource set up a connection to a websocket server. \n * @export\n * @class WebsocketDatasource\n * @extends {Datasource}\n\n */\nexport default class WebsocketDatasource extends Datasource {\n\n /**\n * Creates an instance of WebsocketDatasource. This datasource will try to connect to the speficied websocket endpoint.\n *
\n     *    var source = {\n     *      endpoint: 'ws://192.168.3.32:3000/pathToWebsocketEndpoint';\n     *    };\n     * \n     *    linechart = new proteic.Linechart(new proteic.WebsocketDatasource(source));\n     * 
\n * \n * If new data is available, this datasource will forward the data records to the chart, which automatically repaint the chart with these new records. \n * @param {any} source A websocket endpoint. If invalid, this class will throw an Error. \n * \n * @memberOf WebsocketDatasource\n \n */\n constructor(source) {\n super();\n this.source = source;\n }\n \n /**\n * Configure a dispatcher for this datasource.\n * \n * @param {any} dispatcher A d3 dispatcher. This dispatcher is in charge of receiving and sending events.\n * \n * @memberOf WebsocketDatasource\n */\n configure(dispatcher) {\n this.dispatcher = dispatcher;\n }\n\n /**\n * \n * Initialize a websocket connection\n * \n * @memberOf WebsocketDatasource\n \n */\n start() {\n super.start();\n this.ws = new window.WebSocket(this.source.endpoint);\n\n this.ws.onopen = (e) => {\n this.dispatcher.call('onopen', this, e);\n };\n this.ws.onerror = (e) => {\n throw new Error('An error occurred trying to reach the websocket server' + e);\n //this.dispatcher.call('onerror', this, e);\n };\n this.ws.onmessage = (e) => {\n var data = JSON.parse(e.data);\n this.dispatcher.call('onmessage', this, data);\n };\n }\n /**\n * If started, this method close the websocket connection.\n * \n * @memberOf WebsocketDatasource\n * */\n stop() {\n super.stop();\n if (this.ws) {\n this.ws.close();\n }\n }\n}","import * as Colors from '../colors';\n\nexport const defaults = {\n selector: '#chart',\n colorScale: Colors.category7(),\n //Area\n areaOpacity: 0.4,\n\n //Axes\n xAxisType: 'linear',\n xAxisFormat: '',\n xAxisLabel: null,\n yAxisType: 'linear',\n yAxisFormat: '',\n yAxisLabel: null,\n //margins\n marginTop: 20,\n marginRight: 250,\n marginBottom: 130,\n marginLeft: 150,\n //markers\n markerShape: 'circle',\n markerSize: 5,\n markerOutlineWidth: 2,\n //Width & height\n width: '100%', // %, auto, or numeric\n height: 250,\n //Events\n onDown(d) {\n },\n onHover(d) {\n },\n onLeave(d) {\n },\n onClick(d) {\n },\n\n maxNumberOfElements: 100, // used by keepDrawing method to reduce the number of elements in the current chart\n};","import {select} from 'd3';\n\nexport class SvgContainer {\n\n constructor(config) {\n this._config = config;\n this.svg = this._initializeSvgContainer(config);\n this.components = Array();\n }\n\n _initializeSvgContainer(config) {\n let selector = config.selector,\n width = config.width + config.marginLeft + config.marginRight,\n height = config.height + config.marginTop + config.marginBottom,\n svg = null;\n\n svg = select(selector)\n .append('svg:svg')\n .attr('width', width)\n .attr('height', height)\n .append('g')\n .attr('class', 'chartContainer')\n .attr('transform', 'translate(' + config.marginLeft + ',' + config.marginTop + ')');\n\n return svg;\n }\n\n\n add(component, render = true) {\n this.components.push(component);\n\n if (render) {\n component.render(this.svg, this._config);\n }\n return this;\n }\n\n transform(translation) {\n this.svg.attr('transform', translation);\n\n }\n}","\nexport function isArray(d) {\n return d && d.constructor === Array && d instanceof Array;\n}\n\nexport function isObject(d) {\n return d && d.constructor === Object && d instanceof Object;\n}\n\nexport function isFunction(func) {\n return func && {}.toString.call(func) === '[object Function]';\n}\n\nexport function isNumeric(n) {\n return !isNaN(parseFloat(n)) && isFinite(n);\n}\n\nexport function isEven(n) {\n return n % 2 === 0;\n}\n\nexport function isPercentage(n) {\n let split = null;\n let number = null;\n if (!n || typeof n !== 'string') {\n return false;\n }\n split = n.split('%');\n number = (+split[0]);\n return split.length === 2 &&\n (number >= 0) &&\n (number <= 100);\n}\n\nexport function keys(array, field) {\n var keys = new Set();\n var element = null;\n\n if (!array || !array.length) {\n return [];\n }\n\n for (let i = 0; i < array.length; i++) {\n element = field ? array[i][field] : array[i];\n if (element) {\n keys.add(element);\n }\n }\n return keys;\n}\n\n\nexport function sortBy(array, o) {\n var _toString = Object.prototype.toString;\n var _parser = (x) => { return x; };\n var _getItem = (x) => {\n return _parser((x !== null && typeof x === 'object' && x[o.prop]) || x);\n };\n\n if (!(array instanceof Array) || !array.length) {\n return [];\n }\n if (_toString.call(o) !== '[object Object]') {\n o = {};\n }\n if (typeof o.parser !== 'function') {\n o.parser = _parser;\n }\n o.desc = o.desc ? -1 : 1;\n return array.sort((a, b) => {\n a = _getItem.call(o, a);\n b = _getItem.call(o, b);\n return o.desc * (a < b ? -1 : +(a > b));\n });\n}\n\nexport function findElement(arr, propName, propValue) {\n for (var i = 0; i < arr.length; i++) {\n if (arr[i][propName] === propValue) {\n return arr[i];\n }\n }\n return null;\n // will return null if not found; you could return a default instead\n}\n\nexport function deg2rad(deg) {\n return deg * Math.PI / 180;\n}","import {\n isNumeric, isPercentage\n} from './functions';\n\nimport { select } from 'd3';\n\nexport function calculateWidth(widthConfig, selector) {\n if (widthConfig === 'auto') {\n return select(selector)\n .node()\n .getBoundingClientRect()\n .width;\n }\n else if (isNumeric(widthConfig)) {\n return widthConfig;\n }\n else if (isPercentage(widthConfig)) {\n let containerWidth, percentage;\n containerWidth = select(selector)\n .node()\n .getBoundingClientRect()\n .width;\n percentage = widthConfig.split('%')[0];\n return Math.round(percentage * containerWidth / 100);\n } else {\n throw Error('Unknow config width value: ' + widthConfig);\n }\n}\n","import { SvgContainer } from '../components/svgContainer';\nimport { calculateWidth } from '../../utils/screen';\n\nexport class SvgAxis {\n /**\n * Creates an instance of SvgAxis.\n * \n * @param {any} context Chart context. It contains data, configuration and chart type\n * \n * @memberOf SvgAxis\n \n */\n constructor(context) {\n this._loadConfig(context.config);\n this.svgContainer = new SvgContainer(this.config);\n }\n\n changeConfigProperty(p, v) {\n this.config[p] = v;\n if (p === 'width' || p === 'height') {\n this.config.needRescaling = true;\n }\n }\n\n rescale(width = this.config.width, height = this.config.height) {\n this.axes.rescale(width, height);\n this.config.needRescaling = false;\n }\n\n /**\n * \n * Load the configuration context. It creates a configuration global from the parameters specified by users.\n * If any parameter is empty, this will be replaced by its default option \n * \n * @param {any} config User configuration\n * @param {any} defaults Defaults values for this chart\n * \n * @memberOf SvgAxis\n \n */\n _loadConfig(config, defaults) {\n this.config = {};\n //Selector\n this.config.selector = config.selector || defaults.selector;\n //Margins \n this.config.marginTop = config.marginTop || defaults.marginTop;\n this.config.marginLeft = config.marginLeft || defaults.marginLeft;\n this.config.marginRight = config.marginRight || defaults.marginRight;\n this.config.marginBottom = config.marginBottom || defaults.marginBottom;\n //Width & height\n this.config.width = config.width\n ? calculateWidth(config.width, this.config.selector) - this.config.marginLeft - this.config.marginRight\n : calculateWidth(defaults.width, this.config.selector) - this.config.marginLeft - this.config.marginRight;\n this.config.height = config.height || defaults.height;\n //Axis\n this.config.xAxisType = config.xAxisType || defaults.xAxisType;\n this.config.xAxisFormat = config.xAxisFormat || defaults.xAxisFormat;\n this.config.xAxisLabel = config.xAxisLabel || defaults.xAxisLabel;\n this.config.yAxisType = config.yAxisType || defaults.yAxisType;\n this.config.yAxisFormat = config.yAxisFormat || defaults.yAxisFormat;\n this.config.yAxisLabel = config.yAxisLabel || defaults.yAxisLabel;\n //Color\n this.config.colorScale = config.colorScale || defaults.colorScale;\n //Events\n this.config.onDown = config.onDown || defaults.onDown;\n this.config.onUp = config.onUp || defaults.onUp;\n this.config.onHover = config.onHover || defaults.onHover;\n this.config.onClick = config.onClick || defaults.onClick;\n this.config.onLeave = config.onLeave || defaults.onLeave;\n }\n\n}","import {isEven} from '../../utils/functions';\nimport {select, scaleTime, scaleLinear, scaleBand, axisBottom, format as d3Format} from 'd3';\n\nexport class XAxis {\n constructor(xAxisType, config) {\n if (config === null) {\n throw new Error('No chart context specified for XAxis');\n }\n\n this.xAxis = this._initializeXAxis(xAxisType, config);\n }\n\n\n rescale(width, height) {\n this.xAxis.scale().range([0, width]);\n }\n\n _initializeXAxis(xAxisType = 'linear', config) {\n let x = null,\n axis = null;\n\n // switch (xAxisType) {\n // case 'time':\n // x = scaleTime().range([0, config.width]);\n // break;\n // case 'linear':\n // x = scaleLinear().range([0, config.width]);\n // break;\n // case 'categorical':\n // x = scaleBand().rangeRound([0, config.width])\n // .padding(0.1)\n // .align(0.5);\n // break;\n // default:\n // throw new Error('Not allowed type for XAxis. Only allowed \"time\", \"linear\" or \"categorical\". Got: ' + xAxisType);\n // }\n\n switch (xAxisType) {\n case 'time':\n x = scaleTime().range([0, config.width]);\n axis = axisBottom(x);\n break;\n case 'linear':\n x = scaleLinear().range([0, config.width]);\n axis = axisBottom(x).tickFormat(d3Format(config.xAxisFormat));\n break;\n case 'categorical':\n x = scaleBand().rangeRound([0, config.width])\n .padding(0.1)\n .align(0.5);\n axis = axisBottom(x);\n break;\n default:\n throw new Error('Not allowed type for XAxis. Only allowed \"time\", \"linear\" or \"categorical\". Got: ' + xAxisType);\n }\n\n return axisBottom(x);\n }\n\n transition(svg, time = 200) {\n svg.selectAll('.x.axis').transition().duration(time).call(this.xAxis).on('end', this.xStyle);\n }\n\n xStyle() {\n select(this).selectAll('g.tick text')\n .style('font', '1.4em Montserrat, sans-serif')\n .style('fill', (d, i) => !isEven(i) || i === 0 ? '#5e6b70' : '#1a2127')\n .style('fill', (d) => '#1a2127')\n\n\n select(this).selectAll(['path', 'line'])\n .attr('stroke', 'gray')\n .attr('stroke-width', .3);\n\n }\n\n /**\n * This function is used when both x and y dial update their domains by x and y max/min values, respectively.\n */\n updateDomainByBBox(b) {\n let x = this.xAxis.scale();\n x.domain([b[0], b[1]]);\n }\n\n /**\n * Used when x domain is caterogial (a set of keys) and y domain is linear.\n */\n updateDomainByKeys(keys, yBbox) {\n let x = this.xAxis.scale();\n x.domain(keys);\n }\n\n render(svg, config) {\n let xAxis = this.xAxis,\n width = config.width,\n height = config.height;\n svg\n .append('g')\n .attr('class', 'x axis')\n .attr('transform', 'translate(0,' + config.height + ')')\n .call(xAxis);\n\n svg\n .append('text')\n .attr('class', 'xaxis-title')\n .attr(\"text-anchor\", \"middle\")\n .attr('x', width / 2)\n .attr('y', height + 40)\n .text(config.xAxisLabel)\n .style('font', '0.8em Montserrat, sans-serif');\n\n this.svg = svg;\n }\n}","import {isEven} from '../../utils/functions';\nimport {select, scaleLinear, scaleBand, axisLeft, format as d3Format} from 'd3';\n\nexport class YAxis {\n constructor(yAxisType, config) {\n if (config === null) {\n throw new Error('No chart context specified for XAxis');\n }\n\n this.yAxis = this._initializeYAxis(yAxisType, config);\n }\n\n rescale(width, height) {\n this.yAxis.tickSizeInner(-width);\n }\n\n _initializeYAxis(yAxisType = 'linear', config) {\n let y = null,\n axis = null;\n switch (yAxisType) {\n case 'linear':\n y = scaleLinear().range([config.height, 0]);\n axis = axisLeft(y).tickFormat(d3Format(config.yAxisFormat));\n break;\n case 'categorical':\n y = scaleBand().rangeRound([config.height, 0])\n .padding(0.1)\n .align(0.5);\n axis = axisLeft(y);\n break;\n default:\n throw new Error('Not allowed type for YAxis. Only allowed \"time\", \"linear\" or \"categorical\". Got: ' + yAxisType);\n }\n\n return axis.tickSizeInner(-config.width)\n .tickSizeOuter(0)\n .tickPadding(20);\n }\n\n // _initializeYAxis(yAxisType = 'linear', config) {\n // let y = null,\n // yAxis = null;\n //\n // switch (yAxisType) {\n // case 'linear':\n // y = scaleLinear().range([config.height, 0]);\n // break;\n // case 'categorical':\n // y = scaleBand().rangeRound([config.height, 0])\n // .padding(0.1)\n // .align(0.5);\n // break;\n // default:\n // throw new Error('Not allowed type for YAxis. Only allowed \"time\", \"linear\" or \"categorical\". Got: ' + yAxisType);\n // }\n // return axisLeft(y)\n // .tickSizeInner(-config.width)\n // .tickSizeOuter(0)\n // .tickPadding(20)\n // .tickFormat((d) => d)\n // .ticks(config.yticks, config.tickLabel);\n // }\n\n transition(svg, time = 200) {\n svg.selectAll('.y.axis').transition().duration(time).call(this.yAxis).on('end', this.yStyle);\n }\n\n yStyle() {\n select(this).selectAll('g.tick text')\n .style('font', '1.4em Montserrat, sans-serif')\n .style('fill', (d, i) => !isEven(i) || i === 0 ? '#5e6b70' : '#1a2127');\n select(this).selectAll('g.tick line')\n .style('stroke', (d, i) => isEven(i) && i !== 0 ? '#5e6b70' : '#dbdad8');\n }\n\n updateDomainByBBox(b) {\n let y = this.yAxis.scale();\n y.domain(b);\n }\n\n updateDomainByKeys(keys) {\n let y = this.yAxis.scale();\n y.domain(keys);\n }\n\n render(svg, config) {\n let yAxis = this.yAxis,\n width = config.width,\n height = config.height;\n svg\n .append('g')\n .attr('class', 'y axis')\n .attr('stroke-dasharray', '1, 5')\n .call(yAxis);\n\n svg\n .append('text')\n .attr('class', 'yaxis-title')\n .attr(\"transform\", \"rotate(-90)\")\n .attr(\"text-anchor\", \"middle\")\n .attr('x', 0 - height / 2)\n .attr('y', 0 - 55)\n .text(config.yAxisLabel)\n .style('font', '0.8em Montserrat, sans-serif');\n\n }\n}","import {XAxis} from './xAxis'\nimport {YAxis} from './yAxis'\n\nexport class XYAxes {\n constructor(xAxisType, yAxisType, config) {\n if (config === null) {\n throw new Error('No chart context specified for XAxis');\n }\n\n this.x = new XAxis(xAxisType, config);\n this.y = new YAxis(yAxisType, config);\n }\n\n transition(svg, time = 200) {\n this.x.transition(svg, time);\n this.y.transition(svg, time);\n }\n\n /**\n * This function is used when both x and y dial update their domains by x and y max/min values, respectively.\n */\n updateDomainByBBox(b) {\n this.x.updateDomainByBBox([b[0], b[1]]);\n this.y.updateDomainByBBox([b[2], b[3]]);\n }\n\n /**\n * Used when x domain is caterogial (a set of keys) and y domain is linear.\n */\n updateDomainByKeysAndBBox(keys, bbox) {\n this.x.updateDomainByKeys(keys);\n this.y.updateDomainByBBox(bbox);\n }\n\n updateDomainByBBoxAndKeys(bbox, keys){\n this.x.updateDomainByBBox(bbox);\n this.y.updateDomainByKeys(keys);\n }\n \n render(svg, config) {\n this.x.render(svg, config);\n this.y.render(svg, config);\n }\n \n rescale(width, height){\n this.x.rescale(width, height);\n this.y.rescale(width, height);\n }\n}","import {line, nest} from 'd3';\n\nexport class Lineset {\n constructor(x, y) {\n this.xAxis = x.xAxis;\n this.yAxis = y.yAxis;\n this.lineGenerator = line()\n .x((d) => this.xAxis.scale()(d.x))\n .y((d) => this.yAxis.scale()(d.y));\n }\n\n update(svg, config, data) {\n let dataSeries = nest().key((d) => d.key).entries(data),\n series = null,\n lines = null,\n colorScale = config.colorScale;\n\n svg.selectAll('g.serie').remove();\n\n series = svg.selectAll('g.serie');\n lines = series\n .data(dataSeries, (d) => d.key)\n .enter()\n .append('g')\n .attr('class', 'serie')\n .attr('stroke', (d, i) => colorScale(i))\n .append('svg:path')\n .style('stroke', (d, i) => colorScale(i))\n .style('stroke-width', 1.3)\n .style('fill', 'none')\n .attr('d', (d) => this.lineGenerator(d.values))\n .attr('class', 'line');\n\n this.svg = svg;\n }\n\n render(svg, config) {\n //Do nothing, since lines render only when new data is received.\n }\n}","import {nest} from 'd3';\n\nexport class Legend {\n constructor() {}\n\n update(svg, config, data) {\n let dataSeries = nest()\n .key((d) => d.key)\n .entries(data),\n legend = null,\n entries = null,\n colorScale = config.colorScale,\n height = config.height,\n width = config.width;\n\n if(dataSeries.length === 1 && dataSeries[0].key === 'undefined'){\n console.warn('Not showing legend, since there is a valid key');\n return;\n }\n \n svg.selectAll('g.legend').remove();\n \n legend = svg.append('g').attr('class', 'legend');\n entries = legend.selectAll('.legend-entry')\n .data(dataSeries, (d) => d.key)\n .enter()\n .append('g')\n .attr('class', 'legend-entry');\n\n\n entries.append('rect')\n .attr('x', width + 10)\n .attr('y', (d, i) => i * 25)\n .attr('height', 20)\n .attr('width', 20)\n .attr('fill', (d, i) => colorScale(i))\n .style('opacity', 0.8);\n\n entries.append('text')\n .attr(\"x\", width + 25 + 10)\n .attr(\"y\", (d, i) => i * 25 + 7)\n .attr(\"dy\", \"0.55em\")\n .text((d) => d.key)\n .style('font', '14px Montserrat, sans-serif');\n\n }\n\n render(svg, config) {\n //Do nothing, since legend render only when new data is received.\n }\n}","import {nest} from 'd3';\n\nexport class Areaset {\n constructor(x, y) {\n this.xAxis = x.xAxis;\n this.yAxis = y.yAxis;\n }\n\n update(svg, config, data) {\n let dataSeries = nest()\n .key((d) => d.key)\n .entries(data);\n\n let series = null\n , areas = null\n , area = config.area\n , colorScale = config.colorScale\n , height = config.height\n , areaOpacity = config.areaOpacity;\n\n let areaGenerator = d3.area()\n .x((d) => this.xAxis.scale()(d.x))\n .y0(height)\n .y1((d) => this.yAxis.scale()(d.y));\n\n svg.selectAll('g.area').remove();\n\n series = svg.selectAll('g.area');\n areas = series\n .data(dataSeries, (d) => d.key)\n .enter()\n .append('g')\n .attr('class', 'area')\n .append('svg:path')\n .style('fill', (d, i) => colorScale(i))\n .style('fill-opacity', areaOpacity)\n .attr('d', (d) => areaGenerator(d.values));\n\n // series\n // .insert('path', ':first-child') //if not :first-child, area overlaps markers.\n // .attr('class', 'area')\n // .data(dataSeries)\n // .style('stroke', (d, i) => colorScale(i))\n // .style('fill', (d, i) => colorScale(i))\n // .style('fill-opacity', areaOpacity)\n // .attr('d', (d) => areaGenerator(d.values));\n\n this.svg = svg;\n }\n\n render(svg, config) {\n //Do nothing, since areas render only when new data is received.\n }\n}","import {nest} from 'd3';\n\nexport class Pointset {\n constructor(x, y) {\n this.xAxis = x.xAxis;\n this.yAxis = y.yAxis;\n }\n update(svg, config, data) {\n let dataSeries = nest()\n .key((d) => d.key)\n .entries(data),\n markers = null,\n markerShape = config.markerShape,\n markerSize = config.markerSize,\n markerOutlineWidth = config.markerOutlineWidth,\n colorScale = config.colorScale,\n points = null,\n series = null;\n\n svg.selectAll('g.points').remove();\n\n series = svg.selectAll('g.points');\n\n switch (markerShape) {\n case 'dot':\n points = series\n .data(dataSeries, (d) => d.key)\n .enter()\n .append('g')\n .attr('class', 'points')\n .style('fill', (d, i) => colorScale(i))\n .selectAll('circle')\n .data((d) => d.values)\n .enter()\n .append('circle')\n .attr('cx', (d) => this.xAxis.scale()(d.x))\n .attr('cy', (d) => this.yAxis.scale()(d.y))\n .attr('r', markerSize)\n .attr('class', 'marker');\n break;\n case 'ring':\n window.console.warn('Deprecated \"circle\" marker shape: use \"dot\" or \"ring\" instead');\n points = series\n .data(dataSeries, (d) => d.key)\n .enter()\n .append('g')\n .attr('class', 'points')\n .style('stroke', (d, i) => colorScale(i))\n .selectAll('circle')\n .data((d, i) => d.values)\n .enter()\n .append('circle')\n .attr('cx', (d) => this.xAxis.scale()(d.x))\n .attr('cy', (d) => this.yAxis.scale()(d.y))\n .attr('r', markerSize)\n .attr('class', 'marker')\n .style('fill', 'white')\n .style('stroke-width', markerOutlineWidth);\n break;\n // Deprecated circle option\n case 'circle':\n window.console.warn('Deprecated \"circle\" marker shape: use \"dot\" or \"ring\" instead');\n points = series\n .data(dataSeries, (d) => d.key)\n .enter()\n .append('g')\n .attr('class', 'points')\n .style('stroke', (d, i) => colorScale(i))\n .selectAll('circle')\n .data((d, i) => d.values)\n .enter()\n .append('circle')\n .attr('cx', (d) => this.xAxis.scale()(d.x))\n .attr('cy', (d) => this.yAxis.scale()(d.y))\n .attr('r', markerSize)\n .attr('class', 'lineMarker')\n .style('fill', 'white')\n .style('stroke-width', markerOutlineWidth);\n break;\n default:\n points = series\n .data(dataSeries, (d) => d.key)\n .enter()\n .append('g')\n .attr('class', 'points')\n .style('stroke', (d, i) => colorScale(i))\n .selectAll('circle')\n .data((d, i) => d.values)\n .enter()\n .append('circle')\n .attr('cx', (d) => this.xAxis.scale()(d.x))\n .attr('cy', (d) => this.yAxis.scale()(d.y))\n .attr('r', markerSize)\n .attr('class', 'lineMarker')\n .style('fill', 'white')\n .style('stroke-width', markerOutlineWidth);\n }\n\n markers = svg.selectAll('g.points circle');\n markers\n .on('mousedown.user', config.onDown)\n .on('mouseup.user', config.onUp)\n .on('mouseleave.user', config.onLeave)\n .on('mouseover.user', config.onHover)\n .on('click.user', config.onClick);\n\n //this.interactiveElements = markers;\n }\n\n render(svg, config) {\n //Do nothing, since points render only when new data is received.\n }\n}","import {nest, timeParse} from 'd3';\n\nexport function simple2stacked(data) {\n return nest().key((d) => d.x).rollup((array) => {\n let r = {};\n for (let i = 0; i < array.length; i++) {\n let object = array[i];\n if (object) {\n r[object.key] = object.y;\n }\n }\n return r;\n }).entries(data);\n}\n\nexport function simple2nested(data, key = 'key') {\n return nest().key((d) => d[key]).entries(data);\n}\n\nexport function nested2simple(data) {\n let array = Array();\n for (let i = 0; i < data.length; i++) {\n for (let j = 0; j < data[i].values.length; j++) {\n let key = data[i].key;\n let x = data[i].values[j].x;\n let y = data[i].values[j].y;\n array.push({ key: key, x: x, y: y });\n }\n }\n return array;\n}\n\nexport function simple2Linked(data) {\n var linkedData = { links: [], nodes: [] };\n data.map((d) => d.key === 'link' ? linkedData.links.push(d) : linkedData.nodes.push(d));\n return linkedData;\n}\n\n\nexport function convertPropretiesToTimeFormat(data, properties, format) {\n data.forEach((d) => {\n properties.map((p) => {\n d[p] = timeParse(format)(d[p]);\n });\n });\n}\n\nexport function convertByXYFormat(data, config) {\n data.forEach((d) => {\n //parse x coordinate\n switch (config.xAxisType) {\n case 'time':\n d.x = timeParse(config.xAxisFormat)(d.x);\n break;\n case 'linear':\n d.x = +d.x;\n break;\n }\n //parse Y coordinate\n switch (config.yAxisType) {\n case 'time':\n d.y = timeParse(config.yAxisFormat)(d.y);\n break;\n case 'linear':\n d.y = +d.y;\n break;\n }\n });\n return data;\n}","export function sortByField (array, field){\n array.sort((e1, e2) => {\n var a = e1[field];\n var b = e2[field];\n return (a < b) ? -1 : (a > b) ? 1 : 0; \n });\n}","import { defaults } from '../utils/defaults/linechart';\nimport { SvgAxis } from './base/svgAxis';\nimport { XYAxes } from './components/xyAxes';\nimport { Lineset } from './components/lineset';\nimport { Legend } from './components/legend';\nimport { Areaset } from './components/areaset';\nimport { Pointset } from './components/pointset';\nimport { convertByXYFormat } from '../utils/dataTransformation';\nimport { sortByField } from '../utils/dataSorting';\nimport {min, max} from 'd3';\n\nexport class SvgLinechartStrategy extends SvgAxis {\n\n constructor(context) {\n super(context);\n\n this.axes = new XYAxes(this.config.xAxisType, 'linear', this.config);\n\n this.lines = new Lineset(this.axes.x, this.axes.y);\n this.legend = new Legend();\n\n //Include components in the chart container\n this.svgContainer\n .add(this.axes)\n .add(this.legend)\n .add(this.lines);\n\n if (this._checkArea(this.config)) {\n this.areas = new Areaset(this.axes.x, this.axes.y);\n this.svgContainer.add(this.areas);\n }\n\n if (this._checkMarkers(this.config)) {\n this.points = new Pointset(this.axes.x, this.axes.y);\n this.svgContainer.add(this.points);\n }\n }\n\n\t/**\n\t * Renders a linechart based on data object\n\t * @param {Object} data Data Object. Contains an array with x and y properties.\n\t * \n\t */\n draw(data) {\n let svg = this.svgContainer.svg,\n config = this.config,\n needRescaling = this.config.needRescaling,\n bbox = null;\n\n //Transform data, if needed\n convertByXYFormat(data, config);\n\n //Sort data\n sortByField(data, 'x');\n\n //rescale, if needed.\n if (needRescaling) {\n this.rescale();\n }\n\n\n bbox = this._getDomainBBox(data);\n\n this.axes.updateDomainByBBox(bbox);\n\n //Create a transition effect for dial rescaling\n this.axes.transition(svg, 200);\n\n // Update legend\n this.legend.update(svg, config, data);\n\n //Now update lines\n this.lines.update(svg, config, data);\n\n if (config.areaOpacity > 0) {\n // Update areas\n this.areas.update(svg, config, data);\n }\n\n if (this._checkMarkers(config)) {\n // Update points\n this.points.update(svg, config, data);\n }\n\n }\n\n _getDomainBBox(data) {\n var minX = min(data, (d) => d.x),\n maxX = max(data, (d) => d.x),\n minY = min(data, (d) => d.y),\n maxY = max(data, (d) => d.y);\n return [minX, maxX, minY, maxY];\n }\n\n\n _checkMarkers(config) {\n return config.markerSize > 0;\n }\n _checkArea(config) {\n return config.areaOpacity > 0;\n }\n\n /**\n * This method adds config options to the chart context.\n * @param {Object} config Config object\n */\n _loadConfig(config) {\n super._loadConfig(config, defaults);\n //Markers\n this.config.markerOutlineWidth = config.markerOutlineWidth || defaults.markerOutlineWidth;\n this.config.markerShape = config.markerShape || defaults.markerShape;\n this.config.markerSize = (typeof config.markerSize === 'undefined' || config.markerSize < 0) ? defaults.markerSize : config.markerSize;\n //Area\n this.config.areaOpacity = (typeof config.areaOpacity === 'undefined' || config.markerSize < 0) ? defaults.areaOpacity : config.areaOpacity;\n return this;\n }\n}","import * as Colors from '../colors';\n\nexport const defaults = {\n selector: '#chart',\n colorScale: Colors.category5(),\n //Stacked\n stacked: true,\n //Axes\n xAxisType: 'linear',\n xAxisFormat: '',\n xAxisLabel: null,\n yAxisType: 'linear',\n yAxisFormat: '',\n yAxisLabel: null,\n //margins\n marginTop: 20,\n marginRight: 250,\n marginBottom: 130,\n marginLeft: 150,\n //width & height\n width: '100%',\n height: 350,\n //Events\n onDown(d) {\n },\n onHover(d) {\n },\n onLeave(d) {\n },\n onClick(d) {\n }\n};","import {simple2nested} from '../../utils/dataTransformation'\nimport {select, map, line, scaleBand} from 'd3';\n\nexport class Barset {\n constructor(xAxis, yAxis) {\n this.xAxis = xAxis;\n this.yAxis = yAxis;\n this.lineGenerator = line()\n .x((d) => xAxis.scale()(d.x))\n .y((d) => yAxis.scale()(d.y));\n }\n\n\n update(svg, config, data, method) {\n let bars = null;\n\n if (method === 'stacked') {\n this._updateStacked(svg, config, data);\n } else {\n this._updateGrouped(svg, config, data);\n }\n bars = svg.selectAll('g.serie rect');\n bars\n .on('mousedown.user', config.onDown)\n .on('mouseup.user', config.onUp)\n .on('mouseleave.user', config.onLeave)\n .on('mouseover.user', config.onHover)\n .on('click.user', config.onClick);\n \n /**\n TODO: Add default events?\n bars\n .on('mousedown.default', config.onDown)\n .on('mouseup.default', config.onUp)\n .on('mouseleave.default', function (){ select(this).transition().duration(150).attr('fill-opacity', 1)})\n .on('mouseover.default', function (){ select(this).transition().duration(150).attr('fill-opacity', 0.9)})\n .on('click.default', config.onClick);\n **/\n\n this.interactiveElements = bars;\n }\n\n _updateStacked(svg, config, dataSeries) {\n this._cleanCurrentSeries(svg);\n\n let colorScale = config.colorScale,\n layer = svg.selectAll('.serie').data(dataSeries),\n layerEnter = layer.enter().append('g'),\n layerMerge = null,\n bar = null,\n barEnter = null,\n barMerge = null,\n x = this.xAxis.scale(),\n y = this.yAxis.scale();\n\n layerMerge = layer.merge(layerEnter)\n .attr('class', 'serie')\n .attr('fill', (d, i) => colorScale(i));\n\n bar = layerMerge.selectAll('rect')\n .data((d) => d);\n\n barEnter = bar.enter().append('rect');\n\n barMerge = bar.merge(barEnter)\n .attr(\"x\", (d) => x(d.data.key))\n .attr(\"y\", (d) => y(d[1]))\n .attr(\"height\", (d) => y(d[0]) - y(d[1]))\n .attr(\"width\", x.bandwidth());\n }\n\n\n _updateGrouped(svg, config, data) {\n this._cleanCurrentSeries(svg);\n\n let keys = map(data, (d) => d.key).keys(),\n colorScale = config.colorScale,\n layer = svg.selectAll('.serie').data(data),\n layerEnter = null,\n layerMerge = null,\n bar = null,\n barEnter = null,\n barMerge = null,\n x = this.xAxis.scale(),\n y = this.yAxis.scale(),\n xGroup = scaleBand().domain(keys).range([0, x.bandwidth()]),\n height = config.height;\n\n data = simple2nested(data, 'x');\n\n layer = svg.selectAll('.serie').data(data);\n\n layerEnter = layer.enter().append('g')\n .attr('transform', (d) => 'translate(' + x(d.key) + ')');\n\n layerMerge = layer.merge(layerEnter)\n .attr('class', 'serie')\n .attr('transform', (d) => 'translate(' + x(d.key) + ')');\n\n bar = layerMerge.selectAll('rect')\n .data((d) => d.values);\n\n barEnter = bar.enter().append('rect');\n\n barMerge = bar.merge(barEnter)\n .attr('width', xGroup.bandwidth())\n .attr(\"x\", (d) => xGroup(d.key))\n .attr('fill', (d, i) => colorScale(i))\n .attr(\"y\", (d) => y(d.y))\n .attr(\"height\", (d) => height - y(d.y));\n\n }\n\n _getKeysFromData(data) {\n let keys = [];\n for (let p in data[0]) {\n if (p !== 'total' && p !== 'key') {\n keys.push(p);\n }\n }\n return keys;\n\n }\n\n _cleanCurrentSeries(svg) {\n svg.selectAll('.serie').remove();\n }\n\n render(svg, config) {\n //Do nothing, since bars render only when new data is received.\n }\n}","import {defaults} from '../utils/defaults/barchart';\nimport {SvgAxis} from './base/svgAxis';\nimport {XYAxes} from './components/xyAxes';\nimport {Barset} from './components/barset';\nimport {Legend} from './components/legend';\nimport {simple2stacked} from '../utils/dataTransformation';\nimport {map, stack as d3Stack, stackOrderNone, max} from 'd3';\n\nexport class SvgBarchartStrategy extends SvgAxis {\n\n constructor(context) {\n super(context);\n\n this.axes = new XYAxes('categorical', 'linear', this.config);\n this.bars = new Barset(this.axes.x.xAxis, this.axes.y.yAxis);\n\n this.legend = new Legend();\n\n this.svgContainer\n .add(this.axes)\n .add(this.bars)\n .add(this.legend);\n\n }\n\n\n\t/**\n\t * Renders a barchart based on data object\n\t * @param {Object} data Data Object. Contains an array with x and y properties.\n\t * \n\t */\n draw(data = this.data) { \n let svg = this.svgContainer.svg,\n config = this.config,\n keys = map(data, (d) => d.key).keys(),\n data4stack = simple2stacked(data),\n data4render = null,\n isStacked = this.config.stacked,\n stack = d3Stack().keys(keys)\n .value((d, k) => d.value[k])\n .order(stackOrderNone),\n yMin = 0,\n yMax = 0,\n method = isStacked ? 'stacked' : 'grouped',\n dataSeries = stack(data4stack),\n needRescaling = this.config.needRescaling;\n\n //rescale, if needed.\n if (needRescaling) {\n this.rescale();\n }\n\n\n yMax = isStacked ?\n max(dataSeries, (serie) => max(serie, (d) => d[1])) :\n max(data, (d) => d.y);\n\n this.axes.updateDomainByKeysAndBBox(map(data, (d) => d.x).keys(), [yMin, yMax]);\n this.axes.transition(svg, 200);\n\n data4render = isStacked ? dataSeries : data;\n\n this.bars.update(svg, config, data4render, method);\n\n this.legend.update(svg, config, data);\n\n this.data = data; // TODO: ? \n\n }\n\n\n transition2Stacked() {\n this.config.stacked = true;\n }\n\n transition2Grouped() {\n this.config.stacked = false;\n }\n\n\t/**\n\t * This method adds config options to the chart context.\n\t * @param {Object} config Config object\n\t */\n _loadConfig(config) {\n super._loadConfig(config, defaults);\n //Stacked\n this.config.stacked = typeof (config.stacked) === 'undefined' ? defaults.stacked : config.stacked; return this;\n }\n}","import * as Colors from '../colors';\n\nexport const defaults = {\n selector: '#chart',\n colorScale: Colors.category4(),\n //Axes\n xAxisType: 'time',\n xAxisFormat: '%y/%m/%d',\n xAxisLabel: null,\n yAxisType: 'categorical',\n yAxisFormat: '',\n yAxisLabel: null,\n //margins\n marginTop: 20,\n marginRight: 250,\n marginBottom: 130,\n marginLeft: 150,\n //Width & height\n width: '100%', // %, auto, or numeric \n height: 250,\n //Events\n onDown(d) {\n },\n onHover(d) {\n },\n onLeave(d) {\n },\n onClick(d) {\n },\n\n maxNumberOfElements: 100, // used by keepDrawing method to reduce the number of elements in the current chart\n};","import {\n timeParse,\n curveCardinal,\n area\n} from 'd3';\n\nexport class Streamset {\n constructor(xAxis, yAxis) {\n this.xAxis = xAxis;\n this.yAxis = yAxis;\n\n this.areaGenerator = area()\n .curve(curveCardinal)\n .x((d) => this.xAxis.scale()((timeParse(this.xDataFormat)(d.data.key)))) // TODO: It seems d3.nest() transform Date object in\n .y0((d) => this.yAxis.scale()(d[0]))\n .y1((d) => this.yAxis.scale()(d[1]))\n }\n\n\n update(svg, config, data) {\n let series = null;\n \n //Update date format, used by areaGenerator function due to a problem when nesting with d3.\n this.xDataFormat = config.xAxisFormat;\n \n svg.selectAll('.serie').remove();\n\n series = svg.selectAll('.serie')\n .data(data)\n .enter()\n .append('g')\n .attr('class', 'serie')\n .style('stroke', (d, i) => config.colorScale(i));\n\n series\n .append('path')\n .attr('class', 'layer')\n .attr('d', this.areaGenerator)\n .style('fill', (d, i) => config.colorScale(i));\n\n\n series.exit().remove();\n \n series\n .attr('opacity', 1)\n .on('mousedown.user', config.onDown)\n .on('mouseup.user', config.onUp)\n .on('mouseleave.user', config.onLeave)\n .on('mouseover.user', config.onHover)\n .on('click.user', config.onClick);\n }\n\n render(svg, config) {\n //Do nothing, since lines render only when new data is received.\n }\n}","import {defaults} from '../utils/defaults/streamgraph';\nimport {SvgAxis} from './base/svgAxis';\nimport {XAxis} from './components/xAxis';\nimport {YAxis} from './components/yAxis';\nimport {Streamset} from './components/streamset';\nimport {Legend} from './components/legend';\nimport {simple2stacked} from '../utils/dataTransformation';\nimport {convertPropretiesToTimeFormat} from '../utils/dataTransformation';\nimport {sortByField} from '../utils/dataSorting';\nimport {min, max, map, stack as d3Stack, stackOrderInsideOut, stackOffsetWiggle} from 'd3';\n\nexport class SvgStreamgraphStrategy extends SvgAxis {\n\n constructor(context) {\n super(context);\n\n this.x = new XAxis('time', this.config);\n this.y = new YAxis('linear', this.config);\n\n this.streams = new Streamset(this.x.xAxis, this.y.yAxis);\n\n this.legend = new Legend();\n\n //Include components in the chart container\n this.svgContainer\n .add(this.x)\n .add(this.y, false) //No render y Axis\n .add(this.legend)\n .add(this.streams);\n }\n draw(data) {\n let svg = this.svgContainer.svg,\n config = this.config,\n bbox = null,\n keys = map(data, (d) => d.key).keys(),\n xDataFormat = this.config.xAxisFormat,\n data4stack = simple2stacked(data),\n stack = d3Stack()\n .keys(keys)\n .value((d, k) => d.value[k])\n .order(stackOrderInsideOut)\n .offset(stackOffsetWiggle),\n dataSeries = stack(data4stack),\n needRescaling = this.config.needRescaling;\n \n convertPropretiesToTimeFormat(data, ['x'], xDataFormat);\n \n //Sort data\n sortByField(data, 'x');\n \n //rescale, if needed.\n if (needRescaling) {\n this.rescale();\n }\n \n bbox = this._getDomainBBox(data, dataSeries);\n\n this.x.updateDomainByBBox([bbox[0], bbox[1]]);\n this.y.updateDomainByBBox([bbox[2], bbox[3]]);\n this.x.transition(svg, 200);\n this.y.transition(svg, 200);\n\n // Update legend\n this.legend.update(svg, config, data);\n\n // Update streams\n this.streams.update(svg, config, dataSeries);\n }\n \n _getDomainBBox(data, dataSeries) {\n let minX = min(data, (d) => new Date(d.x)),\n maxX = max(data, (d) => new Date(d.x)),\n minY = min(dataSeries, (serie) => min(serie, (d) => d[0])),\n maxY = max(dataSeries, (serie) => max(serie, (d) => d[1]));\n\n return [minX, maxX, minY, maxY];\n }\n\n\t/**\n\t * This method adds config options to the chart context.\n\t * @param {Object} config Config object\n\t */\n _loadConfig(config) {\n super._loadConfig(config,defaults);\n return this;\n }\n}","import * as Colors from '../colors';\n\nexport const defaults = {\n selector: '#chart',\n colorScale: Colors.category2(),\n //Axes\n xAxisType: 'time',\n xAxisFormat: '%y/%m/%d',\n xAxisLabel: null,\n yAxisType: 'categorical',\n yAxisFormat: '',\n yAxisLabel: null,\n //margins\n marginTop: 20,\n marginRight: 250,\n marginBottom: 130,\n marginLeft: 150,\n //Width & height\n width: '100%', // %, auto, or numeric \n height: 250,\n //Events\n onDown(d) {\n },\n onHover(d) {\n },\n onLeave(d) {\n },\n onClick(d) {\n },\n maxNumberOfElements: 100, // used by keepDrawing method to reduce the number of elements in the current chart\n};","import { defaults } from '../utils/defaults/stackedArea';\nimport { SvgAxis } from './base/svgAxis';\nimport { XYAxes } from './components/xyAxes';\nimport { Streamset } from './components/streamset';\nimport { Legend } from './components/legend';\nimport { simple2stacked } from '../utils/dataTransformation';\nimport { convertPropretiesToTimeFormat } from '../utils/dataTransformation';\nimport { sortByField } from '../utils/dataSorting';\nimport { min, max, map, stack as d3Stack, stackOrderInsideOut, stackOffNone} from 'd3';\n\nexport class SvgStackedAreaStrategy extends SvgAxis {\n\n constructor(context) {\n super(context);\n\n this.axes = new XYAxes('time', 'linear', this.config);\n\n this.streams = new Streamset(this.axes.x.xAxis, this.axes.y.yAxis);\n\n this.legend = new Legend();\n\n //Include components in the chart container\n this.svgContainer\n .add(this.axes)\n .add(this.legend)\n .add(this.streams);\n }\n\n\n draw(data) {\n let svg = this.svgContainer.svg,\n config = this.config,\n bbox = null,\n keys = map(data, (d) => d.key).keys(),\n data4stack = simple2stacked(data),\n xDataFormat = this.config.xAxisFormat,\n stack = d3Stack()\n .keys(keys)\n .value((d, k) => d.value[k])\n .order(stackOrderInsideOut)\n .offset(stackOffNone),\n dataSeries = stack(data4stack),\n needRescaling = this.config.needRescaling;\n\n //rescale, if needed.\n if (needRescaling) {\n this.rescale();\n }\n\n convertPropretiesToTimeFormat(data, ['x'], xDataFormat);\n\n //Sort data\n sortByField(data, 'x');\n\n bbox = this._getDomainBBox(data, dataSeries);\n\n this.axes.updateDomainByBBox(bbox);\n this.axes.transition(svg, 200);\n\n // Update legend\n this.legend.update(svg, config, data);\n\n // Update streams\n this.streams.update(svg, config, dataSeries);\n }\n\n\n _getDomainBBox(data, dataSeries) {\n let minX = min(data, (d) => (d.x)),\n maxX = max(data, (d) => (d.x)),\n minY = min(dataSeries, (serie) => min(serie, (d) => d[0])),\n maxY = max(dataSeries, (serie) => max(serie, (d) => d[1]));\n\n return [minX, maxX, minY, maxY];\n }\n\n\t/**\n\t * This method adds config options to the chart context.\n\t * @param {Object} config Config object\n\t */\n _loadConfig(config) {\n super._loadConfig(config,defaults);\n }\n}","import * as Colors from '../colors';\n\nexport const defaults = {\n selector: '#chart',\n colorScale: Colors.category3(),\n //Axes\n xAxisType: 'time',\n xAxisFormat: '%y/%m/%d',\n xAxisLabel: null,\n yAxisType: 'categorical',\n yAxisFormat: '%s',\n yAxisLabel: null,\n //margins\n marginTop: 20,\n marginRight: 250,\n marginBottom: 30,\n marginLeft: 50,\n //Width & height\n width: '100%', // %, auto, or numeric \n height: 250,\n //Events\n onDown(d) {\n },\n onHover(d) {\n },\n onLeave(d) {\n },\n onClick(d) {\n }\n};","import {simple2nested} from '../../utils/dataTransformation';\nimport {map, scaleBand, extent, scaleLinear} from 'd3';\n\nexport class TimeBoxset {\n\n constructor(xAxis, yAxis) {\n this.xAxis = xAxis;\n this.yAxis = yAxis;\n\n }\n update(svg, config, data) {\n let colorScale = config.colorScale,\n keys = map(data, (d) => d.key).keys(),\n layer = svg.selectAll('.serie').data(data),\n layerEnter = null,\n layerMerge = null,\n box = null,\n boxEnter = null,\n boxMerge = null,\n extLanes = null,\n yLanes = null,\n yLanesBand = scaleBand().range([0, keys.length + 1]).domain(keys),\n x = this.xAxis.scale(),\n y = this.yAxis.scale();\n\n data = simple2nested(data);\n extLanes = extent(data, (d, i) => i);\n yLanes = scaleLinear().domain([extLanes[0], extLanes[1] + 1]).range([0, config.height]);\n\n layer = svg.selectAll('.serie').data(data);\n layerEnter = layer.enter().append('g');\n\n layerMerge = layer.merge(layerEnter)\n .attr('class', 'serie');\n\n\n box = layerMerge.selectAll('rect')\n .data((d) => d.values);\n\n boxEnter = box.enter().append('rect');\n\n boxMerge = box.merge(boxEnter)\n .attr('width', (d) => x(d.end) - x(d.start))\n .attr('x', (d) => x(d.start))\n .attr('y', (d) => y(d.key))\n .attr('fill', (d) => colorScale(parseInt(yLanesBand(d.key))))\n .attr('height', () => 0.8 * yLanes(1));\n\n box = svg.selectAll('g.serie rect');\n \n box\n .on('mousedown.user', config.onDown)\n .on('mouseup.user', config.onUp)\n .on('mouseleave.user', config.onLeave)\n .on('mouseover.user', config.onHover)\n .on('click.user', config.onClick);\n\n }\n\n render(svg, config) {\n //Do nothing, since lines render only when new data is received.\n }\n}","import {defaults} from '../utils/defaults/swimlane';\nimport {SvgAxis} from './base/svgAxis';\nimport {XYAxes} from './components/xyAxes';\nimport {TimeBoxset} from './components/timeBoxset';\nimport {Legend} from './components/legend';\nimport {convertPropretiesToTimeFormat} from '../utils/dataTransformation';\nimport {min, max, map} from 'd3';\n\nexport class SvgSwimlaneStrategy extends SvgAxis {\n\n constructor(context) {\n super(context);\n this.axes = new XYAxes('time', 'categorical', this.config);\n this.boxs = new TimeBoxset(this.axes.x.xAxis, this.axes.y.yAxis);\n this.legend = new Legend();\n\n this.svgContainer\n .add(this.axes)\n .add(this.boxs)\n .add(this.legend);\n }\n\n draw(data) {\n let svg = this.svgContainer.svg,\n config = this.config,\n dataFormat = this.config.xAxisFormat,\n keys = map(data, (d) => d.key).keys(),\n bbox = null,\n needRescaling = this.config.needRescaling;\n\n convertPropretiesToTimeFormat(data, ['start', 'end'], dataFormat);\n \n //rescale, if needed.\n if (needRescaling) {\n this.rescale();\n }\n \n bbox = this._getBBox(data);\n\n this.axes.updateDomainByBBoxAndKeys(bbox, keys);\n this.axes.transition(svg, 200);\n\n this.boxs.update(svg, config, data);\n this.legend.update(svg, config, data);\n\n }\n \n _getBBox(data) {\n return [\n min(data, (d) => (d.start)),\n max(data, (d) => (d.end))\n ];\n }\n\n\n _loadConfig(config) {\n super._loadConfig(config, defaults); \n return this;\n }\n}","import * as Colors from '../colors';\n\nexport const defaults = {\n selector: '#chart',\n colorScale: Colors.diverging_spectral2(),\n invertColorScale: true,\n minLevel: 0,\n maxLevel: 100,\n minAngle: -90,\n maxAngle: 90,\n ringWidth: 50,\n ringMargin: 20,\n labelInset: 10,\n needleNutRadius: 25,\n needleLenghtRatio: 0.8,\n numericIndicator: true,\n label: 'km/h',\n //margins\n marginTop: 20,\n marginRight: 250,\n marginBottom: 30,\n marginLeft: 50,\n //Width & height\n width: '50%', // %, auto, or numeric\n height: 250,\n ticks: 10, // ticks for y dial.\n};","import {deg2rad} from '../../utils/functions';\nimport {scaleLinear, arc, range} from 'd3';\n\nexport class Dial { // TODO tidy\n constructor(axisType, config) {\n if (config === null) {\n throw new Error('No chart context specified for polarAxis');\n }\n\n this.r = (\n (config.width > config.height) ?\n config.height : config.width\n ) / 2;\n this.translation = (() =>\n 'translate(' + this.r + ',' + this.r + ')'\n );\n config.colorScale.domain([0, 1]);\n\n this.scale = scaleLinear()\n .domain([config.minLevel, config.maxLevel])\n .range([0, 1]);\n\n this.scaleMarks = this.scale.ticks(config.ticks);\n\n this.range = config.maxAngle - config.minAngle;\n\n this.arc = arc()\n .innerRadius(this.r - config.ringWidth - config.ringMargin)\n .outerRadius(this.r - config.ringMargin)\n .startAngle((d, i) => {\n var ratio = d * i;\n return deg2rad(config.minAngle + (ratio * this.range));\n })\n .endAngle((d, i) => {\n var ratio = d * (i + 1);\n return deg2rad(config.minAngle + (ratio * this.range));\n });\n\n this.tickData = range(config.ticks)\n .map(() => 1 / config.ticks);\n }\n\n render(svg, config) {\n let labels = null;\n\n // Append the ring\n let arcs = svg.append('g')\n .attr('class', 'arc')\n .attr('transform', this.translation);\n\n // Append the ring sectors\n let arcPaths = arcs.selectAll('path')\n .data(this.tickData)\n .enter().append('path')\n // ID for textPath linking\n .attr('id', (d, i) => 'sector-' + i)\n .attr('d', this.arc);\n\n // Fill colors\n if (config.invertColorScale) {\n arcPaths.attr('fill', (d, i) => config.colorScale(1 - d * i));\n } else {\n arcPaths.attr('fill', (d, i) => config.colorScale(d * i));\n }\n\n // Apend the scale labels\n labels = svg.append('g')\n .attr('class', 'labels')\n .attr('transform', this.translation);\n\n // // Append scale marker labels\n labels.selectAll('text')\n .data(this.scaleMarks)\n .enter().append('text')\n .attr('transform', (d) => {\n let ratio = this.scale(d);\n let newAngle = config.minAngle + (ratio * this.range);\n return 'rotate(' + newAngle + ') translate(0,' + (config.labelInset - this.r) + ')';\n })\n .text((d) => d)\n .style('text-anchor', 'middle')\n .style('font', '18px Montserrat, sans-serif');\n }\n}","import {deg2rad} from '../../utils/functions';\nimport {scaleLinear, arc, range} from 'd3';\n\nexport class DialNeedle { // TODO tidy\n constructor(axisType, config) {\n if (config === null) {\n throw new Error('No chart context specified for polarAxis');\n }\n\n this.r = (\n (config.width > config.height) ?\n config.height : config.width\n ) / 2;\n\n this.needleLen = config.needleLenghtRatio * (this.r);\n\n this.translation = (() =>\n 'translate(' + this.r + ',' + this.r + ')'\n );\n config.colorScale.domain([0, 1]);\n\n this.scale = scaleLinear()\n .domain([config.minLevel, config.maxLevel])\n .range([0, 1]);\n\n this.angleScale = scaleLinear()\n .domain([config.minLevel, config.maxLevel])\n .range([90 + config.minAngle, 90 + config.maxAngle]);\n\n this.scaleMarks = this.scale.ticks(config.ticks);\n\n this.range = config.maxAngle - config.minAngle;\n\n this.arc = arc()\n .innerRadius(this.r - config.ringWidth - config.ringMargin)\n .outerRadius(this.r - config.ringMargin)\n .startAngle((d, i) => {\n let ratio = d * i;\n return deg2rad(config.minAngle + (ratio * this.range));\n })\n .endAngle((d, i) => {\n let ratio = d * (i + 1);\n return deg2rad(config.minAngle + (ratio * this.range));\n });\n\n this.tickData = range(config.ticks)\n .map(() => 1 / config.ticks);\n }\n\n update(svg, config, data, method) {\n let datum = data[data.length - 1];\n\n this.needle\n .transition()\n .attr('transform', (d) => `translate(${this.r}, ${this.r}) rotate(${this.angleScale(datum.value) - 90})`)\n .attr('d', `M ${0 - config.needleNutRadius} ${0} L ${0} ${0 - this.needleLen} L ${config.needleNutRadius} ${0}`);\n }\n\n render(svg, config) {\n // Update the needle\n this.needle = svg.append('path')\n .attr('class', 'needle')\n .datum(0)\n .attr('transform', (d) => `translate(${this.r}, ${this.r}) rotate(${this.angleScale(d) - 90})`)\n .attr('d', `M ${0 - config.needleNutRadius} ${0} L ${0} ${0 - this.needleLen} L ${config.needleNutRadius} ${0}`)\n .style('fill', '#666666');\n\n // Append needle nut\n svg.append('circle')\n .attr('class', 'needle')\n .attr('transform', this.translation)\n .attr('cx', 0)\n .attr('cy', 0)\n .attr('r', config.needleNutRadius)\n .style('fill', '#666666');\n }\n\n}","export class TextIndicator { // TODO tidy\n constructor(config) {\n if (config === null) {\n throw new Error('No chart context specified for polarAxis');\n }\n\n this.translation = config.textIndicatorTranslation;\n }\n\n update(svg, value, label) {\n svg.select('.value')\n .text(value);\n svg.select('.label')\n .text(label);\n }\n\n render(svg, config) {\n let indicator = svg.append('g')\n .attr('class', 'text-indicator')\n .attr('pointer-events', 'none')\n .style('text-anchor', 'middle')\n .style('alignment-baseline', 'central');\n\n if (this.translation) {\n indicator.attr('transform', this.translation);\n }\n\n indicator.append('text')\n .attr('class', 'value')\n .attr('x', 0)\n .attr('y', 0)\n .attr('pointer-events', 'none')\n .text('0')\n .style('font', '48px Montserrat, sans-serif')\n .style('text-anchor', 'middle');\n\n indicator.append('text')\n .attr('class', 'label')\n .attr('x', 0)\n .attr('y', 0)\n .attr('pointer-events', 'none')\n .text('')\n .style('font', '24px Montserrat, sans-serif')\n .style('transform', 'translate(0, 1.5em')\n .style('text-anchor', 'middle');\n }\n}","import { defaults } from '../utils/defaults/gauge';\nimport { SvgContainer } from './components/svgContainer';\nimport { Dial } from './components/dial';\nimport { DialNeedle } from './components/dialNeedle';\nimport { TextIndicator } from './components/textIndicator';\nimport { calculateWidth } from '../utils/screen';\n\nexport class SvgGaugeStrategy {\n constructor(context) {\n this._loadConfig(context.config);\n this.svgContainer = new SvgContainer(this.config);\n let config = this.config;\n\n this.dial = new Dial('linear', config);\n this.needle = new DialNeedle('linear', config);\n\n this.svgContainer\n .add(this.dial)\n .add(this.needle);\n\n if (config.numericIndicator) {\n let r = (\n (config.width > config.height) ?\n config.height : config.width\n ) / 2;\n let indicatorOffset = r + 75;\n config.textIndicatorTranslation = 'translate(' + r + ',' + indicatorOffset + ')';\n this.textIndicator = new TextIndicator(config);\n this.svgContainer.add(this.textIndicator);\n }\n }\n\n\t/**\n\t * Renders a gauge chart based on data object\n\t * @param {Object} data Data Object. Contains a numeric value.\n\t *\n\t */\n draw(data) {\n let datum = data[data.length - 1],\n svg = this.svgContainer.svg,\n config = this.config;\n\n this.needle.update(svg, config, data);\n if (config.numericIndicator) {\n this.textIndicator.update(svg, datum.value, config.label);\n }\n }\n\n\t/**\n\t * This method adds config options to the chart context.\n\t * @param {Object} config Config object\n\t */\n _loadConfig(config) {\n this.config = {};\n //Selector\n this.config.selector = config.selector || defaults.selector;\n //Margins \n this.config.marginTop = config.marginTop || defaults.marginTop;\n this.config.marginLeft = config.marginLeft || defaults.marginLeft;\n this.config.marginRight = config.marginRight || defaults.marginRight;\n this.config.marginBottom = config.marginBottom || defaults.marginBottom;\n //Width & height\n this.config.width = config.width ?\n calculateWidth(config.width, this.config.selector) - this.config.marginLeft - this.config.marginRight\n : calculateWidth(defaults.width, this.config.selector) - this.config.marginLeft - this.config.marginRight;\n this.config.height = config.height || defaults.height;\n\n this.config.colorScale = config.colorScale || defaults.colorScale;\n this.config.minLevel = config.minLevel || defaults.minLevel;\n this.config.maxLevel = config.maxLevel || defaults.maxLevel;\n this.config.minAngle = config.minAngle || defaults.minAngle;\n this.config.maxAngle = config.maxAngle || defaults.maxAngle;\n this.config.ticks = config.ticks || defaults.ticks;\n this.config.ringWidth = config.ringWidth || defaults.ringWidth;\n this.config.ringMargin = config.ringMargin || defaults.ringMargin;\n this.config.labelInset = config.labelInset || defaults.labelInset;\n this.config.needleNutRadius = config.needleNutRadius || defaults.needleNutRadius;\n this.config.needleLenghtRatio = config.needleLenghtRatio || defaults.needleLenghtRatio;\n this.config.invertColorScale = typeof (config.invertColorScale) === 'undefined' ? defaults.invertColorScale : config.invertColorScale;\n this.config.numericIndicator = typeof (config.numericIndicator) === 'undefined' ? defaults.numericIndicator : config.numericIndicator;\n this.config.label = config.label || defaults.label;\n\n\n return this;\n }\n\n}","export const defaults = {\n selector: '#chart',\n width: '100%', // %, auto, or numeric \n height: 250,\n yAxisLabel: null,\n //margins\n marginTop: 20,\n marginRight: 250,\n marginBottom: 30,\n marginLeft: 50,\n};","import {forceSimulation, forceLink, forceManyBody, forceCenter, drag} from 'd3';\nimport {simple2Linked} from '../../utils/dataTransformation';\nimport {event} from 'd3';\nexport class Nodeset {\n constructor(config) {\n this.config = config;\n var width = config.width,\n height = config.height;\n\n this.simulation = forceSimulation()\n .force(\"link\", forceLink().id((d) => d.id))\n .force(\"charge\", forceManyBody())\n .force(\"center\", forceCenter(width / 2, height / 2));\n\n\n this.dragstarted = (d) => {\n if (!event.active) this.simulation.alphaTarget(0.3).restart();\n d.fx = d.x;\n d.fy = d.y;\n };\n\n this.dragged = (d) => {\n d.fx = event.x;\n d.fy = event.y;\n };\n\n this.dragended = (d) => {\n if (!event.active) this.simulation.alphaTarget(0);\n d.fx = null;\n d.fy = null;\n };\n\n }\n\n update(svg, config, data) {\n data = simple2Linked(data);\n\n var link = svg.append(\"g\")\n .attr(\"class\", \"links\")\n .selectAll(\"line\")\n .data(data.links)\n .enter().append(\"line\")\n .attr(\"stroke-width\", 2)\n .attr(\"stroke\", \"#999\")\n .attr(\"stroke-opacity\", 0.6);\n\n var node = svg.append(\"g\")\n .attr(\"class\", \"nodes\")\n .selectAll(\"circle\")\n .data(data.nodes)\n .enter()\n .append(\"circle\")\n .attr(\"r\", 5)\n .attr(\"fill\", (d) => \"#23436f\")\n .call(drag()\n .on(\"start\", this.dragstarted)\n .on(\"drag\", this.dragged)\n .on(\"end\", this.dragended));\n\n node.append(\"title\")\n .text((d) => d.id);\n\n this.simulation.nodes(data.nodes).on(\"tick\", (e) => this.ticked(link, node));\n\n this.simulation.force(\"link\").links(data.links);\n }\n\n ticked(link, node) {\n link\n .attr(\"x1\", (d) => d.source.x)\n .attr(\"y1\", (d) => d.source.y)\n .attr(\"x2\", (d) => d.target.x)\n .attr(\"y2\", (d) => d.target.y);\n\n node\n .attr(\"cx\", (d) => d.x)\n .attr(\"cy\", (d) => d.y);\n }\n\n render(svg, config) {\n //Do nothing, since lines render only when new data is received.\n }\n}","import {SvgContainer} from './components/svgContainer';\nimport {defaults} from '../utils/defaults/networkgraph';\nimport {calculateWidth} from '../utils/screen';\nimport {Nodeset} from './components/nodeset';\n\nexport class SvgNetworkgraphStrategy {\n\n constructor(context) {\n this._loadConfig(context.config);\n\n this.svgContainer = new SvgContainer(this.config);\n\n this.nodeset = new Nodeset(this.config);\n\n //Include components in the chart container\n this.svgContainer\n .add(this.nodeset);\n }\n\n\t/**\n\t * Renders a linechart based on data object\n\t * @param {Object} data Data Object. Contains an array with x and y properties.\n\t * \n\t */\n draw(data) {\n let svg = this.svgContainer.svg,\n config = this.config;\n\n this.nodeset.update(svg, config, data);\n }\n\n /**\n * This method adds config options to the chart context.\n * @param {Object} config Config object\n */\n _loadConfig(config) {\n this.config = {};\n this.config.selector = config.selector || defaults.selector;\n //Margins \n this.config.marginTop = config.marginTop || defaults.marginTop;\n this.config.marginLeft = config.marginLeft || defaults.marginLeft;\n this.config.marginRight = config.marginRight || defaults.marginRight;\n this.config.marginBottom = config.marginBottom || defaults.marginBottom;\n this.config.width = config.width ? calculateWidth(config.width, this.config.selector) - this.config.marginLeft - this.config.marginRight\n : calculateWidth(defaults.width, this.config.selector) - this.config.marginLeft - this.config.marginRight;\n this.config.height = config.height || defaults.height;\n\n return this;\n }\n}","import * as Colors from '../colors';\n\nexport const defaults = {\n selector: '#chart',\n colorScale: Colors.category8(),\n marginTop: 20,\n marginRight: 20,\n marginBottom: 30,\n marginLeft: 50,\n width: '50%', // %, auto, or numeric\n height: 450,\n tickLabel: '',\n transitionDuration: 300,\n maxNumberOfElements: 5, // used by keepDrawing to reduce the number of elements in the current chart\n sortData: {\n descending: false,\n prop: 'x'\n },\n //Events\n onDown(d) {\n },\n onHover(d) {\n },\n onLeave(d) {\n },\n onClick(d) {\n }\n};","import {scaleLinear} from 'd3';\n\nexport class XRadialAxis {\n\n constructor(config) {\n if (config === null) {\n throw new Error('No chart context specified for XRadialAxis');\n }\n\n this.xRadialAxis = scaleLinear().range([0, 2 * Math.PI]);\n }\n}","import {scaleSqrt} from 'd3';\n\nexport class YRadialAxis {\n\n constructor(config) {\n if (config === null) {\n throw new Error('No chart context specified for XRadialAxis');\n }\n\n let radius = (Math.min(config.width, config.height) / 2) - 10;\n\n this.yRadialAxis = scaleSqrt()\n .range([0, radius]);\n }\n}","import {XRadialAxis} from './xRadialAxis'\nimport {YRadialAxis} from './yRadialAxis'\n//\nexport class RadialAxes {\n constructor(config) {\n if (config === null) {\n throw new Error('No chart context specified for RadialAxis');\n }\n\n this.x = new XRadialAxis(config);\n this.y = new YRadialAxis(config);\n }\n}","import {partition, stratify, arc} from 'd3';\n\n\nexport class SunburstDisk {\n constructor(xRadialAxis, yRadialAxis) {\n this.x = xRadialAxis;\n this.y = yRadialAxis;\n this.arcGen = arc()\n .startAngle((d) => Math.max(0, Math.min(2 * Math.PI, this.x(d.x0))))\n .endAngle((d) => Math.max(0, Math.min(2 * Math.PI, this.x(d.x1))))\n .innerRadius((d) => Math.max(0, this.y(d.y0)))\n .outerRadius((d) => Math.max(0, this.y(d.y1)));\n }\n\n update(svg, config, data) {\n\n // Remove all the paths before redrawing\n this._removePaths(svg);\n\n // Create layout partition\n let root = stratify()\n .id((d) => d.id)\n .parentId((d) => d.parent)\n (data);\n\n root.sum((d) => d.value);\n partition()(root);\n\n // Draw the paths (arcs)\n let paths = svg.selectAll('path')\n .data(root.descendants())\n .enter().append('path')\n .attr('d', this.arcGen)\n .style('fill', (d) => {\n if (!d.parent) {\n return 'white';\n } else {\n return config.colorScale(d.data.label);\n }\n })\n .style('stroke', '#fff')\n .style('stroke-width', '2')\n .style('shape-rendering', 'crispEdge');\n\n paths // TODO extract events to config?\n .on('mouseover.default', (d) => {\n let ancestors = this._getAncestors(d);\n // Fade all the arcs\n if (ancestors.length > 0) {\n svg.selectAll('path')\n .style('opacity', 0.3);\n }\n svg.selectAll('path')\n .filter((node) => ancestors.indexOf(node) >= 0)\n .style('opacity', 1);\n // Hightlight the hovered arc\n svg.select('.text-indicator .label').text(d.data.label);\n svg.select('.text-indicator .value').text(d.value);\n })\n .on('mouseout.default', (d) => {\n svg.selectAll('path').style('opacity', 1);\n svg.select('.text-indicator .label').style('font-weight', 'normal');\n svg.select('.text-indicator .label').text('');\n svg.select('.text-indicator .value').text('');\n })\n ;\n\n paths\n .on('mousedown.user', config.onDown)\n .on('mouseup.user', config.onUp)\n .on('mouseleave.user', config.onLeave)\n .on('mouseover.user', config.onHover)\n .on('click.user', config.onClick);\n\n // ???\n svg.select(self.frameElement).style('height', this.height + 'px');\n }\n\n /**\n * Removes all the paths (arcs). Doing this before each redraw prevents the\n * transition to mess up the arcs.\n * @private\n */\n _removePaths(svg) {\n svg.selectAll('path').remove();\n }\n\n /**\n * From: http://bl.ocks.org/kerryrodden/7090426\n * @param node\n * @returns {Array}\n * @private\n */\n _getAncestors(node) {\n let path = [];\n let current = node;\n while (current.parent) {\n path.unshift(current);\n current = current.parent;\n }\n return path;\n }\n\n render(svg, config) {\n //Do nothing, since disk render only when new data is received.\n }\n}\n","import { defaults } from '../utils/defaults/sunburst';\nimport { SvgContainer } from './components/svgContainer';\nimport { RadialAxes } from './components/radialAxes';\nimport { SunburstDisk } from './components/sunburstDisk';\nimport { TextIndicator } from './components/textIndicator';\nimport { calculateWidth } from '../utils/screen';\n\nexport class SvgSunburstStrategy {\n\n constructor(context) {\n this._loadConfig(context.config);\n\n this.svgContainer = new SvgContainer(this.config);\n let config =\n this.config,\n translation = 'translate(' + config.width / 2 + ',' + (config.height / 2) + ')';\n\n this.svgContainer.transform(translation);\n\n this.axes = new RadialAxes(config);\n\n this.disk = new SunburstDisk(\n this.axes.x.xRadialAxis,\n this.axes.y.yRadialAxis,\n config\n );\n\n this.textIndicator = new TextIndicator(config);\n\n this.svgContainer\n .add(this.disk)\n .add(this.textIndicator);\n }\n\n draw(data) {\n let svg = this.svgContainer.svg,\n config = this.config;\n\n this.disk.update(svg, config, data);\n }\n\n /**\n * This method adds config options to the chart context.\n * @param {Object} config Config object\n */\n _loadConfig(config) {\n this.config = {};\n //Selector\n this.config.selector = config.selector || defaults.selector;\n //Margins \n this.config.marginTop = config.marginTop || defaults.marginTop;\n this.config.marginLeft = config.marginLeft || defaults.marginLeft;\n this.config.marginRight = config.marginRight || defaults.marginRight;\n this.config.marginBottom = config.marginBottom || defaults.marginBottom;\n //Width & height\n this.config.width = config.width ?\n calculateWidth(config.width, this.config.selector) - this.config.marginLeft - this.config.marginRight\n : calculateWidth(defaults.width, this.config.selector) - this.config.marginLeft - this.config.marginRight;\n this.config.height = config.height || defaults.height;\n \n this.config.colorScale = config.colorScale || defaults.colorScale;\n\n //Events\n this.config.onDown = config.onDown || defaults.onDown;\n this.config.onUp = config.onUp || defaults.onUp;\n this.config.onHover = config.onHover || defaults.onHover;\n this.config.onClick = config.onClick || defaults.onClick;\n this.config.onLeave = config.onLeave || defaults.onLeave;\n\n return this;\n }\n}\n","import * as Colors from '../colors';\n\nexport const defaults = {\n selector: '#chart',\n colorScale: Colors.category7(),\n\n //Axes\n xAxisType: 'linear',\n xAxisFormat: '.1f',\n xAxisLabel: 'Sepal length (cm)',\n yAxisType: 'linear',\n yAxisFormat: '.1f',\n yAxisLabel: 'Sepal width (cm)',\n //margins\n marginTop: 20,\n marginRight: 250,\n marginBottom: 130,\n marginLeft: 150,\n //markers\n markerShape: 'dot',\n markerSize: 3,\n //Width & height\n width: '100%', // %, auto, or numeric\n height: 250,\n //Events\n onDown(d) {\n },\n onHover(d) {\n },\n onLeave(d) {\n },\n onClick(d) {\n },\n\n maxNumberOfElements: 100, // used by keepDrawing method to reduce the number of elements in the current chart\n};","import { defaults } from '../utils/defaults/scatterplot';\nimport { SvgAxis } from './base/svgAxis';\nimport { XYAxes } from './components/xyAxes';\nimport { Lineset } from './components/lineset';\nimport { Legend } from './components/legend';\nimport { Areaset } from './components/areaset';\nimport { Pointset } from './components/pointset';\nimport { convertByXYFormat } from '../utils/dataTransformation';\nimport { sortByField } from '../utils/dataSorting';\nimport {min, max} from 'd3';\n\nexport class SvgScatterplotStrategy extends SvgAxis {\n\n constructor(context) {\n super(context);\n this.axes = new XYAxes(this.config.xAxisType, 'linear', this.config);\n this.points = new Pointset(this.axes.x, this.axes.y);\n this.legend = new Legend();\n //Include components in the chart container\n this.svgContainer\n .add(this.axes)\n .add(this.legend)\n .add(this.points);\n }\n\n\t/**\n\t * Renders a scatterplot based on data object\n\t * @param {Object} data Data Object. Contains an array with x and y properties.\n\t * \n\t */\n draw(data) {\n let svg = this.svgContainer.svg,\n config = this.config,\n needRescaling = this.config.needRescaling,\n bbox = null;\n\n // //Transform data, if needed\n convertByXYFormat(data, config);\n\n //Sort data\n sortByField(data, 'x');\n\n //rescale, if needed.\n if (needRescaling) {\n this.rescale();\n }\n\n bbox = this._getDomainBBox(data);\n\n this.axes.updateDomainByBBox(bbox);\n\n //Create a transition effect for dial rescaling\n this.axes.transition(svg, 200);\n\n // Update legend\n this.legend.update(svg, config, data);\n\n // Update points\n this.points.update(svg, config, data);\n }\n\n _getDomainBBox(data) {\n var minX = min(data, (d) => d.x),\n maxX = max(data, (d) => d.x),\n minY = min(data, (d) => d.y),\n maxY = max(data, (d) => d.y);\n return [minX, maxX, minY, maxY];\n }\n\n _checkMarkers(config) {\n return config.markerSize > 0;\n }\n _checkArea(config) {\n return config.areaOpacity > 0;\n }\n\n /**\n * This method adds config options to the chart context.\n * @param {Object} config Config object\n */\n _loadConfig(config) {\n super._loadConfig(config, defaults);\n //Markers\n this.config.markerOutlineWidth = config.markerOutlineWidth || defaults.markerOutlineWidth;\n this.config.markerShape = config.markerShape || defaults.markerShape;\n this.config.markerSize = (typeof config.markerSize === 'undefined' || config.markerSize < 0) ? defaults.markerSize : config.markerSize;\n //Area\n this.config.areaOpacity = (typeof config.areaOpacity === 'undefined' || config.markerSize < 0) ? defaults.areaOpacity : config.areaOpacity;\n return this;\n }\n}","import {SvgLinechartStrategy} from './strategy_linechart';\nimport {SvgBarchartStrategy} from './strategy_barchart';\nimport {SvgStreamgraphStrategy} from './strategy_streamgraph';\nimport {SvgStackedAreaStrategy} from './strategy_stackedArea';\nimport {SvgSwimlaneStrategy} from './strategy_swimlane';\nimport {SvgGaugeStrategy} from './strategy_gauge';\nimport {SvgNetworkgraphStrategy} from './strategy_networkgraph';\nimport {SvgSunburstStrategy} from './strategy_sunburst';\nimport {SvgScatterplotStrategy} from './strategy_scatterplot';\n\n/**\n * SvgStrategy wrapper class\n */\nexport class SvgStrategy {\n constructor(strategy) {\n this.strategy = strategy;\n }\n draw(data) {\n this.strategy.draw(data);\n }\n on(events){\n this.strategy.on(events);\n }\n}\n\nexport const strategies = {\n Barchart(chartContext) {\n return new SvgBarchartStrategy(chartContext);\n },\n Linechart(chartContext) {\n return new SvgLinechartStrategy(chartContext);\n },\n Streamgraph(chartContext) {\n return new SvgStreamgraphStrategy(chartContext);\n },\n Gauge(chartContext) {\n return new SvgGaugeStrategy(chartContext);\n },\n Scatterplot(chartContext) {\n return new SvgScatterplotStrategy(chartContext);\n },\n Sunburst(chartContext) {\n return new SvgSunburstStrategy(chartContext);\n },\n Swimlane(chartContext) {\n return new SvgSwimlaneStrategy(chartContext);\n },\n StackedArea(chartContext) {\n return new SvgStackedAreaStrategy(chartContext);\n },\n Networkgraph(chartContext) {\n return new SvgNetworkgraphStrategy(chartContext);\n }\n};","\nconst doctype = '';\n\nfunction isExternal(url) {\n return url && url.lastIndexOf('http', 0) === 0 && url.lastIndexOf(window.location.host) === -1;\n}\n\nfunction inlineImages(el, callback) {\n let images = el.querySelectorAll('image');\n let left = images.length;\n if (left === 0) {\n callback();\n }\n for (var i = 0; i < images.length; i++) {\n (function (image) {\n var href = image.getAttribute('xlink:href');\n if (href) {\n if (isExternal(href.value)) {\n window.console.warn('Cannot render embedded images linking to external hosts: ' + href.value);\n return;\n }\n }\n let canvas = window.document.createElement('canvas');\n let ctx = canvas.getContext('2d');\n let img = new window.Image();\n href = href || image.getAttribute('href');\n img.src = href;\n img.onload = function () {\n canvas.width = img.width;\n canvas.height = img.height;\n ctx.drawImage(img, 0, 0);\n image.setAttribute('xlink:href', canvas.toDataURL('image/png'));\n left--;\n if (left === 0) {\n callback();\n }\n };\n img.onerror = function () {\n window.console.error('Could not load ' + href);\n left--;\n if (left === 0) {\n callback();\n }\n };\n })(images[i]);\n }\n}\n\nfunction styles(el, selectorRemap) {\n let css = '';\n let sheets = document.styleSheets;\n for (var i = 0; i < sheets.length; i++) {\n if (isExternal(sheets[i].href)) {\n window.console.warn('Cannot include styles from other hosts: ' + sheets[i].href);\n continue;\n }\n let rules = sheets[i].cssRules;\n if (rules !== null) {\n for (var j = 0; j < rules.length; j++) {\n let rule = rules[j];\n if (typeof (rule.style) !== 'undefined') {\n let match = null;\n try {\n match = el.querySelector(rule.selectorText);\n } catch (err) {\n window.console.warn('Invalid CSS selector \"' + rule.selectorText + '\"', err);\n }\n if (match) {\n var selector = selectorRemap ? selectorRemap(rule.selectorText) : rule.selectorText;\n css += selector + ' { ' + rule.style.cssText + ' }\\n';\n } else if (rule.cssText.match(/^@font-face/)) {\n css += rule.cssText + '\\n';\n }\n }\n }\n }\n }\n return css;\n}\n\nexport function svgAsDataUri(el, options, cb) {\n options = options || {};\n options.scale = options.scale || 1;\n var xmlns = 'http://www.w3.org/2000/xmlns/';\n\n inlineImages(el, function () {\n var outer = document.createElement('div');\n var clone = el.cloneNode(true);\n var width, height;\n if (el.tagName === 'svg') {\n width = parseInt(clone.getAttribute('width') || clone.style.width || getComputedStyle(el).getPropertyValue('width'));\n height = parseInt(clone.getAttribute('height') || clone.style.height || getComputedStyle(el).getPropertyValue('height'));\n } else {\n let box = el.getBBox();\n width = box.x + box.width;\n height = box.y + box.height;\n clone.setAttribute('transform', clone.getAttribute('transform').replace(/translate\\(.*?\\)/, ''));\n\n let svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svg.appendChild(clone);\n clone = svg;\n }\n\n clone.setAttribute('version', '1.1');\n clone.setAttributeNS(xmlns, 'xmlns', 'http://www.w3.org/2000/svg');\n clone.setAttributeNS(xmlns, 'xmlns:xlink', 'http://www.w3.org/1999/xlink');\n clone.setAttribute('width', width * options.scale);\n clone.setAttribute('height', height * options.scale);\n clone.setAttribute('viewBox', '0 0 ' + width + ' ' + height);\n outer.appendChild(clone);\n\n let css = styles(el, options.selectorRemap);\n let s = document.createElement('style');\n s.setAttribute('type', 'text/css');\n s.innerHTML = '';\n let defs = document.createElement('defs');\n defs.appendChild(s);\n clone.insertBefore(defs, clone.firstChild);\n\n let svg = doctype + outer.innerHTML;\n let uri = 'data:image/svg+xml;base64,' + window.btoa(window.unescape(encodeURIComponent(svg)));\n if (cb) {\n cb(uri);\n }\n });\n}\n","import { dispatch } from 'd3';\nimport { SvgStrategy, strategies } from '../../svg/SvgStrategy';\nimport { svgAsDataUri } from '../../utils/image';\n\n/**\n * Base class, which includes common methods for all the charts\n * @export Chart\n * @class Chart\n */\nexport default class Chart {\n /**\n * Non-instanciable Chart. This is the parent class for all the ones (Linechart, Barchart, etc.)\n * \n * @param {any} d Data. This object could be an array of data points or a datasource. Examples:\n *
\n     * //With datasource\n     * var data = {\n     *       endpoint: 'ws://192.168.3.32:3000/barchart'\n     * };\n     *  var dataSource = new proteic.WebsocketDatasource(data);\n     * \n     * barchart = new proteic.Barchart(dataSource);\n     * \n     * //With data\n     * barchart = new proteic.Barchart([{x:\"SP\", y:2},{x:\"FR\", y:6}]);\n     * 
\n * @param {any} config Configuration of the chart.\n * \n * @memberOf Chart\n */\n constructor(d, config) {\n var clazz = this.constructor.name;\n if (clazz === 'Chart') {\n throw new Error(clazz + ' is non-instanciable');\n }\n\n this.events = {};\n\n if (!d && !config) {\n throw new Error('Missing constructor parameters');\n }\n\n let dataFormat = d.constructor.name;\n let nArguments = (d && config) ? 2 : 1;\n\n switch (dataFormat) {\n case 'WebsocketDatasource':\n case 'HTTPDatasource':\n this.datasource = d;\n this.data = [];\n this._configureDatasource();\n break;\n case 'Array':\n this.data = d;\n break;\n default:\n throw TypeError('Wrong data format');\n }\n //if only 1 parameter is specified, take default config. Else, take the second argument as config.\n this.config = (nArguments === 1) ? {} : config;\n\n this._initializeSVGContext();\n }\n\n /**\n * Private method. Initialize the API by dinamically creating methods. It creates N method, one per configuration option\n * \n * @param {any} properties An array that contains the name of the methods\n * \n * @memberOf Chart\n */\n _initializeAPI(properties) {\n let clazz = this.constructor;\n properties.forEach((method) => {\n clazz.prototype[method] = function (value) {\n return this.change(method, value);\n }\n });\n }\n\n /**\n * Return the chart context: data, configuration and type\n * \n * @returns chart Chart context\n * \n * @memberOf Chart\n */\n _getChartContext() {\n return {\n data: this.data,\n config: this.config,\n cType: this.constructor.name\n };\n }\n\n /**\n * Initialize the SVG context, by dinamically creating an tag in the specified selector. It is automatically invoked\n * by the chart constructor and should not be used outside of this instance.\n * \n * @memberOf Chart\n */\n _initializeSVGContext() {\n this._svg = new SvgStrategy(strategies[this.constructor.name](this._getChartContext()));\n }\n\n /**\n * Paint data into the chart. If no data is specified, it takes by default the last dataset (very useful when repaintng charts )\n * \n * @param {any} data Data to be painted\n * \n * @memberOf Chart\n */\n draw(data = this.data) {\n this._svg.draw(data);\n }\n\n /**\n * Make and download an image of the current state of the chart.\n * \n * @memberOf Chart\n */\n download() {\n let selector = this._svg.strategy.config.selector + ' ' + 'svg';\n svgAsDataUri(d3.select(selector).node(), {}, (uri, err) => {\n if (err) {\n throw Error('Error converting to image ' + err);\n }\n else {\n let link = document.createElement('a');\n link.style = 'position: fixed; left -10000px;'; // making it invisible\n link.href = uri\n link.download = this.constructor.name + '.svg';\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n }\n });\n }\n\n _keepDrawingByAdding(datum) {\n var datumType = datum.constructor;\n\n if (datumType === Array) {\n this.data = this.data.concat(datum);\n }\n else {\n this.data.push(datum);\n }\n this.draw(JSON.parse(JSON.stringify(this.data)));\n }\n\n\n /**\n * \n * This method add a data record / array of data into the current data. \n * @param {any} datum\n * @param {any} method\n * \n * @memberOf Chart\n \n */\n keepDrawing(datum, method) {\n if (method === 'add') {\n this._keepDrawingByAdding(datum);\n }\n else {\n this._keepDrawingByReplacing(datum);\n }\n }\n\n _configureDatasource() {\n this.dispatcher = dispatch('onmessage', 'onopen', 'onerror');\n\n this.datasource.configure(this.dispatcher);\n\n this.dispatcher.on('onmessage', (data) => this.keepDrawing(data));\n //this.dispatcher.on('onmessage', (data) => console.log(data));\n\n\n this.dispatcher.on('onopen', (event) => {\n console.log('onopen', event);\n });\n\n this.dispatcher.on('onerror', (error) => {\n console.log('onerror', error);\n });\n }\n\n /**\n * Change a configuration property. They all are also available through a method with the same name of the property.\n * \n * @param {any} property property name\n * @param {any} value the new property value\n * @returns the instance of the current chart\n * \n * @memberOf Chart\n */\n change(property, value) {\n this._svg.strategy.changeConfigProperty(property, value);\n return this;\n }\n}","import Chart from './base/Chart';\nimport * as defaultProperties from '../utils/defaults/linechart';\n\n/**\n * Linechart implementation. This charts belongs to 'Basic' family.\n * It is inherited on 'Basic'.\n */\nexport default class Linechart extends Chart {\n\n /**\n * Linechart constructor. It needs (at least) one argument to start: data.\n * Optionally, you can indicate a second argument that includes all the chart options. If you\n * do not specify this, '_default' object is used by default.\n */\n constructor(data, config) {\n super(data, config);\n let keys = Object.keys(defaultProperties.defaults);\n this._initializeAPI(keys);\n }\n\n /**\n * Renders a data object on the chart.\n * @param {Object} data This object contains the data that will be rendered on chart. If you do not\n * specify this param, this.data will be used instead.\n */\n draw(data = this.data) {\n super.draw(data);\n }\n\n /**\n * Add new data to the current graph. If it is empty, this creates a new one.\n * @param {Object} datum data to be rendered\n */\n keepDrawing(datum) {\n super.keepDrawing(datum, 'add');\n }\n}","import Chart from './base/Chart';\nimport * as defaultProperties from '../utils/defaults/linechart';\n\n/**\n * Barchart implementation. This charts belongs to 'Basic' family.\n * It is inherited on 'Basic'.\n */\nexport default class Barchart extends Chart {\n\n /**\n * Barchart constructor. It needs (at least) one argument to start: data.\n * Optionally, you can indicate a second argument that includes all the chart options. If you \n * do not specify this, '_default' object is used by default.\n */\n constructor(data, config) {\n super(data, config);\n let keys = Object.keys(defaultProperties.defaults);\n this._initializeAPI(keys);\n }\n\n /**\n * Renders a data object on the chart.\n * @param {Object} data - This object contains the data that will be rendered on chart. If you do not\n * specify this param, this.data will be used instead.\n */\n draw(data = this.data) {\n super.draw(data);\n }\n\n fire(event, data) {//TODO: improve this section\n if (event === 'transition') {\n if (data === 'grouped') {\n this._svg.strategy.transition2Grouped();\n }\n else if (data === 'stacked') {\n this._svg.strategy.transition2Stacked();\n }\n\n this._svg.strategy.draw();\n }\n }\n\n /**\n * Add new data to the current graph. If it is empty, this creates a new one.\n * @param {Object} datum - data to be rendered\n */\n keepDrawing(datum) {\n super.keepDrawing(datum, 'replace');\n }\n \n _keepDrawingByReplacing(datum) {\n let datumType = datum.constructor;\n if (datumType === Array) {\n this.data = datum;\n }\n else {\n for (let i = 0; i < this.data.length; i++) {\n var d = this.data[i];\n if (d.x === datum.x) {\n this.data[i] = datum;\n break;\n }\n }\n }\n\n this.draw(JSON.parse(JSON.stringify(this.data)));\n }\n\n\n}","import Chart from './base/Chart';\nimport * as defaultProperties from '../utils/defaults/streamgraph';\n\n/**\n * Streamgraph implementation. This charts belongs to 'Flow' family.\n * It is inherited on 'Flow'.\n */\nexport default class Streamgraph extends Chart {\n\n /**\n * Streamgraph constructor. It needs (at least) one argument to start: data.\n * Optionally, you can indicate a second argument that includes all the chart options. If you\n * do not specify this, '_default' object is used by default.\n */\n constructor(data, config) {\n super(data, config);\n let keys = Object.keys(defaultProperties.defaults);\n this._initializeAPI(keys);\n }\n\n /**\n * Renders a data object on the chart.\n * @param {Object} data This object contains the data that will be rendered on chart. If you do not\n * specify this param, this.data will be used instead.\n */\n draw(data = this.data) {\n super.draw(data);\n }\n\n /**\n * Add new data to the current graph. If it is empty, this creates a new one.\n * @param {Object} datum data to be rendered\n */\n keepDrawing(datum) {\n super.keepDrawing(datum, 'add');\n }\n}","import Chart from './base/Chart';\nimport * as defaultProperties from '../utils/defaults/stackedArea';\n\n\n/**\n * StackedArea implementation. This charts belongs to 'Flow' family.\n * It is inherited on 'Flow'.\n */\nexport default class StackedArea extends Chart {\n\n /**\n * StackedArea constructor. It needs (at least) one argument to start: data.\n * Optionally, you can indicate a second argument that includes all the chart options. If you\n * do not specify this, '_default' object is used by default.\n */\n constructor(data, config) {\n super(data, config);\n let keys = Object.keys(defaultProperties.defaults);\n this._initializeAPI(keys);\n }\n\n /**\n * Renders a data object on the chart.\n * @param {Object} data This object contains the data that will be rendered on chart. If you do not\n * specify this param, this.data will be used instead.\n */\n draw(data = this.data) {\n super.draw(data);\n }\n\n /**\n * Add new data to the current graph. If it is empty, this creates a new one.\n * @param {Object} datum data to be rendered\n */\n keepDrawing(datum) {\n if (!this.datum) {\n this.datum = [];\n }\n this.datum = this.datum.concat(datum);\n super.draw(this.datum);\n }\n}","import Chart from './base/Chart';\nimport * as defaultProperties from '../utils/defaults/swimlane';\n\n\n/**\n * Linechart implementation. This charts belongs to 'Basic' family.\n * It is inherited on 'Basic'.\n */\nexport default class Swimlane extends Chart {\n\n /**\n * Linechart constructor. It needs (at least) one argument to start: data.\n * Optionally, you can indicate a second argument that includes all the chart options. If you\n * do not specify this, '_default' object is used by default.\n */\n constructor(data, config) {\n super(data, config);\n let keys = Object.keys(defaultProperties.defaults);\n this._initializeAPI(keys);\n }\n\n /**\n * Renders a data object on the chart.\n * @param {Object} data This object contains the data that will be rendered on chart. If you do not\n * specify this param, this.data will be used instead.\n */\n draw(data = this.data) {\n super.draw(data);\n }\n\n /**\n * Add new data to the current graph. If it is empty, this creates a new one.\n * @param {Object} datum data to be rendered\n */\n keepDrawing(datum) {\n super.keepDrawing(datum, 'add');\n }\n}","import Chart from './base/Chart';\n\n/**\n * Gauge implementation. This charts belongs to 'Basic' family.\n * It is inherited on 'Basic'.\n */\nexport default class Gauge extends Chart {\n\n /**\n * Gauge constructor. It needs (at least) one argument to start: data.\n * Optionally, you can indicate a second argument that includes all the chart options. If you\n * do not specify this, '_default' object is used by default.\n */\n constructor(data, config) {\n super(data, config);\n }\n\n /**\n * Renders a data object on the chart.\n * @param {Object} data This object contains the data that will be rendered on chart. If you do not\n * specify this param, this.data will be used instead.\n */\n draw(data = this.data) {\n super.draw(data);\n }\n\n\n /**\n * Add new data to the current graph. If it is empty, this creates a new one.\n * @param {Object} datum data to be rendered\n */\n keepDrawing(datum) {\n this.data = [datum[0]];\n super.draw();\n }\n\n}","import Chart from './base/Chart';\nimport * as defaultProperties from '../utils/defaults/scatterplot';\n\n/**\n * Scatterplot implementation. This charts belongs to 'Basic' family.\n * It is inherited on 'Basic'.\n */\nexport default class Scatterplot extends Chart {\n\n /**\n * Scatterplot constructor. It needs (at least) one argument to start: data.\n * Optionally, you can indicate a second argument that includes all the chart options. If you\n * do not specify this, '_default' object is used by default.\n */\n constructor(data, config) {\n super(data, config);\n let keys = Object.keys(defaultProperties.defaults);\n this._initializeAPI(keys);\n }\n\n /**\n * Renders a data object on the chart.\n * @param {Object} data This object contains the data that will be rendered on chart. If you do not\n * specify this param, this.data will be used instead.\n */\n draw(data = this.data) {\n super.draw(data);\n }\n\n /**\n * Add new data to the current graph. If it is empty, this creates a new one.\n * @param {Object} datum data to be rendered\n */\n keepDrawing(datum) {\n super.keepDrawing(datum, 'add');\n }\n}","import Chart from './base/Chart';\n\n/**\n * Sunburst implementation. This charts belongs to 'Hierarchical' family.\n */\nexport default class Sunburst extends Chart {\n\n /**\n * Sunburst constructor. It needs (at least) one argument to start: data.\n * Optionally, you can indicate a second argument that includes all the chart options. If you\n * do not specify this, '_default' object is used by default.\n */\n constructor(data, config) {\n super(data, config);\n }\n\n /**\n * Renders a data object on the chart.\n * @param {Object} data This object contains the data that will be rendered on chart. If you do not\n * specify this param, this.data will be used instead.\n */\n draw(data = this.data) {\n super.draw(data);\n }\n\n /**\n * Add new data to the current graph. If it is empty, this creates a new one.\n * @param {Object} datum data to be rendered\n */\n keepDrawing(datum) {\n super.keepDrawing(datum, 'add');\n }\n\n // /**\n // * Add new data to the current graph. If it is empty, this creates a new one.\n // * @param {Object} datum data to be rendered\n // */\n // keepDrawing(datum) {\n // if (this.data.constructor === Array) { this.data = {}; }\n // let config = this.config;\n // if (!datum) {\n // console.warn('attemp to draw null datum');\n // return;\n // }\n //\n // this._buildTree(datum[datum.length - 1].path, datum[datum.length - 1].value, this.data);\n //\n // this.draw();\n //\n // return this.data;\n // }\n\n /**\n * Inserts the new nodes into the existing tree.\n * From: http://bl.ocks.org/kerryrodden/7090426\n *\n * @param pathString\n * @param value\n * @param data\n * @private\n */\n _buildTree(pathString, value, data) {\n let path = pathString.split('/');\n var current = data;\n for (let i = 1; i < path.length; i++) {\n var children = current.children;\n var name = path[i];\n var child;\n if (i + 1 < path.length) {\n var foundChild = false;\n for (let j = 0; children !== undefined && j < children.length; j++) {\n if (children[j].name === name) {\n child = children[j];\n foundChild = true;\n break;\n }\n }\n if (!foundChild) {\n child = {\n 'name': name,\n 'children': []\n };\n if (children === undefined) {\n current.children = [];\n }\n delete current.value;\n current.children.push(child);\n }\n current = child;\n } else {\n child = {\n 'name': name,\n 'value': value\n };\n if (children === undefined) {\n current.children = [];\n }\n delete current.value;\n current.children.push(child);\n }\n }\n }\n\n}","import Chart from './base/Chart';\nimport * as defaultProperties from '../utils/defaults/networkgraph';\n\n/**\n * Linechart implementation. This charts belongs to 'Basic' family.\n * It is inherited on 'Basic'.\n */\nexport default class Networkgraph extends Chart {\n\n /**\n * Linechart constructor. It needs (at least) one argument to start: data.\n * Optionally, you can indicate a second argument that includes all the chart options. If you\n * do not specify this, '_default' object is used by default.\n */\n constructor(data, config) {\n super(data, config);\n let keys = Object.keys(defaultProperties.defaults);\n this._initializeAPI(keys);\n }\n\n /**\n * Renders a data object on the chart.\n * @param {Object} data This object contains the data that will be rendered on chart. If you do not\n * specify this param, this.data will be used instead.\n */\n draw(data = this.data) {\n super.draw(data);\n }\n\n /**\n * Add new data to the current graph. If it is empty, this creates a new one.\n * @param {Object} datum data to be rendered\n */\n keepDrawing(datum) {\n super.keepDrawing(datum, 'add');\n }\n}"],"names":["const","scaleOrdinal","scaleQuantile","let","this","super","request","Colors.category7","select","scaleTime","axisBottom","scaleLinear","d3Format","scaleBand","keys","axisLeft","line","nest","area","format","timeParse","min","max","defaults","Colors.category5","map","stack","d3Stack","stackOrderNone","Colors.category4","curveCardinal","stackOrderInsideOut","stackOffsetWiggle","Colors.category2","stackOffNone","Colors.category3","extent","Colors.diverging_spectral2","arc","range","forceSimulation","forceLink","forceManyBody","forceCenter","event","drag","Colors.category8","scaleSqrt","stratify","partition","svg","dispatch","Linechart","defaultProperties.defaults","Barchart","Streamgraph","StackedArea","Swimlane","Gauge","Scatterplot","Sunburst","Networkgraph"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":null,"sources":["../src/svg/strategies/SvgStrategy.ts","../src/Config.ts","../src/utils/functions.ts","../src/utils/screen.ts","../src/charts/Chart.ts","../src/svg/components/Component.ts","../src/svg/components/XAxis.ts","../src/Globals.ts","../src/utils/dataTransformation.ts","../src/svg/components/YAxis.ts","../src/svg/components/XYAxes.ts","../src/svg/components/Lineset.ts","../src/svg/components/Pointset.ts","../src/svg/components/Areaset.ts","../src/svg/components/Legend.ts","../src/svg/components/Container.ts","../src/svg/base/SvgChart.ts","../src/utils/dataSorting.ts","../src/svg/strategies/SvgStrategyLinechart.ts","../src/utils/colors.ts","../src/svg/Interpolation.ts","../src/utils/defaults/linechart.ts","../src/charts/Linechart.ts","../src/svg/components/Barset.ts","../src/svg/strategies/SvgStrategyBarchart.ts","../src/utils/defaults/barchart.ts","../src/charts/Barchart.ts","../src/svg/components/Dial.ts","../src/svg/components/DialNeedle.ts","../src/svg/components/TextIndicator.ts","../src/svg/strategies/SvgStrategyGauge.ts","../src/utils/defaults/gauge.ts","../src/charts/Gauge.ts","../src/svg/components/CanvasPointset.ts","../src/svg/strategies/SvgStrategyScatterplot.ts","../src/utils/defaults/scatterplot.ts","../src/charts/Scatterplot.ts","../src/svg/components/Streamset.ts","../src/svg/strategies/SvgStrategyStreamgraph.ts","../src/utils/defaults/streamgraph.ts","../src/charts/Streamgraph.ts","../src/utils/defaults/stackedArea.ts","../src/charts/StackedArea.ts","../src/svg/components/Timeboxset.ts","../src/svg/strategies/SvgStrategySwimlane.ts","../src/utils/defaults/swimlane.ts","../src/charts/Swimlane.ts","../src/svg/components/XRadialAxis.ts","../src/svg/components/YRadialAxis.ts","../src/svg/components/RadialAxes.ts","../src/svg/components/SunburstDisk.ts","../src/svg/strategies/SvgStrategySunburst.ts","../src/utils/defaults/sunburst.ts","../src/charts/Sunburst.ts","../src/svg/components/LinkedNodeset.ts","../src/svg/components/ZoomComponent.ts","../src/svg/strategies/SvgStrategyNetwork.ts","../src/utils/defaults/network.ts","../src/charts/Network.ts","../src/svg/components/SectorSet.ts","../src/svg/strategies/SvgStrategyPieChart.ts","../src/utils/defaults/piechart.ts","../src/charts/PieChart.ts","../src/datasources/Datasource.ts","../src/datasources/WebsocketDatasource.ts","../src/datasources/HTTPDatasource.ts"],"sourcesContent":["import Config from '../../Config';\nimport SvgChart from '../base/SvgChart';\n\n\nexport class SvgContext {\n private strategy: SvgChart;\n\n constructor(strategy: SvgChart, config: Config) {\n this.strategy = strategy;\n this.strategy.setConfig(config);\n this.strategy.initialize();\n }\n\n public draw(data: [{}]): void {\n this.strategy.draw(data);\n }\n\n public addLoading(){\n this.strategy.addLoading();\n }\n public removeLoading(){\n this.strategy.removeLoading();\n }\n}","class Config {\n private properties: { [key: string]: any; } = {};\n\n constructor() {\n }\n public put(key: string, value: any) {\n this.properties[key] = value;\n return this;\n }\n public get(key: string): any {\n return this.properties[key];\n }\n};\n\nexport default Config;","\nexport function isArray(d) {\n return d && d.constructor === Array && d instanceof Array;\n}\n\nexport function isObject(d) {\n return d && d.constructor === Object && d instanceof Object;\n}\n\nexport function isFunction(func) {\n return func && {}.toString.call(func) === '[object Function]';\n}\n\nexport function isNumeric(n) {\n return !isNaN(parseFloat(n)) && isFinite(n);\n}\n\nexport function isEven(n) {\n return n % 2 === 0;\n}\n\nexport function isPercentage(n) {\n let split = null;\n let number = null;\n if (!n || typeof n !== 'string') {\n return false;\n }\n split = n.split('%');\n number = (+split[0]);\n return split.length === 2 &&\n (number >= 0) &&\n (number <= 100);\n}\n\nexport function keys(array, field) {\n var keys = new Set();\n var element = null;\n\n if (!array || !array.length) {\n return [];\n }\n\n for (let i = 0; i < array.length; i++) {\n element = field ? array[i][field] : array[i];\n if (element) {\n keys.add(element);\n }\n }\n return keys;\n}\n\n\nexport function sortBy(array, o) {\n var _toString = Object.prototype.toString;\n var _parser = (x) => { return x; };\n var _getItem = (x) => {\n return _parser((x !== null && typeof x === 'object' && x[o.prop]) || x);\n };\n\n if (!(array instanceof Array) || !array.length) {\n return [];\n }\n if (_toString.call(o) !== '[object Object]') {\n o = {};\n }\n if (typeof o.parser !== 'function') {\n o.parser = _parser;\n }\n o.desc = o.desc ? -1 : 1;\n return array.sort((a, b) => {\n a = _getItem.call(o, a);\n b = _getItem.call(o, b);\n return o.desc * (a < b ? -1 : +(a > b));\n });\n}\n\nexport function findElement(arr, propName, propValue) {\n for (var i = 0; i < arr.length; i++) {\n if (arr[i][propName] === propValue) {\n return arr[i];\n }\n }\n return null;\n}\n\nexport function copy(object){\n return object != null ? JSON.parse(JSON.stringify(object)) : null;\n}\n\nexport function deg2rad(deg) {\n return deg * Math.PI / 180;\n}","import {\n isNumeric, isPercentage\n} from './functions';\n\nimport { select } from 'd3';\n\nexport function calculateWidth(widthConfig, selector) {\n if (widthConfig === 'auto') {\n return select(selector)\n .node()\n .getBoundingClientRect()\n .width;\n }\n else if (isNumeric(widthConfig)) {\n return widthConfig;\n }\n else if (isPercentage(widthConfig)) {\n let containerWidth, percentage;\n containerWidth = select(selector)\n .node()\n .getBoundingClientRect()\n .width;\n percentage = widthConfig.split('%')[0];\n return Math.round(percentage * containerWidth / 100);\n } else {\n throw Error('Unknow config width value: ' + widthConfig);\n }\n}\n","import { SvgContext } from '../svg/strategies/SvgStrategy'\nimport SvgChart from '../svg/base/SvgChart';\nimport Config from '../Config';\nimport { copy } from '../utils/functions';\nimport Datasource from '../datasources/Datasource';\nimport { calculateWidth } from '../utils/screen';\nimport { dispatch } from 'd3';\n\nabstract class Chart {\n\n private context: SvgContext;\n protected config: Config;\n protected data: any;\n private ds: Datasource = null;\n private dispatcher: any = dispatch('onmessage', 'onopen', 'onerror', 'addLoading', 'removeLoading');\n\n\n constructor(strategy: SvgChart, data: any, userConfig: any, defaults: any) {\n this.config = this.loadConfigFromUser(userConfig, defaults);\n this.context = new SvgContext(strategy, this.config);\n this.data = data;\n }\n\n public draw(data: [{}] = this.data) { //TODO: SPLIT DATA INTO SMALL CHUNKS (stream-like). \n this.context.draw(copy(data));\n this.data = data;\n }\n\n /**\n * \n * Configure a datasources for the current instance. Datasources allows data to be catached from many sources, such as websockets endpoints, HTTP urls, etc.\n * @param {Datasource} ds A datasource\n * \n * @memberOf Chart\n \n */\n public datasource(ds: Datasource) {\n this.ds = ds;\n\n this.ds.configure(this.dispatcher);\n\n this.dispatcher.on('addLoading', () => this.context.addLoading());\n this.dispatcher.on('removeLoading', () => this.context.removeLoading());\n\n this.dispatcher.on('onmessage', (data: any) => this.keepDrawing(data));\n\n this.dispatcher.on('onopen', (event: any) => {\n console.log('onopen', event);\n });\n\n this.dispatcher.on('onerror', (error: any) => {\n console.log('onerror', error);\n });\n\n }\n\n protected loadConfigFromUser(userData: any, defaults: any): Config {\n let config = new Config();\n for (let v in defaults) {\n config.put(v, (v in userData) ? userData[v] : defaults[v]);\n }\n let width = config.get('width');\n width = calculateWidth(width, config.get('selector')) - config.get('marginLeft') - config.get('marginRight')\n config.put('width', width);\n return config;\n }\n\n protected abstract keepDrawing(datum: any): void;\n\n}\n\nexport default Chart;","import Config from '../../Config';\n\nimport { Selection } from 'd3';\n\nabstract class Component {\n\n protected config: Config;\n protected svg: Selection;\n\n constructor() {\n }\n\n abstract update(data: any): void;\n abstract render(): void;\n\n /**\n * \n * Configure this component to use a given configuration and a SVG selector. This method is automatically by the Container.\n * @param {Config} config A configuration object\n * @param {*} svg A D3 selector object\n * \n * @memberOf Component\n \n */\n public configure(config: Config, svg: any) {\n this.config = config;\n this.svg = svg;\n }\n\n /**\n * \n * Clean the current series.\n */\n public clean() {\n this.svg.selectAll('.serie').remove();\n }\n};\n\nexport default Component; \n","import {\n map,\n select,\n scaleTime,\n scaleLinear,\n scaleBand,\n format,\n axisBottom,\n timeParse,\n min as d3Min,\n max as d3Max\n} from 'd3';\n\nimport Component from './Component';\nimport Config from '../../Config';\n\nimport { isEven } from '../../utils/functions';\n\nclass XAxis extends Component {\n\n private _xAxis: any;\n\n constructor() {\n super();\n }\n\n public render(): void {\n let width = this.config.get('width'),\n height = this.config.get('height'),\n xAxisFormat = this.config.get('xAxisFormat'),\n xAxisType = this.config.get('xAxisType'),\n xAxisLabel = this.config.get('xAxisLabel'),\n xAxisGrid = this.config.get('xAxisGrid');\n\n this.initializeXAxis(width, height, xAxisFormat, xAxisType, xAxisGrid);\n\n this.svg\n .append('g')\n .attr('class', `x axis ${xAxisType}`)\n .attr('transform', 'translate(0,' + height + ')')\n .call(this._xAxis);\n\n this.svg\n .append('text')\n .attr('class', 'xaxis-title')\n .attr(\"text-anchor\", \"middle\")\n .attr('x', width / 2)\n .attr('y', height + 40)\n .text(xAxisLabel)\n .style('font', '0.8em Montserrat, sans-serif');\n }\n\n public update(data: [any]): void {\n let propertyX = this.config.get('propertyX');\n let xAxisType = this.config.get('xAxisType');\n\n if (xAxisType === 'linear') {\n //TODO: Optimize it. Currently we are looping data twice.\n let min = d3Min(data, (d) => d[propertyX]),\n max = d3Max(data, (d) => d[propertyX]);\n this.updateDomainByMinMax(min, max);\n\n } else if (xAxisType === 'time') {\n let min = d3Min(data, (d) => (d[propertyX] || d[this.config.get('propertyStart')])),\n max = d3Max(data, (d) => (d[propertyX] || d[this.config.get('propertyEnd')]));\n this.updateDomainByMinMax(min, max);\n\n }\n else {\n let keys: string [] = map(data, (d) => d[propertyX]).keys();\n this.updateDomainByKeys(keys);\n }\n\n this.transition();\n }\n /**\n * \n * Update x domain by keys\n * @private\n * @param {*} data\n * \n * @memberOf XAxis\n \n */\n private updateDomainByKeys(keys: string[]) {\n this._xAxis.scale().domain(keys);\n\n }\n\n private updateDomainByMinMax(min: number, max: number) {\n this._xAxis.scale().domain([min, max]);\n }\n\n private transition(time: number = 200) {\n this.svg.selectAll('.x.axis').transition().duration(time).call(this._xAxis);\n // Reorder the axis path to appear over the ticks\n this.svg.select('.x.axis path').raise();\n }\n\n /**\n *\n * Initializes a new horizontal axis\n *\n * @private\n * @param {(string | number)} Width Width of the axis\n * @param {string} xAxisFormat Format of the axis. This parameter is only valid when using a time axis.\n * @param {string} xAxisType Type of the axis. It can be: time, linear or categorical.\n *\n * @memberOf XAxis\n */\n private initializeXAxis(width: number, height: string | number, xAxisFormat: string, xAxisType: string, xAxisGrid: boolean): void {\n switch (xAxisType) {\n case 'time':\n this._xAxis = axisBottom(scaleTime().range([0, width]));\n break;\n case 'linear':\n this._xAxis = axisBottom(scaleLinear().range([0, width]))\n .tickFormat(format(xAxisFormat));\n break;\n case 'categorical':\n this._xAxis = axisBottom(scaleBand().rangeRound([0, width])\n .padding(0.1).align(0.5));\n break;\n default:\n throw new Error('Not allowed type for XAxis. Only allowed \"time\", \"linear\" or \"categorical\". Got: ' + xAxisType);\n }\n\n if (xAxisGrid) {\n this._xAxis\n .tickSizeInner(-height)\n .tickPadding(9);\n }\n }\n\n get xAxis() {\n return this._xAxis;\n }\n}\n\nexport default XAxis;","class Globals {\n\n public static COMPONENT_TRANSITION_TIME = 100;\n public static COMPONENT_HIDE_SHOW_TRANSITION_TIME = 300;\n public static COMPONENT_HIDE_OPACITY = 0.06;\n public static COMPONENT_DATA_KEY_ATTRIBUTE = 'data-proteic-key';\n public static LEGEND_DATA_KEY_ATTRIBUTE = 'data-proteic-legend-key';\n public static LEGEND_HIDE_OPACITY = 0.3;\n public static BREAKPOINT = 768;\n public static ASPECT_RATIO = 0.7;\n public static LOADING_ICON = 'data:image/gif;base64,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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=';\n};\n\nexport default Globals;","import { nest, timeParse } from 'd3';\n\nexport function simple2stacked (data) : [any] {\n return nest().key((d) => d.x).rollup((array) => {\n let r = {};\n for (let i = 0; i < array.length; i++) {\n let object = array[i];\n if (object) {\n r[object.key] = object.y;\n }\n }\n return r;\n }).entries(data);\n}\n\nexport function simple2nested (data, key = 'key') : [any]{\n return nest().key((d) => d[key]).entries(data);\n}\n\nexport function nested2simple(data) {\n let array = Array();\n for (let i = 0; i < data.length; i++) {\n for (let j = 0; j < data[i].values.length; j++) {\n let key = data[i].key;\n let x = data[i].values[j].x;\n let y = data[i].values[j].y;\n array.push({ key: key, x: x, y: y });\n }\n }\n return array;\n}\n\nexport function simple2Linked(data) {\n var linkedData = { links: [], nodes: [] };\n data.map((d) => d.class === 'link' ? linkedData.links.push(d) : linkedData.nodes.push(d));\n return linkedData;\n}\n\n\nexport function convertPropretiesToTimeFormat(data, properties, format) {\n data.forEach((d) => {\n properties.map((p) => {\n d[p] = timeParse(format)(d[p]);\n });\n });\n}\n\nexport function convertByXYFormat(data, xAxisFormat: string, xAxisType: string, yAxisFormat: string, yAxisType: string) {\n data.forEach((d) => {\n //parse x coordinate\n switch (xAxisType) {\n case 'time':\n d.x = timeParse(xAxisFormat)(d.x);\n break;\n case 'linear':\n d.x = +d.x;\n break;\n }\n //parse Y coordinate\n switch (yAxisType) {\n case 'time':\n d.y = timeParse(yAxisFormat)(d.y);\n break;\n case 'linear':\n d.y = +d.y;\n break;\n }\n });\n return data;\n}","import Config from '../../Config';\nimport Component from './Component';\nimport Globals from '../../Globals';\nimport {\n stack,\n map,\n stackOrderInsideOut,\n stackOffsetWiggle,\n select,\n scaleLinear,\n scaleBand,\n format,\n axisLeft,\n axisRight,\n min as d3Min,\n max as d3Max\n} from 'd3';\n\nimport { isEven } from '../../utils/functions';\nimport { simple2stacked } from '../../utils/dataTransformation';\n\nclass YAxis extends Component {\n\n private _yAxis: any;\n private _orient: string = 'left';\n private selection: any = null;\n\n\n constructor(orient?: string) {\n super();\n if (orient != null) {\n this._orient = orient;\n }\n }\n\n get orient(): string {\n return this._orient;\n }\n\n public render(): void {\n let width = this.config.get('width'),\n height = this.config.get('height'),\n yAxisFormat = this.config.get('yAxisFormat'),\n yAxisType = this.config.get('yAxisType'),\n yAxisLabel = this.config.get('yAxisLabel'),\n yAxisGrid = this.config.get('yAxisGrid');\n\n this.initializeYAxis(width, height, yAxisFormat, yAxisType, yAxisGrid);\n\n let yAxisG = this.svg\n .append('g')\n .attr('class', 'y axis')\n .attr(\"transform\", this.orient === 'left'\n ? \"translate( 0, 0 )\"\n : \"translate( \" + width + \", 0 )\"\n )\n .call(this._yAxis);\n\n this.svg\n .append('text')\n .attr('class', 'yaxis-title')\n .attr(\"transform\", \"rotate(-90)\")\n .attr(\"text-anchor\", \"middle\")\n .attr('x', 0 - height / 2)\n .attr('y', 0 - 55)\n .text(yAxisLabel)\n .style('font', '0.8em Montserrat, sans-serif');\n\n this.selection = yAxisG;\n }\n\n public update(data: any): void {\n let propertyKey = this.config.get('propertyKey');\n let propertyY = this.config.get('propertyY');\n\n let yAxisType = this.config.get('yAxisType'),\n yAxisShow = this.config.get('yAxisShow'),\n layoutStacked = this.config.get('stacked');\n\n this.selection.attr('opacity', yAxisShow ? 1 : 0);\n\n if (yAxisType === 'linear') {\n if (layoutStacked) { //TODO: Improve\n let keys: string[] = map(data, (d: any) => d[propertyKey]).keys();\n let stack = this.config.get('stack');\n let stackedData = stack.keys(keys)(simple2stacked(data));\n let min = d3Min(stackedData, (serie: any) => d3Min(serie, (d: any) => d[0]));\n let max = d3Max(stackedData, (serie: any) => d3Max(serie, (d: any) => d[1]));\n this.updateDomainByMinMax(min, max);\n } else {\n let min = d3Min(data, (d: any) => d[propertyY]),\n max = d3Max(data, (d: any) => d[propertyY]);\n\n this.updateDomainByMinMax(min, max);\n }\n } else if (yAxisType === 'categorical') {\n let keys = map(data, (d: any) => d[propertyKey]).keys().sort();\n this._yAxis.scale().domain(keys);\n }\n else {\n console.warn('could not recognize y axis type', yAxisType);\n }\n\n if (data !== null && data.length) {\n this.transition();\n }\n\n }\n\n private updateDomainByMinMax(min: number, max: number) {\n this._yAxis.scale().domain([min, max]);\n }\n\n private transition(time = 200) {\n this.selection.transition().duration(Globals.COMPONENT_TRANSITION_TIME).call(this._yAxis);\n // Reorder the axis path to appear over the ticks\n this.svg.selectAll('.y.axis path').raise();\n }\n\n /**\n *\n * Initializes a new vertical axis\n *\n * @private\n * @param {(string | number)} Width Width of the axis\n * @param {string} yAxisFormat Format of the axis. This parameter is only valid when using a time axis.\n * @param {string} yAxisType Type of the axis. It can be: linear or categorical.\n *\n * @memberOf XAxis\n */\n\n private initializeYAxis(width: string | number, height: number, yAxisFormat: string, yAxisType: string, yAxisGrid: boolean): void {\n switch (yAxisType) {\n case 'linear':\n this._yAxis = (this.orient === 'left')\n ? axisLeft(scaleLinear().range([height, 0])).tickFormat(format(yAxisFormat))\n : axisRight(scaleLinear().range([height, 0])).tickFormat(format(yAxisFormat));\n break;\n case 'categorical':\n this._yAxis = (this.orient === 'left')\n ? axisLeft(scaleBand().rangeRound([height, 0]).padding(0.1).align(0.5))\n : axisRight(scaleBand().rangeRound([height, 0]).padding(0.1).align(0.5));\n break;\n default:\n throw new Error('Not allowed type for YAxis. Only allowed \"time\", \"linear\" or \"categorical\". Got: ' + yAxisType);\n }\n\n if (yAxisGrid && this.orient === 'left') {\n this._yAxis\n .tickSizeInner(-width)\n .tickSizeOuter(0)\n .tickPadding(20);\n }\n\n //\n }\n\n get yAxis() {\n return this._yAxis;\n }\n}\n\nexport default YAxis;","import XAxis from './XAxis';\nimport YAxis from './YAxis';\n\nimport Config from '../../Config';\nimport Component from './Component';\n\nclass XYAxis extends Component {\n private _x: XAxis;\n private _y: YAxis;\n\n constructor() {\n super();\n\n this._x = new XAxis();\n this._y = new YAxis();\n }\n\n public render(): void {\n this._y.render();\n this._x.render();\n\n }\n\n public update(data): void {\n this._y.update(data);\n this._x.update(data);\n }\n \n \n public configure(config: Config, svg: any){\n super.configure(config, svg);\n this._y.configure(config, svg);\n this._x.configure(config, svg);\n }\n\n get x(): XAxis {\n return this._x;\n }\n\n get y(): YAxis {\n return this._y;\n }\n\n\n}\n\nexport default XYAxis;","\nimport Component from './Component';\nimport XAxis from './XAxis';\nimport YAxis from './YAxis';\nimport Config from '../../Config';\nimport Globals from '../../Globals';\n\n\nimport {\n line,\n nest,\n easeLinear,\n CurveFactory,\n Line\n} from 'd3';\n\nclass Lineset extends Component {\n\n private x: XAxis;\n private y: YAxis;\n private lineGenerator: Line;\n\n constructor(x: XAxis, y: YAxis) {\n super();\n this.x = x;\n this.y = y;\n }\n\n\n public render(): void {\n let propertyX = this.config.get('propertyX');\n let propertyY = this.config.get('propertyY');\n let curve: CurveFactory = this.config.get('curve');\n\n this.lineGenerator = line()\n .curve(curve)\n .x((d) => this.x.xAxis.scale()(d[propertyX]))\n .y((d) => this.y.yAxis.scale()(d[propertyY]));\n }\n\n public update(data: [any]): void {\n let propertyKey = this.config.get('propertyKey');\n let dataSeries = nest().key((d: any) => d[propertyKey]).entries(data);\n let series = this.svg.selectAll('g.lineSeries');\n let colorScale = this.config.get('colorScale');\n\n //Update new lines\n let lines = series.data(dataSeries, (d: any) => d[propertyKey])\n .enter()\n .append('g')\n .attr('class', 'lineSeries')\n .attr(Globals.COMPONENT_DATA_KEY_ATTRIBUTE, (d: any) => d[propertyKey])\n .attr('stroke', (d: any) => colorScale(d[propertyKey]))\n .append('svg:path')\n .style('stroke', (d: any) => colorScale(d[propertyKey]))\n .style('stroke-width', 1.9)\n .style('fill', 'none')\n .attr('d', (d: any) => this.lineGenerator(d.values))\n .attr('class', 'line');\n\n //update existing lines\n this.svg.selectAll('.line')\n .data(dataSeries, (d: any) => d[propertyKey])\n .attr('d', (d: any) => this.lineGenerator(d.values))\n .transition()\n .duration(Globals.COMPONENT_TRANSITION_TIME)\n .ease(easeLinear);\n }\n\n}\n\nexport default Lineset;","import Component from './Component';\nimport Config from '../../Config';\nimport XAxis from './XAxis';\nimport YAxis from './YAxis';\nimport Globals from '../../Globals';\n\nimport {\n selection,\n nest,\n symbol,\n symbolCircle,\n symbolCross,\n symbolDiamond,\n symbolSquare,\n symbolStar,\n symbolTriangle,\n symbolWye,\n easeLinear\n} from 'd3';\n\nclass Pointset extends Component {\n\n private x: XAxis;\n private y: YAxis;\n\n constructor(x: XAxis, y: YAxis) {\n super();\n this.x = x;\n this.y = y;\n }\n\n\n\n public render() {\n //Do nothing, since points render only when new data is received.\n\n }\n\n public update(data: [any]) {\n let propertyKey = this.config.get('propertyKey');\n let propertyX = this.config.get('propertyX');\n let propertyY = this.config.get('propertyY');\n\n let dataSeries = nest()\n .key((d: any) => d[propertyKey])\n .entries(data),\n markers: any = null,\n markerShape = this.config.get('markerShape'),\n markerSize = this.config.get('markerSize'),\n markerOutlineWidth = this.config.get('markerOutlineWidth'),\n colorScale = this.config.get('colorScale'),\n points: any = null,\n series: any = null;\n\n let shape = symbol().size(markerSize);\n\n series = this.svg.selectAll('g.points');\n\n switch (markerShape) {\n case 'dot':\n shape.type(symbolCircle);\n break;\n case 'ring':\n shape.type(symbolCircle);\n break;\n case 'cross':\n shape.type(symbolCross);\n break;\n case 'diamond':\n shape.type(symbolDiamond);\n break;\n case 'square':\n shape.type(symbolSquare);\n break;\n case 'star':\n shape.type(symbolStar);\n break;\n case 'triangle':\n shape.type(symbolTriangle);\n break;\n case 'wye':\n shape.type(symbolWye);\n break;\n case 'circle':\n shape.type(symbolCircle);\n break;\n default:\n shape.type(symbolCircle);\n }\n\n points = series\n .data(dataSeries, (d: any) => d.values, (d: any) => d[propertyX]); // bind it twice\n points.enter()\n .append('g')\n .attr('class', 'points')\n .attr(Globals.COMPONENT_DATA_KEY_ATTRIBUTE, (d: any) => d[propertyKey])\n .style('stroke', (d: any) => colorScale(d[propertyKey]))\n .selectAll('circle')\n .data((d: any) => d.values)\n .enter()\n .append('path')\n .attr('class', 'marker')\n .attr('d', shape)\n .style('stroke', (d: any) => colorScale(d[propertyKey]))\n .style('fill', (d: any) => markerShape !== 'ring' ? colorScale(d[propertyKey]) : 'transparent')\n //.style('fill-opacity', 0.8)\n .attr('transform', (d: any) => `translate(${this.x.xAxis.scale()(d[propertyX])}, ${this.y.yAxis.scale()(d[propertyY])})`);\n\n //Update existing markers\n this.svg.selectAll('.marker')\n .transition()\n .duration(Globals.COMPONENT_TRANSITION_TIME)\n .ease(easeLinear)\n .attr('transform', (d: any) => `translate(${this.x.xAxis.scale()(d[propertyX])}, ${this.y.yAxis.scale()(d[propertyY])})`);\n\n // Remove old markers\n points\n .exit()\n .remove();\n\n markers = this.svg.selectAll('.marker');\n markers\n .on('mousedown.user', this.config.get('onDown'))\n .on('mouseup.user', this.config.get('onUp'))\n .on('mouseleave.user', this.config.get('onLeave'))\n .on('mouseover.user', this.config.get('onHover'))\n .on('click.user', this.config.get('onClick'));\n }\n\n}\n\nexport default Pointset;","import Component from './Component';\nimport Config from '../../Config';\nimport XAxis from './XAxis';\nimport YAxis from './YAxis';\nimport Globals from '../../Globals';\n\nimport {\n area,\n selection,\n nest,\n easeLinear,\n CurveFactory,\n Area\n} from 'd3';\n\n\nclass Areaset extends Component {\n\n private x: XAxis;\n private y: YAxis;\n private areaGenerator: Area;\n\n constructor(x: XAxis, y: YAxis) {\n super();\n this.x = x;\n this.y = y;\n }\n\n public render() {\n let height = this.config.get('height'),\n propertyX = this.config.get('propertyX'),\n propertyY = this.config.get('propertyY'),\n curve: CurveFactory = this.config.get('curve');\n\n this.areaGenerator = area()\n .curve(curve)\n\n .x((d: any) => this.x.xAxis.scale()(d[propertyX]))\n .y0(height)\n .y1((d: any) => this.y.yAxis.scale()(d[propertyY]));\n }\n\n public update(data: [any]) {\n let propertyKey = this.config.get('propertyKey');\n let dataSeries = nest().key((d: any) => d[propertyKey]).entries(data);\n let areas = this.svg.selectAll('g.area');\n let colorScale = this.config.get('colorScale');\n let height = this.config.get('height');\n let areaOpacity = this.config.get('areaOpacity');\n\n areas = areas.data(dataSeries, (d: any) => d[propertyKey])\n .enter()\n .append('g')\n .attr('class', 'area')\n .attr(Globals.COMPONENT_DATA_KEY_ATTRIBUTE, (d: any) => d[propertyKey])\n .append('svg:path')\n .style('fill', (d: any) => colorScale(d[propertyKey]))\n .style('fill-opacity', areaOpacity)\n .attr('d', (d: any) => this.areaGenerator(d.values))\n .attr('class', 'areaPath');\n\n //update existing paths\n this.svg.selectAll('.areaPath')\n .data(dataSeries, (d: any) => d[propertyKey])\n .transition()\n .duration(Globals.COMPONENT_TRANSITION_TIME)\n .attr('d', (d: any) => this.areaGenerator(d.values));\n\n }\n\n}\n\nexport default Areaset;","import Component from './Component';\nimport Config from '../../Config';\nimport Globals from '../../Globals';\n\nimport {\n selection,\n nest\n} from 'd3';\n\n\nclass Legend extends Component {\n\n\n constructor() {\n super();\n }\n\n public render() {\n //Do nothing, since points render only when new data is received.\n\n }\n\n public update(data: any) {\n //Exclude those values that do not contain a 'key'.\n let dataSeries = nest()\n .key((d) => d.key)\n .entries(data),\n legend = null,\n entries = null,\n colorScale = this.config.get('colorScale'),\n height = this.config.get('height'),\n width = this.config.get('width');\n\n if (dataSeries.length === 1 && dataSeries[0].key === 'undefined') {\n console.warn('Not showing legend, since there is a valid key');\n return;\n }\n\n this.svg.selectAll('g.legend').remove();\n\n legend = this.svg.append('g').attr('class', 'legend');\n entries = legend.selectAll('.legend-entry')\n .data(dataSeries, (d: any) => d.key)\n .enter()\n .append('g')\n .attr('class', 'legend-entry')\n .attr(Globals.LEGEND_DATA_KEY_ATTRIBUTE, (d: any) => d.key);\n\n\n entries.append('rect')\n .attr('x', width + 10)\n .attr('y', (d: any, i: number) => i * 25)\n .attr('height', 20)\n .attr('width', 20)\n .style('fill', (d: any) => colorScale(d.key))\n .style('stroke', (d: any) => colorScale(d.key))\n .style('opacity', 0.8)\n .on('click.default', (d: any) => this.toggle(d));\n\n\n entries.append('text')\n .attr(\"x\", width + 25 + 10)\n .attr(\"y\", (d: any, i: number) => i * 25 + 7)\n .attr(\"dy\", \"0.55em\")\n .text((d: any) => d.key)\n .style('font', '14px Montserrat, sans-serif')\n .on('click.default', () => this.toggle);\n\n }\n\n private toggle(d: any): void {\n let key = d.key,\n element = this.svg.selectAll('*[' + Globals.COMPONENT_DATA_KEY_ATTRIBUTE + '=\"' + key + '\"]'),\n colorScale = this.config.get('colorScale');\n\n if (!element.empty()) {\n let opacity = element.style('opacity');\n opacity = (opacity == 1) ? Globals.COMPONENT_HIDE_OPACITY : 1;\n let legendEntry = this.svg.select('.legend-entry[' + Globals.LEGEND_DATA_KEY_ATTRIBUTE + '=\"' + key + '\"]');\n /// legendEntry\n // .transition()\n // .duration(Globals.COMPONENT_HIDE_SHOW_TRANSITION_TIME)\n // .style('opacity', (opacity === 1) ? 1 : Globals.LEGEND_HIDE_OPACITY);\n\n legendEntry.selectAll('rect')\n .transition()\n .duration(Globals.COMPONENT_HIDE_SHOW_TRANSITION_TIME)\n .style('fill', (opacity === 1) ? (d: any) => colorScale(d.key) : 'transparent');\n\n element\n .transition()\n .duration(Globals.COMPONENT_HIDE_SHOW_TRANSITION_TIME)\n .style('opacity', opacity);\n }\n }\n\n}\n\nexport default Legend;","import { select, Selection, zoom } from 'd3';\n\nimport Component from './Component';\nimport Config from '../../Config';\nimport Globals from '../../Globals';\n\nclass Container {\n\n private svg: Selection;\n private config: Config;\n private components: Component[] = [];\n\n constructor(config: Config) {\n this.config = config;\n\n let selector: string = this.config.get('selector'),\n width: number = this.config.get('width'),\n height: number = this.config.get('height'),\n marginLeft: number = this.config.get('marginLeft'),\n marginRight: number = this.config.get('marginRight'),\n marginTop: number = this.config.get('marginTop'),\n marginBottom: number = this.config.get('marginBottom');\n\n width += marginLeft + marginRight;\n height += marginTop + marginBottom;\n\n this.initializeContainer(selector, width, height, marginLeft, marginTop);\n }\n\n /**\n * Add a new component to the current SVG container.\n * \n * @param {Component} component A component to be added\n * @param {boolean} render If true, the component will be automatically rendered after adding it to the container\n * @returns {Container}\n * \n * @memberOf Container\n \n */\n public add(component: Component): Container {\n this.components.push(component);\n component.configure(this.config, this.svg);\n component.render();\n return this;\n }\n\n /**\n * \n * Initialize the svg container. \n * @private\n * @param {string} selector Selector where this graph will be included in\n * @param {((number | string))} width Total width of the graph\n * @param {((number | string))} height Total height of the graph\n * @param {number} marginLeft Left margin\n * @param {number} marginTop Top margin\n * \n * @memberOf Container\n \n */\n private initializeContainer(selector: string, width: (number | string), height: (number | string), marginLeft: number, marginTop: number): void {\n this.svg = select(selector)\n .style('position', 'relative')\n .style('width', `${width}px`)\n .style('height', `${height}px`)\n .append('svg:svg')\n .attr('preserveAspectRatio', \"xMinYMin meet\")\n .attr(\"viewBox\", \"0 0 \" + width + \" \" + height)\n .attr('width', '100%')\n .attr('class', 'proteic')\n .attr('width', width)\n .attr('height', height)\n .style('position', 'absolute')\n .append('g')\n .attr('class', 'chartContainer')\n .attr('transform', 'translate(' + marginLeft + ',' + marginTop + ')');\n }\n\n /**\n * \n * Update all the components previously added to this container.\n * @param {[{}]} data Data necessary to update the componnets\n * \n * @memberOf Container\n \n */\n public updateComponents(data: [{}]): void {\n for (let i = 0; i < this.components.length; i++) {\n let component = this.components[i];\n component.update(data);\n }\n }\n\n public translate(x: Number, y: Number) {\n this.svg.attr('transform', `translate(${x}, ${y})`)\n }\n\n public viewBox(w: number, h: number) {\n this.svg.attr(\"viewBox\", \"0 0 \" + w + \" \" + h);\n }\n\n public zoom(z: any) {\n this.svg.call(zoom().scaleExtent([1 / 2, 4]).on(\"zoom\", z));\n }\n\n public addLoadingIcon() {\n let icon = Globals.LOADING_ICON;\n\n this.svg.append('image').attr('id', 'loadingIcon')\n .attr('width', '25%')\n .attr('height', '25%')\n .attr('x', '25%')\n .attr('y', '25%')\n .attr('xlink:href', icon)\n }\n\n public removeLoadingIcon() {\n this.svg.select('image[id=\"loadingIcon\"]').transition().duration(200).remove();\n }\n}\n\nexport default Container;","import Container from '../components/Container';\nimport Config from '../../Config';\n\nabstract class SvgChart {\n\n protected container: Container;\n protected config: Config;\n\n constructor() {\n\n }\n\n initialize() {\n this.container = new Container(this.config);\n }\n\n setConfig(config: Config) {\n this.config = config;\n }\n\n abstract draw(data: [{}]): void;\n\n\n public addLoading() {\n this.container.addLoadingIcon();\n }\n\n public removeLoading() {\n this.container.removeLoadingIcon();\n }\n\n\n\n}\n\nexport default SvgChart;","export function sortByField (array, field){\n array.sort((e1, e2) => {\n var a = e1[field];\n var b = e2[field];\n return (a < b) ? -1 : (a > b) ? 1 : 0; \n });\n}","import XYAxes from '../components/XYAxes';\nimport Lineset from '../components/Lineset';\nimport Pointset from '../components/Pointset';\nimport Areaset from '../components/Areaset';\nimport Legend from '../components/Legend';\n\nimport Config from '../../Config';\nimport SvgChart from '../base/SvgChart';\nimport { sortByField } from '../../utils/dataSorting';\nimport { convertByXYFormat } from '../../utils/dataTransformation';\n\nclass SvgStrategyLinechart extends SvgChart {\n /**\n * \n * XY Axes. Horizontal and vertical references\n * \n * @private\n * @type {XYAxes}\n * @memberOf SvgStrategyLinechart\n */\n private axes: XYAxes;\n\n /**\n * \n * Set of lines. The numbers of lines depends on data. Every draw() call lines are automatically updated.\n * @private\n * @type {Lineset}\n * @memberOf SvgStrategyLinechart\n \n */\n private lines: Lineset;\n\n\n private markers : Pointset;\n\n private area : Areaset;\n\n private legend : Legend;\n\n\n constructor() {\n super();\n this.axes = new XYAxes();\n this.lines = new Lineset(this.axes.x, this.axes.y);\n }\n\n public draw(data: [{}]) {\n let xAxisFormat = this.config.get('xAxisFormat'),\n xAxisType = this.config.get('xAxisType'),\n yAxisFormat = this.config.get('yAxisFormat'),\n yAxisType = this.config.get('yAxisType');\n\n convertByXYFormat(data, xAxisFormat, xAxisType, yAxisFormat, yAxisType);\n sortByField(data, 'x');\n\n this.container.updateComponents(data);\n }\n\n\n public initialize(): void {\n super.initialize();\n let markerSize = this.config.get('markerSize'),\n areaOpacity = this.config.get('areaOpacity'),\n legend = this.config.get('legend');\n\n this.container.add(this.axes).add(this.lines);\n\n if (areaOpacity > 0) {\n this.area = new Areaset(this.axes.x, this.axes.y);\n this.container.add(this.area);\n }\n\n if (markerSize > 0) {\n this.markers = new Pointset(this.axes.x, this.axes.y);\n this.container.add(this.markers);\n }\n\n if(legend){\n this.legend = new Legend();\n this.container.add(this.legend);\n }\n }\n}\n\nexport default SvgStrategyLinechart;","import {scaleOrdinal, scaleQuantile} from 'd3';\n\nconst paletteCategory1 = [\n '#e1c8df',\n '#9ecd9d',\n '#acd9d6',\n '#e4e36b',\n '#bfa1c5',\n '#e4d3b8',\n '#facba8',\n '#ced4ea',\n '#acd9d6'\n];\n\nconst paletteCategory2 = [\n '#b6dde2',\n '#6394af',\n '#e4e9ab',\n '#8ea876',\n '#f7dce1',\n '#cc878f',\n '#fadaac',\n '#f29a83',\n '#8d7e9e'\n];\n\nconst paletteCategory3 = [\n '#6b68a9',\n '#8cc590',\n '#b9487d',\n '#bfa1c5',\n '#4e6936',\n '#71bbc3',\n '#484156',\n '#ccaf44',\n '#d0553c'\n];\n\nconst paletteCategory4 = [\n '#f1a30d',\n '#1d4763',\n '#84c7bc',\n '#c1212d',\n '#8fbe46',\n '#076837',\n '#563a2d',\n '#563a2d',\n '#87325d'\n];\n\nconst paletteCategory5 = [\n '#f1a30d',\n '#0c3183',\n '#acd9d6',\n '#c1212d',\n '#8fbe46',\n '#076837',\n '#8a6338',\n '#8d2d84',\n '#f09bbc'\n];\n\nconst paletteCategory6 = [\n '#71bbc3',\n '#1d4763',\n '#8fbe46',\n '#4e6936',\n '#ee8998',\n '#c1212d',\n '#f5af3c',\n '#e95e2e',\n '#634484'\n];\n\nconst paletteCategory7 = [\n '#ea671e',\n '#684592',\n '#84b92a',\n '#cd131c',\n '#3c5ba2',\n '#5baddc',\n '#ffde06',\n '#5db68b',\n '#775e47'\n];\n\nconst paletteCategory8 = [\n '#ebd646',\n '#a50f38',\n '#00a096',\n '#f09bbc',\n '#065b78',\n '#72722a',\n '#005231',\n '#4d4e98',\n '#7c4d25'\n];\n\nconst paletteSequentialYellow = [\n '#fff1c6',\n '#fee5a7',\n '#fcda87',\n '#face64',\n '#f8bf4b',\n '#f6b030',\n '#f4a009',\n '#d28514',\n '#b36c17',\n '#955618',\n '#7a4317',\n '#613214',\n '#49230f'\n];\n\nconst paletteSequentialRedOrange = [\n '#ffecb8',\n '#fbd68b',\n '#f7bf5e',\n '#f3a82f',\n '#df7520',\n '#cd4925',\n '#be0a26',\n '#a81023',\n '#941320',\n '#80141d',\n '#6d1419',\n '#5a1215',\n '#470f0f'\n];\n\nconst paletteSequentialRed = [\n '#fde4d4',\n '#f1c4af',\n '#f7bf5e',\n '#db826a',\n '#d0614d',\n '#c73e36',\n '#be0a26',\n '#a81023',\n '#941320',\n '#80141d',\n '#6d1419',\n '#5a1215',\n '#470f0f'\n];\n\nconst paletteSequentialPink = [\n '#fbe3e3',\n '#f9cfcc',\n '#f0aaa9',\n '#ed7e7e',\n '#ea647b',\n '#e74576',\n '#e41270',\n '#c70f65',\n '#aa105c',\n '#8d1253',\n '#731448',\n '#5a123c',\n '#420e30'\n];\n\nconst paletteSequentialPurplePink = [\n '#f9d8e6',\n '#ebbed7',\n '#dda4c7',\n '#c890bb',\n '#b27daf',\n '#8a4c94',\n '#622181',\n '#622181',\n '#50216b',\n '#472060',\n '#3e1f55',\n '#361e4b',\n '#2d1c41'\n];\n\nconst paletteSequentialPurple = [\n '#f6e8f1',\n '#dcc5de',\n '#c2a3c9',\n '#a980b3',\n '#905e9f',\n '#793f8e',\n '#622181',\n '#592175',\n '#4f216b',\n '#462060',\n '#3d1f55',\n '#351e4b',\n '#2c1c41'\n];\n\nconst paletteSequentialBlue = [\n '#e5f2f9',\n '#d1e5f5',\n '#afd3ed',\n '#91afd7',\n '#738bbf',\n '#3c5a9e',\n '#0c3183',\n '#132a68',\n '#10204c',\n '#0b193b',\n '#06142f',\n '#051228',\n '#061020'\n];\n\nconst paletteSequentialLightBlue = [\n '#eff8fd',\n '#d9eff6',\n '#c2e5ef',\n '#a8dae8',\n '#90cbe4',\n '#76b8e1',\n '#5baddc',\n '#4d96cc',\n '#427ebc',\n '#3a67ab',\n '#324c88',\n '#29366b',\n '#1e2354'\n];\n\nconst paletteSequentialBlueViolet = [\n '#edf7e7',\n '#c8e3d2',\n '#91cdbf',\n '#41b5ab',\n '#218ba4',\n '#145d94',\n '#0c3183',\n '#0d2d76',\n '#0d2a6a',\n '#0e265e',\n '#0d2253',\n '#0c1e47',\n '#0b1a3c'\n];\n\nconst paletteSequentialTurquoise = [\n '#e2ecf6',\n '#cadfe6',\n '#b1d3d6',\n '#94c6c6',\n '#74b9b6',\n '#4caca6',\n '#00a096',\n '#008d89',\n '#007b7c',\n '#006a6f',\n '#005963',\n '#004a57',\n '#063b4c'\n];\n\nconst paletteSequentialLightGreen = [\n '#faf9de',\n '#e9efc3',\n '#d7e4a7',\n '#c5d989',\n '#b1ce6a',\n '#9cc34c',\n '#84b92a',\n '#6fa32b',\n '#5a8f2a',\n '#477c29',\n '#346b27',\n '#205b24',\n '#074d21'\n];\n\nconst paletteSequentialDarkGreen = [\n '#eaf3e5',\n '#c7d5be',\n '#a3ba9a',\n '#80a078',\n '#5c885a',\n '#357442',\n '#00632e',\n '#00592b',\n '#004e27',\n '#004423',\n '#033a1e',\n '#053019',\n '#052613'\n];\n\nconst paletteSequentialGreenBrown = [\n '#f7eccd',\n '#d9cba6',\n '#bcad82',\n '#a29162',\n '#887946',\n '#716330',\n '#5b501f',\n '#51461d',\n '#483d1b',\n '#3f3418',\n '#362b15',\n '#2d2311',\n '#231a0d'\n];\n\nconst paletteSequentialBrown = [\n '#f7eccd',\n '#eed3ab',\n '#e4bb89',\n '#dba269',\n '#ad7446',\n '#834d2c',\n '#5e2f19',\n '#552a18',\n '#4c2516',\n '#432113',\n '#3a1c11',\n '#32180f',\n '#29130b'\n];\n\nconst paletteSequentialGrey = [\n '#e5e8ea',\n '#bdbfc3',\n '#999a9f',\n '#77797f',\n '#595c64',\n '#3e444c',\n '#253038',\n '#20282e',\n '#1a2024',\n '#15181b',\n '#0e1112',\n '#070808',\n '#000000'\n];\n\nconst paletteSequentialVioletCb = [\n '#f4f3f9',\n '#e0dced',\n '#cbc6e0',\n '#b7b0d4',\n '#948cbf',\n '#706baa',\n '#4d4e98',\n '#484889',\n '#42427a',\n '#3d3c6c',\n '#37365e',\n '#313050',\n '#2c2a44'\n];\n\nconst paletteSequentialPinkCb = [\n '#fbe5ee',\n '#f8ccd5',\n '#f4b2bc',\n '#f096a3',\n '#d56976',\n '#bc3f52',\n '#a50f38',\n '#951735',\n '#851b31',\n '#761d2e',\n '#671e2a',\n '#581d26',\n '#4a1c22'\n];\n\nconst paletteSequentialBlueCb = [\n '#eaf6fc',\n '#cfe4f4',\n '#cfe4f4',\n '#91bfe3',\n '#6999bb',\n '#417797',\n '#065b78',\n '#11536b',\n '#174b5f',\n '#194354',\n '#1a3b49',\n '#1a343f',\n '#192d35'\n];\n\nconst paletteSequentialGreenCb = [\n '#fff7d0',\n '#e9e09b',\n '#d1ca62',\n '#b7b623',\n '#9e9e28',\n '#88872a',\n '#72722a',\n '#676726',\n '#5c5c23',\n '#51511f',\n '#47471b',\n '#3d3d17',\n '#333413'\n];\n\nconst paletteSequentialGreenBrownCb = [\n '#f2edde',\n '#d8d1c0',\n '#bfb699',\n '#a09778',\n '#837b5a',\n '#686141',\n '#4f4b2c',\n '#3e3e1f',\n '#2e3313',\n '#292d14',\n '#232613',\n '#1e2012',\n '#191a10'\n];\n\nconst paletteDivergingSpectral1 = [\n '#98141f',\n '#ab332c',\n '#bf5040',\n '#d5705b',\n '#e4a57f',\n '#f3d6a6',\n '#f5f2b8',\n '#cfdbb1',\n '#a4c4a9',\n '#71ada1',\n '#4e868f',\n '#2e637d',\n '#06456c'\n];\n\nconst paletteDivergingSpectral2 = [\n '#d43d4f',\n '#df564b',\n '#eb6d45',\n '#f08e53',\n '#f8b96f',\n '#fee08b',\n '#f5f2b8',\n '#d7e5b1',\n '#b5d7aa',\n '#8ec8a3',\n '#6abda3',\n '#4fa4b5',\n '#3489be'\n];\n\nconst paletteDivergingSpectral3 = [\n '#651035',\n '#ae1143',\n '#c9314b',\n '#dd7257',\n '#eeb27a',\n '#feeb9e',\n '#f5f2b8',\n '#cadfba',\n '#96cabb',\n '#50b4bb',\n '#3eaecc',\n '#206791',\n '#0c2c63'\n];\n\nconst paletteDivergingBrownTurquoise = [\n '#3f3128',\n '#683828',\n '#933624',\n '#d5705b',\n '#db9c5e',\n '#feeb9e',\n '#f5f2b8',\n '#cfdbb1',\n '#a4c4a9',\n '#71ada1',\n '#628f85',\n '#53746d',\n '#475b57'\n];\n\nconst paletteDivergingOrangePink = [\n '#e7511e',\n '#eb6929',\n '#ee7f37',\n '#f29446',\n '#f9c083',\n '#ffe9c3',\n '#ffeee3',\n '#f9cfc1',\n '#f3a9ab',\n '#db6882',\n '#c71360',\n '#891953',\n '#4b1c47'\n];\n\nconst paletteDivergingRedBlue = [\n '#b2172b',\n '#c4443e',\n '#d76a5a',\n '#ed937e',\n '#f4b8a2',\n '#fcdbc7',\n '#efefef',\n '#bfcad5',\n '#8ba7bc',\n '#4d87a5',\n '#3c7ca0',\n '#28729b',\n '#036896'\n];\n\nconst paletteDivergingRedGrey = [\n '#b2172b',\n '#c54532',\n '#da6c3b',\n '#f29446',\n '#f8bc67',\n '#fee08b',\n '#efece5',\n '#c9c5c1',\n '#a5a19f',\n '#808080',\n '#666666',\n '#333333',\n '#000000'\n];\n\nconst paletteDivergingOrangeViolet = [\n '#98141f',\n '#ab332c',\n '#f9bc47',\n '#fdcf66',\n '#fede8d',\n '#ffecb3',\n '#f9eff6',\n '#e8d0e3',\n '#a4c4a9',\n '#a973aa',\n '#834f96',\n '#622181',\n '#402357'\n];\n\nconst paletteDivergingPurpleGreen = [\n '#59194b',\n '#85134b',\n '#c71360',\n '#db6882',\n '#eba7a8',\n '#fce0ca',\n '#faefe1',\n '#dbd9aa',\n '#b9c26e',\n '#94ad31',\n '#728b2b',\n '#546c25',\n '#39521f'\n];\n\nconst paletteDivergingVioletGreen = [\n '#55296e',\n '#75408e',\n '#8a5fa0',\n '#a081b5',\n '#beadcf',\n '#ddd7e7',\n '#eae8ed',\n '#c1d4bc',\n '#93be86',\n '#58a951',\n '#3c853e',\n '#23662f',\n '#084a22'\n];\n\nconst paletteDivergingRedGreen = [\n '#b2172b',\n '#c5403c',\n '#d96453',\n '#ef8972',\n '#f6b49c',\n '#fcdbc7',\n '#f9ebde',\n '#dad6a8',\n '#b9c16d',\n '#94ad31',\n '#728b2b',\n '#546c25',\n '#39521f'\n];\n\nconst paletteDivergingBrownGreen = [\n '#735146',\n '#846454',\n '#977a65',\n '#aa9177',\n '#c2ad91',\n '#dbcaad',\n '#edebd6',\n '#c4d6aa',\n '#94bf7c',\n '#58a951',\n '#3c853e',\n '#23662f',\n '#084a22'\n];\n\nconst paletteDivergingLightBrownTurquoise = [\n '#8b5219',\n '#a46821',\n '#bf812c',\n '#cfa151',\n '#e2c489',\n '#f6e8c3',\n '#f5f1df',\n '#cbdccc',\n '#9cc6b9',\n '#60afa6',\n '#359790',\n '#1d7d75',\n '#00665e'\n];\n\n\nexport function category1() {\n return scaleOrdinal().range(paletteCategory1);\n}\n\nexport function category2() {\n return scaleOrdinal().range(paletteCategory2);\n}\n\nexport function category3() {\n return scaleOrdinal().range(paletteCategory3);\n}\n\nexport function category4() {\n return scaleOrdinal().range(paletteCategory4);\n}\n\nexport function category5() {\n return scaleOrdinal().range(paletteCategory5);\n}\n\nexport function category6() {\n return scaleOrdinal().range(paletteCategory6);\n}\n\nexport function category7() {\n return scaleOrdinal().range(paletteCategory7);\n}\n\nexport function category8() {\n return scaleOrdinal().range(paletteCategory8);\n}\n\nexport function sequentialYellow() {\n return scaleQuantile().range(paletteSequentialYellow);\n}\n\nexport function sequentialRedOrange() {\n return scaleQuantile().range(paletteSequentialRedOrange);\n}\n\nexport function sequentialRed() {\n return scaleQuantile().range(paletteSequentialRed);\n}\n\nexport function sequentialPink() {\n return scaleQuantile().range(paletteSequentialPink);\n}\n\nexport function sequentialPurplePink() {\n return scaleQuantile().range(paletteSequentialPurplePink);\n}\n\nexport function sequentialPurple() {\n return scaleQuantile().range(paletteSequentialPurple);\n}\n\nexport function sequentialBlue() {\n return scaleQuantile().range(paletteSequentialBlue);\n}\n\nexport function sequentialLightBlue() {\n return scaleQuantile().range(paletteSequentialLightBlue);\n}\n\nexport function sequentialBlueViolet() {\n return scaleQuantile().range(paletteSequentialBlueViolet);\n}\n\nexport function sequentialTurquoise() {\n return scaleQuantile().range(paletteSequentialTurquoise);\n}\n\nexport function sequentialLightGreen() {\n return scaleQuantile().range(paletteSequentialLightGreen);\n}\n\nexport function sequentialDarkGreen() {\n return scaleQuantile().range(paletteSequentialDarkGreen);\n}\n\nexport function sequentialGreenBrown() {\n return scaleQuantile().range(paletteSequentialGreenBrown);\n}\n\nexport function sequentialBrown() {\n return scaleQuantile().range(paletteSequentialBrown);\n}\n\nexport function sequentialGrey() {\n return scaleQuantile().range(paletteSequentialGrey);\n}\n\nexport function sequentialVioletCb() {\n return scaleQuantile().range(paletteSequentialVioletCb);\n}\n\nexport function sequentialPinkCb() {\n return scaleQuantile().range(paletteSequentialPinkCb);\n}\n\nexport function sequentialBlueCb() {\n return scaleQuantile().range(paletteSequentialBlueCb);\n}\n\nexport function sequentialGreenCb() {\n return scaleQuantile().range(paletteSequentialGreenCb);\n}\n\nexport function sequentialGreenBrownCb() {\n return scaleQuantile().range(paletteSequentialGreenBrownCb);\n}\n\nexport function diverging_spectral1() {\n return scaleQuantile().range(paletteDivergingSpectral1);\n}\n\nexport function diverging_spectral2() {\n return scaleQuantile().range(paletteDivergingSpectral2);\n}\n\nexport function diverging_spectral3() {\n return scaleQuantile().range(paletteDivergingSpectral3);\n}\n\nexport function diverging_brown_turquoise() {\n return scaleQuantile().range(paletteDivergingBrownTurquoise);\n}\n\nexport function diverging_orange_pink() {\n return scaleQuantile().range(paletteDivergingOrangePink);\n}\n\nexport function diverging_red_blue() {\n return scaleQuantile().range(paletteDivergingRedBlue);\n}\n\nexport function diverging_red_grey() {\n return scaleQuantile().range(paletteDivergingRedGrey);\n}\n\nexport function diverging_orange_violet() {\n return scaleQuantile().range(paletteDivergingOrangeViolet);\n}\n\nexport function diverging_purple_green() {\n return scaleQuantile().range(paletteDivergingPurpleGreen);\n}\n\nexport function diverging_violet_green() {\n return scaleQuantile().range(paletteDivergingVioletGreen);\n}\n\nexport function diverging_red_green() {\n return scaleQuantile().range(paletteDivergingRedGreen);\n}\n\nexport function diverging_brown_green() {\n return scaleQuantile().range(paletteDivergingBrownGreen);\n}\n\nexport function diverging_lightBrown_turquoise() {\n return scaleQuantile().range(paletteDivergingLightBrownTurquoise);\n}","import {\n CurveFactory,\n curveLinear,\n curveLinearClosed,\n curveMonotoneX,\n curveMonotoneY,\n curveNatural,\n curveStep,\n curveStepAfter,\n curveStepBefore,\n} from 'd3';\n\nclass Interpolation {\n\n public static CURVE_LINEAR = curveLinear;\n public static CURVE_LINEAR_CLOSED = curveLinearClosed;\n public static CURVE_MONOTONE_X = curveMonotoneX;\n public static CURVE_MONOTONE_Y = curveMonotoneY;\n public static CURVE_NATURAL = curveNatural;\n public static CURVE_STEP = curveStep;\n public static CURVE_STEP_AFTER = curveStepAfter;\n public static CURVE_STEP_BEFORE = curveStepBefore;\n\n // public create(): CurveFactory {\n // return curveStepBefore;\n // }\n};\n\nexport default Interpolation;","import * as Colors from '../colors';\nimport Interpolation from '../../svg/Interpolation';\n\nexport const defaults : any = {\n selector: '#chart',\n colorScale: Colors.category7(),\n curve: Interpolation.CURVE_MONOTONE_X,\n //Area\n areaOpacity: 0,\n //Axes\n xAxisType: 'linear',\n xAxisFormat: '',\n xAxisLabel: null,\n xAxisGrid: true,\n yAxisType: 'linear',\n yAxisFormat: '',\n yAxisLabel: null,\n yAxisShow: true,\n yAxisGrid: true,\n //margins\n marginTop: 20,\n marginRight: 250,\n marginBottom: 130,\n marginLeft: 150,\n //markers\n markerShape: 'dot',\n markerSize: 0,\n markerOutlineWidth: 2,\n //Width & height\n width: '100%', // %, auto, or numeric\n height: 250,\n legend: true,\n propertyX: 'x',\n propertyY: 'y',\n propertyKey: 'key',\n //Events\n onDown(d) {\n },\n onHover(d) {\n },\n onLeave(d) {\n },\n onClick(d) {\n },\n onUp(d) {\n },\n maxNumberOfElements: 10, // used by keepDrawing method to reduce the number of elements in the current chart\n};","import Chart from './Chart';\nimport SvgStrategyLinechart from '../svg/strategies/SvgStrategyLinechart';\nimport Config from '../Config';\nimport { defaults } from '../utils/defaults/linechart';\nimport { copy } from '../utils/functions';\n\nclass Linechart extends Chart {\n\n constructor(data: any, userConfig: any = {}) {\n super(\n new SvgStrategyLinechart(),\n data,\n userConfig,\n defaults\n );\n }\n\n public keepDrawing(datum: any) {\n let maxNumberOfElements: number = this.config.get('maxNumberOfElements'),\n numberOfElements = this.data.length,\n position = -1,\n datumType = datum.constructor;\n\n if (datumType === Array) {\n this.data = this.data.concat(datum);\n }\n else {\n this.data.push(datum);\n }\n //Detect excess of elements given a maxNumberOfElements property\n if (numberOfElements > maxNumberOfElements) {\n let position = numberOfElements - maxNumberOfElements;\n this.data = this.data.slice(position);\n }\n\n this.draw(copy(this.data));\n }\n\n}\n\nexport default Linechart;","import Component from './Component';\nimport Config from '../../Config';\nimport XAxis from './XAxis';\nimport YAxis from './YAxis';\nimport { simple2nested, simple2stacked } from '../../utils/dataTransformation';\nimport Globals from '../../Globals';\nimport {\n stack,\n scaleBand,\n map,\n area,\n selection,\n nest\n} from 'd3';\n\n\nclass Barset extends Component {\n\n private x: XAxis;\n private y: YAxis;\n\n constructor(x: XAxis, y: YAxis) {\n super();\n this.x = x;\n this.y = y;\n }\n\n public render() {\n //Do nothing, since points render only when new data is received.\n\n }\n\n public update(data: [any]) {\n let bars: any = null,\n stacked = this.config.get('stacked');\n\n this.clean();\n\n if (stacked) {\n this.updateStacked(data);\n } else {\n this.updateGrouped(data);\n }\n bars = this.svg.selectAll('g.barSeries rect');\n bars\n .on('mousedown.user', this.config.get('onDown'))\n .on('mouseup.user', this.config.get('onUp'))\n .on('mouseleave.user', this.config.get('onLeave'))\n .on('mouseover.user', this.config.get('onHover'))\n .on('click.user', this.config.get('onClick'));\n }\n\n private updateStacked(data: [any]) {\n let propertyKey = this.config.get('propertyKey');\n let keys: any = map(data, (d) => d[propertyKey]).keys();\n let stack = this.config.get('stack');\n data = stack.keys(keys)(simple2stacked(data));\n\n let colorScale = this.config.get('colorScale'),\n layer = this.svg.selectAll('.barSeries').data(data),\n layerEnter = layer.enter().append('g'),\n x = this.x.xAxis.scale(),\n y = this.y.yAxis.scale();\n\n layer.merge(layerEnter)\n .attr('class', 'barSeries')\n .attr(Globals.COMPONENT_DATA_KEY_ATTRIBUTE, (d: any) => d[propertyKey])\n .style('fill', (d: any, i: number) => d[propertyKey] !== undefined ? colorScale(d[propertyKey]) : colorScale(i))\n .selectAll('rect')\n .data((d: any) => d)\n .enter().append('rect')\n .attr(\"x\", (d: any) => x(d.data[propertyKey]))\n .attr(\"y\", (d: any) => y(d[1]))\n .attr(\"height\", (d: any) => y(d[0]) - y(d[1]))\n .attr(\"width\", x.bandwidth());\n }\n\n private updateGrouped(data: [any]) {\n let propertyKey = this.config.get('propertyKey');\n let propertyX = this.config.get('propertyX');\n let propertyY = this.config.get('propertyY');\n\n let keys = map(data, (d) => d[propertyKey]).keys(),\n colorScale = this.config.get('colorScale'),\n layer: any = null,\n x = this.x.xAxis.scale(),\n y = this.y.yAxis.scale(),\n xGroup = scaleBand().domain(keys).range([0, x.bandwidth()]),\n height = this.config.get('height');\n\n data = simple2nested(data, 'key');\n\n layer = this.svg.selectAll('g.barSeries')\n .data(data, (d: any) => d.values);\n\n layer.enter()\n .append('g')\n .attr('class', 'barSeries')\n .attr(Globals.COMPONENT_DATA_KEY_ATTRIBUTE, (d: any) => d[propertyKey])\n .selectAll('rect')\n .data((d: any) => d.values)\n .enter()\n .append('rect')\n .attr('transform', (d: any) => 'translate(' + x(d[propertyX]) + ')')\n .attr('width', xGroup.bandwidth())\n .attr(\"x\", (d: any) => xGroup(d[propertyKey]))\n .attr(\"y\", (d: any) => y(d[propertyY]))\n .attr(\"height\", (d: any) => height - y(d[propertyY]))\n .style('fill', (d: any, i: number) => d[propertyKey] !== undefined ? colorScale(d[propertyKey]) : colorScale(i));\n }\n\n}\n\nexport default Barset;","import XYAxes from '../components/XYAxes';\nimport Barset from '../components/Barset';\nimport Legend from '../components/Legend';\n\nimport Config from '../../Config';\nimport SvgChart from '../base/SvgChart';\nimport { sortByField } from '../../utils/dataSorting';\nimport { convertByXYFormat } from '../../utils/dataTransformation';\n\nclass SvgStrategyBarchart extends SvgChart {\n /**\n * \n * XY Axes. Horizontal and vertical references\n * \n * @private\n * @type {XYAxes}\n * @memberOf SvgStrategyBarchart\n */\n private axes: XYAxes;\n\n /**\n * \n * Set of bars. The numbers of bars depends on data. Every draw() call lines are automatically updated.\n * @private\n * @type {Lineset}\n * @memberOf SvgStrategyBarchart\n \n */\n private bars: Barset;\n\n\n private legend: Legend;\n\n\n constructor() {\n super();\n this.axes = new XYAxes();\n this.bars = new Barset(this.axes.x, this.axes.y);\n }\n\n public draw(data: [{}]) {\n let xAxisFormat = this.config.get('xAxisFormat'),\n xAxisType = this.config.get('xAxisType'),\n yAxisFormat = this.config.get('yAxisFormat'),\n yAxisType = this.config.get('yAxisType');\n\n convertByXYFormat(data, xAxisFormat, xAxisType, yAxisFormat, yAxisType);\n sortByField(data, 'x');\n\n this.container.updateComponents(data);\n }\n\n\n public initialize(): void {\n super.initialize();\n let legend = this.config.get('legend');\n this.container.add(this.axes).add(this.bars);\n\n if (legend) {\n this.legend = new Legend();\n this.container.add(this.legend);\n }\n }\n}\n\nexport default SvgStrategyBarchart;","import * as Colors from '../colors';\nimport { stack as d3stack } from 'd3';\n\nexport const defaults: any = {\n selector: '#chart',\n colorScale: Colors.category5(),\n //Stacked\n stacked: false,\n //Axes\n xAxisType: 'categorical',\n xAxisFormat: '',\n xAxisLabel: '',\n xAxisGrid: false,\n yAxisType: 'linear',\n yAxisFormat: '',\n yAxisLabel: '',\n yAxisShow: true,\n yAxisGrid: true,\n //margins\n marginTop: 20,\n marginRight: 250,\n marginBottom: 130,\n marginLeft: 150,\n //width & height\n width: '100%',\n height: 350,\n legend: true,\n propertyX: 'x',\n propertyY: 'y',\n propertyKey: 'key',\n stack: d3stack().value((d, k) => d.value[k]),\n\n //Events\n onDown(d: any) {\n },\n onHover(d: any) {\n },\n onLeave(d: any) {\n },\n onClick(d: any) {\n },\n onUp(d: any) {\n }\n};","import Chart from './Chart';\nimport SvgStrategyBarchart from '../svg/strategies/SvgStrategyBarchart';\nimport Config from '../Config';\nimport { defaults } from '../utils/defaults/barchart';\nimport { copy } from '../utils/functions';\n\nclass Barchart extends Chart {\n\n constructor(data: any, userConfig: any = {}) {\n super(\n new SvgStrategyBarchart(),\n data,\n userConfig,\n defaults\n );\n }\n\n fire(event: string, data: string) {//TODO: improve this section\n if (event === 'transition') {\n if (data === 'grouped') {\n this.config.put('stacked', false);\n }\n else if (data === 'stacked') {\n this.config.put('stacked', true);\n }\n this.draw();\n }\n }\n\n public keepDrawing(datum: any) {\n let datumType = datum.constructor;\n if (datumType === Array) {\n this.data = datum;\n }\n else {\n let found = false;\n for (let i = 0; i < this.data.length; i++) {\n var d = this.data[i];\n if (d['x'] === datum['x'] && d['key'] === datum['key']) {\n this.data[i] = datum;\n found = true;\n break;\n }\n }\n if (!found) {\n this.data.push(datum);\n }\n }\n\n this.draw(copy(this.data));\n }\n\n}\n\nexport default Barchart;","import {deg2rad} from '../../utils/functions';\nimport Component from './Component';\n\nimport {\n scaleLinear,\n arc as d3arc,\n range as d3range\n} from 'd3';\n\nclass Dial extends Component {\n\n constructor() {\n super();\n }\n\n\n public render() {\n let labels = null,\n invertColorScale = this.config.get('invertColorScale'),\n colorScale = this.config.get('colorScale'),\n width = this.config.get('width'),\n height = this.config.get('height'),\n ringWidth = this.config.get('ringWidth'),\n ringMargin = this.config.get('ringMargin'),\n ticks = this.config.get('ticks'),\n minAngle = this.config.get('minAngle'),\n maxAngle = this.config.get('maxAngle'),\n minLevel = this.config.get('minLevel'),\n maxLevel = this.config.get('maxLevel'),\n labelInset = this.config.get('labelInset'),\n scale = scaleLinear()\n .domain([minLevel, maxLevel])\n .range([0, 1]),\n scaleMarkers = scale.ticks(ticks),\n\n range = maxAngle - minAngle,\n r = ((width > height) ?\n height : width\n ) / 2,\n translation = (() => 'translate(' + r + ',' + r + ')'),\n tickData = d3range(ticks).map(() => 1 / ticks),\n arc = d3arc()\n .innerRadius(r - ringWidth - ringMargin)\n .outerRadius(r - ringMargin)\n .startAngle((d, i) => deg2rad(minAngle + ((d * i) * range)))\n .endAngle((d, i) => deg2rad(minAngle + ((d * (i + 1)) * range)));\n \n colorScale.domain([0,1]);\n\n // Append the ring\n let arcs = this.svg.append('g')\n .attr('class', 'arc')\n .attr('transform', translation);\n\n // Append the ring sectors\n let arcPaths = arcs.selectAll('path')\n .data(tickData)\n .enter().append('path')\n // ID for textPath linking\n .attr('id', (d, i) => 'sector-' + i)\n .attr('d', arc);\n\n // Fill colors\n arcPaths.attr('fill', (d, i) => colorScale(invertColorScale\n ? (1 - d * i)\n : (d * i))\n );\n\n // Apend the scale labels\n labels = this.svg.append('g')\n .attr('class', 'labels')\n .attr('transform', translation);\n\n // // Append scale marker labels\n labels.selectAll('text')\n .data(scaleMarkers)\n .enter().append('text')\n .attr('transform', (d) => {\n let ratio = scale(d);\n let newAngle = minAngle + (ratio * range);\n return 'rotate(' + newAngle + ') translate(0,' + (labelInset - r) + ')';\n })\n .text((d) => d)\n .style('text-anchor', 'middle')\n .style('font', '18px Montserrat, sans-serif');\n }\n\n public update() {\n\n }\n\n}\n\nexport default Dial;","import {deg2rad} from '../../utils/functions';\nimport Component from './Component';\n\nimport {\n scaleLinear,\n arc as d3arc,\n range as d3range\n} from 'd3';\n\nclass DialNeedle extends Component {\n\n constructor() {\n super();\n }\n\n public render() {\n let labels = null,\n invertColorScale = this.config.get('invertColorScale'),\n colorScale = this.config.get('colorScale'),\n width = this.config.get('width'),\n height = this.config.get('height'),\n ringWidth = this.config.get('ringWidth'),\n ringMargin = this.config.get('ringMargin'),\n ticks = this.config.get('ticks'),\n minAngle = this.config.get('minAngle'),\n maxAngle = this.config.get('maxAngle'),\n minLevel = this.config.get('minLevel'),\n maxLevel = this.config.get('maxLevel'),\n labelInset = this.config.get('labelInset'),\n needleNutRadius = this.config.get('needleNutRadius'),\n needleLenghtRatio = this.config.get('needleLenghtRatio'),\n scale = scaleLinear()\n .domain([minLevel, maxLevel])\n .range([0, 1]),\n scaleMarkers = scale.ticks(ticks),\n\n range = maxAngle - minAngle,\n r = ((width > height) ?\n height : width\n ) / 2,\n needleLen = needleLenghtRatio * (r),\n\n translation = (() => 'translate(' + r + ',' + r + ')'),\n tickData = d3range(ticks).map(() => 1 / ticks),\n arc = d3arc()\n .innerRadius(r - ringWidth - ringMargin)\n .outerRadius(r - ringMargin)\n .startAngle((d, i) => deg2rad(minAngle + ((d * i) * range)))\n .endAngle((d, i) => deg2rad(minAngle + ((d * (i + 1)) * range))),\n\n angleScale = scaleLinear()\n .domain([minLevel, maxLevel])\n .range([90 + minAngle, 90 + maxAngle]);\n\n // Update the needle\n this.svg.append('path')\n .attr('class', 'needle')\n .datum(0)\n .attr('transform', (d) => `translate(${r}, ${r}) rotate(${angleScale(d) - 90})`)\n .attr('d', `M ${0 - needleNutRadius} ${0} L ${0} ${0 - needleLen} L ${needleNutRadius} ${0}`)\n .style('fill', '#666666');\n\n // Append needle nut\n this.svg.append('circle')\n .attr('class', 'needle')\n .attr('transform', translation)\n .attr('cx', 0)\n .attr('cy', 0)\n .attr('r', needleNutRadius)\n .style('fill', '#666666');\n }\n\n public update(data: [any]) {\n let datum = data[data.length - 1],\n width = this.config.get('width'),\n height = this.config.get('height'),\n needleNutRadius = this.config.get('needleNutRadius'),\n needleLenghtRatio = this.config.get('needleLenghtRatio'),\n propertyValue = this.config.get('propertyValue'),\n minAngle = this.config.get('minAngle'),\n maxAngle = this.config.get('maxAngle'),\n minLevel = this.config.get('minLevel'),\n maxLevel = this.config.get('maxLevel'),\n r = ((width > height) ?\n height : width\n ) / 2,\n needleLen = needleLenghtRatio * (r),\n angleScale = scaleLinear()\n .domain([minLevel, maxLevel])\n .range([90 + minAngle, 90 + maxAngle]);\n\n this.svg.select('.needle')\n .transition()\n .attr('transform', (d) => `translate(${r}, ${r}) rotate(${angleScale(datum[propertyValue]) - 90})`)\n .attr('d', `M ${0 - needleNutRadius} ${0} L ${0} ${0 - needleLen} L ${needleNutRadius} ${0}`);\n }\n\n}\n\nexport default DialNeedle;","import Component from \"./Component\";\n\nclass TextIndicator extends Component {\n\n constructor() {}\n\n update(data: [any]): void {\n let datum = data[data.length - 1];\n\n this.svg.select('.value')\n .text(datum.value);\n this.svg.select('.label')\n .text(datum.label);\n }\n\n render(): void {\n let indicator = this.svg.append('g')\n .attr('class', 'text-indicator')\n .attr('pointer-events', 'none')\n .style('text-anchor', 'middle')\n .style('alignment-baseline', 'central');\n\n indicator.append('text')\n .attr('class', 'value')\n .attr('x', 0)\n .attr('y', 0)\n .attr('pointer-events', 'none')\n .text('')\n .style('text-anchor', 'middle');\n\n indicator.append('text')\n .attr('class', 'label')\n .attr('x', 0)\n .attr('y', 0)\n .attr('pointer-events', 'none')\n .text('')\n .style('transform', 'translate(0, 1.5em')\n .style('text-anchor', 'middle');\n }\n\n translate(x: Number, y: Number) {\n this.svg\n .select('g.text-indicator')\n .attr('transform', `translate(${x}, ${y})`);\n }\n\n}\n\nexport default TextIndicator;","\nimport Config from '../../Config';\nimport SvgChart from '../base/SvgChart';\nimport { sortByField } from '../../utils/dataSorting';\nimport { convertByXYFormat } from '../../utils/dataTransformation';\nimport Dial from '../components/Dial';\nimport DialNeedle from '../components/DialNeedle';\nimport TextIndicator from \"../components/TextIndicator\";\n\nclass SvgStrategyGauge extends SvgChart {\n\n private dial: Dial;\n private dialNeedle: DialNeedle;\n private textIndicator: TextIndicator;\n\n\n constructor() {\n super();\n this.dial = new Dial();\n this.dialNeedle = new DialNeedle();\n this.textIndicator = new TextIndicator();\n }\n\n public draw(data: [{}]) {\n this.container.updateComponents(data);\n }\n\n\n public initialize(): void {\n super.initialize();\n\n this.container.add(this.dial).add(this.dialNeedle);\n if (this.config.get('numericIndicator')) {\n let width = this.config.get('width'),\n height = this.config.get('height');\n let r = (\n (width > height) ? height : width\n ) / 2;\n let indicatorOffset = r + 75;\n this.container.add(this.textIndicator);\n this.textIndicator.translate(r, indicatorOffset);\n }\n }\n}\n\nexport default SvgStrategyGauge;","import * as Colors from '../colors';\n\nexport const defaults : any = {\n selector: '#chart',\n colorScale: Colors.diverging_spectral2(),\n invertColorScale: true,\n minLevel: 0,\n maxLevel: 100,\n minAngle: -90,\n maxAngle: 90,\n ringWidth: 50,\n ringMargin: 20,\n labelInset: 10,\n needleNutRadius: 25,\n needleLenghtRatio: 0.8,\n numericIndicator: true,\n label: 'km/h',\n //margins\n marginTop: 20,\n marginRight: 250,\n marginBottom: 30,\n marginLeft: 50,\n //Width & height\n width: '50%', // %, auto, or numeric\n height: 250,\n ticks: 10, // ticks for y dial.\n propertyValue: 'value'\n};","import Chart from './Chart';\nimport SvgStrategyGauge from '../svg/strategies/SvgStrategyGauge';\nimport Config from '../Config';\nimport { defaults } from '../utils/defaults/gauge';\n\n\nclass Gauge extends Chart {\n\n constructor(data: any, userConfig: any = {}) {\n super(\n new SvgStrategyGauge(),\n data,\n userConfig,\n defaults\n );\n }\n\n\n public keepDrawing(datum: any) {\n this.data = [datum[0]];\n super.draw();\n }\n\n\n}\n\nexport default Gauge;","import Component from \"./Component\";\nimport YAxis from \"./YAxis\";\nimport XAxis from \"./XAxis\";\nimport {\n select,\n symbol,\n symbolCircle,\n symbolCross,\n symbolDiamond,\n symbolSquare,\n symbolStar,\n symbolTriangle,\n symbolWye\n} from \"d3\";\n\nclass CanvasPointset extends Component {\n\n private x: XAxis;\n private y: YAxis;\n private canvasCtx: any;\n\n constructor(x: XAxis, y: YAxis) {\n super();\n this.x = x;\n this.y = y;\n }\n\n public update(data: [any]): void {\n let propertyKey = this.config.get('propertyKey');\n let propertyX = this.config.get('propertyX');\n let propertyY = this.config.get('propertyY');\n\n let markerShape = this.config.get('markerShape'),\n markerSize = this.config.get('markerSize'),\n colorScale = this.config.get('colorScale'),\n points = null,\n series = null,\n dataContainer = null,\n width = this.config.get('width'),\n height = this.config.get('height');\n\n\n\n let shape = symbol()\n .size(markerSize)\n .context(this.canvasCtx);\n\n switch (markerShape) {\n case 'dot':\n shape.type(symbolCircle);\n break;\n case 'ring':\n shape.type(symbolCircle);\n break;\n case 'cross':\n shape.type(symbolCross);\n break;\n case 'diamond':\n shape.type(symbolDiamond);\n break;\n case 'square':\n shape.type(symbolSquare);\n break;\n case 'star':\n shape.type(symbolStar);\n break;\n case 'triangle':\n shape.type(symbolTriangle);\n break;\n case 'wye':\n shape.type(symbolWye);\n break;\n case 'circle':\n shape.type(symbolCircle);\n break;\n default:\n shape.type(symbolCircle);\n }\n\n // Custom DOM element, this won't be rendered\n dataContainer = this.svg.append('proteic');\n series = dataContainer.selectAll('proteic.g.points');\n this.canvasCtx.clearRect(0, 0, width, height);\n\n series\n .data(data, (d) => d[propertyKey])\n .enter()\n .call((s) => {\n let self = this;\n s.each(function (d) {\n self.canvasCtx.save();\n self.canvasCtx.translate(self.x.xAxis.scale()(d[propertyX]), self.y.yAxis.scale()(d[propertyY]));\n self.canvasCtx.beginPath();\n self.canvasCtx.strokeStyle = colorScale(d[propertyKey]);\n self.canvasCtx.fillStyle = colorScale(d[propertyKey]);\n shape();\n self.canvasCtx.closePath();\n self.canvasCtx.stroke();\n if (markerShape !== 'ring') {\n self.canvasCtx.fill();\n }\n self.canvasCtx.restore();\n });\n });\n }\n\n public render(): void {\n this.canvas = select(this.config.get('selector')).append('canvas')\n .attr('id', 'point-set-canvas')\n .attr('width', this.config.get('width'))\n .attr('height', this.config.get('height'))\n .style('position', 'absolute')\n .style('z-index', 2)\n .style('transform', `translate(${this.config.get('marginLeft')}px, ${this.config.get('marginTop')}px)`);\n\n this.canvasCtx = this.canvas.node().getContext('2d');\n }\n}\n\nexport default CanvasPointset;\n","import XYAxes from '../components/XYAxes';\nimport Pointset from '../components/Pointset';\nimport Legend from '../components/Legend';\n\nimport Config from '../../Config';\nimport SvgChart from '../base/SvgChart';\nimport { sortByField } from '../../utils/dataSorting';\nimport { convertByXYFormat } from '../../utils/dataTransformation';\nimport CanvasPointset from \"../components/CanvasPointset\";\n\nclass SvgStrategyScatterplot extends SvgChart {\n /**\n * \n * XY Axes. Horizontal and vertical references\n * \n * @private\n * @type {XYAxes}\n * @memberOf SvgStrategyScatterplot\n */\n private axes: XYAxes;\n\n /**\n * \n * Set of points\n * \n * @private\n * @type {Pointset}\n * @memberOf SvgStrategyScatterplot\n */\n private markers: Pointset;\n\n /**\n *\n * Set of points\n *\n * @private\n * @type {CanvasPointset}\n * @memberOf SvgStrategyScatterplot\n */\n private canvasMarkers: CanvasPointset;\n\n private legend: Legend;\n\n constructor() {\n super();\n this.axes = new XYAxes();\n this.markers = new Pointset(this.axes.x, this.axes.y);\n this.canvasMarkers = new CanvasPointset(this.axes.x, this.axes.y);\n }\n\n public draw(data: [{}]) {\n let xAxisFormat = this.config.get('xAxisFormat'),\n xAxisType = this.config.get('xAxisType'),\n yAxisFormat = this.config.get('yAxisFormat'),\n yAxisType = this.config.get('yAxisType');\n\n convertByXYFormat(data, xAxisFormat, xAxisType, yAxisFormat, yAxisType);\n sortByField(data, 'x');\n\n this.container.updateComponents(data);\n }\n\n\n public initialize(): void {\n super.initialize();\n let legend = this.config.get('legend');\n\n this.container.add(this.axes);\n\n if (this.config.get('canvas')) {\n this.container.add(this.canvasMarkers);\n } else {\n this.container.add(this.markers);\n }\n\n if (legend) {\n this.legend = new Legend();\n this.container.add(this.legend);\n }\n }\n}\n\nexport default SvgStrategyScatterplot;","import * as Colors from '../colors';\n\nexport const defaults : any = {\n selector: '#chart',\n colorScale: Colors.category7(),\n\n //Axes\n xAxisType: 'linear',\n xAxisFormat: '.1f',\n xAxisLabel: '',\n xAxisGrid: true,\n yAxisType: 'linear',\n yAxisFormat: '.1f',\n yAxisLabel: '',\n yAxisShow: true,\n yAxisGrid: true,\n //margins\n marginTop: 20,\n marginRight: 250,\n marginBottom: 130,\n marginLeft: 150,\n //markers\n markerShape: 'circle',\n markerSize: 15,\n //Width & height\n width: '100%', // %, auto, or numeric\n height: 250,\n legend: true,\n propertyX: 'x',\n propertyY: 'y',\n propertyKey: 'key',\n //Events\n onDown(d: any) {\n },\n onHover(d: any) {\n },\n onLeave(d: any) {\n },\n onClick(d: any) {\n },\n onUp(d: any) {\n },\n maxNumberOfElements: 100, // used by keepDrawing method to reduce the number of elements in the current chart\n canvas: false\n};","import Chart from './Chart';\nimport SvgStrategyScatterplot from '../svg/strategies/SvgStrategyScatterplot';\nimport Config from '../Config';\nimport { defaults } from '../utils/defaults/scatterplot';\nimport { copy } from '../utils/functions';\n\n\nclass Scatterplot extends Chart {\n\n constructor(data: any, userConfig: any = {}) {\n super(\n new SvgStrategyScatterplot(),\n data,\n userConfig,\n defaults\n );\n }\n\n\n public keepDrawing(datum: any) {\n var datumType = datum.constructor;\n\n if (datumType === Array) {\n if (this.data) {\n this.data = this.data.concat(datum);\n } else {\n this.data = datum;\n }\n }\n else {\n this.data.push(datum);\n }\n this.draw(copy(this.data));\n }\n\n\n\n}\n\nexport default Scatterplot;","\nimport Component from './Component';\nimport XYAxes from './XYAxes';\nimport Config from '../../Config';\nimport { simple2stacked } from '../../utils/dataTransformation';\nimport Globals from '../../Globals';\nimport {\n area,\n curveCardinal,\n nest,\n map,\n stackOrderInsideOut,\n stackOffsetWiggle,\n stack as d3Stack\n} from 'd3';\n\nclass Streamset extends Component {\n\n private xyAxes: XYAxes;\n private areaGenerator: any;\n\n constructor(xyAxes: XYAxes) {\n super();\n this.xyAxes = xyAxes;\n this.areaGenerator = area()\n .curve(curveCardinal)\n .y0((d) => this.xyAxes.y.yAxis.scale()(d[0]))\n .y1((d) => this.xyAxes.y.yAxis.scale()(d[1]));\n }\n\n\n public render(): void {\n //Do nothing, since lines render only when new data is received.\n }\n\n public update(data: [any]): void {\n let propertyKey = this.config.get('propertyKey');\n let propertyX = this.config.get('propertyX');\n let propertyY = this.config.get('propertyY');\n\n this.clean();\n let colorScale = this.config.get('colorScale'),\n onDown = this.config.get('onDown'),\n onUp = this.config.get('onUp'),\n onLeave = this.config.get('onLeave'),\n onHover = this.config.get('onHover'),\n onClick = this.config.get('onClick'),\n keys = map(data, (d) => d[propertyKey]).keys(),\n data4stack = simple2stacked(data),\n stack = this.config.get('stack'),\n dataSeries = stack(data4stack),\n series: any = null;\n \n this.areaGenerator.x((d: any) => this.xyAxes.x.xAxis.scale()((new Date(d.data[propertyKey]))));\n\n series = this.svg.selectAll('.serie')\n .data(dataSeries)\n .enter()\n .append('g')\n .attr('class', 'serie')\n .style('stroke', (d: any, i: number) => colorScale(d[propertyKey]))\n .attr(Globals.COMPONENT_DATA_KEY_ATTRIBUTE, (d: any) => d[propertyKey]);\n\n series\n .append('path')\n .attr('class', 'layer')\n .attr('d', this.areaGenerator)\n .style('fill', (d: any, i: number) => colorScale(d[propertyKey]));\n\n series.exit().remove();\n\n series\n .attr('opacity', 1)\n .on('mousedown.user', onDown)\n .on('mouseup.user', onUp)\n .on('mouseleave.user', onLeave)\n .on('mouseover.user', onHover)\n .on('click.user', onClick);\n }\n\n}\n\nexport default Streamset;","import XYAxes from '../components/XYAxes';\nimport Legend from '../components/Legend';\nimport Streamset from '../components/Streamset';\n\nimport Config from '../../Config';\nimport SvgChart from '../base/SvgChart';\nimport { sortByField } from '../../utils/dataSorting';\nimport { convertPropretiesToTimeFormat } from '../../utils/dataTransformation';\n\nclass SvgStrategyStreamgraph extends SvgChart {\n /**\n * \n * XY Axes. Horizontal and vertical references\n * \n * @private\n * @type {XYAxes}\n * @memberOf SvgStrategyStreamgraph\n */\n private axes: XYAxes;\n\n private legend: Legend;\n\n private streams: Streamset;\n\n\n constructor() {\n super();\n this.axes = new XYAxes();\n this.streams = new Streamset(this.axes);\n }\n\n public draw(data: [{}]) {\n let xAxisFormat = this.config.get('xAxisFormat'),\n xAxisType = this.config.get('xAxisType'),\n yAxisFormat = this.config.get('yAxisFormat'),\n yAxisType = this.config.get('yAxisType');\n \n convertPropretiesToTimeFormat(data, ['x'], xAxisFormat); \n\n sortByField(data, 'x');\n\n this.container.updateComponents(data);\n }\n\n\n public initialize(): void {\n super.initialize();\n let markerSize = this.config.get('markerSize'),\n areaOpacity = this.config.get('areaOpacity'),\n legend = this.config.get('legend');\n\n this.container.add(this.axes).add(this.streams);\n\n if (legend) {\n this.legend = new Legend();\n this.container.add(this.legend);\n }\n }\n}\n\nexport default SvgStrategyStreamgraph;","import * as Colors from '../colors';\nimport {\n stackOrderInsideOut,\n stackOffsetWiggle,\n stack as d3Stack\n} from 'd3';\n\nexport const defaults : any = {\n selector: '#chart',\n colorScale: Colors.category4(),\n //Axes\n xAxisType: 'time',\n xAxisFormat: '%y/%m/%d',\n xAxisLabel: '',\n xAxisGrid: true,\n yAxisType: 'linear',\n yAxisFormat: '',\n yAxisLabel: '',\n yAxisShow: false,\n yAxisGrid: false,\n //margins\n marginTop: 20,\n marginRight: 250,\n marginBottom: 130,\n marginLeft: 150,\n //Width & height\n width: '100%', // %, auto, or numeric \n height: 250,\n legend: true,\n propertyX: 'x',\n propertyY: 'y',\n propertyKey: 'key',\n stack: d3Stack().value((d, k) => d.value[k]).order(stackOrderInsideOut).offset(stackOffsetWiggle),\n stacked: true,\n //Events\n onDown(d: any) {\n },\n onHover(d: any) {\n },\n onLeave(d: any) {\n },\n onClick(d: any) {\n },\n onUp(d: any) {\n\n },\n maxNumberOfElements: 100, // used by keepDrawing method to reduce the number of elements in the current chart\n};","import Chart from './Chart';\nimport SvgStrategyStreamgraph from '../svg/strategies/SvgStrategyStreamgraph';\nimport Config from '../Config';\nimport { defaults } from '../utils/defaults/streamgraph';\nimport { copy } from '../utils/functions';\n\n\n\nclass Streamgraph extends Chart {\n\n constructor(data: any, userConfig: any = {}) {\n super(\n new SvgStrategyStreamgraph(),\n data,\n userConfig,\n defaults\n );\n }\n\n public keepDrawing(datum: any) {\n var datumType = datum.constructor;\n\n if (datumType === Array) {\n this.data = this.data.concat(datum);\n }\n else {\n this.data.push(datum);\n }\n this.draw(copy(this.data));\n }\n\n}\n\nexport default Streamgraph;","import * as Colors from '../colors';\nimport {\n stackOrderInsideOut,\n stackOffsetNone,\n stack as d3Stack\n} from 'd3';\n\nexport const defaults: any = {\n selector: '#chart',\n colorScale: Colors.category2(),\n //Axes\n xAxisType: 'time',\n xAxisFormat: '%y/%m/%d',\n xAxisLabel: '',\n xAxisGrid: true,\n yAxisType: 'linear',\n yAxisFormat: '',\n yAxisLabel: '',\n yAxisShow: true,\n yAxisGrid: true,\n //margins\n marginTop: 20,\n marginRight: 250,\n marginBottom: 130,\n marginLeft: 150,\n //Width & height\n width: '100%', // %, auto, or numeric \n height: 250,\n legend: true,\n propertyX: 'x',\n propertyY: 'y',\n propertyKey: 'key',\n stacked: true,\n stack: d3Stack().value((d, k) => d.value[k]).order(stackOrderInsideOut).offset(stackOffsetNone),\n //Events\n onDown(d: any) {\n },\n onHover(d: any) {\n },\n onLeave(d: any) {\n },\n onClick(d: any) {\n },\n onUp(d: any) {\n\n },\n maxNumberOfElements: 100, // used by keepDrawing method to reduce the number of elements in the current chart\n};","import Chart from './Chart';\nimport SvgStrategyStreamgraph from '../svg/strategies/SvgStrategyStreamgraph';\nimport Config from '../Config';\nimport { defaults } from '../utils/defaults/stackedArea';\nimport { copy } from '../utils/functions';\nimport {\n stackOrderInsideOut,\n stackOffsetNone,\n stack as d3Stack\n} from 'd3';\n\nclass StackedArea extends Chart {\n\n constructor(data: any, userConfig: any = {}) {\n super(\n new SvgStrategyStreamgraph(), //It uses the same strategy than streamgraph. The only difference is the stack.\n data,\n userConfig,\n defaults\n );\n }\n\n public keepDrawing(datum: any) {\n var datumType = datum.constructor;\n\n if (datumType === Array) {\n this.data = this.data.concat(datum);\n }\n else {\n this.data.push(datum);\n }\n this.draw(copy(this.data));\n }\n\n\n}\n\nexport default StackedArea;","\nimport Component from './Component';\nimport XYAxes from './XYAxes';\nimport Config from '../../Config';\nimport { simple2nested } from '../../utils/dataTransformation';\nimport Globals from '../../Globals';\n\nimport {\n extent,\n line,\n nest,\n scaleBand,\n scaleLinear,\n map\n} from 'd3';\n\nclass Timeboxset extends Component {\n\n private xyAxes: XYAxes;\n\n constructor(xyAxes: XYAxes) {\n super();\n this.xyAxes = xyAxes;\n }\n\n\n public render(): void {\n //Do nothing, since lines render only when new data is received.\n }\n\n public update(data: [any]): void {\n let propertyKey = this.config.get('propertyKey');\n let propertyStart = this.config.get('propertyStart');\n let propertyEnd = this.config.get('propertyEnd');\n\n let colorScale = this.config.get('colorScale'),\n height = this.config.get('height'),\n onDown = this.config.get('onDown'),\n onUp = this.config.get('onUp'),\n onLeave = this.config.get('onLeave'),\n onHover = this.config.get('onHover'),\n onClick = this.config.get('onClick'),\n keys = map(data, (d) => d[propertyKey]).keys(),\n layer = this.svg.selectAll('.serie').data(data),\n layerEnter = null,\n layerMerge = null,\n box = null,\n boxEnter = null,\n boxMerge = null,\n extLanes = null,\n yLanes = null,\n yLanesBand = scaleBand().range([0, keys.length + 1]).domain(keys),\n x = this.xyAxes.x.xAxis.scale(),\n y = this.xyAxes.y.yAxis.scale();\n\n data = simple2nested(data);\n extLanes = extent(data, (d, i) => i);\n yLanes = scaleLinear().domain([extLanes[0], extLanes[1] + 1]).range([0, height]);\n\n layer = this.svg.selectAll('.serie').data(data);\n layerEnter = layer.enter().append('g');\n\n layerMerge = layer.merge(layerEnter)\n .attr('class', 'serie')\n .attr(Globals.COMPONENT_DATA_KEY_ATTRIBUTE, (d: any) => d[propertyKey]);\n\n\n box = layerMerge.selectAll('rect')\n .data((d: any) => d.values);\n\n boxEnter = box.enter().append('rect');\n\n boxMerge = box.merge(boxEnter)\n .attr('width', (d: any) => x(d[propertyEnd]) - x(d[propertyStart]))\n .attr('x', (d: any) => x(d[propertyStart]))\n .attr('y', (d: any) => y(d[propertyKey]))\n .attr('height', () => 0.8 * yLanes(1))\n .style('fill', (d: any) => colorScale(d[propertyKey]));\n\n box = this.svg.selectAll('g.serie rect');\n\n box\n .on('mousedown.user', onDown)\n .on('mouseup.user', onUp)\n .on('mouseleave.user', onLeave)\n .on('mouseover.user', onHover)\n .on('click.user', onClick);\n }\n\n}\n\nexport default Timeboxset;","import XYAxes from '../components/XYAxes';\nimport Legend from '../components/Legend';\nimport TimeBoxset from '../components/Timeboxset';\n\nimport Config from '../../Config';\nimport SvgChart from '../base/SvgChart';\nimport { sortByField } from '../../utils/dataSorting';\nimport { convertPropretiesToTimeFormat } from '../../utils/dataTransformation';\n\nclass SvgStrategySwimlane extends SvgChart {\n /**\n * \n * XY Axes. Horizontal and vertical references\n * \n * @private\n * @type {XYAxes}\n * @memberOf SvgStrategySwimlane\n */\n private axes: XYAxes;\n\n private legend: Legend;\n\n\n private boxes: TimeBoxset;\n\n constructor() {\n super();\n this.axes = new XYAxes();\n this.boxes = new TimeBoxset(this.axes);\n }\n\n public draw(data: [{}]) {\n let xAxisFormat = this.config.get('xAxisFormat');\n convertPropretiesToTimeFormat(data, ['start', 'end'], xAxisFormat); \n \n sortByField(data, 'start');\n \n this.container.updateComponents(data);\n }\n\n\n public initialize(): void {\n super.initialize();\n let markerSize = this.config.get('markerSize'),\n areaOpacity = this.config.get('areaOpacity'),\n legend = this.config.get('legend');\n\n this.container.add(this.axes);\n\n if (legend) {\n this.legend = new Legend();\n this.container.add(this.legend).add(this.boxes);\n }\n }\n}\n\nexport default SvgStrategySwimlane;","import * as Colors from '../colors';\n\nexport const defaults : any = {\n selector: '#chart',\n colorScale: Colors.category3(),\n //Axes\n xAxisType: 'time',\n xAxisFormat: '%y/%m/%d',\n xAxisLabel: '',\n xAxisGrid: true,\n yAxisType: 'categorical',\n yAxisFormat: 's',\n yAxisLabel: '',\n yAxisShow: true,\n yAxisGrid: true,\n //margins\n marginTop: 20,\n marginRight: 250,\n marginBottom: 30,\n marginLeft: 50,\n //Width & height\n width: '100%', // %, auto, or numeric \n height: 250,\n legend: true,\n propertyStart: 'start', \n propertyEnd: 'end',\n propertyKey: 'key',\n //Events\n onDown(d: any) {\n },\n onHover(d: any) {\n },\n onLeave(d: any) {\n },\n onClick(d: any) {\n },\n onUp(d: any) {\n\n }\n};","import Chart from './Chart';\nimport SvgStrategySwimlane from '../svg/strategies/SvgStrategySwimlane';\nimport Config from '../Config';\nimport { defaults } from '../utils/defaults/swimlane';\nimport { calculateWidth } from '../utils/screen';\nimport {\n stackOrderInsideOut,\n stackOffsetWiggle,\n stack as d3Stack\n} from 'd3';\nimport { copy } from '../utils/functions';\n\nclass Swimlane extends Chart {\n\n constructor(data: any, userConfig: any = {}) {\n super(\n new SvgStrategySwimlane(),\n data,\n userConfig,\n defaults\n );\n }\n\n public keepDrawing(datum: any) {\n var datumType = datum.constructor;\n\n if (datumType === Array) {\n this.data = this.data.concat(datum);\n }\n else {\n this.data.push(datum);\n }\n this.draw(copy(this.data));\n }\n}\n\nexport default Swimlane;","import Component from \"./Component\";\nimport {scaleLinear} from \"d3\";\n\nclass XRadialAxis extends Component {\n\n private _xRadialAxis: any;\n\n constructor() {\n super();\n }\n\n update(data): void {}\n\n render(): void {\n this._xRadialAxis = scaleLinear().range([0, 2 * Math.PI]);\n }\n\n get xRadialAxis(): any {\n return this._xRadialAxis;\n }\n}\n\nexport default XRadialAxis;","import Component from './Component';\nimport {\n scaleSqrt\n} from 'd3';\n\nclass YRadialAxis extends Component {\n\n private _yRadialAxis: any;\n\n constructor() {\n super();\n }\n\n public render() {\n let width = this.config.get('width'),\n height = this.config.get('height'),\n radius = null;\n radius = (Math.min(width, height) / 2) - 10;\n this._yRadialAxis = scaleSqrt().range([0, radius]);\n };\n \n public update(data: [any]) {};\n\n get yRadialAxis(): any {\n return this._yRadialAxis;\n }\n}\n\nexport default YRadialAxis;","import Component from \"./Component\";\nimport XRadialAxis from './XRadialAxis';\nimport YRadialAxis from \"./YRadialAxis\";\nimport Config from \"../../Config\";\n\nclass RadialAxes extends Component {\n private _x: XRadialAxis;\n private _y: YRadialAxis;\n\n constructor() {\n super();\n this._x = new XRadialAxis();\n this._y = new YRadialAxis();\n }\n\n public configure(config: Config, svg: any){\n super.configure(config, svg);\n this._x.configure(config, svg);\n this._y.configure(config, svg);\n }\n\n public render(): void {\n this._x.render();\n this._y.render();\n }\n\n public update(data): void {\n this._x.update(data);\n this._y.update(data);\n }\n\n\n get x(): XRadialAxis {\n return this._x;\n }\n\n get y(): YRadialAxis {\n return this._y;\n }\n}\n\nexport default RadialAxes;\n","import Component from \"./Component\";\nimport XRadialAxis from \"./XRadialAxis\"\nimport YRadialAxis from \"./YRadialAxis\"\nimport {arc, stratify, partition} from \"d3\";\n\nclass SunburstDisk extends Component {\n\n private x: XRadialAxis;\n private y: YRadialAxis;\n\n constructor(x: XRadialAxis, y: YRadialAxis) {\n super();\n this.x = x;\n this.y = y;\n\n }\n\n /**\n * Removes all the paths (arcs). Doing this before each redraw prevents the\n * transition to mess up the arcs.\n * @private\n */\n private removePaths() {\n this.svg.selectAll('path').remove();\n }\n\n /**\n * From: http://bl.ocks.org/kerryrodden/7090426\n * @param node\n * @returns {Array}\n * @private\n */\n private getAncestors(node) {\n let path = [];\n let current = node;\n while (current.parent) {\n path.unshift(current);\n current = current.parent;\n }\n return path;\n }\n\n update(data: [any]): void {\n let arcGen = arc()\n .startAngle((d) => Math.max(0, Math.min(2 * Math.PI, this.x.xRadialAxis(d.x0))))\n .endAngle((d) => Math.max(0, Math.min(2 * Math.PI, this.x.xRadialAxis(d.x1))))\n .innerRadius((d) => Math.max(0, this.y.yRadialAxis(d.y0)))\n .outerRadius((d) => Math.max(0, this.y.yRadialAxis(d.y1)));\n let colorScale = this.config.get('colorScale');\n\n // Remove all the paths before redrawing\n this.removePaths();\n\n // Create layout partition\n let root = stratify()\n .id((d) => d.id)\n .parentId((d) => d.parent)\n (data);\n root.sum((d) => d.value);\n partition()(root);\n\n // Draw the paths (arcs)\n let paths = this.svg.selectAll('path')\n .data(root.descendants())\n .enter().append('path')\n .attr('d', arcGen)\n .style('fill', (d) => {\n if (!d.parent) {\n return 'white';\n } else {\n return colorScale(d.data.label);\n }\n })\n .style('stroke', '#fff')\n .style('stroke-width', '2')\n .style('shape-rendering', 'crispEdge');\n\n paths // TODO extract events to config?\n .on('mouseover.default', (d) => {\n let ancestors = this.getAncestors(d);\n // Fade all the arcs\n if (ancestors.length > 0) {\n this.svg.selectAll('path')\n .style('opacity', 0.3);\n }\n this.svg.selectAll('path')\n .filter((node) => ancestors.indexOf(node) >= 0)\n .style('opacity', 1);\n // Hightlight the hovered arc\n this.svg.select('.text-indicator .label').text(d.data.label);\n this.svg.select('.text-indicator .value').text(d.value);\n })\n .on('mouseout.default', (d) => {\n this.svg.selectAll('path').style('opacity', 1);\n this.svg.select('.text-indicator .label').style('font-weight', 'normal');\n this.svg.select('.text-indicator .label').text('');\n this.svg.select('.text-indicator .value').text('');\n });\n\n paths\n .on('mousedown.user', this.config.get('onDown'))\n .on('mouseup.user', this.config.get('onUp'))\n .on('mouseleave.user', this.config.get('onLeave'))\n .on('mouseover.user', this.config.get('onHover'))\n .on('click.user', this.config.get('onClick'));\n }\n\n render(): void {\n }\n}\n\nexport default SunburstDisk;","import SvgChart from \"../base/SvgChart\";\nimport RadialAxes from \"../components/RadialAxes\";\nimport SunburstDisk from \"../components/SunburstDisk\";\nimport TextIndicator from \"../components/TextIndicator\";\n\nclass SvgStrategySunburst extends SvgChart {\n\n private axes: RadialAxes;\n private disk: SunburstDisk;\n private textIndicator: TextIndicator;\n\n constructor() {\n super();\n this.axes = new RadialAxes();\n this.disk = new SunburstDisk(\n this.axes.x, this.axes.y\n );\n this.textIndicator = new TextIndicator();\n }\n\n public draw(data: [{}]) {\n this.container.translate(\n this.config.get('width') / 2,\n this.config.get('height') / 2\n );\n this.container.updateComponents(data);\n }\n\n public initialize(): void {\n super.initialize();\n this.container\n .add(this.axes)\n .add(this.disk)\n .add(this.textIndicator);\n }\n\n}\n\nexport default SvgStrategySunburst;\n","import * as Colors from '../colors';\n\nexport const defaults : any = {\n selector: '#chart',\n colorScale: Colors.category8(),\n marginTop: 20,\n marginRight: 20,\n marginBottom: 30,\n marginLeft: 50,\n width: '50%', // %, auto, or numeric\n height: 450,\n tickLabel: '',\n transitionDuration: 300,\n maxNumberOfElements: 5, // used by keepDrawing to reduce the number of elements in the current chart\n sortData: {\n descending: false,\n prop: 'x'\n },\n //Events\n onDown(d: any) {\n },\n onHover(d: any) {\n },\n onLeave(d: any) {\n },\n onClick(d: any) {\n },\n onUp(d: any) {\n }\n};","import Chart from \"./Chart\";\nimport Config from \"../Config\";\nimport SvgStrategySunburst from \"../svg/strategies/SvgStrategySunburst\";\nimport { defaults } from \"../utils/defaults/sunburst\";\nimport { copy } from \"../utils/functions\";\n\nclass Sunburst extends Chart {\n\n\n constructor(data: any, userConfig: any = {}) {\n super(\n new SvgStrategySunburst(),\n data,\n userConfig,\n defaults\n );\n }\n\n protected keepDrawing(datum: any) {\n let datumType = datum.constructor;\n if (datumType === Array) {\n if (this.data) {\n this.data = this.data.concat(datum);\n } else {\n this.data = datum;\n }\n }\n else {\n this.data.push(datum);\n }\n this.draw(copy(this.data));\n }\n\n}\n\nexport default Sunburst;","import Component from './Component';\nimport Zoomable from './Zoomable';\nimport Config from '../../Config';\nimport { simple2Linked } from '../../utils/dataTransformation';\nimport Globals from '../../Globals';\n\nimport {\n drag,\n event,\n selection,\n select,\n nest,\n forceSimulation,\n forceLink,\n forceManyBody,\n forceCenter,\n Simulation,\n SimulationNodeDatum,\n SimulationLinkDatum,\n Force,\n scaleLinear,\n D3ZoomEvent\n} from 'd3';\n\nclass LinkedNodeset extends Component implements Zoomable {\n\n private simulation: any;\n private dragstarted: any;\n private dragged: any;\n private dragended: any;\n private linkedByIndex: any;\n private toggle: number = 0;\n\n\n constructor() {\n super();\n }\n\n public render() {\n let width: number = this.config.get('width'),\n height: number = this.config.get('height');\n\n this.simulation = forceSimulation()\n .force(\"link\", forceLink().id((d: any) => d.id).distance(50))\n .force(\"charge\", forceManyBody())\n .force(\"center\", forceCenter(width / 2, height / 2));\n\n this.dragstarted = (d: SimulationNodeDatum) => {\n if (!event.active) this.simulation.alphaTarget(0.3).restart();\n d.fx = d.x;\n d.fy = d.y;\n };\n\n this.dragged = (d: SimulationNodeDatum) => {\n d.fx = event['x'];\n d.fy = event['y'];\n };\n\n this.dragended = (d: SimulationNodeDatum) => {\n if (!event.active) this.simulation.alphaTarget(1);\n d.fx = null;\n d.fy = null;\n };\n\n }\n\n public update(data: any) {\n let nodeRadius = this.config.get('nodeRadius'),\n colorScale = this.config.get('colorScale'),\n linkWeight = this.config.get('linkWeight'),\n nodeWeight = this.config.get('nodeWeight'),\n minLinkWeight = this.config.get('minLinkWeight'),\n maxLinkWeight = this.config.get('maxLinkWeight'),\n minNodeWeight = this.config.get('minNodeWeight'),\n maxNodeWeight = this.config.get('maxNodeWeight'),\n weighted = this.config.get('weighted'),\n linkScaleRadius = scaleLinear().domain([minLinkWeight, maxLinkWeight]).range([0, 3]),\n nodeScaleRadius = scaleLinear().domain([minNodeWeight, maxNodeWeight]).range([0, 15]),\n labelShow = this.config.get('labelShow'),\n labelField = this.config.get('labelField'),\n node: any = null,\n link: any = null,\n text: any = null;\n //Transform data\n data = simple2Linked(data);\n\n this.svg.selectAll('g.links').remove();\n this.svg.selectAll('g.nodes').remove();\n this.svg.selectAll('g.labels').remove();\n\n link = this.svg.append('g')\n .attr('class', 'serie')\n .append(\"g\")\n .attr(\"class\", \"links\")\n .selectAll(\"line\")\n .data(data.links)\n .enter()\n .append(\"line\")\n .attr(Globals.COMPONENT_DATA_KEY_ATTRIBUTE, (d: any) => {console.log(d); return d.key})\n .attr(\"stroke-width\", (d: any) => (weighted && d.weight) ? linkScaleRadius(d.weight) : linkWeight)\n .attr(\"stroke\", \"#999\")\n .attr(\"stroke-opacity\", 1);\n\n node = this.svg.select('g.serie').append(\"g\")\n .attr(\"class\", \"nodes\")\n .selectAll(\"circle\")\n .data(data.nodes)\n .enter()\n .append(\"circle\")\n .attr(Globals.COMPONENT_DATA_KEY_ATTRIBUTE, (d: any) => d.key)\n .attr(\"r\", (d: any) => (weighted && d.weight) ? nodeScaleRadius(d.weight) : nodeWeight)\n .attr(\"fill\", (d: any) => colorScale(d.key))\n .attr(\"stroke\", \"white\")\n .call(drag()\n .on(\"start\", this.dragstarted)\n .on(\"drag\", this.dragged)\n .on(\"end\", this.dragended));\n\n let chart = this;\n node\n // .on('dblclick.default', function() {\n // chart.connectedNodes(this, node, link);\n // })\n .on('mousedown.user', this.config.get('onDown'))\n .on('mouseup.user', this.config.get('onUp'))\n .on('mouseleave.user', this.config.get('onLeave'))\n .on('mouseover.user', this.config.get('onHover'))\n .on('click.user', this.config.get('onClick'));\n\n //Append node labels\n if (labelShow) {\n text = this.svg.select('g.serie').append(\"g\")\n .attr(\"class\", \"labels\")\n .selectAll('text')\n .data(data.nodes)\n .enter()\n .append('text')\n .attr(Globals.COMPONENT_DATA_KEY_ATTRIBUTE, (d: any) => d.key)\n .attr('dx', 10)\n .attr('dy', '.35em')\n .attr('font-size', '.85em')\n .text(typeof labelField === 'string' ? (d: any) => d[labelField] : labelField)\n .on('mousedown.user', this.config.get('onDown'))\n .on('mouseup.user', this.config.get('onUp'))\n .on('mouseleave.user', this.config.get('onLeave'))\n .on('mouseover.user', this.config.get('onHover'))\n .on('click.user', this.config.get('onClick'));\n }\n this.simulation.nodes(data.nodes).on(\"tick\", () => labelShow ? this.tickedWithText(link, node, text) : this.ticked(link, node));\n this.simulation.force(\"link\").links(data.links);\n\n }\n private tickedWithText(link: any, node: any, text: any) {\n this.ticked(link, node);\n text\n .attr('x', (d: any) => d.x)\n .attr('y', (d: any) => d.y);\n }\n\n private ticked(link: any, node: any) {\n link\n .attr(\"x1\", (d: any) => d.source.x)\n .attr(\"y1\", (d: any) => d.source.y)\n .attr(\"x2\", (d: any) => d.target.x)\n .attr(\"y2\", (d: any) => d.target.y);\n\n node\n .attr(\"cx\", (d: any) => d.x)\n .attr(\"cy\", (d: any) => d.y);\n }\n\n public zoom(event: D3ZoomEvent) {\n let transform: any = event.transform;\n\n this.svg.selectAll('.nodes circle').attr('transform', transform);\n this.svg.selectAll('.links line').attr('transform', transform);\n this.svg.selectAll('.labels text').attr('transform', transform);\n }\n\n}\n\nexport default LinkedNodeset;","import Component from './Component';\nimport Zoomable from './Zoomable';\nimport Config from '../../Config';\n\nimport {\n selection,\n select,\n zoom,\n event\n} from 'd3';\n\n\nclass ZoomComponent extends Component {\n\n private zoom: any;\n private zoomerComponent: Zoomable;\n\n constructor(zoomerComponent: Zoomable) {\n super();\n this.zoomerComponent = zoomerComponent;\n this.zoom = zoom().scaleExtent([1 / 2, 4]);\n }\n\n public render() {\n let selector = this.config.get('selector');\n select(selector).call(this.zoom);\n\n this.zoom.on('zoom', () => {\n this.zoomerComponent.zoom(event);\n });\n }\n\n public update(data: [any]) {\n\n }\n}\n\nexport default ZoomComponent;","import LinkedNodeset from '../components/LinkedNodeset';\nimport Legend from '../components/Legend';\nimport ZoomComponent from '../components/ZoomComponent';\nimport Config from '../../Config';\nimport SvgChart from '../base/SvgChart';\nimport { sortByField } from '../../utils/dataSorting';\n\nclass SvgStrategyNetwork extends SvgChart {\n\n private linkedNodes: LinkedNodeset;\n private legend: Legend;\n private zoom: ZoomComponent;\n\n constructor() {\n super();\n }\n\n public draw(data: [{}]) {\n this.container.updateComponents(data);\n }\n\n\n public initialize(): void {\n super.initialize();\n let legend = this.config.get('legend');\n let zoom = this.config.get('zoom'); \n \n this.linkedNodes = new LinkedNodeset();\n this.container.add(this.linkedNodes);\n if (legend) {\n this.legend = new Legend();\n this.container.add(this.legend);\n }\n\n if (zoom) {\n this.zoom = new ZoomComponent(this.linkedNodes);\n this.container.add(this.zoom);\n }\n }\n}\n\nexport default SvgStrategyNetwork;","import * as Colors from '../colors';\n\nexport const defaults : any = {\n selector: '#chart',\n colorScale: Colors.category7(),\n //margins\n marginTop: 20,\n marginRight: 250,\n marginBottom: 130,\n marginLeft: 150,\n //Width & height\n width: '100%', // %, auto, or numeric\n height: 250,\n //Node\n nodeRadius: 8.5,\n legend: true,\n //Network\n linkWeight: 1,\n nodeWeight: 8,\n minLinkValue: 0,\n maxLinkValue: 10,\n minNodeWeight: 0,\n maxNodeWeight: 100,\n weighted: false,\n //Labels\n labelShow: true,\n labelField: 'id',\n //Events\n zoom: true,\n onDown(d: any) {\n },\n onHover(d: any) {\n },\n onLeave(d: any) {\n },\n onClick(d: any) {\n },\n onUp(d: any) {\n }\n};","import Chart from './Chart';\nimport SvgStrategyNetwork from '../svg/strategies/SvgStrategyNetwork';\nimport Config from '../Config';\nimport { defaults } from '../utils/defaults/network';\nimport { copy } from '../utils/functions';\n\n\nclass Network extends Chart {\n\n constructor(data: any, userConfig: any = {}) {\n super(\n new SvgStrategyNetwork(),\n data,\n userConfig,\n defaults\n );\n }\n\n\n public keepDrawing(datum: any) {\n var datumType = datum.constructor;\n\n if (datumType === Array) {\n this.data = this.data.concat(datum);\n }\n else {\n this.data.push(datum);\n }\n this.draw(copy(this.data));\n }\n\n}\n\nexport default Network;","import Component from './Component';\nimport Config from '../../Config';\nimport XAxis from './XAxis';\nimport YAxis from './YAxis';\nimport { simple2nested, simple2stacked } from '../../utils/dataTransformation';\nimport Globals from '../../Globals';\nimport {\n stack,\n scaleBand,\n map,\n area,\n selection,\n nest,\n pie,\n arc\n} from 'd3';\n\n\nclass SectorSet extends Component {\n\n\n constructor() {\n super();\n }\n\n public render() {\n //Do nothing, since points render only when new data is received.\n }\n\n public update(data: [any]) {\n let propertyKey = this.config.get('propertyKey');\n let propertyX = this.config.get('propertyX');\n let width = this.config.get('width');\n let height = this.config.get('height');\n let radius = Math.min(width, height) / 2;\n\n let colorScale = this.config.get('colorScale');\n \n let myPie = pie().value((d:any) => d[propertyX])(data);\n let myArc = arc().innerRadius(0).outerRadius(radius);\n \n let arcs = this.svg.selectAll(\"g.slice\").data(myPie);\n let newBlock = arcs.enter(); \n\n newBlock\n .append(\"g\")\n .attr(Globals.COMPONENT_DATA_KEY_ATTRIBUTE, (d: any) => d.data[propertyKey])\n .append(\"path\")\n .attr('fill', \n (d: any, i: number) => \n d.data[propertyKey] !== undefined ? colorScale(d.data[propertyKey]) : colorScale(i))\n .attr(\"d\", myArc);\n \n }\n}\n\nexport default SectorSet;","import SvgChart from \"../base/SvgChart\";\nimport SectorSet from \"../components/SectorSet\";\nimport Legend from \"../components/Legend\";\n\nclass SvgStrategyPieChart extends SvgChart {\n\n private sectors: SectorSet;\n private legend: Legend;\n\n constructor() {\n super();\n this.sectors = new SectorSet();\n \n }\n\n public draw(data: [{}]) {\n this.container.translate(\n this.config.get('width') / 2,\n this.config.get('height') / 2\n );\n this.container.updateComponents(data);\n }\n\n public initialize(): void {\n super.initialize();\n this.container\n .add(this.sectors)\n \n let legend = this.config.get('legend');\n if(legend) {\n this.legend = new Legend();\n this.container.add(this.legend);\n }\n \n }\n\n}\n\nexport default SvgStrategyPieChart;\n","import * as Colors from '../colors';\n\nexport const defaults : any = {\n selector: '#chart',\n colorScale: Colors.category8(),\n marginTop: 0,\n marginRight: '100',\n marginBottom: 0,\n marginLeft: 0,\n width: '500', // %, auto, or numeric\n height: '500',\n transitionDuration: 300,\n maxNumberOfElements: 5, // used by keepDrawing to reduce the number of elements in the current chart\n legend: true,\n propertyX: 'x',\n propertyKey: 'key',\n sortData: {\n descending: false,\n prop: 'x'\n },\n //Events\n onDown(d: any) {\n },\n onHover(d: any) {\n },\n onLeave(d: any) {\n },\n onClick(d: any) {\n },\n onUp(d: any) {\n }\n};","import Chart from \"./Chart\";\nimport Config from \"../Config\";\nimport SvgStrategyPieChart from \"../svg/strategies/SvgStrategyPieChart\";\nimport { defaults } from \"../utils/defaults/piechart\";\nimport { copy } from \"../utils/functions\";\n\nclass PieChart extends Chart {\n\n\n constructor(data: any, userConfig: any = {}) {\n super(\n new SvgStrategyPieChart,\n data,\n userConfig,\n defaults\n );\n }\n\n protected keepDrawing(datum: any) {\n let datumType = datum.constructor;\n if (datumType === Array) {\n if (this.data) {\n this.data = this.data.concat(datum);\n } else {\n this.data = datum;\n }\n }\n else {\n this.data.push(datum);\n }\n this.draw(copy(this.data));\n }\n\n}\n\nexport default PieChart;","import {dispatch} from 'd3';\n\n/**\n * \n * A Datasource is the name given to the connection set up to a data endpoint. This class defines the common methods for the datasources,\n * such as start() and stop().\n * \n * @export Default export: Datasource class\n * \n * @class Datasource The Datasource class\n * \n */\nclass Datasource {\n /**\n * Creates an instance of Datasource.\n * \n * \n * @memberOf Datasource\n \n */\n protected dispatcher: any = null;\n protected source : {any} = null;\n protected isWaitingForData : boolean = true;\n\n constructor() {\n // this.filters = [];\n // this.properties = [];\n }\n\n /**\n * Starts the stream of data\n * \n * \n * @memberOf Datasource\n */\n start() {\n window.console.log('Starting datasource');\n }\n\n /**\n * \n * If started, this method stops the stream of data\n * \n * @memberOf Datasource\n \n */\n stop() {\n window.console.log('Stopping datasource');\n }\n\n\n configure(dispatcher) {\n this.dispatcher = dispatcher;\n }\n\n/*\n\n property(prop, newProp, cast) {\n this.properties.push({ 'p': prop, 'newP': newProp, cast: cast });\n return this;\n }\n\n\n convert(data) {\n let result = {};\n for (let i in this.properties) {\n let p = this.properties[i].p;\n let value = eval('data.' + this.properties[i].newP);\n // if(this.properties[i].cast){\n // value = new this.properties[i].cast(value);\n // }\n\n result[p] = value;\n }\n return result;\n }\n */\n\n /**\n * Filters the incoming messages. Each data record that do not comply the filter condition will be discarded\n * \n * @param {any} filter A filter condition\n * @returns this Datasource instance\n * \n * @memberOf Datasource\n */\n filter(filter) {\n return this;\n }\n}\n\nexport default Datasource;","import Datasource from './Datasource';\nimport Globals from '../Globals';\n/**\n * \n * This datasource set up a connection to a websocket server. \n * @export\n * @class WebsocketDatasource\n * @extends {Datasource}\n\n */\nclass WebsocketDatasource extends Datasource {\n\n /**\n * Creates an instance of WebsocketDatasource. This datasource will try to connect to the speficied websocket endpoint.\n *
\n     *    var source = {\n     *      endpoint: 'ws://192.168.3.32:3000/pathToWebsocketEndpoint';\n     *    };\n     * \n     *    linechart = new proteic.Linechart(new proteic.WebsocketDatasource(source));\n     * 
\n * \n * If new data is available, this datasource will forward the data records to the chart, which automatically repaint the chart with these new records. \n * @param {any} source A websocket endpoint. If invalid, this class will throw an Error. \n * \n * @memberOf WebsocketDatasource\n \n */\n private ws: WebSocket;\n\n\n constructor(source: any) {\n super();\n this.source = source;\n }\n\n /**\n * Configure a dispatcher for this datasource.\n * \n * @param {any} dispatcher A d3 dispatcher. This dispatcher is in charge of receiving and sending events.\n * \n * @memberOf WebsocketDatasource\n */\n configure(dispatcher: any) {\n this.dispatcher = dispatcher;\n }\n\n /**\n * \n * Initialize a websocket connection\n * \n * @memberOf WebsocketDatasource\n \n */\n start() {\n super.start();\n this.ws = new WebSocket(this.source['endpoint']);\n\n\n this.dispatcher.call('addLoading', this, {});\n\n this.ws.onopen = (e) => {\n this.dispatcher.call('onopen', this, e);\n };\n this.ws.onerror = (e) => {\n throw new Error('An error occurred trying to reach the websocket server' + e);\n };\n this.ws.onmessage = (e) => {\n if (this.isWaitingForData) {\n this.dispatcher.call('removeLoading', this, e);\n this.isWaitingForData = false;\n }\n var data = JSON.parse(e.data);\n this.dispatcher.call('onmessage', this, data);\n };\n }\n /**\n * If started, this method close the websocket connection.\n * \n * @memberOf WebsocketDatasource\n * */\n stop() {\n super.stop();\n if (this.ws) {\n this.ws.close();\n }\n }\n}\n\nexport default WebsocketDatasource;","import Datasource from './Datasource';\nimport {request} from 'd3';\n\n/**\n * \n * This datasource set up a connection to a http server. \n * @export\n * @class HTTPDatasource\n * @extends {Datasource}\n\n */\nexport default class HTTPDatasource extends Datasource {\n\n /**\n * Creates an instance of HTTPDatasource. This datasource will try to connect to the speficied HTTP endpoint.\n *
\n     *    var source = {\n     *      endpoint: 'https://randomuser.me/api';\n     *    };\n     * \n     *    linechart = new proteic.Linechart(new proteic.HTTPwDatasource(source));\n     * 
\n * \n * If new data is available, this datasource will forward the data records to the chart, which automatically repaint the chart with these new records. \n * @param {any} source An http endpoint. If invalid, this class will throw an Error. \n * \n * @memberOf HTTPDatasource\n * \n */\n constructor(source) {\n super();\n this.source = source;\n this.intervalId = -1;\n this.started = false;\n }\n\n \n /**\n * \n * Initialize an HTTP connection\n * \n * @memberOf HTTPDatasource\n \n */\n start() {\n if (!this.started) {\n super.start();\n let pollingTime = this.source.pollingTime;\n let url = this.source.url;\n this._startPolling(url, pollingTime);\n this.started = true;\n }\n }\n\n\n _startPolling(url, time = 1000) {\n let interval = window.setInterval;\n this.intervalId = interval(() => this._startRequest(url), time);\n }\n\n _startRequest(url) {\n window.console.log('url', url);\n request(url).get((e, response) => this._handleResponse(response));\n }\n\n _stopPolling() {\n let clearInterval = window.clearInterval;\n clearInterval(this.intervalId);\n }\n\n _handleResponse(xmlHttpRequest) {\n let parseJson = window.JSON.parse;\n if (xmlHttpRequest.readyState === 4 && xmlHttpRequest.status === 200) {\n let response = parseJson(xmlHttpRequest.response);\n this._handleOK(response);\n }\n else {\n this._handleError(xmlHttpRequest);\n }\n }\n\n _handleOK(data) {\n if(this.properties.length > 0 ) {\n data = this.convert(data);\n }\n this.dispatcher.call('onmessage', this, data);\n }\n\n _handleError(data) {\n this.dispatcher.call('onerror', this, data);\n }\n\n /**\n * If started, this method close the HTTP connection.\n * \n * @memberOf HTTPDatasource\n * */\n stop() {\n if (this.started) {\n this._stopPolling();\n this.started = false;\n }\n }\n}"],"names":["select","dispatch","event","min","d3Min","max","d3Max","map","axisBottom","scaleTime","scaleLinear","format","scaleBand","nest","timeParse","axisLeft","axisRight","line","easeLinear","symbol","symbolCircle","symbolCross","symbolDiamond","symbolSquare","symbolStar","symbolTriangle","symbolWye","area","zoom","XYAxes","scaleOrdinal","scaleQuantile","curveLinear","curveLinearClosed","curveMonotoneX","curveMonotoneY","curveNatural","curveStep","curveStepAfter","curveStepBefore","Colors.category7","stack","defaults","Colors.category5","d3stack","range","d3range","arc","d3arc","Colors.diverging_spectral2","curveCardinal","Colors.category4","d3Stack","stackOrderInsideOut","stackOffsetWiggle","Colors.category2","stackOffsetNone","extent","TimeBoxset","Colors.category3","scaleSqrt","stratify","partition","Colors.category8","forceSimulation","forceLink","forceManyBody","forceCenter","drag","pie","request"],"mappings":"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"} \ No newline at end of file diff --git a/dist/proteic.min.js b/dist/proteic.min.js index 5c61f74..fdbbf1d 100644 --- a/dist/proteic.min.js +++ b/dist/proteic.min.js @@ -1,3 +1,3 @@ -(function(global,factory){"object"==typeof exports&&"undefined"!=typeof module?factory(exports,require("d3")):"function"==typeof define&&define.amd?define(["exports","d3"],factory):factory(global.proteic=global.proteic||{},global.d3)})(this,function(exports,d3$1){"use strict";function category1(){return d3$1.scaleOrdinal().range(paletteCategory1)}function category2(){return d3$1.scaleOrdinal().range(paletteCategory2)}function category3(){return d3$1.scaleOrdinal().range(paletteCategory3)}function category4(){return d3$1.scaleOrdinal().range(paletteCategory4)}function category5(){return d3$1.scaleOrdinal().range(paletteCategory5)}function category6(){return d3$1.scaleOrdinal().range(paletteCategory6)}function category7(){return d3$1.scaleOrdinal().range(paletteCategory7)}function category8(){return d3$1.scaleOrdinal().range(paletteCategory8)}function sequentialYellow(){return d3$1.scaleQuantile().range(paletteSequentialYellow)}function sequentialRedOrange(){return d3$1.scaleQuantile().range(paletteSequentialRedOrange)}function sequentialRed(){return d3$1.scaleQuantile().range(paletteSequentialRed)}function sequentialPink(){return d3$1.scaleQuantile().range(paletteSequentialPink)}function sequentialPurplePink(){return d3$1.scaleQuantile().range(paletteSequentialPurplePink)}function sequentialPurple(){return d3$1.scaleQuantile().range(paletteSequentialPurple)}function sequentialBlue(){return d3$1.scaleQuantile().range(paletteSequentialBlue)}function sequentialLightBlue(){return d3$1.scaleQuantile().range(paletteSequentialLightBlue)}function sequentialBlueViolet(){return d3$1.scaleQuantile().range(paletteSequentialBlueViolet)}function sequentialTurquoise(){return d3$1.scaleQuantile().range(paletteSequentialTurquoise)}function sequentialLightGreen(){return d3$1.scaleQuantile().range(paletteSequentialLightGreen)}function sequentialDarkGreen(){return d3$1.scaleQuantile().range(paletteSequentialDarkGreen)}function sequentialGreenBrown(){return d3$1.scaleQuantile().range(paletteSequentialGreenBrown)}function sequentialBrown(){return d3$1.scaleQuantile().range(paletteSequentialBrown)}function sequentialGrey(){return d3$1.scaleQuantile().range(paletteSequentialGrey)}function sequentialVioletCb(){return d3$1.scaleQuantile().range(paletteSequentialVioletCb)}function sequentialPinkCb(){return d3$1.scaleQuantile().range(paletteSequentialPinkCb)}function sequentialBlueCb(){return d3$1.scaleQuantile().range(paletteSequentialBlueCb)}function sequentialGreenCb(){return d3$1.scaleQuantile().range(paletteSequentialGreenCb)}function sequentialGreenBrownCb(){return d3$1.scaleQuantile().range(paletteSequentialGreenBrownCb)}function diverging_spectral1(){return d3$1.scaleQuantile().range(paletteDivergingSpectral1)}function diverging_spectral2(){return d3$1.scaleQuantile().range(paletteDivergingSpectral2)}function diverging_spectral3(){return d3$1.scaleQuantile().range(paletteDivergingSpectral3)}function diverging_brown_turquoise(){return d3$1.scaleQuantile().range(paletteDivergingBrownTurquoise)}function diverging_orange_pink(){return d3$1.scaleQuantile().range(paletteDivergingOrangePink)}function diverging_red_blue(){return d3$1.scaleQuantile().range(paletteDivergingRedBlue)}function diverging_red_grey(){return d3$1.scaleQuantile().range(paletteDivergingRedGrey)}function diverging_orange_violet(){return d3$1.scaleQuantile().range(paletteDivergingOrangeViolet)}function diverging_purple_green(){return d3$1.scaleQuantile().range(paletteDivergingPurpleGreen)}function diverging_violet_green(){return d3$1.scaleQuantile().range(paletteDivergingVioletGreen)}function diverging_red_green(){return d3$1.scaleQuantile().range(paletteDivergingRedGreen)}function diverging_brown_green(){return d3$1.scaleQuantile().range(paletteDivergingBrownGreen)}function diverging_lightBrown_turquoise(){return d3$1.scaleQuantile().range(paletteDivergingLightBrownTurquoise)}function isNumeric(n){return!isNaN(parseFloat(n))&&isFinite(n)}function isEven(n){return n%2===0}function isPercentage(n){var split=null,number=null;return!(!n||"string"!=typeof n)&&(split=n.split("%"),number=+split[0],2===split.length&&number>=0&&number<=100)}function deg2rad(deg){return deg*Math.PI/180}function calculateWidth(widthConfig,selector){if("auto"===widthConfig)return d3$1.select(selector).node().getBoundingClientRect().width;if(isNumeric(widthConfig))return widthConfig;if(isPercentage(widthConfig)){var containerWidth,percentage;return containerWidth=d3$1.select(selector).node().getBoundingClientRect().width,percentage=widthConfig.split("%")[0],Math.round(percentage*containerWidth/100)}throw Error("Unknow config width value: "+widthConfig)}function simple2stacked(data){return d3$1.nest().key(function(d){return d.x}).rollup(function(array){for(var r={},i=0;ib?1:0})}function isExternal(url){return url&&0===url.lastIndexOf("http",0)&&url.lastIndexOf(window.location.host)===-1}function inlineImages(el,callback){var images=el.querySelectorAll("image"),left=images.length;0===left&&callback();for(var i=0;i";var defs=document.createElement("defs");defs.appendChild(s),clone.insertBefore(defs,clone.firstChild);var svg=doctype+outer.innerHTML,uri="data:image/svg+xml;base64,"+window.btoa(window.unescape(encodeURIComponent(svg)));cb&&cb(uri)})}var paletteCategory1=["#e1c8df","#9ecd9d","#acd9d6","#e4e36b","#bfa1c5","#e4d3b8","#facba8","#ced4ea","#acd9d6"],paletteCategory2=["#b6dde2","#6394af","#e4e9ab","#8ea876","#f7dce1","#cc878f","#fadaac","#f29a83","#8d7e9e"],paletteCategory3=["#6b68a9","#8cc590","#b9487d","#bfa1c5","#4e6936","#71bbc3","#484156","#ccaf44","#d0553c"],paletteCategory4=["#f1a30d","#1d4763","#84c7bc","#c1212d","#8fbe46","#076837","#563a2d","#563a2d","#87325d"],paletteCategory5=["#f1a30d","#0c3183","#acd9d6","#c1212d","#8fbe46","#076837","#8a6338","#8d2d84","#f09bbc"],paletteCategory6=["#71bbc3","#1d4763","#8fbe46","#4e6936","#ee8998","#c1212d","#f5af3c","#e95e2e","#634484"],paletteCategory7=["#ea671e","#684592","#84b92a","#cd131c","#3c5ba2","#5baddc","#ffde06","#5db68b","#775e47"],paletteCategory8=["#ebd646","#a50f38","#00a096","#f09bbc","#065b78","#72722a","#005231","#4d4e98","#7c4d25"],paletteSequentialYellow=["#fff1c6","#fee5a7","#fcda87","#face64","#f8bf4b","#f6b030","#f4a009","#d28514","#b36c17","#955618","#7a4317","#613214","#49230f"],paletteSequentialRedOrange=["#ffecb8","#fbd68b","#f7bf5e","#f3a82f","#df7520","#cd4925","#be0a26","#a81023","#941320","#80141d","#6d1419","#5a1215","#470f0f"],paletteSequentialRed=["#fde4d4","#f1c4af","#f7bf5e","#db826a","#d0614d","#c73e36","#be0a26","#a81023","#941320","#80141d","#6d1419","#5a1215","#470f0f"],paletteSequentialPink=["#fbe3e3","#f9cfcc","#f0aaa9","#ed7e7e","#ea647b","#e74576","#e41270","#c70f65","#aa105c","#8d1253","#731448","#5a123c","#420e30"],paletteSequentialPurplePink=["#f9d8e6","#ebbed7","#dda4c7","#c890bb","#b27daf","#8a4c94","#622181","#622181","#50216b","#472060","#3e1f55","#361e4b","#2d1c41"],paletteSequentialPurple=["#f6e8f1","#dcc5de","#c2a3c9","#a980b3","#905e9f","#793f8e","#622181","#592175","#4f216b","#462060","#3d1f55","#351e4b","#2c1c41"],paletteSequentialBlue=["#e5f2f9","#d1e5f5","#afd3ed","#91afd7","#738bbf","#3c5a9e","#0c3183","#132a68","#10204c","#0b193b","#06142f","#051228","#061020"],paletteSequentialLightBlue=["#eff8fd","#d9eff6","#c2e5ef","#a8dae8","#90cbe4","#76b8e1","#5baddc","#4d96cc","#427ebc","#3a67ab","#324c88","#29366b","#1e2354"],paletteSequentialBlueViolet=["#edf7e7","#c8e3d2","#91cdbf","#41b5ab","#218ba4","#145d94","#0c3183","#0d2d76","#0d2a6a","#0e265e","#0d2253","#0c1e47","#0b1a3c"],paletteSequentialTurquoise=["#e2ecf6","#cadfe6","#b1d3d6","#94c6c6","#74b9b6","#4caca6","#00a096","#008d89","#007b7c","#006a6f","#005963","#004a57","#063b4c"],paletteSequentialLightGreen=["#faf9de","#e9efc3","#d7e4a7","#c5d989","#b1ce6a","#9cc34c","#84b92a","#6fa32b","#5a8f2a","#477c29","#346b27","#205b24","#074d21"],paletteSequentialDarkGreen=["#eaf3e5","#c7d5be","#a3ba9a","#80a078","#5c885a","#357442","#00632e","#00592b","#004e27","#004423","#033a1e","#053019","#052613"],paletteSequentialGreenBrown=["#f7eccd","#d9cba6","#bcad82","#a29162","#887946","#716330","#5b501f","#51461d","#483d1b","#3f3418","#362b15","#2d2311","#231a0d"],paletteSequentialBrown=["#f7eccd","#eed3ab","#e4bb89","#dba269","#ad7446","#834d2c","#5e2f19","#552a18","#4c2516","#432113","#3a1c11","#32180f","#29130b"],paletteSequentialGrey=["#e5e8ea","#bdbfc3","#999a9f","#77797f","#595c64","#3e444c","#253038","#20282e","#1a2024","#15181b","#0e1112","#070808","#000000"],paletteSequentialVioletCb=["#f4f3f9","#e0dced","#cbc6e0","#b7b0d4","#948cbf","#706baa","#4d4e98","#484889","#42427a","#3d3c6c","#37365e","#313050","#2c2a44"],paletteSequentialPinkCb=["#fbe5ee","#f8ccd5","#f4b2bc","#f096a3","#d56976","#bc3f52","#a50f38","#951735","#851b31","#761d2e","#671e2a","#581d26","#4a1c22"],paletteSequentialBlueCb=["#eaf6fc","#cfe4f4","#cfe4f4","#91bfe3","#6999bb","#417797","#065b78","#11536b","#174b5f","#194354","#1a3b49","#1a343f","#192d35"],paletteSequentialGreenCb=["#fff7d0","#e9e09b","#d1ca62","#b7b623","#9e9e28","#88872a","#72722a","#676726","#5c5c23","#51511f","#47471b","#3d3d17","#333413"],paletteSequentialGreenBrownCb=["#f2edde","#d8d1c0","#bfb699","#a09778","#837b5a","#686141","#4f4b2c","#3e3e1f","#2e3313","#292d14","#232613","#1e2012","#191a10"],paletteDivergingSpectral1=["#98141f","#ab332c","#bf5040","#d5705b","#e4a57f","#f3d6a6","#f5f2b8","#cfdbb1","#a4c4a9","#71ada1","#4e868f","#2e637d","#06456c"],paletteDivergingSpectral2=["#d43d4f","#df564b","#eb6d45","#f08e53","#f8b96f","#fee08b","#f5f2b8","#d7e5b1","#b5d7aa","#8ec8a3","#6abda3","#4fa4b5","#3489be"],paletteDivergingSpectral3=["#651035","#ae1143","#c9314b","#dd7257","#eeb27a","#feeb9e","#f5f2b8","#cadfba","#96cabb","#50b4bb","#3eaecc","#206791","#0c2c63"],paletteDivergingBrownTurquoise=["#3f3128","#683828","#933624","#d5705b","#db9c5e","#feeb9e","#f5f2b8","#cfdbb1","#a4c4a9","#71ada1","#628f85","#53746d","#475b57"],paletteDivergingOrangePink=["#e7511e","#eb6929","#ee7f37","#f29446","#f9c083","#ffe9c3","#ffeee3","#f9cfc1","#f3a9ab","#db6882","#c71360","#891953","#4b1c47"],paletteDivergingRedBlue=["#b2172b","#c4443e","#d76a5a","#ed937e","#f4b8a2","#fcdbc7","#efefef","#bfcad5","#8ba7bc","#4d87a5","#3c7ca0","#28729b","#036896"],paletteDivergingRedGrey=["#b2172b","#c54532","#da6c3b","#f29446","#f8bc67","#fee08b","#efece5","#c9c5c1","#a5a19f","#808080","#666666","#333333","#000000"],paletteDivergingOrangeViolet=["#98141f","#ab332c","#f9bc47","#fdcf66","#fede8d","#ffecb3","#f9eff6","#e8d0e3","#a4c4a9","#a973aa","#834f96","#622181","#402357"],paletteDivergingPurpleGreen=["#59194b","#85134b","#c71360","#db6882","#eba7a8","#fce0ca","#faefe1","#dbd9aa","#b9c26e","#94ad31","#728b2b","#546c25","#39521f"],paletteDivergingVioletGreen=["#55296e","#75408e","#8a5fa0","#a081b5","#beadcf","#ddd7e7","#eae8ed","#c1d4bc","#93be86","#58a951","#3c853e","#23662f","#084a22"],paletteDivergingRedGreen=["#b2172b","#c5403c","#d96453","#ef8972","#f6b49c","#fcdbc7","#f9ebde","#dad6a8","#b9c16d","#94ad31","#728b2b","#546c25","#39521f"],paletteDivergingBrownGreen=["#735146","#846454","#977a65","#aa9177","#c2ad91","#dbcaad","#edebd6","#c4d6aa","#94bf7c","#58a951","#3c853e","#23662f","#084a22"],paletteDivergingLightBrownTurquoise=["#8b5219","#a46821","#bf812c","#cfa151","#e2c489","#f6e8c3","#f5f1df","#cbdccc","#9cc6b9","#60afa6","#359790","#1d7d75","#00665e"],Datasource=function(){this.filters=[],this.properties=[]};Datasource.prototype.start=function(){window.console.log("Starting datasource")},Datasource.prototype.stop=function(){window.console.log("Stopping datasource")},Datasource.prototype.property=function(prop,newProp,cast){return this.properties.push({p:prop,newP:newProp,cast:cast}),this},Datasource.prototype.convert=function convert(data){var this$1=this,result={};for(var i in this.properties){var p=this$1.properties[i].p,value=eval("data."+this$1.properties[i].newP);result[p]=value}return result},Datasource.prototype.filter=function(filter){return this};var HTTPDatasource=function(Datasource$$1){function HTTPDatasource(source){Datasource$$1.call(this),this.source=source,this.intervalId=-1,this.started=!1}return Datasource$$1&&(HTTPDatasource.__proto__=Datasource$$1),HTTPDatasource.prototype=Object.create(Datasource$$1&&Datasource$$1.prototype),HTTPDatasource.prototype.constructor=HTTPDatasource,HTTPDatasource.prototype.configure=function(dispatcher){this.dispatcher=dispatcher},HTTPDatasource.prototype.start=function(){if(!this.started){Datasource$$1.prototype.start.call(this);var pollingTime=this.source.pollingTime,url=this.source.url;this._startPolling(url,pollingTime),this.started=!0}},HTTPDatasource.prototype._startPolling=function(url,time){var this$1=this;void 0===time&&(time=1e3);var interval=window.setInterval;this.intervalId=interval(function(){return this$1._startRequest(url)},time)},HTTPDatasource.prototype._startRequest=function(url){var this$1=this;window.console.log("url",url),d3$1.request(url).get(function(e,response){return this$1._handleResponse(response)})},HTTPDatasource.prototype._stopPolling=function(){var clearInterval=window.clearInterval;clearInterval(this.intervalId)},HTTPDatasource.prototype._handleResponse=function(xmlHttpRequest){var parseJson=window.JSON.parse;if(4===xmlHttpRequest.readyState&&200===xmlHttpRequest.status){var response=parseJson(xmlHttpRequest.response);this._handleOK(response)}else this._handleError(xmlHttpRequest)},HTTPDatasource.prototype._handleOK=function(data){this.properties.length>0&&(data=this.convert(data)),this.dispatcher.call("onmessage",this,data)},HTTPDatasource.prototype._handleError=function(data){this.dispatcher.call("onerror",this,data)},HTTPDatasource.prototype.stop=function(){this.started&&(this._stopPolling(),this.started=!1)},HTTPDatasource}(Datasource),WebsocketDatasource=function(Datasource$$1){function WebsocketDatasource(source){Datasource$$1.call(this),this.source=source}return Datasource$$1&&(WebsocketDatasource.__proto__=Datasource$$1),WebsocketDatasource.prototype=Object.create(Datasource$$1&&Datasource$$1.prototype),WebsocketDatasource.prototype.constructor=WebsocketDatasource,WebsocketDatasource.prototype.configure=function(dispatcher){this.dispatcher=dispatcher},WebsocketDatasource.prototype.start=function(){var this$1=this;Datasource$$1.prototype.start.call(this),this.ws=new window.WebSocket(this.source.endpoint),this.ws.onopen=function(e){this$1.dispatcher.call("onopen",this$1,e)},this.ws.onerror=function(e){throw new Error("An error occurred trying to reach the websocket server"+e)},this.ws.onmessage=function(e){var data=JSON.parse(e.data);this$1.dispatcher.call("onmessage",this$1,data)}},WebsocketDatasource.prototype.stop=function(){Datasource$$1.prototype.stop.call(this),this.ws&&this.ws.close()},WebsocketDatasource}(Datasource),defaults={selector:"#chart",colorScale:category7(),areaOpacity:.4,xAxisType:"linear",xAxisFormat:"",xAxisLabel:null,yAxisType:"linear",yAxisFormat:"",yAxisLabel:null,marginTop:20,marginRight:250,marginBottom:130,marginLeft:150,markerShape:"circle",markerSize:5,markerOutlineWidth:2,width:"100%",height:250,onDown:function(d){},onHover:function(d){},onLeave:function(d){},onClick:function(d){},maxNumberOfElements:100},SvgContainer=function(config){this._config=config,this.svg=this._initializeSvgContainer(config),this.components=Array()};SvgContainer.prototype._initializeSvgContainer=function(config){var selector=config.selector,width=config.width+config.marginLeft+config.marginRight,height=config.height+config.marginTop+config.marginBottom,svg=null;return svg=d3$1.select(selector).append("svg:svg").attr("width",width).attr("height",height).append("g").attr("class","chartContainer").attr("transform","translate("+config.marginLeft+","+config.marginTop+")")},SvgContainer.prototype.add=function(component,render){return void 0===render&&(render=!0),this.components.push(component),render&&component.render(this.svg,this._config),this},SvgContainer.prototype.transform=function(translation){this.svg.attr("transform",translation)};var SvgAxis=function(context){this._loadConfig(context.config),this.svgContainer=new SvgContainer(this.config)};SvgAxis.prototype.changeConfigProperty=function(p,v){this.config[p]=v,"width"!==p&&"height"!==p||(this.config.needRescaling=!0)},SvgAxis.prototype.rescale=function(width,height){void 0===width&&(width=this.config.width),void 0===height&&(height=this.config.height),this.axes.rescale(width,height),this.config.needRescaling=!1},SvgAxis.prototype._loadConfig=function(config,defaults){this.config={},this.config.selector=config.selector||defaults.selector,this.config.marginTop=config.marginTop||defaults.marginTop,this.config.marginLeft=config.marginLeft||defaults.marginLeft,this.config.marginRight=config.marginRight||defaults.marginRight,this.config.marginBottom=config.marginBottom||defaults.marginBottom,this.config.width=config.width?calculateWidth(config.width,this.config.selector)-this.config.marginLeft-this.config.marginRight:calculateWidth(defaults.width,this.config.selector)-this.config.marginLeft-this.config.marginRight,this.config.height=config.height||defaults.height,this.config.xAxisType=config.xAxisType||defaults.xAxisType,this.config.xAxisFormat=config.xAxisFormat||defaults.xAxisFormat,this.config.xAxisLabel=config.xAxisLabel||defaults.xAxisLabel,this.config.yAxisType=config.yAxisType||defaults.yAxisType,this.config.yAxisFormat=config.yAxisFormat||defaults.yAxisFormat,this.config.yAxisLabel=config.yAxisLabel||defaults.yAxisLabel,this.config.colorScale=config.colorScale||defaults.colorScale,this.config.onDown=config.onDown||defaults.onDown,this.config.onUp=config.onUp||defaults.onUp,this.config.onHover=config.onHover||defaults.onHover,this.config.onClick=config.onClick||defaults.onClick,this.config.onLeave=config.onLeave||defaults.onLeave};var XAxis=function(xAxisType,config){if(null===config)throw new Error("No chart context specified for XAxis");this.xAxis=this._initializeXAxis(xAxisType,config)};XAxis.prototype.rescale=function(width,height){this.xAxis.scale().range([0,width])},XAxis.prototype._initializeXAxis=function(xAxisType,config){void 0===xAxisType&&(xAxisType="linear");var x=null,axis=null;switch(xAxisType){case"time":x=d3$1.scaleTime().range([0,config.width]),axis=d3$1.axisBottom(x);break;case"linear":x=d3$1.scaleLinear().range([0,config.width]),axis=d3$1.axisBottom(x).tickFormat(d3$1.format(config.xAxisFormat));break;case"categorical":x=d3$1.scaleBand().rangeRound([0,config.width]).padding(.1).align(.5),axis=d3$1.axisBottom(x);break;default:throw new Error('Not allowed type for XAxis. Only allowed "time","linear" or "categorical". Got: '+xAxisType)}return d3$1.axisBottom(x)},XAxis.prototype.transition=function(svg,time){void 0===time&&(time=200),svg.selectAll(".x.axis").transition().duration(time).call(this.xAxis).on("end",this.xStyle)},XAxis.prototype.xStyle=function(){d3$1.select(this).selectAll("g.tick text").style("font","1.4em Montserrat, sans-serif").style("fill",function(d,i){return isEven(i)&&0!==i?"#1a2127":"#5e6b70"}).style("fill",function(d){return"#1a2127"}),d3$1.select(this).selectAll(["path","line"]).attr("stroke","gray").attr("stroke-width",.3)},XAxis.prototype.updateDomainByBBox=function(b){var x=this.xAxis.scale();x.domain([b[0],b[1]])},XAxis.prototype.updateDomainByKeys=function(keys$$1,yBbox){var x=this.xAxis.scale();x.domain(keys$$1)},XAxis.prototype.render=function(svg,config){var xAxis=this.xAxis,width=config.width,height=config.height;svg.append("g").attr("class","x axis").attr("transform","translate(0,"+config.height+")").call(xAxis),svg.append("text").attr("class","xaxis-title").attr("text-anchor","middle").attr("x",width/2).attr("y",height+40).text(config.xAxisLabel).style("font","0.8em Montserrat, sans-serif"),this.svg=svg};var YAxis=function(yAxisType,config){if(null===config)throw new Error("No chart context specified for XAxis");this.yAxis=this._initializeYAxis(yAxisType,config)};YAxis.prototype.rescale=function(width,height){this.yAxis.tickSizeInner(-width)},YAxis.prototype._initializeYAxis=function(yAxisType,config){void 0===yAxisType&&(yAxisType="linear");var y=null,axis=null;switch(yAxisType){case"linear":y=d3$1.scaleLinear().range([config.height,0]),axis=d3$1.axisLeft(y).tickFormat(d3$1.format(config.yAxisFormat));break;case"categorical":y=d3$1.scaleBand().rangeRound([config.height,0]).padding(.1).align(.5),axis=d3$1.axisLeft(y);break;default:throw new Error('Not allowed type for YAxis. Only allowed "time","linear" or "categorical". Got: '+yAxisType)}return axis.tickSizeInner(-config.width).tickSizeOuter(0).tickPadding(20)},YAxis.prototype.transition=function(svg,time){void 0===time&&(time=200),svg.selectAll(".y.axis").transition().duration(time).call(this.yAxis).on("end",this.yStyle)},YAxis.prototype.yStyle=function(){d3$1.select(this).selectAll("g.tick text").style("font","1.4em Montserrat, sans-serif").style("fill",function(d,i){return isEven(i)&&0!==i?"#1a2127":"#5e6b70"}),d3$1.select(this).selectAll("g.tick line").style("stroke",function(d,i){return isEven(i)&&0!==i?"#5e6b70":"#dbdad8"})},YAxis.prototype.updateDomainByBBox=function(b){var y=this.yAxis.scale();y.domain(b)},YAxis.prototype.updateDomainByKeys=function(keys$$1){var y=this.yAxis.scale();y.domain(keys$$1)},YAxis.prototype.render=function(svg,config){var yAxis=this.yAxis,height=(config.width,config.height);svg.append("g").attr("class","y axis").attr("stroke-dasharray","1, 5").call(yAxis),svg.append("text").attr("class","yaxis-title").attr("transform","rotate(-90)").attr("text-anchor","middle").attr("x",0-height/2).attr("y",-55).text(config.yAxisLabel).style("font","0.8em Montserrat, sans-serif")};var XYAxes=function(xAxisType,yAxisType,config){if(null===config)throw new Error("No chart context specified for XAxis");this.x=new XAxis(xAxisType,config),this.y=new YAxis(yAxisType,config)};XYAxes.prototype.transition=function(svg,time){void 0===time&&(time=200),this.x.transition(svg,time),this.y.transition(svg,time)},XYAxes.prototype.updateDomainByBBox=function(b){this.x.updateDomainByBBox([b[0],b[1]]),this.y.updateDomainByBBox([b[2],b[3]])},XYAxes.prototype.updateDomainByKeysAndBBox=function(keys,bbox){this.x.updateDomainByKeys(keys),this.y.updateDomainByBBox(bbox)},XYAxes.prototype.updateDomainByBBoxAndKeys=function(bbox,keys){this.x.updateDomainByBBox(bbox),this.y.updateDomainByKeys(keys)},XYAxes.prototype.render=function(svg,config){this.x.render(svg,config),this.y.render(svg,config)},XYAxes.prototype.rescale=function(width,height){this.x.rescale(width,height),this.y.rescale(width,height)};var Lineset=function(x,y){var this$1=this;this.xAxis=x.xAxis,this.yAxis=y.yAxis,this.lineGenerator=d3$1.line().x(function(d){return this$1.xAxis.scale()(d.x)}).y(function(d){return this$1.yAxis.scale()(d.y)})};Lineset.prototype.update=function(svg,config,data){var this$1=this,dataSeries=d3$1.nest().key(function(d){return d.key}).entries(data),series=null,lines=null,colorScale=config.colorScale;svg.selectAll("g.serie").remove(),series=svg.selectAll("g.serie"),lines=series.data(dataSeries,function(d){return d.key}).enter().append("g").attr("class","serie").attr("stroke",function(d,i){return colorScale(i)}).append("svg:path").style("stroke",function(d,i){return colorScale(i)}).style("stroke-width",1.3).style("fill","none").attr("d",function(d){return this$1.lineGenerator(d.values)}).attr("class","line"),this.svg=svg},Lineset.prototype.render=function(svg,config){};var Legend=function(){};Legend.prototype.update=function(svg,config,data){var dataSeries=d3$1.nest().key(function(d){return d.key}).entries(data),legend=null,entries=null,colorScale=config.colorScale,width=(config.height,config.width);return 1===dataSeries.length&&"undefined"===dataSeries[0].key?void console.warn("Not showing legend, since there is a valid key"):(svg.selectAll("g.legend").remove(),legend=svg.append("g").attr("class","legend"),entries=legend.selectAll(".legend-entry").data(dataSeries,function(d){return d.key}).enter().append("g").attr("class","legend-entry"),entries.append("rect").attr("x",width+10).attr("y",function(d,i){return 25*i}).attr("height",20).attr("width",20).attr("fill",function(d,i){return colorScale(i)}).style("opacity",.8),void entries.append("text").attr("x",width+25+10).attr("y",function(d,i){return 25*i+7}).attr("dy","0.55em").text(function(d){return d.key}).style("font","14px Montserrat, sans-serif"))},Legend.prototype.render=function(svg,config){};var Areaset=function(x,y){this.xAxis=x.xAxis,this.yAxis=y.yAxis};Areaset.prototype.update=function(svg,config,data){var this$1=this,dataSeries=d3$1.nest().key(function(d){return d.key}).entries(data),series=null,areas=null,colorScale=(config.area,config.colorScale),height=config.height,areaOpacity=config.areaOpacity,areaGenerator=d3.area().x(function(d){return this$1.xAxis.scale()(d.x)}).y0(height).y1(function(d){return this$1.yAxis.scale()(d.y)});svg.selectAll("g.area").remove(),series=svg.selectAll("g.area"),areas=series.data(dataSeries,function(d){return d.key}).enter().append("g").attr("class","area").append("svg:path").style("fill",function(d,i){return colorScale(i)}).style("fill-opacity",areaOpacity).attr("d",function(d){return areaGenerator(d.values)}),this.svg=svg},Areaset.prototype.render=function(svg,config){};var Pointset=function(x,y){this.xAxis=x.xAxis,this.yAxis=y.yAxis};Pointset.prototype.update=function(svg,config,data){var this$1=this,dataSeries=d3$1.nest().key(function(d){return d.key}).entries(data),markers=null,markerShape=config.markerShape,markerSize=config.markerSize,markerOutlineWidth=config.markerOutlineWidth,colorScale=config.colorScale,points=null,series=null;switch(svg.selectAll("g.points").remove(),series=svg.selectAll("g.points"),markerShape){case"dot":points=series.data(dataSeries,function(d){return d.key}).enter().append("g").attr("class","points").style("fill",function(d,i){return colorScale(i)}).selectAll("circle").data(function(d){return d.values}).enter().append("circle").attr("cx",function(d){return this$1.xAxis.scale()(d.x)}).attr("cy",function(d){return this$1.yAxis.scale()(d.y)}).attr("r",markerSize).attr("class","marker");break;case"ring":window.console.warn('Deprecated "circle" marker shape: use "dot" or "ring" instead'),points=series.data(dataSeries,function(d){return d.key}).enter().append("g").attr("class","points").style("stroke",function(d,i){return colorScale(i)}).selectAll("circle").data(function(d,i){return d.values}).enter().append("circle").attr("cx",function(d){return this$1.xAxis.scale()(d.x)}).attr("cy",function(d){return this$1.yAxis.scale()(d.y)}).attr("r",markerSize).attr("class","marker").style("fill","white").style("stroke-width",markerOutlineWidth);break;case"circle":window.console.warn('Deprecated "circle" marker shape: use "dot" or "ring" instead'),points=series.data(dataSeries,function(d){return d.key}).enter().append("g").attr("class","points").style("stroke",function(d,i){return colorScale(i)}).selectAll("circle").data(function(d,i){return d.values}).enter().append("circle").attr("cx",function(d){return this$1.xAxis.scale()(d.x)}).attr("cy",function(d){return this$1.yAxis.scale()(d.y)}).attr("r",markerSize).attr("class","lineMarker").style("fill","white").style("stroke-width",markerOutlineWidth);break;default:points=series.data(dataSeries,function(d){return d.key}).enter().append("g").attr("class","points").style("stroke",function(d,i){return colorScale(i)}).selectAll("circle").data(function(d,i){return d.values}).enter().append("circle").attr("cx",function(d){return this$1.xAxis.scale()(d.x)}).attr("cy",function(d){return this$1.yAxis.scale()(d.y)}).attr("r",markerSize).attr("class","lineMarker").style("fill","white").style("stroke-width",markerOutlineWidth)}markers=svg.selectAll("g.points circle"),markers.on("mousedown.user",config.onDown).on("mouseup.user",config.onUp).on("mouseleave.user",config.onLeave).on("mouseover.user",config.onHover).on("click.user",config.onClick)},Pointset.prototype.render=function(svg,config){};var SvgLinechartStrategy=function(SvgAxis$$1){function SvgLinechartStrategy(context){SvgAxis$$1.call(this,context),this.axes=new XYAxes(this.config.xAxisType,"linear",this.config),this.lines=new Lineset(this.axes.x,this.axes.y),this.legend=new Legend,this.svgContainer.add(this.axes).add(this.legend).add(this.lines),this._checkArea(this.config)&&(this.areas=new Areaset(this.axes.x,this.axes.y),this.svgContainer.add(this.areas)),this._checkMarkers(this.config)&&(this.points=new Pointset(this.axes.x,this.axes.y), -this.svgContainer.add(this.points))}return SvgAxis$$1&&(SvgLinechartStrategy.__proto__=SvgAxis$$1),SvgLinechartStrategy.prototype=Object.create(SvgAxis$$1&&SvgAxis$$1.prototype),SvgLinechartStrategy.prototype.constructor=SvgLinechartStrategy,SvgLinechartStrategy.prototype.draw=function(data){var svg=this.svgContainer.svg,config=this.config,needRescaling=this.config.needRescaling,bbox=null;convertByXYFormat(data,config),sortByField(data,"x"),needRescaling&&this.rescale(),bbox=this._getDomainBBox(data),this.axes.updateDomainByBBox(bbox),this.axes.transition(svg,200),this.legend.update(svg,config,data),this.lines.update(svg,config,data),config.areaOpacity>0&&this.areas.update(svg,config,data),this._checkMarkers(config)&&this.points.update(svg,config,data)},SvgLinechartStrategy.prototype._getDomainBBox=function(data){var minX=d3$1.min(data,function(d){return d.x}),maxX=d3$1.max(data,function(d){return d.x}),minY=d3$1.min(data,function(d){return d.y}),maxY=d3$1.max(data,function(d){return d.y});return[minX,maxX,minY,maxY]},SvgLinechartStrategy.prototype._checkMarkers=function(config){return config.markerSize>0},SvgLinechartStrategy.prototype._checkArea=function(config){return config.areaOpacity>0},SvgLinechartStrategy.prototype._loadConfig=function(config){return SvgAxis$$1.prototype._loadConfig.call(this,config,defaults),this.config.markerOutlineWidth=config.markerOutlineWidth||defaults.markerOutlineWidth,this.config.markerShape=config.markerShape||defaults.markerShape,this.config.markerSize="undefined"==typeof config.markerSize||config.markerSize<0?defaults.markerSize:config.markerSize,this.config.areaOpacity="undefined"==typeof config.areaOpacity||config.markerSize<0?defaults.areaOpacity:config.areaOpacity,this},SvgLinechartStrategy}(SvgAxis),defaults$1={selector:"#chart",colorScale:category5(),stacked:!0,xAxisType:"linear",xAxisFormat:"",xAxisLabel:null,yAxisType:"linear",yAxisFormat:"",yAxisLabel:null,marginTop:20,marginRight:250,marginBottom:130,marginLeft:150,width:"100%",height:350,onDown:function(d){},onHover:function(d){},onLeave:function(d){},onClick:function(d){}},Barset=function(xAxis,yAxis){this.xAxis=xAxis,this.yAxis=yAxis,this.lineGenerator=d3$1.line().x(function(d){return xAxis.scale()(d.x)}).y(function(d){return yAxis.scale()(d.y)})};Barset.prototype.update=function(svg,config,data,method){var bars=null;"stacked"===method?this._updateStacked(svg,config,data):this._updateGrouped(svg,config,data),bars=svg.selectAll("g.serie rect"),bars.on("mousedown.user",config.onDown).on("mouseup.user",config.onUp).on("mouseleave.user",config.onLeave).on("mouseover.user",config.onHover).on("click.user",config.onClick),this.interactiveElements=bars},Barset.prototype._updateStacked=function(svg,config,dataSeries){this._cleanCurrentSeries(svg);var colorScale=config.colorScale,layer=svg.selectAll(".serie").data(dataSeries),layerEnter=layer.enter().append("g"),layerMerge=null,bar=null,barEnter=null,barMerge=null,x=this.xAxis.scale(),y=this.yAxis.scale();layerMerge=layer.merge(layerEnter).attr("class","serie").attr("fill",function(d,i){return colorScale(i)}),bar=layerMerge.selectAll("rect").data(function(d){return d}),barEnter=bar.enter().append("rect"),barMerge=bar.merge(barEnter).attr("x",function(d){return x(d.data.key)}).attr("y",function(d){return y(d[1])}).attr("height",function(d){return y(d[0])-y(d[1])}).attr("width",x.bandwidth())},Barset.prototype._updateGrouped=function(svg,config,data){this._cleanCurrentSeries(svg);var keys=d3$1.map(data,function(d){return d.key}).keys(),colorScale=config.colorScale,layer=svg.selectAll(".serie").data(data),layerEnter=null,layerMerge=null,bar=null,barEnter=null,barMerge=null,x=this.xAxis.scale(),y=this.yAxis.scale(),xGroup=d3$1.scaleBand().domain(keys).range([0,x.bandwidth()]),height=config.height;data=simple2nested(data,"x"),layer=svg.selectAll(".serie").data(data),layerEnter=layer.enter().append("g").attr("transform",function(d){return"translate("+x(d.key)+")"}),layerMerge=layer.merge(layerEnter).attr("class","serie").attr("transform",function(d){return"translate("+x(d.key)+")"}),bar=layerMerge.selectAll("rect").data(function(d){return d.values}),barEnter=bar.enter().append("rect"),barMerge=bar.merge(barEnter).attr("width",xGroup.bandwidth()).attr("x",function(d){return xGroup(d.key)}).attr("fill",function(d,i){return colorScale(i)}).attr("y",function(d){return y(d.y)}).attr("height",function(d){return height-y(d.y)})},Barset.prototype._getKeysFromData=function(data){var keys=[];for(var p in data[0])"total"!==p&&"key"!==p&&keys.push(p);return keys},Barset.prototype._cleanCurrentSeries=function(svg){svg.selectAll(".serie").remove()},Barset.prototype.render=function(svg,config){};var SvgBarchartStrategy=function(SvgAxis$$1){function SvgBarchartStrategy(context){SvgAxis$$1.call(this,context),this.axes=new XYAxes("categorical","linear",this.config),this.bars=new Barset(this.axes.x.xAxis,this.axes.y.yAxis),this.legend=new Legend,this.svgContainer.add(this.axes).add(this.bars).add(this.legend)}return SvgAxis$$1&&(SvgBarchartStrategy.__proto__=SvgAxis$$1),SvgBarchartStrategy.prototype=Object.create(SvgAxis$$1&&SvgAxis$$1.prototype),SvgBarchartStrategy.prototype.constructor=SvgBarchartStrategy,SvgBarchartStrategy.prototype.draw=function(data){void 0===data&&(data=this.data);var svg=this.svgContainer.svg,config=this.config,keys=d3$1.map(data,function(d){return d.key}).keys(),data4stack=simple2stacked(data),data4render=null,isStacked=this.config.stacked,stack$$1=d3$1.stack().keys(keys).value(function(d,k){return d.value[k]}).order(d3$1.stackOrderNone),yMin=0,yMax=0,method=isStacked?"stacked":"grouped",dataSeries=stack$$1(data4stack),needRescaling=this.config.needRescaling;needRescaling&&this.rescale(),yMax=isStacked?d3$1.max(dataSeries,function(serie){return d3$1.max(serie,function(d){return d[1]})}):d3$1.max(data,function(d){return d.y}),this.axes.updateDomainByKeysAndBBox(d3$1.map(data,function(d){return d.x}).keys(),[yMin,yMax]),this.axes.transition(svg,200),data4render=isStacked?dataSeries:data,this.bars.update(svg,config,data4render,method),this.legend.update(svg,config,data),this.data=data},SvgBarchartStrategy.prototype.transition2Stacked=function(){this.config.stacked=!0},SvgBarchartStrategy.prototype.transition2Grouped=function(){this.config.stacked=!1},SvgBarchartStrategy.prototype._loadConfig=function(config){return SvgAxis$$1.prototype._loadConfig.call(this,config,defaults$1),this.config.stacked="undefined"==typeof config.stacked?defaults$1.stacked:config.stacked,this},SvgBarchartStrategy}(SvgAxis),defaults$2={selector:"#chart",colorScale:category4(),xAxisType:"time",xAxisFormat:"%y/%m/%d",xAxisLabel:null,yAxisType:"categorical",yAxisFormat:"",yAxisLabel:null,marginTop:20,marginRight:250,marginBottom:130,marginLeft:150,width:"100%",height:250,onDown:function(d){},onHover:function(d){},onLeave:function(d){},onClick:function(d){},maxNumberOfElements:100},Streamset=function(xAxis,yAxis){var this$1=this;this.xAxis=xAxis,this.yAxis=yAxis,this.areaGenerator=d3$1.area().curve(d3$1.curveCardinal).x(function(d){return this$1.xAxis.scale()(d3$1.timeParse(this$1.xDataFormat)(d.data.key))}).y0(function(d){return this$1.yAxis.scale()(d[0])}).y1(function(d){return this$1.yAxis.scale()(d[1])})};Streamset.prototype.update=function(svg,config,data){var series=null;this.xDataFormat=config.xAxisFormat,svg.selectAll(".serie").remove(),series=svg.selectAll(".serie").data(data).enter().append("g").attr("class","serie").style("stroke",function(d,i){return config.colorScale(i)}),series.append("path").attr("class","layer").attr("d",this.areaGenerator).style("fill",function(d,i){return config.colorScale(i)}),series.exit().remove(),series.attr("opacity",1).on("mousedown.user",config.onDown).on("mouseup.user",config.onUp).on("mouseleave.user",config.onLeave).on("mouseover.user",config.onHover).on("click.user",config.onClick)},Streamset.prototype.render=function(svg,config){};var SvgStreamgraphStrategy=function(SvgAxis$$1){function SvgStreamgraphStrategy(context){SvgAxis$$1.call(this,context),this.x=new XAxis("time",this.config),this.y=new YAxis("linear",this.config),this.streams=new Streamset(this.x.xAxis,this.y.yAxis),this.legend=new Legend,this.svgContainer.add(this.x).add(this.y,!1).add(this.legend).add(this.streams)}return SvgAxis$$1&&(SvgStreamgraphStrategy.__proto__=SvgAxis$$1),SvgStreamgraphStrategy.prototype=Object.create(SvgAxis$$1&&SvgAxis$$1.prototype),SvgStreamgraphStrategy.prototype.constructor=SvgStreamgraphStrategy,SvgStreamgraphStrategy.prototype.draw=function(data){var svg=this.svgContainer.svg,config=this.config,bbox=null,keys=d3$1.map(data,function(d){return d.key}).keys(),xDataFormat=this.config.xAxisFormat,data4stack=simple2stacked(data),stack$$1=d3$1.stack().keys(keys).value(function(d,k){return d.value[k]}).order(d3$1.stackOrderInsideOut).offset(d3$1.stackOffsetWiggle),dataSeries=stack$$1(data4stack),needRescaling=this.config.needRescaling;convertPropretiesToTimeFormat(data,["x"],xDataFormat),sortByField(data,"x"),needRescaling&&this.rescale(),bbox=this._getDomainBBox(data,dataSeries),this.x.updateDomainByBBox([bbox[0],bbox[1]]),this.y.updateDomainByBBox([bbox[2],bbox[3]]),this.x.transition(svg,200),this.y.transition(svg,200),this.legend.update(svg,config,data),this.streams.update(svg,config,dataSeries)},SvgStreamgraphStrategy.prototype._getDomainBBox=function(data,dataSeries){var minX=d3$1.min(data,function(d){return new Date(d.x)}),maxX=d3$1.max(data,function(d){return new Date(d.x)}),minY=d3$1.min(dataSeries,function(serie){return d3$1.min(serie,function(d){return d[0]})}),maxY=d3$1.max(dataSeries,function(serie){return d3$1.max(serie,function(d){return d[1]})});return[minX,maxX,minY,maxY]},SvgStreamgraphStrategy.prototype._loadConfig=function(config){return SvgAxis$$1.prototype._loadConfig.call(this,config,defaults$2),this},SvgStreamgraphStrategy}(SvgAxis),defaults$3={selector:"#chart",colorScale:category2(),xAxisType:"time",xAxisFormat:"%y/%m/%d",xAxisLabel:null,yAxisType:"categorical",yAxisFormat:"",yAxisLabel:null,marginTop:20,marginRight:250,marginBottom:130,marginLeft:150,width:"100%",height:250,onDown:function(d){},onHover:function(d){},onLeave:function(d){},onClick:function(d){},maxNumberOfElements:100},SvgStackedAreaStrategy=function(SvgAxis$$1){function SvgStackedAreaStrategy(context){SvgAxis$$1.call(this,context),this.axes=new XYAxes("time","linear",this.config),this.streams=new Streamset(this.axes.x.xAxis,this.axes.y.yAxis),this.legend=new Legend,this.svgContainer.add(this.axes).add(this.legend).add(this.streams)}return SvgAxis$$1&&(SvgStackedAreaStrategy.__proto__=SvgAxis$$1),SvgStackedAreaStrategy.prototype=Object.create(SvgAxis$$1&&SvgAxis$$1.prototype),SvgStackedAreaStrategy.prototype.constructor=SvgStackedAreaStrategy,SvgStackedAreaStrategy.prototype.draw=function(data){var svg=this.svgContainer.svg,config=this.config,bbox=null,keys=d3$1.map(data,function(d){return d.key}).keys(),data4stack=simple2stacked(data),xDataFormat=this.config.xAxisFormat,stack$$1=d3$1.stack().keys(keys).value(function(d,k){return d.value[k]}).order(d3$1.stackOrderInsideOut).offset(d3$1.stackOffNone),dataSeries=stack$$1(data4stack),needRescaling=this.config.needRescaling;needRescaling&&this.rescale(),convertPropretiesToTimeFormat(data,["x"],xDataFormat),sortByField(data,"x"),bbox=this._getDomainBBox(data,dataSeries),this.axes.updateDomainByBBox(bbox),this.axes.transition(svg,200),this.legend.update(svg,config,data),this.streams.update(svg,config,dataSeries)},SvgStackedAreaStrategy.prototype._getDomainBBox=function(data,dataSeries){var minX=d3$1.min(data,function(d){return d.x}),maxX=d3$1.max(data,function(d){return d.x}),minY=d3$1.min(dataSeries,function(serie){return d3$1.min(serie,function(d){return d[0]})}),maxY=d3$1.max(dataSeries,function(serie){return d3$1.max(serie,function(d){return d[1]})});return[minX,maxX,minY,maxY]},SvgStackedAreaStrategy.prototype._loadConfig=function(config){SvgAxis$$1.prototype._loadConfig.call(this,config,defaults$3)},SvgStackedAreaStrategy}(SvgAxis),defaults$4={selector:"#chart",colorScale:category3(),xAxisType:"time",xAxisFormat:"%y/%m/%d",xAxisLabel:null,yAxisType:"categorical",yAxisFormat:"%s",yAxisLabel:null,marginTop:20,marginRight:250,marginBottom:30,marginLeft:50,width:"100%",height:250,onDown:function(d){},onHover:function(d){},onLeave:function(d){},onClick:function(d){}},TimeBoxset=function(xAxis,yAxis){this.xAxis=xAxis,this.yAxis=yAxis};TimeBoxset.prototype.update=function(svg,config,data){var colorScale=config.colorScale,keys=d3$1.map(data,function(d){return d.key}).keys(),layer=svg.selectAll(".serie").data(data),layerEnter=null,layerMerge=null,box=null,boxEnter=null,boxMerge=null,extLanes=null,yLanes=null,yLanesBand=d3$1.scaleBand().range([0,keys.length+1]).domain(keys),x=this.xAxis.scale(),y=this.yAxis.scale();data=simple2nested(data),extLanes=d3$1.extent(data,function(d,i){return i}),yLanes=d3$1.scaleLinear().domain([extLanes[0],extLanes[1]+1]).range([0,config.height]),layer=svg.selectAll(".serie").data(data),layerEnter=layer.enter().append("g"),layerMerge=layer.merge(layerEnter).attr("class","serie"),box=layerMerge.selectAll("rect").data(function(d){return d.values}),boxEnter=box.enter().append("rect"),boxMerge=box.merge(boxEnter).attr("width",function(d){return x(d.end)-x(d.start)}).attr("x",function(d){return x(d.start)}).attr("y",function(d){return y(d.key)}).attr("fill",function(d){return colorScale(parseInt(yLanesBand(d.key)))}).attr("height",function(){return.8*yLanes(1)}),box=svg.selectAll("g.serie rect"),box.on("mousedown.user",config.onDown).on("mouseup.user",config.onUp).on("mouseleave.user",config.onLeave).on("mouseover.user",config.onHover).on("click.user",config.onClick)},TimeBoxset.prototype.render=function(svg,config){};var SvgSwimlaneStrategy=function(SvgAxis$$1){function SvgSwimlaneStrategy(context){SvgAxis$$1.call(this,context),this.axes=new XYAxes("time","categorical",this.config),this.boxs=new TimeBoxset(this.axes.x.xAxis,this.axes.y.yAxis),this.legend=new Legend,this.svgContainer.add(this.axes).add(this.boxs).add(this.legend)}return SvgAxis$$1&&(SvgSwimlaneStrategy.__proto__=SvgAxis$$1),SvgSwimlaneStrategy.prototype=Object.create(SvgAxis$$1&&SvgAxis$$1.prototype),SvgSwimlaneStrategy.prototype.constructor=SvgSwimlaneStrategy,SvgSwimlaneStrategy.prototype.draw=function(data){var svg=this.svgContainer.svg,config=this.config,dataFormat=this.config.xAxisFormat,keys=d3$1.map(data,function(d){return d.key}).keys(),bbox=null,needRescaling=this.config.needRescaling;convertPropretiesToTimeFormat(data,["start","end"],dataFormat),needRescaling&&this.rescale(),bbox=this._getBBox(data),this.axes.updateDomainByBBoxAndKeys(bbox,keys),this.axes.transition(svg,200),this.boxs.update(svg,config,data),this.legend.update(svg,config,data)},SvgSwimlaneStrategy.prototype._getBBox=function(data){return[d3$1.min(data,function(d){return d.start}),d3$1.max(data,function(d){return d.end})]},SvgSwimlaneStrategy.prototype._loadConfig=function(config){return SvgAxis$$1.prototype._loadConfig.call(this,config,defaults$4),this},SvgSwimlaneStrategy}(SvgAxis),defaults$5={selector:"#chart",colorScale:diverging_spectral2(),invertColorScale:!0,minLevel:0,maxLevel:100,minAngle:-90,maxAngle:90,ringWidth:50,ringMargin:20,labelInset:10,needleNutRadius:25,needleLenghtRatio:.8,numericIndicator:!0,label:"km/h",marginTop:20,marginRight:250,marginBottom:30,marginLeft:50,width:"50%",height:250,ticks:10},Dial=function(axisType,config){var this$1=this;if(null===config)throw new Error("No chart context specified for polarAxis");this.r=(config.width>config.height?config.height:config.width)/2,this.translation=function(){return"translate("+this$1.r+","+this$1.r+")"},config.colorScale.domain([0,1]),this.scale=d3$1.scaleLinear().domain([config.minLevel,config.maxLevel]).range([0,1]),this.scaleMarks=this.scale.ticks(config.ticks),this.range=config.maxAngle-config.minAngle,this.arc=d3$1.arc().innerRadius(this.r-config.ringWidth-config.ringMargin).outerRadius(this.r-config.ringMargin).startAngle(function(d,i){var ratio=d*i;return deg2rad(config.minAngle+ratio*this$1.range)}).endAngle(function(d,i){var ratio=d*(i+1);return deg2rad(config.minAngle+ratio*this$1.range)}),this.tickData=d3$1.range(config.ticks).map(function(){return 1/config.ticks})};Dial.prototype.render=function(svg,config){var this$1=this,labels=null,arcs=svg.append("g").attr("class","arc").attr("transform",this.translation),arcPaths=arcs.selectAll("path").data(this.tickData).enter().append("path").attr("id",function(d,i){return"sector-"+i}).attr("d",this.arc);config.invertColorScale?arcPaths.attr("fill",function(d,i){return config.colorScale(1-d*i)}):arcPaths.attr("fill",function(d,i){return config.colorScale(d*i)}),labels=svg.append("g").attr("class","labels").attr("transform",this.translation),labels.selectAll("text").data(this.scaleMarks).enter().append("text").attr("transform",function(d){var ratio=this$1.scale(d),newAngle=config.minAngle+ratio*this$1.range;return"rotate("+newAngle+") translate(0,"+(config.labelInset-this$1.r)+")"}).text(function(d){return d}).style("text-anchor","middle").style("font","18px Montserrat, sans-serif")};var DialNeedle=function(axisType,config){var this$1=this;if(null===config)throw new Error("No chart context specified for polarAxis");this.r=(config.width>config.height?config.height:config.width)/2,this.needleLen=config.needleLenghtRatio*this.r,this.translation=function(){return"translate("+this$1.r+","+this$1.r+")"},config.colorScale.domain([0,1]),this.scale=d3$1.scaleLinear().domain([config.minLevel,config.maxLevel]).range([0,1]),this.angleScale=d3$1.scaleLinear().domain([config.minLevel,config.maxLevel]).range([90+config.minAngle,90+config.maxAngle]),this.scaleMarks=this.scale.ticks(config.ticks),this.range=config.maxAngle-config.minAngle,this.arc=d3$1.arc().innerRadius(this.r-config.ringWidth-config.ringMargin).outerRadius(this.r-config.ringMargin).startAngle(function(d,i){var ratio=d*i;return deg2rad(config.minAngle+ratio*this$1.range)}).endAngle(function(d,i){var ratio=d*(i+1);return deg2rad(config.minAngle+ratio*this$1.range)}),this.tickData=d3$1.range(config.ticks).map(function(){return 1/config.ticks})};DialNeedle.prototype.update=function(svg,config,data,method){var this$1=this,datum=data[data.length-1];this.needle.transition().attr("transform",function(d){return"translate("+this$1.r+", "+this$1.r+") rotate("+(this$1.angleScale(datum.value)-90)+")"}).attr("d","M "+(0-config.needleNutRadius)+" 0 L 0 "+(0-this.needleLen)+" L "+config.needleNutRadius+" 0")},DialNeedle.prototype.render=function(svg,config){var this$1=this;this.needle=svg.append("path").attr("class","needle").datum(0).attr("transform",function(d){return"translate("+this$1.r+", "+this$1.r+") rotate("+(this$1.angleScale(d)-90)+")"}).attr("d","M "+(0-config.needleNutRadius)+" 0 L 0 "+(0-this.needleLen)+" L "+config.needleNutRadius+" 0").style("fill","#666666"),svg.append("circle").attr("class","needle").attr("transform",this.translation).attr("cx",0).attr("cy",0).attr("r",config.needleNutRadius).style("fill","#666666")};var TextIndicator=function(config){if(null===config)throw new Error("No chart context specified for polarAxis");this.translation=config.textIndicatorTranslation};TextIndicator.prototype.update=function(svg,value,label){svg.select(".value").text(value),svg.select(".label").text(label)},TextIndicator.prototype.render=function(svg,config){var indicator=svg.append("g").attr("class","text-indicator").attr("pointer-events","none").style("text-anchor","middle").style("alignment-baseline","central");this.translation&&indicator.attr("transform",this.translation),indicator.append("text").attr("class","value").attr("x",0).attr("y",0).attr("pointer-events","none").text("0").style("font","48px Montserrat, sans-serif").style("text-anchor","middle"),indicator.append("text").attr("class","label").attr("x",0).attr("y",0).attr("pointer-events","none").text("").style("font","24px Montserrat, sans-serif").style("transform","translate(0, 1.5em").style("text-anchor","middle")};var SvgGaugeStrategy=function(context){this._loadConfig(context.config),this.svgContainer=new SvgContainer(this.config);var config=this.config;if(this.dial=new Dial("linear",config),this.needle=new DialNeedle("linear",config),this.svgContainer.add(this.dial).add(this.needle),config.numericIndicator){var r=(config.width>config.height?config.height:config.width)/2,indicatorOffset=r+75;config.textIndicatorTranslation="translate("+r+","+indicatorOffset+")",this.textIndicator=new TextIndicator(config),this.svgContainer.add(this.textIndicator)}};SvgGaugeStrategy.prototype.draw=function(data){var datum=data[data.length-1],svg=this.svgContainer.svg,config=this.config;this.needle.update(svg,config,data),config.numericIndicator&&this.textIndicator.update(svg,datum.value,config.label)},SvgGaugeStrategy.prototype._loadConfig=function(config){return this.config={},this.config.selector=config.selector||defaults$5.selector,this.config.marginTop=config.marginTop||defaults$5.marginTop,this.config.marginLeft=config.marginLeft||defaults$5.marginLeft,this.config.marginRight=config.marginRight||defaults$5.marginRight,this.config.marginBottom=config.marginBottom||defaults$5.marginBottom,this.config.width=config.width?calculateWidth(config.width,this.config.selector)-this.config.marginLeft-this.config.marginRight:calculateWidth(defaults$5.width,this.config.selector)-this.config.marginLeft-this.config.marginRight,this.config.height=config.height||defaults$5.height,this.config.colorScale=config.colorScale||defaults$5.colorScale,this.config.minLevel=config.minLevel||defaults$5.minLevel,this.config.maxLevel=config.maxLevel||defaults$5.maxLevel,this.config.minAngle=config.minAngle||defaults$5.minAngle,this.config.maxAngle=config.maxAngle||defaults$5.maxAngle,this.config.ticks=config.ticks||defaults$5.ticks,this.config.ringWidth=config.ringWidth||defaults$5.ringWidth,this.config.ringMargin=config.ringMargin||defaults$5.ringMargin,this.config.labelInset=config.labelInset||defaults$5.labelInset,this.config.needleNutRadius=config.needleNutRadius||defaults$5.needleNutRadius,this.config.needleLenghtRatio=config.needleLenghtRatio||defaults$5.needleLenghtRatio,this.config.invertColorScale="undefined"==typeof config.invertColorScale?defaults$5.invertColorScale:config.invertColorScale,this.config.numericIndicator="undefined"==typeof config.numericIndicator?defaults$5.numericIndicator:config.numericIndicator,this.config.label=config.label||defaults$5.label,this};var defaults$6={selector:"#chart",width:"100%",height:250,yAxisLabel:null,marginTop:20,marginRight:250,marginBottom:30,marginLeft:50},Nodeset=function(config){var this$1=this;this.config=config;var width=config.width,height=config.height;this.simulation=d3$1.forceSimulation().force("link",d3$1.forceLink().id(function(d){return d.id})).force("charge",d3$1.forceManyBody()).force("center",d3$1.forceCenter(width/2,height/2)),this.dragstarted=function(d){d3$1.event.active||this$1.simulation.alphaTarget(.3).restart(),d.fx=d.x,d.fy=d.y},this.dragged=function(d){d.fx=d3$1.event.x,d.fy=d3$1.event.y},this.dragended=function(d){d3$1.event.active||this$1.simulation.alphaTarget(0),d.fx=null,d.fy=null}};Nodeset.prototype.update=function(svg,config,data){var this$1=this;data=simple2Linked(data);var link=svg.append("g").attr("class","links").selectAll("line").data(data.links).enter().append("line").attr("stroke-width",2).attr("stroke","#999").attr("stroke-opacity",.6),node=svg.append("g").attr("class","nodes").selectAll("circle").data(data.nodes).enter().append("circle").attr("r",5).attr("fill",function(d){return"#23436f"}).call(d3$1.drag().on("start",this.dragstarted).on("drag",this.dragged).on("end",this.dragended));node.append("title").text(function(d){return d.id}),this.simulation.nodes(data.nodes).on("tick",function(e){return this$1.ticked(link,node)}),this.simulation.force("link").links(data.links)},Nodeset.prototype.ticked=function(link,node){link.attr("x1",function(d){return d.source.x}).attr("y1",function(d){return d.source.y}).attr("x2",function(d){return d.target.x}).attr("y2",function(d){return d.target.y}),node.attr("cx",function(d){return d.x}).attr("cy",function(d){return d.y})},Nodeset.prototype.render=function(svg,config){};var SvgNetworkgraphStrategy=function(context){this._loadConfig(context.config),this.svgContainer=new SvgContainer(this.config),this.nodeset=new Nodeset(this.config),this.svgContainer.add(this.nodeset)};SvgNetworkgraphStrategy.prototype.draw=function(data){var svg=this.svgContainer.svg,config=this.config;this.nodeset.update(svg,config,data)},SvgNetworkgraphStrategy.prototype._loadConfig=function(config){return this.config={},this.config.selector=config.selector||defaults$6.selector,this.config.marginTop=config.marginTop||defaults$6.marginTop,this.config.marginLeft=config.marginLeft||defaults$6.marginLeft,this.config.marginRight=config.marginRight||defaults$6.marginRight,this.config.marginBottom=config.marginBottom||defaults$6.marginBottom,this.config.width=config.width?calculateWidth(config.width,this.config.selector)-this.config.marginLeft-this.config.marginRight:calculateWidth(defaults$6.width,this.config.selector)-this.config.marginLeft-this.config.marginRight,this.config.height=config.height||defaults$6.height,this};var defaults$7={selector:"#chart",colorScale:category8(),marginTop:20,marginRight:20,marginBottom:30,marginLeft:50,width:"50%",height:450,tickLabel:"",transitionDuration:300,maxNumberOfElements:5,sortData:{descending:!1,prop:"x"},onDown:function(d){},onHover:function(d){},onLeave:function(d){},onClick:function(d){}},XRadialAxis=function(config){if(null===config)throw new Error("No chart context specified for XRadialAxis");this.xRadialAxis=d3$1.scaleLinear().range([0,2*Math.PI])},YRadialAxis=function(config){if(null===config)throw new Error("No chart context specified for XRadialAxis");var radius=Math.min(config.width,config.height)/2-10;this.yRadialAxis=d3$1.scaleSqrt().range([0,radius])},RadialAxes=function(config){if(null===config)throw new Error("No chart context specified for RadialAxis");this.x=new XRadialAxis(config),this.y=new YRadialAxis(config)},SunburstDisk=function(xRadialAxis,yRadialAxis){var this$1=this;this.x=xRadialAxis,this.y=yRadialAxis,this.arcGen=d3$1.arc().startAngle(function(d){return Math.max(0,Math.min(2*Math.PI,this$1.x(d.x0)))}).endAngle(function(d){return Math.max(0,Math.min(2*Math.PI,this$1.x(d.x1)))}).innerRadius(function(d){return Math.max(0,this$1.y(d.y0))}).outerRadius(function(d){return Math.max(0,this$1.y(d.y1))})};SunburstDisk.prototype.update=function(svg,config,data){var this$1=this;this._removePaths(svg);var root=d3$1.stratify().id(function(d){return d.id}).parentId(function(d){return d.parent})(data);root.sum(function(d){return d.value}),d3$1.partition()(root);var paths=svg.selectAll("path").data(root.descendants()).enter().append("path").attr("d",this.arcGen).style("fill",function(d){return d.parent?config.colorScale(d.data.label):"white"}).style("stroke","#fff").style("stroke-width","2").style("shape-rendering","crispEdge");paths.on("mouseover.default",function(d){var ancestors=this$1._getAncestors(d);ancestors.length>0&&svg.selectAll("path").style("opacity",.3),svg.selectAll("path").filter(function(node){return ancestors.indexOf(node)>=0}).style("opacity",1),svg.select(".text-indicator .label").text(d.data.label),svg.select(".text-indicator .value").text(d.value)}).on("mouseout.default",function(d){svg.selectAll("path").style("opacity",1),svg.select(".text-indicator .label").style("font-weight","normal"),svg.select(".text-indicator .label").text(""),svg.select(".text-indicator .value").text("")}),paths.on("mousedown.user",config.onDown).on("mouseup.user",config.onUp).on("mouseleave.user",config.onLeave).on("mouseover.user",config.onHover).on("click.user",config.onClick),svg.select(self.frameElement).style("height",this.height+"px")},SunburstDisk.prototype._removePaths=function(svg){svg.selectAll("path").remove()},SunburstDisk.prototype._getAncestors=function(node){for(var path=[],current=node;current.parent;)path.unshift(current),current=current.parent;return path},SunburstDisk.prototype.render=function(svg,config){};var SvgSunburstStrategy=function(context){this._loadConfig(context.config),this.svgContainer=new SvgContainer(this.config);var config=this.config,translation="translate("+config.width/2+","+config.height/2+")";this.svgContainer.transform(translation),this.axes=new RadialAxes(config),this.disk=new SunburstDisk(this.axes.x.xRadialAxis,this.axes.y.yRadialAxis,config),this.textIndicator=new TextIndicator(config),this.svgContainer.add(this.disk).add(this.textIndicator)};SvgSunburstStrategy.prototype.draw=function(data){var svg=this.svgContainer.svg,config=this.config;this.disk.update(svg,config,data)},SvgSunburstStrategy.prototype._loadConfig=function(config){return this.config={},this.config.selector=config.selector||defaults$7.selector,this.config.marginTop=config.marginTop||defaults$7.marginTop,this.config.marginLeft=config.marginLeft||defaults$7.marginLeft,this.config.marginRight=config.marginRight||defaults$7.marginRight,this.config.marginBottom=config.marginBottom||defaults$7.marginBottom,this.config.width=config.width?calculateWidth(config.width,this.config.selector)-this.config.marginLeft-this.config.marginRight:calculateWidth(defaults$7.width,this.config.selector)-this.config.marginLeft-this.config.marginRight,this.config.height=config.height||defaults$7.height,this.config.colorScale=config.colorScale||defaults$7.colorScale,this.config.onDown=config.onDown||defaults$7.onDown,this.config.onUp=config.onUp||defaults$7.onUp,this.config.onHover=config.onHover||defaults$7.onHover,this.config.onClick=config.onClick||defaults$7.onClick,this.config.onLeave=config.onLeave||defaults$7.onLeave,this};var defaults$8={selector:"#chart",colorScale:category7(),xAxisType:"linear",xAxisFormat:".1f",xAxisLabel:"Sepal length (cm)",yAxisType:"linear",yAxisFormat:".1f",yAxisLabel:"Sepal width (cm)",marginTop:20,marginRight:250,marginBottom:130,marginLeft:150,markerShape:"dot",markerSize:3,width:"100%",height:250,onDown:function(d){},onHover:function(d){},onLeave:function(d){},onClick:function(d){},maxNumberOfElements:100},SvgScatterplotStrategy=function(SvgAxis$$1){function SvgScatterplotStrategy(context){SvgAxis$$1.call(this,context),this.axes=new XYAxes(this.config.xAxisType,"linear",this.config),this.points=new Pointset(this.axes.x,this.axes.y),this.legend=new Legend,this.svgContainer.add(this.axes).add(this.legend).add(this.points)}return SvgAxis$$1&&(SvgScatterplotStrategy.__proto__=SvgAxis$$1),SvgScatterplotStrategy.prototype=Object.create(SvgAxis$$1&&SvgAxis$$1.prototype),SvgScatterplotStrategy.prototype.constructor=SvgScatterplotStrategy,SvgScatterplotStrategy.prototype.draw=function(data){var svg=this.svgContainer.svg,config=this.config,needRescaling=this.config.needRescaling,bbox=null;convertByXYFormat(data,config),sortByField(data,"x"),needRescaling&&this.rescale(),bbox=this._getDomainBBox(data),this.axes.updateDomainByBBox(bbox),this.axes.transition(svg,200),this.legend.update(svg,config,data),this.points.update(svg,config,data)},SvgScatterplotStrategy.prototype._getDomainBBox=function(data){var minX=d3$1.min(data,function(d){return d.x}),maxX=d3$1.max(data,function(d){return d.x}),minY=d3$1.min(data,function(d){return d.y}),maxY=d3$1.max(data,function(d){return d.y});return[minX,maxX,minY,maxY]},SvgScatterplotStrategy.prototype._checkMarkers=function(config){return config.markerSize>0},SvgScatterplotStrategy.prototype._checkArea=function(config){return config.areaOpacity>0},SvgScatterplotStrategy.prototype._loadConfig=function(config){return SvgAxis$$1.prototype._loadConfig.call(this,config,defaults$8),this.config.markerOutlineWidth=config.markerOutlineWidth||defaults$8.markerOutlineWidth,this.config.markerShape=config.markerShape||defaults$8.markerShape,this.config.markerSize="undefined"==typeof config.markerSize||config.markerSize<0?defaults$8.markerSize:config.markerSize, -this.config.areaOpacity="undefined"==typeof config.areaOpacity||config.markerSize<0?defaults$8.areaOpacity:config.areaOpacity,this},SvgScatterplotStrategy}(SvgAxis),SvgStrategy=function(strategy){this.strategy=strategy};SvgStrategy.prototype.draw=function(data){this.strategy.draw(data)},SvgStrategy.prototype.on=function(events){this.strategy.on(events)};var strategies={Barchart:function(chartContext){return new SvgBarchartStrategy(chartContext)},Linechart:function(chartContext){return new SvgLinechartStrategy(chartContext)},Streamgraph:function(chartContext){return new SvgStreamgraphStrategy(chartContext)},Gauge:function(chartContext){return new SvgGaugeStrategy(chartContext)},Scatterplot:function(chartContext){return new SvgScatterplotStrategy(chartContext)},Sunburst:function(chartContext){return new SvgSunburstStrategy(chartContext)},Swimlane:function(chartContext){return new SvgSwimlaneStrategy(chartContext)},StackedArea:function(chartContext){return new SvgStackedAreaStrategy(chartContext)},Networkgraph:function(chartContext){return new SvgNetworkgraphStrategy(chartContext)}},doctype='',Chart=function(d,config){var clazz=this.constructor.name;if("Chart"===clazz)throw new Error(clazz+" is non-instanciable");if(this.events={},!d&&!config)throw new Error("Missing constructor parameters");var dataFormat=d.constructor.name,nArguments=d&&config?2:1;switch(dataFormat){case"WebsocketDatasource":case"HTTPDatasource":this.datasource=d,this.data=[],this._configureDatasource();break;case"Array":this.data=d;break;default:throw TypeError("Wrong data format")}this.config=1===nArguments?{}:config,this._initializeSVGContext()};Chart.prototype._initializeAPI=function(properties){var clazz=this.constructor;properties.forEach(function(method){clazz.prototype[method]=function(value){return this.change(method,value)}})},Chart.prototype._getChartContext=function(){return{data:this.data,config:this.config,cType:this.constructor.name}},Chart.prototype._initializeSVGContext=function(){this._svg=new SvgStrategy(strategies[this.constructor.name](this._getChartContext()))},Chart.prototype.draw=function(data){void 0===data&&(data=this.data),this._svg.draw(data)},Chart.prototype.download=function(){var this$1=this,selector=this._svg.strategy.config.selector+" svg";svgAsDataUri(d3.select(selector).node(),{},function(uri,err){if(err)throw Error("Error converting to image "+err);var link=document.createElement("a");link.style="position: fixed; left -10000px;",link.href=uri,link.download=this$1.constructor.name+".svg",document.body.appendChild(link),link.click(),document.body.removeChild(link)})},Chart.prototype._keepDrawingByAdding=function(datum){var datumType=datum.constructor;datumType===Array?this.data=this.data.concat(datum):this.data.push(datum),this.draw(JSON.parse(JSON.stringify(this.data)))},Chart.prototype.keepDrawing=function(datum,method){"add"===method?this._keepDrawingByAdding(datum):this._keepDrawingByReplacing(datum)},Chart.prototype._configureDatasource=function(){var this$1=this;this.dispatcher=d3$1.dispatch("onmessage","onopen","onerror"),this.datasource.configure(this.dispatcher),this.dispatcher.on("onmessage",function(data){return this$1.keepDrawing(data)}),this.dispatcher.on("onopen",function(event$$1){console.log("onopen",event$$1)}),this.dispatcher.on("onerror",function(error){console.log("onerror",error)})},Chart.prototype.change=function(property,value){return this._svg.strategy.changeConfigProperty(property,value),this};var Linechart$1=function(Chart$$1){function Linechart(data,config){Chart$$1.call(this,data,config);var keys=Object.keys(defaults);this._initializeAPI(keys)}return Chart$$1&&(Linechart.__proto__=Chart$$1),Linechart.prototype=Object.create(Chart$$1&&Chart$$1.prototype),Linechart.prototype.constructor=Linechart,Linechart.prototype.draw=function(data){void 0===data&&(data=this.data),Chart$$1.prototype.draw.call(this,data)},Linechart.prototype.keepDrawing=function(datum){Chart$$1.prototype.keepDrawing.call(this,datum,"add")},Linechart}(Chart),Barchart$1=function(Chart$$1){function Barchart(data,config){Chart$$1.call(this,data,config);var keys=Object.keys(defaults);this._initializeAPI(keys)}return Chart$$1&&(Barchart.__proto__=Chart$$1),Barchart.prototype=Object.create(Chart$$1&&Chart$$1.prototype),Barchart.prototype.constructor=Barchart,Barchart.prototype.draw=function(data){void 0===data&&(data=this.data),Chart$$1.prototype.draw.call(this,data)},Barchart.prototype.fire=function(event$$1,data){"transition"===event$$1&&("grouped"===data?this._svg.strategy.transition2Grouped():"stacked"===data&&this._svg.strategy.transition2Stacked(),this._svg.strategy.draw())},Barchart.prototype.keepDrawing=function(datum){Chart$$1.prototype.keepDrawing.call(this,datum,"replace")},Barchart.prototype._keepDrawingByReplacing=function(datum){var this$1=this,datumType=datum.constructor;if(datumType===Array)this.data=datum;else for(var i=0;i=0&&number<=100)}function copy(object){return null!=object?JSON.parse(JSON.stringify(object)):null}function deg2rad(deg){return deg*Math.PI/180}function calculateWidth(widthConfig,selector){if("auto"===widthConfig)return d3.select(selector).node().getBoundingClientRect().width;if(isNumeric(widthConfig))return widthConfig;if(isPercentage(widthConfig)){var containerWidth=void 0,percentage=void 0;return containerWidth=d3.select(selector).node().getBoundingClientRect().width,percentage=widthConfig.split("%")[0],Math.round(percentage*containerWidth/100)}throw Error("Unknow config width value: "+widthConfig)}function simple2stacked(data){return d3.nest().key(function(d){return d.x}).rollup(function(array){for(var r={},i=0;ib?1:0})}function category2(){return d3.scaleOrdinal().range(paletteCategory2)}function category3(){return d3.scaleOrdinal().range(paletteCategory3)}function category4(){return d3.scaleOrdinal().range(paletteCategory4)}function category5(){return d3.scaleOrdinal().range(paletteCategory5)}function category7(){return d3.scaleOrdinal().range(paletteCategory7)}function category8(){return d3.scaleOrdinal().range(paletteCategory8)}function diverging_spectral2(){return d3.scaleQuantile().range(paletteDivergingSpectral2)}var SvgContext=function(){function SvgContext(strategy,config){this.strategy=strategy,this.strategy.setConfig(config),this.strategy.initialize()}return SvgContext.prototype.draw=function(data){this.strategy.draw(data)},SvgContext.prototype.addLoading=function(){this.strategy.addLoading()},SvgContext.prototype.removeLoading=function(){this.strategy.removeLoading()},SvgContext}(),Config=function(){function Config(){this.properties={}}return Config.prototype.put=function(key,value){return this.properties[key]=value,this},Config.prototype.get=function(key){return this.properties[key]},Config}(),Chart=function(){function Chart(strategy,data,userConfig,defaults){this.ds=null,this.dispatcher=d3.dispatch("onmessage","onopen","onerror","addLoading","removeLoading"),this.config=this.loadConfigFromUser(userConfig,defaults),this.context=new SvgContext(strategy,this.config),this.data=data}return Chart.prototype.draw=function(data){void 0===data&&(data=this.data),this.context.draw(copy(data)),this.data=data},Chart.prototype.datasource=function(ds){var _this=this;this.ds=ds,this.ds.configure(this.dispatcher),this.dispatcher.on("addLoading",function(){return _this.context.addLoading()}),this.dispatcher.on("removeLoading",function(){return _this.context.removeLoading()}),this.dispatcher.on("onmessage",function(data){return _this.keepDrawing(data)}),this.dispatcher.on("onopen",function(event$$1){console.log("onopen",event$$1)}),this.dispatcher.on("onerror",function(error){console.log("onerror",error)})},Chart.prototype.loadConfigFromUser=function(userData,defaults){var config=new Config;for(var v in defaults)config.put(v,v in userData?userData[v]:defaults[v]);var width=config.get("width");return width=calculateWidth(width,config.get("selector"))-config.get("marginLeft")-config.get("marginRight"),config.put("width",width),config},Chart}(),Component=function(){function Component(){}return Component.prototype.configure=function(config,svg){this.config=config,this.svg=svg},Component.prototype.clean=function(){this.svg.selectAll(".serie").remove()},Component}(),XAxis=function(_super){function XAxis(){return _super.call(this)||this}return __extends(XAxis,_super),XAxis.prototype.render=function(){var width=this.config.get("width"),height=this.config.get("height"),xAxisFormat=this.config.get("xAxisFormat"),xAxisType=this.config.get("xAxisType"),xAxisLabel=this.config.get("xAxisLabel"),xAxisGrid=this.config.get("xAxisGrid");this.initializeXAxis(width,height,xAxisFormat,xAxisType,xAxisGrid),this.svg.append("g").attr("class","x axis "+xAxisType).attr("transform","translate(0,"+height+")").call(this._xAxis),this.svg.append("text").attr("class","xaxis-title").attr("text-anchor","middle").attr("x",width/2).attr("y",height+40).text(xAxisLabel).style("font","0.8em Montserrat, sans-serif")},XAxis.prototype.update=function(data){var _this=this,propertyX=this.config.get("propertyX"),xAxisType=this.config.get("xAxisType");if("linear"===xAxisType){var min$$1=d3.min(data,function(d){return d[propertyX]}),max$$1=d3.max(data,function(d){return d[propertyX]});this.updateDomainByMinMax(min$$1,max$$1)}else if("time"===xAxisType){var min$$1=d3.min(data,function(d){return d[propertyX]||d[_this.config.get("propertyStart")]}),max$$1=d3.max(data,function(d){return d[propertyX]||d[_this.config.get("propertyEnd")]});this.updateDomainByMinMax(min$$1,max$$1)}else{var keys=d3.map(data,function(d){return d[propertyX]}).keys();this.updateDomainByKeys(keys)}this.transition()},XAxis.prototype.updateDomainByKeys=function(keys){this._xAxis.scale().domain(keys)},XAxis.prototype.updateDomainByMinMax=function(min$$1,max$$1){this._xAxis.scale().domain([min$$1,max$$1])},XAxis.prototype.transition=function(time){void 0===time&&(time=200),this.svg.selectAll(".x.axis").transition().duration(time).call(this._xAxis),this.svg.select(".x.axis path").raise()},XAxis.prototype.initializeXAxis=function(width,height,xAxisFormat,xAxisType,xAxisGrid){switch(xAxisType){case"time":this._xAxis=d3.axisBottom(d3.scaleTime().range([0,width]));break;case"linear":this._xAxis=d3.axisBottom(d3.scaleLinear().range([0,width])).tickFormat(d3.format(xAxisFormat));break;case"categorical":this._xAxis=d3.axisBottom(d3.scaleBand().rangeRound([0,width]).padding(.1).align(.5));break;default:throw new Error('Not allowed type for XAxis. Only allowed "time", "linear" or "categorical". Got: '+xAxisType)}xAxisGrid&&this._xAxis.tickSizeInner(-height).tickPadding(9)},Object.defineProperty(XAxis.prototype,"xAxis",{get:function(){return this._xAxis},enumerable:!0,configurable:!0}),XAxis}(Component),Globals=function(){function Globals(){}return Globals}();Globals.COMPONENT_TRANSITION_TIME=100,Globals.COMPONENT_HIDE_SHOW_TRANSITION_TIME=300,Globals.COMPONENT_HIDE_OPACITY=.06,Globals.COMPONENT_DATA_KEY_ATTRIBUTE="data-proteic-key",Globals.LEGEND_DATA_KEY_ATTRIBUTE="data-proteic-legend-key",Globals.LEGEND_HIDE_OPACITY=.3,Globals.BREAKPOINT=768,Globals.ASPECT_RATIO=.7,Globals.LOADING_ICON="data:image/gif;base64,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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="; +var YAxis=function(_super){function YAxis(orient){var _this=_super.call(this)||this;return _this._orient="left",_this.selection=null,null!=orient&&(_this._orient=orient),_this}return __extends(YAxis,_super),Object.defineProperty(YAxis.prototype,"orient",{get:function(){return this._orient},enumerable:!0,configurable:!0}),YAxis.prototype.render=function(){var width=this.config.get("width"),height=this.config.get("height"),yAxisFormat=this.config.get("yAxisFormat"),yAxisType=this.config.get("yAxisType"),yAxisLabel=this.config.get("yAxisLabel"),yAxisGrid=this.config.get("yAxisGrid");this.initializeYAxis(width,height,yAxisFormat,yAxisType,yAxisGrid);var yAxisG=this.svg.append("g").attr("class","y axis").attr("transform","left"===this.orient?"translate( 0, 0 )":"translate( "+width+", 0 )").call(this._yAxis);this.svg.append("text").attr("class","yaxis-title").attr("transform","rotate(-90)").attr("text-anchor","middle").attr("x",0-height/2).attr("y",-55).text(yAxisLabel).style("font","0.8em Montserrat, sans-serif"),this.selection=yAxisG},YAxis.prototype.update=function(data){var propertyKey=this.config.get("propertyKey"),propertyY=this.config.get("propertyY"),yAxisType=this.config.get("yAxisType"),yAxisShow=this.config.get("yAxisShow"),layoutStacked=this.config.get("stacked");if(this.selection.attr("opacity",yAxisShow?1:0),"linear"===yAxisType)if(layoutStacked){var keys=d3.map(data,function(d){return d[propertyKey]}).keys(),stack_1=this.config.get("stack"),stackedData=stack_1.keys(keys)(simple2stacked(data)),min$$1=d3.min(stackedData,function(serie){return d3.min(serie,function(d){return d[0]})}),max$$1=d3.max(stackedData,function(serie){return d3.max(serie,function(d){return d[1]})});this.updateDomainByMinMax(min$$1,max$$1)}else{var min$$1=d3.min(data,function(d){return d[propertyY]}),max$$1=d3.max(data,function(d){return d[propertyY]});this.updateDomainByMinMax(min$$1,max$$1)}else if("categorical"===yAxisType){var keys=d3.map(data,function(d){return d[propertyKey]}).keys().sort();this._yAxis.scale().domain(keys)}else console.warn("could not recognize y axis type",yAxisType);null!==data&&data.length&&this.transition()},YAxis.prototype.updateDomainByMinMax=function(min$$1,max$$1){this._yAxis.scale().domain([min$$1,max$$1])},YAxis.prototype.transition=function(time){void 0===time&&(time=200),this.selection.transition().duration(Globals.COMPONENT_TRANSITION_TIME).call(this._yAxis),this.svg.selectAll(".y.axis path").raise()},YAxis.prototype.initializeYAxis=function(width,height,yAxisFormat,yAxisType,yAxisGrid){switch(yAxisType){case"linear":this._yAxis="left"===this.orient?d3.axisLeft(d3.scaleLinear().range([height,0])).tickFormat(d3.format(yAxisFormat)):d3.axisRight(d3.scaleLinear().range([height,0])).tickFormat(d3.format(yAxisFormat));break;case"categorical":this._yAxis="left"===this.orient?d3.axisLeft(d3.scaleBand().rangeRound([height,0]).padding(.1).align(.5)):d3.axisRight(d3.scaleBand().rangeRound([height,0]).padding(.1).align(.5));break;default:throw new Error('Not allowed type for YAxis. Only allowed "time", "linear" or "categorical". Got: '+yAxisType)}yAxisGrid&&"left"===this.orient&&this._yAxis.tickSizeInner(-width).tickSizeOuter(0).tickPadding(20)},Object.defineProperty(YAxis.prototype,"yAxis",{get:function(){return this._yAxis},enumerable:!0,configurable:!0}),YAxis}(Component),XYAxis=function(_super){function XYAxis(){var _this=_super.call(this)||this;return _this._x=new XAxis,_this._y=new YAxis,_this}return __extends(XYAxis,_super),XYAxis.prototype.render=function(){this._y.render(),this._x.render()},XYAxis.prototype.update=function(data){this._y.update(data),this._x.update(data)},XYAxis.prototype.configure=function(config,svg){_super.prototype.configure.call(this,config,svg),this._y.configure(config,svg),this._x.configure(config,svg)},Object.defineProperty(XYAxis.prototype,"x",{get:function(){return this._x},enumerable:!0,configurable:!0}),Object.defineProperty(XYAxis.prototype,"y",{get:function(){return this._y},enumerable:!0,configurable:!0}),XYAxis}(Component),Lineset=function(_super){function Lineset(x,y){var _this=_super.call(this)||this;return _this.x=x,_this.y=y,_this}return __extends(Lineset,_super),Lineset.prototype.render=function(){var _this=this,propertyX=this.config.get("propertyX"),propertyY=this.config.get("propertyY"),curve=this.config.get("curve");this.lineGenerator=d3.line().curve(curve).x(function(d){return _this.x.xAxis.scale()(d[propertyX])}).y(function(d){return _this.y.yAxis.scale()(d[propertyY])})},Lineset.prototype.update=function(data){var _this=this,propertyKey=this.config.get("propertyKey"),dataSeries=d3.nest().key(function(d){return d[propertyKey]}).entries(data),series=this.svg.selectAll("g.lineSeries"),colorScale=this.config.get("colorScale");series.data(dataSeries,function(d){return d[propertyKey]}).enter().append("g").attr("class","lineSeries").attr(Globals.COMPONENT_DATA_KEY_ATTRIBUTE,function(d){return d[propertyKey]}).attr("stroke",function(d){return colorScale(d[propertyKey])}).append("svg:path").style("stroke",function(d){return colorScale(d[propertyKey])}).style("stroke-width",1.9).style("fill","none").attr("d",function(d){return _this.lineGenerator(d.values)}).attr("class","line");this.svg.selectAll(".line").data(dataSeries,function(d){return d[propertyKey]}).attr("d",function(d){return _this.lineGenerator(d.values)}).transition().duration(Globals.COMPONENT_TRANSITION_TIME).ease(d3.easeLinear)},Lineset}(Component),Pointset=function(_super){function Pointset(x,y){var _this=_super.call(this)||this;return _this.x=x,_this.y=y,_this}return __extends(Pointset,_super),Pointset.prototype.render=function(){},Pointset.prototype.update=function(data){var _this=this,propertyKey=this.config.get("propertyKey"),propertyX=this.config.get("propertyX"),propertyY=this.config.get("propertyY"),dataSeries=d3.nest().key(function(d){return d[propertyKey]}).entries(data),markers=null,markerShape=this.config.get("markerShape"),markerSize=this.config.get("markerSize"),colorScale=(this.config.get("markerOutlineWidth"),this.config.get("colorScale")),points=null,series=null,shape=d3.symbol().size(markerSize);switch(series=this.svg.selectAll("g.points"),markerShape){case"dot":shape.type(d3.symbolCircle);break;case"ring":shape.type(d3.symbolCircle);break;case"cross":shape.type(d3.symbolCross);break;case"diamond":shape.type(d3.symbolDiamond);break;case"square":shape.type(d3.symbolSquare);break;case"star":shape.type(d3.symbolStar);break;case"triangle":shape.type(d3.symbolTriangle);break;case"wye":shape.type(d3.symbolWye);break;case"circle":shape.type(d3.symbolCircle);break;default:shape.type(d3.symbolCircle)}points=series.data(dataSeries,function(d){return d.values},function(d){return d[propertyX]}),points.enter().append("g").attr("class","points").attr(Globals.COMPONENT_DATA_KEY_ATTRIBUTE,function(d){return d[propertyKey]}).style("stroke",function(d){return colorScale(d[propertyKey])}).selectAll("circle").data(function(d){return d.values}).enter().append("path").attr("class","marker").attr("d",shape).style("stroke",function(d){return colorScale(d[propertyKey])}).style("fill",function(d){return"ring"!==markerShape?colorScale(d[propertyKey]):"transparent"}).attr("transform",function(d){return"translate("+_this.x.xAxis.scale()(d[propertyX])+", "+_this.y.yAxis.scale()(d[propertyY])+")"}),this.svg.selectAll(".marker").transition().duration(Globals.COMPONENT_TRANSITION_TIME).ease(d3.easeLinear).attr("transform",function(d){return"translate("+_this.x.xAxis.scale()(d[propertyX])+", "+_this.y.yAxis.scale()(d[propertyY])+")"}),points.exit().remove(),markers=this.svg.selectAll(".marker"),markers.on("mousedown.user",this.config.get("onDown")).on("mouseup.user",this.config.get("onUp")).on("mouseleave.user",this.config.get("onLeave")).on("mouseover.user",this.config.get("onHover")).on("click.user",this.config.get("onClick"))},Pointset}(Component),Areaset=function(_super){function Areaset(x,y){var _this=_super.call(this)||this;return _this.x=x,_this.y=y,_this}return __extends(Areaset,_super),Areaset.prototype.render=function(){var _this=this,height=this.config.get("height"),propertyX=this.config.get("propertyX"),propertyY=this.config.get("propertyY"),curve=this.config.get("curve");this.areaGenerator=d3.area().curve(curve).x(function(d){return _this.x.xAxis.scale()(d[propertyX])}).y0(height).y1(function(d){return _this.y.yAxis.scale()(d[propertyY])})},Areaset.prototype.update=function(data){var _this=this,propertyKey=this.config.get("propertyKey"),dataSeries=d3.nest().key(function(d){return d[propertyKey]}).entries(data),areas=this.svg.selectAll("g.area"),colorScale=this.config.get("colorScale"),areaOpacity=(this.config.get("height"),this.config.get("areaOpacity"));areas=areas.data(dataSeries,function(d){return d[propertyKey]}).enter().append("g").attr("class","area").attr(Globals.COMPONENT_DATA_KEY_ATTRIBUTE,function(d){return d[propertyKey]}).append("svg:path").style("fill",function(d){return colorScale(d[propertyKey])}).style("fill-opacity",areaOpacity).attr("d",function(d){return _this.areaGenerator(d.values)}).attr("class","areaPath"),this.svg.selectAll(".areaPath").data(dataSeries,function(d){return d[propertyKey]}).transition().duration(Globals.COMPONENT_TRANSITION_TIME).attr("d",function(d){return _this.areaGenerator(d.values)})},Areaset}(Component),Legend=function(_super){function Legend(){return _super.call(this)||this}return __extends(Legend,_super),Legend.prototype.render=function(){},Legend.prototype.update=function(data){var _this=this,dataSeries=d3.nest().key(function(d){return d.key}).entries(data),legend=null,entries=null,colorScale=this.config.get("colorScale"),width=(this.config.get("height"),this.config.get("width"));return 1===dataSeries.length&&"undefined"===dataSeries[0].key?void console.warn("Not showing legend, since there is a valid key"):(this.svg.selectAll("g.legend").remove(),legend=this.svg.append("g").attr("class","legend"),entries=legend.selectAll(".legend-entry").data(dataSeries,function(d){return d.key}).enter().append("g").attr("class","legend-entry").attr(Globals.LEGEND_DATA_KEY_ATTRIBUTE,function(d){return d.key}),entries.append("rect").attr("x",width+10).attr("y",function(d,i){return 25*i}).attr("height",20).attr("width",20).style("fill",function(d){return colorScale(d.key)}).style("stroke",function(d){return colorScale(d.key)}).style("opacity",.8).on("click.default",function(d){return _this.toggle(d)}),void entries.append("text").attr("x",width+25+10).attr("y",function(d,i){return 25*i+7}).attr("dy","0.55em").text(function(d){return d.key}).style("font","14px Montserrat, sans-serif").on("click.default",function(){return _this.toggle}))},Legend.prototype.toggle=function(d){var key=d.key,element=this.svg.selectAll("*["+Globals.COMPONENT_DATA_KEY_ATTRIBUTE+'="'+key+'"]'),colorScale=this.config.get("colorScale");if(!element.empty()){var opacity=element.style("opacity");opacity=1==opacity?Globals.COMPONENT_HIDE_OPACITY:1;var legendEntry=this.svg.select(".legend-entry["+Globals.LEGEND_DATA_KEY_ATTRIBUTE+'="'+key+'"]');legendEntry.selectAll("rect").transition().duration(Globals.COMPONENT_HIDE_SHOW_TRANSITION_TIME).style("fill",1===opacity?function(d){return colorScale(d.key)}:"transparent"),element.transition().duration(Globals.COMPONENT_HIDE_SHOW_TRANSITION_TIME).style("opacity",opacity)}},Legend}(Component),Container=function(){function Container(config){this.components=[],this.config=config;var selector=this.config.get("selector"),width=this.config.get("width"),height=this.config.get("height"),marginLeft=this.config.get("marginLeft"),marginRight=this.config.get("marginRight"),marginTop=this.config.get("marginTop"),marginBottom=this.config.get("marginBottom");width+=marginLeft+marginRight,height+=marginTop+marginBottom,this.initializeContainer(selector,width,height,marginLeft,marginTop)}return Container.prototype.add=function(component){return this.components.push(component),component.configure(this.config,this.svg),component.render(),this},Container.prototype.initializeContainer=function(selector,width,height,marginLeft,marginTop){this.svg=d3.select(selector).style("position","relative").style("width",width+"px").style("height",height+"px").append("svg:svg").attr("preserveAspectRatio","xMinYMin meet").attr("viewBox","0 0 "+width+" "+height).attr("width","100%").attr("class","proteic").attr("width",width).attr("height",height).style("position","absolute").append("g").attr("class","chartContainer").attr("transform","translate("+marginLeft+","+marginTop+")")},Container.prototype.updateComponents=function(data){for(var i=0;i0&&(this.area=new Areaset(this.axes.x,this.axes.y),this.container.add(this.area)),markerSize>0&&(this.markers=new Pointset(this.axes.x,this.axes.y),this.container.add(this.markers)),legend&&(this.legend=new Legend,this.container.add(this.legend))},SvgStrategyLinechart}(SvgChart),paletteCategory2=["#b6dde2","#6394af","#e4e9ab","#8ea876","#f7dce1","#cc878f","#fadaac","#f29a83","#8d7e9e"],paletteCategory3=["#6b68a9","#8cc590","#b9487d","#bfa1c5","#4e6936","#71bbc3","#484156","#ccaf44","#d0553c"],paletteCategory4=["#f1a30d","#1d4763","#84c7bc","#c1212d","#8fbe46","#076837","#563a2d","#563a2d","#87325d"],paletteCategory5=["#f1a30d","#0c3183","#acd9d6","#c1212d","#8fbe46","#076837","#8a6338","#8d2d84","#f09bbc"],paletteCategory7=["#ea671e","#684592","#84b92a","#cd131c","#3c5ba2","#5baddc","#ffde06","#5db68b","#775e47"],paletteCategory8=["#ebd646","#a50f38","#00a096","#f09bbc","#065b78","#72722a","#005231","#4d4e98","#7c4d25"],paletteDivergingSpectral2=["#d43d4f","#df564b","#eb6d45","#f08e53","#f8b96f","#fee08b","#f5f2b8","#d7e5b1","#b5d7aa","#8ec8a3","#6abda3","#4fa4b5","#3489be"],Interpolation=function(){function Interpolation(){}return Interpolation}();Interpolation.CURVE_LINEAR=d3.curveLinear,Interpolation.CURVE_LINEAR_CLOSED=d3.curveLinearClosed,Interpolation.CURVE_MONOTONE_X=d3.curveMonotoneX,Interpolation.CURVE_MONOTONE_Y=d3.curveMonotoneY,Interpolation.CURVE_NATURAL=d3.curveNatural,Interpolation.CURVE_STEP=d3.curveStep,Interpolation.CURVE_STEP_AFTER=d3.curveStepAfter,Interpolation.CURVE_STEP_BEFORE=d3.curveStepBefore;var defaults={selector:"#chart",colorScale:category7(),curve:Interpolation.CURVE_MONOTONE_X,areaOpacity:0,xAxisType:"linear",xAxisFormat:"",xAxisLabel:null,xAxisGrid:!0,yAxisType:"linear",yAxisFormat:"",yAxisLabel:null,yAxisShow:!0,yAxisGrid:!0,marginTop:20,marginRight:250,marginBottom:130,marginLeft:150,markerShape:"dot",markerSize:0,markerOutlineWidth:2,width:"100%",height:250,legend:!0,propertyX:"x",propertyY:"y",propertyKey:"key",onDown:function(d){},onHover:function(d){},onLeave:function(d){},onClick:function(d){},onUp:function(d){},maxNumberOfElements:10},Linechart=function(_super){function Linechart(data,userConfig){return void 0===userConfig&&(userConfig={}),_super.call(this,new SvgStrategyLinechart,data,userConfig,defaults)||this}return __extends(Linechart,_super),Linechart.prototype.keepDrawing=function(datum){var maxNumberOfElements=this.config.get("maxNumberOfElements"),numberOfElements=this.data.length,datumType=datum.constructor;if(datumType===Array?this.data=this.data.concat(datum):this.data.push(datum),numberOfElements>maxNumberOfElements){var position_1=numberOfElements-maxNumberOfElements;this.data=this.data.slice(position_1)}this.draw(copy(this.data))},Linechart}(Chart),Barset=function(_super){function Barset(x,y){var _this=_super.call(this)||this;return _this.x=x,_this.y=y,_this}return __extends(Barset,_super),Barset.prototype.render=function(){},Barset.prototype.update=function(data){var bars=null,stacked=this.config.get("stacked");this.clean(),stacked?this.updateStacked(data):this.updateGrouped(data),bars=this.svg.selectAll("g.barSeries rect"),bars.on("mousedown.user",this.config.get("onDown")).on("mouseup.user",this.config.get("onUp")).on("mouseleave.user",this.config.get("onLeave")).on("mouseover.user",this.config.get("onHover")).on("click.user",this.config.get("onClick"))},Barset.prototype.updateStacked=function(data){var propertyKey=this.config.get("propertyKey"),keys=d3.map(data,function(d){return d[propertyKey]}).keys(),stack$$1=this.config.get("stack");data=stack$$1.keys(keys)(simple2stacked(data));var colorScale=this.config.get("colorScale"),layer=this.svg.selectAll(".barSeries").data(data),layerEnter=layer.enter().append("g"),x=this.x.xAxis.scale(),y=this.y.yAxis.scale();layer.merge(layerEnter).attr("class","barSeries").attr(Globals.COMPONENT_DATA_KEY_ATTRIBUTE,function(d){return d[propertyKey]}).style("fill",function(d,i){return colorScale(void 0!==d[propertyKey]?d[propertyKey]:i)}).selectAll("rect").data(function(d){return d}).enter().append("rect").attr("x",function(d){return x(d.data[propertyKey])}).attr("y",function(d){return y(d[1])}).attr("height",function(d){return y(d[0])-y(d[1])}).attr("width",x.bandwidth())},Barset.prototype.updateGrouped=function(data){var propertyKey=this.config.get("propertyKey"),propertyX=this.config.get("propertyX"),propertyY=this.config.get("propertyY"),keys=d3.map(data,function(d){return d[propertyKey]}).keys(),colorScale=this.config.get("colorScale"),layer=null,x=this.x.xAxis.scale(),y=this.y.yAxis.scale(),xGroup=d3.scaleBand().domain(keys).range([0,x.bandwidth()]),height=this.config.get("height");data=simple2nested(data,"key"),layer=this.svg.selectAll("g.barSeries").data(data,function(d){return d.values}),layer.enter().append("g").attr("class","barSeries").attr(Globals.COMPONENT_DATA_KEY_ATTRIBUTE,function(d){return d[propertyKey]}).selectAll("rect").data(function(d){return d.values}).enter().append("rect").attr("transform",function(d){return"translate("+x(d[propertyX])+")"}).attr("width",xGroup.bandwidth()).attr("x",function(d){return xGroup(d[propertyKey])}).attr("y",function(d){return y(d[propertyY])}).attr("height",function(d){return height-y(d[propertyY])}).style("fill",function(d,i){return colorScale(void 0!==d[propertyKey]?d[propertyKey]:i)})},Barset}(Component),SvgStrategyBarchart=function(_super){function SvgStrategyBarchart(){var _this=_super.call(this)||this;return _this.axes=new XYAxis,_this.bars=new Barset(_this.axes.x,_this.axes.y),_this}return __extends(SvgStrategyBarchart,_super),SvgStrategyBarchart.prototype.draw=function(data){var xAxisFormat=this.config.get("xAxisFormat"),xAxisType=this.config.get("xAxisType"),yAxisFormat=this.config.get("yAxisFormat"),yAxisType=this.config.get("yAxisType");convertByXYFormat(data,xAxisFormat,xAxisType,yAxisFormat,yAxisType),sortByField(data,"x"),this.container.updateComponents(data)},SvgStrategyBarchart.prototype.initialize=function(){_super.prototype.initialize.call(this);var legend=this.config.get("legend");this.container.add(this.axes).add(this.bars),legend&&(this.legend=new Legend,this.container.add(this.legend))},SvgStrategyBarchart}(SvgChart),defaults$1={selector:"#chart",colorScale:category5(),stacked:!1,xAxisType:"categorical",xAxisFormat:"",xAxisLabel:"",xAxisGrid:!1,yAxisType:"linear",yAxisFormat:"",yAxisLabel:"",yAxisShow:!0,yAxisGrid:!0,marginTop:20,marginRight:250,marginBottom:130,marginLeft:150,width:"100%",height:350,legend:!0,propertyX:"x",propertyY:"y",propertyKey:"key",stack:d3.stack().value(function(d,k){return d.value[k]}),onDown:function(d){},onHover:function(d){},onLeave:function(d){},onClick:function(d){},onUp:function(d){}},Barchart=function(_super){function Barchart(data,userConfig){return void 0===userConfig&&(userConfig={}),_super.call(this,new SvgStrategyBarchart,data,userConfig,defaults$1)||this}return __extends(Barchart,_super),Barchart.prototype.fire=function(event$$1,data){"transition"===event$$1&&("grouped"===data?this.config.put("stacked",!1):"stacked"===data&&this.config.put("stacked",!0),this.draw())},Barchart.prototype.keepDrawing=function(datum){var datumType=datum.constructor;if(datumType===Array)this.data=datum;else{for(var found=!1,i=0;iheight?height:width)/2,translation=function(){return"translate("+r+","+r+")"},tickData=d3.range(ticks).map(function(){return 1/ticks}),arc$$1=d3.arc().innerRadius(r-ringWidth-ringMargin).outerRadius(r-ringMargin).startAngle(function(d,i){return deg2rad(minAngle+d*i*range$$1)}).endAngle(function(d,i){return deg2rad(minAngle+d*(i+1)*range$$1)});colorScale.domain([0,1]);var arcs=this.svg.append("g").attr("class","arc").attr("transform",translation),arcPaths=arcs.selectAll("path").data(tickData).enter().append("path").attr("id",function(d,i){return"sector-"+i}).attr("d",arc$$1);arcPaths.attr("fill",function(d,i){return colorScale(invertColorScale?1-d*i:d*i)}),labels=this.svg.append("g").attr("class","labels").attr("transform",translation),labels.selectAll("text").data(scaleMarkers).enter().append("text").attr("transform",function(d){var ratio=scale(d),newAngle=minAngle+ratio*range$$1;return"rotate("+newAngle+") translate(0,"+(labelInset-r)+")"}).text(function(d){return d}).style("text-anchor","middle").style("font","18px Montserrat, sans-serif")},Dial.prototype.update=function(){},Dial}(Component),DialNeedle=function(_super){function DialNeedle(){return _super.call(this)||this}return __extends(DialNeedle,_super),DialNeedle.prototype.render=function(){var width=(this.config.get("invertColorScale"),this.config.get("colorScale"),this.config.get("width")),height=this.config.get("height"),ringWidth=this.config.get("ringWidth"),ringMargin=this.config.get("ringMargin"),ticks=this.config.get("ticks"),minAngle=this.config.get("minAngle"),maxAngle=this.config.get("maxAngle"),minLevel=this.config.get("minLevel"),maxLevel=this.config.get("maxLevel"),needleNutRadius=(this.config.get("labelInset"),this.config.get("needleNutRadius")),needleLenghtRatio=this.config.get("needleLenghtRatio"),scale=d3.scaleLinear().domain([minLevel,maxLevel]).range([0,1]),range$$1=(scale.ticks(ticks),maxAngle-minAngle),r=(width>height?height:width)/2,needleLen=needleLenghtRatio*r,translation=function(){return"translate("+r+","+r+")"},angleScale=(d3.range(ticks).map(function(){return 1/ticks}),d3.arc().innerRadius(r-ringWidth-ringMargin).outerRadius(r-ringMargin).startAngle(function(d,i){return deg2rad(minAngle+d*i*range$$1)}).endAngle(function(d,i){return deg2rad(minAngle+d*(i+1)*range$$1)}),d3.scaleLinear().domain([minLevel,maxLevel]).range([90+minAngle,90+maxAngle]));this.svg.append("path").attr("class","needle").datum(0).attr("transform",function(d){return"translate("+r+", "+r+") rotate("+(angleScale(d)-90)+")"}).attr("d","M "+(0-needleNutRadius)+" 0 L 0 "+(0-needleLen)+" L "+needleNutRadius+" 0").style("fill","#666666"),this.svg.append("circle").attr("class","needle").attr("transform",translation).attr("cx",0).attr("cy",0).attr("r",needleNutRadius).style("fill","#666666")},DialNeedle.prototype.update=function(data){var datum=data[data.length-1],width=this.config.get("width"),height=this.config.get("height"),needleNutRadius=this.config.get("needleNutRadius"),needleLenghtRatio=this.config.get("needleLenghtRatio"),propertyValue=this.config.get("propertyValue"),minAngle=this.config.get("minAngle"),maxAngle=this.config.get("maxAngle"),minLevel=this.config.get("minLevel"),maxLevel=this.config.get("maxLevel"),r=(width>height?height:width)/2,needleLen=needleLenghtRatio*r,angleScale=d3.scaleLinear().domain([minLevel,maxLevel]).range([90+minAngle,90+maxAngle]);this.svg.select(".needle").transition().attr("transform",function(d){return"translate("+r+", "+r+") rotate("+(angleScale(datum[propertyValue])-90)+")"}).attr("d","M "+(0-needleNutRadius)+" 0 L 0 "+(0-needleLen)+" L "+needleNutRadius+" 0")},DialNeedle}(Component),TextIndicator=function(_super){function TextIndicator(){var _this;return _this}return __extends(TextIndicator,_super),TextIndicator.prototype.update=function(data){var datum=data[data.length-1];this.svg.select(".value").text(datum.value),this.svg.select(".label").text(datum.label)},TextIndicator.prototype.render=function(){var indicator=this.svg.append("g").attr("class","text-indicator").attr("pointer-events","none").style("text-anchor","middle").style("alignment-baseline","central");indicator.append("text").attr("class","value").attr("x",0).attr("y",0).attr("pointer-events","none").text("").style("text-anchor","middle"),indicator.append("text").attr("class","label").attr("x",0).attr("y",0).attr("pointer-events","none").text("").style("transform","translate(0, 1.5em").style("text-anchor","middle")},TextIndicator.prototype.translate=function(x,y){this.svg.select("g.text-indicator").attr("transform","translate("+x+", "+y+")")},TextIndicator}(Component),SvgStrategyGauge=function(_super){function SvgStrategyGauge(){var _this=_super.call(this)||this;return _this.dial=new Dial,_this.dialNeedle=new DialNeedle,_this.textIndicator=new TextIndicator,_this}return __extends(SvgStrategyGauge,_super),SvgStrategyGauge.prototype.draw=function(data){this.container.updateComponents(data)},SvgStrategyGauge.prototype.initialize=function(){if(_super.prototype.initialize.call(this),this.container.add(this.dial).add(this.dialNeedle),this.config.get("numericIndicator")){var width=this.config.get("width"),height=this.config.get("height"),r=(width>height?height:width)/2,indicatorOffset=r+75;this.container.add(this.textIndicator),this.textIndicator.translate(r,indicatorOffset)}},SvgStrategyGauge}(SvgChart),defaults$2={selector:"#chart",colorScale:diverging_spectral2(),invertColorScale:!0,minLevel:0,maxLevel:100,minAngle:-90,maxAngle:90,ringWidth:50,ringMargin:20,labelInset:10,needleNutRadius:25,needleLenghtRatio:.8,numericIndicator:!0,label:"km/h",marginTop:20,marginRight:250,marginBottom:30,marginLeft:50,width:"50%",height:250,ticks:10,propertyValue:"value"},Gauge=function(_super){function Gauge(data,userConfig){return void 0===userConfig&&(userConfig={}),_super.call(this,new SvgStrategyGauge,data,userConfig,defaults$2)||this}return __extends(Gauge,_super),Gauge.prototype.keepDrawing=function(datum){this.data=[datum[0]],_super.prototype.draw.call(this)},Gauge}(Chart),CanvasPointset=function(_super){function CanvasPointset(x,y){var _this=_super.call(this)||this;return _this.x=x,_this.y=y,_this}return __extends(CanvasPointset,_super),CanvasPointset.prototype.update=function(data){var _this=this,propertyKey=this.config.get("propertyKey"),propertyX=this.config.get("propertyX"),propertyY=this.config.get("propertyY"),markerShape=this.config.get("markerShape"),markerSize=this.config.get("markerSize"),colorScale=this.config.get("colorScale"),series=null,dataContainer=null,width=this.config.get("width"),height=this.config.get("height"),shape=d3.symbol().size(markerSize).context(this.canvasCtx);switch(markerShape){case"dot":shape.type(d3.symbolCircle);break;case"ring":shape.type(d3.symbolCircle);break;case"cross":shape.type(d3.symbolCross);break;case"diamond":shape.type(d3.symbolDiamond);break;case"square":shape.type(d3.symbolSquare);break;case"star":shape.type(d3.symbolStar);break;case"triangle":shape.type(d3.symbolTriangle);break;case"wye":shape.type(d3.symbolWye);break;case"circle":shape.type(d3.symbolCircle);break;default:shape.type(d3.symbolCircle)}dataContainer=this.svg.append("proteic"),series=dataContainer.selectAll("proteic.g.points"),this.canvasCtx.clearRect(0,0,width,height),series.data(data,function(d){return d[propertyKey]}).enter().call(function(s){var self=_this;s.each(function(d){self.canvasCtx.save(),self.canvasCtx.translate(self.x.xAxis.scale()(d[propertyX]),self.y.yAxis.scale()(d[propertyY])),self.canvasCtx.beginPath(),self.canvasCtx.strokeStyle=colorScale(d[propertyKey]),self.canvasCtx.fillStyle=colorScale(d[propertyKey]),shape(),self.canvasCtx.closePath(),self.canvasCtx.stroke(),"ring"!==markerShape&&self.canvasCtx.fill(),self.canvasCtx.restore()})})},CanvasPointset.prototype.render=function(){this.canvas=d3.select(this.config.get("selector")).append("canvas").attr("id","point-set-canvas").attr("width",this.config.get("width")).attr("height",this.config.get("height")).style("position","absolute").style("z-index",2).style("transform","translate("+this.config.get("marginLeft")+"px, "+this.config.get("marginTop")+"px)"),this.canvasCtx=this.canvas.node().getContext("2d")},CanvasPointset}(Component),SvgStrategyScatterplot=function(_super){function SvgStrategyScatterplot(){var _this=_super.call(this)||this;return _this.axes=new XYAxis,_this.markers=new Pointset(_this.axes.x,_this.axes.y),_this.canvasMarkers=new CanvasPointset(_this.axes.x,_this.axes.y),_this}return __extends(SvgStrategyScatterplot,_super),SvgStrategyScatterplot.prototype.draw=function(data){var xAxisFormat=this.config.get("xAxisFormat"),xAxisType=this.config.get("xAxisType"),yAxisFormat=this.config.get("yAxisFormat"),yAxisType=this.config.get("yAxisType");convertByXYFormat(data,xAxisFormat,xAxisType,yAxisFormat,yAxisType),sortByField(data,"x"),this.container.updateComponents(data)},SvgStrategyScatterplot.prototype.initialize=function(){_super.prototype.initialize.call(this);var legend=this.config.get("legend");this.container.add(this.axes),this.config.get("canvas")?this.container.add(this.canvasMarkers):this.container.add(this.markers),legend&&(this.legend=new Legend,this.container.add(this.legend))},SvgStrategyScatterplot}(SvgChart),defaults$3={selector:"#chart",colorScale:category7(),xAxisType:"linear", +xAxisFormat:".1f",xAxisLabel:"",xAxisGrid:!0,yAxisType:"linear",yAxisFormat:".1f",yAxisLabel:"",yAxisShow:!0,yAxisGrid:!0,marginTop:20,marginRight:250,marginBottom:130,marginLeft:150,markerShape:"circle",markerSize:15,width:"100%",height:250,legend:!0,propertyX:"x",propertyY:"y",propertyKey:"key",onDown:function(d){},onHover:function(d){},onLeave:function(d){},onClick:function(d){},onUp:function(d){},maxNumberOfElements:100,canvas:!1},Scatterplot=function(_super){function Scatterplot(data,userConfig){return void 0===userConfig&&(userConfig={}),_super.call(this,new SvgStrategyScatterplot,data,userConfig,defaults$3)||this}return __extends(Scatterplot,_super),Scatterplot.prototype.keepDrawing=function(datum){var datumType=datum.constructor;datumType===Array?this.data?this.data=this.data.concat(datum):this.data=datum:this.data.push(datum),this.draw(copy(this.data))},Scatterplot}(Chart),Streamset=function(_super){function Streamset(xyAxes){var _this=_super.call(this)||this;return _this.xyAxes=xyAxes,_this.areaGenerator=d3.area().curve(d3.curveCardinal).y0(function(d){return _this.xyAxes.y.yAxis.scale()(d[0])}).y1(function(d){return _this.xyAxes.y.yAxis.scale()(d[1])}),_this}return __extends(Streamset,_super),Streamset.prototype.render=function(){},Streamset.prototype.update=function(data){var _this=this,propertyKey=this.config.get("propertyKey");this.config.get("propertyX"),this.config.get("propertyY");this.clean();var colorScale=this.config.get("colorScale"),onDown=this.config.get("onDown"),onUp=this.config.get("onUp"),onLeave=this.config.get("onLeave"),onHover=this.config.get("onHover"),onClick=this.config.get("onClick"),data4stack=(d3.map(data,function(d){return d[propertyKey]}).keys(),simple2stacked(data)),stack$$1=this.config.get("stack"),dataSeries=stack$$1(data4stack),series=null;this.areaGenerator.x(function(d){return _this.xyAxes.x.xAxis.scale()(new Date(d.data[propertyKey]))}),series=this.svg.selectAll(".serie").data(dataSeries).enter().append("g").attr("class","serie").style("stroke",function(d,i){return colorScale(d[propertyKey])}).attr(Globals.COMPONENT_DATA_KEY_ATTRIBUTE,function(d){return d[propertyKey]}),series.append("path").attr("class","layer").attr("d",this.areaGenerator).style("fill",function(d,i){return colorScale(d[propertyKey])}),series.exit().remove(),series.attr("opacity",1).on("mousedown.user",onDown).on("mouseup.user",onUp).on("mouseleave.user",onLeave).on("mouseover.user",onHover).on("click.user",onClick)},Streamset}(Component),SvgStrategyStreamgraph=function(_super){function SvgStrategyStreamgraph(){var _this=_super.call(this)||this;return _this.axes=new XYAxis,_this.streams=new Streamset(_this.axes),_this}return __extends(SvgStrategyStreamgraph,_super),SvgStrategyStreamgraph.prototype.draw=function(data){var xAxisFormat=this.config.get("xAxisFormat");this.config.get("xAxisType"),this.config.get("yAxisFormat"),this.config.get("yAxisType");convertPropretiesToTimeFormat(data,["x"],xAxisFormat),sortByField(data,"x"),this.container.updateComponents(data)},SvgStrategyStreamgraph.prototype.initialize=function(){_super.prototype.initialize.call(this);var legend=(this.config.get("markerSize"),this.config.get("areaOpacity"),this.config.get("legend"));this.container.add(this.axes).add(this.streams),legend&&(this.legend=new Legend,this.container.add(this.legend))},SvgStrategyStreamgraph}(SvgChart),defaults$4={selector:"#chart",colorScale:category4(),xAxisType:"time",xAxisFormat:"%y/%m/%d",xAxisLabel:"",xAxisGrid:!0,yAxisType:"linear",yAxisFormat:"",yAxisLabel:"",yAxisShow:!1,yAxisGrid:!1,marginTop:20,marginRight:250,marginBottom:130,marginLeft:150,width:"100%",height:250,legend:!0,propertyX:"x",propertyY:"y",propertyKey:"key",stack:d3.stack().value(function(d,k){return d.value[k]}).order(d3.stackOrderInsideOut).offset(d3.stackOffsetWiggle),stacked:!0,onDown:function(d){},onHover:function(d){},onLeave:function(d){},onClick:function(d){},onUp:function(d){},maxNumberOfElements:100},Streamgraph=function(_super){function Streamgraph(data,userConfig){return void 0===userConfig&&(userConfig={}),_super.call(this,new SvgStrategyStreamgraph,data,userConfig,defaults$4)||this}return __extends(Streamgraph,_super),Streamgraph.prototype.keepDrawing=function(datum){var datumType=datum.constructor;datumType===Array?this.data=this.data.concat(datum):this.data.push(datum),this.draw(copy(this.data))},Streamgraph}(Chart),defaults$5={selector:"#chart",colorScale:category2(),xAxisType:"time",xAxisFormat:"%y/%m/%d",xAxisLabel:"",xAxisGrid:!0,yAxisType:"linear",yAxisFormat:"",yAxisLabel:"",yAxisShow:!0,yAxisGrid:!0,marginTop:20,marginRight:250,marginBottom:130,marginLeft:150,width:"100%",height:250,legend:!0,propertyX:"x",propertyY:"y",propertyKey:"key",stacked:!0,stack:d3.stack().value(function(d,k){return d.value[k]}).order(d3.stackOrderInsideOut).offset(d3.stackOffsetNone),onDown:function(d){},onHover:function(d){},onLeave:function(d){},onClick:function(d){},onUp:function(d){},maxNumberOfElements:100},StackedArea=function(_super){function StackedArea(data,userConfig){return void 0===userConfig&&(userConfig={}),_super.call(this,new SvgStrategyStreamgraph,data,userConfig,defaults$5)||this}return __extends(StackedArea,_super),StackedArea.prototype.keepDrawing=function(datum){var datumType=datum.constructor;datumType===Array?this.data=this.data.concat(datum):this.data.push(datum),this.draw(copy(this.data))},StackedArea}(Chart),Timeboxset=function(_super){function Timeboxset(xyAxes){var _this=_super.call(this)||this;return _this.xyAxes=xyAxes,_this}return __extends(Timeboxset,_super),Timeboxset.prototype.render=function(){},Timeboxset.prototype.update=function(data){var propertyKey=this.config.get("propertyKey"),propertyStart=this.config.get("propertyStart"),propertyEnd=this.config.get("propertyEnd"),colorScale=this.config.get("colorScale"),height=this.config.get("height"),onDown=this.config.get("onDown"),onUp=this.config.get("onUp"),onLeave=this.config.get("onLeave"),onHover=this.config.get("onHover"),onClick=this.config.get("onClick"),keys=d3.map(data,function(d){return d[propertyKey]}).keys(),layer=this.svg.selectAll(".serie").data(data),layerEnter=null,layerMerge=null,box=null,boxEnter=null,boxMerge=null,extLanes=null,yLanes=null,x=(d3.scaleBand().range([0,keys.length+1]).domain(keys),this.xyAxes.x.xAxis.scale()),y=this.xyAxes.y.yAxis.scale();data=simple2nested(data),extLanes=d3.extent(data,function(d,i){return i}),yLanes=d3.scaleLinear().domain([extLanes[0],extLanes[1]+1]).range([0,height]),layer=this.svg.selectAll(".serie").data(data),layerEnter=layer.enter().append("g"),layerMerge=layer.merge(layerEnter).attr("class","serie").attr(Globals.COMPONENT_DATA_KEY_ATTRIBUTE,function(d){return d[propertyKey]}),box=layerMerge.selectAll("rect").data(function(d){return d.values}),boxEnter=box.enter().append("rect"),boxMerge=box.merge(boxEnter).attr("width",function(d){return x(d[propertyEnd])-x(d[propertyStart])}).attr("x",function(d){return x(d[propertyStart])}).attr("y",function(d){return y(d[propertyKey])}).attr("height",function(){return.8*yLanes(1)}).style("fill",function(d){return colorScale(d[propertyKey])}),box=this.svg.selectAll("g.serie rect"),box.on("mousedown.user",onDown).on("mouseup.user",onUp).on("mouseleave.user",onLeave).on("mouseover.user",onHover).on("click.user",onClick)},Timeboxset}(Component),SvgStrategySwimlane=function(_super){function SvgStrategySwimlane(){var _this=_super.call(this)||this;return _this.axes=new XYAxis,_this.boxes=new Timeboxset(_this.axes),_this}return __extends(SvgStrategySwimlane,_super),SvgStrategySwimlane.prototype.draw=function(data){var xAxisFormat=this.config.get("xAxisFormat");convertPropretiesToTimeFormat(data,["start","end"],xAxisFormat),sortByField(data,"start"),this.container.updateComponents(data)},SvgStrategySwimlane.prototype.initialize=function(){_super.prototype.initialize.call(this);var legend=(this.config.get("markerSize"),this.config.get("areaOpacity"),this.config.get("legend"));this.container.add(this.axes),legend&&(this.legend=new Legend,this.container.add(this.legend).add(this.boxes))},SvgStrategySwimlane}(SvgChart),defaults$6={selector:"#chart",colorScale:category3(),xAxisType:"time",xAxisFormat:"%y/%m/%d",xAxisLabel:"",xAxisGrid:!0,yAxisType:"categorical",yAxisFormat:"s",yAxisLabel:"",yAxisShow:!0,yAxisGrid:!0,marginTop:20,marginRight:250,marginBottom:30,marginLeft:50,width:"100%",height:250,legend:!0,propertyStart:"start",propertyEnd:"end",propertyKey:"key",onDown:function(d){},onHover:function(d){},onLeave:function(d){},onClick:function(d){},onUp:function(d){}},Swimlane=function(_super){function Swimlane(data,userConfig){return void 0===userConfig&&(userConfig={}),_super.call(this,new SvgStrategySwimlane,data,userConfig,defaults$6)||this}return __extends(Swimlane,_super),Swimlane.prototype.keepDrawing=function(datum){var datumType=datum.constructor;datumType===Array?this.data=this.data.concat(datum):this.data.push(datum),this.draw(copy(this.data))},Swimlane}(Chart),XRadialAxis=function(_super){function XRadialAxis(){return _super.call(this)||this}return __extends(XRadialAxis,_super),XRadialAxis.prototype.update=function(data){},XRadialAxis.prototype.render=function(){this._xRadialAxis=d3.scaleLinear().range([0,2*Math.PI])},Object.defineProperty(XRadialAxis.prototype,"xRadialAxis",{get:function(){return this._xRadialAxis},enumerable:!0,configurable:!0}),XRadialAxis}(Component),YRadialAxis=function(_super){function YRadialAxis(){return _super.call(this)||this}return __extends(YRadialAxis,_super),YRadialAxis.prototype.render=function(){var width=this.config.get("width"),height=this.config.get("height"),radius=null;radius=Math.min(width,height)/2-10,this._yRadialAxis=d3.scaleSqrt().range([0,radius])},YRadialAxis.prototype.update=function(data){},Object.defineProperty(YRadialAxis.prototype,"yRadialAxis",{get:function(){return this._yRadialAxis},enumerable:!0,configurable:!0}),YRadialAxis}(Component),RadialAxes=function(_super){function RadialAxes(){var _this=_super.call(this)||this;return _this._x=new XRadialAxis,_this._y=new YRadialAxis,_this}return __extends(RadialAxes,_super),RadialAxes.prototype.configure=function(config,svg){_super.prototype.configure.call(this,config,svg),this._x.configure(config,svg),this._y.configure(config,svg)},RadialAxes.prototype.render=function(){this._x.render(),this._y.render()},RadialAxes.prototype.update=function(data){this._x.update(data),this._y.update(data)},Object.defineProperty(RadialAxes.prototype,"x",{get:function(){return this._x},enumerable:!0,configurable:!0}),Object.defineProperty(RadialAxes.prototype,"y",{get:function(){return this._y},enumerable:!0,configurable:!0}),RadialAxes}(Component),SunburstDisk=function(_super){function SunburstDisk(x,y){var _this=_super.call(this)||this;return _this.x=x,_this.y=y,_this}return __extends(SunburstDisk,_super),SunburstDisk.prototype.removePaths=function(){this.svg.selectAll("path").remove()},SunburstDisk.prototype.getAncestors=function(node){for(var path=[],current=node;current.parent;)path.unshift(current),current=current.parent;return path},SunburstDisk.prototype.update=function(data){var _this=this,arcGen=d3.arc().startAngle(function(d){return Math.max(0,Math.min(2*Math.PI,_this.x.xRadialAxis(d.x0)))}).endAngle(function(d){return Math.max(0,Math.min(2*Math.PI,_this.x.xRadialAxis(d.x1)))}).innerRadius(function(d){return Math.max(0,_this.y.yRadialAxis(d.y0))}).outerRadius(function(d){return Math.max(0,_this.y.yRadialAxis(d.y1))}),colorScale=this.config.get("colorScale");this.removePaths();var root=d3.stratify().id(function(d){return d.id}).parentId(function(d){return d.parent})(data);root.sum(function(d){return d.value}),d3.partition()(root);var paths=this.svg.selectAll("path").data(root.descendants()).enter().append("path").attr("d",arcGen).style("fill",function(d){return d.parent?colorScale(d.data.label):"white"}).style("stroke","#fff").style("stroke-width","2").style("shape-rendering","crispEdge");paths.on("mouseover.default",function(d){var ancestors=_this.getAncestors(d);ancestors.length>0&&_this.svg.selectAll("path").style("opacity",.3),_this.svg.selectAll("path").filter(function(node){return ancestors.indexOf(node)>=0}).style("opacity",1),_this.svg.select(".text-indicator .label").text(d.data.label),_this.svg.select(".text-indicator .value").text(d.value)}).on("mouseout.default",function(d){_this.svg.selectAll("path").style("opacity",1),_this.svg.select(".text-indicator .label").style("font-weight","normal"),_this.svg.select(".text-indicator .label").text(""),_this.svg.select(".text-indicator .value").text("")}),paths.on("mousedown.user",this.config.get("onDown")).on("mouseup.user",this.config.get("onUp")).on("mouseleave.user",this.config.get("onLeave")).on("mouseover.user",this.config.get("onHover")).on("click.user",this.config.get("onClick"))},SunburstDisk.prototype.render=function(){},SunburstDisk}(Component),SvgStrategySunburst=function(_super){function SvgStrategySunburst(){var _this=_super.call(this)||this;return _this.axes=new RadialAxes,_this.disk=new SunburstDisk(_this.axes.x,_this.axes.y),_this.textIndicator=new TextIndicator,_this}return __extends(SvgStrategySunburst,_super),SvgStrategySunburst.prototype.draw=function(data){this.container.translate(this.config.get("width")/2,this.config.get("height")/2),this.container.updateComponents(data)},SvgStrategySunburst.prototype.initialize=function(){_super.prototype.initialize.call(this),this.container.add(this.axes).add(this.disk).add(this.textIndicator)},SvgStrategySunburst}(SvgChart),defaults$7={selector:"#chart",colorScale:category8(),marginTop:20,marginRight:20,marginBottom:30,marginLeft:50,width:"50%",height:450,tickLabel:"",transitionDuration:300,maxNumberOfElements:5,sortData:{descending:!1,prop:"x"},onDown:function(d){},onHover:function(d){},onLeave:function(d){},onClick:function(d){},onUp:function(d){}},Sunburst=function(_super){function Sunburst(data,userConfig){return void 0===userConfig&&(userConfig={}),_super.call(this,new SvgStrategySunburst,data,userConfig,defaults$7)||this}return __extends(Sunburst,_super),Sunburst.prototype.keepDrawing=function(datum){var datumType=datum.constructor;datumType===Array?this.data?this.data=this.data.concat(datum):this.data=datum:this.data.push(datum),this.draw(copy(this.data))},Sunburst}(Chart),LinkedNodeset=function(_super){function LinkedNodeset(){var _this=_super.call(this)||this;return _this.toggle=0,_this}return __extends(LinkedNodeset,_super),LinkedNodeset.prototype.render=function(){var _this=this,width=this.config.get("width"),height=this.config.get("height");this.simulation=d3.forceSimulation().force("link",d3.forceLink().id(function(d){return d.id}).distance(50)).force("charge",d3.forceManyBody()).force("center",d3.forceCenter(width/2,height/2)),this.dragstarted=function(d){d3.event.active||_this.simulation.alphaTarget(.3).restart(),d.fx=d.x,d.fy=d.y},this.dragged=function(d){d.fx=d3.event.x,d.fy=d3.event.y},this.dragended=function(d){d3.event.active||_this.simulation.alphaTarget(1),d.fx=null,d.fy=null}},LinkedNodeset.prototype.update=function(data){var _this=this,colorScale=(this.config.get("nodeRadius"),this.config.get("colorScale")),linkWeight=this.config.get("linkWeight"),nodeWeight=this.config.get("nodeWeight"),minLinkWeight=this.config.get("minLinkWeight"),maxLinkWeight=this.config.get("maxLinkWeight"),minNodeWeight=this.config.get("minNodeWeight"),maxNodeWeight=this.config.get("maxNodeWeight"),weighted=this.config.get("weighted"),linkScaleRadius=d3.scaleLinear().domain([minLinkWeight,maxLinkWeight]).range([0,3]),nodeScaleRadius=d3.scaleLinear().domain([minNodeWeight,maxNodeWeight]).range([0,15]),labelShow=this.config.get("labelShow"),labelField=this.config.get("labelField"),node=null,link=null,text=null;data=simple2Linked(data),this.svg.selectAll("g.links").remove(),this.svg.selectAll("g.nodes").remove(),this.svg.selectAll("g.labels").remove(),link=this.svg.append("g").attr("class","serie").append("g").attr("class","links").selectAll("line").data(data.links).enter().append("line").attr(Globals.COMPONENT_DATA_KEY_ATTRIBUTE,function(d){return console.log(d),d.key}).attr("stroke-width",function(d){return weighted&&d.weight?linkScaleRadius(d.weight):linkWeight}).attr("stroke","#999").attr("stroke-opacity",1),node=this.svg.select("g.serie").append("g").attr("class","nodes").selectAll("circle").data(data.nodes).enter().append("circle").attr(Globals.COMPONENT_DATA_KEY_ATTRIBUTE,function(d){return d.key}).attr("r",function(d){return weighted&&d.weight?nodeScaleRadius(d.weight):nodeWeight}).attr("fill",function(d){return colorScale(d.key)}).attr("stroke","white").call(d3.drag().on("start",this.dragstarted).on("drag",this.dragged).on("end",this.dragended));node.on("mousedown.user",this.config.get("onDown")).on("mouseup.user",this.config.get("onUp")).on("mouseleave.user",this.config.get("onLeave")).on("mouseover.user",this.config.get("onHover")).on("click.user",this.config.get("onClick")),labelShow&&(text=this.svg.select("g.serie").append("g").attr("class","labels").selectAll("text").data(data.nodes).enter().append("text").attr(Globals.COMPONENT_DATA_KEY_ATTRIBUTE,function(d){return d.key}).attr("dx",10).attr("dy",".35em").attr("font-size",".85em").text("string"==typeof labelField?function(d){return d[labelField]}:labelField).on("mousedown.user",this.config.get("onDown")).on("mouseup.user",this.config.get("onUp")).on("mouseleave.user",this.config.get("onLeave")).on("mouseover.user",this.config.get("onHover")).on("click.user",this.config.get("onClick"))),this.simulation.nodes(data.nodes).on("tick",function(){return labelShow?_this.tickedWithText(link,node,text):_this.ticked(link,node)}),this.simulation.force("link").links(data.links)},LinkedNodeset.prototype.tickedWithText=function(link,node,text){this.ticked(link,node),text.attr("x",function(d){return d.x}).attr("y",function(d){return d.y})},LinkedNodeset.prototype.ticked=function(link,node){link.attr("x1",function(d){return d.source.x}).attr("y1",function(d){return d.source.y}).attr("x2",function(d){return d.target.x}).attr("y2",function(d){return d.target.y}),node.attr("cx",function(d){return d.x}).attr("cy",function(d){return d.y})},LinkedNodeset.prototype.zoom=function(event$$1){var transform=event$$1.transform;this.svg.selectAll(".nodes circle").attr("transform",transform),this.svg.selectAll(".links line").attr("transform",transform),this.svg.selectAll(".labels text").attr("transform",transform)},LinkedNodeset}(Component),ZoomComponent=function(_super){function ZoomComponent(zoomerComponent){var _this=_super.call(this)||this;return _this.zoomerComponent=zoomerComponent,_this.zoom=d3.zoom().scaleExtent([.5,4]),_this}return __extends(ZoomComponent,_super),ZoomComponent.prototype.render=function(){var _this=this,selector=this.config.get("selector");d3.select(selector).call(this.zoom),this.zoom.on("zoom",function(){_this.zoomerComponent.zoom(d3.event)})},ZoomComponent.prototype.update=function(data){},ZoomComponent}(Component),SvgStrategyNetwork=function(_super){function SvgStrategyNetwork(){return _super.call(this)||this}return __extends(SvgStrategyNetwork,_super),SvgStrategyNetwork.prototype.draw=function(data){this.container.updateComponents(data)},SvgStrategyNetwork.prototype.initialize=function(){_super.prototype.initialize.call(this);var legend=this.config.get("legend"),zoom$$1=this.config.get("zoom");this.linkedNodes=new LinkedNodeset,this.container.add(this.linkedNodes),legend&&(this.legend=new Legend,this.container.add(this.legend)),zoom$$1&&(this.zoom=new ZoomComponent(this.linkedNodes),this.container.add(this.zoom))},SvgStrategyNetwork}(SvgChart),defaults$8={selector:"#chart",colorScale:category7(),marginTop:20,marginRight:250,marginBottom:130,marginLeft:150,width:"100%",height:250,nodeRadius:8.5,legend:!0,linkWeight:1,nodeWeight:8,minLinkValue:0,maxLinkValue:10,minNodeWeight:0,maxNodeWeight:100,weighted:!1,labelShow:!0,labelField:"id",zoom:!0,onDown:function(d){},onHover:function(d){},onLeave:function(d){},onClick:function(d){},onUp:function(d){}},Network=function(_super){function Network(data,userConfig){return void 0===userConfig&&(userConfig={}),_super.call(this,new SvgStrategyNetwork,data,userConfig,defaults$8)||this}return __extends(Network,_super),Network.prototype.keepDrawing=function(datum){var datumType=datum.constructor;datumType===Array?this.data=this.data.concat(datum):this.data.push(datum),this.draw(copy(this.data))},Network}(Chart),SectorSet=function(_super){function SectorSet(){return _super.call(this)||this}return __extends(SectorSet,_super),SectorSet.prototype.render=function(){},SectorSet.prototype.update=function(data){var propertyKey=this.config.get("propertyKey"),propertyX=this.config.get("propertyX"),width=this.config.get("width"),height=this.config.get("height"),radius=Math.min(width,height)/2,colorScale=this.config.get("colorScale"),myPie=d3.pie().value(function(d){return d[propertyX]})(data),myArc=d3.arc().innerRadius(0).outerRadius(radius),arcs=this.svg.selectAll("g.slice").data(myPie),newBlock=arcs.enter();newBlock.append("g").attr(Globals.COMPONENT_DATA_KEY_ATTRIBUTE,function(d){return d.data[propertyKey]}).append("path").attr("fill",function(d,i){return colorScale(void 0!==d.data[propertyKey]?d.data[propertyKey]:i)}).attr("d",myArc)},SectorSet}(Component),SvgStrategyPieChart=function(_super){function SvgStrategyPieChart(){var _this=_super.call(this)||this;return _this.sectors=new SectorSet,_this}return __extends(SvgStrategyPieChart,_super),SvgStrategyPieChart.prototype.draw=function(data){this.container.translate(this.config.get("width")/2,this.config.get("height")/2),this.container.updateComponents(data)},SvgStrategyPieChart.prototype.initialize=function(){_super.prototype.initialize.call(this),this.container.add(this.sectors);var legend=this.config.get("legend");legend&&(this.legend=new Legend,this.container.add(this.legend))},SvgStrategyPieChart}(SvgChart),defaults$9={selector:"#chart",colorScale:category8(),marginTop:0,marginRight:"100",marginBottom:0,marginLeft:0,width:"500",height:"500",transitionDuration:300,maxNumberOfElements:5,legend:!0,propertyX:"x",propertyKey:"key",sortData:{descending:!1,prop:"x"},onDown:function(d){},onHover:function(d){},onLeave:function(d){},onClick:function(d){},onUp:function(d){}},PieChart=function(_super){function PieChart(data,userConfig){return void 0===userConfig&&(userConfig={}),_super.call(this,new SvgStrategyPieChart,data,userConfig,defaults$9)||this}return __extends(PieChart,_super),PieChart.prototype.keepDrawing=function(datum){var datumType=datum.constructor;datumType===Array?this.data?this.data=this.data.concat(datum):this.data=datum:this.data.push(datum),this.draw(copy(this.data))},PieChart}(Chart),Datasource=function(){function Datasource(){this.dispatcher=null,this.source=null,this.isWaitingForData=!0}return Datasource.prototype.start=function(){window.console.log("Starting datasource")},Datasource.prototype.stop=function(){window.console.log("Stopping datasource")},Datasource.prototype.configure=function(dispatcher){this.dispatcher=dispatcher},Datasource.prototype.filter=function(filter){return this},Datasource}(),WebsocketDatasource=function(_super){function WebsocketDatasource(source){var _this=_super.call(this)||this;return _this.source=source,_this}return __extends(WebsocketDatasource,_super),WebsocketDatasource.prototype.configure=function(dispatcher){this.dispatcher=dispatcher},WebsocketDatasource.prototype.start=function(){var _this=this;_super.prototype.start.call(this),this.ws=new WebSocket(this.source.endpoint),this.dispatcher.call("addLoading",this,{}),this.ws.onopen=function(e){_this.dispatcher.call("onopen",_this,e)},this.ws.onerror=function(e){throw new Error("An error occurred trying to reach the websocket server"+e)},this.ws.onmessage=function(e){_this.isWaitingForData&&(_this.dispatcher.call("removeLoading",_this,e),_this.isWaitingForData=!1);var data=JSON.parse(e.data);_this.dispatcher.call("onmessage",_this,data)}},WebsocketDatasource.prototype.stop=function(){_super.prototype.stop.call(this),this.ws&&this.ws.close()},WebsocketDatasource}(Datasource),HTTPDatasource=function(_super){function HTTPDatasource(source){var _this=_super.call(this)||this;return _this.source=source,_this.intervalId=-1,_this.started=!1,_this}return __extends(HTTPDatasource,_super),HTTPDatasource.prototype.start=function(){if(!this.started){_super.prototype.start.call(this);var pollingTime=this.source.pollingTime,url=this.source.url;this._startPolling(url,pollingTime),this.started=!0}},HTTPDatasource.prototype._startPolling=function(url,time){var _this=this;void 0===time&&(time=1e3);var interval=window.setInterval;this.intervalId=interval(function(){return _this._startRequest(url)},time)},HTTPDatasource.prototype._startRequest=function(url){var _this=this;window.console.log("url",url),d3.request(url).get(function(e,response){return _this._handleResponse(response)})},HTTPDatasource.prototype._stopPolling=function(){var clearInterval=window.clearInterval;clearInterval(this.intervalId)},HTTPDatasource.prototype._handleResponse=function(xmlHttpRequest){var parseJson=window.JSON.parse;if(4===xmlHttpRequest.readyState&&200===xmlHttpRequest.status){var response=parseJson(xmlHttpRequest.response);this._handleOK(response)}else this._handleError(xmlHttpRequest)},HTTPDatasource.prototype._handleOK=function(data){this.properties.length>0&&(data=this.convert(data)),this.dispatcher.call("onmessage",this,data)},HTTPDatasource.prototype._handleError=function(data){this.dispatcher.call("onerror",this,data)},HTTPDatasource.prototype.stop=function(){this.started&&(this._stopPolling(),this.started=!1)},HTTPDatasource}(Datasource);exports.Linechart=Linechart,exports.Barchart=Barchart,exports.Gauge=Gauge,exports.Scatterplot=Scatterplot,exports.Streamgraph=Streamgraph,exports.StackedArea=StackedArea,exports.Swimlane=Swimlane,exports.Sunburst=Sunburst,exports.Network=Network,exports.PieChart=PieChart,exports.WebsocketDatasource=WebsocketDatasource,exports.HTTPDatasource=HTTPDatasource,exports.Globals=Globals,Object.defineProperty(exports,"__esModule",{value:!0})}); \ No newline at end of file diff --git a/dist/proteic.node.js b/dist/proteic.node.js index 577d4ac..74ffa11 100644 --- a/dist/proteic.node.js +++ b/dist/proteic.node.js @@ -1,4244 +1,2554 @@ -'use strict'; - -Object.defineProperty(exports, '__esModule', { value: true }); - -var d3$1 = require('d3'); - -var paletteCategory1 = [ - '#e1c8df', - '#9ecd9d', - '#acd9d6', - '#e4e36b', - '#bfa1c5', - '#e4d3b8', - '#facba8', - '#ced4ea', - '#acd9d6' -]; - -var paletteCategory2 = [ - '#b6dde2', - '#6394af', - '#e4e9ab', - '#8ea876', - '#f7dce1', - '#cc878f', - '#fadaac', - '#f29a83', - '#8d7e9e' -]; - -var paletteCategory3 = [ - '#6b68a9', - '#8cc590', - '#b9487d', - '#bfa1c5', - '#4e6936', - '#71bbc3', - '#484156', - '#ccaf44', - '#d0553c' -]; - -var paletteCategory4 = [ - '#f1a30d', - '#1d4763', - '#84c7bc', - '#c1212d', - '#8fbe46', - '#076837', - '#563a2d', - '#563a2d', - '#87325d' -]; - -var paletteCategory5 = [ - '#f1a30d', - '#0c3183', - '#acd9d6', - '#c1212d', - '#8fbe46', - '#076837', - '#8a6338', - '#8d2d84', - '#f09bbc' -]; - -var paletteCategory6 = [ - '#71bbc3', - '#1d4763', - '#8fbe46', - '#4e6936', - '#ee8998', - '#c1212d', - '#f5af3c', - '#e95e2e', - '#634484' -]; - -var paletteCategory7 = [ - '#ea671e', - '#684592', - '#84b92a', - '#cd131c', - '#3c5ba2', - '#5baddc', - '#ffde06', - '#5db68b', - '#775e47' -]; - -var paletteCategory8 = [ - '#ebd646', - '#a50f38', - '#00a096', - '#f09bbc', - '#065b78', - '#72722a', - '#005231', - '#4d4e98', - '#7c4d25' -]; - -var paletteSequentialYellow = [ - '#fff1c6', - '#fee5a7', - '#fcda87', - '#face64', - '#f8bf4b', - '#f6b030', - '#f4a009', - '#d28514', - '#b36c17', - '#955618', - '#7a4317', - '#613214', - '#49230f' -]; - -var paletteSequentialRedOrange = [ - '#ffecb8', - '#fbd68b', - '#f7bf5e', - '#f3a82f', - '#df7520', - '#cd4925', - '#be0a26', - '#a81023', - '#941320', - '#80141d', - '#6d1419', - '#5a1215', - '#470f0f' -]; - -var paletteSequentialRed = [ - '#fde4d4', - '#f1c4af', - '#f7bf5e', - '#db826a', - '#d0614d', - '#c73e36', - '#be0a26', - '#a81023', - '#941320', - '#80141d', - '#6d1419', - '#5a1215', - '#470f0f' -]; - -var paletteSequentialPink = [ - '#fbe3e3', - '#f9cfcc', - '#f0aaa9', - '#ed7e7e', - '#ea647b', - '#e74576', - '#e41270', - '#c70f65', - '#aa105c', - '#8d1253', - '#731448', - '#5a123c', - '#420e30' -]; - -var paletteSequentialPurplePink = [ - '#f9d8e6', - '#ebbed7', - '#dda4c7', - '#c890bb', - '#b27daf', - '#8a4c94', - '#622181', - '#622181', - '#50216b', - '#472060', - '#3e1f55', - '#361e4b', - '#2d1c41' -]; - -var paletteSequentialPurple = [ - '#f6e8f1', - '#dcc5de', - '#c2a3c9', - '#a980b3', - '#905e9f', - '#793f8e', - '#622181', - '#592175', - '#4f216b', - '#462060', - '#3d1f55', - '#351e4b', - '#2c1c41' -]; - -var paletteSequentialBlue = [ - '#e5f2f9', - '#d1e5f5', - '#afd3ed', - '#91afd7', - '#738bbf', - '#3c5a9e', - '#0c3183', - '#132a68', - '#10204c', - '#0b193b', - '#06142f', - '#051228', - '#061020' -]; - -var paletteSequentialLightBlue = [ - '#eff8fd', - '#d9eff6', - '#c2e5ef', - '#a8dae8', - '#90cbe4', - '#76b8e1', - '#5baddc', - '#4d96cc', - '#427ebc', - '#3a67ab', - '#324c88', - '#29366b', - '#1e2354' -]; - -var paletteSequentialBlueViolet = [ - '#edf7e7', - '#c8e3d2', - '#91cdbf', - '#41b5ab', - '#218ba4', - '#145d94', - '#0c3183', - '#0d2d76', - '#0d2a6a', - '#0e265e', - '#0d2253', - '#0c1e47', - '#0b1a3c' -]; - -var paletteSequentialTurquoise = [ - '#e2ecf6', - '#cadfe6', - '#b1d3d6', - '#94c6c6', - '#74b9b6', - '#4caca6', - '#00a096', - '#008d89', - '#007b7c', - '#006a6f', - '#005963', - '#004a57', - '#063b4c' -]; - -var paletteSequentialLightGreen = [ - '#faf9de', - '#e9efc3', - '#d7e4a7', - '#c5d989', - '#b1ce6a', - '#9cc34c', - '#84b92a', - '#6fa32b', - '#5a8f2a', - '#477c29', - '#346b27', - '#205b24', - '#074d21' -]; - -var paletteSequentialDarkGreen = [ - '#eaf3e5', - '#c7d5be', - '#a3ba9a', - '#80a078', - '#5c885a', - '#357442', - '#00632e', - '#00592b', - '#004e27', - '#004423', - '#033a1e', - '#053019', - '#052613' -]; - -var paletteSequentialGreenBrown = [ - '#f7eccd', - '#d9cba6', - '#bcad82', - '#a29162', - '#887946', - '#716330', - '#5b501f', - '#51461d', - '#483d1b', - '#3f3418', - '#362b15', - '#2d2311', - '#231a0d' -]; - -var paletteSequentialBrown = [ - '#f7eccd', - '#eed3ab', - '#e4bb89', - '#dba269', - '#ad7446', - '#834d2c', - '#5e2f19', - '#552a18', - '#4c2516', - '#432113', - '#3a1c11', - '#32180f', - '#29130b' -]; - -var paletteSequentialGrey = [ - '#e5e8ea', - '#bdbfc3', - '#999a9f', - '#77797f', - '#595c64', - '#3e444c', - '#253038', - '#20282e', - '#1a2024', - '#15181b', - '#0e1112', - '#070808', - '#000000' -]; - -var paletteSequentialVioletCb = [ - '#f4f3f9', - '#e0dced', - '#cbc6e0', - '#b7b0d4', - '#948cbf', - '#706baa', - '#4d4e98', - '#484889', - '#42427a', - '#3d3c6c', - '#37365e', - '#313050', - '#2c2a44' -]; - -var paletteSequentialPinkCb = [ - '#fbe5ee', - '#f8ccd5', - '#f4b2bc', - '#f096a3', - '#d56976', - '#bc3f52', - '#a50f38', - '#951735', - '#851b31', - '#761d2e', - '#671e2a', - '#581d26', - '#4a1c22' -]; - -var paletteSequentialBlueCb = [ - '#eaf6fc', - '#cfe4f4', - '#cfe4f4', - '#91bfe3', - '#6999bb', - '#417797', - '#065b78', - '#11536b', - '#174b5f', - '#194354', - '#1a3b49', - '#1a343f', - '#192d35' -]; - -var paletteSequentialGreenCb = [ - '#fff7d0', - '#e9e09b', - '#d1ca62', - '#b7b623', - '#9e9e28', - '#88872a', - '#72722a', - '#676726', - '#5c5c23', - '#51511f', - '#47471b', - '#3d3d17', - '#333413' -]; - -var paletteSequentialGreenBrownCb = [ - '#f2edde', - '#d8d1c0', - '#bfb699', - '#a09778', - '#837b5a', - '#686141', - '#4f4b2c', - '#3e3e1f', - '#2e3313', - '#292d14', - '#232613', - '#1e2012', - '#191a10' -]; - -var paletteDivergingSpectral1 = [ - '#98141f', - '#ab332c', - '#bf5040', - '#d5705b', - '#e4a57f', - '#f3d6a6', - '#f5f2b8', - '#cfdbb1', - '#a4c4a9', - '#71ada1', - '#4e868f', - '#2e637d', - '#06456c' -]; - -var paletteDivergingSpectral2 = [ - '#d43d4f', - '#df564b', - '#eb6d45', - '#f08e53', - '#f8b96f', - '#fee08b', - '#f5f2b8', - '#d7e5b1', - '#b5d7aa', - '#8ec8a3', - '#6abda3', - '#4fa4b5', - '#3489be' -]; - -var paletteDivergingSpectral3 = [ - '#651035', - '#ae1143', - '#c9314b', - '#dd7257', - '#eeb27a', - '#feeb9e', - '#f5f2b8', - '#cadfba', - '#96cabb', - '#50b4bb', - '#3eaecc', - '#206791', - '#0c2c63' -]; - -var paletteDivergingBrownTurquoise = [ - '#3f3128', - '#683828', - '#933624', - '#d5705b', - '#db9c5e', - '#feeb9e', - '#f5f2b8', - '#cfdbb1', - '#a4c4a9', - '#71ada1', - '#628f85', - '#53746d', - '#475b57' -]; - -var paletteDivergingOrangePink = [ - '#e7511e', - '#eb6929', - '#ee7f37', - '#f29446', - '#f9c083', - '#ffe9c3', - '#ffeee3', - '#f9cfc1', - '#f3a9ab', - '#db6882', - '#c71360', - '#891953', - '#4b1c47' -]; - -var paletteDivergingRedBlue = [ - '#b2172b', - '#c4443e', - '#d76a5a', - '#ed937e', - '#f4b8a2', - '#fcdbc7', - '#efefef', - '#bfcad5', - '#8ba7bc', - '#4d87a5', - '#3c7ca0', - '#28729b', - '#036896' -]; - -var paletteDivergingRedGrey = [ - '#b2172b', - '#c54532', - '#da6c3b', - '#f29446', - '#f8bc67', - '#fee08b', - '#efece5', - '#c9c5c1', - '#a5a19f', - '#808080', - '#666666', - '#333333', - '#000000' -]; - -var paletteDivergingOrangeViolet = [ - '#98141f', - '#ab332c', - '#f9bc47', - '#fdcf66', - '#fede8d', - '#ffecb3', - '#f9eff6', - '#e8d0e3', - '#a4c4a9', - '#a973aa', - '#834f96', - '#622181', - '#402357' -]; - -var paletteDivergingPurpleGreen = [ - '#59194b', - '#85134b', - '#c71360', - '#db6882', - '#eba7a8', - '#fce0ca', - '#faefe1', - '#dbd9aa', - '#b9c26e', - '#94ad31', - '#728b2b', - '#546c25', - '#39521f' -]; - -var paletteDivergingVioletGreen = [ - '#55296e', - '#75408e', - '#8a5fa0', - '#a081b5', - '#beadcf', - '#ddd7e7', - '#eae8ed', - '#c1d4bc', - '#93be86', - '#58a951', - '#3c853e', - '#23662f', - '#084a22' -]; - -var paletteDivergingRedGreen = [ - '#b2172b', - '#c5403c', - '#d96453', - '#ef8972', - '#f6b49c', - '#fcdbc7', - '#f9ebde', - '#dad6a8', - '#b9c16d', - '#94ad31', - '#728b2b', - '#546c25', - '#39521f' -]; - -var paletteDivergingBrownGreen = [ - '#735146', - '#846454', - '#977a65', - '#aa9177', - '#c2ad91', - '#dbcaad', - '#edebd6', - '#c4d6aa', - '#94bf7c', - '#58a951', - '#3c853e', - '#23662f', - '#084a22' -]; - -var paletteDivergingLightBrownTurquoise = [ - '#8b5219', - '#a46821', - '#bf812c', - '#cfa151', - '#e2c489', - '#f6e8c3', - '#f5f1df', - '#cbdccc', - '#9cc6b9', - '#60afa6', - '#359790', - '#1d7d75', - '#00665e' -]; - - -function category1() { - return d3$1.scaleOrdinal().range(paletteCategory1); -} - -function category2() { - return d3$1.scaleOrdinal().range(paletteCategory2); -} - -function category3() { - return d3$1.scaleOrdinal().range(paletteCategory3); -} - -function category4() { - return d3$1.scaleOrdinal().range(paletteCategory4); -} - -function category5() { - return d3$1.scaleOrdinal().range(paletteCategory5); -} - -function category6() { - return d3$1.scaleOrdinal().range(paletteCategory6); -} - -function category7() { - return d3$1.scaleOrdinal().range(paletteCategory7); -} - -function category8() { - return d3$1.scaleOrdinal().range(paletteCategory8); -} - -function sequentialYellow() { - return d3$1.scaleQuantile().range(paletteSequentialYellow); -} - -function sequentialRedOrange() { - return d3$1.scaleQuantile().range(paletteSequentialRedOrange); -} - -function sequentialRed() { - return d3$1.scaleQuantile().range(paletteSequentialRed); -} - -function sequentialPink() { - return d3$1.scaleQuantile().range(paletteSequentialPink); -} - -function sequentialPurplePink() { - return d3$1.scaleQuantile().range(paletteSequentialPurplePink); -} - -function sequentialPurple() { - return d3$1.scaleQuantile().range(paletteSequentialPurple); -} - -function sequentialBlue() { - return d3$1.scaleQuantile().range(paletteSequentialBlue); -} - -function sequentialLightBlue() { - return d3$1.scaleQuantile().range(paletteSequentialLightBlue); -} - -function sequentialBlueViolet() { - return d3$1.scaleQuantile().range(paletteSequentialBlueViolet); -} - -function sequentialTurquoise() { - return d3$1.scaleQuantile().range(paletteSequentialTurquoise); -} - -function sequentialLightGreen() { - return d3$1.scaleQuantile().range(paletteSequentialLightGreen); -} - -function sequentialDarkGreen() { - return d3$1.scaleQuantile().range(paletteSequentialDarkGreen); -} - -function sequentialGreenBrown() { - return d3$1.scaleQuantile().range(paletteSequentialGreenBrown); -} - -function sequentialBrown() { - return d3$1.scaleQuantile().range(paletteSequentialBrown); -} - -function sequentialGrey() { - return d3$1.scaleQuantile().range(paletteSequentialGrey); -} - -function sequentialVioletCb() { - return d3$1.scaleQuantile().range(paletteSequentialVioletCb); -} - -function sequentialPinkCb() { - return d3$1.scaleQuantile().range(paletteSequentialPinkCb); -} - -function sequentialBlueCb() { - return d3$1.scaleQuantile().range(paletteSequentialBlueCb); -} - -function sequentialGreenCb() { - return d3$1.scaleQuantile().range(paletteSequentialGreenCb); -} - -function sequentialGreenBrownCb() { - return d3$1.scaleQuantile().range(paletteSequentialGreenBrownCb); -} - -function diverging_spectral1() { - return d3$1.scaleQuantile().range(paletteDivergingSpectral1); -} - -function diverging_spectral2() { - return d3$1.scaleQuantile().range(paletteDivergingSpectral2); -} - -function diverging_spectral3() { - return d3$1.scaleQuantile().range(paletteDivergingSpectral3); -} - -function diverging_brown_turquoise() { - return d3$1.scaleQuantile().range(paletteDivergingBrownTurquoise); -} - -function diverging_orange_pink() { - return d3$1.scaleQuantile().range(paletteDivergingOrangePink); -} - -function diverging_red_blue() { - return d3$1.scaleQuantile().range(paletteDivergingRedBlue); -} - -function diverging_red_grey() { - return d3$1.scaleQuantile().range(paletteDivergingRedGrey); -} - -function diverging_orange_violet() { - return d3$1.scaleQuantile().range(paletteDivergingOrangeViolet); -} - -function diverging_purple_green() { - return d3$1.scaleQuantile().range(paletteDivergingPurpleGreen); -} - -function diverging_violet_green() { - return d3$1.scaleQuantile().range(paletteDivergingVioletGreen); -} - -function diverging_red_green() { - return d3$1.scaleQuantile().range(paletteDivergingRedGreen); -} - -function diverging_brown_green() { - return d3$1.scaleQuantile().range(paletteDivergingBrownGreen); -} - -function diverging_lightBrown_turquoise() { - return d3$1.scaleQuantile().range(paletteDivergingLightBrownTurquoise); -} - -/** - * - * A Datasource is the name given to the connection set up to a data endpoint. This class defines the common methods for the datasources, - * such as start() and stop(). - * - * @export Default export: Datasource class - * - * @class Datasource The Datasource class - * - */ -var Datasource = function Datasource() { - this.filters = []; - this.properties = []; -}; - -/** - * Starts the stream of data - * - * - * @memberOf Datasource - */ -Datasource.prototype.start = function start () { - window.console.log('Starting datasource'); -}; - -/** - * - * If started, this method stops the stream of data - * - * @memberOf Datasource - - */ -Datasource.prototype.stop = function stop () { - window.console.log('Stopping datasource'); -}; - - -Datasource.prototype.property = function property (prop, newProp, cast) { - this.properties.push({ 'p': prop, 'newP': newProp, cast: cast }); - return this; -}; - - -Datasource.prototype.convert = function convert (data) { - var this$1 = this; - - var result = {}; - for (var i in this.properties) { - var p = this$1.properties[i].p; - var value = eval('data.' + this$1.properties[i].newP); - // if(this.properties[i].cast){ - //value = new this.properties[i].cast(value); - // } - - result[p] = value; - } - return result; -}; - -/** - * Filters the incoming messages. Each data record that do not comply the filter condition will be discarded - * - * @param {any} filter A filter condition - * @returns this Datasource instance - * - * @memberOf Datasource - */ -Datasource.prototype.filter = function filter (filter) { - return this; -}; - -/** - * - * This datasource set up a connection to a http server. - * @export - * @class HTTPDatasource - * @extends {Datasource} - - */ -var HTTPDatasource = (function (Datasource$$1) { - function HTTPDatasource(source) { - Datasource$$1.call(this); - this.source = source; - this.intervalId = -1; - this.started = false; - } - - if ( Datasource$$1 ) HTTPDatasource.__proto__ = Datasource$$1; - HTTPDatasource.prototype = Object.create( Datasource$$1 && Datasource$$1.prototype ); - HTTPDatasource.prototype.constructor = HTTPDatasource; - - /** - * Configure a dispatcher for this datasource. - * - * @param {any} dispatcher A d3 dispatcher. This dispatcher is in charge of receiving and sending events. - * - * @memberOf HTTPDatasource - */ - HTTPDatasource.prototype.configure = function configure (dispatcher) { - this.dispatcher = dispatcher; - }; - - /** - * - * Initialize an HTTP connection - * - * @memberOf HTTPDatasource - - */ - HTTPDatasource.prototype.start = function start () { - if (!this.started) { - Datasource$$1.prototype.start.call(this); - var pollingTime = this.source.pollingTime; - var url = this.source.url; - this._startPolling(url, pollingTime); - this.started = true; - } - }; - - - HTTPDatasource.prototype._startPolling = function _startPolling (url, time) { - var this$1 = this; - if ( time === void 0 ) time = 1000; - - var interval = window.setInterval; - this.intervalId = interval(function () { return this$1._startRequest(url); }, time); - }; - - HTTPDatasource.prototype._startRequest = function _startRequest (url) { - var this$1 = this; - - - window.console.log('url', url); - d3$1.request(url).get(function (e, response) { return this$1._handleResponse(response); }); - }; - - HTTPDatasource.prototype._stopPolling = function _stopPolling () { - var clearInterval = window.clearInterval; - clearInterval(this.intervalId); - }; - - HTTPDatasource.prototype._handleResponse = function _handleResponse (xmlHttpRequest) { - var parseJson = window.JSON.parse; - if (xmlHttpRequest.readyState === 4 && xmlHttpRequest.status === 200) { - var response = parseJson(xmlHttpRequest.response); - this._handleOK(response); - } - else { - this._handleError(xmlHttpRequest); - } - }; - - HTTPDatasource.prototype._handleOK = function _handleOK (data) { - if(this.properties.length > 0 ) { - data = this.convert(data); - } - this.dispatcher.call('onmessage', this, data); - }; - - HTTPDatasource.prototype._handleError = function _handleError (data) { - this.dispatcher.call('onerror', this, data); - }; - - /** - * If started, this method close the HTTP connection. - * - * @memberOf HTTPDatasource - * */ - HTTPDatasource.prototype.stop = function stop () { - if (this.started) { - this._stopPolling(); - this.started = false; - } - }; - - return HTTPDatasource; -}(Datasource)); - -/** - * - * This datasource set up a connection to a websocket server. - * @export - * @class WebsocketDatasource - * @extends {Datasource} - - */ -var WebsocketDatasource = (function (Datasource$$1) { - function WebsocketDatasource(source) { - Datasource$$1.call(this); - this.source = source; - } - - if ( Datasource$$1 ) WebsocketDatasource.__proto__ = Datasource$$1; - WebsocketDatasource.prototype = Object.create( Datasource$$1 && Datasource$$1.prototype ); - WebsocketDatasource.prototype.constructor = WebsocketDatasource; - - /** - * Configure a dispatcher for this datasource. - * - * @param {any} dispatcher A d3 dispatcher. This dispatcher is in charge of receiving and sending events. - * - * @memberOf WebsocketDatasource - */ - WebsocketDatasource.prototype.configure = function configure (dispatcher) { - this.dispatcher = dispatcher; - }; - - /** - * - * Initialize a websocket connection - * - * @memberOf WebsocketDatasource - - */ - WebsocketDatasource.prototype.start = function start () { - var this$1 = this; - - Datasource$$1.prototype.start.call(this); - this.ws = new window.WebSocket(this.source.endpoint); - - this.ws.onopen = function (e) { - this$1.dispatcher.call('onopen', this$1, e); - }; - this.ws.onerror = function (e) { - throw new Error('An error occurred trying to reach the websocket server' + e); - //this.dispatcher.call('onerror', this, e); - }; - this.ws.onmessage = function (e) { - var data = JSON.parse(e.data); - this$1.dispatcher.call('onmessage', this$1, data); - }; - }; - /** - * If started, this method close the websocket connection. - * - * @memberOf WebsocketDatasource - * */ - WebsocketDatasource.prototype.stop = function stop () { - Datasource$$1.prototype.stop.call(this); - if (this.ws) { - this.ws.close(); - } - }; - - return WebsocketDatasource; -}(Datasource)); - -var defaults = { - selector: '#chart', - colorScale: category7(), - //Area - areaOpacity: 0.4, - - //Axes - xAxisType: 'linear', - xAxisFormat: '', - xAxisLabel: null, - yAxisType: 'linear', - yAxisFormat: '', - yAxisLabel: null, - //margins - marginTop: 20, - marginRight: 250, - marginBottom: 130, - marginLeft: 150, - //markers - markerShape: 'circle', - markerSize: 5, - markerOutlineWidth: 2, - //Width & height - width: '100%', // %, auto, or numeric - height: 250, - //Events - onDown: function onDown(d) { - }, - onHover: function onHover(d) { - }, - onLeave: function onLeave(d) { - }, - onClick: function onClick(d) { - }, - - maxNumberOfElements: 100, // used by keepDrawing method to reduce the number of elements in the current chart -}; - -var SvgContainer = function SvgContainer(config) { - this._config = config; - this.svg = this._initializeSvgContainer(config); - this.components = Array(); -}; - -SvgContainer.prototype._initializeSvgContainer = function _initializeSvgContainer (config) { - var selector = config.selector, - width = config.width + config.marginLeft + config.marginRight, - height = config.height + config.marginTop + config.marginBottom, - svg = null; - - svg = d3$1.select(selector) - .append('svg:svg') - .attr('width', width) - .attr('height', height) - .append('g') - .attr('class', 'chartContainer') - .attr('transform', 'translate(' + config.marginLeft + ',' + config.marginTop + ')'); - - return svg; -}; - - -SvgContainer.prototype.add = function add (component, render) { - if ( render === void 0 ) render = true; - - this.components.push(component); - - if (render) { - component.render(this.svg, this._config); - } - return this; -}; - -SvgContainer.prototype.transform = function transform (translation) { - this.svg.attr('transform', translation); - -}; - -function isNumeric(n) { - return !isNaN(parseFloat(n)) && isFinite(n); -} - -function isEven(n) { - return n % 2 === 0; -} - -function isPercentage(n) { - var split = null; - var number = null; - if (!n || typeof n !== 'string') { - return false; - } - split = n.split('%'); - number = (+split[0]); - return split.length === 2 && - (number >= 0) && - (number <= 100); -} - - - - - - - - -function deg2rad(deg) { - return deg * Math.PI / 180; -} - -function calculateWidth(widthConfig, selector) { - if (widthConfig === 'auto') { - return d3$1.select(selector) - .node() - .getBoundingClientRect() - .width; - } - else if (isNumeric(widthConfig)) { - return widthConfig; - } - else if (isPercentage(widthConfig)) { - var containerWidth, percentage; - containerWidth = d3$1.select(selector) - .node() - .getBoundingClientRect() - .width; - percentage = widthConfig.split('%')[0]; - return Math.round(percentage * containerWidth / 100); - } else { - throw Error('Unknow config width value: ' + widthConfig); - } -} - -var SvgAxis = function SvgAxis(context) { - this._loadConfig(context.config); - this.svgContainer = new SvgContainer(this.config); -}; - -SvgAxis.prototype.changeConfigProperty = function changeConfigProperty (p, v) { - this.config[p] = v; - if (p === 'width' || p === 'height') { - this.config.needRescaling = true; - } -}; - -SvgAxis.prototype.rescale = function rescale (width, height) { - if ( width === void 0 ) width = this.config.width; - if ( height === void 0 ) height = this.config.height; - - this.axes.rescale(width, height); - this.config.needRescaling = false; -}; - -/** - * - * Load the configuration context. It creates a configuration global from the parameters specified by users. - * If any parameter is empty, this will be replaced by its default option - * - * @param {any} config User configuration - * @param {any} defaults Defaults values for this chart - * - * @memberOf SvgAxis - - */ -SvgAxis.prototype._loadConfig = function _loadConfig (config, defaults) { - this.config = {}; - //Selector - this.config.selector = config.selector || defaults.selector; - //Margins - this.config.marginTop = config.marginTop || defaults.marginTop; - this.config.marginLeft = config.marginLeft || defaults.marginLeft; - this.config.marginRight = config.marginRight || defaults.marginRight; - this.config.marginBottom = config.marginBottom || defaults.marginBottom; - //Width & height - this.config.width = config.width - ? calculateWidth(config.width, this.config.selector) - this.config.marginLeft - this.config.marginRight - : calculateWidth(defaults.width, this.config.selector) - this.config.marginLeft - this.config.marginRight; - this.config.height = config.height || defaults.height; - //Axis - this.config.xAxisType = config.xAxisType || defaults.xAxisType; - this.config.xAxisFormat = config.xAxisFormat || defaults.xAxisFormat; - this.config.xAxisLabel = config.xAxisLabel || defaults.xAxisLabel; - this.config.yAxisType = config.yAxisType || defaults.yAxisType; - this.config.yAxisFormat = config.yAxisFormat || defaults.yAxisFormat; - this.config.yAxisLabel = config.yAxisLabel || defaults.yAxisLabel; - //Color - this.config.colorScale = config.colorScale || defaults.colorScale; - //Events - this.config.onDown = config.onDown || defaults.onDown; - this.config.onUp = config.onUp || defaults.onUp; - this.config.onHover = config.onHover || defaults.onHover; - this.config.onClick = config.onClick || defaults.onClick; - this.config.onLeave = config.onLeave || defaults.onLeave; -}; - -var XAxis = function XAxis(xAxisType, config) { - if (config === null) { - throw new Error('No chart context specified for XAxis'); - } - - this.xAxis = this._initializeXAxis(xAxisType, config); -}; - - -XAxis.prototype.rescale = function rescale (width, height) { - this.xAxis.scale().range([0, width]); -}; - -XAxis.prototype._initializeXAxis = function _initializeXAxis (xAxisType, config) { - if ( xAxisType === void 0 ) xAxisType = 'linear'; - - var x = null, - axis = null; - - // switch (xAxisType) { - // case 'time': - // x = scaleTime().range([0, config.width]); - // break; - // case 'linear': - // x = scaleLinear().range([0, config.width]); - // break; - // case 'categorical': - // x = scaleBand().rangeRound([0, config.width]) - // .padding(0.1) - // .align(0.5); - // break; - // default: - // throw new Error('Not allowed type for XAxis. Only allowed "time","linear" or "categorical". Got: ' + xAxisType); - // } - - switch (xAxisType) { - case 'time': - x = d3$1.scaleTime().range([0, config.width]); - axis = d3$1.axisBottom(x); - break; - case 'linear': - x = d3$1.scaleLinear().range([0, config.width]); - axis = d3$1.axisBottom(x).tickFormat(d3$1.format(config.xAxisFormat)); - break; - case 'categorical': - x = d3$1.scaleBand().rangeRound([0, config.width]) - .padding(0.1) - .align(0.5); - axis = d3$1.axisBottom(x); - break; - default: - throw new Error('Not allowed type for XAxis. Only allowed "time","linear" or "categorical". Got: ' + xAxisType); - } - - return d3$1.axisBottom(x); -}; - -XAxis.prototype.transition = function transition (svg, time) { - if ( time === void 0 ) time = 200; - - svg.selectAll('.x.axis').transition().duration(time).call(this.xAxis).on('end', this.xStyle); -}; - -XAxis.prototype.xStyle = function xStyle () { - d3$1.select(this).selectAll('g.tick text') - .style('font', '1.4em Montserrat, sans-serif') - .style('fill', function (d, i) { return !isEven(i) || i === 0 ? '#5e6b70' : '#1a2127'; }) - .style('fill', function (d) { return '#1a2127'; }); - - - d3$1.select(this).selectAll(['path', 'line']) - .attr('stroke', 'gray') - .attr('stroke-width', .3); - -}; - -/** - * This function is used when both x and y dial update their domains by x and y max/min values, respectively. - */ -XAxis.prototype.updateDomainByBBox = function updateDomainByBBox (b) { - var x = this.xAxis.scale(); - x.domain([b[0], b[1]]); -}; - -/** - * Used when x domain is caterogial (a set of keys) and y domain is linear. - */ -XAxis.prototype.updateDomainByKeys = function updateDomainByKeys (keys$$1, yBbox) { - var x = this.xAxis.scale(); - x.domain(keys$$1); -}; - -XAxis.prototype.render = function render (svg, config) { - var xAxis = this.xAxis, - width = config.width, - height = config.height; - svg - .append('g') - .attr('class', 'x axis') - .attr('transform', 'translate(0,' + config.height + ')') - .call(xAxis); - - svg - .append('text') - .attr('class', 'xaxis-title') - .attr("text-anchor", "middle") - .attr('x', width / 2) - .attr('y', height + 40) - .text(config.xAxisLabel) - .style('font', '0.8em Montserrat, sans-serif'); - - this.svg = svg; -}; - -var YAxis = function YAxis(yAxisType, config) { - if (config === null) { - throw new Error('No chart context specified for XAxis'); - } - - this.yAxis = this._initializeYAxis(yAxisType, config); -}; - -YAxis.prototype.rescale = function rescale (width, height) { - this.yAxis.tickSizeInner(-width); -}; - -YAxis.prototype._initializeYAxis = function _initializeYAxis (yAxisType, config) { - if ( yAxisType === void 0 ) yAxisType = 'linear'; - - var y = null, - axis = null; - switch (yAxisType) { - case 'linear': - y = d3$1.scaleLinear().range([config.height, 0]); - axis = d3$1.axisLeft(y).tickFormat(d3$1.format(config.yAxisFormat)); - break; - case 'categorical': - y = d3$1.scaleBand().rangeRound([config.height, 0]) - .padding(0.1) - .align(0.5); - axis = d3$1.axisLeft(y); - break; - default: - throw new Error('Not allowed type for YAxis. Only allowed "time","linear" or "categorical". Got: ' + yAxisType); - } - - return axis.tickSizeInner(-config.width) - .tickSizeOuter(0) - .tickPadding(20); -}; - -// _initializeYAxis(yAxisType = 'linear', config) { -// let y = null, -// yAxis = null; -// -// switch (yAxisType) { -// case 'linear': -// y = scaleLinear().range([config.height, 0]); -// break; -// case 'categorical': -// y = scaleBand().rangeRound([config.height, 0]) -// .padding(0.1) -// .align(0.5); -// break; -// default: -// throw new Error('Not allowed type for YAxis. Only allowed "time","linear" or "categorical". Got: ' + yAxisType); -// } -// return axisLeft(y) -// .tickSizeInner(-config.width) -// .tickSizeOuter(0) -// .tickPadding(20) -// .tickFormat((d) => d) -// .ticks(config.yticks, config.tickLabel); -// } - -YAxis.prototype.transition = function transition (svg, time) { - if ( time === void 0 ) time = 200; - - svg.selectAll('.y.axis').transition().duration(time).call(this.yAxis).on('end', this.yStyle); -}; - -YAxis.prototype.yStyle = function yStyle () { - d3$1.select(this).selectAll('g.tick text') - .style('font', '1.4em Montserrat, sans-serif') - .style('fill', function (d, i) { return !isEven(i) || i === 0 ? '#5e6b70' : '#1a2127'; }); - d3$1.select(this).selectAll('g.tick line') - .style('stroke', function (d, i) { return isEven(i) && i !== 0 ? '#5e6b70' : '#dbdad8'; }); -}; - -YAxis.prototype.updateDomainByBBox = function updateDomainByBBox (b) { - var y = this.yAxis.scale(); - y.domain(b); -}; - -YAxis.prototype.updateDomainByKeys = function updateDomainByKeys (keys$$1) { - var y = this.yAxis.scale(); - y.domain(keys$$1); -}; - -YAxis.prototype.render = function render (svg, config) { - var yAxis = this.yAxis, - width = config.width, - height = config.height; - svg - .append('g') - .attr('class', 'y axis') - .attr('stroke-dasharray', '1, 5') - .call(yAxis); - - svg - .append('text') - .attr('class', 'yaxis-title') - .attr("transform", "rotate(-90)") - .attr("text-anchor", "middle") - .attr('x', 0 - height / 2) - .attr('y', 0 - 55) - .text(config.yAxisLabel) - .style('font', '0.8em Montserrat, sans-serif'); - -}; - -var XYAxes = function XYAxes(xAxisType, yAxisType, config) { - if (config === null) { - throw new Error('No chart context specified for XAxis'); - } - - this.x = new XAxis(xAxisType, config); - this.y = new YAxis(yAxisType, config); -}; - -XYAxes.prototype.transition = function transition (svg, time) { - if ( time === void 0 ) time = 200; - - this.x.transition(svg, time); - this.y.transition(svg, time); -}; - -/** - * This function is used when both x and y dial update their domains by x and y max/min values, respectively. - */ -XYAxes.prototype.updateDomainByBBox = function updateDomainByBBox (b) { - this.x.updateDomainByBBox([b[0], b[1]]); - this.y.updateDomainByBBox([b[2], b[3]]); -}; - -/** - * Used when x domain is caterogial (a set of keys) and y domain is linear. - */ -XYAxes.prototype.updateDomainByKeysAndBBox = function updateDomainByKeysAndBBox (keys, bbox) { - this.x.updateDomainByKeys(keys); - this.y.updateDomainByBBox(bbox); -}; - -XYAxes.prototype.updateDomainByBBoxAndKeys = function updateDomainByBBoxAndKeys (bbox, keys){ - this.x.updateDomainByBBox(bbox); - this.y.updateDomainByKeys(keys); -}; - -XYAxes.prototype.render = function render (svg, config) { - this.x.render(svg, config); - this.y.render(svg, config); -}; - -XYAxes.prototype.rescale = function rescale (width, height){ - this.x.rescale(width, height); - this.y.rescale(width, height); -}; - -var Lineset = function Lineset(x, y) { - var this$1 = this; - - this.xAxis = x.xAxis; - this.yAxis = y.yAxis; - this.lineGenerator = d3$1.line() - .x(function (d) { return this$1.xAxis.scale()(d.x); }) - .y(function (d) { return this$1.yAxis.scale()(d.y); }); -}; - -Lineset.prototype.update = function update (svg, config, data) { - var this$1 = this; - - var dataSeries = d3$1.nest().key(function (d) { return d.key; }).entries(data), - series = null, - lines = null, - colorScale = config.colorScale; - - svg.selectAll('g.serie').remove(); - - series = svg.selectAll('g.serie'); - lines = series - .data(dataSeries, function (d) { return d.key; }) - .enter() - .append('g') - .attr('class', 'serie') - .attr('stroke', function (d, i) { return colorScale(i); }) - .append('svg:path') - .style('stroke', function (d, i) { return colorScale(i); }) - .style('stroke-width', 1.3) - .style('fill', 'none') - .attr('d', function (d) { return this$1.lineGenerator(d.values); }) - .attr('class', 'line'); - - this.svg = svg; -}; - -Lineset.prototype.render = function render (svg, config) { - //Do nothing, since lines render only when new data is received. -}; - -var Legend = function Legend() {}; - -Legend.prototype.update = function update (svg, config, data) { - var dataSeries = d3$1.nest() - .key(function (d) { return d.key; }) - .entries(data), - legend = null, - entries = null, - colorScale = config.colorScale, - height = config.height, - width = config.width; - - if(dataSeries.length === 1 && dataSeries[0].key === 'undefined'){ - console.warn('Not showing legend, since there is a valid key'); - return; - } - - svg.selectAll('g.legend').remove(); - - legend = svg.append('g').attr('class', 'legend'); - entries = legend.selectAll('.legend-entry') - .data(dataSeries, function (d) { return d.key; }) - .enter() - .append('g') - .attr('class', 'legend-entry'); - - - entries.append('rect') - .attr('x', width + 10) - .attr('y', function (d, i) { return i * 25; }) - .attr('height', 20) - .attr('width', 20) - .attr('fill', function (d, i) { return colorScale(i); }) - .style('opacity', 0.8); - - entries.append('text') - .attr("x", width + 25 + 10) - .attr("y", function (d, i) { return i * 25 + 7; }) - .attr("dy", "0.55em") - .text(function (d) { return d.key; }) - .style('font', '14px Montserrat, sans-serif'); - -}; - -Legend.prototype.render = function render (svg, config) { - //Do nothing, since legend render only when new data is received. -}; - -var Areaset = function Areaset(x, y) { - this.xAxis = x.xAxis; - this.yAxis = y.yAxis; -}; - -Areaset.prototype.update = function update (svg, config, data) { - var this$1 = this; - - var dataSeries = d3$1.nest() - .key(function (d) { return d.key; }) - .entries(data); - - var series = null - , areas = null - , area$$1 = config.area - , colorScale = config.colorScale - , height = config.height - , areaOpacity = config.areaOpacity; - - var areaGenerator = d3.area() - .x(function (d) { return this$1.xAxis.scale()(d.x); }) - .y0(height) - .y1(function (d) { return this$1.yAxis.scale()(d.y); }); - - svg.selectAll('g.area').remove(); - - series = svg.selectAll('g.area'); - areas = series - .data(dataSeries, function (d) { return d.key; }) - .enter() - .append('g') - .attr('class', 'area') - .append('svg:path') - .style('fill', function (d, i) { return colorScale(i); }) - .style('fill-opacity', areaOpacity) - .attr('d', function (d) { return areaGenerator(d.values); }); - - // series - // .insert('path', ':first-child') //if not :first-child, area overlaps markers. - // .attr('class', 'area') - // .data(dataSeries) - // .style('stroke', (d, i) => colorScale(i)) - // .style('fill', (d, i) => colorScale(i)) - // .style('fill-opacity', areaOpacity) - // .attr('d', (d) => areaGenerator(d.values)); - - this.svg = svg; -}; - -Areaset.prototype.render = function render (svg, config) { - //Do nothing, since areas render only when new data is received. -}; - -var Pointset = function Pointset(x, y) { - this.xAxis = x.xAxis; - this.yAxis = y.yAxis; -}; -Pointset.prototype.update = function update (svg, config, data) { - var this$1 = this; - - var dataSeries = d3$1.nest() - .key(function (d) { return d.key; }) - .entries(data), - markers = null, - markerShape = config.markerShape, - markerSize = config.markerSize, - markerOutlineWidth = config.markerOutlineWidth, - colorScale = config.colorScale, - points = null, - series = null; - - svg.selectAll('g.points').remove(); - - series = svg.selectAll('g.points'); - - switch (markerShape) { - case 'dot': - points = series - .data(dataSeries, function (d) { return d.key; }) - .enter() - .append('g') - .attr('class', 'points') - .style('fill', function (d, i) { return colorScale(i); }) - .selectAll('circle') - .data(function (d) { return d.values; }) - .enter() - .append('circle') - .attr('cx', function (d) { return this$1.xAxis.scale()(d.x); }) - .attr('cy', function (d) { return this$1.yAxis.scale()(d.y); }) - .attr('r', markerSize) - .attr('class', 'marker'); - break; - case 'ring': - window.console.warn('Deprecated "circle" marker shape: use "dot" or "ring" instead'); - points = series - .data(dataSeries, function (d) { return d.key; }) - .enter() - .append('g') - .attr('class', 'points') - .style('stroke', function (d, i) { return colorScale(i); }) - .selectAll('circle') - .data(function (d, i) { return d.values; }) - .enter() - .append('circle') - .attr('cx', function (d) { return this$1.xAxis.scale()(d.x); }) - .attr('cy', function (d) { return this$1.yAxis.scale()(d.y); }) - .attr('r', markerSize) - .attr('class', 'marker') - .style('fill', 'white') - .style('stroke-width', markerOutlineWidth); - break; - // Deprecated circle option - case 'circle': - window.console.warn('Deprecated "circle" marker shape: use "dot" or "ring" instead'); - points = series - .data(dataSeries, function (d) { return d.key; }) - .enter() - .append('g') - .attr('class', 'points') - .style('stroke', function (d, i) { return colorScale(i); }) - .selectAll('circle') - .data(function (d, i) { return d.values; }) - .enter() - .append('circle') - .attr('cx', function (d) { return this$1.xAxis.scale()(d.x); }) - .attr('cy', function (d) { return this$1.yAxis.scale()(d.y); }) - .attr('r', markerSize) - .attr('class', 'lineMarker') - .style('fill', 'white') - .style('stroke-width', markerOutlineWidth); - break; - default: - points = series - .data(dataSeries, function (d) { return d.key; }) - .enter() - .append('g') - .attr('class', 'points') - .style('stroke', function (d, i) { return colorScale(i); }) - .selectAll('circle') - .data(function (d, i) { return d.values; }) - .enter() - .append('circle') - .attr('cx', function (d) { return this$1.xAxis.scale()(d.x); }) - .attr('cy', function (d) { return this$1.yAxis.scale()(d.y); }) - .attr('r', markerSize) - .attr('class', 'lineMarker') - .style('fill', 'white') - .style('stroke-width', markerOutlineWidth); - } - - markers = svg.selectAll('g.points circle'); - markers - .on('mousedown.user', config.onDown) - .on('mouseup.user', config.onUp) - .on('mouseleave.user', config.onLeave) - .on('mouseover.user', config.onHover) - .on('click.user', config.onClick); - - //this.interactiveElements = markers; -}; - -Pointset.prototype.render = function render (svg, config) { - //Do nothing, since points render only when new data is received. -}; - -function simple2stacked(data) { - return d3$1.nest().key(function (d) { return d.x; }).rollup(function (array) { - var r = {}; - for (var i = 0; i < array.length; i++) { - var object = array[i]; - if (object) { - r[object.key] = object.y; - } - } - return r; - }).entries(data); -} - -function simple2nested(data, key) { - if ( key === void 0 ) key = 'key'; - - return d3$1.nest().key(function (d) { return d[key]; }).entries(data); -} - - - -function simple2Linked(data) { - var linkedData = { links: [], nodes: [] }; - data.map(function (d) { return d.key === 'link' ? linkedData.links.push(d) : linkedData.nodes.push(d); }); - return linkedData; -} - - -function convertPropretiesToTimeFormat(data, properties, format$$1) { - data.forEach(function (d) { - properties.map(function (p) { - d[p] = d3$1.timeParse(format$$1)(d[p]); - }); - }); -} - -function convertByXYFormat(data, config) { - data.forEach(function (d) { - //parse x coordinate - switch (config.xAxisType) { - case 'time': - d.x = d3$1.timeParse(config.xAxisFormat)(d.x); - break; - case 'linear': - d.x = +d.x; - break; - } - //parse Y coordinate - switch (config.yAxisType) { - case 'time': - d.y = d3$1.timeParse(config.yAxisFormat)(d.y); - break; - case 'linear': - d.y = +d.y; - break; - } - }); - return data; -} - -function sortByField (array, field){ - array.sort(function (e1, e2) { - var a = e1[field]; - var b = e2[field]; - return (a < b) ? -1 : (a > b) ? 1 : 0; - }); -} - -var SvgLinechartStrategy = (function (SvgAxis$$1) { - function SvgLinechartStrategy(context) { - SvgAxis$$1.call(this, context); - - this.axes = new XYAxes(this.config.xAxisType, 'linear', this.config); - - this.lines = new Lineset(this.axes.x, this.axes.y); - this.legend = new Legend(); - - //Include components in the chart container - this.svgContainer - .add(this.axes) - .add(this.legend) - .add(this.lines); - - if (this._checkArea(this.config)) { - this.areas = new Areaset(this.axes.x, this.axes.y); - this.svgContainer.add(this.areas); - } - - if (this._checkMarkers(this.config)) { - this.points = new Pointset(this.axes.x, this.axes.y); - this.svgContainer.add(this.points); - } - } - - if ( SvgAxis$$1 ) SvgLinechartStrategy.__proto__ = SvgAxis$$1; - SvgLinechartStrategy.prototype = Object.create( SvgAxis$$1 && SvgAxis$$1.prototype ); - SvgLinechartStrategy.prototype.constructor = SvgLinechartStrategy; - - /** - * Renders a linechart based on data object - * @param {Object} data Data Object. Contains an array with x and y properties. - * - */ - SvgLinechartStrategy.prototype.draw = function draw (data) { - var svg = this.svgContainer.svg, - config = this.config, - needRescaling = this.config.needRescaling, - bbox = null; - - //Transform data, if needed - convertByXYFormat(data, config); - - //Sort data - sortByField(data, 'x'); - - //rescale, if needed. - if (needRescaling) { - this.rescale(); - } - - - bbox = this._getDomainBBox(data); - - this.axes.updateDomainByBBox(bbox); - - //Create a transition effect for dial rescaling - this.axes.transition(svg, 200); - - // Update legend - this.legend.update(svg, config, data); - - //Now update lines - this.lines.update(svg, config, data); - - if (config.areaOpacity > 0) { - // Update areas - this.areas.update(svg, config, data); - } - - if (this._checkMarkers(config)) { - // Update points - this.points.update(svg, config, data); - } - - }; - - SvgLinechartStrategy.prototype._getDomainBBox = function _getDomainBBox (data) { - var minX = d3$1.min(data, function (d) { return d.x; }), - maxX = d3$1.max(data, function (d) { return d.x; }), - minY = d3$1.min(data, function (d) { return d.y; }), - maxY = d3$1.max(data, function (d) { return d.y; }); - return [minX, maxX, minY, maxY]; - }; - - - SvgLinechartStrategy.prototype._checkMarkers = function _checkMarkers (config) { - return config.markerSize > 0; - }; - SvgLinechartStrategy.prototype._checkArea = function _checkArea (config) { - return config.areaOpacity > 0; - }; - - /** - * This method adds config options to the chart context. - * @param {Object} config Config object - */ - SvgLinechartStrategy.prototype._loadConfig = function _loadConfig (config) { - SvgAxis$$1.prototype._loadConfig.call(this, config, defaults); - //Markers - this.config.markerOutlineWidth = config.markerOutlineWidth || defaults.markerOutlineWidth; - this.config.markerShape = config.markerShape || defaults.markerShape; - this.config.markerSize = (typeof config.markerSize === 'undefined' || config.markerSize < 0) ? defaults.markerSize : config.markerSize; - //Area - this.config.areaOpacity = (typeof config.areaOpacity === 'undefined' || config.markerSize < 0) ? defaults.areaOpacity : config.areaOpacity; - return this; - }; - - return SvgLinechartStrategy; -}(SvgAxis)); - -var defaults$1 = { - selector: '#chart', - colorScale: category5(), - //Stacked - stacked: true, - //Axes - xAxisType: 'linear', - xAxisFormat: '', - xAxisLabel: null, - yAxisType: 'linear', - yAxisFormat: '', - yAxisLabel: null, - //margins - marginTop: 20, - marginRight: 250, - marginBottom: 130, - marginLeft: 150, - //width & height - width: '100%', - height: 350, - //Events - onDown: function onDown(d) { - }, - onHover: function onHover(d) { - }, - onLeave: function onLeave(d) { - }, - onClick: function onClick(d) { - } -}; - -var Barset = function Barset(xAxis, yAxis) { - this.xAxis = xAxis; - this.yAxis = yAxis; - this.lineGenerator = d3$1.line() - .x(function (d) { return xAxis.scale()(d.x); }) - .y(function (d) { return yAxis.scale()(d.y); }); -}; - - -Barset.prototype.update = function update (svg, config, data, method) { - var bars = null; - - if (method === 'stacked') { - this._updateStacked(svg, config, data); - } else { - this._updateGrouped(svg, config, data); - } - bars = svg.selectAll('g.serie rect'); - bars - .on('mousedown.user', config.onDown) - .on('mouseup.user', config.onUp) - .on('mouseleave.user', config.onLeave) - .on('mouseover.user', config.onHover) - .on('click.user', config.onClick); - - /** - TODO: Add default events? - bars - .on('mousedown.default', config.onDown) - .on('mouseup.default', config.onUp) - .on('mouseleave.default', function (){ select(this).transition().duration(150).attr('fill-opacity', 1)}) - .on('mouseover.default',function (){ select(this).transition().duration(150).attr('fill-opacity', 0.9)}) - .on('click.default', config.onClick); - **/ - - this.interactiveElements = bars; -}; - -Barset.prototype._updateStacked = function _updateStacked (svg, config, dataSeries) { - this._cleanCurrentSeries(svg); - - var colorScale = config.colorScale, - layer = svg.selectAll('.serie').data(dataSeries), - layerEnter = layer.enter().append('g'), - layerMerge = null, - bar = null, - barEnter = null, - barMerge = null, - x = this.xAxis.scale(), - y = this.yAxis.scale(); - - layerMerge = layer.merge(layerEnter) - .attr('class', 'serie') - .attr('fill', function (d, i) { return colorScale(i); }); - - bar = layerMerge.selectAll('rect') - .data(function (d) { return d; }); - - barEnter = bar.enter().append('rect'); - - barMerge = bar.merge(barEnter) - .attr("x", function (d) { return x(d.data.key); }) - .attr("y", function (d) { return y(d[1]); }) - .attr("height", function (d) { return y(d[0]) - y(d[1]); }) - .attr("width", x.bandwidth()); -}; - - -Barset.prototype._updateGrouped = function _updateGrouped (svg, config, data) { - this._cleanCurrentSeries(svg); - - var keys = d3$1.map(data, function (d) { return d.key; }).keys(), - colorScale = config.colorScale, - layer = svg.selectAll('.serie').data(data), - layerEnter = null, - layerMerge = null, - bar = null, - barEnter = null, - barMerge = null, - x = this.xAxis.scale(), - y = this.yAxis.scale(), - xGroup = d3$1.scaleBand().domain(keys).range([0, x.bandwidth()]), - height = config.height; - - data = simple2nested(data, 'x'); - - layer = svg.selectAll('.serie').data(data); - - layerEnter = layer.enter().append('g') - .attr('transform', function (d) { return 'translate(' + x(d.key) + ')'; }); - - layerMerge = layer.merge(layerEnter) - .attr('class', 'serie') - .attr('transform', function (d) { return 'translate(' + x(d.key) + ')'; }); - - bar = layerMerge.selectAll('rect') - .data(function (d) { return d.values; }); - - barEnter = bar.enter().append('rect'); - - barMerge = bar.merge(barEnter) - .attr('width', xGroup.bandwidth()) - .attr("x", function (d) { return xGroup(d.key); }) - .attr('fill', function (d, i) { return colorScale(i); }) - .attr("y", function (d) { return y(d.y); }) - .attr("height", function (d) { return height - y(d.y); }); - -}; - -Barset.prototype._getKeysFromData = function _getKeysFromData (data) { - var keys = []; - for (var p in data[0]) { - if (p !== 'total' && p !== 'key') { - keys.push(p); - } - } - return keys; - -}; - -Barset.prototype._cleanCurrentSeries = function _cleanCurrentSeries (svg) { - svg.selectAll('.serie').remove(); -}; - -Barset.prototype.render = function render (svg, config) { - //Do nothing, since bars render only when new data is received. -}; - -var SvgBarchartStrategy = (function (SvgAxis$$1) { - function SvgBarchartStrategy(context) { - SvgAxis$$1.call(this, context); - - this.axes = new XYAxes('categorical', 'linear', this.config); - this.bars = new Barset(this.axes.x.xAxis, this.axes.y.yAxis); - - this.legend = new Legend(); - - this.svgContainer - .add(this.axes) - .add(this.bars) - .add(this.legend); - - } - - if ( SvgAxis$$1 ) SvgBarchartStrategy.__proto__ = SvgAxis$$1; - SvgBarchartStrategy.prototype = Object.create( SvgAxis$$1 && SvgAxis$$1.prototype ); - SvgBarchartStrategy.prototype.constructor = SvgBarchartStrategy; - - - /** - * Renders a barchart based on data object - * @param {Object} data Data Object. Contains an array with x and y properties. - * - */ - SvgBarchartStrategy.prototype.draw = function draw (data) { - if ( data === void 0 ) data = this.data; - - var svg = this.svgContainer.svg, - config = this.config, - keys = d3$1.map(data, function (d) { return d.key; }).keys(), - data4stack = simple2stacked(data), - data4render = null, - isStacked = this.config.stacked, - stack$$1 = d3$1.stack().keys(keys) - .value(function (d, k) { return d.value[k]; }) - .order(d3$1.stackOrderNone), - yMin = 0, - yMax = 0, - method = isStacked ? 'stacked' : 'grouped', - dataSeries = stack$$1(data4stack), - needRescaling = this.config.needRescaling; - - //rescale, if needed. - if (needRescaling) { - this.rescale(); - } - - - yMax = isStacked ? - d3$1.max(dataSeries, function (serie) { return d3$1.max(serie, function (d) { return d[1]; }); }) : - d3$1.max(data, function (d) { return d.y; }); - - this.axes.updateDomainByKeysAndBBox(d3$1.map(data, function (d) { return d.x; }).keys(), [yMin, yMax]); - this.axes.transition(svg, 200); - - data4render = isStacked ? dataSeries : data; - - this.bars.update(svg, config, data4render, method); - - this.legend.update(svg, config, data); - - this.data = data; // TODO: ? - - }; - - - SvgBarchartStrategy.prototype.transition2Stacked = function transition2Stacked () { - this.config.stacked = true; - }; - - SvgBarchartStrategy.prototype.transition2Grouped = function transition2Grouped () { - this.config.stacked = false; - }; - - /** - * This method adds config options to the chart context. - * @param {Object} config Config object - */ - SvgBarchartStrategy.prototype._loadConfig = function _loadConfig (config) { - SvgAxis$$1.prototype._loadConfig.call(this, config, defaults$1); - //Stacked - this.config.stacked = typeof (config.stacked) === 'undefined' ? defaults$1.stacked : config.stacked; return this; - }; - - return SvgBarchartStrategy; -}(SvgAxis)); - -var defaults$2 = { - selector: '#chart', - colorScale: category4(), - //Axes - xAxisType: 'time', - xAxisFormat: '%y/%m/%d', - xAxisLabel: null, - yAxisType: 'categorical', - yAxisFormat: '', - yAxisLabel: null, - //margins - marginTop: 20, - marginRight: 250, - marginBottom: 130, - marginLeft: 150, - //Width & height - width: '100%', // %, auto, or numeric - height: 250, - //Events - onDown: function onDown(d) { - }, - onHover: function onHover(d) { - }, - onLeave: function onLeave(d) { - }, - onClick: function onClick(d) { - }, - - maxNumberOfElements: 100, // used by keepDrawing method to reduce the number of elements in the current chart -}; - -var Streamset = function Streamset(xAxis, yAxis) { - var this$1 = this; - - this.xAxis = xAxis; - this.yAxis = yAxis; - - this.areaGenerator = d3$1.area() - .curve(d3$1.curveCardinal) - .x(function (d) { return this$1.xAxis.scale()((d3$1.timeParse(this$1.xDataFormat)(d.data.key))); }) // TODO: It seems d3.nest() transform Date object in - .y0(function (d) { return this$1.yAxis.scale()(d[0]); }) - .y1(function (d) { return this$1.yAxis.scale()(d[1]); }); -}; - - -Streamset.prototype.update = function update (svg, config, data) { - var series = null; - - //Update date format, used by areaGenerator function due to a problem when nesting with d3. - this.xDataFormat = config.xAxisFormat; - - svg.selectAll('.serie').remove(); - - series = svg.selectAll('.serie') - .data(data) - .enter() - .append('g') - .attr('class', 'serie') - .style('stroke', function (d, i) { return config.colorScale(i); }); - - series - .append('path') - .attr('class', 'layer') - .attr('d', this.areaGenerator) - .style('fill', function (d, i) { return config.colorScale(i); }); - - - series.exit().remove(); - - series - .attr('opacity', 1) - .on('mousedown.user', config.onDown) - .on('mouseup.user', config.onUp) - .on('mouseleave.user', config.onLeave) - .on('mouseover.user', config.onHover) - .on('click.user', config.onClick); -}; - -Streamset.prototype.render = function render (svg, config) { - //Do nothing, since lines render only when new data is received. -}; - -var SvgStreamgraphStrategy = (function (SvgAxis$$1) { - function SvgStreamgraphStrategy(context) { - SvgAxis$$1.call(this, context); - - this.x = new XAxis('time', this.config); - this.y = new YAxis('linear', this.config); - - this.streams = new Streamset(this.x.xAxis, this.y.yAxis); - - this.legend = new Legend(); - - //Include components in the chart container - this.svgContainer - .add(this.x) - .add(this.y, false) //No render y Axis - .add(this.legend) - .add(this.streams); - } - - if ( SvgAxis$$1 ) SvgStreamgraphStrategy.__proto__ = SvgAxis$$1; - SvgStreamgraphStrategy.prototype = Object.create( SvgAxis$$1 && SvgAxis$$1.prototype ); - SvgStreamgraphStrategy.prototype.constructor = SvgStreamgraphStrategy; - SvgStreamgraphStrategy.prototype.draw = function draw (data) { - var svg = this.svgContainer.svg, - config = this.config, - bbox = null, - keys = d3$1.map(data, function (d) { return d.key; }).keys(), - xDataFormat = this.config.xAxisFormat, - data4stack = simple2stacked(data), - stack$$1 = d3$1.stack() - .keys(keys) - .value(function (d, k) { return d.value[k]; }) - .order(d3$1.stackOrderInsideOut) - .offset(d3$1.stackOffsetWiggle), - dataSeries = stack$$1(data4stack), - needRescaling = this.config.needRescaling; - - convertPropretiesToTimeFormat(data, ['x'], xDataFormat); - - //Sort data - sortByField(data, 'x'); - - //rescale, if needed. - if (needRescaling) { - this.rescale(); - } - - bbox = this._getDomainBBox(data, dataSeries); - - this.x.updateDomainByBBox([bbox[0], bbox[1]]); - this.y.updateDomainByBBox([bbox[2], bbox[3]]); - this.x.transition(svg, 200); - this.y.transition(svg, 200); - - // Update legend - this.legend.update(svg, config, data); - - // Update streams - this.streams.update(svg, config, dataSeries); - }; - - SvgStreamgraphStrategy.prototype._getDomainBBox = function _getDomainBBox (data, dataSeries) { - var minX = d3$1.min(data, function (d) { return new Date(d.x); }), - maxX = d3$1.max(data, function (d) { return new Date(d.x); }), - minY = d3$1.min(dataSeries, function (serie) { return d3$1.min(serie, function (d) { return d[0]; }); }), - maxY = d3$1.max(dataSeries, function (serie) { return d3$1.max(serie, function (d) { return d[1]; }); }); - - return [minX, maxX, minY, maxY]; - }; - - /** - * This method adds config options to the chart context. - * @param {Object} config Config object - */ - SvgStreamgraphStrategy.prototype._loadConfig = function _loadConfig (config) { - SvgAxis$$1.prototype._loadConfig.call(this, config,defaults$2); - return this; - }; - - return SvgStreamgraphStrategy; -}(SvgAxis)); - -var defaults$3 = { - selector: '#chart', - colorScale: category2(), - //Axes - xAxisType: 'time', - xAxisFormat: '%y/%m/%d', - xAxisLabel: null, - yAxisType: 'categorical', - yAxisFormat: '', - yAxisLabel: null, - //margins - marginTop: 20, - marginRight: 250, - marginBottom: 130, - marginLeft: 150, - //Width & height - width: '100%', // %, auto, or numeric - height: 250, - //Events - onDown: function onDown(d) { - }, - onHover: function onHover(d) { - }, - onLeave: function onLeave(d) { - }, - onClick: function onClick(d) { - }, - maxNumberOfElements: 100, // used by keepDrawing method to reduce the number of elements in the current chart -}; - -var SvgStackedAreaStrategy = (function (SvgAxis$$1) { - function SvgStackedAreaStrategy(context) { - SvgAxis$$1.call(this, context); - - this.axes = new XYAxes('time', 'linear', this.config); - - this.streams = new Streamset(this.axes.x.xAxis, this.axes.y.yAxis); - - this.legend = new Legend(); - - //Include components in the chart container - this.svgContainer - .add(this.axes) - .add(this.legend) - .add(this.streams); - } - - if ( SvgAxis$$1 ) SvgStackedAreaStrategy.__proto__ = SvgAxis$$1; - SvgStackedAreaStrategy.prototype = Object.create( SvgAxis$$1 && SvgAxis$$1.prototype ); - SvgStackedAreaStrategy.prototype.constructor = SvgStackedAreaStrategy; - - - SvgStackedAreaStrategy.prototype.draw = function draw (data) { - var svg = this.svgContainer.svg, - config = this.config, - bbox = null, - keys = d3$1.map(data, function (d) { return d.key; }).keys(), - data4stack = simple2stacked(data), - xDataFormat = this.config.xAxisFormat, - stack$$1 = d3$1.stack() - .keys(keys) - .value(function (d, k) { return d.value[k]; }) - .order(d3$1.stackOrderInsideOut) - .offset(d3$1.stackOffNone), - dataSeries = stack$$1(data4stack), - needRescaling = this.config.needRescaling; - - //rescale, if needed. - if (needRescaling) { - this.rescale(); - } - - convertPropretiesToTimeFormat(data, ['x'], xDataFormat); - - //Sort data - sortByField(data, 'x'); - - bbox = this._getDomainBBox(data, dataSeries); - - this.axes.updateDomainByBBox(bbox); - this.axes.transition(svg, 200); - - // Update legend - this.legend.update(svg, config, data); - - // Update streams - this.streams.update(svg, config, dataSeries); - }; - - - SvgStackedAreaStrategy.prototype._getDomainBBox = function _getDomainBBox (data, dataSeries) { - var minX = d3$1.min(data, function (d) { return (d.x); }), - maxX = d3$1.max(data, function (d) { return (d.x); }), - minY = d3$1.min(dataSeries, function (serie) { return d3$1.min(serie, function (d) { return d[0]; }); }), - maxY = d3$1.max(dataSeries, function (serie) { return d3$1.max(serie, function (d) { return d[1]; }); }); - - return [minX, maxX, minY, maxY]; - }; - - /** - * This method adds config options to the chart context. - * @param {Object} config Config object - */ - SvgStackedAreaStrategy.prototype._loadConfig = function _loadConfig (config) { - SvgAxis$$1.prototype._loadConfig.call(this, config,defaults$3); - }; - - return SvgStackedAreaStrategy; -}(SvgAxis)); - -var defaults$4 = { - selector: '#chart', - colorScale: category3(), - //Axes - xAxisType: 'time', - xAxisFormat: '%y/%m/%d', - xAxisLabel: null, - yAxisType: 'categorical', - yAxisFormat: '%s', - yAxisLabel: null, - //margins - marginTop: 20, - marginRight: 250, - marginBottom: 30, - marginLeft: 50, - //Width & height - width: '100%', // %, auto, or numeric - height: 250, - //Events - onDown: function onDown(d) { - }, - onHover: function onHover(d) { - }, - onLeave: function onLeave(d) { - }, - onClick: function onClick(d) { - } -}; - -var TimeBoxset = function TimeBoxset(xAxis, yAxis) { - this.xAxis = xAxis; - this.yAxis = yAxis; - -}; -TimeBoxset.prototype.update = function update (svg, config, data) { - var colorScale = config.colorScale, - keys = d3$1.map(data, function (d) { return d.key; }).keys(), - layer = svg.selectAll('.serie').data(data), - layerEnter = null, - layerMerge = null, - box = null, - boxEnter = null, - boxMerge = null, - extLanes = null, - yLanes = null, - yLanesBand = d3$1.scaleBand().range([0, keys.length + 1]).domain(keys), - x = this.xAxis.scale(), - y = this.yAxis.scale(); - - data = simple2nested(data); - extLanes = d3$1.extent(data, function (d, i) { return i; }); - yLanes = d3$1.scaleLinear().domain([extLanes[0], extLanes[1] + 1]).range([0, config.height]); - - layer = svg.selectAll('.serie').data(data); - layerEnter = layer.enter().append('g'); - - layerMerge = layer.merge(layerEnter) - .attr('class', 'serie'); - - - box = layerMerge.selectAll('rect') - .data(function (d) { return d.values; }); - - boxEnter = box.enter().append('rect'); - - boxMerge = box.merge(boxEnter) - .attr('width', function (d) { return x(d.end) - x(d.start); }) - .attr('x', function (d) { return x(d.start); }) - .attr('y', function (d) { return y(d.key); }) - .attr('fill', function (d) { return colorScale(parseInt(yLanesBand(d.key))); }) - .attr('height', function () { return 0.8 * yLanes(1); }); - - box = svg.selectAll('g.serie rect'); - - box - .on('mousedown.user', config.onDown) - .on('mouseup.user', config.onUp) - .on('mouseleave.user', config.onLeave) - .on('mouseover.user', config.onHover) - .on('click.user', config.onClick); - -}; - -TimeBoxset.prototype.render = function render (svg, config) { - //Do nothing, since lines render only when new data is received. -}; - -var SvgSwimlaneStrategy = (function (SvgAxis$$1) { - function SvgSwimlaneStrategy(context) { - SvgAxis$$1.call(this, context); - this.axes = new XYAxes('time', 'categorical', this.config); - this.boxs = new TimeBoxset(this.axes.x.xAxis, this.axes.y.yAxis); - this.legend = new Legend(); - - this.svgContainer - .add(this.axes) - .add(this.boxs) - .add(this.legend); - } - - if ( SvgAxis$$1 ) SvgSwimlaneStrategy.__proto__ = SvgAxis$$1; - SvgSwimlaneStrategy.prototype = Object.create( SvgAxis$$1 && SvgAxis$$1.prototype ); - SvgSwimlaneStrategy.prototype.constructor = SvgSwimlaneStrategy; - - SvgSwimlaneStrategy.prototype.draw = function draw (data) { - var svg = this.svgContainer.svg, - config = this.config, - dataFormat = this.config.xAxisFormat, - keys = d3$1.map(data, function (d) { return d.key; }).keys(), - bbox = null, - needRescaling = this.config.needRescaling; - - convertPropretiesToTimeFormat(data, ['start', 'end'], dataFormat); - - //rescale, if needed. - if (needRescaling) { - this.rescale(); - } - - bbox = this._getBBox(data); - - this.axes.updateDomainByBBoxAndKeys(bbox, keys); - this.axes.transition(svg, 200); - - this.boxs.update(svg, config, data); - this.legend.update(svg, config, data); - - }; - - SvgSwimlaneStrategy.prototype._getBBox = function _getBBox (data) { - return [ - d3$1.min(data, function (d) { return (d.start); }), - d3$1.max(data, function (d) { return (d.end); }) - ]; - }; - - - SvgSwimlaneStrategy.prototype._loadConfig = function _loadConfig (config) { - SvgAxis$$1.prototype._loadConfig.call(this, config, defaults$4); - return this; - }; - - return SvgSwimlaneStrategy; -}(SvgAxis)); - -var defaults$5 = { - selector: '#chart', - colorScale: diverging_spectral2(), - invertColorScale: true, - minLevel: 0, - maxLevel: 100, - minAngle: -90, - maxAngle: 90, - ringWidth: 50, - ringMargin: 20, - labelInset: 10, - needleNutRadius: 25, - needleLenghtRatio: 0.8, - numericIndicator: true, - label: 'km/h', - //margins - marginTop: 20, - marginRight: 250, - marginBottom: 30, - marginLeft: 50, - //Width & height - width: '50%', // %, auto, or numeric - height: 250, - ticks: 10, // ticks for y dial. -}; - -var Dial = function Dial(axisType, config) { - var this$1 = this; - - if (config === null) { - throw new Error('No chart context specified for polarAxis'); - } - - this.r = ( - (config.width > config.height) ? - config.height : config.width - ) / 2; - this.translation = (function () { return 'translate(' + this$1.r + ',' + this$1.r + ')'; } - ); - config.colorScale.domain([0, 1]); - - this.scale = d3$1.scaleLinear() - .domain([config.minLevel, config.maxLevel]) - .range([0, 1]); - - this.scaleMarks = this.scale.ticks(config.ticks); - - this.range = config.maxAngle - config.minAngle; - - this.arc = d3$1.arc() - .innerRadius(this.r - config.ringWidth - config.ringMargin) - .outerRadius(this.r - config.ringMargin) - .startAngle(function (d, i) { - var ratio = d * i; - return deg2rad(config.minAngle + (ratio * this$1.range)); - }) - .endAngle(function (d, i) { - var ratio = d * (i + 1); - return deg2rad(config.minAngle + (ratio * this$1.range)); - }); - - this.tickData = d3$1.range(config.ticks) - .map(function () { return 1 / config.ticks; }); -}; - -Dial.prototype.render = function render (svg, config) { - var this$1 = this; - - var labels = null; - - // Append the ring - var arcs = svg.append('g') - .attr('class', 'arc') - .attr('transform', this.translation); - - // Append the ring sectors - var arcPaths = arcs.selectAll('path') - .data(this.tickData) - .enter().append('path') - // ID for textPath linking - .attr('id', function (d, i) { return 'sector-' + i; }) - .attr('d', this.arc); - - // Fill colors - if (config.invertColorScale) { - arcPaths.attr('fill', function (d, i) { return config.colorScale(1 - d * i); }); - } else { - arcPaths.attr('fill', function (d, i) { return config.colorScale(d * i); }); - } - - // Apend the scale labels - labels = svg.append('g') - .attr('class', 'labels') - .attr('transform', this.translation); - - // // Append scale marker labels - labels.selectAll('text') - .data(this.scaleMarks) - .enter().append('text') - .attr('transform', function (d) { - var ratio = this$1.scale(d); - var newAngle = config.minAngle + (ratio * this$1.range); - return 'rotate(' + newAngle + ') translate(0,' + (config.labelInset - this$1.r) + ')'; - }) - .text(function (d) { return d; }) - .style('text-anchor', 'middle') - .style('font', '18px Montserrat, sans-serif'); -}; - -var DialNeedle = function DialNeedle(axisType, config) { - var this$1 = this; - - if (config === null) { - throw new Error('No chart context specified for polarAxis'); - } - - this.r = ( - (config.width > config.height) ? - config.height : config.width - ) / 2; - - this.needleLen = config.needleLenghtRatio * (this.r); - - this.translation = (function () { return 'translate(' + this$1.r + ',' + this$1.r + ')'; } - ); - config.colorScale.domain([0, 1]); - - this.scale = d3$1.scaleLinear() - .domain([config.minLevel, config.maxLevel]) - .range([0, 1]); - - this.angleScale = d3$1.scaleLinear() - .domain([config.minLevel, config.maxLevel]) - .range([90 + config.minAngle, 90 + config.maxAngle]); - - this.scaleMarks = this.scale.ticks(config.ticks); - - this.range = config.maxAngle - config.minAngle; - - this.arc = d3$1.arc() - .innerRadius(this.r - config.ringWidth - config.ringMargin) - .outerRadius(this.r - config.ringMargin) - .startAngle(function (d, i) { - var ratio = d * i; - return deg2rad(config.minAngle + (ratio * this$1.range)); - }) - .endAngle(function (d, i) { - var ratio = d * (i + 1); - return deg2rad(config.minAngle + (ratio * this$1.range)); - }); - - this.tickData = d3$1.range(config.ticks) - .map(function () { return 1 / config.ticks; }); -}; - -DialNeedle.prototype.update = function update (svg, config, data, method) { - var this$1 = this; - - var datum = data[data.length - 1]; - - this.needle - .transition() - .attr('transform', function (d) { return ("translate(" + (this$1.r) + ", " + (this$1.r) + ") rotate(" + (this$1.angleScale(datum.value) - 90) + ")"); }) - .attr('d', ("M " + (0 - config.needleNutRadius) + " " + (0) + " L " + (0) + " " + (0 - this.needleLen) + " L " + (config.needleNutRadius) + " " + (0))); -}; - -DialNeedle.prototype.render = function render (svg, config) { - var this$1 = this; - - // Update the needle - this.needle = svg.append('path') - .attr('class', 'needle') - .datum(0) - .attr('transform', function (d) { return ("translate(" + (this$1.r) + ", " + (this$1.r) + ") rotate(" + (this$1.angleScale(d) - 90) + ")"); }) - .attr('d', ("M " + (0 - config.needleNutRadius) + " " + (0) + " L " + (0) + " " + (0 - this.needleLen) + " L " + (config.needleNutRadius) + " " + (0))) - .style('fill', '#666666'); - - // Append needle nut - svg.append('circle') - .attr('class', 'needle') - .attr('transform', this.translation) - .attr('cx', 0) - .attr('cy', 0) - .attr('r', config.needleNutRadius) - .style('fill', '#666666'); -}; - -var TextIndicator = function TextIndicator(config) { - if (config === null) { - throw new Error('No chart context specified for polarAxis'); - } - - this.translation = config.textIndicatorTranslation; -}; - -TextIndicator.prototype.update = function update (svg, value, label) { - svg.select('.value') - .text(value); - svg.select('.label') - .text(label); -}; - -TextIndicator.prototype.render = function render (svg, config) { - var indicator = svg.append('g') - .attr('class', 'text-indicator') - .attr('pointer-events', 'none') - .style('text-anchor', 'middle') - .style('alignment-baseline', 'central'); - - if (this.translation) { - indicator.attr('transform', this.translation); - } - - indicator.append('text') - .attr('class', 'value') - .attr('x', 0) - .attr('y', 0) - .attr('pointer-events', 'none') - .text('0') - .style('font', '48px Montserrat, sans-serif') - .style('text-anchor', 'middle'); - - indicator.append('text') - .attr('class', 'label') - .attr('x', 0) - .attr('y', 0) - .attr('pointer-events', 'none') - .text('') - .style('font', '24px Montserrat, sans-serif') - .style('transform', 'translate(0, 1.5em') - .style('text-anchor', 'middle'); -}; - -var SvgGaugeStrategy = function SvgGaugeStrategy(context) { - this._loadConfig(context.config); - this.svgContainer = new SvgContainer(this.config); - var config = this.config; - - this.dial = new Dial('linear', config); - this.needle = new DialNeedle('linear', config); - - this.svgContainer - .add(this.dial) - .add(this.needle); - - if (config.numericIndicator) { - var r = ( - (config.width > config.height) ? - config.height : config.width - ) / 2; - var indicatorOffset = r + 75; - config.textIndicatorTranslation = 'translate(' + r + ',' + indicatorOffset + ')'; - this.textIndicator = new TextIndicator(config); - this.svgContainer.add(this.textIndicator); - } -}; - - /** - * Renders a gauge chart based on data object - * @param{Object} data Data Object. Contains a numeric value. - * - */ -SvgGaugeStrategy.prototype.draw = function draw (data) { - var datum = data[data.length - 1], - svg = this.svgContainer.svg, - config = this.config; - - this.needle.update(svg, config, data); - if (config.numericIndicator) { - this.textIndicator.update(svg, datum.value, config.label); - } -}; - - /** - * This method adds config options to the chart context. - * @param{Object} config Config object - */ -SvgGaugeStrategy.prototype._loadConfig = function _loadConfig (config) { - this.config = {}; - //Selector - this.config.selector = config.selector || defaults$5.selector; - //Margins - this.config.marginTop = config.marginTop || defaults$5.marginTop; - this.config.marginLeft = config.marginLeft || defaults$5.marginLeft; - this.config.marginRight = config.marginRight || defaults$5.marginRight; - this.config.marginBottom = config.marginBottom || defaults$5.marginBottom; - //Width & height - this.config.width = config.width ? - calculateWidth(config.width, this.config.selector) - this.config.marginLeft - this.config.marginRight - : calculateWidth(defaults$5.width, this.config.selector) - this.config.marginLeft - this.config.marginRight; - this.config.height = config.height || defaults$5.height; - - this.config.colorScale = config.colorScale || defaults$5.colorScale; - this.config.minLevel = config.minLevel || defaults$5.minLevel; - this.config.maxLevel = config.maxLevel || defaults$5.maxLevel; - this.config.minAngle = config.minAngle || defaults$5.minAngle; - this.config.maxAngle = config.maxAngle || defaults$5.maxAngle; - this.config.ticks = config.ticks || defaults$5.ticks; - this.config.ringWidth = config.ringWidth || defaults$5.ringWidth; - this.config.ringMargin = config.ringMargin || defaults$5.ringMargin; - this.config.labelInset = config.labelInset || defaults$5.labelInset; - this.config.needleNutRadius = config.needleNutRadius || defaults$5.needleNutRadius; - this.config.needleLenghtRatio = config.needleLenghtRatio || defaults$5.needleLenghtRatio; - this.config.invertColorScale = typeof (config.invertColorScale) === 'undefined' ? defaults$5.invertColorScale : config.invertColorScale; - this.config.numericIndicator = typeof (config.numericIndicator) === 'undefined' ? defaults$5.numericIndicator : config.numericIndicator; - this.config.label = config.label || defaults$5.label; - - - return this; -}; - -var defaults$6 = { - selector: '#chart', - width: '100%', // %, auto, or numeric - height: 250, - yAxisLabel: null, - //margins - marginTop: 20, - marginRight: 250, - marginBottom: 30, - marginLeft: 50, -}; - -var Nodeset = function Nodeset(config) { - var this$1 = this; - - this.config = config; - var width = config.width, - height = config.height; - - this.simulation = d3$1.forceSimulation() - .force("link", d3$1.forceLink().id(function (d) { return d.id; })) - .force("charge", d3$1.forceManyBody()) - .force("center", d3$1.forceCenter(width / 2, height / 2)); - - - this.dragstarted = function (d) { - if (!d3$1.event.active) { this$1.simulation.alphaTarget(0.3).restart(); } - d.fx = d.x; - d.fy = d.y; - }; - - this.dragged = function (d) { - d.fx = d3$1.event.x; - d.fy = d3$1.event.y; - }; - - this.dragended = function (d) { - if (!d3$1.event.active) { this$1.simulation.alphaTarget(0); } - d.fx = null; - d.fy = null; - }; - -}; - -Nodeset.prototype.update = function update (svg, config, data) { - var this$1 = this; - - data = simple2Linked(data); - - var link = svg.append("g") - .attr("class", "links") - .selectAll("line") - .data(data.links) - .enter().append("line") - .attr("stroke-width", 2) - .attr("stroke", "#999") - .attr("stroke-opacity", 0.6); - - var node = svg.append("g") - .attr("class", "nodes") - .selectAll("circle") - .data(data.nodes) - .enter() - .append("circle") - .attr("r", 5) - .attr("fill", function (d) { return "#23436f"; }) - .call(d3$1.drag() - .on("start", this.dragstarted) - .on("drag", this.dragged) - .on("end", this.dragended)); - - node.append("title") - .text(function (d) { return d.id; }); - - this.simulation.nodes(data.nodes).on("tick", function (e) { return this$1.ticked(link, node); }); - - this.simulation.force("link").links(data.links); -}; - -Nodeset.prototype.ticked = function ticked (link, node) { - link - .attr("x1", function (d) { return d.source.x; }) - .attr("y1", function (d) { return d.source.y; }) - .attr("x2", function (d) { return d.target.x; }) - .attr("y2", function (d) { return d.target.y; }); - - node - .attr("cx", function (d) { return d.x; }) - .attr("cy", function (d) { return d.y; }); -}; - -Nodeset.prototype.render = function render (svg, config) { - //Do nothing, since lines render only when new data is received. -}; - -var SvgNetworkgraphStrategy = function SvgNetworkgraphStrategy(context) { - this._loadConfig(context.config); - - this.svgContainer = new SvgContainer(this.config); - - this.nodeset = new Nodeset(this.config); - - //Include components in the chart container - this.svgContainer - .add(this.nodeset); -}; - - /** - * Renders a linechart based on data object - * @param{Object} data Data Object. Contains an array with x and y properties. - * - */ -SvgNetworkgraphStrategy.prototype.draw = function draw (data) { - var svg = this.svgContainer.svg, - config = this.config; - - this.nodeset.update(svg, config, data); -}; - -/** - * This method adds config options to the chart context. - * @param{Object} config Config object - */ -SvgNetworkgraphStrategy.prototype._loadConfig = function _loadConfig (config) { - this.config = {}; - this.config.selector = config.selector || defaults$6.selector; - //Margins - this.config.marginTop = config.marginTop || defaults$6.marginTop; - this.config.marginLeft = config.marginLeft || defaults$6.marginLeft; - this.config.marginRight = config.marginRight || defaults$6.marginRight; - this.config.marginBottom = config.marginBottom || defaults$6.marginBottom; - this.config.width = config.width ? calculateWidth(config.width, this.config.selector) - this.config.marginLeft - this.config.marginRight - : calculateWidth(defaults$6.width, this.config.selector) - this.config.marginLeft - this.config.marginRight; - this.config.height = config.height || defaults$6.height; - - return this; -}; - -var defaults$7 = { - selector: '#chart', - colorScale: category8(), - marginTop: 20, - marginRight: 20, - marginBottom: 30, - marginLeft: 50, - width: '50%', // %, auto, or numeric - height: 450, - tickLabel: '', - transitionDuration: 300, - maxNumberOfElements: 5, // used by keepDrawing to reduce the number of elements in the current chart - sortData: { - descending: false, - prop: 'x' - }, - //Events - onDown: function onDown(d) { - }, - onHover: function onHover(d) { - }, - onLeave: function onLeave(d) { - }, - onClick: function onClick(d) { - } -}; - -var XRadialAxis = function XRadialAxis(config) { - if (config === null) { - throw new Error('No chart context specified for XRadialAxis'); - } - - this.xRadialAxis = d3$1.scaleLinear().range([0, 2 * Math.PI]); -}; - -var YRadialAxis = function YRadialAxis(config) { - if (config === null) { - throw new Error('No chart context specified for XRadialAxis'); - } - - var radius = (Math.min(config.width, config.height) / 2) - 10; - - this.yRadialAxis = d3$1.scaleSqrt() - .range([0, radius]); -}; - -// -var RadialAxes = function RadialAxes(config) { - if (config === null) { - throw new Error('No chart context specified for RadialAxis'); - } - - this.x = new XRadialAxis(config); - this.y = new YRadialAxis(config); -}; - -var SunburstDisk = function SunburstDisk(xRadialAxis, yRadialAxis) { - var this$1 = this; - - this.x = xRadialAxis; - this.y = yRadialAxis; - this.arcGen = d3$1.arc() - .startAngle(function (d) { return Math.max(0, Math.min(2 * Math.PI, this$1.x(d.x0))); }) - .endAngle(function (d) { return Math.max(0, Math.min(2 * Math.PI, this$1.x(d.x1))); }) - .innerRadius(function (d) { return Math.max(0, this$1.y(d.y0)); }) - .outerRadius(function (d) { return Math.max(0, this$1.y(d.y1)); }); -}; - -SunburstDisk.prototype.update = function update (svg, config, data) { - var this$1 = this; - - - // Remove all the paths before redrawing - this._removePaths(svg); - - // Create layout partition - var root = d3$1.stratify() - .id(function (d) { return d.id; }) - .parentId(function (d) { return d.parent; }) - (data); - - root.sum(function (d) { return d.value; }); - d3$1.partition()(root); - - // Draw the paths (arcs) - var paths = svg.selectAll('path') - .data(root.descendants()) - .enter().append('path') - .attr('d', this.arcGen) - .style('fill', function (d) { - if (!d.parent) { - return 'white'; - } else { - return config.colorScale(d.data.label); - } - }) - .style('stroke', '#fff') - .style('stroke-width', '2') - .style('shape-rendering', 'crispEdge'); - - paths // TODO extract events to config? - .on('mouseover.default', function (d) { - var ancestors = this$1._getAncestors(d); - // Fade all the arcs - if (ancestors.length > 0) { - svg.selectAll('path') - .style('opacity', 0.3); - } - svg.selectAll('path') - .filter(function (node) { return ancestors.indexOf(node) >= 0; }) - .style('opacity', 1); - // Hightlight the hovered arc - svg.select('.text-indicator .label').text(d.data.label); - svg.select('.text-indicator .value').text(d.value); - }) - .on('mouseout.default', function (d) { - svg.selectAll('path').style('opacity', 1); - svg.select('.text-indicator .label').style('font-weight', 'normal'); - svg.select('.text-indicator .label').text(''); - svg.select('.text-indicator .value').text(''); - }) - ; - - paths - .on('mousedown.user', config.onDown) - .on('mouseup.user', config.onUp) - .on('mouseleave.user', config.onLeave) - .on('mouseover.user', config.onHover) - .on('click.user', config.onClick); - - // ??? - svg.select(self.frameElement).style('height', this.height + 'px'); -}; - -/** - * Removes all the paths (arcs). Doing this before each redraw prevents the - * transition to mess up the arcs. - * @private - */ -SunburstDisk.prototype._removePaths = function _removePaths (svg) { - svg.selectAll('path').remove(); -}; - -/** - * From: http://bl.ocks.org/kerryrodden/7090426 - * @param node - * @returns {Array} - * @private - */ -SunburstDisk.prototype._getAncestors = function _getAncestors (node) { - var path = []; - var current = node; - while (current.parent) { - path.unshift(current); - current = current.parent; - } - return path; -}; - -SunburstDisk.prototype.render = function render (svg, config) { - //Do nothing, since disk render only when new data is received. -}; - -var SvgSunburstStrategy = function SvgSunburstStrategy(context) { - this._loadConfig(context.config); - - this.svgContainer = new SvgContainer(this.config); - var config = - this.config, - translation = 'translate(' + config.width / 2 + ',' + (config.height / 2) + ')'; - - this.svgContainer.transform(translation); - - this.axes = new RadialAxes(config); - - this.disk = new SunburstDisk( - this.axes.x.xRadialAxis, - this.axes.y.yRadialAxis, - config - ); - - this.textIndicator = new TextIndicator(config); - - this.svgContainer - .add(this.disk) - .add(this.textIndicator); -}; - -SvgSunburstStrategy.prototype.draw = function draw (data) { - var svg = this.svgContainer.svg, - config = this.config; - - this.disk.update(svg, config, data); -}; - -/** - * This method adds config options to the chart context. - * @param{Object} config Config object - */ -SvgSunburstStrategy.prototype._loadConfig = function _loadConfig (config) { - this.config = {}; - //Selector - this.config.selector = config.selector || defaults$7.selector; - //Margins - this.config.marginTop = config.marginTop || defaults$7.marginTop; - this.config.marginLeft = config.marginLeft || defaults$7.marginLeft; - this.config.marginRight = config.marginRight || defaults$7.marginRight; - this.config.marginBottom = config.marginBottom || defaults$7.marginBottom; - //Width & height - this.config.width = config.width ? - calculateWidth(config.width, this.config.selector) - this.config.marginLeft - this.config.marginRight - : calculateWidth(defaults$7.width, this.config.selector) - this.config.marginLeft - this.config.marginRight; - this.config.height = config.height || defaults$7.height; - - this.config.colorScale = config.colorScale || defaults$7.colorScale; - - //Events - this.config.onDown = config.onDown || defaults$7.onDown; - this.config.onUp = config.onUp || defaults$7.onUp; - this.config.onHover = config.onHover || defaults$7.onHover; - this.config.onClick = config.onClick || defaults$7.onClick; - this.config.onLeave = config.onLeave || defaults$7.onLeave; - - return this; -}; - -var defaults$8 = { - selector: '#chart', - colorScale: category7(), - - //Axes - xAxisType: 'linear', - xAxisFormat: '.1f', - xAxisLabel: 'Sepal length (cm)', - yAxisType: 'linear', - yAxisFormat: '.1f', - yAxisLabel: 'Sepal width (cm)', - //margins - marginTop: 20, - marginRight: 250, - marginBottom: 130, - marginLeft: 150, - //markers - markerShape: 'dot', - markerSize: 3, - //Width & height - width: '100%', // %, auto, or numeric - height: 250, - //Events - onDown: function onDown(d) { - }, - onHover: function onHover(d) { - }, - onLeave: function onLeave(d) { - }, - onClick: function onClick(d) { - }, - - maxNumberOfElements: 100, // used by keepDrawing method to reduce the number of elements in the current chart -}; - -var SvgScatterplotStrategy = (function (SvgAxis$$1) { - function SvgScatterplotStrategy(context) { - SvgAxis$$1.call(this, context); - this.axes = new XYAxes(this.config.xAxisType, 'linear', this.config); - this.points = new Pointset(this.axes.x, this.axes.y); - this.legend = new Legend(); - //Include components in the chart container - this.svgContainer - .add(this.axes) - .add(this.legend) - .add(this.points); - } - - if ( SvgAxis$$1 ) SvgScatterplotStrategy.__proto__ = SvgAxis$$1; - SvgScatterplotStrategy.prototype = Object.create( SvgAxis$$1 && SvgAxis$$1.prototype ); - SvgScatterplotStrategy.prototype.constructor = SvgScatterplotStrategy; - - /** - * Renders a scatterplot based on data object - * @param {Object} data Data Object. Contains an array with x and y properties. - * - */ - SvgScatterplotStrategy.prototype.draw = function draw (data) { - var svg = this.svgContainer.svg, - config = this.config, - needRescaling = this.config.needRescaling, - bbox = null; - - // //Transform data, if needed - convertByXYFormat(data, config); - - //Sort data - sortByField(data, 'x'); - - //rescale, if needed. - if (needRescaling) { - this.rescale(); - } - - bbox = this._getDomainBBox(data); - - this.axes.updateDomainByBBox(bbox); - - //Create a transition effect for dial rescaling - this.axes.transition(svg, 200); - - // Update legend - this.legend.update(svg, config, data); - - // Update points - this.points.update(svg, config, data); - }; - - SvgScatterplotStrategy.prototype._getDomainBBox = function _getDomainBBox (data) { - var minX = d3$1.min(data, function (d) { return d.x; }), - maxX = d3$1.max(data, function (d) { return d.x; }), - minY = d3$1.min(data, function (d) { return d.y; }), - maxY = d3$1.max(data, function (d) { return d.y; }); - return [minX, maxX, minY, maxY]; - }; - - SvgScatterplotStrategy.prototype._checkMarkers = function _checkMarkers (config) { - return config.markerSize > 0; - }; - SvgScatterplotStrategy.prototype._checkArea = function _checkArea (config) { - return config.areaOpacity > 0; - }; - - /** - * This method adds config options to the chart context. - * @param {Object} config Config object - */ - SvgScatterplotStrategy.prototype._loadConfig = function _loadConfig (config) { - SvgAxis$$1.prototype._loadConfig.call(this, config, defaults$8); - //Markers - this.config.markerOutlineWidth = config.markerOutlineWidth || defaults$8.markerOutlineWidth; - this.config.markerShape = config.markerShape || defaults$8.markerShape; - this.config.markerSize = (typeof config.markerSize === 'undefined' || config.markerSize < 0) ? defaults$8.markerSize : config.markerSize; - //Area - this.config.areaOpacity = (typeof config.areaOpacity === 'undefined' || config.markerSize < 0) ? defaults$8.areaOpacity : config.areaOpacity; - return this; - }; - - return SvgScatterplotStrategy; -}(SvgAxis)); - -/** - * SvgStrategy wrapper class - */ -var SvgStrategy = function SvgStrategy(strategy) { - this.strategy = strategy; - }; - SvgStrategy.prototype.draw = function draw (data) { - this.strategy.draw(data); - }; - SvgStrategy.prototype.on = function on (events){ - this.strategy.on(events); - }; - -var strategies = { - Barchart: function Barchart(chartContext) { - return new SvgBarchartStrategy(chartContext); - }, - Linechart: function Linechart(chartContext) { - return new SvgLinechartStrategy(chartContext); - }, - Streamgraph: function Streamgraph(chartContext) { - return new SvgStreamgraphStrategy(chartContext); - }, - Gauge: function Gauge(chartContext) { - return new SvgGaugeStrategy(chartContext); - }, - Scatterplot: function Scatterplot(chartContext) { - return new SvgScatterplotStrategy(chartContext); - }, - Sunburst: function Sunburst(chartContext) { - return new SvgSunburstStrategy(chartContext); - }, - Swimlane: function Swimlane(chartContext) { - return new SvgSwimlaneStrategy(chartContext); - }, - StackedArea: function StackedArea(chartContext) { - return new SvgStackedAreaStrategy(chartContext); - }, - Networkgraph: function Networkgraph(chartContext) { - return new SvgNetworkgraphStrategy(chartContext); - } -}; - -var doctype = ''; - -function isExternal(url) { - return url && url.lastIndexOf('http', 0) === 0 && url.lastIndexOf(window.location.host) === -1; -} - -function inlineImages(el, callback) { - var images = el.querySelectorAll('image'); - var left = images.length; - if (left === 0) { - callback(); - } - for (var i = 0; i < images.length; i++) { - (function (image) { - var href = image.getAttribute('xlink:href'); - if (href) { - if (isExternal(href.value)) { - window.console.warn('Cannot render embedded images linking to external hosts: ' + href.value); - return; - } - } - var canvas = window.document.createElement('canvas'); - var ctx = canvas.getContext('2d'); - var img = new window.Image(); - href = href || image.getAttribute('href'); - img.src = href; - img.onload = function () { - canvas.width = img.width; - canvas.height = img.height; - ctx.drawImage(img, 0, 0); - image.setAttribute('xlink:href', canvas.toDataURL('image/png')); - left--; - if (left === 0) { - callback(); - } - }; - img.onerror = function () { - window.console.error('Could not load ' + href); - left--; - if (left === 0) { - callback(); - } - }; - })(images[i]); - } -} - -function styles(el, selectorRemap) { - var css = ''; - var sheets = document.styleSheets; - for (var i = 0; i < sheets.length; i++) { - if (isExternal(sheets[i].href)) { - window.console.warn('Cannot include styles from other hosts: ' + sheets[i].href); - continue; - } - var rules = sheets[i].cssRules; - if (rules !== null) { - for (var j = 0; j < rules.length; j++) { - var rule = rules[j]; - if (typeof (rule.style) !== 'undefined') { - var match = null; - try { - match = el.querySelector(rule.selectorText); - } catch (err) { - window.console.warn('Invalid CSS selector "' + rule.selectorText + '"', err); - } - if (match) { - var selector = selectorRemap ? selectorRemap(rule.selectorText) : rule.selectorText; - css += selector + ' { ' + rule.style.cssText + ' }\n'; - } else if (rule.cssText.match(/^@font-face/)) { - css += rule.cssText + '\n'; - } - } - } - } - } - return css; -} - -function svgAsDataUri(el, options, cb) { - options = options || {}; - options.scale = options.scale || 1; - var xmlns = 'http://www.w3.org/2000/xmlns/'; - - inlineImages(el, function () { - var outer = document.createElement('div'); - var clone = el.cloneNode(true); - var width, height; - if (el.tagName === 'svg') { - width = parseInt(clone.getAttribute('width') || clone.style.width || getComputedStyle(el).getPropertyValue('width')); - height = parseInt(clone.getAttribute('height') || clone.style.height || getComputedStyle(el).getPropertyValue('height')); - } else { - var box = el.getBBox(); - width = box.x + box.width; - height = box.y + box.height; - clone.setAttribute('transform', clone.getAttribute('transform').replace(/translate\(.*?\)/, '')); - - var svg$1 = document.createElementNS('http://www.w3.org/2000/svg', 'svg'); - svg$1.appendChild(clone); - clone = svg$1; - } - - clone.setAttribute('version', '1.1'); - clone.setAttributeNS(xmlns, 'xmlns', 'http://www.w3.org/2000/svg'); - clone.setAttributeNS(xmlns, 'xmlns:xlink', 'http://www.w3.org/1999/xlink'); - clone.setAttribute('width', width * options.scale); - clone.setAttribute('height', height * options.scale); - clone.setAttribute('viewBox', '0 0 ' + width + ' ' + height); - outer.appendChild(clone); - - var css = styles(el, options.selectorRemap); - var s = document.createElement('style'); - s.setAttribute('type', 'text/css'); - s.innerHTML = ''; - var defs = document.createElement('defs'); - defs.appendChild(s); - clone.insertBefore(defs, clone.firstChild); - - var svg = doctype + outer.innerHTML; - var uri = 'data:image/svg+xml;base64,' + window.btoa(window.unescape(encodeURIComponent(svg))); - if (cb) { - cb(uri); - } - }); -} - -/** - * Base class, which includes common methods for all the charts - * @export Chart - * @class Chart - */ -var Chart = function Chart(d, config) { - var clazz = this.constructor.name; - if (clazz === 'Chart') { - throw new Error(clazz + ' is non-instanciable'); - } - - this.events = {}; - - if (!d && !config) { - throw new Error('Missing constructor parameters'); - } - - var dataFormat = d.constructor.name; - var nArguments = (d && config) ? 2 : 1; - - switch (dataFormat) { - case 'WebsocketDatasource': - case 'HTTPDatasource': - this.datasource = d; - this.data = []; - this._configureDatasource(); - break; - case 'Array': - this.data = d; - break; - default: - throw TypeError('Wrong data format'); - } - //if only 1 parameter is specified, take default config. Else, take the second argument as config. - this.config = (nArguments === 1) ? {} : config; - - this._initializeSVGContext(); -}; - -/** - * Private method. Initialize the API by dinamically creating methods. It creates N method, one per configuration option - * - * @param {any} properties An array that contains the name of the methods - * - * @memberOf Chart - */ -Chart.prototype._initializeAPI = function _initializeAPI (properties) { - var clazz = this.constructor; - properties.forEach(function (method) { - clazz.prototype[method] = function (value) { - return this.change(method, value); - }; - }); -}; - -/** - * Return the chart context: data, configuration and type - * - * @returns chart Chart context - * - * @memberOf Chart - */ -Chart.prototype._getChartContext = function _getChartContext () { - return { - data: this.data, - config: this.config, - cType: this.constructor.name - }; -}; - -/** - * Initialize the SVG context, by dinamically creating an tag in the specified selector. It is automatically invoked - * by the chart constructor and should not be used outside of this instance. - * - * @memberOf Chart - */ -Chart.prototype._initializeSVGContext = function _initializeSVGContext () { - this._svg = new SvgStrategy(strategies[this.constructor.name](this._getChartContext())); -}; - -/** - * Paint data into the chart. If no data is specified, it takes by default the last dataset (very useful when repaintng charts ) - * - * @param {any} data Data to be painted - * - * @memberOf Chart - */ -Chart.prototype.draw = function draw (data) { - if ( data === void 0 ) data = this.data; - - this._svg.draw(data); -}; - -/** - * Make and download an image of the current state of the chart. - * - * @memberOf Chart - */ -Chart.prototype.download = function download () { - var this$1 = this; - - var selector = this._svg.strategy.config.selector + ' ' + 'svg'; - svgAsDataUri(d3.select(selector).node(), {}, function (uri, err) { - if (err) { - throw Error('Error converting to image ' + err); - } - else { - var link = document.createElement('a'); - link.style = 'position: fixed; left -10000px;'; // making it invisible - link.href = uri; - link.download = this$1.constructor.name + '.svg'; - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); - } - }); -}; - -Chart.prototype._keepDrawingByAdding = function _keepDrawingByAdding (datum) { - var datumType = datum.constructor; - - if (datumType === Array) { - this.data = this.data.concat(datum); - } - else { - this.data.push(datum); - } - this.draw(JSON.parse(JSON.stringify(this.data))); -}; - - -/** - * - * This method add a data record / array of data into the current data. - * @param {any} datum - * @param {any} method - * - * @memberOf Chart - - */ -Chart.prototype.keepDrawing = function keepDrawing (datum, method) { - if (method === 'add') { - this._keepDrawingByAdding(datum); - } - else { - this._keepDrawingByReplacing(datum); - } -}; - -Chart.prototype._configureDatasource = function _configureDatasource () { - var this$1 = this; - - this.dispatcher = d3$1.dispatch('onmessage', 'onopen', 'onerror'); - - this.datasource.configure(this.dispatcher); - - this.dispatcher.on('onmessage', function (data) { return this$1.keepDrawing(data); }); - //this.dispatcher.on('onmessage', (data) => console.log(data)); - - - this.dispatcher.on('onopen', function (event$$1) { - console.log('onopen', event$$1); - }); - - this.dispatcher.on('onerror', function (error) { - console.log('onerror', error); - }); -}; - -/** - * Change a configuration property. They all are also available through a method with the same name of the property. - * - * @param {any} property property name - * @param {any} value the new property value - * @returns the instance of the current chart - * - * @memberOf Chart - */ -Chart.prototype.change = function change (property, value) { - this._svg.strategy.changeConfigProperty(property, value); - return this; -}; - -/** - * Linechart implementation. This charts belongs to 'Basic' family. - * It is inherited on 'Basic'. - */ -var Linechart$1 = (function (Chart$$1) { - function Linechart(data, config) { - Chart$$1.call(this, data, config); - var keys = Object.keys(defaults); - this._initializeAPI(keys); - } - - if ( Chart$$1 ) Linechart.__proto__ = Chart$$1; - Linechart.prototype = Object.create( Chart$$1 && Chart$$1.prototype ); - Linechart.prototype.constructor = Linechart; - - /** - * Renders a data object on the chart. - * @param {Object} data This object contains the data that will be rendered on chart. If you do not - * specify this param, this.data will be used instead. - */ - Linechart.prototype.draw = function draw (data) { - if ( data === void 0 ) data = this.data; - - Chart$$1.prototype.draw.call(this, data); - }; - - /** - * Add new data to the current graph. If it is empty, this creates a new one. - * @param {Object} datum data to be rendered - */ - Linechart.prototype.keepDrawing = function keepDrawing (datum) { - Chart$$1.prototype.keepDrawing.call(this, datum, 'add'); - }; - - return Linechart; -}(Chart)); - -/** - * Barchart implementation. This charts belongs to 'Basic' family. - * It is inherited on 'Basic'. - */ -var Barchart$1 = (function (Chart$$1) { - function Barchart(data, config) { - Chart$$1.call(this, data, config); - var keys = Object.keys(defaults); - this._initializeAPI(keys); - } - - if ( Chart$$1 ) Barchart.__proto__ = Chart$$1; - Barchart.prototype = Object.create( Chart$$1 && Chart$$1.prototype ); - Barchart.prototype.constructor = Barchart; - - /** - * Renders a data object on the chart. - * @param {Object} data - This object contains the data that will be rendered on chart. If you do not - * specify this param, this.data will be used instead. - */ - Barchart.prototype.draw = function draw (data) { - if ( data === void 0 ) data = this.data; - - Chart$$1.prototype.draw.call(this, data); - }; - - Barchart.prototype.fire = function fire (event$$1, data) {//TODO: improve this section - if (event$$1 === 'transition') { - if (data === 'grouped') { - this._svg.strategy.transition2Grouped(); - } - else if (data === 'stacked') { - this._svg.strategy.transition2Stacked(); - } - - this._svg.strategy.draw(); - } - }; - - /** - * Add new data to the current graph. If it is empty, this creates a new one. - * @param {Object} datum - data to be rendered - */ - Barchart.prototype.keepDrawing = function keepDrawing (datum) { - Chart$$1.prototype.keepDrawing.call(this, datum, 'replace'); - }; - - Barchart.prototype._keepDrawingByReplacing = function _keepDrawingByReplacing (datum) { - var this$1 = this; - - var datumType = datum.constructor; - if (datumType === Array) { - this.data = datum; - } - else { - for (var i = 0; i < this.data.length; i++) { - var d = this$1.data[i]; - if (d.x === datum.x) { - this$1.data[i] = datum; - break; - } - } - } - - this.draw(JSON.parse(JSON.stringify(this.data))); - }; - - return Barchart; -}(Chart)); - -/** - * Streamgraph implementation. This charts belongs to 'Flow' family. - * It is inherited on 'Flow'. - */ -var Streamgraph$1 = (function (Chart$$1) { - function Streamgraph(data, config) { - Chart$$1.call(this, data, config); - var keys = Object.keys(defaults$2); - this._initializeAPI(keys); - } - - if ( Chart$$1 ) Streamgraph.__proto__ = Chart$$1; - Streamgraph.prototype = Object.create( Chart$$1 && Chart$$1.prototype ); - Streamgraph.prototype.constructor = Streamgraph; - - /** - * Renders a data object on the chart. - * @param {Object} data This object contains the data that will be rendered on chart. If you do not - * specify this param, this.data will be used instead. - */ - Streamgraph.prototype.draw = function draw (data) { - if ( data === void 0 ) data = this.data; - - Chart$$1.prototype.draw.call(this, data); - }; - - /** - * Add new data to the current graph. If it is empty, this creates a new one. - * @param {Object} datum data to be rendered - */ - Streamgraph.prototype.keepDrawing = function keepDrawing (datum) { - Chart$$1.prototype.keepDrawing.call(this, datum, 'add'); - }; - - return Streamgraph; -}(Chart)); - -/** - * StackedArea implementation. This charts belongs to 'Flow' family. - * It is inherited on 'Flow'. - */ -var StackedArea$1 = (function (Chart$$1) { - function StackedArea(data, config) { - Chart$$1.call(this, data, config); - var keys = Object.keys(defaults$3); - this._initializeAPI(keys); - } - - if ( Chart$$1 ) StackedArea.__proto__ = Chart$$1; - StackedArea.prototype = Object.create( Chart$$1 && Chart$$1.prototype ); - StackedArea.prototype.constructor = StackedArea; - - /** - * Renders a data object on the chart. - * @param {Object} data This object contains the data that will be rendered on chart. If you do not - * specify this param, this.data will be used instead. - */ - StackedArea.prototype.draw = function draw (data) { - if ( data === void 0 ) data = this.data; - - Chart$$1.prototype.draw.call(this, data); - }; - - /** - * Add new data to the current graph. If it is empty, this creates a new one. - * @param {Object} datum data to be rendered - */ - StackedArea.prototype.keepDrawing = function keepDrawing (datum) { - if (!this.datum) { - this.datum = []; - } - this.datum = this.datum.concat(datum); - Chart$$1.prototype.draw.call(this, this.datum); - }; - - return StackedArea; -}(Chart)); - -/** - * Linechart implementation. This charts belongs to 'Basic' family. - * It is inherited on 'Basic'. - */ -var Swimlane$1 = (function (Chart$$1) { - function Swimlane(data, config) { - Chart$$1.call(this, data, config); - var keys = Object.keys(defaults$4); - this._initializeAPI(keys); - } - - if ( Chart$$1 ) Swimlane.__proto__ = Chart$$1; - Swimlane.prototype = Object.create( Chart$$1 && Chart$$1.prototype ); - Swimlane.prototype.constructor = Swimlane; - - /** - * Renders a data object on the chart. - * @param {Object} data This object contains the data that will be rendered on chart. If you do not - * specify this param, this.data will be used instead. - */ - Swimlane.prototype.draw = function draw (data) { - if ( data === void 0 ) data = this.data; - - Chart$$1.prototype.draw.call(this, data); - }; - - /** - * Add new data to the current graph. If it is empty, this creates a new one. - * @param {Object} datum data to be rendered - */ - Swimlane.prototype.keepDrawing = function keepDrawing (datum) { - Chart$$1.prototype.keepDrawing.call(this, datum, 'add'); - }; - - return Swimlane; -}(Chart)); - -/** - * Gauge implementation. This charts belongs to 'Basic' family. - * It is inherited on 'Basic'. - */ -var Gauge$1 = (function (Chart$$1) { - function Gauge(data, config) { - Chart$$1.call(this, data, config); - } - - if ( Chart$$1 ) Gauge.__proto__ = Chart$$1; - Gauge.prototype = Object.create( Chart$$1 && Chart$$1.prototype ); - Gauge.prototype.constructor = Gauge; - - /** - * Renders a data object on the chart. - * @param {Object} data This object contains the data that will be rendered on chart. If you do not - * specify this param, this.data will be used instead. - */ - Gauge.prototype.draw = function draw (data) { - if ( data === void 0 ) data = this.data; - - Chart$$1.prototype.draw.call(this, data); - }; - - - /** - * Add new data to the current graph. If it is empty, this creates a new one. - * @param {Object} datum data to be rendered - */ - Gauge.prototype.keepDrawing = function keepDrawing (datum) { - this.data = [datum[0]]; - Chart$$1.prototype.draw.call(this); - }; - - return Gauge; -}(Chart)); - -/** - * Scatterplot implementation. This charts belongs to 'Basic' family. - * It is inherited on 'Basic'. - */ -var Scatterplot$1 = (function (Chart$$1) { - function Scatterplot(data, config) { - Chart$$1.call(this, data, config); - var keys = Object.keys(defaults$8); - this._initializeAPI(keys); - } - - if ( Chart$$1 ) Scatterplot.__proto__ = Chart$$1; - Scatterplot.prototype = Object.create( Chart$$1 && Chart$$1.prototype ); - Scatterplot.prototype.constructor = Scatterplot; - - /** - * Renders a data object on the chart. - * @param {Object} data This object contains the data that will be rendered on chart. If you do not - * specify this param, this.data will be used instead. - */ - Scatterplot.prototype.draw = function draw (data) { - if ( data === void 0 ) data = this.data; - - Chart$$1.prototype.draw.call(this, data); - }; - - /** - * Add new data to the current graph. If it is empty, this creates a new one. - * @param {Object} datum data to be rendered - */ - Scatterplot.prototype.keepDrawing = function keepDrawing (datum) { - Chart$$1.prototype.keepDrawing.call(this, datum, 'add'); - }; - - return Scatterplot; -}(Chart)); - -/** - * Sunburst implementation. This charts belongs to 'Hierarchical' family. - */ -var Sunburst$1 = (function (Chart$$1) { - function Sunburst(data, config) { - Chart$$1.call(this, data, config); - } - - if ( Chart$$1 ) Sunburst.__proto__ = Chart$$1; - Sunburst.prototype = Object.create( Chart$$1 && Chart$$1.prototype ); - Sunburst.prototype.constructor = Sunburst; - - /** - * Renders a data object on the chart. - * @param {Object} data This object contains the data that will be rendered on chart. If you do not - * specify this param, this.data will be used instead. - */ - Sunburst.prototype.draw = function draw (data) { - if ( data === void 0 ) data = this.data; - - Chart$$1.prototype.draw.call(this, data); - }; - - /** - * Add new data to the current graph. If it is empty, this creates a new one. - * @param {Object} datum data to be rendered - */ - Sunburst.prototype.keepDrawing = function keepDrawing (datum) { - Chart$$1.prototype.keepDrawing.call(this, datum, 'add'); - }; - - // /** - // * Add new data to the current graph. If it is empty, this creates a new one. - // * @param {Object} datum data to be rendered - // */ - // keepDrawing(datum) { - // if (this.data.constructor === Array) { this.data = {}; } - // let config = this.config; - // if (!datum) { - // console.warn('attemp to draw null datum'); - // return; - // } - // - // this._buildTree(datum[datum.length - 1].path, datum[datum.length - 1].value, this.data); - // - // this.draw(); - // - // return this.data; - // } - - /** - * Inserts the new nodes into the existing tree. - * From: http://bl.ocks.org/kerryrodden/7090426 - * - * @param pathString - * @param value - * @param data - * @private - */ - Sunburst.prototype._buildTree = function _buildTree (pathString, value, data) { - var path = pathString.split('/'); - var current = data; - for (var i = 1; i < path.length; i++) { - var children = current.children; - var name = path[i]; - var child; - if (i + 1 < path.length) { - var foundChild = false; - for (var j = 0; children !== undefined && j < children.length; j++) { - if (children[j].name === name) { - child = children[j]; - foundChild = true; - break; - } - } - if (!foundChild) { - child = { - 'name': name, - 'children': [] - }; - if (children === undefined) { - current.children = []; - } - delete current.value; - current.children.push(child); - } - current = child; - } else { - child = { - 'name': name, - 'value': value - }; - if (children === undefined) { - current.children = []; - } - delete current.value; - current.children.push(child); - } - } - }; - - return Sunburst; -}(Chart)); - -/** - * Linechart implementation. This charts belongs to 'Basic' family. - * It is inherited on 'Basic'. - */ -var Networkgraph$1 = (function (Chart$$1) { - function Networkgraph(data, config) { - Chart$$1.call(this, data, config); - var keys = Object.keys(defaults$6); - this._initializeAPI(keys); - } - - if ( Chart$$1 ) Networkgraph.__proto__ = Chart$$1; - Networkgraph.prototype = Object.create( Chart$$1 && Chart$$1.prototype ); - Networkgraph.prototype.constructor = Networkgraph; - - /** - * Renders a data object on the chart. - * @param {Object} data This object contains the data that will be rendered on chart. If you do not - * specify this param, this.data will be used instead. - */ - Networkgraph.prototype.draw = function draw (data) { - if ( data === void 0 ) data = this.data; - - Chart$$1.prototype.draw.call(this, data); - }; - - /** - * Add new data to the current graph. If it is empty, this creates a new one. - * @param {Object} datum data to be rendered - */ - Networkgraph.prototype.keepDrawing = function keepDrawing (datum) { - Chart$$1.prototype.keepDrawing.call(this, datum, 'add'); - }; - - return Networkgraph; -}(Chart)); - -exports.Datasource = Datasource; -exports.HTTPDatasource = HTTPDatasource; -exports.WebsocketDatasource = WebsocketDatasource; -exports.Linechart = Linechart$1; -exports.Barchart = Barchart$1; -exports.Streamgraph = Streamgraph$1; -exports.StackedArea = StackedArea$1; -exports.Swimlane = Swimlane$1; -exports.Gauge = Gauge$1; -exports.Scatterplot = Scatterplot$1; -exports.Sunburst = Sunburst$1; -exports.Networkgraph = Networkgraph$1; -exports.category1 = category1; -exports.category2 = category2; -exports.category3 = category3; -exports.category4 = category4; -exports.category5 = category5; -exports.category6 = category6; -exports.category7 = category7; -exports.category8 = category8; -exports.sequentialYellow = sequentialYellow; -exports.sequentialRedOrange = sequentialRedOrange; -exports.sequentialRed = sequentialRed; -exports.sequentialPink = sequentialPink; -exports.sequentialPurplePink = sequentialPurplePink; -exports.sequentialPurple = sequentialPurple; -exports.sequentialBlue = sequentialBlue; -exports.sequentialLightBlue = sequentialLightBlue; -exports.sequentialBlueViolet = sequentialBlueViolet; -exports.sequentialTurquoise = sequentialTurquoise; -exports.sequentialLightGreen = sequentialLightGreen; -exports.sequentialDarkGreen = sequentialDarkGreen; -exports.sequentialGreenBrown = sequentialGreenBrown; -exports.sequentialBrown = sequentialBrown; -exports.sequentialGrey = sequentialGrey; -exports.sequentialVioletCb = sequentialVioletCb; -exports.sequentialPinkCb = sequentialPinkCb; -exports.sequentialBlueCb = sequentialBlueCb; -exports.sequentialGreenCb = sequentialGreenCb; -exports.sequentialGreenBrownCb = sequentialGreenBrownCb; -exports.diverging_spectral1 = diverging_spectral1; -exports.diverging_spectral2 = diverging_spectral2; -exports.diverging_spectral3 = diverging_spectral3; -exports.diverging_brown_turquoise = diverging_brown_turquoise; -exports.diverging_orange_pink = diverging_orange_pink; -exports.diverging_red_blue = diverging_red_blue; -exports.diverging_red_grey = diverging_red_grey; -exports.diverging_orange_violet = diverging_orange_violet; -exports.diverging_purple_green = diverging_purple_green; -exports.diverging_violet_green = diverging_violet_green; -exports.diverging_red_green = diverging_red_green; -exports.diverging_brown_green = diverging_brown_green; -exports.diverging_lightBrown_turquoise = diverging_lightBrown_turquoise; +'use strict'; + +Object.defineProperty(exports, '__esModule', { value: true }); + +var d3 = require('d3'); + +function __extends(d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +} + +var SvgContext = (function () { + function SvgContext(strategy, config) { + this.strategy = strategy; + this.strategy.setConfig(config); + this.strategy.initialize(); + } + SvgContext.prototype.draw = function (data) { + this.strategy.draw(data); + }; + SvgContext.prototype.addLoading = function () { + this.strategy.addLoading(); + }; + SvgContext.prototype.removeLoading = function () { + this.strategy.removeLoading(); + }; + return SvgContext; +}()); + +var Config = (function () { + function Config() { + this.properties = {}; + } + Config.prototype.put = function (key, value) { + this.properties[key] = value; + return this; + }; + Config.prototype.get = function (key) { + return this.properties[key]; + }; + return Config; +}()); + +function isNumeric(n) { + return !isNaN(parseFloat(n)) && isFinite(n); +} + +function isPercentage(n) { + var split = null; + var number = null; + if (!n || typeof n !== 'string') { + return false; + } + split = n.split('%'); + number = (+split[0]); + return split.length === 2 && + (number >= 0) && + (number <= 100); +} + + + +function copy(object) { + return object != null ? JSON.parse(JSON.stringify(object)) : null; +} +function deg2rad(deg) { + return deg * Math.PI / 180; +} + +function calculateWidth(widthConfig, selector) { + if (widthConfig === 'auto') { + return d3.select(selector) + .node() + .getBoundingClientRect() + .width; + } + else if (isNumeric(widthConfig)) { + return widthConfig; + } + else if (isPercentage(widthConfig)) { + var containerWidth = void 0, percentage = void 0; + containerWidth = d3.select(selector) + .node() + .getBoundingClientRect() + .width; + percentage = widthConfig.split('%')[0]; + return Math.round(percentage * containerWidth / 100); + } + else { + throw Error('Unknow config width value: ' + widthConfig); + } +} + +var Chart = (function () { + function Chart(strategy, data, userConfig, defaults) { + this.ds = null; + this.dispatcher = d3.dispatch('onmessage', 'onopen', 'onerror', 'addLoading', 'removeLoading'); + this.config = this.loadConfigFromUser(userConfig, defaults); + this.context = new SvgContext(strategy, this.config); + this.data = data; + } + Chart.prototype.draw = function (data) { + if (data === void 0) { data = this.data; } + this.context.draw(copy(data)); + this.data = data; + }; + Chart.prototype.datasource = function (ds) { + var _this = this; + this.ds = ds; + this.ds.configure(this.dispatcher); + this.dispatcher.on('addLoading', function () { return _this.context.addLoading(); }); + this.dispatcher.on('removeLoading', function () { return _this.context.removeLoading(); }); + this.dispatcher.on('onmessage', function (data) { return _this.keepDrawing(data); }); + this.dispatcher.on('onopen', function (event$$1) { + console.log('onopen', event$$1); + }); + this.dispatcher.on('onerror', function (error) { + console.log('onerror', error); + }); + }; + Chart.prototype.loadConfigFromUser = function (userData, defaults) { + var config = new Config(); + for (var v in defaults) { + config.put(v, (v in userData) ? userData[v] : defaults[v]); + } + var width = config.get('width'); + width = calculateWidth(width, config.get('selector')) - config.get('marginLeft') - config.get('marginRight'); + config.put('width', width); + return config; + }; + return Chart; +}()); + +var Component = (function () { + function Component() { + } + Component.prototype.configure = function (config, svg) { + this.config = config; + this.svg = svg; + }; + Component.prototype.clean = function () { + this.svg.selectAll('.serie').remove(); + }; + return Component; +}()); + +var XAxis = (function (_super) { + __extends(XAxis, _super); + function XAxis() { + return _super.call(this) || this; + } + XAxis.prototype.render = function () { + var width = this.config.get('width'), height = this.config.get('height'), xAxisFormat = this.config.get('xAxisFormat'), xAxisType = this.config.get('xAxisType'), xAxisLabel = this.config.get('xAxisLabel'), xAxisGrid = this.config.get('xAxisGrid'); + this.initializeXAxis(width, height, xAxisFormat, xAxisType, xAxisGrid); + this.svg + .append('g') + .attr('class', "x axis " + xAxisType) + .attr('transform', 'translate(0,' + height + ')') + .call(this._xAxis); + this.svg + .append('text') + .attr('class', 'xaxis-title') + .attr("text-anchor", "middle") + .attr('x', width / 2) + .attr('y', height + 40) + .text(xAxisLabel) + .style('font', '0.8em Montserrat, sans-serif'); + }; + XAxis.prototype.update = function (data) { + var _this = this; + var propertyX = this.config.get('propertyX'); + var xAxisType = this.config.get('xAxisType'); + if (xAxisType === 'linear') { + var min$$1 = d3.min(data, function (d) { return d[propertyX]; }), max$$1 = d3.max(data, function (d) { return d[propertyX]; }); + this.updateDomainByMinMax(min$$1, max$$1); + } + else if (xAxisType === 'time') { + var min$$1 = d3.min(data, function (d) { return (d[propertyX] || d[_this.config.get('propertyStart')]); }), max$$1 = d3.max(data, function (d) { return (d[propertyX] || d[_this.config.get('propertyEnd')]); }); + this.updateDomainByMinMax(min$$1, max$$1); + } + else { + var keys = d3.map(data, function (d) { return d[propertyX]; }).keys(); + this.updateDomainByKeys(keys); + } + this.transition(); + }; + XAxis.prototype.updateDomainByKeys = function (keys) { + this._xAxis.scale().domain(keys); + }; + XAxis.prototype.updateDomainByMinMax = function (min$$1, max$$1) { + this._xAxis.scale().domain([min$$1, max$$1]); + }; + XAxis.prototype.transition = function (time) { + if (time === void 0) { time = 200; } + this.svg.selectAll('.x.axis').transition().duration(time).call(this._xAxis); + this.svg.select('.x.axis path').raise(); + }; + XAxis.prototype.initializeXAxis = function (width, height, xAxisFormat, xAxisType, xAxisGrid) { + switch (xAxisType) { + case 'time': + this._xAxis = d3.axisBottom(d3.scaleTime().range([0, width])); + break; + case 'linear': + this._xAxis = d3.axisBottom(d3.scaleLinear().range([0, width])) + .tickFormat(d3.format(xAxisFormat)); + break; + case 'categorical': + this._xAxis = d3.axisBottom(d3.scaleBand().rangeRound([0, width]) + .padding(0.1).align(0.5)); + break; + default: + throw new Error('Not allowed type for XAxis. Only allowed "time", "linear" or "categorical". Got: ' + xAxisType); + } + if (xAxisGrid) { + this._xAxis + .tickSizeInner(-height) + .tickPadding(9); + } + }; + Object.defineProperty(XAxis.prototype, "xAxis", { + get: function () { + return this._xAxis; + }, + enumerable: true, + configurable: true + }); + return XAxis; +}(Component)); + +var Globals = (function () { + function Globals() { + } + return Globals; +}()); +Globals.COMPONENT_TRANSITION_TIME = 100; +Globals.COMPONENT_HIDE_SHOW_TRANSITION_TIME = 300; +Globals.COMPONENT_HIDE_OPACITY = 0.06; +Globals.COMPONENT_DATA_KEY_ATTRIBUTE = 'data-proteic-key'; +Globals.LEGEND_DATA_KEY_ATTRIBUTE = 'data-proteic-legend-key'; +Globals.LEGEND_HIDE_OPACITY = 0.3; +Globals.BREAKPOINT = 768; +Globals.ASPECT_RATIO = 0.7; +Globals.LOADING_ICON = 'data:image/gif;base64,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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA='; + +function simple2stacked(data) { + return d3.nest().key(function (d) { return d.x; }).rollup(function (array) { + var r = {}; + for (var i = 0; i < array.length; i++) { + var object = array[i]; + if (object) { + r[object.key] = object.y; + } + } + return r; + }).entries(data); +} +function simple2nested(data, key) { + if (key === void 0) { key = 'key'; } + return d3.nest().key(function (d) { return d[key]; }).entries(data); +} + +function simple2Linked(data) { + var linkedData = { links: [], nodes: [] }; + data.map(function (d) { return d.class === 'link' ? linkedData.links.push(d) : linkedData.nodes.push(d); }); + return linkedData; +} +function convertPropretiesToTimeFormat(data, properties, format$$1) { + data.forEach(function (d) { + properties.map(function (p) { + d[p] = d3.timeParse(format$$1)(d[p]); + }); + }); +} +function convertByXYFormat(data, xAxisFormat, xAxisType, yAxisFormat, yAxisType) { + data.forEach(function (d) { + switch (xAxisType) { + case 'time': + d.x = d3.timeParse(xAxisFormat)(d.x); + break; + case 'linear': + d.x = +d.x; + break; + } + switch (yAxisType) { + case 'time': + d.y = d3.timeParse(yAxisFormat)(d.y); + break; + case 'linear': + d.y = +d.y; + break; + } + }); + return data; +} + +var YAxis = (function (_super) { + __extends(YAxis, _super); + function YAxis(orient) { + var _this = _super.call(this) || this; + _this._orient = 'left'; + _this.selection = null; + if (orient != null) { + _this._orient = orient; + } + return _this; + } + Object.defineProperty(YAxis.prototype, "orient", { + get: function () { + return this._orient; + }, + enumerable: true, + configurable: true + }); + YAxis.prototype.render = function () { + var width = this.config.get('width'), height = this.config.get('height'), yAxisFormat = this.config.get('yAxisFormat'), yAxisType = this.config.get('yAxisType'), yAxisLabel = this.config.get('yAxisLabel'), yAxisGrid = this.config.get('yAxisGrid'); + this.initializeYAxis(width, height, yAxisFormat, yAxisType, yAxisGrid); + var yAxisG = this.svg + .append('g') + .attr('class', 'y axis') + .attr("transform", this.orient === 'left' + ? "translate( 0, 0 )" + : "translate( " + width + ", 0 )") + .call(this._yAxis); + this.svg + .append('text') + .attr('class', 'yaxis-title') + .attr("transform", "rotate(-90)") + .attr("text-anchor", "middle") + .attr('x', 0 - height / 2) + .attr('y', 0 - 55) + .text(yAxisLabel) + .style('font', '0.8em Montserrat, sans-serif'); + this.selection = yAxisG; + }; + YAxis.prototype.update = function (data) { + var propertyKey = this.config.get('propertyKey'); + var propertyY = this.config.get('propertyY'); + var yAxisType = this.config.get('yAxisType'), yAxisShow = this.config.get('yAxisShow'), layoutStacked = this.config.get('stacked'); + this.selection.attr('opacity', yAxisShow ? 1 : 0); + if (yAxisType === 'linear') { + if (layoutStacked) { + var keys = d3.map(data, function (d) { return d[propertyKey]; }).keys(); + var stack_1 = this.config.get('stack'); + var stackedData = stack_1.keys(keys)(simple2stacked(data)); + var min$$1 = d3.min(stackedData, function (serie) { return d3.min(serie, function (d) { return d[0]; }); }); + var max$$1 = d3.max(stackedData, function (serie) { return d3.max(serie, function (d) { return d[1]; }); }); + this.updateDomainByMinMax(min$$1, max$$1); + } + else { + var min$$1 = d3.min(data, function (d) { return d[propertyY]; }), max$$1 = d3.max(data, function (d) { return d[propertyY]; }); + this.updateDomainByMinMax(min$$1, max$$1); + } + } + else if (yAxisType === 'categorical') { + var keys = d3.map(data, function (d) { return d[propertyKey]; }).keys().sort(); + this._yAxis.scale().domain(keys); + } + else { + console.warn('could not recognize y axis type', yAxisType); + } + if (data !== null && data.length) { + this.transition(); + } + }; + YAxis.prototype.updateDomainByMinMax = function (min$$1, max$$1) { + this._yAxis.scale().domain([min$$1, max$$1]); + }; + YAxis.prototype.transition = function (time) { + if (time === void 0) { time = 200; } + this.selection.transition().duration(Globals.COMPONENT_TRANSITION_TIME).call(this._yAxis); + this.svg.selectAll('.y.axis path').raise(); + }; + YAxis.prototype.initializeYAxis = function (width, height, yAxisFormat, yAxisType, yAxisGrid) { + switch (yAxisType) { + case 'linear': + this._yAxis = (this.orient === 'left') + ? d3.axisLeft(d3.scaleLinear().range([height, 0])).tickFormat(d3.format(yAxisFormat)) + : d3.axisRight(d3.scaleLinear().range([height, 0])).tickFormat(d3.format(yAxisFormat)); + break; + case 'categorical': + this._yAxis = (this.orient === 'left') + ? d3.axisLeft(d3.scaleBand().rangeRound([height, 0]).padding(0.1).align(0.5)) + : d3.axisRight(d3.scaleBand().rangeRound([height, 0]).padding(0.1).align(0.5)); + break; + default: + throw new Error('Not allowed type for YAxis. Only allowed "time", "linear" or "categorical". Got: ' + yAxisType); + } + if (yAxisGrid && this.orient === 'left') { + this._yAxis + .tickSizeInner(-width) + .tickSizeOuter(0) + .tickPadding(20); + } + }; + Object.defineProperty(YAxis.prototype, "yAxis", { + get: function () { + return this._yAxis; + }, + enumerable: true, + configurable: true + }); + return YAxis; +}(Component)); + +var XYAxis = (function (_super) { + __extends(XYAxis, _super); + function XYAxis() { + var _this = _super.call(this) || this; + _this._x = new XAxis(); + _this._y = new YAxis(); + return _this; + } + XYAxis.prototype.render = function () { + this._y.render(); + this._x.render(); + }; + XYAxis.prototype.update = function (data) { + this._y.update(data); + this._x.update(data); + }; + XYAxis.prototype.configure = function (config, svg) { + _super.prototype.configure.call(this, config, svg); + this._y.configure(config, svg); + this._x.configure(config, svg); + }; + Object.defineProperty(XYAxis.prototype, "x", { + get: function () { + return this._x; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(XYAxis.prototype, "y", { + get: function () { + return this._y; + }, + enumerable: true, + configurable: true + }); + return XYAxis; +}(Component)); + +var Lineset = (function (_super) { + __extends(Lineset, _super); + function Lineset(x, y) { + var _this = _super.call(this) || this; + _this.x = x; + _this.y = y; + return _this; + } + Lineset.prototype.render = function () { + var _this = this; + var propertyX = this.config.get('propertyX'); + var propertyY = this.config.get('propertyY'); + var curve = this.config.get('curve'); + this.lineGenerator = d3.line() + .curve(curve) + .x(function (d) { return _this.x.xAxis.scale()(d[propertyX]); }) + .y(function (d) { return _this.y.yAxis.scale()(d[propertyY]); }); + }; + Lineset.prototype.update = function (data) { + var _this = this; + var propertyKey = this.config.get('propertyKey'); + var dataSeries = d3.nest().key(function (d) { return d[propertyKey]; }).entries(data); + var series = this.svg.selectAll('g.lineSeries'); + var colorScale = this.config.get('colorScale'); + var lines = series.data(dataSeries, function (d) { return d[propertyKey]; }) + .enter() + .append('g') + .attr('class', 'lineSeries') + .attr(Globals.COMPONENT_DATA_KEY_ATTRIBUTE, function (d) { return d[propertyKey]; }) + .attr('stroke', function (d) { return colorScale(d[propertyKey]); }) + .append('svg:path') + .style('stroke', function (d) { return colorScale(d[propertyKey]); }) + .style('stroke-width', 1.9) + .style('fill', 'none') + .attr('d', function (d) { return _this.lineGenerator(d.values); }) + .attr('class', 'line'); + this.svg.selectAll('.line') + .data(dataSeries, function (d) { return d[propertyKey]; }) + .attr('d', function (d) { return _this.lineGenerator(d.values); }) + .transition() + .duration(Globals.COMPONENT_TRANSITION_TIME) + .ease(d3.easeLinear); + }; + return Lineset; +}(Component)); + +var Pointset = (function (_super) { + __extends(Pointset, _super); + function Pointset(x, y) { + var _this = _super.call(this) || this; + _this.x = x; + _this.y = y; + return _this; + } + Pointset.prototype.render = function () { + }; + Pointset.prototype.update = function (data) { + var _this = this; + var propertyKey = this.config.get('propertyKey'); + var propertyX = this.config.get('propertyX'); + var propertyY = this.config.get('propertyY'); + var dataSeries = d3.nest() + .key(function (d) { return d[propertyKey]; }) + .entries(data), markers = null, markerShape = this.config.get('markerShape'), markerSize = this.config.get('markerSize'), markerOutlineWidth = this.config.get('markerOutlineWidth'), colorScale = this.config.get('colorScale'), points = null, series = null; + var shape = d3.symbol().size(markerSize); + series = this.svg.selectAll('g.points'); + switch (markerShape) { + case 'dot': + shape.type(d3.symbolCircle); + break; + case 'ring': + shape.type(d3.symbolCircle); + break; + case 'cross': + shape.type(d3.symbolCross); + break; + case 'diamond': + shape.type(d3.symbolDiamond); + break; + case 'square': + shape.type(d3.symbolSquare); + break; + case 'star': + shape.type(d3.symbolStar); + break; + case 'triangle': + shape.type(d3.symbolTriangle); + break; + case 'wye': + shape.type(d3.symbolWye); + break; + case 'circle': + shape.type(d3.symbolCircle); + break; + default: + shape.type(d3.symbolCircle); + } + points = series + .data(dataSeries, function (d) { return d.values; }, function (d) { return d[propertyX]; }); + points.enter() + .append('g') + .attr('class', 'points') + .attr(Globals.COMPONENT_DATA_KEY_ATTRIBUTE, function (d) { return d[propertyKey]; }) + .style('stroke', function (d) { return colorScale(d[propertyKey]); }) + .selectAll('circle') + .data(function (d) { return d.values; }) + .enter() + .append('path') + .attr('class', 'marker') + .attr('d', shape) + .style('stroke', function (d) { return colorScale(d[propertyKey]); }) + .style('fill', function (d) { return markerShape !== 'ring' ? colorScale(d[propertyKey]) : 'transparent'; }) + .attr('transform', function (d) { return "translate(" + _this.x.xAxis.scale()(d[propertyX]) + ", " + _this.y.yAxis.scale()(d[propertyY]) + ")"; }); + this.svg.selectAll('.marker') + .transition() + .duration(Globals.COMPONENT_TRANSITION_TIME) + .ease(d3.easeLinear) + .attr('transform', function (d) { return "translate(" + _this.x.xAxis.scale()(d[propertyX]) + ", " + _this.y.yAxis.scale()(d[propertyY]) + ")"; }); + points + .exit() + .remove(); + markers = this.svg.selectAll('.marker'); + markers + .on('mousedown.user', this.config.get('onDown')) + .on('mouseup.user', this.config.get('onUp')) + .on('mouseleave.user', this.config.get('onLeave')) + .on('mouseover.user', this.config.get('onHover')) + .on('click.user', this.config.get('onClick')); + }; + return Pointset; +}(Component)); + +var Areaset = (function (_super) { + __extends(Areaset, _super); + function Areaset(x, y) { + var _this = _super.call(this) || this; + _this.x = x; + _this.y = y; + return _this; + } + Areaset.prototype.render = function () { + var _this = this; + var height = this.config.get('height'), propertyX = this.config.get('propertyX'), propertyY = this.config.get('propertyY'), curve = this.config.get('curve'); + this.areaGenerator = d3.area() + .curve(curve) + .x(function (d) { return _this.x.xAxis.scale()(d[propertyX]); }) + .y0(height) + .y1(function (d) { return _this.y.yAxis.scale()(d[propertyY]); }); + }; + Areaset.prototype.update = function (data) { + var _this = this; + var propertyKey = this.config.get('propertyKey'); + var dataSeries = d3.nest().key(function (d) { return d[propertyKey]; }).entries(data); + var areas = this.svg.selectAll('g.area'); + var colorScale = this.config.get('colorScale'); + var height = this.config.get('height'); + var areaOpacity = this.config.get('areaOpacity'); + areas = areas.data(dataSeries, function (d) { return d[propertyKey]; }) + .enter() + .append('g') + .attr('class', 'area') + .attr(Globals.COMPONENT_DATA_KEY_ATTRIBUTE, function (d) { return d[propertyKey]; }) + .append('svg:path') + .style('fill', function (d) { return colorScale(d[propertyKey]); }) + .style('fill-opacity', areaOpacity) + .attr('d', function (d) { return _this.areaGenerator(d.values); }) + .attr('class', 'areaPath'); + this.svg.selectAll('.areaPath') + .data(dataSeries, function (d) { return d[propertyKey]; }) + .transition() + .duration(Globals.COMPONENT_TRANSITION_TIME) + .attr('d', function (d) { return _this.areaGenerator(d.values); }); + }; + return Areaset; +}(Component)); + +var Legend = (function (_super) { + __extends(Legend, _super); + function Legend() { + return _super.call(this) || this; + } + Legend.prototype.render = function () { + }; + Legend.prototype.update = function (data) { + var _this = this; + var dataSeries = d3.nest() + .key(function (d) { return d.key; }) + .entries(data), legend = null, entries = null, colorScale = this.config.get('colorScale'), height = this.config.get('height'), width = this.config.get('width'); + if (dataSeries.length === 1 && dataSeries[0].key === 'undefined') { + console.warn('Not showing legend, since there is a valid key'); + return; + } + this.svg.selectAll('g.legend').remove(); + legend = this.svg.append('g').attr('class', 'legend'); + entries = legend.selectAll('.legend-entry') + .data(dataSeries, function (d) { return d.key; }) + .enter() + .append('g') + .attr('class', 'legend-entry') + .attr(Globals.LEGEND_DATA_KEY_ATTRIBUTE, function (d) { return d.key; }); + entries.append('rect') + .attr('x', width + 10) + .attr('y', function (d, i) { return i * 25; }) + .attr('height', 20) + .attr('width', 20) + .style('fill', function (d) { return colorScale(d.key); }) + .style('stroke', function (d) { return colorScale(d.key); }) + .style('opacity', 0.8) + .on('click.default', function (d) { return _this.toggle(d); }); + entries.append('text') + .attr("x", width + 25 + 10) + .attr("y", function (d, i) { return i * 25 + 7; }) + .attr("dy", "0.55em") + .text(function (d) { return d.key; }) + .style('font', '14px Montserrat, sans-serif') + .on('click.default', function () { return _this.toggle; }); + }; + Legend.prototype.toggle = function (d) { + var key = d.key, element = this.svg.selectAll('*[' + Globals.COMPONENT_DATA_KEY_ATTRIBUTE + '="' + key + '"]'), colorScale = this.config.get('colorScale'); + if (!element.empty()) { + var opacity = element.style('opacity'); + opacity = (opacity == 1) ? Globals.COMPONENT_HIDE_OPACITY : 1; + var legendEntry = this.svg.select('.legend-entry[' + Globals.LEGEND_DATA_KEY_ATTRIBUTE + '="' + key + '"]'); + legendEntry.selectAll('rect') + .transition() + .duration(Globals.COMPONENT_HIDE_SHOW_TRANSITION_TIME) + .style('fill', (opacity === 1) ? function (d) { return colorScale(d.key); } : 'transparent'); + element + .transition() + .duration(Globals.COMPONENT_HIDE_SHOW_TRANSITION_TIME) + .style('opacity', opacity); + } + }; + return Legend; +}(Component)); + +var Container = (function () { + function Container(config) { + this.components = []; + this.config = config; + var selector = this.config.get('selector'), width = this.config.get('width'), height = this.config.get('height'), marginLeft = this.config.get('marginLeft'), marginRight = this.config.get('marginRight'), marginTop = this.config.get('marginTop'), marginBottom = this.config.get('marginBottom'); + width += marginLeft + marginRight; + height += marginTop + marginBottom; + this.initializeContainer(selector, width, height, marginLeft, marginTop); + } + Container.prototype.add = function (component) { + this.components.push(component); + component.configure(this.config, this.svg); + component.render(); + return this; + }; + Container.prototype.initializeContainer = function (selector, width, height, marginLeft, marginTop) { + this.svg = d3.select(selector) + .style('position', 'relative') + .style('width', width + "px") + .style('height', height + "px") + .append('svg:svg') + .attr('preserveAspectRatio', "xMinYMin meet") + .attr("viewBox", "0 0 " + width + " " + height) + .attr('width', '100%') + .attr('class', 'proteic') + .attr('width', width) + .attr('height', height) + .style('position', 'absolute') + .append('g') + .attr('class', 'chartContainer') + .attr('transform', 'translate(' + marginLeft + ',' + marginTop + ')'); + }; + Container.prototype.updateComponents = function (data) { + for (var i = 0; i < this.components.length; i++) { + var component = this.components[i]; + component.update(data); + } + }; + Container.prototype.translate = function (x, y) { + this.svg.attr('transform', "translate(" + x + ", " + y + ")"); + }; + Container.prototype.viewBox = function (w, h) { + this.svg.attr("viewBox", "0 0 " + w + " " + h); + }; + Container.prototype.zoom = function (z) { + this.svg.call(d3.zoom().scaleExtent([1 / 2, 4]).on("zoom", z)); + }; + Container.prototype.addLoadingIcon = function () { + var icon = Globals.LOADING_ICON; + this.svg.append('image').attr('id', 'loadingIcon') + .attr('width', '25%') + .attr('height', '25%') + .attr('x', '25%') + .attr('y', '25%') + .attr('xlink:href', icon); + }; + Container.prototype.removeLoadingIcon = function () { + this.svg.select('image[id="loadingIcon"]').transition().duration(200).remove(); + }; + return Container; +}()); + +var SvgChart = (function () { + function SvgChart() { + } + SvgChart.prototype.initialize = function () { + this.container = new Container(this.config); + }; + SvgChart.prototype.setConfig = function (config) { + this.config = config; + }; + SvgChart.prototype.addLoading = function () { + this.container.addLoadingIcon(); + }; + SvgChart.prototype.removeLoading = function () { + this.container.removeLoadingIcon(); + }; + return SvgChart; +}()); + +function sortByField(array, field) { + array.sort(function (e1, e2) { + var a = e1[field]; + var b = e2[field]; + return (a < b) ? -1 : (a > b) ? 1 : 0; + }); +} + +var SvgStrategyLinechart = (function (_super) { + __extends(SvgStrategyLinechart, _super); + function SvgStrategyLinechart() { + var _this = _super.call(this) || this; + _this.axes = new XYAxis(); + _this.lines = new Lineset(_this.axes.x, _this.axes.y); + return _this; + } + SvgStrategyLinechart.prototype.draw = function (data) { + var xAxisFormat = this.config.get('xAxisFormat'), xAxisType = this.config.get('xAxisType'), yAxisFormat = this.config.get('yAxisFormat'), yAxisType = this.config.get('yAxisType'); + convertByXYFormat(data, xAxisFormat, xAxisType, yAxisFormat, yAxisType); + sortByField(data, 'x'); + this.container.updateComponents(data); + }; + SvgStrategyLinechart.prototype.initialize = function () { + _super.prototype.initialize.call(this); + var markerSize = this.config.get('markerSize'), areaOpacity = this.config.get('areaOpacity'), legend = this.config.get('legend'); + this.container.add(this.axes).add(this.lines); + if (areaOpacity > 0) { + this.area = new Areaset(this.axes.x, this.axes.y); + this.container.add(this.area); + } + if (markerSize > 0) { + this.markers = new Pointset(this.axes.x, this.axes.y); + this.container.add(this.markers); + } + if (legend) { + this.legend = new Legend(); + this.container.add(this.legend); + } + }; + return SvgStrategyLinechart; +}(SvgChart)); + +var paletteCategory2 = [ + '#b6dde2', + '#6394af', + '#e4e9ab', + '#8ea876', + '#f7dce1', + '#cc878f', + '#fadaac', + '#f29a83', + '#8d7e9e' +]; + +var paletteCategory3 = [ + '#6b68a9', + '#8cc590', + '#b9487d', + '#bfa1c5', + '#4e6936', + '#71bbc3', + '#484156', + '#ccaf44', + '#d0553c' +]; + +var paletteCategory4 = [ + '#f1a30d', + '#1d4763', + '#84c7bc', + '#c1212d', + '#8fbe46', + '#076837', + '#563a2d', + '#563a2d', + '#87325d' +]; + +var paletteCategory5 = [ + '#f1a30d', + '#0c3183', + '#acd9d6', + '#c1212d', + '#8fbe46', + '#076837', + '#8a6338', + '#8d2d84', + '#f09bbc' +]; + +var paletteCategory6 = [ + '#71bbc3', + '#1d4763', + '#8fbe46', + '#4e6936', + '#ee8998', + '#c1212d', + '#f5af3c', + '#e95e2e', + '#634484' +]; + +var paletteCategory7 = [ + '#ea671e', + '#684592', + '#84b92a', + '#cd131c', + '#3c5ba2', + '#5baddc', + '#ffde06', + '#5db68b', + '#775e47' +]; + +var paletteCategory8 = [ + '#ebd646', + '#a50f38', + '#00a096', + '#f09bbc', + '#065b78', + '#72722a', + '#005231', + '#4d4e98', + '#7c4d25' +]; +var paletteDivergingSpectral2 = [ + '#d43d4f', + '#df564b', + '#eb6d45', + '#f08e53', + '#f8b96f', + '#fee08b', + '#f5f2b8', + '#d7e5b1', + '#b5d7aa', + '#8ec8a3', + '#6abda3', + '#4fa4b5', + '#3489be' +]; + +function category2() { + return d3.scaleOrdinal().range(paletteCategory2); +} +function category3() { + return d3.scaleOrdinal().range(paletteCategory3); +} +function category4() { + return d3.scaleOrdinal().range(paletteCategory4); +} +function category5() { + return d3.scaleOrdinal().range(paletteCategory5); +} + +function category7() { + return d3.scaleOrdinal().range(paletteCategory7); +} +function category8() { + return d3.scaleOrdinal().range(paletteCategory8); +} + +function diverging_spectral2() { + return d3.scaleQuantile().range(paletteDivergingSpectral2); +} + +var Interpolation = (function () { + function Interpolation() + } + return Interpolation; +}()); +Interpolation.CURVE_LINEAR = d3.curveLinear; +Interpolation.CURVE_LINEAR_CLOSED = d3.curveLinearClosed; +Interpolation.CURVE_MONOTONE_X = d3.curveMonotoneX; +Interpolation.CURVE_MONOTONE_Y = d3.curveMonotoneY; +Interpolation.CURVE_NATURAL = d3.curveNatural; +Interpolation.CURVE_STEP = d3.curveStep; +Interpolation.CURVE_STEP_AFTER = d3.curveStepAfter; +Interpolation.CURVE_STEP_BEFORE = d3.curveStepBefore; + +var defaults = { + selector: '#chart', + colorScale: category7(), + curve: Interpolation.CURVE_MONOTONE_X, + areaOpacity: 0, + xAxisType: 'linear', + xAxisFormat: '', + xAxisLabel: null, + xAxisGrid: true, + yAxisType: 'linear', + yAxisFormat: '', + yAxisLabel: null, + yAxisShow: true, + yAxisGrid: true, + marginTop: 20, + marginRight: 250, + marginBottom: 130, + marginLeft: 150, + markerShape: 'dot', + markerSize: 0, + markerOutlineWidth: 2, + width: '100%', + height: 250, + legend: true, + propertyX: 'x', + propertyY: 'y', + propertyKey: 'key', + onDown: function (d) { + }, + onHover: function (d) { + }, + onLeave: function (d) { + }, + onClick: function (d) { + }, + onUp: function (d) { + }, + maxNumberOfElements: 10, +}; + +var Linechart = (function (_super) { + __extends(Linechart, _super); + function Linechart(data, userConfig) { + if (userConfig === void 0) { userConfig = {}; } + return _super.call(this, new SvgStrategyLinechart(), data, userConfig, defaults) || this; + } + Linechart.prototype.keepDrawing = function (datum) { + var maxNumberOfElements = this.config.get('maxNumberOfElements'), numberOfElements = this.data.length, position = -1, datumType = datum.constructor; + if (datumType === Array) { + this.data = this.data.concat(datum); + } + else { + this.data.push(datum); + } + if (numberOfElements > maxNumberOfElements) { + var position_1 = numberOfElements - maxNumberOfElements; + this.data = this.data.slice(position_1); + } + this.draw(copy(this.data)); + }; + return Linechart; +}(Chart)); + +var Barset = (function (_super) { + __extends(Barset, _super); + function Barset(x, y) { + var _this = _super.call(this) || this; + _this.x = x; + _this.y = y; + return _this; + } + Barset.prototype.render = function () { + }; + Barset.prototype.update = function (data) { + var bars = null, stacked = this.config.get('stacked'); + this.clean(); + if (stacked) { + this.updateStacked(data); + } + else { + this.updateGrouped(data); + } + bars = this.svg.selectAll('g.barSeries rect'); + bars + .on('mousedown.user', this.config.get('onDown')) + .on('mouseup.user', this.config.get('onUp')) + .on('mouseleave.user', this.config.get('onLeave')) + .on('mouseover.user', this.config.get('onHover')) + .on('click.user', this.config.get('onClick')); + }; + Barset.prototype.updateStacked = function (data) { + var propertyKey = this.config.get('propertyKey'); + var keys = d3.map(data, function (d) { return d[propertyKey]; }).keys(); + var stack$$1 = this.config.get('stack'); + data = stack$$1.keys(keys)(simple2stacked(data)); + var colorScale = this.config.get('colorScale'), layer = this.svg.selectAll('.barSeries').data(data), layerEnter = layer.enter().append('g'), x = this.x.xAxis.scale(), y = this.y.yAxis.scale(); + layer.merge(layerEnter) + .attr('class', 'barSeries') + .attr(Globals.COMPONENT_DATA_KEY_ATTRIBUTE, function (d) { return d[propertyKey]; }) + .style('fill', function (d, i) { return d[propertyKey] !== undefined ? colorScale(d[propertyKey]) : colorScale(i); }) + .selectAll('rect') + .data(function (d) { return d; }) + .enter().append('rect') + .attr("x", function (d) { return x(d.data[propertyKey]); }) + .attr("y", function (d) { return y(d[1]); }) + .attr("height", function (d) { return y(d[0]) - y(d[1]); }) + .attr("width", x.bandwidth()); + }; + Barset.prototype.updateGrouped = function (data) { + var propertyKey = this.config.get('propertyKey'); + var propertyX = this.config.get('propertyX'); + var propertyY = this.config.get('propertyY'); + var keys = d3.map(data, function (d) { return d[propertyKey]; }).keys(), colorScale = this.config.get('colorScale'), layer = null, x = this.x.xAxis.scale(), y = this.y.yAxis.scale(), xGroup = d3.scaleBand().domain(keys).range([0, x.bandwidth()]), height = this.config.get('height'); + data = simple2nested(data, 'key'); + layer = this.svg.selectAll('g.barSeries') + .data(data, function (d) { return d.values; }); + layer.enter() + .append('g') + .attr('class', 'barSeries') + .attr(Globals.COMPONENT_DATA_KEY_ATTRIBUTE, function (d) { return d[propertyKey]; }) + .selectAll('rect') + .data(function (d) { return d.values; }) + .enter() + .append('rect') + .attr('transform', function (d) { return 'translate(' + x(d[propertyX]) + ')'; }) + .attr('width', xGroup.bandwidth()) + .attr("x", function (d) { return xGroup(d[propertyKey]); }) + .attr("y", function (d) { return y(d[propertyY]); }) + .attr("height", function (d) { return height - y(d[propertyY]); }) + .style('fill', function (d, i) { return d[propertyKey] !== undefined ? colorScale(d[propertyKey]) : colorScale(i); }); + }; + return Barset; +}(Component)); + +var SvgStrategyBarchart = (function (_super) { + __extends(SvgStrategyBarchart, _super); + function SvgStrategyBarchart() { + var _this = _super.call(this) || this; + _this.axes = new XYAxis(); + _this.bars = new Barset(_this.axes.x, _this.axes.y); + return _this; + } + SvgStrategyBarchart.prototype.draw = function (data) { + var xAxisFormat = this.config.get('xAxisFormat'), xAxisType = this.config.get('xAxisType'), yAxisFormat = this.config.get('yAxisFormat'), yAxisType = this.config.get('yAxisType'); + convertByXYFormat(data, xAxisFormat, xAxisType, yAxisFormat, yAxisType); + sortByField(data, 'x'); + this.container.updateComponents(data); + }; + SvgStrategyBarchart.prototype.initialize = function () { + _super.prototype.initialize.call(this); + var legend = this.config.get('legend'); + this.container.add(this.axes).add(this.bars); + if (legend) { + this.legend = new Legend(); + this.container.add(this.legend); + } + }; + return SvgStrategyBarchart; +}(SvgChart)); + +var defaults$1 = { + selector: '#chart', + colorScale: category5(), + stacked: false, + xAxisType: 'categorical', + xAxisFormat: '', + xAxisLabel: '', + xAxisGrid: false, + yAxisType: 'linear', + yAxisFormat: '', + yAxisLabel: '', + yAxisShow: true, + yAxisGrid: true, + marginTop: 20, + marginRight: 250, + marginBottom: 130, + marginLeft: 150, + width: '100%', + height: 350, + legend: true, + propertyX: 'x', + propertyY: 'y', + propertyKey: 'key', + stack: d3.stack().value(function (d, k) { return d.value[k]; }), + onDown: function (d) { + }, + onHover: function (d) { + }, + onLeave: function (d) { + }, + onClick: function (d) { + }, + onUp: function (d) { + } +}; + +var Barchart = (function (_super) { + __extends(Barchart, _super); + function Barchart(data, userConfig) { + if (userConfig === void 0) { userConfig = {}; } + return _super.call(this, new SvgStrategyBarchart(), data, userConfig, defaults$1) || this; + } + Barchart.prototype.fire = function (event$$1, data) { + if (event$$1 === 'transition') { + if (data === 'grouped') { + this.config.put('stacked', false); + } + else if (data === 'stacked') { + this.config.put('stacked', true); + } + this.draw(); + } + }; + Barchart.prototype.keepDrawing = function (datum) { + var datumType = datum.constructor; + if (datumType === Array) { + this.data = datum; + } + else { + var found = false; + for (var i = 0; i < this.data.length; i++) { + var d = this.data[i]; + if (d['x'] === datum['x'] && d['key'] === datum['key']) { + this.data[i] = datum; + found = true; + break; + } + } + if (!found) { + this.data.push(datum); + } + } + this.draw(copy(this.data)); + }; + return Barchart; +}(Chart)); + +var Dial = (function (_super) { + __extends(Dial, _super); + function Dial() { + return _super.call(this) || this; + } + Dial.prototype.render = function () { + var labels = null, invertColorScale = this.config.get('invertColorScale'), colorScale = this.config.get('colorScale'), width = this.config.get('width'), height = this.config.get('height'), ringWidth = this.config.get('ringWidth'), ringMargin = this.config.get('ringMargin'), ticks = this.config.get('ticks'), minAngle = this.config.get('minAngle'), maxAngle = this.config.get('maxAngle'), minLevel = this.config.get('minLevel'), maxLevel = this.config.get('maxLevel'), labelInset = this.config.get('labelInset'), scale = d3.scaleLinear() + .domain([minLevel, maxLevel]) + .range([0, 1]), scaleMarkers = scale.ticks(ticks), range$$1 = maxAngle - minAngle, r = ((width > height) ? + height : width) / 2, translation = (function () { return 'translate(' + r + ',' + r + ')'; }), tickData = d3.range(ticks).map(function () { return 1 / ticks; }), arc$$1 = d3.arc() + .innerRadius(r - ringWidth - ringMargin) + .outerRadius(r - ringMargin) + .startAngle(function (d, i) { return deg2rad(minAngle + ((d * i) * range$$1)); }) + .endAngle(function (d, i) { return deg2rad(minAngle + ((d * (i + 1)) * range$$1)); }); + colorScale.domain([0, 1]); + var arcs = this.svg.append('g') + .attr('class', 'arc') + .attr('transform', translation); + var arcPaths = arcs.selectAll('path') + .data(tickData) + .enter().append('path') + .attr('id', function (d, i) { return 'sector-' + i; }) + .attr('d', arc$$1); + arcPaths.attr('fill', function (d, i) { return colorScale(invertColorScale + ? (1 - d * i) + : (d * i)); }); + labels = this.svg.append('g') + .attr('class', 'labels') + .attr('transform', translation); + labels.selectAll('text') + .data(scaleMarkers) + .enter().append('text') + .attr('transform', function (d) { + var ratio = scale(d); + var newAngle = minAngle + (ratio * range$$1); + return 'rotate(' + newAngle + ') translate(0,' + (labelInset - r) + ')'; + }) + .text(function (d) { return d; }) + .style('text-anchor', 'middle') + .style('font', '18px Montserrat, sans-serif'); + }; + Dial.prototype.update = function () { + }; + return Dial; +}(Component)); + +var DialNeedle = (function (_super) { + __extends(DialNeedle, _super); + function DialNeedle() { + return _super.call(this) || this; + } + DialNeedle.prototype.render = function () { + var labels = null, invertColorScale = this.config.get('invertColorScale'), colorScale = this.config.get('colorScale'), width = this.config.get('width'), height = this.config.get('height'), ringWidth = this.config.get('ringWidth'), ringMargin = this.config.get('ringMargin'), ticks = this.config.get('ticks'), minAngle = this.config.get('minAngle'), maxAngle = this.config.get('maxAngle'), minLevel = this.config.get('minLevel'), maxLevel = this.config.get('maxLevel'), labelInset = this.config.get('labelInset'), needleNutRadius = this.config.get('needleNutRadius'), needleLenghtRatio = this.config.get('needleLenghtRatio'), scale = d3.scaleLinear() + .domain([minLevel, maxLevel]) + .range([0, 1]), scaleMarkers = scale.ticks(ticks), range$$1 = maxAngle - minAngle, r = ((width > height) ? + height : width) / 2, needleLen = needleLenghtRatio * (r), translation = (function () { return 'translate(' + r + ',' + r + ')'; }), tickData = d3.range(ticks).map(function () { return 1 / ticks; }), arc$$1 = d3.arc() + .innerRadius(r - ringWidth - ringMargin) + .outerRadius(r - ringMargin) + .startAngle(function (d, i) { return deg2rad(minAngle + ((d * i) * range$$1)); }) + .endAngle(function (d, i) { return deg2rad(minAngle + ((d * (i + 1)) * range$$1)); }), angleScale = d3.scaleLinear() + .domain([minLevel, maxLevel]) + .range([90 + minAngle, 90 + maxAngle]); + this.svg.append('path') + .attr('class', 'needle') + .datum(0) + .attr('transform', function (d) { return "translate(" + r + ", " + r + ") rotate(" + (angleScale(d) - 90) + ")"; }) + .attr('d', "M " + (0 - needleNutRadius) + " " + 0 + " L " + 0 + " " + (0 - needleLen) + " L " + needleNutRadius + " " + 0) + .style('fill', '#666666'); + this.svg.append('circle') + .attr('class', 'needle') + .attr('transform', translation) + .attr('cx', 0) + .attr('cy', 0) + .attr('r', needleNutRadius) + .style('fill', '#666666'); + }; + DialNeedle.prototype.update = function (data) { + var datum = data[data.length - 1], width = this.config.get('width'), height = this.config.get('height'), needleNutRadius = this.config.get('needleNutRadius'), needleLenghtRatio = this.config.get('needleLenghtRatio'), propertyValue = this.config.get('propertyValue'), minAngle = this.config.get('minAngle'), maxAngle = this.config.get('maxAngle'), minLevel = this.config.get('minLevel'), maxLevel = this.config.get('maxLevel'), r = ((width > height) ? + height : width) / 2, needleLen = needleLenghtRatio * (r), angleScale = d3.scaleLinear() + .domain([minLevel, maxLevel]) + .range([90 + minAngle, 90 + maxAngle]); + this.svg.select('.needle') + .transition() + .attr('transform', function (d) { return "translate(" + r + ", " + r + ") rotate(" + (angleScale(datum[propertyValue]) - 90) + ")"; }) + .attr('d', "M " + (0 - needleNutRadius) + " " + 0 + " L " + 0 + " " + (0 - needleLen) + " L " + needleNutRadius + " " + 0); + }; + return DialNeedle; +}(Component)); + +var TextIndicator = (function (_super) { + __extends(TextIndicator, _super); + function TextIndicator() { + var _this; + return _this; + } + TextIndicator.prototype.update = function (data) { + var datum = data[data.length - 1]; + this.svg.select('.value') + .text(datum.value); + this.svg.select('.label') + .text(datum.label); + }; + TextIndicator.prototype.render = function () { + var indicator = this.svg.append('g') + .attr('class', 'text-indicator') + .attr('pointer-events', 'none') + .style('text-anchor', 'middle') + .style('alignment-baseline', 'central'); + indicator.append('text') + .attr('class', 'value') + .attr('x', 0) + .attr('y', 0) + .attr('pointer-events', 'none') + .text('') + .style('text-anchor', 'middle'); + indicator.append('text') + .attr('class', 'label') + .attr('x', 0) + .attr('y', 0) + .attr('pointer-events', 'none') + .text('') + .style('transform', 'translate(0, 1.5em') + .style('text-anchor', 'middle'); + }; + TextIndicator.prototype.translate = function (x, y) { + this.svg + .select('g.text-indicator') + .attr('transform', "translate(" + x + ", " + y + ")"); + }; + return TextIndicator; +}(Component)); + +var SvgStrategyGauge = (function (_super) { + __extends(SvgStrategyGauge, _super); + function SvgStrategyGauge() { + var _this = _super.call(this) || this; + _this.dial = new Dial(); + _this.dialNeedle = new DialNeedle(); + _this.textIndicator = new TextIndicator(); + return _this; + } + SvgStrategyGauge.prototype.draw = function (data) { + this.container.updateComponents(data); + }; + SvgStrategyGauge.prototype.initialize = function () { + _super.prototype.initialize.call(this); + this.container.add(this.dial).add(this.dialNeedle); + if (this.config.get('numericIndicator')) { + var width = this.config.get('width'), height = this.config.get('height'); + var r = ((width > height) ? height : width) / 2; + var indicatorOffset = r + 75; + this.container.add(this.textIndicator); + this.textIndicator.translate(r, indicatorOffset); + } + }; + return SvgStrategyGauge; +}(SvgChart)); + +var defaults$2 = { + selector: '#chart', + colorScale: diverging_spectral2(), + invertColorScale: true, + minLevel: 0, + maxLevel: 100, + minAngle: -90, + maxAngle: 90, + ringWidth: 50, + ringMargin: 20, + labelInset: 10, + needleNutRadius: 25, + needleLenghtRatio: 0.8, + numericIndicator: true, + label: 'km/h', + marginTop: 20, + marginRight: 250, + marginBottom: 30, + marginLeft: 50, + width: '50%', + height: 250, + ticks: 10, + propertyValue: 'value' +}; + +var Gauge = (function (_super) { + __extends(Gauge, _super); + function Gauge(data, userConfig) { + if (userConfig === void 0) { userConfig = {}; } + return _super.call(this, new SvgStrategyGauge(), data, userConfig, defaults$2) || this; + } + Gauge.prototype.keepDrawing = function (datum) { + this.data = [datum[0]]; + _super.prototype.draw.call(this); + }; + return Gauge; +}(Chart)); + +var CanvasPointset = (function (_super) { + __extends(CanvasPointset, _super); + function CanvasPointset(x, y) { + var _this = _super.call(this) || this; + _this.x = x; + _this.y = y; + return _this; + } + CanvasPointset.prototype.update = function (data) { + var _this = this; + var propertyKey = this.config.get('propertyKey'); + var propertyX = this.config.get('propertyX'); + var propertyY = this.config.get('propertyY'); + var markerShape = this.config.get('markerShape'), markerSize = this.config.get('markerSize'), colorScale = this.config.get('colorScale'), points = null, series = null, dataContainer = null, width = this.config.get('width'), height = this.config.get('height'); + var shape = d3.symbol() + .size(markerSize) + .context(this.canvasCtx); + switch (markerShape) { + case 'dot': + shape.type(d3.symbolCircle); + break; + case 'ring': + shape.type(d3.symbolCircle); + break; + case 'cross': + shape.type(d3.symbolCross); + break; + case 'diamond': + shape.type(d3.symbolDiamond); + break; + case 'square': + shape.type(d3.symbolSquare); + break; + case 'star': + shape.type(d3.symbolStar); + break; + case 'triangle': + shape.type(d3.symbolTriangle); + break; + case 'wye': + shape.type(d3.symbolWye); + break; + case 'circle': + shape.type(d3.symbolCircle); + break; + default: + shape.type(d3.symbolCircle); + } + dataContainer = this.svg.append('proteic'); + series = dataContainer.selectAll('proteic.g.points'); + this.canvasCtx.clearRect(0, 0, width, height); + series + .data(data, function (d) { return d[propertyKey]; }) + .enter() + .call(function (s) { + var self = _this; + s.each(function (d) { + self.canvasCtx.save(); + self.canvasCtx.translate(self.x.xAxis.scale()(d[propertyX]), self.y.yAxis.scale()(d[propertyY])); + self.canvasCtx.beginPath(); + self.canvasCtx.strokeStyle = colorScale(d[propertyKey]); + self.canvasCtx.fillStyle = colorScale(d[propertyKey]); + shape(); + self.canvasCtx.closePath(); + self.canvasCtx.stroke(); + if (markerShape !== 'ring') { + self.canvasCtx.fill(); + } + self.canvasCtx.restore(); + }); + }); + }; + CanvasPointset.prototype.render = function () { + this.canvas = d3.select(this.config.get('selector')).append('canvas') + .attr('id', 'point-set-canvas') + .attr('width', this.config.get('width')) + .attr('height', this.config.get('height')) + .style('position', 'absolute') + .style('z-index', 2) + .style('transform', "translate(" + this.config.get('marginLeft') + "px, " + this.config.get('marginTop') + "px)"); + this.canvasCtx = this.canvas.node().getContext('2d'); + }; + return CanvasPointset; +}(Component)); + +var SvgStrategyScatterplot = (function (_super) { + __extends(SvgStrategyScatterplot, _super); + function SvgStrategyScatterplot() { + var _this = _super.call(this) || this; + _this.axes = new XYAxis(); + _this.markers = new Pointset(_this.axes.x, _this.axes.y); + _this.canvasMarkers = new CanvasPointset(_this.axes.x, _this.axes.y); + return _this; + } + SvgStrategyScatterplot.prototype.draw = function (data) { + var xAxisFormat = this.config.get('xAxisFormat'), xAxisType = this.config.get('xAxisType'), yAxisFormat = this.config.get('yAxisFormat'), yAxisType = this.config.get('yAxisType'); + convertByXYFormat(data, xAxisFormat, xAxisType, yAxisFormat, yAxisType); + sortByField(data, 'x'); + this.container.updateComponents(data); + }; + SvgStrategyScatterplot.prototype.initialize = function () { + _super.prototype.initialize.call(this); + var legend = this.config.get('legend'); + this.container.add(this.axes); + if (this.config.get('canvas')) { + this.container.add(this.canvasMarkers); + } + else { + this.container.add(this.markers); + } + if (legend) { + this.legend = new Legend(); + this.container.add(this.legend); + } + }; + return SvgStrategyScatterplot; +}(SvgChart)); + +var defaults$3 = { + selector: '#chart', + colorScale: category7(), + xAxisType: 'linear', + xAxisFormat: '.1f', + xAxisLabel: '', + xAxisGrid: true, + yAxisType: 'linear', + yAxisFormat: '.1f', + yAxisLabel: '', + yAxisShow: true, + yAxisGrid: true, + marginTop: 20, + marginRight: 250, + marginBottom: 130, + marginLeft: 150, + markerShape: 'circle', + markerSize: 15, + width: '100%', + height: 250, + legend: true, + propertyX: 'x', + propertyY: 'y', + propertyKey: 'key', + onDown: function (d) { + }, + onHover: function (d) { + }, + onLeave: function (d) { + }, + onClick: function (d) { + }, + onUp: function (d) { + }, + maxNumberOfElements: 100, + canvas: false +}; + +var Scatterplot = (function (_super) { + __extends(Scatterplot, _super); + function Scatterplot(data, userConfig) { + if (userConfig === void 0) { userConfig = {}; } + return _super.call(this, new SvgStrategyScatterplot(), data, userConfig, defaults$3) || this; + } + Scatterplot.prototype.keepDrawing = function (datum) { + var datumType = datum.constructor; + if (datumType === Array) { + if (this.data) { + this.data = this.data.concat(datum); + } + else { + this.data = datum; + } + } + else { + this.data.push(datum); + } + this.draw(copy(this.data)); + }; + return Scatterplot; +}(Chart)); + +var Streamset = (function (_super) { + __extends(Streamset, _super); + function Streamset(xyAxes) { + var _this = _super.call(this) || this; + _this.xyAxes = xyAxes; + _this.areaGenerator = d3.area() + .curve(d3.curveCardinal) + .y0(function (d) { return _this.xyAxes.y.yAxis.scale()(d[0]); }) + .y1(function (d) { return _this.xyAxes.y.yAxis.scale()(d[1]); }); + return _this; + } + Streamset.prototype.render = function () { + }; + Streamset.prototype.update = function (data) { + var _this = this; + var propertyKey = this.config.get('propertyKey'); + var propertyX = this.config.get('propertyX'); + var propertyY = this.config.get('propertyY'); + this.clean(); + var colorScale = this.config.get('colorScale'), onDown = this.config.get('onDown'), onUp = this.config.get('onUp'), onLeave = this.config.get('onLeave'), onHover = this.config.get('onHover'), onClick = this.config.get('onClick'), keys = d3.map(data, function (d) { return d[propertyKey]; }).keys(), data4stack = simple2stacked(data), stack$$1 = this.config.get('stack'), dataSeries = stack$$1(data4stack), series = null; + this.areaGenerator.x(function (d) { return _this.xyAxes.x.xAxis.scale()((new Date(d.data[propertyKey]))); }); + series = this.svg.selectAll('.serie') + .data(dataSeries) + .enter() + .append('g') + .attr('class', 'serie') + .style('stroke', function (d, i) { return colorScale(d[propertyKey]); }) + .attr(Globals.COMPONENT_DATA_KEY_ATTRIBUTE, function (d) { return d[propertyKey]; }); + series + .append('path') + .attr('class', 'layer') + .attr('d', this.areaGenerator) + .style('fill', function (d, i) { return colorScale(d[propertyKey]); }); + series.exit().remove(); + series + .attr('opacity', 1) + .on('mousedown.user', onDown) + .on('mouseup.user', onUp) + .on('mouseleave.user', onLeave) + .on('mouseover.user', onHover) + .on('click.user', onClick); + }; + return Streamset; +}(Component)); + +var SvgStrategyStreamgraph = (function (_super) { + __extends(SvgStrategyStreamgraph, _super); + function SvgStrategyStreamgraph() { + var _this = _super.call(this) || this; + _this.axes = new XYAxis(); + _this.streams = new Streamset(_this.axes); + return _this; + } + SvgStrategyStreamgraph.prototype.draw = function (data) { + var xAxisFormat = this.config.get('xAxisFormat'), xAxisType = this.config.get('xAxisType'), yAxisFormat = this.config.get('yAxisFormat'), yAxisType = this.config.get('yAxisType'); + convertPropretiesToTimeFormat(data, ['x'], xAxisFormat); + sortByField(data, 'x'); + this.container.updateComponents(data); + }; + SvgStrategyStreamgraph.prototype.initialize = function () { + _super.prototype.initialize.call(this); + var markerSize = this.config.get('markerSize'), areaOpacity = this.config.get('areaOpacity'), legend = this.config.get('legend'); + this.container.add(this.axes).add(this.streams); + if (legend) { + this.legend = new Legend(); + this.container.add(this.legend); + } + }; + return SvgStrategyStreamgraph; +}(SvgChart)); + +var defaults$4 = { + selector: '#chart', + colorScale: category4(), + xAxisType: 'time', + xAxisFormat: '%y/%m/%d', + xAxisLabel: '', + xAxisGrid: true, + yAxisType: 'linear', + yAxisFormat: '', + yAxisLabel: '', + yAxisShow: false, + yAxisGrid: false, + marginTop: 20, + marginRight: 250, + marginBottom: 130, + marginLeft: 150, + width: '100%', + height: 250, + legend: true, + propertyX: 'x', + propertyY: 'y', + propertyKey: 'key', + stack: d3.stack().value(function (d, k) { return d.value[k]; }).order(d3.stackOrderInsideOut).offset(d3.stackOffsetWiggle), + stacked: true, + onDown: function (d) { + }, + onHover: function (d) { + }, + onLeave: function (d) { + }, + onClick: function (d) { + }, + onUp: function (d) { + }, + maxNumberOfElements: 100, +}; + +var Streamgraph = (function (_super) { + __extends(Streamgraph, _super); + function Streamgraph(data, userConfig) { + if (userConfig === void 0) { userConfig = {}; } + return _super.call(this, new SvgStrategyStreamgraph(), data, userConfig, defaults$4) || this; + } + Streamgraph.prototype.keepDrawing = function (datum) { + var datumType = datum.constructor; + if (datumType === Array) { + this.data = this.data.concat(datum); + } + else { + this.data.push(datum); + } + this.draw(copy(this.data)); + }; + return Streamgraph; +}(Chart)); + +var defaults$5 = { + selector: '#chart', + colorScale: category2(), + xAxisType: 'time', + xAxisFormat: '%y/%m/%d', + xAxisLabel: '', + xAxisGrid: true, + yAxisType: 'linear', + yAxisFormat: '', + yAxisLabel: '', + yAxisShow: true, + yAxisGrid: true, + marginTop: 20, + marginRight: 250, + marginBottom: 130, + marginLeft: 150, + width: '100%', + height: 250, + legend: true, + propertyX: 'x', + propertyY: 'y', + propertyKey: 'key', + stacked: true, + stack: d3.stack().value(function (d, k) { return d.value[k]; }).order(d3.stackOrderInsideOut).offset(d3.stackOffsetNone), + onDown: function (d) { + }, + onHover: function (d) { + }, + onLeave: function (d) { + }, + onClick: function (d) { + }, + onUp: function (d) { + }, + maxNumberOfElements: 100, +}; + +var StackedArea = (function (_super) { + __extends(StackedArea, _super); + function StackedArea(data, userConfig) { + if (userConfig === void 0) { userConfig = {}; } + return _super.call(this, new SvgStrategyStreamgraph(), data, userConfig, defaults$5) || this; + } + StackedArea.prototype.keepDrawing = function (datum) { + var datumType = datum.constructor; + if (datumType === Array) { + this.data = this.data.concat(datum); + } + else { + this.data.push(datum); + } + this.draw(copy(this.data)); + }; + return StackedArea; +}(Chart)); + +var Timeboxset = (function (_super) { + __extends(Timeboxset, _super); + function Timeboxset(xyAxes) { + var _this = _super.call(this) || this; + _this.xyAxes = xyAxes; + return _this; + } + Timeboxset.prototype.render = function () { + }; + Timeboxset.prototype.update = function (data) { + var propertyKey = this.config.get('propertyKey'); + var propertyStart = this.config.get('propertyStart'); + var propertyEnd = this.config.get('propertyEnd'); + var colorScale = this.config.get('colorScale'), height = this.config.get('height'), onDown = this.config.get('onDown'), onUp = this.config.get('onUp'), onLeave = this.config.get('onLeave'), onHover = this.config.get('onHover'), onClick = this.config.get('onClick'), keys = d3.map(data, function (d) { return d[propertyKey]; }).keys(), layer = this.svg.selectAll('.serie').data(data), layerEnter = null, layerMerge = null, box = null, boxEnter = null, boxMerge = null, extLanes = null, yLanes = null, yLanesBand = d3.scaleBand().range([0, keys.length + 1]).domain(keys), x = this.xyAxes.x.xAxis.scale(), y = this.xyAxes.y.yAxis.scale(); + data = simple2nested(data); + extLanes = d3.extent(data, function (d, i) { return i; }); + yLanes = d3.scaleLinear().domain([extLanes[0], extLanes[1] + 1]).range([0, height]); + layer = this.svg.selectAll('.serie').data(data); + layerEnter = layer.enter().append('g'); + layerMerge = layer.merge(layerEnter) + .attr('class', 'serie') + .attr(Globals.COMPONENT_DATA_KEY_ATTRIBUTE, function (d) { return d[propertyKey]; }); + box = layerMerge.selectAll('rect') + .data(function (d) { return d.values; }); + boxEnter = box.enter().append('rect'); + boxMerge = box.merge(boxEnter) + .attr('width', function (d) { return x(d[propertyEnd]) - x(d[propertyStart]); }) + .attr('x', function (d) { return x(d[propertyStart]); }) + .attr('y', function (d) { return y(d[propertyKey]); }) + .attr('height', function () { return 0.8 * yLanes(1); }) + .style('fill', function (d) { return colorScale(d[propertyKey]); }); + box = this.svg.selectAll('g.serie rect'); + box + .on('mousedown.user', onDown) + .on('mouseup.user', onUp) + .on('mouseleave.user', onLeave) + .on('mouseover.user', onHover) + .on('click.user', onClick); + }; + return Timeboxset; +}(Component)); + +var SvgStrategySwimlane = (function (_super) { + __extends(SvgStrategySwimlane, _super); + function SvgStrategySwimlane() { + var _this = _super.call(this) || this; + _this.axes = new XYAxis(); + _this.boxes = new Timeboxset(_this.axes); + return _this; + } + SvgStrategySwimlane.prototype.draw = function (data) { + var xAxisFormat = this.config.get('xAxisFormat'); + convertPropretiesToTimeFormat(data, ['start', 'end'], xAxisFormat); + sortByField(data, 'start'); + this.container.updateComponents(data); + }; + SvgStrategySwimlane.prototype.initialize = function () { + _super.prototype.initialize.call(this); + var markerSize = this.config.get('markerSize'), areaOpacity = this.config.get('areaOpacity'), legend = this.config.get('legend'); + this.container.add(this.axes); + if (legend) { + this.legend = new Legend(); + this.container.add(this.legend).add(this.boxes); + } + }; + return SvgStrategySwimlane; +}(SvgChart)); + +var defaults$6 = { + selector: '#chart', + colorScale: category3(), + xAxisType: 'time', + xAxisFormat: '%y/%m/%d', + xAxisLabel: '', + xAxisGrid: true, + yAxisType: 'categorical', + yAxisFormat: 's', + yAxisLabel: '', + yAxisShow: true, + yAxisGrid: true, + marginTop: 20, + marginRight: 250, + marginBottom: 30, + marginLeft: 50, + width: '100%', + height: 250, + legend: true, + propertyStart: 'start', + propertyEnd: 'end', + propertyKey: 'key', + onDown: function (d) { + }, + onHover: function (d) { + }, + onLeave: function (d) { + }, + onClick: function (d) { + }, + onUp: function (d) { + } +}; + +var Swimlane = (function (_super) { + __extends(Swimlane, _super); + function Swimlane(data, userConfig) { + if (userConfig === void 0) { userConfig = {}; } + return _super.call(this, new SvgStrategySwimlane(), data, userConfig, defaults$6) || this; + } + Swimlane.prototype.keepDrawing = function (datum) { + var datumType = datum.constructor; + if (datumType === Array) { + this.data = this.data.concat(datum); + } + else { + this.data.push(datum); + } + this.draw(copy(this.data)); + }; + return Swimlane; +}(Chart)); + +var XRadialAxis = (function (_super) { + __extends(XRadialAxis, _super); + function XRadialAxis() { + return _super.call(this) || this; + } + XRadialAxis.prototype.update = function (data) { }; + XRadialAxis.prototype.render = function () { + this._xRadialAxis = d3.scaleLinear().range([0, 2 * Math.PI]); + }; + Object.defineProperty(XRadialAxis.prototype, "xRadialAxis", { + get: function () { + return this._xRadialAxis; + }, + enumerable: true, + configurable: true + }); + return XRadialAxis; +}(Component)); + +var YRadialAxis = (function (_super) { + __extends(YRadialAxis, _super); + function YRadialAxis() { + return _super.call(this) || this; + } + YRadialAxis.prototype.render = function () { + var width = this.config.get('width'), height = this.config.get('height'), radius = null; + radius = (Math.min(width, height) / 2) - 10; + this._yRadialAxis = d3.scaleSqrt().range([0, radius]); + }; + + YRadialAxis.prototype.update = function (data) { }; + + Object.defineProperty(YRadialAxis.prototype, "yRadialAxis", { + get: function () { + return this._yRadialAxis; + }, + enumerable: true, + configurable: true + }); + return YRadialAxis; +}(Component)); + +var RadialAxes = (function (_super) { + __extends(RadialAxes, _super); + function RadialAxes() { + var _this = _super.call(this) || this; + _this._x = new XRadialAxis(); + _this._y = new YRadialAxis(); + return _this; + } + RadialAxes.prototype.configure = function (config, svg) { + _super.prototype.configure.call(this, config, svg); + this._x.configure(config, svg); + this._y.configure(config, svg); + }; + RadialAxes.prototype.render = function () { + this._x.render(); + this._y.render(); + }; + RadialAxes.prototype.update = function (data) { + this._x.update(data); + this._y.update(data); + }; + Object.defineProperty(RadialAxes.prototype, "x", { + get: function () { + return this._x; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(RadialAxes.prototype, "y", { + get: function () { + return this._y; + }, + enumerable: true, + configurable: true + }); + return RadialAxes; +}(Component)); + +var SunburstDisk = (function (_super) { + __extends(SunburstDisk, _super); + function SunburstDisk(x, y) { + var _this = _super.call(this) || this; + _this.x = x; + _this.y = y; + return _this; + } + SunburstDisk.prototype.removePaths = function () { + this.svg.selectAll('path').remove(); + }; + SunburstDisk.prototype.getAncestors = function (node) { + var path = []; + var current = node; + while (current.parent) { + path.unshift(current); + current = current.parent; + } + return path; + }; + SunburstDisk.prototype.update = function (data) { + var _this = this; + var arcGen = d3.arc() + .startAngle(function (d) { return Math.max(0, Math.min(2 * Math.PI, _this.x.xRadialAxis(d.x0))); }) + .endAngle(function (d) { return Math.max(0, Math.min(2 * Math.PI, _this.x.xRadialAxis(d.x1))); }) + .innerRadius(function (d) { return Math.max(0, _this.y.yRadialAxis(d.y0)); }) + .outerRadius(function (d) { return Math.max(0, _this.y.yRadialAxis(d.y1)); }); + var colorScale = this.config.get('colorScale'); + this.removePaths(); + var root = d3.stratify() + .id(function (d) { return d.id; }) + .parentId(function (d) { return d.parent; })(data); + root.sum(function (d) { return d.value; }); + d3.partition()(root); + var paths = this.svg.selectAll('path') + .data(root.descendants()) + .enter().append('path') + .attr('d', arcGen) + .style('fill', function (d) { + if (!d.parent) { + return 'white'; + } + else { + return colorScale(d.data.label); + } + }) + .style('stroke', '#fff') + .style('stroke-width', '2') + .style('shape-rendering', 'crispEdge'); + paths + .on('mouseover.default', function (d) { + var ancestors = _this.getAncestors(d); + if (ancestors.length > 0) { + _this.svg.selectAll('path') + .style('opacity', 0.3); + } + _this.svg.selectAll('path') + .filter(function (node) { return ancestors.indexOf(node) >= 0; }) + .style('opacity', 1); + _this.svg.select('.text-indicator .label').text(d.data.label); + _this.svg.select('.text-indicator .value').text(d.value); + }) + .on('mouseout.default', function (d) { + _this.svg.selectAll('path').style('opacity', 1); + _this.svg.select('.text-indicator .label').style('font-weight', 'normal'); + _this.svg.select('.text-indicator .label').text(''); + _this.svg.select('.text-indicator .value').text(''); + }); + paths + .on('mousedown.user', this.config.get('onDown')) + .on('mouseup.user', this.config.get('onUp')) + .on('mouseleave.user', this.config.get('onLeave')) + .on('mouseover.user', this.config.get('onHover')) + .on('click.user', this.config.get('onClick')); + }; + SunburstDisk.prototype.render = function () { + }; + return SunburstDisk; +}(Component)); + +var SvgStrategySunburst = (function (_super) { + __extends(SvgStrategySunburst, _super); + function SvgStrategySunburst() { + var _this = _super.call(this) || this; + _this.axes = new RadialAxes(); + _this.disk = new SunburstDisk(_this.axes.x, _this.axes.y); + _this.textIndicator = new TextIndicator(); + return _this; + } + SvgStrategySunburst.prototype.draw = function (data) { + this.container.translate(this.config.get('width') / 2, this.config.get('height') / 2); + this.container.updateComponents(data); + }; + SvgStrategySunburst.prototype.initialize = function () { + _super.prototype.initialize.call(this); + this.container + .add(this.axes) + .add(this.disk) + .add(this.textIndicator); + }; + return SvgStrategySunburst; +}(SvgChart)); + +var defaults$7 = { + selector: '#chart', + colorScale: category8(), + marginTop: 20, + marginRight: 20, + marginBottom: 30, + marginLeft: 50, + width: '50%', + height: 450, + tickLabel: '', + transitionDuration: 300, + maxNumberOfElements: 5, + sortData: { + descending: false, + prop: 'x' + }, + onDown: function (d) { + }, + onHover: function (d) { + }, + onLeave: function (d) { + }, + onClick: function (d) { + }, + onUp: function (d) { + } +}; + +var Sunburst = (function (_super) { + __extends(Sunburst, _super); + function Sunburst(data, userConfig) { + if (userConfig === void 0) { userConfig = {}; } + return _super.call(this, new SvgStrategySunburst(), data, userConfig, defaults$7) || this; + } + Sunburst.prototype.keepDrawing = function (datum) { + var datumType = datum.constructor; + if (datumType === Array) { + if (this.data) { + this.data = this.data.concat(datum); + } + else { + this.data = datum; + } + } + else { + this.data.push(datum); + } + this.draw(copy(this.data)); + }; + return Sunburst; +}(Chart)); + +var LinkedNodeset = (function (_super) { + __extends(LinkedNodeset, _super); + function LinkedNodeset() { + var _this = _super.call(this) || this; + _this.toggle = 0; + return _this; + } + LinkedNodeset.prototype.render = function () { + var _this = this; + var width = this.config.get('width'), height = this.config.get('height'); + this.simulation = d3.forceSimulation() + .force("link", d3.forceLink().id(function (d) { return d.id; }).distance(50)) + .force("charge", d3.forceManyBody()) + .force("center", d3.forceCenter(width / 2, height / 2)); + this.dragstarted = function (d) { + if (!d3.event.active) + _this.simulation.alphaTarget(0.3).restart(); + d.fx = d.x; + d.fy = d.y; + }; + this.dragged = function (d) { + d.fx = d3.event['x']; + d.fy = d3.event['y']; + }; + this.dragended = function (d) { + if (!d3.event.active) + _this.simulation.alphaTarget(1); + d.fx = null; + d.fy = null; + }; + }; + LinkedNodeset.prototype.update = function (data) { + var _this = this; + var nodeRadius = this.config.get('nodeRadius'), colorScale = this.config.get('colorScale'), linkWeight = this.config.get('linkWeight'), nodeWeight = this.config.get('nodeWeight'), minLinkWeight = this.config.get('minLinkWeight'), maxLinkWeight = this.config.get('maxLinkWeight'), minNodeWeight = this.config.get('minNodeWeight'), maxNodeWeight = this.config.get('maxNodeWeight'), weighted = this.config.get('weighted'), linkScaleRadius = d3.scaleLinear().domain([minLinkWeight, maxLinkWeight]).range([0, 3]), nodeScaleRadius = d3.scaleLinear().domain([minNodeWeight, maxNodeWeight]).range([0, 15]), labelShow = this.config.get('labelShow'), labelField = this.config.get('labelField'), node = null, link = null, text = null; + data = simple2Linked(data); + this.svg.selectAll('g.links').remove(); + this.svg.selectAll('g.nodes').remove(); + this.svg.selectAll('g.labels').remove(); + link = this.svg.append('g') + .attr('class', 'serie') + .append("g") + .attr("class", "links") + .selectAll("line") + .data(data.links) + .enter() + .append("line") + .attr(Globals.COMPONENT_DATA_KEY_ATTRIBUTE, function (d) { console.log(d); return d.key; }) + .attr("stroke-width", function (d) { return (weighted && d.weight) ? linkScaleRadius(d.weight) : linkWeight; }) + .attr("stroke", "#999") + .attr("stroke-opacity", 1); + node = this.svg.select('g.serie').append("g") + .attr("class", "nodes") + .selectAll("circle") + .data(data.nodes) + .enter() + .append("circle") + .attr(Globals.COMPONENT_DATA_KEY_ATTRIBUTE, function (d) { return d.key; }) + .attr("r", function (d) { return (weighted && d.weight) ? nodeScaleRadius(d.weight) : nodeWeight; }) + .attr("fill", function (d) { return colorScale(d.key); }) + .attr("stroke", "white") + .call(d3.drag() + .on("start", this.dragstarted) + .on("drag", this.dragged) + .on("end", this.dragended)); + var chart = this; + node + .on('mousedown.user', this.config.get('onDown')) + .on('mouseup.user', this.config.get('onUp')) + .on('mouseleave.user', this.config.get('onLeave')) + .on('mouseover.user', this.config.get('onHover')) + .on('click.user', this.config.get('onClick')); + if (labelShow) { + text = this.svg.select('g.serie').append("g") + .attr("class", "labels") + .selectAll('text') + .data(data.nodes) + .enter() + .append('text') + .attr(Globals.COMPONENT_DATA_KEY_ATTRIBUTE, function (d) { return d.key; }) + .attr('dx', 10) + .attr('dy', '.35em') + .attr('font-size', '.85em') + .text(typeof labelField === 'string' ? function (d) { return d[labelField]; } : labelField) + .on('mousedown.user', this.config.get('onDown')) + .on('mouseup.user', this.config.get('onUp')) + .on('mouseleave.user', this.config.get('onLeave')) + .on('mouseover.user', this.config.get('onHover')) + .on('click.user', this.config.get('onClick')); + } + this.simulation.nodes(data.nodes).on("tick", function () { return labelShow ? _this.tickedWithText(link, node, text) : _this.ticked(link, node); }); + this.simulation.force("link").links(data.links); + }; + LinkedNodeset.prototype.tickedWithText = function (link, node, text) { + this.ticked(link, node); + text + .attr('x', function (d) { return d.x; }) + .attr('y', function (d) { return d.y; }); + }; + LinkedNodeset.prototype.ticked = function (link, node) { + link + .attr("x1", function (d) { return d.source.x; }) + .attr("y1", function (d) { return d.source.y; }) + .attr("x2", function (d) { return d.target.x; }) + .attr("y2", function (d) { return d.target.y; }); + node + .attr("cx", function (d) { return d.x; }) + .attr("cy", function (d) { return d.y; }); + }; + LinkedNodeset.prototype.zoom = function (event$$1) { + var transform = event$$1.transform; + this.svg.selectAll('.nodes circle').attr('transform', transform); + this.svg.selectAll('.links line').attr('transform', transform); + this.svg.selectAll('.labels text').attr('transform', transform); + }; + return LinkedNodeset; +}(Component)); + +var ZoomComponent = (function (_super) { + __extends(ZoomComponent, _super); + function ZoomComponent(zoomerComponent) { + var _this = _super.call(this) || this; + _this.zoomerComponent = zoomerComponent; + _this.zoom = d3.zoom().scaleExtent([1 / 2, 4]); + return _this; + } + ZoomComponent.prototype.render = function () { + var _this = this; + var selector = this.config.get('selector'); + d3.select(selector).call(this.zoom); + this.zoom.on('zoom', function () { + _this.zoomerComponent.zoom(d3.event); + }); + }; + ZoomComponent.prototype.update = function (data) { + }; + return ZoomComponent; +}(Component)); + +var SvgStrategyNetwork = (function (_super) { + __extends(SvgStrategyNetwork, _super); + function SvgStrategyNetwork() { + return _super.call(this) || this; + } + SvgStrategyNetwork.prototype.draw = function (data) { + this.container.updateComponents(data); + }; + SvgStrategyNetwork.prototype.initialize = function () { + _super.prototype.initialize.call(this); + var legend = this.config.get('legend'); + var zoom$$1 = this.config.get('zoom'); + this.linkedNodes = new LinkedNodeset(); + this.container.add(this.linkedNodes); + if (legend) { + this.legend = new Legend(); + this.container.add(this.legend); + } + if (zoom$$1) { + this.zoom = new ZoomComponent(this.linkedNodes); + this.container.add(this.zoom); + } + }; + return SvgStrategyNetwork; +}(SvgChart)); + +var defaults$8 = { + selector: '#chart', + colorScale: category7(), + marginTop: 20, + marginRight: 250, + marginBottom: 130, + marginLeft: 150, + width: '100%', + height: 250, + nodeRadius: 8.5, + legend: true, + linkWeight: 1, + nodeWeight: 8, + minLinkValue: 0, + maxLinkValue: 10, + minNodeWeight: 0, + maxNodeWeight: 100, + weighted: false, + labelShow: true, + labelField: 'id', + zoom: true, + onDown: function (d) { + }, + onHover: function (d) { + }, + onLeave: function (d) { + }, + onClick: function (d) { + }, + onUp: function (d) { + } +}; + +var Network = (function (_super) { + __extends(Network, _super); + function Network(data, userConfig) { + if (userConfig === void 0) { userConfig = {}; } + return _super.call(this, new SvgStrategyNetwork(), data, userConfig, defaults$8) || this; + } + Network.prototype.keepDrawing = function (datum) { + var datumType = datum.constructor; + if (datumType === Array) { + this.data = this.data.concat(datum); + } + else { + this.data.push(datum); + } + this.draw(copy(this.data)); + }; + return Network; +}(Chart)); + +var SectorSet = (function (_super) { + __extends(SectorSet, _super); + function SectorSet() { + return _super.call(this) || this; + } + SectorSet.prototype.render = function () { + }; + SectorSet.prototype.update = function (data) { + var propertyKey = this.config.get('propertyKey'); + var propertyX = this.config.get('propertyX'); + var width = this.config.get('width'); + var height = this.config.get('height'); + var radius = Math.min(width, height) / 2; + var colorScale = this.config.get('colorScale'); + var myPie = d3.pie().value(function (d) { return d[propertyX]; })(data); + var myArc = d3.arc().innerRadius(0).outerRadius(radius); + var arcs = this.svg.selectAll("g.slice").data(myPie); + var newBlock = arcs.enter(); + newBlock + .append("g") + .attr(Globals.COMPONENT_DATA_KEY_ATTRIBUTE, function (d) { return d.data[propertyKey]; }) + .append("path") + .attr('fill', function (d, i) { + return d.data[propertyKey] !== undefined ? colorScale(d.data[propertyKey]) : colorScale(i); + }) + .attr("d", myArc); + }; + return SectorSet; +}(Component)); + +var SvgStrategyPieChart = (function (_super) { + __extends(SvgStrategyPieChart, _super); + function SvgStrategyPieChart() { + var _this = _super.call(this) || this; + _this.sectors = new SectorSet(); + return _this; + } + SvgStrategyPieChart.prototype.draw = function (data) { + this.container.translate(this.config.get('width') / 2, this.config.get('height') / 2); + this.container.updateComponents(data); + }; + SvgStrategyPieChart.prototype.initialize = function () { + _super.prototype.initialize.call(this); + this.container + .add(this.sectors); + var legend = this.config.get('legend'); + if (legend) { + this.legend = new Legend(); + this.container.add(this.legend); + } + }; + return SvgStrategyPieChart; +}(SvgChart)); + +var defaults$9 = { + selector: '#chart', + colorScale: category8(), + marginTop: 0, + marginRight: '100', + marginBottom: 0, + marginLeft: 0, + width: '500', + height: '500', + transitionDuration: 300, + maxNumberOfElements: 5, + legend: true, + propertyX: 'x', + propertyKey: 'key', + sortData: { + descending: false, + prop: 'x' + }, + onDown: function (d) { + }, + onHover: function (d) { + }, + onLeave: function (d) { + }, + onClick: function (d) { + }, + onUp: function (d) { + } +}; + +var PieChart = (function (_super) { + __extends(PieChart, _super); + function PieChart(data, userConfig) { + if (userConfig === void 0) { userConfig = {}; } + return _super.call(this, new SvgStrategyPieChart, data, userConfig, defaults$9) || this; + } + PieChart.prototype.keepDrawing = function (datum) { + var datumType = datum.constructor; + if (datumType === Array) { + if (this.data) { + this.data = this.data.concat(datum); + } + else { + this.data = datum; + } + } + else { + var link = document.createElement('a'); + link.style = 'position: fixed; left -10000px;'; // making it invisible + link.href = uri; + link.download = this$1.constructor.name + '.svg'; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + } + this.draw(copy(this.data)); + }; + return PieChart; +}(Chart)); + +var Datasource = (function () { + function Datasource() { + this.dispatcher = null; + this.source = null; + this.isWaitingForData = true; + } + Datasource.prototype.start = function () { + window.console.log('Starting datasource'); + }; + Datasource.prototype.stop = function () { + window.console.log('Stopping datasource'); + }; + Datasource.prototype.configure = function (dispatcher) { + this.dispatcher = dispatcher; + }; + Datasource.prototype.filter = function (filter) { + return this; + }; + return Datasource; +}()); + +var WebsocketDatasource = (function (_super) { + __extends(WebsocketDatasource, _super); + function WebsocketDatasource(source) { + var _this = _super.call(this) || this; + _this.source = source; + return _this; + } + WebsocketDatasource.prototype.configure = function (dispatcher) { + this.dispatcher = dispatcher; + }; + WebsocketDatasource.prototype.start = function () { + var _this = this; + _super.prototype.start.call(this); + this.ws = new WebSocket(this.source['endpoint']); + this.dispatcher.call('addLoading', this, {}); + this.ws.onopen = function (e) { + _this.dispatcher.call('onopen', _this, e); + }; + this.ws.onerror = function (e) { + throw new Error('An error occurred trying to reach the websocket server' + e); + }; + this.ws.onmessage = function (e) { + if (_this.isWaitingForData) { + _this.dispatcher.call('removeLoading', _this, e); + _this.isWaitingForData = false; + } + var data = JSON.parse(e.data); + _this.dispatcher.call('onmessage', _this, data); + }; + }; + WebsocketDatasource.prototype.stop = function () { + _super.prototype.stop.call(this); + if (this.ws) { + this.ws.close(); + } + }; + return WebsocketDatasource; +}(Datasource)); + +var HTTPDatasource = (function (_super) { + __extends(HTTPDatasource, _super); + function HTTPDatasource(source) { + var _this = _super.call(this) || this; + _this.source = source; + _this.intervalId = -1; + _this.started = false; + return _this; + } + HTTPDatasource.prototype.start = function () { + if (!this.started) { + _super.prototype.start.call(this); + var pollingTime = this.source.pollingTime; + var url = this.source.url; + this._startPolling(url, pollingTime); + this.started = true; + } + }; + HTTPDatasource.prototype._startPolling = function (url, time) { + var _this = this; + if (time === void 0) { time = 1000; } + var interval = window.setInterval; + this.intervalId = interval(function () { return _this._startRequest(url); }, time); + }; + HTTPDatasource.prototype._startRequest = function (url) { + var _this = this; + window.console.log('url', url); + d3.request(url).get(function (e, response) { return _this._handleResponse(response); }); + }; + HTTPDatasource.prototype._stopPolling = function () { + var clearInterval = window.clearInterval; + clearInterval(this.intervalId); + }; + HTTPDatasource.prototype._handleResponse = function (xmlHttpRequest) { + var parseJson = window.JSON.parse; + if (xmlHttpRequest.readyState === 4 && xmlHttpRequest.status === 200) { + var response = parseJson(xmlHttpRequest.response); + this._handleOK(response); + } + else { + this._handleError(xmlHttpRequest); + } + }; + HTTPDatasource.prototype._handleOK = function (data) { + if (this.properties.length > 0) { + data = this.convert(data); + } + this.dispatcher.call('onmessage', this, data); + }; + HTTPDatasource.prototype._handleError = function (data) { + this.dispatcher.call('onerror', this, data); + }; + HTTPDatasource.prototype.stop = function () { + if (this.started) { + this._stopPolling(); + this.started = false; + } + }; + return HTTPDatasource; +}(Datasource)); + +exports.Linechart = Linechart; +exports.Barchart = Barchart; +exports.Gauge = Gauge; +exports.Scatterplot = Scatterplot; +exports.Streamgraph = Streamgraph; +exports.StackedArea = StackedArea; +exports.Swimlane = Swimlane; +exports.Sunburst = Sunburst; +exports.Network = Network; +exports.PieChart = PieChart; +exports.WebsocketDatasource = WebsocketDatasource; +exports.HTTPDatasource = HTTPDatasource; +exports.Globals = Globals; diff --git a/examples/all.html b/examples/all.html new file mode 100644 index 0000000..e7e1ba8 --- /dev/null +++ b/examples/all.html @@ -0,0 +1,571 @@ + + + + + + + + + + Multiseries Barchart + + + + + + + + + + + + +
+
+
+
+
+

+ Proteic.js +

+
+
+

+ Visualization sowcase +

+
+
+
+
+ +
+ +
+

Areas

+
+
+
+
+
+
+
+
+
+ +
+

Barchart

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+

Gauge

+
+
+
+
+
+
+
+
+
+ +
+

Linechart

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+

Scatterplot

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + +
+

Streamgraph

+
+
+
+
+
+
+
+
+
+ +
+

Network

+
+
+
+
+
+
+
+
+
+ +
+

Sunburst

+
+
+
+
+
+
+
+
+
+ +
+

Swimlane

+
+
+
+
+
+
+
+
+
+ +
+
+
+

PROTEUS H2020

+ + + +
+
+
+ + + + + \ No newline at end of file diff --git a/examples/barchart.html b/examples/barchart.html index 0b5c50e..830d759 100644 --- a/examples/barchart.html +++ b/examples/barchart.html @@ -12,6 +12,7 @@ + @@ -37,6 +38,7 @@ ]; //Default config uses #chart selector var barchart = new proteic.Barchart(data, { + stacked: true, xAxisLabel: 'Countries', yAxisLabel: 'People (%)' }); diff --git a/examples/dashboard.html b/examples/dashboard.html deleted file mode 100644 index 6bc35fb..0000000 --- a/examples/dashboard.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - -

Under construction!

-

Please, help us to create a cool dashboard with some CSS framework by using some examples of our pretty charts :)

- - - \ No newline at end of file diff --git a/examples/gauge.html b/examples/gauge.html index 4a543a9..a583669 100644 --- a/examples/gauge.html +++ b/examples/gauge.html @@ -12,6 +12,7 @@ + diff --git a/examples/http_linechart.html b/examples/http_linechart.html index 55fd860..624b6dd 100644 --- a/examples/http_linechart.html +++ b/examples/http_linechart.html @@ -14,6 +14,7 @@ + @@ -23,17 +24,19 @@ url: 'https://randomuser.me/api', pollingTime: 3000 }; - var dataSource = new proteic.HTTPDatasource(data); + var ds = new proteic.HTTPDatasource(data); //No draw() call, since it is connected to a endpoint and data is automaticaly drawn. //Chart uses #chart selector by default - linechart = new proteic.Linechart(dataSource,{ + linechart = new proteic.Linechart([],{ xAxisType: 'time', xAxisFormat: '%Y-%m-%d %H:%M:%S', areaOpacity: 0, markerSize: 0 }); + + linechart.datasource(ds); //Start streaming - dataSource + ds .property('x', 'results[0].registered') .property('y', 'results[0].location.postcode') .property('key', 'results[0].gender') diff --git a/examples/linechart.html b/examples/linechart.html index 279f24b..1f293d3 100644 --- a/examples/linechart.html +++ b/examples/linechart.html @@ -11,6 +11,7 @@ + @@ -41,7 +42,9 @@ areaLinechart = new proteic.Linechart(dataArea, { selector: '#chart', - area: true, + areaOpacity: 0.1, + markerSize:0, + markerShape: 'dot', width: '90%', height: 400, onClick: (d) => console.log('clicking', d), diff --git a/examples/network.html b/examples/network.html new file mode 100644 index 0000000..d1f0edd --- /dev/null +++ b/examples/network.html @@ -0,0 +1,124 @@ + + + + + + + + + + Network + + + + + + +

Normal network

+
+ +

Weighted network without zoom

+
+ +

Network without labels

+
+ + + + + + \ No newline at end of file diff --git a/examples/networkgraph.html b/examples/networkgraph.html deleted file mode 100644 index 360ff38..0000000 --- a/examples/networkgraph.html +++ /dev/null @@ -1,94 +0,0 @@ - - - - - - - - - - Simple linechart - - - - - -
- - - - - \ No newline at end of file diff --git a/examples/piechart.html b/examples/piechart.html new file mode 100644 index 0000000..9401110 --- /dev/null +++ b/examples/piechart.html @@ -0,0 +1,38 @@ + + + + + + + + + + Pie chart + + + + + + + + + + +
+ + + + + \ No newline at end of file diff --git a/examples/scatterplot.html b/examples/scatterplot.html index ffe4035..3439722 100644 --- a/examples/scatterplot.html +++ b/examples/scatterplot.html @@ -11,10 +11,14 @@ + +

SVG

+

Canvas

+
diff --git a/examples/stacked_area.html b/examples/stacked_area.html index a585558..db260b1 100644 --- a/examples/stacked_area.html +++ b/examples/stacked_area.html @@ -7,10 +7,11 @@ - Simple Stacked area - - - + Simple Stacked area + + + + diff --git a/examples/streamgraph.html b/examples/streamgraph.html index 17eb0cf..2452b5b 100644 --- a/examples/streamgraph.html +++ b/examples/streamgraph.html @@ -15,6 +15,7 @@ + diff --git a/examples/sunburst.html b/examples/sunburst.html index 66b9f09..41f66fa 100644 --- a/examples/sunburst.html +++ b/examples/sunburst.html @@ -12,6 +12,7 @@ + diff --git a/examples/swimlane.html b/examples/swimlane.html index f36b4d2..7209152 100644 --- a/examples/swimlane.html +++ b/examples/swimlane.html @@ -48,6 +48,7 @@ + diff --git a/examples/websocket_barchart.html b/examples/websocket_barchart.html index 3781b81..3bae3e7 100644 --- a/examples/websocket_barchart.html +++ b/examples/websocket_barchart.html @@ -12,22 +12,19 @@ +
diff --git a/examples/websocket_gauge.html b/examples/websocket_gauge.html index 7818431..210f479 100644 --- a/examples/websocket_gauge.html +++ b/examples/websocket_gauge.html @@ -12,6 +12,7 @@ + @@ -22,12 +23,16 @@ endpoint: 'ws://192.168.3.32:3000/gauge' }; - var wsEndpoint = new proteic.WebsocketDatasource(data); + var ds = new proteic.WebsocketDatasource(data); //No draw() call, since it is connected to a endpoint and data is automaticaly drawn. //Chart uses #chart selector by default - gauge = new proteic.Gauge(wsEndpoint); + gauge = new proteic.Gauge([{value: 50}], {}); + + gauge.draw(); + + gauge.datasource(ds); //Start streaming - wsEndpoint.start(); + ds.start(); diff --git a/examples/websocket_linechart.html b/examples/websocket_linechart.html index 6c31406..2350af2 100644 --- a/examples/websocket_linechart.html +++ b/examples/websocket_linechart.html @@ -14,6 +14,7 @@ + @@ -22,12 +23,10 @@ var data = { endpoint: 'ws://192.168.3.32:3000/linechart' }; - var dataSource = new proteic.WebsocketDatasource(data); - //No draw() call, since it is connected to a endpoint and data is automaticaly drawn. - //Chart uses #chart selector by default - linechart = new proteic.Linechart(dataSource); - //Start streaming - dataSource.start() + + var ds = new proteic.WebsocketDatasource(data); + linechart = new proteic.Linechart([], {markerSize: 100, areaOpacity: 0.7}).datasource(ds); + ds.start(); diff --git a/examples/websocket_scatterplot.html b/examples/websocket_scatterplot.html index 83731aa..73bf207 100644 --- a/examples/websocket_scatterplot.html +++ b/examples/websocket_scatterplot.html @@ -1,7 +1,10 @@ - - - + + + @@ -12,23 +15,35 @@ Real-time scatterplot - + + - -
- - + +

SVG

+
+

Canvas

+
+ + \ No newline at end of file diff --git a/examples/websocket_streamgraph.html b/examples/websocket_streamgraph.html index b4de234..877f0b7 100644 --- a/examples/websocket_streamgraph.html +++ b/examples/websocket_streamgraph.html @@ -11,6 +11,7 @@ +
@@ -20,16 +21,18 @@ var data = { endpoint: 'ws://192.168.3.32:3000/streamgraph' }; - var dataSource = new proteic.WebsocketDatasource(data); + var ds = new proteic.WebsocketDatasource(data); //No draw() call, since it is connected to a endpoint and data is automaticaly drawn. //Chart uses #chart selector by default - swimlane = new proteic.Streamgraph(dataSource, { + swimlane = new proteic.Streamgraph([], { xAxisFormat: '%m/%d/%y', xAxisLabel: 'Date' }); + + swimlane.datasource(ds); //Start streaming - dataSource.start(); + ds.start(); diff --git a/examples/websocket_sunburst.html b/examples/websocket_sunburst.html index d3a5134..80064bb 100644 --- a/examples/websocket_sunburst.html +++ b/examples/websocket_sunburst.html @@ -12,6 +12,7 @@ + @@ -21,12 +22,12 @@ var data = { endpoint: 'ws://192.168.3.32:3000/sunburst' }; - var dataSource = new proteic.WebsocketDatasource(data); + var ds = new proteic.WebsocketDatasource(data); //No draw() call, since it is connected to a endpoint and data is automaticaly drawn. //Chart uses #chart selector by default - sunburst = new proteic.Sunburst(dataSource); + sunburst = new proteic.Sunburst().datasource(ds); //Start streaming - dataSource.start() + ds.start() diff --git a/examples/websocket_swimlane.html b/examples/websocket_swimlane.html index c4352c6..2d1b871 100644 --- a/examples/websocket_swimlane.html +++ b/examples/websocket_swimlane.html @@ -54,6 +54,7 @@ + @@ -62,14 +63,13 @@ diff --git a/images/favicon.png b/images/favicon.png new file mode 100644 index 0000000..c753436 Binary files /dev/null and b/images/favicon.png differ diff --git a/images/proteic4x3.png b/images/proteic4x3.png new file mode 100644 index 0000000..2d06b19 Binary files /dev/null and b/images/proteic4x3.png differ diff --git a/index.d.ts b/index.d.ts new file mode 100644 index 0000000..12dbaf5 --- /dev/null +++ b/index.d.ts @@ -0,0 +1 @@ +export * from './index'; \ No newline at end of file diff --git a/index.js b/index.js deleted file mode 100644 index 2e56961..0000000 --- a/index.js +++ /dev/null @@ -1,49 +0,0 @@ -export * from './src/utils/colors'; - -export { - default as Datasource -} from './src/datasources/Datasource'; - -export { - default as HTTPDatasource -} from './src/datasources/HTTPDatasource'; - -export { - default as WebsocketDatasource -} from './src/datasources/WebsocketDatasource'; - -export { - default as Linechart -} from './src/charts/linechart'; - -export { - default as Barchart -} from './src/charts/barchart'; - -export { - default as Streamgraph -} from './src/charts/streamgraph'; - -export { - default as StackedArea -} from './src/charts/stackedArea'; - -export { - default as Swimlane -} from './src/charts/swimlane'; - -export { - default as Gauge -} from './src/charts/gauge'; - -export { - default as Scatterplot -} from './src/charts/scatterplot'; - -export { - default as Sunburst -} from './src/charts/sunburst'; - -export { - default as Networkgraph -} from './src/charts/networkgraph'; diff --git a/index.ts b/index.ts new file mode 100644 index 0000000..4e7ccd3 --- /dev/null +++ b/index.ts @@ -0,0 +1,51 @@ +export { +default as Linechart +} from './src/charts/Linechart'; + +export { +default as Barchart +} from './src/charts/Barchart'; + +export { +default as Gauge +} from './src/charts/Gauge'; + +export { +default as Scatterplot +} from './src/charts/Scatterplot'; + +export { +default as Streamgraph +} from './src/charts/Streamgraph'; + +export { +default as StackedArea +} from './src/charts/StackedArea'; + +export { +default as Swimlane +} from './src/charts/Swimlane'; + +export { +default as Sunburst +} from './src/charts/Sunburst'; + +export { +default as Network +} from './src/charts/Network'; + +export { +default as PieChart +} from './src/charts/PieChart'; + +export { + default as WebsocketDatasource +} from './src/datasources/WebsocketDatasource'; + +export { + default as HTTPDatasource +} from './src/datasources/HTTPDatasource'; + +export { + default as Globals +} from './src/Globals'; \ No newline at end of file diff --git a/package.json b/package.json index e302e64..abe57d2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "proteic", - "version": "0.0.4", + "version": "0.0.5", "description": "", "homepage": "http://proteic.js.org/", "main": "dist/proteic.node.js", @@ -12,11 +12,11 @@ "pretest": "npm run build", "test": "karma start -c karma.conf.js", "prebuild": "rimraf dist/*", - "build": "rollup -c rollup.config.js", + "build": "rollup -c rollup.config.js && uglifyjs dist/proteic.js -c negate_iife=false -o dist/proteic.min.js && node rollup.config.node.js && node-sass scss/proteic.scss dist/proteic.css", "docs": "esdoc -c esdoc.json", "serve": "live-server", - "serve:watch": "parallelshell \"npm run serve\" \"watch 'npm run build' src/ \"", - "prepublish": "npm run build && uglifyjs dist/proteic.js -c negate_iife=false -o dist/proteic.min.js && node rollup.config.node.js" + "serve:watch": "parallelshell \"npm run serve\" \"watch 'npm run build' src/ scss/\"", + "prepublish": "npm run build && node rollup.config.node.js" }, "keywords": [ "d3", @@ -48,9 +48,10 @@ "url": "https://github.com/proteus-h2020/proteic/issues" }, "dependencies": { - "d3": "^4.2.7" + "d3": "^4.3.0" }, "devDependencies": { + "@types/d3": "^4.3.0", "chai": "^3.5.0", "chai-as-promised": "^5.3.0", "codecov": "^1.0.1", @@ -64,6 +65,7 @@ "karma-rollup-plugin": "^0.2.4", "live-server": "^1.1.0", "mocha": "^2.4.5", + "node-sass": "^3.13.0", "parallelshell": "^2.0.0", "protractor": "^3.3.0", "rimraf": "^2.5.4", @@ -71,7 +73,9 @@ "rollup-plugin-commonjs": "^5.0.4", "rollup-plugin-istanbul": "^1.1.0", "rollup-plugin-node-resolve": "^2.0.0", + "rollup-plugin-typescript": "^0.8.1", "socket.io": "^1.4.5", + "typescript": "^2.0.8", "uglify-js": "^2.7.4", "watch": "^0.19.2" } diff --git a/rollup.config.js b/rollup.config.js index ad7c63c..6dc0660 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -1,17 +1,22 @@ -import buble from 'rollup-plugin-buble' +import typescript from 'rollup-plugin-typescript'; export default { - entry: 'index.js', + entry: 'index.ts', dest: 'dist/proteic.js', moduleName: 'proteic', format: 'umd', sourceMap: true, plugins: [ - buble() + typescript({ + typescript: require('typescript') + }) ], - globals: { - d3: 'd3', - chai: 'chai', - }, - external: ['d3', 'chai'] -}; \ No newline at end of file + globals: { + 'd3': 'd3', + chai: 'chai', + }, + external: [ + 'd3', + 'chai' + ] +}; diff --git a/rollup.config.node.js b/rollup.config.node.js index a531320..f29945b 100644 --- a/rollup.config.node.js +++ b/rollup.config.node.js @@ -1,14 +1,16 @@ var fs = require("fs"), rollup = require("rollup"), - buble = require('rollup-plugin-buble'), - abort = (error) => console.log(error); + abort = (error) => console.log(error), + typescript = require('rollup-plugin-typescript'); rollup.rollup({ - entry: "index.js", + entry: "index.ts", external: ['d3'], plugins: [ - buble() - ] + typescript({ + typescript: require('typescript') + }) + ], }).then(function (bundle) { var code = bundle.generate({ format: "cjs" @@ -21,9 +23,9 @@ rollup.rollup({ if (error) { return reject(error); } - else { + else { resolve(); } }); }); -}).catch(abort); \ No newline at end of file +}).catch(abort); diff --git a/scss/_axes.scss b/scss/_axes.scss new file mode 100644 index 0000000..de2ff36 --- /dev/null +++ b/scss/_axes.scss @@ -0,0 +1,6 @@ +@import "fonts"; + +.proteic .axis text { + font: 1.4em $font-main, sans-serif; +} + diff --git a/scss/_colors.scss b/scss/_colors.scss new file mode 100644 index 0000000..6ee4a5d --- /dev/null +++ b/scss/_colors.scss @@ -0,0 +1,7 @@ +$grid-h-dasharray: 1,5; +$grid-v-dasharray: 1,5; +$font-color-bright: #5e6b70; +$font-color-dark: #1a2127; +$structure-color-bright: #dbdad8; +$structure-color-dark: #5e6b70; +$y-axis-line-width: 2px; \ No newline at end of file diff --git a/scss/_fonts.scss b/scss/_fonts.scss new file mode 100644 index 0000000..ded439b --- /dev/null +++ b/scss/_fonts.scss @@ -0,0 +1 @@ +$font-main: Montserrat; diff --git a/scss/_text-indicator.scss b/scss/_text-indicator.scss new file mode 100644 index 0000000..4a9d70f --- /dev/null +++ b/scss/_text-indicator.scss @@ -0,0 +1,16 @@ +@import "fonts"; + +$value-text: 2em $font-main, sans-serif; +$label-text: 1em $font-main, sans-serif; + +.text-indicator { + white-space: nowrap; + overflow: hidden; + .value { + font: $value-text; + } + .label { + font: $label-text; + text-overflow: ellipsis; + } +} diff --git a/scss/_x-axis.scss b/scss/_x-axis.scss new file mode 100644 index 0000000..3e6dc12 --- /dev/null +++ b/scss/_x-axis.scss @@ -0,0 +1,34 @@ +@import "colors"; + +.proteic { + .x.axis { + + path { + stroke: $structure-color-bright; + stroke-width: $y-axis-line-width; + opacity: 1; + } + + line { + stroke-dasharray: $grid-v-dasharray; + } + + .tick:nth-of-type(even) { + line { + stroke: $structure-color-dark; + } + text { + fill: $font-color-dark; + } + } + } + + .x.axis.linear .tick:nth-of-type(odd) { + text { + fill: $font-color-bright; + } + line { + stroke: $structure-color-bright; + } + } +} diff --git a/scss/_y-axis.scss b/scss/_y-axis.scss new file mode 100644 index 0000000..f6fbfd8 --- /dev/null +++ b/scss/_y-axis.scss @@ -0,0 +1,31 @@ +@import "colors"; + +.proteic .y.axis path { + display: none; +} + +.proteic .y.axis .tick:nth-child(even) line { + stroke: $structure-color-dark; +} + +.proteic .y.axis .tick:nth-child(even) text { + fill: $font-color-dark; +} + +.proteic .y.axis .tick:nth-child(odd) text { + fill: $font-color-bright; +} + +.proteic .y.axis .tick:nth-child(odd) line { + stroke: $structure-color-bright; +} + +.proteic .y.axis .tick line { + stroke-dasharray: $grid-h-dasharray; +} + +//.proteic .y.axis .tick:nth-of-type(1) line { +// stroke: $structure-color-bright; +// stroke-width: $y-axis-line-width; +// /*display: none;*/ +//} \ No newline at end of file diff --git a/scss/proteic.scss b/scss/proteic.scss new file mode 100644 index 0000000..c220434 --- /dev/null +++ b/scss/proteic.scss @@ -0,0 +1,5 @@ +@import "axes"; +@import "x-axis"; +@import "y-axis"; +@import "text-indicator"; + diff --git a/src/Config.ts b/src/Config.ts new file mode 100644 index 0000000..43122b9 --- /dev/null +++ b/src/Config.ts @@ -0,0 +1,15 @@ +class Config { + private properties: { [key: string]: any; } = {}; + + constructor() { + } + public put(key: string, value: any) { + this.properties[key] = value; + return this; + } + public get(key: string): any { + return this.properties[key]; + } +}; + +export default Config; \ No newline at end of file diff --git a/src/Globals.ts b/src/Globals.ts new file mode 100644 index 0000000..69ee4ca --- /dev/null +++ b/src/Globals.ts @@ -0,0 +1,14 @@ +class Globals { + + public static COMPONENT_TRANSITION_TIME = 100; + public static COMPONENT_HIDE_SHOW_TRANSITION_TIME = 300; + public static COMPONENT_HIDE_OPACITY = 0.06; + public static COMPONENT_DATA_KEY_ATTRIBUTE = 'data-proteic-key'; + public static LEGEND_DATA_KEY_ATTRIBUTE = 'data-proteic-legend-key'; + public static LEGEND_HIDE_OPACITY = 0.3; + public static BREAKPOINT = 768; + public static ASPECT_RATIO = 0.7; + public static LOADING_ICON = 'data:image/gif;base64,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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA='; +}; + +export default Globals; \ No newline at end of file diff --git a/src/charts/Barchart.ts b/src/charts/Barchart.ts new file mode 100644 index 0000000..8349801 --- /dev/null +++ b/src/charts/Barchart.ts @@ -0,0 +1,55 @@ +import Chart from './Chart'; +import SvgStrategyBarchart from '../svg/strategies/SvgStrategyBarchart'; +import Config from '../Config'; +import { defaults } from '../utils/defaults/barchart'; +import { copy } from '../utils/functions'; + +class Barchart extends Chart { + + constructor(data: any, userConfig: any = {}) { + super( + new SvgStrategyBarchart(), + data, + userConfig, + defaults + ); + } + + fire(event: string, data: string) {//TODO: improve this section + if (event === 'transition') { + if (data === 'grouped') { + this.config.put('stacked', false); + } + else if (data === 'stacked') { + this.config.put('stacked', true); + } + this.draw(); + } + } + + public keepDrawing(datum: any) { + let datumType = datum.constructor; + if (datumType === Array) { + this.data = datum; + } + else { + let found = false; + for (let i = 0; i < this.data.length; i++) { + var d = this.data[i]; + if (d['x'] === datum['x'] && d['key'] === datum['key']) { + this.data[i] = datum; + found = true; + break; + } + } + if (!found) { + this.data.push(datum); + } + } + + this.draw(copy(this.data)); + } + +} + +export default Barchart; \ No newline at end of file diff --git a/src/charts/Chart.ts b/src/charts/Chart.ts new file mode 100644 index 0000000..75c61b5 --- /dev/null +++ b/src/charts/Chart.ts @@ -0,0 +1,72 @@ +import { SvgContext } from '../svg/strategies/SvgStrategy' +import SvgChart from '../svg/base/SvgChart'; +import Config from '../Config'; +import { copy } from '../utils/functions'; +import Datasource from '../datasources/Datasource'; +import { calculateWidth } from '../utils/screen'; +import { dispatch } from 'd3'; + +abstract class Chart { + + private context: SvgContext; + protected config: Config; + protected data: any; + private ds: Datasource = null; + private dispatcher: any = dispatch('onmessage', 'onopen', 'onerror', 'addLoading', 'removeLoading'); + + + constructor(strategy: SvgChart, data: any, userConfig: any, defaults: any) { + this.config = this.loadConfigFromUser(userConfig, defaults); + this.context = new SvgContext(strategy, this.config); + this.data = data; + } + + public draw(data: [{}] = this.data) { //TODO: SPLIT DATA INTO SMALL CHUNKS (stream-like). + this.context.draw(copy(data)); + this.data = data; + } + + /** + * + * Configure a datasources for the current instance. Datasources allows data to be catached from many sources, such as websockets endpoints, HTTP urls, etc. + * @param {Datasource} ds A datasource + * + * @memberOf Chart + + */ + public datasource(ds: Datasource) { + this.ds = ds; + + this.ds.configure(this.dispatcher); + + this.dispatcher.on('addLoading', () => this.context.addLoading()); + this.dispatcher.on('removeLoading', () => this.context.removeLoading()); + + this.dispatcher.on('onmessage', (data: any) => this.keepDrawing(data)); + + this.dispatcher.on('onopen', (event: any) => { + console.log('onopen', event); + }); + + this.dispatcher.on('onerror', (error: any) => { + console.log('onerror', error); + }); + + } + + protected loadConfigFromUser(userData: any, defaults: any): Config { + let config = new Config(); + for (let v in defaults) { + config.put(v, (v in userData) ? userData[v] : defaults[v]); + } + let width = config.get('width'); + width = calculateWidth(width, config.get('selector')) - config.get('marginLeft') - config.get('marginRight') + config.put('width', width); + return config; + } + + protected abstract keepDrawing(datum: any): void; + +} + +export default Chart; \ No newline at end of file diff --git a/src/charts/Gauge.ts b/src/charts/Gauge.ts new file mode 100644 index 0000000..1d7d717 --- /dev/null +++ b/src/charts/Gauge.ts @@ -0,0 +1,27 @@ +import Chart from './Chart'; +import SvgStrategyGauge from '../svg/strategies/SvgStrategyGauge'; +import Config from '../Config'; +import { defaults } from '../utils/defaults/gauge'; + + +class Gauge extends Chart { + + constructor(data: any, userConfig: any = {}) { + super( + new SvgStrategyGauge(), + data, + userConfig, + defaults + ); + } + + + public keepDrawing(datum: any) { + this.data = [datum[0]]; + super.draw(); + } + + +} + +export default Gauge; \ No newline at end of file diff --git a/src/charts/Linechart.ts b/src/charts/Linechart.ts new file mode 100644 index 0000000..b8fca99 --- /dev/null +++ b/src/charts/Linechart.ts @@ -0,0 +1,41 @@ +import Chart from './Chart'; +import SvgStrategyLinechart from '../svg/strategies/SvgStrategyLinechart'; +import Config from '../Config'; +import { defaults } from '../utils/defaults/linechart'; +import { copy } from '../utils/functions'; + +class Linechart extends Chart { + + constructor(data: any, userConfig: any = {}) { + super( + new SvgStrategyLinechart(), + data, + userConfig, + defaults + ); + } + + public keepDrawing(datum: any) { + let maxNumberOfElements: number = this.config.get('maxNumberOfElements'), + numberOfElements = this.data.length, + position = -1, + datumType = datum.constructor; + + if (datumType === Array) { + this.data = this.data.concat(datum); + } + else { + this.data.push(datum); + } + //Detect excess of elements given a maxNumberOfElements property + if (numberOfElements > maxNumberOfElements) { + let position = numberOfElements - maxNumberOfElements; + this.data = this.data.slice(position); + } + + this.draw(copy(this.data)); + } + +} + +export default Linechart; \ No newline at end of file diff --git a/src/charts/Network.ts b/src/charts/Network.ts new file mode 100644 index 0000000..99e51e8 --- /dev/null +++ b/src/charts/Network.ts @@ -0,0 +1,34 @@ +import Chart from './Chart'; +import SvgStrategyNetwork from '../svg/strategies/SvgStrategyNetwork'; +import Config from '../Config'; +import { defaults } from '../utils/defaults/network'; +import { copy } from '../utils/functions'; + + +class Network extends Chart { + + constructor(data: any, userConfig: any = {}) { + super( + new SvgStrategyNetwork(), + data, + userConfig, + defaults + ); + } + + + public keepDrawing(datum: any) { + var datumType = datum.constructor; + + if (datumType === Array) { + this.data = this.data.concat(datum); + } + else { + this.data.push(datum); + } + this.draw(copy(this.data)); + } + +} + +export default Network; \ No newline at end of file diff --git a/src/charts/PieChart.ts b/src/charts/PieChart.ts new file mode 100644 index 0000000..8fc6dd7 --- /dev/null +++ b/src/charts/PieChart.ts @@ -0,0 +1,36 @@ +import Chart from "./Chart"; +import Config from "../Config"; +import SvgStrategyPieChart from "../svg/strategies/SvgStrategyPieChart"; +import { defaults } from "../utils/defaults/piechart"; +import { copy } from "../utils/functions"; + +class PieChart extends Chart { + + + constructor(data: any, userConfig: any = {}) { + super( + new SvgStrategyPieChart, + data, + userConfig, + defaults + ); + } + + protected keepDrawing(datum: any) { + let datumType = datum.constructor; + if (datumType === Array) { + if (this.data) { + this.data = this.data.concat(datum); + } else { + this.data = datum; + } + } + else { + this.data.push(datum); + } + this.draw(copy(this.data)); + } + +} + +export default PieChart; \ No newline at end of file diff --git a/src/charts/Scatterplot.ts b/src/charts/Scatterplot.ts new file mode 100644 index 0000000..28b680b --- /dev/null +++ b/src/charts/Scatterplot.ts @@ -0,0 +1,40 @@ +import Chart from './Chart'; +import SvgStrategyScatterplot from '../svg/strategies/SvgStrategyScatterplot'; +import Config from '../Config'; +import { defaults } from '../utils/defaults/scatterplot'; +import { copy } from '../utils/functions'; + + +class Scatterplot extends Chart { + + constructor(data: any, userConfig: any = {}) { + super( + new SvgStrategyScatterplot(), + data, + userConfig, + defaults + ); + } + + + public keepDrawing(datum: any) { + var datumType = datum.constructor; + + if (datumType === Array) { + if (this.data) { + this.data = this.data.concat(datum); + } else { + this.data = datum; + } + } + else { + this.data.push(datum); + } + this.draw(copy(this.data)); + } + + + +} + +export default Scatterplot; \ No newline at end of file diff --git a/src/charts/StackedArea.ts b/src/charts/StackedArea.ts new file mode 100644 index 0000000..5f124b4 --- /dev/null +++ b/src/charts/StackedArea.ts @@ -0,0 +1,38 @@ +import Chart from './Chart'; +import SvgStrategyStreamgraph from '../svg/strategies/SvgStrategyStreamgraph'; +import Config from '../Config'; +import { defaults } from '../utils/defaults/stackedArea'; +import { copy } from '../utils/functions'; +import { + stackOrderInsideOut, + stackOffsetNone, + stack as d3Stack +} from 'd3'; + +class StackedArea extends Chart { + + constructor(data: any, userConfig: any = {}) { + super( + new SvgStrategyStreamgraph(), //It uses the same strategy than streamgraph. The only difference is the stack. + data, + userConfig, + defaults + ); + } + + public keepDrawing(datum: any) { + var datumType = datum.constructor; + + if (datumType === Array) { + this.data = this.data.concat(datum); + } + else { + this.data.push(datum); + } + this.draw(copy(this.data)); + } + + +} + +export default StackedArea; \ No newline at end of file diff --git a/src/charts/Streamgraph.ts b/src/charts/Streamgraph.ts new file mode 100644 index 0000000..240eec1 --- /dev/null +++ b/src/charts/Streamgraph.ts @@ -0,0 +1,34 @@ +import Chart from './Chart'; +import SvgStrategyStreamgraph from '../svg/strategies/SvgStrategyStreamgraph'; +import Config from '../Config'; +import { defaults } from '../utils/defaults/streamgraph'; +import { copy } from '../utils/functions'; + + + +class Streamgraph extends Chart { + + constructor(data: any, userConfig: any = {}) { + super( + new SvgStrategyStreamgraph(), + data, + userConfig, + defaults + ); + } + + public keepDrawing(datum: any) { + var datumType = datum.constructor; + + if (datumType === Array) { + this.data = this.data.concat(datum); + } + else { + this.data.push(datum); + } + this.draw(copy(this.data)); + } + +} + +export default Streamgraph; \ No newline at end of file diff --git a/src/charts/Sunburst.ts b/src/charts/Sunburst.ts new file mode 100644 index 0000000..83faefb --- /dev/null +++ b/src/charts/Sunburst.ts @@ -0,0 +1,36 @@ +import Chart from "./Chart"; +import Config from "../Config"; +import SvgStrategySunburst from "../svg/strategies/SvgStrategySunburst"; +import { defaults } from "../utils/defaults/sunburst"; +import { copy } from "../utils/functions"; + +class Sunburst extends Chart { + + + constructor(data: any, userConfig: any = {}) { + super( + new SvgStrategySunburst(), + data, + userConfig, + defaults + ); + } + + protected keepDrawing(datum: any) { + let datumType = datum.constructor; + if (datumType === Array) { + if (this.data) { + this.data = this.data.concat(datum); + } else { + this.data = datum; + } + } + else { + this.data.push(datum); + } + this.draw(copy(this.data)); + } + +} + +export default Sunburst; \ No newline at end of file diff --git a/src/charts/Swimlane.ts b/src/charts/Swimlane.ts new file mode 100644 index 0000000..23514fb --- /dev/null +++ b/src/charts/Swimlane.ts @@ -0,0 +1,37 @@ +import Chart from './Chart'; +import SvgStrategySwimlane from '../svg/strategies/SvgStrategySwimlane'; +import Config from '../Config'; +import { defaults } from '../utils/defaults/swimlane'; +import { calculateWidth } from '../utils/screen'; +import { + stackOrderInsideOut, + stackOffsetWiggle, + stack as d3Stack +} from 'd3'; +import { copy } from '../utils/functions'; + +class Swimlane extends Chart { + + constructor(data: any, userConfig: any = {}) { + super( + new SvgStrategySwimlane(), + data, + userConfig, + defaults + ); + } + + public keepDrawing(datum: any) { + var datumType = datum.constructor; + + if (datumType === Array) { + this.data = this.data.concat(datum); + } + else { + this.data.push(datum); + } + this.draw(copy(this.data)); + } +} + +export default Swimlane; \ No newline at end of file diff --git a/src/charts/barchart.js b/src/charts/barchart.js deleted file mode 100644 index b10d05e..0000000 --- a/src/charts/barchart.js +++ /dev/null @@ -1,70 +0,0 @@ -import Chart from './base/Chart'; -import * as defaultProperties from '../utils/defaults/linechart'; - -/** - * Barchart implementation. This charts belongs to 'Basic' family. - * It is inherited on 'Basic'. - */ -export default class Barchart extends Chart { - - /** - * Barchart constructor. It needs (at least) one argument to start: data. - * Optionally, you can indicate a second argument that includes all the chart options. If you - * do not specify this, '_default' object is used by default. - */ - constructor(data, config) { - super(data, config); - let keys = Object.keys(defaultProperties.defaults); - this._initializeAPI(keys); - } - - /** - * Renders a data object on the chart. - * @param {Object} data - This object contains the data that will be rendered on chart. If you do not - * specify this param, this.data will be used instead. - */ - draw(data = this.data) { - super.draw(data); - } - - fire(event, data) {//TODO: improve this section - if (event === 'transition') { - if (data === 'grouped') { - this._svg.strategy.transition2Grouped(); - } - else if (data === 'stacked') { - this._svg.strategy.transition2Stacked(); - } - - this._svg.strategy.draw(); - } - } - - /** - * Add new data to the current graph. If it is empty, this creates a new one. - * @param {Object} datum - data to be rendered - */ - keepDrawing(datum) { - super.keepDrawing(datum, 'replace'); - } - - _keepDrawingByReplacing(datum) { - let datumType = datum.constructor; - if (datumType === Array) { - this.data = datum; - } - else { - for (let i = 0; i < this.data.length; i++) { - var d = this.data[i]; - if (d.x === datum.x) { - this.data[i] = datum; - break; - } - } - } - - this.draw(JSON.parse(JSON.stringify(this.data))); - } - - -} \ No newline at end of file diff --git a/src/charts/base/Chart.js b/src/charts/base/Chart.js deleted file mode 100644 index d15fb73..0000000 --- a/src/charts/base/Chart.js +++ /dev/null @@ -1,202 +0,0 @@ -import { dispatch } from 'd3'; -import { SvgStrategy, strategies } from '../../svg/SvgStrategy'; -import { svgAsDataUri } from '../../utils/image'; - -/** - * Base class, which includes common methods for all the charts - * @export Chart - * @class Chart - */ -export default class Chart { - /** - * Non-instanciable Chart. This is the parent class for all the ones (Linechart, Barchart, etc.) - * - * @param {any} d Data. This object could be an array of data points or a datasource. Examples: - *
-     * //With datasource
-     * var data = {
-     *       endpoint: 'ws://192.168.3.32:3000/barchart'
-     * };
-     *  var dataSource = new proteic.WebsocketDatasource(data);
-     * 
-     * barchart = new proteic.Barchart(dataSource);
-     * 
-     * //With data
-     * barchart = new proteic.Barchart([{x:"SP", y:2},{x:"FR", y:6}]);
-     * 
- * @param {any} config Configuration of the chart. - * - * @memberOf Chart - */ - constructor(d, config) { - var clazz = this.constructor.name; - if (clazz === 'Chart') { - throw new Error(clazz + ' is non-instanciable'); - } - - this.events = {}; - - if (!d && !config) { - throw new Error('Missing constructor parameters'); - } - - let dataFormat = d.constructor.name; - let nArguments = (d && config) ? 2 : 1; - - switch (dataFormat) { - case 'WebsocketDatasource': - case 'HTTPDatasource': - this.datasource = d; - this.data = []; - this._configureDatasource(); - break; - case 'Array': - this.data = d; - break; - default: - throw TypeError('Wrong data format'); - } - //if only 1 parameter is specified, take default config. Else, take the second argument as config. - this.config = (nArguments === 1) ? {} : config; - - this._initializeSVGContext(); - } - - /** - * Private method. Initialize the API by dinamically creating methods. It creates N method, one per configuration option - * - * @param {any} properties An array that contains the name of the methods - * - * @memberOf Chart - */ - _initializeAPI(properties) { - let clazz = this.constructor; - properties.forEach((method) => { - clazz.prototype[method] = function (value) { - return this.change(method, value); - } - }); - } - - /** - * Return the chart context: data, configuration and type - * - * @returns chart Chart context - * - * @memberOf Chart - */ - _getChartContext() { - return { - data: this.data, - config: this.config, - cType: this.constructor.name - }; - } - - /** - * Initialize the SVG context, by dinamically creating an tag in the specified selector. It is automatically invoked - * by the chart constructor and should not be used outside of this instance. - * - * @memberOf Chart - */ - _initializeSVGContext() { - this._svg = new SvgStrategy(strategies[this.constructor.name](this._getChartContext())); - } - - /** - * Paint data into the chart. If no data is specified, it takes by default the last dataset (very useful when repaintng charts ) - * - * @param {any} data Data to be painted - * - * @memberOf Chart - */ - draw(data = this.data) { - this._svg.draw(data); - } - - /** - * Make and download an image of the current state of the chart. - * - * @memberOf Chart - */ - download() { - let selector = this._svg.strategy.config.selector + ' ' + 'svg'; - svgAsDataUri(d3.select(selector).node(), {}, (uri, err) => { - if (err) { - throw Error('Error converting to image ' + err); - } - else { - let link = document.createElement('a'); - link.style = 'position: fixed; left -10000px;'; // making it invisible - link.href = uri - link.download = this.constructor.name + '.svg'; - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); - } - }); - } - - _keepDrawingByAdding(datum) { - var datumType = datum.constructor; - - if (datumType === Array) { - this.data = this.data.concat(datum); - } - else { - this.data.push(datum); - } - this.draw(JSON.parse(JSON.stringify(this.data))); - } - - - /** - * - * This method add a data record / array of data into the current data. - * @param {any} datum - * @param {any} method - * - * @memberOf Chart - - */ - keepDrawing(datum, method) { - if (method === 'add') { - this._keepDrawingByAdding(datum); - } - else { - this._keepDrawingByReplacing(datum); - } - } - - _configureDatasource() { - this.dispatcher = dispatch('onmessage', 'onopen', 'onerror'); - - this.datasource.configure(this.dispatcher); - - this.dispatcher.on('onmessage', (data) => this.keepDrawing(data)); - //this.dispatcher.on('onmessage', (data) => console.log(data)); - - - this.dispatcher.on('onopen', (event) => { - console.log('onopen', event); - }); - - this.dispatcher.on('onerror', (error) => { - console.log('onerror', error); - }); - } - - /** - * Change a configuration property. They all are also available through a method with the same name of the property. - * - * @param {any} property property name - * @param {any} value the new property value - * @returns the instance of the current chart - * - * @memberOf Chart - */ - change(property, value) { - this._svg.strategy.changeConfigProperty(property, value); - return this; - } -} \ No newline at end of file diff --git a/src/charts/gauge.js b/src/charts/gauge.js deleted file mode 100644 index 790a3d1..0000000 --- a/src/charts/gauge.js +++ /dev/null @@ -1,37 +0,0 @@ -import Chart from './base/Chart'; - -/** - * Gauge implementation. This charts belongs to 'Basic' family. - * It is inherited on 'Basic'. - */ -export default class Gauge extends Chart { - - /** - * Gauge constructor. It needs (at least) one argument to start: data. - * Optionally, you can indicate a second argument that includes all the chart options. If you - * do not specify this, '_default' object is used by default. - */ - constructor(data, config) { - super(data, config); - } - - /** - * Renders a data object on the chart. - * @param {Object} data This object contains the data that will be rendered on chart. If you do not - * specify this param, this.data will be used instead. - */ - draw(data = this.data) { - super.draw(data); - } - - - /** - * Add new data to the current graph. If it is empty, this creates a new one. - * @param {Object} datum data to be rendered - */ - keepDrawing(datum) { - this.data = [datum[0]]; - super.draw(); - } - -} \ No newline at end of file diff --git a/src/charts/linechart.js b/src/charts/linechart.js deleted file mode 100644 index 229b983..0000000 --- a/src/charts/linechart.js +++ /dev/null @@ -1,37 +0,0 @@ -import Chart from './base/Chart'; -import * as defaultProperties from '../utils/defaults/linechart'; - -/** - * Linechart implementation. This charts belongs to 'Basic' family. - * It is inherited on 'Basic'. - */ -export default class Linechart extends Chart { - - /** - * Linechart constructor. It needs (at least) one argument to start: data. - * Optionally, you can indicate a second argument that includes all the chart options. If you - * do not specify this, '_default' object is used by default. - */ - constructor(data, config) { - super(data, config); - let keys = Object.keys(defaultProperties.defaults); - this._initializeAPI(keys); - } - - /** - * Renders a data object on the chart. - * @param {Object} data This object contains the data that will be rendered on chart. If you do not - * specify this param, this.data will be used instead. - */ - draw(data = this.data) { - super.draw(data); - } - - /** - * Add new data to the current graph. If it is empty, this creates a new one. - * @param {Object} datum data to be rendered - */ - keepDrawing(datum) { - super.keepDrawing(datum, 'add'); - } -} \ No newline at end of file diff --git a/src/charts/networkgraph.js b/src/charts/networkgraph.js deleted file mode 100644 index 4486a13..0000000 --- a/src/charts/networkgraph.js +++ /dev/null @@ -1,37 +0,0 @@ -import Chart from './base/Chart'; -import * as defaultProperties from '../utils/defaults/networkgraph'; - -/** - * Linechart implementation. This charts belongs to 'Basic' family. - * It is inherited on 'Basic'. - */ -export default class Networkgraph extends Chart { - - /** - * Linechart constructor. It needs (at least) one argument to start: data. - * Optionally, you can indicate a second argument that includes all the chart options. If you - * do not specify this, '_default' object is used by default. - */ - constructor(data, config) { - super(data, config); - let keys = Object.keys(defaultProperties.defaults); - this._initializeAPI(keys); - } - - /** - * Renders a data object on the chart. - * @param {Object} data This object contains the data that will be rendered on chart. If you do not - * specify this param, this.data will be used instead. - */ - draw(data = this.data) { - super.draw(data); - } - - /** - * Add new data to the current graph. If it is empty, this creates a new one. - * @param {Object} datum data to be rendered - */ - keepDrawing(datum) { - super.keepDrawing(datum, 'add'); - } -} \ No newline at end of file diff --git a/src/charts/scatterplot.js b/src/charts/scatterplot.js deleted file mode 100644 index d1d974d..0000000 --- a/src/charts/scatterplot.js +++ /dev/null @@ -1,37 +0,0 @@ -import Chart from './base/Chart'; -import * as defaultProperties from '../utils/defaults/scatterplot'; - -/** - * Scatterplot implementation. This charts belongs to 'Basic' family. - * It is inherited on 'Basic'. - */ -export default class Scatterplot extends Chart { - - /** - * Scatterplot constructor. It needs (at least) one argument to start: data. - * Optionally, you can indicate a second argument that includes all the chart options. If you - * do not specify this, '_default' object is used by default. - */ - constructor(data, config) { - super(data, config); - let keys = Object.keys(defaultProperties.defaults); - this._initializeAPI(keys); - } - - /** - * Renders a data object on the chart. - * @param {Object} data This object contains the data that will be rendered on chart. If you do not - * specify this param, this.data will be used instead. - */ - draw(data = this.data) { - super.draw(data); - } - - /** - * Add new data to the current graph. If it is empty, this creates a new one. - * @param {Object} datum data to be rendered - */ - keepDrawing(datum) { - super.keepDrawing(datum, 'add'); - } -} \ No newline at end of file diff --git a/src/charts/stackedArea.js b/src/charts/stackedArea.js deleted file mode 100644 index 5a9ac0f..0000000 --- a/src/charts/stackedArea.js +++ /dev/null @@ -1,42 +0,0 @@ -import Chart from './base/Chart'; -import * as defaultProperties from '../utils/defaults/stackedArea'; - - -/** - * StackedArea implementation. This charts belongs to 'Flow' family. - * It is inherited on 'Flow'. - */ -export default class StackedArea extends Chart { - - /** - * StackedArea constructor. It needs (at least) one argument to start: data. - * Optionally, you can indicate a second argument that includes all the chart options. If you - * do not specify this, '_default' object is used by default. - */ - constructor(data, config) { - super(data, config); - let keys = Object.keys(defaultProperties.defaults); - this._initializeAPI(keys); - } - - /** - * Renders a data object on the chart. - * @param {Object} data This object contains the data that will be rendered on chart. If you do not - * specify this param, this.data will be used instead. - */ - draw(data = this.data) { - super.draw(data); - } - - /** - * Add new data to the current graph. If it is empty, this creates a new one. - * @param {Object} datum data to be rendered - */ - keepDrawing(datum) { - if (!this.datum) { - this.datum = []; - } - this.datum = this.datum.concat(datum); - super.draw(this.datum); - } -} \ No newline at end of file diff --git a/src/charts/streamgraph.js b/src/charts/streamgraph.js deleted file mode 100644 index 088ce61..0000000 --- a/src/charts/streamgraph.js +++ /dev/null @@ -1,37 +0,0 @@ -import Chart from './base/Chart'; -import * as defaultProperties from '../utils/defaults/streamgraph'; - -/** - * Streamgraph implementation. This charts belongs to 'Flow' family. - * It is inherited on 'Flow'. - */ -export default class Streamgraph extends Chart { - - /** - * Streamgraph constructor. It needs (at least) one argument to start: data. - * Optionally, you can indicate a second argument that includes all the chart options. If you - * do not specify this, '_default' object is used by default. - */ - constructor(data, config) { - super(data, config); - let keys = Object.keys(defaultProperties.defaults); - this._initializeAPI(keys); - } - - /** - * Renders a data object on the chart. - * @param {Object} data This object contains the data that will be rendered on chart. If you do not - * specify this param, this.data will be used instead. - */ - draw(data = this.data) { - super.draw(data); - } - - /** - * Add new data to the current graph. If it is empty, this creates a new one. - * @param {Object} datum data to be rendered - */ - keepDrawing(datum) { - super.keepDrawing(datum, 'add'); - } -} \ No newline at end of file diff --git a/src/charts/sunburst.js b/src/charts/sunburst.js deleted file mode 100644 index e75bb8a..0000000 --- a/src/charts/sunburst.js +++ /dev/null @@ -1,104 +0,0 @@ -import Chart from './base/Chart'; - -/** - * Sunburst implementation. This charts belongs to 'Hierarchical' family. - */ -export default class Sunburst extends Chart { - - /** - * Sunburst constructor. It needs (at least) one argument to start: data. - * Optionally, you can indicate a second argument that includes all the chart options. If you - * do not specify this, '_default' object is used by default. - */ - constructor(data, config) { - super(data, config); - } - - /** - * Renders a data object on the chart. - * @param {Object} data This object contains the data that will be rendered on chart. If you do not - * specify this param, this.data will be used instead. - */ - draw(data = this.data) { - super.draw(data); - } - - /** - * Add new data to the current graph. If it is empty, this creates a new one. - * @param {Object} datum data to be rendered - */ - keepDrawing(datum) { - super.keepDrawing(datum, 'add'); - } - - // /** - // * Add new data to the current graph. If it is empty, this creates a new one. - // * @param {Object} datum data to be rendered - // */ - // keepDrawing(datum) { - // if (this.data.constructor === Array) { this.data = {}; } - // let config = this.config; - // if (!datum) { - // console.warn('attemp to draw null datum'); - // return; - // } - // - // this._buildTree(datum[datum.length - 1].path, datum[datum.length - 1].value, this.data); - // - // this.draw(); - // - // return this.data; - // } - - /** - * Inserts the new nodes into the existing tree. - * From: http://bl.ocks.org/kerryrodden/7090426 - * - * @param pathString - * @param value - * @param data - * @private - */ - _buildTree(pathString, value, data) { - let path = pathString.split('/'); - var current = data; - for (let i = 1; i < path.length; i++) { - var children = current.children; - var name = path[i]; - var child; - if (i + 1 < path.length) { - var foundChild = false; - for (let j = 0; children !== undefined && j < children.length; j++) { - if (children[j].name === name) { - child = children[j]; - foundChild = true; - break; - } - } - if (!foundChild) { - child = { - 'name': name, - 'children': [] - }; - if (children === undefined) { - current.children = []; - } - delete current.value; - current.children.push(child); - } - current = child; - } else { - child = { - 'name': name, - 'value': value - }; - if (children === undefined) { - current.children = []; - } - delete current.value; - current.children.push(child); - } - } - } - -} \ No newline at end of file diff --git a/src/charts/swimlane.js b/src/charts/swimlane.js deleted file mode 100644 index 6929cd8..0000000 --- a/src/charts/swimlane.js +++ /dev/null @@ -1,38 +0,0 @@ -import Chart from './base/Chart'; -import * as defaultProperties from '../utils/defaults/swimlane'; - - -/** - * Linechart implementation. This charts belongs to 'Basic' family. - * It is inherited on 'Basic'. - */ -export default class Swimlane extends Chart { - - /** - * Linechart constructor. It needs (at least) one argument to start: data. - * Optionally, you can indicate a second argument that includes all the chart options. If you - * do not specify this, '_default' object is used by default. - */ - constructor(data, config) { - super(data, config); - let keys = Object.keys(defaultProperties.defaults); - this._initializeAPI(keys); - } - - /** - * Renders a data object on the chart. - * @param {Object} data This object contains the data that will be rendered on chart. If you do not - * specify this param, this.data will be used instead. - */ - draw(data = this.data) { - super.draw(data); - } - - /** - * Add new data to the current graph. If it is empty, this creates a new one. - * @param {Object} datum data to be rendered - */ - keepDrawing(datum) { - super.keepDrawing(datum, 'add'); - } -} \ No newline at end of file diff --git a/src/datasources/Datasource.js b/src/datasources/Datasource.ts similarity index 78% rename from src/datasources/Datasource.js rename to src/datasources/Datasource.ts index 82a8c28..26099bd 100644 --- a/src/datasources/Datasource.js +++ b/src/datasources/Datasource.ts @@ -1,3 +1,5 @@ +import {dispatch} from 'd3'; + /** * * A Datasource is the name given to the connection set up to a data endpoint. This class defines the common methods for the datasources, @@ -8,7 +10,7 @@ * @class Datasource The Datasource class * */ -export default class Datasource { +class Datasource { /** * Creates an instance of Datasource. * @@ -16,9 +18,13 @@ export default class Datasource { * @memberOf Datasource */ + protected dispatcher: any = null; + protected source : {any} = null; + protected isWaitingForData : boolean = true; + constructor() { - this.filters = []; - this.properties = []; + // this.filters = []; + // this.properties = []; } /** @@ -43,6 +49,12 @@ export default class Datasource { } + configure(dispatcher) { + this.dispatcher = dispatcher; + } + +/* + property(prop, newProp, cast) { this.properties.push({ 'p': prop, 'newP': newProp, cast: cast }); return this; @@ -54,14 +66,15 @@ export default class Datasource { for (let i in this.properties) { let p = this.properties[i].p; let value = eval('data.' + this.properties[i].newP); - // if(this.properties[i].cast){ + // if(this.properties[i].cast){ // value = new this.properties[i].cast(value); - // } + // } result[p] = value; } return result; } + */ /** * Filters the incoming messages. Each data record that do not comply the filter condition will be discarded @@ -74,4 +87,6 @@ export default class Datasource { filter(filter) { return this; } -} \ No newline at end of file +} + +export default Datasource; \ No newline at end of file diff --git a/src/datasources/HTTPDatasource.js b/src/datasources/HTTPDatasource.ts similarity index 90% rename from src/datasources/HTTPDatasource.js rename to src/datasources/HTTPDatasource.ts index 77cfc54..c3b7d70 100644 --- a/src/datasources/HTTPDatasource.js +++ b/src/datasources/HTTPDatasource.ts @@ -25,7 +25,7 @@ export default class HTTPDatasource extends Datasource { * @param {any} source An http endpoint. If invalid, this class will throw an Error. * * @memberOf HTTPDatasource - + * */ constructor(source) { super(); @@ -34,17 +34,7 @@ export default class HTTPDatasource extends Datasource { this.started = false; } - /** - * Configure a dispatcher for this datasource. - * - * @param {any} dispatcher A d3 dispatcher. This dispatcher is in charge of receiving and sending events. - * - * @memberOf HTTPDatasource - */ - configure(dispatcher) { - this.dispatcher = dispatcher; - } - + /** * * Initialize an HTTP connection @@ -69,7 +59,6 @@ export default class HTTPDatasource extends Datasource { } _startRequest(url) { - window.console.log('url', url); request(url).get((e, response) => this._handleResponse(response)); } diff --git a/src/datasources/WebsocketDatasource.js b/src/datasources/WebsocketDatasource.ts similarity index 80% rename from src/datasources/WebsocketDatasource.js rename to src/datasources/WebsocketDatasource.ts index 1fe491e..209d5ef 100644 --- a/src/datasources/WebsocketDatasource.js +++ b/src/datasources/WebsocketDatasource.ts @@ -1,5 +1,5 @@ import Datasource from './Datasource'; - +import Globals from '../Globals'; /** * * This datasource set up a connection to a websocket server. @@ -8,7 +8,7 @@ import Datasource from './Datasource'; * @extends {Datasource} */ -export default class WebsocketDatasource extends Datasource { +class WebsocketDatasource extends Datasource { /** * Creates an instance of WebsocketDatasource. This datasource will try to connect to the speficied websocket endpoint. @@ -26,11 +26,14 @@ export default class WebsocketDatasource extends Datasource { * @memberOf WebsocketDatasource */ - constructor(source) { + private ws: WebSocket; + + + constructor(source: any) { super(); this.source = source; } - + /** * Configure a dispatcher for this datasource. * @@ -38,7 +41,7 @@ export default class WebsocketDatasource extends Datasource { * * @memberOf WebsocketDatasource */ - configure(dispatcher) { + configure(dispatcher: any) { this.dispatcher = dispatcher; } @@ -51,16 +54,22 @@ export default class WebsocketDatasource extends Datasource { */ start() { super.start(); - this.ws = new window.WebSocket(this.source.endpoint); + this.ws = new WebSocket(this.source['endpoint']); + + + this.dispatcher.call('addLoading', this, {}); this.ws.onopen = (e) => { this.dispatcher.call('onopen', this, e); }; this.ws.onerror = (e) => { throw new Error('An error occurred trying to reach the websocket server' + e); - //this.dispatcher.call('onerror', this, e); }; this.ws.onmessage = (e) => { + if (this.isWaitingForData) { + this.dispatcher.call('removeLoading', this, e); + this.isWaitingForData = false; + } var data = JSON.parse(e.data); this.dispatcher.call('onmessage', this, data); }; @@ -76,4 +85,6 @@ export default class WebsocketDatasource extends Datasource { this.ws.close(); } } -} \ No newline at end of file +} + +export default WebsocketDatasource; \ No newline at end of file diff --git a/src/svg/Interpolation.ts b/src/svg/Interpolation.ts new file mode 100644 index 0000000..82d28e2 --- /dev/null +++ b/src/svg/Interpolation.ts @@ -0,0 +1,29 @@ +import { + CurveFactory, + curveLinear, + curveLinearClosed, + curveMonotoneX, + curveMonotoneY, + curveNatural, + curveStep, + curveStepAfter, + curveStepBefore, +} from 'd3'; + +class Interpolation { + + public static CURVE_LINEAR = curveLinear; + public static CURVE_LINEAR_CLOSED = curveLinearClosed; + public static CURVE_MONOTONE_X = curveMonotoneX; + public static CURVE_MONOTONE_Y = curveMonotoneY; + public static CURVE_NATURAL = curveNatural; + public static CURVE_STEP = curveStep; + public static CURVE_STEP_AFTER = curveStepAfter; + public static CURVE_STEP_BEFORE = curveStepBefore; + + // public create(): CurveFactory { + // return curveStepBefore; + // } +}; + +export default Interpolation; \ No newline at end of file diff --git a/src/svg/SvgStrategy.js b/src/svg/SvgStrategy.js deleted file mode 100644 index 3450e3f..0000000 --- a/src/svg/SvgStrategy.js +++ /dev/null @@ -1,54 +0,0 @@ -import {SvgLinechartStrategy} from './strategy_linechart'; -import {SvgBarchartStrategy} from './strategy_barchart'; -import {SvgStreamgraphStrategy} from './strategy_streamgraph'; -import {SvgStackedAreaStrategy} from './strategy_stackedArea'; -import {SvgSwimlaneStrategy} from './strategy_swimlane'; -import {SvgGaugeStrategy} from './strategy_gauge'; -import {SvgNetworkgraphStrategy} from './strategy_networkgraph'; -import {SvgSunburstStrategy} from './strategy_sunburst'; -import {SvgScatterplotStrategy} from './strategy_scatterplot'; - -/** - * SvgStrategy wrapper class - */ -export class SvgStrategy { - constructor(strategy) { - this.strategy = strategy; - } - draw(data) { - this.strategy.draw(data); - } - on(events){ - this.strategy.on(events); - } -} - -export const strategies = { - Barchart(chartContext) { - return new SvgBarchartStrategy(chartContext); - }, - Linechart(chartContext) { - return new SvgLinechartStrategy(chartContext); - }, - Streamgraph(chartContext) { - return new SvgStreamgraphStrategy(chartContext); - }, - Gauge(chartContext) { - return new SvgGaugeStrategy(chartContext); - }, - Scatterplot(chartContext) { - return new SvgScatterplotStrategy(chartContext); - }, - Sunburst(chartContext) { - return new SvgSunburstStrategy(chartContext); - }, - Swimlane(chartContext) { - return new SvgSwimlaneStrategy(chartContext); - }, - StackedArea(chartContext) { - return new SvgStackedAreaStrategy(chartContext); - }, - Networkgraph(chartContext) { - return new SvgNetworkgraphStrategy(chartContext); - } -}; \ No newline at end of file diff --git a/src/svg/base/SvgChart.ts b/src/svg/base/SvgChart.ts new file mode 100644 index 0000000..c7a850f --- /dev/null +++ b/src/svg/base/SvgChart.ts @@ -0,0 +1,36 @@ +import Container from '../components/Container'; +import Config from '../../Config'; + +abstract class SvgChart { + + protected container: Container; + protected config: Config; + + constructor() { + + } + + initialize() { + this.container = new Container(this.config); + } + + setConfig(config: Config) { + this.config = config; + } + + abstract draw(data: [{}]): void; + + + public addLoading() { + this.container.addLoadingIcon(); + } + + public removeLoading() { + this.container.removeLoadingIcon(); + } + + + +} + +export default SvgChart; \ No newline at end of file diff --git a/src/svg/base/XYAxesChart.ts b/src/svg/base/XYAxesChart.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/svg/base/svgAxis.js b/src/svg/base/svgAxis.js deleted file mode 100644 index 01677f7..0000000 --- a/src/svg/base/svgAxis.js +++ /dev/null @@ -1,72 +0,0 @@ -import { SvgContainer } from '../components/svgContainer'; -import { calculateWidth } from '../../utils/screen'; - -export class SvgAxis { - /** - * Creates an instance of SvgAxis. - * - * @param {any} context Chart context. It contains data, configuration and chart type - * - * @memberOf SvgAxis - - */ - constructor(context) { - this._loadConfig(context.config); - this.svgContainer = new SvgContainer(this.config); - } - - changeConfigProperty(p, v) { - this.config[p] = v; - if (p === 'width' || p === 'height') { - this.config.needRescaling = true; - } - } - - rescale(width = this.config.width, height = this.config.height) { - this.axes.rescale(width, height); - this.config.needRescaling = false; - } - - /** - * - * Load the configuration context. It creates a configuration global from the parameters specified by users. - * If any parameter is empty, this will be replaced by its default option - * - * @param {any} config User configuration - * @param {any} defaults Defaults values for this chart - * - * @memberOf SvgAxis - - */ - _loadConfig(config, defaults) { - this.config = {}; - //Selector - this.config.selector = config.selector || defaults.selector; - //Margins - this.config.marginTop = config.marginTop || defaults.marginTop; - this.config.marginLeft = config.marginLeft || defaults.marginLeft; - this.config.marginRight = config.marginRight || defaults.marginRight; - this.config.marginBottom = config.marginBottom || defaults.marginBottom; - //Width & height - this.config.width = config.width - ? calculateWidth(config.width, this.config.selector) - this.config.marginLeft - this.config.marginRight - : calculateWidth(defaults.width, this.config.selector) - this.config.marginLeft - this.config.marginRight; - this.config.height = config.height || defaults.height; - //Axis - this.config.xAxisType = config.xAxisType || defaults.xAxisType; - this.config.xAxisFormat = config.xAxisFormat || defaults.xAxisFormat; - this.config.xAxisLabel = config.xAxisLabel || defaults.xAxisLabel; - this.config.yAxisType = config.yAxisType || defaults.yAxisType; - this.config.yAxisFormat = config.yAxisFormat || defaults.yAxisFormat; - this.config.yAxisLabel = config.yAxisLabel || defaults.yAxisLabel; - //Color - this.config.colorScale = config.colorScale || defaults.colorScale; - //Events - this.config.onDown = config.onDown || defaults.onDown; - this.config.onUp = config.onUp || defaults.onUp; - this.config.onHover = config.onHover || defaults.onHover; - this.config.onClick = config.onClick || defaults.onClick; - this.config.onLeave = config.onLeave || defaults.onLeave; - } - -} \ No newline at end of file diff --git a/src/svg/components/Areaset.ts b/src/svg/components/Areaset.ts new file mode 100644 index 0000000..66c9ead --- /dev/null +++ b/src/svg/components/Areaset.ts @@ -0,0 +1,73 @@ +import Component from './Component'; +import Config from '../../Config'; +import XAxis from './XAxis'; +import YAxis from './YAxis'; +import Globals from '../../Globals'; + +import { + area, + selection, + nest, + easeLinear, + CurveFactory, + Area +} from 'd3'; + + +class Areaset extends Component { + + private x: XAxis; + private y: YAxis; + private areaGenerator: Area; + + constructor(x: XAxis, y: YAxis) { + super(); + this.x = x; + this.y = y; + } + + public render() { + let height = this.config.get('height'), + propertyX = this.config.get('propertyX'), + propertyY = this.config.get('propertyY'), + curve: CurveFactory = this.config.get('curve'); + + this.areaGenerator = area() + .curve(curve) + + .x((d: any) => this.x.xAxis.scale()(d[propertyX])) + .y0(height) + .y1((d: any) => this.y.yAxis.scale()(d[propertyY])); + } + + public update(data: [any]) { + let propertyKey = this.config.get('propertyKey'); + let dataSeries = nest().key((d: any) => d[propertyKey]).entries(data); + let areas = this.svg.selectAll('g.area'); + let colorScale = this.config.get('colorScale'); + let height = this.config.get('height'); + let areaOpacity = this.config.get('areaOpacity'); + + areas = areas.data(dataSeries, (d: any) => d[propertyKey]) + .enter() + .append('g') + .attr('class', 'area') + .attr(Globals.COMPONENT_DATA_KEY_ATTRIBUTE, (d: any) => d[propertyKey]) + .append('svg:path') + .style('fill', (d: any) => colorScale(d[propertyKey])) + .style('fill-opacity', areaOpacity) + .attr('d', (d: any) => this.areaGenerator(d.values)) + .attr('class', 'areaPath'); + + //update existing paths + this.svg.selectAll('.areaPath') + .data(dataSeries, (d: any) => d[propertyKey]) + .transition() + .duration(Globals.COMPONENT_TRANSITION_TIME) + .attr('d', (d: any) => this.areaGenerator(d.values)); + + } + +} + +export default Areaset; \ No newline at end of file diff --git a/src/svg/components/Barset.ts b/src/svg/components/Barset.ts new file mode 100644 index 0000000..a84f607 --- /dev/null +++ b/src/svg/components/Barset.ts @@ -0,0 +1,114 @@ +import Component from './Component'; +import Config from '../../Config'; +import XAxis from './XAxis'; +import YAxis from './YAxis'; +import { simple2nested, simple2stacked } from '../../utils/dataTransformation'; +import Globals from '../../Globals'; +import { + stack, + scaleBand, + map, + area, + selection, + nest +} from 'd3'; + + +class Barset extends Component { + + private x: XAxis; + private y: YAxis; + + constructor(x: XAxis, y: YAxis) { + super(); + this.x = x; + this.y = y; + } + + public render() { + //Do nothing, since points render only when new data is received. + + } + + public update(data: [any]) { + let bars: any = null, + stacked = this.config.get('stacked'); + + this.clean(); + + if (stacked) { + this.updateStacked(data); + } else { + this.updateGrouped(data); + } + bars = this.svg.selectAll('g.barSeries rect'); + bars + .on('mousedown.user', this.config.get('onDown')) + .on('mouseup.user', this.config.get('onUp')) + .on('mouseleave.user', this.config.get('onLeave')) + .on('mouseover.user', this.config.get('onHover')) + .on('click.user', this.config.get('onClick')); + } + + private updateStacked(data: [any]) { + let propertyKey = this.config.get('propertyKey'); + let keys: any = map(data, (d) => d[propertyKey]).keys(); + let stack = this.config.get('stack'); + data = stack.keys(keys)(simple2stacked(data)); + + let colorScale = this.config.get('colorScale'), + layer = this.svg.selectAll('.barSeries').data(data), + layerEnter = layer.enter().append('g'), + x = this.x.xAxis.scale(), + y = this.y.yAxis.scale(); + + layer.merge(layerEnter) + .attr('class', 'barSeries') + .attr(Globals.COMPONENT_DATA_KEY_ATTRIBUTE, (d: any) => d[propertyKey]) + .style('fill', (d: any, i: number) => d[propertyKey] !== undefined ? colorScale(d[propertyKey]) : colorScale(i)) + .selectAll('rect') + .data((d: any) => d) + .enter().append('rect') + .attr("x", (d: any) => x(d.data[propertyKey])) + .attr("y", (d: any) => y(d[1])) + .attr("height", (d: any) => y(d[0]) - y(d[1])) + .attr("width", x.bandwidth()); + } + + private updateGrouped(data: [any]) { + let propertyKey = this.config.get('propertyKey'); + let propertyX = this.config.get('propertyX'); + let propertyY = this.config.get('propertyY'); + + let keys = map(data, (d) => d[propertyKey]).keys(), + colorScale = this.config.get('colorScale'), + layer: any = null, + x = this.x.xAxis.scale(), + y = this.y.yAxis.scale(), + xGroup = scaleBand().domain(keys).range([0, x.bandwidth()]), + height = this.config.get('height'); + + data = simple2nested(data, 'key'); + + layer = this.svg.selectAll('g.barSeries') + .data(data, (d: any) => d.values); + + layer.enter() + .append('g') + .attr('class', 'barSeries') + .attr(Globals.COMPONENT_DATA_KEY_ATTRIBUTE, (d: any) => d[propertyKey]) + .selectAll('rect') + .data((d: any) => d.values) + .enter() + .append('rect') + .attr('transform', (d: any) => 'translate(' + x(d[propertyX]) + ')') + .attr('width', xGroup.bandwidth()) + .attr("x", (d: any) => xGroup(d[propertyKey])) + .attr("y", (d: any) => y(d[propertyY])) + .attr("height", (d: any) => height - y(d[propertyY])) + .style('fill', (d: any, i: number) => d[propertyKey] !== undefined ? colorScale(d[propertyKey]) : colorScale(i)); + } + +} + +export default Barset; \ No newline at end of file diff --git a/src/svg/components/CanvasPointset.ts b/src/svg/components/CanvasPointset.ts new file mode 100644 index 0000000..f99f4bb --- /dev/null +++ b/src/svg/components/CanvasPointset.ts @@ -0,0 +1,120 @@ +import Component from "./Component"; +import YAxis from "./YAxis"; +import XAxis from "./XAxis"; +import { + select, + symbol, + symbolCircle, + symbolCross, + symbolDiamond, + symbolSquare, + symbolStar, + symbolTriangle, + symbolWye +} from "d3"; + +class CanvasPointset extends Component { + + private x: XAxis; + private y: YAxis; + private canvasCtx: any; + + constructor(x: XAxis, y: YAxis) { + super(); + this.x = x; + this.y = y; + } + + public update(data: [any]): void { + let propertyKey = this.config.get('propertyKey'); + let propertyX = this.config.get('propertyX'); + let propertyY = this.config.get('propertyY'); + + let markerShape = this.config.get('markerShape'), + markerSize = this.config.get('markerSize'), + colorScale = this.config.get('colorScale'), + points = null, + series = null, + dataContainer = null, + width = this.config.get('width'), + height = this.config.get('height'); + + + + let shape = symbol() + .size(markerSize) + .context(this.canvasCtx); + + switch (markerShape) { + case 'dot': + shape.type(symbolCircle); + break; + case 'ring': + shape.type(symbolCircle); + break; + case 'cross': + shape.type(symbolCross); + break; + case 'diamond': + shape.type(symbolDiamond); + break; + case 'square': + shape.type(symbolSquare); + break; + case 'star': + shape.type(symbolStar); + break; + case 'triangle': + shape.type(symbolTriangle); + break; + case 'wye': + shape.type(symbolWye); + break; + case 'circle': + shape.type(symbolCircle); + break; + default: + shape.type(symbolCircle); + } + + // Custom DOM element, this won't be rendered + dataContainer = this.svg.append('proteic'); + series = dataContainer.selectAll('proteic.g.points'); + this.canvasCtx.clearRect(0, 0, width, height); + + series + .data(data, (d) => d[propertyKey]) + .enter() + .call((s) => { + let self = this; + s.each(function (d) { + self.canvasCtx.save(); + self.canvasCtx.translate(self.x.xAxis.scale()(d[propertyX]), self.y.yAxis.scale()(d[propertyY])); + self.canvasCtx.beginPath(); + self.canvasCtx.strokeStyle = colorScale(d[propertyKey]); + self.canvasCtx.fillStyle = colorScale(d[propertyKey]); + shape(); + self.canvasCtx.closePath(); + self.canvasCtx.stroke(); + if (markerShape !== 'ring') { + self.canvasCtx.fill(); + } + self.canvasCtx.restore(); + }); + }); + } + + public render(): void { + this.canvas = select(this.config.get('selector')).append('canvas') + .attr('id', 'point-set-canvas') + .attr('width', this.config.get('width')) + .attr('height', this.config.get('height')) + .style('position', 'absolute') + .style('z-index', 2) + .style('transform', `translate(${this.config.get('marginLeft')}px, ${this.config.get('marginTop')}px)`); + + this.canvasCtx = this.canvas.node().getContext('2d'); + } +} + +export default CanvasPointset; diff --git a/src/svg/components/ClipPath.ts b/src/svg/components/ClipPath.ts new file mode 100644 index 0000000..bd2662e --- /dev/null +++ b/src/svg/components/ClipPath.ts @@ -0,0 +1,32 @@ + +import Component from './Component'; +import Config from '../../Config'; + +/** + * Creates an SVG clip path component that is attached to the chart. + * The clip path can be later referenced by the `#proteic-clip-path` id. + */ +class ClipPath extends Component { + + private width: number; + private height: number; + + constructor(width: number, height: number) { + super(); + this.width = width; + this.height = height; + } + + update(data): void { + } + + public render(): void { + this.svg.append('clipPath') + .attr('id', 'proteic-clip-path') + .append('rect') + .attr('width', this.width) + .attr('height', this.height); + } +} + +export default ClipPath; \ No newline at end of file diff --git a/src/svg/components/Component.ts b/src/svg/components/Component.ts new file mode 100644 index 0000000..d009d93 --- /dev/null +++ b/src/svg/components/Component.ts @@ -0,0 +1,39 @@ +import Config from '../../Config'; + +import { Selection } from 'd3'; + +abstract class Component { + + protected config: Config; + protected svg: Selection; + + constructor() { + } + + abstract update(data: any): void; + abstract render(): void; + + /** + * + * Configure this component to use a given configuration and a SVG selector. This method is automatically by the Container. + * @param {Config} config A configuration object + * @param {*} svg A D3 selector object + * + * @memberOf Component + + */ + public configure(config: Config, svg: any) { + this.config = config; + this.svg = svg; + } + + /** + * + * Clean the current series. + */ + public clean() { + this.svg.selectAll('.serie').remove(); + } +}; + +export default Component; diff --git a/src/svg/components/Container.ts b/src/svg/components/Container.ts new file mode 100644 index 0000000..651cd57 --- /dev/null +++ b/src/svg/components/Container.ts @@ -0,0 +1,121 @@ +import { select, Selection, zoom } from 'd3'; + +import Component from './Component'; +import Config from '../../Config'; +import Globals from '../../Globals'; + +class Container { + + private svg: Selection; + private config: Config; + private components: Component[] = []; + + constructor(config: Config) { + this.config = config; + + let selector: string = this.config.get('selector'), + width: number = this.config.get('width'), + height: number = this.config.get('height'), + marginLeft: number = this.config.get('marginLeft'), + marginRight: number = this.config.get('marginRight'), + marginTop: number = this.config.get('marginTop'), + marginBottom: number = this.config.get('marginBottom'); + + width += marginLeft + marginRight; + height += marginTop + marginBottom; + + this.initializeContainer(selector, width, height, marginLeft, marginTop); + } + + /** + * Add a new component to the current SVG container. + * + * @param {Component} component A component to be added + * @param {boolean} render If true, the component will be automatically rendered after adding it to the container + * @returns {Container} + * + * @memberOf Container + + */ + public add(component: Component): Container { + this.components.push(component); + component.configure(this.config, this.svg); + component.render(); + return this; + } + + /** + * + * Initialize the svg container. + * @private + * @param {string} selector Selector where this graph will be included in + * @param {((number | string))} width Total width of the graph + * @param {((number | string))} height Total height of the graph + * @param {number} marginLeft Left margin + * @param {number} marginTop Top margin + * + * @memberOf Container + + */ + private initializeContainer(selector: string, width: (number | string), height: (number | string), marginLeft: number, marginTop: number): void { + this.svg = select(selector) + .style('position', 'relative') + .style('width', `${width}px`) + .style('height', `${height}px`) + .append('svg:svg') + .attr('preserveAspectRatio', "xMinYMin meet") + .attr("viewBox", "0 0 " + width + " " + height) + .attr('width', '100%') + .attr('class', 'proteic') + .attr('width', width) + .attr('height', height) + .style('position', 'absolute') + .append('g') + .attr('class', 'chartContainer') + .attr('transform', 'translate(' + marginLeft + ',' + marginTop + ')'); + } + + /** + * + * Update all the components previously added to this container. + * @param {[{}]} data Data necessary to update the componnets + * + * @memberOf Container + + */ + public updateComponents(data: [{}]): void { + for (let i = 0; i < this.components.length; i++) { + let component = this.components[i]; + component.update(data); + } + } + + public translate(x: Number, y: Number) { + this.svg.attr('transform', `translate(${x}, ${y})`) + } + + public viewBox(w: number, h: number) { + this.svg.attr("viewBox", "0 0 " + w + " " + h); + } + + public zoom(z: any) { + this.svg.call(zoom().scaleExtent([1 / 2, 4]).on("zoom", z)); + } + + public addLoadingIcon() { + let icon = Globals.LOADING_ICON; + + this.svg.append('image').attr('id', 'loadingIcon') + .attr('width', '25%') + .attr('height', '25%') + .attr('x', '25%') + .attr('y', '25%') + .attr('xlink:href', icon) + } + + public removeLoadingIcon() { + this.svg.select('image[id="loadingIcon"]').transition().duration(200).remove(); + } +} + +export default Container; \ No newline at end of file diff --git a/src/svg/components/Dial.ts b/src/svg/components/Dial.ts new file mode 100644 index 0000000..ff86b0f --- /dev/null +++ b/src/svg/components/Dial.ts @@ -0,0 +1,94 @@ +import {deg2rad} from '../../utils/functions'; +import Component from './Component'; + +import { + scaleLinear, + arc as d3arc, + range as d3range +} from 'd3'; + +class Dial extends Component { + + constructor() { + super(); + } + + + public render() { + let labels = null, + invertColorScale = this.config.get('invertColorScale'), + colorScale = this.config.get('colorScale'), + width = this.config.get('width'), + height = this.config.get('height'), + ringWidth = this.config.get('ringWidth'), + ringMargin = this.config.get('ringMargin'), + ticks = this.config.get('ticks'), + minAngle = this.config.get('minAngle'), + maxAngle = this.config.get('maxAngle'), + minLevel = this.config.get('minLevel'), + maxLevel = this.config.get('maxLevel'), + labelInset = this.config.get('labelInset'), + scale = scaleLinear() + .domain([minLevel, maxLevel]) + .range([0, 1]), + scaleMarkers = scale.ticks(ticks), + + range = maxAngle - minAngle, + r = ((width > height) ? + height : width + ) / 2, + translation = (() => 'translate(' + r + ',' + r + ')'), + tickData = d3range(ticks).map(() => 1 / ticks), + arc = d3arc() + .innerRadius(r - ringWidth - ringMargin) + .outerRadius(r - ringMargin) + .startAngle((d, i) => deg2rad(minAngle + ((d * i) * range))) + .endAngle((d, i) => deg2rad(minAngle + ((d * (i + 1)) * range))); + + colorScale.domain([0,1]); + + // Append the ring + let arcs = this.svg.append('g') + .attr('class', 'arc') + .attr('transform', translation); + + // Append the ring sectors + let arcPaths = arcs.selectAll('path') + .data(tickData) + .enter().append('path') + // ID for textPath linking + .attr('id', (d, i) => 'sector-' + i) + .attr('d', arc); + + // Fill colors + arcPaths.attr('fill', (d, i) => colorScale(invertColorScale + ? (1 - d * i) + : (d * i)) + ); + + // Apend the scale labels + labels = this.svg.append('g') + .attr('class', 'labels') + .attr('transform', translation); + + // // Append scale marker labels + labels.selectAll('text') + .data(scaleMarkers) + .enter().append('text') + .attr('transform', (d) => { + let ratio = scale(d); + let newAngle = minAngle + (ratio * range); + return 'rotate(' + newAngle + ') translate(0,' + (labelInset - r) + ')'; + }) + .text((d) => d) + .style('text-anchor', 'middle') + .style('font', '18px Montserrat, sans-serif'); + } + + public update() { + + } + +} + +export default Dial; \ No newline at end of file diff --git a/src/svg/components/DialNeedle.ts b/src/svg/components/DialNeedle.ts new file mode 100644 index 0000000..303cad3 --- /dev/null +++ b/src/svg/components/DialNeedle.ts @@ -0,0 +1,100 @@ +import {deg2rad} from '../../utils/functions'; +import Component from './Component'; + +import { + scaleLinear, + arc as d3arc, + range as d3range +} from 'd3'; + +class DialNeedle extends Component { + + constructor() { + super(); + } + + public render() { + let labels = null, + invertColorScale = this.config.get('invertColorScale'), + colorScale = this.config.get('colorScale'), + width = this.config.get('width'), + height = this.config.get('height'), + ringWidth = this.config.get('ringWidth'), + ringMargin = this.config.get('ringMargin'), + ticks = this.config.get('ticks'), + minAngle = this.config.get('minAngle'), + maxAngle = this.config.get('maxAngle'), + minLevel = this.config.get('minLevel'), + maxLevel = this.config.get('maxLevel'), + labelInset = this.config.get('labelInset'), + needleNutRadius = this.config.get('needleNutRadius'), + needleLenghtRatio = this.config.get('needleLenghtRatio'), + scale = scaleLinear() + .domain([minLevel, maxLevel]) + .range([0, 1]), + scaleMarkers = scale.ticks(ticks), + + range = maxAngle - minAngle, + r = ((width > height) ? + height : width + ) / 2, + needleLen = needleLenghtRatio * (r), + + translation = (() => 'translate(' + r + ',' + r + ')'), + tickData = d3range(ticks).map(() => 1 / ticks), + arc = d3arc() + .innerRadius(r - ringWidth - ringMargin) + .outerRadius(r - ringMargin) + .startAngle((d, i) => deg2rad(minAngle + ((d * i) * range))) + .endAngle((d, i) => deg2rad(minAngle + ((d * (i + 1)) * range))), + + angleScale = scaleLinear() + .domain([minLevel, maxLevel]) + .range([90 + minAngle, 90 + maxAngle]); + + // Update the needle + this.svg.append('path') + .attr('class', 'needle') + .datum(0) + .attr('transform', (d) => `translate(${r}, ${r}) rotate(${angleScale(d) - 90})`) + .attr('d', `M ${0 - needleNutRadius} ${0} L ${0} ${0 - needleLen} L ${needleNutRadius} ${0}`) + .style('fill', '#666666'); + + // Append needle nut + this.svg.append('circle') + .attr('class', 'needle') + .attr('transform', translation) + .attr('cx', 0) + .attr('cy', 0) + .attr('r', needleNutRadius) + .style('fill', '#666666'); + } + + public update(data: [any]) { + let datum = data[data.length - 1], + width = this.config.get('width'), + height = this.config.get('height'), + needleNutRadius = this.config.get('needleNutRadius'), + needleLenghtRatio = this.config.get('needleLenghtRatio'), + propertyValue = this.config.get('propertyValue'), + minAngle = this.config.get('minAngle'), + maxAngle = this.config.get('maxAngle'), + minLevel = this.config.get('minLevel'), + maxLevel = this.config.get('maxLevel'), + r = ((width > height) ? + height : width + ) / 2, + needleLen = needleLenghtRatio * (r), + angleScale = scaleLinear() + .domain([minLevel, maxLevel]) + .range([90 + minAngle, 90 + maxAngle]); + + this.svg.select('.needle') + .transition() + .attr('transform', (d) => `translate(${r}, ${r}) rotate(${angleScale(datum[propertyValue]) - 90})`) + .attr('d', `M ${0 - needleNutRadius} ${0} L ${0} ${0 - needleLen} L ${needleNutRadius} ${0}`); + } + +} + +export default DialNeedle; \ No newline at end of file diff --git a/src/svg/components/Legend.ts b/src/svg/components/Legend.ts new file mode 100644 index 0000000..f634f69 --- /dev/null +++ b/src/svg/components/Legend.ts @@ -0,0 +1,99 @@ +import Component from './Component'; +import Config from '../../Config'; +import Globals from '../../Globals'; + +import { + selection, + nest +} from 'd3'; + + +class Legend extends Component { + + + constructor() { + super(); + } + + public render() { + //Do nothing, since points render only when new data is received. + + } + + public update(data: any) { + //Exclude those values that do not contain a 'key'. + let dataSeries = nest() + .key((d) => d.key) + .entries(data), + legend = null, + entries = null, + colorScale = this.config.get('colorScale'), + height = this.config.get('height'), + width = this.config.get('width'); + + if (dataSeries.length === 1 && dataSeries[0].key === 'undefined') { + console.warn('Not showing legend, since there is a valid key'); + return; + } + + this.svg.selectAll('g.legend').remove(); + + legend = this.svg.append('g').attr('class', 'legend'); + entries = legend.selectAll('.legend-entry') + .data(dataSeries, (d: any) => d.key) + .enter() + .append('g') + .attr('class', 'legend-entry') + .attr(Globals.LEGEND_DATA_KEY_ATTRIBUTE, (d: any) => d.key); + + + entries.append('rect') + .attr('x', width + 10) + .attr('y', (d: any, i: number) => i * 25) + .attr('height', 20) + .attr('width', 20) + .style('fill', (d: any) => colorScale(d.key)) + .style('stroke', (d: any) => colorScale(d.key)) + .style('opacity', 0.8) + .on('click.default', (d: any) => this.toggle(d)); + + + entries.append('text') + .attr("x", width + 25 + 10) + .attr("y", (d: any, i: number) => i * 25 + 7) + .attr("dy", "0.55em") + .text((d: any) => d.key) + .style('font', '14px Montserrat, sans-serif') + .on('click.default', () => this.toggle); + + } + + private toggle(d: any): void { + let key = d.key, + element = this.svg.selectAll('*[' + Globals.COMPONENT_DATA_KEY_ATTRIBUTE + '="' + key + '"]'), + colorScale = this.config.get('colorScale'); + + if (!element.empty()) { + let opacity = element.style('opacity'); + opacity = (opacity == 1) ? Globals.COMPONENT_HIDE_OPACITY : 1; + let legendEntry = this.svg.select('.legend-entry[' + Globals.LEGEND_DATA_KEY_ATTRIBUTE + '="' + key + '"]'); + /// legendEntry + // .transition() + // .duration(Globals.COMPONENT_HIDE_SHOW_TRANSITION_TIME) + // .style('opacity', (opacity === 1) ? 1 : Globals.LEGEND_HIDE_OPACITY); + + legendEntry.selectAll('rect') + .transition() + .duration(Globals.COMPONENT_HIDE_SHOW_TRANSITION_TIME) + .style('fill', (opacity === 1) ? (d: any) => colorScale(d.key) : 'transparent'); + + element + .transition() + .duration(Globals.COMPONENT_HIDE_SHOW_TRANSITION_TIME) + .style('opacity', opacity); + } + } + +} + +export default Legend; \ No newline at end of file diff --git a/src/svg/components/Lineset.ts b/src/svg/components/Lineset.ts new file mode 100644 index 0000000..6a36c8f --- /dev/null +++ b/src/svg/components/Lineset.ts @@ -0,0 +1,72 @@ + +import Component from './Component'; +import XAxis from './XAxis'; +import YAxis from './YAxis'; +import Config from '../../Config'; +import Globals from '../../Globals'; + + +import { + line, + nest, + easeLinear, + CurveFactory, + Line +} from 'd3'; + +class Lineset extends Component { + + private x: XAxis; + private y: YAxis; + private lineGenerator: Line; + + constructor(x: XAxis, y: YAxis) { + super(); + this.x = x; + this.y = y; + } + + + public render(): void { + let propertyX = this.config.get('propertyX'); + let propertyY = this.config.get('propertyY'); + let curve: CurveFactory = this.config.get('curve'); + + this.lineGenerator = line() + .curve(curve) + .x((d) => this.x.xAxis.scale()(d[propertyX])) + .y((d) => this.y.yAxis.scale()(d[propertyY])); + } + + public update(data: [any]): void { + let propertyKey = this.config.get('propertyKey'); + let dataSeries = nest().key((d: any) => d[propertyKey]).entries(data); + let series = this.svg.selectAll('g.lineSeries'); + let colorScale = this.config.get('colorScale'); + + //Update new lines + let lines = series.data(dataSeries, (d: any) => d[propertyKey]) + .enter() + .append('g') + .attr('class', 'lineSeries') + .attr(Globals.COMPONENT_DATA_KEY_ATTRIBUTE, (d: any) => d[propertyKey]) + .attr('stroke', (d: any) => colorScale(d[propertyKey])) + .append('svg:path') + .style('stroke', (d: any) => colorScale(d[propertyKey])) + .style('stroke-width', 1.9) + .style('fill', 'none') + .attr('d', (d: any) => this.lineGenerator(d.values)) + .attr('class', 'line'); + + //update existing lines + this.svg.selectAll('.line') + .data(dataSeries, (d: any) => d[propertyKey]) + .attr('d', (d: any) => this.lineGenerator(d.values)) + .transition() + .duration(Globals.COMPONENT_TRANSITION_TIME) + .ease(easeLinear); + } + +} + +export default Lineset; \ No newline at end of file diff --git a/src/svg/components/LinkedNodeset.ts b/src/svg/components/LinkedNodeset.ts new file mode 100644 index 0000000..2c6d7bd --- /dev/null +++ b/src/svg/components/LinkedNodeset.ts @@ -0,0 +1,182 @@ +import Component from './Component'; +import Zoomable from './Zoomable'; +import Config from '../../Config'; +import { simple2Linked } from '../../utils/dataTransformation'; +import Globals from '../../Globals'; + +import { + drag, + event, + selection, + select, + nest, + forceSimulation, + forceLink, + forceManyBody, + forceCenter, + Simulation, + SimulationNodeDatum, + SimulationLinkDatum, + Force, + scaleLinear, + D3ZoomEvent +} from 'd3'; + +class LinkedNodeset extends Component implements Zoomable { + + private simulation: any; + private dragstarted: any; + private dragged: any; + private dragended: any; + private linkedByIndex: any; + private toggle: number = 0; + + + constructor() { + super(); + } + + public render() { + let width: number = this.config.get('width'), + height: number = this.config.get('height'); + + this.simulation = forceSimulation() + .force("link", forceLink().id((d: any) => d.id).distance(50)) + .force("charge", forceManyBody()) + .force("center", forceCenter(width / 2, height / 2)); + + this.dragstarted = (d: SimulationNodeDatum) => { + if (!event.active) this.simulation.alphaTarget(0.3).restart(); + d.fx = d.x; + d.fy = d.y; + }; + + this.dragged = (d: SimulationNodeDatum) => { + d.fx = event['x']; + d.fy = event['y']; + }; + + this.dragended = (d: SimulationNodeDatum) => { + if (!event.active) this.simulation.alphaTarget(1); + d.fx = null; + d.fy = null; + }; + + } + + public update(data: any) { + let nodeRadius = this.config.get('nodeRadius'), + colorScale = this.config.get('colorScale'), + linkWeight = this.config.get('linkWeight'), + nodeWeight = this.config.get('nodeWeight'), + minLinkWeight = this.config.get('minLinkWeight'), + maxLinkWeight = this.config.get('maxLinkWeight'), + minNodeWeight = this.config.get('minNodeWeight'), + maxNodeWeight = this.config.get('maxNodeWeight'), + weighted = this.config.get('weighted'), + linkScaleRadius = scaleLinear().domain([minLinkWeight, maxLinkWeight]).range([0, 3]), + nodeScaleRadius = scaleLinear().domain([minNodeWeight, maxNodeWeight]).range([0, 15]), + labelShow = this.config.get('labelShow'), + labelField = this.config.get('labelField'), + node: any = null, + link: any = null, + text: any = null; + //Transform data + data = simple2Linked(data); + + this.svg.selectAll('g.links').remove(); + this.svg.selectAll('g.nodes').remove(); + this.svg.selectAll('g.labels').remove(); + + link = this.svg.append('g') + .attr('class', 'serie') + .append("g") + .attr("class", "links") + .selectAll("line") + .data(data.links) + .enter() + .append("line") + .attr(Globals.COMPONENT_DATA_KEY_ATTRIBUTE, (d: any) => {console.log(d); return d.key}) + .attr("stroke-width", (d: any) => (weighted && d.weight) ? linkScaleRadius(d.weight) : linkWeight) + .attr("stroke", "#999") + .attr("stroke-opacity", 1); + + node = this.svg.select('g.serie').append("g") + .attr("class", "nodes") + .selectAll("circle") + .data(data.nodes) + .enter() + .append("circle") + .attr(Globals.COMPONENT_DATA_KEY_ATTRIBUTE, (d: any) => d.key) + .attr("r", (d: any) => (weighted && d.weight) ? nodeScaleRadius(d.weight) : nodeWeight) + .attr("fill", (d: any) => colorScale(d.key)) + .attr("stroke", "white") + .call(drag() + .on("start", this.dragstarted) + .on("drag", this.dragged) + .on("end", this.dragended)); + + let chart = this; + node + // .on('dblclick.default', function() { + // chart.connectedNodes(this, node, link); + // }) + .on('mousedown.user', this.config.get('onDown')) + .on('mouseup.user', this.config.get('onUp')) + .on('mouseleave.user', this.config.get('onLeave')) + .on('mouseover.user', this.config.get('onHover')) + .on('click.user', this.config.get('onClick')); + + //Append node labels + if (labelShow) { + text = this.svg.select('g.serie').append("g") + .attr("class", "labels") + .selectAll('text') + .data(data.nodes) + .enter() + .append('text') + .attr(Globals.COMPONENT_DATA_KEY_ATTRIBUTE, (d: any) => d.key) + .attr('dx', 10) + .attr('dy', '.35em') + .attr('font-size', '.85em') + .text(typeof labelField === 'string' ? (d: any) => d[labelField] : labelField) + .on('mousedown.user', this.config.get('onDown')) + .on('mouseup.user', this.config.get('onUp')) + .on('mouseleave.user', this.config.get('onLeave')) + .on('mouseover.user', this.config.get('onHover')) + .on('click.user', this.config.get('onClick')); + } + this.simulation.nodes(data.nodes).on("tick", () => labelShow ? this.tickedWithText(link, node, text) : this.ticked(link, node)); + this.simulation.force("link").links(data.links); + + } + private tickedWithText(link: any, node: any, text: any) { + this.ticked(link, node); + text + .attr('x', (d: any) => d.x) + .attr('y', (d: any) => d.y); + } + + private ticked(link: any, node: any) { + link + .attr("x1", (d: any) => d.source.x) + .attr("y1", (d: any) => d.source.y) + .attr("x2", (d: any) => d.target.x) + .attr("y2", (d: any) => d.target.y); + + node + .attr("cx", (d: any) => d.x) + .attr("cy", (d: any) => d.y); + } + + public zoom(event: D3ZoomEvent) { + let transform: any = event.transform; + + this.svg.selectAll('.nodes circle').attr('transform', transform); + this.svg.selectAll('.links line').attr('transform', transform); + this.svg.selectAll('.labels text').attr('transform', transform); + } + +} + +export default LinkedNodeset; \ No newline at end of file diff --git a/src/svg/components/Pointset.ts b/src/svg/components/Pointset.ts new file mode 100644 index 0000000..fb712a2 --- /dev/null +++ b/src/svg/components/Pointset.ts @@ -0,0 +1,132 @@ +import Component from './Component'; +import Config from '../../Config'; +import XAxis from './XAxis'; +import YAxis from './YAxis'; +import Globals from '../../Globals'; + +import { + selection, + nest, + symbol, + symbolCircle, + symbolCross, + symbolDiamond, + symbolSquare, + symbolStar, + symbolTriangle, + symbolWye, + easeLinear +} from 'd3'; + +class Pointset extends Component { + + private x: XAxis; + private y: YAxis; + + constructor(x: XAxis, y: YAxis) { + super(); + this.x = x; + this.y = y; + } + + + + public render() { + //Do nothing, since points render only when new data is received. + + } + + public update(data: [any]) { + let propertyKey = this.config.get('propertyKey'); + let propertyX = this.config.get('propertyX'); + let propertyY = this.config.get('propertyY'); + + let dataSeries = nest() + .key((d: any) => d[propertyKey]) + .entries(data), + markers: any = null, + markerShape = this.config.get('markerShape'), + markerSize = this.config.get('markerSize'), + markerOutlineWidth = this.config.get('markerOutlineWidth'), + colorScale = this.config.get('colorScale'), + points: any = null, + series: any = null; + + let shape = symbol().size(markerSize); + + series = this.svg.selectAll('g.points'); + + switch (markerShape) { + case 'dot': + shape.type(symbolCircle); + break; + case 'ring': + shape.type(symbolCircle); + break; + case 'cross': + shape.type(symbolCross); + break; + case 'diamond': + shape.type(symbolDiamond); + break; + case 'square': + shape.type(symbolSquare); + break; + case 'star': + shape.type(symbolStar); + break; + case 'triangle': + shape.type(symbolTriangle); + break; + case 'wye': + shape.type(symbolWye); + break; + case 'circle': + shape.type(symbolCircle); + break; + default: + shape.type(symbolCircle); + } + + points = series + .data(dataSeries, (d: any) => d.values, (d: any) => d[propertyX]); // bind it twice + points.enter() + .append('g') + .attr('class', 'points') + .attr(Globals.COMPONENT_DATA_KEY_ATTRIBUTE, (d: any) => d[propertyKey]) + .style('stroke', (d: any) => colorScale(d[propertyKey])) + .selectAll('circle') + .data((d: any) => d.values) + .enter() + .append('path') + .attr('class', 'marker') + .attr('d', shape) + .style('stroke', (d: any) => colorScale(d[propertyKey])) + .style('fill', (d: any) => markerShape !== 'ring' ? colorScale(d[propertyKey]) : 'transparent') + //.style('fill-opacity', 0.8) + .attr('transform', (d: any) => `translate(${this.x.xAxis.scale()(d[propertyX])}, ${this.y.yAxis.scale()(d[propertyY])})`); + + //Update existing markers + this.svg.selectAll('.marker') + .transition() + .duration(Globals.COMPONENT_TRANSITION_TIME) + .ease(easeLinear) + .attr('transform', (d: any) => `translate(${this.x.xAxis.scale()(d[propertyX])}, ${this.y.yAxis.scale()(d[propertyY])})`); + + // Remove old markers + points + .exit() + .remove(); + + markers = this.svg.selectAll('.marker'); + markers + .on('mousedown.user', this.config.get('onDown')) + .on('mouseup.user', this.config.get('onUp')) + .on('mouseleave.user', this.config.get('onLeave')) + .on('mouseover.user', this.config.get('onHover')) + .on('click.user', this.config.get('onClick')); + } + +} + +export default Pointset; \ No newline at end of file diff --git a/src/svg/components/RadialAxes.ts b/src/svg/components/RadialAxes.ts new file mode 100644 index 0000000..c8e95aa --- /dev/null +++ b/src/svg/components/RadialAxes.ts @@ -0,0 +1,42 @@ +import Component from "./Component"; +import XRadialAxis from './XRadialAxis'; +import YRadialAxis from "./YRadialAxis"; +import Config from "../../Config"; + +class RadialAxes extends Component { + private _x: XRadialAxis; + private _y: YRadialAxis; + + constructor() { + super(); + this._x = new XRadialAxis(); + this._y = new YRadialAxis(); + } + + public configure(config: Config, svg: any){ + super.configure(config, svg); + this._x.configure(config, svg); + this._y.configure(config, svg); + } + + public render(): void { + this._x.render(); + this._y.render(); + } + + public update(data): void { + this._x.update(data); + this._y.update(data); + } + + + get x(): XRadialAxis { + return this._x; + } + + get y(): YRadialAxis { + return this._y; + } +} + +export default RadialAxes; diff --git a/src/svg/components/SectorSet.ts b/src/svg/components/SectorSet.ts new file mode 100644 index 0000000..92f36dc --- /dev/null +++ b/src/svg/components/SectorSet.ts @@ -0,0 +1,57 @@ +import Component from './Component'; +import Config from '../../Config'; +import XAxis from './XAxis'; +import YAxis from './YAxis'; +import { simple2nested, simple2stacked } from '../../utils/dataTransformation'; +import Globals from '../../Globals'; +import { + stack, + scaleBand, + map, + area, + selection, + nest, + pie, + arc +} from 'd3'; + + +class SectorSet extends Component { + + + constructor() { + super(); + } + + public render() { + //Do nothing, since points render only when new data is received. + } + + public update(data: [any]) { + let propertyKey = this.config.get('propertyKey'); + let propertyX = this.config.get('propertyX'); + let width = this.config.get('width'); + let height = this.config.get('height'); + let radius = Math.min(width, height) / 2; + + let colorScale = this.config.get('colorScale'); + + let myPie = pie().value((d:any) => d[propertyX])(data); + let myArc = arc().innerRadius(0).outerRadius(radius); + + let arcs = this.svg.selectAll("g.slice").data(myPie); + let newBlock = arcs.enter(); + + newBlock + .append("g") + .attr(Globals.COMPONENT_DATA_KEY_ATTRIBUTE, (d: any) => d.data[propertyKey]) + .append("path") + .attr('fill', + (d: any, i: number) => + d.data[propertyKey] !== undefined ? colorScale(d.data[propertyKey]) : colorScale(i)) + .attr("d", myArc); + + } +} + +export default SectorSet; \ No newline at end of file diff --git a/src/svg/components/Streamset.ts b/src/svg/components/Streamset.ts new file mode 100644 index 0000000..260e4e3 --- /dev/null +++ b/src/svg/components/Streamset.ts @@ -0,0 +1,83 @@ + +import Component from './Component'; +import XYAxes from './XYAxes'; +import Config from '../../Config'; +import { simple2stacked } from '../../utils/dataTransformation'; +import Globals from '../../Globals'; +import { + area, + curveCardinal, + nest, + map, + stackOrderInsideOut, + stackOffsetWiggle, + stack as d3Stack +} from 'd3'; + +class Streamset extends Component { + + private xyAxes: XYAxes; + private areaGenerator: any; + + constructor(xyAxes: XYAxes) { + super(); + this.xyAxes = xyAxes; + this.areaGenerator = area() + .curve(curveCardinal) + .y0((d) => this.xyAxes.y.yAxis.scale()(d[0])) + .y1((d) => this.xyAxes.y.yAxis.scale()(d[1])); + } + + + public render(): void { + //Do nothing, since lines render only when new data is received. + } + + public update(data: [any]): void { + let propertyKey = this.config.get('propertyKey'); + let propertyX = this.config.get('propertyX'); + let propertyY = this.config.get('propertyY'); + + this.clean(); + let colorScale = this.config.get('colorScale'), + onDown = this.config.get('onDown'), + onUp = this.config.get('onUp'), + onLeave = this.config.get('onLeave'), + onHover = this.config.get('onHover'), + onClick = this.config.get('onClick'), + keys = map(data, (d) => d[propertyKey]).keys(), + data4stack = simple2stacked(data), + stack = this.config.get('stack'), + dataSeries = stack(data4stack), + series: any = null; + + this.areaGenerator.x((d: any) => this.xyAxes.x.xAxis.scale()((new Date(d.data[propertyKey])))); + + series = this.svg.selectAll('.serie') + .data(dataSeries) + .enter() + .append('g') + .attr('class', 'serie') + .style('stroke', (d: any, i: number) => colorScale(d[propertyKey])) + .attr(Globals.COMPONENT_DATA_KEY_ATTRIBUTE, (d: any) => d[propertyKey]); + + series + .append('path') + .attr('class', 'layer') + .attr('d', this.areaGenerator) + .style('fill', (d: any, i: number) => colorScale(d[propertyKey])); + + series.exit().remove(); + + series + .attr('opacity', 1) + .on('mousedown.user', onDown) + .on('mouseup.user', onUp) + .on('mouseleave.user', onLeave) + .on('mouseover.user', onHover) + .on('click.user', onClick); + } + +} + +export default Streamset; \ No newline at end of file diff --git a/src/svg/components/SunburstDisk.ts b/src/svg/components/SunburstDisk.ts new file mode 100644 index 0000000..2199dc5 --- /dev/null +++ b/src/svg/components/SunburstDisk.ts @@ -0,0 +1,112 @@ +import Component from "./Component"; +import XRadialAxis from "./XRadialAxis" +import YRadialAxis from "./YRadialAxis" +import {arc, stratify, partition} from "d3"; + +class SunburstDisk extends Component { + + private x: XRadialAxis; + private y: YRadialAxis; + + constructor(x: XRadialAxis, y: YRadialAxis) { + super(); + this.x = x; + this.y = y; + + } + + /** + * Removes all the paths (arcs). Doing this before each redraw prevents the + * transition to mess up the arcs. + * @private + */ + private removePaths() { + this.svg.selectAll('path').remove(); + } + + /** + * From: http://bl.ocks.org/kerryrodden/7090426 + * @param node + * @returns {Array} + * @private + */ + private getAncestors(node) { + let path = []; + let current = node; + while (current.parent) { + path.unshift(current); + current = current.parent; + } + return path; + } + + update(data: [any]): void { + let arcGen = arc() + .startAngle((d) => Math.max(0, Math.min(2 * Math.PI, this.x.xRadialAxis(d.x0)))) + .endAngle((d) => Math.max(0, Math.min(2 * Math.PI, this.x.xRadialAxis(d.x1)))) + .innerRadius((d) => Math.max(0, this.y.yRadialAxis(d.y0))) + .outerRadius((d) => Math.max(0, this.y.yRadialAxis(d.y1))); + let colorScale = this.config.get('colorScale'); + + // Remove all the paths before redrawing + this.removePaths(); + + // Create layout partition + let root = stratify() + .id((d) => d.id) + .parentId((d) => d.parent) + (data); + root.sum((d) => d.value); + partition()(root); + + // Draw the paths (arcs) + let paths = this.svg.selectAll('path') + .data(root.descendants()) + .enter().append('path') + .attr('d', arcGen) + .style('fill', (d) => { + if (!d.parent) { + return 'white'; + } else { + return colorScale(d.data.label); + } + }) + .style('stroke', '#fff') + .style('stroke-width', '2') + .style('shape-rendering', 'crispEdge'); + + paths // TODO extract events to config? + .on('mouseover.default', (d) => { + let ancestors = this.getAncestors(d); + // Fade all the arcs + if (ancestors.length > 0) { + this.svg.selectAll('path') + .style('opacity', 0.3); + } + this.svg.selectAll('path') + .filter((node) => ancestors.indexOf(node) >= 0) + .style('opacity', 1); + // Hightlight the hovered arc + this.svg.select('.text-indicator .label').text(d.data.label); + this.svg.select('.text-indicator .value').text(d.value); + }) + .on('mouseout.default', (d) => { + this.svg.selectAll('path').style('opacity', 1); + this.svg.select('.text-indicator .label').style('font-weight', 'normal'); + this.svg.select('.text-indicator .label').text(''); + this.svg.select('.text-indicator .value').text(''); + }); + + paths + .on('mousedown.user', this.config.get('onDown')) + .on('mouseup.user', this.config.get('onUp')) + .on('mouseleave.user', this.config.get('onLeave')) + .on('mouseover.user', this.config.get('onHover')) + .on('click.user', this.config.get('onClick')); + } + + render(): void { + } +} + +export default SunburstDisk; \ No newline at end of file diff --git a/src/svg/components/TextIndicator.ts b/src/svg/components/TextIndicator.ts new file mode 100644 index 0000000..77f53b5 --- /dev/null +++ b/src/svg/components/TextIndicator.ts @@ -0,0 +1,49 @@ +import Component from "./Component"; + +class TextIndicator extends Component { + + constructor() {} + + update(data: [any]): void { + let datum = data[data.length - 1]; + + this.svg.select('.value') + .text(datum.value); + this.svg.select('.label') + .text(datum.label); + } + + render(): void { + let indicator = this.svg.append('g') + .attr('class', 'text-indicator') + .attr('pointer-events', 'none') + .style('text-anchor', 'middle') + .style('alignment-baseline', 'central'); + + indicator.append('text') + .attr('class', 'value') + .attr('x', 0) + .attr('y', 0) + .attr('pointer-events', 'none') + .text('') + .style('text-anchor', 'middle'); + + indicator.append('text') + .attr('class', 'label') + .attr('x', 0) + .attr('y', 0) + .attr('pointer-events', 'none') + .text('') + .style('transform', 'translate(0, 1.5em') + .style('text-anchor', 'middle'); + } + + translate(x: Number, y: Number) { + this.svg + .select('g.text-indicator') + .attr('transform', `translate(${x}, ${y})`); + } + +} + +export default TextIndicator; \ No newline at end of file diff --git a/src/svg/components/Timeboxset.ts b/src/svg/components/Timeboxset.ts new file mode 100644 index 0000000..09c0e00 --- /dev/null +++ b/src/svg/components/Timeboxset.ts @@ -0,0 +1,92 @@ + +import Component from './Component'; +import XYAxes from './XYAxes'; +import Config from '../../Config'; +import { simple2nested } from '../../utils/dataTransformation'; +import Globals from '../../Globals'; + +import { + extent, + line, + nest, + scaleBand, + scaleLinear, + map +} from 'd3'; + +class Timeboxset extends Component { + + private xyAxes: XYAxes; + + constructor(xyAxes: XYAxes) { + super(); + this.xyAxes = xyAxes; + } + + + public render(): void { + //Do nothing, since lines render only when new data is received. + } + + public update(data: [any]): void { + let propertyKey = this.config.get('propertyKey'); + let propertyStart = this.config.get('propertyStart'); + let propertyEnd = this.config.get('propertyEnd'); + + let colorScale = this.config.get('colorScale'), + height = this.config.get('height'), + onDown = this.config.get('onDown'), + onUp = this.config.get('onUp'), + onLeave = this.config.get('onLeave'), + onHover = this.config.get('onHover'), + onClick = this.config.get('onClick'), + keys = map(data, (d) => d[propertyKey]).keys(), + layer = this.svg.selectAll('.serie').data(data), + layerEnter = null, + layerMerge = null, + box = null, + boxEnter = null, + boxMerge = null, + extLanes = null, + yLanes = null, + yLanesBand = scaleBand().range([0, keys.length + 1]).domain(keys), + x = this.xyAxes.x.xAxis.scale(), + y = this.xyAxes.y.yAxis.scale(); + + data = simple2nested(data); + extLanes = extent(data, (d, i) => i); + yLanes = scaleLinear().domain([extLanes[0], extLanes[1] + 1]).range([0, height]); + + layer = this.svg.selectAll('.serie').data(data); + layerEnter = layer.enter().append('g'); + + layerMerge = layer.merge(layerEnter) + .attr('class', 'serie') + .attr(Globals.COMPONENT_DATA_KEY_ATTRIBUTE, (d: any) => d[propertyKey]); + + + box = layerMerge.selectAll('rect') + .data((d: any) => d.values); + + boxEnter = box.enter().append('rect'); + + boxMerge = box.merge(boxEnter) + .attr('width', (d: any) => x(d[propertyEnd]) - x(d[propertyStart])) + .attr('x', (d: any) => x(d[propertyStart])) + .attr('y', (d: any) => y(d[propertyKey])) + .attr('height', () => 0.8 * yLanes(1)) + .style('fill', (d: any) => colorScale(d[propertyKey])); + + box = this.svg.selectAll('g.serie rect'); + + box + .on('mousedown.user', onDown) + .on('mouseup.user', onUp) + .on('mouseleave.user', onLeave) + .on('mouseover.user', onHover) + .on('click.user', onClick); + } + +} + +export default Timeboxset; \ No newline at end of file diff --git a/src/svg/components/XAxis.ts b/src/svg/components/XAxis.ts new file mode 100644 index 0000000..4f37bf4 --- /dev/null +++ b/src/svg/components/XAxis.ts @@ -0,0 +1,140 @@ +import { + map, + select, + scaleTime, + scaleLinear, + scaleBand, + format, + axisBottom, + timeParse, + min as d3Min, + max as d3Max +} from 'd3'; + +import Component from './Component'; +import Config from '../../Config'; + +import { isEven } from '../../utils/functions'; + +class XAxis extends Component { + + private _xAxis: any; + + constructor() { + super(); + } + + public render(): void { + let width = this.config.get('width'), + height = this.config.get('height'), + xAxisFormat = this.config.get('xAxisFormat'), + xAxisType = this.config.get('xAxisType'), + xAxisLabel = this.config.get('xAxisLabel'), + xAxisGrid = this.config.get('xAxisGrid'); + + this.initializeXAxis(width, height, xAxisFormat, xAxisType, xAxisGrid); + + this.svg + .append('g') + .attr('class', `x axis ${xAxisType}`) + .attr('transform', 'translate(0,' + height + ')') + .call(this._xAxis); + + this.svg + .append('text') + .attr('class', 'xaxis-title') + .attr("text-anchor", "middle") + .attr('x', width / 2) + .attr('y', height + 40) + .text(xAxisLabel) + .style('font', '0.8em Montserrat, sans-serif'); + } + + public update(data: [any]): void { + let propertyX = this.config.get('propertyX'); + let xAxisType = this.config.get('xAxisType'); + + if (xAxisType === 'linear') { + //TODO: Optimize it. Currently we are looping data twice. + let min = d3Min(data, (d) => d[propertyX]), + max = d3Max(data, (d) => d[propertyX]); + this.updateDomainByMinMax(min, max); + + } else if (xAxisType === 'time') { + let min = d3Min(data, (d) => (d[propertyX] || d[this.config.get('propertyStart')])), + max = d3Max(data, (d) => (d[propertyX] || d[this.config.get('propertyEnd')])); + this.updateDomainByMinMax(min, max); + + } + else { + let keys: string [] = map(data, (d) => d[propertyX]).keys(); + this.updateDomainByKeys(keys); + } + + this.transition(); + } + /** + * + * Update x domain by keys + * @private + * @param {*} data + * + * @memberOf XAxis + + */ + private updateDomainByKeys(keys: string[]) { + this._xAxis.scale().domain(keys); + + } + + private updateDomainByMinMax(min: number, max: number) { + this._xAxis.scale().domain([min, max]); + } + + private transition(time: number = 200) { + this.svg.selectAll('.x.axis').transition().duration(time).call(this._xAxis); + // Reorder the axis path to appear over the ticks + this.svg.select('.x.axis path').raise(); + } + + /** + * + * Initializes a new horizontal axis + * + * @private + * @param {(string | number)} Width Width of the axis + * @param {string} xAxisFormat Format of the axis. This parameter is only valid when using a time axis. + * @param {string} xAxisType Type of the axis. It can be: time, linear or categorical. + * + * @memberOf XAxis + */ + private initializeXAxis(width: number, height: string | number, xAxisFormat: string, xAxisType: string, xAxisGrid: boolean): void { + switch (xAxisType) { + case 'time': + this._xAxis = axisBottom(scaleTime().range([0, width])); + break; + case 'linear': + this._xAxis = axisBottom(scaleLinear().range([0, width])) + .tickFormat(format(xAxisFormat)); + break; + case 'categorical': + this._xAxis = axisBottom(scaleBand().rangeRound([0, width]) + .padding(0.1).align(0.5)); + break; + default: + throw new Error('Not allowed type for XAxis. Only allowed "time", "linear" or "categorical". Got: ' + xAxisType); + } + + if (xAxisGrid) { + this._xAxis + .tickSizeInner(-height) + .tickPadding(9); + } + } + + get xAxis() { + return this._xAxis; + } +} + +export default XAxis; \ No newline at end of file diff --git a/src/svg/components/XRadialAxis.ts b/src/svg/components/XRadialAxis.ts new file mode 100644 index 0000000..0b20707 --- /dev/null +++ b/src/svg/components/XRadialAxis.ts @@ -0,0 +1,23 @@ +import Component from "./Component"; +import {scaleLinear} from "d3"; + +class XRadialAxis extends Component { + + private _xRadialAxis: any; + + constructor() { + super(); + } + + update(data): void {} + + render(): void { + this._xRadialAxis = scaleLinear().range([0, 2 * Math.PI]); + } + + get xRadialAxis(): any { + return this._xRadialAxis; + } +} + +export default XRadialAxis; \ No newline at end of file diff --git a/src/svg/components/XYAxes.ts b/src/svg/components/XYAxes.ts new file mode 100644 index 0000000..ca35d83 --- /dev/null +++ b/src/svg/components/XYAxes.ts @@ -0,0 +1,47 @@ +import XAxis from './XAxis'; +import YAxis from './YAxis'; + +import Config from '../../Config'; +import Component from './Component'; + +class XYAxis extends Component { + private _x: XAxis; + private _y: YAxis; + + constructor() { + super(); + + this._x = new XAxis(); + this._y = new YAxis(); + } + + public render(): void { + this._y.render(); + this._x.render(); + + } + + public update(data): void { + this._y.update(data); + this._x.update(data); + } + + + public configure(config: Config, svg: any){ + super.configure(config, svg); + this._y.configure(config, svg); + this._x.configure(config, svg); + } + + get x(): XAxis { + return this._x; + } + + get y(): YAxis { + return this._y; + } + + +} + +export default XYAxis; \ No newline at end of file diff --git a/src/svg/components/YAxis.ts b/src/svg/components/YAxis.ts new file mode 100644 index 0000000..ddae8d8 --- /dev/null +++ b/src/svg/components/YAxis.ts @@ -0,0 +1,163 @@ +import Config from '../../Config'; +import Component from './Component'; +import Globals from '../../Globals'; +import { + stack, + map, + stackOrderInsideOut, + stackOffsetWiggle, + select, + scaleLinear, + scaleBand, + format, + axisLeft, + axisRight, + min as d3Min, + max as d3Max +} from 'd3'; + +import { isEven } from '../../utils/functions'; +import { simple2stacked } from '../../utils/dataTransformation'; + +class YAxis extends Component { + + private _yAxis: any; + private _orient: string = 'left'; + private selection: any = null; + + + constructor(orient?: string) { + super(); + if (orient != null) { + this._orient = orient; + } + } + + get orient(): string { + return this._orient; + } + + public render(): void { + let width = this.config.get('width'), + height = this.config.get('height'), + yAxisFormat = this.config.get('yAxisFormat'), + yAxisType = this.config.get('yAxisType'), + yAxisLabel = this.config.get('yAxisLabel'), + yAxisGrid = this.config.get('yAxisGrid'); + + this.initializeYAxis(width, height, yAxisFormat, yAxisType, yAxisGrid); + + let yAxisG = this.svg + .append('g') + .attr('class', 'y axis') + .attr("transform", this.orient === 'left' + ? "translate( 0, 0 )" + : "translate( " + width + ", 0 )" + ) + .call(this._yAxis); + + this.svg + .append('text') + .attr('class', 'yaxis-title') + .attr("transform", "rotate(-90)") + .attr("text-anchor", "middle") + .attr('x', 0 - height / 2) + .attr('y', 0 - 55) + .text(yAxisLabel) + .style('font', '0.8em Montserrat, sans-serif'); + + this.selection = yAxisG; + } + + public update(data: any): void { + let propertyKey = this.config.get('propertyKey'); + let propertyY = this.config.get('propertyY'); + + let yAxisType = this.config.get('yAxisType'), + yAxisShow = this.config.get('yAxisShow'), + layoutStacked = this.config.get('stacked'); + + this.selection.attr('opacity', yAxisShow ? 1 : 0); + + if (yAxisType === 'linear') { + if (layoutStacked) { //TODO: Improve + let keys: string[] = map(data, (d: any) => d[propertyKey]).keys(); + let stack = this.config.get('stack'); + let stackedData = stack.keys(keys)(simple2stacked(data)); + let min = d3Min(stackedData, (serie: any) => d3Min(serie, (d: any) => d[0])); + let max = d3Max(stackedData, (serie: any) => d3Max(serie, (d: any) => d[1])); + this.updateDomainByMinMax(min, max); + } else { + let min = d3Min(data, (d: any) => d[propertyY]), + max = d3Max(data, (d: any) => d[propertyY]); + + this.updateDomainByMinMax(min, max); + } + } else if (yAxisType === 'categorical') { + let keys = map(data, (d: any) => d[propertyKey]).keys().sort(); + this._yAxis.scale().domain(keys); + } + else { + console.warn('could not recognize y axis type', yAxisType); + } + + if (data !== null && data.length) { + this.transition(); + } + + } + + private updateDomainByMinMax(min: number, max: number) { + this._yAxis.scale().domain([min, max]); + } + + private transition(time = 200) { + this.selection.transition().duration(Globals.COMPONENT_TRANSITION_TIME).call(this._yAxis); + // Reorder the axis path to appear over the ticks + this.svg.selectAll('.y.axis path').raise(); + } + + /** + * + * Initializes a new vertical axis + * + * @private + * @param {(string | number)} Width Width of the axis + * @param {string} yAxisFormat Format of the axis. This parameter is only valid when using a time axis. + * @param {string} yAxisType Type of the axis. It can be: linear or categorical. + * + * @memberOf XAxis + */ + + private initializeYAxis(width: string | number, height: number, yAxisFormat: string, yAxisType: string, yAxisGrid: boolean): void { + switch (yAxisType) { + case 'linear': + this._yAxis = (this.orient === 'left') + ? axisLeft(scaleLinear().range([height, 0])).tickFormat(format(yAxisFormat)) + : axisRight(scaleLinear().range([height, 0])).tickFormat(format(yAxisFormat)); + break; + case 'categorical': + this._yAxis = (this.orient === 'left') + ? axisLeft(scaleBand().rangeRound([height, 0]).padding(0.1).align(0.5)) + : axisRight(scaleBand().rangeRound([height, 0]).padding(0.1).align(0.5)); + break; + default: + throw new Error('Not allowed type for YAxis. Only allowed "time", "linear" or "categorical". Got: ' + yAxisType); + } + + if (yAxisGrid && this.orient === 'left') { + this._yAxis + .tickSizeInner(-width) + .tickSizeOuter(0) + .tickPadding(20); + } + + // + } + + get yAxis() { + return this._yAxis; + } +} + +export default YAxis; \ No newline at end of file diff --git a/src/svg/components/YRadialAxis.ts b/src/svg/components/YRadialAxis.ts new file mode 100644 index 0000000..212a277 --- /dev/null +++ b/src/svg/components/YRadialAxis.ts @@ -0,0 +1,29 @@ +import Component from './Component'; +import { + scaleSqrt +} from 'd3'; + +class YRadialAxis extends Component { + + private _yRadialAxis: any; + + constructor() { + super(); + } + + public render() { + let width = this.config.get('width'), + height = this.config.get('height'), + radius = null; + radius = (Math.min(width, height) / 2) - 10; + this._yRadialAxis = scaleSqrt().range([0, radius]); + }; + + public update(data: [any]) {}; + + get yRadialAxis(): any { + return this._yRadialAxis; + } +} + +export default YRadialAxis; \ No newline at end of file diff --git a/src/svg/components/ZoomComponent.ts b/src/svg/components/ZoomComponent.ts new file mode 100644 index 0000000..9fa6301 --- /dev/null +++ b/src/svg/components/ZoomComponent.ts @@ -0,0 +1,38 @@ +import Component from './Component'; +import Zoomable from './Zoomable'; +import Config from '../../Config'; + +import { + selection, + select, + zoom, + event +} from 'd3'; + + +class ZoomComponent extends Component { + + private zoom: any; + private zoomerComponent: Zoomable; + + constructor(zoomerComponent: Zoomable) { + super(); + this.zoomerComponent = zoomerComponent; + this.zoom = zoom().scaleExtent([1 / 2, 4]); + } + + public render() { + let selector = this.config.get('selector'); + select(selector).call(this.zoom); + + this.zoom.on('zoom', () => { + this.zoomerComponent.zoom(event); + }); + } + + public update(data: [any]) { + + } +} + +export default ZoomComponent; \ No newline at end of file diff --git a/src/svg/components/Zoomable.ts b/src/svg/components/Zoomable.ts new file mode 100644 index 0000000..11ed76e --- /dev/null +++ b/src/svg/components/Zoomable.ts @@ -0,0 +1,9 @@ +import { + D3ZoomEvent +} from 'd3'; +interface Zoomable { + + zoom(e: D3ZoomEvent): void; +} + +export default Zoomable; \ No newline at end of file diff --git a/src/svg/components/areaset.js b/src/svg/components/areaset.js deleted file mode 100644 index 5481468..0000000 --- a/src/svg/components/areaset.js +++ /dev/null @@ -1,54 +0,0 @@ -import {nest} from 'd3'; - -export class Areaset { - constructor(x, y) { - this.xAxis = x.xAxis; - this.yAxis = y.yAxis; - } - - update(svg, config, data) { - let dataSeries = nest() - .key((d) => d.key) - .entries(data); - - let series = null - , areas = null - , area = config.area - , colorScale = config.colorScale - , height = config.height - , areaOpacity = config.areaOpacity; - - let areaGenerator = d3.area() - .x((d) => this.xAxis.scale()(d.x)) - .y0(height) - .y1((d) => this.yAxis.scale()(d.y)); - - svg.selectAll('g.area').remove(); - - series = svg.selectAll('g.area'); - areas = series - .data(dataSeries, (d) => d.key) - .enter() - .append('g') - .attr('class', 'area') - .append('svg:path') - .style('fill', (d, i) => colorScale(i)) - .style('fill-opacity', areaOpacity) - .attr('d', (d) => areaGenerator(d.values)); - - // series - // .insert('path', ':first-child') //if not :first-child, area overlaps markers. - // .attr('class', 'area') - // .data(dataSeries) - // .style('stroke', (d, i) => colorScale(i)) - // .style('fill', (d, i) => colorScale(i)) - // .style('fill-opacity', areaOpacity) - // .attr('d', (d) => areaGenerator(d.values)); - - this.svg = svg; - } - - render(svg, config) { - //Do nothing, since areas render only when new data is received. - } -} \ No newline at end of file diff --git a/src/svg/components/barset.js b/src/svg/components/barset.js deleted file mode 100644 index f436a82..0000000 --- a/src/svg/components/barset.js +++ /dev/null @@ -1,132 +0,0 @@ -import {simple2nested} from '../../utils/dataTransformation' -import {select, map, line, scaleBand} from 'd3'; - -export class Barset { - constructor(xAxis, yAxis) { - this.xAxis = xAxis; - this.yAxis = yAxis; - this.lineGenerator = line() - .x((d) => xAxis.scale()(d.x)) - .y((d) => yAxis.scale()(d.y)); - } - - - update(svg, config, data, method) { - let bars = null; - - if (method === 'stacked') { - this._updateStacked(svg, config, data); - } else { - this._updateGrouped(svg, config, data); - } - bars = svg.selectAll('g.serie rect'); - bars - .on('mousedown.user', config.onDown) - .on('mouseup.user', config.onUp) - .on('mouseleave.user', config.onLeave) - .on('mouseover.user', config.onHover) - .on('click.user', config.onClick); - - /** - TODO: Add default events? - bars - .on('mousedown.default', config.onDown) - .on('mouseup.default', config.onUp) - .on('mouseleave.default', function (){ select(this).transition().duration(150).attr('fill-opacity', 1)}) - .on('mouseover.default', function (){ select(this).transition().duration(150).attr('fill-opacity', 0.9)}) - .on('click.default', config.onClick); - **/ - - this.interactiveElements = bars; - } - - _updateStacked(svg, config, dataSeries) { - this._cleanCurrentSeries(svg); - - let colorScale = config.colorScale, - layer = svg.selectAll('.serie').data(dataSeries), - layerEnter = layer.enter().append('g'), - layerMerge = null, - bar = null, - barEnter = null, - barMerge = null, - x = this.xAxis.scale(), - y = this.yAxis.scale(); - - layerMerge = layer.merge(layerEnter) - .attr('class', 'serie') - .attr('fill', (d, i) => colorScale(i)); - - bar = layerMerge.selectAll('rect') - .data((d) => d); - - barEnter = bar.enter().append('rect'); - - barMerge = bar.merge(barEnter) - .attr("x", (d) => x(d.data.key)) - .attr("y", (d) => y(d[1])) - .attr("height", (d) => y(d[0]) - y(d[1])) - .attr("width", x.bandwidth()); - } - - - _updateGrouped(svg, config, data) { - this._cleanCurrentSeries(svg); - - let keys = map(data, (d) => d.key).keys(), - colorScale = config.colorScale, - layer = svg.selectAll('.serie').data(data), - layerEnter = null, - layerMerge = null, - bar = null, - barEnter = null, - barMerge = null, - x = this.xAxis.scale(), - y = this.yAxis.scale(), - xGroup = scaleBand().domain(keys).range([0, x.bandwidth()]), - height = config.height; - - data = simple2nested(data, 'x'); - - layer = svg.selectAll('.serie').data(data); - - layerEnter = layer.enter().append('g') - .attr('transform', (d) => 'translate(' + x(d.key) + ')'); - - layerMerge = layer.merge(layerEnter) - .attr('class', 'serie') - .attr('transform', (d) => 'translate(' + x(d.key) + ')'); - - bar = layerMerge.selectAll('rect') - .data((d) => d.values); - - barEnter = bar.enter().append('rect'); - - barMerge = bar.merge(barEnter) - .attr('width', xGroup.bandwidth()) - .attr("x", (d) => xGroup(d.key)) - .attr('fill', (d, i) => colorScale(i)) - .attr("y", (d) => y(d.y)) - .attr("height", (d) => height - y(d.y)); - - } - - _getKeysFromData(data) { - let keys = []; - for (let p in data[0]) { - if (p !== 'total' && p !== 'key') { - keys.push(p); - } - } - return keys; - - } - - _cleanCurrentSeries(svg) { - svg.selectAll('.serie').remove(); - } - - render(svg, config) { - //Do nothing, since bars render only when new data is received. - } -} \ No newline at end of file diff --git a/src/svg/components/dial.js b/src/svg/components/dial.js deleted file mode 100644 index 3b2920e..0000000 --- a/src/svg/components/dial.js +++ /dev/null @@ -1,84 +0,0 @@ -import {deg2rad} from '../../utils/functions'; -import {scaleLinear, arc, range} from 'd3'; - -export class Dial { // TODO tidy - constructor(axisType, config) { - if (config === null) { - throw new Error('No chart context specified for polarAxis'); - } - - this.r = ( - (config.width > config.height) ? - config.height : config.width - ) / 2; - this.translation = (() => - 'translate(' + this.r + ',' + this.r + ')' - ); - config.colorScale.domain([0, 1]); - - this.scale = scaleLinear() - .domain([config.minLevel, config.maxLevel]) - .range([0, 1]); - - this.scaleMarks = this.scale.ticks(config.ticks); - - this.range = config.maxAngle - config.minAngle; - - this.arc = arc() - .innerRadius(this.r - config.ringWidth - config.ringMargin) - .outerRadius(this.r - config.ringMargin) - .startAngle((d, i) => { - var ratio = d * i; - return deg2rad(config.minAngle + (ratio * this.range)); - }) - .endAngle((d, i) => { - var ratio = d * (i + 1); - return deg2rad(config.minAngle + (ratio * this.range)); - }); - - this.tickData = range(config.ticks) - .map(() => 1 / config.ticks); - } - - render(svg, config) { - let labels = null; - - // Append the ring - let arcs = svg.append('g') - .attr('class', 'arc') - .attr('transform', this.translation); - - // Append the ring sectors - let arcPaths = arcs.selectAll('path') - .data(this.tickData) - .enter().append('path') - // ID for textPath linking - .attr('id', (d, i) => 'sector-' + i) - .attr('d', this.arc); - - // Fill colors - if (config.invertColorScale) { - arcPaths.attr('fill', (d, i) => config.colorScale(1 - d * i)); - } else { - arcPaths.attr('fill', (d, i) => config.colorScale(d * i)); - } - - // Apend the scale labels - labels = svg.append('g') - .attr('class', 'labels') - .attr('transform', this.translation); - - // // Append scale marker labels - labels.selectAll('text') - .data(this.scaleMarks) - .enter().append('text') - .attr('transform', (d) => { - let ratio = this.scale(d); - let newAngle = config.minAngle + (ratio * this.range); - return 'rotate(' + newAngle + ') translate(0,' + (config.labelInset - this.r) + ')'; - }) - .text((d) => d) - .style('text-anchor', 'middle') - .style('font', '18px Montserrat, sans-serif'); - } -} \ No newline at end of file diff --git a/src/svg/components/dialNeedle.js b/src/svg/components/dialNeedle.js deleted file mode 100644 index a78fb8b..0000000 --- a/src/svg/components/dialNeedle.js +++ /dev/null @@ -1,78 +0,0 @@ -import {deg2rad} from '../../utils/functions'; -import {scaleLinear, arc, range} from 'd3'; - -export class DialNeedle { // TODO tidy - constructor(axisType, config) { - if (config === null) { - throw new Error('No chart context specified for polarAxis'); - } - - this.r = ( - (config.width > config.height) ? - config.height : config.width - ) / 2; - - this.needleLen = config.needleLenghtRatio * (this.r); - - this.translation = (() => - 'translate(' + this.r + ',' + this.r + ')' - ); - config.colorScale.domain([0, 1]); - - this.scale = scaleLinear() - .domain([config.minLevel, config.maxLevel]) - .range([0, 1]); - - this.angleScale = scaleLinear() - .domain([config.minLevel, config.maxLevel]) - .range([90 + config.minAngle, 90 + config.maxAngle]); - - this.scaleMarks = this.scale.ticks(config.ticks); - - this.range = config.maxAngle - config.minAngle; - - this.arc = arc() - .innerRadius(this.r - config.ringWidth - config.ringMargin) - .outerRadius(this.r - config.ringMargin) - .startAngle((d, i) => { - let ratio = d * i; - return deg2rad(config.minAngle + (ratio * this.range)); - }) - .endAngle((d, i) => { - let ratio = d * (i + 1); - return deg2rad(config.minAngle + (ratio * this.range)); - }); - - this.tickData = range(config.ticks) - .map(() => 1 / config.ticks); - } - - update(svg, config, data, method) { - let datum = data[data.length - 1]; - - this.needle - .transition() - .attr('transform', (d) => `translate(${this.r}, ${this.r}) rotate(${this.angleScale(datum.value) - 90})`) - .attr('d', `M ${0 - config.needleNutRadius} ${0} L ${0} ${0 - this.needleLen} L ${config.needleNutRadius} ${0}`); - } - - render(svg, config) { - // Update the needle - this.needle = svg.append('path') - .attr('class', 'needle') - .datum(0) - .attr('transform', (d) => `translate(${this.r}, ${this.r}) rotate(${this.angleScale(d) - 90})`) - .attr('d', `M ${0 - config.needleNutRadius} ${0} L ${0} ${0 - this.needleLen} L ${config.needleNutRadius} ${0}`) - .style('fill', '#666666'); - - // Append needle nut - svg.append('circle') - .attr('class', 'needle') - .attr('transform', this.translation) - .attr('cx', 0) - .attr('cy', 0) - .attr('r', config.needleNutRadius) - .style('fill', '#666666'); - } - -} \ No newline at end of file diff --git a/src/svg/components/legend.js b/src/svg/components/legend.js deleted file mode 100644 index ff1ac9d..0000000 --- a/src/svg/components/legend.js +++ /dev/null @@ -1,51 +0,0 @@ -import {nest} from 'd3'; - -export class Legend { - constructor() {} - - update(svg, config, data) { - let dataSeries = nest() - .key((d) => d.key) - .entries(data), - legend = null, - entries = null, - colorScale = config.colorScale, - height = config.height, - width = config.width; - - if(dataSeries.length === 1 && dataSeries[0].key === 'undefined'){ - console.warn('Not showing legend, since there is a valid key'); - return; - } - - svg.selectAll('g.legend').remove(); - - legend = svg.append('g').attr('class', 'legend'); - entries = legend.selectAll('.legend-entry') - .data(dataSeries, (d) => d.key) - .enter() - .append('g') - .attr('class', 'legend-entry'); - - - entries.append('rect') - .attr('x', width + 10) - .attr('y', (d, i) => i * 25) - .attr('height', 20) - .attr('width', 20) - .attr('fill', (d, i) => colorScale(i)) - .style('opacity', 0.8); - - entries.append('text') - .attr("x", width + 25 + 10) - .attr("y", (d, i) => i * 25 + 7) - .attr("dy", "0.55em") - .text((d) => d.key) - .style('font', '14px Montserrat, sans-serif'); - - } - - render(svg, config) { - //Do nothing, since legend render only when new data is received. - } -} \ No newline at end of file diff --git a/src/svg/components/lineset.js b/src/svg/components/lineset.js deleted file mode 100644 index 2f1ce48..0000000 --- a/src/svg/components/lineset.js +++ /dev/null @@ -1,40 +0,0 @@ -import {line, nest} from 'd3'; - -export class Lineset { - constructor(x, y) { - this.xAxis = x.xAxis; - this.yAxis = y.yAxis; - this.lineGenerator = line() - .x((d) => this.xAxis.scale()(d.x)) - .y((d) => this.yAxis.scale()(d.y)); - } - - update(svg, config, data) { - let dataSeries = nest().key((d) => d.key).entries(data), - series = null, - lines = null, - colorScale = config.colorScale; - - svg.selectAll('g.serie').remove(); - - series = svg.selectAll('g.serie'); - lines = series - .data(dataSeries, (d) => d.key) - .enter() - .append('g') - .attr('class', 'serie') - .attr('stroke', (d, i) => colorScale(i)) - .append('svg:path') - .style('stroke', (d, i) => colorScale(i)) - .style('stroke-width', 1.3) - .style('fill', 'none') - .attr('d', (d) => this.lineGenerator(d.values)) - .attr('class', 'line'); - - this.svg = svg; - } - - render(svg, config) { - //Do nothing, since lines render only when new data is received. - } -} \ No newline at end of file diff --git a/src/svg/components/nodeset.js b/src/svg/components/nodeset.js deleted file mode 100644 index ee6b813..0000000 --- a/src/svg/components/nodeset.js +++ /dev/null @@ -1,83 +0,0 @@ -import {forceSimulation, forceLink, forceManyBody, forceCenter, drag} from 'd3'; -import {simple2Linked} from '../../utils/dataTransformation'; -import {event} from 'd3'; -export class Nodeset { - constructor(config) { - this.config = config; - var width = config.width, - height = config.height; - - this.simulation = forceSimulation() - .force("link", forceLink().id((d) => d.id)) - .force("charge", forceManyBody()) - .force("center", forceCenter(width / 2, height / 2)); - - - this.dragstarted = (d) => { - if (!event.active) this.simulation.alphaTarget(0.3).restart(); - d.fx = d.x; - d.fy = d.y; - }; - - this.dragged = (d) => { - d.fx = event.x; - d.fy = event.y; - }; - - this.dragended = (d) => { - if (!event.active) this.simulation.alphaTarget(0); - d.fx = null; - d.fy = null; - }; - - } - - update(svg, config, data) { - data = simple2Linked(data); - - var link = svg.append("g") - .attr("class", "links") - .selectAll("line") - .data(data.links) - .enter().append("line") - .attr("stroke-width", 2) - .attr("stroke", "#999") - .attr("stroke-opacity", 0.6); - - var node = svg.append("g") - .attr("class", "nodes") - .selectAll("circle") - .data(data.nodes) - .enter() - .append("circle") - .attr("r", 5) - .attr("fill", (d) => "#23436f") - .call(drag() - .on("start", this.dragstarted) - .on("drag", this.dragged) - .on("end", this.dragended)); - - node.append("title") - .text((d) => d.id); - - this.simulation.nodes(data.nodes).on("tick", (e) => this.ticked(link, node)); - - this.simulation.force("link").links(data.links); - } - - ticked(link, node) { - link - .attr("x1", (d) => d.source.x) - .attr("y1", (d) => d.source.y) - .attr("x2", (d) => d.target.x) - .attr("y2", (d) => d.target.y); - - node - .attr("cx", (d) => d.x) - .attr("cy", (d) => d.y); - } - - render(svg, config) { - //Do nothing, since lines render only when new data is received. - } -} \ No newline at end of file diff --git a/src/svg/components/pointset.js b/src/svg/components/pointset.js deleted file mode 100644 index 5fc16a2..0000000 --- a/src/svg/components/pointset.js +++ /dev/null @@ -1,113 +0,0 @@ -import {nest} from 'd3'; - -export class Pointset { - constructor(x, y) { - this.xAxis = x.xAxis; - this.yAxis = y.yAxis; - } - update(svg, config, data) { - let dataSeries = nest() - .key((d) => d.key) - .entries(data), - markers = null, - markerShape = config.markerShape, - markerSize = config.markerSize, - markerOutlineWidth = config.markerOutlineWidth, - colorScale = config.colorScale, - points = null, - series = null; - - svg.selectAll('g.points').remove(); - - series = svg.selectAll('g.points'); - - switch (markerShape) { - case 'dot': - points = series - .data(dataSeries, (d) => d.key) - .enter() - .append('g') - .attr('class', 'points') - .style('fill', (d, i) => colorScale(i)) - .selectAll('circle') - .data((d) => d.values) - .enter() - .append('circle') - .attr('cx', (d) => this.xAxis.scale()(d.x)) - .attr('cy', (d) => this.yAxis.scale()(d.y)) - .attr('r', markerSize) - .attr('class', 'marker'); - break; - case 'ring': - window.console.warn('Deprecated "circle" marker shape: use "dot" or "ring" instead'); - points = series - .data(dataSeries, (d) => d.key) - .enter() - .append('g') - .attr('class', 'points') - .style('stroke', (d, i) => colorScale(i)) - .selectAll('circle') - .data((d, i) => d.values) - .enter() - .append('circle') - .attr('cx', (d) => this.xAxis.scale()(d.x)) - .attr('cy', (d) => this.yAxis.scale()(d.y)) - .attr('r', markerSize) - .attr('class', 'marker') - .style('fill', 'white') - .style('stroke-width', markerOutlineWidth); - break; - // Deprecated circle option - case 'circle': - window.console.warn('Deprecated "circle" marker shape: use "dot" or "ring" instead'); - points = series - .data(dataSeries, (d) => d.key) - .enter() - .append('g') - .attr('class', 'points') - .style('stroke', (d, i) => colorScale(i)) - .selectAll('circle') - .data((d, i) => d.values) - .enter() - .append('circle') - .attr('cx', (d) => this.xAxis.scale()(d.x)) - .attr('cy', (d) => this.yAxis.scale()(d.y)) - .attr('r', markerSize) - .attr('class', 'lineMarker') - .style('fill', 'white') - .style('stroke-width', markerOutlineWidth); - break; - default: - points = series - .data(dataSeries, (d) => d.key) - .enter() - .append('g') - .attr('class', 'points') - .style('stroke', (d, i) => colorScale(i)) - .selectAll('circle') - .data((d, i) => d.values) - .enter() - .append('circle') - .attr('cx', (d) => this.xAxis.scale()(d.x)) - .attr('cy', (d) => this.yAxis.scale()(d.y)) - .attr('r', markerSize) - .attr('class', 'lineMarker') - .style('fill', 'white') - .style('stroke-width', markerOutlineWidth); - } - - markers = svg.selectAll('g.points circle'); - markers - .on('mousedown.user', config.onDown) - .on('mouseup.user', config.onUp) - .on('mouseleave.user', config.onLeave) - .on('mouseover.user', config.onHover) - .on('click.user', config.onClick); - - //this.interactiveElements = markers; - } - - render(svg, config) { - //Do nothing, since points render only when new data is received. - } -} \ No newline at end of file diff --git a/src/svg/components/radialAxes.js b/src/svg/components/radialAxes.js deleted file mode 100644 index 484cc4b..0000000 --- a/src/svg/components/radialAxes.js +++ /dev/null @@ -1,13 +0,0 @@ -import {XRadialAxis} from './xRadialAxis' -import {YRadialAxis} from './yRadialAxis' -// -export class RadialAxes { - constructor(config) { - if (config === null) { - throw new Error('No chart context specified for RadialAxis'); - } - - this.x = new XRadialAxis(config); - this.y = new YRadialAxis(config); - } -} \ No newline at end of file diff --git a/src/svg/components/streamset.js b/src/svg/components/streamset.js deleted file mode 100644 index 4969af2..0000000 --- a/src/svg/components/streamset.js +++ /dev/null @@ -1,56 +0,0 @@ -import { - timeParse, - curveCardinal, - area -} from 'd3'; - -export class Streamset { - constructor(xAxis, yAxis) { - this.xAxis = xAxis; - this.yAxis = yAxis; - - this.areaGenerator = area() - .curve(curveCardinal) - .x((d) => this.xAxis.scale()((timeParse(this.xDataFormat)(d.data.key)))) // TODO: It seems d3.nest() transform Date object in - .y0((d) => this.yAxis.scale()(d[0])) - .y1((d) => this.yAxis.scale()(d[1])) - } - - - update(svg, config, data) { - let series = null; - - //Update date format, used by areaGenerator function due to a problem when nesting with d3. - this.xDataFormat = config.xAxisFormat; - - svg.selectAll('.serie').remove(); - - series = svg.selectAll('.serie') - .data(data) - .enter() - .append('g') - .attr('class', 'serie') - .style('stroke', (d, i) => config.colorScale(i)); - - series - .append('path') - .attr('class', 'layer') - .attr('d', this.areaGenerator) - .style('fill', (d, i) => config.colorScale(i)); - - - series.exit().remove(); - - series - .attr('opacity', 1) - .on('mousedown.user', config.onDown) - .on('mouseup.user', config.onUp) - .on('mouseleave.user', config.onLeave) - .on('mouseover.user', config.onHover) - .on('click.user', config.onClick); - } - - render(svg, config) { - //Do nothing, since lines render only when new data is received. - } -} \ No newline at end of file diff --git a/src/svg/components/sunburstDisk.js b/src/svg/components/sunburstDisk.js deleted file mode 100644 index d09fc5b..0000000 --- a/src/svg/components/sunburstDisk.js +++ /dev/null @@ -1,107 +0,0 @@ -import {partition, stratify, arc} from 'd3'; - - -export class SunburstDisk { - constructor(xRadialAxis, yRadialAxis) { - this.x = xRadialAxis; - this.y = yRadialAxis; - this.arcGen = arc() - .startAngle((d) => Math.max(0, Math.min(2 * Math.PI, this.x(d.x0)))) - .endAngle((d) => Math.max(0, Math.min(2 * Math.PI, this.x(d.x1)))) - .innerRadius((d) => Math.max(0, this.y(d.y0))) - .outerRadius((d) => Math.max(0, this.y(d.y1))); - } - - update(svg, config, data) { - - // Remove all the paths before redrawing - this._removePaths(svg); - - // Create layout partition - let root = stratify() - .id((d) => d.id) - .parentId((d) => d.parent) - (data); - - root.sum((d) => d.value); - partition()(root); - - // Draw the paths (arcs) - let paths = svg.selectAll('path') - .data(root.descendants()) - .enter().append('path') - .attr('d', this.arcGen) - .style('fill', (d) => { - if (!d.parent) { - return 'white'; - } else { - return config.colorScale(d.data.label); - } - }) - .style('stroke', '#fff') - .style('stroke-width', '2') - .style('shape-rendering', 'crispEdge'); - - paths // TODO extract events to config? - .on('mouseover.default', (d) => { - let ancestors = this._getAncestors(d); - // Fade all the arcs - if (ancestors.length > 0) { - svg.selectAll('path') - .style('opacity', 0.3); - } - svg.selectAll('path') - .filter((node) => ancestors.indexOf(node) >= 0) - .style('opacity', 1); - // Hightlight the hovered arc - svg.select('.text-indicator .label').text(d.data.label); - svg.select('.text-indicator .value').text(d.value); - }) - .on('mouseout.default', (d) => { - svg.selectAll('path').style('opacity', 1); - svg.select('.text-indicator .label').style('font-weight', 'normal'); - svg.select('.text-indicator .label').text(''); - svg.select('.text-indicator .value').text(''); - }) - ; - - paths - .on('mousedown.user', config.onDown) - .on('mouseup.user', config.onUp) - .on('mouseleave.user', config.onLeave) - .on('mouseover.user', config.onHover) - .on('click.user', config.onClick); - - // ??? - svg.select(self.frameElement).style('height', this.height + 'px'); - } - - /** - * Removes all the paths (arcs). Doing this before each redraw prevents the - * transition to mess up the arcs. - * @private - */ - _removePaths(svg) { - svg.selectAll('path').remove(); - } - - /** - * From: http://bl.ocks.org/kerryrodden/7090426 - * @param node - * @returns {Array} - * @private - */ - _getAncestors(node) { - let path = []; - let current = node; - while (current.parent) { - path.unshift(current); - current = current.parent; - } - return path; - } - - render(svg, config) { - //Do nothing, since disk render only when new data is received. - } -} diff --git a/src/svg/components/svgContainer.js b/src/svg/components/svgContainer.js deleted file mode 100644 index 04ce314..0000000 --- a/src/svg/components/svgContainer.js +++ /dev/null @@ -1,42 +0,0 @@ -import {select} from 'd3'; - -export class SvgContainer { - - constructor(config) { - this._config = config; - this.svg = this._initializeSvgContainer(config); - this.components = Array(); - } - - _initializeSvgContainer(config) { - let selector = config.selector, - width = config.width + config.marginLeft + config.marginRight, - height = config.height + config.marginTop + config.marginBottom, - svg = null; - - svg = select(selector) - .append('svg:svg') - .attr('width', width) - .attr('height', height) - .append('g') - .attr('class', 'chartContainer') - .attr('transform', 'translate(' + config.marginLeft + ',' + config.marginTop + ')'); - - return svg; - } - - - add(component, render = true) { - this.components.push(component); - - if (render) { - component.render(this.svg, this._config); - } - return this; - } - - transform(translation) { - this.svg.attr('transform', translation); - - } -} \ No newline at end of file diff --git a/src/svg/components/textIndicator.js b/src/svg/components/textIndicator.js deleted file mode 100644 index 1a7e7bb..0000000 --- a/src/svg/components/textIndicator.js +++ /dev/null @@ -1,47 +0,0 @@ -export class TextIndicator { // TODO tidy - constructor(config) { - if (config === null) { - throw new Error('No chart context specified for polarAxis'); - } - - this.translation = config.textIndicatorTranslation; - } - - update(svg, value, label) { - svg.select('.value') - .text(value); - svg.select('.label') - .text(label); - } - - render(svg, config) { - let indicator = svg.append('g') - .attr('class', 'text-indicator') - .attr('pointer-events', 'none') - .style('text-anchor', 'middle') - .style('alignment-baseline', 'central'); - - if (this.translation) { - indicator.attr('transform', this.translation); - } - - indicator.append('text') - .attr('class', 'value') - .attr('x', 0) - .attr('y', 0) - .attr('pointer-events', 'none') - .text('0') - .style('font', '48px Montserrat, sans-serif') - .style('text-anchor', 'middle'); - - indicator.append('text') - .attr('class', 'label') - .attr('x', 0) - .attr('y', 0) - .attr('pointer-events', 'none') - .text('') - .style('font', '24px Montserrat, sans-serif') - .style('transform', 'translate(0, 1.5em') - .style('text-anchor', 'middle'); - } -} \ No newline at end of file diff --git a/src/svg/components/timeBoxset.js b/src/svg/components/timeBoxset.js deleted file mode 100644 index 62e7dd0..0000000 --- a/src/svg/components/timeBoxset.js +++ /dev/null @@ -1,63 +0,0 @@ -import {simple2nested} from '../../utils/dataTransformation'; -import {map, scaleBand, extent, scaleLinear} from 'd3'; - -export class TimeBoxset { - - constructor(xAxis, yAxis) { - this.xAxis = xAxis; - this.yAxis = yAxis; - - } - update(svg, config, data) { - let colorScale = config.colorScale, - keys = map(data, (d) => d.key).keys(), - layer = svg.selectAll('.serie').data(data), - layerEnter = null, - layerMerge = null, - box = null, - boxEnter = null, - boxMerge = null, - extLanes = null, - yLanes = null, - yLanesBand = scaleBand().range([0, keys.length + 1]).domain(keys), - x = this.xAxis.scale(), - y = this.yAxis.scale(); - - data = simple2nested(data); - extLanes = extent(data, (d, i) => i); - yLanes = scaleLinear().domain([extLanes[0], extLanes[1] + 1]).range([0, config.height]); - - layer = svg.selectAll('.serie').data(data); - layerEnter = layer.enter().append('g'); - - layerMerge = layer.merge(layerEnter) - .attr('class', 'serie'); - - - box = layerMerge.selectAll('rect') - .data((d) => d.values); - - boxEnter = box.enter().append('rect'); - - boxMerge = box.merge(boxEnter) - .attr('width', (d) => x(d.end) - x(d.start)) - .attr('x', (d) => x(d.start)) - .attr('y', (d) => y(d.key)) - .attr('fill', (d) => colorScale(parseInt(yLanesBand(d.key)))) - .attr('height', () => 0.8 * yLanes(1)); - - box = svg.selectAll('g.serie rect'); - - box - .on('mousedown.user', config.onDown) - .on('mouseup.user', config.onUp) - .on('mouseleave.user', config.onLeave) - .on('mouseover.user', config.onHover) - .on('click.user', config.onClick); - - } - - render(svg, config) { - //Do nothing, since lines render only when new data is received. - } -} \ No newline at end of file diff --git a/src/svg/components/tooltip.js b/src/svg/components/tooltip.js deleted file mode 100644 index 9509977..0000000 --- a/src/svg/components/tooltip.js +++ /dev/null @@ -1,44 +0,0 @@ - -class Tooltip { - /** - constructor() { - - } - - render(svg, config) { - this.tooltip = d3.select(config.selector + ' g.chartContainer') - .append('div') - .text('tooltip') - .attr('class', 'tooltip'); - - this.tooltip.style('opacity', 0); - - console.log('tooltip rendered'); - } - - enter() { - //we need svg!!!!!. d3.select is d4ng3rous - var mouse = d3.mouse(this) - , tooltip = null; - - tooltip = d3.select('.tooltip') - .style('opacity', 1) - .style('top', mouse[0] + 'px') - .style('left', mouse[1] + 'px') - .style('height', 150) - .style('width', 400); - - console.log('Entering tooltip', this, d3.mouse(this)); - - } - - exit() { - console.log('Exiting tooltip'); - } - - bind(elements) { - elements.on('mouseover.tooltip', this.enter); - elements.on('mouseleave.tooltip', this.exit); - } - **/ -} \ No newline at end of file diff --git a/src/svg/components/xAxis.js b/src/svg/components/xAxis.js deleted file mode 100644 index 37935ad..0000000 --- a/src/svg/components/xAxis.js +++ /dev/null @@ -1,114 +0,0 @@ -import {isEven} from '../../utils/functions'; -import {select, scaleTime, scaleLinear, scaleBand, axisBottom, format as d3Format} from 'd3'; - -export class XAxis { - constructor(xAxisType, config) { - if (config === null) { - throw new Error('No chart context specified for XAxis'); - } - - this.xAxis = this._initializeXAxis(xAxisType, config); - } - - - rescale(width, height) { - this.xAxis.scale().range([0, width]); - } - - _initializeXAxis(xAxisType = 'linear', config) { - let x = null, - axis = null; - - // switch (xAxisType) { - // case 'time': - // x = scaleTime().range([0, config.width]); - // break; - // case 'linear': - // x = scaleLinear().range([0, config.width]); - // break; - // case 'categorical': - // x = scaleBand().rangeRound([0, config.width]) - // .padding(0.1) - // .align(0.5); - // break; - // default: - // throw new Error('Not allowed type for XAxis. Only allowed "time", "linear" or "categorical". Got: ' + xAxisType); - // } - - switch (xAxisType) { - case 'time': - x = scaleTime().range([0, config.width]); - axis = axisBottom(x); - break; - case 'linear': - x = scaleLinear().range([0, config.width]); - axis = axisBottom(x).tickFormat(d3Format(config.xAxisFormat)); - break; - case 'categorical': - x = scaleBand().rangeRound([0, config.width]) - .padding(0.1) - .align(0.5); - axis = axisBottom(x); - break; - default: - throw new Error('Not allowed type for XAxis. Only allowed "time", "linear" or "categorical". Got: ' + xAxisType); - } - - return axisBottom(x); - } - - transition(svg, time = 200) { - svg.selectAll('.x.axis').transition().duration(time).call(this.xAxis).on('end', this.xStyle); - } - - xStyle() { - select(this).selectAll('g.tick text') - .style('font', '1.4em Montserrat, sans-serif') - .style('fill', (d, i) => !isEven(i) || i === 0 ? '#5e6b70' : '#1a2127') - .style('fill', (d) => '#1a2127') - - - select(this).selectAll(['path', 'line']) - .attr('stroke', 'gray') - .attr('stroke-width', .3); - - } - - /** - * This function is used when both x and y dial update their domains by x and y max/min values, respectively. - */ - updateDomainByBBox(b) { - let x = this.xAxis.scale(); - x.domain([b[0], b[1]]); - } - - /** - * Used when x domain is caterogial (a set of keys) and y domain is linear. - */ - updateDomainByKeys(keys, yBbox) { - let x = this.xAxis.scale(); - x.domain(keys); - } - - render(svg, config) { - let xAxis = this.xAxis, - width = config.width, - height = config.height; - svg - .append('g') - .attr('class', 'x axis') - .attr('transform', 'translate(0,' + config.height + ')') - .call(xAxis); - - svg - .append('text') - .attr('class', 'xaxis-title') - .attr("text-anchor", "middle") - .attr('x', width / 2) - .attr('y', height + 40) - .text(config.xAxisLabel) - .style('font', '0.8em Montserrat, sans-serif'); - - this.svg = svg; - } -} \ No newline at end of file diff --git a/src/svg/components/xRadialAxis.js b/src/svg/components/xRadialAxis.js deleted file mode 100644 index 19e592d..0000000 --- a/src/svg/components/xRadialAxis.js +++ /dev/null @@ -1,12 +0,0 @@ -import {scaleLinear} from 'd3'; - -export class XRadialAxis { - - constructor(config) { - if (config === null) { - throw new Error('No chart context specified for XRadialAxis'); - } - - this.xRadialAxis = scaleLinear().range([0, 2 * Math.PI]); - } -} \ No newline at end of file diff --git a/src/svg/components/xyAxes.js b/src/svg/components/xyAxes.js deleted file mode 100644 index 6d24707..0000000 --- a/src/svg/components/xyAxes.js +++ /dev/null @@ -1,49 +0,0 @@ -import {XAxis} from './xAxis' -import {YAxis} from './yAxis' - -export class XYAxes { - constructor(xAxisType, yAxisType, config) { - if (config === null) { - throw new Error('No chart context specified for XAxis'); - } - - this.x = new XAxis(xAxisType, config); - this.y = new YAxis(yAxisType, config); - } - - transition(svg, time = 200) { - this.x.transition(svg, time); - this.y.transition(svg, time); - } - - /** - * This function is used when both x and y dial update their domains by x and y max/min values, respectively. - */ - updateDomainByBBox(b) { - this.x.updateDomainByBBox([b[0], b[1]]); - this.y.updateDomainByBBox([b[2], b[3]]); - } - - /** - * Used when x domain is caterogial (a set of keys) and y domain is linear. - */ - updateDomainByKeysAndBBox(keys, bbox) { - this.x.updateDomainByKeys(keys); - this.y.updateDomainByBBox(bbox); - } - - updateDomainByBBoxAndKeys(bbox, keys){ - this.x.updateDomainByBBox(bbox); - this.y.updateDomainByKeys(keys); - } - - render(svg, config) { - this.x.render(svg, config); - this.y.render(svg, config); - } - - rescale(width, height){ - this.x.rescale(width, height); - this.y.rescale(width, height); - } -} \ No newline at end of file diff --git a/src/svg/components/yAxis.js b/src/svg/components/yAxis.js deleted file mode 100644 index 5eb1a59..0000000 --- a/src/svg/components/yAxis.js +++ /dev/null @@ -1,107 +0,0 @@ -import {isEven} from '../../utils/functions'; -import {select, scaleLinear, scaleBand, axisLeft, format as d3Format} from 'd3'; - -export class YAxis { - constructor(yAxisType, config) { - if (config === null) { - throw new Error('No chart context specified for XAxis'); - } - - this.yAxis = this._initializeYAxis(yAxisType, config); - } - - rescale(width, height) { - this.yAxis.tickSizeInner(-width); - } - - _initializeYAxis(yAxisType = 'linear', config) { - let y = null, - axis = null; - switch (yAxisType) { - case 'linear': - y = scaleLinear().range([config.height, 0]); - axis = axisLeft(y).tickFormat(d3Format(config.yAxisFormat)); - break; - case 'categorical': - y = scaleBand().rangeRound([config.height, 0]) - .padding(0.1) - .align(0.5); - axis = axisLeft(y); - break; - default: - throw new Error('Not allowed type for YAxis. Only allowed "time", "linear" or "categorical". Got: ' + yAxisType); - } - - return axis.tickSizeInner(-config.width) - .tickSizeOuter(0) - .tickPadding(20); - } - - // _initializeYAxis(yAxisType = 'linear', config) { - // let y = null, - // yAxis = null; - // - // switch (yAxisType) { - // case 'linear': - // y = scaleLinear().range([config.height, 0]); - // break; - // case 'categorical': - // y = scaleBand().rangeRound([config.height, 0]) - // .padding(0.1) - // .align(0.5); - // break; - // default: - // throw new Error('Not allowed type for YAxis. Only allowed "time", "linear" or "categorical". Got: ' + yAxisType); - // } - // return axisLeft(y) - // .tickSizeInner(-config.width) - // .tickSizeOuter(0) - // .tickPadding(20) - // .tickFormat((d) => d) - // .ticks(config.yticks, config.tickLabel); - // } - - transition(svg, time = 200) { - svg.selectAll('.y.axis').transition().duration(time).call(this.yAxis).on('end', this.yStyle); - } - - yStyle() { - select(this).selectAll('g.tick text') - .style('font', '1.4em Montserrat, sans-serif') - .style('fill', (d, i) => !isEven(i) || i === 0 ? '#5e6b70' : '#1a2127'); - select(this).selectAll('g.tick line') - .style('stroke', (d, i) => isEven(i) && i !== 0 ? '#5e6b70' : '#dbdad8'); - } - - updateDomainByBBox(b) { - let y = this.yAxis.scale(); - y.domain(b); - } - - updateDomainByKeys(keys) { - let y = this.yAxis.scale(); - y.domain(keys); - } - - render(svg, config) { - let yAxis = this.yAxis, - width = config.width, - height = config.height; - svg - .append('g') - .attr('class', 'y axis') - .attr('stroke-dasharray', '1, 5') - .call(yAxis); - - svg - .append('text') - .attr('class', 'yaxis-title') - .attr("transform", "rotate(-90)") - .attr("text-anchor", "middle") - .attr('x', 0 - height / 2) - .attr('y', 0 - 55) - .text(config.yAxisLabel) - .style('font', '0.8em Montserrat, sans-serif'); - - } -} \ No newline at end of file diff --git a/src/svg/components/yRadialAxis.js b/src/svg/components/yRadialAxis.js deleted file mode 100644 index ef76913..0000000 --- a/src/svg/components/yRadialAxis.js +++ /dev/null @@ -1,15 +0,0 @@ -import {scaleSqrt} from 'd3'; - -export class YRadialAxis { - - constructor(config) { - if (config === null) { - throw new Error('No chart context specified for XRadialAxis'); - } - - let radius = (Math.min(config.width, config.height) / 2) - 10; - - this.yRadialAxis = scaleSqrt() - .range([0, radius]); - } -} \ No newline at end of file diff --git a/src/svg/strategies/SvgStrategy.ts b/src/svg/strategies/SvgStrategy.ts new file mode 100644 index 0000000..1a8c224 --- /dev/null +++ b/src/svg/strategies/SvgStrategy.ts @@ -0,0 +1,24 @@ +import Config from '../../Config'; +import SvgChart from '../base/SvgChart'; + + +export class SvgContext { + private strategy: SvgChart; + + constructor(strategy: SvgChart, config: Config) { + this.strategy = strategy; + this.strategy.setConfig(config); + this.strategy.initialize(); + } + + public draw(data: [{}]): void { + this.strategy.draw(data); + } + + public addLoading(){ + this.strategy.addLoading(); + } + public removeLoading(){ + this.strategy.removeLoading(); + } +} \ No newline at end of file diff --git a/src/svg/strategies/SvgStrategyBarchart.ts b/src/svg/strategies/SvgStrategyBarchart.ts new file mode 100644 index 0000000..74c4b2d --- /dev/null +++ b/src/svg/strategies/SvgStrategyBarchart.ts @@ -0,0 +1,66 @@ +import XYAxes from '../components/XYAxes'; +import Barset from '../components/Barset'; +import Legend from '../components/Legend'; + +import Config from '../../Config'; +import SvgChart from '../base/SvgChart'; +import { sortByField } from '../../utils/dataSorting'; +import { convertByXYFormat } from '../../utils/dataTransformation'; + +class SvgStrategyBarchart extends SvgChart { + /** + * + * XY Axes. Horizontal and vertical references + * + * @private + * @type {XYAxes} + * @memberOf SvgStrategyBarchart + */ + private axes: XYAxes; + + /** + * + * Set of bars. The numbers of bars depends on data. Every draw() call lines are automatically updated. + * @private + * @type {Lineset} + * @memberOf SvgStrategyBarchart + + */ + private bars: Barset; + + + private legend: Legend; + + + constructor() { + super(); + this.axes = new XYAxes(); + this.bars = new Barset(this.axes.x, this.axes.y); + } + + public draw(data: [{}]) { + let xAxisFormat = this.config.get('xAxisFormat'), + xAxisType = this.config.get('xAxisType'), + yAxisFormat = this.config.get('yAxisFormat'), + yAxisType = this.config.get('yAxisType'); + + convertByXYFormat(data, xAxisFormat, xAxisType, yAxisFormat, yAxisType); + sortByField(data, 'x'); + + this.container.updateComponents(data); + } + + + public initialize(): void { + super.initialize(); + let legend = this.config.get('legend'); + this.container.add(this.axes).add(this.bars); + + if (legend) { + this.legend = new Legend(); + this.container.add(this.legend); + } + } +} + +export default SvgStrategyBarchart; \ No newline at end of file diff --git a/src/svg/strategies/SvgStrategyGauge.ts b/src/svg/strategies/SvgStrategyGauge.ts new file mode 100644 index 0000000..c18b2af --- /dev/null +++ b/src/svg/strategies/SvgStrategyGauge.ts @@ -0,0 +1,46 @@ + +import Config from '../../Config'; +import SvgChart from '../base/SvgChart'; +import { sortByField } from '../../utils/dataSorting'; +import { convertByXYFormat } from '../../utils/dataTransformation'; +import Dial from '../components/Dial'; +import DialNeedle from '../components/DialNeedle'; +import TextIndicator from "../components/TextIndicator"; + +class SvgStrategyGauge extends SvgChart { + + private dial: Dial; + private dialNeedle: DialNeedle; + private textIndicator: TextIndicator; + + + constructor() { + super(); + this.dial = new Dial(); + this.dialNeedle = new DialNeedle(); + this.textIndicator = new TextIndicator(); + } + + public draw(data: [{}]) { + this.container.updateComponents(data); + } + + + public initialize(): void { + super.initialize(); + + this.container.add(this.dial).add(this.dialNeedle); + if (this.config.get('numericIndicator')) { + let width = this.config.get('width'), + height = this.config.get('height'); + let r = ( + (width > height) ? height : width + ) / 2; + let indicatorOffset = r + 75; + this.container.add(this.textIndicator); + this.textIndicator.translate(r, indicatorOffset); + } + } +} + +export default SvgStrategyGauge; \ No newline at end of file diff --git a/src/svg/strategies/SvgStrategyLinechart.ts b/src/svg/strategies/SvgStrategyLinechart.ts new file mode 100644 index 0000000..624c024 --- /dev/null +++ b/src/svg/strategies/SvgStrategyLinechart.ts @@ -0,0 +1,85 @@ +import XYAxes from '../components/XYAxes'; +import Lineset from '../components/Lineset'; +import Pointset from '../components/Pointset'; +import Areaset from '../components/Areaset'; +import Legend from '../components/Legend'; + +import Config from '../../Config'; +import SvgChart from '../base/SvgChart'; +import { sortByField } from '../../utils/dataSorting'; +import { convertByXYFormat } from '../../utils/dataTransformation'; + +class SvgStrategyLinechart extends SvgChart { + /** + * + * XY Axes. Horizontal and vertical references + * + * @private + * @type {XYAxes} + * @memberOf SvgStrategyLinechart + */ + private axes: XYAxes; + + /** + * + * Set of lines. The numbers of lines depends on data. Every draw() call lines are automatically updated. + * @private + * @type {Lineset} + * @memberOf SvgStrategyLinechart + + */ + private lines: Lineset; + + + private markers : Pointset; + + private area : Areaset; + + private legend : Legend; + + + constructor() { + super(); + this.axes = new XYAxes(); + this.lines = new Lineset(this.axes.x, this.axes.y); + } + + public draw(data: [{}]) { + let xAxisFormat = this.config.get('xAxisFormat'), + xAxisType = this.config.get('xAxisType'), + yAxisFormat = this.config.get('yAxisFormat'), + yAxisType = this.config.get('yAxisType'); + + convertByXYFormat(data, xAxisFormat, xAxisType, yAxisFormat, yAxisType); + sortByField(data, 'x'); + + this.container.updateComponents(data); + } + + + public initialize(): void { + super.initialize(); + let markerSize = this.config.get('markerSize'), + areaOpacity = this.config.get('areaOpacity'), + legend = this.config.get('legend'); + + this.container.add(this.axes).add(this.lines); + + if (areaOpacity > 0) { + this.area = new Areaset(this.axes.x, this.axes.y); + this.container.add(this.area); + } + + if (markerSize > 0) { + this.markers = new Pointset(this.axes.x, this.axes.y); + this.container.add(this.markers); + } + + if(legend){ + this.legend = new Legend(); + this.container.add(this.legend); + } + } +} + +export default SvgStrategyLinechart; \ No newline at end of file diff --git a/src/svg/strategies/SvgStrategyNetwork.ts b/src/svg/strategies/SvgStrategyNetwork.ts new file mode 100644 index 0000000..511d22c --- /dev/null +++ b/src/svg/strategies/SvgStrategyNetwork.ts @@ -0,0 +1,42 @@ +import LinkedNodeset from '../components/LinkedNodeset'; +import Legend from '../components/Legend'; +import ZoomComponent from '../components/ZoomComponent'; +import Config from '../../Config'; +import SvgChart from '../base/SvgChart'; +import { sortByField } from '../../utils/dataSorting'; + +class SvgStrategyNetwork extends SvgChart { + + private linkedNodes: LinkedNodeset; + private legend: Legend; + private zoom: ZoomComponent; + + constructor() { + super(); + } + + public draw(data: [{}]) { + this.container.updateComponents(data); + } + + + public initialize(): void { + super.initialize(); + let legend = this.config.get('legend'); + let zoom = this.config.get('zoom'); + + this.linkedNodes = new LinkedNodeset(); + this.container.add(this.linkedNodes); + if (legend) { + this.legend = new Legend(); + this.container.add(this.legend); + } + + if (zoom) { + this.zoom = new ZoomComponent(this.linkedNodes); + this.container.add(this.zoom); + } + } +} + +export default SvgStrategyNetwork; \ No newline at end of file diff --git a/src/svg/strategies/SvgStrategyPieChart.ts b/src/svg/strategies/SvgStrategyPieChart.ts new file mode 100644 index 0000000..1ba9d69 --- /dev/null +++ b/src/svg/strategies/SvgStrategyPieChart.ts @@ -0,0 +1,39 @@ +import SvgChart from "../base/SvgChart"; +import SectorSet from "../components/SectorSet"; +import Legend from "../components/Legend"; + +class SvgStrategyPieChart extends SvgChart { + + private sectors: SectorSet; + private legend: Legend; + + constructor() { + super(); + this.sectors = new SectorSet(); + + } + + public draw(data: [{}]) { + this.container.translate( + this.config.get('width') / 2, + this.config.get('height') / 2 + ); + this.container.updateComponents(data); + } + + public initialize(): void { + super.initialize(); + this.container + .add(this.sectors) + + let legend = this.config.get('legend'); + if(legend) { + this.legend = new Legend(); + this.container.add(this.legend); + } + + } + +} + +export default SvgStrategyPieChart; diff --git a/src/svg/strategies/SvgStrategyScatterplot.ts b/src/svg/strategies/SvgStrategyScatterplot.ts new file mode 100644 index 0000000..eb82baa --- /dev/null +++ b/src/svg/strategies/SvgStrategyScatterplot.ts @@ -0,0 +1,83 @@ +import XYAxes from '../components/XYAxes'; +import Pointset from '../components/Pointset'; +import Legend from '../components/Legend'; + +import Config from '../../Config'; +import SvgChart from '../base/SvgChart'; +import { sortByField } from '../../utils/dataSorting'; +import { convertByXYFormat } from '../../utils/dataTransformation'; +import CanvasPointset from "../components/CanvasPointset"; + +class SvgStrategyScatterplot extends SvgChart { + /** + * + * XY Axes. Horizontal and vertical references + * + * @private + * @type {XYAxes} + * @memberOf SvgStrategyScatterplot + */ + private axes: XYAxes; + + /** + * + * Set of points + * + * @private + * @type {Pointset} + * @memberOf SvgStrategyScatterplot + */ + private markers: Pointset; + + /** + * + * Set of points + * + * @private + * @type {CanvasPointset} + * @memberOf SvgStrategyScatterplot + */ + private canvasMarkers: CanvasPointset; + + private legend: Legend; + + constructor() { + super(); + this.axes = new XYAxes(); + this.markers = new Pointset(this.axes.x, this.axes.y); + this.canvasMarkers = new CanvasPointset(this.axes.x, this.axes.y); + } + + public draw(data: [{}]) { + let xAxisFormat = this.config.get('xAxisFormat'), + xAxisType = this.config.get('xAxisType'), + yAxisFormat = this.config.get('yAxisFormat'), + yAxisType = this.config.get('yAxisType'); + + convertByXYFormat(data, xAxisFormat, xAxisType, yAxisFormat, yAxisType); + sortByField(data, 'x'); + + this.container.updateComponents(data); + } + + + public initialize(): void { + super.initialize(); + let legend = this.config.get('legend'); + + this.container.add(this.axes); + + if (this.config.get('canvas')) { + this.container.add(this.canvasMarkers); + } else { + this.container.add(this.markers); + } + + if (legend) { + this.legend = new Legend(); + this.container.add(this.legend); + } + } +} + +export default SvgStrategyScatterplot; \ No newline at end of file diff --git a/src/svg/strategies/SvgStrategyStreamgraph.ts b/src/svg/strategies/SvgStrategyStreamgraph.ts new file mode 100644 index 0000000..5fb7d23 --- /dev/null +++ b/src/svg/strategies/SvgStrategyStreamgraph.ts @@ -0,0 +1,61 @@ +import XYAxes from '../components/XYAxes'; +import Legend from '../components/Legend'; +import Streamset from '../components/Streamset'; + +import Config from '../../Config'; +import SvgChart from '../base/SvgChart'; +import { sortByField } from '../../utils/dataSorting'; +import { convertPropretiesToTimeFormat } from '../../utils/dataTransformation'; + +class SvgStrategyStreamgraph extends SvgChart { + /** + * + * XY Axes. Horizontal and vertical references + * + * @private + * @type {XYAxes} + * @memberOf SvgStrategyStreamgraph + */ + private axes: XYAxes; + + private legend: Legend; + + private streams: Streamset; + + + constructor() { + super(); + this.axes = new XYAxes(); + this.streams = new Streamset(this.axes); + } + + public draw(data: [{}]) { + let xAxisFormat = this.config.get('xAxisFormat'), + xAxisType = this.config.get('xAxisType'), + yAxisFormat = this.config.get('yAxisFormat'), + yAxisType = this.config.get('yAxisType'); + + convertPropretiesToTimeFormat(data, ['x'], xAxisFormat); + + sortByField(data, 'x'); + + this.container.updateComponents(data); + } + + + public initialize(): void { + super.initialize(); + let markerSize = this.config.get('markerSize'), + areaOpacity = this.config.get('areaOpacity'), + legend = this.config.get('legend'); + + this.container.add(this.axes).add(this.streams); + + if (legend) { + this.legend = new Legend(); + this.container.add(this.legend); + } + } +} + +export default SvgStrategyStreamgraph; \ No newline at end of file diff --git a/src/svg/strategies/SvgStrategySunburst.ts b/src/svg/strategies/SvgStrategySunburst.ts new file mode 100644 index 0000000..8cea4a7 --- /dev/null +++ b/src/svg/strategies/SvgStrategySunburst.ts @@ -0,0 +1,39 @@ +import SvgChart from "../base/SvgChart"; +import RadialAxes from "../components/RadialAxes"; +import SunburstDisk from "../components/SunburstDisk"; +import TextIndicator from "../components/TextIndicator"; + +class SvgStrategySunburst extends SvgChart { + + private axes: RadialAxes; + private disk: SunburstDisk; + private textIndicator: TextIndicator; + + constructor() { + super(); + this.axes = new RadialAxes(); + this.disk = new SunburstDisk( + this.axes.x, this.axes.y + ); + this.textIndicator = new TextIndicator(); + } + + public draw(data: [{}]) { + this.container.translate( + this.config.get('width') / 2, + this.config.get('height') / 2 + ); + this.container.updateComponents(data); + } + + public initialize(): void { + super.initialize(); + this.container + .add(this.axes) + .add(this.disk) + .add(this.textIndicator); + } + +} + +export default SvgStrategySunburst; diff --git a/src/svg/strategies/SvgStrategySwimlane.ts b/src/svg/strategies/SvgStrategySwimlane.ts new file mode 100644 index 0000000..0e4a2d1 --- /dev/null +++ b/src/svg/strategies/SvgStrategySwimlane.ts @@ -0,0 +1,57 @@ +import XYAxes from '../components/XYAxes'; +import Legend from '../components/Legend'; +import TimeBoxset from '../components/Timeboxset'; + +import Config from '../../Config'; +import SvgChart from '../base/SvgChart'; +import { sortByField } from '../../utils/dataSorting'; +import { convertPropretiesToTimeFormat } from '../../utils/dataTransformation'; + +class SvgStrategySwimlane extends SvgChart { + /** + * + * XY Axes. Horizontal and vertical references + * + * @private + * @type {XYAxes} + * @memberOf SvgStrategySwimlane + */ + private axes: XYAxes; + + private legend: Legend; + + + private boxes: TimeBoxset; + + constructor() { + super(); + this.axes = new XYAxes(); + this.boxes = new TimeBoxset(this.axes); + } + + public draw(data: [{}]) { + let xAxisFormat = this.config.get('xAxisFormat'); + convertPropretiesToTimeFormat(data, ['start', 'end'], xAxisFormat); + + sortByField(data, 'start'); + + this.container.updateComponents(data); + } + + + public initialize(): void { + super.initialize(); + let markerSize = this.config.get('markerSize'), + areaOpacity = this.config.get('areaOpacity'), + legend = this.config.get('legend'); + + this.container.add(this.axes); + + if (legend) { + this.legend = new Legend(); + this.container.add(this.legend).add(this.boxes); + } + } +} + +export default SvgStrategySwimlane; \ No newline at end of file diff --git a/src/svg/strategy_barchart.js b/src/svg/strategy_barchart.js deleted file mode 100644 index 456e64f..0000000 --- a/src/svg/strategy_barchart.js +++ /dev/null @@ -1,89 +0,0 @@ -import {defaults} from '../utils/defaults/barchart'; -import {SvgAxis} from './base/svgAxis'; -import {XYAxes} from './components/xyAxes'; -import {Barset} from './components/barset'; -import {Legend} from './components/legend'; -import {simple2stacked} from '../utils/dataTransformation'; -import {map, stack as d3Stack, stackOrderNone, max} from 'd3'; - -export class SvgBarchartStrategy extends SvgAxis { - - constructor(context) { - super(context); - - this.axes = new XYAxes('categorical', 'linear', this.config); - this.bars = new Barset(this.axes.x.xAxis, this.axes.y.yAxis); - - this.legend = new Legend(); - - this.svgContainer - .add(this.axes) - .add(this.bars) - .add(this.legend); - - } - - - /** - * Renders a barchart based on data object - * @param {Object} data Data Object. Contains an array with x and y properties. - * - */ - draw(data = this.data) { - let svg = this.svgContainer.svg, - config = this.config, - keys = map(data, (d) => d.key).keys(), - data4stack = simple2stacked(data), - data4render = null, - isStacked = this.config.stacked, - stack = d3Stack().keys(keys) - .value((d, k) => d.value[k]) - .order(stackOrderNone), - yMin = 0, - yMax = 0, - method = isStacked ? 'stacked' : 'grouped', - dataSeries = stack(data4stack), - needRescaling = this.config.needRescaling; - - //rescale, if needed. - if (needRescaling) { - this.rescale(); - } - - - yMax = isStacked ? - max(dataSeries, (serie) => max(serie, (d) => d[1])) : - max(data, (d) => d.y); - - this.axes.updateDomainByKeysAndBBox(map(data, (d) => d.x).keys(), [yMin, yMax]); - this.axes.transition(svg, 200); - - data4render = isStacked ? dataSeries : data; - - this.bars.update(svg, config, data4render, method); - - this.legend.update(svg, config, data); - - this.data = data; // TODO: ? - - } - - - transition2Stacked() { - this.config.stacked = true; - } - - transition2Grouped() { - this.config.stacked = false; - } - - /** - * This method adds config options to the chart context. - * @param {Object} config Config object - */ - _loadConfig(config) { - super._loadConfig(config, defaults); - //Stacked - this.config.stacked = typeof (config.stacked) === 'undefined' ? defaults.stacked : config.stacked; return this; - } -} \ No newline at end of file diff --git a/src/svg/strategy_gauge.js b/src/svg/strategy_gauge.js deleted file mode 100644 index 3f3d1ba..0000000 --- a/src/svg/strategy_gauge.js +++ /dev/null @@ -1,87 +0,0 @@ -import { defaults } from '../utils/defaults/gauge'; -import { SvgContainer } from './components/svgContainer'; -import { Dial } from './components/dial'; -import { DialNeedle } from './components/dialNeedle'; -import { TextIndicator } from './components/textIndicator'; -import { calculateWidth } from '../utils/screen'; - -export class SvgGaugeStrategy { - constructor(context) { - this._loadConfig(context.config); - this.svgContainer = new SvgContainer(this.config); - let config = this.config; - - this.dial = new Dial('linear', config); - this.needle = new DialNeedle('linear', config); - - this.svgContainer - .add(this.dial) - .add(this.needle); - - if (config.numericIndicator) { - let r = ( - (config.width > config.height) ? - config.height : config.width - ) / 2; - let indicatorOffset = r + 75; - config.textIndicatorTranslation = 'translate(' + r + ',' + indicatorOffset + ')'; - this.textIndicator = new TextIndicator(config); - this.svgContainer.add(this.textIndicator); - } - } - - /** - * Renders a gauge chart based on data object - * @param {Object} data Data Object. Contains a numeric value. - * - */ - draw(data) { - let datum = data[data.length - 1], - svg = this.svgContainer.svg, - config = this.config; - - this.needle.update(svg, config, data); - if (config.numericIndicator) { - this.textIndicator.update(svg, datum.value, config.label); - } - } - - /** - * This method adds config options to the chart context. - * @param {Object} config Config object - */ - _loadConfig(config) { - this.config = {}; - //Selector - this.config.selector = config.selector || defaults.selector; - //Margins - this.config.marginTop = config.marginTop || defaults.marginTop; - this.config.marginLeft = config.marginLeft || defaults.marginLeft; - this.config.marginRight = config.marginRight || defaults.marginRight; - this.config.marginBottom = config.marginBottom || defaults.marginBottom; - //Width & height - this.config.width = config.width ? - calculateWidth(config.width, this.config.selector) - this.config.marginLeft - this.config.marginRight - : calculateWidth(defaults.width, this.config.selector) - this.config.marginLeft - this.config.marginRight; - this.config.height = config.height || defaults.height; - - this.config.colorScale = config.colorScale || defaults.colorScale; - this.config.minLevel = config.minLevel || defaults.minLevel; - this.config.maxLevel = config.maxLevel || defaults.maxLevel; - this.config.minAngle = config.minAngle || defaults.minAngle; - this.config.maxAngle = config.maxAngle || defaults.maxAngle; - this.config.ticks = config.ticks || defaults.ticks; - this.config.ringWidth = config.ringWidth || defaults.ringWidth; - this.config.ringMargin = config.ringMargin || defaults.ringMargin; - this.config.labelInset = config.labelInset || defaults.labelInset; - this.config.needleNutRadius = config.needleNutRadius || defaults.needleNutRadius; - this.config.needleLenghtRatio = config.needleLenghtRatio || defaults.needleLenghtRatio; - this.config.invertColorScale = typeof (config.invertColorScale) === 'undefined' ? defaults.invertColorScale : config.invertColorScale; - this.config.numericIndicator = typeof (config.numericIndicator) === 'undefined' ? defaults.numericIndicator : config.numericIndicator; - this.config.label = config.label || defaults.label; - - - return this; - } - -} \ No newline at end of file diff --git a/src/svg/strategy_linechart.js b/src/svg/strategy_linechart.js deleted file mode 100644 index 6fdaade..0000000 --- a/src/svg/strategy_linechart.js +++ /dev/null @@ -1,117 +0,0 @@ -import { defaults } from '../utils/defaults/linechart'; -import { SvgAxis } from './base/svgAxis'; -import { XYAxes } from './components/xyAxes'; -import { Lineset } from './components/lineset'; -import { Legend } from './components/legend'; -import { Areaset } from './components/areaset'; -import { Pointset } from './components/pointset'; -import { convertByXYFormat } from '../utils/dataTransformation'; -import { sortByField } from '../utils/dataSorting'; -import {min, max} from 'd3'; - -export class SvgLinechartStrategy extends SvgAxis { - - constructor(context) { - super(context); - - this.axes = new XYAxes(this.config.xAxisType, 'linear', this.config); - - this.lines = new Lineset(this.axes.x, this.axes.y); - this.legend = new Legend(); - - //Include components in the chart container - this.svgContainer - .add(this.axes) - .add(this.legend) - .add(this.lines); - - if (this._checkArea(this.config)) { - this.areas = new Areaset(this.axes.x, this.axes.y); - this.svgContainer.add(this.areas); - } - - if (this._checkMarkers(this.config)) { - this.points = new Pointset(this.axes.x, this.axes.y); - this.svgContainer.add(this.points); - } - } - - /** - * Renders a linechart based on data object - * @param {Object} data Data Object. Contains an array with x and y properties. - * - */ - draw(data) { - let svg = this.svgContainer.svg, - config = this.config, - needRescaling = this.config.needRescaling, - bbox = null; - - //Transform data, if needed - convertByXYFormat(data, config); - - //Sort data - sortByField(data, 'x'); - - //rescale, if needed. - if (needRescaling) { - this.rescale(); - } - - - bbox = this._getDomainBBox(data); - - this.axes.updateDomainByBBox(bbox); - - //Create a transition effect for dial rescaling - this.axes.transition(svg, 200); - - // Update legend - this.legend.update(svg, config, data); - - //Now update lines - this.lines.update(svg, config, data); - - if (config.areaOpacity > 0) { - // Update areas - this.areas.update(svg, config, data); - } - - if (this._checkMarkers(config)) { - // Update points - this.points.update(svg, config, data); - } - - } - - _getDomainBBox(data) { - var minX = min(data, (d) => d.x), - maxX = max(data, (d) => d.x), - minY = min(data, (d) => d.y), - maxY = max(data, (d) => d.y); - return [minX, maxX, minY, maxY]; - } - - - _checkMarkers(config) { - return config.markerSize > 0; - } - _checkArea(config) { - return config.areaOpacity > 0; - } - - /** - * This method adds config options to the chart context. - * @param {Object} config Config object - */ - _loadConfig(config) { - super._loadConfig(config, defaults); - //Markers - this.config.markerOutlineWidth = config.markerOutlineWidth || defaults.markerOutlineWidth; - this.config.markerShape = config.markerShape || defaults.markerShape; - this.config.markerSize = (typeof config.markerSize === 'undefined' || config.markerSize < 0) ? defaults.markerSize : config.markerSize; - //Area - this.config.areaOpacity = (typeof config.areaOpacity === 'undefined' || config.markerSize < 0) ? defaults.areaOpacity : config.areaOpacity; - return this; - } -} \ No newline at end of file diff --git a/src/svg/strategy_networkgraph.js b/src/svg/strategy_networkgraph.js deleted file mode 100644 index fcf77ae..0000000 --- a/src/svg/strategy_networkgraph.js +++ /dev/null @@ -1,50 +0,0 @@ -import {SvgContainer} from './components/svgContainer'; -import {defaults} from '../utils/defaults/networkgraph'; -import {calculateWidth} from '../utils/screen'; -import {Nodeset} from './components/nodeset'; - -export class SvgNetworkgraphStrategy { - - constructor(context) { - this._loadConfig(context.config); - - this.svgContainer = new SvgContainer(this.config); - - this.nodeset = new Nodeset(this.config); - - //Include components in the chart container - this.svgContainer - .add(this.nodeset); - } - - /** - * Renders a linechart based on data object - * @param {Object} data Data Object. Contains an array with x and y properties. - * - */ - draw(data) { - let svg = this.svgContainer.svg, - config = this.config; - - this.nodeset.update(svg, config, data); - } - - /** - * This method adds config options to the chart context. - * @param {Object} config Config object - */ - _loadConfig(config) { - this.config = {}; - this.config.selector = config.selector || defaults.selector; - //Margins - this.config.marginTop = config.marginTop || defaults.marginTop; - this.config.marginLeft = config.marginLeft || defaults.marginLeft; - this.config.marginRight = config.marginRight || defaults.marginRight; - this.config.marginBottom = config.marginBottom || defaults.marginBottom; - this.config.width = config.width ? calculateWidth(config.width, this.config.selector) - this.config.marginLeft - this.config.marginRight - : calculateWidth(defaults.width, this.config.selector) - this.config.marginLeft - this.config.marginRight; - this.config.height = config.height || defaults.height; - - return this; - } -} \ No newline at end of file diff --git a/src/svg/strategy_scatterplot.js b/src/svg/strategy_scatterplot.js deleted file mode 100644 index b461d6f..0000000 --- a/src/svg/strategy_scatterplot.js +++ /dev/null @@ -1,91 +0,0 @@ -import { defaults } from '../utils/defaults/scatterplot'; -import { SvgAxis } from './base/svgAxis'; -import { XYAxes } from './components/xyAxes'; -import { Lineset } from './components/lineset'; -import { Legend } from './components/legend'; -import { Areaset } from './components/areaset'; -import { Pointset } from './components/pointset'; -import { convertByXYFormat } from '../utils/dataTransformation'; -import { sortByField } from '../utils/dataSorting'; -import {min, max} from 'd3'; - -export class SvgScatterplotStrategy extends SvgAxis { - - constructor(context) { - super(context); - this.axes = new XYAxes(this.config.xAxisType, 'linear', this.config); - this.points = new Pointset(this.axes.x, this.axes.y); - this.legend = new Legend(); - //Include components in the chart container - this.svgContainer - .add(this.axes) - .add(this.legend) - .add(this.points); - } - - /** - * Renders a scatterplot based on data object - * @param {Object} data Data Object. Contains an array with x and y properties. - * - */ - draw(data) { - let svg = this.svgContainer.svg, - config = this.config, - needRescaling = this.config.needRescaling, - bbox = null; - - // //Transform data, if needed - convertByXYFormat(data, config); - - //Sort data - sortByField(data, 'x'); - - //rescale, if needed. - if (needRescaling) { - this.rescale(); - } - - bbox = this._getDomainBBox(data); - - this.axes.updateDomainByBBox(bbox); - - //Create a transition effect for dial rescaling - this.axes.transition(svg, 200); - - // Update legend - this.legend.update(svg, config, data); - - // Update points - this.points.update(svg, config, data); - } - - _getDomainBBox(data) { - var minX = min(data, (d) => d.x), - maxX = max(data, (d) => d.x), - minY = min(data, (d) => d.y), - maxY = max(data, (d) => d.y); - return [minX, maxX, minY, maxY]; - } - - _checkMarkers(config) { - return config.markerSize > 0; - } - _checkArea(config) { - return config.areaOpacity > 0; - } - - /** - * This method adds config options to the chart context. - * @param {Object} config Config object - */ - _loadConfig(config) { - super._loadConfig(config, defaults); - //Markers - this.config.markerOutlineWidth = config.markerOutlineWidth || defaults.markerOutlineWidth; - this.config.markerShape = config.markerShape || defaults.markerShape; - this.config.markerSize = (typeof config.markerSize === 'undefined' || config.markerSize < 0) ? defaults.markerSize : config.markerSize; - //Area - this.config.areaOpacity = (typeof config.areaOpacity === 'undefined' || config.markerSize < 0) ? defaults.areaOpacity : config.areaOpacity; - return this; - } -} \ No newline at end of file diff --git a/src/svg/strategy_stackedArea.js b/src/svg/strategy_stackedArea.js deleted file mode 100644 index 2996941..0000000 --- a/src/svg/strategy_stackedArea.js +++ /dev/null @@ -1,84 +0,0 @@ -import { defaults } from '../utils/defaults/stackedArea'; -import { SvgAxis } from './base/svgAxis'; -import { XYAxes } from './components/xyAxes'; -import { Streamset } from './components/streamset'; -import { Legend } from './components/legend'; -import { simple2stacked } from '../utils/dataTransformation'; -import { convertPropretiesToTimeFormat } from '../utils/dataTransformation'; -import { sortByField } from '../utils/dataSorting'; -import { min, max, map, stack as d3Stack, stackOrderInsideOut, stackOffNone} from 'd3'; - -export class SvgStackedAreaStrategy extends SvgAxis { - - constructor(context) { - super(context); - - this.axes = new XYAxes('time', 'linear', this.config); - - this.streams = new Streamset(this.axes.x.xAxis, this.axes.y.yAxis); - - this.legend = new Legend(); - - //Include components in the chart container - this.svgContainer - .add(this.axes) - .add(this.legend) - .add(this.streams); - } - - - draw(data) { - let svg = this.svgContainer.svg, - config = this.config, - bbox = null, - keys = map(data, (d) => d.key).keys(), - data4stack = simple2stacked(data), - xDataFormat = this.config.xAxisFormat, - stack = d3Stack() - .keys(keys) - .value((d, k) => d.value[k]) - .order(stackOrderInsideOut) - .offset(stackOffNone), - dataSeries = stack(data4stack), - needRescaling = this.config.needRescaling; - - //rescale, if needed. - if (needRescaling) { - this.rescale(); - } - - convertPropretiesToTimeFormat(data, ['x'], xDataFormat); - - //Sort data - sortByField(data, 'x'); - - bbox = this._getDomainBBox(data, dataSeries); - - this.axes.updateDomainByBBox(bbox); - this.axes.transition(svg, 200); - - // Update legend - this.legend.update(svg, config, data); - - // Update streams - this.streams.update(svg, config, dataSeries); - } - - - _getDomainBBox(data, dataSeries) { - let minX = min(data, (d) => (d.x)), - maxX = max(data, (d) => (d.x)), - minY = min(dataSeries, (serie) => min(serie, (d) => d[0])), - maxY = max(dataSeries, (serie) => max(serie, (d) => d[1])); - - return [minX, maxX, minY, maxY]; - } - - /** - * This method adds config options to the chart context. - * @param {Object} config Config object - */ - _loadConfig(config) { - super._loadConfig(config,defaults); - } -} \ No newline at end of file diff --git a/src/svg/strategy_streamgraph.js b/src/svg/strategy_streamgraph.js deleted file mode 100644 index 663ec94..0000000 --- a/src/svg/strategy_streamgraph.js +++ /dev/null @@ -1,87 +0,0 @@ -import {defaults} from '../utils/defaults/streamgraph'; -import {SvgAxis} from './base/svgAxis'; -import {XAxis} from './components/xAxis'; -import {YAxis} from './components/yAxis'; -import {Streamset} from './components/streamset'; -import {Legend} from './components/legend'; -import {simple2stacked} from '../utils/dataTransformation'; -import {convertPropretiesToTimeFormat} from '../utils/dataTransformation'; -import {sortByField} from '../utils/dataSorting'; -import {min, max, map, stack as d3Stack, stackOrderInsideOut, stackOffsetWiggle} from 'd3'; - -export class SvgStreamgraphStrategy extends SvgAxis { - - constructor(context) { - super(context); - - this.x = new XAxis('time', this.config); - this.y = new YAxis('linear', this.config); - - this.streams = new Streamset(this.x.xAxis, this.y.yAxis); - - this.legend = new Legend(); - - //Include components in the chart container - this.svgContainer - .add(this.x) - .add(this.y, false) //No render y Axis - .add(this.legend) - .add(this.streams); - } - draw(data) { - let svg = this.svgContainer.svg, - config = this.config, - bbox = null, - keys = map(data, (d) => d.key).keys(), - xDataFormat = this.config.xAxisFormat, - data4stack = simple2stacked(data), - stack = d3Stack() - .keys(keys) - .value((d, k) => d.value[k]) - .order(stackOrderInsideOut) - .offset(stackOffsetWiggle), - dataSeries = stack(data4stack), - needRescaling = this.config.needRescaling; - - convertPropretiesToTimeFormat(data, ['x'], xDataFormat); - - //Sort data - sortByField(data, 'x'); - - //rescale, if needed. - if (needRescaling) { - this.rescale(); - } - - bbox = this._getDomainBBox(data, dataSeries); - - this.x.updateDomainByBBox([bbox[0], bbox[1]]); - this.y.updateDomainByBBox([bbox[2], bbox[3]]); - this.x.transition(svg, 200); - this.y.transition(svg, 200); - - // Update legend - this.legend.update(svg, config, data); - - // Update streams - this.streams.update(svg, config, dataSeries); - } - - _getDomainBBox(data, dataSeries) { - let minX = min(data, (d) => new Date(d.x)), - maxX = max(data, (d) => new Date(d.x)), - minY = min(dataSeries, (serie) => min(serie, (d) => d[0])), - maxY = max(dataSeries, (serie) => max(serie, (d) => d[1])); - - return [minX, maxX, minY, maxY]; - } - - /** - * This method adds config options to the chart context. - * @param {Object} config Config object - */ - _loadConfig(config) { - super._loadConfig(config,defaults); - return this; - } -} \ No newline at end of file diff --git a/src/svg/strategy_sunburst.js b/src/svg/strategy_sunburst.js deleted file mode 100644 index f542006..0000000 --- a/src/svg/strategy_sunburst.js +++ /dev/null @@ -1,72 +0,0 @@ -import { defaults } from '../utils/defaults/sunburst'; -import { SvgContainer } from './components/svgContainer'; -import { RadialAxes } from './components/radialAxes'; -import { SunburstDisk } from './components/sunburstDisk'; -import { TextIndicator } from './components/textIndicator'; -import { calculateWidth } from '../utils/screen'; - -export class SvgSunburstStrategy { - - constructor(context) { - this._loadConfig(context.config); - - this.svgContainer = new SvgContainer(this.config); - let config = - this.config, - translation = 'translate(' + config.width / 2 + ',' + (config.height / 2) + ')'; - - this.svgContainer.transform(translation); - - this.axes = new RadialAxes(config); - - this.disk = new SunburstDisk( - this.axes.x.xRadialAxis, - this.axes.y.yRadialAxis, - config - ); - - this.textIndicator = new TextIndicator(config); - - this.svgContainer - .add(this.disk) - .add(this.textIndicator); - } - - draw(data) { - let svg = this.svgContainer.svg, - config = this.config; - - this.disk.update(svg, config, data); - } - - /** - * This method adds config options to the chart context. - * @param {Object} config Config object - */ - _loadConfig(config) { - this.config = {}; - //Selector - this.config.selector = config.selector || defaults.selector; - //Margins - this.config.marginTop = config.marginTop || defaults.marginTop; - this.config.marginLeft = config.marginLeft || defaults.marginLeft; - this.config.marginRight = config.marginRight || defaults.marginRight; - this.config.marginBottom = config.marginBottom || defaults.marginBottom; - //Width & height - this.config.width = config.width ? - calculateWidth(config.width, this.config.selector) - this.config.marginLeft - this.config.marginRight - : calculateWidth(defaults.width, this.config.selector) - this.config.marginLeft - this.config.marginRight; - this.config.height = config.height || defaults.height; - - this.config.colorScale = config.colorScale || defaults.colorScale; - - //Events - this.config.onDown = config.onDown || defaults.onDown; - this.config.onUp = config.onUp || defaults.onUp; - this.config.onHover = config.onHover || defaults.onHover; - this.config.onClick = config.onClick || defaults.onClick; - this.config.onLeave = config.onLeave || defaults.onLeave; - - return this; - } -} diff --git a/src/svg/strategy_swimlane.js b/src/svg/strategy_swimlane.js deleted file mode 100644 index 00ba1b3..0000000 --- a/src/svg/strategy_swimlane.js +++ /dev/null @@ -1,60 +0,0 @@ -import {defaults} from '../utils/defaults/swimlane'; -import {SvgAxis} from './base/svgAxis'; -import {XYAxes} from './components/xyAxes'; -import {TimeBoxset} from './components/timeBoxset'; -import {Legend} from './components/legend'; -import {convertPropretiesToTimeFormat} from '../utils/dataTransformation'; -import {min, max, map} from 'd3'; - -export class SvgSwimlaneStrategy extends SvgAxis { - - constructor(context) { - super(context); - this.axes = new XYAxes('time', 'categorical', this.config); - this.boxs = new TimeBoxset(this.axes.x.xAxis, this.axes.y.yAxis); - this.legend = new Legend(); - - this.svgContainer - .add(this.axes) - .add(this.boxs) - .add(this.legend); - } - - draw(data) { - let svg = this.svgContainer.svg, - config = this.config, - dataFormat = this.config.xAxisFormat, - keys = map(data, (d) => d.key).keys(), - bbox = null, - needRescaling = this.config.needRescaling; - - convertPropretiesToTimeFormat(data, ['start', 'end'], dataFormat); - - //rescale, if needed. - if (needRescaling) { - this.rescale(); - } - - bbox = this._getBBox(data); - - this.axes.updateDomainByBBoxAndKeys(bbox, keys); - this.axes.transition(svg, 200); - - this.boxs.update(svg, config, data); - this.legend.update(svg, config, data); - - } - - _getBBox(data) { - return [ - min(data, (d) => (d.start)), - max(data, (d) => (d.end)) - ]; - } - - - _loadConfig(config) { - super._loadConfig(config, defaults); - return this; - } -} \ No newline at end of file diff --git a/src/utils/colors.js b/src/utils/colors.ts similarity index 100% rename from src/utils/colors.js rename to src/utils/colors.ts diff --git a/src/utils/dataSorting.js b/src/utils/dataSorting.ts similarity index 100% rename from src/utils/dataSorting.js rename to src/utils/dataSorting.ts diff --git a/src/utils/dataTransformation.js b/src/utils/dataTransformation.ts similarity index 70% rename from src/utils/dataTransformation.js rename to src/utils/dataTransformation.ts index a29fb67..7c09861 100644 --- a/src/utils/dataTransformation.js +++ b/src/utils/dataTransformation.ts @@ -1,6 +1,6 @@ -import {nest, timeParse} from 'd3'; +import { nest, timeParse } from 'd3'; -export function simple2stacked(data) { +export function simple2stacked (data) : [any] { return nest().key((d) => d.x).rollup((array) => { let r = {}; for (let i = 0; i < array.length; i++) { @@ -13,7 +13,7 @@ export function simple2stacked(data) { }).entries(data); } -export function simple2nested(data, key = 'key') { +export function simple2nested (data, key = 'key') : [any]{ return nest().key((d) => d[key]).entries(data); } @@ -32,7 +32,7 @@ export function nested2simple(data) { export function simple2Linked(data) { var linkedData = { links: [], nodes: [] }; - data.map((d) => d.key === 'link' ? linkedData.links.push(d) : linkedData.nodes.push(d)); + data.map((d) => d.class === 'link' ? linkedData.links.push(d) : linkedData.nodes.push(d)); return linkedData; } @@ -45,21 +45,21 @@ export function convertPropretiesToTimeFormat(data, properties, format) { }); } -export function convertByXYFormat(data, config) { +export function convertByXYFormat(data, xAxisFormat: string, xAxisType: string, yAxisFormat: string, yAxisType: string) { data.forEach((d) => { //parse x coordinate - switch (config.xAxisType) { + switch (xAxisType) { case 'time': - d.x = timeParse(config.xAxisFormat)(d.x); + d.x = timeParse(xAxisFormat)(d.x); break; case 'linear': d.x = +d.x; break; } //parse Y coordinate - switch (config.yAxisType) { + switch (yAxisType) { case 'time': - d.y = timeParse(config.yAxisFormat)(d.y); + d.y = timeParse(yAxisFormat)(d.y); break; case 'linear': d.y = +d.y; diff --git a/src/utils/defaults/barchart.js b/src/utils/defaults/barchart.js deleted file mode 100644 index 9a85015..0000000 --- a/src/utils/defaults/barchart.js +++ /dev/null @@ -1,32 +0,0 @@ -import * as Colors from '../colors'; - -export const defaults = { - selector: '#chart', - colorScale: Colors.category5(), - //Stacked - stacked: true, - //Axes - xAxisType: 'linear', - xAxisFormat: '', - xAxisLabel: null, - yAxisType: 'linear', - yAxisFormat: '', - yAxisLabel: null, - //margins - marginTop: 20, - marginRight: 250, - marginBottom: 130, - marginLeft: 150, - //width & height - width: '100%', - height: 350, - //Events - onDown(d) { - }, - onHover(d) { - }, - onLeave(d) { - }, - onClick(d) { - } -}; \ No newline at end of file diff --git a/src/utils/defaults/barchart.ts b/src/utils/defaults/barchart.ts new file mode 100644 index 0000000..5c054ff --- /dev/null +++ b/src/utils/defaults/barchart.ts @@ -0,0 +1,44 @@ +import * as Colors from '../colors'; +import { stack as d3stack } from 'd3'; + +export const defaults: any = { + selector: '#chart', + colorScale: Colors.category5(), + //Stacked + stacked: false, + //Axes + xAxisType: 'categorical', + xAxisFormat: '', + xAxisLabel: '', + xAxisGrid: false, + yAxisType: 'linear', + yAxisFormat: '', + yAxisLabel: '', + yAxisShow: true, + yAxisGrid: true, + //margins + marginTop: 20, + marginRight: 250, + marginBottom: 130, + marginLeft: 150, + //width & height + width: '100%', + height: 350, + legend: true, + propertyX: 'x', + propertyY: 'y', + propertyKey: 'key', + stack: d3stack().value((d, k) => d.value[k]), + + //Events + onDown(d: any) { + }, + onHover(d: any) { + }, + onLeave(d: any) { + }, + onClick(d: any) { + }, + onUp(d: any) { + } +}; \ No newline at end of file diff --git a/src/utils/defaults/gauge.js b/src/utils/defaults/gauge.ts similarity index 90% rename from src/utils/defaults/gauge.js rename to src/utils/defaults/gauge.ts index 029d27e..3d8b983 100644 --- a/src/utils/defaults/gauge.js +++ b/src/utils/defaults/gauge.ts @@ -1,6 +1,6 @@ import * as Colors from '../colors'; -export const defaults = { +export const defaults : any = { selector: '#chart', colorScale: Colors.diverging_spectral2(), invertColorScale: true, @@ -24,4 +24,5 @@ export const defaults = { width: '50%', // %, auto, or numeric height: 250, ticks: 10, // ticks for y dial. + propertyValue: 'value' }; \ No newline at end of file diff --git a/src/utils/defaults/linechart.js b/src/utils/defaults/linechart.ts similarity index 55% rename from src/utils/defaults/linechart.js rename to src/utils/defaults/linechart.ts index 5527c64..dd8dede 100644 --- a/src/utils/defaults/linechart.js +++ b/src/utils/defaults/linechart.ts @@ -1,30 +1,38 @@ import * as Colors from '../colors'; +import Interpolation from '../../svg/Interpolation'; -export const defaults = { +export const defaults : any = { selector: '#chart', colorScale: Colors.category7(), + curve: Interpolation.CURVE_MONOTONE_X, //Area - areaOpacity: 0.4, - + areaOpacity: 0, //Axes xAxisType: 'linear', xAxisFormat: '', xAxisLabel: null, + xAxisGrid: true, yAxisType: 'linear', yAxisFormat: '', yAxisLabel: null, + yAxisShow: true, + yAxisGrid: true, //margins marginTop: 20, marginRight: 250, marginBottom: 130, marginLeft: 150, //markers - markerShape: 'circle', - markerSize: 5, + markerShape: 'dot', + markerSize: 0, markerOutlineWidth: 2, //Width & height width: '100%', // %, auto, or numeric height: 250, + legend: true, + propertyX: 'x', + propertyY: 'y', + propertyKey: 'key', //Events onDown(d) { }, @@ -34,6 +42,7 @@ export const defaults = { }, onClick(d) { }, - - maxNumberOfElements: 100, // used by keepDrawing method to reduce the number of elements in the current chart + onUp(d) { + }, + maxNumberOfElements: 10, // used by keepDrawing method to reduce the number of elements in the current chart }; \ No newline at end of file diff --git a/src/utils/defaults/network.ts b/src/utils/defaults/network.ts new file mode 100644 index 0000000..68e68bb --- /dev/null +++ b/src/utils/defaults/network.ts @@ -0,0 +1,40 @@ +import * as Colors from '../colors'; + +export const defaults : any = { + selector: '#chart', + colorScale: Colors.category7(), + //margins + marginTop: 20, + marginRight: 250, + marginBottom: 130, + marginLeft: 150, + //Width & height + width: '100%', // %, auto, or numeric + height: 250, + //Node + nodeRadius: 8.5, + legend: true, + //Network + linkWeight: 1, + nodeWeight: 8, + minLinkValue: 0, + maxLinkValue: 10, + minNodeWeight: 0, + maxNodeWeight: 100, + weighted: false, + //Labels + labelShow: true, + labelField: 'id', + //Events + zoom: true, + onDown(d: any) { + }, + onHover(d: any) { + }, + onLeave(d: any) { + }, + onClick(d: any) { + }, + onUp(d: any) { + } +}; \ No newline at end of file diff --git a/src/utils/defaults/networkgraph.js b/src/utils/defaults/networkgraph.js deleted file mode 100644 index efad1dd..0000000 --- a/src/utils/defaults/networkgraph.js +++ /dev/null @@ -1,11 +0,0 @@ -export const defaults = { - selector: '#chart', - width: '100%', // %, auto, or numeric - height: 250, - yAxisLabel: null, - //margins - marginTop: 20, - marginRight: 250, - marginBottom: 30, - marginLeft: 50, -}; \ No newline at end of file diff --git a/src/utils/defaults/piechart.ts b/src/utils/defaults/piechart.ts new file mode 100644 index 0000000..b48b46a --- /dev/null +++ b/src/utils/defaults/piechart.ts @@ -0,0 +1,32 @@ +import * as Colors from '../colors'; + +export const defaults : any = { + selector: '#chart', + colorScale: Colors.category8(), + marginTop: 0, + marginRight: '100', + marginBottom: 0, + marginLeft: 0, + width: '500', // %, auto, or numeric + height: '500', + transitionDuration: 300, + maxNumberOfElements: 5, // used by keepDrawing to reduce the number of elements in the current chart + legend: true, + propertyX: 'x', + propertyKey: 'key', + sortData: { + descending: false, + prop: 'x' + }, + //Events + onDown(d: any) { + }, + onHover(d: any) { + }, + onLeave(d: any) { + }, + onClick(d: any) { + }, + onUp(d: any) { + } +}; \ No newline at end of file diff --git a/src/utils/defaults/scatterplot.js b/src/utils/defaults/scatterplot.ts similarity index 58% rename from src/utils/defaults/scatterplot.js rename to src/utils/defaults/scatterplot.ts index 83b2ad0..8d27390 100644 --- a/src/utils/defaults/scatterplot.js +++ b/src/utils/defaults/scatterplot.ts @@ -1,36 +1,45 @@ import * as Colors from '../colors'; -export const defaults = { +export const defaults : any = { selector: '#chart', colorScale: Colors.category7(), //Axes xAxisType: 'linear', xAxisFormat: '.1f', - xAxisLabel: 'Sepal length (cm)', + xAxisLabel: '', + xAxisGrid: true, yAxisType: 'linear', yAxisFormat: '.1f', - yAxisLabel: 'Sepal width (cm)', + yAxisLabel: '', + yAxisShow: true, + yAxisGrid: true, //margins marginTop: 20, marginRight: 250, marginBottom: 130, marginLeft: 150, //markers - markerShape: 'dot', - markerSize: 3, + markerShape: 'circle', + markerSize: 15, //Width & height width: '100%', // %, auto, or numeric height: 250, + legend: true, + propertyX: 'x', + propertyY: 'y', + propertyKey: 'key', //Events - onDown(d) { + onDown(d: any) { }, - onHover(d) { + onHover(d: any) { }, - onLeave(d) { + onLeave(d: any) { }, - onClick(d) { + onClick(d: any) { + }, + onUp(d: any) { }, - maxNumberOfElements: 100, // used by keepDrawing method to reduce the number of elements in the current chart + canvas: false }; \ No newline at end of file diff --git a/src/utils/defaults/stackedArea.js b/src/utils/defaults/stackedArea.js deleted file mode 100644 index ba9c1bb..0000000 --- a/src/utils/defaults/stackedArea.js +++ /dev/null @@ -1,31 +0,0 @@ -import * as Colors from '../colors'; - -export const defaults = { - selector: '#chart', - colorScale: Colors.category2(), - //Axes - xAxisType: 'time', - xAxisFormat: '%y/%m/%d', - xAxisLabel: null, - yAxisType: 'categorical', - yAxisFormat: '', - yAxisLabel: null, - //margins - marginTop: 20, - marginRight: 250, - marginBottom: 130, - marginLeft: 150, - //Width & height - width: '100%', // %, auto, or numeric - height: 250, - //Events - onDown(d) { - }, - onHover(d) { - }, - onLeave(d) { - }, - onClick(d) { - }, - maxNumberOfElements: 100, // used by keepDrawing method to reduce the number of elements in the current chart -}; \ No newline at end of file diff --git a/src/utils/defaults/stackedArea.ts b/src/utils/defaults/stackedArea.ts new file mode 100644 index 0000000..1818d7d --- /dev/null +++ b/src/utils/defaults/stackedArea.ts @@ -0,0 +1,48 @@ +import * as Colors from '../colors'; +import { + stackOrderInsideOut, + stackOffsetNone, + stack as d3Stack +} from 'd3'; + +export const defaults: any = { + selector: '#chart', + colorScale: Colors.category2(), + //Axes + xAxisType: 'time', + xAxisFormat: '%y/%m/%d', + xAxisLabel: '', + xAxisGrid: true, + yAxisType: 'linear', + yAxisFormat: '', + yAxisLabel: '', + yAxisShow: true, + yAxisGrid: true, + //margins + marginTop: 20, + marginRight: 250, + marginBottom: 130, + marginLeft: 150, + //Width & height + width: '100%', // %, auto, or numeric + height: 250, + legend: true, + propertyX: 'x', + propertyY: 'y', + propertyKey: 'key', + stacked: true, + stack: d3Stack().value((d, k) => d.value[k]).order(stackOrderInsideOut).offset(stackOffsetNone), + //Events + onDown(d: any) { + }, + onHover(d: any) { + }, + onLeave(d: any) { + }, + onClick(d: any) { + }, + onUp(d: any) { + + }, + maxNumberOfElements: 100, // used by keepDrawing method to reduce the number of elements in the current chart +}; \ No newline at end of file diff --git a/src/utils/defaults/streamgraph.js b/src/utils/defaults/streamgraph.js deleted file mode 100644 index d452dd5..0000000 --- a/src/utils/defaults/streamgraph.js +++ /dev/null @@ -1,32 +0,0 @@ -import * as Colors from '../colors'; - -export const defaults = { - selector: '#chart', - colorScale: Colors.category4(), - //Axes - xAxisType: 'time', - xAxisFormat: '%y/%m/%d', - xAxisLabel: null, - yAxisType: 'categorical', - yAxisFormat: '', - yAxisLabel: null, - //margins - marginTop: 20, - marginRight: 250, - marginBottom: 130, - marginLeft: 150, - //Width & height - width: '100%', // %, auto, or numeric - height: 250, - //Events - onDown(d) { - }, - onHover(d) { - }, - onLeave(d) { - }, - onClick(d) { - }, - - maxNumberOfElements: 100, // used by keepDrawing method to reduce the number of elements in the current chart -}; \ No newline at end of file diff --git a/src/utils/defaults/streamgraph.ts b/src/utils/defaults/streamgraph.ts new file mode 100644 index 0000000..5b8ef8e --- /dev/null +++ b/src/utils/defaults/streamgraph.ts @@ -0,0 +1,48 @@ +import * as Colors from '../colors'; +import { + stackOrderInsideOut, + stackOffsetWiggle, + stack as d3Stack +} from 'd3'; + +export const defaults : any = { + selector: '#chart', + colorScale: Colors.category4(), + //Axes + xAxisType: 'time', + xAxisFormat: '%y/%m/%d', + xAxisLabel: '', + xAxisGrid: true, + yAxisType: 'linear', + yAxisFormat: '', + yAxisLabel: '', + yAxisShow: false, + yAxisGrid: false, + //margins + marginTop: 20, + marginRight: 250, + marginBottom: 130, + marginLeft: 150, + //Width & height + width: '100%', // %, auto, or numeric + height: 250, + legend: true, + propertyX: 'x', + propertyY: 'y', + propertyKey: 'key', + stack: d3Stack().value((d, k) => d.value[k]).order(stackOrderInsideOut).offset(stackOffsetWiggle), + stacked: true, + //Events + onDown(d: any) { + }, + onHover(d: any) { + }, + onLeave(d: any) { + }, + onClick(d: any) { + }, + onUp(d: any) { + + }, + maxNumberOfElements: 100, // used by keepDrawing method to reduce the number of elements in the current chart +}; \ No newline at end of file diff --git a/src/utils/defaults/sunburst.js b/src/utils/defaults/sunburst.ts similarity index 77% rename from src/utils/defaults/sunburst.js rename to src/utils/defaults/sunburst.ts index 20cf59f..09e0753 100644 --- a/src/utils/defaults/sunburst.js +++ b/src/utils/defaults/sunburst.ts @@ -1,6 +1,6 @@ import * as Colors from '../colors'; -export const defaults = { +export const defaults : any = { selector: '#chart', colorScale: Colors.category8(), marginTop: 20, @@ -17,12 +17,14 @@ export const defaults = { prop: 'x' }, //Events - onDown(d) { + onDown(d: any) { }, - onHover(d) { + onHover(d: any) { }, - onLeave(d) { + onLeave(d: any) { }, - onClick(d) { + onClick(d: any) { + }, + onUp(d: any) { } }; \ No newline at end of file diff --git a/src/utils/defaults/swimlane.js b/src/utils/defaults/swimlane.ts similarity index 52% rename from src/utils/defaults/swimlane.js rename to src/utils/defaults/swimlane.ts index b89f867..fa14acf 100644 --- a/src/utils/defaults/swimlane.js +++ b/src/utils/defaults/swimlane.ts @@ -1,15 +1,18 @@ import * as Colors from '../colors'; -export const defaults = { +export const defaults : any = { selector: '#chart', colorScale: Colors.category3(), //Axes xAxisType: 'time', xAxisFormat: '%y/%m/%d', - xAxisLabel: null, + xAxisLabel: '', + xAxisGrid: true, yAxisType: 'categorical', - yAxisFormat: '%s', - yAxisLabel: null, + yAxisFormat: 's', + yAxisLabel: '', + yAxisShow: true, + yAxisGrid: true, //margins marginTop: 20, marginRight: 250, @@ -18,13 +21,20 @@ export const defaults = { //Width & height width: '100%', // %, auto, or numeric height: 250, + legend: true, + propertyStart: 'start', + propertyEnd: 'end', + propertyKey: 'key', //Events - onDown(d) { + onDown(d: any) { }, - onHover(d) { + onHover(d: any) { }, - onLeave(d) { + onLeave(d: any) { }, - onClick(d) { + onClick(d: any) { + }, + onUp(d: any) { + } }; \ No newline at end of file diff --git a/src/utils/functions.js b/src/utils/functions.ts similarity index 94% rename from src/utils/functions.js rename to src/utils/functions.ts index dda81f6..37234fb 100644 --- a/src/utils/functions.js +++ b/src/utils/functions.ts @@ -81,7 +81,10 @@ export function findElement(arr, propName, propValue) { } } return null; - // will return null if not found; you could return a default instead +} + +export function copy(object){ + return object != null ? JSON.parse(JSON.stringify(object)) : null; } export function deg2rad(deg) { diff --git a/src/utils/screen.js b/src/utils/screen.ts similarity index 100% rename from src/utils/screen.js rename to src/utils/screen.ts diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..78f15a6 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,33 @@ +{ + "compilerOptions": { + "target": "es5", + "module": "commonjs", + "declaration": false, + "removeComments": true, + "noLib": false, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "lib": ["es6", "es2015", "dom"], + "sourceMap": true, + "pretty": false, + "allowUnreachableCode": false, + "allowUnusedLabels": false, + "noImplicitAny": true, + "noImplicitReturns": true, + "noImplicitUseStrict": false, + "noFallthroughCasesInSwitch": true, + "typeRoots": [ + "./node_modules/@types", + "./node_modules" + ], + "types": [ + "d3" + ] + }, + "exclude": [ + "node_modules", + "dist", + "src" + ], + "compileOnSave": false +} \ No newline at end of file