]>
Commit | Line | Data |
---|---|---|
6527f429 DM |
1 | describe("Ext.toolbar.Paging", function() {\r |
2 | var keyEvent = Ext.supports.SpecialKeyDownRepeat ? 'keydown' : 'keypress',\r | |
3 | tb, store,\r | |
4 | describeNotIE9_10 = Ext.isIE9 || Ext.isIE10 ? xdescribe : describe,\r | |
5 | synchronousLoad = true,\r | |
6 | proxyStoreLoad = Ext.data.ProxyStore.prototype.load,\r | |
7 | loadStore;\r | |
8 | \r | |
9 | function makeToolbar(cfg, preventRender) {\r | |
10 | cfg = cfg || {};\r | |
11 | if (!preventRender) {\r | |
12 | cfg.renderTo = Ext.getBody();\r | |
13 | }\r | |
14 | if (cfg.store === undefined) {\r | |
15 | cfg.store = makeStore();\r | |
16 | }\r | |
17 | tb = new Ext.toolbar.Paging(cfg);\r | |
18 | } \r | |
19 | \r | |
20 | function makeStore(pageSize) {\r | |
21 | store = new Ext.data.Store({\r | |
22 | model: 'spec.PagingToolbarModel',\r | |
23 | storeId: 'pagingToolbarStore',\r | |
24 | pageSize: pageSize || 5,\r | |
25 | proxy: {\r | |
26 | type: 'ajax',\r | |
27 | url: 'fakeUrl',\r | |
28 | reader: {\r | |
29 | type: 'json',\r | |
30 | rootProperty: 'data',\r | |
31 | totalProperty: 'total'\r | |
32 | }\r | |
33 | }\r | |
34 | });\r | |
35 | return store;\r | |
36 | }\r | |
37 | \r | |
38 | function makeData(total, start, limit) {\r | |
39 | var data = [],\r | |
40 | i;\r | |
41 | \r | |
42 | if (limit === undefined) {\r | |
43 | limit = start + store.pageSize;\r | |
44 | }\r | |
45 | \r | |
46 | for (i = start; i < limit; ++i) {\r | |
47 | data.push({\r | |
48 | name: 'Item ' + (i + 1)\r | |
49 | });\r | |
50 | }\r | |
51 | \r | |
52 | return Ext.encode({\r | |
53 | data: data,\r | |
54 | total: total\r | |
55 | });\r | |
56 | }\r | |
57 | \r | |
58 | function mockComplete(responseText, status) {\r | |
59 | Ext.Ajax.mockComplete({\r | |
60 | status: status || 200,\r | |
61 | responseText: responseText\r | |
62 | });\r | |
63 | }\r | |
64 | \r | |
65 | beforeEach(function() {\r | |
66 | // Override so that we can control asynchronous loading\r | |
67 | loadStore = Ext.data.ProxyStore.prototype.load = function() {\r | |
68 | proxyStoreLoad.apply(this, arguments);\r | |
69 | if (synchronousLoad) {\r | |
70 | this.flushLoad.apply(this, arguments);\r | |
71 | }\r | |
72 | return this;\r | |
73 | };\r | |
74 | \r | |
75 | Ext.define('spec.PagingToolbarModel', {\r | |
76 | extend: 'Ext.data.Model',\r | |
77 | fields: ['name']\r | |
78 | });\r | |
79 | MockAjaxManager.addMethods();\r | |
80 | });\r | |
81 | \r | |
82 | afterEach(function() {\r | |
83 | // Undo the overrides.\r | |
84 | Ext.data.ProxyStore.prototype.load = proxyStoreLoad;\r | |
85 | \r | |
86 | MockAjaxManager.removeMethods();\r | |
87 | Ext.destroy(tb);\r | |
88 | if (store) {\r | |
89 | store.destroy();\r | |
90 | }\r | |
91 | Ext.undefine('spec.PagingToolbarModel');\r | |
92 | Ext.data.Model.schema.clear();\r | |
93 | tb = store = null;\r | |
94 | });\r | |
95 | \r | |
96 | describe("store", function() {\r | |
97 | it("should be able to create without a store", function() {\r | |
98 | expect(function() {\r | |
99 | makeToolbar({\r | |
100 | store: null\r | |
101 | });\r | |
102 | }).not.toThrow();\r | |
103 | }); \r | |
104 | \r | |
105 | it("should accept a store instance", function() {\r | |
106 | store = makeStore();\r | |
107 | makeToolbar({\r | |
108 | store: store\r | |
109 | });\r | |
110 | expect(tb.getStore()).toBe(store);\r | |
111 | }); \r | |
112 | \r | |
113 | it("should accept a store config", function() {\r | |
114 | makeToolbar({\r | |
115 | store: {\r | |
116 | model: 'spec.PagingToolbarModel'\r | |
117 | }\r | |
118 | }); \r | |
119 | expect(tb.getStore().model).toBe(spec.PagingToolbarModel); \r | |
120 | });\r | |
121 | \r | |
122 | it("should accept a store id", function() {\r | |
123 | store = makeStore();\r | |
124 | makeToolbar({\r | |
125 | store: 'pagingToolbarStore'\r | |
126 | }); \r | |
127 | expect(tb.getStore()).toBe(store); \r | |
128 | });\r | |
129 | \r | |
130 | it("should update the toolbar info if the store is already loaded at render time", function() {\r | |
131 | store = makeStore();\r | |
132 | store.loadPage(2);\r | |
133 | mockComplete(makeData(20, 5));\r | |
134 | makeToolbar({\r | |
135 | store: store\r | |
136 | });\r | |
137 | expect(tb.down('#inputItem').getValue()).toBe(2);\r | |
138 | });\r | |
139 | \r | |
140 | it("should display the correct number of total pages", function() {\r | |
141 | store = makeStore();\r | |
142 | store.loadPage(1);\r | |
143 | mockComplete(makeData(20, 10));\r | |
144 | makeToolbar({\r | |
145 | store: store\r | |
146 | });\r | |
147 | expect(tb.down('#afterTextItem').el.dom.innerHTML).toBe('of 4');\r | |
148 | });\r | |
149 | \r | |
150 | it("should update the toolbar info when binding a new store", function() {\r | |
151 | makeToolbar();\r | |
152 | store = makeStore();\r | |
153 | store.loadPage(3);\r | |
154 | mockComplete(makeData(20, 10));\r | |
155 | tb.bindStore(store);\r | |
156 | expect(tb.down('#inputItem').getValue()).toBe(3);\r | |
157 | });\r | |
158 | });\r | |
159 | \r | |
160 | describe("child items", function() {\r | |
161 | it("should add items after the default buttons", function() {\r | |
162 | makeToolbar({\r | |
163 | items: [{\r | |
164 | xtype: 'button',\r | |
165 | itemId: 'foo'\r | |
166 | }]\r | |
167 | });\r | |
168 | expect(tb.items.last().getItemId()).toBe('foo');\r | |
169 | });\r | |
170 | \r | |
171 | it("should add items before the default buttons with prependButtons: true", function() {\r | |
172 | makeToolbar({\r | |
173 | prependButtons: true,\r | |
174 | items: [{\r | |
175 | xtype: 'button',\r | |
176 | itemId: 'foo'\r | |
177 | }]\r | |
178 | });\r | |
179 | expect(tb.items.first().getItemId()).toBe('foo');\r | |
180 | });\r | |
181 | \r | |
182 | it("should add the info display if displayInfo is true", function() {\r | |
183 | makeToolbar({\r | |
184 | displayInfo: true\r | |
185 | });\r | |
186 | var items = tb.items;\r | |
187 | expect(items.getAt(items.getCount() - 2).isXType('tbfill')).toBe(true);\r | |
188 | expect(items.last().getItemId()).toBe('displayItem');\r | |
189 | });\r | |
190 | });\r | |
191 | \r | |
192 | describe("disabling/enabling items", function() {\r | |
193 | function expectEnabled(id) {\r | |
194 | expectState(id, false);\r | |
195 | } \r | |
196 | \r | |
197 | function expectDisabled(id) {\r | |
198 | expectState(id, true);\r | |
199 | } \r | |
200 | \r | |
201 | function expectState(id, state) {\r | |
202 | expect(tb.child('#' + id).disabled).toBe(state);\r | |
203 | }\r | |
204 | \r | |
205 | it("should disable everything except refresh when the store hasn't been loaded", function() {\r | |
206 | makeToolbar();\r | |
207 | expectDisabled('first');\r | |
208 | expectDisabled('prev');\r | |
209 | expectDisabled('inputItem');\r | |
210 | expectDisabled('next');\r | |
211 | expectDisabled('last');\r | |
212 | expectEnabled('refresh');\r | |
213 | });\r | |
214 | \r | |
215 | describe("store loads before render", function() {\r | |
216 | it("should set the state if the store is loaded", function() {\r | |
217 | makeToolbar({}, true);\r | |
218 | store.load(); \r | |
219 | mockComplete(makeData(20, 0));\r | |
220 | tb.render(Ext.getBody());\r | |
221 | expectDisabled('first');\r | |
222 | expectDisabled('prev');\r | |
223 | expectEnabled('inputItem');\r | |
224 | expectEnabled('next');\r | |
225 | expectEnabled('last');\r | |
226 | expectEnabled('refresh');\r | |
227 | });\r | |
228 | });\r | |
229 | \r | |
230 | describe("store loads after render", function() {\r | |
231 | it("should set the state if the store is loaded", function() {\r | |
232 | makeToolbar();\r | |
233 | store.load(); \r | |
234 | mockComplete(makeData(20, 0));\r | |
235 | expectDisabled('first');\r | |
236 | expectDisabled('prev');\r | |
237 | expectEnabled('inputItem');\r | |
238 | expectEnabled('next');\r | |
239 | expectEnabled('last');\r | |
240 | expectEnabled('refresh');\r | |
241 | });\r | |
242 | });\r | |
243 | \r | |
244 | describe("based on current page", function() {\r | |
245 | it("should disable first/prev buttons on the first page", function() {\r | |
246 | makeToolbar();\r | |
247 | store.loadPage(1); \r | |
248 | mockComplete(makeData(20, 0));\r | |
249 | expectDisabled('first');\r | |
250 | expectDisabled('prev');\r | |
251 | expectEnabled('inputItem');\r | |
252 | expectEnabled('next');\r | |
253 | expectEnabled('last');\r | |
254 | expectEnabled('refresh');\r | |
255 | });\r | |
256 | \r | |
257 | it("should disable next/last buttons on the last page", function() {\r | |
258 | makeToolbar();\r | |
259 | store.loadPage(4); \r | |
260 | mockComplete(makeData(20, 0));\r | |
261 | expectEnabled('first');\r | |
262 | expectEnabled('prev');\r | |
263 | expectEnabled('inputItem');\r | |
264 | expectDisabled('next');\r | |
265 | expectDisabled('last');\r | |
266 | expectEnabled('refresh');\r | |
267 | });\r | |
268 | \r | |
269 | it("should enable all buttons when the page is not first or last", function() {\r | |
270 | makeToolbar();\r | |
271 | store.loadPage(2); \r | |
272 | mockComplete(makeData(20, 0));\r | |
273 | expectEnabled('first');\r | |
274 | expectEnabled('prev');\r | |
275 | expectEnabled('inputItem');\r | |
276 | expectEnabled('next');\r | |
277 | expectEnabled('last');\r | |
278 | expectEnabled('refresh');\r | |
279 | });\r | |
280 | });\r | |
281 | \r | |
282 | describe("refresh icon", function() {\r | |
283 | it("should disable the refresh icon if the store is loading during construction", function() {\r | |
284 | makeStore();\r | |
285 | store.load();\r | |
286 | makeToolbar({\r | |
287 | store: store\r | |
288 | });\r | |
289 | expectDisabled('refresh');\r | |
290 | });\r | |
291 | \r | |
292 | it("should disable the refresh icon during a load", function() {\r | |
293 | makeToolbar();\r | |
294 | store.load();\r | |
295 | expectDisabled('refresh');\r | |
296 | });\r | |
297 | });\r | |
298 | \r | |
299 | describe("empty store", function() {\r | |
300 | it("should disable the inputItem & buttons", function() {\r | |
301 | makeToolbar();\r | |
302 | store.load();\r | |
303 | mockComplete(makeData(0, 0, 0));\r | |
304 | expectDisabled('first');\r | |
305 | expectDisabled('prev');\r | |
306 | expectDisabled('inputItem');\r | |
307 | expectDisabled('next');\r | |
308 | expectDisabled('last');\r | |
309 | expectEnabled('refresh');\r | |
310 | }); \r | |
311 | });\r | |
312 | });\r | |
313 | \r | |
314 | describe("move/refresh methods", function() {\r | |
315 | var spy;\r | |
316 | beforeEach(function() {\r | |
317 | makeToolbar(); \r | |
318 | store.load();\r | |
319 | mockComplete(makeData(20, 0));\r | |
320 | spy = jasmine.createSpy();\r | |
321 | });\r | |
322 | \r | |
323 | afterEach(function() {\r | |
324 | spy = null;\r | |
325 | });\r | |
326 | \r | |
327 | describe("moveFirst", function() {\r | |
328 | it("should fire the beforechange event with the toolbar & the new page", function() {\r | |
329 | tb.on('beforechange', spy);\r | |
330 | tb.moveFirst();\r | |
331 | expect(spy.mostRecentCall.args[0]).toBe(tb);\r | |
332 | expect(spy.mostRecentCall.args[1]).toBe(1);\r | |
333 | });\r | |
334 | \r | |
335 | it("should return false if the beforechange event is vetoed", function() {\r | |
336 | tb.on('beforechange', spy.andReturn(false));\r | |
337 | expect(tb.moveFirst()).toBe(false);\r | |
338 | });\r | |
339 | \r | |
340 | it("should return true & load the store with the first page", function() {\r | |
341 | spyOn(store, 'loadPage');\r | |
342 | expect(tb.moveFirst()).toBe(true);\r | |
343 | expect(store.loadPage.mostRecentCall.args[0]).toBe(1); \r | |
344 | });\r | |
345 | });\r | |
346 | \r | |
347 | describe("movePrevious", function() {\r | |
348 | it("should fire the beforechange event with the toolbar & the new page", function() {\r | |
349 | tb.on('beforechange', spy);\r | |
350 | store.loadPage(3);\r | |
351 | mockComplete(makeData(20, 10));\r | |
352 | tb.movePrevious();\r | |
353 | expect(spy.mostRecentCall.args[0]).toBe(tb);\r | |
354 | expect(spy.mostRecentCall.args[1]).toBe(2);\r | |
355 | });\r | |
356 | \r | |
357 | it("should return false if moving to the previous page is not valid, the change event should not fire", function() {\r | |
358 | tb.on('beforechange', spy);\r | |
359 | expect(tb.movePrevious()).toBe(false);\r | |
360 | expect(spy).not.toHaveBeenCalled();\r | |
361 | });\r | |
362 | \r | |
363 | it("should return false if the beforechange event is vetoed", function() {\r | |
364 | tb.on('beforechange', spy.andReturn(false));\r | |
365 | expect(tb.movePrevious()).toBe(false);\r | |
366 | });\r | |
367 | \r | |
368 | it("should return true & load the store with the previous page", function() {\r | |
369 | spyOn(store, 'previousPage');\r | |
370 | store.loadPage(3);\r | |
371 | mockComplete(makeData(20, 10));\r | |
372 | expect(tb.movePrevious()).toBe(true);\r | |
373 | expect(store.previousPage).toHaveBeenCalled(); \r | |
374 | });\r | |
375 | });\r | |
376 | \r | |
377 | describe("moveNext", function() {\r | |
378 | it("should fire the beforechange event with the toolbar & the new page", function() {\r | |
379 | tb.on('beforechange', spy);\r | |
380 | tb.moveNext();\r | |
381 | expect(spy.mostRecentCall.args[0]).toBe(tb);\r | |
382 | expect(spy.mostRecentCall.args[1]).toBe(2);\r | |
383 | });\r | |
384 | \r | |
385 | it("should return false if moving to the next page is not valid, the change event should not fire", function() {\r | |
386 | tb.on('beforechange', spy);\r | |
387 | store.loadPage(4);\r | |
388 | mockComplete(makeData(20, 15));\r | |
389 | expect(tb.moveNext()).toBe(false);\r | |
390 | expect(spy).not.toHaveBeenCalled();\r | |
391 | });\r | |
392 | \r | |
393 | it("should return false if the beforechange event is vetoed", function() {\r | |
394 | tb.on('beforechange', spy.andReturn(false));\r | |
395 | expect(tb.moveNext()).toBe(false);\r | |
396 | });\r | |
397 | \r | |
398 | it("should return true & load the store with the next page", function() {\r | |
399 | spyOn(store, 'nextPage');\r | |
400 | expect(tb.moveNext()).toBe(true);\r | |
401 | expect(store.nextPage).toHaveBeenCalled(); \r | |
402 | });\r | |
403 | });\r | |
404 | \r | |
405 | describe("moveLast", function() {\r | |
406 | it("should fire the beforechange event with the toolbar & the new page", function() {\r | |
407 | tb.on('beforechange', spy);\r | |
408 | tb.moveLast();\r | |
409 | expect(spy.mostRecentCall.args[0]).toBe(tb);\r | |
410 | expect(spy.mostRecentCall.args[1]).toBe(4);\r | |
411 | });\r | |
412 | \r | |
413 | it("should return false if the beforechange event is vetoed", function() {\r | |
414 | tb.on('beforechange', spy.andReturn(false));\r | |
415 | expect(tb.moveLast()).toBe(false);\r | |
416 | });\r | |
417 | \r | |
418 | it("should return true & load the store with the last page", function() {\r | |
419 | spyOn(store, 'loadPage');\r | |
420 | expect(tb.moveLast()).toBe(true);\r | |
421 | expect(store.loadPage.mostRecentCall.args[0]).toBe(4); \r | |
422 | });\r | |
423 | });\r | |
424 | \r | |
425 | describe("doRefresh", function() {\r | |
426 | it("should fire the beforechange event with the toolbar & the current page", function() {\r | |
427 | tb.on('beforechange', spy);\r | |
428 | tb.doRefresh();\r | |
429 | expect(spy.mostRecentCall.args[0]).toBe(tb);\r | |
430 | expect(spy.mostRecentCall.args[1]).toBe(1);\r | |
431 | });\r | |
432 | \r | |
433 | it("should return false if the beforechange event is vetoed", function() {\r | |
434 | tb.on('beforechange', spy.andReturn(false));\r | |
435 | expect(tb.doRefresh()).toBe(false);\r | |
436 | });\r | |
437 | \r | |
438 | it("should return true & load the store with the last page", function() {\r | |
439 | spyOn(store, 'loadPage');\r | |
440 | expect(tb.doRefresh()).toBe(true);\r | |
441 | expect(store.loadPage.mostRecentCall.args[0]).toBe(1); \r | |
442 | });\r | |
443 | });\r | |
444 | });\r | |
445 | \r | |
446 | describe("change event", function() {\r | |
447 | var spy;\r | |
448 | \r | |
449 | beforeEach(function() {\r | |
450 | spy = jasmine.createSpy();\r | |
451 | });\r | |
452 | \r | |
453 | afterEach(function() {\r | |
454 | spy = null;\r | |
455 | });\r | |
456 | \r | |
457 | it("should fire the change event on load with the toolbar & pageData", function() {\r | |
458 | makeToolbar();\r | |
459 | tb.on('change', spy);\r | |
460 | store.loadPage(3);\r | |
461 | mockComplete(makeData(20, 10));\r | |
462 | expect(spy.mostRecentCall.args[0]).toBe(tb);\r | |
463 | expect(spy.mostRecentCall.args[1]).toEqual({\r | |
464 | total: 20,\r | |
465 | currentPage: 3,\r | |
466 | pageCount: 4,\r | |
467 | fromRecord: 11,\r | |
468 | toRecord: 15\r | |
469 | });\r | |
470 | }); \r | |
471 | \r | |
472 | it("should not fire if configured with an empty store", function() {\r | |
473 | makeToolbar(undefined, true);\r | |
474 | tb.on('change', spy);\r | |
475 | tb.render(Ext.getBody());\r | |
476 | expect(spy).not.toHaveBeenCalled();\r | |
477 | });\r | |
478 | \r | |
479 | it("should provide empty pageData when a store loads empty", function() {\r | |
480 | makeToolbar();\r | |
481 | tb.on('change', spy);\r | |
482 | store.load();\r | |
483 | mockComplete('[]');\r | |
484 | expect(spy.mostRecentCall.args[0]).toBe(tb);\r | |
485 | expect(spy.mostRecentCall.args[1]).toEqual({\r | |
486 | total: 0,\r | |
487 | currentPage: 0,\r | |
488 | pageCount: 0,\r | |
489 | fromRecord: 0,\r | |
490 | toRecord: 0\r | |
491 | });\r | |
492 | });\r | |
493 | });\r | |
494 | \r | |
495 | // Opera has a problem handling key specs\r | |
496 | (Ext.isOpera ? xdescribe : describe)("inputItem", function() {\r | |
497 | var TAB = 9,\r | |
498 | ENTER = 13,\r | |
499 | ESC = 27,\r | |
500 | PAGE_UP = 33,\r | |
501 | PAGE_DOWN = 34,\r | |
502 | END = 35,\r | |
503 | HOME = 36,\r | |
504 | LEFT = 37,\r | |
505 | UP = 38,\r | |
506 | RIGHT = 39,\r | |
507 | DOWN = 40;\r | |
508 | \r | |
509 | function triggerKeyEvent(key) {\r | |
510 | var dom = tb.down('#inputItem').inputEl.dom;\r | |
511 | dom.focus();\r | |
512 | jasmine.fireKeyEvent(dom, keyEvent, key);\r | |
513 | }\r | |
514 | \r | |
515 | it("should set the value to the new page on load", function() {\r | |
516 | makeToolbar();\r | |
517 | store.loadPage(3);\r | |
518 | mockComplete(makeData(20, 10));\r | |
519 | expect(tb.getInputItem().getValue()).toBe(3);\r | |
520 | });\r | |
521 | \r | |
522 | it("should set the value to the current page on blur", function() {\r | |
523 | makeToolbar();\r | |
524 | var input = tb.getInputItem();\r | |
525 | \r | |
526 | // Will auto disable if not attached to a Store. Programatically enable so that it will focus and blur.\r | |
527 | input.enable();\r | |
528 | input.focus();\r | |
529 | \r | |
530 | waitsFor(function() {\r | |
531 | return input.hasFocus;\r | |
532 | });\r | |
533 | \r | |
534 | runs(function() {\r | |
535 | input.setValue(4);\r | |
536 | input.blur();\r | |
537 | });\r | |
538 | \r | |
539 | // After the blur events gets done, it should have reverted to the current page\r | |
540 | waitsFor(function() {\r | |
541 | return input.getValue() === 1;\r | |
542 | });\r | |
543 | });\r | |
544 | \r | |
545 | describe('reconfiguring a grid using buffered rendering and grouping', function () {\r | |
546 | // This test demonstrates that the paging toolbar will update its input item when the grid\r | |
547 | // is configured in a very specific way.\r | |
548 | //\r | |
549 | // This bug only is reproducible when reconfigure is called on a grid with the buffered\r | |
550 | // renderer plugin and grouping feature. The bug was that the buffered renderer plugin\r | |
551 | // would bind the data store to the plugin rather than the group store (created when\r | |
552 | // there's a grouping feature). See Ext.grid.plugin.BufferedRenderer:bindStore().\r | |
553 | //\r | |
554 | // See EXTJSIV-11860 and EXTJSIV-11892.\r | |
555 | var grid;\r | |
556 | \r | |
557 | afterEach(function () {\r | |
558 | grid.destroy();\r | |
559 | grid = null;\r | |
560 | });\r | |
561 | \r | |
562 | it('should update the input item when paging', function () {\r | |
563 | grid = Ext.create('Ext.grid.Panel', {\r | |
564 | width: 100,\r | |
565 | height: 100,\r | |
566 | store: makeStore(),\r | |
567 | features: [{ftype:'grouping'}],\r | |
568 | columns:[{\r | |
569 | text: 'Name',\r | |
570 | dataIndex: 'name',\r | |
571 | width: 100\r | |
572 | }],\r | |
573 | bbar: makeToolbar(undefined, true),\r | |
574 | renderTo: Ext.getBody()\r | |
575 | });\r | |
576 | \r | |
577 | grid.reconfigure(store);\r | |
578 | store.loadPage(3);\r | |
579 | mockComplete(makeData(20, 10));\r | |
580 | \r | |
581 | expect(tb.getInputItem().getValue()).toBe(3);\r | |
582 | });\r | |
583 | });\r | |
584 | \r | |
585 | describe("keypress", function() {\r | |
586 | it("should set the value to the first page on home", function() {\r | |
587 | makeToolbar();\r | |
588 | store.loadPage(3);\r | |
589 | mockComplete(makeData(100, 10));\r | |
590 | triggerKeyEvent(HOME);\r | |
591 | expect(tb.getInputItem().getValue()).toBe(1);\r | |
592 | });\r | |
593 | \r | |
594 | it("should set the value to the last page on end", function() {\r | |
595 | makeToolbar();\r | |
596 | store.loadPage(1);\r | |
597 | mockComplete(makeData(20, 0));\r | |
598 | triggerKeyEvent(END);\r | |
599 | expect(tb.getInputItem().getValue()).toBe(4);\r | |
600 | });\r | |
601 | \r | |
602 | describe("down", function() {\r | |
603 | it("should set the value to the previous page on pagedown", function() {\r | |
604 | makeToolbar();\r | |
605 | store.loadPage(3);\r | |
606 | mockComplete(makeData(20, 10));\r | |
607 | triggerKeyEvent(PAGE_DOWN);\r | |
608 | expect(tb.getInputItem().getValue()).toBe(2);\r | |
609 | });\r | |
610 | \r | |
611 | it("should set the value to the previous page on down", function() {\r | |
612 | makeToolbar();\r | |
613 | store.loadPage(3);\r | |
614 | mockComplete(makeData(20, 10));\r | |
615 | triggerKeyEvent(DOWN);\r | |
616 | expect(tb.getInputItem().getValue()).toBe(2);\r | |
617 | });\r | |
618 | \r | |
619 | describe("shift", function() {\r | |
620 | it("should not change the page if it will go over the limit with pagedown", function() {\r | |
621 | makeToolbar();\r | |
622 | store.loadPage(3);\r | |
623 | mockComplete(makeData(20, 10));\r | |
624 | var spy = spyOn(tb, 'processKeyEvent').andCallFake(function(field, e) {\r | |
625 | e.shiftKey = true;\r | |
626 | Ext.toolbar.Paging.prototype.processKeyEvent.call(tb, field, e);\r | |
627 | });\r | |
628 | triggerKeyEvent(PAGE_DOWN);\r | |
629 | expect(tb.getInputItem().getValue()).toBe(3);\r | |
630 | });\r | |
631 | \r | |
632 | it("should not change the page if it will go over the limit with down", function() {\r | |
633 | makeToolbar();\r | |
634 | store.loadPage(3);\r | |
635 | mockComplete(makeData(20, 10));\r | |
636 | spyOn(tb, 'processKeyEvent').andCallFake(function(field, e) {\r | |
637 | e.shiftKey = true;\r | |
638 | Ext.toolbar.Paging.prototype.processKeyEvent.call(tb, field, e);\r | |
639 | });\r | |
640 | triggerKeyEvent(DOWN);\r | |
641 | expect(tb.getInputItem().getValue()).toBe(3);\r | |
642 | });\r | |
643 | \r | |
644 | it("should decrement by 10 when using shift + pagedown", function() {\r | |
645 | makeToolbar();\r | |
646 | store.loadPage(15);\r | |
647 | mockComplete(makeData(100, 75));\r | |
648 | spyOn(tb, 'processKeyEvent').andCallFake(function(field, e) {\r | |
649 | e.shiftKey = true;\r | |
650 | Ext.toolbar.Paging.prototype.processKeyEvent.call(tb, field, e);\r | |
651 | });\r | |
652 | triggerKeyEvent(PAGE_DOWN);\r | |
653 | expect(tb.getInputItem().getValue()).toBe(5);\r | |
654 | });\r | |
655 | \r | |
656 | it("should decrement by 10 when using shift + down", function() {\r | |
657 | makeToolbar();\r | |
658 | store.loadPage(15);\r | |
659 | mockComplete(makeData(100, 75));\r | |
660 | spyOn(tb, 'processKeyEvent').andCallFake(function(field, e) {\r | |
661 | e.shiftKey = true;\r | |
662 | Ext.toolbar.Paging.prototype.processKeyEvent.call(tb, field, e);\r | |
663 | });\r | |
664 | triggerKeyEvent(DOWN);\r | |
665 | expect(tb.getInputItem().getValue()).toBe(5);\r | |
666 | });\r | |
667 | });\r | |
668 | });\r | |
669 | \r | |
670 | describe("up", function() {\r | |
671 | it("should set the value to the next page on pageup", function() {\r | |
672 | makeToolbar();\r | |
673 | store.loadPage(3);\r | |
674 | mockComplete(makeData(20, 10));\r | |
675 | triggerKeyEvent(PAGE_UP);\r | |
676 | expect(tb.getInputItem().getValue()).toBe(4);\r | |
677 | });\r | |
678 | \r | |
679 | it("should set the value to the next page on up", function() {\r | |
680 | makeToolbar();\r | |
681 | store.loadPage(3);\r | |
682 | mockComplete(makeData(20, 10));\r | |
683 | triggerKeyEvent(UP);\r | |
684 | expect(tb.getInputItem().getValue()).toBe(4);\r | |
685 | });\r | |
686 | \r | |
687 | describe("shift", function() {\r | |
688 | it("should not change the page if it will go over the limit with pageup", function() {\r | |
689 | makeToolbar();\r | |
690 | store.loadPage(1);\r | |
691 | mockComplete(makeData(20, 0));\r | |
692 | var spy = spyOn(tb, 'processKeyEvent').andCallFake(function(field, e) {\r | |
693 | e.shiftKey = true;\r | |
694 | Ext.toolbar.Paging.prototype.processKeyEvent.call(tb, field, e);\r | |
695 | });\r | |
696 | triggerKeyEvent(PAGE_UP);\r | |
697 | expect(tb.getInputItem().getValue()).toBe(1);\r | |
698 | });\r | |
699 | \r | |
700 | it("should not change the page if it will go over the limit with up", function() {\r | |
701 | makeToolbar();\r | |
702 | store.loadPage(1);\r | |
703 | mockComplete(makeData(20, 0));\r | |
704 | spyOn(tb, 'processKeyEvent').andCallFake(function(field, e) {\r | |
705 | e.shiftKey = true;\r | |
706 | Ext.toolbar.Paging.prototype.processKeyEvent.call(tb, field, e);\r | |
707 | });\r | |
708 | triggerKeyEvent(UP);\r | |
709 | expect(tb.getInputItem().getValue()).toBe(1);\r | |
710 | });\r | |
711 | \r | |
712 | it("should increment by 10 when using shift + pageup", function() {\r | |
713 | makeToolbar();\r | |
714 | store.loadPage(1);\r | |
715 | mockComplete(makeData(100, 0));\r | |
716 | spyOn(tb, 'processKeyEvent').andCallFake(function(field, e) {\r | |
717 | e.shiftKey = true;\r | |
718 | Ext.toolbar.Paging.prototype.processKeyEvent.call(tb, field, e);\r | |
719 | });\r | |
720 | triggerKeyEvent(PAGE_UP);\r | |
721 | expect(tb.getInputItem().getValue()).toBe(11);\r | |
722 | });\r | |
723 | \r | |
724 | it("should increment by 10 when using shift + up", function() {\r | |
725 | makeToolbar();\r | |
726 | store.loadPage(1);\r | |
727 | mockComplete(makeData(100, 0));\r | |
728 | spyOn(tb, 'processKeyEvent').andCallFake(function(field, e) {\r | |
729 | e.shiftKey = true;\r | |
730 | Ext.toolbar.Paging.prototype.processKeyEvent.call(tb, field, e);\r | |
731 | });\r | |
732 | triggerKeyEvent(UP);\r | |
733 | expect(tb.getInputItem().getValue()).toBe(11);\r | |
734 | });\r | |
735 | });\r | |
736 | });\r | |
737 | \r | |
738 | // These tests fails unreliably on IE9 and 10 on a VM\r | |
739 | describeNotIE9_10("enter", function() {\r | |
740 | it("should load the page in the field", function() {\r | |
741 | makeToolbar();\r | |
742 | store.loadPage(1);\r | |
743 | mockComplete(makeData(20, 0));\r | |
744 | tb.getInputItem().setRawValue(3);\r | |
745 | spyOn(store, 'loadPage');\r | |
746 | triggerKeyEvent(ENTER);\r | |
747 | expect(store.loadPage.mostRecentCall.args[0]).toBe(3); \r | |
748 | });\r | |
749 | \r | |
750 | it("should do nothing if the value isn't valid", function() {\r | |
751 | makeToolbar();\r | |
752 | store.loadPage(1);\r | |
753 | mockComplete(makeData(20, 0));\r | |
754 | tb.getInputItem().setRawValue('foo');\r | |
755 | spyOn(store, 'loadPage');\r | |
756 | triggerKeyEvent(ENTER);\r | |
757 | expect(store.loadPage).not.toHaveBeenCalled();\r | |
758 | });\r | |
759 | \r | |
760 | it("should do nothing if the page hasn't changed", function() {\r | |
761 | makeToolbar();\r | |
762 | store.loadPage(1);\r | |
763 | mockComplete(makeData(20, 0));\r | |
764 | tb.getInputItem().setRawValue(1);\r | |
765 | spyOn(store, 'loadPage');\r | |
766 | triggerKeyEvent(ENTER);\r | |
767 | expect(store.loadPage).not.toHaveBeenCalled();\r | |
768 | });\r | |
769 | \r | |
770 | // This test fails unreliably on IE9 and 10 on a VM\r | |
771 | it("should pull the value up to the minimum", function() {\r | |
772 | makeToolbar();\r | |
773 | store.loadPage(2);\r | |
774 | mockComplete(makeData(20, 5));\r | |
775 | tb.getInputItem().setRawValue(-2);\r | |
776 | spyOn(store, 'loadPage');\r | |
777 | triggerKeyEvent(ENTER);\r | |
778 | expect(store.loadPage.mostRecentCall.args[0]).toBe(1); \r | |
779 | });\r | |
780 | \r | |
781 | it("should limit the value up to the maximum", function() {\r | |
782 | makeToolbar();\r | |
783 | store.loadPage(1);\r | |
784 | mockComplete(makeData(20, store.pageSize));\r | |
785 | tb.getInputItem().setRawValue(50);\r | |
786 | spyOn(store, 'loadPage');\r | |
787 | triggerKeyEvent(ENTER);\r | |
788 | expect(store.loadPage.mostRecentCall.args[0]).toBe(4); \r | |
789 | });\r | |
790 | \r | |
791 | it("should fire the beforechange event with the toolbar & the new page", function() {\r | |
792 | makeToolbar();\r | |
793 | store.loadPage(1);\r | |
794 | mockComplete(makeData(20, 0));\r | |
795 | tb.getInputItem().setRawValue(3);\r | |
796 | \r | |
797 | var spy = jasmine.createSpy();\r | |
798 | tb.on('beforechange', spy);\r | |
799 | triggerKeyEvent(ENTER);\r | |
800 | expect(spy.mostRecentCall.args[0]).toBe(tb);\r | |
801 | expect(spy.mostRecentCall.args[1]).toBe(3);\r | |
802 | });\r | |
803 | \r | |
804 | it("should not call load if vetoing the event", function() {\r | |
805 | makeToolbar();\r | |
806 | store.loadPage(1);\r | |
807 | mockComplete(makeData(20, 0));\r | |
808 | tb.getInputItem().setRawValue(3);\r | |
809 | \r | |
810 | spyOn(store, 'loadPage');\r | |
811 | tb.on('beforechange', function() {\r | |
812 | return false;\r | |
813 | });\r | |
814 | triggerKeyEvent(ENTER);\r | |
815 | expect(store.loadPage).not.toHaveBeenCalled();\r | |
816 | });\r | |
817 | });\r | |
818 | });\r | |
819 | });\r | |
820 | \r | |
821 | describe("after invalid load", function() {\r | |
822 | it("should load the largest available page when we've gone outside the dataset", function() {\r | |
823 | var spy = jasmine.createSpy();\r | |
824 | \r | |
825 | makeToolbar(); \r | |
826 | store.loadPage(5);\r | |
827 | mockComplete(makeData(25, 20));\r | |
828 | tb.on('change', spy);\r | |
829 | tb.doRefresh();\r | |
830 | spyOn(store, 'loadPage');\r | |
831 | mockComplete(makeData(10, 5));\r | |
832 | expect(spy).not.toHaveBeenCalled();\r | |
833 | expect(store.loadPage.mostRecentCall.args[0]).toBe(2); \r | |
834 | }); \r | |
835 | });\r | |
836 | });\r |