]> git.proxmox.com Git - extjs.git/blame - extjs/classic/classic/test/specs/toolbar/Paging.js
add extjs 6.0.1 sources
[extjs.git] / extjs / classic / classic / test / specs / toolbar / Paging.js
CommitLineData
6527f429
DM
1describe("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