Ext.Loader.setConfig({enabled: true}); Ext.Loader.setPath('Ext.ux', '../ux/'); Ext.require([ '*', 'Ext.ux.ajax.JsonSimlet', 'Ext.ux.ajax.SimManager' ]); Ext.define('BigDataSimlet', { extend: 'Ext.ux.ajax.JsonSimlet', data: [], numFields: 10, numRecords: 50*1000, getData: function () { var me = this, data = me.data; if (data.length != me.numRecords || me.lastNumColumns != me.numFields) { me.currentOrder = null; me.lastNumColumns = me.numFields; data.length = 0; for (var r = 0, k = me.numRecords; r < k; r++) { var rec = {}; for (var i = 0; i < me.numFields; i++) { rec['field' + i] = 'row' + (r + 1) + '/col' + (i+1); } data.push(rec); } } return this.callParent(arguments); } }); Ext.onReady(function() { var simlet = new BigDataSimlet(); Ext.ux.ajax.SimManager.init({ delay: 300 }).register({ localAjaxSimulator: simlet }); function createStore (numFields) { var fields = [], i; for (i = 0; i < numFields; ++i) { fields.push('field' + i); } simlet.numFields = numFields; return Ext.create('Ext.data.Store', { remoteSort: true, // allow the grid to interact with the paging scroller by buffering buffered: true, fields: fields, proxy: { // Simulating Ajax. type: 'ajax', url: 'localAjaxSimulator', reader: { root: 'topics', totalProperty: 'totalCount' } } }); } var store = createStore(10); Ext.data.Store.prototype.prefetch = Ext.Function.createInterceptor(Ext.data.Store.prototype.prefetch, function(options) { if (!this.pagesRequested || !this.pagesRequested[options.page]) { logPanel.log('Prefetch rows ' + options.start + '-' + (options.start + options.limit)); } }); Ext.data.Store.prototype.onProxyPrefetch = Ext.Function.createSequence(Ext.data.Store.prototype.onProxyPrefetch, function(operation) { logPanel.log('Prefetch returned ' + operation.start + '-' + (operation.start + operation.limit)); }); Ext.data.Store.prototype.PageMap.prototype.prune = Ext.Function.createSequence(Ext.data.Store.prototype.PageMap.prototype.prune, function() { logPanel.log('Page cache contains pages ' + this.getKeys().join(',') + '
    ' + this.pageSize * this.getCount() + ' records in cache'); }); Ext.grid.PagingScroller.prototype.onViewRefresh = Ext.Function.createSequence(Ext.grid.PagingScroller.prototype.onViewRefresh, function() { var me = this, table = me.view.el.child('table', true); logPanel.log('Table moved to top: ' + table.style.top); }); var grid = Ext.create('Ext.grid.Panel', { region: 'center', title: 'Random data (' + simlet.numRecords + ' records)', store: store, loadMask: true, selModel: { pruneRemoved: false }, multiSelect: true, columns: [{ xtype: 'rownumberer', width: 50, sortable: false }] }); function makeLabel (ns, cls, name) { var docs = '../..'; //docs = '../../../.build/sdk'; // for development/testing return '' + cls + ' ' + name + ''; } var logPanel = new Ext.Panel({ title: 'Log', region: 'center', autoScroll: true, log: function(m) { logPanel.body.createChild({ html: m }); logPanel.body.dom.scrollTop = 1000000; }, tbar: [{ text: 'Clear', handler: function() { logPanel.body.update(''); } }] }); var controls = Ext.create('Ext.form.Panel', { region: 'north', split: true, height: 345, minHeight: 345, bodyPadding: 5, layout: 'form', defaults: { labelWidth: 190 }, items: [{ xtype: 'numberfield', fieldLabel: 'Ajax latency (ms)', itemId: 'latency', value: 1000, maxValue: 5000 }, { xtype: 'numberfield', fieldLabel: 'Dataset row count', itemId: 'rowCount', value: 50000, minValue: 200 }, { xtype: 'numberfield', fieldLabel: makeLabel('Ext.data', 'Store', 'pageSize'), itemId: 'pageSize', value: 150 }, { xtype: 'numberfield', fieldLabel: makeLabel('Ext.data', 'Store', 'trailingBufferZone'), itemId: 'storeTrailingBufferZone', value: Ext.data.Store.prototype.trailingBufferZone }, { xtype: 'numberfield', fieldLabel: makeLabel('Ext.data', 'Store', 'leadingBufferZone'), itemId: 'storeLeadingBufferZone', value: Ext.data.Store.prototype.leadingBufferZone }, { xtype: 'numberfield', fieldLabel: makeLabel('Ext.grid', 'PagingScroller', 'numFromEdge'), itemId: 'scrollerNumFromEdge', value: Ext.grid.PagingScroller.prototype.numFromEdge, maxValue: 20 }, { xtype: 'numberfield', fieldLabel: makeLabel('Ext.grid', 'PagingScroller', 'trailingBufferZone'), itemId: 'scrollerTrailingBufferZone', value: Ext.grid.PagingScroller.prototype.trailingBufferZone, maxValue: 100 }, { xtype: 'numberfield', fieldLabel: makeLabel('Ext.grid', 'PagingScroller', 'leadingBufferZone'), itemId: 'scrollerLeadingBufferZone', value: Ext.grid.PagingScroller.prototype.leadingBufferZone, maxValue: 100 }, { xtype: 'numberfield', fieldLabel: 'Num columns', itemId: 'numFields', value: 10, minValue: 1 }, { xtype: 'numberfield', fieldLabel: makeLabel('Ext.data', 'Store', 'purgePageCount'), itemId: 'purgePageCount', value: Ext.data.Store.prototype.purgePageCount, minValue: 0 }, { xtype: 'numberfield', fieldLabel: makeLabel('Ext.grid', 'PagingScroller', 'scrollToLoadBuffer'), itemId: 'scrollToLoadBuffer', value: Ext.grid.PagingScroller.prototype.scrollToLoadBuffer, minValue: 0, maxValue: 1000, listeners: { change: function(f, newVal, oldVal) { grid.verticalScroller.scrollToLoadBuffer = newVal; } } }], tbar: [{ text: 'Reload', handler: initializeGrid }] }); function initializeGrid () { var numFields = controls.down('#numFields').getValue(), columns = [{ xtype: 'rownumberer', width: 50, sortable: false }], i, oldStore = store; store.removeAll(); store.pageMap.clear(); logPanel.body.update(''); for (i = 0; i < numFields; ++i) { columns.push({ text: 'Field ' + (i+1), dataIndex: 'field' + i }); } simlet.numRecords = controls.down('#rowCount').getValue(); store = createStore(numFields); store.pageSize = controls.down('#pageSize').getValue(); store.trailingBufferZone = controls.down('#storeTrailingBufferZone').getValue(); store.leadingBufferZone = controls.down('#storeLeadingBufferZone').getValue(); store.pageMap.maxSize = store.purgePageCount = controls.down('#purgePageCount').getValue(); grid.verticalScroller.numFromEdge = controls.down('#scrollerNumFromEdge').getValue(); grid.verticalScroller.trailingBufferZone = controls.down('#scrollerTrailingBufferZone').getValue(); grid.verticalScroller.leadingBufferZone = controls.down('#scrollerLeadingBufferZone').getValue(); Ext.ux.ajax.SimManager.delay = controls.down('#latency').getValue(); grid.setTitle('Random data (' + simlet.numRecords + ' records)'); var start = new Date().getTime(); grid.reconfigure(store, columns); logPanel.log(simlet.numRecords + ' rows x ' + numFields + ' columns in ' + (new Date().getTime() - start) + 'ms'); // Load the first page. It will be diverted through the prefetch buffer. store.loadPage(1); oldStore.destroy(); } new Ext.Viewport({ layout: { type: 'border', padding: 5 }, items: [ { border: false, listeners: { render: function(p) { Ext.EventManager.idleEvent.addListener(function() { p.header.removeCls('x-docked-noborder-left x-docked-noborder-right x-docked-noborder-top'); p.updateLayout({isRoot:true}); }, null, {single: true}); }, single: true }, title: 'Configuration', collapsible: true, layout: 'border', region: 'west', bodyBorder: false, width: 270, split: true, minWidth: 270, items: [ controls, logPanel ] }, grid ] }) });