var-height-rows.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. Ext.Loader.setConfig({enabled: true});
  2. Ext.Loader.setPath('Ext.ux', '../ux/');
  3. Ext.require([
  4. 'Ext.grid.*',
  5. 'Ext.data.*',
  6. 'Ext.util.*',
  7. 'Ext.grid.PagingScroller'
  8. ]);
  9. Ext.define('Employee', {
  10. extend: 'Ext.data.Model',
  11. fields: [
  12. {name: 'rating', type: 'int'},
  13. {name: 'salary', type: 'float'},
  14. {name: 'name'},
  15. 'rowHeight'
  16. ]
  17. });
  18. Ext.onReady(function(){
  19. /**
  20. * Returns an array of fake data
  21. * @param {Number} count The number of fake rows to create data for
  22. * @return {Array} The fake record data, suitable for usage with an ArrayReader
  23. */
  24. function createFakeData(count) {
  25. var firstNames = ['Ed', 'Tommy', 'Aaron', 'Abe', 'Jamie', 'Adam', 'Dave', 'David', 'Jay', 'Nicolas', 'Nige'],
  26. lastNames = ['Spencer', 'Maintz', 'Conran', 'Elias', 'Avins', 'Mishcon', 'Kaneda', 'Davis', 'Robinson', 'Ferrero', 'White'],
  27. ratings = [1, 2, 3, 4, 5],
  28. salaries = [100, 400, 900, 1500, 1000000];
  29. var data = [];
  30. for (var i = 0; i < (count || 25); i++) {
  31. var ratingId = Math.floor(Math.random() * ratings.length),
  32. salaryId = Math.floor(Math.random() * salaries.length),
  33. firstNameId = Math.floor(Math.random() * firstNames.length),
  34. lastNameId = Math.floor(Math.random() * lastNames.length),
  35. rating = ratings[ratingId],
  36. salary = salaries[salaryId],
  37. name = Ext.String.format("{0} {1}", firstNames[firstNameId], lastNames[lastNameId]);
  38. data.push({
  39. rating: rating,
  40. salary: salary,
  41. name: name,
  42. rowHeight: (i == count - 1) ? 150 : Ext.Number.randomInt(21, 50)
  43. });
  44. }
  45. return data;
  46. }
  47. // create the Data Store
  48. var store = Ext.create('Ext.data.Store', {
  49. id: 'store',
  50. pageSize: 50000,
  51. // allow the grid to interact with the paging scroller by buffering
  52. buffered: true,
  53. // never purge any data, we prefetch all up front
  54. purgePageCount: 0,
  55. model: 'Employee',
  56. proxy: {
  57. type: 'memory'
  58. }
  59. });
  60. var grid = Ext.create('Ext.grid.Panel', {
  61. width: 700,
  62. height: 500,
  63. title: 'Bufffered Grid of 50,000 random records',
  64. store: store,
  65. verticalScroller: {
  66. variableRowHeight: true
  67. },
  68. loadMask: true,
  69. selModel: {
  70. pruneRemoved: false,
  71. selectionMode: 'MULTI'
  72. },
  73. viewConfig: {
  74. trackOver: false
  75. },
  76. // grid columns
  77. columns:[{
  78. xtype: 'rownumberer',
  79. width: 40,
  80. sortable: false,
  81. xhooks: {
  82. renderer: function(v, meta, record) {
  83. meta.tdAttr = 'style="vertical-align:center;height:' + record.data.rowHeight + 'px"';
  84. return this.callParent(arguments);
  85. }
  86. }
  87. },{
  88. text: 'Name',
  89. flex:1 ,
  90. sortable: true,
  91. dataIndex: 'name'
  92. },{
  93. text: 'Rating',
  94. width: 125,
  95. sortable: true,
  96. dataIndex: 'rating'
  97. },{
  98. text: 'Salary',
  99. width: 125,
  100. sortable: true,
  101. dataIndex: 'salary',
  102. align: 'right',
  103. renderer: Ext.util.Format.usMoney
  104. }],
  105. renderTo: Ext.getBody()
  106. });
  107. var data = createFakeData(49679),
  108. ln = data.length,
  109. records = [],
  110. i = 0;
  111. for (; i < ln; i++) {
  112. records.push(Ext.create('Employee', data[i]));
  113. }
  114. // Load data as a single, 50000 record page, only render 50 rows.
  115. store.cachePage(records, 1);
  116. store.guaranteeRange(0, 49);
  117. });