Chart.js
上传用户:dawnssy
上传日期:2022-08-06
资源大小:9345k
文件大小:24k
源码类别:

JavaScript

开发平台:

JavaScript

  1. /*!  * Ext JS Library 3.1.0  * Copyright(c) 2006-2009 Ext JS, LLC  * licensing@extjs.com  * http://www.extjs.com/license  */ /**
  2.  * @class Ext.chart.Chart
  3.  * @extends Ext.FlashComponent
  4.  * The Ext.chart package provides the capability to visualize data with flash based charting.
  5.  * Each chart binds directly to an Ext.data.Store enabling automatic updates of the chart.
  6.  * To change the look and feel of a chart, see the {@link #chartStyle} and {@link #extraStyle} config options.
  7.  * @constructor
  8.  * @xtype chart
  9.  */
  10.  
  11.  Ext.chart.Chart = Ext.extend(Ext.FlashComponent, {
  12.     refreshBuffer: 100,
  13.     
  14.     /**
  15.      * @cfg {String} backgroundColor
  16.      * @hide
  17.      */
  18.     /**
  19.      * @cfg {Object} chartStyle
  20.      * Sets styles for this chart. This contains default styling, so modifying this property will <b>override</b>
  21.      * the built in styles of the chart. Use {@link #extraStyle} to add customizations to the default styling. 
  22.      */
  23.     chartStyle: {
  24.         padding: 10,
  25.         animationEnabled: true,
  26.         font: {
  27.             name: 'Tahoma',
  28.             color: 0x444444,
  29.             size: 11
  30.         },
  31.         dataTip: {
  32.             padding: 5,
  33.             border: {
  34.                 color: 0x99bbe8,
  35.                 size:1
  36.             },
  37.             background: {
  38.                 color: 0xDAE7F6,
  39.                 alpha: .9
  40.             },
  41.             font: {
  42.                 name: 'Tahoma',
  43.                 color: 0x15428B,
  44.                 size: 10,
  45.                 bold: true
  46.             }
  47.         }
  48.     },
  49.     
  50.     /**
  51.      * @cfg {String} url
  52.      * The url to load the chart from. This defaults to Ext.chart.Chart.CHART_URL, which should
  53.      * be modified to point to the local charts resource.
  54.      */
  55.     
  56.     /**
  57.      * @cfg {Object} extraStyle
  58.      * Contains extra styles that will be added or overwritten to the default chartStyle. Defaults to <tt>null</tt>.
  59.      * For a detailed list of the options available, visit the YUI Charts site 
  60.      * at <a href="http://developer.yahoo.com/yui/charts/#basicstyles">http://developer.yahoo.com/yui/charts/#basicstyles</a><br/>
  61.      * Some of the options availabe:<br />
  62.      * <ul style="padding:5px;padding-left:16px;list-style-type:inherit;">
  63.      * <li><b>padding</b> - The space around the edge of the chart's contents. Padding does not increase the size of the chart.</li>
  64.      * <li><b>animationEnabled</b> - A Boolean value that specifies whether marker animations are enabled or not. Enabled by default.</li>
  65.      * <li><b>font</b> - An Object defining the font style to be used in the chart. Defaults to <tt>{ name: 'Tahoma', color: 0x444444, size: 11 }</tt><br/>
  66.      *  <ul style="padding:5px;padding-left:26px;list-style-type:circle;">
  67.      *      <li><b>name</b> - font name</li>
  68.      *      <li><b>color</b> - font color (hex code, ie: "#ff0000", "ff0000" or 0xff0000)</li>
  69.      *      <li><b>size</b> - font size in points (numeric portion only, ie: 11)</li>
  70.      *      <li><b>bold</b> - boolean</li>
  71.      *      <li><b>italic</b> - boolean</li>
  72.      *      <li><b>underline</b> - boolean</li>
  73.      *  </ul>
  74.      * </li>
  75.      * <li><b>border</b> - An object defining the border style around the chart. The chart itself will decrease in dimensions to accomodate the border.<br/>
  76.      *  <ul style="padding:5px;padding-left:26px;list-style-type:circle;">
  77.      *      <li><b>color</b> - border color (hex code, ie: "#ff0000", "ff0000" or 0xff0000)</li>
  78.      *      <li><b>size</b> - border size in pixels (numeric portion only, ie: 1)</li>
  79.      *  </ul>
  80.      * </li>
  81.      * <li><b>background</b> - An object defining the background style of the chart.<br/>
  82.      *  <ul style="padding:5px;padding-left:26px;list-style-type:circle;">
  83.      *      <li><b>color</b> - border color (hex code, ie: "#ff0000", "ff0000" or 0xff0000)</li>
  84.      *      <li><b>image</b> - an image URL. May be relative to the current document or absolute.</li>
  85.      *  </ul>
  86.      * </li>
  87.      * <li><b>legend</b> - An object defining the legend style<br/>
  88.      *  <ul style="padding:5px;padding-left:26px;list-style-type:circle;">
  89.      *      <li><b>display</b> - location of the legend. Possible values are "none", "left", "right", "top", and "bottom".</li>
  90.      *      <li><b>spacing</b> - an image URL. May be relative to the current document or absolute.</li>
  91.      *      <li><b>padding, border, background, font</b> - same options as described above.</li>
  92.      *  </ul></li>
  93.      * <li><b>dataTip</b> - An object defining the style of the data tip (tooltip).<br/>
  94.      *  <ul style="padding:5px;padding-left:26px;list-style-type:circle;">
  95.      *      <li><b>padding, border, background, font</b> - same options as described above.</li>
  96.      *  </ul></li>
  97.      * <li><b>xAxis and yAxis</b> - An object defining the style of the style of either axis.<br/>
  98.      *  <ul style="padding:5px;padding-left:26px;list-style-type:circle;">
  99.      *      <li><b>color</b> - same option as described above.</li>
  100.      *      <li><b>size</b> - same option as described above.</li>
  101.      *      <li><b>showLabels</b> - boolean</li>
  102.      *      <li><b>labelRotation</b> - a value in degrees from -90 through 90. Default is zero.</li>
  103.      *  </ul></li>
  104.      * <li><b>majorGridLines and minorGridLines</b> - An object defining the style of the style of the grid lines.<br/>
  105.      *  <ul style="padding:5px;padding-left:26px;list-style-type:circle;">
  106.      *      <li><b>color, size</b> - same options as described above.</li>
  107.      *  </ul></li></li>
  108.      * <li><b>zeroGridLine</b> - An object defining the style of the style of the zero grid line.<br/>
  109.      *  <ul style="padding:5px;padding-left:26px;list-style-type:circle;">
  110.      *      <li><b>color, size</b> - same options as described above.</li>
  111.      *  </ul></li></li>
  112.      * <li><b>majorTicks and minorTicks</b> - An object defining the style of the style of ticks in the chart.<br/>
  113.      *  <ul style="padding:5px;padding-left:26px;list-style-type:circle;">
  114.      *      <li><b>color, size</b> - same options as described above.</li>
  115.      *      <li><b>length</b> - the length of each tick in pixels extending from the axis.</li>
  116.      *      <li><b>display</b> - how the ticks are drawn. Possible values are "none", "inside", "outside", and "cross".</li>
  117.      *  </ul></li></li>
  118.      * </ul>
  119.      */
  120.     extraStyle: null,
  121.     
  122.     /**
  123.      * @cfg {Object} seriesStyles
  124.      * Contains styles to apply to the series after a refresh. Defaults to <tt>null</tt>.
  125.      */
  126.     seriesStyles: null,
  127.     
  128.     /**
  129.      * @cfg {Boolean} disableCaching
  130.      * True to add a "cache buster" to the end of the chart url. Defaults to true for Opera and IE.
  131.      */
  132.     disableCaching: Ext.isIE || Ext.isOpera,
  133.     disableCacheParam: '_dc',
  134.     initComponent : function(){
  135.         Ext.chart.Chart.superclass.initComponent.call(this);
  136.         if(!this.url){
  137.             this.url = Ext.chart.Chart.CHART_URL;
  138.         }
  139.         if(this.disableCaching){
  140.             this.url = Ext.urlAppend(this.url, String.format('{0}={1}', this.disableCacheParam, new Date().getTime()));
  141.         }
  142.         this.addEvents(
  143.             'itemmouseover',
  144.             'itemmouseout',
  145.             'itemclick',
  146.             'itemdoubleclick',
  147.             'itemdragstart',
  148.             'itemdrag',
  149.             'itemdragend',
  150.             /**
  151.              * @event beforerefresh
  152.              * Fires before a refresh to the chart data is called.  If the beforerefresh handler returns
  153.              * <tt>false</tt> the {@link #refresh} action will be cancelled.
  154.              * @param {Chart} this
  155.              */
  156.             'beforerefresh',
  157.             /**
  158.              * @event refresh
  159.              * Fires after the chart data has been refreshed.
  160.              * @param {Chart} this
  161.              */
  162.             'refresh'
  163.         );
  164.         this.store = Ext.StoreMgr.lookup(this.store);
  165.     },
  166.     /**
  167.      * Sets a single style value on the Chart instance.
  168.      *
  169.      * @param name {String} Name of the Chart style value to change.
  170.      * @param value {Object} New value to pass to the Chart style.
  171.      */
  172.      setStyle: function(name, value){
  173.          this.swf.setStyle(name, Ext.encode(value));
  174.      },
  175.     /**
  176.      * Resets all styles on the Chart instance.
  177.      *
  178.      * @param styles {Object} Initializer for all Chart styles.
  179.      */
  180.     setStyles: function(styles){
  181.         this.swf.setStyles(Ext.encode(styles));
  182.     },
  183.     /**
  184.      * Sets the styles on all series in the Chart.
  185.      *
  186.      * @param styles {Array} Initializer for all Chart series styles.
  187.      */
  188.     setSeriesStyles: function(styles){
  189.         this.seriesStyles = styles;
  190.         var s = [];
  191.         Ext.each(styles, function(style){
  192.             s.push(Ext.encode(style));
  193.         });
  194.         this.swf.setSeriesStyles(s);
  195.     },
  196.     setCategoryNames : function(names){
  197.         this.swf.setCategoryNames(names);
  198.     },
  199.     setTipRenderer : function(fn){
  200.         var chart = this;
  201.         this.tipFnName = this.createFnProxy(function(item, index, series){
  202.             var record = chart.store.getAt(index);
  203.             return fn(chart, record, index, series);
  204.         }, this.tipFnName);
  205.         this.swf.setDataTipFunction(this.tipFnName);
  206.     },
  207.     setSeries : function(series){
  208.         this.series = series;
  209.         this.refresh();
  210.     },
  211.     /**
  212.      * Changes the data store bound to this chart and refreshes it.
  213.      * @param {Store} store The store to bind to this chart
  214.      */
  215.     bindStore : function(store, initial){
  216.         if(!initial && this.store){
  217.             if(store !== this.store && this.store.autoDestroy){
  218.                 this.store.destroy();
  219.             }else{
  220.                 this.store.un("datachanged", this.refresh, this);
  221.                 this.store.un("add", this.delayRefresh, this);
  222.                 this.store.un("remove", this.delayRefresh, this);
  223.                 this.store.un("update", this.delayRefresh, this);
  224.                 this.store.un("clear", this.refresh, this);
  225.             }
  226.         }
  227.         if(store){
  228.             store = Ext.StoreMgr.lookup(store);
  229.             store.on({
  230.                 scope: this,
  231.                 datachanged: this.refresh,
  232.                 add: this.delayRefresh,
  233.                 remove: this.delayRefresh,
  234.                 update: this.delayRefresh,
  235.                 clear: this.refresh
  236.             });
  237.         }
  238.         this.store = store;
  239.         if(store && !initial){
  240.             this.refresh();
  241.         }
  242.     },
  243.     onSwfReady : function(isReset){
  244.         Ext.chart.Chart.superclass.onSwfReady.call(this, isReset);
  245.         this.swf.setType(this.type);
  246.         if(this.chartStyle){
  247.             this.setStyles(Ext.apply({}, this.extraStyle, this.chartStyle));
  248.         }
  249.         if(this.categoryNames){
  250.             this.setCategoryNames(this.categoryNames);
  251.         }
  252.         if(this.tipRenderer){
  253.             this.setTipRenderer(this.tipRenderer);
  254.         }
  255.         if(!isReset){
  256.             this.bindStore(this.store, true);
  257.         }
  258.         this.refresh.defer(10, this);
  259.     },
  260.     delayRefresh : function(){
  261.         if(!this.refreshTask){
  262.             this.refreshTask = new Ext.util.DelayedTask(this.refresh, this);
  263.         }
  264.         this.refreshTask.delay(this.refreshBuffer);
  265.     },
  266.     refresh : function(){
  267.         if(this.fireEvent('beforerefresh', this) !== false){
  268.         var styleChanged = false;
  269.         // convert the store data into something YUI charts can understand
  270.         var data = [], rs = this.store.data.items;
  271.         for(var j = 0, len = rs.length; j < len; j++){
  272.             data[j] = rs[j].data;
  273.         }
  274.         //make a copy of the series definitions so that we aren't
  275.         //editing them directly.
  276.         var dataProvider = [];
  277.         var seriesCount = 0;
  278.         var currentSeries = null;
  279.         var i = 0;
  280.         if(this.series){
  281.             seriesCount = this.series.length;
  282.             for(i = 0; i < seriesCount; i++){
  283.                 currentSeries = this.series[i];
  284.                 var clonedSeries = {};
  285.                 for(var prop in currentSeries){
  286.                     if(prop == "style" && currentSeries.style !== null){
  287.                         clonedSeries.style = Ext.encode(currentSeries.style);
  288.                         styleChanged = true;
  289.                         //we don't want to modify the styles again next time
  290.                         //so null out the style property.
  291.                         // this causes issues
  292.                         // currentSeries.style = null;
  293.                     } else{
  294.                         clonedSeries[prop] = currentSeries[prop];
  295.                     }
  296.                 }
  297.                 dataProvider.push(clonedSeries);
  298.             }
  299.         }
  300.         if(seriesCount > 0){
  301.             for(i = 0; i < seriesCount; i++){
  302.                 currentSeries = dataProvider[i];
  303.                 if(!currentSeries.type){
  304.                     currentSeries.type = this.type;
  305.                 }
  306.                 currentSeries.dataProvider = data;
  307.             }
  308.         } else{
  309.             dataProvider.push({type: this.type, dataProvider: data});
  310.         }
  311.         this.swf.setDataProvider(dataProvider);
  312.         if(this.seriesStyles){
  313.             this.setSeriesStyles(this.seriesStyles);
  314.         }
  315.             this.fireEvent('refresh', this);
  316.         }
  317.     },
  318.     createFnProxy : function(fn, old){
  319.         if(old){
  320.             delete window[old];
  321.         }
  322.         var fnName = "extFnProxy" + (++Ext.chart.Chart.PROXY_FN_ID);
  323.         window[fnName] = fn;
  324.         return fnName;
  325.     },
  326.     
  327.     onDestroy: function(){
  328.         Ext.chart.Chart.superclass.onDestroy.call(this);
  329.         this.bindStore(null);
  330.         var tip = this.tipFnName;
  331.         if(!Ext.isEmpty(tip)){
  332.             delete window[tip];
  333.         }
  334.     }
  335. });
  336. Ext.reg('chart', Ext.chart.Chart);
  337. Ext.chart.Chart.PROXY_FN_ID = 0;
  338. /**
  339.  * Sets the url to load the chart from. This should be set to a local resource.
  340.  * @static
  341.  * @type String
  342.  */
  343. Ext.chart.Chart.CHART_URL = 'http:/' + '/yui.yahooapis.com/2.7.0/build/charts/assets/charts.swf';
  344. /**
  345.  * @class Ext.chart.PieChart
  346.  * @extends Ext.chart.Chart
  347.  * @constructor
  348.  * @xtype piechart
  349.  */
  350. Ext.chart.PieChart = Ext.extend(Ext.chart.Chart, {
  351.     type: 'pie',
  352.     onSwfReady : function(isReset){
  353.         Ext.chart.PieChart.superclass.onSwfReady.call(this, isReset);
  354.         this.setDataField(this.dataField);
  355.         this.setCategoryField(this.categoryField);
  356.     },
  357.     setDataField : function(field){
  358.         this.dataField = field;
  359.         this.swf.setDataField(field);
  360.     },
  361.     setCategoryField : function(field){
  362.         this.categoryField = field;
  363.         this.swf.setCategoryField(field);
  364.     }
  365. });
  366. Ext.reg('piechart', Ext.chart.PieChart);
  367. /**
  368.  * @class Ext.chart.CartesianChart
  369.  * @extends Ext.chart.Chart
  370.  * @constructor
  371.  * @xtype cartesianchart
  372.  */
  373. Ext.chart.CartesianChart = Ext.extend(Ext.chart.Chart, {
  374.     onSwfReady : function(isReset){
  375.         Ext.chart.CartesianChart.superclass.onSwfReady.call(this, isReset);
  376.         if(this.xField){
  377.             this.setXField(this.xField);
  378.         }
  379.         if(this.yField){
  380.             this.setYField(this.yField);
  381.         }
  382.         if(this.xAxis){
  383.             this.setXAxis(this.xAxis);
  384.         }
  385.         if(this.yAxis){
  386.             this.setYAxis(this.yAxis);
  387.         }
  388.     },
  389.     setXField : function(value){
  390.         this.xField = value;
  391.         this.swf.setHorizontalField(value);
  392.     },
  393.     setYField : function(value){
  394.         this.yField = value;
  395.         this.swf.setVerticalField(value);
  396.     },
  397.     setXAxis : function(value){
  398.         this.xAxis = this.createAxis('xAxis', value);
  399.         this.swf.setHorizontalAxis(this.xAxis);
  400.     },
  401.     setYAxis : function(value){
  402.         this.yAxis = this.createAxis('yAxis', value);
  403.         this.swf.setVerticalAxis(this.yAxis);
  404.     },
  405.     createAxis : function(axis, value){
  406.         var o = Ext.apply({}, value), oldFn = null;
  407.         if(this[axis]){
  408.             oldFn = this[axis].labelFunction;
  409.         }
  410.         if(o.labelRenderer){
  411.             var fn = o.labelRenderer;
  412.             o.labelFunction = this.createFnProxy(function(v){
  413.                 return fn(v);
  414.             }, oldFn);
  415.             delete o.labelRenderer;
  416.         }
  417.         return o;
  418.     }
  419. });
  420. Ext.reg('cartesianchart', Ext.chart.CartesianChart);
  421. /**
  422.  * @class Ext.chart.LineChart
  423.  * @extends Ext.chart.CartesianChart
  424.  * @constructor
  425.  * @xtype linechart
  426.  */
  427. Ext.chart.LineChart = Ext.extend(Ext.chart.CartesianChart, {
  428.     type: 'line'
  429. });
  430. Ext.reg('linechart', Ext.chart.LineChart);
  431. /**
  432.  * @class Ext.chart.ColumnChart
  433.  * @extends Ext.chart.CartesianChart
  434.  * @constructor
  435.  * @xtype columnchart
  436.  */
  437. Ext.chart.ColumnChart = Ext.extend(Ext.chart.CartesianChart, {
  438.     type: 'column'
  439. });
  440. Ext.reg('columnchart', Ext.chart.ColumnChart);
  441. /**
  442.  * @class Ext.chart.StackedColumnChart
  443.  * @extends Ext.chart.CartesianChart
  444.  * @constructor
  445.  * @xtype stackedcolumnchart
  446.  */
  447. Ext.chart.StackedColumnChart = Ext.extend(Ext.chart.CartesianChart, {
  448.     type: 'stackcolumn'
  449. });
  450. Ext.reg('stackedcolumnchart', Ext.chart.StackedColumnChart);
  451. /**
  452.  * @class Ext.chart.BarChart
  453.  * @extends Ext.chart.CartesianChart
  454.  * @constructor
  455.  * @xtype barchart
  456.  */
  457. Ext.chart.BarChart = Ext.extend(Ext.chart.CartesianChart, {
  458.     type: 'bar'
  459. });
  460. Ext.reg('barchart', Ext.chart.BarChart);
  461. /**
  462.  * @class Ext.chart.StackedBarChart
  463.  * @extends Ext.chart.CartesianChart
  464.  * @constructor
  465.  * @xtype stackedbarchart
  466.  */
  467. Ext.chart.StackedBarChart = Ext.extend(Ext.chart.CartesianChart, {
  468.     type: 'stackbar'
  469. });
  470. Ext.reg('stackedbarchart', Ext.chart.StackedBarChart);
  471. /**
  472.  * @class Ext.chart.Axis
  473.  * Defines a CartesianChart's vertical or horizontal axis.
  474.  * @constructor
  475.  */
  476. Ext.chart.Axis = function(config){
  477.     Ext.apply(this, config);
  478. };
  479. Ext.chart.Axis.prototype =
  480. {
  481.     /**
  482.      * The type of axis.
  483.      *
  484.      * @property type
  485.      * @type String
  486.      */
  487.     type: null,
  488.     /**
  489.      * The direction in which the axis is drawn. May be "horizontal" or "vertical".
  490.      *
  491.      * @property orientation
  492.      * @type String
  493.      */
  494.     orientation: "horizontal",
  495.     /**
  496.      * If true, the items on the axis will be drawn in opposite direction.
  497.      *
  498.      * @property reverse
  499.      * @type Boolean
  500.      */
  501.     reverse: false,
  502.     /**
  503.      * A string reference to the globally-accessible function that may be called to
  504.      * determine each of the label values for this axis.
  505.      *
  506.      * @property labelFunction
  507.      * @type String
  508.      */
  509.     labelFunction: null,
  510.     /**
  511.      * If true, labels that overlap previously drawn labels on the axis will be hidden.
  512.      *
  513.      * @property hideOverlappingLabels
  514.      * @type Boolean
  515.      */
  516.     hideOverlappingLabels: true
  517. };
  518. /**
  519.  * @class Ext.chart.NumericAxis
  520.  * @extends Ext.chart.Axis
  521.  * A type of axis whose units are measured in numeric values.
  522.  * @constructor
  523.  */
  524. Ext.chart.NumericAxis = Ext.extend(Ext.chart.Axis, {
  525.     type: "numeric",
  526.     /**
  527.      * The minimum value drawn by the axis. If not set explicitly, the axis minimum
  528.      * will be calculated automatically.
  529.      *
  530.      * @property minimum
  531.      * @type Number
  532.      */
  533.     minimum: NaN,
  534.     /**
  535.      * The maximum value drawn by the axis. If not set explicitly, the axis maximum
  536.      * will be calculated automatically.
  537.      *
  538.      * @property maximum
  539.      * @type Number
  540.      */
  541.     maximum: NaN,
  542.     /**
  543.      * The spacing between major intervals on this axis.
  544.      *
  545.      * @property majorUnit
  546.      * @type Number
  547.      */
  548.     majorUnit: NaN,
  549.     /**
  550.      * The spacing between minor intervals on this axis.
  551.      *
  552.      * @property minorUnit
  553.      * @type Number
  554.      */
  555.     minorUnit: NaN,
  556.     /**
  557.      * If true, the labels, ticks, gridlines, and other objects will snap to
  558.      * the nearest major or minor unit. If false, their position will be based
  559.      * on the minimum value.
  560.      *
  561.      * @property snapToUnits
  562.      * @type Boolean
  563.      */
  564.     snapToUnits: true,
  565.     /**
  566.      * If true, and the bounds are calculated automatically, either the minimum or
  567.      * maximum will be set to zero.
  568.      *
  569.      * @property alwaysShowZero
  570.      * @type Boolean
  571.      */
  572.     alwaysShowZero: true,
  573.     /**
  574.      * The scaling algorithm to use on this axis. May be "linear" or "logarithmic".
  575.      *
  576.      * @property scale
  577.      * @type String
  578.      */
  579.     scale: "linear"
  580. });
  581. /**
  582.  * @class Ext.chart.TimeAxis
  583.  * @extends Ext.chart.Axis
  584.  * A type of axis whose units are measured in time-based values.
  585.  * @constructor
  586.  */
  587. Ext.chart.TimeAxis = Ext.extend(Ext.chart.Axis, {
  588.     type: "time",
  589.     /**
  590.      * The minimum value drawn by the axis. If not set explicitly, the axis minimum
  591.      * will be calculated automatically.
  592.      *
  593.      * @property minimum
  594.      * @type Date
  595.      */
  596.     minimum: null,
  597.     /**
  598.      * The maximum value drawn by the axis. If not set explicitly, the axis maximum
  599.      * will be calculated automatically.
  600.      *
  601.      * @property maximum
  602.      * @type Number
  603.      */
  604.     maximum: null,
  605.     /**
  606.      * The spacing between major intervals on this axis.
  607.      *
  608.      * @property majorUnit
  609.      * @type Number
  610.      */
  611.     majorUnit: NaN,
  612.     /**
  613.      * The time unit used by the majorUnit.
  614.      *
  615.      * @property majorTimeUnit
  616.      * @type String
  617.      */
  618.     majorTimeUnit: null,
  619.     /**
  620.      * The spacing between minor intervals on this axis.
  621.      *
  622.      * @property majorUnit
  623.      * @type Number
  624.      */
  625.     minorUnit: NaN,
  626.     /**
  627.      * The time unit used by the minorUnit.
  628.      *
  629.      * @property majorTimeUnit
  630.      * @type String
  631.      */
  632.     minorTimeUnit: null,
  633.     /**
  634.      * If true, the labels, ticks, gridlines, and other objects will snap to
  635.      * the nearest major or minor unit. If false, their position will be based
  636.      * on the minimum value.
  637.      *
  638.      * @property snapToUnits
  639.      * @type Boolean
  640.      */
  641.     snapToUnits: true
  642. });
  643. /**
  644.  * @class Ext.chart.CategoryAxis
  645.  * @extends Ext.chart.Axis
  646.  * A type of axis that displays items in categories.
  647.  * @constructor
  648.  */
  649. Ext.chart.CategoryAxis = Ext.extend(Ext.chart.Axis, {
  650.     type: "category",
  651.     /**
  652.      * A list of category names to display along this axis.
  653.      *
  654.      * @property categoryNames
  655.      * @type Array
  656.      */
  657.     categoryNames: null
  658. });
  659. /**
  660.  * @class Ext.chart.Series
  661.  * Series class for the charts widget.
  662.  * @constructor
  663.  */
  664. Ext.chart.Series = function(config) { Ext.apply(this, config); };
  665. Ext.chart.Series.prototype =
  666. {
  667.     /**
  668.      * The type of series.
  669.      *
  670.      * @property type
  671.      * @type String
  672.      */
  673.     type: null,
  674.     /**
  675.      * The human-readable name of the series.
  676.      *
  677.      * @property displayName
  678.      * @type String
  679.      */
  680.     displayName: null
  681. };
  682. /**
  683.  * @class Ext.chart.CartesianSeries
  684.  * @extends Ext.chart.Series
  685.  * CartesianSeries class for the charts widget.
  686.  * @constructor
  687.  */
  688. Ext.chart.CartesianSeries = Ext.extend(Ext.chart.Series, {
  689.     /**
  690.      * The field used to access the x-axis value from the items from the data source.
  691.      *
  692.      * @property xField
  693.      * @type String
  694.      */
  695.     xField: null,
  696.     /**
  697.      * The field used to access the y-axis value from the items from the data source.
  698.      *
  699.      * @property yField
  700.      * @type String
  701.      */
  702.     yField: null
  703. });
  704. /**
  705.  * @class Ext.chart.ColumnSeries
  706.  * @extends Ext.chart.CartesianSeries
  707.  * ColumnSeries class for the charts widget.
  708.  * @constructor
  709.  */
  710. Ext.chart.ColumnSeries = Ext.extend(Ext.chart.CartesianSeries, {
  711.     type: "column"
  712. });
  713. /**
  714.  * @class Ext.chart.LineSeries
  715.  * @extends Ext.chart.CartesianSeries
  716.  * LineSeries class for the charts widget.
  717.  * @constructor
  718.  */
  719. Ext.chart.LineSeries = Ext.extend(Ext.chart.CartesianSeries, {
  720.     type: "line"
  721. });
  722. /**
  723.  * @class Ext.chart.BarSeries
  724.  * @extends Ext.chart.CartesianSeries
  725.  * BarSeries class for the charts widget.
  726.  * @constructor
  727.  */
  728. Ext.chart.BarSeries = Ext.extend(Ext.chart.CartesianSeries, {
  729.     type: "bar"
  730. });
  731. /**
  732.  * @class Ext.chart.PieSeries
  733.  * @extends Ext.chart.Series
  734.  * PieSeries class for the charts widget.
  735.  * @constructor
  736.  */
  737. Ext.chart.PieSeries = Ext.extend(Ext.chart.Series, {
  738.     type: "pie",
  739.     dataField: null,
  740.     categoryField: null
  741. });