]> git.proxmox.com Git - extjs.git/blame - extjs/modern/modern/src/grid/plugin/PagingToolbar.js
add extjs 6.0.1 sources
[extjs.git] / extjs / modern / modern / src / grid / plugin / PagingToolbar.js
CommitLineData
6527f429
DM
1/**\r
2 */\r
3Ext.define('Ext.grid.plugin.PagingToolbar', {\r
4 extend: 'Ext.Component',\r
5 alias: 'plugin.gridpagingtoolbar',\r
6 mixins: ['Ext.mixin.Hookable'],\r
7\r
8 requires: [\r
9 'Ext.Toolbar'\r
10 ],\r
11\r
12 config: {\r
13 grid: null,\r
14\r
15 currentPage: 1,\r
16 totalPages: 0,\r
17 pageSize: 0,\r
18 totalCount: 0,\r
19\r
20 toolbar: {\r
21 xtype: 'toolbar',\r
22 docked: 'bottom',\r
23 ui: 'gray',\r
24 cls: Ext.baseCSSPrefix + 'grid-pagingtoolbar',\r
25 items: [{\r
26 xtype: 'button',\r
27 ui: 'plain',\r
28 iconCls: Ext.baseCSSPrefix + 'grid-pagingtoolbar-prev',\r
29 action: 'previouspage'\r
30 }, {\r
31 xtype: 'component',\r
32 role: 'currentpage',\r
33 width: 20,\r
34 cls: Ext.baseCSSPrefix + 'grid-pagingtoolbar-currentpage'\r
35 }, {\r
36 xtype: 'component',\r
37 role: 'totalpages',\r
38 width: 50,\r
39 tpl: ' / {totalPages}'\r
40 }, {\r
41 xtype: 'singlesliderfield',\r
42 value: 1,\r
43 flex: 1,\r
44 minValue: 1,\r
45 role: 'pageslider'\r
46 }, {\r
47 xtype: 'button',\r
48 ui: 'plain',\r
49 iconCls: Ext.baseCSSPrefix + 'grid-pagingtoolbar-next',\r
50 action: 'nextpage'\r
51 }]\r
52 }\r
53 },\r
54\r
55 init: function(grid) {\r
56 var me = this;\r
57\r
58 me.setGrid(grid);\r
59 grid.container.add(me.getToolbar());\r
60 if (grid.getStore().getCount()) {\r
61 me.updatePageInfo(me.getCurrentPage());\r
62 }\r
63 },\r
64\r
65 updateGrid: function(grid, oldGrid) {\r
66 var me = this;\r
67\r
68 if (oldGrid) {\r
69 oldGrid.un({\r
70 updatevisiblecount: 'onUpdateVisibleCount',\r
71 scope: me\r
72 });\r
73\r
74 oldGrid.getStore().un({\r
75 add: 'onTotalCountChange',\r
76 remove: 'onTotalCountChange',\r
77 refresh: 'onTotalCountChange',\r
78 scope: me\r
79 });\r
80\r
81 me.unbindHook(grid, 'onScrollBinder', 'checkPageChange');\r
82 }\r
83\r
84 if (grid) {\r
85 grid.on({\r
86 updatevisiblecount: 'onUpdateVisibleCount',\r
87 scope: me\r
88 });\r
89\r
90 grid.getStore().on({\r
91 add: 'onTotalCountChange',\r
92 remove: 'onTotalCountChange',\r
93 refresh: 'onTotalCountChange',\r
94 clear: 'onTotalCountChange',\r
95 scope: me\r
96 });\r
97\r
98 me.bindHook(grid, 'onScrollBinder', 'checkPageChange');\r
99 }\r
100 },\r
101\r
102 checkPageChange: function() {\r
103 var me = this,\r
104 grid = me.getGrid(),\r
105 pageSize = me.getPageSize(),\r
106 currentPage = me.getCurrentPage(),\r
107 totalCount = me.getTotalCount(),\r
108 topVisibleIndex = grid.topVisibleIndex,\r
109 newPage = Math.floor(grid.topVisibleIndex / pageSize) + 1;\r
110\r
111 if (topVisibleIndex && newPage !== currentPage) {\r
112 me.preventGridScroll = true;\r
113 me.setCurrentPage(newPage);\r
114 me.preventGridScroll = false;\r
115 }\r
116 },\r
117\r
118 applyToolbar: function(toolbar) {\r
119 if (toolbar && !toolbar.isComponent) {\r
120 toolbar = Ext.factory(toolbar, Ext.Toolbar);\r
121 }\r
122\r
123 return toolbar;\r
124 },\r
125\r
126 updateToolbar: function(toolbar) {\r
127 var me = this;\r
128\r
129 if (toolbar) {\r
130 me.currentPage = toolbar.down('component[role=currentpage]');\r
131 me.totalPages = toolbar.down('component[role=totalpages]');\r
132 me.pageSlider = toolbar.down('sliderfield[role=pageslider]');\r
133\r
134 me.nextPageButton = toolbar.down('button[action=nextpage]');\r
135 me.previousPageButton = toolbar.down('button[action=previouspage]');\r
136\r
137 me.pageSlider.on({\r
138 change: 'onPageChange',\r
139 drag: 'onPageSliderDrag',\r
140 scope: me\r
141 });\r
142\r
143 me.nextPageButton.on({\r
144 tap: 'onNextPageTap',\r
145 scope: me\r
146 });\r
147\r
148 me.previousPageButton.on({\r
149 tap: 'onPreviousPageTap',\r
150 scope: me\r
151 });\r
152\r
153 me.currentPage.element.createChild({\r
154 tag: 'span'\r
155 });\r
156 }\r
157 },\r
158\r
159 onPageChange: function(field, value) {\r
160 this.setCurrentPage(value);\r
161 },\r
162\r
163 onPageSliderDrag: function(field, slider, value) {\r
164 this.setCurrentPage(value);\r
165 },\r
166\r
167 onNextPageTap: function() {\r
168 var nextPage = this.getCurrentPage() + 1;\r
169 if (nextPage <= this.getTotalPages()) {\r
170 this.setCurrentPage(nextPage);\r
171 }\r
172 },\r
173\r
174 onPreviousPageTap: function() {\r
175 var previousPage = this.getCurrentPage() - 1;\r
176 if (previousPage > 0) {\r
177 this.setCurrentPage(previousPage);\r
178 }\r
179 },\r
180\r
181 onTotalCountChange: function(store) {\r
182 this.setTotalCount(store.getCount());\r
183 },\r
184\r
185 onUpdateVisibleCount: function(grid, visibleCount) {\r
186 visibleCount -= 1;\r
187\r
188 var store = grid.getStore(),\r
189 totalCount = store.getCount(),\r
190 totalPages = Math.ceil(totalCount / visibleCount);\r
191\r
192 this.setTotalPages(totalPages);\r
193 this.setPageSize(visibleCount);\r
194 },\r
195\r
196 updateTotalPages: function(totalPages) {\r
197 var me = this;\r
198\r
199 // Ensure the references are set\r
200 me.getToolbar();\r
201\r
202 me.totalPages.setData({\r
203 totalPages: totalPages\r
204 });\r
205\r
206 me.pageSlider.setMaxValue(totalPages || 1);\r
207\r
208 me.updatePageInfo(me.getCurrentPage());\r
209 },\r
210\r
211 updateCurrentPage: function(currentPage) {\r
212 this.updatePageInfo(currentPage);\r
213 },\r
214\r
215 updateTotalCount: function(totalCount) {\r
216 var totalPages;\r
217\r
218 if (totalCount !== null && totalCount !== undefined) {\r
219 if (totalCount === 0) {\r
220 totalPages = 1;\r
221 } else {\r
222 totalPages = Math.ceil(totalCount / this.getPageSize());\r
223 }\r
224 this.setTotalPages(totalPages);\r
225 }\r
226 },\r
227\r
228 updatePageButtons: function() {\r
229 var me = this,\r
230 currentPage = me.getCurrentPage();\r
231\r
232 me.previousPageButton.setDisabled(currentPage === me.getTotalPages());\r
233 me.nextPageButton.enable(currentPage === 1);\r
234 },\r
235\r
236 getPageTopRecord: function(page) {\r
237 var grid = this.getGrid(),\r
238 store = grid && grid.getStore(),\r
239 pageSize = this.getPageSize(),\r
240 pageTopRecordIndex = (page - 1) * pageSize,\r
241 pageTopRecord = store && store.getAt(pageTopRecordIndex);\r
242\r
243 return pageTopRecord;\r
244 },\r
245\r
246 privates: {\r
247 updatePageInfo: function(currentPage) {\r
248 var me = this,\r
249 grid = me.getGrid(),\r
250 pageTopRecord;\r
251\r
252 // Ensure the references are set\r
253 me.getToolbar();\r
254\r
255 // TODO: Calling setHtml causes a performance issue while live scrolling,\r
256 // this might be worth looking into.\r
257 me.currentPage.element.dom.lastChild.innerHTML = currentPage;\r
258\r
259 me.pageSlider.setValue(currentPage);\r
260\r
261 pageTopRecord = me.getPageTopRecord(currentPage);\r
262 if (grid && !me.preventGridScroll && pageTopRecord) {\r
263 grid.scrollToRecord(pageTopRecord);\r
264 }\r
265\r
266 me.updatePageButtons();\r
267 }\r
268 }\r
269});