/** * @abstract * @class Ext.chart.series.Cartesian * @extends Ext.chart.series.Series * * Common base class for series implementations that plot values using cartesian coordinates. * * @constructor */Ext.define('Ext.chart.series.Cartesian', { extend: 'Ext.chart.series.Series', config: { /** * @cfg {String} xField * The field used to access the x axis value from the items from the data source. */ xField: null, /** * @cfg {String|String[]} yField * The field(s) used to access the y-axis value(s) of the items from the data source. */ yField: null, /** * @cfg {Ext.chart.axis.Axis|Number|String} * xAxis The chart axis the series is bound to in the 'X' direction. * Normally, this would be set automatically by the series. * For charts with multiple x-axes, this defines which x-axis is used by the series. * It refers to either axis' ID or the (zero-based) index of the axis * in the chart's {@link Ext.chart.AbstractChart#axes axes} config. */ xAxis: null, /** * @cfg {Ext.chart.axis.Axis|Number|String} * yAxis The chart axis the series is bound to in the 'Y' direction. * Normally, this would be set automatically by the series. * For charts with multiple y-axes, this defines which y-axis is used by the series. * It refers to either axis' ID or the (zero-based) index of the axis * in the chart's {@link Ext.chart.AbstractChart#axes axes} config. */ yAxis: null }, directions: ['X', 'Y'], /** * @private * * Tells which store record fields should be used for a specific axis direction. E.g. for * * fieldCategory<direction>: ['<fieldConfig1>', '<fieldConfig2>', ...] * * the field names from the following configs will be used: * * series.<fieldConfig1>Field, series.<fieldConfig2>Field, ... * * See {@link Ext.chart.series.StackedCartesian#getFields}. * */ fieldCategoryX: ['X'], fieldCategoryY: ['Y'], applyXAxis: function(newAxis, oldAxis) { return this.getChart().getAxis(newAxis) || oldAxis; }, applyYAxis: function(newAxis, oldAxis) { return this.getChart().getAxis(newAxis) || oldAxis; }, updateXAxis: function(axis) { axis.processData(this); }, updateYAxis: function(axis) { axis.processData(this); }, coordinateX: function() { return this.coordinate('X', 0, 2); }, coordinateY: function() { return this.coordinate('Y', 1, 2); }, getItemForPoint: function(x, y) { var me = this, sprite = me.getSprites()[0], store = me.getStore(), point; if (sprite && !me.getHidden()) { point = sprite.getNearestDataPoint(x, y); } return point ? { series: me, sprite: sprite, category: me.getItemInstancing() ? 'items' : 'markers', index: point.index, record: store.getData().items[point.index], field: me.getYField(), distance: point.distance } : null; }, createSprite: function() { var me = this, sprite = me.callParent(), chart = me.getChart(), xAxis = me.getXAxis(); sprite.setAttributes({ flipXY: chart.getFlipXY(), xAxis: xAxis }); if (sprite.setAggregator && xAxis && xAxis.getAggregator) { if (xAxis.getAggregator) { sprite.setAggregator({ strategy: xAxis.getAggregator() }); } else { sprite.setAggregator({}); } } return sprite; }, getSprites: function() { var me = this, chart = this.getChart(), sprites = me.sprites; if (!chart) { return Ext.emptyArray; } if (!sprites.length) { me.createSprite(); } return sprites; }, getXRange: function() { return [this.dataRange[0], this.dataRange[2]]; }, getYRange: function() { return [this.dataRange[1], this.dataRange[3]]; }});