LiveUpdates.js 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. Ext.require([
  2. 'Ext.window.Window',
  3. 'Ext.chart.*'
  4. ]);
  5. Ext.onReady(function () {
  6. var chart;
  7. var generateData = (function() {
  8. var data = [], i = 0,
  9. last = false,
  10. date = new Date(2011, 1, 1),
  11. seconds = +date,
  12. min = Math.min,
  13. max = Math.max,
  14. random = Math.random;
  15. return function() {
  16. data = data.slice();
  17. data.push({
  18. date: Ext.Date.add(date, Ext.Date.DAY, i++),
  19. visits: min(100, max(last? last.visits + (random() - 0.5) * 20 : random() * 100, 0)),
  20. views: min(100, max(last? last.views + (random() - 0.5) * 10 : random() * 100, 0)),
  21. veins: min(100, max(last? last.veins + (random() - 0.5) * 20 : random() * 100, 0))
  22. });
  23. last = data[data.length -1];
  24. return data;
  25. };
  26. })();
  27. var group = false,
  28. groupOp = [{
  29. dateFormat: 'M d',
  30. groupBy: 'year,month,day'
  31. }, {
  32. dateFormat: 'M',
  33. groupBy: 'year,month'
  34. }];
  35. function regroup() {
  36. group = !group;
  37. var axis = chart.axes.get(1),
  38. selectedGroup = groupOp[+group];
  39. axis.dateFormat = selectedGroup.dateFormat;
  40. axis.groupBy = selectedGroup.groupBy;
  41. chart.redraw();
  42. }
  43. var store = Ext.create('Ext.data.JsonStore', {
  44. fields: ['date', 'visits', 'views', 'veins'],
  45. data: generateData()
  46. });
  47. var intr = setInterval(function() {
  48. var gs = generateData();
  49. var toDate = timeAxis.toDate,
  50. lastDate = gs[gs.length - 1].date,
  51. markerIndex = chart.markerIndex || 0;
  52. if (+toDate < +lastDate) {
  53. markerIndex = 1;
  54. timeAxis.toDate = lastDate;
  55. timeAxis.fromDate = Ext.Date.add(Ext.Date.clone(timeAxis.fromDate), Ext.Date.DAY, 1);
  56. chart.markerIndex = markerIndex;
  57. }
  58. store.loadData(gs);
  59. }, 100);
  60. Ext.create('Ext.Window', {
  61. width: 800,
  62. height: 600,
  63. minHeight: 400,
  64. minWidth: 550,
  65. maximizable: true,
  66. title: 'Live Updated Chart',
  67. layout: 'fit',
  68. items: [{
  69. xtype: 'chart',
  70. style: 'background:#fff',
  71. store: store,
  72. id: 'chartCmp',
  73. axes: [{
  74. type: 'Numeric',
  75. grid: true,
  76. minimum: 0,
  77. maximum: 100,
  78. position: 'left',
  79. fields: ['views', 'visits', 'veins'],
  80. title: 'Number of Hits',
  81. grid: {
  82. odd: {
  83. fill: '#dedede',
  84. stroke: '#ddd',
  85. 'stroke-width': 0.5
  86. }
  87. }
  88. }, {
  89. type: 'Time',
  90. position: 'bottom',
  91. fields: 'date',
  92. title: 'Day',
  93. dateFormat: 'M d',
  94. groupBy: 'year,month,day',
  95. aggregateOp: 'sum',
  96. constrain: true,
  97. fromDate: new Date(2011, 1, 1),
  98. toDate: new Date(2011, 1, 7)
  99. }],
  100. series: [{
  101. type: 'line',
  102. axis: ['left', 'bottom'],
  103. xField: 'date',
  104. yField: 'visits',
  105. label: {
  106. display: 'none',
  107. field: 'visits',
  108. renderer: function(v) { return v >> 0; },
  109. 'text-anchor': 'middle'
  110. },
  111. markerConfig: {
  112. radius: 5,
  113. size: 5
  114. }
  115. },{
  116. type: 'line',
  117. axis: ['left', 'bottom'],
  118. xField: 'date',
  119. yField: 'views',
  120. label: {
  121. display: 'none',
  122. field: 'visits',
  123. renderer: function(v) { return v >> 0; },
  124. 'text-anchor': 'middle'
  125. },
  126. markerConfig: {
  127. radius: 5,
  128. size: 5
  129. }
  130. },{
  131. type: 'line',
  132. axis: ['left', 'bottom'],
  133. xField: 'date',
  134. yField: 'veins',
  135. label: {
  136. display: 'none',
  137. field: 'visits',
  138. renderer: function(v) { return v >> 0; },
  139. 'text-anchor': 'middle'
  140. },
  141. markerConfig: {
  142. radius: 5,
  143. size: 5
  144. }
  145. }]
  146. }]
  147. }).show();
  148. chart = Ext.getCmp('chartCmp');
  149. var timeAxis = chart.axes.get(1);
  150. });