]>
Commit | Line | Data |
---|---|---|
6527f429 DM |
1 | /**\r |
2 | */\r | |
3 | Ext.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 | }); |