row-editing.js 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. Ext.Loader.setConfig({
  2. enabled: true
  3. });
  4. Ext.Loader.setPath('Ext.ux', '../ux');
  5. Ext.require([
  6. 'Ext.grid.*',
  7. 'Ext.data.*',
  8. 'Ext.util.*',
  9. 'Ext.state.*',
  10. 'Ext.form.*',
  11. 'Ext.ux.CheckColumn'
  12. ]);
  13. Ext.onReady(function(){
  14. // Define our data model
  15. Ext.define('Employee', {
  16. extend: 'Ext.data.Model',
  17. fields: [
  18. 'name',
  19. 'email',
  20. { name: 'start', type: 'date', dateFormat: 'n/j/Y' },
  21. { name: 'salary', type: 'float' },
  22. { name: 'active', type: 'bool' }
  23. ]
  24. });
  25. // Generate mock employee data
  26. var data = (function() {
  27. var lasts = ['Jones', 'Smith', 'Lee', 'Wilson', 'Black', 'Williams', 'Lewis', 'Johnson', 'Foot', 'Little', 'Vee', 'Train', 'Hot', 'Mutt'],
  28. firsts = ['Fred', 'Julie', 'Bill', 'Ted', 'Jack', 'John', 'Mark', 'Mike', 'Chris', 'Bob', 'Travis', 'Kelly', 'Sara'],
  29. lastLen = lasts.length,
  30. firstLen = firsts.length,
  31. usedNames = {},
  32. data = [],
  33. s = new Date(2007, 0, 1),
  34. now = new Date(),
  35. getRandomInt = Ext.Number.randomInt,
  36. generateName = function() {
  37. var name = firsts[getRandomInt(0, firstLen - 1)] + ' ' + lasts[getRandomInt(0, lastLen - 1)];
  38. if (usedNames[name]) {
  39. return generateName();
  40. }
  41. usedNames[name] = true;
  42. return name;
  43. };
  44. while (s.getTime() < now.getTime()) {
  45. var ecount = getRandomInt(0, 3);
  46. for (var i = 0; i < ecount; i++) {
  47. var name = generateName();
  48. data.push({
  49. start : Ext.Date.add(Ext.Date.clearTime(s, true), Ext.Date.DAY, getRandomInt(0, 27)),
  50. name : name,
  51. email: name.toLowerCase().replace(' ', '.') + '@sencha-test.com',
  52. active: getRandomInt(0, 1),
  53. salary: Math.floor(getRandomInt(35000, 85000) / 1000) * 1000
  54. });
  55. }
  56. s = Ext.Date.add(s, Ext.Date.MONTH, 1);
  57. }
  58. return data;
  59. })();
  60. // create the Data Store
  61. var store = Ext.create('Ext.data.Store', {
  62. // destroy the store if the grid is destroyed
  63. autoDestroy: true,
  64. model: 'Employee',
  65. proxy: {
  66. type: 'memory'
  67. },
  68. data: data,
  69. sorters: [{
  70. property: 'start',
  71. direction: 'ASC'
  72. }]
  73. });
  74. var rowEditing = Ext.create('Ext.grid.plugin.RowEditing', {
  75. clicksToMoveEditor: 1,
  76. autoCancel: false
  77. });
  78. // create the grid and specify what field you want
  79. // to use for the editor at each column.
  80. var grid = Ext.create('Ext.grid.Panel', {
  81. store: store,
  82. columns: [{
  83. header: 'Name',
  84. dataIndex: 'name',
  85. flex: 1,
  86. editor: {
  87. // defaults to textfield if no xtype is supplied
  88. allowBlank: false
  89. }
  90. }, {
  91. header: 'Email',
  92. dataIndex: 'email',
  93. width: 160,
  94. editor: {
  95. allowBlank: false,
  96. vtype: 'email'
  97. }
  98. }, {
  99. xtype: 'datecolumn',
  100. header: 'Start Date',
  101. dataIndex: 'start',
  102. width: 90,
  103. editor: {
  104. xtype: 'datefield',
  105. allowBlank: false,
  106. format: 'm/d/Y',
  107. minValue: '01/01/2006',
  108. minText: 'Cannot have a start date before the company existed!',
  109. maxValue: Ext.Date.format(new Date(), 'm/d/Y')
  110. }
  111. }, {
  112. xtype: 'numbercolumn',
  113. header: 'Salary',
  114. dataIndex: 'salary',
  115. format: '$0,0',
  116. width: 90,
  117. editor: {
  118. xtype: 'numberfield',
  119. allowBlank: false,
  120. minValue: 1,
  121. maxValue: 150000
  122. }
  123. }, {
  124. xtype: 'checkcolumn',
  125. header: 'Active?',
  126. dataIndex: 'active',
  127. width: 60,
  128. editor: {
  129. xtype: 'checkbox',
  130. cls: 'x-grid-checkheader-editor'
  131. }
  132. }],
  133. renderTo: 'editor-grid',
  134. width: 600,
  135. height: 400,
  136. title: 'Employee Salaries',
  137. frame: true,
  138. tbar: [{
  139. text: 'Add Employee',
  140. iconCls: 'employee-add',
  141. handler : function() {
  142. rowEditing.cancelEdit();
  143. // Create a model instance
  144. var r = Ext.create('Employee', {
  145. name: 'New Guy',
  146. email: 'new@sencha-test.com',
  147. start: new Date(),
  148. salary: 50000,
  149. active: true
  150. });
  151. store.insert(0, r);
  152. rowEditing.startEdit(0, 0);
  153. }
  154. }, {
  155. itemId: 'removeEmployee',
  156. text: 'Remove Employee',
  157. iconCls: 'employee-remove',
  158. handler: function() {
  159. var sm = grid.getSelectionModel();
  160. rowEditing.cancelEdit();
  161. store.remove(sm.getSelection());
  162. if (store.getCount() > 0) {
  163. sm.select(0);
  164. }
  165. },
  166. disabled: true
  167. }],
  168. plugins: [rowEditing],
  169. listeners: {
  170. 'selectionchange': function(view, records) {
  171. grid.down('#removeEmployee').setDisabled(!records.length);
  172. }
  173. }
  174. });
  175. });