Paging.js 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. Ext.define('uas.override.toolbar.Paging', {
  2. override: 'Ext.toolbar.Paging',
  3. // 行信息
  4. selectionText: 'selected {0} rows / total {1} rows',
  5. // 可选分页大小
  6. pageSizeList: [10, 20, 50, 100, 200, 500, 1000, 3000, 10000],
  7. sizeText: 'display per page',
  8. sizeItemWidth: 100,
  9. defaultPageSize: 20,
  10. getPagingItems: function() {
  11. var me = this,
  12. inputListeners = {
  13. scope: me,
  14. blur: me.onPagingBlur
  15. };
  16. inputListeners[Ext.supports.SpecialKeyDownRepeat ? 'keydown' : 'keypress'] = me.onPagingKeyDown,
  17. pageSizeListeners = {
  18. scope: me,
  19. blur: me.onPageSizeChange,
  20. select: me.onPageSizeChange,
  21. specialkey: me.onPageSizeKey
  22. };
  23. var pageSizeStore = {
  24. fields: ['display', 'value'],
  25. data: me.pageSizeList.map(function(i){
  26. return {
  27. display: String(i),
  28. value: i
  29. }
  30. })
  31. };
  32. return [
  33. {
  34. itemId: 'first',
  35. tooltip: me.firstText,
  36. overflowText: me.firstText,
  37. iconCls: Ext.baseCSSPrefix + 'tbar-page-first',
  38. disabled: true,
  39. handler: me.moveFirst,
  40. scope: me
  41. },
  42. {
  43. itemId: 'prev',
  44. tooltip: me.prevText,
  45. overflowText: me.prevText,
  46. iconCls: Ext.baseCSSPrefix + 'tbar-page-prev',
  47. disabled: true,
  48. handler: me.movePrevious,
  49. scope: me
  50. },
  51. '-',
  52. me.beforePageText,
  53. {
  54. xtype: 'numberfield',
  55. itemId: 'inputItem',
  56. name: 'inputItem',
  57. cls: Ext.baseCSSPrefix + 'tbar-page-number',
  58. allowDecimals: false,
  59. minValue: 1,
  60. hideTrigger: true,
  61. enableKeyEvents: true,
  62. keyNavEnabled: false,
  63. selectOnFocus: true,
  64. submitValue: false,
  65. // mark it as not a field so the form will not catch it when getting fields
  66. isFormField: false,
  67. width: me.inputItemWidth,
  68. margin: '-1 2 3 2',
  69. listeners: inputListeners
  70. },
  71. {
  72. xtype: 'tbtext',
  73. itemId: 'afterTextItem',
  74. html: Ext.String.format(me.afterPageText, 1)
  75. },
  76. '-',
  77. {
  78. itemId: 'next',
  79. tooltip: me.nextText,
  80. overflowText: me.nextText,
  81. iconCls: Ext.baseCSSPrefix + 'tbar-page-next',
  82. disabled: true,
  83. handler: me.moveNext,
  84. scope: me
  85. },
  86. {
  87. itemId: 'last',
  88. tooltip: me.lastText,
  89. overflowText: me.lastText,
  90. iconCls: Ext.baseCSSPrefix + 'tbar-page-last',
  91. disabled: true,
  92. handler: me.moveLast,
  93. scope: me
  94. },
  95. '-',
  96. {
  97. xtype: 'tbtext',
  98. itemId: 'selectionTextItem',
  99. html: Ext.String.format(me.selectionText, 0, 0)
  100. },
  101. '-',
  102. me.sizeText,
  103. {
  104. xtype: 'combobox',
  105. itemId: 'sizeItem',
  106. name: 'sizeItem',
  107. cls: Ext.baseCSSPrefix + 'tbar-page-size',
  108. value: me.defaultPageSize,
  109. store: pageSizeStore,
  110. displayField: 'display',
  111. valueField: 'value',
  112. enableKeyEvents: true,
  113. keyNavEnabled: false,
  114. submitValue: false,
  115. isFormField: false,
  116. width: me.sizeItemWidth,
  117. margin: '-1 2 3 2',
  118. listeners: pageSizeListeners
  119. },
  120. {
  121. itemId: 'refresh',
  122. tooltip: me.refreshText,
  123. overflowText: me.refreshText,
  124. iconCls: Ext.baseCSSPrefix + 'tbar-loading',
  125. disabled: me.store.isLoading(),
  126. handler: me.doRefresh,
  127. scope: me
  128. }
  129. ];
  130. },
  131. /**
  132. * @private
  133. */
  134. onLoad: function() {
  135. var me = this,
  136. pageData, currPage, pageCount, afterText, selectionText, selectedCount, count, isEmpty, item;
  137. count = me.store.getCount();
  138. isEmpty = count === 0;
  139. if (!isEmpty) {
  140. pageData = me.getPageData();
  141. currPage = pageData.currentPage;
  142. pageCount = pageData.pageCount;
  143. // Check for invalid current page.
  144. if (currPage > pageCount) {
  145. // If the surrent page is beyond the loaded end,
  146. // jump back to the loaded end if there is a valid page count.
  147. if (pageCount > 0) {
  148. me.store.loadPage(pageCount);
  149. } else // If no pages, reset the page field.
  150. {
  151. me.getInputItem().reset();
  152. }
  153. return;
  154. }
  155. afterText = Ext.String.format(me.afterPageText, isNaN(pageCount) ? 1 : pageCount);
  156. } else {
  157. currPage = 0;
  158. pageCount = 0;
  159. afterText = Ext.String.format(me.afterPageText, 0);
  160. }
  161. Ext.suspendLayouts();
  162. item = me.child('#afterTextItem');
  163. if (item) {
  164. item.update(afterText);
  165. }
  166. item = me.getInputItem();
  167. if (item) {
  168. item.setDisabled(isEmpty).setValue(currPage);
  169. }
  170. item = me.child('#selectionTextItem');
  171. if (item) {
  172. selectedCount = me.ownerCt.getSelectionModel().getSelected().length;
  173. selectionText = Ext.String.format(me.selectionText, selectedCount, count);
  174. item.update(selectionText);
  175. }
  176. me.setChildDisabled('#first', currPage === 1 || isEmpty);
  177. me.setChildDisabled('#prev', currPage === 1 || isEmpty);
  178. me.setChildDisabled('#next', currPage === pageCount || isEmpty);
  179. me.setChildDisabled('#last', currPage === pageCount || isEmpty);
  180. me.setChildDisabled('#refresh', false);
  181. me.updateInfo();
  182. Ext.resumeLayouts(true);
  183. if (!me.calledInternal) {
  184. me.fireEvent('change', me, pageData || me.emptyPageData);
  185. }
  186. },
  187. getStoreListeners: function() {
  188. return {
  189. beforeload: this.beforeLoad,
  190. load: this.onLoad,
  191. refresh: this.onLoad,
  192. exception: this.onLoadError
  193. };
  194. },
  195. afterRender: function() {
  196. var me = this;
  197. me.callParent();
  198. me.ownerCt.on('selectionchange', me.onSelectionChange, me);
  199. },
  200. onSelectionChange: function(selModel, selected) {
  201. var me = this,
  202. count = me.store.getCount(),
  203. selectedCount = selected.length,
  204. selectionText;
  205. var item = me.child('#selectionTextItem');
  206. if (item) {
  207. selectionText = Ext.String.format(me.selectionText, selectedCount, count);
  208. item.update(selectionText);
  209. }
  210. },
  211. onPageSizeChange: function(field) {
  212. var me = this,
  213. pageSize = field.getValue(),
  214. oldValue = me.store.pageSize || me.defaultPageSize;
  215. if (!pageSize) {
  216. field.setValue(pageSize);
  217. } else if (pageSize != oldValue) {
  218. me.store.pageSize = pageSize;
  219. me.moveFirst();
  220. }
  221. },
  222. onPageSizeKey: function(field, e) {
  223. if (e.getKey() == e.ENTER) {
  224. this.onPageSizeChange(field);
  225. }
  226. },
  227. moveFirst: function() {
  228. this.loadPage(1);
  229. },
  230. movePrevious: function() {
  231. var me = this,
  232. store = me.store,
  233. prev = store.currentPage - 1;
  234. if (prev > 0) {
  235. me.loadPage(prev);
  236. }
  237. },
  238. moveNext: function() {
  239. var me = this,
  240. store = me.store,
  241. total = me.getPageData().pageCount,
  242. next = store.currentPage + 1;
  243. if (next <= total) {
  244. me.loadPage(next);
  245. }
  246. },
  247. moveLast: function() {
  248. var me = this,
  249. last = me.getPageData().pageCount;
  250. me.loadPage(last);
  251. },
  252. doRefresh: function() {
  253. var me = this,
  254. store = me.store,
  255. current = store.currentPage;
  256. me.loadPage(current);
  257. },
  258. loadPage: function(page) {
  259. var me = this, grid = me.ownerCt, store = me.store;
  260. grid.fireEvent('paging', grid, {
  261. currentPage: page,
  262. pageSize: store.pageSize
  263. });
  264. }
  265. });