groupgrid.js 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  1. Ext.require(['Ext.data.*', 'Ext.grid.*']);
  2. Ext.onReady(function() {
  3. // wrapped in closure to prevent global vars.
  4. Ext.define('Restaurant', {
  5. extend: 'Ext.data.Model',
  6. fields: ['name', 'cuisine']
  7. });
  8. var restaurants = Ext.create('Ext.data.Store', {
  9. storeId: 'restaraunts',
  10. model: 'Restaurant',
  11. groupField: 'cuisine',
  12. sorters: ['cuisine','name'],
  13. data: [{
  14. name: 'Cheesecake Factory',
  15. cuisine: 'American'
  16. },{
  17. name: 'University Cafe',
  18. cuisine: 'American'
  19. },{
  20. name: 'Slider Bar',
  21. cuisine: 'American'
  22. },{
  23. name: 'Shokolaat',
  24. cuisine: 'American'
  25. },{
  26. name: 'Gordon Biersch',
  27. cuisine: 'American'
  28. },{
  29. name: 'Crepevine',
  30. cuisine: 'American'
  31. },{
  32. name: 'Creamery',
  33. cuisine: 'American'
  34. },{
  35. name: 'Old Pro',
  36. cuisine: 'American'
  37. },{
  38. name: 'Nola\'s',
  39. cuisine: 'Cajun'
  40. },{
  41. name: 'House of Bagels',
  42. cuisine: 'Bagels'
  43. },{
  44. name: 'The Prolific Oven',
  45. cuisine: 'Sandwiches'
  46. },{
  47. name: 'La Strada',
  48. cuisine: 'Italian'
  49. },{
  50. name: 'Buca di Beppo',
  51. cuisine: 'Italian'
  52. },{
  53. name: 'Pasta?',
  54. cuisine: 'Italian'
  55. },{
  56. name: 'Madame Tam',
  57. cuisine: 'Asian'
  58. },{
  59. name: 'Sprout Cafe',
  60. cuisine: 'Salad'
  61. },{
  62. name: 'Pluto\'s',
  63. cuisine: 'Salad'
  64. },{
  65. name: 'Junoon',
  66. cuisine: 'Indian'
  67. },{
  68. name: 'Bistro Maxine',
  69. cuisine: 'French'
  70. },{
  71. name: 'Three Seasons',
  72. cuisine: 'Vietnamese'
  73. },{
  74. name: 'Sancho\'s Taquira',
  75. cuisine: 'Mexican'
  76. },{
  77. name: 'Reposado',
  78. cuisine: 'Mexican'
  79. },{
  80. name: 'Siam Royal',
  81. cuisine: 'Thai'
  82. },{
  83. name: 'Krung Siam',
  84. cuisine: 'Thai'
  85. },{
  86. name: 'Thaiphoon',
  87. cuisine: 'Thai'
  88. },{
  89. name: 'Tamarine',
  90. cuisine: 'Vietnamese'
  91. },{
  92. name: 'Joya',
  93. cuisine: 'Tapas'
  94. },{
  95. name: 'Jing Jing',
  96. cuisine: 'Chinese'
  97. },{
  98. name: 'Patxi\'s Pizza',
  99. cuisine: 'Pizza'
  100. },{
  101. name: 'Evvia Estiatorio',
  102. cuisine: 'Mediterranean'
  103. },{
  104. name: 'Cafe 220',
  105. cuisine: 'Mediterranean'
  106. },{
  107. name: 'Cafe Renaissance',
  108. cuisine: 'Mediterranean'
  109. },{
  110. name: 'Kan Zeman',
  111. cuisine: 'Mediterranean'
  112. },{
  113. name: 'Gyros-Gyros',
  114. cuisine: 'Mediterranean'
  115. },{
  116. name: 'Mango Caribbean Cafe',
  117. cuisine: 'Caribbean'
  118. },{
  119. name: 'Coconuts Caribbean Restaurant & Bar',
  120. cuisine: 'Caribbean'
  121. },{
  122. name: 'Rose & Crown',
  123. cuisine: 'English'
  124. },{
  125. name: 'Baklava',
  126. cuisine: 'Mediterranean'
  127. },{
  128. name: 'Mandarin Gourmet',
  129. cuisine: 'Chinese'
  130. },{
  131. name: 'Bangkok Cuisine',
  132. cuisine: 'Thai'
  133. },{
  134. name: 'Darbar Indian Cuisine',
  135. cuisine: 'Indian'
  136. },{
  137. name: 'Mantra',
  138. cuisine: 'Indian'
  139. },{
  140. name: 'Janta',
  141. cuisine: 'Indian'
  142. },{
  143. name: 'Hyderabad House',
  144. cuisine: 'Indian'
  145. },{
  146. name: 'Starbucks',
  147. cuisine: 'Coffee'
  148. },{
  149. name: 'Peet\'s Coffee',
  150. cuisine: 'Coffee'
  151. },{
  152. name: 'Coupa Cafe',
  153. cuisine: 'Coffee'
  154. },{
  155. name: 'Lytton Coffee Company',
  156. cuisine: 'Coffee'
  157. },{
  158. name: 'Il Fornaio',
  159. cuisine: 'Italian'
  160. },{
  161. name: 'Lavanda',
  162. cuisine: 'Mediterranean'
  163. },{
  164. name: 'MacArthur Park',
  165. cuisine: 'American'
  166. },{
  167. name: 'St Michael\'s Alley',
  168. cuisine: 'Californian'
  169. },{
  170. name: 'Osteria',
  171. cuisine: 'Italian'
  172. },{
  173. name: 'Vero',
  174. cuisine: 'Italian'
  175. },{
  176. name: 'Cafe Renzo',
  177. cuisine: 'Italian'
  178. },{
  179. name: 'Miyake',
  180. cuisine: 'Sushi'
  181. },{
  182. name: 'Sushi Tomo',
  183. cuisine: 'Sushi'
  184. },{
  185. name: 'Kanpai',
  186. cuisine: 'Sushi'
  187. },{
  188. name: 'Pizza My Heart',
  189. cuisine: 'Pizza'
  190. },{
  191. name: 'New York Pizza',
  192. cuisine: 'Pizza'
  193. },{
  194. name: 'California Pizza Kitchen',
  195. cuisine: 'Pizza'
  196. },{
  197. name: 'Round Table',
  198. cuisine: 'Pizza'
  199. },{
  200. name: 'Loving Hut',
  201. cuisine: 'Vegan'
  202. },{
  203. name: 'Garden Fresh',
  204. cuisine: 'Vegan'
  205. },{
  206. name: 'Cafe Epi',
  207. cuisine: 'French'
  208. },{
  209. name: 'Tai Pan',
  210. cuisine: 'Chinese'
  211. }],
  212. listeners: {
  213. groupchange: function(store, groupers) {
  214. var grouped = restaurants.isGrouped(),
  215. groupBy = groupers.items[0] ? groupers.items[0].property : '',
  216. toggleMenuItems, len, i = 0;
  217. // Clear grouping button only valid if the store is grouped
  218. grid.down('[text=Clear Grouping]').setDisabled(!grouped);
  219. // Sync state of group toggle checkboxes
  220. if (grouped && groupBy === 'cuisine') {
  221. toggleMenuItems = grid.down('button[text=Toggle groups...]').menu.items.items;
  222. for (len = toggleMenuItems.length; i < len; i++) {
  223. toggleMenuItems[i].setChecked(groupingFeature.isExpanded(toggleMenuItems[i].text));
  224. }
  225. grid.down('[text=Toggle groups...]').enable();
  226. } else {
  227. grid.down('[text=Toggle groups...]').disable();
  228. }
  229. }
  230. }
  231. });
  232. var groupingFeature = Ext.create('Ext.grid.feature.Grouping', {
  233. groupHeaderTpl: '{columnName}: {name} ({rows.length} Item{[values.rows.length > 1 ? "s" : ""]})',
  234. hideGroupedHeader: true,
  235. startCollapsed: true,
  236. id: 'restaurantGrouping'
  237. }),
  238. groups = restaurants.getGroups(),
  239. len = groups.length, i = 0,
  240. toggleMenu = [],
  241. toggleGroup = function(item) {
  242. var groupName = item.text;
  243. if (item.checked) {
  244. groupingFeature.expand(groupName, true);
  245. } else {
  246. groupingFeature.collapse(groupName, true);
  247. }
  248. };
  249. // Create checkbox menu items to toggle associated groupd
  250. for (; i < len; i++) {
  251. toggleMenu[i] = {
  252. xtype: 'menucheckitem',
  253. text: groups[i].name,
  254. handler: toggleGroup
  255. }
  256. }
  257. var grid = Ext.create('Ext.grid.Panel', {
  258. renderTo: Ext.getBody(),
  259. collapsible: true,
  260. iconCls: 'icon-grid',
  261. frame: true,
  262. store: restaurants,
  263. width: 600,
  264. height: 400,
  265. title: 'Restaurants',
  266. resizable: true,
  267. features: [groupingFeature],
  268. tbar: ['->', {
  269. text: 'Toggle groups...',
  270. menu: toggleMenu
  271. }],
  272. // Keep checkbox menu items in sync with expand/collapse
  273. viewConfig: {
  274. listeners: {
  275. groupcollapse: function(v, n, groupName) {
  276. if (!grid.down('[text=Toggle groups...]').disabled) {
  277. grid.down('menucheckitem[text=' + groupName + ']').setChecked(false, true);
  278. }
  279. },
  280. groupexpand: function(v, n, groupName) {
  281. if (!grid.down('[text=Toggle groups...]').disabled) {
  282. grid.down('menucheckitem[text=' + groupName + ']').setChecked(true, true);
  283. }
  284. }
  285. }
  286. },
  287. columns: [{
  288. text: 'Name',
  289. flex: 1,
  290. dataIndex: 'name'
  291. },{
  292. text: 'Cuisine',
  293. flex: 1,
  294. dataIndex: 'cuisine'
  295. }],
  296. fbar : ['->', {
  297. text:'Clear Grouping',
  298. iconCls: 'icon-clear-group',
  299. handler : function() {
  300. groupingFeature.disable();
  301. }
  302. }]
  303. });
  304. });