infinite-scroll-grid-tuner.js 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  1. Ext.Loader.setConfig({enabled: true});
  2. Ext.Loader.setPath('Ext.ux', '../ux/');
  3. Ext.require([
  4. '*',
  5. 'Ext.ux.ajax.JsonSimlet',
  6. 'Ext.ux.ajax.SimManager'
  7. ]);
  8. Ext.define('BigDataSimlet', {
  9. extend: 'Ext.ux.ajax.JsonSimlet',
  10. data: [],
  11. numFields: 10,
  12. numRecords: 50*1000,
  13. getData: function () {
  14. var me = this,
  15. data = me.data;
  16. if (data.length != me.numRecords || me.lastNumColumns != me.numFields) {
  17. me.currentOrder = null;
  18. me.lastNumColumns = me.numFields;
  19. data.length = 0;
  20. for (var r = 0, k = me.numRecords; r < k; r++) {
  21. var rec = {};
  22. for (var i = 0; i < me.numFields; i++) {
  23. rec['field' + i] = 'row' + (r + 1) + '/col' + (i+1);
  24. }
  25. data.push(rec);
  26. }
  27. }
  28. return this.callParent(arguments);
  29. }
  30. });
  31. Ext.onReady(function() {
  32. var simlet = new BigDataSimlet();
  33. Ext.ux.ajax.SimManager.init({
  34. delay: 300
  35. }).register({
  36. localAjaxSimulator: simlet
  37. });
  38. function createStore (numFields) {
  39. var fields = [],
  40. i;
  41. for (i = 0; i < numFields; ++i) {
  42. fields.push('field' + i);
  43. }
  44. simlet.numFields = numFields;
  45. return Ext.create('Ext.data.Store', {
  46. remoteSort: true,
  47. // allow the grid to interact with the paging scroller by buffering
  48. buffered: true,
  49. fields: fields,
  50. proxy: {
  51. // Simulating Ajax.
  52. type: 'ajax',
  53. url: 'localAjaxSimulator',
  54. reader: {
  55. root: 'topics',
  56. totalProperty: 'totalCount'
  57. }
  58. }
  59. });
  60. }
  61. var store = createStore(10);
  62. Ext.data.Store.prototype.prefetch = Ext.Function.createInterceptor(Ext.data.Store.prototype.prefetch, function(options) {
  63. if (!this.pagesRequested || !this.pagesRequested[options.page]) {
  64. logPanel.log('Prefetch rows ' + options.start + '-' + (options.start + options.limit));
  65. }
  66. });
  67. Ext.data.Store.prototype.onProxyPrefetch = Ext.Function.createSequence(Ext.data.Store.prototype.onProxyPrefetch, function(operation) {
  68. logPanel.log('Prefetch returned ' + operation.start + '-' + (operation.start + operation.limit));
  69. });
  70. Ext.data.Store.prototype.PageMap.prototype.prune = Ext.Function.createSequence(Ext.data.Store.prototype.PageMap.prototype.prune, function() {
  71. logPanel.log('Page cache contains pages ' + this.getKeys().join(',') + '<br>&#160;&#160;&#160;&#160;' + this.pageSize * this.getCount() + ' records in cache');
  72. });
  73. Ext.grid.PagingScroller.prototype.onViewRefresh = Ext.Function.createSequence(Ext.grid.PagingScroller.prototype.onViewRefresh, function() {
  74. var me = this,
  75. table = me.view.el.child('table', true);
  76. logPanel.log('Table moved to top: ' + table.style.top);
  77. });
  78. var grid = Ext.create('Ext.grid.Panel', {
  79. region: 'center',
  80. title: 'Random data (' + simlet.numRecords + ' records)',
  81. store: store,
  82. loadMask: true,
  83. selModel: {
  84. pruneRemoved: false
  85. },
  86. multiSelect: true,
  87. columns: [{
  88. xtype: 'rownumberer',
  89. width: 50,
  90. sortable: false
  91. }]
  92. });
  93. function makeLabel (ns, cls, name) {
  94. var docs = '../..';
  95. //docs = '../../../.build/sdk'; // for development/testing
  96. return '<a href="'+docs+'/docs/#!/api/'+ns+'.'+cls+'-cfg-'+name+'" target="docs">' + cls + ' ' + name + '</a>';
  97. }
  98. var logPanel = new Ext.Panel({
  99. title: 'Log',
  100. region: 'center',
  101. autoScroll: true,
  102. log: function(m) {
  103. logPanel.body.createChild({
  104. html: m
  105. });
  106. logPanel.body.dom.scrollTop = 1000000;
  107. },
  108. tbar: [{
  109. text: 'Clear',
  110. handler: function() {
  111. logPanel.body.update('');
  112. }
  113. }]
  114. });
  115. var controls = Ext.create('Ext.form.Panel', {
  116. region: 'north',
  117. split: true,
  118. height: 345,
  119. minHeight: 345,
  120. bodyPadding: 5,
  121. layout: 'form',
  122. defaults: {
  123. labelWidth: 190
  124. },
  125. items: [{
  126. xtype: 'numberfield',
  127. fieldLabel: 'Ajax latency (ms)',
  128. itemId: 'latency',
  129. value: 1000,
  130. maxValue: 5000
  131. }, {
  132. xtype: 'numberfield',
  133. fieldLabel: 'Dataset row count',
  134. itemId: 'rowCount',
  135. value: 50000,
  136. minValue: 200
  137. }, {
  138. xtype: 'numberfield',
  139. fieldLabel: makeLabel('Ext.data', 'Store', 'pageSize'),
  140. itemId: 'pageSize',
  141. value: 150
  142. }, {
  143. xtype: 'numberfield',
  144. fieldLabel: makeLabel('Ext.data', 'Store', 'trailingBufferZone'),
  145. itemId: 'storeTrailingBufferZone',
  146. value: Ext.data.Store.prototype.trailingBufferZone
  147. }, {
  148. xtype: 'numberfield',
  149. fieldLabel: makeLabel('Ext.data', 'Store', 'leadingBufferZone'),
  150. itemId: 'storeLeadingBufferZone',
  151. value: Ext.data.Store.prototype.leadingBufferZone
  152. }, {
  153. xtype: 'numberfield',
  154. fieldLabel: makeLabel('Ext.grid', 'PagingScroller', 'numFromEdge'),
  155. itemId: 'scrollerNumFromEdge',
  156. value: Ext.grid.PagingScroller.prototype.numFromEdge,
  157. maxValue: 20
  158. }, {
  159. xtype: 'numberfield',
  160. fieldLabel: makeLabel('Ext.grid', 'PagingScroller', 'trailingBufferZone'),
  161. itemId: 'scrollerTrailingBufferZone',
  162. value: Ext.grid.PagingScroller.prototype.trailingBufferZone,
  163. maxValue: 100
  164. }, {
  165. xtype: 'numberfield',
  166. fieldLabel: makeLabel('Ext.grid', 'PagingScroller', 'leadingBufferZone'),
  167. itemId: 'scrollerLeadingBufferZone',
  168. value: Ext.grid.PagingScroller.prototype.leadingBufferZone,
  169. maxValue: 100
  170. }, {
  171. xtype: 'numberfield',
  172. fieldLabel: 'Num columns',
  173. itemId: 'numFields',
  174. value: 10,
  175. minValue: 1
  176. }, {
  177. xtype: 'numberfield',
  178. fieldLabel: makeLabel('Ext.data', 'Store', 'purgePageCount'),
  179. itemId: 'purgePageCount',
  180. value: Ext.data.Store.prototype.purgePageCount,
  181. minValue: 0
  182. }, {
  183. xtype: 'numberfield',
  184. fieldLabel: makeLabel('Ext.grid', 'PagingScroller', 'scrollToLoadBuffer'),
  185. itemId: 'scrollToLoadBuffer',
  186. value: Ext.grid.PagingScroller.prototype.scrollToLoadBuffer,
  187. minValue: 0,
  188. maxValue: 1000,
  189. listeners: {
  190. change: function(f, newVal, oldVal) {
  191. grid.verticalScroller.scrollToLoadBuffer = newVal;
  192. }
  193. }
  194. }],
  195. tbar: [{
  196. text: 'Reload',
  197. handler: initializeGrid
  198. }]
  199. });
  200. function initializeGrid () {
  201. var numFields = controls.down('#numFields').getValue(),
  202. columns = [{
  203. xtype: 'rownumberer',
  204. width: 50,
  205. sortable: false
  206. }],
  207. i,
  208. oldStore = store;
  209. store.removeAll();
  210. store.pageMap.clear();
  211. logPanel.body.update('');
  212. for (i = 0; i < numFields; ++i) {
  213. columns.push({ text: 'Field ' + (i+1), dataIndex: 'field' + i });
  214. }
  215. simlet.numRecords = controls.down('#rowCount').getValue();
  216. store = createStore(numFields);
  217. store.pageSize = controls.down('#pageSize').getValue();
  218. store.trailingBufferZone = controls.down('#storeTrailingBufferZone').getValue();
  219. store.leadingBufferZone = controls.down('#storeLeadingBufferZone').getValue();
  220. store.pageMap.maxSize = store.purgePageCount = controls.down('#purgePageCount').getValue();
  221. grid.verticalScroller.numFromEdge = controls.down('#scrollerNumFromEdge').getValue();
  222. grid.verticalScroller.trailingBufferZone = controls.down('#scrollerTrailingBufferZone').getValue();
  223. grid.verticalScroller.leadingBufferZone = controls.down('#scrollerLeadingBufferZone').getValue();
  224. Ext.ux.ajax.SimManager.delay = controls.down('#latency').getValue();
  225. grid.setTitle('Random data (' + simlet.numRecords + ' records)');
  226. var start = new Date().getTime();
  227. grid.reconfigure(store, columns);
  228. logPanel.log(simlet.numRecords + ' rows x ' + numFields + ' columns in ' + (new Date().getTime() - start) + 'ms');
  229. // Load the first page. It will be diverted through the prefetch buffer.
  230. store.loadPage(1);
  231. oldStore.destroy();
  232. }
  233. new Ext.Viewport({
  234. layout: {
  235. type: 'border',
  236. padding: 5
  237. },
  238. items: [
  239. {
  240. border: false,
  241. listeners: {
  242. render: function(p) {
  243. Ext.EventManager.idleEvent.addListener(function() {
  244. p.header.removeCls('x-docked-noborder-left x-docked-noborder-right x-docked-noborder-top');
  245. p.updateLayout({isRoot:true});
  246. }, null, {single: true});
  247. },
  248. single: true
  249. },
  250. title: 'Configuration',
  251. collapsible: true,
  252. layout: 'border',
  253. region: 'west',
  254. bodyBorder: false,
  255. width: 270,
  256. split: true,
  257. minWidth: 270,
  258. items: [ controls, logPanel ]
  259. },
  260. grid
  261. ]
  262. })
  263. });